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 9b87f7c..e1d5ef6 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 @@ -58,4 +58,7 @@ public interface IMesWorkOrderService { * @return */ List getUnReportHasOrderMesProduceSn(String organizeCode); + + @ApiOperation(value = "生产报工") + void doProductReport(MesWorkOrder mesWorkOrder); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesWorkOrderController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesWorkOrderController.java index 7422395..03ff6a0 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesWorkOrderController.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesWorkOrderController.java @@ -67,9 +67,9 @@ public class MesWorkOrderController { @PostMapping(value = "/doProductReport") @ApiOperation(value = "生产报工") - public ResultBean doProductReport(@RequestBody List mesProduceSnList) { + public ResultBean doProductReport(MesWorkOrder mesWorkOrder) { try { - //workOrderService.doProductReport(mesProduceSnList); + workOrderService.doProductReport(mesWorkOrder); return ResultBean.success("操作成功") .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException e) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesSortShippingCheckService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesSortShippingCheckService.java index b034a4a..66c1b60 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesSortShippingCheckService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesSortShippingCheckService.java @@ -218,7 +218,7 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService for (MesShippingOrderManagementDetail detail : model.getDetailList()) { if (detail.getPartNo().equals(produceSn.getPartNo()) && StringUtils.isEmpty(detail.getBarcode())) { //校验发运单明细顺序 - if(CommonEnumUtil.VALID == shippingGroup.getIsEnableShippingFailSafe()){ + if(!StringUtils.isEmpty(shippingGroup.getIsEnableShippingFailSafe()) && CommonEnumUtil.VALID == shippingGroup.getIsEnableShippingFailSafe()){ Optional first = model.getDetailList().stream().filter(k -> k.getCustInfoSeq().compareTo(detail.getCustInfoSeq()) < 0 && !Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).findFirst(); if(first.isPresent()){ throw new ImppBusiException(String.format("发运单【%s】启用明细顺序防错,序号【%s】前还有未扫描的发运单明细,请检查数据!", orderManagement.getShippingCode(), detail.getCustInfoSeq())); @@ -226,7 +226,7 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService } //判断是否需要排序校验 默认排序则需要校验 - if (orderManagement.getScanSeqWay() == MesExtEnumUtil.SHIPPING_GROUP_SCAN_CONFIRM_SEQ_MODE.DEFAULT_SORT.getValue()) { + if (!StringUtils.isEmpty(orderManagement.getScanSeqWay()) && orderManagement.getScanSeqWay() == MesExtEnumUtil.SHIPPING_GROUP_SCAN_CONFIRM_SEQ_MODE.DEFAULT_SORT.getValue()) { //获取明细中最小的 Optional minPartNO = model.getDetailList().stream().filter(k -> StringUtils.isEmpty(k.getBarcode())) .min(Comparator.comparingLong(k -> k.getCustInfoSeq())).map(k -> k.getPartNo()); @@ -243,11 +243,11 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService detail.setIsScanFlg(MesCommonConstant.TRUE_INTEGER); //根据是否启动记忆判断 若启用记忆,则根据保存数据库 - if (orderManagement.getIsEnableMemory() == MesCommonConstant.TRUE_INTEGER) { + if (!StringUtils.isEmpty(orderManagement.getIsEnableMemory()) && orderManagement.getIsEnableMemory() == MesCommonConstant.TRUE_INTEGER) { //若发运单状态为创建或发布 则写入开始扫描时间 - if (orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.CREATE.getValue() || - orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue()) { + if (!StringUtils.isEmpty(orderManagement.getStatus()) && (orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.CREATE.getValue() || + orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue())) { orderManagement.setStartScanTime(TimeTool.getNowTime(true)); } 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 27c08f1..d9094dd 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 @@ -7,6 +7,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionRecordService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderExtService; 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; @@ -921,6 +922,66 @@ public class MesWorkOrderService implements IMesWorkOrderService { return mesProduceSnRao.findByHqlWhere(snPackBean); } + @Override + public void doProductReport(MesWorkOrder mesWorkOrder) { + MesWorkOrder mesWorkOrderDb = mesWorkOrderRDao.getById(mesWorkOrder.getId()); + if (Objects.isNull(mesWorkOrderDb)) { + MesPcnException.throwMesBusiException("工单id为【%s】工单信息不存在", mesWorkOrder.getId()); + } + //查询物料信息 + MesPart mesPart = iMesPartService.getMesPartByPartNo(mesWorkOrderDb.getPartNo(), mesWorkOrderDb.getOrganizeCode()); + //查询产线信息 + 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()); + mesWorkOrderDb.setReportedQty(MathOperation.add(mesWorkOrder.getNum(), mesWorkOrderDb.getReportedQty())); + //更新工单状态 + double unCompleteQty = MathOperation.sub(mesWorkOrderDb.getQty(), mesWorkOrderDb.getReportedQty()); + mesWorkOrderDb.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0); + if (mesWorkOrderDb.getReportedQty() > mesWorkOrderDb.getQty()) { + //查询产线信息 + DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkCenterCode(), "workCenterCode", packBean); + MesWorkCenter workCenter = mesWorkCenterRDao.getByProperty(packBean); + // 以下则是超工单逻辑 + // 如果产线中没有配置超工单,则直接阻断 + if (!Objects.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workCenter.getIsCheckOrderQty())) { + MesPcnException.throwMesBusiException("请检查工单数量,工单号[%s],工单数量[%s]报工数量[%s],且未配置超工单!", mesWorkOrder.getWorkOrderNo(), mesWorkOrder.getQty(), mesWorkOrder.getReportedQty()); + } + // 如果配置了超工单,且比例已经超过了配置的超工单比例,也需要阻断 + double rate = MathOperation.div((mesWorkOrderDb.getReportedQty() - mesWorkOrderDb.getQty()),mesWorkOrderDb.getQty()); + if (rate > MathOperation.div(workCenter.getOrderRate(),100)) { + MesPcnException.throwMesBusiException("请检查工单数量,工单号[%s],工单数量[%s]报工数量[%s],配置了超工单,但超过了比例[%s]!", mesWorkOrder.getWorkOrderNo(), mesWorkOrder.getQty(), mesWorkOrder.getReportedQty(), workCenter.getOrderRate()); + } + mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); + } else if (Objects.equals(mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty())) { + mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); + } else { + mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()); + } + mesWorkOrderDb.setCompleteQty(mesWorkOrderDb.getReportedQty()); + mesWorkOrderDb.setRemark(mesWorkOrder.getRemark()); + //更新工单 + updateMesWorkOrder(mesWorkOrderDb,); + //试制单不报工 + if(Objects.isNull(mesWorkOrderDb.getOrderFlag()) || !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(mesWorkOrderDb.getOrderFlag())){ + String sn = getOrderNo(mesWorkOrder); + //保存数据 + List mesProductOffLineList = new ArrayList<>(); + for (MesBom mesBom : mesBoms) { + mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom)); + } + mesProductOffLineRDao.saveAll(mesProductOffLineList); + } + } + private void saveMesProductPlan(MesWorkOrder bean, boolean isInsert, boolean isReport) { if (StringUtil.isEmpty(bean.getPlanOrderNo())) { DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(bean.getOrganizeCode()); @@ -1116,4 +1177,39 @@ public class MesWorkOrderService implements IMesWorkOrderService { private Date transfer(String dateStr){ return DateUtil.parse(dateStr, (DateParser) DatePattern.NORM_DATETIME_FORMAT); } + + private String getOrderNo(MesWorkOrder mesWorkOrder) { + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.REPORT_SN); + List resultList = syncFuncService.syncSerialNo(genSerialNoModel.organizeCode(mesWorkOrder.getOrganizeCode()), mesWorkOrder.getCreateUser(), mesWorkOrder.getOrganizeCode(), 1).getResultList(); + return resultList.iterator().next(); + } + + private MesProductOffLine creatMesProductOffLine(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, + String sn, MesBom mesBom) { + MesProductOffLine newMesProductOffLine; + newMesProductOffLine = new MesProductOffLine(); + newMesProductOffLine.setReportPartNo(mesWorkOrder.getPartNo()); + newMesProductOffLine.setReportPartNameRdd(mesWorkOrder.getPartName()); + newMesProductOffLine.setReportSn(sn); + newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo()); + newMesProductOffLine.setItemPartName(mesBom.getItemPartName()); + newMesProductOffLine.setItemQty(MathOperation.mul(mesWorkOrder.getNum(), mesBom.getItemQty())); + newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint()); + newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint()); + newMesProductOffLine.setQty(Double.valueOf(mesWorkOrder.getNum())); + newMesProductOffLine.setBomVersion(mesWorkOrder.getProductVersion()); + newMesProductOffLine.setSerialNumber(sn); + newMesProductOffLine.setUnit(mesBom.getUnit()); + newMesProductOffLine.setItemUnit(mesBom.getItemUnit()); + newMesProductOffLine.setWorkOrderNo(mesWorkOrder.getWorkOrderNo()); + newMesProductOffLine.setWorkCenterCode(mesWorkOrder.getWorkCenterCode()); + newMesProductOffLine.setWorkCellCode(mesWorkOrder.getWorkCellCode()); + newMesProductOffLine.setReportType(mesWorkOrder.getReportType()); + newMesProductOffLine.setSapWorkCenter(mesWorkOrder.getErpWorkCenter()); + newMesProductOffLine.setOrganizeCode(mesWorkOrder.getOrganizeCode()); + + ConvertBean.serviceModelInitialize(newMesProductOffLine, mesWorkOrder.getCreateUser()); + return newMesProductOffLine; + } + } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/constant/MesCommonConstant.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/constant/MesCommonConstant.java index be6b998..23b074f 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/constant/MesCommonConstant.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/constant/MesCommonConstant.java @@ -29,5 +29,8 @@ public class MesCommonConstant { //装箱防错密码 public static final String BOXING_ERROR_PROOFING_PWD = "BOXING_ERROR_PROOFING_PWD"; + //报工条码规则 + public static final String REPORT_SN = "REPORT_SN"; + }