Pārlūkot izejas kodu

APS平台生产排程平台规划算法

fangpy 1 gadu atpakaļ
vecāks
revīzija
43ac8272cf

+ 8 - 2
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/ApsBalancingApplication.java

@@ -80,18 +80,24 @@ public class ApsBalancingApplication {
         // 工步初始化
         List<ProductionProcesses> processes = new ArrayList<>();
         // 订单初始化
-        ProduceOrder produceOrder1 = new ProduceOrder("order1","订单1", DateUtil.parseDateTime("2024-02-29 21:52:12"));
-        ProduceOrder produceOrder2 = new ProduceOrder("order2","订单2", DateUtil.parseDateTime("2024-02-29 19:20:12"));
+        ProduceOrder produceOrder1 = new ProduceOrder("order1","订单1", DateUtil.parseDateTime("2024-03-01 21:52:12"));
+        ProduceOrder produceOrder2 = new ProduceOrder("order2","订单2", DateUtil.parseDateTime("2024-03-01 19:20:12"));
         ProductionProcesses p1 = new ProductionProcesses(1,"均热炉",Arrays.asList(new ProduceOrder[]{produceOrder1}),10);
+        p1.setOptionalEquipments(Arrays.asList(new Long[]{1L,2L}));
         ProductionProcesses p2 = new ProductionProcesses(2,"卧式分切机",Arrays.asList(new ProduceOrder[]{produceOrder1}),12);
+        p2.setOptionalEquipments(Arrays.asList(new Long[]{3L,4L,5L}));
         ProductionProcesses p6 = new ProductionProcesses(6,"氮气保护退火炉",Arrays.asList(new ProduceOrder[]{produceOrder1,produceOrder2}),72);
+        p6.setOptionalEquipments(Arrays.asList(new Long[]{8L}));
         p6.setMergeProcessMark("tuihuolu");
         p1.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p2}));p2.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p1}));
         p2.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p6}));
         processes.add(p1);processes.add(p2);
         ProductionProcesses p3 = new ProductionProcesses(3,"均热炉",Arrays.asList(new ProduceOrder[]{produceOrder2}),10);
+        p3.setOptionalEquipments(Arrays.asList(new Long[]{1L,2L}));
         ProductionProcesses p4 = new ProductionProcesses(4,"卧式分切机",Arrays.asList(new ProduceOrder[]{produceOrder2}),12);
+        p4.setOptionalEquipments(Arrays.asList(new Long[]{3L,4L,5L}));
         ProductionProcesses p5 = new ProductionProcesses(5,"厚纵剪",Arrays.asList(new ProduceOrder[]{produceOrder2}),23);
+        p5.setOptionalEquipments(Arrays.asList(new Long[]{6L,7L}));
         p3.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p4}));p4.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p3}));
         p4.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p5}));p5.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p4}));
         p5.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p6}));p6.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p2,p5}));

+ 10 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/Equipment.java

@@ -14,6 +14,16 @@ import java.math.BigDecimal;
 @Data
 public class Equipment extends ApsAbstractPersistable{
 
+    /**
+     * 业务表订单工序ID
+     */
+    private String bsEquipmentId;
+
+    /**
+     * 设备名称
+     */
+    private String equipmentName;
+
     /**
      * 设备类型
      */

+ 1 - 1
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/ProduceOrder.java

@@ -18,7 +18,7 @@ public class ProduceOrder {
     }
 
     /**
-     * 通用标识属性
+     * 通用标识属性,可以存储业务表ID
      */
     private String id;
 

+ 26 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/ProductionProcesses.java

@@ -24,11 +24,21 @@ public class ProductionProcesses extends ApsAbstractPersistable{
         this.produceTime = produceTime;
     }
 
+    /**
+     * 业务表订单工序ID
+     */
+    private String bsProcessesId;
+
     /**
      * 设备类型
      */
     private String equipmentType;
 
+    /**
+     * 可选设备ID
+     */
+    private List<Long> optionalEquipments;
+
     /**
      * 工步生产时的设备
      */
@@ -251,4 +261,20 @@ public class ProductionProcesses extends ApsAbstractPersistable{
     public void setNextProcessesIds(List<Long> nextProcessesIds) {
         this.nextProcessesIds = nextProcessesIds;
     }
+
+    public String getBsProcessesId() {
+        return bsProcessesId;
+    }
+
+    public void setBsProcessesId(String bsProcessesId) {
+        this.bsProcessesId = bsProcessesId;
+    }
+
+    public List<Long> getOptionalEquipments() {
+        return optionalEquipments;
+    }
+
+    public void setOptionalEquipments(List<Long> optionalEquipments) {
+        this.optionalEquipments = optionalEquipments;
+    }
 }

+ 1 - 1
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintProvider.java

@@ -41,7 +41,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
     private Constraint eqTypeSame(ConstraintFactory constraintFactory) {
         return constraintFactory.forEach(ProductionProcesses.class)
                 .filter(productionProcesses -> {
-                    return !productionProcesses.getEquipmentType().equals(productionProcesses.getEquipment().getEquipmentType());
+                    return !productionProcesses.getOptionalEquipments().contains(productionProcesses.getEquipment().getId());
                 })
                 .penalize(HardSoftScore.ONE_HARD,(productionProcesses) -> 100)
                 .asConstraint("eqTypeSame");

+ 8 - 2
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/service/impl/ProductionScheduleServiceImpl.java

@@ -77,17 +77,23 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         List<ProductionProcesses> processes = new ArrayList<>();
         // 订单初始化
         ProduceOrder produceOrder1 = new ProduceOrder("order1","订单1", DateUtil.parseDateTime("2024-03-01 21:52:12"));
-        ProduceOrder produceOrder2 = new ProduceOrder("order2","订单2", DateUtil.parseDateTime("2024-03-01 23:20:12"));
-        ProductionProcesses p1 = new ProductionProcesses(1,"均热炉", Arrays.asList(new ProduceOrder[]{produceOrder1}),10);
+        ProduceOrder produceOrder2 = new ProduceOrder("order2","订单2", DateUtil.parseDateTime("2024-03-01 19:20:12"));
+        ProductionProcesses p1 = new ProductionProcesses(1,"均热炉",Arrays.asList(new ProduceOrder[]{produceOrder1}),10);
+        p1.setOptionalEquipments(Arrays.asList(new Long[]{1L,2L}));
         ProductionProcesses p2 = new ProductionProcesses(2,"卧式分切机",Arrays.asList(new ProduceOrder[]{produceOrder1}),12);
+        p2.setOptionalEquipments(Arrays.asList(new Long[]{3L,4L,5L}));
         ProductionProcesses p6 = new ProductionProcesses(6,"氮气保护退火炉",Arrays.asList(new ProduceOrder[]{produceOrder1,produceOrder2}),72);
+        p6.setOptionalEquipments(Arrays.asList(new Long[]{8L}));
         p6.setMergeProcessMark("tuihuolu");
         p1.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p2}));p2.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p1}));
         p2.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p6}));
         processes.add(p1);processes.add(p2);
         ProductionProcesses p3 = new ProductionProcesses(3,"均热炉",Arrays.asList(new ProduceOrder[]{produceOrder2}),10);
+        p3.setOptionalEquipments(Arrays.asList(new Long[]{1L,2L}));
         ProductionProcesses p4 = new ProductionProcesses(4,"卧式分切机",Arrays.asList(new ProduceOrder[]{produceOrder2}),12);
+        p4.setOptionalEquipments(Arrays.asList(new Long[]{3L,4L,5L}));
         ProductionProcesses p5 = new ProductionProcesses(5,"厚纵剪",Arrays.asList(new ProduceOrder[]{produceOrder2}),23);
+        p5.setOptionalEquipments(Arrays.asList(new Long[]{6L,7L}));
         p3.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p4}));p4.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p3}));
         p4.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p5}));p5.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p4}));
         p5.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p6}));p6.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p2,p5}));

+ 14 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/vo/ProductionScheduleVo.java

@@ -4,6 +4,7 @@ import com.rongwei.rwapsserver.aps.domain.Equipment;
 import com.rongwei.rwapsserver.aps.domain.ProductionProcesses;
 import lombok.Data;
 
+import java.util.Date;
 import java.util.List;
 
 //@Data
@@ -11,6 +12,11 @@ public class ProductionScheduleVo {
 
     private String productionScheduleId;
 
+    /**
+     * APS 排程计划开始时间
+     */
+    private Date apsPlanStartDate;
+
     /**
      * 生产工序集合
      */
@@ -45,4 +51,12 @@ public class ProductionScheduleVo {
     public void setEquipmentList(List<Equipment> equipmentList) {
         this.equipmentList = equipmentList;
     }
+
+    public Date getApsPlanStartDate() {
+        return apsPlanStartDate;
+    }
+
+    public void setApsPlanStartDate(Date apsPlanStartDate) {
+        this.apsPlanStartDate = apsPlanStartDate;
+    }
 }