|
@@ -231,6 +231,11 @@ public class ApsServiceImpl implements ApsService {
|
|
|
if(maxheatroll != null && maxheatroll < a){
|
|
|
a = maxheatroll;
|
|
|
}
|
|
|
+ if(equipment.getEquipmentParameter() != null && equipment.getEquipmentParameter().getMaxfurance() != null && equipment.getEquipmentParameter().getMaxfurance()>0){
|
|
|
+ if(equipment.getEquipmentParameter().getMaxfurance() < a){
|
|
|
+ a = equipment.getEquipmentParameter().getMaxfurance();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
// 作业计划加工卷数是否大于一炉最大卷数
|
|
|
if(v.get(0).getRooprocess() != null && v.get(0).getRooprocess().getStartTime() != null){
|
|
@@ -238,6 +243,9 @@ public class ApsServiceImpl implements ApsService {
|
|
|
return p1.getRooprocess().getStartTime().compareTo(p2.getRooprocess().getStartTime());
|
|
|
});
|
|
|
}
|
|
|
+ if(a == 0){
|
|
|
+ throw new ApsException(v.get(0).getUniqueBsProcessesId()+"作业单卷重超过设备承重或最大装炉卷数设置为0");
|
|
|
+ }
|
|
|
|
|
|
List<List<ProductionProcesses>> chunks = new ArrayList<>();
|
|
|
int listSize = v.size();
|
|
@@ -245,7 +253,8 @@ public class ApsServiceImpl implements ApsService {
|
|
|
chunks.add(v.subList(i, Math.min(i + a, listSize)));
|
|
|
}
|
|
|
// 合并退火作业
|
|
|
- for (List<ProductionProcesses> thps : chunks) {
|
|
|
+ for(int j = 0;j < chunks.size();j++){
|
|
|
+ List<ProductionProcesses> thps = chunks.get(j);
|
|
|
for (int i = 0; i < thps.size(); i++) {
|
|
|
if(i>0){
|
|
|
// 设置待合并退火的主ID
|
|
@@ -311,7 +320,7 @@ public class ApsServiceImpl implements ApsService {
|
|
|
thps.get(0).setNextProcesses(thnexts);
|
|
|
}
|
|
|
// 小卷退火卷数合并
|
|
|
- if(thps.get(i).getProcessType().equals("小卷退火")){
|
|
|
+ if(thps.get(i).getProcessType().equals("小卷成退")){
|
|
|
thps.get(0).setMinThPcNum(thps.get(0).getMinThPcNum()+thps.get(i).getMinThPcNum());
|
|
|
}
|
|
|
}
|
|
@@ -333,6 +342,859 @@ public class ApsServiceImpl implements ApsService {
|
|
|
return mergeprocesses;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 退火外合并工序:
|
|
|
+ * 根据退火工序合并冷轧、箔轧工序,同一个退火炉的冷轧、箔轧
|
|
|
+ */
|
|
|
+ public List<ProductionProcesses> thOtherMerge(List<ProductionProcesses> mergeprocesses,List<ProductionProcesses> otherThproces){
|
|
|
+ List<ProductionProcesses> lzmergeprocesses = new ArrayList<>();
|
|
|
+ // 根据订单分组
|
|
|
+ Map<String, List<ProductionProcesses>> orderProcess = mergeprocesses.stream().collect(Collectors.groupingBy(ProductionProcesses::getOrderId));
|
|
|
+ orderProcess.forEach((k,processes)->{
|
|
|
+ // 退火工序过滤
|
|
|
+ List<ProductionProcesses> thpros = new ArrayList<>();
|
|
|
+ // 所有单卷作业集合
|
|
|
+ Map<String,ProductionProcesses> allProMap = new HashMap<>();
|
|
|
+ // 按作业分组
|
|
|
+ Map<String,List<ProductionProcesses>> bsProceses = new HashMap<>();
|
|
|
+ // 合并后的作业集合
|
|
|
+ List<ProductionProcesses> othermergeprocesses = new ArrayList<>();
|
|
|
+ // 未合并的作业集合
|
|
|
+ List<ProductionProcesses> notMergeProces = new ArrayList<>();
|
|
|
+ // 已分组合并作业
|
|
|
+ List<String> hasMerge = new ArrayList<>();
|
|
|
+ for (ProductionProcesses mergeprocess : processes) {
|
|
|
+ if(mergeprocess.getProcessType().equals("成退") || mergeprocess.getProcessType().equals("中退") || mergeprocess.getProcessType().equals("小卷成退")){
|
|
|
+ thpros.add(mergeprocess);
|
|
|
+ othermergeprocesses.add(mergeprocess);
|
|
|
+ } else if (mergeprocess.getProcessType().equals("铸轧")) {
|
|
|
+ othermergeprocesses.add(mergeprocess);
|
|
|
+ } else {
|
|
|
+ if("是".equals(mergeprocess.getIssubsection())){
|
|
|
+ othermergeprocesses.add(mergeprocess);
|
|
|
+ }else {
|
|
|
+ /*if(mergeprocess.getPreviousProcessesIds() == null || mergeprocess.getPreviousProcessesIds().size() == 0){
|
|
|
+ othermergeprocesses.add(mergeprocess);
|
|
|
+ }*/
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(bsProceses.containsKey(mergeprocess.getUniqueBsProcessesId())){
|
|
|
+ bsProceses.get(mergeprocess.getUniqueBsProcessesId()).add(mergeprocess);
|
|
|
+ }else{
|
|
|
+ List<ProductionProcesses> bsProcese = new ArrayList<>();
|
|
|
+ bsProcese.add(mergeprocess);
|
|
|
+ bsProceses.put(mergeprocess.getUniqueBsProcessesId(),bsProcese);
|
|
|
+ }
|
|
|
+ allProMap.put(mergeprocess.getId(),mergeprocess);
|
|
|
+ }
|
|
|
+ // 根据退火合并作业
|
|
|
+ if(thpros != null && thpros.size()>0){
|
|
|
+ for (ProductionProcesses thpro : thpros) {
|
|
|
+ // 退火作业往前合并
|
|
|
+ thPreProMerge(thpro,notMergeProces,othermergeprocesses,bsProceses,hasMerge,allProMap);
|
|
|
+ }
|
|
|
+ for (ProductionProcesses thpro : thpros) {
|
|
|
+ // 退火作业往后合并
|
|
|
+ thNextProMerge(thpro,notMergeProces,othermergeprocesses,bsProceses,hasMerge,allProMap);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 没有退火作业,按照默认最多4卷合并
|
|
|
+ else{
|
|
|
+ // 获取第一道工序的后一道工序作业开始合并
|
|
|
+ String secondbsid = null;
|
|
|
+ for(String bsid : bsProceses.keySet()) {
|
|
|
+ List<ProductionProcesses> bspros = bsProceses.get(bsid);
|
|
|
+ if(bspros != null && bspros.size()>0 && (bspros.get(0).getPreviousProcessesIds() == null || bspros.get(0).getPreviousProcessesIds().size() == 0)){
|
|
|
+ if(bspros.get(0).getProcessType().equals("铸轧")){
|
|
|
+ if(bspros.get(0).getNextProcesses() != null && bspros.get(0).getNextProcesses().size()>0){
|
|
|
+ secondbsid = bspros.get(0).getNextProcesses().get(0).getUniqueBsProcessesId();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ secondbsid = bspros.get(0).getUniqueBsProcessesId();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ fjNextMerge(secondbsid,notMergeProces,othermergeprocesses,bsProceses,hasMerge,allProMap);
|
|
|
+ }
|
|
|
+ // 剩余作业合并
|
|
|
+ List<ProductionProcesses> sypros = new ArrayList<>();
|
|
|
+ for (ProductionProcesses process : processes) {
|
|
|
+ if(!hasMerge.contains(process.getId())){
|
|
|
+ if(!process.getProcessType().equals("铸轧") && !process.getProcessType().equals("成退")
|
|
|
+ && !process.getProcessType().equals("中退") && !process.getProcessType().equals("小卷成退") && !"是".equals(process.getIssubsection())
|
|
|
+ && process.getPreviousProcessesIds() != null && process.getPreviousProcessesIds().size()>0){
|
|
|
+ sypros.add(process);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 按作业分组
|
|
|
+ if(sypros != null && sypros.size()>0){
|
|
|
+ Map<String, List<ProductionProcesses>> syProsMap = sypros.stream().collect(Collectors.groupingBy(ProductionProcesses::getUniqueBsProcessesId));
|
|
|
+ // 剩余作业按照默认4卷合并
|
|
|
+ syProsMap.forEach((bsid,processesList)->{
|
|
|
+ if(processesList != null && processesList.size()>0){
|
|
|
+ if(!hasMerge.contains(processesList.get(0).getId())){
|
|
|
+ // 分卷默认4卷合并
|
|
|
+ if(processesList.size()>1){
|
|
|
+ // 根据承重计算最大几卷
|
|
|
+ int a = 4;
|
|
|
+ // 按照第一道工序排序
|
|
|
+ if(processesList.get(0).getRooprocess() != null && processesList.get(0).getRooprocess().getStartTime() != null){
|
|
|
+ Collections.sort(processesList,(p1,p2)->{
|
|
|
+ return p1.getRooprocess().getStartTime().compareTo(p2.getRooprocess().getStartTime());
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ List<List<ProductionProcesses>> chunks = new ArrayList<>();
|
|
|
+ int listSize = processesList.size();
|
|
|
+ for (int i = 0; i < listSize; i += a) {
|
|
|
+ chunks.add(processesList.subList(i, Math.min(i + a, listSize)));
|
|
|
+ }
|
|
|
+ // 合并退火作业
|
|
|
+ for (List<ProductionProcesses> thps : chunks) {
|
|
|
+ for (int i = 0; i < thps.size(); i++) {
|
|
|
+ if(i>0){
|
|
|
+ // 设置待合并退火的主ID
|
|
|
+ thps.get(i).setMergeThMainId(thps.get(0).getId());
|
|
|
+ notMergeProces.add(thps.get(i));
|
|
|
+ // 退火前一道作业设置下一作业ID
|
|
|
+ ProductionProcesses prepro = thps.get(i).getPreviousProcesses().get(0);
|
|
|
+ // 合并后关联关系重置
|
|
|
+ if(!prepro.getNextProcessesIds().contains(thps.get(0).getId())){
|
|
|
+ int i1 = prepro.getNextProcessesIds().indexOf(thps.get(i).getId());
|
|
|
+ prepro.getNextProcessesIds().set(i1,thps.get(0).getId());
|
|
|
+ }
|
|
|
+ List<String> list = new ArrayList<>();
|
|
|
+ Set<String> set = new LinkedHashSet<>();
|
|
|
+ for (String nextProcessesId : prepro.getNextProcessesIds()) {
|
|
|
+ set.add(nextProcessesId);
|
|
|
+ }
|
|
|
+ list.addAll(set);
|
|
|
+ prepro.setNextProcessesIds(list);
|
|
|
+ List<ProductionProcesses> nextpros = new ArrayList<>();
|
|
|
+ for (String nextProcessesId : prepro.getNextProcessesIds()) {
|
|
|
+ nextpros.add(allProMap.get(nextProcessesId));
|
|
|
+ }
|
|
|
+ prepro.setNextProcesses(nextpros);
|
|
|
+ // 当前合并退火作业设置前一道作业
|
|
|
+ if(!thps.get(0).getPreviousProcessesIds().contains(prepro.getId())){
|
|
|
+ thps.get(0).getPreviousProcessesIds().add(prepro.getId());
|
|
|
+ }
|
|
|
+ List<ProductionProcesses> previousProces = new ArrayList<>();
|
|
|
+ for (String pid : thps.get(0).getPreviousProcessesIds()) {
|
|
|
+ previousProces.add(allProMap.get(pid));
|
|
|
+ }
|
|
|
+ thps.get(0).setPreviousProcesses(previousProces);
|
|
|
+ // 退火后一道作业设置上一道作业ID
|
|
|
+ if(thps.get(i).getNextProcessesIds() != null && thps.get(i).getNextProcessesIds().size()>0){
|
|
|
+ for (String nextProcessesId : thps.get(i).getNextProcessesIds()) {
|
|
|
+ ProductionProcesses nextpro = allProMap.get(nextProcessesId);
|
|
|
+ // 合并后关联关系重置
|
|
|
+ List<String> preids = new ArrayList<>();
|
|
|
+ preids.add(thps.get(0).getId());
|
|
|
+ nextpro.setPreviousProcessesIds(preids);
|
|
|
+
|
|
|
+ List<ProductionProcesses> nextprepros = new ArrayList<>();
|
|
|
+ for (String pid : nextpro.getPreviousProcessesIds()) {
|
|
|
+ nextprepros.add(allProMap.get(pid));
|
|
|
+ }
|
|
|
+ nextpro.setPreviousProcesses(nextprepros);
|
|
|
+ }
|
|
|
+ // 设置合并退火作业下一道工序
|
|
|
+ thps.get(0).getNextProcessesIds().addAll(thps.get(i).getNextProcessesIds());
|
|
|
+ List<ProductionProcesses> thnexts = new ArrayList<>();
|
|
|
+ for (String pid : thps.get(0).getNextProcessesIds()) {
|
|
|
+ thnexts.add(allProMap.get(pid));
|
|
|
+ }
|
|
|
+ thps.get(0).setNextProcesses(thnexts);
|
|
|
+ }
|
|
|
+ // 小卷退火卷数合并
|
|
|
+ if(thps.get(i).getProcessType().equals("小卷成退")){
|
|
|
+ thps.get(0).setMinThPcNum(thps.get(0).getMinThPcNum()+thps.get(i).getMinThPcNum());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 取第一个作业作为合并作业
|
|
|
+ ProductionProcesses mergePro = thps.get(0);
|
|
|
+ mergePro.setOpeProducePcNum(thps.size());
|
|
|
+ mergePro.setProduceTime(mergePro.getProduceTime()*thps.size());
|
|
|
+ othermergeprocesses.add(mergePro);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ othermergeprocesses.addAll(processesList);
|
|
|
+ }
|
|
|
+ // 记录分卷已合并作业
|
|
|
+ List<String> proids = processesList.stream().map(ProductionProcesses::getId).collect(Collectors.toList());
|
|
|
+ hasMerge.addAll(proids);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ otherThproces.addAll(notMergeProces);
|
|
|
+ lzmergeprocesses.addAll(othermergeprocesses);
|
|
|
+ });
|
|
|
+ return lzmergeprocesses;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 退火作业向后合并作业
|
|
|
+ * @param thps
|
|
|
+ * @param notMergeProces
|
|
|
+ * @param mergeprocesses
|
|
|
+ * @param bsProceses
|
|
|
+ * @param hasMerge
|
|
|
+ * @param allProMap
|
|
|
+ */
|
|
|
+ private void thNextProMerge(ProductionProcesses thps,List<ProductionProcesses> notMergeProces,List<ProductionProcesses> mergeprocesses
|
|
|
+ ,Map<String,List<ProductionProcesses>> bsProceses,List<String> hasMerge,Map<String,ProductionProcesses> allProMap){
|
|
|
+ List<ProductionProcesses> nextProcesses = thps.getNextProcesses();
|
|
|
+ if(nextProcesses != null && nextProcesses.size()>0){
|
|
|
+ if(!nextProcesses.get(0).getProcessType().equals("铸轧") && !nextProcesses.get(0).getProcessType().equals("成退")
|
|
|
+ && !nextProcesses.get(0).getProcessType().equals("中退") && !nextProcesses.get(0).getProcessType().equals("小卷成退")
|
|
|
+// && nextProcesses.get(0).getPreviousProcessesIds() != null && nextProcesses.get(0).getPreviousProcessesIds().size()>0
|
|
|
+ ){
|
|
|
+ // 分卷工序
|
|
|
+ if("是".equals(nextProcesses.get(0).getIssubsection())){
|
|
|
+ for (ProductionProcesses nextProcess : nextProcesses) {
|
|
|
+ List<ProductionProcesses> pres = new ArrayList<>();
|
|
|
+ List<String> preids = new ArrayList<>();
|
|
|
+ pres.add(thps);
|
|
|
+ preids.add(thps.getId());
|
|
|
+ nextProcess.setPreviousProcesses(pres);
|
|
|
+ nextProcess.setPreviousProcessesIds(preids);
|
|
|
+ }
|
|
|
+ List<ProductionProcesses> processesList = bsProceses.get(nextProcesses.get(0).getUniqueBsProcessesId());
|
|
|
+ if(processesList != null && processesList.size()>0){
|
|
|
+ // 如果未合并则合并,并记录已合并的作业
|
|
|
+ if(!hasMerge.contains(processesList.get(0).getId())){
|
|
|
+ // 分卷的工序从此到工序的上一道工序开始合并,默认4卷
|
|
|
+ fjNextMerge(processesList.get(0).getUniqueBsProcessesId(),notMergeProces,mergeprocesses,bsProceses,hasMerge,allProMap);
|
|
|
+ // 记录合并作业ID
|
|
|
+ List<String> proids = processesList.stream().map(ProductionProcesses::getId).collect(Collectors.toList());
|
|
|
+ hasMerge.addAll(proids);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ List<ProductionProcesses> mergePres = new ArrayList<>();
|
|
|
+ mergePres.addAll(nextProcesses);
|
|
|
+ if(!hasMerge.contains(mergePres.get(0).getId())){
|
|
|
+ ProductionProcesses mergePro = mergePres.get(0);
|
|
|
+ Map<String,ProductionProcesses> mergeProNexts = new HashMap<>();
|
|
|
+ if(mergePres.size()>1){
|
|
|
+ List<String> mergeProOrders = new ArrayList<>();
|
|
|
+ mergeProOrders.add(mergePro.getId());
|
|
|
+ mergePro.setMergeProOrders(mergeProOrders);
|
|
|
+ for (int i = 0; i < mergePres.size(); i++) {
|
|
|
+ if(i>0){
|
|
|
+ // 设置待合并退火的主ID
|
|
|
+ mergePres.get(i).setMergeThMainId(mergePres.get(0).getId());
|
|
|
+ mergePro.getMergeProOrders().add(mergePres.get(i).getId());
|
|
|
+ notMergeProces.add(mergePres.get(i));
|
|
|
+ if(mergePres.get(i).getNextProcesses() != null && mergePres.get(i).getNextProcesses().size()>0){
|
|
|
+ for (ProductionProcesses nextProcess : mergePres.get(i).getNextProcesses()) {
|
|
|
+ mergeProNexts.put(nextProcess.getId(),nextProcess);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 取第一个作业作为合并作业
|
|
|
+ mergePro.setProduceTime(mergePro.getProduceTime()*mergePres.size());
|
|
|
+ mergePro.setOpeProducePcNum(mergePres.size());
|
|
|
+ List<String> nextids = new ArrayList<>();
|
|
|
+ List<String> preids = new ArrayList<>();
|
|
|
+ List<ProductionProcesses> nextpss = new ArrayList<>();
|
|
|
+ List<ProductionProcesses> prepss = new ArrayList<>();
|
|
|
+ nextpss.add(thps);
|
|
|
+ nextids.add(thps.getId());
|
|
|
+ mergePro.setPreviousProcesses(nextpss);
|
|
|
+ mergePro.setPreviousProcessesIds(nextids);
|
|
|
+ preids.add(mergePro.getId());
|
|
|
+ prepss.add(mergePro);
|
|
|
+ thps.setNextProcessesIds(preids);
|
|
|
+ thps.setNextProcesses(prepss);
|
|
|
+ // 合并作业的上一道工序
|
|
|
+ if(mergeProNexts.size()>0){
|
|
|
+ for (String proid:mergeProNexts.keySet()){
|
|
|
+ if(!mergePro.getNextProcessesIds().contains(proid)){
|
|
|
+ ProductionProcesses propro = mergeProNexts.get(proid);
|
|
|
+ mergePro.getNextProcessesIds().add(proid);
|
|
|
+ mergePro.getNextProcesses().add(propro);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ mergeprocesses.add(mergePro);
|
|
|
+ }else{
|
|
|
+ mergeprocesses.addAll(mergePres);
|
|
|
+ }
|
|
|
+ // 记录已合并的作业
|
|
|
+ if(!hasMerge.contains(mergePres.get(0).getId())){
|
|
|
+ List<String> proids = mergePres.stream().map(ProductionProcesses::getId).collect(Collectors.toList());
|
|
|
+ hasMerge.addAll(proids);
|
|
|
+ }
|
|
|
+ // 递归按照退火合并
|
|
|
+ thNextProMerge(mergePro,notMergeProces,mergeprocesses,bsProceses,hasMerge,allProMap);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 合并除退火外其它作业
|
|
|
+ * @param thps
|
|
|
+ * @param notMergeProces
|
|
|
+ * @param mergeprocesses
|
|
|
+ * @param bsProceses
|
|
|
+ * @param hasMerge 已参与合并的作业ID(单卷作业ID)
|
|
|
+ */
|
|
|
+ private void thPreProMerge(ProductionProcesses thps,List<ProductionProcesses> notMergeProces,List<ProductionProcesses> mergeprocesses
|
|
|
+ ,Map<String,List<ProductionProcesses>> bsProceses,List<String> hasMerge,Map<String,ProductionProcesses> allProMap){
|
|
|
+ List<ProductionProcesses> previousProcesses = thps.getPreviousProcesses();
|
|
|
+ if(previousProcesses != null && previousProcesses.size()>0){
|
|
|
+ // 铸轧、退火、和第一道工序不合并
|
|
|
+ if(!previousProcesses.get(0).getProcessType().equals("铸轧") && !previousProcesses.get(0).getProcessType().equals("成退")
|
|
|
+ && !previousProcesses.get(0).getProcessType().equals("中退") && !previousProcesses.get(0).getProcessType().equals("小卷成退")
|
|
|
+// && previousProcesses.get(0).getPreviousProcessesIds() != null && previousProcesses.get(0).getPreviousProcessesIds().size()>0
|
|
|
+ ){
|
|
|
+ // 分卷工序
|
|
|
+ if("是".equals(previousProcesses.get(0).getIssubsection())){
|
|
|
+ for (ProductionProcesses preProcess : previousProcesses) {
|
|
|
+ List<ProductionProcesses> nexts = new ArrayList<>();
|
|
|
+ if(preProcess.getNextProcesses().size()>1){
|
|
|
+ List<ProductionProcesses> othernexts = preProcess.getNextProcesses().stream().filter(v -> !v.getUniqueBsProcessesId().equals(thps.getUniqueBsProcessesId())).collect(Collectors.toList());
|
|
|
+ othernexts.add(thps);
|
|
|
+ nexts = othernexts;
|
|
|
+ }else{
|
|
|
+ nexts.add(thps);
|
|
|
+ }
|
|
|
+ preProcess.setNextProcesses(nexts);
|
|
|
+ List<String> nextids = new ArrayList<>();
|
|
|
+ for (ProductionProcesses next : nexts) {
|
|
|
+ nextids.add(next.getId());
|
|
|
+ }
|
|
|
+ preProcess.setNextProcessesIds(nextids);
|
|
|
+ }
|
|
|
+ List<ProductionProcesses> processesList = bsProceses.get(previousProcesses.get(0).getUniqueBsProcessesId());
|
|
|
+ if(processesList != null && processesList.size()>0){
|
|
|
+ // 如果未合并则合并,并记录已合并的作业
|
|
|
+ if(!hasMerge.contains(processesList.get(0).getId())){
|
|
|
+ // 分卷的工序从此到工序的上一道工序开始合并,默认4卷
|
|
|
+ fjMerge(processesList.get(0).getUniqueBsProcessesId(),notMergeProces,mergeprocesses,bsProceses,hasMerge,allProMap);
|
|
|
+ // 记录合并作业ID
|
|
|
+ List<String> proids = processesList.stream().map(ProductionProcesses::getId).collect(Collectors.toList());
|
|
|
+ hasMerge.addAll(proids);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ List<ProductionProcesses> mergePres = new ArrayList<>();
|
|
|
+ mergePres.addAll(previousProcesses);
|
|
|
+ if(!hasMerge.contains(mergePres.get(0).getId())){
|
|
|
+ ProductionProcesses mergePro = mergePres.get(0);
|
|
|
+ Map<String,ProductionProcesses> mergeProPres = new HashMap<>();
|
|
|
+ if(mergePres.size()>1){
|
|
|
+ List<String> mergeProOrders = new ArrayList<>();
|
|
|
+ mergeProOrders.add(mergePro.getId());
|
|
|
+ mergePro.setMergeProOrders(mergeProOrders);
|
|
|
+ for (int i = 0; i < mergePres.size(); i++) {
|
|
|
+ if(i>0){
|
|
|
+ // 设置待合并退火的主ID
|
|
|
+ mergePres.get(i).setMergeThMainId(mergePres.get(0).getId());
|
|
|
+ mergePro.getMergeProOrders().add(mergePres.get(i).getId());
|
|
|
+ notMergeProces.add(mergePres.get(i));
|
|
|
+ if(mergePres.get(i).getPreviousProcesses() != null && mergePres.get(i).getPreviousProcesses().size()>0){
|
|
|
+ for (ProductionProcesses previousProcess : mergePres.get(i).getPreviousProcesses()) {
|
|
|
+ mergeProPres.put(previousProcess.getId(),previousProcess);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 取第一个作业作为合并作业
|
|
|
+ mergePro.setProduceTime(mergePro.getProduceTime()*mergePres.size());
|
|
|
+ mergePro.setOpeProducePcNum(mergePres.size());
|
|
|
+ List<String> nextids = new ArrayList<>();
|
|
|
+ List<String> preids = new ArrayList<>();
|
|
|
+ List<ProductionProcesses> nextpss = new ArrayList<>();
|
|
|
+ List<ProductionProcesses> prepss = new ArrayList<>();
|
|
|
+ nextpss.add(thps);
|
|
|
+ nextids.add(thps.getId());
|
|
|
+ mergePro.setNextProcesses(nextpss);
|
|
|
+ mergePro.setNextProcessesIds(nextids);
|
|
|
+ preids.add(mergePro.getId());
|
|
|
+ prepss.add(mergePro);
|
|
|
+ thps.setPreviousProcessesIds(preids);
|
|
|
+ thps.setPreviousProcesses(prepss);
|
|
|
+ // 合并作业的上一道工序
|
|
|
+ if(mergeProPres.size()>0){
|
|
|
+ for (String proid:mergeProPres.keySet()){
|
|
|
+ if(!mergePro.getPreviousProcessesIds().contains(proid)){
|
|
|
+ ProductionProcesses propro = mergeProPres.get(proid);
|
|
|
+ mergePro.getPreviousProcessesIds().add(proid);
|
|
|
+ mergePro.getPreviousProcesses().add(propro);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ mergeprocesses.add(mergePro);
|
|
|
+ }else{
|
|
|
+ mergeprocesses.addAll(mergePres);
|
|
|
+ }
|
|
|
+ // 记录已合并的作业
|
|
|
+ if(!hasMerge.contains(mergePres.get(0).getId())){
|
|
|
+ List<String> proids = mergePres.stream().map(ProductionProcesses::getId).collect(Collectors.toList());
|
|
|
+ hasMerge.addAll(proids);
|
|
|
+ }
|
|
|
+ // 递归按照退火合并
|
|
|
+ thPreProMerge(mergePro,notMergeProces,mergeprocesses,bsProceses,hasMerge,allProMap);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ // 第一道工序处理
|
|
|
+ if(previousProcesses.get(0).getPreviousProcessesIds() == null || previousProcesses.get(0).getPreviousProcessesIds().size() == 0){
|
|
|
+ List<String> nextids = new ArrayList<>();
|
|
|
+ List<ProductionProcesses> nextpss = new ArrayList<>();
|
|
|
+ nextpss.add(thps);
|
|
|
+ nextids.add(thps.getId());
|
|
|
+ for (ProductionProcesses previousProcess : previousProcesses) {
|
|
|
+ previousProcess.setNextProcesses(nextpss);
|
|
|
+ previousProcess.setNextProcessesIds(nextids);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分卷前作业合并处理
|
|
|
+ * @param bsprocessid
|
|
|
+ * @param notMergeProces
|
|
|
+ * @param mergeprocesses
|
|
|
+ * @param bsProceses
|
|
|
+ * @param hasMerge
|
|
|
+ * @param allProMap
|
|
|
+ */
|
|
|
+ private void fjMerge(String bsprocessid,List<ProductionProcesses> notMergeProces,List<ProductionProcesses> mergeprocesses
|
|
|
+ ,Map<String,List<ProductionProcesses>> bsProceses,List<String> hasMerge,Map<String,ProductionProcesses> allProMap){
|
|
|
+ List<ProductionProcesses> processesList = bsProceses.get(bsprocessid);
|
|
|
+ // 铸轧、退火、和第一道工序不合并
|
|
|
+ if(!processesList.get(0).getProcessType().equals("铸轧") && !processesList.get(0).getProcessType().equals("成退")
|
|
|
+ && !processesList.get(0).getProcessType().equals("中退") && !processesList.get(0).getProcessType().equals("小卷成退")
|
|
|
+// && processesList.get(0).getPreviousProcessesIds() != null && processesList.get(0).getPreviousProcessesIds().size()>0
|
|
|
+ ){
|
|
|
+ if("是".equals(processesList.get(0).getIssubsection())){
|
|
|
+ if(processesList.get(0).getPreviousProcesses() != null && processesList.get(0).getPreviousProcesses().size()>0){
|
|
|
+ String uniqueBsProcessesId = processesList.get(0).getPreviousProcesses().get(0).getUniqueBsProcessesId();
|
|
|
+ fjMerge(uniqueBsProcessesId,notMergeProces,mergeprocesses,bsProceses,hasMerge,allProMap);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ if(processesList != null && processesList.size()>0){
|
|
|
+ List<ProductionProcesses> pres = new ArrayList<>();
|
|
|
+ if(!hasMerge.contains(processesList.get(0).getId())){
|
|
|
+ // 分卷默认4卷合并
|
|
|
+ if(processesList.size()>1){
|
|
|
+ // 根据承重计算最大几卷
|
|
|
+ int a = 4;
|
|
|
+ // 按照第一道工序排序
|
|
|
+ if(processesList.get(0).getRooprocess() != null && processesList.get(0).getRooprocess().getStartTime() != null){
|
|
|
+ Collections.sort(processesList,(p1,p2)->{
|
|
|
+ return p1.getRooprocess().getStartTime().compareTo(p2.getRooprocess().getStartTime());
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ List<List<ProductionProcesses>> chunks = new ArrayList<>();
|
|
|
+ int listSize = processesList.size();
|
|
|
+ for (int i = 0; i < listSize; i += a) {
|
|
|
+ chunks.add(processesList.subList(i, Math.min(i + a, listSize)));
|
|
|
+ }
|
|
|
+ // 合并退火作业
|
|
|
+ for (List<ProductionProcesses> thps : chunks) {
|
|
|
+ // 取第一个作业作为合并作业
|
|
|
+ ProductionProcesses mergePro = thps.get(0);
|
|
|
+ List<String> mergeProOrders = new ArrayList<>();
|
|
|
+ mergeProOrders.add(mergePro.getId());
|
|
|
+ mergePro.setMergeProOrders(mergeProOrders);
|
|
|
+ for (int i = 0; i < thps.size(); i++) {
|
|
|
+ if(i>0){
|
|
|
+ // 设置待合并退火的主ID
|
|
|
+ thps.get(i).setMergeThMainId(thps.get(0).getId());
|
|
|
+ mergePro.getMergeProOrders().add(thps.get(i).getId());
|
|
|
+ notMergeProces.add(thps.get(i));
|
|
|
+ if(thps.get(i).getPreviousProcesses() != null && thps.get(i).getPreviousProcesses().size() > 0){
|
|
|
+ // 退火前一道作业设置下一作业ID
|
|
|
+ ProductionProcesses prepro = thps.get(i).getPreviousProcesses().get(0);
|
|
|
+ // 合并后关联关系重置
|
|
|
+ if(!prepro.getNextProcessesIds().contains(thps.get(0).getId())){
|
|
|
+ int i1 = prepro.getNextProcessesIds().indexOf(thps.get(i).getId());
|
|
|
+ prepro.getNextProcessesIds().set(i1,thps.get(0).getId());
|
|
|
+ }
|
|
|
+ List<String> list = new ArrayList<>();
|
|
|
+ Set<String> set = new LinkedHashSet<>();
|
|
|
+ for (String nextProcessesId : prepro.getNextProcessesIds()) {
|
|
|
+ set.add(nextProcessesId);
|
|
|
+ }
|
|
|
+ list.addAll(set);
|
|
|
+ prepro.setNextProcessesIds(list);
|
|
|
+ List<ProductionProcesses> nextpros = new ArrayList<>();
|
|
|
+ for (String nextProcessesId : prepro.getNextProcessesIds()) {
|
|
|
+ nextpros.add(allProMap.get(nextProcessesId));
|
|
|
+ }
|
|
|
+ prepro.setNextProcesses(nextpros);
|
|
|
+ // 当前合并退火作业设置前一道作业
|
|
|
+ if(!thps.get(0).getPreviousProcessesIds().contains(prepro.getId())){
|
|
|
+ thps.get(0).getPreviousProcessesIds().add(prepro.getId());
|
|
|
+ }
|
|
|
+ List<ProductionProcesses> previousProces = new ArrayList<>();
|
|
|
+ for (String pid : thps.get(0).getPreviousProcessesIds()) {
|
|
|
+ previousProces.add(allProMap.get(pid));
|
|
|
+ }
|
|
|
+ thps.get(0).setPreviousProcesses(previousProces);
|
|
|
+ }
|
|
|
+ // 退火后一道作业设置上一道作业ID
|
|
|
+ if(thps.get(i).getNextProcessesIds() != null && thps.get(i).getNextProcessesIds().size()>0){
|
|
|
+ for (String nextProcessesId : thps.get(i).getNextProcessesIds()) {
|
|
|
+ ProductionProcesses nextpro = allProMap.get(nextProcessesId);
|
|
|
+ // 合并后关联关系重置
|
|
|
+ List<String> preids = new ArrayList<>();
|
|
|
+ preids.add(thps.get(0).getId());
|
|
|
+ nextpro.setPreviousProcessesIds(preids);
|
|
|
+
|
|
|
+ List<ProductionProcesses> nextprepros = new ArrayList<>();
|
|
|
+ for (String pid : nextpro.getPreviousProcessesIds()) {
|
|
|
+ nextprepros.add(allProMap.get(pid));
|
|
|
+ }
|
|
|
+ nextpro.setPreviousProcesses(nextprepros);
|
|
|
+ }
|
|
|
+ // 设置合并退火作业下一道工序
|
|
|
+ thps.get(0).getNextProcessesIds().addAll(thps.get(i).getNextProcessesIds());
|
|
|
+ List<ProductionProcesses> thnexts = new ArrayList<>();
|
|
|
+ for (String pid : thps.get(0).getNextProcessesIds()) {
|
|
|
+ thnexts.add(allProMap.get(pid));
|
|
|
+ }
|
|
|
+ thps.get(0).setNextProcesses(thnexts);
|
|
|
+ }
|
|
|
+ // 小卷退火卷数合并
|
|
|
+ if(thps.get(i).getProcessType().equals("小卷成退")){
|
|
|
+ thps.get(0).setMinThPcNum(thps.get(0).getMinThPcNum()+thps.get(i).getMinThPcNum());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ mergePro.setOpeProducePcNum(thps.size());
|
|
|
+ mergePro.setProduceTime(mergePro.getProduceTime()*thps.size());
|
|
|
+ mergeprocesses.add(mergePro);
|
|
|
+ pres.add(mergePro);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ mergeprocesses.addAll(processesList);
|
|
|
+ pres.addAll(processesList);
|
|
|
+ }
|
|
|
+ // 记录分卷已合并作业
|
|
|
+ List<String> proids = processesList.stream().map(ProductionProcesses::getId).collect(Collectors.toList());
|
|
|
+ hasMerge.addAll(proids);
|
|
|
+ }
|
|
|
+ // 递归合并分卷前的作业
|
|
|
+ if(pres != null && pres.size()>0){
|
|
|
+ for (ProductionProcesses pre : pres) {
|
|
|
+ thPreProMerge(pre,notMergeProces,mergeprocesses,bsProceses,hasMerge,allProMap);
|
|
|
+ }
|
|
|
+ /*String uniqueBsProcessesId = processesList.get(0).getPreviousProcesses().get(0).getUniqueBsProcessesId();
|
|
|
+ fjMerge(uniqueBsProcessesId,notMergeProces,mergeprocesses,bsProceses,hasMerge,allProMap);*/
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分卷后作业合并处理
|
|
|
+ * @param bsprocessid
|
|
|
+ * @param notMergeProces
|
|
|
+ * @param mergeprocesses
|
|
|
+ * @param bsProceses
|
|
|
+ * @param hasMerge
|
|
|
+ * @param allProMap
|
|
|
+ */
|
|
|
+ private void fjNextMerge(String bsprocessid,List<ProductionProcesses> notMergeProces,List<ProductionProcesses> mergeprocesses
|
|
|
+ ,Map<String,List<ProductionProcesses>> bsProceses,List<String> hasMerge,Map<String,ProductionProcesses> allProMap){
|
|
|
+ List<ProductionProcesses> processesList = bsProceses.get(bsprocessid);
|
|
|
+ List<String> nextbsids = new ArrayList<>();
|
|
|
+ if(processesList != null && processesList.size()>0){
|
|
|
+ for (ProductionProcesses productionProcesses : processesList) {
|
|
|
+ if(productionProcesses.getNextProcesses() != null && productionProcesses.getNextProcesses().size()>0){
|
|
|
+ for (ProductionProcesses nextProcess : productionProcesses.getNextProcesses()) {
|
|
|
+ if(!nextbsids.contains(nextProcess.getUniqueBsProcessesId())){
|
|
|
+ nextbsids.add(nextProcess.getUniqueBsProcessesId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 铸轧、退火、和第一道工序不合并
|
|
|
+ if(!processesList.get(0).getProcessType().equals("铸轧") && !processesList.get(0).getProcessType().equals("成退")
|
|
|
+ && !processesList.get(0).getProcessType().equals("中退") && !processesList.get(0).getProcessType().equals("小卷成退")
|
|
|
+// && processesList.get(0).getPreviousProcessesIds() != null && processesList.get(0).getPreviousProcessesIds().size()>0
|
|
|
+ ){
|
|
|
+ if("是".equals(processesList.get(0).getIssubsection())){
|
|
|
+ if(nextbsids != null && nextbsids.size()>0){
|
|
|
+ for (String nextbsid : nextbsids) {
|
|
|
+ fjNextMerge(nextbsid,notMergeProces,mergeprocesses,bsProceses,hasMerge,allProMap);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ if(processesList != null && processesList.size()>0){
|
|
|
+ List<ProductionProcesses> nexts = new ArrayList<>();
|
|
|
+ if(!hasMerge.contains(processesList.get(0).getId())){
|
|
|
+ // 分卷默认4卷合并
|
|
|
+ if(processesList.size()>1){
|
|
|
+ // 根据承重计算最大几卷
|
|
|
+ int a = 4;
|
|
|
+ // 按照第一道工序排序
|
|
|
+ if(processesList.get(0).getRooprocess() != null && processesList.get(0).getRooprocess().getStartTime() != null){
|
|
|
+ Collections.sort(processesList,(p1,p2)->{
|
|
|
+ return p1.getRooprocess().getStartTime().compareTo(p2.getRooprocess().getStartTime());
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ List<List<ProductionProcesses>> chunks = new ArrayList<>();
|
|
|
+ int listSize = processesList.size();
|
|
|
+ for (int i = 0; i < listSize; i += a) {
|
|
|
+ chunks.add(processesList.subList(i, Math.min(i + a, listSize)));
|
|
|
+ }
|
|
|
+ // 合并退火作业
|
|
|
+ for (List<ProductionProcesses> thps : chunks) {
|
|
|
+ // 取第一个作业作为合并作业
|
|
|
+ ProductionProcesses mergePro = thps.get(0);
|
|
|
+ List<String> mergeProOrders = new ArrayList<>();
|
|
|
+ mergeProOrders.add(mergePro.getId());
|
|
|
+ mergePro.setMergeProOrders(mergeProOrders);
|
|
|
+ for (int i = 0; i < thps.size(); i++) {
|
|
|
+ if(i>0){
|
|
|
+ // 设置待合并退火的主ID
|
|
|
+ thps.get(i).setMergeThMainId(thps.get(0).getId());
|
|
|
+ mergePro.getMergeProOrders().add(thps.get(i).getId());
|
|
|
+ notMergeProces.add(thps.get(i));
|
|
|
+ if(thps.get(i).getPreviousProcesses() != null && thps.get(i).getPreviousProcesses().size() > 0){
|
|
|
+ // 退火前一道作业设置下一作业ID
|
|
|
+ ProductionProcesses prepro = thps.get(i).getPreviousProcesses().get(0);
|
|
|
+ // 合并后关联关系重置
|
|
|
+ if(!prepro.getNextProcessesIds().contains(thps.get(0).getId())){
|
|
|
+ int i1 = prepro.getNextProcessesIds().indexOf(thps.get(i).getId());
|
|
|
+ prepro.getNextProcessesIds().set(i1,thps.get(0).getId());
|
|
|
+ }
|
|
|
+ List<String> list = new ArrayList<>();
|
|
|
+ Set<String> set = new LinkedHashSet<>();
|
|
|
+ for (String nextProcessesId : prepro.getNextProcessesIds()) {
|
|
|
+ set.add(nextProcessesId);
|
|
|
+ }
|
|
|
+ list.addAll(set);
|
|
|
+ prepro.setNextProcessesIds(list);
|
|
|
+ List<ProductionProcesses> nextpros = new ArrayList<>();
|
|
|
+ for (String nextProcessesId : prepro.getNextProcessesIds()) {
|
|
|
+ nextpros.add(allProMap.get(nextProcessesId));
|
|
|
+ }
|
|
|
+ prepro.setNextProcesses(nextpros);
|
|
|
+ // 当前合并退火作业设置前一道作业
|
|
|
+ if(!thps.get(0).getPreviousProcessesIds().contains(prepro.getId())){
|
|
|
+ thps.get(0).getPreviousProcessesIds().add(prepro.getId());
|
|
|
+ }
|
|
|
+ List<ProductionProcesses> previousProces = new ArrayList<>();
|
|
|
+ for (String pid : thps.get(0).getPreviousProcessesIds()) {
|
|
|
+ previousProces.add(allProMap.get(pid));
|
|
|
+ }
|
|
|
+ thps.get(0).setPreviousProcesses(previousProces);
|
|
|
+ }
|
|
|
+ // 退火后一道作业设置上一道作业ID
|
|
|
+ if(thps.get(i).getNextProcessesIds() != null && thps.get(i).getNextProcessesIds().size()>0){
|
|
|
+ for (String nextProcessesId : thps.get(i).getNextProcessesIds()) {
|
|
|
+ ProductionProcesses nextpro = allProMap.get(nextProcessesId);
|
|
|
+ // 合并后关联关系重置
|
|
|
+ List<String> preids = new ArrayList<>();
|
|
|
+ preids.add(thps.get(0).getId());
|
|
|
+ nextpro.setPreviousProcessesIds(preids);
|
|
|
+
|
|
|
+ List<ProductionProcesses> nextprepros = new ArrayList<>();
|
|
|
+ for (String pid : nextpro.getPreviousProcessesIds()) {
|
|
|
+ nextprepros.add(allProMap.get(pid));
|
|
|
+ }
|
|
|
+ nextpro.setPreviousProcesses(nextprepros);
|
|
|
+ }
|
|
|
+ // 设置合并退火作业下一道工序
|
|
|
+ thps.get(0).getNextProcessesIds().addAll(thps.get(i).getNextProcessesIds());
|
|
|
+ List<ProductionProcesses> thnexts = new ArrayList<>();
|
|
|
+ for (String pid : thps.get(0).getNextProcessesIds()) {
|
|
|
+ thnexts.add(allProMap.get(pid));
|
|
|
+ }
|
|
|
+ thps.get(0).setNextProcesses(thnexts);
|
|
|
+ }
|
|
|
+ // 小卷退火卷数合并
|
|
|
+ if(thps.get(i).getProcessType().equals("小卷成退")){
|
|
|
+ thps.get(0).setMinThPcNum(thps.get(0).getMinThPcNum()+thps.get(i).getMinThPcNum());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ mergePro.setOpeProducePcNum(thps.size());
|
|
|
+ mergePro.setProduceTime(mergePro.getProduceTime()*thps.size());
|
|
|
+ mergeprocesses.add(mergePro);
|
|
|
+ nexts.add(mergePro);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ mergeprocesses.addAll(processesList);
|
|
|
+ nexts.addAll(processesList);
|
|
|
+ }
|
|
|
+ // 记录分卷已合并作业
|
|
|
+ List<String> proids = processesList.stream().map(ProductionProcesses::getId).collect(Collectors.toList());
|
|
|
+ hasMerge.addAll(proids);
|
|
|
+ }
|
|
|
+ // 递归合并分卷后的作业
|
|
|
+ if(nexts != null && nexts.size()>0){
|
|
|
+ for (ProductionProcesses next : nexts) {
|
|
|
+ thNextProMerge(next,notMergeProces,mergeprocesses,bsProceses,hasMerge,allProMap);
|
|
|
+ }
|
|
|
+ /*for (String nextbsid : nextbsids) {
|
|
|
+ fjNextMerge(nextbsid,notMergeProces,mergeprocesses,bsProceses,hasMerge,allProMap);
|
|
|
+ }*/
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 连续冷轧箔轧作业合并
|
|
|
+ * @param mergeprocesses
|
|
|
+ * @param otherSerProces
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<ProductionProcesses> seriesLzBzMerge(List<ProductionProcesses> mergeprocesses,List<ProductionProcesses> otherSerProces){
|
|
|
+ List<ProductionProcesses> retPros = new ArrayList<>();
|
|
|
+ if(mergeprocesses != null && mergeprocesses.size()>0){
|
|
|
+ // 获取所有根节点
|
|
|
+ List<ProductionProcesses> rootPros = new ArrayList<>();
|
|
|
+ for (ProductionProcesses mergeprocess : mergeprocesses) {
|
|
|
+ if(mergeprocess.getPreviousProcesses() == null || mergeprocess.getPreviousProcesses().size() == 0){
|
|
|
+ rootPros.add(mergeprocess);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 被合并的作业
|
|
|
+ List<ProductionProcesses> lzbzMergeOthers = new ArrayList<>();
|
|
|
+ // 根据根节点逐级查询是否可合并的作业
|
|
|
+ if(rootPros != null && rootPros.size()>0){
|
|
|
+ Map<String,List<ProductionProcesses>> lzbzMerges = new HashMap<>();
|
|
|
+ // 已合并处理过作业ID
|
|
|
+ List<String> hasMid = new ArrayList<>();
|
|
|
+ for (ProductionProcesses rootPro : rootPros) {
|
|
|
+ getLzBzSeries(rootPro,lzbzMerges,null,null,null,hasMid);
|
|
|
+ }
|
|
|
+ if(lzbzMerges != null && lzbzMerges.size()>0){
|
|
|
+ for (String k:lzbzMerges.keySet()){
|
|
|
+ List<ProductionProcesses> serPros = lzbzMerges.get(k);
|
|
|
+ // 连续冷轧或箔轧超过1个,则合并
|
|
|
+ if(serPros != null && serPros.size()>1){
|
|
|
+ ProductionProcesses fMergePro = serPros.get(0);
|
|
|
+ if(fMergePro.getMergeProOrders() == null){
|
|
|
+ fMergePro.setMergeProOrders(new ArrayList<>());
|
|
|
+ fMergePro.getMergeProOrders().add(fMergePro.getId());
|
|
|
+ }
|
|
|
+ // 按顺序依次合并
|
|
|
+ for (int i = 0; i < serPros.size(); i++) {
|
|
|
+ if(i>0){
|
|
|
+ serPros.get(i).setMergeThMainId(fMergePro.getId());
|
|
|
+ if(serPros.get(i).getMergeProOrders() == null){
|
|
|
+ fMergePro.getMergeProOrders().add(serPros.get(i).getId());
|
|
|
+ }else{
|
|
|
+ fMergePro.getMergeProOrders().addAll(serPros.get(i).getMergeProOrders());
|
|
|
+ }
|
|
|
+ fMergePro.setProduceTime(fMergePro.getProduceTime()+serPros.get(i).getProduceTime());
|
|
|
+ // 连续生产合并作业设置下道工序,以及合并后下道作业的上道工序
|
|
|
+ if(i == serPros.size()-1){
|
|
|
+ fMergePro.setNextProcesses(serPros.get(i).getNextProcesses());
|
|
|
+ fMergePro.setNextProcessesIds(serPros.get(i).getNextProcessesIds());
|
|
|
+ if(fMergePro.getNextProcesses() != null && fMergePro.getNextProcesses().size()>0){
|
|
|
+ for (ProductionProcesses nextProcess : fMergePro.getNextProcesses()) {
|
|
|
+ List<ProductionProcesses> pres = new ArrayList<>();
|
|
|
+ List<String> preids = new ArrayList<>();
|
|
|
+ pres.add(fMergePro);
|
|
|
+ preids.add(fMergePro.getId());
|
|
|
+ nextProcess.setPreviousProcesses(pres);
|
|
|
+ nextProcess.setPreviousProcessesIds(preids);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ lzbzMergeOthers.add(serPros.get(i));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 除去被合并的作业
|
|
|
+ if(lzbzMergeOthers != null && lzbzMergeOthers.size()>0){
|
|
|
+ List<String> lzbzMergeOtherIds = lzbzMergeOthers.stream().map(ProductionProcesses::getId).collect(Collectors.toList());
|
|
|
+ for (ProductionProcesses mergeprocess : mergeprocesses) {
|
|
|
+ if(!lzbzMergeOtherIds.contains(mergeprocess.getId())){
|
|
|
+ retPros.add(mergeprocess);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ retPros.addAll(mergeprocesses);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return retPros;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void getLzBzSeries(ProductionProcesses rootPro,Map<String,List<ProductionProcesses>> lzbzMerges
|
|
|
+ ,String seriesKey,String protype,List<String> commonEqus,List<String> hasMid){
|
|
|
+ if(!hasMid.contains(rootPro.getId())){
|
|
|
+ hasMid.add(rootPro.getId());
|
|
|
+ List<ProductionProcesses> nextProcesses = rootPro.getNextProcesses();
|
|
|
+ if("否".equals(rootPro.getIssubsection()) && ("冷轧".equals(rootPro.getProcessType()) || "箔轧".equals(rootPro.getProcessType()))){
|
|
|
+ // 是否连续冷轧、箔轧
|
|
|
+ boolean hasSeries = false;
|
|
|
+ if(StrUtil.isNotBlank(seriesKey) && StrUtil.isNotBlank(protype) && protype.equals(rootPro.getProcessType())){
|
|
|
+ if(commonEqus != null && commonEqus.size()>0){
|
|
|
+ List<String> commonEqusNext = new ArrayList<>();
|
|
|
+ for (String optionalEquipment : rootPro.getOptionalEquipments()) {
|
|
|
+ if(commonEqus.contains(optionalEquipment)){
|
|
|
+ commonEqusNext.add(optionalEquipment);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(commonEqusNext != null && commonEqusNext.size()>0){
|
|
|
+ hasSeries = true;
|
|
|
+ lzbzMerges.get(seriesKey).add(rootPro);
|
|
|
+ commonEqus = commonEqusNext;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(nextProcesses != null && nextProcesses.size()>0){
|
|
|
+ // 不能和上一道工序连续,则作为第一道连续工序
|
|
|
+ if(!hasSeries){
|
|
|
+ List<ProductionProcesses> serPros = new ArrayList<>();
|
|
|
+ serPros.add(rootPro);
|
|
|
+ lzbzMerges.put(rootPro.getId(),serPros);
|
|
|
+ // 上下道工序共用的可选设备
|
|
|
+ commonEqus = new ArrayList<>();
|
|
|
+ commonEqus.addAll(rootPro.getOptionalEquipments());
|
|
|
+ }
|
|
|
+ for (ProductionProcesses nextProcess : nextProcesses) {
|
|
|
+ if(hasSeries){
|
|
|
+ getLzBzSeries(nextProcess,lzbzMerges,seriesKey,rootPro.getProcessType(),commonEqus,hasMid);
|
|
|
+ }else{
|
|
|
+ getLzBzSeries(nextProcess,lzbzMerges,rootPro.getId(),rootPro.getProcessType(),commonEqus,hasMid);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ if(nextProcesses != null && nextProcesses.size()>0){
|
|
|
+ for (ProductionProcesses nextProcess : nextProcesses) {
|
|
|
+ getLzBzSeries(nextProcess,lzbzMerges,null,null,null,hasMid);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 多订单合并
|
|
|
* @param productionScheduleVo
|
|
@@ -452,7 +1314,7 @@ public class ApsServiceImpl implements ApsService {
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public List<ProductionProcesses> zzProcessAps(ProductionScheduleVo productionScheduleVo, ApsSolution apsSolution) {
|
|
|
+ public List<ProductionProcesses> zzProcessAps(ProductionScheduleVo productionScheduleVo, ApsSolution apsSolution,List<ProductionProcesses> otherNotZzFirstProces) {
|
|
|
ApsSolution apsSolutionZz = new ApsSolution();
|
|
|
List<ProductionProcesses> zzprocesList = new ArrayList<>();
|
|
|
for (ProductionProcesses process : apsSolution.getProcessesList()) {
|
|
@@ -460,6 +1322,14 @@ public class ApsServiceImpl implements ApsService {
|
|
|
zzprocesList.add(process);
|
|
|
}
|
|
|
}
|
|
|
+ if(zzprocesList.size() == 0){
|
|
|
+ for (ProductionProcesses process : apsSolution.getProcessesList()) {
|
|
|
+ if((process.getPreviousProcessesIds() == null || process.getPreviousProcessesIds().size() == 0) && !process.getIfLock()){
|
|
|
+ zzprocesList.add(process);
|
|
|
+ otherNotZzFirstProces.add(process);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
if(zzprocesList != null && zzprocesList.size()>0){
|
|
|
apsSolutionZz.setStartTime(apsSolution.getStartTime());
|
|
|
apsSolutionZz.setEquipmentList(apsSolution.getEquipmentList());
|
|
@@ -493,7 +1363,7 @@ public class ApsServiceImpl implements ApsService {
|
|
|
log.info("**************铸轧排程评分分析***************");
|
|
|
|
|
|
for (ProductionProcesses process : apsSolution.getProcessesList()) {
|
|
|
- if(process.getProcessType().equals("铸轧")){
|
|
|
+ if(process.getProcessType().equals("铸轧") || (process.getPreviousProcessesIds() == null || process.getPreviousProcessesIds().size() == 0)){
|
|
|
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());
|