From 5e715f331a27e0865446ec74fc16011918acfbe5 Mon Sep 17 00:00:00 2001 From: gsz Date: Wed, 26 Jun 2024 15:33:17 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=89=8D=E4=B8=80?= =?UTF-8?q?=E5=A4=A9=E5=BE=85=E6=8A=A5=E5=B7=A5=E8=AE=B0=E5=BD=95=E6=95=B0?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E5=B7=A5=E5=8D=95=E5=B9=B6=E6=8A=A5=E5=B7=A5?= =?UTF-8?q?job?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext/mes/pcn/api/busi/IMesWorkOrderService.java | 10 + .../apiservice/controller/busi/TestController.java | 64 +++- .../schedulejob/MesReportWorkByPreDayJob.java | 96 ++++++ .../serviceimpl/busi/MesWorkOrderService.java | 358 +++++++++++++++++++++ 4 files changed, 527 insertions(+), 1 deletion(-) create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportWorkByPreDayJob.java 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 ffea1b4..6ba259c 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 @@ -3,6 +3,8 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; +import cn.estsh.i3plus.pojo.mes.bean.MesShift; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; import io.swagger.annotations.ApiOperation; @@ -36,4 +38,12 @@ public interface IMesWorkOrderService { * @return */ List getUnReportMesProduceSn(String organizeCode); + + List getPreDayReportMesProductionRecord(String organizeCode , List mesShiftList, String workCenterCode); + + List getPreDayReportMesProduceSn(String organizeCode ,List mesProductionRecordList ); + + public List insertMesWorkOrder(List mesProduceSns,List mesShiftList,String organizeCode, String userName ); + + void doPcnJobProductReport(List mesProduceSns,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 da061cc..908277a 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 @@ -1,22 +1,31 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService; import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; -import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentLog; +import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTask; +import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesShiftRepository; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ResultBean; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; @RestController @RequestMapping(MesCommonConstant.MES_YANFEN + "/test") @@ -25,6 +34,15 @@ public class TestController { private IMesEquipmentLogExtService mesEquipmentLogExtService; + @Autowired + private IMesWorkOrderService workOrderService; + + @Autowired + private MesProductionRecordRepository productionRecordRao; + @Autowired + private MesShiftRepository mesShiftRepository; + @Autowired + private IMesConfigService configService; @GetMapping("/equipment/log/query") @ApiOperation(value = "查询设备交互") public ResultBean queryReworkTaskByPager(String organizeCode, Integer equipId) { @@ -37,4 +55,48 @@ public class TestController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + @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; + } + //2. 查询 mesProduceSn + List unReportMesProduceSn = workOrderService.getPreDayReportMesProduceSn(organizeCode,mesProductionRecordList); + if(CollectionUtils.isEmpty(unReportMesProduceSn)){ + continue; + } + List mesWorkOrders = workOrderService.insertMesWorkOrder(unReportMesProduceSn, mesShiftList,organizeCode, userName); + if(CollectionUtils.isEmpty(mesWorkOrders)){ + continue; + } + //根据产线+物料产生的工单报工 + for (MesWorkOrder mesWorkOrder : mesWorkOrders) { + List mesProduceSnList = unReportMesProduceSn.stream().filter(w -> w.getPartNo().equalsIgnoreCase(mesWorkOrder.getPartNo())).collect(Collectors.toList()); + workOrderService.doPcnJobProductReport(mesProduceSnList,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); + } + } } 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 new file mode 100644 index 0000000..023c3e3 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesReportWorkByPreDayJob.java @@ -0,0 +1,96 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob; + + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; +import cn.estsh.i3plus.pojo.mes.bean.MesShift; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; +import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesShiftRepository; +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.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author 根据前一天待报工记录数插入工单并报工 + * @version 1.0 + * @date 2024/6/26 10:26 + **/ +@Slf4j +@DisallowConcurrentExecution +@Component +@ApiOperation("根据前一天待报工记录数插入工单并报工job") +public class MesReportWorkByPreDayJob extends BaseMesScheduleJob { + + @Autowired + private IMesWorkOrderService workOrderService; + + @Autowired + private MesProductionRecordRepository productionRecordRao; + @Autowired + private MesShiftRepository mesShiftRepository; + @Autowired + private IMesConfigService configService; + public MesReportWorkByPreDayJob() { + super(MesReportWorkByPreDayJob.class, "根据前一天待报工记录数插入工单并报工JOB"); + } + @Override + public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) { + String jobParam = this.getJobParam(); + JSONObject jsonObject= JSONUtil.parseObj(jobParam); + String organizeCode = jsonObject.getStr("organizeCode"); + String userName = "REPORT_PRE_DAY_JOB"; + if (null == organizeCode){ + log.error("请添加需要报工的工厂代码!"); + return; + } + //遍历系统参数指定的产线获取对应班次,找到早班的开始时间, + String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_WORK_CENTER_NO"); + List workCenterCodeList = Arrays.asList(workCenterCodes.split(",")); + + 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; + } + //2. 查询 mesProduceSn + List unReportMesProduceSn = workOrderService.getPreDayReportMesProduceSn(organizeCode,mesProductionRecordList); + if(CollectionUtils.isEmpty(unReportMesProduceSn)){ + continue; + } + List mesWorkOrders = workOrderService.insertMesWorkOrder(unReportMesProduceSn, mesShiftList,organizeCode, userName); + if(CollectionUtils.isEmpty(mesWorkOrders)){ + continue; + } + //根据产线+物料产生的工单报工 + for (MesWorkOrder mesWorkOrder : mesWorkOrders) { + List mesProduceSnList = unReportMesProduceSn.stream().filter(w -> w.getPartNo().equalsIgnoreCase(mesWorkOrder.getPartNo())).collect(Collectors.toList()); + workOrderService.doPcnJobProductReport(mesProduceSnList,mesShiftList,organizeCode,userName, mesWorkOrder); + } + for (MesProductionRecord mesProductionRecord : mesProductionRecordList) { + mesProductionRecord.setReportStatus(20); + ConvertBean.serviceModelUpdate(mesProductionRecord, userName); + } + productionRecordRao.saveAll(mesProductionRecordList); + } + } +} 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 3b00a21..bbdc9ec 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 @@ -1,25 +1,37 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; +import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant; +import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.tool.MathOperation; +import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.common.PagerHelper; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.base.util.StringUtil; import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; import cn.estsh.i3plus.pojo.mes.repository.*; +import cn.estsh.i3plus.pojo.mes.repository.shipping.MesWorkOrderToWmsRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; +import cn.estsh.impp.framework.boot.util.ValidatorBean; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -56,7 +68,17 @@ public class MesWorkOrderService implements IMesWorkOrderService { @Autowired private MesProduceSnRepository mesProduceSnRao; + @Autowired + private ISyncFuncService syncFuncService; + @Autowired + private MesWorkOrderLogRepository mesWorkOrderLogRepository; + @Autowired + private MesWorkOrderToWmsRepository mesWorkOrderToWmsRDao; + @Autowired + private MesShiftRepository mesShiftRepository; + @Autowired + private IMesConfigService configService; @Override public MesWorkOrder queryMesWorkOrder(MesWorkOrder workOrder) { @@ -217,7 +239,196 @@ public class MesWorkOrderService implements IMesWorkOrderService { mesProductOffLineRDao.saveAll(mesProductOffLineList); } } + public void doPcnJobProductReport(List mesProduceSns,List mesShiftList,String organizeCode, String userName ,MesWorkOrder mesWorkOrderDb) { + + //查询物料信息 + DdlPackBean ddlPackBeanPart = DdlPackBean.getDdlPackBean(mesWorkOrderDb.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesWorkOrderDb.getPartNo(), "partNo", ddlPackBeanPart); + MesPart mesPart = mesPartRDao.getByProperty(ddlPackBeanPart); + if (null == mesPart) { + MesPcnException.throwMesBusiException("物料【%s】信息不存在", mesWorkOrderDb.getPartNo()); + } + + //查询产线信息 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrderDb.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesWorkOrderDb.getWorkCenterCode(), "workCenterCode", ddlPackBean); + MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean); + if (Objects.isNull(mesWorkCenter)) { + MesPcnException.throwMesBusiException("产线【%s】不存在", mesWorkOrderDb.getWorkCenterCode()); + } + //获取生产版本 + MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrderDb); + //物料+生产版本获取bom信息 + List mesBoms = findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); + //报工类型 + if (MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrderDb.getReportType()) { + mesWorkOrderDb.setReportedQty(MathOperation.add(mesWorkOrderDb.getNum(), mesWorkOrderDb.getReportedQty())); + //更新工单状态 + double unCompleteQty = MathOperation.sub(mesWorkOrderDb.getQty(), mesWorkOrderDb.getReportedQty()); + mesWorkOrderDb.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0); + if (mesWorkOrderDb.getReportedQty() > mesWorkOrderDb.getQty()) { + MesPcnException.throwMesBusiException("工单报工数量【%s】大于工单数量【%s】,不允许报工", + mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty()); + } else if (Objects.equals(mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty())) { + mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); + } else { + mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()); + } + } else { + //报工调整数量加- + mesWorkOrderDb.setAdjustQty((MathOperation.add(mesWorkOrderDb.getNum(), mesWorkOrderDb.getAdjustQty()))); + //冲销数量大于工单完成数量报错 + if (mesWorkOrderDb.getAdjustQty() > mesWorkOrderDb.getReportedQty()) { + MesPcnException.throwMesBusiException("冲销数量【%s】大于工单完成数量【%s】,不允许冲销", + mesWorkOrderDb.getAdjustQty(), mesWorkOrderDb.getReportedQty()); + } + } + //更新工单 + updateMesWorkOrder(mesWorkOrderDb, userName ); + + //生成条码 todo 有条码 不生成 + + //保存数据 +// List mesProductOffLineList = new ArrayList<>(); +// for (MesBom mesBom : mesBoms) { +// mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false)); +// } +// mesProductOffLineService.insertBatch(mesProductOffLineList); + + //保存数据 + List mesProductOffLineList = new ArrayList<>(); + MesProductOffLine newMesProductOffLine; + for (MesProduceSn produceSn : mesProduceSns) { + for (MesBom mesBom : mesBoms) { + newMesProductOffLine = new MesProductOffLine(); + newMesProductOffLine.setReportPartNo(mesWorkOrderDb.getPartNo()); + newMesProductOffLine.setReportPartNameRdd(mesWorkOrderDb.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(produceSn.getProductSn()); + newMesProductOffLine.setBomVersion(mesWorkOrderDb.getProductVersion()); + newMesProductOffLine.setSerialNumber(produceSn.getProductSn()); + newMesProductOffLine.setUnit(mesBom.getUnit()); + newMesProductOffLine.setItemUnit(mesBom.getItemUnit()); + newMesProductOffLine.setWorkOrderNo(mesWorkOrderDb.getWorkOrderNo()); + newMesProductOffLine.setWorkCenterCode(mesWorkOrderDb.getWorkCenterCode()); + newMesProductOffLine.setWorkCellCode(mesWorkOrderDb.getWorkCellCode()); + newMesProductOffLine.setReportType(mesWorkOrderDb.getReportType()); + newMesProductOffLine.setSapWorkCenter(mesWorkOrderDb.getErpWorkCenter()); + newMesProductOffLine.setOrganizeCode(organizeCode); + + ConvertBean.serviceModelInitialize(newMesProductOffLine, userName); + mesProductOffLineList.add(newMesProductOffLine); + } + } + mesProductOffLineRDao.saveAll(mesProductOffLineList); + } + private void updateMesWorkOrder(MesWorkOrder mesWorkOrder, String userName ) { + //修改工单,需要重新同步 + mesWorkOrder.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + ConvertBean.serviceModelUpdate(mesWorkOrder, userName); + workOrderRepository.update(mesWorkOrder); + //保存记录 + saveMesWorkOrderLog(mesWorkOrder); + } + public void saveMesWorkOrderLog(MesWorkOrder mesWorkOrder) { + MesWorkOrderLog workOrderLog = new MesWorkOrderLog(); + BeanUtils.copyProperties(mesWorkOrder, workOrderLog, "id"); + mesWorkOrderLogRepository.insert(workOrderLog); + } + public List findBomList(String organizeCode, MesPart mesPart, String bomVersion) { + List bomData = new ArrayList<>(); + // 递归展开 BOM + expendBomChild(organizeCode, mesPart.getPartNo(), bomVersion, bomData); + + if (bomData.size() == 0) { + MesPcnException.throwMesBusiException("零件号 %s 没找找到 ERP 同步的原始 BOM 数据,请检查接口是否正常!", mesPart.getPartNo()); + } + Iterator iterator = bomData.iterator(); + while (iterator.hasNext()) { + MesBom item = iterator.next(); + // 删除虚零件 + if (Objects.equals("X", item.getPartType())) { + iterator.remove(); + } else { + item.setPartNo(mesPart.getPartNo()); + item.setPartName(mesPart.getPartName()); + } + } + + Map summaryBomMap = new HashMap<>(); + + for (MesBom item : bomData) { + String key = String.format("%s:%s", item.getPartNo().toUpperCase().trim(), + item.getItemPartNo().toUpperCase().trim()); + if (!summaryBomMap.containsKey(key)) { + summaryBomMap.put(key, item); + } else { + MesBom tempItem = summaryBomMap.get(key); + // 子零件重复的累加数量 + tempItem.setItemQty(MathOperation.add(tempItem.getItemQty(), item.getItemQty())); + } + } + // 返回汇总数据 + return new ArrayList<>(summaryBomMap.values()); + } + /** + * 递归展开 BOM + * + * @param organizeCode 工厂代码 + * @param partNo 父零件号 + * @param bomData 存放 BOM 数据的集合 + */ + private void expendBomChild(String organizeCode, String partNo, String bomVersion, List bomData) { + List bomDetails = findMesBomByPartNoAndBomVersion(partNo, organizeCode, bomVersion); + + for (MesBom item : bomDetails) { + MesBom newItem = new MesBom(); + BeanUtils.copyProperties(item, newItem); + // 处理父零件用量不为 1 的情况 + if (newItem.getQty() != 1.0 && newItem.getQty() > 0.0) { + Double rateQty = MathOperation.div(newItem.getItemQty(), newItem.getQty(), 8); + newItem.setQty(1.0); + newItem.setItemQty(rateQty); + } + // 加入到 BOM 清单中 + bomData.add(newItem); + // 如果有子阶,继续递归 + if (Objects.equals("X", item.getPartType())) { + expendBomChild(organizeCode, newItem.getItemPartNo(), null, bomData); + } + } + } + public List findMesBomByPartNoAndBomVersion(String partNo, String organizeCode, String bomVersion) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(bomVersion, "bomVersion", ddlPackBean); + DdlPreparedPack.getStringSmallerPack(TimeTool.getNowTime(true), "effStartTime", ddlPackBean); + DdlPreparedPack.getOrderBy("effStartTime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean); + List mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean); + if (org.springframework.util.CollectionUtils.isEmpty(mesBoms)) { + MesPcnException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在", partNo, bomVersion); + } + MesBom next = mesBoms.iterator().next(); + //如果存在多个bomCode取最新的一个 + return mesBoms.stream().collect(Collectors.groupingBy(MesBom::getBomCode)).get(next.getBomCode()); + } + private MesProductVersion getMesProductVersion(MesWorkOrder mesWorkOrder) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesWorkOrder.getPartNo(), "partNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(mesWorkOrder.getErpWorkCenter(), "workCenterCode", ddlPackBean); + DdlPreparedPack.getStringEqualPack(mesWorkOrder.getProductVersion(), "productVersion", ddlPackBean); + MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean); + if (null == mesProductVersion) { + MesPcnException.throwMesBusiException("物料【%s】生产版本信息不存在", mesWorkOrder.getPartNo()); + } + return mesProductVersion; + } @Override public List getUnReportMesProduceSn(String organizeCode) { List mesProduceSnList = new ArrayList<>(); @@ -237,6 +448,27 @@ public class MesWorkOrderService implements IMesWorkOrderService { DdlPreparedPack.getStringEqualPack(workOrderNo,"workOrderNo",snPackBean); return mesProduceSnRao.findByHqlWhere(snPackBean); } + @Override + public List getPreDayReportMesProductionRecord(String organizeCode,List mesShiftList, String workCenterCode ) { + + //1.获取生产加工记录production_record表中,report_status为待汇报状态的工单 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workCenterCode,"workCenterCode",ddlPackBean); + DdlPreparedPack.getNumEqualPack( MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(),"reportStatus",ddlPackBean); + //获取前一天的早班到当天早班的区间的所有加工记录,统计个数 + DdlPreparedPack.timeBuilder(TimeTool.getToday()+" 08:00:00", + new SimpleDateFormat("yyyy-MM-dd").format(TimeTool.getDateBefore(new Date(),1))+" 08:00:00", + "completeDateTime", ddlPackBean, false); + + return productionRecordRao.findByHqlWhere(ddlPackBean); + } + @Override + public List getPreDayReportMesProduceSn(String organizeCode,List mesProductionRecordList ) { + DdlPackBean snPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(mesProductionRecordList.stream().map(MesProductionRecord::getProductSn).collect(Collectors.toList()), + "productSn",snPackBean); + return mesProduceSnRao.findByHqlWhere(snPackBean); + } private void saveMesProductPlan(MesWorkOrder bean, boolean isInsert, boolean isReport) { if (StringUtil.isEmpty(bean.getPlanOrderNo())) { @@ -302,4 +534,130 @@ public class MesWorkOrderService implements IMesWorkOrderService { } } + @Override + public List insertMesWorkOrder(List mesProduceSns,List mesShiftList, String organizeCode, String userName) { + List mesWorkOrderList=new ArrayList<>(); + Map> snListMap = mesProduceSns.stream().collect(Collectors.groupingBy(sn -> sn.getWorkCenterCode() +"="+ sn.getPartNo())); + for (Map.Entry> stringListEntry : snListMap.entrySet()) { + List value = stringListEntry.getValue(); + MesProduceSn mesProduceSn = value.get(0); + String[] split = stringListEntry.getKey().split("="); + String workCenterCode = split[0]; + String partNo = split[1]; + + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean); + MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean); + if (Objects.isNull(mesWorkCenter)) { + MesPcnException.throwMesBusiException("产线【%s】不存在",workCenterCode); + } + MesWorkOrder item=new MesWorkOrder(); + item.setOrganizeCode(organizeCode); + item.setWorkCenterCode(workCenterCode); + item.setPartNo(partNo); + item.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()); + item.setOrderFlag(MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue()); + List collect = mesShiftList.stream().filter(s -> s.getShiftCode().equalsIgnoreCase("1")).collect(Collectors.toList()); + MesShift mesShift= collect.get(0); + item.setShiftCode(mesShift.getShiftCode()); + item.setShiftCode(mesShift.getShiftName()); + String today = TimeTool.getToday(); + item.setPlanStartTime(today+" "+mesShift.getStartTime()+":00"); + item.setPlanEndTime(today+" "+mesShift.getEndTime()+":00"); + + //生成工单号 + List orderList=new ArrayList<>(); + GenSerialNoModel genSerialNoModel = new GenSerialNoModel("MES_WORK_CENTER_ORDER_NO"); + genSerialNoModel.setPartNo(workCenterCode); + orderList = syncFuncService.syncSerialNo(genSerialNoModel,userName, organizeCode, 1).getResultList(); + + String orderNo = orderList.get(0); + DdlPackBean orderPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(orderNo, "workOrderNo", orderPackBean); + if (mesWorkCenterRDao.isExitByHql(orderPackBean)) { + MesPcnException.throwMesBusiException("单号流水码生成重复"); + } + item.setWorkOrderNo(orderNo); + //校验标识 + //若工单类型为排序 + List saveMesWorkOrderToWms = new ArrayList<>(); + if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) { + //校验产线类型和工单类型是否匹配 + if (!Objects.equals(mesWorkCenter.getCenterType(), MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue())) { + MesPcnException.throwMesBusiException("产线【%s】类型为【%s】,请选择非排序产线", mesWorkCenter.getWorkCenterCode(), + MesExtEnumUtil.WORK_CENTER_TYPE.valueOfDescription(mesWorkCenter.getCenterType())); + } + + //校验物料生产版本是否存在 + MesProductVersion mesProductVersion = checkMesProductVersion(item); + item.setProductVersion(mesProductVersion.getProductVersion()); + //获取bom信息 + List bomList = findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList()); + item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()); + //发送工单信息给WMS + saveMesWorkOrderToWms.addAll(saveMesWorkOrderToWms(item, bomList)); + } + //物料名称不存在,从物料信息中获取 + + item.setPartName(mesProduceSn.getPartName()); + //生产时间新增取当天 + item.setProduceTime(TimeTool.getToday()); + item.setUnCompleteQty(0d); + +// if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()){ +// //生产工单-非排序手工插单,关闭该零件当天之前日期非排序工单 +// List partNoList = Collections.singletonList(item.getPartNo()); +// deleteUnSortOrder(orderNo,partNoList); +// } + item.setQty(value.stream().mapToDouble(MesProduceSn::getQty).sum()); + item.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + ConvertBean.serviceModelInitialize(item, userName); + MesWorkOrder mesWorkOrder = workOrderRepository.insert(item); + //保存发送WMS数据 + if (CollectionUtils.isNotEmpty(saveMesWorkOrderToWms)) { + mesWorkOrderToWmsRDao.saveAll(saveMesWorkOrderToWms); + } + saveMesWorkOrderLog(mesWorkOrder); + mesWorkOrderList.add(mesWorkOrder); + } + + return mesWorkOrderList; + } + + public void deleteUnSortOrder(String organizeCode, List partNoList) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(partNoList, "partNo", ddlPackBean); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue(), "workOrderType", ddlPackBean); + DdlPreparedPack.getStringSmallerNotEqualPack(TimeTool.getToday(), "planStartTime", ddlPackBean); + DdlPreparedPack.getNumberSmallerPack(MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue(), "workOrderStatus", ddlPackBean); + workOrderRepository.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "workOrderStatus"}, + new Object[]{"CLOSE_JOB", TimeTool.getNowTime(true), MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()}, ddlPackBean); + } + public List saveMesWorkOrderToWms(MesWorkOrder mesWorkOrder, List mesBomList) { + List mesWorkOrderToWmsList = new ArrayList<>(); + MesWorkOrderToWms mesWorkOrderToWms = null; + for (MesBom mesBom : mesBomList) { + mesWorkOrderToWms = new MesWorkOrderToWms(); + BeanUtils.copyProperties(mesWorkOrder, mesWorkOrderToWms, "id"); + mesWorkOrderToWms.setUnit(mesBom.getUnit()); + mesWorkOrderToWms.setItemPartNo(mesBom.getItemPartNo()); + mesWorkOrderToWms.setItemPartName(mesBom.getItemPartName()); + mesWorkOrderToWms.setItemUnit(mesBom.getItemUnit()); + mesWorkOrderToWms.setItemQty(MathOperation.mul(mesWorkOrder.getQty(), mesBom.getItemQty())); + ConvertBean.serviceModelInitialize(mesWorkOrderToWms, mesWorkOrderToWms.getCreateUser()); + mesWorkOrderToWmsList.add(mesWorkOrderToWms); + } + return mesWorkOrderToWmsList; + } + private MesProductVersion checkMesProductVersion(MesWorkOrder item) { + DdlPackBean 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)) { + MesPcnException.throwMesBusiException("物料【%s】产线【%s】生产版本【%s】信息不存在", item.getPartNo(), item.getWorkCenterCode(), item.getProductVersion()); + } + return mesProductVersion; + } } From 948a70f491b337e288d848f39fa695ce86152c07 Mon Sep 17 00:00:00 2001 From: gsz Date: Wed, 26 Jun 2024 17:04:05 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=89=8D=E4=B8=80?= =?UTF-8?q?=E5=A4=A9=E5=BE=85=E6=8A=A5=E5=B7=A5=E8=AE=B0=E5=BD=95=E6=95=B0?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E5=B7=A5=E5=8D=95=E5=B9=B6=E6=8A=A5=E5=B7=A5?= =?UTF-8?q?job?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schedulejob/MesReportWorkByPreDayJob.java | 53 ++++++++++++++-------- .../serviceimpl/busi/MesWorkOrderService.java | 11 +++-- 2 files changed, 41 insertions(+), 23 deletions(-) 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 023c3e3..c11e30b 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 @@ -11,6 +11,7 @@ import cn.estsh.i3plus.pojo.mes.bean.MesShift; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository; import cn.estsh.i3plus.pojo.mes.repository.MesShiftRepository; +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; @@ -46,16 +47,18 @@ public class MesReportWorkByPreDayJob extends BaseMesScheduleJob { private MesShiftRepository mesShiftRepository; @Autowired private IMesConfigService configService; + public MesReportWorkByPreDayJob() { super(MesReportWorkByPreDayJob.class, "根据前一天待报工记录数插入工单并报工JOB"); } + @Override public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) { String jobParam = this.getJobParam(); - JSONObject jsonObject= JSONUtil.parseObj(jobParam); + JSONObject jsonObject = JSONUtil.parseObj(jobParam); String organizeCode = jsonObject.getStr("organizeCode"); String userName = "REPORT_PRE_DAY_JOB"; - if (null == organizeCode){ + if (null == organizeCode) { log.error("请添加需要报工的工厂代码!"); return; } @@ -68,29 +71,43 @@ public class MesReportWorkByPreDayJob extends BaseMesScheduleJob { 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)){ + List mesProductionRecordList = workOrderService.getPreDayReportMesProductionRecord(organizeCode, mesShiftList, workCenterCode); + if (CollectionUtils.isEmpty(mesProductionRecordList)) { continue; } //2. 查询 mesProduceSn - List unReportMesProduceSn = workOrderService.getPreDayReportMesProduceSn(organizeCode,mesProductionRecordList); - if(CollectionUtils.isEmpty(unReportMesProduceSn)){ - continue; - } - List mesWorkOrders = workOrderService.insertMesWorkOrder(unReportMesProduceSn, mesShiftList,organizeCode, userName); - if(CollectionUtils.isEmpty(mesWorkOrders)){ + List unReportMesProduceSn = workOrderService.getPreDayReportMesProduceSn(organizeCode, mesProductionRecordList); + if (CollectionUtils.isEmpty(unReportMesProduceSn)) { continue; } - //根据产线+物料产生的工单报工 - for (MesWorkOrder mesWorkOrder : mesWorkOrders) { - List mesProduceSnList = unReportMesProduceSn.stream().filter(w -> w.getPartNo().equalsIgnoreCase(mesWorkOrder.getPartNo())).collect(Collectors.toList()); - workOrderService.doPcnJobProductReport(mesProduceSnList,mesShiftList,organizeCode,userName, mesWorkOrder); + LOGGER.info("产线:{}报工mesWorkOrders:{}", workCenterCode, unReportMesProduceSn); + //3.插入生产工单表 + List mesWorkOrders = workOrderService.insertMesWorkOrder(unReportMesProduceSn, mesShiftList, organizeCode, userName); + if (CollectionUtils.isEmpty(mesWorkOrders)) { + continue; } - for (MesProductionRecord mesProductionRecord : mesProductionRecordList) { - mesProductionRecord.setReportStatus(20); - ConvertBean.serviceModelUpdate(mesProductionRecord, userName); + LOGGER.info("产线:{}报工mesWorkOrders:{}", workCenterCode, mesWorkOrders); + //4.根据产线+物料产生的工单报工 + try { + for (MesWorkOrder mesWorkOrder : mesWorkOrders) { + List mesProduceSnList = unReportMesProduceSn.stream().filter(w -> w.getPartNo().equalsIgnoreCase(mesWorkOrder.getPartNo())).collect(Collectors.toList()); + workOrderService.doPcnJobProductReport(mesProduceSnList, mesShiftList, organizeCode, userName, mesWorkOrder); + for (MesProductionRecord mesProductionRecord : mesProductionRecordList) { + mesProductionRecord.setReportStatus(20); + ConvertBean.serviceModelUpdate(mesProductionRecord, userName); + } + productionRecordRao.saveAll(mesProductionRecordList); + } + } catch (ImppBusiException e) { + LOGGER.error("产线:{}报工失败:{}", workCenterCode, e.getErrorDetail()); +// for (MesProductionRecord mesProductionRecord : mesProductionRecordList) { +// mesProductionRecord.setReportStatus(40); +// ConvertBean.serviceModelUpdate(mesProductionRecord, userName); +// } +// productionRecordRao.saveAll(mesProductionRecordList); + continue; } - productionRecordRao.saveAll(mesProductionRecordList); + } } } 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 7a8aba5..429ddcd 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 @@ -1,10 +1,8 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; -import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; -import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant; import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.tool.MathOperation; @@ -21,11 +19,11 @@ import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; import cn.estsh.i3plus.pojo.mes.repository.*; import cn.estsh.i3plus.pojo.mes.repository.shipping.MesWorkOrderToWmsRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; -import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; -import cn.estsh.impp.framework.boot.util.ValidatorBean; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -48,6 +46,7 @@ import java.util.stream.Stream; @Slf4j public class MesWorkOrderService implements IMesWorkOrderService { + public static final Logger LOGGER = LoggerFactory.getLogger(MesWorkOrderService.class); @Autowired private MesWorkOrderRepository workOrderRepository; @Autowired @@ -283,6 +282,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { mesWorkOrderDb.getAdjustQty(), mesWorkOrderDb.getReportedQty()); } } + LOGGER.info("产线:{} 零件:{}更新工单", mesWorkOrderDb.getWorkCenterCode(), mesWorkOrderDb.getPartNo()); //更新工单 updateMesWorkOrder(mesWorkOrderDb, userName ); @@ -295,6 +295,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { // } // mesProductOffLineService.insertBatch(mesProductOffLineList); + LOGGER.info("产线:{} 零件:{}更新工单mesProduceSns:{}", mesWorkOrderDb.getWorkCenterCode(), mesWorkOrderDb.getPartNo(),mesProduceSns.size()); //保存数据 List mesProductOffLineList = new ArrayList<>(); MesProductOffLine newMesProductOffLine; @@ -456,7 +457,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { //1.获取生产加工记录production_record表中,report_status为待汇报状态的工单 DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(workCenterCode,"workCenterCode",ddlPackBean); - DdlPreparedPack.getNumEqualPack( MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(),"reportStatus",ddlPackBean); + DdlPreparedPack.getNumEqualPack( MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_50.getValue(),"reportStatus",ddlPackBean); //获取前一天的早班到当天早班的区间的所有加工记录,统计个数 DdlPreparedPack.timeBuilder(TimeTool.getToday()+" 08:00:00", new SimpleDateFormat("yyyy-MM-dd").format(TimeTool.getDateBefore(new Date(),1))+" 08:00:00", From 113d8a78ddf5c3761bf6d316edd18115eb40301f Mon Sep 17 00:00:00 2001 From: administrator Date: Wed, 26 Jun 2024 17:43:48 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E6=9D=A1=E7=A0=81?= =?UTF-8?q?=E6=97=B6=E5=A2=9E=E5=8A=A0=E5=B0=8F=E9=B9=8F=E4=B8=80=E7=BB=B4?= =?UTF-8?q?=E7=A0=81=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiservice/serviceimpl/step/MesProductSnGenerateStepService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepService.java index 6263be2..50dcc31 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepService.java @@ -169,7 +169,7 @@ public class MesProductSnGenerateStepService extends BaseStepService { DdlPackBean mesRulePackBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); DdlPreparedPack.getStringEqualPack(snRule, "ruleCode", mesRulePackBean); List ruleList = mesNumberRuleRao.findByHqlWhere(mesRulePackBean); - if (!ruleList.isEmpty()) { + if (!ruleList.isEmpty() && !StringUtils.isEmpty(ruleList.get(0).getMethodNameExt())) { MesNumberRule numberRule = ruleList.get(0); String methodNameExt = numberRule.getMethodNameExt(); INumberRulePackAttributeStrategy strategy = (INumberRulePackAttributeStrategy)SpringContextsUtil.getBean(methodNameExt); From 1b71d890d825ba24daaff0028af2b698369be456 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=AE=E7=AC=91=E7=9D=80=E9=9D=A2=E5=AF=B9=E6=98=8E?= =?UTF-8?q?=E5=A4=A9?= <752558143@qq.com> Date: Wed, 26 Jun 2024 18:20:05 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=B1=95=E7=A4=BA=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext/mes/pcn/api/base/IMesShiftService.java | 5 + .../ext/mes/pcn/api/busi/IMesWorkOrderService.java | 14 +- .../apiservice/schedulejob/MesReportNoSortJob.java | 50 +++- .../serviceimpl/base/MesShiftServiceImpl.java | 6 + .../serviceimpl/busi/MesWorkOrderService.java | 304 ++++++++++++++++++++- .../step/MesSaveProcessResultStepService.java | 2 +- .../MesProductionCustomContextStepService.java | 4 +- pom.xml | 4 +- 8 files changed, 356 insertions(+), 33 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesShiftService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesShiftService.java index 66ba5b4..b92c748 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesShiftService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesShiftService.java @@ -6,6 +6,8 @@ import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.mes.bean.MesShift; import io.swagger.annotations.ApiOperation; +import java.util.List; + /** * @Description: 产线与班次的对应关系 * @Author: gsz @@ -18,4 +20,7 @@ public interface IMesShiftService { @ApiOperation(value = "查询产线与班次的对应关系") public ListPager queryMesShiftByPager(MesShift mesShift, Pager pager); + + @ApiOperation(value = "查询产线与班次的对应关系") + public List queryMesShift(String organizeCode, String workCenterCode); } 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 6ba259c..c2fc29f 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 @@ -37,7 +37,7 @@ public interface IMesWorkOrderService { * @param organizeCode * @return */ - List getUnReportMesProduceSn(String organizeCode); + public List getUnReportMesProduceSn(String organizeCode); List getPreDayReportMesProductionRecord(String organizeCode , List mesShiftList, String workCenterCode); @@ -46,4 +46,16 @@ public interface IMesWorkOrderService { public List insertMesWorkOrder(List mesProduceSns,List mesShiftList,String organizeCode, String userName ); void doPcnJobProductReport(List mesProduceSns,List mesShiftList,String organizeCode, String userName, MesWorkOrder mesWorkOrder); + + + void doProductReportByRecord(MesProductionRecord productionRecord, String organizeCode, String userName); + + void doProductHasOrderReportByRecord(MesProductionRecord productionRecord, String organizeCode, String userName); + + /** + * 获取未报工 + * @param organizeCode + * @return + */ + List getUnReportHasOrderMesProduceSn(String organizeCode); } 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 f048c98..a1f029b 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 @@ -23,7 +23,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author castle,暂时没有客供品移库 @@ -61,31 +63,49 @@ public class MesReportNoSortJob extends BaseMesScheduleJob { if (null == userName){ userName = "JOB"; } - List unReportMesProduceSn = workOrderService.getUnReportMesProduceSn(organizeCode); - for (MesProduceSn mesProduceSn : unReportMesProduceSn) { - try { - workOrderService.doProductReport(Arrays.asList(mesProduceSn), organizeCode, userName); - //1.获取生产加工记录production_record表中,report_status为待汇报状态的工单 - updateProductionRecord(organizeCode, userName, mesProduceSn); - } catch (ImppBusiException e) { - LOGGER.error("条码:{}报工失败", mesProduceSn.getProductSn(), e.getErrorDetail()); - updateProductionRecord(organizeCode, userName, mesProduceSn, e.getErrorDetail()); - continue; - } + // 处理无工单 + handlerNoOrder(organizeCode, userName); + // 处理有工单 + handlerHasOrder(organizeCode, userName); + // } + } + + private void handlerNoOrder(String organizeCode, String userName) { + List unReportMesProduceSn = workOrderService.getUnReportMesProduceSn(organizeCode); + try { + Map map = new HashMap<>(); + workOrderService.doProductReportByRecord(unReportMesProduceSn.get(0), organizeCode, userName); + + } catch (ImppBusiException e) { + LOGGER.error("条码:{}报工失败", unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail()); + updateProductionRecord(organizeCode, userName, unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail()); + } + } + + private void handlerHasOrder(String organizeCode, String userName) { + List unReportMesProduceSn = workOrderService.getUnReportHasOrderMesProduceSn(organizeCode); + try { + Map map = new HashMap<>(); + workOrderService.doProductHasOrderReportByRecord(unReportMesProduceSn.get(0), organizeCode, userName); + + } catch (ImppBusiException e) { + LOGGER.error("条码:{}报工失败", unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail()); + updateProductionRecord(organizeCode, userName, unReportMesProduceSn.get(0).getProductSn(), e.getErrorDetail()); } } - private void updateProductionRecord(String organizeCode, String userName, MesProduceSn mesProduceSn) { + + private void updateProductionRecord(String organizeCode, String userName, String sn) { DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(mesProduceSn.getProductSn(), "productSn", ddlPackBean); + DdlPreparedPack.getStringEqualPack(sn, "productSn", ddlPackBean); productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","reportStatus"}, new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_20.getValue() },ddlPackBean); } - private void updateProductionRecord(String organizeCode, String userName, MesProduceSn mesProduceSn, String errorMsg) { + private void updateProductionRecord(String organizeCode, String userName, String sn, String errorMsg) { DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(mesProduceSn.getProductSn(), "productSn", ddlPackBean); + DdlPreparedPack.getStringEqualPack(sn, "productSn", ddlPackBean); productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","reportStatus", "remark"}, new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue(), errorMsg },ddlPackBean); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesShiftServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesShiftServiceImpl.java index b8ea6e8..e557d1e 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesShiftServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesShiftServiceImpl.java @@ -43,4 +43,10 @@ public class MesShiftServiceImpl implements IMesShiftService { return new ListPager<>(resultList, pager); } + @Override + public List queryMesShift(String organizeCode, String workCenterCode) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", packBean); + return mesShiftRepository.findByHqlWhere(packBean); + } } 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 429ddcd..6f0f994 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 @@ -1,5 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService; +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesShiftService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; @@ -20,6 +22,9 @@ import cn.estsh.i3plus.pojo.mes.repository.*; import cn.estsh.i3plus.pojo.mes.repository.shipping.MesWorkOrderToWmsRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.format.DateParser; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; @@ -29,6 +34,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -78,6 +84,14 @@ public class MesWorkOrderService implements IMesWorkOrderService { private MesShiftRepository mesShiftRepository; @Autowired private IMesConfigService configService; + + @Autowired + private IMesPartService iMesPartService; + + @Autowired + private IMesShiftService mesShiftService; + + @Override public MesWorkOrder queryMesWorkOrder(MesWorkOrder workOrder) { @@ -430,9 +444,276 @@ public class MesWorkOrderService implements IMesWorkOrderService { } return mesProductVersion; } + + private void updateProductionRecord(String organizeCode, String userName, String sn) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + + DdlPreparedPack.getStringEqualPack(sn, "productSn", ddlPackBean); + productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","reportStatus"}, + new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_50.getValue()},ddlPackBean); + } + @Override + public void doProductReportByRecord(MesProductionRecord productionRecord, String organizeCode, String userName) { + //新增初始化 todo + // 根据 + //根据物料获取已发布的工单 + MesWorkOrder oldMesWorkOrder = getMesWorkOrder(productionRecord, organizeCode); + if (oldMesWorkOrder == null) { + updateProductionRecord(organizeCode, userName, productionRecord.getProductSn()); + } + + report(productionRecord, organizeCode, userName, oldMesWorkOrder); + + } + @Override + public void doProductHasOrderReportByRecord(MesProductionRecord productionRecord, String organizeCode, String userName) { + //新增初始化 todo + // 根据 + //根据物料获取已发布的工单 + List oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode, null); + if (CollectionUtils.isEmpty(oldMesWorkOrders)) { + updateProductionRecord(organizeCode, userName, productionRecord.getProductSn()); + } + report(productionRecord, organizeCode, userName, oldMesWorkOrders.get(0)); + + } + private void report(MesProductionRecord productionRecord, String organizeCode, String userName, MesWorkOrder oldMesWorkOrder) { + DdlPackBean ddlPackBean; + //查询工作中心 + ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(oldMesWorkOrder.getWorkCenterCode(), "workCenterCode", ddlPackBean); + MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean); + if (Objects.isNull(mesWorkCenter)) { + throw new ImppBusiException(String.format("产线【%s】不存在", oldMesWorkOrder.getWorkCenterCode())); + } + //获取生产版本 + ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(productionRecord.getPartNo(), "partNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(mesWorkCenter.getErpWorkCenter(), "workCenterCode", ddlPackBean); + DdlPreparedPack.getStringEqualPack(oldMesWorkOrder.getProductVersion(), "productVersion", ddlPackBean); + MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean); + if (null == mesProductVersion) { + throw new ImppBusiException(String.format("物料【%s】生产版本信息不存在", productionRecord.getPartNo())); + } + //物料+生产版本获取bom信息 + ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(productionRecord.getPartNo(), "partNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(mesProductVersion.getAlternativePartList(), "bomVersion", ddlPackBean); + List mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean); + if (CollectionUtils.isEmpty(mesBoms)) { + throw new ImppBusiException(String.format("物料【%s】生产版本【%s】对应bom信息不存在", + productionRecord.getPartNo(), mesProductVersion.getProductVersion())); + } + oldMesWorkOrder.setNum(oldMesWorkOrder.getNum() == null ? 1 : oldMesWorkOrder.getNum() + 1); + oldMesWorkOrder.setReportedQty(MathOperation.add(oldMesWorkOrder.getNum(), oldMesWorkOrder.getReportedQty())); + //更新SAP计划完成数量 + saveMesProductPlan(oldMesWorkOrder, false, true); + + //更新工单状态 + double unCompleteQty = MathOperation.sub(oldMesWorkOrder.getQty(), oldMesWorkOrder.getReportedQty()); + oldMesWorkOrder.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0); + if (oldMesWorkOrder.getReportedQty() > oldMesWorkOrder.getQty()) { + throw new ImppBusiException(String.format("工单报工数量【%s】大于工单数量【%s】,不允许报工", + oldMesWorkOrder.getReportedQty(), oldMesWorkOrder.getQty())); + } else if (Objects.equals(oldMesWorkOrder.getReportedQty(), oldMesWorkOrder.getQty())) { + oldMesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); + } else { + oldMesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()); + } + ConvertBean.serviceModelUpdate(oldMesWorkOrder, userName); + workOrderRepository.saveAndFlush(oldMesWorkOrder); + //保存数据 + List mesProductOffLineList = new ArrayList<>(); + MesProductOffLine newMesProductOffLine; + + for (MesBom mesBom : mesBoms) { + 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.getProductSn()); + newMesProductOffLine.setUnit(mesBom.getUnit()); + newMesProductOffLine.setItemUnit(mesBom.getItemUnit()); + newMesProductOffLine.setWorkOrderNo(oldMesWorkOrder.getWorkOrderNo()); + newMesProductOffLine.setWorkCenterCode(oldMesWorkOrder.getWorkCenterCode()); + newMesProductOffLine.setWorkCellCode(oldMesWorkOrder.getWorkCellCode()); + newMesProductOffLine.setReportType(oldMesWorkOrder.getReportType()); + newMesProductOffLine.setSapWorkCenter(oldMesWorkOrder.getErpWorkCenter()); + newMesProductOffLine.setOrganizeCode(oldMesWorkOrder.getOrganizeCode()); + + ConvertBean.serviceModelInitialize(newMesProductOffLine, userName); + mesProductOffLineList.add(newMesProductOffLine); + } + + mesProductOffLineRDao.saveAll(mesProductOffLineList); + // 同步工单信息给加工记录、条码信息 + DdlPackBean snDdlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getStringEqualPack(productionRecord.getProductSn(), "productSn", snDdlPackBean); + DdlPreparedPack.getStringEqualPack(organizeCode, "organizeCode", snDdlPackBean); + + mesProduceSnRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","workOrderNo"}, + new Object[]{userName, TimeTool.getNowTime(true), oldMesWorkOrder.getWorkOrderNo()},snDdlPackBean); + + productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","workOrderNo", "reportStatus"}, + new Object[]{userName, TimeTool.getNowTime(true), oldMesWorkOrder.getWorkOrderNo(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_20.getValue()},snDdlPackBean); + } + + /** + * 获取对应的工单 + * @param productionRecord + * @param organizeCode + * @return + */ + private MesWorkOrder getMesWorkOrder(MesProductionRecord productionRecord, String organizeCode) { + MesWorkOrder mesWorkOrder = new MesWorkOrder(); + /** + * 根据产线物料获取所有工单 + */ + List oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode, null); + // 获取当前班次 + String shiftCode = productionRecord.getShiftCode(); + String workCenterCode = productionRecord.getWorkCenterCode(); + + List shiftList = mesShiftService.queryMesShift(organizeCode, workCenterCode); + // 如果当前班次是早班 + if (CollectionUtils.isEmpty(shiftList)) { + MesPcnException.throwFlowException(String.format("班次信息未维护,产线=%s"), workCenterCode); + } + List shifts = shiftList.stream().filter(mesShift -> Objects.equals(mesShift.getWorkCenterCode(), workCenterCode)).collect(Collectors.toList()); + + MesShift currentShift = shifts.stream().filter(mesShift -> Objects.equals(mesShift.getShiftCode(), shiftCode)).findFirst().orElse(null); + + String beginTime =productionRecord.getLotNo() + " " + currentShift.getStartTime(); + Date beginDate = transfer(beginTime); + + /*MesWorkOrder found = null; + for (MesWorkOrder oldMesWorkOrder : oldMesWorkOrders) { + if (beginDate.getTime() >= transfer(oldMesWorkOrder.getPlanStartTime()).getTime() && beginDate.getTime() < transfer(oldMesWorkOrder.getPlanEndTime()).getTime()) { + found = oldMesWorkOrder; + break; + } + }*/ + + mesWorkOrder = oldMesWorkOrders.stream().filter(workOrder -> beginDate.getTime() >= transfer(workOrder.getPlanStartTime()).getTime() && beginDate.getTime() <= transfer(workOrder.getPlanEndTime()).getTime()).findFirst().orElse(null); + + String date = productionRecord.getLotNo(); + // 如果找不到需要找 当天的其它班次 + if (mesWorkOrder == null) { + // 如果开始时间大于结束时间,说明跨天了,跨天说明是晚班,需要找, 如果是晚班, 则找早中班的工单 + 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 { + date = getDate(productionRecord.getLotNo(), 0); + } + String endTime = date + " " +currentShift.getStartTime(); + String startTime = date + " " +currentShift.getEndTime(); + + mesWorkOrder = oldMesWorkOrders.stream().filter(workOrder -> transfer(startTime).getTime() > transfer(workOrder.getPlanStartTime()).getTime() && transfer(endTime).getTime() < transfer(workOrder.getPlanEndTime()).getTime()).findFirst().orElse(null); + + } else { + // 早班或者中班 则找当天非当前班次的最早单号 + String startTime = date + " " +currentShift.getEndTime(); + String endTime = getDate(date, 2) + " " +currentShift.getStartTime(); + for (MesWorkOrder workOrder : oldMesWorkOrders) { + if (transfer(startTime).getTime() >= transfer(workOrder.getPlanStartTime()).getTime() && transfer(endTime).getTime() <= transfer(workOrder.getPlanEndTime()).getTime()) { + break; + } + } + mesWorkOrder = oldMesWorkOrders.stream().filter(workOrder -> transfer(startTime).getTime() >= transfer(workOrder.getPlanStartTime()).getTime() && transfer(endTime).getTime() <= transfer(workOrder.getPlanEndTime()).getTime()).findFirst().orElse(null); + } + if (mesWorkOrder == null) { + // todo 需要记录并且第二天要用job跑 + return null; + } + } + return mesWorkOrder; + } + + private List getMesWorkOrders(MesProductionRecord productionRecord, String organizeCode, String workOrderNo) { + List list = Stream.of(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue(), MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()).collect(Collectors.toList()); + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(productionRecord.getPartNo(), "partNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(productionRecord.getWorkCenterCode(), "workCenterCode", ddlPackBean); + if (!StringUtils.isEmpty(workOrderNo)) { + DdlPreparedPack.getStringEqualPack(workOrderNo, "workOrderNo", ddlPackBean); + } + DdlPreparedPack.getInPackList(list, "workOrderStatus", ddlPackBean); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean); + // 新增班次逻辑 + //DdlPreparedPack. + List oldMesWorkOrders = workOrderRepository.findByHqlWhere(ddlPackBean); + if(CollectionUtils.isEmpty(oldMesWorkOrders)){ + throw new ImppBusiException(String.format("物料【%s】状态已发布的工单信息不存在", productionRecord.getPartNo())); + } + return oldMesWorkOrders; + } + + /** + * flag = 1 减少 1天, = 2 加一天 + * @param lotNo + * @param flag + * @return + */ + public String getDate(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); + } + + private MesProductVersion getMesProductVersion(MesWorkOrder item, MesWorkCenter mesWorkCenter) { + DdlPackBean ddlPackBean; + ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(item.getPartNo(), "partNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(mesWorkCenter.getErpWorkCenter(), "workCenterCode", ddlPackBean); + ddlPackBean.setOrderByStr(" order by createDatetime desc "); + MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean); + if (Objects.isNull(mesProductVersion)) { + MesPcnException.throwMesBusiException("物料【%s】工作中心【%s】对应的生产版本信息不存在", item.getPartNo(), + mesWorkCenter.getErpWorkCenter()); + } + return mesProductVersion; + } + @Override + public List getUnReportMesProduceSn(String organizeCode) { + //1.获取生产加工记录production_record表中,report_status为待汇报状态的工单 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + List statusList = Stream.of(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue()).collect(Collectors.toList()); + DdlPreparedPack.getInPackList( statusList,"reportStatus",ddlPackBean); + DdlPreparedPack.getIsNull("workOrderNo",ddlPackBean); + //DdlPreparedPack.getStringEqualPack("B19CK01A", "workCenterCode",ddlPackBean); + + + + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean); + List mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 1); + + return mesProductionRecordList; + } + @Override - public List getUnReportMesProduceSn(String organizeCode) { - List mesProduceSnList = new ArrayList<>(); + public List getUnReportHasOrderMesProduceSn(String organizeCode) { //1.获取生产加工记录production_record表中,report_status为待汇报状态的工单 DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); List statusList = Stream.of(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_40.getValue()).collect(Collectors.toList()); @@ -440,17 +721,12 @@ public class MesWorkOrderService implements IMesWorkOrderService { DdlPreparedPack.getIsNotNull("workOrderNo",ddlPackBean); DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean); - List mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 5); - if (mesProductionRecordList.isEmpty()){ - return mesProduceSnList; - } - //2.根据工单查询工单下的mesProduceSn - List workOrderNoList = mesProductionRecordList.stream().map(MesProductionRecord::getWorkOrderNo).collect(Collectors.toList()); - //工单号 - DdlPackBean snPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getInPackList(workOrderNoList,"workOrderNo",snPackBean); - return mesProduceSnRao.findByHqlWhere(snPackBean); + List mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 1); + + return mesProductionRecordList; } + + @Override public List getPreDayReportMesProductionRecord(String organizeCode,List mesShiftList, String workCenterCode ) { @@ -663,4 +939,8 @@ public class MesWorkOrderService implements IMesWorkOrderService { } return mesProductVersion; } + + private Date transfer(String dateStr){ + return DateUtil.parse(dateStr, (DateParser) DatePattern.NORM_DATETIME_FORMAT); + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSaveProcessResultStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSaveProcessResultStepService.java index ec76025..27fbbff 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSaveProcessResultStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSaveProcessResultStepService.java @@ -77,7 +77,7 @@ public class MesSaveProcessResultStepService extends BaseStepService { /** * 加工异常处理工步 */ - // mesProductResultErrorHandleStepService.execute(reqBean); + mesProductResultErrorHandleStepService.execute(reqBean); /** * 报工 */ diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java index 921b448..821c690 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java @@ -150,8 +150,8 @@ public class MesProductionCustomContextStepService extends BaseStepService imple StationKvBean shiftGroupKvBean = stationKvBeans.stream().filter(stationKvBean -> Objects.equal(stationKvBean.getKey(), "shiftGroup")).findFirst().orElse(null); StationKvBean shiftCodeKvBean = stationKvBeans.stream().filter(stationKvBean -> Objects.equal(stationKvBean.getKey(), "shiftCode")).findFirst().orElse(null); - mesProdShiftContext.setShiftCode(shiftGroupKvBean == null ? null : shiftGroupKvBean.getValue()); - mesProdShiftContext.setShiftGroup(shiftCodeKvBean == null ? null : shiftCodeKvBean.getValue()); + mesProdShiftContext.setShiftCode(shiftGroupKvBean == null ? null : shiftCodeKvBean.getValue()); + mesProdShiftContext.setShiftGroup(shiftCodeKvBean == null ? null : shiftGroupKvBean.getValue()); return mesProdShiftContext; } diff --git a/pom.xml b/pom.xml index ed126c0..4a5588f 100644 --- a/pom.xml +++ b/pom.xml @@ -29,9 +29,9 @@ INFO true UTF-8 - + 1.0.0.4-patch - 1.0.1-YZ + 1.0.0-yfai 1.0.0.1-patch 1.0.0-yfai From fd95b3e0332e92ed47632fad334d7aa5fac4341b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=AE=E7=AC=91=E7=9D=80=E9=9D=A2=E5=AF=B9=E6=98=8E?= =?UTF-8?q?=E5=A4=A9?= <752558143@qq.com> Date: Wed, 26 Jun 2024 18:20:44 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=B1=95=E7=A4=BA=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4a5588f..9e0fe1b 100644 --- a/pom.xml +++ b/pom.xml @@ -29,9 +29,11 @@ INFO true UTF-8 + - + 1.0.1-YZ 1.0.0-yfai 1.0.0.1-patch 1.0.0-yfai