zhanghl
2025-05-23 97ee5904ad00373cd60e1e12d26bad6b5cdb6b66
Merge remote-tracking branch 'origin/dev' into dev
已修改5个文件
119 ■■■■ 文件已修改
aps-modules/aps-core/src/main/java/com/aps/core/mapper/ApsGasPipingRouteStatMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/mapper/ApsPlateStandardRequireErrorMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/resources/mapper/core/ApsGasPipingRouteStatMapper.xml 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/resources/mapper/core/ApsPlate/ApsPlateStandardRequireErrorMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/mapper/ApsGasPipingRouteStatMapper.java
@@ -115,4 +115,11 @@
     * @return 原始统计数据列表
     */
    public List<Map<String, Object>> selectRawStatData(Map<String, Object> params);
    /**
     * 查询所有手工气体工单数据
     *
     * @return 所有手工气体工单数据
     */
    public List<Map<String, Object>> selectAllMoData();
}
aps-modules/aps-core/src/main/java/com/aps/core/mapper/ApsPlateStandardRequireErrorMapper.java
@@ -61,5 +61,13 @@
     */
    public int deleteApsPlateStandardRequireErrorByIds(Long[] ids);
    
    /**
     * 批量插入钣金标准需求异常信息
     *
     * @param errorList 需要插入的异常数据集合
     * @return 结果
     */
    public int batchInsert(List<ApsPlateStandardRequireError> errorList);
    int deleteLastPatch(String batchNumber);
}
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数据,用于检查哪些MO没有关联到工艺路线
        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);
        }
        
        // 批量插入数据
@@ -1458,26 +1502,15 @@
        
        // 遍历原始数据,按多维度分组进行聚合
        for (Map<String, Object> data : rawData) {
            // 过滤工序名称为空的数据
            String processName = getStringValue(data, "processName");
            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);
            if (rowGroupValue == null || rowGroupValue.trim().isEmpty()) {
                log.warn("跳过处理:{} 字段值为空", rowGroupBy);
                continue;
            }
            // 获取工序名称(用于日志和后续处理)
            String processName = getStringValue(data, "processName");
            
            // 处理开工日期
            Date processPlanStartDay = (Date) data.get("processPlanStartDay");
@@ -1489,6 +1522,7 @@
            // 构建分组键 - 基于row分组字段和可选的其他维度
            String plant = getStringValue(data, "plant");
            String major = getStringValue(data, "major");
            String workshop = getStringValue(data, "workshop");
            
            StringBuilder groupKeyBuilder = new StringBuilder(rowGroupValue);
            
@@ -1590,7 +1624,7 @@
            rowEntry.put(rowGroupValue, rowDetail);
            plantTable.add(rowEntry);
        }
        result.put("plantTable", plantTable);
        result.put("timePoints", timePoints);
        result.put("rowGroupBy", rowGroupBy);
aps-modules/aps-core/src/main/resources/mapper/core/ApsGasPipingRouteStatMapper.xml
@@ -261,13 +261,14 @@
            l.route_name as process_name,
            l.route_num as process_number,
            l.standard_time,
            m.domain,
            s.work_shop as workshop
            string_agg(DISTINCT m.domain, ';') as domain,
            string_agg(DISTINCT s.work_shop, ';') as workshop
        FROM aps_gas_pipeline_prediction p
        JOIN aps_standard_process_route_header h ON p.material_code = h.item_code AND p.factory = h.org_code
        JOIN aps_standard_process_route_line l ON h.route_id = l.route_id
        LEFT JOIN aps_material_product_group_management m ON p.material_code = m.material_code AND p.factory = m.factory
        LEFT JOIN aps_standard_process s ON l.route_name = s.process_name
        GROUP BY p.id, p.material_code, p.factory, p.predict_quantity, p.predict_date, h.route_id, l.route_name, l.route_num, l.standard_time
        ORDER BY p.material_code, l.route_num
    </select>
    
@@ -283,12 +284,13 @@
            r.process_name,
            r.process_number,
            r.standard_time,
            m.domain,
            s.work_shop as workshop
            string_agg(DISTINCT m.domain, ';') as domain,
            string_agg(DISTINCT s.work_shop, ';') as workshop
        FROM aps_gas_pipeline_mo mo
        JOIN aps_process_route r ON mo.mo = r.work_order_no
        LEFT JOIN aps_material_product_group_management m ON mo.material_code = m.material_code AND mo.factory = m.factory
        LEFT JOIN aps_standard_process s ON r.process_name = s.process_name
        GROUP BY mo.id, mo.mo, mo.material_code, mo.factory, mo.quantity, mo.plan_end, r.process_name, r.process_number, r.standard_time
        ORDER BY mo.mo, r.process_number
    </select>
    
@@ -399,4 +401,16 @@
            process_plan_start_day
    </select>
    <!-- 查询所有手工气体工单数据 -->
    <select id="selectAllMoData" resultType="java.util.Map">
        SELECT
            id,
            mo,
            factory,
            material_code,
            plan_end,
            quantity
        FROM aps_gas_pipeline_mo
    </select>
</mapper>
aps-modules/aps-core/src/main/resources/mapper/core/ApsPlate/ApsPlateStandardRequireErrorMapper.xml
@@ -107,4 +107,18 @@
        set del_flag = '1'
        where del_flag = '0' and batch_number != #{batchNumber}
    </update>
    <insert id="batchInsert" parameterType="java.util.List">
        insert into aps_plate_standard_require_error(
            id, batch_number, require_id, doc_num, item_num, org_code,
            message, del_flag, create_by, create_time
        ) values
        <foreach collection="list" item="item" separator=",">
            (
            #{item.id}, #{item.batchNumber}, #{item.requireId}, #{item.docNum},
            #{item.itemNum}, #{item.orgCode}, #{item.message}, #{item.delFlag},
            #{item.createBy}, #{item.createTime}
            )
        </foreach>
    </insert>
</mapper>