|
@@ -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");
|
|
|
}
|
|
|
}
|