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 e02aca7..88480c1 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 @@ -4,6 +4,7 @@ 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.apiservice.schedulejob.MesReportNoSortJob; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob.MesReportWorkByPreDayJob; 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; @@ -36,6 +37,8 @@ public class TestController { @Autowired private MesReportNoSortJob mesReportNoSortJob; + @Autowired + private MesReportWorkByPreDayJob mesReportWorkByPreDayJob; @Autowired private IMesWorkOrderService workOrderService; @@ -109,4 +112,11 @@ public class TestController { mesReportNoSortJob.executeMesJob(null, null); } + + @GetMapping("/reportOrder1") + @ApiOperation(value = "报工") + public void reportOrder1() { + mesReportWorkByPreDayJob.executeMesJob(null, null); + + } } 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 a1f029b..760bdbd 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 @@ -17,6 +17,7 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; import org.springframework.beans.factory.annotation.Autowired; @@ -72,6 +73,10 @@ public class MesReportNoSortJob extends BaseMesScheduleJob { private void handlerNoOrder(String organizeCode, String userName) { List unReportMesProduceSn = workOrderService.getUnReportMesProduceSn(organizeCode); + if (CollectionUtils.isEmpty(unReportMesProduceSn)) { + LOGGER.error("没有加工记录,无需处理"); + return; + } try { Map map = new HashMap<>(); workOrderService.doProductReportByRecord(unReportMesProduceSn.get(0), organizeCode, userName); @@ -84,6 +89,10 @@ public class MesReportNoSortJob extends BaseMesScheduleJob { private void handlerHasOrder(String organizeCode, String userName) { List unReportMesProduceSn = workOrderService.getUnReportHasOrderMesProduceSn(organizeCode); + if (CollectionUtils.isEmpty(unReportMesProduceSn)) { + LOGGER.error("没有加工记录,无需处理"); + return; + } try { Map map = new HashMap<>(); workOrderService.doProductHasOrderReportByRecord(unReportMesProduceSn.get(0), organizeCode, userName); 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 1135893..c708c2e 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 @@ -57,7 +57,7 @@ public class MesReportWorkByPreDayJob extends BaseMesScheduleJob { public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) { String jobParam = this.getJobParam(); JSONObject jsonObject = JSONUtil.parseObj(jobParam); - String organizeCode = jsonObject.getStr("organizeCode"); + String organizeCode = jsonObject.getStr("organizeCode") == null ? "CK01" : jsonObject.getStr("organizeCode"); String userName = "REPORT_PRE_DAY_JOB"; if (null == organizeCode) { log.error("请添加需要报工的工厂代码!"); @@ -87,6 +87,7 @@ public class MesReportWorkByPreDayJob extends BaseMesScheduleJob { List mesWorkOrders = workOrderService.insertMesWorkOrder(unReportMesProduceSn, mesShiftList, organizeCode, userName); if (CollectionUtils.isEmpty(mesWorkOrders)) { continue; + } LOGGER.info("产线:{}报工mesWorkOrders:{}", workCenterCode, mesWorkOrders); //4.根据产线+物料产生的工单报工 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 04b0841..ae83ec3 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 @@ -449,7 +449,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { private void updateProductionRecord(String organizeCode, String userName, String sn) { DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(sn, "productSn", ddlPackBean); + DdlPreparedPack.getStringEqualPack(sn, "custSn", ddlPackBean); productionRecordRao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","reportStatus"}, new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_50.getValue()},ddlPackBean); } @@ -461,6 +461,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { MesWorkOrder oldMesWorkOrder = getMesWorkOrder(productionRecord, organizeCode); if (oldMesWorkOrder == null) { updateProductionRecord(organizeCode, userName, productionRecord.getProductSn()); + return; } report(productionRecord, organizeCode, userName, oldMesWorkOrder); @@ -578,6 +579,9 @@ public class MesWorkOrderService implements IMesWorkOrderService { * 根据产线物料获取所有工单 */ List oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode, null); + if (CollectionUtils.isEmpty(oldMesWorkOrders)) { + return null; + } // 获取当前班次 String shiftCode = productionRecord.getShiftCode(); String workCenterCode = productionRecord.getWorkCenterCode(); @@ -653,9 +657,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { // 新增班次逻辑 //DdlPreparedPack. List oldMesWorkOrders = workOrderRepository.findByHqlWhere(ddlPackBean); - if(CollectionUtils.isEmpty(oldMesWorkOrders)){ - throw new ImppBusiException(String.format("物料【%s】状态已发布的工单信息不存在", productionRecord.getPartNo())); - } + return oldMesWorkOrders; } @@ -703,9 +705,10 @@ public class MesWorkOrderService implements IMesWorkOrderService { 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); - + String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_REPORT_CENTER"); + List centerList = Arrays.asList(workCenterCodes.split(",")); + DdlPreparedPack.getInPackList(centerList, "workCenterCode",ddlPackBean); DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean); List mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 1); @@ -720,6 +723,10 @@ public class MesWorkOrderService implements IMesWorkOrderService { 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.getIsNotNull("workOrderNo",ddlPackBean); + String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_REPORT_CENTER"); + + List centerList = Arrays.asList(workCenterCodes.split(",")); + DdlPreparedPack.getInPackList(centerList, "workCenterCode",ddlPackBean); DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime"}, ddlPackBean); List mesProductionRecordList = productionRecordRao.findByHqlTopWhere(ddlPackBean, 1); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderSaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderSaveStepService.java index 2248c87..6d9b40f 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderSaveStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderSaveStepService.java @@ -11,7 +11,10 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; 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.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; @@ -25,8 +28,11 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import javax.persistence.EntityManager; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -52,6 +58,9 @@ public class MesWorkOrderSaveStepService extends BaseStepService { @Autowired private MesWorkOrderRepository workOrderRepository; + @Autowired + private EntityManager entityManager; + @Override public StepResult execute(StationRequestBean reqBean) { @@ -96,56 +105,100 @@ public class MesWorkOrderSaveStepService extends BaseStepService { //保存生产工单数据 private void doHandleWorkOrderData(StationRequestBean reqBean, StationResultBean resultBean, List productionPartContextList, List prodRuleContextList, List productionPsOutContextList, MesWorkCenter workCenter) { - //根据生产工单分组 - Map> ppMap = productionPartContextList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesProductionPartContext::getWorkOrderNo)); - - //根据生产工单分组 - Map> proMap = productionPsOutContextList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesProductionPsOutContext::getWorkOrderNo)); + //产出零件信息根据生产工单分组 + Map> ppMap = productionPartContextList.stream().filter(Objects::nonNull).collect(Collectors.groupingBy(MesProductionPartContext::getWorkOrderNo)); + //产出条码 根据生产工单分组 + Map> proMap = productionPsOutContextList.stream().filter(Objects::nonNull).collect(Collectors.groupingBy(MesProductionPsOutContext::getWorkOrderNo)); + //产品加工规则 根据foreignKey分组 Map prMap = prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toMap(MesProdRuleContext::getForeignKey, o -> o)); - + //遍历产出零件信息 for(Map.Entry> entry : ppMap.entrySet()) { if (null == entry) continue; - + //获取对应的加工规则 List produceSnContextList = proMap.get(entry.getKey()); - + //生产数量 Integer calcCompleteQty = 0; - Integer reportQty = 0; - + //遍历产出物料 for (MesProductionPsOutContext productionPsOutContext : produceSnContextList) { if (null == productionPsOutContext) continue; + //产出零件是否是 if (productionPsOutContext.getIsCalcCompleteQty() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) calcCompleteQty += 1; - if (prMap.get(productionPsOutContext.getForeignKey()).getReportType().compareTo(MesExtEnumUtil.NOSORT_REPORT_TYPE.NO_REPORT.getValue()) != 0) reportQty += 1; } - if (calcCompleteQty.compareTo(MesPcnExtConstWords.ZERO) == 0 && reportQty.compareTo(MesPcnExtConstWords.ZERO) == 0) continue; + if (calcCompleteQty.compareTo(MesPcnExtConstWords.ZERO) == 0 ) continue; MesWorkOrder workOrder = workOrderExtService.getWorkOrder(reqBean.getOrganizeCode(), entry.getValue().get(0).getId()); + entityManager.detach(workOrder); if (null == workOrder) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查工单信息,加工单[%s]信息不存在!", entry.getKey())); - + //工单状态分 排序工单 和非排序工单; 现在必须是非排序工单 if (!MesExtEnumUtil.ORDER_STATUS.checkAllowStatus(workCenter.getCenterType(), workOrder.getWorkOrderStatus())) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查工单信息,加工单[%s]信息工单状态[%s]!", entry.getKey(), MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrder.getWorkOrderStatus()))); - + //工单产线要和当前产线一致 if (!workOrder.getWorkCenterCode().equals(reqBean.getWorkCenterCode())) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查工单信息,加工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", entry.getKey(), workOrder.getWorkCenterCode(), reqBean.getWorkCenterCode())); - if (calcCompleteQty.compareTo(MesPcnExtConstWords.ZERO) > 0) workOrder.setCompleteQty(MathOperation.add(workOrder.getCompleteQty(), calcCompleteQty)); + List propertyNameList = new ArrayList<>(); + List propertyValueList = new ArrayList<>(); + //修改完成数量 + if (calcCompleteQty.compareTo(MesPcnExtConstWords.ZERO) > 0) { + workOrder.setCompleteQty(MathOperation.add(workOrder.getCompleteQty(), calcCompleteQty)); + propertyNameList.add("completeQty"); + propertyValueList.add(workOrder.getCompleteQty()); + } + //修改未完成数量 if (calcCompleteQty.compareTo(MesPcnExtConstWords.ZERO) > 0 && workOrder.getUnCompleteQty().compareTo(new Double(0)) > 0 && - MathOperation.compareTo(MathOperation.sub(workOrder.getUnCompleteQty(), new Double(calcCompleteQty)), new Double(0)) >= 0) workOrder.setUnCompleteQty(MathOperation.sub(workOrder.getUnCompleteQty(), new Double(calcCompleteQty))); - if (reportQty.compareTo(MesPcnExtConstWords.ZERO) > 0) workOrder.setReportedQty(MathOperation.add(workOrder.getReportedQty(), reportQty)); - - //TODO 可疑品数量 报废数量 上下线时间 - - if (MathOperation.compareTo(workOrder.getCompleteQty(), workOrder.getQty()) >= 0 && workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()) != 0) workOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); - - ConvertBean.serviceModelUpdate(workOrder, reqBean.getUserInfo()); + MathOperation.compareTo(MathOperation.sub(workOrder.getUnCompleteQty(), new Double(calcCompleteQty)), new Double(0)) >= 0) { + workOrder.setUnCompleteQty(MathOperation.sub(workOrder.getUnCompleteQty(), new Double(calcCompleteQty))); + propertyNameList.add("unCompleteQty"); + propertyValueList.add(workOrder.getUnCompleteQty()); + } - workOrderRepository.save(workOrder); + /** + * 可疑品、报废数量、上下线时间; + * sql改成修改固定字段 + * 在上下文中获取busi中获取prodResult上下文 是数字 (标志着条码质量状态,与条码质量状态枚举一致) + * 上下文中 已经按照工单分组了,因为有一模多腔问题 + */ + + String prodResult = productionDispatchContextStepService.getProductResultContext(reqBean); + if (StringUtils.isEmpty(prodResult)) { + //可疑品 + boolean isSuspicious = MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue() == Integer.parseInt(prodResult); + if (isSuspicious && !productionPsOutContextList.isEmpty()){ + int suspiciousQty = productionPsOutContextList.size(); + workOrder.setSuspiciousPartQty(MathOperation.sub(workOrder.getSuspiciousPartQty(), new Double(suspiciousQty))); + propertyNameList.add("suspiciousPartQty"); + propertyValueList.add(workOrder.getSuspiciousPartQty()); + } + //报废数量 + boolean isScrap = MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue() == Integer.parseInt(prodResult); + if (isScrap && !productionPsOutContextList.isEmpty()){ + int scrapQty = productionPsOutContextList.size(); + workOrder.setScrapPartQty(MathOperation.sub(workOrder.getScrapPartQty(), new Double(scrapQty))); + propertyNameList.add("scrapPartQty"); + propertyValueList.add(workOrder.getScrapPartQty()); + } + } + if (MathOperation.compareTo(workOrder.getCompleteQty(), workOrder.getQty()) >= 0 && workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()) != 0) { + workOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); + propertyNameList.add("workOrderStatus"); + propertyValueList.add(workOrder.getWorkOrderStatus()); + } + //如果数量都没有修改,不操作数据库 + if (!propertyNameList.isEmpty()) { + ConvertBean.serviceModelUpdate(workOrder, reqBean.getUserInfo()); + propertyNameList.add("modifyUser"); + propertyValueList.add(reqBean.getUserInfo()); + propertyNameList.add("modifyDatetime"); + propertyValueList.add(TimeTool.getNowTime(true)); + DdlPackBean workOrderPackBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); + DdlPreparedPack.getNumEqualPack(workOrder.getId(),"id",workOrderPackBean); + workOrderRepository.updateByProperties(propertyNameList.toArray(new String[]{}), propertyValueList.toArray(), workOrderPackBean); + } } - - } }