Files
scrq-hd/.svn/pristine/19/1968fea722d4a654882bce59d9c29f245b3f4fb0.svn-base
2025-07-03 10:34:04 +08:00

889 lines
42 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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】已上传ERPERP单号【%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("上传入库单到erpdata:{}, 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());
}
}
}
}