From 13d0c52a847091377723361a9c061f6f9acbc968 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 11 Aug 2026 09:07:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/domain/MsOperationLog.java | 6 + .../impl/MsOperationLogServiceImpl.java | 120 ++++++++++++++++++ .../service/impl/SdEngInfoBHServiceImpl.java | 2 +- 3 files changed, 127 insertions(+), 1 deletion(-) 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 a3ca94c7..13f1f80b 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 @@ -39,4 +39,10 @@ public class MsOperationLog implements Serializable { @TableField("OPERATION_TYPE") private String operationType; + /** + * 操作记录的名称(瞬态字段,不持久化,由后端查询后填充) + */ + @TableField(exist = false) + private String recordName; + } 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 54b55936..f60f4a7b 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 @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.annotation.FieldChinese; import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_base.domain.MsOperationLog; import com.yfd.platform.qgc_base.domain.MsOperationLogDetail; import com.yfd.platform.qgc_base.domain.SdEngInfoBH; @@ -20,6 +21,7 @@ import com.yfd.platform.utils.CodeToNameMetadataBo; import com.yfd.platform.utils.DataSourceRequestUtil; import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -32,11 +34,28 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; +@Slf4j @Service public class MsOperationLogServiceImpl extends ServiceImpl implements IMsOperationLogService { private static final String ENG_TABLE_NAME = "SD_ENGINFO_B_H"; + /** + * 表名 → (主键列, 名称列) 配置映射 + * 默认:主键列 = STCD,名称列 = STNM,无需显式配置 + * 仅在主键列或名称列与默认不同的情况下才需配置 + */ + private record TableNameConfig(String pkColumn, String nameColumn) {} + private static final Map TABLE_NAME_CONFIG_MAP = new HashMap<>(); + static { + // Engine Info: 名称列是 ENNM 而非 STNM + TABLE_NAME_CONFIG_MAP.put("SD_ENGINFO_B_H", new TableNameConfig("STCD", "ENNM")); + // Hydro Base: 主键列是 BASEID,名称列是 BASENAME + TABLE_NAME_CONFIG_MAP.put("SD_HYDROBASE", new TableNameConfig("BASEID", "BASENAME")); + // Fish Dictionary: 需确认结构后配置 + TABLE_NAME_CONFIG_MAP.put("SD_FISHDICTORY_B", new TableNameConfig("ID", "NAME")); + } + private static final Map ENG_FIELD_MEANING_MAP = new LinkedHashMap<>(); // 标准日期时间格式器 private static final DateTimeFormatter DATETIME_FORMATTER = @@ -282,6 +301,9 @@ public class MsOperationLogServiceImpl extends ServiceImpl queryPageList(DataSourceRequest request) { Page msOperationLogPage = DataSourceRequestUtil.executeQuery(request, MsOperationLog.class, this); + // 批量解析操作记录名称 + batchResolveRecordNames(msOperationLogPage.getRecords()); return msOperationLogPage; } + /** + * 批量解析操作记录的名称 + * 按 tableName 分组后,每张表一次批量查询名称 + */ + private void batchResolveRecordNames(List records) { + if (records == null || records.isEmpty()) { + return; + } + + // 按 tableName 分组,收集 recordId + Map> tableRecordIdsMap = new LinkedHashMap<>(); + for (MsOperationLog log : records) { + if (StrUtil.isNotBlank(log.getTableName()) && StrUtil.isNotBlank(log.getRecordId())) { + tableRecordIdsMap.computeIfAbsent(log.getTableName(), k -> new ArrayList<>()) + .add(log.getRecordId()); + } + } + + // 每个表批量查询名称 + for (Map.Entry> entry : tableRecordIdsMap.entrySet()) { + String tableName = entry.getKey(); + List recordIds = entry.getValue(); + if (recordIds.isEmpty()) { + continue; + } + + // 获取表配置 + TableNameConfig config = TABLE_NAME_CONFIG_MAP.get(tableName); + String pkColumn; + String nameColumn; + if (config != null) { + pkColumn = config.pkColumn(); + nameColumn = config.nameColumn(); + } else { + // 默认:主键列 = STCD,名称列 = STNM + pkColumn = "STCD"; + nameColumn = "STNM"; + } + + // 去重后构建 IN 参数 + Set distinctIds = new LinkedHashSet<>(recordIds); + Map paramMap = new HashMap<>(); + String inPlaceholders = buildInPlaceholders(distinctIds, paramMap); + + // 注意:如果配置的表在数据库中不存在,跳过 + try { + String sql = "SELECT " + pkColumn + " AS pkVal, " + nameColumn + " AS nameVal " + + "FROM " + tableName + + " WHERE " + pkColumn + " IN (" + inPlaceholders + ")" + + " AND NVL(IS_DELETED, 0) = 0"; + List> results = microservicDynamicSQLMapper.getAllList(sql, paramMap); + + // 构建 pkVal → nameVal 映射 + Map nameMap = new HashMap<>(); + for (Map row : results) { + Object pkObj = row.get("PKVAL"); + Object nameObj = row.get("NAMEVAL"); + if (pkObj != null && nameObj != null) { + nameMap.put(String.valueOf(pkObj), String.valueOf(nameObj)); + } + } + + // 回填 recordName + for (MsOperationLog log : records) { + if (tableName.equals(log.getTableName())) { + String name = nameMap.get(log.getRecordId()); + if (name != null) { + log.setRecordName(name); + } + } + } + } catch (Exception e) { + // 表不存在或查询失败时静默跳过 + log.warn("批量解析记录名称失败, tableName={}", tableName, e); + } + } + } + + /** + * 构建 IN 子句占位符,如 #{map.p0}, #{map.p1}, ... + */ + private String buildInPlaceholders(Set ids, Map paramMap) { + StringBuilder sb = new StringBuilder(); + int i = 0; + for (String id : ids) { + if (i > 0) { + sb.append(", "); + } + String key = "p" + i; + sb.append("#{map.").append(key).append("}"); + paramMap.put(key, id); + i++; + } + return sb.toString(); + } + @Override public List getDetailByMainId(String mainId) { if (StringUtils.isBlank(mainId)) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index 07bd92ea..0ae3d892 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -53,7 +53,7 @@ import java.util.stream.Collectors; */ @Service public class SdEngInfoBHServiceImpl extends ServiceImpl implements ISdEngInfoBHService { - private static final String TABLE_NAME = "SD_FISHDICTORY_B"; + private static final String TABLE_NAME = "SD_ENGINFO_B_H"; private static final Map ENG_CODE_NAME_FIELD_MAP = new LinkedHashMap<>(); @Resource private RedisCacheUtil redisCacheUtil;