---数据变更日志查询修复

This commit is contained in:
2025-12-08 15:45:58 +08:00
parent 0669ea6d4f
commit 08243b2974
3 changed files with 85 additions and 40 deletions

View File

@ -30,11 +30,15 @@ import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid; import javax.validation.Valid;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.SqlSessionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.ServletRequestAttributes;
import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.shaded.com.google.common.collect.Maps; import com.alibaba.nacos.shaded.com.google.common.collect.Maps;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.IdWorker;
@ -87,6 +91,10 @@ public class DataLogTools {
public static final Set<String> excludeFields = SetUtils.of("id","tenantId","dataVersion","createUserId","createDate","modifyUserId","modifyDate","modifyDate","deleteMark"); public static final Set<String> excludeFields = SetUtils.of("id","tenantId","dataVersion","createUserId","createDate","modifyUserId","modifyDate","modifyDate","deleteMark");
public static final String SQL_LIST = "SELECT * FROM ${TBL_NAME} WHERE entity_id = ? ORDER BY operation_time DESC, flow_id DESC";
public static final String SQL_PLACEHOLDER = "\\$\\{TBL_NAME\\}";
private static DatalogMapper logDbService; private static DatalogMapper logDbService;
@Autowired @Autowired
@ -569,7 +577,7 @@ public class DataLogTools {
tabInfo.setIdValue(entity,idValue); tabInfo.setIdValue(entity,idValue);
} }
classes.add(tabInfo.getEntityType()); classes.add(tabInfo.getEntityType());
if(!CollectionUtils.isNotEmpty(joins)) { if(CollectionUtils.isNotEmpty(joins)) {
for (LogJoinInfo join : joins) { for (LogJoinInfo join : joins) {
LogJoinColumn[] columns = join.getJoin().columns(); LogJoinColumn[] columns = join.getJoin().columns();
LogTableInfo joinTable = join.getTableInfo(); LogTableInfo joinTable = join.getTableInfo();
@ -891,7 +899,18 @@ public class DataLogTools {
// executeBatch(sql, batchParams); // executeBatch(sql, batchParams);
for (DataChangeLog item : logs) { for (DataChangeLog item : logs) {
if(item.hasFieldChanges()) { if(item.hasFieldChanges()) {
logDbService.insertDataLog(tableName,item); logDbService.insertDataLog(tableName,item.getId(),
item.getFlowId(), // 2. flow_id
item.getPid(), // 3. pid
item.getEntityClassName(), // 4. entity_class_name
item.getBusName(), // 5. bus_name
item.getEntityId(), // 6. entity_id
JSON.toJSONString(item.getFieldChanges()), // 7. field_changes可传 JSON 字符串)
item.getOperationType().name(), // 8. operation_type如 "INSERT/UPDATE/DELETE"
item.getOperatorId(), // 9. operator_id
item.getOperatorName(), // 10. operator_name
item.getOperationTime(), // 11. operation_timeDate 类型MyBatis 自动转数据库时间类型)
item.getOperationIp());
} }
} }
} }
@ -955,41 +974,40 @@ public class DataLogTools {
if(initTable(tableName)) { if(initTable(tableName)) {
return null; return null;
} }
List<DataChangeLog> logs = logDbService.selectByDataId(tableName,dataId); String sql = parseSql(SQL_LIST, tableName);
return toVo(logs); JdbcContext context = null;
// String sql = parseSql(SQL_LIST, tableName); try {
// JdbcContext context = null; List<DataChangeLog> result = CollectionUtils.newArrayList();
// try { context = new JdbcContext(true,true);
// context = new JdbcContext(true,true); context.init(sql);
// context.init(sql); context.setParams(ListUtils.ofArray(JdbcParam.ofLong(dataId)));
// context.setParams(ListUtils.ofArray(JdbcParam.ofLong(dataId))); ResultSet set = context.executeQuery();
// ResultSet set = context.executeQuery(); Map<String, String> names = ResultSetUtils.getMapColumns(set);
// Map<String, String> names = ResultSetUtils.getMapColumns(set); while (set.next()) {
// while (set.next()) { DataChangeLog log = new DataChangeLog();
// DataChangeLog log = new DataChangeLog(); log.setId(set.getString("id"));
// log.setId(set.getString("id")); log.setFlowId(set.getString("flow_id"));
// log.setFlowId(set.getString("flow_id")); log.setPid(set.getString("pid"));
// log.setPid(set.getString("pid")); log.setEntityClassName(set.getString("entity_class_name"));
// log.setEntityClassName(set.getString("entity_class_name")); log.setBusName(set.getString("bus_name"));
// log.setBusName(set.getString("bus_name")); log.setEntityId(set.getLong("entity_id"));
// log.setEntityId(set.getLong("entity_id")); log.setOperationType(OperationType.valueOf(set.getString("operation_type")));
// log.setOperationType(OperationType.valueOf(set.getString("operation_type"))); log.setOperationIp(set.getString("operation_ip"));
// log.setOperationIp(set.getString("operation_ip")); log.setOperatorId(set.getLong("operator_id"));
// log.setOperatorId(set.getLong("operator_id")); log.setOperatorName(set.getString("operator_name"));
// log.setOperatorName(set.getString("operator_name")); log.setOperationTime(ResultSetUtils.getObject(set,"operation_time",LocalDateTime.class));
// log.setOperationTime(ResultSetUtils.getObject(set,"operation_time",LocalDateTime.class)); String json = set.getString("field_changes");
// String json = set.getString("field_changes"); if(StringUtils.isNotEmpty(json)) {
// if(StringUtils.isNotEmpty(json)) { log.setFieldChanges(JSON.parseArray(json).toJavaList(FieldChange.class));
// log.setFieldChanges(JSON.parseArray(json).toJavaList(FieldChange.class)); }
// } result.add(log);
// result.add(log); }
// } return toVo(result);
// return toVo(result); } catch (SQLException e) {
// } catch (SQLException e) { throw context.createException(e);
// throw context.createException(e); } finally {
// } finally { context.end();
// context.end(); }
// }
} }
private static List<DataChangeLogVo> toVo(List<DataChangeLog> list){ private static List<DataChangeLogVo> toVo(List<DataChangeLog> list){
@ -1161,6 +1179,10 @@ public class DataLogTools {
context.end(); context.end();
} }
} }
private static String parseSql(String sql,String tableName) {
return sql.replaceAll(SQL_PLACEHOLDER,tableName);
}
public static void main(String[] args) { public static void main(String[] args) {

View File

@ -1,10 +1,12 @@
package com.xjrsoft.module.datalog.mapper; package com.xjrsoft.module.datalog.mapper;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import org.apache.ibatis.annotations.*; import org.apache.ibatis.annotations.*;
import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.pictc.common.mybatis.JsonTypeHandler;
import com.xjrsoft.module.datalog.entity.DataChangeLog; import com.xjrsoft.module.datalog.entity.DataChangeLog;
/** /**
@ -20,8 +22,8 @@ public interface DatalogMapper extends BaseMapper<DataChangeLog> {
" id, flow_id, pid, entity_class_name, bus_name, \r\n" + " id, flow_id, pid, entity_class_name, bus_name, \r\n" +
" entity_id, field_changes, operation_type, operator_id, \r\n" + " entity_id, field_changes, operation_type, operator_id, \r\n" +
" operator_name, operation_time, operation_ip\r\n" + " operator_name, operation_time, operation_ip\r\n" +
") VALUES (#{data.id},#{data.flowId},#{data.pid},#{data.entityClassName},#{data.busName},#{data.entityId}," ") VALUES (#{id},#{flowId},#{pid},#{entityClassName},#{busName},#{entityId},"
+ "#{data.fieldChanges},#{data.operationType},#{data.operatorId},#{data.operatorName},#{data.operationTime},#{data.operationIp});"; + "#{fieldChanges},#{operationType},#{operatorId},#{operatorName},#{operationTime},#{operationIp});";
public static final String SQL_CREATE_TABLE = public static final String SQL_CREATE_TABLE =
"CREATE TABLE \"data_log_sit\".${TBL_NAME} (\r\n" + "CREATE TABLE \"data_log_sit\".${TBL_NAME} (\r\n" +
@ -63,9 +65,21 @@ public interface DatalogMapper extends BaseMapper<DataChangeLog> {
@Select("select tbl_name FROM \"data_log_sit\".log_table_info") @Select("select tbl_name FROM \"data_log_sit\".log_table_info")
List<String> getTableList(); List<String> getTableList();
// String SQL_INSERT = "INSERT INTO \"data_log_sit\".${TBL_NAME} (\r\n" +
// " id, flow_id, pid, entity_class_name, bus_name, \r\n" +
// " entity_id, field_changes, operation_type, operator_id, \r\n" +
// " operator_name, operation_time, operation_ip\r\n" +
// ") VALUES (#{id},#{flowId},#{pid},#{entityClassName},#{busName},#{entityId},"
// + "#{fieldChanges},#{operationType},#{operatorId},#{operatorName},#{operationTime},#{operationIp});";
@DS("datalog") @DS("datalog")
@Insert(SQL_INSERT) @Insert(SQL_INSERT)
void insertDataLog(@Param("TBL_NAME") String tableName,@Param("data") DataChangeLog data); void insertDataLog(@Param("TBL_NAME") String tableName
,@Param("id") String id,@Param("flowId") String flowId,@Param("pid") String pid
,@Param("entityClassName") String entityClassName,@Param("busName") String busName,@Param("entityId") Long entityId
,@Param("fieldChanges") String fieldChanges,@Param("operationType") String operationType,@Param("operatorId") Long operatorId
,@Param("operatorName") String operatorName,@Param("operationTime") LocalDateTime operationTime,@Param("operationIp") String operationIp);
@DS("datalog") @DS("datalog")
@Update(SQL_CREATE_TABLE) @Update(SQL_CREATE_TABLE)
@ -73,6 +87,14 @@ public interface DatalogMapper extends BaseMapper<DataChangeLog> {
@DS("datalog") @DS("datalog")
@Select("SELECT * FROM \"data_log_sit\".${TBL_NAME} WHERE entity_id = #{id} ORDER BY operation_time DESC, flow_id DESC") @Select("SELECT * FROM \"data_log_sit\".${TBL_NAME} WHERE entity_id = #{id} ORDER BY operation_time DESC, flow_id DESC")
@Results({
// 其他字段无需显式配置MyBatis 自动下划线转驼峰),仅配置需要特殊处理的 fieldChanges
@Result(
column = "field_changes", // 数据库列名(必须与表中 JSON 列名一致,如 field_changes
property = "fieldChanges", // 实体字段名
typeHandler = JsonTypeHandler.class // 你的 JSON 类型处理器
)
})
List<DataChangeLog> selectByDataId(@Param("TBL_NAME") String tableName,@Param("id")Long id); List<DataChangeLog> selectByDataId(@Param("TBL_NAME") String tableName,@Param("id")Long id);

View File

@ -15,6 +15,7 @@ import com.xjrsoft.common.annotation.UniqueNameGenerator;
* 主数据服务---开发使用 * 主数据服务---开发使用
* 使用时集成到其它模块使用,不作为单独的服务 * 使用时集成到其它模块使用,不作为单独的服务
*/ */
//@EnableSaToken
@MapperScan("com.xjrsoft.module.*.mapper") @MapperScan("com.xjrsoft.module.*.mapper")
@SpringBootApplication @SpringBootApplication
@EnableAspectJAutoProxy(exposeProxy = true) @EnableAspectJAutoProxy(exposeProxy = true)