Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
2025-12-23 18:03:57 +08:00
5 changed files with 132 additions and 105 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

@ -5,8 +5,10 @@ import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.shaded.com.google.common.collect.Lists; import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
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.conditions.query.QueryWrapper;
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;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
import com.pictc.annotations.datalog.*; import com.pictc.annotations.datalog.*;
import com.pictc.converts.ConverUtil; import com.pictc.converts.ConverUtil;
@ -87,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;
} }
@ -647,51 +650,58 @@ 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){
//进行修改或者删除时,级联对象为空时,需要删除旧数据 //进行修改或者删除时,级联对象为空时,需要删除旧数据
List oldList = getJoinList(joinTable, join, mapper, parentInfo, entity); List oldList = getJoinList(joinTable, join, mapper, parentInfo, entity);
if(oldList!=null) { if(oldList!=null) {
log.info("关联属性【{}】=>{}",join.getField().getName(),JSON.toJSONString(oldList));
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);
} }
} }
} }
@ -700,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);
} }
@ -722,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);
@ -739,37 +745,46 @@ public class DataLogTools {
LogTableInfo parentInfo,Object parent) { LogTableInfo parentInfo,Object parent) {
LogJoin joinAnnotation = join.getJoin(); LogJoin joinAnnotation = join.getJoin();
LogJoinColumn[] columns = joinAnnotation.columns(); LogJoinColumn[] columns = joinAnnotation.columns();
QueryChainWrapper queryWrapper = new QueryChainWrapper(mapper); Object joinBean = parentInfo.getFieldValue(parent,join.getField());
QueryWrapper<?> queryWrapper = Wrappers.query(joinTable.getEntityType());
for (LogJoinColumn joinCol : columns) { for (LogJoinColumn joinCol : columns) {
if(joinCol.valueType()==JoinValueType.FEILD) { if(joinCol.valueType()==JoinValueType.FEILD) {
Object value = parentInfo.getFieldValue(parent,joinCol.field()); Object value = parentInfo.getFieldValue(parent,joinCol.field());
if(value==null) return null; String column = joinTable.getColumn(joinCol.relatedField());
queryWrapper.eq(joinTable.getColumn(joinCol.relatedField()),value); queryWrapper.eq(column,value);
}else {
queryWrapper.eq(joinTable.getColumn(joinCol.relatedField()),ConverUtil.jsonToValue(joinCol.staticType(),joinCol.staticValue()));
}
}
List list = mapper.selectList(queryWrapper);
if(CollectionUtils.isEmpty(list)) {
return null;
}
List result = CollectionUtils.newArrayList();
for (Object item : list) {
result.add(joinTable.toDto(item));
}
return result;
}
private static Object getJoinObj(LogTableInfo joinTable,LogJoinInfo join,BaseMapper mapper,LogTableInfo parentInfo,Object parent) {
LogJoin joinAnnotation = join.getJoin();
LogJoinColumn[] columns = joinAnnotation.columns();
Object joinBean = parentInfo.getFieldValue(parent,join.getField());
QueryWrapper<?> queryWrapper = Wrappers.query(joinTable.getEntityType());
for (LogJoinColumn joinCol : columns) {
if(joinCol.valueType()==JoinValueType.FEILD) {
Object value = parentInfo.getFieldValue(parent,joinCol.field());
String column = joinTable.getColumn(joinCol.relatedField());
queryWrapper.eq(column,value);
}else { }else {
if(StringUtils.isNotEmpty(joinCol.relatedField())) { if(StringUtils.isNotEmpty(joinCol.relatedField())) {
queryWrapper.eq(joinTable.getColumn(joinCol.relatedField()),ConverUtil.jsonToValue(joinCol.staticType(),joinCol.staticValue())); queryWrapper.eq(joinTable.getColumn(joinCol.relatedField()),ConverUtil.jsonToValue(joinCol.staticType(),joinCol.staticValue()));
} }
} }
} }
return mapper.selectList(queryWrapper); Object object = mapper.selectOne(queryWrapper);
} return object==null?null:joinTable.toDto(object);
private static Object getJoinObj(LogTableInfo joinTable,LogJoinInfo join,BaseMapper mapper,LogTableInfo parentInfo,Object parent) {
LogJoin joinAnnotation = join.getJoin();
LogJoinColumn[] columns = joinAnnotation.columns();
QueryChainWrapper query = new QueryChainWrapper(mapper);
for (LogJoinColumn joinCol : columns) {
if(joinCol.valueType()==JoinValueType.FEILD) {
Object value = parentInfo.getFieldValue(parent,joinCol.field());
if(value==null) return null;
query.eq(joinTable.getColumn(joinCol.relatedField()),value);
}else {
if(StringUtils.isNotEmpty(joinCol.relatedField())) {
query.eq(joinTable.getColumn(joinCol.relatedField()),ConverUtil.jsonToValue(joinCol.staticType(),joinCol.staticValue()));
}
}
}
return mapper.selectObjs(query);
} }
@ -889,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
@ -929,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;