Commit 57fed8f8 authored by tianbo's avatar tianbo

feat(jg): 安全追溯错误问题修复

- 在CommonMapper中新增queryInMaintenanceRecord和queryInInspectionRecord方法 - 在CommonMapper.xml中实现两个新查询SQL,用于获取在保养和检验中的设备记录 - 优化产权单位联系人电话获取逻辑,增加空值判断 - 完善检验检测信息最新记录查询逻辑,增加REC_DATE排序字段 -重构SafetyProblemTracingGenService中超期数据修复逻辑,支持处理大量数据集 - 新增processLargeResultSet方法用于分批处理大数据量结果集 - 修改handleOutOfMaintenanceErrorData和handleOutOfInspectionErrorData方法签名, 增加对正常状态设备的过滤处理 - 调整维保与检验超期数据修正逻辑,提高数据准确性
parent 212bbefa
......@@ -375,6 +375,10 @@ public interface CommonMapper extends BaseMapper<EquipmentCategory> {
Map<String, String> queryTcmUnitInfoBySeq(@Param("unitSeq") String unitSeq, @Param("unitType") String unitType);
String queryTcmUnitSeqByCreditCode(@Param("unitCreditCode") String unitCreditCode, @Param("unitType") String unitType);
// 产权单位调整为可输入或选择--结束
List<Map<String, Object>> queryInMaintenanceRecord();
List<Map<String, Object>> queryInInspectionRecord();
}
......@@ -1177,7 +1177,7 @@
SELECT "RECORD","NEXT_INSPECT_DATE",rowNum1
FROM
(
SELECT ROW_NUMBER () OVER ( PARTITION BY "RECORD" ORDER BY "INSPECT_DATE" DESC) AS rowNum1,"RECORD", "NEXT_INSPECT_DATE"
SELECT ROW_NUMBER () OVER ( PARTITION BY "RECORD" ORDER BY "INSPECT_DATE" DESC, REC_DATE DESC) AS rowNum1,"RECORD", "NEXT_INSPECT_DATE"
FROM
idx_biz_jg_inspection_detection_info where "NEXT_INSPECT_DATE" is not null
) d
......@@ -3501,4 +3501,49 @@
and unit_type = #{unitType}
</if>
</select>
<select id="queryInMaintenanceRecord" resultType="java.util.Map">
SELECT
ui."RECORD"
FROM
idx_biz_jg_use_info ui
LEFT JOIN idx_biz_jg_other_info oi ON oi."RECORD" = ui."RECORD"
LEFT JOIN idx_biz_jg_supervision_info si on si."RECORD" = ui."RECORD"
LEFT JOIN (
SELECT
"RECORD", "INFORM_END", rowNum1
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY "RECORD" ORDER BY "REC_DATE" DESC) AS rowNum1, "RECORD", "INFORM_END"
FROM
idx_biz_jg_maintenance_record_info where "INFORM_END" is not null
) d
WHERE d.rowNum1 = 1 and d."INFORM_END" >= CURRENT_DATE
) tt on tt."RECORD" = ui."RECORD"
WHERE si."ORG_BRANCH_CODE" like '50%'
and oi."CLAIM_STATUS" not in ('草稿','已拒领','待认领')
and tt."INFORM_END" is not null
</select>
<select id="queryInInspectionRecord" resultType="java.util.Map">
SELECT
ui."RECORD"
FROM
idx_biz_jg_use_info ui
LEFT JOIN idx_biz_jg_other_info oi ON oi."RECORD" = ui."RECORD"
LEFT JOIN idx_biz_jg_supervision_info si on si."RECORD" = ui."RECORD"
LEFT JOIN (
SELECT "RECORD", "NEXT_INSPECT_DATE", rowNum1
FROM
(
SELECT ROW_NUMBER () OVER ( PARTITION BY "RECORD" ORDER BY "INSPECT_DATE" DESC, "REC_DATE" DESC) AS rowNum1, "RECORD", "NEXT_INSPECT_DATE"
FROM
idx_biz_jg_inspection_detection_info where "NEXT_INSPECT_DATE" is not null
) d
WHERE d.rowNum1 =1 and d."NEXT_INSPECT_DATE" >= CURRENT_DATE
) tt on tt."RECORD" = ui."RECORD"
WHERE si."ORG_BRANCH_CODE" like '50%'
AND oi."CLAIM_STATUS" not in ('草稿','已拒领','待认领')
AND tt."NEXT_INSPECT_DATE" is not null
</select>
</mapper>
......@@ -2501,9 +2501,11 @@ public class CommonServiceImpl implements ICommonService {
wrapper.eq(TzBaseEnterpriseInfo::getUseUnitCode, formData.getString("estateUnitName").split("_")[0]);
//产权单位联系电话
TzBaseEnterpriseInfo tzBaseEnterpriseInfo = enterpriseInfoMapper.selectOne(wrapper);
String contactPhone = tzBaseEnterpriseInfo.getContactPhone();
if (StringUtils.isNotEmpty(contactPhone)) {
formData.put("estatePhone", contactPhone);
if (!ValidationUtil.isEmpty(tzBaseEnterpriseInfo)) {
String contactPhone = tzBaseEnterpriseInfo.getContactPhone();
if (StringUtils.isNotEmpty(contactPhone)) {
formData.put("estatePhone", contactPhone);
}
}
formData.put("CQUnitCode", formData.getString("estateUnitName").split("_")[0]);
formData.put("estateUnitName", formData.getString("estateUnitName").split("_")[1]);
......
......@@ -31,7 +31,7 @@ public class IdxBizJgInspectionDetectionInfoServiceImpl extends BaseService<IdxB
public IdxBizJgInspectionDetectionInfo queryNewestDetailByRecord(String record) {
IdxBizJgInspectionDetectionInfo result = new IdxBizJgInspectionDetectionInfo();
QueryWrapper<IdxBizJgInspectionDetectionInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(IdxBizJgInspectionDetectionInfo::getRecord,record).orderByDesc(IdxBizJgInspectionDetectionInfo::getInspectDate);
queryWrapper.lambda().eq(IdxBizJgInspectionDetectionInfo::getRecord,record).orderByDesc(IdxBizJgInspectionDetectionInfo::getInspectDate, IdxBizJgInspectionDetectionInfo::getRecDate);
List<IdxBizJgInspectionDetectionInfo> inspectionDetectionInfoList = list(queryWrapper);
if (!ValidationUtil.isEmpty(inspectionDetectionInfoList)) {
BeanUtils.copyProperties(inspectionDetectionInfoList.get(0), result);
......
......@@ -91,7 +91,6 @@ public class SafetyProblemTracingGenServiceImpl{
}
}
public void executePersonnalCertificationCheck() {
logger.info("开始人员资质超期检查");
List<Map<String, Object>> certificationRecords = commonMapper.queryOutOfCertificationRecord();
......@@ -252,14 +251,20 @@ public class SafetyProblemTracingGenServiceImpl{
public void repairMaintenanceAndInspectionOverdueProblem() {
logger.info("开始设备维保备案和检验检测超期数据修正");
Set<String> realOutOfMaintenanceRecord = commonMapper.queryOutOfMaintenanceRecord().stream().map(m -> m.get("RECORD").toString()).collect(Collectors.toSet());
Set<String> realOutOfInspectRecord = commonMapper.queryOutOfInspectionRecord().stream().map(m -> m.get("RECORD").toString()).collect(Collectors.toSet());
Set<String> realOutOfMaintenanceRecord = Sets.newHashSet();
processLargeResultSet(() -> commonMapper.queryOutOfMaintenanceRecord(), realOutOfMaintenanceRecord);
Set<String> inMaintenanceRecord = Sets.newHashSet();
processLargeResultSet(() -> commonMapper.queryInMaintenanceRecord(), inMaintenanceRecord);
Set<String> realOutOfInspectRecord = Sets.newHashSet();
processLargeResultSet(() -> commonMapper.queryOutOfInspectionRecord(), realOutOfInspectRecord);
Set<String> inInspectRecord = Sets.newHashSet();
processLargeResultSet(() -> commonMapper.queryInInspectionRecord(), inInspectRecord);
// 需要修正业务表+es的数据
List<String> correctData = Lists.newArrayList();
// 1.处理维保超期错误数据
List<String> outOfMaintenanceErrorData = handleOutOfMaintenanceErrorData(realOutOfMaintenanceRecord);
List<String> outOfMaintenanceErrorData = handleOutOfMaintenanceErrorData(realOutOfMaintenanceRecord, inMaintenanceRecord);
// 2.处理检验超期错误数据
List<String> outOfInspectionErrorData = handleOutOfInspectionErrorData(realOutOfInspectRecord);
List<String> outOfInspectionErrorData = handleOutOfInspectionErrorData(realOutOfInspectRecord, inInspectRecord);
// 3.修正业务表+es数据状态
if (ValidationUtil.isEmpty(outOfMaintenanceErrorData) && ValidationUtil.isEmpty(outOfInspectionErrorData)) {
// 没有需要修正的数据
......@@ -279,11 +284,11 @@ public class SafetyProblemTracingGenServiceImpl{
// 再次查询维保备案这些数据有没有检验超期的问题
// 找出仅在maintenanceSet中而不在realOutOfInspectRecord中的元素(真正需要更新的维保数据)
List<String> maintenanceOnly = maintenanceSet.stream()
.filter(id -> !realOutOfMaintenanceRecord.contains(id))
.filter(id -> !realOutOfInspectRecord.contains(id))
.collect(Collectors.toList());
// 找出仅在inspectionSet中而不在realOutOfMaintenanceRecord中的元素(真正需要更新的检验数据)
List<String> inspectionOnly = inspectionSet.stream()
.filter(id -> !realOutOfInspectRecord.contains(id))
.filter(id -> !realOutOfMaintenanceRecord.contains(id))
.collect(Collectors.toList());
correctData.addAll(maintenanceOnly);
......@@ -300,9 +305,16 @@ public class SafetyProblemTracingGenServiceImpl{
}
}
private List<String> handleOutOfMaintenanceErrorData(Set<String> realOutOfMaintenanceRecord) {
/**
* 处理维保超期错误数据
*
* @param realOutOfMaintenanceRecord 真正超期设备
* @param inMaintenanceRecord 维保正常设备
* @return 需要修正的错误数据
*/
private List<String> handleOutOfMaintenanceErrorData(Set<String> realOutOfMaintenanceRecord, Set<String> inMaintenanceRecord) {
// 设备表到今日维保超期设备realOutOfMaintenanceRecord
if (ValidationUtil.isEmpty(realOutOfMaintenanceRecord)) {
if (ValidationUtil.isEmpty(realOutOfMaintenanceRecord) && ValidationUtil.isEmpty(inMaintenanceRecord)) {
return Lists.newArrayList();
}
logger.info("设备维保超期safety表数据修正开始,实际检验超期数据:{}条", realOutOfMaintenanceRecord.size());
......@@ -316,11 +328,21 @@ public class SafetyProblemTracingGenServiceImpl{
return Lists.newArrayList();
}
// 追溯问题表中未处理的维保超期设备
List<String> outOfMaintenanceEquipIds = Lists.newArrayList();
// 未超期但错误生成的维保超期设备
List<String> outOfMaintenanceEquipIds = problemList.stream()
.map(SafetyProblemTracing::getSourceId)
.filter(id -> !realOutOfMaintenanceRecord.contains(id))
.collect(Collectors.toList());
if (!ValidationUtil.isEmpty(realOutOfMaintenanceRecord)) {
outOfMaintenanceEquipIds.addAll(problemList.stream()
.map(SafetyProblemTracing::getSourceId)
.filter(id -> !realOutOfMaintenanceRecord.contains(id))
.collect(Collectors.toList()));
}
// 维保已经正常但错误生成维保超期的设备
if (!ValidationUtil.isEmpty(inMaintenanceRecord)) {
outOfMaintenanceEquipIds.addAll(problemList.stream()
.map(SafetyProblemTracing::getSourceId)
.filter(inMaintenanceRecord::contains)
.collect(Collectors.toList()));
}
if (ValidationUtil.isEmpty(outOfMaintenanceEquipIds)) {
return Lists.newArrayList();
}
......@@ -335,16 +357,16 @@ public class SafetyProblemTracingGenServiceImpl{
.set(SafetyProblemTracing::getRecDate, new Date())
.in(SafetyProblemTracing::getSourceId, batch)
.eq(SafetyProblemTracing::getProblemTypeCode, SafetyProblemTypeEnum.WBCQ.getProblemTypeCode())
.eq(SafetyProblemTracing::getIsDelete,Boolean.FALSE)
.eq(SafetyProblemTracing::getIsDelete, Boolean.FALSE)
.update();
}
logger.info("设备维保超期safety表数据修正完成,已更新数据:{}条", outOfMaintenanceEquipIds.size());
return outOfMaintenanceEquipIds;
}
private List<String> handleOutOfInspectionErrorData(Set<String> realOutOfInspectRecord) {
private List<String> handleOutOfInspectionErrorData(Set<String> realOutOfInspectRecord, Set<String> inInspectRecord) {
// 设备表到今日检验超期设备realOutOfInspectRecord
if (ValidationUtil.isEmpty(realOutOfInspectRecord)) {
if (ValidationUtil.isEmpty(realOutOfInspectRecord) && ValidationUtil.isEmpty(inInspectRecord)) {
return Lists.newArrayList();
}
logger.info("设备检验超期safety表数据修正开始,实际检验超期数据:{}条", realOutOfInspectRecord.size());
......@@ -358,11 +380,21 @@ public class SafetyProblemTracingGenServiceImpl{
return Lists.newArrayList();
}
// 追溯问题表中未处理的检验超期设备
List<String> outOfInspectionEquipIds = Lists.newArrayList();
// 未超期但错误生成的检验超期设备
List<String> outOfInspectionEquipIds = problemList.stream()
.map(SafetyProblemTracing::getSourceId)
.filter(id -> !realOutOfInspectRecord.contains(id))
.collect(Collectors.toList());
if (!ValidationUtil.isEmpty(realOutOfInspectRecord)) {
outOfInspectionEquipIds.addAll(problemList.stream()
.map(SafetyProblemTracing::getSourceId)
.filter(id -> !realOutOfInspectRecord.contains(id))
.collect(Collectors.toList()));
}
// 检验已经正常但错误生成检验超期的设备
if (!ValidationUtil.isEmpty(inInspectRecord)) {
outOfInspectionEquipIds.addAll(problemList.stream()
.map(SafetyProblemTracing::getSourceId)
.filter(inInspectRecord::contains)
.collect(Collectors.toList()));
}
if (ValidationUtil.isEmpty(outOfInspectionEquipIds)) {
return Lists.newArrayList();
}
......@@ -384,6 +416,38 @@ public class SafetyProblemTracingGenServiceImpl{
return outOfInspectionEquipIds;
}
private void processLargeResultSet(Supplier<List<Map<String, Object>>> dataSupplier, Set<String> targetSet) {
int batchSize = 5000; // 每批处理的记录数
int processedCount = 0;
// 由于无法分页,这里假设一次性获取所有数据,但在处理过程中及时释放内存
List<Map<String, Object>> allRecords = dataSupplier.get();
for (Map<String, Object> record : allRecords) {
targetSet.add(record.get("RECORD").toString());
processedCount++;
// 每处理一定数量的记录,让出CPU时间片,避免长时间占用
if (processedCount % batchSize == 0) {
try {
Thread.sleep(10); // 短暂休眠,让出CPU
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}
// 清理临时数据,帮助垃圾回收
allRecords.clear();
}
// 函数式接口定义
@FunctionalInterface
private interface Supplier<T> {
T get();
}
private void updateEquipAndSendMessage(List<Map<String, Object>> mapList, SafetyProblemTypeEnum safetyProblemTypeEnum) {
if (ValidationUtil.isEmpty(mapList)) {
return;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment