From 54a22f043c7f340c908c0c210300033c4343350d Mon Sep 17 00:00:00 2001 From: sunjianxi <839419401@qq.com> Date: Mon, 30 Mar 2026 15:19:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BF=AE=E6=94=B9-sjx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/pojo/dto/StPdmPartDTO.java | 2 + .../controller/WorkOrderController.java | 2 +- .../scheduling/mapper/EquipAbilityMapper.xml | 4 +- .../scheduling/mapper/SameTroughMapper.xml | 4 +- .../scheduling/mapper/WorkOrderMapper.xml | 2 +- .../service/impl/WorkOrderServiceImpl.java | 267 ++++++++++-------- 6 files changed, 156 insertions(+), 125 deletions(-) diff --git a/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/dto/StPdmPartDTO.java b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/dto/StPdmPartDTO.java index ec984e7d..190b556c 100644 --- a/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/dto/StPdmPartDTO.java +++ b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/dto/StPdmPartDTO.java @@ -1,6 +1,7 @@ package org.springblade.wms.pojo.dto; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; import java.io.Serial; @@ -16,6 +17,7 @@ import java.util.Date; * @create 2025-12-16 13:09 **/ @Data +@JsonIgnoreProperties(ignoreUnknown = true) public class StPdmPartDTO implements Serializable { @Serial private static final long serialVersionUID = -8392387759431929168L; diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/WorkOrderController.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/WorkOrderController.java index 6e3b674e..11e7445c 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/WorkOrderController.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/WorkOrderController.java @@ -168,7 +168,7 @@ public class WorkOrderController extends BladeController { /** * 车间订单表 排产 */ - @PostMapping("/scheduling") + @GetMapping("/scheduling") @ApiOperationSupport(order = 6) @Operation(summary = "排产", description = "传入WorkOrder") public void scheduling() { diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/EquipAbilityMapper.xml b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/EquipAbilityMapper.xml index 2d81bdb3..e07c3c6a 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/EquipAbilityMapper.xml +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/EquipAbilityMapper.xml @@ -31,8 +31,8 @@ select * from MES_EQUIP_ABILITY is_deleted = 0 - - and work_center_id = #{param2.workCenterId} + + and work_center_name LIKE CONCAT('%', CONCAT(#{param2.workCenterName}, '%')) and equip_code = #{param2.equipCode} diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/SameTroughMapper.xml b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/SameTroughMapper.xml index 9e8b2cd8..c470e1a6 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/SameTroughMapper.xml +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/SameTroughMapper.xml @@ -55,8 +55,8 @@ FROM MES_YIELD_ORDER a LEFT JOIN DS_PART b ON a.PART_CODE = b.PART_CODE - LEFT JOIN DS_PART_VERSION d ON b.ID = d.PART_ID AND a.PART_VERSION = d.PART_VERSION AND a.PART_CODE = d.PART_CODE - LEFT JOIN MES_YIELD_ORDER_CRAFT c ON a.id = c.yo_id + INNER JOIN DS_PART_VERSION d ON b.ID = d.PART_ID AND a.PART_VERSION = d.PART_VERSION AND a.PART_CODE = d.PART_CODE + INNER JOIN MES_YIELD_ORDER_CRAFT c ON a.id = c.yo_id a.is_deleted = 0 AND c.WORK_CENTER_ID IS NOT NULL diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml index 9c01a6eb..db8b2540 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml @@ -291,7 +291,7 @@ AND cm.is_deleted = 0 LEFT JOIN MES_CERTIFICATE_TYPE ct ON cm.certificate_id = ct.id AND ct.is_deleted = 0 - LEFT JOIN BA_REL_TEAM_SET_USER tu ON ph.user_id = tu.user_id + LEFT JOIN BS_REL_TEAM_SET_USER tu ON ph.user_id = tu.user_id LEFT JOIN BS_TEAM_SET ts ON tu.team_set_id = ts.id WHERE ph.is_deleted = 0 AND ph.staff_type != 1 diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java index 036234bd..c311895e 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java @@ -63,6 +63,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.PrintWriter; +import java.io.StringWriter; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.ParseException; @@ -206,7 +208,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl> sintMap = sintList.stream().collect(Collectors.groupingBy(SintTempCurveEntity::getProcessId)); //计算cr值 - calculateCr(list); + //calculateCr(list); //根据作业中心将订单分组,并根据优先级、cr值、订单需求数量、计划下达时间4个维度进行组内排序 Map> map = list.stream() @@ -218,7 +220,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl { // 排序逻辑:优先级升序 → CR值降序 → 数量降序 → 时间升序 list1.sort(Comparator.comparingInt(YieldOrderEntity::getPriorityAps).reversed() - .thenComparing((e1, e2) -> e2.getCrValue().compareTo(e1.getCrValue())) + //.thenComparing((e1, e2) -> e2.getCrValue().compareTo(e1.getCrValue())) .thenComparingInt(YieldOrderEntity::getYpQty).reversed() .thenComparing(YieldOrderEntity::getReleaseDate)); return list1; @@ -226,7 +228,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl> planMap = dealCommonCraftOrders(); + Map> planMap = dealCommonCraftOrders(); //多线程排产 ExecutorService threadPool = new ThreadPoolExecutor( map.size(), map.size(), 0L, TimeUnit.MILLISECONDS, @@ -420,7 +422,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl list, Map personAbilityMap, Map mainProducerMap, - Map> planMap, + Map> planMap, Map processMap, Map> sintMap, Map workCenterMap, @@ -471,8 +473,8 @@ public class WorkOrderServiceImpl extends BaseServiceImpl 0 ? prevProcessEnd : workPlanList.get(workPlanList.size() - 1).getPlanEndTime(); } @@ -494,7 +496,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl> entry : equipAbilityMap.entrySet()) { + int partType = entry.getValue().get(0).getPartType(); //根据时间点获取所有设备资源 List equipResourceList = new ArrayList<>(); - if(order.getYieldType() == YieldOrderEnum.YIELD_TYPE_1.getCode()){ + if(partType == 0){ equipResourceList = equipResourceService.list(Wrappers.lambdaQuery() .eq(EquipResourceEntity::getCraftId, craft.getCaId()) .eq(EquipResourceEntity::getWorkCenterId, craft.getWorkCenterId()) .ge(EquipResourceEntity::getStartTime, dateTime) .eq(EquipResourceEntity::getIsUsed, 0) .in(EquipResourceEntity::getEquipOrder, entry.getKey())); - }else{ - if(order.getYieldType() == YieldOrderEnum.YIELD_TYPE_3.getCode()){ - equipResourceList = equipResourceService.list(Wrappers.lambdaQuery() - .eq(EquipResourceEntity::getCraftId, craft.getCaId()) - .eq(EquipResourceEntity::getWorkCenterId, craft.getWorkCenterId()) - .eq(EquipResourceEntity::getProcessId,craft.getPpsId()) - .ge(EquipResourceEntity::getStartTime, dateTime) - .eq(EquipResourceEntity::getIsUsed, 0) - .in(EquipResourceEntity::getEquipOrder, entry.getKey()) - .lt(EquipResourceEntity::getStartNum,part.getBlbDiameter()) - .ge(EquipResourceEntity::getEndNum,part.getBlbDiameter())); - }else{ - equipResourceList = equipResourceService.list(Wrappers.lambdaQuery() - .eq(EquipResourceEntity::getCraftId, craft.getCaId()) - .eq(EquipResourceEntity::getWorkCenterId, craft.getWorkCenterId()) - .eq(EquipResourceEntity::getProcessId,craft.getPpsId()) - .ge(EquipResourceEntity::getStartTime, dateTime) - .eq(EquipResourceEntity::getIsUsed, 0) - .in(EquipResourceEntity::getEquipOrder, entry.getKey()) - .lt(EquipResourceEntity::getStartNum,part.getExternalDiameter()) - .ge(EquipResourceEntity::getEndNum,part.getExternalDiameter())); - } - + }else if(partType == 1){ + equipResourceList = equipResourceService.list(Wrappers.lambdaQuery() + .eq(EquipResourceEntity::getCraftId, craft.getCaId()) + .eq(EquipResourceEntity::getWorkCenterId, craft.getWorkCenterId()) + .eq(EquipResourceEntity::getProcessId,craft.getPpsId()) + .ge(EquipResourceEntity::getStartTime, dateTime) + .eq(EquipResourceEntity::getIsUsed, 0) + .in(EquipResourceEntity::getEquipOrder, entry.getKey()) + .lt(EquipResourceEntity::getStartNum,part.getExternalDiameter()) + .ge(EquipResourceEntity::getEndNum,part.getExternalDiameter())); + }else if(partType == 2){ + equipResourceList = equipResourceService.list(Wrappers.lambdaQuery() + .eq(EquipResourceEntity::getCraftId, craft.getCaId()) + .eq(EquipResourceEntity::getWorkCenterId, craft.getWorkCenterId()) + .eq(EquipResourceEntity::getProcessId,craft.getPpsId()) + .ge(EquipResourceEntity::getStartTime, dateTime) + .eq(EquipResourceEntity::getIsUsed, 0) + .in(EquipResourceEntity::getEquipOrder, entry.getKey()) + .lt(EquipResourceEntity::getStartNum,part.getBlbDiameter()) + .ge(EquipResourceEntity::getEndNum,part.getBlbDiameter())); } if (CollectionUtils.isEmpty(equipResourceList)) { @@ -766,6 +766,8 @@ public class WorkOrderServiceImpl extends BaseServiceImpl> dealCommonCraftOrders() { + public Map> dealCommonCraftOrders() { log.info("处理前置公共工序开始!"); List commonCraftOrderList = yieldOrderService.selectCommonCraftOrderList(); - Map> planMap = new HashMap<>(); + Map> planMap = new HashMap<>(); if (CollectionUtils.isNotEmpty(commonCraftOrderList)) { //对订单进行排序,每5个相同workCenterId的为一组,实现负载均衡 commonCraftOrderList = sortByWorkcenterIdPer5Group(commonCraftOrderList); @@ -1263,8 +1268,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpllambdaQuery().eq(EquipAbilityEntity::getCraftId, 27)); BigDecimal standardProcessAbility = BigDecimal.valueOf(Integer.parseInt(equipAbility.getStandardProcessAbility())); - //获取所有空闲的公共工序资源 - List equipResourceList = equipResourceService.selectCommonCraftList(); + for (YieldOrderEntity order : commonCraftOrderList) { List workPlanList = new ArrayList<>(); //获取相关工序 @@ -1278,6 +1282,8 @@ public class WorkOrderServiceImpl extends BaseServiceImpl equipResourceList = equipResourceService.selectCommonCraftList(); for (int j = 0; j < equipResourceList.size(); j++) { if (i == j) { EquipResourceEntity equipResource = equipResourceList.get(j); @@ -1286,7 +1292,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl> workPlanMap = workPlanOldList.stream().collect(Collectors.groupingBy(WorkPlanEntity::getWoId)); for (Map.Entry> entry : workPlanMap.entrySet()) { + Long woId = entry.getKey(); List planList = entry.getValue(); Boolean isEnough = true; List resourceList = new ArrayList<>(); for (WorkPlanEntity workPlan : planList) { if (workPlan.getEquipResourceId() != null) { EquipResourceEntity equipResource = equipResourceService.getById(workPlan.getEquipResourceId()); + if(equipResource == null){ + continue; + } //判断剩余产能是否满足总产能 if (sumCapacity.compareTo(equipResource.getRestCapacity()) > 0) { isEnough = false; @@ -1413,7 +1423,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl orderCraftList = yieldOrderCraftService.list(Wrappers.lambdaQuery() .eq(YieldOrderCraftEntity::getYoId, yieldOrderEntity.getId()) @@ -1422,93 +1432,95 @@ public class WorkOrderServiceImpl extends BaseServiceImpl highIdentList = Arrays.asList(new String[]{"JHT", "JI", "JIX", "YH", "CC", "SATA"}); - if (StringUtils.isNotEmpty(order.getProductIdent()) && highIdentList.contains(order.getProductIdent())) { + //生产厂家 + if ("1".equals(sameTrough.getProducter()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getProducter()) && StringUtils.isNotEmpty(voOld.getProducter()) && !voNew.getProducter().equals(voOld.getProducter())) { isSameTrough2 = false; } - if (!(voNew.getPartCode().equals(voOld.getPartCode()) - && StringUtils.isNotEmpty(voNew.getProductIdent()) - && StringUtils.isNotEmpty(voOld.getProductIdent()) - && voNew.getProductIdent().equals(voOld.getProductIdent()))) { + //检验编号 + if ("1".equals(sameTrough.getInspectionCode()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getInspectionCode()) && StringUtils.isNotEmpty(voOld.getInspectionCode()) && !voNew.getInspectionCode().equals(voOld.getInspectionCode())) { isSameTrough2 = false; } - - } - if (isSameTrough2) { - for (Long resourceId : resourceList) { - EquipResourceEntity equipResource = equipResourceService.getById(resourceId); - //生成车间订单 - WorkPlanEntity workPlan = new WorkPlanEntity(); - workPlan.setPlanStartTime(equipResource.getStartTime()); - if ("0".equals(equipResource.getEquipType())) { - workPlan.setPlanEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().setScale(0, RoundingMode.CEILING).longValue())); - } else { - workPlan.setPlanEndTime(equipResource.getEndTime()); + //材料 + if ("1".equals(sameTrough.getMaterial()) && StringUtils.isNotEmpty(voNew.getMaterial()) && StringUtils.isNotEmpty(voOld.getMaterial()) && !voNew.getMaterial().equals(voOld.getMaterial())) { + isSameTrough2 = false; + } + //厚度 + if ("1".equals(sameTrough.getThickness()) && StringUtils.isNotEmpty(voNew.getThickness()) && StringUtils.isNotEmpty(voOld.getThickness()) && !voNew.getThickness().equals(voOld.getThickness())) { + isSameTrough2 = false; + } + //钝化 + if ("1".equals(sameTrough.getPassivation())) { + if (StringUtils.isNotEmpty(voNew.getPlate()) + && StringUtils.isNotEmpty(voOld.getPlate()) + && ((voNew.getPlate().contains("不钝化") + && !voOld.getPlate().contains("不钝化")) + || (voOld.getPlate().contains("不钝化") + && !voNew.getPlate().contains("不钝化")))) { + isSameTrough2 = false; } - workPlan.setWorkQty(order.getYpQty()); - workPlan.setCaId(craft.getCaId()); - workPlan.setPpsId(craft.getPpsId()); - workPlan.setMakeTeam(equipResource.getTeamId()); - workPlan.setWorkCenterId(craft.getWorkCenterId()); - workPlan.setOrders(craft.getProcessNo()); - workPlan.setWoId(order.getId()); - workPlan.setOem("0"); - workPlan.setTestQty(0); - workPlan.setQualifiedQty(0); - workPlan.setUnqualifiedQty(0); - workPlan.setScrapQty(0); - workPlan.setHourQuota((double)ChronoUnit.MINUTES.between(workPlan.getPlanStartTime(), workPlan.getPlanEndTime())); - workPlan.setEquipCode(equipResource.getEquipCode()); - workPlan.setEquipName(equipResource.getEquipName()); - workPlan.setEquipResourceId(equipResource.getId()); - workPlanList.add(workPlan); - - equipResource.setRestCapacity(equipResource.getRestCapacity().subtract(sumCapacity)); - equipResourceService.updateById(equipResource); - isSameTrough = true; } + //硬度 + if ("1".equals(sameTrough.getHardness()) && StringUtils.isNotEmpty(voNew.getHardness()) && StringUtils.isNotEmpty(voOld.getHardness()) && !voNew.getHardness().equals(voOld.getHardness())) { + isSameTrough2 = false; + } + //生产标识 + if ("1".equals(sameTrough.getProductIdent())) { + List highIdentList = Arrays.asList(new String[]{"JHT", "JI", "JIX", "YH", "CC", "SATA"}); + if (StringUtils.isNotEmpty(order.getProductIdent()) && highIdentList.contains(order.getProductIdent())) { + isSameTrough2 = false; + } + if (!(voNew.getPartCode().equals(voOld.getPartCode()) + && StringUtils.isNotEmpty(voNew.getProductIdent()) + && StringUtils.isNotEmpty(voOld.getProductIdent()) + && voNew.getProductIdent().equals(voOld.getProductIdent()))) { + isSameTrough2 = false; + } + } + if (isSameTrough2) { + for(Long resourceId : resourceList){ + EquipResourceEntity equipResource = equipResourceService.getById(resourceId); + //生成车间订单 + WorkPlanEntity workPlan = new WorkPlanEntity(); + workPlan.setPlanStartTime(equipResource.getStartTime()); + if ("0".equals(equipResource.getEquipType())) { + workPlan.setPlanEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().setScale(0, RoundingMode.CEILING).longValue())); + } else { + workPlan.setPlanEndTime(equipResource.getEndTime()); + } + workPlan.setWorkQty(0); + workPlan.setCaId(craft.getCaId()); + workPlan.setPpsId(craft.getPpsId()); + workPlan.setMakeTeam(equipResource.getTeamId()); + workPlan.setWorkCenterId(craft.getWorkCenterId()); + workPlan.setOrders(craft.getProcessNo()); + workPlan.setWoId(order.getId()); + workPlan.setOem("0"); + workPlan.setTestQty(0); + workPlan.setQualifiedQty(0); + workPlan.setUnqualifiedQty(0); + workPlan.setScrapQty(0); + workPlan.setHourQuota((double)ChronoUnit.MINUTES.between(workPlan.getPlanStartTime(), workPlan.getPlanEndTime())); + workPlan.setEquipCode(equipResource.getEquipCode()); + workPlan.setEquipName(equipResource.getEquipName()); + workPlan.setEquipResourceId(equipResource.getId()); + workPlanList.add(workPlan); + + equipResource.setRestCapacity(equipResource.getRestCapacity().subtract(sumCapacity)); + equipResourceService.updateById(equipResource); + isSameTrough = true; + } + } } + } } } @@ -1602,7 +1614,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl partRelationList = partRelationService.list(Wrappers.lambdaQuery().eq(PartRelationEntity::getPartId,part.getId())); + List childIds = partRelationList.stream().map(PartRelationEntity::getChildPartId).collect(Collectors.toList()); + List partCz = partService.list(Wrappers.lambdaQuery().in(BaseEntity::getId,childIds).eq(PartEntity::getSinTerType,DsPartConstant.SIN_TER_TYPE_CZ)); + if (partCz != null && partCz.size() > 0) { + double sumOfQuota = partCz.stream() + .mapToDouble(PartEntity::getQuota) // 调用 getQuota() 方法 + .sum(); + result = (38 + 3 * sumOfQuota) / 60; + } + } + return Math.ceil(result * order.getYpQty() + 2); + } + public static List mergeYieldOrderList(List originalList) { // 空值校验 if (originalList == null || originalList.isEmpty()) {