fix(inspect): 解决巡检标准项目ID查询和工单生成问题

- 修复巡检标准对应项目ID为空时的处理逻辑,避免插入空项目记录
- 添加resolveProjectIdByInspectStandard方法统一处理项目ID查询
- 在多个位置添加null检查和警告日志,提升系统健壮性
- 修复保养工单定时生成任务中的事务传播配置问题
- 调整工单生成服务的事务注解为REQUIRES_NEW传播方式
- 优化工单生成任务,对已存在的工单进行跳过处理并统计跳过数量
- 修复SQL映射文件中的JDBC类型定义问题
- 修复保养实例活动表的主键生成策略问题
master
zangch@mesnac.com 2 days ago
parent bf571eb0be
commit c938c84792

@ -309,6 +309,23 @@ CREATE SEQUENCE "HAIWEI"."SEQ_DMS_MAINT_INST"
INCREMENT BY 1 INCREMENT BY 1
CACHE 20; 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 (保养工单明细) -- 15. SEQ_DMS_MAINT_DETAIL (保养工单明细)
-- 表: DMS_BILLS_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'); sync_seq('HAIWEI.SEQ_FAULT_INSTANCE_ACTIVITY', 'HAIWEI.DMS_FAULT_INSTANCE_ACTIVITY', 'INSTANCE_ACTIVITY_ID');
-- 14. 保养工单 -- 14. 保养工单
sync_seq('HAIWEI.SEQ_DMS_MAINT_INST', 'HAIWEI.DMS_BILLS_MAINT_INSTANCE', 'MAINT_INSTANCE_ID'); 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. 巡检工单 -- 14A. 巡检工单
sync_seq('HAIWEI.SEQ_DMS_BILLS_INSPECT_INSTANCE', 'HAIWEI.DMS_BILLS_INSPECT_INSTANCE', 'INSPECT_INSTANCE_ID'); sync_seq('HAIWEI.SEQ_DMS_BILLS_INSPECT_INSTANCE', 'HAIWEI.DMS_BILLS_INSPECT_INSTANCE', 'INSPECT_INSTANCE_ID');
-- 14B. 巡检工单活动 -- 14B. 巡检工单活动
@ -702,6 +721,7 @@ BEGIN
grant_and_synonym('SEQ_DMS_BILLS_INSPECT_INSTANCE'); grant_and_synonym('SEQ_DMS_BILLS_INSPECT_INSTANCE');
grant_and_synonym('SEQ_DMS_BILLS_INSPECT_ACTIVITY'); grant_and_synonym('SEQ_DMS_BILLS_INSPECT_ACTIVITY');
grant_and_synonym('SEQ_DMS_MAINT_INST'); 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_DETAIL');
grant_and_synonym('SEQ_DMS_MAINT_DTL_PROJ'); grant_and_synonym('SEQ_DMS_MAINT_DTL_PROJ');
grant_and_synonym('SEQ_DMS_DISPATCH_PLAN'); 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%'); -- SELECT SEQUENCE_NAME, LAST_NUMBER FROM ALL_SEQUENCES WHERE SEQUENCE_OWNER='HAIWEI' AND (SEQUENCE_NAME LIKE 'SEQ_DMS%' OR SEQUENCE_NAME LIKE 'SEQ_FAULT%');

@ -155,17 +155,22 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
dmsInspectInstanceDetail.setInspectStandard(dmsInspectRouteDetail.getInspectStandard()); dmsInspectInstanceDetail.setInspectStandard(dmsInspectRouteDetail.getInspectStandard());
dmsInspectInstanceDetail.setInspectStatus("0"); dmsInspectInstanceDetail.setInspectStatus("0");
dmsInspectInstanceDetailMapper.insertDmsInspectInstanceDetail(dmsInspectInstanceDetail); dmsInspectInstanceDetailMapper.insertDmsInspectInstanceDetail(dmsInspectInstanceDetail);
Long projectId = dmsInspectInstanceDetailMapper.selectProjectId(dmsInspectRouteDetail.getInspectStandard()); Long projectId = resolveProjectIdByInspectStandard(dmsInspectRouteDetail.getInspectStandard());
DmsInspectProjectDevice queryInspectProjectDevice = new DmsInspectProjectDevice(); DmsInspectProjectDevice queryInspectProjectDevice = new DmsInspectProjectDevice();
queryInspectProjectDevice.setTargetType("2"); queryInspectProjectDevice.setTargetType("2");
queryInspectProjectDevice.setTargetId(deviceId); queryInspectProjectDevice.setTargetId(deviceId);
List<DmsInspectProjectDevice> dmsInspectProjectDevices = dmsInspectProjectDeviceMapper.selectDmsInspectProjectDeviceList(queryInspectProjectDevice); List<DmsInspectProjectDevice> dmsInspectProjectDevices = dmsInspectProjectDeviceMapper.selectDmsInspectProjectDeviceList(queryInspectProjectDevice);
// for(DmsInspectProjectDevice dmsInspectProjectDevice:dmsInspectProjectDevices){ // for(DmsInspectProjectDevice dmsInspectProjectDevice:dmsInspectProjectDevices){
if (projectId != null) {
DmsInspectInstanceDetailProject dmsInspectInstanceDetailProject = new DmsInspectInstanceDetailProject(); DmsInspectInstanceDetailProject dmsInspectInstanceDetailProject = new DmsInspectInstanceDetailProject();
dmsInspectInstanceDetailProject.setInstanceDetailId(dmsInspectInstanceDetail.getInstanceDetailId()); dmsInspectInstanceDetailProject.setInstanceDetailId(dmsInspectInstanceDetail.getInstanceDetailId());
dmsInspectInstanceDetailProject.setInspectProjectId(projectId); dmsInspectInstanceDetailProject.setInspectProjectId(projectId);
dmsInspectInstanceDetailProject.setCreateTime(new Date()); dmsInspectInstanceDetailProject.setCreateTime(new Date());
dmsInspectInstanceDetailProjectMapper.insertDmsInspectInstanceDetailProject(dmsInspectInstanceDetailProject); 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; 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(); Long deviceId = dmsInspectInstanceDetail.getDeviceId();
DmsInspectInstanceDetailProject queryInspectInstanceDetailProject = new DmsInspectInstanceDetailProject(); DmsInspectInstanceDetailProject queryInspectInstanceDetailProject = new DmsInspectInstanceDetailProject();
queryInspectInstanceDetailProject.setDeviceId(deviceId); 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.setInspectProjectId(projectId);
queryInspectInstanceDetailProject.setInstanceDetailId(dmsInspectInstanceDetail.getInstanceDetailId()); queryInspectInstanceDetailProject.setInstanceDetailId(dmsInspectInstanceDetail.getInstanceDetailId());
List<DmsInspectInstanceDetailProject> dmsInspectInstanceDetailProjects = dmsInspectInstanceDetailPrjectMapper.selectDmsInspectInstanceDetailProjectJoinList(queryInspectInstanceDetailProject); List<DmsInspectInstanceDetailProject> dmsInspectInstanceDetailProjects = dmsInspectInstanceDetailPrjectMapper.selectDmsInspectInstanceDetailProjectJoinList(queryInspectInstanceDetailProject);
@ -528,7 +547,7 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
dmsInspectInstanceDetailMapper.insertDmsInspectInstanceDetail(detail); dmsInspectInstanceDetailMapper.insertDmsInspectInstanceDetail(detail);
// 7) 创建明细项目记录:仅在“巡检标准 -> 项目”映射存在时落库。 // 7) 创建明细项目记录:仅在“巡检标准 -> 项目”映射存在时落库。
Long projectId = dmsInspectInstanceDetailMapper.selectProjectId(routeDetail.getInspectStandard()); Long projectId = resolveProjectIdByInspectStandard(routeDetail.getInspectStandard());
if (projectId != null) { if (projectId != null) {
DmsInspectInstanceDetailProject detailProject = new DmsInspectInstanceDetailProject(); DmsInspectInstanceDetailProject detailProject = new DmsInspectInstanceDetailProject();
detailProject.setInstanceDetailId(detail.getInstanceDetailId()); detailProject.setInstanceDetailId(detail.getInstanceDetailId());

@ -12,6 +12,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -414,7 +415,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
* SecurityUtils * SecurityUtils
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public int insertCompletedMaintInstance(String planMaintCode) { public int insertCompletedMaintInstance(String planMaintCode) {
String planMaintCodeS = planMaintCode.replaceAll("\"", ""); String planMaintCodeS = planMaintCode.replaceAll("\"", "");
DmsPlanMaint dmsPlanMaint = dmsPlanMaintMapper.selectDmsPlanMaintJoinByPlanMaintCode(planMaintCodeS); DmsPlanMaint dmsPlanMaint = dmsPlanMaintMapper.selectDmsPlanMaintJoinByPlanMaintCode(planMaintCodeS);

@ -323,7 +323,6 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService {
* cron * cron
*/ */
@Scheduled(cron = "0 0 0 * * ?") @Scheduled(cron = "0 0 0 * * ?")
@Transactional(rollbackFor = Exception.class)
public void generateDailyMaintWorkOrders() { public void generateDailyMaintWorkOrders() {
log.info("========== 开始执行保养工单生成任务 =========="); log.info("========== 开始执行保养工单生成任务 ==========");
int count = 0; int count = 0;
@ -351,12 +350,16 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService {
} }
// 通过Service创建已完成状态的保养工单含明细工单中所有设备默认保养完成异常可在网页端维护 // 通过Service创建已完成状态的保养工单含明细工单中所有设备默认保养完成异常可在网页端维护
dmsBillsMaintInstanceService.insertCompletedMaintInstance(planMaintCode); int insertRows = dmsBillsMaintInstanceService.insertCompletedMaintInstance(planMaintCode);
if (insertRows > 0) {
count++; count++;
log.info("已为保养计划[{}]生成已完成工单", planMaintCode); log.info("已为保养计划[{}]生成已完成工单", planMaintCode);
// 更新计划的下次执行时间根据cron表达式或默认+1天 // 更新计划的下次执行时间根据cron表达式或默认+1天
updateMaintPlanNextTime(plan); updateMaintPlanNextTime(plan);
} else {
skipCount++;
log.debug("保养计划[{}]未生成工单(可能已存在或数据不完整),跳过", planMaintCode);
}
} catch (Exception e) { } catch (Exception e) {
log.error("为保养计划生成工单失败 | planMaintId={}, planMaintCode={}, cronExpression={}, maintTime={}, maintLevel={}, maintGroup={}, 异常信息: {}", log.error("为保养计划生成工单失败 | planMaintId={}, planMaintCode={}, cronExpression={}, maintTime={}, maintLevel={}, maintGroup={}, 异常信息: {}",

@ -154,6 +154,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
) where rownum = 1 ) where rownum = 1
</select> </select>
<select id="selectProjectId" resultType="java.lang.Long" parameterType="java.lang.String"> <select id="selectProjectId" resultType="java.lang.Long" parameterType="java.lang.String">
SELECT x.inspect_project_id FROM dms_base_inspect_standard x where x.inspect_standard_id = #{inspectStandard} SELECT x.inspect_project_id FROM dms_base_inspect_standard x where x.inspect_standard_id = #{inspectStandard,jdbcType=VARCHAR}
</select> </select>
</mapper> </mapper>

@ -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}) select instance_detail_id from dms_inspect_instance_detail where inspect_instance_id = #{inspectInstanceId} and line_step = #{lineStep})
</select> </select>
<select id="selectProjectByStandardId" resultType="java.lang.Long" parameterType="java.lang.String"> <select id="selectProjectByStandardId" resultType="java.lang.Long" parameterType="java.lang.String">
SELECT x.inspect_project_id FROM dms_base_inspect_standard x where x.inspect_standard_id = #{inspectStandard} SELECT x.inspect_project_id FROM dms_base_inspect_standard x where x.inspect_standard_id = #{inspectStandard,jdbcType=VARCHAR}
</select> </select>
</mapper> </mapper>

@ -56,9 +56,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where instance_activity_id = #{instanceActivityId} where instance_activity_id = #{instanceActivityId}
</select> </select>
<insert id="insertDmsMaintInstanceActivity" parameterType="DmsMaintInstanceActivity" useGeneratedKeys="true" keyProperty="instanceActivityId"> <insert id="insertDmsMaintInstanceActivity" parameterType="DmsMaintInstanceActivity">
<selectKey keyProperty="instanceActivityId" resultType="long" order="BEFORE">
SELECT HAIWEI.SEQ_DMS_MAINT_INST_ACTIVITY.NEXTVAL FROM DUAL
</selectKey>
insert into dms_maint_instance_activity insert into dms_maint_instance_activity
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
<if test="instanceActivityId != null">instance_activity_id,</if>
<if test="maintInstanceId != null">maint_instance_id,</if> <if test="maintInstanceId != null">maint_instance_id,</if>
<if test="processActivityId != null">process_activity_id,</if> <if test="processActivityId != null">process_activity_id,</if>
<if test="maintLevel != null">maint_level,</if> <if test="maintLevel != null">maint_level,</if>
@ -79,6 +83,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="attr1 != null">attr1,</if> <if test="attr1 != null">attr1,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="instanceActivityId != null">#{instanceActivityId},</if>
<if test="maintInstanceId != null">#{maintInstanceId},</if> <if test="maintInstanceId != null">#{maintInstanceId},</if>
<if test="processActivityId != null">#{processActivityId},</if> <if test="processActivityId != null">#{processActivityId},</if>
<if test="maintLevel != null">#{maintLevel},</if> <if test="maintLevel != null">#{maintLevel},</if>

Loading…
Cancel
Save