自定义注解,标识需要记录的属性
@Target(ElementType.FIELD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface EditRecord {
/**
* 属性名称
*
* @return
*/
String value() default "";
/**
* 标记属性是否为日期类型
*
* @return
*/
boolean isDate() default false;
/**
* 日期格式
*
* @return
*/
String dateFormat() default "yyyy-MM-dd";
/**
* 标记属性是否为文件
*
* @return
*/
boolean isFile() default false;
/**
* 标记属性是否为金额
*
* @return
*/
boolean isMoney() default false;
/**
* 标记属性是否为枚举值
*
* @return
*/
boolean isEnum() default false;
Class<? extends Enum> enumClass() default ProjectDicEnum.CustomerType.class;
}
属性增加标识
@EditRecord(value = "客户属性")
核心方法
/**
* 获取修改数据信息
*
* @param beforeObj 修改前对象
* @param afterObj 修改后对象
* @param sb 修改信息
* @param clazz 类
* @return
*/
public String getBeanEditMsg(Object beforeObj, Object afterObj, StringBuffer sb, Class clazz) {
Arrays.stream(clazz.getDeclaredFields()).forEach(e -> {
if (e.isAnnotationPresent(EditRecord.class)) { // 注解拦截
Object beforeValue = ReflectUtil.getFieldValue(beforeObj, e);
Object afterValue = ReflectUtil.getFieldValue(afterObj, e);
if (beforeValue == null || afterValue == null) { // 这里需要优化
return;
}
if (e.getAnnotation(EditRecord.class).isDate()) { // 日期数据处理
beforeValue = DateUtil.format((Date) beforeValue, e.getAnnotation(EditRecord.class).dateFormat());
afterValue = DateUtil.format((Date) afterValue, e.getAnnotation(EditRecord.class).dateFormat());
}
if (e.getAnnotation(EditRecord.class).isFile()) { // 文件数据处理
// 取差集
List<String> fileIdList = (List<String>) CollUtil.disjunction(Arrays.asList(((String) beforeValue).split(",")), Arrays.asList(((String) afterValue).split(",")));
if (CollUtil.isNotEmpty(fileIdList)) {
// 修改前的文件信息
List<BaseFileInfoResp> beforeFileList = baseFileInfoService.getFileList(Arrays.asList(((String) beforeValue).split(",")));
StringBuffer fileSb = new StringBuffer();
beforeFileList.stream().forEach(f -> {
fileSb.append("<a target=\"_blank\" href=\"" + FILE_PATH + f.getUri() + "\">" + f.getName() + "</a>");
});
sb.append("[" + e.getAnnotation(EditRecord.class).value() + "]:修改前:" + fileSb.toString());
fileSb.setLength(0); // 清空StringBuffer
// 修改后的文件信息
List<BaseFileInfoResp> fileList = baseFileInfoService.getFileList(Arrays.asList(((String) afterValue).split(",")));
fileList.stream().forEach(f -> {
fileSb.append("<a target=\"_blank\" href=\"" + FILE_PATH + f.getUri() + "\">" + f.getName() + "</a>");
});
sb.append(",修改后:" + fileSb.toString() + "<br/>");
}
} else if (e.getAnnotation(EditRecord.class).isMoney()) { // 金额数据处理
if (((BigDecimal) beforeValue).compareTo(((BigDecimal) afterValue)) != 0) {
sb.append("[" + e.getAnnotation(EditRecord.class).value() + "]:修改前:" + ((BigDecimal) beforeValue).stripTrailingZeros().toPlainString() + ",修改后:" + afterValue + "<br/>");
}
} else {
if (!beforeValue.toString().equals(afterValue.toString())) { // 数据判断
sb.append("[" + e.getAnnotation(EditRecord.class).value() + "]:修改前:" + beforeValue + ",修改后:" + afterValue + "<br/>");
}
}
}
});
return sb.toString();
}
使用
getBeanEditMsg(beforeReq, req, editSb, ProjectReportReq.class);
依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.8</version>
</dependency>