Selaa lähdekoodia

APS规划平台代码初始化

fangpy 1 vuosi sitten
vanhempi
commit
38598072f0

+ 15 - 10
src/main/java/com/rongwei/aps/ApsBalancingApplication.java

@@ -36,7 +36,7 @@ public class ApsBalancingApplication {
     }
 
     private static void testAps(){
-        log.info("app start...");
+//        log.info("app start...");
         SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
                 .withSolutionClass(ApsSolution.class)
                 .withEntityClasses(ProductionProcesses.class)
@@ -49,7 +49,7 @@ public class ApsBalancingApplication {
         // Display the computer list
 //        System.out.println("\nComputers:\n" + unsolvedCloudBalance.toStringComputerList());
 
-        log.info("start to solve...");
+//        log.info("start to solve...");
         ApsSolution solvedBalance = solver.solve(getTestApsSolution());
         System.out.println(solvedBalance);
         // Display the result
@@ -79,18 +79,23 @@ public class ApsBalancingApplication {
         unsolvedCloudBalance.setEquipmentList(equipmentList);
         // 工步初始化
         List<ProductionProcesses> processes = new ArrayList<>();
-        ProduceOrder produceOrder1 = new ProduceOrder("order1","订单1", DateUtil.parseDateTime("2024-02-27 21:52:12"));
-        ProductionProcesses p1 = new ProductionProcesses(1,"均热炉",produceOrder1,100);
-        ProductionProcesses p2 = new ProductionProcesses(2,"卧式分切机",produceOrder1,121);
+        // 订单初始化
+        ProduceOrder produceOrder1 = new ProduceOrder("order1","订单1", DateUtil.parseDateTime("2024-02-28 21:52:12"));
+        ProduceOrder produceOrder2 = new ProduceOrder("order2","订单2", DateUtil.parseDateTime("2024-02-28 19:20:12"));
+        ProductionProcesses p1 = new ProductionProcesses(1,"均热炉",Arrays.asList(new ProduceOrder[]{produceOrder1}),10);
+        ProductionProcesses p2 = new ProductionProcesses(2,"卧式分切机",Arrays.asList(new ProduceOrder[]{produceOrder1}),12);
+        ProductionProcesses p6 = new ProductionProcesses(6,"氮气保护退火炉",Arrays.asList(new ProduceOrder[]{produceOrder1,produceOrder2}),72);
+        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);
-        ProduceOrder produceOrder2 = new ProduceOrder("order2","订单2", DateUtil.parseDateTime("2024-02-27 23:52:12"));
-        ProductionProcesses p3 = new ProductionProcesses(3,"均热炉",produceOrder2,100);
-        ProductionProcesses p4 = new ProductionProcesses(4,"卧式分切机",produceOrder2,121);
-        ProductionProcesses p5 = new ProductionProcesses(5,"厚纵剪",produceOrder2,131);
+        ProductionProcesses p3 = new ProductionProcesses(3,"均热炉",Arrays.asList(new ProduceOrder[]{produceOrder2}),10);
+        ProductionProcesses p4 = new ProductionProcesses(4,"卧式分切机",Arrays.asList(new ProduceOrder[]{produceOrder2}),12);
+        ProductionProcesses p5 = new ProductionProcesses(5,"厚纵剪",Arrays.asList(new ProduceOrder[]{produceOrder2}),23);
         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}));
-        processes.add(p3);processes.add(p4);processes.add(p5);
+        p5.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p6}));p6.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p2,p5}));
+        processes.add(p3);processes.add(p4);processes.add(p5);processes.add(p6);
         unsolvedCloudBalance.setProcessesList(processes);
         return unsolvedCloudBalance;
     }

+ 20 - 4
src/main/java/com/rongwei/aps/domain/ProductionProcesses.java

@@ -16,7 +16,7 @@ public class ProductionProcesses extends ApsAbstractPersistable{
 
     }
 
-    public ProductionProcesses(long id, String equipmentType, ProduceOrder produceOrder, Integer produceTime) {
+    public ProductionProcesses(long id, String equipmentType, List<ProduceOrder> produceOrder, Integer produceTime) {
         super(id);
         this.equipmentType = equipmentType;
         this.produceOrder = produceOrder;
@@ -41,7 +41,7 @@ public class ProductionProcesses extends ApsAbstractPersistable{
     /**
      * 所属的生产订单
      */
-    private ProduceOrder produceOrder;
+    private List<ProduceOrder> produceOrder;
 
     /**
      * 是否瓶颈工序
@@ -165,11 +165,11 @@ public class ProductionProcesses extends ApsAbstractPersistable{
         this.nextProcesses = nextProcesses;
     }
 
-    public ProduceOrder getProduceOrder() {
+    public List<ProduceOrder> getProduceOrder() {
         return produceOrder;
     }
 
-    public void setProduceOrder(ProduceOrder produceOrder) {
+    public void setProduceOrder(List<ProduceOrder> produceOrder) {
         this.produceOrder = produceOrder;
     }
 
@@ -196,4 +196,20 @@ public class ProductionProcesses extends ApsAbstractPersistable{
     public void setMaxWaitTime(Integer maxWaitTime) {
         this.maxWaitTime = maxWaitTime;
     }
+
+    public Boolean getBottleneck() {
+        return bottleneck;
+    }
+
+    public void setBottleneck(Boolean bottleneck) {
+        this.bottleneck = bottleneck;
+    }
+
+    public String getMergeProcessMark() {
+        return mergeProcessMark;
+    }
+
+    public void setMergeProcessMark(String mergeProcessMark) {
+        this.mergeProcessMark = mergeProcessMark;
+    }
 }

+ 40 - 15
src/main/java/com/rongwei/aps/score/ApsConstraintProvider.java

@@ -2,6 +2,8 @@ package com.rongwei.aps.score;
 
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.rongwei.aps.domain.ProduceOrder;
 import com.rongwei.aps.domain.ProductionProcesses;
 import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore;
 import org.optaplanner.core.api.score.stream.Constraint;
@@ -28,7 +30,8 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 hasPreGbAfterNow(constraintFactory),
                 eqTimeCross(constraintFactory),
                 deliveryDate(constraintFactory),
-                balancedEqUse(constraintFactory)
+                balancedEqUse(constraintFactory),
+//                mergeProcess(constraintFactory)
         };
     }
 
@@ -86,7 +89,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                             if(preLastMinTime == null){
                                 preLastMinTime = thisMinEndTime;
                             }else{
-                                if(previousProcess.getEndTime().compareTo(thisMinEndTime)>0){
+                                if(preLastMinTime.compareTo(thisMinEndTime)<0){
                                     preLastMinTime = thisMinEndTime;
                                 }
                             }
@@ -95,14 +98,15 @@ public class ApsConstraintProvider implements ConstraintProvider {
                                 if(preLastMaxTime == null){
                                     preLastMaxTime = thisMaxEndTime;
                                 }else{
-                                    if(previousProcess.getEndTime().compareTo(thisMinEndTime)>0){
-                                        preLastMinTime = thisMaxEndTime;
+                                    if(preLastMaxTime.compareTo(thisMinEndTime)>0){
+                                        preLastMaxTime = thisMaxEndTime;
                                     }
                                 }
                             }
                         }
                         boolean bln = productionProcesses.getStartTime().atZone(zoneId).toInstant().toEpochMilli() < preLastMinTime.atZone(zoneId).toInstant().toEpochMilli();
                         if(preLastMaxTime != null){
+                            System.out.println("preLastMaxTime != null");
                             bln = bln || productionProcesses.getStartTime().atZone(zoneId).toInstant().toEpochMilli() > preLastMaxTime.atZone(zoneId).toInstant().toEpochMilli();
                         }
                         return bln;
@@ -123,7 +127,10 @@ public class ApsConstraintProvider implements ConstraintProvider {
         return constraintFactory.forEach(ProductionProcesses.class)
                 .join(ProductionProcesses.class,Joiners.equal(ProductionProcesses::getEquipmentId))
                 .filter((proc1,proc2)->{
-                    if(proc1.getId() == proc2.getId()){
+//                    System.out.println("proc1-EquipmentId:"+proc1.getEquipmentId());
+//                    System.out.println("proc2-EquipmentId:"+proc2.getEquipmentId());
+                    if(proc1.getId() == proc2.getId() ||
+                            (StrUtil.isNotBlank(proc1.getMergeProcessMark()) && StrUtil.isNotBlank(proc2.getMergeProcessMark()) && proc1.getMergeProcessMark().equals(proc2.getMergeProcessMark()))){
                         return false;
                     }
                     Boolean b1 = (proc1.getStartTime().compareTo(proc2.getStartTime())<=0 && proc2.getStartTime().compareTo(proc1.getEndTime())<=0);
@@ -146,18 +153,26 @@ public class ApsConstraintProvider implements ConstraintProvider {
                         获取最后一步工步的结束时间(最后一步工步的结束时间即此产品生产的实际结束时间)
                         并且获取结束时间大于生产订单的交货日期
                      */
-                    Boolean bol = productionProcesses.getNextProcesses() == null &&
-                            productionProcesses.getEndTime().atZone(zoneId).toInstant().toEpochMilli()>productionProcesses.getProduceOrder().getDeliveryDate().getTime();
-                    if(bol){
-                        System.out.println("endTime:"+productionProcesses.getEndTime());
-                        System.out.println("deliveryDate:"+productionProcesses.getProduceOrder().getDeliveryDate());
+                    // 取最小订单交货日期
+                    Date deliveryMinDate = null;
+                    for (ProduceOrder produceOrder : productionProcesses.getProduceOrder()) {
+                        if(deliveryMinDate == null){
+                            deliveryMinDate = produceOrder.getDeliveryDate();
+                        }else{
+                            if(deliveryMinDate.compareTo(produceOrder.getDeliveryDate())>0){
+                                deliveryMinDate = produceOrder.getDeliveryDate();
+                            }
+                        }
                     }
+
+                    Boolean bol = productionProcesses.getNextProcesses() == null &&
+                            productionProcesses.getEndTime().atZone(zoneId).toInstant().toEpochMilli()>deliveryMinDate.getTime();
                     return bol;
                 })
                 .penalize(HardSoftScore.ONE_SOFT,
                         (productionProcesses) ->
-//                                100
-                                ((int)(DateUtil.between(productionProcesses.getProduceOrder().getDeliveryDate(), Date.from(productionProcesses.getEndTime().atZone(zoneId).toInstant()), DateUnit.MINUTE)+1)*50)
+                                100
+//                                ((int)(DateUtil.between(deliveryMinDate, Date.from(productionProcesses.getEndTime().atZone(zoneId).toInstant()), DateUnit.MINUTE)+1)*10)
                 )
                 .asConstraint("deliveryDate");
     }
@@ -186,10 +201,20 @@ public class ApsConstraintProvider implements ConstraintProvider {
      */
     private Constraint mergeProcess(ConstraintFactory constraintFactory){
         return constraintFactory.forEach(ProductionProcesses.class)
-                .filter((tc) -> {
-                    return true;
+                .join(ProductionProcesses.class,Joiners.equal(ProductionProcesses::getEquipmentId))
+                .filter((proc1,proc2)->{
+                    if(proc1.getId() != proc2.getId() &&
+                            (StrUtil.isNotBlank(proc1.getMergeProcessMark()) && StrUtil.isNotBlank(proc2.getMergeProcessMark()) && proc1.getMergeProcessMark().equals(proc2.getMergeProcessMark()))){
+                        if(proc1.getStartTime().compareTo(proc2.getStartTime()) == 0 && proc1.getEndTime().compareTo(proc2.getEndTime()) == 0){
+                            return false;
+                        }else{
+                            return true;
+                        }
+                    }else{
+                        return false;
+                    }
                 })
-                .penalize(HardSoftScore.ONE_SOFT,(productionProcesses) ->50)
+                .penalize(HardSoftScore.ONE_SOFT,(proc1,proc2)->50)
                 .asConstraint("mergeProcess");
     }
 }