|
@@ -33,6 +33,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
equipmentRunTime(constraintFactory),
|
|
|
eqTimeCrossTuihuo(constraintFactory),
|
|
|
eqTimeCrossMinTuihuo(constraintFactory),
|
|
|
+// twoLineZz(constraintFactory),
|
|
|
// MEDIUM
|
|
|
deliveryDate(constraintFactory),
|
|
|
seriesProduce(constraintFactory),
|
|
@@ -40,8 +41,8 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
mergeTuihuo(constraintFactory),
|
|
|
sameEquipment(constraintFactory),
|
|
|
|
|
|
- processLzNear(constraintFactory),
|
|
|
- processBtNear(constraintFactory),
|
|
|
+// processLzNear(constraintFactory),
|
|
|
+// processBtNear(constraintFactory),
|
|
|
seriesZzLb(constraintFactory),
|
|
|
|
|
|
beforeThClose(constraintFactory),
|
|
@@ -119,7 +120,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
int a = 1;
|
|
|
}*/
|
|
|
boolean bln = false;
|
|
|
- /*if(productionProcesses.getPreviousProcesses() != null && productionProcesses.getPreviousProcesses().size()>0){
|
|
|
+ if(productionProcesses.getPreviousProcesses() != null && productionProcesses.getPreviousProcesses().size()>0){
|
|
|
// 此种情况简化为前道工序只有一个
|
|
|
for (ProductionProcesses previousProcess : productionProcesses.getPreviousProcesses()) {
|
|
|
ProductionProcesses preProcess = previousProcess;
|
|
@@ -147,8 +148,8 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }*/
|
|
|
- if(productionProcesses.getMaxWaitTime() != null && productionProcesses.getMaxWaitTime()>0
|
|
|
+ }
|
|
|
+ /*if(productionProcesses.getMaxWaitTime() != null && productionProcesses.getMaxWaitTime()>0
|
|
|
&& (productionProcesses.getNextProcesses() != null
|
|
|
// && productionProcesses.getNextProcesses().get(0).getIfLock()
|
|
|
&& productionProcesses.getNextProcesses().size()>0 && "成退,中退,小卷成退".contains(productionProcesses.getNextProcesses().get(0).getProcessType()))){
|
|
@@ -179,7 +180,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
+ }*/
|
|
|
return bln;
|
|
|
})
|
|
|
.penalize(HardMediumSoftScore.ONE_HARD,(productionProcesses) -> 40)
|
|
@@ -438,7 +439,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
})
|
|
|
.penalize(HardMediumSoftScore.ONE_MEDIUM,(equipmentId,processes)->{
|
|
|
int counNum = seriesZzLbCount(processes);
|
|
|
- return counNum*1000;
|
|
|
+ return counNum;
|
|
|
})
|
|
|
.asConstraint("seriesZzLb");
|
|
|
}
|
|
@@ -449,6 +450,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
if(processes != null && processes.size()>0){
|
|
|
equipment = processes.get(0).getEquipment();
|
|
|
}
|
|
|
+
|
|
|
List<ProductionProcesses> hasStartTimeProcess = processes.stream().filter(v -> v.getStartTime() != null).collect(Collectors.toList());
|
|
|
// 设备占用时间参与连续生产排程
|
|
|
if(equipment != null && equipment.getEquipmentRunTimes() != null && equipment.getEquipmentRunTimes().size()>0){
|
|
@@ -480,84 +482,110 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
pp.setApsOverallConfig(hasStartTimeProcess.get(0).getApsOverallConfig());
|
|
|
pp.setProduceTime(equipment.getOnceprocessmin());
|
|
|
pp.setConflictRoptions(new HashMap<>());
|
|
|
+ pp.setSinglerollweight(equipment.getLastSinglerollweight());
|
|
|
pp.setLastSerialLbWeight(equipment.getLastSerialLbWeight());
|
|
|
hasStartTimeProcess.add(0,pp);
|
|
|
}
|
|
|
+
|
|
|
+ // 周期立板已连续生产吨数
|
|
|
+ BigDecimal zqlb = new BigDecimal("0");
|
|
|
for(int i=0;i<hasStartTimeProcess.size()-1;i++){
|
|
|
- if(hasStartTimeProcess.get(i).getId() == null && hasStartTimeProcess.get(i).getId() == null){
|
|
|
- continue;
|
|
|
- }
|
|
|
ProductionProcesses prePro = hasStartTimeProcess.get(i);
|
|
|
ProductionProcesses nextPro = hasStartTimeProcess.get(i+1);
|
|
|
Map<String, String> conflictRoptions1 = prePro.getConflictRoptions();
|
|
|
Map<String, String> conflictRoptions2 = nextPro.getConflictRoptions();
|
|
|
+ /*if(equipment.getId().equals("0001be252874536843730b100052")){
|
|
|
+ int aa = 1;
|
|
|
+ if(processes.size() == 10){
|
|
|
+ aa = 2;
|
|
|
+ if(prePro.getId() != null && prePro.getId().equals("b99ce83b171948bf8728b735b1529986")){
|
|
|
+ aa = 3;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }*/
|
|
|
if(hasStartTimeProcess.get(i).getSeriesProduceMark() != null && hasStartTimeProcess.get(i+1).getSeriesProduceMark() != null){
|
|
|
- // 周期立板已连续生产吨数
|
|
|
- BigDecimal zqlb = new BigDecimal("0");
|
|
|
- if(!hasStartTimeProcess.get(i).getSeriesProduceMark().equals(hasStartTimeProcess.get(i+1).getSeriesProduceMark())){
|
|
|
- String[] serspre = hasStartTimeProcess.get(i).getSeriesProduceMark().split("\\^_\\^");
|
|
|
- String[] sersafter = hasStartTimeProcess.get(i+1).getSeriesProduceMark().split("\\^_\\^");
|
|
|
- // 换辊时长(分钟)
|
|
|
- int jgtime = hasStartTimeProcess.get(i).getCutfinishmin() + hasStartTimeProcess.get(i+1).getPrepressworkmin();
|
|
|
- // 立板时长(分钟)
|
|
|
- int standingtime = hasStartTimeProcess.get(i).getApsOverallConfig().getStandingtime()*60;
|
|
|
- // 周期立板最大重量
|
|
|
- Integer standingyield = hasStartTimeProcess.get(i).getApsOverallConfig().getStandingyield();
|
|
|
- BigDecimal standingyieldbig = new BigDecimal(standingyield);
|
|
|
- // 取最大值
|
|
|
- int maxTime = jgtime;
|
|
|
- if(standingtime>jgtime){
|
|
|
- maxTime = standingtime;
|
|
|
- }
|
|
|
- // 周期立板总重量统计
|
|
|
- if(zqlb.compareTo(new BigDecimal("0")) == 0){
|
|
|
- if(hasStartTimeProcess.get(i).getLastSerialLbWeight() != null){
|
|
|
- zqlb = hasStartTimeProcess.get(i).getLastSerialLbWeight();
|
|
|
- }else{
|
|
|
- zqlb = hasStartTimeProcess.get(i).getSinglerollweight();
|
|
|
- }
|
|
|
+ String[] serspre = hasStartTimeProcess.get(i).getSeriesProduceMark().split("\\^_\\^");
|
|
|
+ String[] sersafter = hasStartTimeProcess.get(i+1).getSeriesProduceMark().split("\\^_\\^");
|
|
|
+ // 换辊时长(分钟)
|
|
|
+ int jgtime = hasStartTimeProcess.get(i).getCutfinishmin() + hasStartTimeProcess.get(i+1).getPrepressworkmin();
|
|
|
+ // 立板时长(分钟)
|
|
|
+ int standingtime = hasStartTimeProcess.get(i).getApsOverallConfig().getStandingtime()*60;
|
|
|
+ // 周期立板最大重量
|
|
|
+ Integer standingyield = hasStartTimeProcess.get(i).getApsOverallConfig().getStandingyield();
|
|
|
+ BigDecimal standingyieldbig = new BigDecimal(standingyield);
|
|
|
+ // 取最大值
|
|
|
+ int maxTime = jgtime;
|
|
|
+ if(standingtime>jgtime){
|
|
|
+ maxTime = standingtime;
|
|
|
+ }
|
|
|
+ // 周期立板总重量统计
|
|
|
+ if(zqlb.compareTo(new BigDecimal("0")) == 0){
|
|
|
+ if(hasStartTimeProcess.get(i).getLastSerialLbWeight() != null){
|
|
|
+ zqlb = hasStartTimeProcess.get(i).getLastSerialLbWeight();
|
|
|
}else{
|
|
|
- zqlb = zqlb.add(hasStartTimeProcess.get(i).getSinglerollweight());
|
|
|
+ zqlb = hasStartTimeProcess.get(i).getSinglerollweight();
|
|
|
}
|
|
|
- // 周期立板剩余时间
|
|
|
- BigDecimal syLb = zqlb.divide(standingyieldbig, 2, RoundingMode.HALF_UP);
|
|
|
- Integer syLbTime = (syLb.multiply(hasStartTimeProcess.get(i).getSinglerollweight()).divide(new BigDecimal(hasStartTimeProcess.get(i).getProduceTime()), 2, RoundingMode.HALF_UP)).intValue()+1;
|
|
|
-
|
|
|
- if(serspre.length == 5 && sersafter.length == 5){
|
|
|
- // 合金不同则需要换辊和立板
|
|
|
- if(!serspre[0].equals(sersafter[0]) || !serspre[1].equals(sersafter[1])){
|
|
|
- if(hasStartTimeProcess.get(i).getEndTime().plusMinutes(maxTime).plusMinutes(syLbTime).compareTo(hasStartTimeProcess.get(i+1).getStartTime())>0){
|
|
|
+ }else{
|
|
|
+ zqlb = zqlb.add(hasStartTimeProcess.get(i).getSinglerollweight());
|
|
|
+ }
|
|
|
+ // 周期立板剩余时间
|
|
|
+ BigDecimal syLb = standingyieldbig.subtract(zqlb);
|
|
|
+ Integer syLbTime = (syLb.multiply(new BigDecimal(hasStartTimeProcess.get(i).getProduceTime()).divide(hasStartTimeProcess.get(i).getSinglerollweight(), 2, RoundingMode.HALF_UP)).intValue()+1);
|
|
|
+ // 铸轧立板是否连续
|
|
|
+ boolean lbserice = true;
|
|
|
+ if(serspre.length == 5 && sersafter.length == 5){
|
|
|
+ // 合金不同则需要换辊和立板
|
|
|
+ if(!serspre[0].equals(sersafter[0]) || !serspre[1].equals(sersafter[1])){
|
|
|
+ if(hasStartTimeProcess.get(i).getEndTime().plusMinutes(maxTime).plusMinutes(syLbTime).compareTo(hasStartTimeProcess.get(i+1).getStartTime())>0){
|
|
|
+ // 只有存在当前排程的作业才会记录扣分数
|
|
|
+ if(nextPro.getId() != null){
|
|
|
b++;
|
|
|
- conflictRoptions1.put("soft-seriesZzLb","和下道工序没有预留足够的周期立板时间");
|
|
|
- conflictRoptions2.put("soft-seriesZzLb","和下道工序没有预留足够的周期立板时间");
|
|
|
- zqlb = new BigDecimal("0");
|
|
|
+ conflictRoptions2.put("soft-seriesZzLb","和上道工序没有预留足够的周期立板时间");
|
|
|
}
|
|
|
- }else{
|
|
|
- // 合金相同情况下后面的宽度大于前面的宽度需要换辊和立板
|
|
|
- // 合金相同情况下后面的宽度小于前面的宽度需要立板
|
|
|
- // 合金相同情况下后面的宽度等于前面的宽度换辊和立板都不需要
|
|
|
- String s1 = serspre[2];
|
|
|
- String s2 = sersafter[2];
|
|
|
- try{
|
|
|
- BigDecimal i1 = new BigDecimal(s1);
|
|
|
- BigDecimal i2 = new BigDecimal(s2);
|
|
|
- if(i1.compareTo(i2)<0){
|
|
|
- if(hasStartTimeProcess.get(i).getEndTime().plusMinutes(maxTime).plusMinutes(syLbTime).compareTo(hasStartTimeProcess.get(i+1).getStartTime())>0){
|
|
|
+ }
|
|
|
+ zqlb = new BigDecimal("0");
|
|
|
+ lbserice = false;
|
|
|
+ }else{
|
|
|
+ // 合金相同情况下后面的宽度大于前面的宽度需要换辊和立板
|
|
|
+ // 合金相同情况下后面的宽度小于前面的宽度需要立板
|
|
|
+ // 合金相同情况下后面的宽度等于前面的宽度换辊和立板都不需要
|
|
|
+ String s1 = serspre[2];
|
|
|
+ String s2 = sersafter[2];
|
|
|
+ try{
|
|
|
+ BigDecimal i1 = new BigDecimal(s1);
|
|
|
+ BigDecimal i2 = new BigDecimal(s2);
|
|
|
+ if(i1.compareTo(i2)<0){
|
|
|
+ if(hasStartTimeProcess.get(i).getEndTime().plusMinutes(maxTime).plusMinutes(syLbTime).compareTo(hasStartTimeProcess.get(i+1).getStartTime())>0){
|
|
|
+ if(nextPro.getId() != null){
|
|
|
b++;
|
|
|
- conflictRoptions1.put("soft-seriesZzLb","和下道工序没有预留足够的周期立板时间");
|
|
|
- conflictRoptions2.put("soft-seriesZzLb","和下道工序没有预留足够的周期立板时间");
|
|
|
- zqlb = new BigDecimal("0");
|
|
|
+ conflictRoptions2.put("soft-seriesZzLb","和上道工序没有预留足够的周期立板时间");
|
|
|
}
|
|
|
- }else if(i1.compareTo(i2)>0){
|
|
|
- if(hasStartTimeProcess.get(i).getEndTime().plusMinutes(standingtime).plusMinutes(syLbTime).compareTo(hasStartTimeProcess.get(i+1).getStartTime())>0){
|
|
|
+ }
|
|
|
+ zqlb = new BigDecimal("0");
|
|
|
+ lbserice = false;
|
|
|
+ }else if(i1.compareTo(i2)>0){
|
|
|
+ if(hasStartTimeProcess.get(i).getEndTime().plusMinutes(standingtime).plusMinutes(syLbTime).compareTo(hasStartTimeProcess.get(i+1).getStartTime())>0){
|
|
|
+ if(nextPro.getId() != null){
|
|
|
b++;
|
|
|
- conflictRoptions1.put("soft-seriesZzLb","和下道工序没有预留足够的周期立板时间");
|
|
|
- conflictRoptions2.put("soft-seriesZzLb","和下道工序没有预留足够的周期立板时间");
|
|
|
- zqlb = new BigDecimal("0");
|
|
|
+ conflictRoptions2.put("soft-seriesZzLb","和上道工序没有预留足够的周期立板时间");
|
|
|
}
|
|
|
}
|
|
|
- }catch (Exception e){
|
|
|
- e.printStackTrace();
|
|
|
+ zqlb = new BigDecimal("0");
|
|
|
+ lbserice = false;
|
|
|
+ }
|
|
|
+ }catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 判断是否满足立板周期连续
|
|
|
+ if(lbserice){
|
|
|
+ if(syLb.compareTo(nextPro.getSinglerollweight())<0){
|
|
|
+ zqlb = new BigDecimal("0");
|
|
|
+ if(hasStartTimeProcess.get(i).getEndTime().plusMinutes(standingtime).compareTo(hasStartTimeProcess.get(i+1).getStartTime())>0){
|
|
|
+ if(nextPro.getId() != null){
|
|
|
+ b++;
|
|
|
+ conflictRoptions2.put("soft-seriesZzLb","和上道工序没有预留足够的周期立板时间");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -873,6 +901,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
if(equipment != null && equipment.getEquipmentRunTimes() != null && equipment.getEquipmentRunTimes().size()>0){
|
|
|
for (EquipmentRunTime equipmentRunTime : equipment.getEquipmentRunTimes()) {
|
|
|
ProductionProcesses pp = new ProductionProcesses();
|
|
|
+ pp.setId("equipmentRunTime-"+UUID.randomUUID());
|
|
|
pp.setStartTime(equipmentRunTime.getStartRunTime());
|
|
|
pp.setEquipment(equipment);
|
|
|
pp.setEndTime(equipmentRunTime.getEndRunTime());
|
|
@@ -1086,6 +1115,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
if(equipment != null && equipment.getEquipmentRunTimes() != null && equipment.getEquipmentRunTimes().size()>0){
|
|
|
for (EquipmentRunTime equipmentRunTime : equipment.getEquipmentRunTimes()) {
|
|
|
ProductionProcesses pp = new ProductionProcesses();
|
|
|
+ pp.setId("equipmentRunTime-"+UUID.randomUUID());
|
|
|
pp.setStartTime(equipmentRunTime.getStartRunTime());
|
|
|
pp.setEquipment(equipment);
|
|
|
pp.setEndTime(equipmentRunTime.getEndRunTime());
|
|
@@ -1171,6 +1201,9 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
if(v.size()>2){
|
|
|
int a = 1;
|
|
|
}
|
|
|
+ if(processes.size()>1){
|
|
|
+ int a = 1;
|
|
|
+ }
|
|
|
BigDecimal totalWidth = new BigDecimal("0");
|
|
|
BigDecimal totalWeight = new BigDecimal("0");
|
|
|
Set<String> metalSet = new HashSet<>();
|
|
@@ -1460,14 +1493,17 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
if(processes != null && processes.size()>0){
|
|
|
equipment = processes.get(0).getEquipment();
|
|
|
}
|
|
|
- /*if(equipment.getId().equals("0001be252874536843730b100151")){
|
|
|
+ if(equipment.getId().equals("0001be252874536843730b100124")){
|
|
|
int abc = 1;
|
|
|
- }*/
|
|
|
+ if(processes.get(0).getDelay() == 100){
|
|
|
+ int abcd = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
List<ProductionProcesses> hasStartTimeProcess = processes.stream().filter(v -> v.getStartTime() != null).collect(Collectors.toList());
|
|
|
if(hasStartTimeProcess != null && hasStartTimeProcess.size()>0){
|
|
|
- if(hasStartTimeProcess.get(0).getApsStatus().equals("CH") && hasStartTimeProcess.get(0).getProcessType().equals("冷轧")){
|
|
|
+ /*if(hasStartTimeProcess.get(0).getApsStatus().equals("CH") && hasStartTimeProcess.get(0).getProcessType().equals("冷轧")){
|
|
|
return b;
|
|
|
- }
|
|
|
+ }*/
|
|
|
// 设备占用时间参与连续生产排程
|
|
|
if(equipment != null && equipment.getEquipmentRunTimes() != null && equipment.getEquipmentRunTimes().size()>0){
|
|
|
for (EquipmentRunTime equipmentRunTime : equipment.getEquipmentRunTimes()) {
|
|
@@ -2102,6 +2138,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
if(equipment != null && equipment.getEquipmentRunTimes() != null && equipment.getEquipmentRunTimes().size()>0){
|
|
|
for (EquipmentRunTime equipmentRunTime : equipment.getEquipmentRunTimes()) {
|
|
|
ProductionProcesses pp = new ProductionProcesses();
|
|
|
+ pp.setId("equipmentRunTime"+UUID.randomUUID());
|
|
|
pp.setStartTime(equipmentRunTime.getStartRunTime());
|
|
|
pp.setEquipment(equipment);
|
|
|
pp.setEndTime(equipmentRunTime.getEndRunTime());
|
|
@@ -2229,4 +2266,30 @@ public class ApsConstraintProvider implements ConstraintProvider {
|
|
|
}
|
|
|
return b;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 硬约束:铸轧最多排2条线
|
|
|
+ * @param constraintFactory
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Constraint twoLineZz(ConstraintFactory constraintFactory) {
|
|
|
+ return constraintFactory.forEach(ProductionProcesses.class)
|
|
|
+ .filter(pro->{
|
|
|
+ return pro.getProcessType().equals("铸轧");
|
|
|
+ })
|
|
|
+ .groupBy(ProductionProcesses::getUniqueBsProcessesId,ConstraintCollectors.toList())
|
|
|
+ .filter((bsProcessesId,processes) -> {
|
|
|
+ if(processes != null && processes.size()>0){
|
|
|
+ Map<String, List<ProductionProcesses>> listMap = processes.stream().collect(Collectors.groupingBy(ProductionProcesses::getEquipmentId));
|
|
|
+ if(listMap.size()>2){
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ })
|
|
|
+ .penalize(HardMediumSoftScore.ONE_HARD,(bsProcessesId,processes)->{
|
|
|
+ return 50;
|
|
|
+ })
|
|
|
+ .asConstraint("twoLineZz");
|
|
|
+ }
|
|
|
}
|