From 6bd043ff5d8af20f4bac21f0461282515b635c55 Mon Sep 17 00:00:00 2001 From: jun Date: Thu, 13 Jun 2024 22:26:53 +0800 Subject: [PATCH] =?UTF-8?q?CBR=E5=86=B2=E9=94=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/i3plus-ext-mes-api/pom.xml | 4 + .../ext/mes/api/base/IMesWorkOrderService.java | 3 + .../controller/base/MesWorkOrderController.java | 19 ++ .../serviceimpl/base/MesWorkOrderService.java | 286 ++++++++++++++------- modules/i3plus-ext-mes-icloud/pom.xml | 4 + .../i3plus/ext/mes/icloud/sdk/IMesForWmsCloud.java | 34 +++ .../mes/icloud/sdkfallback/MesForWmsFactory.java | 35 +++ 7 files changed, 298 insertions(+), 87 deletions(-) create mode 100644 modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdk/IMesForWmsCloud.java create mode 100644 modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdkfallback/MesForWmsFactory.java diff --git a/modules/i3plus-ext-mes-api/pom.xml b/modules/i3plus-ext-mes-api/pom.xml index 9cecd56..f4d87d9 100644 --- a/modules/i3plus-ext-mes-api/pom.xml +++ b/modules/i3plus-ext-mes-api/pom.xml @@ -24,6 +24,10 @@ i3plus.ext.mes i3plus-ext-mes-pojo + + i3plus.pojo + i3plus-pojo-model + diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java index 3243b9f..f317351 100644 --- a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.ext.mes.api.base; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; +import cn.estsh.i3plus.pojo.model.wms.WmsProductModel; import java.util.List; @@ -20,4 +21,6 @@ public interface IMesWorkOrderService extends IBaseMesService { List sumMesWorkOrderQtyToSap(String organizeCode); List queryMesWorkOrderProcessToSap(String organizeCode); + + void doReportWorkReversal(WmsProductModel model); } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderController.java index 0db6a80..dbe5f46 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderController.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderController.java @@ -9,6 +9,7 @@ import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.estsh.i3plus.pojo.model.wms.WmsProductModel; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; @@ -124,6 +125,24 @@ public class MesWorkOrderController extends BaseMesController { } } + @PostMapping(value = "/report-work-reversal") + @ApiOperation(value = "反向冲销") + public ResultBean doReportWorkReversal(@RequestBody WmsProductModel model) { + try { + ValidatorBean.checkNotNull(model.getOrganizeCode(),"工厂代码不能为空"); + ValidatorBean.checkNotNull(model.getQty(),"数量不能为空"); + ValidatorBean.checkNotNull(model.getSn(),"条码不能为空"); + ValidatorBean.checkNotNull(model.getPartNo(),"零件号不能为空"); + ValidatorBean.checkNotNull(model.getPartNo(),"零件号不能为空"); + + mesWorkOrderService.doReportWorkReversal(model); + return ResultBean.success("反向冲销成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java index f056a09..6381bdf 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java @@ -10,7 +10,6 @@ import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; import cn.estsh.i3plus.platform.common.tool.MathOperation; import cn.estsh.i3plus.platform.common.tool.TimeTool; -import cn.estsh.i3plus.platform.common.util.MesConstWords; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; @@ -20,6 +19,7 @@ import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; import cn.estsh.i3plus.pojo.mes.repository.*; import cn.estsh.i3plus.pojo.mes.util.DateUtilExt; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.estsh.i3plus.pojo.model.wms.WmsProductModel; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; @@ -30,10 +30,9 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; import java.util.stream.Collectors; @Service @@ -77,6 +76,7 @@ public class MesWorkOrderService extends BaseMesService implements private IMesPartSapService mesPartSapService; @Autowired private MesMoveRepository mesMoveRDao; + @Override public MesWorkOrder insert(MesWorkOrder bean) { //插入前构造数据 @@ -341,7 +341,7 @@ public class MesWorkOrderService extends BaseMesService implements } //校验零件生产组信息 - if(StringUtil.isEmpty(item.getPartProdGroupCode())){ + if (StringUtil.isEmpty(item.getPartProdGroupCode())) { MesPartProdGroup mesPartProdGroup = getMesPartProdGroup(item); item.setPartProdGroupCode(mesPartProdGroup.getPartProdGroupCode()); item.setPartProdGroupName(mesPartProdGroup.getPartProdGroupName()); @@ -366,7 +366,7 @@ public class MesWorkOrderService extends BaseMesService implements if (StringUtil.isEmpty(item.getPlanStartTime()) || StringUtil.isEmpty(item.getPlanEndTime())) { packPlanTime(item); } - if(StringUtil.isEmpty(item.getCustPartNo())){ + if (StringUtil.isEmpty(item.getCustPartNo())) { getCustomerPart(item); } //校验物料生产版本是否存在 @@ -380,7 +380,7 @@ public class MesWorkOrderService extends BaseMesService implements MesProductVersion mesProductVersion = getMesProductVersion(item, mesWorkCenter); item.setProductVersion(mesProductVersion.getProductVersion()); } - if(StringUtil.isEmpty(item.getCustPartNo())){ + if (StringUtil.isEmpty(item.getCustPartNo())) { getCustomerPart(item); } //拼接 @@ -393,7 +393,7 @@ public class MesWorkOrderService extends BaseMesService implements item.setPartName(mesPart.getPartName()); item.setUnit(mesPart.getUnit()); //生产时间新增取当天 - if(StringUtil.isEmpty(item.getProduceTime())){ + if (StringUtil.isEmpty(item.getProduceTime())) { item.setProduceTime(TimeTool.getToday()); } @@ -405,9 +405,9 @@ public class MesWorkOrderService extends BaseMesService implements mesPartProdGroupDetail.setPartNo(item.getPartNo()); mesPartProdGroupDetail.setOrganizeCode(item.getOrganizeCode()); List mesPartProdGroupList = mesPartProdGroupService.findMesPartProdGroup(mesPartProdGroupDetail); - if(CollectionUtils.isEmpty(mesPartProdGroupList)){ + if (CollectionUtils.isEmpty(mesPartProdGroupList)) { MesException.throwMesBusiException("生产线代码【%s】零件号【%s】对应的零件生产组信息没有维护", - item.getWorkCenterCode(),item.getPartNo()); + item.getWorkCenterCode(), item.getPartNo()); } MesPartProdGroup mesPartProdGroup = mesPartProdGroupList.iterator().next(); return mesPartProdGroup; @@ -417,7 +417,7 @@ public class MesWorkOrderService extends BaseMesService implements DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode()); DdlPreparedPack.getStringEqualPack(item.getPartNo(), "erpPartNo", ddlPackBean); MesCustomerPart customerPart = mesCustomerPartRDao.getByProperty(ddlPackBean); - if(!Objects.isNull(customerPart)){ + if (!Objects.isNull(customerPart)) { item.setCustPartNo(customerPart.getCustPartNo()); item.setCustomerPartName(customerPart.getCustPartName()); } @@ -457,9 +457,9 @@ public class MesWorkOrderService extends BaseMesService implements if (DateUtilExt.compareDateTime(DateUtil.SHORT_FORMAT, item.getPlanDate(), TimeTool.getToday()) < 0) { MesException.throwMesBusiException("导入工单计划日期不能小于今天"); } - }catch (ImppBusiException busExcep) { + } catch (ImppBusiException busExcep) { MesException.throwMesBusiException(busExcep.getErrorDetail()); - }catch (Exception e) { + } catch (Exception e) { MesException.throwMesBusiException("计划日期格式异常"); } //查询班次信息 @@ -504,7 +504,7 @@ public class MesWorkOrderService extends BaseMesService implements //获取生产版本 MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrder); //物料+生产版本获取bom信息 - List mesBoms = getMesBoms(mesWorkOrder, mesPart, mesProductVersion); + List mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); //报工类型 if (MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrder.getReportType()) { mesWorkOrder.setReportedQty(MathOperation.add(mesWorkOrder.getNum(), mesWorkOrder.getReportedQty())); @@ -538,50 +538,93 @@ public class MesWorkOrderService extends BaseMesService implements //生成条码 List resultList = getStringList(mesWorkOrder); - //bom子零件是虚零件 继续拆他下面的零件 - recursionBomList(mesBoms); //保存数据 List mesProductOffLineList = new ArrayList<>(); for (String sn : resultList) { for (MesBom mesBom : mesBoms) { - mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom,false)); + mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false)); } } mesProductOffLineService.insertBatch(mesProductOffLineList); } - /** - * 递归查询bom - */ - private List recursionBomList(List bomList) { - if (!org.springframework.util.CollectionUtils.isEmpty(bomList)) { - for (MesBom bom : bomList) { -// if (bom.getItemPartNo().equals(bom.getPartNo())){ -// continue; -// } - if (!bom.getPartType().contains("V")){ - continue; - } - List resultList = mesBomRDao.findByProperty( - new String[]{MesConstWords.IS_VALID, MesConstWords.IS_DELETED, MesConstWords.ORGANIZE_CODE, "partNo"}, - new Object[]{CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), - bom.getOrganizeCode(), bom.getItemPartNo()}); - recursionBomList(resultList); -// bom.setChildTreeList(resultList); + + public List getBomList(String organizeCode, MesPart mesPart, String bomVersion) { + List bomData = new ArrayList<>(); + // 递归展开 BOM + expendBomChild(organizeCode, mesPart.getPartNo(), bomVersion, bomData); + + if (bomData.size() == 0) { + MesException.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()); } } - return bomList; + 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 = getMesBoms(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 = divide(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); + } + } + } + @Override public void doProductReportExt(MesWorkOrder mesWorkOrderNew) { MesWorkOrder mesWorkOrder = baseRDao.getById(mesWorkOrderNew.getId()); - if(Objects.isNull(mesWorkOrder)){ - MesException.throwMesBusiException("工单id为【%s】工单信息不存在",mesWorkOrderNew.getId()); + if (Objects.isNull(mesWorkOrder)) { + MesException.throwMesBusiException("工单id为【%s】工单信息不存在", mesWorkOrderNew.getId()); } //查询物料信息 MesPart mesPart = iMesPartService.getPartByPartNo(mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode()); - if(mesWorkOrderNew.getNum() <= 0){ + if (mesWorkOrderNew.getNum() <= 0) { MesException.throwMesBusiException("工单报工数量不能为0,不允许报工"); } //报工类型 @@ -612,7 +655,7 @@ public class MesWorkOrderService extends BaseMesService implements //获取生产版本 MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrder); //物料+生产版本获取bom信息 - List mesBoms = getMesBoms(mesWorkOrder, mesPart, mesProductVersion); + List mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); //生成条码 List resultList = getStringList(mesWorkOrderNew); //保存数据 @@ -621,67 +664,67 @@ public class MesWorkOrderService extends BaseMesService implements boolean isReport = false; boolean isMove = false; //排序工单 - if(MesExtEnumUtil.ORDER_TYPE.SORT.getValue() == mesWorkOrder.getWorkOrderType()){ + if (MesExtEnumUtil.ORDER_TYPE.SORT.getValue() == mesWorkOrder.getWorkOrderType()) { //报工类型 if (MesExtEnumUtil.REPORT_TYPE.WRITE_OFF.getValue() == mesWorkOrder.getReportType()) { - MesException.throwMesBusiException("工单【%s】为排序工单不允许冲销",mesWorkOrder.getWorkOrderNo()); + MesException.throwMesBusiException("工单【%s】为排序工单不允许冲销", mesWorkOrder.getWorkOrderNo()); } //排序加工规则 MesProdRuleSortCfg mesProdRuleSortCfg = getMesProdRuleSortCfg(mesWorkOrder); - if(MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue() == mesProdRuleSortCfg.getReportType()){ + if (MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue() == mesProdRuleSortCfg.getReportType()) { isReport = true; } else if (MesExtEnumUtil.MES_REPORT_TYPE.MOVE.getValue() == mesProdRuleSortCfg.getReportType()) { isMove = true; - }else if (MesExtEnumUtil.MES_REPORT_TYPE.REPORT_MOVE.getValue() == mesProdRuleSortCfg.getReportType()) { + } else if (MesExtEnumUtil.MES_REPORT_TYPE.REPORT_MOVE.getValue() == mesProdRuleSortCfg.getReportType()) { isReport = true; isMove = true; - }else if (MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() == mesProdRuleSortCfg.getReportType()) { + } else if (MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() == mesProdRuleSortCfg.getReportType()) { customerSupplyMove(mesWorkOrder, mesProductVersion, mesBoms, resultList, mesProductOffLineList, mesMoveList); - }else{ - log.info("工单{}排序加工规则报工类型未维护",mesWorkOrder.getWorkOrderNo()); + } else { + log.info("工单{}排序加工规则报工类型未维护", mesWorkOrder.getWorkOrderNo()); return; } - if(MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() != mesProdRuleSortCfg.getReportType()){ + if (MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() != mesProdRuleSortCfg.getReportType()) { //查询SAP物料信息 MesPartSap mesPartSap = mesPartSapService.getMesPartSapByPartNo(mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode()); for (String sn : resultList) { //成品汇报 - if(isReport){ + if (isReport) { for (MesBom mesBom : mesBoms) { - mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom,false)); + mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false)); } } //成品移库 - if(isMove){ - MesMove move = createMove(mesPartSap, mesProdRuleSortCfg.getSrcErpLocation(), mesProdRuleSortCfg.getDestErpLocation(), mesWorkOrder.getOrganizeCode(), 1d,sn,MesExtEnumUtil.MOVE_TYPE.FINISH_PRODUCTS_MOVE.getValue()); + if (isMove) { + MesMove move = createMove(mesPartSap, mesProdRuleSortCfg.getSrcErpLocation(), mesProdRuleSortCfg.getDestErpLocation(), mesWorkOrder.getOrganizeCode(), 1d, sn, MesExtEnumUtil.MOVE_TYPE.FINISH_PRODUCTS_MOVE.getValue()); move.setMatnr(mesWorkOrder.getPartNo()); mesMoveList.add(move); } } } } else if (MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue() == mesWorkOrder.getWorkOrderType()) { - MesProdRuleNosortCfg mesProdRuleNoSortCfg = mesProdRuleNosortCfgService.findMesProdRuleNosortCfgByWorkCenterCode(mesWorkOrder.getWorkCenterCode(),mesWorkOrder.getPartNo(),mesWorkOrder.getOrganizeCode()); - if( CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesProdRuleNoSortCfg.getReportType()){ + MesProdRuleNosortCfg mesProdRuleNoSortCfg = mesProdRuleNosortCfgService.findMesProdRuleNosortCfgByWorkCenterCode(mesWorkOrder.getWorkCenterCode(), mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode()); + if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesProdRuleNoSortCfg.getReportType()) { for (String sn : resultList) { for (MesBom mesBom : mesBoms) { - mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrderNew, mesProductVersion, sn, mesBom,false)); + mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrderNew, mesProductVersion, sn, mesBom, false)); } } } - }else { - log.info("工单{}排序规则不属于排序工单和非排序工单",mesWorkOrder.getWorkOrderNo()); + } else { + log.info("工单{}排序规则不属于排序工单和非排序工单", mesWorkOrder.getWorkOrderNo()); return; } //更新工单 update(mesWorkOrder); //保存报工记录 - if(CollectionUtils.isNotEmpty(mesProductOffLineList)){ + if (CollectionUtils.isNotEmpty(mesProductOffLineList)) { mesProductOffLineService.insertBatch(mesProductOffLineList); } //保存移库记录 - if(CollectionUtils.isNotEmpty(mesMoveList)){ + if (CollectionUtils.isNotEmpty(mesMoveList)) { mesMoveRDao.saveAll(mesMoveList); } } @@ -689,11 +732,64 @@ public class MesWorkOrderService extends BaseMesService implements @Override public void deleteUnSortOrder(String userName, String organizeCode) { DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); - 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); - baseRDao.updateByProperties(new String[]{"modifyUser", "modifyDatetime","workOrderStatus"}, - new Object[]{userName, TimeTool.getNowTime(true),MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()},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); + baseRDao.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "workOrderStatus"}, + new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()}, ddlPackBean); + } + + + @Override + public void doReportWorkReversal(WmsProductModel model) { + //查询物料信息 + MesPart mesPart = iMesPartService.getPartByPartNo(model.getPartNo(), model.getOrganizeCode()); + //获取生产版本 + MesProductVersion mesProductVersion = getMesProductVersion(model); + //获取bom + List mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); + //保存数据 + List mesProductOffLineList = new ArrayList<>(); + for (MesBom mesBom : mesBoms) { + mesProductOffLineList.add(getMesProductOffLine(model, mesPart, mesProductVersion, mesBom)); + } + mesProductOffLineService.insertBatch(mesProductOffLineList); + } + + private MesProductOffLine getMesProductOffLine(WmsProductModel model, MesPart mesPart, MesProductVersion mesProductVersion, MesBom mesBom) { + MesProductOffLine newMesProductOffLine = new MesProductOffLine(); + newMesProductOffLine.setReportPartNo(mesPart.getPartNo()); + newMesProductOffLine.setReportPartNameRdd(mesPart.getPartName()); + newMesProductOffLine.setReportSn(model.getSn()); + newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo()); + newMesProductOffLine.setItemPartName(mesBom.getItemPartName()); + newMesProductOffLine.setItemQty(MathOperation.mul(model.getQty(), mesBom.getItemQty())); + newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint()); + newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint()); + newMesProductOffLine.setQty(model.getQty()); + newMesProductOffLine.setBomVersion(mesProductVersion.getProductVersion()); + newMesProductOffLine.setSerialNumber(model.getSn()); + newMesProductOffLine.setUnit(mesBom.getUnit()); + newMesProductOffLine.setItemUnit(mesBom.getItemUnit()); + newMesProductOffLine.setReportType(MesExtEnumUtil.REPORT_TYPE.CBR.getValue()); + newMesProductOffLine.setOrganizeCode(model.getOrganizeCode()); + newMesProductOffLine.setOrderNo(model.getShipOrderNo()); + newMesProductOffLine.setCustNo(model.getCustNo()); + newMesProductOffLine.setCustOrder(model.getCustOrderNo()); + + ConvertBean.serviceModelInitialize(newMesProductOffLine, model.getUserName()); + return newMesProductOffLine; + } + + private MesProductVersion getMesProductVersion(WmsProductModel model) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(model.getPartNo(), "partNo", ddlPackBean); + DdlPreparedPack.getOrderBy(null, null, ddlPackBean); + MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean); + if (null == mesProductVersion) { + MesException.throwMesBusiException("物料【%s】生产版本信息不存在", model.getPartNo()); + } + return mesProductVersion; } private void customerSupplyMove(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, List mesBoms, List resultList, List mesProductOffLineList, List mesMoveList) { @@ -713,9 +809,9 @@ public class MesWorkOrderService extends BaseMesService implements isItemReport = false; isItemMove = false; moveRule = null; - if(itemPartMap.containsKey(mesBom.getItemPartNo())){ + if (itemPartMap.containsKey(mesBom.getItemPartNo())) { MesPart itemPart = itemPartMap.get(mesBom.getItemPartNo()).iterator().next(); - if(!StringUtil.isEmpty(itemPart.getEsd()) && mesMoveRuleMap.containsKey(itemPart.getEsd())){ + if (!StringUtil.isEmpty(itemPart.getEsd()) && mesMoveRuleMap.containsKey(itemPart.getEsd())) { moveRule = mesMoveRuleMap.get(itemPart.getEsd()).iterator().next(); if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT_MOVE.getValue() == moveRule.getReportType()) { isItemMove = true; @@ -728,16 +824,16 @@ public class MesWorkOrderService extends BaseMesService implements } } //汇报 - if(isItemReport){ - mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom,true)); + if (isItemReport) { + mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, true)); } //移库 - if(isItemMove){ + if (isItemMove) { MesPartSap mesPartSap = null; - if(mesPartSapMap.containsKey(mesBom.getItemPartNo())){ + if (mesPartSapMap.containsKey(mesBom.getItemPartNo())) { mesPartSap = mesPartSapMap.get(mesBom.getItemPartNo()).iterator().next(); } - MesMove move = createMove(mesPartSap, moveRule.getErpSrcLocateNo(), moveRule.getErpDestLocateNo(), mesBom.getOrganizeCode(), mesBom.getItemQty(),"",MesExtEnumUtil.MOVE_TYPE.RAW_MATERIAL_MOVE.getValue()); + MesMove move = createMove(mesPartSap, moveRule.getErpSrcLocateNo(), moveRule.getErpDestLocateNo(), mesBom.getOrganizeCode(), mesBom.getItemQty(), "", MesExtEnumUtil.MOVE_TYPE.RAW_MATERIAL_MOVE.getValue()); move.setMatnr(mesBom.getItemPartNo()); mesMoveList.add(move); } @@ -759,10 +855,10 @@ public class MesWorkOrderService extends BaseMesService implements private MesProdRuleSortCfg getMesProdRuleSortCfg(MesWorkOrder mesWorkOrder) { DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode()); - DdlPreparedPack.getStringEqualPack(mesWorkOrder.getPartNo(),"reportPartNo",ddlPackBean); - DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkCenterCode(),"workCenterCode",ddlPackBean); + DdlPreparedPack.getStringEqualPack(mesWorkOrder.getPartNo(), "reportPartNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkCenterCode(), "workCenterCode", ddlPackBean); MesProdRuleSortCfg mesProdRuleSortCfg = mesProdRuleSortCfgRDao.getByProperty(ddlPackBean); - if(Objects.isNull(mesProdRuleSortCfg)){ + if (Objects.isNull(mesProdRuleSortCfg)) { MesException.throwMesBusiException("产线【%s】物料【%s】排序加工规则未维护", mesWorkOrder.getWorkCenterCode(), mesWorkOrder.getPartNo()); } return mesProdRuleSortCfg; @@ -774,17 +870,15 @@ public class MesWorkOrderService extends BaseMesService implements return resultList; } - private List getMesBoms(MesWorkOrder mesWorkOrder, MesPart mesPart, MesProductVersion mesProductVersion) { - DdlPackBean ddlPackBean; - ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode()); - DdlPreparedPack.getStringEqualPack(mesPart.getPartNo(), "partNo", ddlPackBean); - DdlPreparedPack.getStringEqualPack(mesProductVersion.getAlternativePartList(), "bomVersion", ddlPackBean); + private List getMesBoms(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); + DdlPreparedPack.getOrderBy("effStartTime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean); List mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean); if (CollectionUtils.isEmpty(mesBoms)) { - MesException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在", - mesWorkOrder.getPartNo(), mesProductVersion.getProductVersion()); + MesException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在", partNo, bomVersion); } MesBom next = mesBoms.iterator().next(); //如果存在多个bomCode取最新的一个 @@ -805,10 +899,10 @@ public class MesWorkOrderService extends BaseMesService implements private MesProductOffLine creatMesProductOffLine(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, - String sn, MesBom mesBom,boolean isItemReport) { + String sn, MesBom mesBom, boolean isItemReport) { MesProductOffLine newMesProductOffLine; newMesProductOffLine = new MesProductOffLine(); - if(!isItemReport){ + if (!isItemReport) { newMesProductOffLine.setReportPartNo(mesWorkOrder.getPartNo()); newMesProductOffLine.setReportPartNameRdd(mesWorkOrder.getPartName()); } @@ -843,6 +937,7 @@ public class MesWorkOrderService extends BaseMesService implements //查询汇总工单数量 return mesWorkOrderDao.sumMesWorkOrderQtyToSap(organizeCode, statusList); } + @Override public List queryMesWorkOrderProcessToSap(String organizeCode) { List statusList = new ArrayList<>(); @@ -854,9 +949,9 @@ public class MesWorkOrderService extends BaseMesService implements return mesWorkOrderRDao.findByHqlWhere(packBean); } - private MesMove createMove(MesPartSap mesPart , String source, String target, String org,double qty,String sn,Integer moveType) { + private MesMove createMove(MesPartSap mesPart, String source, String target, String org, double qty, String sn, Integer moveType) { MesMove move = new MesMove(); - if(!Objects.isNull(mesPart)){ + if (!Objects.isNull(mesPart)) { move.setMeins(mesPart.getUnit()); } move.setOrganizeCode(org); @@ -871,4 +966,21 @@ public class MesWorkOrderService extends BaseMesService implements ConvertBean.serviceModelInitialize(move, AuthUtil.getSessionUser().getUserName()); return move; } + + /** + * 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。 + * + * @param dividend 被除数 + * @param divisor 除数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的商 + */ + public Double divide(Double dividend, Double divisor, Integer scale) { + if (scale < 0) { + throw new IllegalArgumentException("The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(Double.toString(dividend)); + BigDecimal b2 = new BigDecimal(Double.toString(divisor)); + return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); + } } diff --git a/modules/i3plus-ext-mes-icloud/pom.xml b/modules/i3plus-ext-mes-icloud/pom.xml index 1485500..484f850 100644 --- a/modules/i3plus-ext-mes-icloud/pom.xml +++ b/modules/i3plus-ext-mes-icloud/pom.xml @@ -34,6 +34,10 @@ i3plus.ext.mes i3plus-ext-mes-pojo + + i3plus.pojo + i3plus-pojo-model + diff --git a/modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdk/IMesForWmsCloud.java b/modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdk/IMesForWmsCloud.java new file mode 100644 index 0000000..1052b67 --- /dev/null +++ b/modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdk/IMesForWmsCloud.java @@ -0,0 +1,34 @@ +package cn.estsh.i3plus.ext.mes.icloud.sdk; + +import cn.estsh.i3plus.ext.mes.icloud.sdkfallback.MesForWmsFactory; +import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant; +import cn.estsh.i3plus.pojo.base.bean.BaseResultBean; +import cn.estsh.i3plus.pojo.model.wms.WmsProductModel; +import io.swagger.annotations.ApiOperation; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * @Description : + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/6/13 19:23 + * @Modify: + **/ +@FeignClient(name = "i3mes", //对应配置文件中的spring.application.name + path = MesCommonConstant.MES_YANFEN + "/mesWorkOrder", + fallbackFactory = MesForWmsFactory.class) +public interface IMesForWmsCloud { + + + /** + * MES移库cloud + * + * @return 结果封装 + */ + @PostMapping(value = "/report-work-reversal") + @ApiOperation(value = "反向冲销") + BaseResultBean doReportWorkReversal(@RequestBody WmsProductModel model); + +} diff --git a/modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdkfallback/MesForWmsFactory.java b/modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdkfallback/MesForWmsFactory.java new file mode 100644 index 0000000..b49d70d --- /dev/null +++ b/modules/i3plus-ext-mes-icloud/src/main/java/cn/estsh/i3plus/ext/mes/icloud/sdkfallback/MesForWmsFactory.java @@ -0,0 +1,35 @@ +package cn.estsh.i3plus.ext.mes.icloud.sdkfallback; + +import cn.estsh.i3plus.ext.mes.icloud.sdk.IMesForWmsCloud; +import cn.estsh.i3plus.platform.common.util.CommonConstWords; +import cn.estsh.i3plus.pojo.base.bean.BaseFallBackBean; +import cn.estsh.i3plus.pojo.base.bean.BaseResultBean; +import cn.estsh.i3plus.pojo.model.wms.WmsProductModel; +import feign.hystrix.FallbackFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * @Description : + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/6/13 19:13 + * @Modify: + **/ +@Component +public class MesForWmsFactory extends BaseFallBackBean implements FallbackFactory { + + private static final Logger LOGGER = LoggerFactory.getLogger(CommonConstWords.SYSTEM_LOG); + + + @Override + public IMesForWmsCloud create(Throwable cause) { + return new IMesForWmsCloud() { + @Override + public BaseResultBean doReportWorkReversal(WmsProductModel model) { + return makeBaseFallBack("微服调用出错", cause); + } + }; + } +}