From 563b227acc04b19406cc4592f5db29b8110f2794 Mon Sep 17 00:00:00 2001
From: hongjli <3117313295@qq.com>
Date: 星期五, 23 五月 2025 13:02:36 +0800
Subject: [PATCH] 设计产能从产能规划中取值时取消对major的过滤
---
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java | 278 +++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 257 insertions(+), 21 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 0fa2422..d01e96b 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
@@ -6,10 +6,12 @@
import com.aps.common.core.utils.uuid.IdUtils;
import com.aps.common.security.utils.SecurityUtils;
import com.aps.core.domain.*;
+import com.aps.core.domain.ApsPlate.ApsPlateStandardRequireError;
import com.aps.core.mapper.*;
import com.aps.core.service.IApsGasMaterialUsageService;
import com.aps.core.service.IApsGasPipingRouteStatService;
import com.aps.core.service.IApsStandardProcessService;
+import com.aps.core.mapper.ApsPlateStandardRequireErrorMapper;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
@@ -58,6 +60,9 @@
@Autowired
private IApsStandardProcessService apsStandardProcessService;
+
+ @Autowired
+ private ApsPlateStandardRequireErrorMapper apsPlateStandardRequireErrorMapper;
/**
* 鏌ヨ姘斾綋绠¤矾浜ц兘璐熻浇缁熻
@@ -1117,6 +1122,12 @@
// 澶勭悊鎵嬪伐姘斾綋宸ュ崟鏁版嵁 - 浣跨敤鑱斿悎鏌ヨ鑾峰彇鎵�鏈夌浉鍏虫暟鎹�
List<Map<String, Object>> moDataList = apsGasPipingRouteStatMapper.selectMoRouteData();
+ // 鑾峰彇鎵�鏈夌殑MO鏁版嵁锛岀敤浜庢鏌ュ摢浜汳O娌℃湁鍏宠仈鍒板伐鑹鸿矾绾�
+ List<Map<String, Object>> allMoData = apsGasPipingRouteStatMapper.selectAllMoData();
+
+ // 璁板綍宸插叧鑱斿伐鑹鸿矾绾跨殑MO缂栧彿
+ Set<String> processedMoSet = new HashSet<>();
+
// 鎸夊伐鍗曞彿鍒嗙粍锛屼究浜庡鐞嗗悓涓�宸ュ崟鐨勪笉鍚屽伐搴�
Map<String, List<Map<String, Object>>> moGroups = moDataList.stream()
.collect(Collectors.groupingBy(data -> data.get("work_order_no").toString()));
@@ -1124,6 +1135,9 @@
// 澶勭悊姣忎釜宸ュ崟鐨勫伐鑹鸿矾绾�
for (String workOrderNo : moGroups.keySet()) {
List<Map<String, Object>> workOrderData = moGroups.get(workOrderNo);
+
+ // 鏍囪璇ュ伐鍗曞凡澶勭悊
+ processedMoSet.add(workOrderNo);
// 鎸夊伐搴忓彿鎺掑簭
workOrderData.sort((a, b) -> {
@@ -1202,6 +1216,36 @@
statList.addAll(processList);
}
+ }
+
+ // 澶勭悊娌℃湁鍏宠仈鍒板伐鑹鸿矾绾跨殑MO鏁版嵁
+ List<ApsPlateStandardRequireError> errorList = new ArrayList<>();
+ for (Map<String, Object> moData : allMoData) {
+ String workOrderNo = moData.get("mo").toString();
+ // 濡傛灉璇ュ伐鍗曟病鏈夎澶勭悊杩囷紝璇存槑娌℃湁鍏宠仈鍒板伐鑹鸿矾绾�
+ if (!processedMoSet.contains(workOrderNo)) {
+ ApsPlateStandardRequireError error = ApsPlateStandardRequireError.builder()
+ .id(Long.valueOf(IdUtils.fastSimpleUUID().hashCode()))
+ .batchNumber(batchNumber)
+ .requireId(IdUtil.getSnowflakeNextId())
+ .docNum(workOrderNo)
+ .itemNum(moData.get("material_code").toString())
+ .orgCode(moData.get("factory").toString())
+ .message("鏍囧噯宸ヨ壓璺嚎涓嶅瓨鍦�")
+ .delFlag("0")
+ .build();
+
+ // 璁剧疆鍩虹被灞炴��
+ error.setCreateBy(SecurityUtils.getUsername());
+ error.setCreateTime(truncateToSeconds(DateUtils.getNowDate()));
+
+ errorList.add(error);
+ }
+ }
+
+ // 鎵归噺鎻掑叆寮傚父鏁版嵁
+ if (!errorList.isEmpty()) {
+ apsPlateStandardRequireErrorMapper.batchInsert(errorList);
}
// 鎵归噺鎻掑叆鏁版嵁
@@ -1316,10 +1360,18 @@
String timeGranularity = params.containsKey("timeGranularity") ?
(String) params.get("timeGranularity") : "day"; // 榛樿涓�"鏃�"绮掑害
+ // 鑾峰彇row缁村害鐨勮仛鍚堝瓧娈� - 榛樿涓哄伐搴忓悕绉�(processName)
+ String rowGroupBy = params.containsKey("rowGroupBy") ?
+ (String) params.get("rowGroupBy") : "processName";
+
// 纭畾鍒嗙粍缁村害 - 宸ュ巶銆佷笓涓氥�佽溅闂�
boolean groupByPlant = params.containsKey("groupByPlant") && Boolean.TRUE.equals(params.get("groupByPlant"));
boolean groupByMajor = params.containsKey("groupByMajor") && Boolean.TRUE.equals(params.get("groupByMajor"));
boolean groupByWorkshop = params.containsKey("groupByWorkshop") && Boolean.TRUE.equals(params.get("groupByWorkshop"));
+ // 濡傛灉rowGroupBy宸茬粡鏄煇涓淮搴︼紝鍒欒缁村害涓嶉渶瑕佸啀娆″垎缁�
+ if ("plant".equals(rowGroupBy)) groupByPlant = false;
+ if ("major".equals(rowGroupBy)) groupByMajor = false;
+ if ("workshop".equals(rowGroupBy)) groupByWorkshop = false;
// 鏋勫缓鏌ヨ鏉′欢
Map<String, Object> queryParams = new HashMap<>();
@@ -1444,31 +1496,37 @@
}
// 鍦⊿ervice灞傚畬鎴愯仛鍚�
- // 浣跨敤缁勫悎key鏉ュ疄鐜板缁村害鍒嗙粍锛堝伐搴忓悕 + 鍙�夌殑宸ュ巶/涓撲笟/杞﹂棿锛�
+ // 浣跨敤缁勫悎key鏉ュ疄鐜板缁村害鍒嗙粍锛堝姩鎬乺owGroupBy瀛楁 + 鍙�夌殑宸ュ巶/涓撲笟/杞﹂棿锛�
Map<String, Map<String, Object>> groupInfoMap = new HashMap<>();
Map<String, Map<String, BigDecimal>> groupTimeDataMap = new HashMap<>();
+ // 瀛樺偍姣忎釜groupKey瀵瑰簲鐨刾rocessName闆嗗悎
+ Map<String, Set<String>> groupProcessNamesMap = new HashMap<>();
// 閬嶅巻鍘熷鏁版嵁锛屾寜澶氱淮搴﹀垎缁勮繘琛岃仛鍚�
for (Map<String, Object> data : rawData) {
- String processName = getStringValue(data, "processName");
- if (processName == null) {
- log.warn("璺宠繃澶勭悊锛氬伐搴忓悕绉颁负null");
+ // 鑾峰彇琛屽垎缁勫瓧娈靛��
+ String rowGroupValue = getStringValue(data, rowGroupBy);
+ if (rowGroupValue == null || rowGroupValue.trim().isEmpty()) {
+ log.warn("璺宠繃澶勭悊锛歿} 瀛楁鍊间负绌�", rowGroupBy);
continue;
}
+
+ // 鑾峰彇宸ュ簭鍚嶇О锛堢敤浜庢棩蹇楀拰鍚庣画澶勭悊锛�
+ String processName = getStringValue(data, "processName");
// 澶勭悊寮�宸ユ棩鏈�
Date processPlanStartDay = (Date) data.get("processPlanStartDay");
if (processPlanStartDay == null) {
- log.warn("璺宠繃澶勭悊锛氳鍒掑紑宸ユ棩涓簄ull, processName={}", processName);
+ log.warn("璺宠繃澶勭悊锛氳鍒掑紑宸ユ棩涓簄ull, {}={}", rowGroupBy, rowGroupValue);
continue;
}
- // 鏋勫缓鍒嗙粍閿� - 鍩轰簬宸ュ簭鍚嶅拰鍙�夌殑鍏朵粬缁村害
+ // 鏋勫缓鍒嗙粍閿� - 鍩轰簬row鍒嗙粍瀛楁鍜屽彲閫夌殑鍏朵粬缁村害
String plant = getStringValue(data, "plant");
String major = getStringValue(data, "major");
String workshop = getStringValue(data, "workshop");
- StringBuilder groupKeyBuilder = new StringBuilder(processName);
+ StringBuilder groupKeyBuilder = new StringBuilder(rowGroupValue);
// 鏍规嵁鐢ㄦ埛閫夋嫨鐨勫垎缁勭淮搴︽坊鍔犲埌鍒嗙粍閿�
if (groupByPlant && plant != null) {
@@ -1486,11 +1544,20 @@
// 璁板綍鍒嗙粍鐨勫熀鏈俊鎭紙鍙褰曚竴娆★級
if (!groupInfoMap.containsKey(groupKey)) {
Map<String, Object> groupInfo = new HashMap<>();
- groupInfo.put("processName", processName);
+ groupInfo.put(rowGroupBy, rowGroupValue);
groupInfo.put("plant", plant);
groupInfo.put("major", major);
groupInfo.put("workshop", workshop);
+ groupInfo.put("processName", processName);
groupInfoMap.put(groupKey, groupInfo);
+ }
+
+ // 鏀堕泦processName
+ if (processName != null && !processName.trim().isEmpty()) {
+ if (!groupProcessNamesMap.containsKey(groupKey)) {
+ groupProcessNamesMap.put(groupKey, new HashSet<>());
+ }
+ groupProcessNamesMap.get(groupKey).add(processName);
}
// 璁$畻鏃堕棿鐐筀ey
@@ -1521,22 +1588,36 @@
// 鏋勫缓鏈�缁堣繑鍥炵殑鏁版嵁缁撴瀯
for (String groupKey : groupInfoMap.keySet()) {
- Map<String, Object> processEntry = new HashMap<>();
- Map<String, Object> processDetail = new HashMap<>();
+ Map<String, Object> rowEntry = new HashMap<>();
+ Map<String, Object> rowDetail = new HashMap<>();
// 鑾峰彇璇ュ垎缁勭殑鍩烘湰淇℃伅
Map<String, Object> groupInfo = groupInfoMap.get(groupKey);
- String processName = (String) groupInfo.get("processName");
+ String rowGroupValue = (String) groupInfo.get(rowGroupBy);
- // 娣诲姞宸ュ簭鍩烘湰淇℃伅
+ // 娣诲姞鍒嗙粍鍩烘湰淇℃伅
if (groupByPlant) {
- processDetail.put("plant", groupInfo.get("plant"));
+ rowDetail.put("plant", groupInfo.get("plant"));
}
if (groupByMajor) {
- processDetail.put("major", groupInfo.get("major"));
+ rowDetail.put("major", groupInfo.get("major"));
}
if (groupByWorkshop) {
- processDetail.put("workshop", groupInfo.get("workshop"));
+ rowDetail.put("workshop", groupInfo.get("workshop"));
+ }
+
+ // 澶勭悊processName - 濡傛灉rowGroupBy涓簑orkshop锛屽垯灏嗘墍鏈塸rocessName鐢ㄥ垎鍙疯繛鎺�
+ if ("workshop".equals(rowGroupBy)) {
+ Set<String> processNames = groupProcessNamesMap.getOrDefault(groupKey, new HashSet<>());
+ if (!processNames.isEmpty()) {
+ String joinedProcessNames = String.join(";", processNames);
+ rowDetail.put("processName", joinedProcessNames);
+ } else {
+ rowDetail.put("processName", groupInfo.get("processName"));
+ }
+ } else if (!"processName".equals(rowGroupBy)) {
+ // 淇濈暀宸ュ簭鍚嶇О淇℃伅锛屼互渚垮墠绔睍绀�
+ rowDetail.put("processName", groupInfo.get("processName"));
}
// 娣诲姞鏃堕棿鏁版嵁
@@ -1546,25 +1627,180 @@
for (String timePoint : timePoints) {
Map<String, Object> pointData = new HashMap<>();
pointData.put("planDay", timePoint);
- pointData.put("designTimes", 0); // 璁捐宸ユ椂鏆傛椂缁�0
// 鑾峰彇璇ユ椂闂寸偣鐨勯渶姹傚伐鏃讹紝濡傛灉涓嶅瓨鍦ㄥ垯璁句负0
BigDecimal requireTimes = timeMap.getOrDefault(timePoint, BigDecimal.ZERO);
pointData.put("requireTimes", requireTimes);
- // 璁$畻浜ц兘璐熻嵎锛堟殏鏃朵负0锛�
+ // 璁捐宸ユ椂鍜屼骇鑳借礋鑽风◢鍚庤绠�
+ pointData.put("designTimes", 0);
pointData.put("capacityLoad", 0);
timeDataList.add(pointData);
}
- processDetail.put("timeData", timeDataList);
- processEntry.put(processName, processDetail);
- plantTable.add(processEntry);
+ rowDetail.put("timeData", timeDataList);
+ rowEntry.put(rowGroupValue, rowDetail);
+ plantTable.add(rowEntry);
}
-
+
+ // 鍦ㄨ繑鍥炲墠鏌ヨ璁捐浜ц兘鏁版嵁骞惰绠椾骇鑳借礋鑽�
+ for (Map<String, Object> rowEntry : plantTable) {
+ for (String rowKey : rowEntry.keySet()) {
+ Map<String, Object> rowDetail = (Map<String, Object>) rowEntry.get(rowKey);
+ List<Map<String, Object>> timeDataList = (List<Map<String, Object>>) rowDetail.get("timeData");
+
+ // 鑾峰彇鍩烘湰淇℃伅
+ String plant = rowDetail.containsKey("plant") ? (String) rowDetail.get("plant") : null;
+ String major = rowDetail.containsKey("major") ? (String) rowDetail.get("major") : null;
+ String workshop = rowDetail.containsKey("workshop") ? (String) rowDetail.get("workshop") : null;
+
+ // 澶勭悊涓嶅悓鐨剅owGroupBy鎯呭喌
+ if ("workshop".equals(rowGroupBy) && rowDetail.containsKey("processName")) {
+ // 鎯呭喌1: 鎸墂orkshop鑱氬悎锛岄渶瑕佹媶鍒唒rocessName瀛楁
+ String processNamesStr = (String) rowDetail.get("processName");
+ String[] processNames = processNamesStr.split(";");
+
+ // 浼樺寲鏌ヨ - 鍒涘缓缂撳瓨锛屾寜鏈堜唤缂撳瓨鏌ヨ缁撴灉
+ // Key: year-month-processName, Value: 鏌ヨ缁撴灉鍒楄〃
+ Map<String, List<ApsGasPipelineCapacityPlan>> capacityPlanCache = new HashMap<>();
+
+ // 閬嶅巻姣忎釜鏃堕棿鐐�
+ for (Map<String, Object> timeData : timeDataList) {
+ String planDay = (String) timeData.get("planDay");
+ BigDecimal requireTimes = new BigDecimal(timeData.get("requireTimes").toString());
+ BigDecimal totalDesignTimes = BigDecimal.ZERO;
+
+ // 鎷嗗垎骞存湀鏃�
+ String[] dateParts = planDay.split("-");
+ String year = dateParts[0];
+ String month = dateParts[1];
+ // 缁熶竴month鏍煎紡涓烘暣鏁板瓧绗︿覆锛屽幓鎺夊墠瀵奸浂
+ month = String.valueOf(Integer.parseInt(month));
+ String yearMonth = year + "-" + month;
+
+ // 绱姞澶氫釜宸ュ簭鐨勮璁′骇鑳�
+ for (String processName : processNames) {
+ // 鏋勫缓缂撳瓨閿�
+ String cacheKey = yearMonth + "-" + processName.trim();
+
+ // 浠庣紦瀛樿幏鍙栨垨鏌ヨ鏁版嵁
+ List<ApsGasPipelineCapacityPlan> capacityPlans;
+ if (capacityPlanCache.containsKey(cacheKey)) {
+ capacityPlans = capacityPlanCache.get(cacheKey);
+ } else {
+ // 浣跨敤涓撶敤鏌ヨ鏂规硶鏌ヨ璁捐浜ц兘鏁版嵁
+ // 鎸夋枃妗h姹傦細鏍规嵁process_name鍜宲lant鍘籥ps_gas_pipeline_capacity_plan琛ㄤ腑鏌ヨ
+ capacityPlans = apsGasPipelineCapacityPlanMapper.selectDesignCapacityForInterface2(
+ processName.trim(), year, month, null, plant);
+
+ // 灏嗙粨鏋滃瓨鍏ョ紦瀛�
+ capacityPlanCache.put(cacheKey, capacityPlans);
+ }
+
+ // 绱姞璁捐浜ц兘鍊�
+ for (ApsGasPipelineCapacityPlan plan : capacityPlans) {
+ if ("day".equalsIgnoreCase(timeGranularity)) {
+ // 鏃ョ矑搴︿娇鐢ㄦ棩浜у嚭鏁伴噺
+ if (plan.getDayProduceAllNum() != null) {
+ totalDesignTimes = totalDesignTimes.add(plan.getDayProduceAllNum());
+ }
+ } else {
+ // 鏈堢矑搴︿娇鐢ㄦ湀浜у嚭鎬绘暟閲�
+ if (plan.getMonthProduceAllNum() != null) {
+ totalDesignTimes = totalDesignTimes.add(plan.getMonthProduceAllNum());
+ }
+ }
+ }
+ }
+
+ // 鏇存柊璁捐宸ユ椂
+ timeData.put("designTimes", totalDesignTimes);
+
+ // 璁$畻浜ц兘璐熻嵎 = 闇�姹備骇鑳�/璁捐浜ц兘脳100%
+ if (totalDesignTimes.compareTo(BigDecimal.ZERO) > 0) {
+ BigDecimal capacityLoad = requireTimes
+ .divide(totalDesignTimes, 2, RoundingMode.HALF_UP)
+ .multiply(new BigDecimal(100));
+ timeData.put("capacityLoad", capacityLoad);
+ } else {
+ timeData.put("capacityLoad", 0);
+ }
+ }
+ } else {
+ // 鎯呭喌2: 鎸塸rocessName鎴栧叾浠栧瓧娈佃仛鍚�
+ String processName = rowDetail.containsKey("processName") ?
+ (String) rowDetail.get("processName") : rowKey;
+
+ // 浼樺寲鏌ヨ - 鍒涘缓缂撳瓨锛屾寜鏈堜唤缂撳瓨鏌ヨ缁撴灉
+ Map<String, List<ApsGasPipelineCapacityPlan>> capacityPlanCache = new HashMap<>();
+
+ // 閬嶅巻姣忎釜鏃堕棿鐐�
+ for (Map<String, Object> timeData : timeDataList) {
+ String planDay = (String) timeData.get("planDay");
+ BigDecimal requireTimes = new BigDecimal(timeData.get("requireTimes").toString());
+
+ // 鎷嗗垎骞存湀鏃�
+ String[] dateParts = planDay.split("-");
+ String year = dateParts[0];
+ String month = dateParts[1];
+ // 缁熶竴month鏍煎紡涓烘暣鏁板瓧绗︿覆锛屽幓鎺夊墠瀵奸浂
+ month = String.valueOf(Integer.parseInt(month));
+ String yearMonth = year + "-" + month;
+
+ // 鏋勫缓缂撳瓨閿�
+ String cacheKey = yearMonth + "-" + processName;
+
+ // 浠庣紦瀛樿幏鍙栨垨鏌ヨ鏁版嵁
+ List<ApsGasPipelineCapacityPlan> capacityPlans;
+ if (capacityPlanCache.containsKey(cacheKey)) {
+ capacityPlans = capacityPlanCache.get(cacheKey);
+ } else {
+ // 浣跨敤涓撶敤鏌ヨ鏂规硶鏌ヨ璁捐浜ц兘鏁版嵁
+ // 鎸夋枃妗h姹傦細鏍规嵁process_name鍜宲lant鍘籥ps_gas_pipeline_capacity_plan琛ㄤ腑鏌ヨ
+ capacityPlans = apsGasPipelineCapacityPlanMapper.selectDesignCapacityForInterface2(
+ processName, year, month, null, plant);
+
+ // 灏嗙粨鏋滃瓨鍏ョ紦瀛�
+ capacityPlanCache.put(cacheKey, capacityPlans);
+ }
+
+ // 绱姞璁捐浜ц兘鍊�
+ BigDecimal totalDesignTimes = BigDecimal.ZERO;
+ for (ApsGasPipelineCapacityPlan plan : capacityPlans) {
+ if ("day".equalsIgnoreCase(timeGranularity)) {
+ // 鏃ョ矑搴︿娇鐢ㄦ棩浜у嚭鏁伴噺
+ if (plan.getDayProduceAllNum() != null) {
+ totalDesignTimes = totalDesignTimes.add(plan.getDayProduceAllNum());
+ }
+ } else {
+ // 鏈堢矑搴︿娇鐢ㄦ湀浜у嚭鎬绘暟閲�
+ if (plan.getMonthProduceAllNum() != null) {
+ totalDesignTimes = totalDesignTimes.add(plan.getMonthProduceAllNum());
+ }
+ }
+ }
+
+ // 鏇存柊璁捐宸ユ椂
+ timeData.put("designTimes", totalDesignTimes);
+
+ // 璁$畻浜ц兘璐熻嵎 = 闇�姹備骇鑳�/璁捐浜ц兘脳100%
+ if (totalDesignTimes.compareTo(BigDecimal.ZERO) > 0) {
+ BigDecimal capacityLoad = requireTimes
+ .divide(totalDesignTimes, 2, RoundingMode.HALF_UP)
+ .multiply(new BigDecimal(100));
+ timeData.put("capacityLoad", capacityLoad);
+ } else {
+ timeData.put("capacityLoad", 0);
+ }
+ }
+ }
+ }
+ }
+
result.put("plantTable", plantTable);
result.put("timePoints", timePoints);
+ result.put("rowGroupBy", rowGroupBy);
return result;
}
--
Gitblit v1.9.3