@ -89,24 +89,25 @@ public class DataLogTools {
}
public static DataChangeLog createLog ( Class < ? > klazz , OperationType type , DataChangeLog parent ) {
UserDto currentUser = SecureUtil . getCurrentUser ( ) ;
LogTableInfo annotation = getAnnotation ( klazz ) ;
DataChangeLog changeLog = null ;
if ( parent ! = null ) {
changeLog = parent . addChild ( type ) ;
} else {
//变更人的IP地址
HttpServletRequest request = ( ( ServletRequestAttributes ) Objects . requireNonNull ( RequestContextHolder . getRequestAttributes ( ) ) ) . getRequest ( ) ;
String ipAddress = request . getRemoteAddr ( ) ;
DataChangeLog changeLog = new DataChangeLog ( )
. setEntityClassName ( klazz . getCanonicalName ( ) )
. setBusName ( annotation . getName ( ) )
. setId ( IdUtil . getSnowflakeNextIdStr ( ) )
UserDto currentUser = SecureUtil . getCurrentUser ( ) ;
changeLog = new DataChangeLog ( )
. setOperationIp ( ipAddress )
. setOperationType ( type )
. setOperatorId ( currentUser . getId ( ) )
. setOperatorName ( currentUser . getName ( ) )
. setOperationTime ( LocalDateTime . now ( ) ) ;
if ( parent ! = null ) {
changeLog . setFlowId ( parent . getFlowId ( ) ) ;
changeLog . setPid ( parent . getId ( ) ) ;
. setOperationTime ( LocalDateTime . now ( ) )
. setOperationType ( type ) ;
}
changeLog . setEntityClassName ( klazz . getCanonicalName ( ) )
. setBusName ( annotation . getName ( ) )
. setId ( IdUtil . getSnowflakeNextIdStr ( ) ) ;
return changeLog ;
}
@ -649,36 +650,44 @@ public class DataLogTools {
for ( Object item : listValue ) {
Long idValue = joinTable . getIdValue ( item ) ;
DataChangeLog datalog = createLog ( join . getTargetClass ( ) , type , parent ) ;
datalog . se tEntityId ( idValue ) ;
Object bean = BeanUtil . toBean ( item , joinTable . getEntityType ( ) ) ;
mapper . insert ( bean ) ;
mapper . insert ( joinTable . to Entity ( item ) ) ;
saveAttrs ( joinTable , item ) ;
buildFields ( datalog , joinTable , item , null ) ;
logs . add ( datalog ) ;
}
} else {
for ( Object item : listValue ) {
Long idValue = joinTable . getIdValue ( item ) ;
DataChangeLog datalog = createLog ( join . getTargetClass ( ) , type , parent ) ;
datalog . setEntityId ( idValue ) ;
delete ( item , joinTable , mapper ) ;
saveAttrs ( joinTable , item , true ) ;
buildFields ( datalog , joinTable , item , null ) ;
}
}
} else {
List oldList = getJoinList ( joinTable , join , mapper , parentInfo , entity ) ;
Set < Long > ids = CollectionUtils . newHashSet ( ) ;
for ( Object item : listValue ) {
Long idValue = joinTable . getIdValue ( item ) ;
ids . add ( idValue ) ;
DataChangeLog datalog = createLog ( join . getTargetClass ( ) , type , parent ) ;
Object old = findById ( join . getTargetClass ( ) , idValue ) ;
mapper . updateById ( joinTable . toEntity ( item ) ) ;
saveAttrs ( joinTable , item ) ;
buildFields ( datalog , joinTable , item , old ) ;
}
//删除旧数据
if ( oldList ! = null ) {
log . info ( " 关联属性【{}】=>{} " , join . getField ( ) . getName ( ) , JSON . toJSONString ( oldList ) ) ;
for ( Object item : oldList ) {
Long idValue = joinTable . getIdValue ( item ) ;
if ( ! ids . contains ( idValue ) ) {
DataChangeLog datalog = createLog ( join . getTargetClass ( ) , OperationType . DELETE , parent ) ;
Object pojo = BeanUtil . toBean ( item , joinTable . getKlazz ( ) ) ;
delete ( pojo , joinTable , mapper ) ;
saveAttrs ( joinTable , item , true ) ;
buildFields ( datalog , joinTable , item , null ) ;
logs . add ( datalog ) ;
}
}
} else {
for ( Object item : listValue ) {
Long idValue = joinTable . getIdValue ( item ) ;
DataChangeLog datalog = createLog ( join . getTargetClass ( ) , type , parent ) ;
datalog . setEntityId ( idValue ) ;
Object old = findById ( join . getTargetClass ( ) , idValue ) ;
Object pojo = BeanUtil . toBean ( item , joinTable . getKlazz ( ) ) ;
mapper . updateById ( pojo ) ;
saveAttrs ( joinTable , item ) ;
buildFields ( datalog , joinTable , item , old ) ;
logs . add ( datalog ) ;
}
}
} else if ( type = = OperationType . UPDATE | | type = = OperationType . DELETE ) {
@ -689,12 +698,10 @@ public class DataLogTools {
for ( Object item : oldList ) {
Long idValue = joinTable . getIdValue ( item ) ;
DataChangeLog datalog = createLog ( join . getTargetClass ( ) , OperationType . DELETE , parent ) ;
datalog . setEntityId ( idValue ) ;
Object pojo = BeanUtil . toBean ( item , joinTable . getKlazz ( ) ) ;
delete ( pojo , joinTable , mapper ) ;
saveAttrs ( joinTable , item , true ) ;
buildFields ( datalog , joinTable , item , null ) ;
logs . add ( datalog ) ;
}
}
}
@ -703,21 +710,18 @@ public class DataLogTools {
if ( val ! = null ) {
Long idValue = joinTable . getIdValue ( val ) ;
DataChangeLog datalog = createLog ( join . getTargetClass ( ) , type , parent ) ;
logs . add ( datalog ) ;
datalog . setEntityId ( idValue ) ;
Object pojo = BeanUtil . toBean ( val , joinTable . getKlazz ( ) ) ;
if ( type = = OperationType . INSERT | | type = = OperationType . DELETE ) {
if ( type = = OperationType . INSERT ) {
mapper . insert ( po jo) ;
mapper . insert ( joinTable . toEntity ( val ) ) ;
saveAttrs ( joinTable , val ) ;
} else {
delete ( pojo , joinTable , mapper ) ;
delete ( val , joinTable , mapper ) ;
saveAttrs ( joinTable , val , true ) ;
}
buildFields ( datalog , joinTable , val , null ) ;
} else {
Object old = mapper . selectById ( idValue ) ;
mapper . updateById ( po jo) ;
mapper . updateById ( joinTable . toEntity ( val ) ) ;
saveAttrs ( joinTable , val , true ) ;
buildFields ( datalog , joinTable , val , old ) ;
}
@ -725,10 +729,9 @@ public class DataLogTools {
//进行修改或者删除时,级联对象为空时,需要删除旧数据
Object old = getJoinObj ( joinTable , join , mapper , parentInfo , entity ) ;
if ( old ! = null ) {
Object dto = BeanUtil . toBean ( old , joinTable . getKlazz ( ) ) ;
Object dto = joinTable . toDto ( old ) ;
Long idValue = joinTable . getIdValue ( old ) ;
DataChangeLog datalog = createLog ( join . getTargetClass ( ) , OperationType . DELETE , parent ) ;
datalog . setEntityId ( idValue ) ;
delete ( dto , joinTable , mapper ) ;
saveAttrs ( joinTable , dto , true ) ;
buildFields ( datalog , joinTable , dto , null ) ;
@ -901,35 +904,15 @@ public class DataLogTools {
public static void saveLogs ( LogTableInfo tableInfo , List < DataChangeLog > logs ) {
String tableName = parseLogTableName ( tableInfo ) ;
initTable ( tableName ) ;
// String sql = parseSql(SQL_INSERT, tableName);
// List<List<JdbcParam>> batchParams = CollectionUtils.newArrayList();
// Map<String, List<DataChangeLog>> pidMap = logs.stream().collect(Collectors.groupingBy(DataChangeLog::getPid));
//
// for (DataChangeLog item : logs) {
// //没有改变的属性,且没有子表修改时跳过
// if(!item.hasFieldChanges() && !hasChild(item, pidMap)) {
// continue;
// }
//
// List<JdbcParam> params = CollectionUtils.newArrayList();
// params.add(JdbcParam.of(Types.VARCHAR,String.class, item.getId()));
// params.add(JdbcParam.of(Types.VARCHAR,String.class, item.getFlowId()));
// params.add(JdbcParam.of(Types.VARCHAR,String.class, item.getPid()));
// params.add(JdbcParam.of(Types.VARCHAR,String.class, item.getEntityClassName()));
// params.add(JdbcParam.of(Types.VARCHAR,String.class, item.getBusName()));
// params.add(JdbcParam.of(Types.BIGINT,long.class, item.getEntityId()));
// params.add(JdbcParam.of(Types.VARCHAR,String.class,JSON.toJSONString(item.getFieldChanges())));
// params.add(JdbcParam.of(Types.VARCHAR,String.class,item.getOperationType().name()));
// params.add(JdbcParam.of(Types.VARCHAR,long.class,item.getOperatorId()));
// params.add(JdbcParam.of(Types.VARCHAR,String.class,item.getOperatorName()));
// params.add(JdbcParam.of(Types.TIMESTAMP,Timestamp.class,item.getOperationTime()));
// params.add(JdbcParam.of(Types.VARCHAR,String.class,item.getOperationIp()));
// batchParams.add(params);
// }
// executeBatch(sql, batchParams);
for ( DataChangeLog item : logs ) {
if ( item . hasFieldChanges ( ) ) {
logDbService . insertDataLog ( tableName , item . getId ( ) ,
saveLog ( tableName , item ) ;
}
}
private static void saveLog ( String tableName , DataChangeLog item ) {
if ( item . hasFieldChanges ( ) | | item . hasChildLogs ( ) ) {
logDbService . insertDataLog ( tableName ,
item . getId ( ) , // 1. id
item . getFlowId ( ) , // 2. flow_id
item . getPid ( ) , // 3. pid
item . getEntityClassName ( ) , // 4. entity_class_name
@ -941,6 +924,10 @@ public class DataLogTools {
item . getOperatorName ( ) , // 10. operator_name
item . getOperationTime ( ) , // 11. operation_time( Date 类型, MyBatis 自动转数据库时间类型)
item . getOperationIp ( ) ) ;
if ( item . hasChildLogs ( ) ) {
for ( DataChangeLog child : item . getChildren ( ) ) {
saveLog ( tableName , child ) ;
}
}
}
}