|
@@ -477,10 +477,13 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
}
|
|
|
|
|
|
private LocalDateTime startTimeNewSet(ProductionProcesses process,ScoreDirector<ApsSolution> scoreDirector){
|
|
|
- if(process.getBsProcessesId().get(0).equals("f47f18cac31045f8bb41a9d2c670bd6a")){
|
|
|
+ if(process.getBsProcessesId().get(0).equals("aade5e53bbee45a78cc8c3999aba8a39")){
|
|
|
// System.out.println(process);
|
|
|
int a = 0;
|
|
|
}
|
|
|
+ if(process.getId().equals("2bf2e11039234f608730ac417e53008f")){
|
|
|
+ int a = 0;
|
|
|
+ }
|
|
|
// 获取所有规划实体对象数据
|
|
|
ApsSolution workingSolution = scoreDirector.getWorkingSolution();
|
|
|
// 时间设定
|
|
@@ -544,6 +547,9 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
copy.setTotalSinglerollweight(equipmentRunTime.getTotalSinglerollweight());
|
|
|
copy.setOccupyType(equipmentRunTime.getOccupyType());
|
|
|
copy.setLocked(true);
|
|
|
+ copy.setSeriesProduceMark(equipmentRunTime.getSeriesProduceMark());
|
|
|
+ copy.setCutfinishmin(equipmentRunTime.getCutfinishmin() == null ? 0 : equipmentRunTime.getCutfinishmin());
|
|
|
+ copy.setPrepressworkmin(equipmentRunTime.getPrepressworkmin() == null ? 0 : equipmentRunTime.getPrepressworkmin());
|
|
|
equipmentRunTimes.add(copy);
|
|
|
}
|
|
|
}
|
|
@@ -624,7 +630,8 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
equipmentRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
|
|
|
// 有交叉的时间直接跳过,退火工序特殊处理
|
|
|
if(equipmentRunTimes.size()>0){
|
|
|
- for (EquipmentRunTime equipmentRunTime : equipmentRunTimes) {
|
|
|
+ for(int i = 0; i < equipmentRunTimes.size(); i++){
|
|
|
+ EquipmentRunTime equipmentRunTime = equipmentRunTimes.get(i);
|
|
|
// 退火工序
|
|
|
if(process.getProcessType().equals("成退") || process.getProcessType().equals("中退")){
|
|
|
// 没有交叉直接跳过
|
|
@@ -705,7 +712,66 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
}*/
|
|
|
}
|
|
|
}
|
|
|
- // 非退火工序
|
|
|
+ // 冷轧工序
|
|
|
+ else if (process.getProcessType().equals("冷轧")) {
|
|
|
+ // 首个占用时间
|
|
|
+ if(i == 0){
|
|
|
+ if(proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
|
|
|
+ boolean preseries = seriesLz(equipmentRunTime, process, 1);
|
|
|
+ // 连续
|
|
|
+ if(preseries){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // 不连续需要考虑上机准备时间和下机收尾时间
|
|
|
+ else{
|
|
|
+ if(proEndTime.plusMinutes(process.getCutfinishmin()).plusMinutes(equipmentRunTime.getPrepressworkmin()).compareTo(equipmentRunTime.getStartRunTime())<0){
|
|
|
+ break;
|
|
|
+ }else{
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 最后一个占用时间
|
|
|
+ else if (i == equipmentRunTimes.size()-1) {
|
|
|
+ if(equipmentRunTime.getEndRunTime().compareTo(proStartTime)>0){
|
|
|
+ proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
|
|
|
+ }
|
|
|
+ boolean preseries = seriesLz(equipmentRunTime, process, -1);
|
|
|
+ if(!preseries){
|
|
|
+ proStartTime = proStartTime.plusMinutes(equipmentRunTime.getCutfinishmin()).plusMinutes(process.getPrepressworkmin());
|
|
|
+ }
|
|
|
+ proEndTime = proStartTime.plusMinutes(process.getProduceTime());
|
|
|
+ }
|
|
|
+ // 其它情况
|
|
|
+ else{
|
|
|
+ EquipmentRunTime nextEquipmentRunTime = equipmentRunTimes.get(i+1);
|
|
|
+ if(nextEquipmentRunTime.getStartRunTime().compareTo(proEndTime)>0){
|
|
|
+ boolean preseries = seriesLz(equipmentRunTime, process, -1);
|
|
|
+ boolean nextseries = seriesLz(nextEquipmentRunTime, process, 1);
|
|
|
+ LocalDateTime preEndTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
|
|
|
+ if(!preseries){
|
|
|
+ preEndTime = preEndTime.plusMinutes(equipmentRunTime.getCutfinishmin()).plusMinutes(process.getPrepressworkmin());
|
|
|
+ }
|
|
|
+ LocalDateTime nextEndTime = preEndTime.plusMinutes(process.getProduceTime());
|
|
|
+ if(!nextseries){
|
|
|
+ nextEndTime = nextEndTime.plusMinutes(process.getCutfinishmin()).plusMinutes(nextEquipmentRunTime.getPrepressworkmin());
|
|
|
+ }
|
|
|
+ if(nextEndTime.compareTo(nextEquipmentRunTime.getStartRunTime())<0){
|
|
|
+ proStartTime = preEndTime;
|
|
|
+ proEndTime = proStartTime.plusMinutes(process.getProduceTime());
|
|
|
+ break;
|
|
|
+ }else{
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 其它工序
|
|
|
else{
|
|
|
if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
|
|
|
continue;
|
|
@@ -722,6 +788,42 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
return toUpdateStartTime;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param equipmentRunTime
|
|
|
+ * @param process
|
|
|
+ * @param isBefore -1:equipmentRunTime在process之前,1:equipmentRunTime在process之后
|
|
|
+ */
|
|
|
+ private boolean seriesLz(EquipmentRunTime equipmentRunTime,ProductionProcesses process,Integer isBefore){
|
|
|
+ boolean isSeriesLz = true;
|
|
|
+ String[] serspre = null;String[] sersafter = null;
|
|
|
+ if(isBefore == -1){
|
|
|
+ serspre = equipmentRunTime.getSeriesProduceMark().split("\\^_\\^");
|
|
|
+ sersafter = process.getSeriesProduceMark().split("\\^_\\^");
|
|
|
+ }else {
|
|
|
+ serspre = process.getSeriesProduceMark().split("\\^_\\^");
|
|
|
+ sersafter = equipmentRunTime.getSeriesProduceMark().split("\\^_\\^");
|
|
|
+ }
|
|
|
+ if(serspre.length == 5 && sersafter.length == 5){
|
|
|
+ if(!serspre[0].equals(sersafter[0]) || !serspre[1].equals(sersafter[1])){
|
|
|
+ isSeriesLz = 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){
|
|
|
+ isSeriesLz = false;
|
|
|
+ }
|
|
|
+ }catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return isSeriesLz;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 判断当前设备时间段是否可以合并退火当前工序
|
|
|
* @param pe
|