fangpy před 4 měsíci
rodič
revize
36b169cc4b

+ 30 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/controller/ApsSchedulingController.java

@@ -6,6 +6,9 @@ import com.rongwei.rwapsserver.aps.domain.EquipmentRunTime;
 import com.rongwei.rwapsserver.aps.domain.ProduceOrder;
 import com.rongwei.rwapsserver.aps.domain.ProductionProcesses;
 import com.rongwei.rwapsserver.aps.service.ProductionScheduleService;
+import com.rongwei.rwapsserver.aps.taskassigning.service.ProductionScheduleTaService;
+import com.rongwei.rwapsserver.aps.taskassigning.vo.ProductionScheduleRetTaVo;
+import com.rongwei.rwapsserver.aps.taskassigning.vo.ProductionScheduleTaVo;
 import com.rongwei.rwapsserver.aps.util.ApsException;
 import com.rongwei.rwapsserver.aps.vo.ProductionScheduleRetVo;
 import com.rongwei.rwapsserver.aps.vo.ProductionScheduleVo;
@@ -30,6 +33,8 @@ public class ApsSchedulingController {
 
     @Autowired
     private ProductionScheduleService productionScheduleService;
+    @Autowired
+    private ProductionScheduleTaService productionScheduleTaService;
 
     /**
      * 流程任务运行API
@@ -56,6 +61,31 @@ public class ApsSchedulingController {
         return productionScheduleRetVo;
     }
 
+    /**
+     * 流程任务运行API
+     * @param productionScheduleVo
+     * @return
+     */
+    @PostMapping("/productionLzDdSchedule")
+    public ProductionScheduleRetTaVo productionLzDdSchedule(@RequestBody ProductionScheduleTaVo productionScheduleVo) throws Exception{
+        ProductionScheduleRetTaVo productionScheduleRetVo = null;
+        try{
+            productionScheduleRetVo = productionScheduleTaService.productionSchedule(productionScheduleVo);
+            productionScheduleRetVo.setCode("200");
+        }catch(ApsException ae){
+            productionScheduleRetVo = new ProductionScheduleRetTaVo();
+            productionScheduleRetVo.setCode("500");
+            productionScheduleRetVo.setMsg(ae.getMessage());
+        }catch(Exception e){
+            e.printStackTrace();
+            log.error("排程平台异常:",e);
+            productionScheduleRetVo = new ProductionScheduleRetTaVo();
+            productionScheduleRetVo.setCode("500");
+            productionScheduleRetVo.setMsg("排程异常,请联系管理员");
+        }
+        return productionScheduleRetVo;
+    }
+
     /**
      * 退火任务运行API
      * @param productionScheduleVo

+ 32 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/taskassigning/tado/ApsConstraintListProvider.java

@@ -38,6 +38,7 @@ public class ApsConstraintListProvider implements ConstraintProvider {
                 deliveryDate(constraintFactory),
 //                expecteddays(constraintFactory),
                 seriesProduce(constraintFactory),
+                freeTimeEquipment(constraintFactory),
 //                seriesProduceWashingFurnace(constraintFactory),
 //                mergeTuihuo(constraintFactory),
 //                tuihuoSp(constraintFactory),
@@ -330,6 +331,37 @@ public class ApsConstraintListProvider implements ConstraintProvider {
         return daysBetween-deliveryMinDate;
     }
 
+    /**
+     * 设备生产的任务都在可选设备范围内
+     * @param constraintFactory
+     * @return
+     */
+    private Constraint freeTimeEquipment(ConstraintFactory constraintFactory) {
+        return constraintFactory.forEach(EquipmentTa.class)
+                .filter((equipment) -> {
+                    return true;
+                })
+                .penalize(HardMediumSoftScore.ONE_HARD,(equipment) -> {
+                    int b = 0;
+                    List<ProductionProcessesTa> tasks = new ArrayList<>();
+                    tasks.addAll(equipment.getTasks());
+
+                    if(tasks != null && tasks.size()>1){
+                        // 根据开始时间排序
+                        Collections.sort(tasks, Comparator.comparing(ProductionProcessesTa::getStartTime));
+                        for (int i = 0; i < tasks.size()-1; i++) {
+                            ProductionProcessesTa preTask = tasks.get(i);
+                            ProductionProcessesTa nextTask = tasks.get(i + 1);
+                            if(preTask.getEndTime().plusMinutes(60).compareTo(nextTask.getStartTime())<0){
+                                b = b + 20;
+                            }
+                        }
+                    }
+                    return b;
+                })
+                .asConstraint("freeTimeEquipment");
+    }
+
     /**
      * 连续生产约束条件,同一设备的连续生产标识一样的工序、尽量排在一起
      * 铸轧考虑换辊和立板