From d708e96d4668200d7c10c0b7f03bad4002e19b6f Mon Sep 17 00:00:00 2001 From: jun Date: Tue, 8 Oct 2024 18:36:36 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9D=9E=E6=8E=92=E5=BA=8F=E6=8A=A5=E5=B7=A5?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiservice/schedulejob/MesReportNoSortJob.java | 43 +++--- .../apiservice/schedulejob/MesReportSortJob.java | 2 + .../serviceimpl/busi/MesWorkOrderService.java | 151 +++++++++++++++++---- 3 files changed, 143 insertions(+), 53 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportNoSortJob.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportNoSortJob.java index 30ed6f6..463d866 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportNoSortJob.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportNoSortJob.java @@ -3,19 +3,16 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionRecordService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService; +import cn.estsh.i3plus.platform.common.tool.JsonUtilTool; import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; -import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; -import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; -import cn.estsh.impp.framework.base.schedule.BaseImppScheduleJob; +import cn.estsh.i3plus.pojo.model.wms.WmsJobParamModel; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.init.ApplicationProperties; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -25,7 +22,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -55,25 +51,24 @@ public class MesReportNoSortJob extends BaseMesScheduleJob { @Override @Transactional public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) { - JSONObject jsonObject= new JSONObject(); - - jsonObject.putIfAbsent("organizeCode", "CK01"); - jsonObject.putIfAbsent("userName", "job"); - - String organizeCode = jsonObject.getStr("organizeCode"); - String userName = jsonObject.getStr("userName"); - if (null == organizeCode){ - log.error("请添加需要报工的工厂代码!"); - return; - } - if (null == userName){ - userName = "JOB"; + List wmsJobParamModelList = JsonUtilTool.toList(this.getJobParam(), WmsJobParamModel.class); + if (!CollectionUtils.isEmpty(wmsJobParamModelList)) { + for (WmsJobParamModel wmsJobParamModel : wmsJobParamModelList) { + try { + long startTime = System.currentTimeMillis(); + // 处理无工单 + handlerNoOrder(wmsJobParamModel.getOrganizeCode(), "JOB"); + // 处理有工单 + handlerHasOrder(wmsJobParamModel.getOrganizeCode(), "JOB"); + long endTime = System.currentTimeMillis(); + log.info("工厂{}非排序报工JOB --- END --- 耗时: {} ms", wmsJobParamModel.getOrganizeCode(), endTime - startTime); + } catch (Exception e) { + log.info("工厂{}非排序报工JOB 执行失败{}", wmsJobParamModel.getOrganizeCode(), e); + } + } + }else{ + log.info("非排序报工JOB 参数不能为空"); } - // 处理无工单 - handlerNoOrder(organizeCode, userName); - // 处理有工单 - handlerHasOrder(organizeCode, userName); - // } } private void handlerNoOrder(String organizeCode, String userName) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportSortJob.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportSortJob.java index bfff550..3ea7347 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportSortJob.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportSortJob.java @@ -48,6 +48,8 @@ public class MesReportSortJob extends BaseMesScheduleJob { log.info("工厂{}排序报工job 执行失败{}", wmsJobParamModel.getOrganizeCode(), e); } } + }else{ + log.info("排序报工job 参数不能为空"); } } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java index ecb9751..68d4903 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java @@ -674,7 +674,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { //保存数据 List mesProductOffLineList = new ArrayList<>(); - MesProductOffLine newMesProductOffLine; + List mesMoveList = new ArrayList<>(); // 排除重复的数据 Map> map = mesBoms.stream().collect(Collectors.groupingBy(mesBom -> { MesBom bom = new MesBom(); @@ -682,35 +682,24 @@ public class MesWorkOrderService implements IMesWorkOrderService { bom.setItemPartNo(mesBom.getItemPartNo()); return bom; })); - for (Map.Entry> entry : map.entrySet()) { - MesBom mesBom = entry.getValue().get(0); - newMesProductOffLine = new MesProductOffLine(); - newMesProductOffLine.setReportPartNo(oldMesWorkOrder.getPartNo()); - newMesProductOffLine.setReportPartNameRdd(oldMesWorkOrder.getPartName()); - newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo()); - newMesProductOffLine.setItemPartName(mesBom.getItemPartName()); - newMesProductOffLine.setItemQty(mesBom.getItemQty()); - newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint()); - newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint()); - newMesProductOffLine.setQty(1d); - newMesProductOffLine.setReportSn(productionRecord.getProductSn()); - newMesProductOffLine.setBomVersion(oldMesWorkOrder.getProductVersion()); - newMesProductOffLine.setSerialNumber(productionRecord.getSerialNumber()); - newMesProductOffLine.setUnit(mesBom.getUnit()); - newMesProductOffLine.setBomCode(mesBom.getBomCode()); - newMesProductOffLine.setItemUnit(mesBom.getItemUnit()); - newMesProductOffLine.setWorkOrderNo(oldMesWorkOrder.getWorkOrderNo()); - newMesProductOffLine.setWorkOrderType(oldMesWorkOrder.getWorkOrderType()); - newMesProductOffLine.setWorkCenterCode(oldMesWorkOrder.getWorkCenterCode()); - newMesProductOffLine.setWorkCellCode(oldMesWorkOrder.getWorkCellCode()); - newMesProductOffLine.setReportType(oldMesWorkOrder.getReportType()); - newMesProductOffLine.setSapWorkCenter(mesProductVersion.getWorkCenterCode()); - newMesProductOffLine.setOrganizeCode(oldMesWorkOrder.getOrganizeCode()); - newMesProductOffLine.setDescription(productionRecord.getCompleteDateTime()); - ConvertBean.serviceModelInitialize(newMesProductOffLine, userName); - mesProductOffLineList.add(newMesProductOffLine); + if(MesExtEnumUtil.NOSORT_REPORT_TYPE.REPORT.getValue() == productionRecord.getReportType()){ + for (Map.Entry> entry : map.entrySet()) { + mesProductOffLineList.add(getMesProductOffLine(productionRecord, userName, oldMesWorkOrder, mesProductVersion, entry.getValue().get(0))); + } + } else if (MesExtEnumUtil.NOSORT_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() == productionRecord.getReportType()) { + customerSupplyMove(productionRecord,oldMesWorkOrder, mesProductVersion, mesBoms, productionRecord.getProductSn(), mesProductOffLineList, mesMoveList,userName); + } else { + LOGGER.info("汇报类型不存在"); + return; + } + + if(!CollectionUtils.isEmpty(mesProductOffLineList)){ + mesProductOffLineRDao.saveAll(mesProductOffLineList); + } + + if(!CollectionUtils.isEmpty(mesMoveList)){ + mesMoveRepository.saveAll(mesMoveList); } - mesProductOffLineRDao.saveAll(mesProductOffLineList); // 同步工单信息给加工记录、条码信息 DdlPackBean snDdlPackBean = DdlPackBean.getDdlPackBean(); @@ -729,6 +718,35 @@ public class MesWorkOrderService implements IMesWorkOrderService { } + private MesProductOffLine getMesProductOffLine(MesProductionRecord productionRecord, String userName, MesWorkOrder oldMesWorkOrder, MesProductVersion mesProductVersion, MesBom mesBom) { + MesProductOffLine newMesProductOffLine; + newMesProductOffLine = new MesProductOffLine(); + newMesProductOffLine.setReportPartNo(oldMesWorkOrder.getPartNo()); + newMesProductOffLine.setReportPartNameRdd(oldMesWorkOrder.getPartName()); + newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo()); + newMesProductOffLine.setItemPartName(mesBom.getItemPartName()); + newMesProductOffLine.setItemQty(mesBom.getItemQty()); + newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint()); + newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint()); + newMesProductOffLine.setQty(1d); + newMesProductOffLine.setReportSn(productionRecord.getProductSn()); + newMesProductOffLine.setBomVersion(oldMesWorkOrder.getProductVersion()); + newMesProductOffLine.setSerialNumber(productionRecord.getSerialNumber()); + newMesProductOffLine.setUnit(mesBom.getUnit()); + newMesProductOffLine.setBomCode(mesBom.getBomCode()); + newMesProductOffLine.setItemUnit(mesBom.getItemUnit()); + newMesProductOffLine.setWorkOrderNo(oldMesWorkOrder.getWorkOrderNo()); + newMesProductOffLine.setWorkOrderType(oldMesWorkOrder.getWorkOrderType()); + newMesProductOffLine.setWorkCenterCode(oldMesWorkOrder.getWorkCenterCode()); + newMesProductOffLine.setWorkCellCode(oldMesWorkOrder.getWorkCellCode()); + newMesProductOffLine.setReportType(oldMesWorkOrder.getReportType()); + newMesProductOffLine.setSapWorkCenter(mesProductVersion.getWorkCenterCode()); + newMesProductOffLine.setOrganizeCode(oldMesWorkOrder.getOrganizeCode()); + newMesProductOffLine.setDescription(productionRecord.getCompleteDateTime()); + ConvertBean.serviceModelInitialize(newMesProductOffLine, userName); + return newMesProductOffLine; + } + /** * 获取对应的工单 * @@ -1503,6 +1521,64 @@ public class MesWorkOrderService implements IMesWorkOrderService { } } + private void customerSupplyMove(MesProductionRecord productionRecord,MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, List mesBoms, String sn, List mesProductOffLineList, List mesMoveList,String userName) { + boolean isItemMove; + boolean isItemReport; + MesMoveRule moveRule; + //查询零件生产组的移库规则 + List moveRules = mesMoveRuleService.findMesMoveRuleByPartProdGroupCode(mesWorkOrder.getPartProdGroupCode(), mesWorkOrder.getOrganizeCode()); + Map> mesMoveRuleMap = moveRules.stream().filter(t -> Objects.nonNull(t.getSrcType())).collect(Collectors.groupingBy(MesMoveRule::getSrcType)); + List itemPartNoList = mesBoms.stream().map(MesBom::getItemPartNo).collect(Collectors.toList()); + //子物料SAP下发信息 + Map> mesPartSapMap = getPartSapMap(mesWorkOrder, itemPartNoList); + //获取物料信息 + Map> itemPartMap = getItemPartMap(mesWorkOrder, itemPartNoList); + for (MesBom mesBom : mesBoms) { + isItemReport = false; + isItemMove = false; + moveRule = null; + if (itemPartMap.containsKey(mesBom.getItemPartNo())) { + MesPart itemPart = itemPartMap.get(mesBom.getItemPartNo()).iterator().next(); + if (!StringUtil.isEmpty(itemPart.getEsd()) && mesMoveRuleMap.containsKey(itemPart.getEsd())) { + moveRule = mesMoveRuleMap.get(itemPart.getEsd()).iterator().next(); + if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT_MOVE.getValue() == moveRule.getReportType()) { + isItemMove = true; + isItemReport = true; + } else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT.getValue() == moveRule.getReportType()) { + isItemReport = true; + } else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.MOVE.getValue() == moveRule.getReportType()) { + isItemMove = true; + } + } + } + //汇报 + if (isItemReport) { + mesProductOffLineList.add(getMesProductOffLine(productionRecord, userName, mesWorkOrder, mesProductVersion, mesBom)); + } + //移库 + if (isItemMove) { + MesPartSap mesPartSap = null; + if (mesPartSapMap.containsKey(mesBom.getItemPartNo())) { + mesPartSap = mesPartSapMap.get(mesBom.getItemPartNo()).iterator().next(); + } + MesMove move = createMove(mesPartSap, moveRule.getErpSrcLocateNo(), moveRule.getErpDestLocateNo(), mesBom.getOrganizeCode(), mesWorkOrder.getErpWorkCenter(), mesBom.getItemQty(), MesExtEnumUtil.MOVE_TYPE.RAW_MATERIAL_MOVE.getValue()); + move.setMatnr(mesBom.getItemPartNo()); + ConvertBean.serviceModelInitialize(move, userName); + mesMoveList.add(move); + } + } + } + + private Map> getPartSapMap(MesWorkOrder mesWorkOrder, List itemPartNoList) { + List mesPartSapList = iMesPartService.findMesPartSapByPartNo(itemPartNoList, mesWorkOrder.getOrganizeCode()); + return mesPartSapList.stream().filter(t -> Objects.nonNull(t.getPartNo())).collect(Collectors.groupingBy(MesPartSap::getPartNo)); + } + + private Map> getItemPartMap(MesWorkOrder mesWorkOrder, List itemPartNoList) { + List itemPartList = iMesPartService.findMesPartByPartNo(itemPartNoList, mesWorkOrder.getOrganizeCode()); + return itemPartList.stream().filter(t -> Objects.nonNull(t.getPartNo())).collect(Collectors.groupingBy(MesPart::getPartNo)); + } + private MesWorkOrder getMesWorkOrder(Map> workOrderMap, String workOrderNo) { MesWorkOrder workOrder = Objects.isNull(workOrderMap) || StringUtils.isEmpty(workOrderNo) || !workOrderMap.containsKey(workOrderNo) ? null : workOrderMap.get(workOrderNo).iterator().next(); if (Objects.isNull(workOrder)) { @@ -1608,4 +1684,21 @@ public class MesWorkOrderService implements IMesWorkOrderService { ConvertBean.serviceModelInitialize(move, userName); return move; } + + private MesMove createMove(MesPartSap mesPart, String source, String target, String org, String workCenterCode, double qty, Integer moveType) { + MesMove move = new MesMove(); + if (!Objects.isNull(mesPart)) { + move.setMeins(mesPart.getUnit()); + } + move.setOrganizeCode(org); + move.setFactoryCode(org); + move.setLgort(source); + move.setUmlgo(target); + move.setMenge(qty); + move.setPostDate(TimeTool.getToday()); + move.setMoveType(moveType); + move.setPostTime(TimeTool.getTimeShortWithColon()); + move.setWorkCenter(workCenterCode); + return move; + } }