From 0eb778cfac90d6c3defdb18fef3619ad311c6ac2 Mon Sep 17 00:00:00 2001 From: jun Date: Mon, 27 May 2024 20:07:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=A5=E5=B7=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext/mes/pcn/api/busi/IMesWorkOrderService.java | 3 + .../controller/busi/MesWorkOrderController.java | 22 ++- .../serviceimpl/busi/MesWorkOrderService.java | 202 ++++++++++++++++++++- 3 files changed, 220 insertions(+), 7 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java index 5a9edc9..18265ed 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 @@ -2,6 +2,7 @@ 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.MesWorkOrder; import io.swagger.annotations.ApiOperation; @@ -26,5 +27,7 @@ public interface IMesWorkOrderService { @ApiOperation(value = "查询工单") public ListPager queryMesWorkOrderListByPager(MesWorkOrder workOrder, Pager pager); + void doProductReport(List mesProduceSnList); + } 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 c56c0fb..40bd1f8 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 @@ -3,6 +3,8 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService; import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant; import cn.estsh.i3plus.pojo.base.common.Pager; +import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; @@ -11,9 +13,9 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * @Description : @@ -58,4 +60,18 @@ public class MesWorkOrderController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + + @PostMapping(value = "/doProductReport") + @ApiOperation(value = "生产报工") + public ResultBean doProductReport(@RequestBody List mesProduceSnList) { + try { + workOrderService.doProductReport(mesProduceSnList); + return ResultBean.success("操作成功") + .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + } catch (ImppBusiException e) { + return ResultBean.fail(e).build(); + } catch (Exception e) { + return ResultBean.fail(e); + } + } } 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 9267db7..5143d22 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,20 +1,27 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.tool.MathOperation; 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.tool.DdlPreparedPack; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; -import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderRepository; +import cn.estsh.i3plus.pojo.base.util.StringUtil; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.repository.*; +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 lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** * @Description : @@ -30,7 +37,18 @@ public class MesWorkOrderService implements IMesWorkOrderService { @Autowired private MesWorkOrderRepository workOrderRepository; - + @Autowired + private MesProductVersionRepository mesProductVersionRDao; + @Autowired + private MesBomRepository mesBomRDao; + @Autowired + private MesWorkCenterRepository mesWorkCenterRDao; + @Autowired + private MesPartRepository mesPartRDao; + @Autowired + private MesProductPlanRepository mesProductPlanRDao; + @Autowired + private MesProductOffLineRepository mesProductOffLineRDao; @Override public MesWorkOrder queryMesWorkOrder(MesWorkOrder workOrder) { @@ -76,4 +94,180 @@ public class MesWorkOrderService implements IMesWorkOrderService { return packBean; } + + @Override + public void doProductReport(List mesProduceSnList) { + //新增初始化 + String organizeCode = AuthUtil.getOrganizeCode(); + String userName = AuthUtil.getSessionUser().getUserName(); + + Map> mesWorkOrderMap = mesProduceSnList.stream().collect(Collectors.groupingBy(MesProduceSn::getPartNo)); + Map mesPartMap = new HashMap<>(); + MesPart mesPart = null; + //查询工单状态 + Integer[] orderStatus =new Integer[]{MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue(),MesExtEnumUtil.ORDER_STATUS.process.getValue()}; + for (Map.Entry> mesProduceSn : mesWorkOrderMap.entrySet()) { + List mesWorkOrderList = mesProduceSn.getValue(); + //获取物料信息 + if(mesPartMap.containsKey(mesProduceSn.getKey())){ + mesPart = mesPartMap.get(mesProduceSn.getKey()); + }else{ + //查询物料信息 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(mesProduceSn.getKey(), "partNo", ddlPackBean); + mesPart = mesPartRDao.getByProperty(ddlPackBean); + if(Objects.isNull(mesPart)){ + throw new ImppBusiException(String.format("物料【%s】信息不存在", mesProduceSn.getKey())); + } + mesPartMap.put(mesProduceSn.getKey(),mesPart); + } + //根据物料获取已发布的工单 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(mesPart.getPartNo(), "partNo", ddlPackBean); + DdlPreparedPack.getInPackArray(orderStatus, "workOrderStatus", ddlPackBean); + MesWorkOrder oldMesWorkOrder = workOrderRepository.getByProperty(ddlPackBean); + if(Objects.isNull(oldMesWorkOrder)){ + throw new ImppBusiException(String.format("物料【%s】状态未已发布的工单信息不存在", mesPart.getPartNo())); + } + //查询工作中心 + 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(mesPart.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】生产版本信息不存在", mesPart.getPartNo())); + } + //物料+生产版本获取bom信息 + ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(mesPart.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信息不存在", + mesPart.getPartNo(), mesProductVersion.getProductVersion())); + } + oldMesWorkOrder.setNum(mesWorkOrderList.size()); + 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.update(oldMesWorkOrder); + //保存数据 + List mesProductOffLineList = new ArrayList<>(); + MesProductOffLine newMesProductOffLine; + for (MesProduceSn produceSn : mesWorkOrderList) { + for (MesBom mesBom : mesBoms) { + newMesProductOffLine = new MesProductOffLine(); + newMesProductOffLine.setReportPartNo(oldMesWorkOrder.getPartNo()); + newMesProductOffLine.setReportPartNameRdd(oldMesWorkOrder.getPartNameRdd()); + newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo()); + newMesProductOffLine.setItemPartNameRdd(mesBom.getItemPartName()); + newMesProductOffLine.setItemQty(mesBom.getItemQty()); + newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint()); + newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint()); + newMesProductOffLine.setQty(1d); + newMesProductOffLine.setReportSn(produceSn.getProductSn()); + newMesProductOffLine.setBomVersion(oldMesWorkOrder.getProductVersion()); + newMesProductOffLine.setSerialNumber(produceSn.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); + } + } + + private void saveMesProductPlan(MesWorkOrder bean, boolean isInsert, boolean isReport) { + if (StringUtil.isEmpty(bean.getPlanOrderNo())) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(bean.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(bean.getPartNo(), "planPartNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(bean.getPlanStartTime(), "planStartDate", ddlPackBean); + DdlPreparedPack.getStringEqualPack(bean.getPlanEndTime(), "planEndDate", ddlPackBean); + MesProductPlan mesProductPlan = mesProductPlanRDao.getByProperty(ddlPackBean); + if (null == mesProductPlan) { + MesProductPlan mesPlanOrder = new MesProductPlan(); + mesPlanOrder.setPlanOrderNo(""); + mesPlanOrder.setPlanQty(bean.getQty()); + mesPlanOrder.setPlanPartNo(bean.getPartNo()); + mesPlanOrder.setCompleteQty(0d); + mesPlanOrder.setUncompleteQty(bean.getQty()); + mesPlanOrder.setUnit(bean.getUnit()); + mesPlanOrder.setPlanStartDate(bean.getPlanStartTime()); + mesPlanOrder.setPlanEndDate(bean.getPlanEndTime()); + mesPlanOrder.setPartMappingWorkCenterCode(bean.getErpWorkCenter()); + mesPlanOrder.setPlanOrganizeCode(bean.getOrganizeCode()); + mesPlanOrder.setOrganizeCode(bean.getOrganizeCode()); + ConvertBean.serviceModelInitialize(mesPlanOrder, bean.getCreateUser()); + mesProductPlanRDao.insert(mesPlanOrder); + } else { + if (isInsert) { + mesProductPlan.setPlanQty(MathOperation.add(mesProductPlan.getPlanQty(), bean.getQty())); + } else { + //报工 + if (isReport) { + mesProductPlan.setCompleteQty(MathOperation.add(mesProductPlan.getCompleteQty(), bean.getNum())); + //报工调整 + } else { + mesProductPlan.setCompleteQty(MathOperation.sub(mesProductPlan.getCompleteQty(), bean.getNum())); + } + } + mesProductPlan.setUncompleteQty(MathOperation.sub(mesProductPlan.getPlanQty(), mesProductPlan.getCompleteQty())); + ConvertBean.serviceModelUpdate(mesProductPlan, bean.getCreateUser()); + mesProductPlanRDao.update(mesProductPlan); + } + } else { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(bean.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(bean.getPlanOrderNo(), "planOrderNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(bean.getPartNo(), "planPartNo", ddlPackBean); + MesProductPlan mesProductPlan = mesProductPlanRDao.getByProperty(ddlPackBean); + if (null == mesProductPlan) { + throw new ImppBusiException(String.format("SAP计划单号【%s】物料【%s】,不存在", bean.getPlanOrderNo(), bean.getPartNo())); + } + if (!isInsert) { + if (Objects.isNull(mesProductPlan.getCompleteQty())) { + mesProductPlan.setCompleteQty(0d); + } + //报工 + if (isReport) { + mesProductPlan.setCompleteQty(MathOperation.add(mesProductPlan.getCompleteQty(), bean.getNum())); + //报工调整 + } else { + mesProductPlan.setCompleteQty(MathOperation.sub(mesProductPlan.getCompleteQty(), bean.getNum())); + } + mesProductPlan.setUncompleteQty(MathOperation.sub(mesProductPlan.getPlanQty(), mesProductPlan.getCompleteQty())); + ConvertBean.serviceModelUpdate(mesProductPlan, bean.getCreateUser()); + mesProductPlanRDao.update(mesProductPlan); + } + } + } + }