package cn.iocoder.yudao.framework.operatelog.core.util; import com.mzt.logapi.context.LogRecordContext; import java.util.Collection; import java.util.Map; /** * 操作日志的工具类 * * 主要解决「导入」这类批量操作的日志文案:一次导入只写一条汇总日志, * 而不是逐行写(一次导入几百行就是几百条日志,日志页会没法看)。 * * 用法:在导入方法返回前调用 {@link #putImportSummary},注解文案里引用 {{#importSummary}}: *
* @LogRecord(type = XXX_TYPE, subType = XXX_IMPORT_SUB_TYPE, bizNo = "0", success = XXX_IMPORT_SUCCESS)
* public XxxImportRespVO importXxxList(...) {
* ...
* OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
* return respVO;
* }
*
*
* 注意:注解的 bizNo 必须给数字(导入没有单一业务编号,统一填 "0")。
*
* @author 超级管理员
*/
public class OperateLogUtils {
/**
* 导入汇总文案在 {@link LogRecordContext} 里的变量名,对应注解文案的 {{#importSummary}}
*/
public static final String IMPORT_SUMMARY = "importSummary";
/**
* 记录导入结果的汇总变量(新增/更新/失败条数),直接传各模块导入 RespVO 的字段
*
* 各模块的导入结果字段形态不统一:成功的一般是 Collection(createUsernames / createList /
* createCustomerNames …),失败的则多是 Map(failureList / failureDeptNames,key 为名称或行号),
* 且有的模块没有「更新」这一列(builder 未赋值时为 null)。所以这里统一按「集合 / Map / 数字 / null」
* 取条数,取不到按 0 处理——统计失败不能让整条导入日志丢掉。
*
* @param createResult 新增成功的集合(或条数)
* @param updateResult 更新成功的集合(或条数),没有则传 null
* @param failureResult 失败的集合 / Map(或条数)
*/
public static void putImportSummary(Object createResult, Object updateResult, Object failureResult) {
LogRecordContext.putVariable(IMPORT_SUMMARY, "新增 " + size(createResult) + " 条、更新 "
+ size(updateResult) + " 条、失败 " + size(failureResult) + " 条");
}
private static int size(Object result) {
if (result == null) {
return 0;
}
if (result instanceof Collection) {
return ((Collection>) result).size();
}
if (result instanceof Map) {
return ((Map, ?>) result).size();
}
if (result instanceof Number) {
return ((Number) result).intValue();
}
return 0;
}
}