From f306557dbcfc1583a45e26d86fdfe0aa4b446fb4 Mon Sep 17 00:00:00 2001
From: sfd <sun.sunshine@163.com>
Date: 星期三, 14 五月 2025 18:45:04 +0800
Subject: [PATCH] Merge branch 'dev' of http://192.168.50.149:8085/r/aps-backend into dev

---
 aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java |  289 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 287 insertions(+), 2 deletions(-)

diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java
index 3a71bcf..8bbf341 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java
@@ -32,6 +32,7 @@
 import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.stream.Collectors;
 
 import static java.util.stream.Collectors.groupingBy;
 
@@ -251,8 +252,7 @@
         return true;
     }
 
-    @Override
-    public JSONObject getCapacityPlanData(ApsGasPipingRouteStat apsGasPipingRouteStat) {
+    public JSONObject getCapacityPlanDataBackup(ApsGasPipingRouteStat apsGasPipingRouteStat) {
         JSONObject result = new JSONObject();
         YearMonth yearMonth = YearMonth.parse(apsGasPipingRouteStat.getSearchEndDate());
         int daysInMonth = yearMonth.lengthOfMonth();
@@ -422,6 +422,291 @@
     }
 
     @Override
+    public JSONObject getCapacityPlanData(ApsGasPipingRouteStat apsGasPipingRouteStat) {
+        JSONObject result = new JSONObject();
+        YearMonth yearMonth = YearMonth.parse(apsGasPipingRouteStat.getSearchEndDate());
+        int daysInMonth = yearMonth.lengthOfMonth();
+        LinkedHashSet<String> startPlanTimeSet = new LinkedHashSet<>();
+        //宸ュ簭鍒嗙粍缁熻
+        LinkedHashMap<String, List<ApsResourceDateStat>> processMap = new LinkedHashMap<>();
+        List<HashMap<String, List<ApsResourceDateStat>>> processList = new ArrayList<>();
+        try {
+            //鑾峰彇鏍囧噯宸ュ簭鍚嶇О
+            ApsStandardProcess apsStandardProcess = new ApsStandardProcess();
+            apsStandardProcess.setMajor(apsGasPipingRouteStat.getMajor().equals("gas")?"姘旀煖":"绠¤矾");
+            List<ApsStandardProcess> apsStandardProcessList = apsStandardProcessService.selectApsStandardProcessList(apsStandardProcess);
+            apsStandardProcessList.sort((a, b)->a.getProcessName().compareTo(b.getProcessName()));
+            for(ApsStandardProcess temp:apsStandardProcessList){
+                processMap.put(temp.getProcessName(), new ArrayList<ApsResourceDateStat>());
+            }
+            //鑾峰彇宸ュ簭璁″垝浜ц兘鏁版嵁
+            HashMap<String, ApsGasPipelineCapacityPlan> apsGasPipingPlanMap = new HashMap<>();
+            ApsGasPipelineCapacityPlan searchCapacityPlan = new ApsGasPipelineCapacityPlan();
+            searchCapacityPlan.setMajor(apsGasPipingRouteStat.getMajor().equals("gas")?"姘旀煖":"绠¤矾");
+            if("day".equals(apsGasPipingRouteStat.getSearchType())){
+                searchCapacityPlan.setYear(yearMonth.getYear()+"");
+                searchCapacityPlan.setMonth(yearMonth.getMonthValue()+"");
+                for(int i=1;i<=daysInMonth;i++){
+                    startPlanTimeSet.add(yearMonth +"-"+ (i<10?"0"+i:i));
+                }
+            }else if("month".equals(apsGasPipingRouteStat.getSearchType())){
+                searchCapacityPlan.setYear(yearMonth.getYear()+"");
+                YearMonth start = YearMonth.of(Integer.parseInt(apsGasPipingRouteStat.getSearchStartDate().split("-")[0]), Integer.parseInt(apsGasPipingRouteStat.getSearchStartDate().split("-")[1]));
+                YearMonth end = YearMonth.of(Integer.parseInt(apsGasPipingRouteStat.getSearchEndDate().split("-")[0]), Integer.parseInt(apsGasPipingRouteStat.getSearchEndDate().split("-")[1]));
+                List<String> yearMonths = getYearMonthsInRange(start, end);
+                startPlanTimeSet.addAll(yearMonths);
+            }
+            List<ApsGasPipelineCapacityPlan> apsGasPipelineCapacityPlanList = apsGasPipelineCapacityPlanMapper.selectApsGasPipelineCapacityPlanList(searchCapacityPlan);
+            apsGasPipelineCapacityPlanList.forEach(apsGasPipelineCapacityPlan -> {
+                String key = apsGasPipelineCapacityPlan.getProcessName() + "-" + apsGasPipelineCapacityPlan.getOrgCode() + "-" + apsGasPipelineCapacityPlan.getYear() + "-" + (Integer.parseInt(apsGasPipelineCapacityPlan.getMonth())<10?"0"+apsGasPipelineCapacityPlan.getMonth():apsGasPipelineCapacityPlan.getMonth());
+                apsGasPipingPlanMap.put(key, apsGasPipelineCapacityPlan);
+            });
+            //璁$畻鏃ヤ骇鑳芥暟鎹�
+            DateTimeFormatter formatter = null;
+            List<ApsGasPipingRouteStat> apsGasPipingRouteStats;
+            SimpleDateFormat simpleDateFormat = null;
+            apsGasPipingRouteStat.setSearchStartDate(apsGasPipingRouteStat.getSearchStartDate()+"-01 00:00:00");
+            apsGasPipingRouteStat.setSearchEndDate(apsGasPipingRouteStat.getSearchEndDate()+"-"+ daysInMonth +" 23:59:59");
+            if("day".equals(apsGasPipingRouteStat.getSearchType())){
+                formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            }else if("month".equals(apsGasPipingRouteStat.getSearchType())){
+                formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                simpleDateFormat = new SimpleDateFormat("yyyy-MM");
+            }
+            ApsGasPipingRouteStat queryStatParam = new ApsGasPipingRouteStat();
+            BeanUtils.copyProperties(apsGasPipingRouteStat,queryStatParam);
+            queryStatParam.setMajor("");
+            apsGasPipingRouteStats = apsGasPipingRouteStatMapper.selectApsGasPipingRouteStatList(queryStatParam);
+            //鏍规嵁寮�宸ユ棩杩涜鍗囧簭鎺掑簭
+            apsGasPipingRouteStats.sort((a, b)->a.getProcessPlanStartDay().compareTo(b.getProcessPlanStartDay()));
+            //宸ュ簭寮�宸ユ棩鏈�
+            String planStartDate = "";
+            //缁熻鎵�鏈夊伐搴忓搴旂殑寮�宸ユ椂闂�
+            for (ApsGasPipingRouteStat apsGasPipingRouteStatTemp : apsGasPipingRouteStats) {
+                if(processMap.containsKey(apsGasPipingRouteStatTemp.getProcessName())){
+                    planStartDate = simpleDateFormat.format(apsGasPipingRouteStatTemp.getProcessPlanStartDay());
+                    if("month".equals(apsGasPipingRouteStat.getSearchType())){
+                        planStartDate = planStartDate+"-01";
+                    }
+                    ApsResourceDateStat apsResourceDateStat = new ApsResourceDateStat();
+                    apsResourceDateStat.setPlanDay(LocalDate.parse(planStartDate, formatter));
+                    apsResourceDateStat.setResourceName(apsGasPipingRouteStatTemp.getProcessName());
+                    apsResourceDateStat.setPlant(apsGasPipingRouteStatTemp.getPlant());
+                    //鏌ヨ姘旀煖绠¤矾浜ц兘瑙勫垝琛�
+                    String capacityKey = apsGasPipingRouteStatTemp.getProcessName() + "-" + apsGasPipingRouteStatTemp.getPlant() + "-" + planStartDate.substring(0, 7);
+                    apsResourceDateStat.setDesignTimes(apsGasPipingPlanMap.get(capacityKey)!=null?apsGasPipingPlanMap.get(capacityKey).getDayProduceAllNum():new BigDecimal(0));
+                    //鏌ヨ鏂欏彿宸ュ簭浜ц兘琛�
+                    apsResourceDateStat.setRequireTimes(apsGasPipingRouteStatTemp.getProcessTotalTime());
+                    if(apsResourceDateStat.getDesignTimes().compareTo(BigDecimal.ZERO)>0){
+                        apsResourceDateStat.setCapacityLoad(apsResourceDateStat.getRequireTimes()
+                                .divide(apsResourceDateStat.getDesignTimes(), 2, RoundingMode.HALF_UP)
+                                .multiply(new BigDecimal(100)));
+                    }else{
+                        apsResourceDateStat.setCapacityLoad(BigDecimal.valueOf(0));
+                    }
+
+                    List<ApsResourceDateStat> apsResourceDateStatList = processMap.get(apsGasPipingRouteStatTemp.getProcessName());
+                    apsResourceDateStatList.add(apsResourceDateStat);
+                    processMap.put(apsGasPipingRouteStatTemp.getProcessName(), apsResourceDateStatList);
+                }
+            }
+            //鑱氬悎姣忛亾宸ュ簭鐨勫紑宸ユ椂闂村拰浜ц兘
+            for (Map.Entry<String, List<ApsResourceDateStat>> entry : processMap.entrySet()) {
+                String processName = entry.getKey();
+                List<ApsResourceDateStat> apsResourceDateStatList = entry.getValue();
+
+                if("day".equals(apsGasPipingRouteStat.getSearchType())) {
+                    // 鎸夊ぉ缁熻鏃朵繚鎸佸師鏈夐�昏緫锛屼笉鎸夊伐鍘傚垎缁�
+                    LinkedHashMap<String, ApsResourceDateStat> dayMap = new LinkedHashMap<>();
+
+                    // 棣栧厛锛屼负鎵�鏈夋棩鏈熷垱寤哄垵濮嬭褰�
+                    for(String date : startPlanTimeSet) {
+                        ApsResourceDateStat initStat = new ApsResourceDateStat();
+                        initStat.setPlanDay(LocalDate.parse(date, formatter));
+                        initStat.setResourceName(processName);
+                        initStat.setResourceGroupName(processName);
+                        initStat.setRequireTimes(new BigDecimal(0));
+                        String capacityKey = processName + "-" + date.substring(0,7);
+                        initStat.setDesignTimes(apsGasPipingPlanMap.get(capacityKey)!=null?apsGasPipingPlanMap.get(capacityKey).getDayProduceAllNum():new BigDecimal(0));
+                        initStat.setCapacityLoad(new BigDecimal(0));
+                        dayMap.put(date, initStat);
+                    }
+
+                    // 鐒跺悗澶勭悊瀹為檯鏁版嵁
+                    for (ApsResourceDateStat apsResourceDateStat : apsResourceDateStatList) {
+                        String dateKey = apsResourceDateStat.getPlanDay().toString();
+                        if(dayMap.containsKey(dateKey)){
+                            ApsResourceDateStat apsResourceDateStatTemp = dayMap.get(dateKey);
+                            String capacityKey = processName + "-" + dateKey.substring(0,7);
+                            apsResourceDateStatTemp.setDesignTimes(apsGasPipingPlanMap.get(capacityKey)!=null?apsGasPipingPlanMap.get(capacityKey).getDayProduceAllNum():new BigDecimal(0));
+                            apsResourceDateStatTemp.setRequireTimes(apsResourceDateStatTemp.getRequireTimes().add(apsResourceDateStat.getRequireTimes()));
+                            if(apsResourceDateStatTemp.getDesignTimes().compareTo(BigDecimal.ZERO) > 0){
+                                apsResourceDateStatTemp.setCapacityLoad(apsResourceDateStatTemp.getRequireTimes()
+                                        .divide(apsResourceDateStatTemp.getDesignTimes(), 2, RoundingMode.HALF_UP)
+                                        .multiply(new BigDecimal(100)));
+                            }else{
+                                apsResourceDateStatTemp.setCapacityLoad(new BigDecimal(0));
+                            }
+                            apsResourceDateStatTemp.setResourceGroupName(processName);
+                            apsResourceDateStatTemp.setPlanDay(apsResourceDateStat.getPlanDay());
+                            dayMap.put(dateKey, apsResourceDateStatTemp);
+                        }
+                    }
+
+                    List<ApsResourceDateStat> tempList = new ArrayList<>(dayMap.values());
+                    HashMap<String, List<ApsResourceDateStat>> temp = new HashMap<>();
+                    temp.put(processName, tempList);
+                    processList.add(temp);
+                } else {
+                    // 鎸夋湀缁熻鏃舵墠鎸夊伐鍘傚垎缁�
+                    if (apsResourceDateStatList.isEmpty()) {
+                        // 浠庝骇鑳借鍒掓暟鎹腑鑾峰彇鎵�鏈夌殑宸ュ巶
+                        Set<String> plants = apsGasPipelineCapacityPlanList.stream()
+                                .filter(plan -> plan.getProcessName().equals(processName))
+                                .map(ApsGasPipelineCapacityPlan::getOrgCode)
+                                .filter(orgCode -> orgCode != null && !orgCode.trim().isEmpty())
+                                .collect(Collectors.toSet());
+
+                        // 濡傛灉娌℃湁鎵惧埌浠讳綍鏈夋晥宸ュ巶锛岃烦杩囪繖涓伐搴�
+                        if (plants.isEmpty()) {
+                            continue;
+                        }
+
+                        // 涓烘瘡涓伐鍘傚垱寤虹┖璁板綍
+                        for (String plant : plants) {
+                            LinkedHashMap<String, ApsResourceDateStat> dayMap = new LinkedHashMap<>();
+                            // 涓烘瘡涓湀浠藉垱寤鸿褰�
+                            for(String monthDate : startPlanTimeSet) {
+                                String tempTime = monthDate + "-01";
+                                ApsResourceDateStat apsResourceDateStat = new ApsResourceDateStat();
+                                apsResourceDateStat.setPlanDay(LocalDate.parse(tempTime, formatter));
+                                apsResourceDateStat.setResourceName(processName);
+                                apsResourceDateStat.setResourceGroupName(processName + "-" + plant);
+                                apsResourceDateStat.setPlant(plant);
+                                apsResourceDateStat.setRequireTimes(new BigDecimal(0));
+                                String capacityKey = processName + "-" + plant + "-" + monthDate;
+                                apsResourceDateStat.setDesignTimes(apsGasPipingPlanMap.get(capacityKey)!=null?apsGasPipingPlanMap.get(capacityKey).getMonthProduceAllNum():new BigDecimal(0));
+                                apsResourceDateStat.setCapacityLoad(new BigDecimal(0));
+                                dayMap.put(monthDate, apsResourceDateStat);
+                            }
+                            List<ApsResourceDateStat> tempList = new ArrayList<>(dayMap.values());
+                            HashMap<String, List<ApsResourceDateStat>> temp = new HashMap<>();
+                            temp.put(processName + "-" + plant, tempList);
+                            processList.add(temp);
+                        }
+                    } else {
+                        // 鎸夊伐鍘傚垎缁勶紝骞惰繃婊ゆ帀plant涓簄ull鎴栫┖瀛楃涓茬殑璁板綍
+                        Map<String, List<ApsResourceDateStat>> plantGroups = apsResourceDateStatList.stream()
+                                .filter(stat -> stat.getPlant() != null && !stat.getPlant().trim().isEmpty())
+                                .collect(groupingBy(ApsResourceDateStat::getPlant));
+
+                        // 濡傛灉杩囨护鍚庢病鏈夋湁鏁堢殑宸ュ巶鏁版嵁锛岃烦杩囪繖涓伐搴�
+                        if (plantGroups.isEmpty()) {
+                            continue;
+                        }
+
+                        // 瀵规瘡涓伐鍘傜殑鏁版嵁杩涜澶勭悊
+                        for (Map.Entry<String, List<ApsResourceDateStat>> plantEntry : plantGroups.entrySet()) {
+                            String plant = plantEntry.getKey();
+                            // 鍐嶆纭plant涓嶄负绌�
+                            if (plant == null || plant.trim().isEmpty()) {
+                                continue;
+                            }
+                            List<ApsResourceDateStat> plantStats = plantEntry.getValue();
+                            LinkedHashMap<String, ApsResourceDateStat> dayMap = new LinkedHashMap<>();
+
+                            // 棣栧厛涓烘墍鏈夋湀浠藉垱寤哄垵濮嬭褰�
+                            for(String monthDate : startPlanTimeSet) {
+                                String tempTime = monthDate + "-01";
+                                ApsResourceDateStat initStat = new ApsResourceDateStat();
+                                initStat.setPlanDay(LocalDate.parse(tempTime, formatter));
+                                initStat.setResourceName(processName);
+                                initStat.setResourceGroupName(processName + "-" + plant);
+                                initStat.setPlant(plant);
+                                initStat.setRequireTimes(new BigDecimal(0));
+                                String capacityKey = processName + "-" + plant + "-" + monthDate;
+                                initStat.setDesignTimes(apsGasPipingPlanMap.get(capacityKey)!=null?apsGasPipingPlanMap.get(capacityKey).getMonthProduceAllNum():new BigDecimal(0));
+                                initStat.setCapacityLoad(new BigDecimal(0));
+                                dayMap.put(monthDate, initStat);
+                            }
+
+                            // 鐒跺悗澶勭悊瀹為檯鏁版嵁
+                            for (ApsResourceDateStat stat : plantStats) {
+                                String monthKey = stat.getPlanDay().toString().substring(0, 7);
+                                if (dayMap.containsKey(monthKey)) {
+                                    ApsResourceDateStat existingStat = dayMap.get(monthKey);
+                                    String capacityKey = processName + "-" + plant + "-" + monthKey;
+                                    existingStat.setDesignTimes(apsGasPipingPlanMap.get(capacityKey)!=null?apsGasPipingPlanMap.get(capacityKey).getMonthProduceAllNum():new BigDecimal(0));
+                                    existingStat.setRequireTimes(existingStat.getRequireTimes().add(stat.getRequireTimes()));
+                                    if(existingStat.getDesignTimes().compareTo(BigDecimal.ZERO) > 0){
+                                        existingStat.setCapacityLoad(existingStat.getRequireTimes()
+                                                .divide(existingStat.getDesignTimes(), 2, RoundingMode.HALF_UP)
+                                                .multiply(new BigDecimal(100)));
+                                    }
+                                }
+                            }
+
+                            List<ApsResourceDateStat> tempList = new ArrayList<>(dayMap.values());
+                            HashMap<String, List<ApsResourceDateStat>> temp = new HashMap<>();
+                            temp.put(processName + "_" + plant, tempList);
+                            processList.add(temp);
+                        }
+                    }
+                }
+            }
+            //鎺掑簭鏃堕棿鏍囬
+            List<String> sortedStartPlanTimeList = new ArrayList<>(startPlanTimeSet);
+            Collections.sort(sortedStartPlanTimeList);
+            for (int i=0;i<processList.size();i++){
+                HashMap<String, List<ApsResourceDateStat>> temp = processList.get(i);
+                for (Map.Entry<String, List<ApsResourceDateStat>> entry : temp.entrySet()){
+                    List<ApsResourceDateStat> apsResourceDateStatList = entry.getValue();
+                    String key = entry.getKey();
+                    List<ApsResourceDateStat> crtList = new ArrayList<>();
+                    for(String tempTime:sortedStartPlanTimeList) {
+                        if("month".equals(apsGasPipingRouteStat.getSearchType())){
+                            tempTime += "-01";
+                        }
+                        LocalDate crtDate = LocalDate.parse(tempTime, formatter);
+                        Optional<ApsResourceDateStat> first = apsResourceDateStatList.stream().filter(x -> x.getPlanDay().equals(crtDate)).findFirst();
+                        if (first.isPresent()) {
+                            ApsResourceDateStat apsResourceDateStat = first.get();
+                            crtList.add(apsResourceDateStat);
+                        } else {
+                            ApsResourceDateStat apsResourceDateStat = new ApsResourceDateStat();
+                            apsResourceDateStat.setPlanDay(LocalDate.parse(tempTime, formatter));
+                            String[] keyParts = key.split("-");
+                            String processNamePart = keyParts[0];
+                            String plantPart = keyParts[1];
+                            String capacityKey = processNamePart + "-" + plantPart + "-" + tempTime.substring(0,7);
+                            if ("month".equals(apsGasPipingRouteStat.getSearchType())) {
+                                apsResourceDateStat.setDesignTimes(apsGasPipingPlanMap.get(capacityKey) != null ? apsGasPipingPlanMap.get(capacityKey).getMonthProduceAllNum() : new BigDecimal(0));
+                            } else {
+                                apsResourceDateStat.setDesignTimes(apsGasPipingPlanMap.get(capacityKey) != null ? apsGasPipingPlanMap.get(capacityKey).getDayProduceAllNum() : new BigDecimal(0));
+                            }
+                            apsResourceDateStat.setRequireTimes(new BigDecimal(0));
+                            apsResourceDateStat.setCapacityLoad(new BigDecimal(0));
+                            apsResourceDateStat.setResourceName(processNamePart);
+                            apsResourceDateStat.setResourceGroupName(key);
+                            apsResourceDateStat.setPlant(plantPart);
+                            apsResourceDateStatList.add(apsResourceDateStat);
+                            crtList.add(apsResourceDateStat);
+                        }
+                        temp.put(entry.getKey(), crtList);
+                        processList.set(i, temp);
+                    }
+                }
+            }
+            result.put("planTable", processList);
+            result.put("planTitle", sortedStartPlanTimeList);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    @Override
     public void exportExcel(HttpServletResponse response, ApsGasPipingRouteStat apsGasPipingRouteStat) {
         SXSSFWorkbook wb = new SXSSFWorkbook(500);
         wb.createSheet();

--
Gitblit v1.9.3