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