fangpy 10 ヶ月 前
コミット
105e689550

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

@@ -50,4 +50,9 @@ public class ProduceOrder implements Serializable {
      */
     private Integer maxheatroll;
 
+    /**
+     * 除铸轧外期望交货天数
+     */
+    private Integer expecteddays;
+
 }

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

@@ -36,7 +36,8 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 nextLockPro(constraintFactory),
 //                twoLineZz(constraintFactory),
                 // MEDIUM
-                deliveryDate(constraintFactory),
+//                deliveryDate(constraintFactory),
+                expecteddays(constraintFactory),
                 seriesProduce(constraintFactory),
                 seriesProduceWashingFurnace(constraintFactory),
                 mergeTuihuo(constraintFactory),
@@ -119,9 +120,6 @@ public class ApsConstraintProvider implements ConstraintProvider {
     private Constraint hasOnePreGbAfterNow(ConstraintFactory constraintFactory) {
         return constraintFactory.forEach(ProductionProcesses.class)
                 .filter(productionProcesses -> {
-                    /*if(productionProcesses.getId().equals("2a231077b58844548c4a9d9e8f90f628")){
-                        int a = 1;
-                    }*/
                     boolean bln = false;
                     if(productionProcesses.getPreviousProcesses() != null && productionProcesses.getPreviousProcesses().size()>0){
                         // 此种情况简化为前道工序只有一个
@@ -1446,7 +1444,59 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 .asConstraint("deliveryDate");
     }
 
+    /**
+     * 软约束:交货日期,根据延迟交货日期的天数来做惩罚分数计算
+     * @param constraintFactory
+     * @return
+     */
+    private Constraint expecteddays(ConstraintFactory constraintFactory) {
+        return constraintFactory.forEach(ProductionProcesses.class)
+                .filter(productionProcesses -> productionProcesses.getNextProcesses() == null || productionProcesses.getNextProcesses().size() == 0)
+                .filter(productionProcesses -> {
+                    // 非最后一道工序或者最后一道工序没有排程时间的工序直接跳过
+                    if(productionProcesses.getEndTime() == null){
+                        return false;
+                    }
+                    Long expecteddays = expecteddaysCount(productionProcesses);
+                    if(expecteddays>0){
+                        return true;
+                    }else{
+                        return false;
+                    }
+                })
+                .penalize(HardMediumSoftScore.ONE_MEDIUM,(productionProcesses) ->{
+                    Long expecteddays = expecteddaysCount(productionProcesses);
+                    return (int)(expecteddays*10000);
+                })
+                .asConstraint("deliveryDate");
+    }
 
+    private Long expecteddaysCount(ProductionProcesses productionProcesses){
+        // 取最小订单交货天数
+        Integer deliveryMinDate = null;
+        for (ProduceOrder produceOrder : productionProcesses.getProduceOrder()) {
+            if(deliveryMinDate == null){
+                deliveryMinDate = produceOrder.getExpecteddays();
+            }else{
+                if(produceOrder.getExpecteddays() != null && produceOrder.getExpecteddays()<deliveryMinDate){
+                    deliveryMinDate = produceOrder.getExpecteddays();
+                }
+            }
+        }
+        if(deliveryMinDate == null){
+            deliveryMinDate = 15;
+        }
+        // 有铸轧的工序取铸轧后第一道工序开始时间,没有铸轧的直接取第一道工序开始时间
+        LocalDateTime startTime = null;
+        ProductionProcesses rooprocess = productionProcesses.getRooprocess();
+        if("铸轧".equals(rooprocess.getProcessType())){
+            startTime = rooprocess.getNextProcesses().get(0).getStartTime();
+        }else{
+            startTime = rooprocess.getStartTime();
+        }
+        long daysBetween = ChronoUnit.DAYS.between(startTime, productionProcesses.getEndTime());
+        return daysBetween-deliveryMinDate;
+    }
 
     /**
      * 均衡排产的软约束,任务尽量分配到不同设备上

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

@@ -80,4 +80,9 @@ public class ProductionScheduleVo {
      */
     private Integer pcspeed;
 
+    /**
+     * 除铸轧外期望交货天数
+     */
+    private Integer expecteddays;
+
 }