From 2149d7c4e8f17df1989a483cbde19ed91ee90b49 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 29 Jun 2026 15:35:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/domain/MsOperationLog.java | 4 + .../impl/MsOperationLogServiceImpl.java | 9 +- .../wq/service/impl/EnvWqDataServiceImpl.java | 15 +- .../service/impl/AlongDetailServiceImpl.java | 13 +- .../zq/controller/ZqMonitorController.java | 8 +- .../qgc_env/zq/service/ZqMonitorService.java | 2 +- .../zq/service/impl/ZqMonitorServiceImpl.java | 329 +++++++++++++++++- 7 files changed, 361 insertions(+), 19 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsOperationLog.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsOperationLog.java index 55d64cc0..04d9e34a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsOperationLog.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsOperationLog.java @@ -32,4 +32,8 @@ public class MsOperationLog implements Serializable { @TableField("TABLE_NAME") private String tableName; + + @TableField("RECORD_ID") + private String recordId; + } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java index 8efc9d86..a915ff1d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java @@ -275,7 +275,7 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { if (engInfo == null) { return; } - MsOperationLog mainLog = buildMainLog("新增电站", source); + MsOperationLog mainLog = buildMainLog(null,"新增电站", source); msOperationLogMapper.insert(mainLog); List details = new ArrayList<>(); @@ -311,7 +311,7 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { return; } - MsOperationLog mainLog = buildMainLog("修改电站", source); + MsOperationLog mainLog = buildMainLog(before.getStcd(),"修改电站", source); msOperationLogMapper.insert(mainLog); List details = new ArrayList<>(); @@ -348,7 +348,7 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { if (engInfo == null) { return; } - MsOperationLog mainLog = buildMainLog("删除电站", source); + MsOperationLog mainLog = buildMainLog(engInfo.getStcd(),"删除电站", source); msOperationLogMapper.insert(mainLog); List details = new ArrayList<>(); @@ -378,11 +378,12 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { batchInsertDetails(details); } - private MsOperationLog buildMainLog(String remark, String source) { + private MsOperationLog buildMainLog(String recordId,String remark, String source) { MsOperationLog log = new MsOperationLog(); log.setOperator(resolveOperator()); log.setOperateTime(new Date()); log.setTableName(ENG_TABLE_NAME); + log.setRecordId(recordId); log.setSource(StrUtil.trimToNull(source)); log.setRemark(remark); return log; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java index 6778bd2f..e041cf54 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.wq.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.*; @@ -4071,7 +4072,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } private String buildWqHourLogSelectColumns() { - return "STCD, TO_CHAR(TM, 'YYYY-MM-DD HH24:MI:SS') AS TM, " + + return "ID,STCD, TO_CHAR(TM, 'YYYY-MM-DD HH24:MI:SS') AS TM, " + "WTMP, PH, DOX, CODMN, CODCR, BOD5, NH3N, TP, TN, CU, ZN, F, SE, ARS, HG, CD, CR6, PB, CN, " + "VLPH, OIL, LAS, S2, FCG, CL, SO4, NO3, THRD, COND, FE, MN, AL, CHLA, CLARITY, TU, CYANO, " + "WQGRD, SFDB, WQ_SFDBHN_YS"; @@ -4148,7 +4149,9 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { if (details.isEmpty()) { return; } - MsOperationLog mainLog = buildWqMainLog("修改水质小时数据", source); + String recordId = ObjectUtil.isNotEmpty(beforeHour) && ObjectUtil.isNotEmpty(beforeHour.get("ID")) + ? beforeHour.get("ID").toString() + : null; MsOperationLog mainLog = buildWqMainLog(recordId,"修改水质小时数据", source); msOperationLogMapper.insert(mainLog); for (MsOperationLogDetail detail : details) { detail.setMainId(mainLog.getId()); @@ -4160,11 +4163,12 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { if (CollUtil.isEmpty(rows)) { return; } - MsOperationLog mainLog = buildWqMainLog(remark, source); - msOperationLogMapper.insert(mainLog); List details = new ArrayList<>(); for (Map row : rows) { String stcd = asString(row.get("STCD")); + String recordId = asString(row.get("ID")); + MsOperationLog mainLog = buildWqMainLog(recordId,remark, source); + msOperationLogMapper.insert(mainLog); for (Map.Entry entry : row.entrySet()) { String fieldCode = entry.getKey(); if (StrUtil.isBlank(fieldCode)) { @@ -4182,9 +4186,10 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { batchInsertWqLogDetails(details); } - private MsOperationLog buildWqMainLog(String remark, String source) { + private MsOperationLog buildWqMainLog(String recordId,String remark, String source) { MsOperationLog log = new MsOperationLog(); log.setOperator(resolveLogOperator()); + log.setRecordId(recordId); log.setOperateTime(new Date()); log.setTableName(WQ_HOUR_TABLE_NAME); log.setSource(StrUtil.trimToNull(source)); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java index 12572375..13596442 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java @@ -1170,6 +1170,7 @@ public class AlongDetailServiceImpl extends ServiceImpl details = new ArrayList<>(); for (Map.Entry entry : WT_UPDATE_COLUMN_MAP.entrySet()) { if (!containsKeyIgnoreCase(updateData, entry.getKey())) { @@ -1188,7 +1189,7 @@ public class AlongDetailServiceImpl extends ServiceImpl details = new ArrayList<>(); for (Map row : rows) { String stcd = asString(row.get("STCD")); + String recordId = asString(row.get("ID")); + MsOperationLog mainLog = buildWtMainLog(recordId,remark, source); + msOperationLogMapper.insert(mainLog); for (Map.Entry entry : row.entrySet()) { String fieldCode = entry.getKey(); Object oldValue = entry.getValue(); @@ -1219,10 +1222,12 @@ public class AlongDetailServiceImpl extends ServiceImpl updateData); + boolean updateRiverRData(java.util.Map updateData, String source); ZqBaseInfoVo getStcdInfo(String stcd); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java index 1bd2c665..923af1cd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java @@ -10,8 +10,12 @@ import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_base.domain.MsOperationLog; +import com.yfd.platform.qgc_base.domain.MsOperationLogDetail; import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; import com.yfd.platform.qgc_base.entity.vo.DataParam; +import com.yfd.platform.qgc_base.mapper.MsOperationLogDetailMapper; +import com.yfd.platform.qgc_base.mapper.MsOperationLogMapper; import com.yfd.platform.qgc_env.fh.entity.vo.HabitatVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqBaseInfoVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDayDataVo; @@ -19,23 +23,58 @@ import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDrtpDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDataVo; import com.yfd.platform.qgc_env.zq.service.ZqMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; +import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.jdbc.core.JdbcTemplate; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; +import java.util.Date; import java.util.HashSet; -import java.util.LinkedHashMap; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @Service public class ZqMonitorServiceImpl implements ZqMonitorService { + private static final String ZQ_HOUR_TABLE_NAME = "SD_RIVER_R"; + private static final String ZQ_DAY_TABLE_NAME = "SD_RIVERDAY_S"; + private static final String ZQ_MONTH_TABLE_NAME = "SD_RIVERDRTP_S"; + private static final Map ZQ_UPDATE_COLUMN_MAP = new LinkedHashMap<>(); + private static final Map ZQ_FIELD_MEANING_MAP = new LinkedHashMap<>(); + + static { + ZQ_UPDATE_COLUMN_MAP.put("z", "Z"); + ZQ_UPDATE_COLUMN_MAP.put("q", "Q"); + ZQ_UPDATE_COLUMN_MAP.put("v", "V"); + + ZQ_FIELD_MEANING_MAP.put("ID", "主键ID"); + ZQ_FIELD_MEANING_MAP.put("STCD", "站码"); + ZQ_FIELD_MEANING_MAP.put("TM", "时间"); + ZQ_FIELD_MEANING_MAP.put("DT", "时间"); + ZQ_FIELD_MEANING_MAP.put("DRTP", "维度类型"); + ZQ_FIELD_MEANING_MAP.put("YEAR", "年"); + ZQ_FIELD_MEANING_MAP.put("MONTH", "月"); + ZQ_FIELD_MEANING_MAP.put("DR", "时段类型"); + ZQ_FIELD_MEANING_MAP.put("Z", "水位"); + ZQ_FIELD_MEANING_MAP.put("Q", "流量"); + ZQ_FIELD_MEANING_MAP.put("V", "流速"); + ZQ_FIELD_MEANING_MAP.put("MSQMT", "测流方法"); + ZQ_FIELD_MEANING_MAP.put("RECORD_USER", "创建人"); + ZQ_FIELD_MEANING_MAP.put("RECORD_TIME", "创建时间"); + ZQ_FIELD_MEANING_MAP.put("MODIFY_USER", "更新人"); + ZQ_FIELD_MEANING_MAP.put("MODIFY_TIME", "更新时间"); + ZQ_FIELD_MEANING_MAP.put("IS_DELETED", "是否已删除"); + ZQ_FIELD_MEANING_MAP.put("DELETE_USER", "删除人"); + ZQ_FIELD_MEANING_MAP.put("DELETE_TIME", "删除时间"); + ZQ_FIELD_MEANING_MAP.put("FID", "附件ID"); + ZQ_FIELD_MEANING_MAP.put("REMARK", "备注"); + } @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; @@ -43,6 +82,12 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { @Resource private JdbcTemplate jdbcTemplate; + @Resource + private MsOperationLogMapper msOperationLogMapper; + + @Resource + private MsOperationLogDetailMapper msOperationLogDetailMapper; + @Override public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { return getMsstbprptListInternal(dataSourceRequest, false); @@ -170,11 +215,14 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { } String dataType = batchDeleteAo.getDataType(); List dataList = batchDeleteAo.getDataList(); + String source = batchDeleteAo.getSource(); int batchSize = 500; for (int i = 0; i < dataList.size(); i += batchSize) { List subList = dataList.subList(i, Math.min(i + batchSize, dataList.size())); if ("TIME".equals(dataType)) { + List> beforeRows = queryRiverHourRows(subList); deleteRiverRData(subList); + recordRiverDeleteLog(beforeRows, ZQ_HOUR_TABLE_NAME, "删除流量站小时数据", source); Map dateRangeMap = new HashMap<>(); Map monthRangeMap = new HashMap<>(); for (DataParam param : subList) { @@ -209,10 +257,14 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { } } if ("DATE".equals(dataType)) { + List> beforeRows = queryRiverDayRows(subList); deleteRiverDayData(subList); + recordRiverDeleteLog(beforeRows, ZQ_DAY_TABLE_NAME, "删除流量站日数据", source); } if ("MON".equals(dataType)) { + List> beforeRows = queryRiverMonthRows(subList); deleteRiverMonthData(subList); + recordRiverDeleteLog(beforeRows, ZQ_MONTH_TABLE_NAME, "删除流量站月数据", source); } } return true; @@ -220,10 +272,12 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { @Override @Transactional(rollbackFor = Exception.class) - public boolean updateRiverRData(Map updateData) { - updateRiverHourData(updateData); + public boolean updateRiverRData(Map updateData, String source) { String stcd = updateData == null ? null : asString(updateData.get("stcd")); String tm = updateData == null ? null : asString(updateData.get("tm")); + Map beforeRow = queryRiverHourRow(stcd, tm); + updateRiverHourData(updateData); + recordRiverUpdateLog(beforeRow, updateData, source); if (StrUtil.isNotBlank(stcd) && StrUtil.isNotBlank(tm) && tm.length() >= 10) { String dateStr = tm.substring(0, 10); statisticsDayDataFromHour(stcd, dateStr, dateStr); @@ -1612,6 +1666,273 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return value == null ? null : String.valueOf(value); } + private Map queryRiverHourRow(String stcd, String tm) { + if (StrUtil.isBlank(stcd) || StrUtil.isBlank(tm)) { + return new HashMap<>(); + } + String sql = "SELECT ID, STCD, TO_CHAR(TM, 'YYYY-MM-DD HH24:MI:SS') AS TM, Z, Q, V, MSQMT, RECORD_USER, " + + "RECORD_TIME, MODIFY_USER, MODIFY_TIME, IS_DELETED, DELETE_USER, DELETE_TIME, FID, REMARK " + + "FROM SD_RIVER_R WHERE STCD = ? AND TM = TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + List> rows = jdbcTemplate.queryForList(sql, stcd, tm); + return rows.isEmpty() ? new HashMap<>() : normalizeRiverLogRow(rows.getFirst()); + } + + private List> queryRiverHourRows(List dataList) { + if (CollUtil.isEmpty(dataList)) { + return new ArrayList<>(); + } + StringBuilder sql = new StringBuilder("SELECT ID, STCD, TO_CHAR(TM, 'YYYY-MM-DD HH24:MI:SS') AS TM, Z, Q, V, MSQMT, RECORD_USER, ") + .append("RECORD_TIME, MODIFY_USER, MODIFY_TIME, IS_DELETED, DELETE_USER, DELETE_TIME, FID, REMARK ") + .append("FROM SD_RIVER_R WHERE "); + List args = new ArrayList<>(); + List conditions = new ArrayList<>(); + for (DataParam item : dataList) { + if (item == null || StrUtil.isBlank(item.getId()) || StrUtil.isBlank(item.getTm())) { + continue; + } + conditions.add("(STCD = ? AND TM = TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'))"); + args.add(item.getId()); + args.add(item.getTm()); + } + if (conditions.isEmpty()) { + return new ArrayList<>(); + } + sql.append(String.join(" OR ", conditions)); + return normalizeRiverLogRows(jdbcTemplate.queryForList(sql.toString(), args.toArray())); + } + + private List> queryRiverDayRows(List dataList) { + if (CollUtil.isEmpty(dataList)) { + return new ArrayList<>(); + } + StringBuilder sql = new StringBuilder("SELECT ID, STCD, TO_CHAR(DT, 'YYYY-MM-DD HH24:MI:SS') AS DT, Z, Q, V, MSQMT, RECORD_USER, ") + .append("RECORD_TIME, MODIFY_USER, MODIFY_TIME, IS_DELETED, DELETE_USER, DELETE_TIME ") + .append("FROM SD_RIVERDAY_S WHERE "); + List args = new ArrayList<>(); + List conditions = new ArrayList<>(); + for (DataParam item : dataList) { + if (item == null || StrUtil.isBlank(item.getId()) || StrUtil.isBlank(item.getDt())) { + continue; + } + conditions.add("(STCD = ? AND DT = TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'))"); + args.add(item.getId()); + args.add(item.getDt()); + } + if (conditions.isEmpty()) { + return new ArrayList<>(); + } + sql.append(String.join(" OR ", conditions)); + return normalizeRiverLogRows(jdbcTemplate.queryForList(sql.toString(), args.toArray())); + } + + private List> queryRiverMonthRows(List dataList) { + if (CollUtil.isEmpty(dataList)) { + return new ArrayList<>(); + } + StringBuilder sql = new StringBuilder("SELECT ID, STCD, TO_CHAR(TM, 'YYYY-MM-DD HH24:MI:SS') AS TM, DRTP, YEAR, MONTH, DR, Z, Q, V, MSQMT, ") + .append("RECORD_USER, RECORD_TIME, MODIFY_USER, MODIFY_TIME, IS_DELETED, DELETE_USER, DELETE_TIME ") + .append("FROM SD_RIVERDRTP_S WHERE "); + List args = new ArrayList<>(); + List conditions = new ArrayList<>(); + for (DataParam item : dataList) { + if (item == null || StrUtil.isBlank(item.getId()) || StrUtil.isBlank(item.getDrtp()) + || StrUtil.isBlank(item.getYear()) || StrUtil.isBlank(item.getMonth())) { + continue; + } + conditions.add("(STCD = ? AND DRTP = ? AND YEAR = ? AND MONTH = ?)"); + args.add(item.getId()); + args.add(item.getDrtp()); + args.add(Integer.parseInt(item.getYear())); + args.add(Integer.parseInt(item.getMonth())); + } + if (conditions.isEmpty()) { + return new ArrayList<>(); + } + sql.append(String.join(" OR ", conditions)); + return normalizeRiverLogRows(jdbcTemplate.queryForList(sql.toString(), args.toArray())); + } + + private List> normalizeRiverLogRows(List> rows) { + List> result = new ArrayList<>(); + if (CollUtil.isEmpty(rows)) { + return result; + } + for (Map row : rows) { + result.add(normalizeRiverLogRow(row)); + } + return result; + } + + private Map normalizeRiverLogRow(Map row) { + Map normalized = new LinkedHashMap<>(); + if (row == null || row.isEmpty()) { + return normalized; + } + for (Map.Entry entry : row.entrySet()) { + normalized.put(entry.getKey() == null ? null : entry.getKey().toUpperCase(), entry.getValue()); + } + return normalized; + } + + private void recordRiverUpdateLog(Map beforeRow, Map updateData, String source) { + if (updateData == null || updateData.isEmpty()) { + return; + } + String stcd = asString(updateData.get("stcd")); + String recordId = asString(beforeRow.get("ID")); + List details = new ArrayList<>(); + for (Map.Entry entry : ZQ_UPDATE_COLUMN_MAP.entrySet()) { + if (!containsKeyIgnoreCase(updateData, entry.getKey())) { + continue; + } + String column = entry.getValue(); + Object oldValue = beforeRow == null ? null : beforeRow.get(column); + Object newValue = getValueIgnoreCase(updateData, entry.getKey()); + if (StrUtil.equals(formatRiverLogValue(oldValue), formatRiverLogValue(newValue))) { + continue; + } + details.add(buildRiverLogDetail(null, ZQ_HOUR_TABLE_NAME, stcd, column, + oldValue, resolveRiverDisplayValue(column, oldValue), + newValue, resolveRiverDisplayValue(column, newValue), "修改字段值")); + } + if (details.isEmpty()) { + return; + } + MsOperationLog mainLog = buildRiverMainLog(recordId,"修改流量站小时数据", source); + msOperationLogMapper.insert(mainLog); + for (MsOperationLogDetail detail : details) { + detail.setMainId(mainLog.getId()); + } + batchInsertRiverLogDetails(details); + } + + private void recordRiverDeleteLog(List> rows, String tableName, String remark, String source) { + if (CollUtil.isEmpty(rows)) { + return; + } + + List details = new ArrayList<>(); + for (Map row : rows) { + String stcd = asString(row.get("STCD")); + String recordId = asString(row.get("ID")); + MsOperationLog mainLog = buildRiverMainLog(recordId,remark, source); + msOperationLogMapper.insert(mainLog); + for (Map.Entry entry : row.entrySet()) { + String fieldCode = entry.getKey(); + Object oldValue = entry.getValue(); + if (StrUtil.isBlank(fieldCode) || oldValue == null) { + continue; + } + details.add(buildRiverLogDetail(mainLog.getId(), tableName, stcd, fieldCode, + oldValue, resolveRiverDisplayValue(fieldCode, oldValue), + null, null, "删除字段值")); + } + } + batchInsertRiverLogDetails(details); + } + + private MsOperationLog buildRiverMainLog(String recordId,String remark, String source) { + MsOperationLog log = new MsOperationLog(); + log.setOperator(resolveRiverLogOperator()); + log.setOperateTime(new Date()); + log.setRecordId(recordId); + log.setTableName(ZQ_HOUR_TABLE_NAME); + log.setSource(StrUtil.trimToNull(source)); + log.setRemark(remark); + return log; + } + + private MsOperationLogDetail buildRiverLogDetail(String mainId, + String tableName, + String stationCode, + String fieldCode, + Object oldValueCode, + Object oldValueName, + Object newValueCode, + Object newValueName, + String remark) { + MsOperationLogDetail detail = new MsOperationLogDetail(); + detail.setMainId(mainId); + detail.setTableName(tableName); + detail.setStationCode(stationCode); + detail.setFieldCode(fieldCode); + detail.setFieldMeaning(ZQ_FIELD_MEANING_MAP.getOrDefault(fieldCode, fieldCode)); + detail.setOldValueCode(formatRiverLogValue(oldValueCode)); + detail.setOldValueName(formatRiverLogValue(oldValueName)); + detail.setNewValueCode(formatRiverLogValue(newValueCode)); + detail.setNewValueName(formatRiverLogValue(newValueName)); + detail.setRemark(remark); + return detail; + } + + private void batchInsertRiverLogDetails(List details) { + if (CollUtil.isEmpty(details)) { + return; + } + for (MsOperationLogDetail detail : details) { + if (detail == null) { + continue; + } + msOperationLogDetailMapper.insert(detail); + } + } + + private Object resolveRiverDisplayValue(String fieldCode, Object rawValue) { + return formatRiverLogValue(rawValue); + } + + private Object getValueIgnoreCase(Map data, String key) { + if (data == null || StrUtil.isBlank(key)) { + return null; + } + if (data.containsKey(key)) { + return data.get(key); + } + for (Map.Entry entry : data.entrySet()) { + if (StrUtil.equalsIgnoreCase(entry.getKey(), key)) { + return entry.getValue(); + } + } + return null; + } + + private boolean containsKeyIgnoreCase(Map data, String key) { + if (data == null || StrUtil.isBlank(key)) { + return false; + } + if (data.containsKey(key)) { + return true; + } + for (String mapKey : data.keySet()) { + if (StrUtil.equalsIgnoreCase(mapKey, key)) { + return true; + } + } + return false; + } + + private String resolveRiverLogOperator() { + try { + return SecurityUtils.getCurrentUsername(); + } catch (Exception ignored) { + try { + return SecurityUtils.getUserId(); + } catch (Exception ex) { + return null; + } + } + } + + private String formatRiverLogValue(Object value) { + if (value == null) { + return null; + } + if (value instanceof Date date) { + return cn.hutool.core.date.DateUtil.formatDateTime(date); + } + return String.valueOf(value); + } + private void statisticsDayDataFromHour(String stcd, String startDate, String endDate) { String deleteSql = "DELETE FROM SD_RIVERDAY_S T " + "WHERE T.STCD = ? " +