|
@@ -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;
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 均衡排产的软约束,任务尽量分配到不同设备上
|