From 4aafc83aedc9ac6a9e0721089a2e4b31576a4e5b Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Fri, 18 Apr 2025 14:04:33 +0800 Subject: [PATCH] merge 45843 & 45894 --- .../ext/mes/pcn/api/busi/IMesWorkOrderService.java | 2 +- .../apiservice/controller/busi/TestController.java | 43 +---------- .../schedulejob/MesReportWorkByPreDayJob.java | 50 ++++++------- .../serviceimpl/busi/MesWorkOrderService.java | 86 +++++++++++++++++----- 4 files changed, 91 insertions(+), 90 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java index 664facd..ff6731e 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java @@ -38,7 +38,7 @@ public interface IMesWorkOrderService { List getPreDayReportMesProductionRecord(String organizeCode , List mesShiftList, String workCenterCode); @ApiOperation("新增工单") - List insertMesWorkOrder(List mesProductionRecordList,List mesShiftList,String organizeCode, String userName ); + MesWorkOrder insertMesWorkOrder(List mesProductionRecordList,List mesShiftList,String organizeCode, String userName ); @ApiOperation(value = "根据前一天待报工记录数插入工单并报工JOB(工单报工)") void doPcnJobProductReport(List mesProductionRecordList,List mesShiftList,String organizeCode, String userName, MesWorkOrder mesWorkOrder); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/TestController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/TestController.java index de57c5d..226d67d 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/TestController.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/TestController.java @@ -54,48 +54,7 @@ public class TestController { @GetMapping("/reportWorkByPreDayJob") @ApiOperation(value = "查询设备交互") public ResultBean queryReworkTaskByPager(String organizeCode) { - try { - //遍历系统参数指定的产线获取对应班次,找到早班的开始时间, - String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_WORK_CENTER_NO"); - List workCenterCodeList = Arrays.asList(workCenterCodes.split(",")); - String userName = "REPORT_PRE_DAY_JOB"; - DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); - List mesShiftListAll = mesShiftRepository.findByHqlWhere(packBean); - for (String workCenterCode : workCenterCodeList) { - List mesShiftList = mesShiftListAll.stream().filter(s -> s.getWorkCenterCode().equalsIgnoreCase(workCenterCode)).collect(Collectors.toList()); - //1.获取生产加工记录production_record表中,report_status为待汇报状态的工单 - List mesProductionRecordList = workOrderService.getPreDayReportMesProductionRecord(organizeCode, mesShiftList, workCenterCode); - if (CollectionUtils.isEmpty(mesProductionRecordList)) { - continue; - } - - //3.插入生产工单表 - List mesWorkOrders = workOrderService.insertMesWorkOrder(mesProductionRecordList, mesShiftList, organizeCode, userName); - if (CollectionUtils.isEmpty(mesWorkOrders)) { - continue; - - } - //4.根据产线+物料产生的工单报工 - - for (MesWorkOrder mesWorkOrder : mesWorkOrders) { - List mesProductionRecords = mesProductionRecordList.stream().filter( - w -> w.getWorkCenterCode().equalsIgnoreCase(mesWorkOrder.getWorkCenterCode()) - && w.getPartNo().equalsIgnoreCase(mesWorkOrder.getPartNo())).collect(Collectors.toList()); - workOrderService.doPcnJobProductReport(mesProductionRecords, mesShiftList, organizeCode, userName, mesWorkOrder); - } - for (MesProductionRecord mesProductionRecord : mesProductionRecordList) { - mesProductionRecord.setReportStatus(20); - ConvertBean.serviceModelUpdate(mesProductionRecord, userName); - } - productionRecordRao.saveAll(mesProductionRecordList); - - } - return ResultBean.success("查询成功").setResultList(null); - } catch (ImppBusiException imppException) { - return ResultBean.fail(imppException); - } catch (Exception e) { - return ImppExceptionBuilder.newInstance().buildExceptionResult(e); - } + return null; } @GetMapping("/reportOrder") diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportWorkByPreDayJob.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportWorkByPreDayJob.java index cd1f37d..7f9d298 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportWorkByPreDayJob.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportWorkByPreDayJob.java @@ -28,10 +28,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -81,19 +78,22 @@ public class MesReportWorkByPreDayJob extends BaseMesScheduleJob { if (CollectionUtils.isEmpty(mesProductionRecordList)) { continue; } - try { - LOGGER.info("产线:{}报工mesProductionRecordList:{}", workCenterCode, mesProductionRecordList.size()); - //3.插入生产工单表 - List mesWorkOrders = workOrderService.insertMesWorkOrder(mesProductionRecordList, mesShiftList, wmsJobParamModel.getOrganizeCode(), userName); - if (CollectionUtils.isEmpty(mesWorkOrders)) { - continue; - } - LOGGER.info("产线:{}报工mesWorkOrders:{}", workCenterCode, mesWorkOrders.size()); - //4.根据产线+物料产生的工单报工 - for (MesWorkOrder mesWorkOrder : mesWorkOrders) { + Map> recordMap = mesProductionRecordList.stream().collect(Collectors.groupingBy(sn -> sn.getWorkCenterCode() + "=" + sn.getPartNo())); + for (Map.Entry> entry : recordMap.entrySet()) { + String k = entry.getKey(); + List v = entry.getValue(); + try { + LOGGER.info("产线=-零件号:{},:{},报工mesProductionRecordList:{}",k, v.size()); + //3.插入生产工单表,根据产线和零件号会创建又给工单 + MesWorkOrder mesWorkOrder = workOrderService.insertMesWorkOrder(v, mesShiftList, wmsJobParamModel.getOrganizeCode(), userName); + if (mesWorkOrder == null) { + continue; + } + LOGGER.info("产线:{}报工mesWorkOrder:{}", workCenterCode, mesWorkOrder.getWorkOrderNo()); + //4.根据产线+物料产生的工单报工 List mesProductionRecords = new ArrayList<>(); try { - mesProductionRecords = mesProductionRecordList.stream().filter( + mesProductionRecords = v.stream().filter( w -> w.getWorkCenterCode().equalsIgnoreCase(mesWorkOrder.getWorkCenterCode()) && w.getPartNo().equalsIgnoreCase(mesWorkOrder.getPartNo())).collect(Collectors.toList()); workOrderService.doPcnJobProductReport(mesProductionRecords, mesShiftList, wmsJobParamModel.getOrganizeCode(), userName, mesWorkOrder); @@ -101,11 +101,7 @@ public class MesReportWorkByPreDayJob extends BaseMesScheduleJob { for (MesProductionRecord mesProductionRecord : mesProductionRecords) { if (StringUtil.isEmpty(mesProductionRecord.getWorkOrderNo())) { - List collect = mesWorkOrders.stream().filter(w -> w.getWorkCenterCode().equalsIgnoreCase(mesProductionRecord.getWorkCenterCode()) - && w.getPartNo().equalsIgnoreCase(mesProductionRecord.getPartNo())).collect(Collectors.toList()); - if (!CollectionUtils.isEmpty(collect)) { - mesProductionRecord.setWorkOrderNo(collect.get(0).getWorkOrderNo()); - } + mesProductionRecord.setWorkOrderNo(mesWorkOrder.getWorkOrderNo()); } mesProductionRecord.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_20.getValue()); mesProductionRecord.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); @@ -122,13 +118,13 @@ public class MesReportWorkByPreDayJob extends BaseMesScheduleJob { productionRecordService.updateProductionRecord(mesProductionRecord.getOrganizeCode(), userName, mesProductionRecord.getId(), errorMsg); } } - } - } catch (ImppBusiException e) { - List snList = mesProductionRecordList.stream().map(MesProductionRecord::getProductSn).collect(Collectors.toList()); - String errorMsg = StringUtil.isEmpty(e.getErrorDetail()) ? e.getErrorMsg() : e.getErrorDetail(); - LOGGER.info("条码:{}报工失败,{}", snList, errorMsg); - for (MesProductionRecord mesProductionRecord : mesProductionRecordList) { - productionRecordService.updateProductionRecord(mesProductionRecord.getOrganizeCode(), userName, mesProductionRecord.getId(), errorMsg); + } catch (ImppBusiException e) { + List snList = v.stream().map(MesProductionRecord::getProductSn).collect(Collectors.toList()); + String errorMsg = StringUtil.isEmpty(e.getErrorDetail()) ? e.getErrorMsg() : e.getErrorDetail(); + LOGGER.info("条码:{}报工失败,{}", snList, errorMsg); + for (MesProductionRecord mesProductionRecord : v) { + productionRecordService.updateProductionRecord(mesProductionRecord.getOrganizeCode(), userName, mesProductionRecord.getId(), errorMsg); + } } } } 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 6417a72..e02babc 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 @@ -818,19 +818,40 @@ public class MesWorkOrderService implements IMesWorkOrderService { throw new ImppBusiException(String.format("班次信息未维护,产线=%s",workCenterCode)); } List shifts = shiftList.stream().filter(mesShift -> Objects.equals(mesShift.getWorkCenterCode(), workCenterCode)).collect(Collectors.toList()); + // 获取产品加工记录对应时间的班次 + + Integer hours = transfer(productionRecord.getCompleteDateTime()).getHours(); + + Date currentDate = TimeTool.stringParseToDate(productionRecord.getCompleteDateTime()); + String lotNo = productionRecord.getLotNo(); + // 基于加工时间判断具体的班次 + MesShift currentShift = shiftList.stream().filter(shift -> { + String startTime = lotNo + " " + shift.getStartTime(); + String endTime = lotNo + " " + shift.getEndTime(); + // 如果是晚班,12点前,结束时间要加一天,如果是12点后,开始时间要减一天 + if (Objects.equals(shift.getShiftCode(),"20")) { + if (hours < 12) { + startTime = getDateTime(lotNo, 1) + " " + shift.getStartTime(); + } else { + endTime = getDateTime(lotNo, 2) + " " + shift.getEndTime(); + } + } + Date startDate = DateUtil.parse(startTime); + Date endDate = DateUtil.parse(endTime); + return currentDate.getTime() >= startDate.getTime() && currentDate.getTime() <= endDate.getTime(); + }).findFirst().orElse(null); - MesShift currentShift = shifts.stream().filter(mesShift -> Objects.equals(mesShift.getShiftCode(), shiftCode)).findFirst().orElse(null); String orderDate = productionRecord.getLotNo(); if (currentShift.getStartTime().compareTo(currentShift.getEndTime()) > 0) { // 如果比0点大,需要找日期前一天的班次的工单号,如果是0点前,date =lotNO 如果是0点后,则找lot的前一天 - int hours = transfer(productionRecord.getCompleteDateTime()).getHours(); if (hours < 12) { orderDate = getDate(productionRecord.getLotNo(), 1); } else { orderDate = getDate(productionRecord.getLotNo(), 0); } + } List list = new ArrayList<>(); @@ -856,7 +877,6 @@ public class MesWorkOrderService implements IMesWorkOrderService { // 如果开始时间大于结束时间,说明跨天了,跨天说明是晚班,需要找, 如果是晚班, 则找早中班的工单 if (currentShift.getStartTime().compareTo(currentShift.getEndTime()) > 0) { // 如果比0点大,需要找日期前一天的班次的工单号,如果是0点前,date =lotNO 如果是0点后,则找lot的前一天 - int hours = transfer(productionRecord.getCompleteDateTime()).getHours(); if (hours < 12) { date = getDate(productionRecord.getLotNo(), 1); } else { @@ -1292,15 +1312,12 @@ public class MesWorkOrderService implements IMesWorkOrderService { } @Override - public List insertMesWorkOrder(List mesProductionRecordList, List mesShiftList, String organizeCode, String userName) { - List mesWorkOrderList = new ArrayList<>(); - Map> mesProductionRecordListMap = mesProductionRecordList.stream().collect(Collectors.groupingBy(sn -> sn.getWorkCenterCode() + "=" + sn.getPartNo())); - for (Map.Entry> stringListEntry : mesProductionRecordListMap.entrySet()) { - List value = stringListEntry.getValue(); - MesProductionRecord mesProductionRecord = value.get(0); - String[] split = stringListEntry.getKey().split("="); - String workCenterCode = split[0]; - String partNo = split[1]; + public MesWorkOrder insertMesWorkOrder(List mesProductionRecordList, List mesShiftList, String organizeCode, String userName) { + + MesProductionRecord mesProductionRecord = mesProductionRecordList.get(0); + + String workCenterCode = mesProductionRecord.getWorkCenterCode(); + String partNo = mesProductionRecord.getPartNo(); //查询工作中心 DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean); @@ -1344,7 +1361,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { item.setProduceTime(TimeTool.getToday()); item.setProductTime(item.getProduceTime()); item.setUnCompleteQty(0d); - item.setQty(value.stream().mapToDouble(MesProductionRecord::getQty).sum()); + item.setQty(mesProductionRecordList.stream().mapToDouble(MesProductionRecord::getQty).sum()); item.setCompleteQty(item.getQty()); item.setReportedQty(item.getQty()); item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); @@ -1362,13 +1379,13 @@ public class MesWorkOrderService implements IMesWorkOrderService { //校验物料生产版本是否存在 MesProductVersion mesProductVersion = checkMesProductVersion(item); if (Objects.isNull(mesProductVersion)) { - continue; + return null; } item.setProductVersion(mesProductVersion.getProductVersion()); //获取bom信息 List bomList = findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList()); if (org.springframework.util.CollectionUtils.isEmpty(bomList)) { - continue; + return null; } } @@ -1377,21 +1394,26 @@ public class MesWorkOrderService implements IMesWorkOrderService { ConvertBean.serviceModelInitialize(item, userName); MesWorkOrder mesWorkOrder = workOrderRepository.insert(item); saveMesWorkOrderLog(mesWorkOrder,MesExtEnumUtil.WORK_ORDER_LOG_TYPE.INSERT.getValue(),item.getQty()); - mesWorkOrderList.add(mesWorkOrder); - } - return mesWorkOrderList; + return mesWorkOrder; } private MesProductVersion checkMesProductVersion(MesWorkOrder item) { DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode()); DdlPreparedPack.getStringEqualPack(item.getPartNo(), "partNo", ddlPackBean); DdlPreparedPack.getStringEqualPack(item.getErpWorkCenter(), "workCenterCode", ddlPackBean); - MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean); - if (Objects.isNull(mesProductVersion)) { + List mesProductVersions = mesProductVersionRDao.findByHqlWhere(ddlPackBean); + if (CollectionUtils.isEmpty(mesProductVersions)) { LOGGER.info("物料{}产线{}生产版本{}信息不存在", item.getPartNo(), item.getWorkCenterCode(), item.getProductVersion() ); MesPcnException.throwMesBusiException("物料【%s】产线【%s】生产版本【%s】信息不存在", item.getPartNo(), item.getWorkCenterCode(), item.getProductVersion()); } + MesProductVersion mesProductVersion = null; + List mesProductOneVersions = mesProductVersions.stream().filter(productVersion -> Objects.equals(productVersion.getProductVersion(),"0001")).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(mesProductOneVersions)) { + mesProductVersion = mesProductOneVersions.get(0); + } else { + mesProductVersion = mesProductVersions.get(0); + } return mesProductVersion; } @@ -1752,4 +1774,28 @@ public class MesWorkOrderService implements IMesWorkOrderService { move.setWorkCenter(workCenterCode); return move; } + /** + * flag = 1 减少 1天, = 2 加一天 + * + * @param lotNo + * @param flag + * @return + */ + public String getDateTime(String lotNo, int flag) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + Date d = null; + try { + d = df.parse(lotNo); + } catch (ParseException e) { + e.printStackTrace(); + } + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + if (flag == 1) { + cal.add(Calendar.DATE, -1); //减1天 + } else if (flag == 2) { + cal.add(Calendar.DATE, 1); //加1天 + } + return df.format(cal.getTime()).substring(0, 10); + } }