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); 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>