From c938c84792c6714af7ed57a6f51052dbf7fee5e7 Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Sat, 28 Feb 2026 13:43:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(inspect):=20=E8=A7=A3=E5=86=B3=E5=B7=A1?= =?UTF-8?q?=E6=A3=80=E6=A0=87=E5=87=86=E9=A1=B9=E7=9B=AEID=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=92=8C=E5=B7=A5=E5=8D=95=E7=94=9F=E6=88=90=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复巡检标准对应项目ID为空时的处理逻辑,避免插入空项目记录 - 添加resolveProjectIdByInspectStandard方法统一处理项目ID查询 - 在多个位置添加null检查和警告日志,提升系统健壮性 - 修复保养工单定时生成任务中的事务传播配置问题 - 调整工单生成服务的事务注解为REQUIRES_NEW传播方式 - 优化工单生成任务,对已存在的工单进行跳过处理并统计跳过数量 - 修复SQL映射文件中的JDBC类型定义问题 - 修复保养实例活动表的主键生成策略问题 --- aucma-dms/DMS_SEQUENCES.sql | 22 +++++++++++- .../DmsBillsInspectInstanceServiceImpl.java | 35 ++++++++++++++----- .../DmsBillsMaintInstanceServiceImpl.java | 3 +- .../service/impl/DmsPlanMaintServiceImpl.java | 17 +++++---- .../dms/DmsInspectInstanceDetailMapper.xml | 2 +- .../DmsInspectInstanceDetailProjectMapper.xml | 2 +- .../dms/DmsMaintInstanceActivityMapper.xml | 7 +++- .../resources/mapper/report/Board4Mapper.xml | 2 +- 8 files changed, 69 insertions(+), 21 deletions(-) diff --git a/aucma-dms/DMS_SEQUENCES.sql b/aucma-dms/DMS_SEQUENCES.sql index 58a693e..86f5620 100644 --- a/aucma-dms/DMS_SEQUENCES.sql +++ b/aucma-dms/DMS_SEQUENCES.sql @@ -309,6 +309,23 @@ CREATE SEQUENCE "HAIWEI"."SEQ_DMS_MAINT_INST" INCREMENT BY 1 CACHE 20; +-- ---------------------------- +-- 14A. SEQ_DMS_MAINT_INST_ACTIVITY (保养工单活动) +-- 表: DMS_MAINT_INSTANCE_ACTIVITY +-- ---------------------------- +BEGIN + EXECUTE IMMEDIATE 'DROP SEQUENCE "HAIWEI"."SEQ_DMS_MAINT_INST_ACTIVITY"'; +EXCEPTION + WHEN OTHERS THEN NULL; +END; +/ +CREATE SEQUENCE "HAIWEI"."SEQ_DMS_MAINT_INST_ACTIVITY" + MINVALUE 1 + MAXVALUE 9999999999999999999999999999 + START WITH 1 + INCREMENT BY 1 + CACHE 20; + -- ---------------------------- -- 15. SEQ_DMS_MAINT_DETAIL (保养工单明细) -- 表: DMS_BILLS_MAINT_DETAIL @@ -648,6 +665,8 @@ BEGIN sync_seq('HAIWEI.SEQ_FAULT_INSTANCE_ACTIVITY', 'HAIWEI.DMS_FAULT_INSTANCE_ACTIVITY', 'INSTANCE_ACTIVITY_ID'); -- 14. 保养工单 sync_seq('HAIWEI.SEQ_DMS_MAINT_INST', 'HAIWEI.DMS_BILLS_MAINT_INSTANCE', 'MAINT_INSTANCE_ID'); + -- 14A. 保养工单活动 + sync_seq('HAIWEI.SEQ_DMS_MAINT_INST_ACTIVITY', 'HAIWEI.DMS_MAINT_INSTANCE_ACTIVITY', 'INSTANCE_ACTIVITY_ID'); -- 14A. 巡检工单 sync_seq('HAIWEI.SEQ_DMS_BILLS_INSPECT_INSTANCE', 'HAIWEI.DMS_BILLS_INSPECT_INSTANCE', 'INSPECT_INSTANCE_ID'); -- 14B. 巡检工单活动 @@ -702,6 +721,7 @@ BEGIN grant_and_synonym('SEQ_DMS_BILLS_INSPECT_INSTANCE'); grant_and_synonym('SEQ_DMS_BILLS_INSPECT_ACTIVITY'); grant_and_synonym('SEQ_DMS_MAINT_INST'); + grant_and_synonym('SEQ_DMS_MAINT_INST_ACTIVITY'); grant_and_synonym('SEQ_DMS_MAINT_DETAIL'); grant_and_synonym('SEQ_DMS_MAINT_DTL_PROJ'); grant_and_synonym('SEQ_DMS_DISPATCH_PLAN'); @@ -723,6 +743,6 @@ END; -- ============================================ -- 执行完成提示 -- ============================================ --- 共创建 33 个序列,已按 MAX(主键)+1 对齐,已授权+同义词 +-- 共创建 34 个序列,已按 MAX(主键)+1 对齐,已授权+同义词 -- 验证: -- SELECT SEQUENCE_NAME, LAST_NUMBER FROM ALL_SEQUENCES WHERE SEQUENCE_OWNER='HAIWEI' AND (SEQUENCE_NAME LIKE 'SEQ_DMS%' OR SEQUENCE_NAME LIKE 'SEQ_FAULT%'); diff --git a/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsBillsInspectInstanceServiceImpl.java b/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsBillsInspectInstanceServiceImpl.java index edd3067..d622e22 100644 --- a/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsBillsInspectInstanceServiceImpl.java +++ b/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsBillsInspectInstanceServiceImpl.java @@ -155,17 +155,22 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta dmsInspectInstanceDetail.setInspectStandard(dmsInspectRouteDetail.getInspectStandard()); dmsInspectInstanceDetail.setInspectStatus("0"); dmsInspectInstanceDetailMapper.insertDmsInspectInstanceDetail(dmsInspectInstanceDetail); - Long projectId = dmsInspectInstanceDetailMapper.selectProjectId(dmsInspectRouteDetail.getInspectStandard()); + Long projectId = resolveProjectIdByInspectStandard(dmsInspectRouteDetail.getInspectStandard()); DmsInspectProjectDevice queryInspectProjectDevice = new DmsInspectProjectDevice(); queryInspectProjectDevice.setTargetType("2"); queryInspectProjectDevice.setTargetId(deviceId); List dmsInspectProjectDevices = dmsInspectProjectDeviceMapper.selectDmsInspectProjectDeviceList(queryInspectProjectDevice); // for(DmsInspectProjectDevice dmsInspectProjectDevice:dmsInspectProjectDevices){ - DmsInspectInstanceDetailProject dmsInspectInstanceDetailProject = new DmsInspectInstanceDetailProject(); - dmsInspectInstanceDetailProject.setInstanceDetailId(dmsInspectInstanceDetail.getInstanceDetailId()); - dmsInspectInstanceDetailProject.setInspectProjectId(projectId); - dmsInspectInstanceDetailProject.setCreateTime(new Date()); - dmsInspectInstanceDetailProjectMapper.insertDmsInspectInstanceDetailProject(dmsInspectInstanceDetailProject); + if (projectId != null) { + DmsInspectInstanceDetailProject dmsInspectInstanceDetailProject = new DmsInspectInstanceDetailProject(); + dmsInspectInstanceDetailProject.setInstanceDetailId(dmsInspectInstanceDetail.getInstanceDetailId()); + dmsInspectInstanceDetailProject.setInspectProjectId(projectId); + dmsInspectInstanceDetailProject.setCreateTime(new Date()); + dmsInspectInstanceDetailProjectMapper.insertDmsInspectInstanceDetailProject(dmsInspectInstanceDetailProject); + } else { + log.warn("未找到巡检标准对应的项目ID,跳过创建项目记录 | inspectStandard={}, deviceId={}, inspectRouteId={}", + dmsInspectRouteDetail.getInspectStandard(), deviceId, dmsBillsInspectInstance.getInspectRouteId()); + } // } } @@ -187,6 +192,13 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta return false; } + private Long resolveProjectIdByInspectStandard(String inspectStandard) { + if (inspectStandard == null || inspectStandard.trim().isEmpty()) { + return null; + } + return dmsInspectInstanceDetailMapper.selectProjectId(inspectStandard); + } + /** * 修改巡检工单 * @@ -290,7 +302,14 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta Long deviceId = dmsInspectInstanceDetail.getDeviceId(); DmsInspectInstanceDetailProject queryInspectInstanceDetailProject = new DmsInspectInstanceDetailProject(); queryInspectInstanceDetailProject.setDeviceId(deviceId); - Long projectId = dmsInspectInstanceDetailPrjectMapper.selectProjectByStandardId(dmsInspectInstanceDetail.getInspectStandard()); + Long projectId = resolveProjectIdByInspectStandard(dmsInspectInstanceDetail.getInspectStandard()); + if (projectId == null) { + log.warn("巡检标准为空或未配置项目,返回空项目列表 | inspectInstanceId={}, instanceDetailId={}, inspectStandard={}", + dmsBillsInspectInstanceScanVo.getInspectInstanceId(), dmsInspectInstanceDetail.getInstanceDetailId(), + dmsInspectInstanceDetail.getInspectStandard()); + dmsInspectInstanceDetail.setDmsInspectInstanceDetailProjectList(new ArrayList<>()); + return dmsInspectInstanceDetail; + } queryInspectInstanceDetailProject.setInspectProjectId(projectId); queryInspectInstanceDetailProject.setInstanceDetailId(dmsInspectInstanceDetail.getInstanceDetailId()); List dmsInspectInstanceDetailProjects = dmsInspectInstanceDetailPrjectMapper.selectDmsInspectInstanceDetailProjectJoinList(queryInspectInstanceDetailProject); @@ -528,7 +547,7 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta dmsInspectInstanceDetailMapper.insertDmsInspectInstanceDetail(detail); // 7) 创建明细项目记录:仅在“巡检标准 -> 项目”映射存在时落库。 - Long projectId = dmsInspectInstanceDetailMapper.selectProjectId(routeDetail.getInspectStandard()); + Long projectId = resolveProjectIdByInspectStandard(routeDetail.getInspectStandard()); if (projectId != null) { DmsInspectInstanceDetailProject detailProject = new DmsInspectInstanceDetailProject(); detailProject.setInstanceDetailId(detail.getInstanceDetailId()); diff --git a/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsBillsMaintInstanceServiceImpl.java b/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsBillsMaintInstanceServiceImpl.java index 897dfb2..49abb21 100644 --- a/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsBillsMaintInstanceServiceImpl.java +++ b/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsBillsMaintInstanceServiceImpl.java @@ -12,6 +12,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; @@ -414,7 +415,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS * 不依赖SecurityUtils,适合在定时任务上下文中调用 */ @Override - @Transactional(rollbackFor = Exception.class) + @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public int insertCompletedMaintInstance(String planMaintCode) { String planMaintCodeS = planMaintCode.replaceAll("\"", ""); DmsPlanMaint dmsPlanMaint = dmsPlanMaintMapper.selectDmsPlanMaintJoinByPlanMaintCode(planMaintCodeS); diff --git a/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsPlanMaintServiceImpl.java b/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsPlanMaintServiceImpl.java index a286cb9..b5e19f2 100644 --- a/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsPlanMaintServiceImpl.java +++ b/aucma-dms/src/main/java/com/aucma/dms/service/impl/DmsPlanMaintServiceImpl.java @@ -323,7 +323,6 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService { * cron表达式:秒 分 时 日 月 周 */ @Scheduled(cron = "0 0 0 * * ?") - @Transactional(rollbackFor = Exception.class) public void generateDailyMaintWorkOrders() { log.info("========== 开始执行保养工单生成任务 =========="); int count = 0; @@ -351,12 +350,16 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService { } // 通过Service创建已完成状态的保养工单(含明细,工单中所有设备默认保养完成,异常可在网页端维护) - dmsBillsMaintInstanceService.insertCompletedMaintInstance(planMaintCode); - count++; - log.info("已为保养计划[{}]生成已完成工单", planMaintCode); - - // 更新计划的下次执行时间(根据cron表达式或默认+1天) - updateMaintPlanNextTime(plan); + int insertRows = dmsBillsMaintInstanceService.insertCompletedMaintInstance(planMaintCode); + if (insertRows > 0) { + count++; + log.info("已为保养计划[{}]生成已完成工单", planMaintCode); + // 更新计划的下次执行时间(根据cron表达式或默认+1天) + updateMaintPlanNextTime(plan); + } else { + skipCount++; + log.debug("保养计划[{}]未生成工单(可能已存在或数据不完整),跳过", planMaintCode); + } } catch (Exception e) { log.error("为保养计划生成工单失败 | planMaintId={}, planMaintCode={}, cronExpression={}, maintTime={}, maintLevel={}, maintGroup={}, 异常信息: {}", diff --git a/aucma-dms/src/main/resources/mapper/dms/DmsInspectInstanceDetailMapper.xml b/aucma-dms/src/main/resources/mapper/dms/DmsInspectInstanceDetailMapper.xml index 82fedab..4c38423 100644 --- a/aucma-dms/src/main/resources/mapper/dms/DmsInspectInstanceDetailMapper.xml +++ b/aucma-dms/src/main/resources/mapper/dms/DmsInspectInstanceDetailMapper.xml @@ -154,6 +154,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ) where rownum = 1 diff --git a/aucma-dms/src/main/resources/mapper/dms/DmsInspectInstanceDetailProjectMapper.xml b/aucma-dms/src/main/resources/mapper/dms/DmsInspectInstanceDetailProjectMapper.xml index d1c15a3..2c37313 100644 --- a/aucma-dms/src/main/resources/mapper/dms/DmsInspectInstanceDetailProjectMapper.xml +++ b/aucma-dms/src/main/resources/mapper/dms/DmsInspectInstanceDetailProjectMapper.xml @@ -160,7 +160,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select instance_detail_id from dms_inspect_instance_detail where inspect_instance_id = #{inspectInstanceId} and line_step = #{lineStep}) diff --git a/aucma-dms/src/main/resources/mapper/dms/DmsMaintInstanceActivityMapper.xml b/aucma-dms/src/main/resources/mapper/dms/DmsMaintInstanceActivityMapper.xml index 596e0ae..422de16 100644 --- a/aucma-dms/src/main/resources/mapper/dms/DmsMaintInstanceActivityMapper.xml +++ b/aucma-dms/src/main/resources/mapper/dms/DmsMaintInstanceActivityMapper.xml @@ -56,9 +56,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where instance_activity_id = #{instanceActivityId} - + + + SELECT HAIWEI.SEQ_DMS_MAINT_INST_ACTIVITY.NEXTVAL FROM DUAL + insert into dms_maint_instance_activity + instance_activity_id, maint_instance_id, process_activity_id, maint_level, @@ -79,6 +83,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" attr1, + #{instanceActivityId}, #{maintInstanceId}, #{processActivityId}, #{maintLevel}, diff --git a/aucma-report/src/main/resources/mapper/report/Board4Mapper.xml b/aucma-report/src/main/resources/mapper/report/Board4Mapper.xml index 4ed2986..9559ad2 100644 --- a/aucma-report/src/main/resources/mapper/report/Board4Mapper.xml +++ b/aucma-report/src/main/resources/mapper/report/Board4Mapper.xml @@ -39,7 +39,7 @@ ) -->