|
@@ -44,24 +44,26 @@ public class ApsServiceImpl implements ApsService {
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public ApsSolution tuihuoAps(ApsSolution apsSolution) {
|
|
|
+ public ApsSolution tuihuoAps(ApsSolution apsSolution,Map<String,Map<String,List<ProductionProcesses>>> relPros) {
|
|
|
ApsSolution apsSolutionTuihuo = new ApsSolution();
|
|
|
List<ProductionProcesses> tuihuos = new ArrayList<>();
|
|
|
for (ProductionProcesses process : apsSolution.getProcessesList()) {
|
|
|
if((process.getProcessType().equals("成退") || process.getProcessType().equals("中退") || process.getProcessType().equals("小卷成退")) && !process.getIfLock()){
|
|
|
List<Integer> preTimes = new ArrayList<>();
|
|
|
- getAllPreTime(process,preTimes);
|
|
|
+ List<Integer> preMaxTimes = new ArrayList<>();
|
|
|
+ List<Boolean> hasMaxTimes = new ArrayList<>();
|
|
|
+ getAllPreTime(process,preTimes,preMaxTimes,hasMaxTimes);
|
|
|
if(preTimes != null && preTimes.size()>0){
|
|
|
Integer totaltime = 0;
|
|
|
for (Integer preTime : preTimes) {
|
|
|
totaltime = totaltime + preTime;
|
|
|
}
|
|
|
// 松散度
|
|
|
- if(process.getApsOverallConfig().getLooseness() != null){
|
|
|
+ /*if(process.getApsOverallConfig().getLooseness() != null){
|
|
|
BigDecimal lostime = process.getApsOverallConfig().getLooseness().multiply(new BigDecimal(totaltime)).divide(new BigDecimal("100"));
|
|
|
Integer losinttime = lostime.setScale(0, RoundingMode.CEILING).intValue();
|
|
|
totaltime = totaltime + losinttime;
|
|
|
- }
|
|
|
+ }*/
|
|
|
totaltime = totaltime + 60*6;
|
|
|
// 全局配置
|
|
|
ApsOverallConfig apsOverallConfig = new ApsOverallConfig();
|
|
@@ -71,10 +73,10 @@ public class ApsServiceImpl implements ApsService {
|
|
|
for (ProductionProcesses mergeRooprocess : process.getMergeRooprocess()) {
|
|
|
if(mergeRooprocess.getStartTime() != null){
|
|
|
if(startTime == null){
|
|
|
- startTime = mergeRooprocess.getStartTime();
|
|
|
+ startTime = mergeRooprocess.getEndTime();
|
|
|
}else{
|
|
|
- if(mergeRooprocess.getStartTime().compareTo(startTime)>0){
|
|
|
- startTime = mergeRooprocess.getStartTime();
|
|
|
+ if(mergeRooprocess.getEndTime().compareTo(startTime)>0){
|
|
|
+ startTime = mergeRooprocess.getEndTime();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -87,6 +89,23 @@ public class ApsServiceImpl implements ApsService {
|
|
|
}
|
|
|
// 开始时间设置
|
|
|
process.setApsOverallConfig(apsOverallConfig);
|
|
|
+ // 最大开始时间设置
|
|
|
+ if(hasMaxTimes != null && hasMaxTimes.size()>0 && !hasMaxTimes.contains(false) && process.getMaxWaitTime() != null && process.getMaxWaitTime()>0){
|
|
|
+ Integer totalMaxtime = 0;
|
|
|
+ for (Integer preTime : preMaxTimes) {
|
|
|
+ totalMaxtime = totalMaxtime + preTime;
|
|
|
+ }
|
|
|
+ // 松散度
|
|
|
+ /*if(process.getApsOverallConfig().getLooseness() != null){
|
|
|
+ BigDecimal lostime = process.getApsOverallConfig().getLooseness().multiply(new BigDecimal(totalMaxtime)).divide(new BigDecimal("100"));
|
|
|
+ Integer losinttime = lostime.setScale(0, RoundingMode.CEILING).intValue();
|
|
|
+ totalMaxtime = totalMaxtime + losinttime;
|
|
|
+ }*/
|
|
|
+ totalMaxtime = totalMaxtime + 60*6 + process.getMaxWaitTime();
|
|
|
+ if(startTime != null){
|
|
|
+ process.setMaxStartTime(startTime.plusMinutes(totalMaxtime));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
tuihuos.add(process);
|
|
|
}
|
|
@@ -94,6 +113,14 @@ public class ApsServiceImpl implements ApsService {
|
|
|
Collections.sort(tuihuos, (p1,p2)->p2.getApsOverallConfig().getStartTime().compareTo(p1.getApsOverallConfig().getStartTime()));
|
|
|
// 前后道工序置空
|
|
|
for (ProductionProcesses tuihuo : tuihuos) {
|
|
|
+ Map<String,List<ProductionProcesses>> a = new HashMap<>();
|
|
|
+ if(tuihuo.getPreviousProcesses() != null && tuihuo.getPreviousProcesses().size()>0){
|
|
|
+ a.put("pres",tuihuo.getPreviousProcesses());
|
|
|
+ }
|
|
|
+ if(tuihuo.getNextProcesses() != null && tuihuo.getNextProcesses().size()>0){
|
|
|
+ a.put("nexts",tuihuo.getNextProcesses());
|
|
|
+ }
|
|
|
+ relPros.put(tuihuo.getId(),a);
|
|
|
// 前后道工序置空
|
|
|
tuihuo.setPreviousProcesses(null);
|
|
|
tuihuo.setNextProcesses(null);
|
|
@@ -103,6 +130,44 @@ public class ApsServiceImpl implements ApsService {
|
|
|
return apsSolutionTuihuo;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取所有前道工序的时间总和
|
|
|
+ * @param process
|
|
|
+ * @param preTimes
|
|
|
+ */
|
|
|
+ private void getAllPreTime(ProductionProcesses process,List<Integer> preTimes,List<Integer> preMaxTimes,List<Boolean> hasMaxTimes){
|
|
|
+ if(process.getPreviousProcesses() != null && process.getPreviousProcesses().size()>0 && !"铸轧".equals(process.getPreviousProcesses().get(0).getProcessType())){
|
|
|
+ Integer lzTime = process.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
|
|
|
+ if(process.getPreviousProcesses().get(0).getMinWaitTime() != null){
|
|
|
+ if(process.getPreviousProcesses().get(0).getMinWaitTime()>lzTime){
|
|
|
+ lzTime = process.getPreviousProcesses().get(0).getMinWaitTime();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ int pretime = 0;
|
|
|
+ if(process.getPreviousProcesses().get(0).getProcessType().equals("退火")){
|
|
|
+ pretime = process.getPreviousProcesses().get(0).getProduceTime() + lzTime;
|
|
|
+ }else{
|
|
|
+ pretime = process.getPreviousProcesses().get(0).getProduceTime() * process.getPreviousProcesses().size() + lzTime;
|
|
|
+ }
|
|
|
+ preTimes.add(pretime);
|
|
|
+ // 最大等待时间
|
|
|
+ if(process.getPreviousProcesses().get(0).getMaxWaitTime() != null && process.getPreviousProcesses().get(0).getMaxWaitTime()>0){
|
|
|
+ hasMaxTimes.add(true);
|
|
|
+ int preMaxtime = 0;
|
|
|
+ if(process.getPreviousProcesses().get(0).getProcessType().equals("退火")){
|
|
|
+ preMaxtime = process.getPreviousProcesses().get(0).getProduceTime() + process.getPreviousProcesses().get(0).getMaxWaitTime();
|
|
|
+ }else{
|
|
|
+ preMaxtime = process.getPreviousProcesses().get(0).getProduceTime() * process.getPreviousProcesses().size() + process.getPreviousProcesses().get(0).getMaxWaitTime();
|
|
|
+ }
|
|
|
+ preMaxTimes.add(preMaxtime);
|
|
|
+ }else{
|
|
|
+ hasMaxTimes.add(false);
|
|
|
+ }
|
|
|
+ getAllPreTime(process.getPreviousProcesses().get(0),preTimes,preMaxTimes,hasMaxTimes);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 退火
|
|
|
* @param apsSolution
|
|
@@ -124,7 +189,8 @@ public class ApsServiceImpl implements ApsService {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- ApsSolution apsSolutionTh = tuihuoAps(apsSolution);
|
|
|
+ Map<String,Map<String,List<ProductionProcesses>>> relPros = new HashMap<>();
|
|
|
+ ApsSolution apsSolutionTh = tuihuoAps(apsSolution,relPros);
|
|
|
if(otherNotZzFirstProces != null && otherNotZzFirstProces.size()>0){
|
|
|
// 取消第一道工序非铸轧提前排程的锁定状态
|
|
|
if(otherNotZzFirstProces != null && otherNotZzFirstProces.size()>0){
|
|
@@ -189,19 +255,59 @@ public class ApsServiceImpl implements ApsService {
|
|
|
log.info(explain1.toString());
|
|
|
log.info("**************退火排程评分分析***************");
|
|
|
|
|
|
- // 锁定退火工序
|
|
|
- for (ProductionProcesses process : apsSolution.getProcessesList()) {
|
|
|
- List<ProductionProcesses> collect = solvedBalance1.getProcessesList().stream().filter(v -> v.getId().equals(process.getId())).collect(Collectors.toList());
|
|
|
- if(collect != null && collect.size()>0){
|
|
|
- process.setStartTime(collect.get(0).getStartTime());
|
|
|
- process.setEndTime(collect.get(0).getEndTime());
|
|
|
- process.setEquipmentId(collect.get(0).getEquipmentId());
|
|
|
- process.setEquipment(collect.get(0).getEquipment());
|
|
|
- process.setDelay(collect.get(0).getDelay());
|
|
|
- process.setIfLock(true);
|
|
|
+ // 锁定退火工序(根据开始时间分组,多个坯料计划一炉的则锁定,单个坯料计划一炉的总体一起排程)
|
|
|
+ Map<String,List<ProductionProcesses>> thGroup = new HashMap<>();
|
|
|
+ DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ for (ProductionProcesses process : solvedBalance1.getProcessesList()) {
|
|
|
+ String thkey = process.getEquipment().getId() + format.format(process.getStartTime());
|
|
|
+ if(thGroup.containsKey(thkey)){
|
|
|
+ thGroup.get(thkey).add(process);
|
|
|
+ }else{
|
|
|
+ List<ProductionProcesses> thpros = new ArrayList<>();
|
|
|
+ thpros.add(process);
|
|
|
+ thGroup.put(thkey,thpros);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ thGroup.forEach((k,v)->{
|
|
|
+ Set<String> orderids = new HashSet<>();
|
|
|
+ for (ProductionProcesses productionProcesses : v) {
|
|
|
+ for (ProduceOrder produceOrder : productionProcesses.getProduceOrder()) {
|
|
|
+ orderids.add(produceOrder.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(orderids.size()>1){
|
|
|
+ for (ProductionProcesses process : v) {
|
|
|
+ List<ProductionProcesses> collect = apsSolution.getProcessesList().stream().filter(vp -> vp.getId().equals(process.getId())).collect(Collectors.toList());
|
|
|
+ if(collect != null && collect.size()>0){
|
|
|
+ for (ProductionProcesses productionProcesses : collect) {
|
|
|
+ productionProcesses.setStartTime(process.getStartTime());
|
|
|
+ productionProcesses.setEndTime(process.getEndTime());
|
|
|
+ productionProcesses.setEquipmentId(process.getEquipmentId());
|
|
|
+ productionProcesses.setEquipment(process.getEquipment());
|
|
|
+ productionProcesses.setDelay(process.getDelay());
|
|
|
+ productionProcesses.setIfLock(true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ for (ProductionProcesses process : v) {
|
|
|
+ List<ProductionProcesses> collect = apsSolution.getProcessesList().stream().filter(vp -> vp.getId().equals(process.getId())).collect(Collectors.toList());
|
|
|
+ if(collect != null && collect.size()>0){
|
|
|
+ for (ProductionProcesses productionProcesses : collect) {
|
|
|
+ productionProcesses.getApsOverallConfig().setStartTime(productionProcesses.getRooprocess().getApsOverallConfig().getStartTime());
|
|
|
+ if(relPros.containsKey(productionProcesses.getId())){
|
|
|
+ Map<String, List<ProductionProcesses>> stringListMap = relPros.get(productionProcesses.getId());
|
|
|
+ productionProcesses.setPreviousProcesses(stringListMap.get("pres"));
|
|
|
+ productionProcesses.setNextProcesses(stringListMap.get("nexts"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
// 退火合并工序
|
|
|
/*if(solvedBalance1.getProcessesList() != null && solvedBalance1.getProcessesList().size()>0){
|
|
|
Map<String, List<ProductionProcesses>> starttimeProcess = solvedBalance1.getProcessesList().stream()
|
|
@@ -364,30 +470,6 @@ public class ApsServiceImpl implements ApsService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取所有前道工序的时间总和
|
|
|
- * @param process
|
|
|
- * @param preTimes
|
|
|
- */
|
|
|
- private void getAllPreTime(ProductionProcesses process,List<Integer> preTimes){
|
|
|
- if(process.getPreviousProcesses() != null && process.getPreviousProcesses().size()>0 && !"铸轧".equals(process.getPreviousProcesses().get(0).getProcessType())){
|
|
|
- Integer lzTime = process.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
|
|
|
- if(process.getPreviousProcesses().get(0).getMinWaitTime() != null){
|
|
|
- if(process.getPreviousProcesses().get(0).getMinWaitTime()>lzTime){
|
|
|
- lzTime = process.getPreviousProcesses().get(0).getMinWaitTime();
|
|
|
- }
|
|
|
- }
|
|
|
- int pretime = 0;
|
|
|
- if(process.getPreviousProcesses().get(0).getProcessType().equals("退火")){
|
|
|
- pretime = process.getPreviousProcesses().get(0).getProduceTime() + lzTime;
|
|
|
- }else{
|
|
|
- pretime = process.getPreviousProcesses().get(0).getProduceTime() * process.getPreviousProcesses().size() + lzTime;
|
|
|
- }
|
|
|
- preTimes.add(pretime);
|
|
|
- getAllPreTime(process.getPreviousProcesses().get(0),preTimes);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 求解器初始化
|
|
|
* @param productionScheduleVo
|