diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/job/IMesWorkOrderOfflineRestoreDispatchService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/job/IMesWorkOrderOfflineRestoreDispatchService.java index e4e66bf..f17e131 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/job/IMesWorkOrderOfflineRestoreDispatchService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/job/IMesWorkOrderOfflineRestoreDispatchService.java @@ -14,6 +14,6 @@ public interface IMesWorkOrderOfflineRestoreDispatchService { void saveWorkOrderOffline(MesWorkOrderOffline workOrderOffline, Boolean result); @Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {ImppBusiException.class, Exception.class}) - Boolean doRestoreWorkOrderOfflineData(String organizeCode, MesWorkOrderOffline workOrderOffline, List workOrderAssemblyOfflineList, String now); + Boolean doRestoreWorkOrderOfflineData(String organizeCode, MesWorkOrderOffline workOrderOffline, List workOrderAssemblyOfflineList, String now, Boolean flag); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesWorkOrderOfflineRestoreDispatchService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesWorkOrderOfflineRestoreDispatchService.java index ec72b45..958ac49 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesWorkOrderOfflineRestoreDispatchService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesWorkOrderOfflineRestoreDispatchService.java @@ -4,7 +4,6 @@ import cn.estsh.i3plus.ext.mes.pcn.api.job.IMesWorkOrderOfflineRestoreDispatchSe import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProductionRecordOfflineModel; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.platform.common.convert.ConvertBean; -import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.*; @@ -72,7 +71,7 @@ public class MesWorkOrderOfflineRestoreDispatchService implements IMesWorkOrderO } @Override - public Boolean doRestoreWorkOrderOfflineData(String organizeCode, MesWorkOrderOffline workOrderOffline, List workOrderAssemblyOfflineList, String now) { + public Boolean doRestoreWorkOrderOfflineData(String organizeCode, MesWorkOrderOffline workOrderOffline, List workOrderAssemblyOfflineList, String now, Boolean flag) { //写入工单; 写入条码 if (StringUtils.isEmpty(workOrderOffline.getWorkOrderId())) { @@ -84,15 +83,18 @@ public class MesWorkOrderOfflineRestoreDispatchService implements IMesWorkOrderO insertOrderPart(organizeCode, workOrderOffline, now); } + //写入加工记录, 工单装配件, 装配件装配记录 insertAssemblyRecord(organizeCode, workOrderOffline, workOrderAssemblyOfflineList, now); + //补偿修改加工记录的汇报状态: 此前已经标记了汇报工位,但缺失工单零件信息 未进行标记汇报处理状态的数据 if (!StringUtils.isEmpty(workOrderOffline.getReportCellCode()) && !StringUtils.isEmpty(workOrderOffline.getOrderPartStatus()) && workOrderOffline.getOrderPartStatus().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && (StringUtils.isEmpty(workOrderOffline.getReportCellStatus()) || workOrderOffline.getReportCellStatus().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)) { saveProductionRecordReportStatus(organizeCode, workOrderOffline); } - return (StringUtils.isEmpty(workOrderOffline.getReportCellStatus()) || workOrderOffline.getReportCellStatus().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) ? false : true; + //补偿处理的默认返回true, 否则根据已经标记了汇报处理状态的返回true + return flag ? true : ((StringUtils.isEmpty(workOrderOffline.getReportCellStatus()) || workOrderOffline.getReportCellStatus().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) ? false : true); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesWorkOrderOfflineRestoreService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesWorkOrderOfflineRestoreService.java index 857753c..f73efd2 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesWorkOrderOfflineRestoreService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/job/MesWorkOrderOfflineRestoreService.java @@ -18,8 +18,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Slf4j @@ -44,43 +43,51 @@ public class MesWorkOrderOfflineRestoreService implements IMesWorkOrderOfflineRe //参数 处理数据量 Integer qty = paramMap.containsKey(MesPcnExtConstWords.QTY) ? Integer.valueOf(paramMap.get(MesPcnExtConstWords.QTY)) : MesPcnExtConstWords.ONE_HUNDRED; - //查询工单离线数据 + //查询工单离线数据 [未处理] List workOrderOfflineList = getWorkOrderOfflineList(organizeCode, qty); + //搜集工单号 [未处理] List workOrderNoList = CollectionUtils.isEmpty(workOrderOfflineList) ? null : workOrderOfflineList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getWorkOrderNo()))).map(MesWorkOrderOffline::getWorkOrderNo).collect(Collectors.toList()); log.info("补录离线生产工单数据JOB --- 查询到未补录完成的生产工单包含: {} ---", CollectionUtils.isEmpty(workOrderNoList) ? "[]" : workOrderNoList.toString()); - //查询工单装配件离线数据 + //查询工单装配件离线数据 [未处理] List workOrderAssemblyOfflineList = getWorkOrderAssemblyOfflineList(organizeCode, qty); if (CollectionUtils.isEmpty(workOrderNoList) && CollectionUtils.isEmpty(workOrderAssemblyOfflineList)) return; String now = TimeTool.getNowTime(true); - if (CollectionUtils.isEmpty(workOrderNoList)) { + //[未处理] + if (!CollectionUtils.isEmpty(workOrderNoList)) { //查询排序工单装配件离线数据[未同步的数据] 根据工单号分组 Map> workOrderAssemblyOfflineMap = getWorkOrderAssemblyOfflineMap(organizeCode, workOrderNoList); - //补录生产数据 - workOrderOfflineList.forEach(o -> doRestoreWorkOrderOfflineData(organizeCode, o, getWorkOrderAssemblyOfflineList(workOrderAssemblyOfflineMap, o.getWorkOrderNo()), now)); + //补录生产数据 [未处理] + workOrderOfflineList.forEach(o -> doRestoreWorkOrderOfflineData(organizeCode, o, getWorkOrderAssemblyOfflineList(workOrderAssemblyOfflineMap, o.getWorkOrderNo()), now, false)); } + //剔除上面已经处理过的工单的 装配件数据 [补偿处理] workOrderAssemblyOfflineList = CollectionUtils.isEmpty(workOrderAssemblyOfflineList) ? null : workOrderAssemblyOfflineList.stream().filter(o -> (null != o && !workOrderNoList.contains(o.getWorkOrderNo()))).collect(Collectors.toList()); if (CollectionUtils.isEmpty(workOrderAssemblyOfflineList)) return; + //根据工单号分组 [补偿处理] + Map> workOrderAssemblyOfflineMap = backWorkOrderAssemblyMap(workOrderAssemblyOfflineList); + //查询工单离线数据 [已处理] + workOrderOfflineList = getWorkOrderOfflineMap(organizeCode, new ArrayList<>(workOrderAssemblyOfflineMap.keySet())); + if (CollectionUtils.isEmpty(workOrderOfflineList)) return; - - + //补录生产数据 [补偿处理] + workOrderOfflineList.forEach(o -> doRestoreWorkOrderOfflineData(organizeCode, o, getWorkOrderAssemblyOfflineList(workOrderAssemblyOfflineMap, o.getWorkOrderNo()), now, true)); } - //查询工单离线数据 + //查询工单离线数据 [未处理] private List getWorkOrderOfflineList(String organizeCode, Integer qty) { DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getNumEqualPack(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.SYSTEM_SYNC_STATUS, packBean); @@ -89,7 +96,18 @@ public class MesWorkOrderOfflineRestoreService implements IMesWorkOrderOfflineRe return workOrderOfflineList; } - //查询工单装配件离线数据 + //查询工单离线数据 [已处理] + private List getWorkOrderOfflineMap(String organizeCode, List workOrderNoList) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), MesPcnExtConstWords.SYSTEM_SYNC_STATUS, packBean); + DdlPreparedPack.getInPackList(workOrderNoList, MesPcnExtConstWords.WORK_ORDER_NO, packBean); + List workOrderOfflineList = workOrderOfflineRepository.findByHqlWhere(packBean); + if (CollectionUtils.isEmpty(workOrderOfflineList)) return null; + workOrderOfflineList = workOrderOfflineList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesWorkOrderOffline::getModifyDatetime).reversed()).collect(Collectors.toList()); + return workOrderOfflineList.stream().filter(o -> null != o).distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesWorkOrderOffline::getWorkOrderNo))), ArrayList::new)); + } + + //查询工单装配件离线数据 [未处理] private List getWorkOrderAssemblyOfflineList(String organizeCode, Integer qty) { DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getNumEqualPack(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.SYSTEM_SYNC_STATUS, packBean); @@ -105,20 +123,27 @@ public class MesWorkOrderOfflineRestoreService implements IMesWorkOrderOfflineRe DdlPreparedPack.getInPackList(workOrderNoList, MesPcnExtConstWords.WORK_ORDER_NO, packBean); List workOrderAssemblyOfflineList = workOrderAssemblyOfflineRepository.findByHqlWhere(packBean); if (CollectionUtils.isEmpty(workOrderAssemblyOfflineList)) log.info("--- 异常 --- 补录离线生产工单数据JOB --- 当前没有需要补录的工单装配件离线数据 ---"); - return workOrderAssemblyOfflineList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesWorkOrderAssemblyOffline::getWorkOrderNo)); + return backWorkOrderAssemblyMap(workOrderAssemblyOfflineList); } + //搜集数据 private List getWorkOrderAssemblyOfflineList(Map> workOrderAssemblyOfflineMap, String workOrderNo) { return CollectionUtils.isEmpty(workOrderAssemblyOfflineMap) ? null : workOrderAssemblyOfflineMap.get(workOrderNo); } + //根据工单号分组 + private Map> backWorkOrderAssemblyMap(List workOrderAssemblyOfflineList) { + return workOrderAssemblyOfflineList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesWorkOrderAssemblyOffline::getWorkOrderNo)); + } + //补录生产数据 - private void doRestoreWorkOrderOfflineData(String organizeCode, MesWorkOrderOffline workOrderOffline, List workOrderAssemblyOfflineList, String now) { + private void doRestoreWorkOrderOfflineData(String organizeCode, MesWorkOrderOffline workOrderOffline, List workOrderAssemblyOfflineList, String now, Boolean flag) { log.info("补录离线生产工单数据JOB --- 工单:{} --- START ---", workOrderOffline.getWorkOrderNo()); Boolean result = false; try { - result = workOrderOfflineRestoreDispatchService.doRestoreWorkOrderOfflineData(organizeCode, workOrderOffline, workOrderAssemblyOfflineList, now); + result = workOrderOfflineRestoreDispatchService.doRestoreWorkOrderOfflineData(organizeCode, workOrderOffline, workOrderAssemblyOfflineList, now, flag); } catch (Exception e) { + if (flag) result = true; log.info("--- 异常 --- 补录离线生产工单数据JOB --- 工单:{} --- ERROR --- {}", workOrderOffline.getWorkOrderNo(), e.toString()); } finally { workOrderOfflineRestoreDispatchService.saveWorkOrderOffline(workOrderOffline, result);