889 lines
42 KiB
Plaintext
889 lines
42 KiB
Plaintext
package com.cmeim.biz.service;
|
||
|
||
import com.alibaba.fastjson.JSON;
|
||
import com.alibaba.fastjson.JSONObject;
|
||
import com.cmeim.activiti6.api.enums.BizKey;
|
||
import com.cmeim.basic.api.RemoteMaterialService;
|
||
import com.cmeim.basic.api.dto.MaterialDto;
|
||
import com.cmeim.biz.enums.WfStatus;
|
||
import com.cmeim.biz.po.*;
|
||
import com.cmeim.biz.repository.BaFixedUserRepository;
|
||
import com.cmeim.biz.repository.MmArriveBillDetailRepository;
|
||
import com.cmeim.biz.repository.MmArriveBillRepository;
|
||
import com.cmeim.biz.repository.MmInputBillDetailRepository;
|
||
import com.cmeim.biz.repository.MmInputBillRepository;
|
||
import com.cmeim.biz.repository.MmMaterialBarRepository;
|
||
import com.cmeim.biz.repository.MmProdInBillDetailRepository;
|
||
import com.cmeim.biz.repository.MmProdInBillRepository;
|
||
import com.cmeim.common.core.domain.R;
|
||
import com.cmeim.common.core.exception.ServiceException;
|
||
import com.cmeim.common.core.utils.BeanUtil;
|
||
import com.cmeim.common.core.utils.DateUtil;
|
||
import com.cmeim.common.core.utils.DateUtils;
|
||
import com.cmeim.common.core.utils.StringUtils;
|
||
import com.cmeim.common.core.web.domain.RespondEnum;
|
||
import com.cmeim.kafka.api.Topic;
|
||
import com.cmeim.kafka.api.dto.Activiti6Dto;
|
||
import com.cmeim.kafka.api.dto.input.ElectronInputStockInDto;
|
||
import com.cmeim.kafka.api.dto.input.MaterialBarBindInputWarehouseDto;
|
||
import com.cmeim.kafka.api.dto.input.MaterialBarDto;
|
||
import com.cmeim.kafka.api.dto.input.MaterialBarOPDto;
|
||
import com.cmeim.kafka.api.dto.input.erp.ProdInDto;
|
||
import com.cmeim.kafka.api.dto.input.erp.ProdInItemDto;
|
||
import com.cmeim.kafka.api.dto.input.erp.RawMateriaInDto;
|
||
import com.cmeim.kafka.api.dto.input.erp.RawMateriaInItemDto;
|
||
import com.cmeim.kafka.api.dto.input.erp.RawMateriaOutDto;
|
||
import com.cmeim.kafka.api.dto.input.erp.RawMateriaOutItemDto;
|
||
import com.cmeim.stock.dto.MmStockDto;
|
||
import com.cmeim.stock.dto.StockBizDto;
|
||
import com.cmeim.stock.dto.StockElectronDto;
|
||
import com.cmeim.stock.po.MmStockArea;
|
||
import com.cmeim.stock.po.MmStockBiz;
|
||
import com.cmeim.stock.repository.MmStockBizRepository;
|
||
import com.cmeim.stock.service.StockAreaService;
|
||
import com.cmeim.sync.api.RemoteSyncService;
|
||
import com.cmeim.system.api.RemoteUserService;
|
||
import com.cmeim.system.api.domain.SysAlert;
|
||
import com.cmeim.system.api.domain.SysDept;
|
||
import com.cmeim.system.api.domain.SysUser;
|
||
import com.cmeim.system.api.model.LoginUser;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.kafka.core.KafkaTemplate;
|
||
import org.springframework.stereotype.Service;
|
||
import org.springframework.transaction.annotation.Transactional;
|
||
|
||
import java.math.BigDecimal;
|
||
import java.text.SimpleDateFormat;
|
||
import java.util.ArrayList;
|
||
import java.util.Date;
|
||
import java.util.List;
|
||
import java.util.Map;
|
||
import java.util.Optional;
|
||
import java.util.stream.Collectors;
|
||
|
||
@Slf4j
|
||
@Service
|
||
@Transactional(rollbackFor = {ServiceException.class, RuntimeException.class, Exception.class})
|
||
public class KafKaService {
|
||
|
||
@Autowired
|
||
private MmArriveBillDetailRepository arriveBillDetailRepository;
|
||
@Autowired
|
||
private RemoteMaterialService remoteMaterialService;
|
||
@Autowired
|
||
private MmMaterialBarRepository materialBarRepository;
|
||
@Autowired
|
||
private KafkaTemplate kafkaTemplate;
|
||
@Autowired
|
||
private MmArriveBillRepository arriveBillRepository;
|
||
@Autowired
|
||
private MmInputBillRepository inputBillRepository;
|
||
@Autowired
|
||
private RemoteUserService userService;
|
||
@Autowired
|
||
private MmInputBillDetailRepository inputBillDetailRepository;
|
||
@Autowired
|
||
private RemoteSyncService syncService;
|
||
@Autowired
|
||
private MmProdInBillRepository mmProdInBillRepository;
|
||
@Autowired
|
||
private MmProdInBillDetailRepository mmProdInBillDetailRepository;
|
||
@Autowired
|
||
private ProdInBillService prodInBillService;
|
||
@Autowired
|
||
private MmMaterialBarRepository mmMaterialBarRepository;
|
||
@Autowired
|
||
private RemoteSyncService remoteSyncService;
|
||
@Autowired
|
||
private InputRemoteService remoteService;
|
||
@Autowired
|
||
private MmStockBizRepository mmStockBizRepository;
|
||
@Autowired
|
||
private StockAreaService stockAreaService;
|
||
@Autowired
|
||
private BaFixedUserRepository fixedUserRepository;
|
||
|
||
public void send(String topic, Object data) {
|
||
String value = JSON.toJSONString(data);
|
||
log.info("topic:{}, value:{}", topic, value);
|
||
kafkaTemplate.send(topic, value);
|
||
}
|
||
|
||
public void sendString(String topic, String data) {
|
||
log.info("topic:{}, value:{}", topic, data);
|
||
kafkaTemplate.send(topic, data);
|
||
}
|
||
|
||
/**
|
||
* 新增条码
|
||
*/
|
||
public R<MmMaterialBar> addMaterial(MaterialBarDto dto) {
|
||
Date date = new Date();
|
||
SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss");
|
||
log.info("新增条码进入接口时间:" + dateFormat.format(date));
|
||
log.info("新增条码MaterialBarDto:{}", dto);
|
||
|
||
String username = dto.getCreatedBy();
|
||
String currentDate = dto.getCreatedDt() == null ? DateUtil.getCurrentDate() : dto.getCreatedDt();
|
||
|
||
if (dto.getMaterialQty().compareTo(BigDecimal.ZERO) < 1) {
|
||
log.error("新增条码{}失败,条码数量必须大于0", dto.getMaterialBar());
|
||
// throw new ServiceException(RespondEnum.FAILURE, String.format("新增条码【%s】失败,条码数量必须大于0", dto.getMaterialBar()));
|
||
return R.fail(String.format("新增条码【%s】失败,条码数量必须大于0", dto.getMaterialBar()));
|
||
}
|
||
|
||
MmMaterialBar materialBar = materialBarRepository.findByMaterialBar(dto.getMaterialBar());
|
||
if (materialBar != null) {
|
||
log.error("新增条码失败,条码{}已存在", dto.getMaterialBar());
|
||
// throw new ServiceException(RespondEnum.FAILURE, String.format("新增条码失败,条码【%s】已存在", dto.getMaterialBar()));
|
||
return R.fail(String.format("新增条码失败,条码【%s】已存在", dto.getMaterialBar()));
|
||
}
|
||
|
||
String arriveBillNumber = dto.getArriveBillNumber();
|
||
MmArriveBill arriveBill = arriveBillRepository.findByArriveBillNumber(arriveBillNumber);
|
||
if (null == arriveBill) {
|
||
log.error("到货单{}不存在", arriveBillNumber);
|
||
return R.fail(String.format("到货单【%s】不存在", arriveBillNumber));
|
||
}
|
||
|
||
String materialCode = dto.getMaterialCode();
|
||
|
||
R<MaterialDto> rMaterialDto = remoteMaterialService.findByMaterialCode(materialCode);
|
||
MmMaterialBar materialBarPo = new MmMaterialBar();
|
||
if (rMaterialDto.getCode() == 200) {
|
||
MaterialDto materialDto = rMaterialDto.getData();
|
||
if (materialDto != null) {
|
||
materialBarPo.setMaterialId(materialDto.getId());
|
||
materialBarPo.setMaterialName(materialDto.getMaterialName());
|
||
materialBarPo.setMaterialSpec(materialDto.getMaterialSpec());
|
||
materialBarPo.setUnitOfMeasure(materialDto.getUnitOfMeasure());
|
||
}
|
||
}
|
||
materialBarPo.setMaterialBar(dto.getMaterialBar());
|
||
// synchronized (this) {
|
||
MmArriveBillDetail arriveBillDetail = StringUtils.isEmpty(dto.getPurchaseBillDetailId())
|
||
?
|
||
arriveBillDetailRepository.findByArriveBillNumberAndMaterialCode(arriveBillNumber, materialCode) :
|
||
arriveBillDetailRepository.findByPurchaseBillDetailIdAndArriveBillNumber(dto.getPurchaseBillDetailId(), arriveBillNumber);
|
||
if (null == arriveBillDetail) {
|
||
log.error("到货单{}中不存在物料{}", arriveBillNumber, materialCode);
|
||
return R.fail(String.format("到货单【%s】中不存在物料【%s】", arriveBillNumber, materialCode));
|
||
}
|
||
|
||
materialBarPo.setArriveBillDetailId(arriveBillDetail.getId());
|
||
materialBarPo.setArriveBillNumber(arriveBillNumber);
|
||
materialBarPo.setMaterialCode(materialCode);
|
||
materialBarPo.setMaterialQty(dto.getMaterialQty() == null ? BigDecimal.ZERO : dto.getMaterialQty());
|
||
materialBarPo.setInspectQty(BigDecimal.ZERO);
|
||
materialBarPo.setNoGoodQty(BigDecimal.ZERO);
|
||
materialBarPo.setBatchNo(dto.getBatchNo());
|
||
materialBarPo.setDictStatus(10);
|
||
materialBarPo.setDictType(1);
|
||
materialBarPo.setCreatedBy(username);
|
||
materialBarPo.setCreatedDt(currentDate);
|
||
materialBarRepository.save(materialBarPo);
|
||
|
||
|
||
if (arriveBillDetail != null) {
|
||
arriveBillDetail.setRealQty(arriveBillDetail.getRealQty().add(materialBarPo.getMaterialQty()));
|
||
if (arriveBillDetail.getRealQty().compareTo(arriveBillDetail.getPlanQty()) >= 0) {
|
||
arriveBillDetail.setDictStatus(25);
|
||
arriveBillDetail.setCompleteTime(currentDate);
|
||
|
||
// 判断是否全部入库,并更新主表状态
|
||
List<MmArriveBillDetail> finishFilter =
|
||
arriveBill.getItems().stream().filter(item -> !item.getId().
|
||
equals(arriveBillDetail.getId()) && item.getPlanQty().
|
||
compareTo(item.getRealQty()) <= 0).collect(Collectors.toList());
|
||
if (finishFilter.size() == arriveBill.getItems().size() - 1) {
|
||
arriveBill.setDictStatus(25);
|
||
arriveBill.setCompleteTime(currentDate);
|
||
arriveBillRepository.save(arriveBill);
|
||
}
|
||
} else {
|
||
arriveBillDetail.setDictStatus(10);
|
||
}
|
||
arriveBillDetail.setUpdatedBy(username);
|
||
arriveBillDetail.setUpdatedDt(currentDate);
|
||
arriveBillDetailRepository.save(arriveBillDetail);
|
||
}
|
||
|
||
// 添加到货事务
|
||
StockBizDto stockBizDto = new StockBizDto();
|
||
stockBizDto.setMaterialBar(materialBarPo.getMaterialBar());
|
||
stockBizDto.setMaterialId(materialBarPo.getMaterialId());
|
||
stockBizDto.setMaterialCode(materialBarPo.getMaterialCode());
|
||
stockBizDto.setMaterialName(materialBarPo.getMaterialName());
|
||
stockBizDto.setBatchNo(materialBarPo.getBatchNo());
|
||
stockBizDto.setQty(materialBarPo.getMaterialQty());
|
||
stockBizDto.setBeforeQty(BigDecimal.ZERO);
|
||
stockBizDto.setAfterQty(materialBarPo.getMaterialQty());
|
||
stockBizDto.setDictBiztype(3);
|
||
stockBizDto.setDictBilltype(10);
|
||
if (arriveBillDetail != null) {
|
||
stockBizDto.setBillId(arriveBillDetail.getArriveBillId());
|
||
}
|
||
stockBizDto.setBillNumber(materialBarPo.getArriveBillNumber());
|
||
stockBizDto.setCreatedDt(currentDate);
|
||
stockBizDto.setCreatedBy(username);
|
||
|
||
R<MaterialDto> byMaterialCode = remoteMaterialService.findByMaterialCode(materialBarPo.getMaterialCode());
|
||
MaterialDto data = byMaterialCode.getData();
|
||
if (data != null) {
|
||
stockBizDto.setMaterialSpec(data.getMaterialSpec());
|
||
stockBizDto.setUnitOfMeasure(data.getUnitOfMeasure());
|
||
}
|
||
mmStockBizRepository.save(BeanUtil.copyProperties(stockBizDto, MmStockBiz.class));
|
||
|
||
Date date2 = new Date();
|
||
log.info("新增条码离开接口时间:" + dateFormat.format(date2));
|
||
String res = diffDate(date, date2);
|
||
log.info("新增条码调用时间差:"+res);
|
||
|
||
return R.ok(materialBarPo);
|
||
// }
|
||
}
|
||
|
||
public String diffDate(Date date, Date date2){
|
||
|
||
long diff = date.getTime() - date2.getTime();
|
||
long day_ = 1000 * 60 * 60 * 24;
|
||
long hour_ = 1000 * 60 * 60;
|
||
long minute_ = 1000 * 60;
|
||
long day = diff / day_;
|
||
long hour = (diff - (day_ * day)) / hour_;
|
||
long minute = (diff - ((day_ * day) + (hour * hour_))) / minute_;
|
||
long secound = ((diff - ((day_ * day) + (hour * hour_) + (minute * minute_))) / 1000);
|
||
return day + "天" + hour + "时" + minute + "分" + secound + "秒";
|
||
|
||
}
|
||
|
||
|
||
/**
|
||
* 删除条码
|
||
*
|
||
*/
|
||
@Transactional(rollbackFor = Exception.class)
|
||
public void delMaterial(String materialBar) {
|
||
MmMaterialBar bar = materialBarRepository.findByMaterialBar(materialBar);
|
||
|
||
|
||
StockBizDto dto = new StockBizDto();
|
||
dto.setMaterialBar(materialBar);
|
||
dto.setDictBiztype(3);
|
||
dto.setDictBilltype(10);
|
||
mmStockBizRepository.deleteByMaterialBarAndDictBilltypeAndDictBiztype(dto.getMaterialBar(),
|
||
dto.getDictBilltype(), dto.getDictBiztype());
|
||
|
||
|
||
Optional<MmArriveBillDetail> optional = arriveBillDetailRepository.findById(bar.getArriveBillDetailId());
|
||
if (!optional.isPresent()) {
|
||
return;
|
||
}
|
||
// 减去到货单明细的计划数量
|
||
MmArriveBillDetail mmArriveBillDetail = optional.get();
|
||
mmArriveBillDetail.setRealQty(mmArriveBillDetail.getRealQty().subtract(bar.getMaterialQty()));
|
||
//如果计划数量为0则删除记录
|
||
if (mmArriveBillDetail.getRealQty().compareTo(BigDecimal.ZERO) > 0) {
|
||
mmArriveBillDetail.setDictStatus(1);
|
||
} else {
|
||
mmArriveBillDetail.setRealQty(BigDecimal.ZERO);
|
||
mmArriveBillDetail.setDictStatus(0);
|
||
}
|
||
materialBarRepository.delete(bar);
|
||
arriveBillDetailRepository.save(mmArriveBillDetail);
|
||
}
|
||
|
||
/**
|
||
* 针对海康条码做的 智能仓储柜 ->30 智能货架->20 上架
|
||
*/
|
||
public StockElectronDto hisElectronInputStockIn(ElectronInputStockInDto dto, MmMaterialBar materialBar,
|
||
String user, String location) {
|
||
|
||
log.info("dto----------------->{}", dto);
|
||
log.info("materialBar----------------->{}", materialBar);
|
||
|
||
String warehouseCode = null;
|
||
String warehouseName = null;
|
||
Long warehouseId = null;
|
||
if (StringUtils.isEmpty(dto.getWarehouseCode())) {
|
||
//海康库区代码
|
||
warehouseCode = "1110";
|
||
warehouseName = "海康客供(SMT)";
|
||
warehouseId = 61L;
|
||
} else {
|
||
//旧条码
|
||
warehouseCode = dto.getWarehouseCode();
|
||
}
|
||
|
||
int warehouseType = dto.getWarehouseType();
|
||
String currentTime = DateUtil.getCurrentDate();
|
||
//todo 模拟入库操作
|
||
|
||
StockElectronDto electronDto = BeanUtil.copyProperties(materialBar, StockElectronDto.class);
|
||
electronDto.setId(null);
|
||
electronDto.setCreatedBy(user);
|
||
electronDto.setCreatedDt(currentTime);
|
||
electronDto.setUpdatedBy(null);
|
||
electronDto.setUpdatedDt(null);
|
||
electronDto.setQty(materialBar.getMaterialQty());
|
||
|
||
// 库存事务
|
||
StockBizDto bizDto = BeanUtil.copyProperties(electronDto, StockBizDto.class);
|
||
// 设置电子料仓库存数据
|
||
electronDto.setShelfCode(dto.getShelfCode());
|
||
electronDto.setShelfX(dto.getShelfX());
|
||
electronDto.setShelfY(dto.getShelfY());
|
||
electronDto.setShelfZ(dto.getShelfZ());
|
||
electronDto.setInUser(dto.getInUser());
|
||
electronDto.setInTime(currentTime);
|
||
electronDto.setWarehouseType(warehouseType);
|
||
electronDto.setWarehouseCode(warehouseCode);
|
||
electronDto.setWarehouseName(warehouseName);
|
||
|
||
// 设置库存事务数据
|
||
bizDto.setBeforeQty(BigDecimal.ZERO);
|
||
bizDto.setAfterQty(bizDto.getQty());
|
||
bizDto.setDictBiztype(7);
|
||
bizDto.setDictBilltype(30);
|
||
bizDto.setTargetLocationCode(location);
|
||
bizDto.setTargetLocationName(location);
|
||
bizDto.setTargetWarehouseCode(warehouseCode);
|
||
bizDto.setTargetWarehouseName(warehouseName);
|
||
bizDto.setWarehouseId(warehouseId);
|
||
bizDto.setWarehouseType(warehouseType);
|
||
|
||
electronDto.setStockBizDto(bizDto);
|
||
|
||
materialBarRepository.save(materialBar);
|
||
|
||
StockElectronDto stockElectronDto = null;
|
||
|
||
if (stockElectronDto == null) {
|
||
throw new ServiceException(RespondEnum.FAILURE, "库存操作失败");
|
||
}
|
||
// 给边缘服务器同步条码数据
|
||
MaterialBarDto barDto = BeanUtil.copyProperties(materialBar, MaterialBarDto.class);
|
||
|
||
MaterialBarOPDto opdto = new MaterialBarOPDto();
|
||
opdto.setOpType(2);
|
||
opdto.setBarDto(barDto);
|
||
opdto.setHostType(1);
|
||
|
||
|
||
return stockElectronDto;
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
public void processInstanceComplete(Activiti6Dto actDto) {
|
||
log.info("审批开始时间:"+DateUtil.getCurrentDate());
|
||
log.info("Activiti6Dto:"+DateUtil.getCurrentDate()+"数据"+actDto);
|
||
// 判断是否为入库单审批
|
||
MmInputBill inputBill = inputBillRepository.findByProcessInstanceId(actDto.getProcessInstanceId());
|
||
if (inputBill != null) {
|
||
log.info(String.format("入库单【%s】审批,data【%s】", inputBill.getInputBillNumber(),
|
||
JSONObject.toJSONString(actDto)));
|
||
if (inputBill.getDictApprovalStatus() == null || inputBill.getDictApprovalStatus().equals(WfStatus.CREATED.getValue())) {
|
||
log.error(String.format("入库单【%s】还未发起审批", inputBill.getInputBillNumber()));
|
||
return;
|
||
}
|
||
if (inputBill.getDictApprovalStatus().equals(WfStatus.DONE.getValue())) {
|
||
log.error(String.format("入库单【%s】审批已完成", inputBill.getInputBillNumber()));
|
||
return;
|
||
}
|
||
if (inputBill.getDictApprovalStatus().equals(WfStatus.DONE.getValue())) {
|
||
log.error(String.format("入库单【%s】审批已关闭", inputBill.getInputBillNumber()));
|
||
return;
|
||
}
|
||
try {
|
||
R<LoginUser> userR = userService.getUserInfoByUserId(Long.valueOf(actDto.getAssignee()));
|
||
inputBill.setApprover(userR.getData().getSysUser().getUserName());
|
||
} catch (Exception e) {
|
||
inputBill.setApprover(actDto.getAssignee());
|
||
}
|
||
inputBill.setApprovalTime(actDto.getDt());
|
||
inputBill.setDictApprovalStatus(WfStatus.WORKING.getValue());
|
||
inputBillRepository.save(inputBill);
|
||
|
||
// 给erp发送同步消息
|
||
if ("sid-773004C3-D7E8-47B0-A0A6-68A51B33AAFC".equals(actDto.getTaskDefinitionKey())) {
|
||
sendInputToERP(inputBill, inputBill.getApprover());
|
||
}
|
||
log.info("审批结束时间:"+DateUtil.getCurrentDate());
|
||
}
|
||
}
|
||
|
||
public void processInstanceFinish(Activiti6Dto actDto) {
|
||
// 判断是否为入库单审批
|
||
MmInputBill inputBill = inputBillRepository.findByProcessInstanceId(actDto.getProcessInstanceId());
|
||
if (inputBill != null) {
|
||
log.info(String.format("入库单【%s】审批完毕,data【%s】", inputBill.getInputBillNumber(),
|
||
JSONObject.toJSONString(actDto)));
|
||
if (inputBill.getDictApprovalStatus() == null || inputBill.getDictApprovalStatus().equals(WfStatus.CREATED.getValue())) {
|
||
log.error(String.format("入库单【%s】还未发起审批", inputBill.getInputBillNumber()));
|
||
}
|
||
if (inputBill.getDictApprovalStatus().equals(WfStatus.DONE.getValue())) {
|
||
log.error(String.format("入库单【%s】审批已完成", inputBill.getInputBillNumber()));
|
||
}
|
||
if (inputBill.getDictApprovalStatus().equals(WfStatus.DONE.getValue())) {
|
||
log.error(String.format("入库单【%s】审批已关闭", inputBill.getInputBillNumber()));
|
||
}
|
||
try {
|
||
R<LoginUser> userR = userService.getUserInfoByUserId(Long.valueOf(actDto.getAssignee()));
|
||
inputBill.setApprover(userR.getData().getSysUser().getUserName());
|
||
} catch (Exception e) {
|
||
inputBill.setApprover(actDto.getAssignee());
|
||
}
|
||
inputBill.setApprovalTime(actDto.getDt());
|
||
inputBill.setDictApprovalStatus(WfStatus.DONE.getValue());
|
||
inputBillRepository.save(inputBill);
|
||
return;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
public R<String> sendInputToERP(MmInputBill inputBill, String username) {
|
||
if (!StringUtils.isEmpty(inputBill.getErpNumber())) {
|
||
return R.fail(String.format("入库单【%s】已上传ERP,ERP单号【%s】", inputBill.getInputBillNumber(),
|
||
inputBill.getErpNumber()));
|
||
}
|
||
|
||
MmArriveBill arriveBill = arriveBillRepository.findByArriveBillNumber(inputBill.getArriveBillNumber());
|
||
|
||
Integer bredvouch = inputBill.getBredvouch();
|
||
|
||
// 组装参数dto,上传erp
|
||
RawMateriaInDto inDto = new RawMateriaInDto();
|
||
inDto.setBredvouch(String.valueOf(bredvouch));
|
||
inDto.setDDate(inputBill.getCreatedDt().substring(0, 10));
|
||
|
||
if (arriveBill != null) {
|
||
inDto.setCVenCode(arriveBill.getSupplierCode());
|
||
inDto.setCDepCode(arriveBill.getDepartmentCode());
|
||
}
|
||
if (StringUtils.isNotEmpty(inputBill.getSupplierCode())) {
|
||
inDto.setCVenCode(inputBill.getSupplierCode());
|
||
}
|
||
|
||
inDto.setCWhCode(inputBill.getWarehouseCode());
|
||
|
||
|
||
inDto.setMesCode(inputBill.getInputBillNumber());
|
||
inDto.setCPTCode("01");
|
||
inDto.setCPersonCode(inputBill.getCreatedBy());
|
||
inDto.setCHandler(inputBill.getApprover());
|
||
//徐欣龙加的根据人员部门编码查询出erp固定人员进行上传erp
|
||
R<LoginUser> userInfoById = remoteService.getUserInfo(inputBill.getCreatedBy());
|
||
if (userInfoById.getCode() == R.SUCCESS && userInfoById.getData() != null) {
|
||
LoginUser data = userInfoById.getData();
|
||
|
||
SysUser sysUser = data.getSysUser();
|
||
|
||
SysDept sysDept = new SysDept();
|
||
sysDept.setDeptId(sysUser.getDeptId());
|
||
List<SysDept> sysDepts = remoteService.queryDept(sysDept);
|
||
if (sysDepts.size() > 0) {
|
||
SysDept sysDept1 = sysDepts.get(0);
|
||
String substring = sysDept1.getPhone().substring(0, 4);
|
||
|
||
BaFixedUser byDeptCode = fixedUserRepository.findByDeptCode(substring);
|
||
if (byDeptCode != null) {
|
||
inDto.setCPersonCode(byDeptCode.getUserCode());
|
||
inDto.setCHandler(byDeptCode.getUserCode());
|
||
}
|
||
}
|
||
}
|
||
List<RawMateriaInItemDto> items = new ArrayList<>();
|
||
List<MmInputBillDetail> detailList = inputBillDetailRepository.findAllByInputBillId(inputBill.getId());
|
||
for (MmInputBillDetail detail : detailList) {
|
||
RawMateriaInItemDto item = new RawMateriaInItemDto();
|
||
item.setInvcode(detail.getMaterialCode());
|
||
item.setCCheckCode("");
|
||
item.setIQuantity("" + detail.getRealQty());
|
||
item.setMesCode(inputBill.getInputBillNumber());
|
||
BigDecimal iUnitCost = new BigDecimal(0);
|
||
MmArriveBillDetail arriveBillDetail = new MmArriveBillDetail();
|
||
if (detail.getArriveBillDetailId() != null) {
|
||
// 找到到货单明细的原币金额和税率
|
||
Optional<MmArriveBillDetail> byId = arriveBillDetailRepository.findById(detail.getArriveBillDetailId());
|
||
if (byId.isPresent()) {
|
||
arriveBillDetail = byId.get();
|
||
}
|
||
iUnitCost = arriveBillDetail.getIUnitCost();
|
||
}
|
||
if ((iUnitCost == null || iUnitCost.compareTo(BigDecimal.ZERO) < 1 && bredvouch != 1)) {
|
||
// 原到货单没有录入原币金额/红字单据,以下全部填零
|
||
item.setIUnitCost(BigDecimal.ZERO);
|
||
item.setIprice(BigDecimal.ZERO);
|
||
item.setFACost(BigDecimal.ZERO);
|
||
item.setIOriTaxCost(BigDecimal.ZERO);
|
||
item.setIOriMoney(BigDecimal.ZERO);
|
||
item.setIAPrice(BigDecimal.ZERO);
|
||
item.setITaxRate(BigDecimal.ZERO);
|
||
item.setITaxPrice(BigDecimal.ZERO);
|
||
item.setIoriSum(BigDecimal.ZERO);
|
||
item.setIoriSum(BigDecimal.ZERO);
|
||
item.setIOriTaxPrice(BigDecimal.ZERO);
|
||
item.setITax(BigDecimal.ZERO);
|
||
item.setISum(BigDecimal.ZERO);
|
||
} else {
|
||
bredvouchList(bredvouch,detail,item,arriveBillDetail,iUnitCost);
|
||
}
|
||
items.add(item);
|
||
}
|
||
inDto.setItems(items);
|
||
|
||
R<String> r = syncService.eprMatinstock(inDto);
|
||
log.info("上传入库单到erp,data:{}, result:{}", JSONObject.toJSONString(inDto), JSONObject.toJSONString(r));
|
||
log.info("传过来的入库单数据:"+inputBill);
|
||
if (StringUtils.isNotEmpty(r.getData())) {
|
||
inputBill.setDictErpStatus(2);
|
||
inputBill.setErpNumber(r.getData());
|
||
log.info("回写ERP单据号:"+r.getData());
|
||
} else {
|
||
inputBill.setDictErpStatus(3);
|
||
}
|
||
log.info("回写ERP单据号入库单数据:"+inputBill);
|
||
String currentDate = DateUtil.getCurrentDate();
|
||
String nickName = remoteService.getNickName(username);
|
||
|
||
inputBill.setErpSyncTime(currentDate);
|
||
inputBill.setUpdatedDt(currentDate);
|
||
inputBill.setUpdatedBy(username);
|
||
inputBill.setModifier(nickName);
|
||
MmInputBill save = inputBillRepository.save(inputBill);
|
||
log.info("审批完毕回写入库单数据:"+save);
|
||
return r;
|
||
}
|
||
|
||
public void bredvouchList(Integer bredvouch, MmInputBillDetail detail,
|
||
RawMateriaInItemDto item,MmArriveBillDetail details,BigDecimal iUnitCost) {
|
||
if (bredvouch == 1) {
|
||
// 原到货单没有录入原币金额/红字单据,以下全部填零
|
||
BigDecimal qty = detail.getRealQty();
|
||
// 税率
|
||
BigDecimal iTaxRate = detail.getITaxRate();
|
||
if (iTaxRate == null || iTaxRate.compareTo(BigDecimal.ZERO) == 0) {
|
||
iTaxRate = new BigDecimal(13);
|
||
}
|
||
|
||
BigDecimal iTaxRate1 = iTaxRate.divide(new BigDecimal(100)).add(new BigDecimal(1));
|
||
// 原币含税单价
|
||
BigDecimal iOriTaxCost = detail.getUnitPrice();
|
||
// 本币金额 = 数量*原币含税单价/税率
|
||
BigDecimal iprice = qty.multiply(iOriTaxCost).divide(iTaxRate1, 4, BigDecimal.ROUND_HALF_UP);
|
||
// 原币税额 = 数量*原币含税单价 - 数量*原币含税单价/税率
|
||
BigDecimal iTaxPrice = qty.multiply(iOriTaxCost).subtract(iprice);
|
||
// 本币价税合计 = 数量*原币含税单价
|
||
BigDecimal iSum = qty.multiply(iOriTaxCost);
|
||
//原币单价 = 原币含税单价/1+税率/100
|
||
BigDecimal big1 = new BigDecimal(1);
|
||
BigDecimal big100 = new BigDecimal(100);
|
||
BigDecimal iUnitCosts = iOriTaxCost.divide(iTaxRate.divide(big100).add(big1), 4,
|
||
BigDecimal.ROUND_HALF_UP);
|
||
// 原币单价
|
||
item.setIUnitCost(iUnitCosts);
|
||
// 原币金额 = 数量*原币含税单价/税率
|
||
item.setIprice(iprice);
|
||
// 原币单价
|
||
item.setFACost(iUnitCosts);
|
||
//原币含税单价
|
||
item.setIOriTaxCost(iOriTaxCost);
|
||
//原币金额
|
||
item.setIOriMoney(iprice);
|
||
//原币金额
|
||
item.setIAPrice(iprice);
|
||
//税率
|
||
item.setITaxRate(iTaxRate);
|
||
//原币税额
|
||
item.setITaxPrice(iTaxPrice);
|
||
//原币价税合计
|
||
item.setIoriSum(iSum);
|
||
//原币税额
|
||
item.setIOriTaxPrice(iTaxPrice);
|
||
//税率
|
||
item.setITax(iTaxRate);
|
||
//本币价税合计
|
||
item.setISum(iSum);
|
||
}
|
||
if (bredvouch == 0) {
|
||
BigDecimal qty = detail.getRealQty();
|
||
// 税率
|
||
BigDecimal iTaxRate = details.getITaxRate();
|
||
if (iTaxRate == null || iTaxRate.compareTo(BigDecimal.ZERO) == 0) {
|
||
iTaxRate = new BigDecimal(13);
|
||
}
|
||
|
||
BigDecimal iTaxRate1 = iTaxRate.divide(new BigDecimal(100)).add(new BigDecimal(1));
|
||
// 原币含税单价
|
||
BigDecimal iOriTaxCost = details.getIOriTaxCost();
|
||
// 本币金额 = 数量*原币含税单价/税率
|
||
BigDecimal iprice = qty.multiply(iOriTaxCost).divide(iTaxRate1, 4, BigDecimal.ROUND_HALF_UP);
|
||
// 原币税额 = 数量*原币含税单价 - 数量*原币含税单价/税率
|
||
BigDecimal iTaxPrice = qty.multiply(iOriTaxCost).subtract(iprice);
|
||
// 本币价税合计 = 数量*原币含税单价
|
||
BigDecimal iSum = qty.multiply(iOriTaxCost);
|
||
// 原币单价
|
||
item.setIUnitCost(iUnitCost);
|
||
// 原币金额 = 数量*原币含税单价/税率
|
||
item.setIprice(iprice);
|
||
// 原币单价
|
||
item.setFACost(iUnitCost);
|
||
//原币含税单价
|
||
item.setIOriTaxCost(iOriTaxCost);
|
||
//原币金额
|
||
item.setIOriMoney(iprice);
|
||
//原币金额
|
||
item.setIAPrice(iprice);
|
||
//税率
|
||
item.setITaxRate(iTaxRate);
|
||
//原币税额
|
||
item.setITaxPrice(iTaxPrice);
|
||
//原币价税合计
|
||
item.setIoriSum(iSum);
|
||
//原币税额
|
||
item.setIOriTaxPrice(iTaxPrice);
|
||
//税率
|
||
item.setITax(iTaxRate);
|
||
//本币价税合计
|
||
item.setISum(iSum);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* sendInputCreateOrUpdate
|
||
*/
|
||
public void sendInputCreateOrUpdate(MmInputBill inputBill) {
|
||
String inputBillNumber = inputBill.getInputBillNumber();
|
||
String warehouseCode = inputBill.getWarehouseCode();
|
||
|
||
List<MmMaterialBar> materialBarList = materialBarRepository.findAllByInputBillNumber(inputBillNumber);
|
||
List<String> barList = materialBarList.stream().map(MmMaterialBar::getMaterialBar).collect(Collectors.toList());
|
||
|
||
MaterialBarBindInputWarehouseDto dto = new MaterialBarBindInputWarehouseDto();
|
||
dto.setInputBillNumber(inputBillNumber);
|
||
dto.setWarehouseCode(warehouseCode);
|
||
dto.setMaterialBarList(barList);
|
||
kafkaTemplate.send(Topic.Input.MATERIAL_BAR_BIND_INPUT_BILL_NUMBER_WAREHOUSECODE, JSONObject.toJSONString(dto));
|
||
log.info("物料条码绑定入库单号和仓库编码,topic:{}, data:{}", Topic.Input.MATERIAL_BAR_BIND_INPUT_BILL_NUMBER_WAREHOUSECODE,
|
||
JSONObject.toJSONString(dto));
|
||
}
|
||
|
||
/**
|
||
* 流程实例完成
|
||
*1:完成 2过程中
|
||
*/
|
||
public void processInstanceFinishProdIn(String record, int type) {
|
||
log.info("成品入库单审批完成->>>>>>>" + record);
|
||
Activiti6Dto activiti6Dto = JSON.parseObject(record, Activiti6Dto.class);
|
||
|
||
R<LoginUser> loginUserR = remoteService.findUserInfoById(Long.getLong(activiti6Dto.getAssignee()));
|
||
|
||
if (BizKey.PROD_IN.getKey().equals(activiti6Dto.getBizKey())) {
|
||
MmProdInBill mmProdInBill =
|
||
mmProdInBillRepository.findByProcessInstanceId(activiti6Dto.getProcessInstanceId());
|
||
if (type == 1) {
|
||
mmProdInBill.setWfStatus(WfStatus.DONE.getValue());
|
||
}
|
||
List<MmProdInBillDetail> mmProdInBillDetailList =
|
||
mmProdInBillDetailRepository.findByProdInBillNumber(mmProdInBill.getProdInBillNumber());
|
||
// 查询该工单的领料库存
|
||
List<MmStockArea> mmStockAreaList =
|
||
stockAreaService.queryStockByOrderWorkNumber(mmProdInBill.getOrderWorkNumber());
|
||
List<MmStockDto> mmStockDtoList = BeanUtil.copyProperties(mmStockAreaList, MmStockDto.class);
|
||
if (mmStockAreaList.size() == 0) {
|
||
mmProdInBill.setMemo("工单【" + mmProdInBill.getOrderWorkNumber() + "】查询领料库存失败");
|
||
mmProdInBill.setStatus(10);
|
||
mmProdInBillRepository.save(mmProdInBill);
|
||
throw new ServiceException(RespondEnum.FAILURE, "工单【" + mmProdInBill.getOrderWorkNumber() +
|
||
"】查询领料库存失败");
|
||
}
|
||
Map<String, List<MmStockDto>> groupByMaterialCode =
|
||
mmStockDtoList.stream().collect(Collectors.groupingBy(MmStockDto::getMaterialCode));
|
||
List<List<MmStockDto>> realGroupByMaterialCode = new ArrayList<>();
|
||
for (MmProdInBillDetail mmProdInBillDetail : mmProdInBillDetailList) {
|
||
// 该物料所用总用量
|
||
BigDecimal totalQty = mmProdInBillDetail.getSonQty();
|
||
|
||
if (groupByMaterialCode.get(mmProdInBillDetail.getMaterialCode()) == null) {
|
||
throw new ServiceException(RespondEnum.FAILURE, String.format("工单【%s】在线边库领取的原材料库存【%s】与入库单明细不匹配",
|
||
mmProdInBill.getOrderWorkNumber(), mmProdInBillDetail.getMaterialCode()));
|
||
}
|
||
|
||
// 查询线边库现有数量
|
||
BigDecimal qty =
|
||
groupByMaterialCode.get(mmProdInBillDetail.getMaterialCode()).stream().map(MmStockDto::getQty).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||
//需求数量>领料数量 返回缺少的物料数量和编码
|
||
if (totalQty.compareTo(qty) > 0) {
|
||
mmProdInBill.setMemo("工单【" + mmProdInBill.getOrderWorkNumber() + "】在线边库领取的原材料库存[" + mmProdInBillDetail.getMaterialCode() + "]不足");
|
||
mmProdInBill.setStatus(10);
|
||
mmProdInBillRepository.save(mmProdInBill);
|
||
throw new ServiceException(RespondEnum.FAILURE, String.format("工单【%s】在线边库领取的原材料库存【%s】不足",
|
||
mmProdInBill.getOrderWorkNumber(), mmProdInBillDetail.getMaterialCode()));
|
||
}
|
||
//计算具体要用到哪些条码,每个条码多少数量。
|
||
List<MmStockDto> realMmStockDtoList = prodInBillService.barCodeAndQty(totalQty,
|
||
groupByMaterialCode.get(mmProdInBillDetail.getMaterialCode()));
|
||
realGroupByMaterialCode.add(realMmStockDtoList);
|
||
}
|
||
// 半成品入库 添加库存和事务
|
||
MmStockDto stockDto = BeanUtil.copyProperties(mmProdInBill, MmStockDto.class);
|
||
stockDto.setId(null);
|
||
stockDto.setBatchNo(DateUtils.dateTimeNow("yyyyMMdd"));
|
||
stockDto.setDictStatus(4);
|
||
stockDto.setDictBilltype(50);
|
||
stockDto.setDictFreeze(0);
|
||
stockDto.setBizType(8);
|
||
stockDto.setBillId(mmProdInBill.getId());
|
||
stockDto.setBillNumber(mmProdInBill.getProdInBillNumber());
|
||
stockDto.setQty(mmProdInBill.getInStockQty());
|
||
Date date = new Date();
|
||
String timestamp = String.valueOf(date.getTime());
|
||
stockDto.setMaterialBar(timestamp);
|
||
|
||
stockDto.setWarehouseId(mmProdInBill.getInStockWarehouseId());
|
||
stockDto.setWarehouseCode(mmProdInBill.getInStockWarehouseNumber());
|
||
stockDto.setWarehouseName(mmProdInBill.getInStockWarehouseName());
|
||
|
||
MmMaterialBar materialBar = BeanUtil.copyProperties(stockDto, MmMaterialBar.class);
|
||
materialBar.setId(null);
|
||
materialBar.setMaterialName(stockDto.getMaterialName());
|
||
materialBar.setCreatedDt(DateUtil.getCurrentDate());
|
||
mmMaterialBarRepository.save(materialBar);
|
||
|
||
realGroupByMaterialCode.forEach(materialBarList -> {
|
||
materialBarList.forEach(realMaterialBar -> {
|
||
// 原材料出库 扣除库存和添加事务
|
||
MmStockDto itemStockDto = BeanUtil.copyProperties(realMaterialBar, MmStockDto.class);
|
||
itemStockDto.setId(null);
|
||
itemStockDto.setBatchNo(DateUtils.dateTimeNow("yyyyMMdd"));
|
||
itemStockDto.setDictStatus(4);
|
||
itemStockDto.setDictBilltype(50);
|
||
itemStockDto.setBizType(8);
|
||
itemStockDto.setBillId(mmProdInBill.getId());
|
||
itemStockDto.setBillNumber(mmProdInBill.getProdInBillNumber());
|
||
R<Void> areaStockOut = null;
|
||
if (areaStockOut.getCode() != 200) {
|
||
mmProdInBill.setMemo("原材料【" + itemStockDto.getMaterialCode() + "】线边仓库存扣减失败:" + areaStockOut.getMsg());
|
||
mmProdInBill.setStatus(10);
|
||
mmProdInBillRepository.save(mmProdInBill);
|
||
throw new ServiceException(RespondEnum.FAILURE,
|
||
"原材料【" + itemStockDto.getMaterialCode() + "】线边仓库存扣减失败:" + areaStockOut.getMsg());
|
||
}
|
||
}
|
||
);
|
||
});
|
||
String userCode = null;
|
||
//徐欣龙加的根据人员部门编码查询出erp固定人员进行上传erp
|
||
R<LoginUser> userInfoById = remoteService.getUserInfo(mmProdInBill.getCreatedBy());
|
||
if (userInfoById.getCode() == R.SUCCESS && userInfoById.getData() != null) {
|
||
LoginUser data = userInfoById.getData();
|
||
SysUser sysUser = data.getSysUser();
|
||
SysDept sysDept = new SysDept();
|
||
sysDept.setDeptId(sysUser.getDeptId());
|
||
List<SysDept> sysDepts = remoteService.queryDept(sysDept);
|
||
if (sysDepts.size() > 0) {
|
||
SysDept sysDept1 = sysDepts.get(0);
|
||
String substring = sysDept1.getPhone().substring(0, 4);
|
||
|
||
BaFixedUser byDeptCode = fixedUserRepository.findByDeptCode(substring);
|
||
if (byDeptCode != null) {
|
||
userCode = byDeptCode.getUserCode();
|
||
|
||
}
|
||
}
|
||
}
|
||
String deptCode = "08";
|
||
// 发送成品入库kafka消息
|
||
ProdInDto prodInDto = new ProdInDto();
|
||
prodInDto.setId(mmProdInBill.getId().intValue());
|
||
prodInDto.setDDate(mmProdInBill.getCreatedDt());
|
||
prodInDto.setCRdCode("0102");
|
||
prodInDto.setCWhCode(mmProdInBill.getInStockWarehouseName());
|
||
prodInDto.setBredvouch("0");
|
||
prodInDto.setCMemo(mmProdInBill.getMemo());
|
||
prodInDto.setMesCode(mmProdInBill.getProdInBillNumber());
|
||
prodInDto.setAuditor(loginUserR.getData().getUsername());
|
||
prodInDto.setCmaker(mmProdInBill.getCreatedBy());
|
||
|
||
if (userCode != null) {
|
||
prodInDto.setAuditor(userCode);
|
||
prodInDto.setCmaker(userCode);
|
||
}
|
||
prodInDto.setCDepCode(deptCode);
|
||
|
||
List<ProdInItemDto> inItems = new ArrayList<>();
|
||
ProdInItemDto item = new ProdInItemDto();
|
||
item.setId(mmProdInBill.getId().intValue());
|
||
item.setInvcode(mmProdInBill.getMaterialCode());
|
||
item.setIQuantity(String.valueOf(mmProdInBill.getInStockQty()));
|
||
item.setMesCode(mmProdInBill.getProdInBillNumber());
|
||
item.setModid(String.valueOf(mmProdInBill.getMaterialId()));
|
||
item.setCmocode(mmProdInBill.getOrderWorkNumber());
|
||
inItems.add(item);
|
||
prodInDto.setItems(inItems);
|
||
|
||
// 发送材料出库kafka消息
|
||
RawMateriaOutDto rawOutDto = new RawMateriaOutDto();
|
||
rawOutDto.setDDate(mmProdInBill.getCreatedDt());
|
||
rawOutDto.setCRdCode("0201");
|
||
rawOutDto.setCWhCode(mmProdInBill.getLineStockNumber());
|
||
rawOutDto.setBredvouch("0");
|
||
rawOutDto.setCDepCode(deptCode);
|
||
rawOutDto.setCMemo(mmProdInBill.getMemo());
|
||
rawOutDto.setMesCode(mmProdInBill.getProdInBillNumber());
|
||
rawOutDto.setAuditor(loginUserR.getData().getUsername());
|
||
rawOutDto.setCmaker(mmProdInBill.getCreatedBy());
|
||
|
||
if (userCode != null) {
|
||
rawOutDto.setAuditor(userCode);
|
||
rawOutDto.setCmaker(userCode);
|
||
}
|
||
List<RawMateriaOutItemDto> outItems = new ArrayList<>();
|
||
for (List<MmStockDto> mmStockDtos : realGroupByMaterialCode) {
|
||
for (MmStockDto mmStockDto : mmStockDtos) {
|
||
RawMateriaOutItemDto outItem = new RawMateriaOutItemDto();
|
||
outItem.setInvcode(mmStockDto.getMaterialCode());
|
||
outItem.setIQuantity(String.valueOf(mmStockDto.getOutQty()));
|
||
outItem.setMesCode(mmProdInBill.getProdInBillNumber());
|
||
outItem.setModid(String.valueOf(mmStockDto.getMaterialId()));
|
||
outItem.setCmocode(mmProdInBill.getOrderWorkNumber());
|
||
outItems.add(outItem);
|
||
}
|
||
}
|
||
rawOutDto.setItems(outItems);
|
||
|
||
String s = JSONObject.toJSONString(prodInDto);
|
||
log.info("MES业务执行完成,封装成品入库数据:" + s);
|
||
|
||
s = JSONObject.toJSONString(rawOutDto);
|
||
log.info("MES业务执行完成,封装原材料出库数据:" + s);
|
||
|
||
R<String> prodIn = remoteSyncService.erpProdIn(prodInDto);
|
||
if (R.SUCCESS != prodIn.getCode()) {
|
||
SysAlert sysAlert = new SysAlert();
|
||
sysAlert.setCode("erp_prod_in");
|
||
sysAlert.setTitle("成品入库调用ERP失败");
|
||
sysAlert.setDescription(String.format("生产工单【%s】成品入库调用ERP失败,请及时处理!", mmProdInBill.getOrderWorkNumber()));
|
||
sysAlert.setIsOk(0);
|
||
remoteService.saveAlert(sysAlert);
|
||
throw new ServiceException(RespondEnum.FAILURE, "工单【" + mmProdInBill.
|
||
getOrderWorkNumber() + "】成品入库失败:" + prodIn.getMsg());
|
||
}
|
||
R<String> materialOut = remoteSyncService.erpMaterialOut(rawOutDto);
|
||
if (R.SUCCESS != materialOut.getCode()) {
|
||
throw new ServiceException(RespondEnum.FAILURE, "工单【" + mmProdInBill.
|
||
getOrderWorkNumber() + "】原材料出库失败:" + materialOut.getMsg());
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
}
|