|
@@ -26,14 +26,16 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
|
|
|
return new Constraint[]{
|
|
|
// HARD
|
|
|
+// hasOnePreGbAfterNowNew(constraintFactory),
|
|
|
+// nextLockProNew(constraintFactory),
|
|
|
hasOnePreGbAfterNow(constraintFactory),
|
|
|
+ nextLockPro(constraintFactory),
|
|
|
eqTimeCross(constraintFactory),
|
|
|
seriesProduceTimeWait(constraintFactory),
|
|
|
seriesProduceWashTimeWait(constraintFactory),
|
|
|
equipmentRunTime(constraintFactory),
|
|
|
eqTimeCrossTuihuo(constraintFactory),
|
|
|
eqTimeCrossMinTuihuo(constraintFactory),
|
|
|
- nextLockPro(constraintFactory),
|
|
|
// twoLineZz(constraintFactory),
|
|
|
// MEDIUM
|
|
|
// deliveryDate(constraintFactory),
|
|
@@ -156,6 +158,50 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
.asConstraint("hasOnePreGbAfterNow");
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 单卷模式下前后道工序时间约束(新的等待时间调整)
|
|
|
+ * @param constraintFactory
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Constraint hasOnePreGbAfterNowNew(ConstraintFactory constraintFactory) {
|
|
|
+ return constraintFactory.forEach(ProductionProcesses.class)
|
|
|
+ .filter(productionProcesses -> {
|
|
|
+ boolean bln = false;
|
|
|
+ if(productionProcesses.getPreviousProcesses() != null && productionProcesses.getPreviousProcesses().size()>0){
|
|
|
+ // 此种情况简化为前道工序只有一个
|
|
|
+ for (ProductionProcesses previousProcess : productionProcesses.getPreviousProcesses()) {
|
|
|
+ ProductionProcesses preProcess = previousProcess;
|
|
|
+ // 流转时间(最小等待时间)
|
|
|
+ Integer lzTimes = 0;
|
|
|
+ if(preProcess.getEquipment() != null){
|
|
|
+ if(preProcess.getEquipment().getWorkshopid() != null && preProcess.getEquipment().getWorkshopid().equals(productionProcesses.getEquipment().getWorkshopid())){
|
|
|
+ lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
|
|
|
+ }else{
|
|
|
+ lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_CROSS");
|
|
|
+ }
|
|
|
+ // 最小等待时间对比流转时间
|
|
|
+ if(productionProcesses.getMinWaitTime() != null && lzTimes<productionProcesses.getMinWaitTime()){
|
|
|
+ lzTimes = productionProcesses.getMinWaitTime();
|
|
|
+ }
|
|
|
+ // 最大等待时间
|
|
|
+ Integer maxWaitTime = productionProcesses.getMaxWaitTime();
|
|
|
+ if(productionProcesses.getStartTime().compareTo(preProcess.getEndTime().plusMinutes(lzTimes))<0){
|
|
|
+ bln = true;
|
|
|
+ }
|
|
|
+ if(maxWaitTime != null && maxWaitTime>0){
|
|
|
+ if(productionProcesses.getStartTime().compareTo(preProcess.getEndTime().plusMinutes(maxWaitTime))>0){
|
|
|
+ bln = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return bln;
|
|
|
+ })
|
|
|
+ .penalize(HardMediumSoftScore.ONE_HARD,(productionProcesses) -> 40)
|
|
|
+ .asConstraint("hasOnePreGbAfterNow");
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 下道工序如果是锁定工序则判断是否下道工序时间在当前工序之后
|
|
|
* @param constraintFactory
|
|
@@ -203,6 +249,53 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
.asConstraint("nextLockPro");
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 下道工序如果是锁定工序则判断是否下道工序时间在当前工序之后(新的等待时间调整)
|
|
|
+ * @param constraintFactory
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Constraint nextLockProNew(ConstraintFactory constraintFactory) {
|
|
|
+ return constraintFactory.forEach(ProductionProcesses.class)
|
|
|
+ .filter(productionProcesses -> {
|
|
|
+ boolean bln = false;
|
|
|
+ List<ProductionProcesses> nextProcesses = productionProcesses.getNextProcesses();
|
|
|
+ if(nextProcesses != null && nextProcesses.size()>0){
|
|
|
+ // 当前工序结束时间
|
|
|
+ LocalDateTime preEndTime = productionProcesses.getEndTime();
|
|
|
+ // 获取下道工序最早开始时间
|
|
|
+ LocalDateTime earlyStartTime = null;
|
|
|
+ for (ProductionProcesses nextProcess : nextProcesses) {
|
|
|
+ if(nextProcess.getIfLock()){
|
|
|
+ // 下道工序开始时间
|
|
|
+ LocalDateTime startTime = nextProcess.getStartTime();
|
|
|
+ // 流转时间(最小等待时间)
|
|
|
+ Integer lzTimes = 0;
|
|
|
+ if(productionProcesses.getEquipment().getWorkshopid() != null && productionProcesses.getEquipment().getWorkshopid().equals(nextProcess.getEquipment().getWorkshopid())){
|
|
|
+ lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
|
|
|
+ }else{
|
|
|
+ lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_CROSS");
|
|
|
+ }
|
|
|
+ // 最小等待时间对比流转时间
|
|
|
+ if(nextProcess.getMinWaitTime() != null && lzTimes<nextProcess.getMinWaitTime()){
|
|
|
+ lzTimes = nextProcess.getMinWaitTime();
|
|
|
+ }
|
|
|
+ if(preEndTime.plusMinutes(lzTimes).compareTo(startTime)>0){
|
|
|
+ bln = true;
|
|
|
+ }
|
|
|
+ // 最大等待时间
|
|
|
+ Integer maxWaitTime = nextProcess.getMaxWaitTime();
|
|
|
+ if(maxWaitTime != null && maxWaitTime>0 && preEndTime.plusMinutes(maxWaitTime).compareTo(startTime)<0){
|
|
|
+ bln = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return bln;
|
|
|
+ })
|
|
|
+ .penalize(HardMediumSoftScore.ONE_HARD,(productionProcesses) -> 30)
|
|
|
+ .asConstraint("nextLockPro");
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 汇总所有下道工序的加工时间
|
|
|
* @param nextProcess
|
|
@@ -2096,6 +2189,9 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
}
|
|
|
})
|
|
|
.penalize(HardMediumSoftScore.ONE_MEDIUM,(equipmentId,processes)->{
|
|
|
+ if("0001be252874536843730b100176".equals(equipmentId) && processes.get(0).getDelay() == 1){
|
|
|
+ int a = 1;
|
|
|
+ }
|
|
|
// 已占用的
|
|
|
List<EquipmentRunTime> equipmentRunTimes = processes.get(0).getEquipment().getEquipmentRunTimes();
|
|
|
// 同一工序的优先组炉
|