ソースを参照

退火超出装炉量bug修改

fangpy 4 ヶ月 前
コミット
b2380f61d6

+ 55 - 3
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintListProvider.java

@@ -1575,7 +1575,7 @@ public class ApsConstraintListProvider implements ConstraintProvider {
      * @param constraintFactory
      * @return
      */
-    private Constraint deliveryDate(ConstraintFactory constraintFactory) {
+    /*private Constraint deliveryDate(ConstraintFactory constraintFactory) {
         return constraintFactory.forEach(Equipment.class)
                 .filter(equipment -> {
                     return true;
@@ -1585,10 +1585,10 @@ public class ApsConstraintListProvider implements ConstraintProvider {
                     List<ProductionProcesses> tasks = equipment.getTasks();
                     if(tasks != null && tasks.size()>0){
                         for (ProductionProcesses productionProcesses : tasks) {
-                            /*
+                            *//*
                                 获取最后一步工步的结束时间(最后一步工步的结束时间即此产品生产的实际结束时间)
                                 并且获取结束时间大于生产订单的交货日期
-                             */
+                             *//*
                             if(productionProcesses.getEndTime() == null){
                                 continue;
                             }
@@ -1610,12 +1610,64 @@ public class ApsConstraintListProvider implements ConstraintProvider {
                             if(bol){
                                 int i = (int) (DateUtil.between(deliveryMinDate, Date.from(productionProcesses.getEndTime().atZone(zoneId).toInstant()), DateUnit.MINUTE) + 1) * 10;
                                 b = b + i;
+                                if(i<0){
+                                    int testa = 0;
+                                }
                             }
                         }
                     }
                     return b;
                 })
                 .asConstraint("deliveryDate");
+    }*/
+
+    /**
+     * 软约束:交货日期,根据延迟交货日期的天数来做惩罚分数计算
+     * @param constraintFactory
+     * @return
+     */
+    private Constraint deliveryDate(ConstraintFactory constraintFactory) {
+        return constraintFactory.forEach(ProductionProcesses.class)
+                .filter(productionProcesses -> {
+                    /*
+                        获取最后一步工步的结束时间(最后一步工步的结束时间即此产品生产的实际结束时间)
+                        并且获取结束时间大于生产订单的交货日期
+                     */
+                    if(productionProcesses.getEndTime() == null){
+                        return false;
+                    }
+                    // 取最小订单交货日期
+                    Date deliveryMinDate = null;
+                    for (ProduceOrder produceOrder : productionProcesses.getProduceOrder()) {
+                        if(deliveryMinDate == null){
+                            deliveryMinDate = produceOrder.getDeliveryDate();
+                        }else{
+                            if(deliveryMinDate.compareTo(produceOrder.getDeliveryDate())>0){
+                                deliveryMinDate = produceOrder.getDeliveryDate();
+                            }
+                        }
+                    }
+                    if(deliveryMinDate == null){
+                        return false;
+                    }
+                    Boolean bol = productionProcesses.getEndTime().atZone(zoneId).toInstant().toEpochMilli()>deliveryMinDate.getTime();
+                    return bol;
+                })
+                .penalize(HardMediumSoftScore.ONE_MEDIUM,(productionProcesses) ->{
+                    Date deliveryMinDate = null;
+                    for (ProduceOrder produceOrder : productionProcesses.getProduceOrder()) {
+                        if(deliveryMinDate == null){
+                            deliveryMinDate = produceOrder.getDeliveryDate();
+                        }else{
+                            if(deliveryMinDate.compareTo(produceOrder.getDeliveryDate())>0){
+                                deliveryMinDate = produceOrder.getDeliveryDate();
+                            }
+                        }
+                    }
+                    int i = (int) (DateUtil.between(deliveryMinDate, Date.from(productionProcesses.getEndTime().atZone(zoneId).toInstant()), DateUnit.MINUTE) + 1) * 10;
+                    return i;
+                })
+                .asConstraint("deliveryDate");
     }
 
     /**

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

@@ -1868,7 +1868,15 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
             if(processesList1.get(0).getRooprocess() != null && processesList1.get(0).getRooprocess().getStartTime() != null){
                 // 按照铸轧开始时间排序
                 Collections.sort(processesList1,(p1,p2)->{
-                    return p1.getRooprocess().getStartTime().compareTo(p2.getRooprocess().getStartTime());
+                    int a = 0;
+                    if(p1.getRooprocess().getStartTime() == null){
+                        a = 1;
+                    } else if (p2.getRooprocess().getStartTime() == null) {
+                        a = -1;
+                    }else{
+                        a = p1.getRooprocess().getStartTime().compareTo(p2.getRooprocess().getStartTime());
+                    }
+                    return a;
                 });
                 for (int i = 0;i<processesList1.size();i++) {
                     ProductionProcesses productionProcesses = processesList1.get(i);

+ 5 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/taskassigning/TaskStartTimeListenerTa.java

@@ -112,6 +112,8 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
                     }
                 }
             }
+        }else{
+            previousLastEndTime = t.getApsOverallConfig().getStartTime();
         }
         if(t.getMinWaitTime() != null && t.getMinWaitTime()>0 && previousLastEndTime != null){
             previousLastEndTime = previousLastEndTime.plusMinutes(t.getMinWaitTime());
@@ -154,6 +156,9 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
 //                LocalDateTime startTime = calculateStartTime(update.getResource(), t, sourcePreviousTask, resourcePreviousEndTime, allTasks, currentResourcePreviousTasks);
 
                 LocalDateTime startTime = getEarlyStartTime(t, resource,allTasks);
+                if(resourcePreviousEndTime == null || startTime == null){
+                    int testa = 0;
+                }
                 if(resourcePreviousEndTime != null && resourcePreviousEndTime.compareTo(startTime)>0){
                     startTime = resourcePreviousEndTime;
                 }