hongjli
2025-05-22 bc0fdd1f0c20ca4737e8f073050f37b27a658694
管路&气柜产能负载优化,实现动态row聚合统计
已修改2个文件
67 ■■■■ 文件已修改
aps-modules/aps-core/src/main/java/com/aps/core/controller/ApsGasPipingRouteStatController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/controller/ApsGasPipingRouteStatController.java
@@ -122,7 +122,7 @@
    /**
     * 聚合气体管路产能负载统计数据
     */
    @Operation(summary = "聚合气体管路产能负载统计数据", description = "聚合统计数据")
    @Operation(summary = "聚合气体管路产能负载统计数据", description = "聚合统计数据,支持动态选择行维度(rowGroupBy)进行聚合,如按工序名称、车间、工厂、专业等")
    @RequiresPermissions("aps:apsGasPipingRouteStat:aggregate")
    @PostMapping("/aggregate")
    public AjaxResult aggregateGasPipingRouteStat(@RequestBody Map<String, Object> params)
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java
@@ -1316,10 +1316,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 +1452,45 @@
        }
        
        // 在Service层完成聚合
        // 使用组合key来实现多维度分组(工序名 + 可选的工厂/专业/车间)
        // 使用组合key来实现多维度分组(动态rowGroupBy字段 + 可选的工厂/专业/车间)
        Map<String, Map<String, Object>> groupInfoMap = new HashMap<>();
        Map<String, Map<String, BigDecimal>> groupTimeDataMap = new HashMap<>();
        
        // 遍历原始数据,按多维度分组进行聚合
        for (Map<String, Object> data : rawData) {
            // 过滤工序名称为空的数据
            String processName = getStringValue(data, "processName");
            if (processName == null) {
                log.warn("跳过处理:工序名称为null");
            if (processName == null || processName.trim().isEmpty()) {
                log.warn("跳过处理:工序名称为空");
                continue;
            }
            // 过滤车间为空的数据
            String workshop = getStringValue(data, "workshop");
            if (workshop == null || workshop.trim().isEmpty()) {
                log.warn("跳过处理:车间为空,工序名称={}", processName);
                continue;
            }
            // 获取行分组字段值
            String rowGroupValue = getStringValue(data, rowGroupBy);
            if (rowGroupValue == null) {
                log.warn("跳过处理:{} 字段值为null", rowGroupBy);
                continue;
            }
            
            // 处理开工日期
            Date processPlanStartDay = (Date) data.get("processPlanStartDay");
            if (processPlanStartDay == null) {
                log.warn("跳过处理:计划开工日为null, processName={}", processName);
                log.warn("跳过处理:计划开工日为null, {}={}", 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,10 +1508,11 @@
            // 记录分组的基本信息(只记录一次)
            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);
            }
            
@@ -1521,22 +1544,27 @@
        
        // 构建最终返回的数据结构
        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"));
            }
            // 保留工序名称信息,以便前端展示
            if (!"processName".equals(rowGroupBy)) {
                rowDetail.put("processName", groupInfo.get("processName"));
            }
            
            // 添加时间数据
@@ -1558,13 +1586,14 @@
                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);
        }
        
        result.put("plantTable", plantTable);
        result.put("timePoints", timePoints);
        result.put("rowGroupBy", rowGroupBy);
        
        return result;
    }