From 9543a7a674e1bfefbea1e373f4f28cadc350d830 Mon Sep 17 00:00:00 2001 From: "castle.zang" Date: Fri, 7 Feb 2025 20:07:48 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E6=B7=B1=E6=B1=95kitting=E6=8B=89?= =?UTF-8?q?=E5=8A=A8,=E6=8C=89=E5=A5=97=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serviceimpl/base/MesWorkOrderService.java | 230 +++++++++++++++++++++ 1 file changed, 230 insertions(+) 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 de18e8a..8369f48 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 @@ -39,6 +39,7 @@ import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.map.CaseInsensitiveMap; import org.apache.commons.collections.map.HashedMap; +import org.python.antlr.ast.While; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; @@ -186,6 +187,21 @@ public class MesWorkOrderService extends BaseMesService implements @Autowired private MesPartProdGroupRepository mesPartProdGroupRao; + @Autowired + private MesPullingOrderInfoRepository mesPullingOrderInfoRao; + + @Autowired + private MesPartPullRepository partPullRao; + + @Autowired + private MesWorkCenterRepository workCenterRao; + + @Autowired + private MesPartPullDetailRepository partPullDetailRao; + + @Autowired + private MesBomRepository bomRao; + @Override public MesWorkOrder insert(MesWorkOrder bean) { // 数据校验 @@ -715,6 +731,220 @@ public class MesWorkOrderService extends BaseMesService implements } } + private void doCreateKitting(List mesWorkOrderList,String organizeCode) { + //todo 在工单点击发布时,也需要重新触发拉动单,工单关闭时,也需要关闭拉动单 + //1.拉动组获取 -- 根据拉动组类型获取kitting,需要判断是否生成是否生成拉动单开关 + DdlPackBean partPullPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PART_PULL_ORDER_TYPE.KITTING_PULL.getValue(),"pullOrderType", partPullPackBean); + DdlPreparedPack.getNumEqualPack(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(),"isAutoCreatePullOrder", partPullPackBean); + List mesPartPullList = partPullRao.findByHqlWhere(partPullPackBean); + //2.工单 过滤出未生成拉动单的工单pullingStatus,按照拉动组产线分组,每组按照工单序号排序 + Map> workOrderMap = mesWorkOrderList.stream().filter(item -> item.getPullingStatus() == MesExtEnumUtil.WORK_ORDER_PULLING_STATUS.NOTCREATE.getValue()).collect(Collectors.groupingBy(MesWorkOrder::getWorkCenterCode)); + + //3.查询2中所有的产线信息 ,判断生成拉动单的工单状态 generateStatus 与工单状态对比 是否生成拉动单 MesExtEnumUtil.GENERATE_STATUS需要和工单类型一致才生成拉动单 + List workOrderCenterList = new ArrayList<>(workOrderMap.keySet()); + DdlPackBean workCenterPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(workOrderCenterList,"workCenterCode", workCenterPackBean); + List workCenterList = workCenterRao.findByHqlWhere(workCenterPackBean); + Map> workCenterMap = workCenterList.stream().collect(Collectors.groupingBy(MesWorkCenter::getWorkCenterCode)); + //4.遍历拉动组 + for (MesPartPull mesPartPull : mesPartPullList) { + String workCenterCode = mesPartPull.getWorkCenterCode(); + //按数量圆整 + if(mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_BY_QUANTITY.getValue()){ + List workOrderList = workOrderMap.get(workCenterCode); + //遍历工单,打散成bom 生成拉动单 + List mesWorkCenters = workCenterMap.get(workCenterCode); + if (CollectionUtils.isEmpty(workOrderList) || CollectionUtils.isEmpty(mesWorkCenters)) { + continue; + } + Map> orderMap = workOrderList.stream().collect(Collectors.groupingBy(MesWorkOrder::getPartNo)); + for (String producePartNoAndTime : orderMap.keySet()) { + List workOrderListNew = orderMap.get(producePartNoAndTime); + doCreateKittingOrder(workOrderListNew,mesPartPull,mesWorkCenters.get(0)); + } + //按成套圆整 + } else if (mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_DOOR_PANELS_NUMBER.getValue()) { + //按成套圆整 会是同一个拉动组 生成拉动单 + Map> groupCodeMap = workOrderMap.get(workCenterCode).stream().collect(Collectors.groupingBy(MesWorkOrder::getGroupCode)); + for (Long l : groupCodeMap.keySet()) { + List workOrderList = groupCodeMap.get(l); + List mesWorkCenters = workCenterMap.get(workCenterCode); + if (CollectionUtils.isEmpty(workOrderList) || CollectionUtils.isEmpty(mesWorkCenters)) { + continue; + } + doCreateGroupKittingOrder(workOrderList,mesPartPull,mesWorkCenters.get(0)); + } + + } + } + } + //按成套圆整 + private void doCreateGroupKittingOrder(List workOrderListNew,MesPartPull mesPartPull,MesWorkCenter mesWorkCenter){ + String organizeCode = mesPartPull.getOrganizeCode(); + List list = new ArrayList<>(); + //1.查询拉动组详情 + DdlPackBean pullPartDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(mesPartPull.getPullCode(),"pullCode", pullPartDetailPackBean); + List mesPartPullDetailList = partPullDetailRao.findByHqlWhere(pullPartDetailPackBean); + if (CollectionUtils.isEmpty(mesPartPullDetailList)) { + return; + } + // 打散所有的工单的bom + List pullPartNoList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPullPartNo).collect(Collectors.toList()); + Map pullDetailMap = mesPartPullDetailList.stream().collect(Collectors.toMap(MesPartPullDetail::getPullPartNo, Function.identity())); + for (MesWorkOrder mesWorkOrder : workOrderListNew) { + List bomList = getPlatBom(null, mesWorkOrder.getPartNo(), TimeTool.getNowTime(true), organizeCode); + List collect = bomList.stream().filter(item -> pullPartNoList.contains(item.getItemPartNo())).collect(Collectors.toList()); + collect.forEach(item -> item.setItemQty(item.getItemQty() * mesWorkOrder.getQty())); + list.addAll(collect); + } + + // 计算所有拉动单的数量,生成拉动单 + + String workOrderStr = workOrderListNew.stream().map(MesWorkOrder::getWorkOrderNo).collect(Collectors.joining("/r/n")); + String workOrderPartNoStr = workOrderListNew.stream().map(MesWorkOrder::getPartNo).collect(Collectors.joining("/r/n")); + String workOrderPartNameStr = workOrderListNew.stream().map(MesWorkOrder::getPartName).collect(Collectors.joining("/r/n")); + String custPartNo = workOrderListNew.stream().map(MesWorkOrder::getCustPartNo).collect(Collectors.joining("/r/n")); + MesPullingOrderInfo pullingOrder = new MesPullingOrderInfo(); + pullingOrder.setOrganizeCode(organizeCode); + pullingOrder.setPullingOrderNo("xxx"); //拉动单号 + 8位年月日 + 5位流水号 + pullingOrder.setPullOrderType(mesPartPull.getPullOrderType()); + pullingOrder.setPullGroupFid(mesPartPull.getId()); + pullingOrder.setWorkOrderNo(workOrderStr); + pullingOrder.setIsPrint(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + pullingOrder.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue()); + pullingOrder.setPullOrderStatus(MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_10.getValue()); + pullingOrder.setWorkCenterCode(mesPartPull.getWorkCenterCode()); + pullingOrder.setPullCode(mesPartPull.getPullCode()); + pullingOrder.setPartNo(workOrderPartNoStr); + pullingOrder.setPartName(workOrderPartNameStr); + pullingOrder.setCustPartNo(custPartNo); + pullingOrder.setCarModelCode(workOrderListNew.get(0).getCarModelCode()); + pullingOrder.setOrderFlag(workOrderListNew.get(0).getOrderFlag()); + ConvertBean.serviceModelInitialize(pullingOrder, AuthUtil.getSessionUser().getUserName()); + + // 需要合并同类项 + Map> itemBomMap = list.stream().collect(Collectors.groupingBy(MesBom::getItemPartNo)); + for (String itemPartNo : itemBomMap.keySet()) { + List mesBoms = itemBomMap.get(itemPartNo); + double sum = mesBoms.stream().collect(Collectors.summarizingDouble(MesBom::getItemQty)).getSum(); + MesPullingOrderPartInfo detail = new MesPullingOrderPartInfo(); + detail.setOrganizeCode(organizeCode); + detail.setPullCode(pullingOrder.getPullCode()); + detail.setPullingOrderNo(pullingOrder.getPullingOrderNo()); + detail.setWorkOrderNo(pullingOrder.getWorkOrderNo()); + detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + detail.setCustOrderNo(pullingOrder.getCustOrderNo()); + MesBom mesBom = mesBoms.get(0); + detail.setPartNo(mesBom.getItemPartNo()); + detail.setPartName(mesBom.getItemPartName()); + detail.setPullQty(sum); + detail.setCustOrderNo(pullingOrder.getCustOrderNo()); + detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + detail.setWaterSeq(pullingOrder.getProductSeq()); + detail.setWorkCellCode(mesWorkCenter.getWorkCenterCode()); + detail.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1,未送料为0 + detail.setCustPartNo(pullingOrder.getCustPartNo()); + detail.setCarSeries(pullDetailMap.get(itemPartNo) == null ? "" : pullDetailMap.get(itemPartNo).getCarSeries()); + detail.setOrderFlag(pullingOrder.getOrderFlag()); + ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName()); + } + + } + private void doCreateKittingOrder(List workOrderListNew,MesPartPull mesPartPull,MesWorkCenter mesWorkCenter) { + String organizeCode = mesWorkCenter.getOrganizeCode(); + //1.查询拉动组详情 + DdlPackBean pullPartDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(mesPartPull.getPullCode(),"pullCode", pullPartDetailPackBean); + List mesPartPullDetailList = partPullDetailRao.findByHqlWhere(pullPartDetailPackBean); + if (CollectionUtils.isEmpty(mesPartPullDetailList)) { + return; + } + //bom中对应的partNo列表 + List partNoList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPartNo).collect(Collectors.toList()); + //深汕按照包装圆整 + if (mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_BY_QUANTITY.getValue()){ + int packRoundQty = Integer.parseInt(mesPartPull.getPackRoundQty()); + String partNo = workOrderListNew.get(0).getPartNo(); + //打散bom + List bomList = getPlatBom(null, partNo, TimeTool.getNowTime(true), organizeCode); + //需要生成拉动单的零件 + List bomPullList = bomList.stream().filter(item -> partNoList.contains(item.getItemPartNo())).collect(Collectors.toList()); + + + /** + * 满足一个拉动组就生成一个拉动单 + * 分类 + * 1.当前bom 子零件数量 * 工单需求数量 > packRoundQty multiple是多少,是否有余数 取模 + * 2.当前bom 子零件数量 * 工单需求数量 = packRoundQty 直接整除,看看是否大于1 ,大于1需要拆分多个拉动单 + * 3.当前bom 子零件数量 * 工单需求数量 < packRoundQty 需要增加一个工单来补充当前的数量,补不齐继续补充 + */ + Map partNoRemainder = new HashMap<>(); + for (int i = 0; i < workOrderListNew.size(); i++) { + MesWorkOrder mesWorkOrder = workOrderListNew.get(0); + Double qty = mesWorkOrder.getQty(); + bomPullList.forEach(item -> item.setItemQty(item.getItemQty() * qty)); + for (int j = 0; j < bomPullList.size(); j++) { + double m = bomPullList.get(j).getItemQty() % packRoundQty; + double n = bomPullList.get(j).getItemQty() / packRoundQty; + if (m == 0 && n != 0){ + //子零件数量 * 工单需求数量 = packRoundQty + //证明当前零件需要拉动的数量是圆整数量的倍数,需要拆分多个拉动单,或者一个拉动单就满足了 + + }else if (m != 0 && n == 0) { + //子零件数量 * 工单需求数量 < packRoundQty + //证明需要凑下一个工单的当前零件 + } else if (m !=0 && n > 0) { + //子零件数量 * 工单需求数量 > packRoundQty + //够一个拉动单以上的数据,还有余数给 + + } + } + } + + + } + } + + private List getPlatBom(MesBom mesBom,String partNo, String effectiveTime,String organizeCode) { + //MES汇报查询BOM是否携带结束查询条件 + MesConfig config = mesConfigService.getCfgValueByCode(organizeCode, MesExtConstWords.MES_REPORT_FIND_BOM_WITH_EFFENDTIME); + Boolean isWithEffEndTime = (null != config && !org.springframework.util.StringUtils.isEmpty(config.getCfgValue()) && config.getCfgValue().equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())) ? true : false; + + if (mesBom == null) { + //首先根据虚结构的零件号查询出最新的一条bom信息作为bomCode + DdlPackBean bomCodePackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(partNo, MesExtConstWords.PART_NO, bomCodePackBean); + DdlPreparedPack.getStringSmallerPack(effectiveTime, MesExtConstWords.EFF_START_TIME, bomCodePackBean); + if (isWithEffEndTime) DdlPreparedPack.getStringBiggerPack(effectiveTime, MesExtConstWords.EFF_END_TIME, bomCodePackBean); + DdlPreparedPack.getOrderBy(MesExtConstWords.EFF_START_TIME, CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), bomCodePackBean); + List bomList = bomRao.findByHqlTopWhere(bomCodePackBean, 1); + if (bomList == null || bomList.isEmpty()) { + return new ArrayList<>(); + } + mesBom = bomList.get(0); + } + List bomResultList = new ArrayList<>(); + DdlPackBean bomPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(mesBom.getBomCode(), "bomCode", bomPackBean); + DdlPreparedPack.getStringEqualPack(partNo, MesExtConstWords.PART_NO, bomPackBean); + DdlPreparedPack.getStringEqualPack(mesBom.getEffStartTime(), MesExtConstWords.EFF_START_TIME, bomPackBean); + List bomList = bomRao.findByHqlWhere(bomPackBean); + + for (MesBom bom : bomList) { + if (bom.getPartType() != null && bom.getPartType().equalsIgnoreCase("X")) { + getPlatBom(null,bom.getItemPartNo(), effectiveTime, organizeCode); + } else { + bom.setBomCode(bom.getBomCode().toLowerCase()); + bomResultList.add(bom); + } + + } + + return bomResultList; + } + private void checkData(List mesWorkOrderList, String organizeCode) { MesWorkOrder next = mesWorkOrderList.iterator().next(); String nowDate = TimeTool.getNowTime(true); From d7377fa4c6f7907070bfb82f244fd620da135f1f Mon Sep 17 00:00:00 2001 From: "castle.zang" Date: Sat, 8 Feb 2025 11:42:54 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E6=B7=B1=E6=B1=95kitting=E6=8B=89?= =?UTF-8?q?=E5=8A=A8,=E6=8C=89=E6=95=B0=E9=87=8F=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serviceimpl/base/MesWorkOrderService.java | 142 ++++++++++++++++----- 1 file changed, 108 insertions(+), 34 deletions(-) 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 8369f48..d10af34 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 @@ -191,6 +191,9 @@ public class MesWorkOrderService extends BaseMesService implements private MesPullingOrderInfoRepository mesPullingOrderInfoRao; @Autowired + private MesPullingOrderPartInfoRepository pullingOrderPartInfoRao; + + @Autowired private MesPartPullRepository partPullRao; @Autowired @@ -202,6 +205,8 @@ public class MesWorkOrderService extends BaseMesService implements @Autowired private MesBomRepository bomRao; + + @Override public MesWorkOrder insert(MesWorkOrder bean) { // 数据校验 @@ -676,6 +681,7 @@ public class MesWorkOrderService extends BaseMesService implements seqList = syncFuncService.syncSerialNo(orderSeqSerialNoModel.organizeCode(next.getOrganizeCode()), next.getCreateUser(), next.getOrganizeCode(), mesWorkOrderList.size()).getResultList(); } List mesWorkOrderLogList = new ArrayList<>(); + List workOrderListForKitting = new ArrayList<>(); int index = 0; for (MesWorkOrder item : mesWorkOrderList) { //获取相同类型 相同标识 生产序号最大值的 @@ -698,6 +704,7 @@ public class MesWorkOrderService extends BaseMesService implements ConvertBean.serviceModelInitialize(copyMesWorkOrder, item.getCreateUser()); index++; baseRDao.insert(copyMesWorkOrder); + workOrderListForKitting.add(copyMesWorkOrder); //保存记录 MesWorkOrderLog workOrderLog = new MesWorkOrderLog(); BeanUtils.copyProperties(item, workOrderLog,MesExtConstWords.ID,MesExtConstWords.SYSTEM_SYNC_STATUS); @@ -729,6 +736,8 @@ public class MesWorkOrderService extends BaseMesService implements if (!CollectionUtils.isEmpty(mesWorkOrderLogList)) { workOrderLogService.insertBatch(mesWorkOrderLogList); } + //创建kitting + doCreateKitting(workOrderListForKitting, next.organizeCode); } private void doCreateKitting(List mesWorkOrderList,String organizeCode) { @@ -799,16 +808,19 @@ public class MesWorkOrderService extends BaseMesService implements collect.forEach(item -> item.setItemQty(item.getItemQty() * mesWorkOrder.getQty())); list.addAll(collect); } - // 计算所有拉动单的数量,生成拉动单 - + String kittingOrderNoRuleCode = mesConfigService.getCfgValue(organizeCode, "KITTING_ORDER_NO_RULE_CODE"); + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(kittingOrderNoRuleCode); + genSerialNoModel.setDynamicRule(mesPartPull.getPullCode()); + List resultList = syncFuncService.syncSerialNo(genSerialNoModel.organizeCode(organizeCode), AuthUtil.getSessionUser().getUserName(), organizeCode, 1).getResultList(); + String serialNo = resultList.get(0); String workOrderStr = workOrderListNew.stream().map(MesWorkOrder::getWorkOrderNo).collect(Collectors.joining("/r/n")); String workOrderPartNoStr = workOrderListNew.stream().map(MesWorkOrder::getPartNo).collect(Collectors.joining("/r/n")); String workOrderPartNameStr = workOrderListNew.stream().map(MesWorkOrder::getPartName).collect(Collectors.joining("/r/n")); String custPartNo = workOrderListNew.stream().map(MesWorkOrder::getCustPartNo).collect(Collectors.joining("/r/n")); MesPullingOrderInfo pullingOrder = new MesPullingOrderInfo(); pullingOrder.setOrganizeCode(organizeCode); - pullingOrder.setPullingOrderNo("xxx"); //拉动单号 + 8位年月日 + 5位流水号 + pullingOrder.setPullingOrderNo(serialNo); //拉动单号 + 8位年月日 + 5位流水号 pullingOrder.setPullOrderType(mesPartPull.getPullOrderType()); pullingOrder.setPullGroupFid(mesPartPull.getId()); pullingOrder.setWorkOrderNo(workOrderStr); @@ -823,7 +835,7 @@ public class MesWorkOrderService extends BaseMesService implements pullingOrder.setCarModelCode(workOrderListNew.get(0).getCarModelCode()); pullingOrder.setOrderFlag(workOrderListNew.get(0).getOrderFlag()); ConvertBean.serviceModelInitialize(pullingOrder, AuthUtil.getSessionUser().getUserName()); - + mesPullingOrderInfoRao.insert(pullingOrder); // 需要合并同类项 Map> itemBomMap = list.stream().collect(Collectors.groupingBy(MesBom::getItemPartNo)); for (String itemPartNo : itemBomMap.keySet()) { @@ -849,6 +861,7 @@ public class MesWorkOrderService extends BaseMesService implements detail.setCarSeries(pullDetailMap.get(itemPartNo) == null ? "" : pullDetailMap.get(itemPartNo).getCarSeries()); detail.setOrderFlag(pullingOrder.getOrderFlag()); ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName()); + pullingOrderPartInfoRao.insert(detail); } } @@ -861,9 +874,9 @@ public class MesWorkOrderService extends BaseMesService implements if (CollectionUtils.isEmpty(mesPartPullDetailList)) { return; } - //bom中对应的partNo列表 + //拉动组详情中的零件号 List partNoList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPartNo).collect(Collectors.toList()); - //深汕按照包装圆整 + //深汕按照数量圆整 if (mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_BY_QUANTITY.getValue()){ int packRoundQty = Integer.parseInt(mesPartPull.getPackRoundQty()); String partNo = workOrderListNew.get(0).getPartNo(); @@ -871,40 +884,101 @@ public class MesWorkOrderService extends BaseMesService implements List bomList = getPlatBom(null, partNo, TimeTool.getNowTime(true), organizeCode); //需要生成拉动单的零件 List bomPullList = bomList.stream().filter(item -> partNoList.contains(item.getItemPartNo())).collect(Collectors.toList()); - - - /** - * 满足一个拉动组就生成一个拉动单 - * 分类 - * 1.当前bom 子零件数量 * 工单需求数量 > packRoundQty multiple是多少,是否有余数 取模 - * 2.当前bom 子零件数量 * 工单需求数量 = packRoundQty 直接整除,看看是否大于1 ,大于1需要拆分多个拉动单 - * 3.当前bom 子零件数量 * 工单需求数量 < packRoundQty 需要增加一个工单来补充当前的数量,补不齐继续补充 - */ - Map partNoRemainder = new HashMap<>(); - for (int i = 0; i < workOrderListNew.size(); i++) { - MesWorkOrder mesWorkOrder = workOrderListNew.get(0); + for (MesWorkOrder mesWorkOrder : workOrderListNew) { Double qty = mesWorkOrder.getQty(); bomPullList.forEach(item -> item.setItemQty(item.getItemQty() * qty)); - for (int j = 0; j < bomPullList.size(); j++) { - double m = bomPullList.get(j).getItemQty() % packRoundQty; - double n = bomPullList.get(j).getItemQty() / packRoundQty; - if (m == 0 && n != 0){ - //子零件数量 * 工单需求数量 = packRoundQty - //证明当前零件需要拉动的数量是圆整数量的倍数,需要拆分多个拉动单,或者一个拉动单就满足了 - - }else if (m != 0 && n == 0) { - //子零件数量 * 工单需求数量 < packRoundQty - //证明需要凑下一个工单的当前零件 - } else if (m !=0 && n > 0) { - //子零件数量 * 工单需求数量 > packRoundQty - //够一个拉动单以上的数据,还有余数给 - - } + DoubleSummaryStatistics summaryStatistics = bomPullList.stream().collect(Collectors.summarizingDouble(MesBom::getItemQty)); + double max = summaryStatistics.getMax(); + int multiple = Integer.parseInt(String.valueOf(Math.ceil(max / packRoundQty))); //生成的拉动的数量 + for (int i = 1; i <= multiple; i++) { + insertPullOrderInfo( mesWorkOrder, bomPullList, mesPartPull, mesPartPullDetailList, organizeCode, i, packRoundQty); } } - +// /** +// * 满足一个拉动组就生成一个拉动单 +// * 分类 +// * 1.当前bom 子零件数量 * 工单需求数量 > packRoundQty multiple是多少,是否有余数 取模 +// * 2.当前bom 子零件数量 * 工单需求数量 = packRoundQty 直接整除,看看是否大于1 ,大于1需要拆分多个拉动单 +// * 3.当前bom 子零件数量 * 工单需求数量 < packRoundQty 需要增加一个工单来补充当前的数量,补不齐继续补充 +// */ +// Map partNoRemainder = new HashMap<>(); +// for (int i = 0; i < workOrderListNew.size(); i++) { +// MesWorkOrder mesWorkOrder = workOrderListNew.get(0); +// Double qty = mesWorkOrder.getQty(); +// bomPullList.forEach(item -> item.setItemQty(item.getItemQty() * qty)); +// for (int j = 0; j < bomPullList.size(); j++) { +// double m = bomPullList.get(j).getItemQty() % packRoundQty; +// double n = bomPullList.get(j).getItemQty() / packRoundQty; +// if (m == 0 && n != 0){ +// //子零件数量 * 工单需求数量 = packRoundQty +// //证明当前零件需要拉动的数量是圆整数量的倍数,需要拆分多个拉动单,或者一个拉动单就满足了 +// +// }else if (m != 0 && n == 0) { +// //子零件数量 * 工单需求数量 < packRoundQty +// //证明需要凑下一个工单的当前零件 +// } else if (m !=0 && n > 0) { +// //子零件数量 * 工单需求数量 > packRoundQty +// //够一个拉动单以上的数据,还有余数给 +// +// } +// } +// } + + + } + } + + private void insertPullOrderInfo(MesWorkOrder mesWorkOrder,List bomPullList,MesPartPull mesPartPull,List mesPartPullDetailList,String organizeCode,int i, int roundPackQty){ + // 计算所有拉动单的数量,生成拉动单 + Map pullDetailMap = mesPartPullDetailList.stream().collect(Collectors.toMap(MesPartPullDetail::getPullPartNo, Function.identity())); + String kittingOrderNoRuleCode = mesConfigService.getCfgValue(organizeCode, "KITTING_ORDER_NO_RULE_CODE"); + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(kittingOrderNoRuleCode); + genSerialNoModel.setDynamicRule(mesPartPull.getPullCode()); + List resultList = syncFuncService.syncSerialNo(genSerialNoModel.organizeCode(organizeCode), AuthUtil.getSessionUser().getUserName(), organizeCode, 1).getResultList(); + String serialNo = resultList.get(0); + MesPullingOrderInfo pullingOrder = new MesPullingOrderInfo(); + pullingOrder.setOrganizeCode(organizeCode); + pullingOrder.setPullingOrderNo(serialNo); //拉动单号 + 8位年月日 + 5位流水号 + pullingOrder.setPullOrderType(mesPartPull.getPullOrderType()); + pullingOrder.setPullGroupFid(mesPartPull.getId()); + pullingOrder.setWorkOrderNo(mesWorkOrder.getWorkOrderNo()); + pullingOrder.setIsPrint(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + pullingOrder.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue()); + pullingOrder.setPullOrderStatus(MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_10.getValue()); + pullingOrder.setWorkCenterCode(mesPartPull.getWorkCenterCode()); + pullingOrder.setPullCode(mesPartPull.getPullCode()); + pullingOrder.setPartNo(mesWorkOrder.getPartNo()); + pullingOrder.setPartName(mesWorkOrder.getPartName()); + pullingOrder.setCustPartNo(mesWorkOrder.getCustPartNo()); + pullingOrder.setCarModelCode(mesWorkOrder.getCarModelCode()); + pullingOrder.setOrderFlag(mesWorkOrder.getOrderFlag()); + ConvertBean.serviceModelInitialize(pullingOrder, AuthUtil.getSessionUser().getUserName()); + mesPullingOrderInfoRao.insert(pullingOrder); + for (MesBom mesBom : bomPullList) { + MesPullingOrderPartInfo detail = new MesPullingOrderPartInfo(); + detail.setOrganizeCode(organizeCode); + detail.setPullCode(pullingOrder.getPullCode()); + detail.setPullingOrderNo(pullingOrder.getPullingOrderNo()); + detail.setWorkOrderNo(pullingOrder.getWorkOrderNo()); + detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + detail.setCustOrderNo(pullingOrder.getCustOrderNo()); + detail.setPartNo(mesBom.getItemPartNo()); + detail.setPartName(mesBom.getItemPartName()); + double remainingQty = mesBom.getItemQty() - i * roundPackQty; + detail.setPullQty(remainingQty > 0 ? roundPackQty : (mesBom.getItemQty() - (i-1) * roundPackQty)); + detail.setCustOrderNo(pullingOrder.getCustOrderNo()); + detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + detail.setWaterSeq(pullingOrder.getProductSeq()); + detail.setWorkCellCode(mesWorkOrder.getWorkCenterCode()); + detail.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1,未送料为0 + detail.setCustPartNo(pullingOrder.getCustPartNo()); + detail.setCarSeries(pullDetailMap.get(mesBom.getItemPartNo()) == null ? "" : pullDetailMap.get(mesBom.getItemPartNo()).getCarSeries()); + detail.setOrderFlag(pullingOrder.getOrderFlag()); + ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName()); + pullingOrderPartInfoRao.insert(detail); } + } private List getPlatBom(MesBom mesBom,String partNo, String effectiveTime,String organizeCode) { From b63431ef8f05362bca351da4f421321faa18da97 Mon Sep 17 00:00:00 2001 From: "castle.zang" Date: Mon, 10 Feb 2025 18:37:40 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E6=B7=B1=E6=B1=95kitting=E6=8B=89?= =?UTF-8?q?=E5=8A=A8=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serviceimpl/base/MesWorkOrderService.java | 73 +++++++++++++++++++--- .../src/main/resources/application.properties | 2 +- 2 files changed, 64 insertions(+), 11 deletions(-) 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 d10af34..ac6ffd7 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 @@ -49,6 +49,7 @@ import org.springframework.util.StringUtils; import javax.persistence.EntityManager; import javax.persistence.Query; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalTime; import java.util.*; @@ -290,15 +291,50 @@ public class MesWorkOrderService extends BaseMesService implements closeMesPrintQueue(bean.getWorkOrderNo(), bean.getOrganizeCode(), AuthUtilExt.getUserName()); } result.setWorkOrderStatus(bean.getWorkOrderStatus()); + //非排序关闭订单 需要关闭kitting + doCloseKittingOrder(bean,bean.getModifyUser()); + } updateMesWorkOrder(result,MesExtEnumUtil.WORK_ORDER_LOG_TYPE.UPDATE,0); - if (isSavePrintQueue) insertPrintQueue(result); - + if (isSavePrintQueue) { + insertPrintQueue(result); + //发布时 校验是否需要生成拉动单 + List list = new ArrayList<>(); + list.add(result); + doCreateKitting(list,result.getOrganizeCode()); + } return result; } - + private void doCloseKittingOrder(MesWorkOrder mesWorkOrder,String userName){ + String organizeCode = mesWorkOrder.getOrganizeCode(); + DdlPackBean pullOrderPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkOrderNo(),"mesWorkOrder",pullOrderPackBean); + List pullingOrderInfoList = pullingOrderInfoRepository.findByHqlWhere(pullOrderPackBean); + if (pullingOrderInfoList != null && !pullingOrderInfoList.isEmpty()) { + List infoList = pullingOrderInfoList.stream().filter(item -> item.getPullOrderStatus() != MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_50.getValue()).collect(Collectors.toList()); + + if (!infoList.isEmpty()) { + MesPullingOrderInfo info = infoList.get(0); + String pullCode = info.getPullCode(); + //查询出拉动组,判断是否需要关闭拉动单 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(pullCode,"pullCode",ddlPackBean); + List mesPartPullList = partPullRao.findByHqlWhere(ddlPackBean); + if (mesPartPullList!= null && !mesPartPullList.isEmpty()) { + MesPartPull mesPartPull = mesPartPullList.get(0); + String pullOrderCloseState = mesPartPull.getPullOrderCloseState(); + if (!StringUtils.isEmpty(pullOrderCloseState)){ + List closeState = Arrays.asList(pullOrderCloseState.split(",")); + if (closeState.contains(mesWorkOrder.getWorkOrderStatus().toString())){ + mesPullingOrderInfoRao.updateByProperties(new String[]{"workOrderNo"}, new Object[]{mesWorkOrder.getWorkOrderNo()}, new String[]{"pullOrderStatus","modifyUser"}, new Object[]{ MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_50,userName}); + } + } + } + } + } + } @Override protected void setPackQueryBean(MesWorkOrder bean, DdlPackBean packBean) { DdlPreparedPack.getStringLikerPack(bean.getWorkOrderNo(), MesExtConstWords.WORK_ORDER_NO, packBean); @@ -704,7 +740,7 @@ public class MesWorkOrderService extends BaseMesService implements ConvertBean.serviceModelInitialize(copyMesWorkOrder, item.getCreateUser()); index++; baseRDao.insert(copyMesWorkOrder); - workOrderListForKitting.add(copyMesWorkOrder); + //保存记录 MesWorkOrderLog workOrderLog = new MesWorkOrderLog(); BeanUtils.copyProperties(item, workOrderLog,MesExtConstWords.ID,MesExtConstWords.SYSTEM_SYNC_STATUS); @@ -726,6 +762,7 @@ public class MesWorkOrderService extends BaseMesService implements item.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); ConvertBean.serviceModelInitialize(item, item.getCreateUser()); baseRDao.insert(item); + workOrderListForKitting.add(item); index++; //保存记录 MesWorkOrderLog workOrderLog = new MesWorkOrderLog(); @@ -775,7 +812,11 @@ public class MesWorkOrderService extends BaseMesService implements //按成套圆整 } else if (mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_DOOR_PANELS_NUMBER.getValue()) { //按成套圆整 会是同一个拉动组 生成拉动单 - Map> groupCodeMap = workOrderMap.get(workCenterCode).stream().collect(Collectors.groupingBy(MesWorkOrder::getGroupCode)); + List workOrderList1 = workOrderMap.get(workCenterCode); + if (CollectionUtils.isEmpty(workOrderList1)) { + continue; + } + Map> groupCodeMap = workOrderList1.stream().collect(Collectors.groupingBy(MesWorkOrder::getGroupCode)); for (Long l : groupCodeMap.keySet()) { List workOrderList = groupCodeMap.get(l); List mesWorkCenters = workCenterMap.get(workCenterCode); @@ -805,9 +846,13 @@ public class MesWorkOrderService extends BaseMesService implements for (MesWorkOrder mesWorkOrder : workOrderListNew) { List bomList = getPlatBom(null, mesWorkOrder.getPartNo(), TimeTool.getNowTime(true), organizeCode); List collect = bomList.stream().filter(item -> pullPartNoList.contains(item.getItemPartNo())).collect(Collectors.toList()); + mesBomRDao.detachList(collect); collect.forEach(item -> item.setItemQty(item.getItemQty() * mesWorkOrder.getQty())); list.addAll(collect); } + if (list.isEmpty()){ + return; + } // 计算所有拉动单的数量,生成拉动单 String kittingOrderNoRuleCode = mesConfigService.getCfgValue(organizeCode, "KITTING_ORDER_NO_RULE_CODE"); GenSerialNoModel genSerialNoModel = new GenSerialNoModel(kittingOrderNoRuleCode); @@ -878,18 +923,19 @@ public class MesWorkOrderService extends BaseMesService implements List partNoList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPartNo).collect(Collectors.toList()); //深汕按照数量圆整 if (mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_BY_QUANTITY.getValue()){ - int packRoundQty = Integer.parseInt(mesPartPull.getPackRoundQty()); + int packRoundQty =(int)Double.parseDouble(mesPartPull.getPackRoundQty()); String partNo = workOrderListNew.get(0).getPartNo(); //打散bom List bomList = getPlatBom(null, partNo, TimeTool.getNowTime(true), organizeCode); //需要生成拉动单的零件 List bomPullList = bomList.stream().filter(item -> partNoList.contains(item.getItemPartNo())).collect(Collectors.toList()); + mesBomRDao.detachList(bomPullList); for (MesWorkOrder mesWorkOrder : workOrderListNew) { Double qty = mesWorkOrder.getQty(); bomPullList.forEach(item -> item.setItemQty(item.getItemQty() * qty)); DoubleSummaryStatistics summaryStatistics = bomPullList.stream().collect(Collectors.summarizingDouble(MesBom::getItemQty)); double max = summaryStatistics.getMax(); - int multiple = Integer.parseInt(String.valueOf(Math.ceil(max / packRoundQty))); //生成的拉动的数量 + int multiple = (int)Math.ceil(max / packRoundQty); //生成的拉动的数量 for (int i = 1; i <= multiple; i++) { insertPullOrderInfo( mesWorkOrder, bomPullList, mesPartPull, mesPartPullDetailList, organizeCode, i, packRoundQty); } @@ -932,6 +978,7 @@ public class MesWorkOrderService extends BaseMesService implements private void insertPullOrderInfo(MesWorkOrder mesWorkOrder,List bomPullList,MesPartPull mesPartPull,List mesPartPullDetailList,String organizeCode,int i, int roundPackQty){ // 计算所有拉动单的数量,生成拉动单 Map pullDetailMap = mesPartPullDetailList.stream().collect(Collectors.toMap(MesPartPullDetail::getPullPartNo, Function.identity())); + List pullDetailPartList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPullPartNo).collect(Collectors.toList()); String kittingOrderNoRuleCode = mesConfigService.getCfgValue(organizeCode, "KITTING_ORDER_NO_RULE_CODE"); GenSerialNoModel genSerialNoModel = new GenSerialNoModel(kittingOrderNoRuleCode); genSerialNoModel.setDynamicRule(mesPartPull.getPullCode()); @@ -953,10 +1000,13 @@ public class MesWorkOrderService extends BaseMesService implements pullingOrder.setCustPartNo(mesWorkOrder.getCustPartNo()); pullingOrder.setCarModelCode(mesWorkOrder.getCarModelCode()); pullingOrder.setOrderFlag(mesWorkOrder.getOrderFlag()); + ConvertBean.serviceModelInitialize(pullingOrder, AuthUtil.getSessionUser().getUserName()); mesPullingOrderInfoRao.insert(pullingOrder); - for (MesBom mesBom : bomPullList) { + List filterBomList = bomPullList.stream().filter(item -> pullDetailPartList.contains(item.getItemPartNo())).collect(Collectors.toList()); + for (MesBom mesBom : filterBomList) { MesPullingOrderPartInfo detail = new MesPullingOrderPartInfo(); + MesPartPullDetail mesPartPullDetail = pullDetailMap.get(mesBom.getItemPartNo()); detail.setOrganizeCode(organizeCode); detail.setPullCode(pullingOrder.getPullCode()); detail.setPullingOrderNo(pullingOrder.getPullingOrderNo()); @@ -966,12 +1016,15 @@ public class MesWorkOrderService extends BaseMesService implements detail.setPartNo(mesBom.getItemPartNo()); detail.setPartName(mesBom.getItemPartName()); double remainingQty = mesBom.getItemQty() - i * roundPackQty; + if (remainingQty < -roundPackQty){ + continue; + } detail.setPullQty(remainingQty > 0 ? roundPackQty : (mesBom.getItemQty() - (i-1) * roundPackQty)); detail.setCustOrderNo(pullingOrder.getCustOrderNo()); detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); detail.setWaterSeq(pullingOrder.getProductSeq()); - detail.setWorkCellCode(mesWorkOrder.getWorkCenterCode()); - detail.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1,未送料为0 + detail.setWorkCellCode(mesPartPullDetail.getWorkCellCode()); +// detail.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1,未送料为0 detail.setCustPartNo(pullingOrder.getCustPartNo()); detail.setCarSeries(pullDetailMap.get(mesBom.getItemPartNo()) == null ? "" : pullDetailMap.get(mesBom.getItemPartNo()).getCarSeries()); detail.setOrderFlag(pullingOrder.getOrderFlag()); diff --git a/modules/i3plus-ext-mes-apiservice/src/main/resources/application.properties b/modules/i3plus-ext-mes-apiservice/src/main/resources/application.properties index d72832f..43a2258 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/resources/application.properties +++ b/modules/i3plus-ext-mes-apiservice/src/main/resources/application.properties @@ -1,7 +1,7 @@ #\u9879\u76EE\u540D\u79F0 spring.application.name=i3mes #\u4F7F\u7528\u914D\u7F6E -spring.profiles.active=docker,cus-docker +spring.profiles.active=6,cus-71 ######### \u81EA\u5B9A\u4E49\u53C2\u6570 ######### #\u9879\u76EE\u63CF\u8FF0\u4FE1\u606F\uFF08swagger\u4E2D\u663E\u5F0F\uFF09\uFF0C\u4E2D\u6587\u4F7F\u7528uncode\u8F6C desc.application.name=\u751F\u4EA7\u6267\u884C\u7CFB\u7EDF From 277ebd94e72e0fa03dcedb7e877b4025dbc0a151 Mon Sep 17 00:00:00 2001 From: "castle.zang" Date: Tue, 11 Feb 2025 18:59:18 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=8B=89=E5=8A=A8?= =?UTF-8?q?=E5=8D=95=E6=95=B0=E6=8D=AE=E5=88=B0wms=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/groovy/MesKittingOrderToWms.groovy | 97 ++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 modules/i3plus-ext-mes-apiservice/src/groovy/MesKittingOrderToWms.groovy diff --git a/modules/i3plus-ext-mes-apiservice/src/groovy/MesKittingOrderToWms.groovy b/modules/i3plus-ext-mes-apiservice/src/groovy/MesKittingOrderToWms.groovy new file mode 100644 index 0000000..a507589 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/groovy/MesKittingOrderToWms.groovy @@ -0,0 +1,97 @@ +import cn.estsh.i3plus.platform.common.tool.TimeTool +import cn.estsh.i3plus.pojo.mes.dbinterface.MesInterfaceDataMapper +import cn.estsh.i3plus.pojo.mes.repository.MesPullingOrderInfoRepository +import cn.estsh.i3plus.pojo.mes.repository.MesPullingOrderPartInfoRepository +import lombok.Getter +import lombok.Setter +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate +import org.springframework.util.CollectionUtils +import cn.estsh.i3plus.platform.plugin.datasource.DynamicDataSourceProxy +import javax.annotation.Resource +import java.sql.Connection + +/** + * @Description :mes同步wms kitting拉动单 + * @Reference : + * @Author : castle + * @CreateDate 2024/7/5 10:43 + * @Modify: + * */ +class MesKittingOrderToWms { + + public static final Logger LOGGER = LoggerFactory.getLogger(MesKittingOrderToWms.class) + + + @Resource(name = "yfasDataSource") + private DynamicDataSourceProxy yfasDataSource; + + @Resource(name = "mesDataSource") + private DynamicDataSourceProxy mesDataSource; + + @Getter + @Setter + private Connection mesConn; + + @Resource + private MesPullingOrderPartInfoRepository mesPullingOrderPartInfoRao; + + @Resource + private MesPullingOrderInfoRepository mesPullingOrderInfoRao; + + def readData(MesInterfaceDataMapper mapper) throws Exception { + + LOGGER.info("-------- Read Start 读取kitting拉动单 ---------------") + List updateList = new ArrayList<>(); + Map params = new HashMap<>(); + String sql = "select * from " + mapper.getSrcTableName() + " where " + mapper.getSrcWhere() + " order by " + mapper.getSrcOrderBy() + " limit " + mapper.getSrcGetLimit() + //查询待同步的数据 + List> dataList = queryDataTable(sql, params); + List> result = new ArrayList<>(); + for (Map map in dataList){ + Map params1 = new HashMap<>(); + def pullingOrderNo = map.get("pulling_order_no") + def organizeCode = map.get("organize_code") + params1.put("pullingOrderNo",pullingOrderNo); + params1.put("srcOrganizeCode",organizeCode) + String detailSql = "select * from mes_pulling_order_part_info where organize_code = :srcOrganizeCode and pulling_order_no = :pullingOrderNo"; + List> dataDetailList = queryDataTable(detailSql, params1); + + for (Map detail in dataDetailList){ + Map params2 = new HashMap<>(); + def workOrderNo = map.get("work_order_no") + params2.put("workOrderNo",workOrderNo); + params2.put("srcOrganizeCode",organizeCode) + String workOrderSql = "select * from mes_work_order where organize_code = :srcOrganizeCode and work_order_no = :workOrderNo"; + List> workOrderList = queryDataTable(workOrderSql, params2) + def mesWorkOrder = workOrderList.get(0) + detail.put("pull_part_no",detail.get("part_no")) + detail.put("pull_part_name",detail.get("part_name")) + detail.put("part_no",map.get("part_no")) + detail.put("part_name",map.get("part_name")) + detail.put("work_center_code",map.get("work_center_code")) + detail.put("status",map.get("pull_order_status")) + detail.put("shift",mesWorkOrder.get("shift_code")+":"+mesWorkOrder.get("shift_name")) + result.add(detail); + } + updateList.add("update "+mapper.getSrcTableName()+" set system_sync_status=1 , system_sync_date_time = '"+ TimeTool.getNowTime(true)+"' where pulling_order_no= '" + pullingOrderNo + "' ;") + } + + //更新同步标识 + if (!CollectionUtils.isEmpty(updateList) && updateList.size() > 0) { + this.mesConn = mesDataSource.getWriteConnectionWithoutPool(); + mesDataSource.executeAsBatch(updateList, mesConn) + mesDataSource.closeConnectionWithoutPoll(this.mesConn) + } + return result; + } + + private List> queryDataTable(String sql, Map params) { + NamedParameterJdbcTemplate namedJdbcTemplate = new NamedParameterJdbcTemplate(mesDataSource.getDataSource()) + + List> dataMap = namedJdbcTemplate.queryForList(sql, params) + + return dataMap; + } +} \ No newline at end of file From 0f2dce838de21c679e542b8d8f3b8325aefc434e Mon Sep 17 00:00:00 2001 From: "castle.zang" Date: Tue, 18 Feb 2025 15:45:52 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E5=85=B3=E9=97=AD=E5=B7=A5=E5=8D=95?= =?UTF-8?q?=E6=97=B6=E9=9C=80=E8=A6=81=E6=A0=A1=E9=AA=8C=E6=8B=89=E5=8A=A8?= =?UTF-8?q?=E5=8D=95=E6=98=AF=E5=90=A6=E9=9C=80=E8=A6=81=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ac6ffd7..4d8237d 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 @@ -310,7 +310,7 @@ public class MesWorkOrderService extends BaseMesService implements private void doCloseKittingOrder(MesWorkOrder mesWorkOrder,String userName){ String organizeCode = mesWorkOrder.getOrganizeCode(); DdlPackBean pullOrderPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkOrderNo(),"mesWorkOrder",pullOrderPackBean); + DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkOrderNo(),"workOrderNo",pullOrderPackBean); List pullingOrderInfoList = pullingOrderInfoRepository.findByHqlWhere(pullOrderPackBean); if (pullingOrderInfoList != null && !pullingOrderInfoList.isEmpty()) { List infoList = pullingOrderInfoList.stream().filter(item -> item.getPullOrderStatus() != MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_50.getValue()).collect(Collectors.toList()); From af50e4cac23e16e7d5fad6c66ca93b884ebbff70 Mon Sep 17 00:00:00 2001 From: "castle.zang" Date: Tue, 18 Feb 2025 16:11:06 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E6=8F=92=E5=85=A5=E5=B7=A5=E5=8D=95?= =?UTF-8?q?=E6=97=B6=E4=B9=9F=E9=9C=80=E8=A6=81=E6=A0=A1=E9=AA=8C=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E7=94=9F=E4=BA=A7kitting=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java | 4 ++++ 1 file changed, 4 insertions(+) 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 4d8237d..87a5e38 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 @@ -242,6 +242,10 @@ public class MesWorkOrderService extends BaseMesService implements //非排序 } else if (bean.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) { insertUnSortWorkOrder(bean, mesWorkCenter); + //创建kitting + List kittingList = new ArrayList<>(); + kittingList.add(bean); + doCreateKitting(kittingList,bean.getOrganizeCode()); //bto } else { insertBtoWorkOrder(bean); From 975c4133c6eeb5fc3d2dce97d738632b4387404f Mon Sep 17 00:00:00 2001 From: "castle.zang" Date: Tue, 18 Feb 2025 17:27:25 +0800 Subject: [PATCH 07/10] =?UTF-8?q?kitting=E5=8D=95=E8=99=9A=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 87a5e38..e266462 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 @@ -1065,7 +1065,7 @@ public class MesWorkOrderService extends BaseMesService implements for (MesBom bom : bomList) { if (bom.getPartType() != null && bom.getPartType().equalsIgnoreCase("X")) { - getPlatBom(null,bom.getItemPartNo(), effectiveTime, organizeCode); + bomResultList.addAll(getPlatBom(null,bom.getItemPartNo(), effectiveTime, organizeCode)); } else { bom.setBomCode(bom.getBomCode().toLowerCase()); bomResultList.add(bom); From 52f362970a6794a576c7f03117ef5e3ff742909b Mon Sep 17 00:00:00 2001 From: "castle.zang" Date: Wed, 19 Feb 2025 13:11:33 +0800 Subject: [PATCH 08/10] =?UTF-8?q?kitting=20=E4=BF=AE=E5=A4=8D=E6=8B=89?= =?UTF-8?q?=E5=8A=A8=E7=BB=84=E6=98=8E=E7=BB=86=E5=8F=AF=E4=BB=A5=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E6=8B=89=E5=8A=A8=E9=9B=B6=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serviceimpl/base/MesWorkOrderService.java | 50 +++++++++++----------- 1 file changed, 26 insertions(+), 24 deletions(-) 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 e266462..4bae17e 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 @@ -981,7 +981,7 @@ public class MesWorkOrderService extends BaseMesService implements private void insertPullOrderInfo(MesWorkOrder mesWorkOrder,List bomPullList,MesPartPull mesPartPull,List mesPartPullDetailList,String organizeCode,int i, int roundPackQty){ // 计算所有拉动单的数量,生成拉动单 - Map pullDetailMap = mesPartPullDetailList.stream().collect(Collectors.toMap(MesPartPullDetail::getPullPartNo, Function.identity())); + Map> pullDetailMap = mesPartPullDetailList.stream().filter(item->!StringUtils.isEmpty(item.getPullPartNo())).collect(Collectors.groupingBy(MesPartPullDetail::getPullPartNo)); List pullDetailPartList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPullPartNo).collect(Collectors.toList()); String kittingOrderNoRuleCode = mesConfigService.getCfgValue(organizeCode, "KITTING_ORDER_NO_RULE_CODE"); GenSerialNoModel genSerialNoModel = new GenSerialNoModel(kittingOrderNoRuleCode); @@ -1010,30 +1010,32 @@ public class MesWorkOrderService extends BaseMesService implements List filterBomList = bomPullList.stream().filter(item -> pullDetailPartList.contains(item.getItemPartNo())).collect(Collectors.toList()); for (MesBom mesBom : filterBomList) { MesPullingOrderPartInfo detail = new MesPullingOrderPartInfo(); - MesPartPullDetail mesPartPullDetail = pullDetailMap.get(mesBom.getItemPartNo()); - detail.setOrganizeCode(organizeCode); - detail.setPullCode(pullingOrder.getPullCode()); - detail.setPullingOrderNo(pullingOrder.getPullingOrderNo()); - detail.setWorkOrderNo(pullingOrder.getWorkOrderNo()); - detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); - detail.setCustOrderNo(pullingOrder.getCustOrderNo()); - detail.setPartNo(mesBom.getItemPartNo()); - detail.setPartName(mesBom.getItemPartName()); - double remainingQty = mesBom.getItemQty() - i * roundPackQty; - if (remainingQty < -roundPackQty){ - continue; - } - detail.setPullQty(remainingQty > 0 ? roundPackQty : (mesBom.getItemQty() - (i-1) * roundPackQty)); - detail.setCustOrderNo(pullingOrder.getCustOrderNo()); - detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); - detail.setWaterSeq(pullingOrder.getProductSeq()); - detail.setWorkCellCode(mesPartPullDetail.getWorkCellCode()); + List mesPartPullDetailList1 = pullDetailMap.get(mesBom.getItemPartNo()); + for (MesPartPullDetail mesPartPullDetail : mesPartPullDetailList1) { + detail.setOrganizeCode(organizeCode); + detail.setPullCode(pullingOrder.getPullCode()); + detail.setPullingOrderNo(pullingOrder.getPullingOrderNo()); + detail.setWorkOrderNo(pullingOrder.getWorkOrderNo()); + detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + detail.setCustOrderNo(pullingOrder.getCustOrderNo()); + detail.setPartNo(mesBom.getItemPartNo()); + detail.setPartName(mesBom.getItemPartName()); + double remainingQty = mesBom.getItemQty() - i * roundPackQty; + if (remainingQty < -roundPackQty){ + continue; + } + detail.setPullQty(remainingQty > 0 ? roundPackQty : (mesBom.getItemQty() - (i-1) * roundPackQty)); + detail.setCustOrderNo(pullingOrder.getCustOrderNo()); + detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + detail.setWaterSeq(pullingOrder.getProductSeq()); + detail.setWorkCellCode(mesPartPullDetail.getWorkCellCode()); // detail.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1,未送料为0 - detail.setCustPartNo(pullingOrder.getCustPartNo()); - detail.setCarSeries(pullDetailMap.get(mesBom.getItemPartNo()) == null ? "" : pullDetailMap.get(mesBom.getItemPartNo()).getCarSeries()); - detail.setOrderFlag(pullingOrder.getOrderFlag()); - ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName()); - pullingOrderPartInfoRao.insert(detail); + detail.setCustPartNo(pullingOrder.getCustPartNo()); + detail.setCarSeries(mesPartPullDetail.getCarSeries() == null ? "" : mesPartPullDetail.getCarSeries()); + detail.setOrderFlag(pullingOrder.getOrderFlag()); + ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName()); + pullingOrderPartInfoRao.insert(detail); + } } } From 4a84cba2074705c65fb6ae8df27eb26d1ba2de4f Mon Sep 17 00:00:00 2001 From: "castle.zang" Date: Wed, 19 Feb 2025 17:01:42 +0800 Subject: [PATCH 09/10] =?UTF-8?q?kitting=20=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext/mes/api/base/IMesWorkOrderService.java | 6 +++ .../serviceimpl/base/MesWorkOrderService.java | 50 ++++++++++++++++++++-- 2 files changed, 52 insertions(+), 4 deletions(-) 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 bcf0461..8751358 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 @@ -74,4 +74,10 @@ public interface IMesWorkOrderService extends IBaseMesService { @ApiOperation(value = "BTO工单看板") List orderBoard(MesWorkOrderBoardReqModel workOrderBoardReqModel); + @ApiOperation(value = "根据工单状态改变--生成拉动单") + void doCreateKittingOrder(List workOrderListNew,MesPartPull mesPartPull,MesWorkCenter mesWorkCenter); + + @ApiOperation(value = "根据工单状态改变--关闭拉动但") + void doCloseKittingOrder(MesWorkOrder mesWorkOrder,String userName); + } 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 4bae17e..34011a5 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 @@ -297,6 +297,9 @@ public class MesWorkOrderService extends BaseMesService implements result.setWorkOrderStatus(bean.getWorkOrderStatus()); //非排序关闭订单 需要关闭kitting doCloseKittingOrder(bean,bean.getModifyUser()); + List list = new ArrayList<>(); + list.add(bean); + doCreateKitting(list,bean.getOrganizeCode()); } @@ -311,7 +314,7 @@ public class MesWorkOrderService extends BaseMesService implements return result; } - private void doCloseKittingOrder(MesWorkOrder mesWorkOrder,String userName){ + public void doCloseKittingOrder(MesWorkOrder mesWorkOrder,String userName){ String organizeCode = mesWorkOrder.getOrganizeCode(); DdlPackBean pullOrderPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkOrderNo(),"workOrderNo",pullOrderPackBean); @@ -782,7 +785,6 @@ public class MesWorkOrderService extends BaseMesService implements } private void doCreateKitting(List mesWorkOrderList,String organizeCode) { - //todo 在工单点击发布时,也需要重新触发拉动单,工单关闭时,也需要关闭拉动单 //1.拉动组获取 -- 根据拉动组类型获取kitting,需要判断是否生成是否生成拉动单开关 DdlPackBean partPullPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PART_PULL_ORDER_TYPE.KITTING_PULL.getValue(),"pullOrderType", partPullPackBean); @@ -808,10 +810,22 @@ public class MesWorkOrderService extends BaseMesService implements if (CollectionUtils.isEmpty(workOrderList) || CollectionUtils.isEmpty(mesWorkCenters)) { continue; } + //判断当前产线是否需要生成拉动单 + MesWorkCenter mesWorkCenter = mesWorkCenters.get(0); + Integer generateStatus = mesWorkCenter.getGenerateStatus(); + if (generateStatus == null){ + generateStatus = MesExtEnumUtil.GENERATE_STATUS.GENERATE_STATUS_20.getValue(); + } Map> orderMap = workOrderList.stream().collect(Collectors.groupingBy(MesWorkOrder::getPartNo)); for (String producePartNoAndTime : orderMap.keySet()) { List workOrderListNew = orderMap.get(producePartNoAndTime); - doCreateKittingOrder(workOrderListNew,mesPartPull,mesWorkCenters.get(0)); + Integer finalGenerateStatus = generateStatus; + //过滤掉不生成拉动单的工单 + workOrderListNew = workOrderListNew.stream().filter(item -> item.getWorkOrderStatus().equals(finalGenerateStatus)).collect(Collectors.toList()); + if (!workOrderListNew.isEmpty()) { + doCreateKittingOrder(workOrderListNew,mesPartPull,mesWorkCenter); + } + } //按成套圆整 } else if (mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_DOOR_PANELS_NUMBER.getValue()) { @@ -914,7 +928,7 @@ public class MesWorkOrderService extends BaseMesService implements } } - private void doCreateKittingOrder(List workOrderListNew,MesPartPull mesPartPull,MesWorkCenter mesWorkCenter) { + public void doCreateKittingOrder(List workOrderListNew,MesPartPull mesPartPull,MesWorkCenter mesWorkCenter) { String organizeCode = mesWorkCenter.getOrganizeCode(); //1.查询拉动组详情 DdlPackBean pullPartDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode); @@ -980,6 +994,13 @@ public class MesWorkOrderService extends BaseMesService implements } private void insertPullOrderInfo(MesWorkOrder mesWorkOrder,List bomPullList,MesPartPull mesPartPull,List mesPartPullDetailList,String organizeCode,int i, int roundPackQty){ + //校验当前工单是否已经生成过拉动单,如果已经生成过则不在生成 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkOrderNo(),"workOrderNo", ddlPackBean); + int count = mesPullingOrderInfoRao.findByHqlWhereCount(ddlPackBean); + if (count >0){ + return; + } // 计算所有拉动单的数量,生成拉动单 Map> pullDetailMap = mesPartPullDetailList.stream().filter(item->!StringUtils.isEmpty(item.getPullPartNo())).collect(Collectors.groupingBy(MesPartPullDetail::getPullPartNo)); List pullDetailPartList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPullPartNo).collect(Collectors.toList()); @@ -1323,6 +1344,8 @@ public class MesWorkOrderService extends BaseMesService implements @Override public void doProductReport(MesWorkOrder mesWorkOrder) { + //初始的工单状态 + Integer workOrderStatusInit = mesWorkOrder.getWorkOrderStatus(); MesWorkOrder mesWorkOrderDb = getMesWorkOrder(mesWorkOrder.getWorkOrderNo(),mesWorkOrder.getOrganizeCode()); mesWorkOrderDb.setDescription(mesWorkOrder.getDescription()); //查询物料信息 @@ -1372,6 +1395,14 @@ public class MesWorkOrderService extends BaseMesService implements mesWorkOrderDb.setRemark(mesWorkOrder.getRemark()); //更新工单 updateMesWorkOrder(mesWorkOrderDb,(MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrder.getReportType()) ? MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT : MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT_ADJUST,mesWorkOrder.getNum()); + + //2025/2/19 状态改变了需要校验是否生成拉动单,是否关闭拉动单 + if (!Objects.equals(mesWorkOrderDb.getWorkOrderStatus(), workOrderStatusInit)){ + doCloseKittingOrder(mesWorkOrderDb,mesWorkOrderDb.getModifyUser()); + List list = new ArrayList<>(); + list.add(mesWorkOrderDb); + doCreateKitting(list,mesWorkOrderDb.getOrganizeCode()); + } //试制单不报工 if(Objects.isNull(mesWorkOrderDb.getOrderFlag()) || !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(mesWorkOrderDb.getOrderFlag())){ String sn = getStringList(mesWorkOrder.getOrganizeCode(), AuthUtilExt.getUserName()); @@ -1570,6 +1601,17 @@ public class MesWorkOrderService extends BaseMesService implements //关闭工单 baseRDao.updateByProperties(new String[]{MesExtConstWords.MODIFY_USER, MesExtConstWords.MODIFY_DATE_TIME, MesExtConstWords.WORK_ORDER_STATUS, MesExtConstWords.SYSTEM_SYNC_STATUS}, new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()}, ddlPackBean); + + //关闭工单后校验是否生成拉动单,是否关闭拉动单 + List mesWorkOrderListNew = new ArrayList<>(); + for (MesWorkOrder mesWorkOrder : mesWorkOrderList) { + MesWorkOrder mesWorkOrderNew = new MesWorkOrder(); + BeanUtils.copyProperties(mesWorkOrder, mesWorkOrderNew); + mesWorkOrderNew.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()); + mesWorkOrderListNew.add(mesWorkOrderNew); + doCloseKittingOrder(mesWorkOrderNew,userName); + } + doCreateKitting(mesWorkOrderListNew,organizeCode); } From 8c98d36b161bc048a66423d4387aa189bda9ac5e Mon Sep 17 00:00:00 2001 From: "castle.zang" Date: Fri, 21 Feb 2025 09:39:10 +0800 Subject: [PATCH 10/10] =?UTF-8?q?kitting=20=E4=BF=AE=E5=A4=8D=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serviceimpl/base/MesWorkOrderService.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) 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 34011a5..8de2b19 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 @@ -335,7 +335,7 @@ public class MesWorkOrderService extends BaseMesService implements if (!StringUtils.isEmpty(pullOrderCloseState)){ List closeState = Arrays.asList(pullOrderCloseState.split(",")); if (closeState.contains(mesWorkOrder.getWorkOrderStatus().toString())){ - mesPullingOrderInfoRao.updateByProperties(new String[]{"workOrderNo"}, new Object[]{mesWorkOrder.getWorkOrderNo()}, new String[]{"pullOrderStatus","modifyUser"}, new Object[]{ MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_50,userName}); + mesPullingOrderInfoRao.updateByProperties(new String[]{"workOrderNo"}, new Object[]{mesWorkOrder.getWorkOrderNo()}, new String[]{"pullOrderStatus","modifyUser"}, new Object[]{ MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_50.getValue(),userName}); } } } @@ -785,6 +785,10 @@ public class MesWorkOrderService extends BaseMesService implements } private void doCreateKitting(List mesWorkOrderList,String organizeCode) { + mesWorkOrderList = mesWorkOrderList.stream().filter(item ->item.getPullingStatus()!=MesExtEnumUtil.WORK_ORDER_PULLING_STATUS.SUBMIT.getValue()).collect(Collectors.toList()); + if (mesWorkOrderList.isEmpty()){ + return; + } //1.拉动组获取 -- 根据拉动组类型获取kitting,需要判断是否生成是否生成拉动单开关 DdlPackBean partPullPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PART_PULL_ORDER_TYPE.KITTING_PULL.getValue(),"pullOrderType", partPullPackBean); @@ -957,6 +961,7 @@ public class MesWorkOrderService extends BaseMesService implements for (int i = 1; i <= multiple; i++) { insertPullOrderInfo( mesWorkOrder, bomPullList, mesPartPull, mesPartPullDetailList, organizeCode, i, packRoundQty); } + workOrderRepository.updateByProperties("workOrderNo",mesWorkOrder.getWorkOrderNo(),"pullingStatus",MesExtEnumUtil.WORK_ORDER_PULLING_STATUS.SUBMIT.getValue()); } // /** @@ -995,12 +1000,12 @@ public class MesWorkOrderService extends BaseMesService implements private void insertPullOrderInfo(MesWorkOrder mesWorkOrder,List bomPullList,MesPartPull mesPartPull,List mesPartPullDetailList,String organizeCode,int i, int roundPackQty){ //校验当前工单是否已经生成过拉动单,如果已经生成过则不在生成 - DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkOrderNo(),"workOrderNo", ddlPackBean); - int count = mesPullingOrderInfoRao.findByHqlWhereCount(ddlPackBean); - if (count >0){ - return; - } +// DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); +// DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkOrderNo(),"workOrderNo", ddlPackBean); +// int count = mesPullingOrderInfoRao.findByHqlWhereCount(ddlPackBean); +// if (count >0){ +// return; +// } // 计算所有拉动单的数量,生成拉动单 Map> pullDetailMap = mesPartPullDetailList.stream().filter(item->!StringUtils.isEmpty(item.getPullPartNo())).collect(Collectors.groupingBy(MesPartPullDetail::getPullPartNo)); List pullDetailPartList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPullPartNo).collect(Collectors.toList());