---带子表的新增修改bug修改

This commit is contained in:
2025-12-23 16:56:59 +08:00
parent 69f5e5c903
commit 337ed5402d
5 changed files with 98 additions and 83 deletions

View File

@ -64,7 +64,7 @@ public class PEventListenerPublisher {
} }
if(single) return res; if(single) return res;
} }
} catch (URISyntaxException e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
log.info("客户端:{}调用失败!",serviceId); log.info("客户端:{}调用失败!",serviceId);
} }

View File

@ -89,24 +89,25 @@ public class DataLogTools {
} }
public static DataChangeLog createLog(Class<?> klazz,OperationType type,DataChangeLog parent) { public static DataChangeLog createLog(Class<?> klazz,OperationType type,DataChangeLog parent) {
UserDto currentUser = SecureUtil.getCurrentUser();
LogTableInfo annotation = getAnnotation(klazz); LogTableInfo annotation = getAnnotation(klazz);
DataChangeLog changeLog = null;
if(parent!=null) {
changeLog = parent.addChild(type);
}else {
//变更人的IP地址 //变更人的IP地址
HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
String ipAddress = request.getRemoteAddr(); String ipAddress = request.getRemoteAddr();
DataChangeLog changeLog = new DataChangeLog() UserDto currentUser = SecureUtil.getCurrentUser();
.setEntityClassName(klazz.getCanonicalName()) changeLog = new DataChangeLog()
.setBusName(annotation.getName())
.setId(IdUtil.getSnowflakeNextIdStr())
.setOperationIp(ipAddress) .setOperationIp(ipAddress)
.setOperationType(type)
.setOperatorId(currentUser.getId()) .setOperatorId(currentUser.getId())
.setOperatorName(currentUser.getName()) .setOperatorName(currentUser.getName())
.setOperationTime(LocalDateTime.now()); .setOperationTime(LocalDateTime.now())
if(parent!=null) { .setOperationType(type);
changeLog.setFlowId(parent.getFlowId());
changeLog.setPid(parent.getId());
} }
changeLog.setEntityClassName(klazz.getCanonicalName())
.setBusName(annotation.getName())
.setId(IdUtil.getSnowflakeNextIdStr());
return changeLog; return changeLog;
} }
@ -649,36 +650,44 @@ public class DataLogTools {
for (Object item : listValue) { for (Object item : listValue) {
Long idValue = joinTable.getIdValue(item); Long idValue = joinTable.getIdValue(item);
DataChangeLog datalog = createLog(join.getTargetClass(),type,parent); DataChangeLog datalog = createLog(join.getTargetClass(),type,parent);
datalog.setEntityId(idValue); mapper.insert(joinTable.toEntity(item));
Object bean = BeanUtil.toBean(item,joinTable.getEntityType());
mapper.insert(bean);
saveAttrs(joinTable,item); saveAttrs(joinTable,item);
buildFields(datalog,joinTable,item,null); buildFields(datalog,joinTable,item,null);
logs.add(datalog);
} }
}else { } else {
for (Object item : listValue) { for (Object item : listValue) {
Long idValue = joinTable.getIdValue(item); Long idValue = joinTable.getIdValue(item);
DataChangeLog datalog = createLog(join.getTargetClass(),type,parent); 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()); Object pojo = BeanUtil.toBean(item,joinTable.getKlazz());
delete(pojo, joinTable, mapper); delete(pojo, joinTable, mapper);
saveAttrs(joinTable,item,true); saveAttrs(joinTable,item,true);
buildFields(datalog,joinTable,item,null); 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){ } else if(type==OperationType.UPDATE || type==OperationType.DELETE){
@ -689,12 +698,10 @@ public class DataLogTools {
for (Object item : oldList) { for (Object item : oldList) {
Long idValue = joinTable.getIdValue(item); Long idValue = joinTable.getIdValue(item);
DataChangeLog datalog = createLog(join.getTargetClass(),OperationType.DELETE,parent); DataChangeLog datalog = createLog(join.getTargetClass(),OperationType.DELETE,parent);
datalog.setEntityId(idValue);
Object pojo = BeanUtil.toBean(item,joinTable.getKlazz()); Object pojo = BeanUtil.toBean(item,joinTable.getKlazz());
delete(pojo, joinTable, mapper); delete(pojo, joinTable, mapper);
saveAttrs(joinTable,item,true); saveAttrs(joinTable,item,true);
buildFields(datalog,joinTable,item,null); buildFields(datalog,joinTable,item,null);
logs.add(datalog);
} }
} }
} }
@ -703,21 +710,18 @@ public class DataLogTools {
if(val!=null) { if(val!=null) {
Long idValue = joinTable.getIdValue(val); Long idValue = joinTable.getIdValue(val);
DataChangeLog datalog = createLog(join.getTargetClass(),type,parent); 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 || type==OperationType.DELETE) {
if(type==OperationType.INSERT) { if(type==OperationType.INSERT) {
mapper.insert(pojo); mapper.insert(joinTable.toEntity(val));
saveAttrs(joinTable,val); saveAttrs(joinTable,val);
}else { }else {
delete(pojo, joinTable, mapper); delete(val, joinTable, mapper);
saveAttrs(joinTable,val,true); saveAttrs(joinTable,val,true);
} }
buildFields(datalog,joinTable, val, null); buildFields(datalog,joinTable,val,null);
}else { }else {
Object old = mapper.selectById(idValue); Object old = mapper.selectById(idValue);
mapper.updateById(pojo); mapper.updateById(joinTable.toEntity(val));
saveAttrs(joinTable,val,true); saveAttrs(joinTable,val,true);
buildFields(datalog,joinTable,val,old); buildFields(datalog,joinTable,val,old);
} }
@ -725,10 +729,9 @@ public class DataLogTools {
//进行修改或者删除时,级联对象为空时,需要删除旧数据 //进行修改或者删除时,级联对象为空时,需要删除旧数据
Object old = getJoinObj(joinTable, join, mapper, parentInfo, entity); Object old = getJoinObj(joinTable, join, mapper, parentInfo, entity);
if(old!=null) { if(old!=null) {
Object dto = BeanUtil.toBean(old,joinTable.getKlazz()); Object dto = joinTable.toDto(old);
Long idValue = joinTable.getIdValue(old); Long idValue = joinTable.getIdValue(old);
DataChangeLog datalog = createLog(join.getTargetClass(),OperationType.DELETE,parent); DataChangeLog datalog = createLog(join.getTargetClass(),OperationType.DELETE,parent);
datalog.setEntityId(idValue);
delete(dto, joinTable, mapper); delete(dto, joinTable, mapper);
saveAttrs(joinTable,dto,true); saveAttrs(joinTable,dto,true);
buildFields(datalog,joinTable,dto,null); buildFields(datalog,joinTable,dto,null);
@ -901,35 +904,15 @@ public class DataLogTools {
public static void saveLogs(LogTableInfo tableInfo,List<DataChangeLog> logs) { public static void saveLogs(LogTableInfo tableInfo,List<DataChangeLog> logs) {
String tableName = parseLogTableName(tableInfo); String tableName = parseLogTableName(tableInfo);
initTable(tableName); 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) { for (DataChangeLog item : logs) {
if(item.hasFieldChanges()) { saveLog(tableName,item);
logDbService.insertDataLog(tableName,item.getId(), }
}
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.getFlowId(), // 2. flow_id
item.getPid(), // 3. pid item.getPid(), // 3. pid
item.getEntityClassName(), // 4. entity_class_name item.getEntityClassName(), // 4. entity_class_name
@ -941,6 +924,10 @@ public class DataLogTools {
item.getOperatorName(), // 10. operator_name item.getOperatorName(), // 10. operator_name
item.getOperationTime(), // 11. operation_timeDate 类型MyBatis 自动转数据库时间类型) item.getOperationTime(), // 11. operation_timeDate 类型MyBatis 自动转数据库时间类型)
item.getOperationIp()); item.getOperationIp());
if(item.hasChildLogs()) {
for (DataChangeLog child : item.getChildren()) {
saveLog(tableName,child);
}
} }
} }
} }

View File

@ -104,6 +104,23 @@ public class DataChangeLog implements Serializable{
@ApiModelProperty("操作IP地址") @ApiModelProperty("操作IP地址")
private String operationIp; private String operationIp;
private List<DataChangeLog> children;
public DataChangeLog addChild(OperationType type) {
DataChangeLog child = new DataChangeLog();
child.setPid(this.id);
child.setFlowId(this.flowId);
child.setEntityId(this.entityId);
child.setOperationIp(operationIp);
child.setOperatorId(operatorId);
child.setOperatorName(operatorName);
child.setOperationTime(operationTime);
child.setOperationType(type);
if(this.children==null) this.children = new ArrayList<>();
this.children.add(child);
return child;
}
/** /**
* 判断是否有字段变更 * 判断是否有字段变更
@ -116,5 +133,14 @@ public class DataChangeLog implements Serializable{
public void addFiledChnage(FieldChange change) { public void addFiledChnage(FieldChange change) {
fieldChanges.add(change); fieldChanges.add(change);
} }
public boolean hasChildLogs() {
return this.children!=null && this.children.size()>0;
}
} }

View File

@ -18,7 +18,7 @@ import java.io.Serializable;
*/ */
@Data @Data
@LogTable(source="lng_customer_group_customer",name="客户组") @LogTable(source="lng_customer_group_customer",name="客户组")
public class UpdateLngCustomerGroupCustomerDto implements Serializable { public class UpdateLngCustomerGroupCustomerDto extends com.xjrsoft.common.model.base.BaseModel {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@ -2,6 +2,8 @@ package com.xjrsoft.module.sales.dto;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.pictc.annotations.datalog.*; import com.pictc.annotations.datalog.*;
import com.xjrsoft.common.model.base.BaseModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
@ -19,7 +21,7 @@ import java.util.List;
*/ */
@Data @Data
@LogTable(source="lng_customer_group",name="客户组") @LogTable(source="lng_customer_group",name="客户组")
public class UpdateLngCustomerGroupDto implements Serializable { public class UpdateLngCustomerGroupDto extends BaseModel {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;