首页 > 编程语言 >JAVA字段审计功能-对比修改前后变化并使用枚举Enums进行翻译

JAVA字段审计功能-对比修改前后变化并使用枚举Enums进行翻译

时间:2024-08-14 18:26:46浏览次数:14  
标签:return String Object newValue 字段 oldValue JAVA Enums public

最近接到了一个业务是,审计客户和合同的字段变化,要明细到使用系统的人员能看懂(大概就是我们存入数据库是1 2什么的进行翻译)

返回的信息大概就是:

客户A的 客户状态 从 客户状态A  修改成了  客户状态B ,客户性别 从 客户性别A 变成了客户性别B。

我实现的思路大概就是:

1、获取到客户对象的前后变化

2、通过枚举Enum或者数据字典来翻译 客户对象的 字段名称,对应字段名称下的类型也进行翻译

我这里使用的是枚举

一、操作准备:

客户对象类:

@Data
@RequiredArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String name;//姓名
    private String sex;//性别
    private String address;//用户地址
    private String status;//用户状态

}

客户所需的字段枚举:

public enum clientFieldEnum {

    CLIENT_TYPE("status","用户状态"),
    CLIENT_LEVEL("level","用户等级"),
    CLIENT_SEX("sex","用户性别"),
    CLIENT_ADDRESS("address","用户地址");

    private final String fieldName;
    private final String fieldRemark;

    clientFieldEnum(String fieldName, String fieldRemark) {
        this.fieldName = fieldName;
        this.fieldRemark = fieldRemark;
    }

    public String getFieldName() {
        return fieldName;
    }

    public String getFieldRemark() {
        return fieldRemark;
    }

    public static String getRemarkBybussisName(String fieldName) {
        for (clientFieldEnum bussis : clientFieldEnum.values()) {
            if (bussis.getFieldName().equals(fieldName)) {
                return bussis.getFieldRemark();
            }
        }
        // 如果没有匹配的 code,返回默认值或抛出异常
        return "未知字段";
    }


}

客户的状态枚举:

public enum clientStatusEnum {

    NEWCLIENT("1","新进客户"),
    MIDCLIENT("2","跟进客户");


    private final String type;
    private final Object enumObject;

    clientStatusEnum(String type, Object enumObject) {
        this.type = type;
        this.enumObject = enumObject;
    }



    public String getType() {
        return type;
    }

    public Object getEnumObject() {
        return enumObject;
    }

    // 根据输入的 code 返回对应的描述
    public static Object getObjectByStatus(String type) {
        for (clientStatusEnum client : clientStatusEnum.values()) {
            if (client.getType().equals(type)) {
                return client.getEnumObject();
            }
        }
        // 如果没有匹配的 code,返回默认值或抛出异常
        return "未知客户";
    }

}

客户的性别枚举:

public enum clientSexEnum {

    MAN("1","男"),
    WOMAN("2","女");

    private final String sexCode;
    private final String sexName;


    clientSexEnum(String sexCode, String sexName) {
        this.sexCode = sexCode;
        this.sexName = sexName;
    }

    public String getSexCode() {
        return sexCode;
    }

    public String getSexName() {
        return sexName;
    }

    public static Object getObjectBySex(String sexCode) {
        for (clientSexEnum sex : clientSexEnum.values()) {
            if (sex.getSexCode().equals(sexCode)) {
                return sex.getSexName();
            }
        }
        // 如果没有匹配的 code,返回默认值或抛出异常
        return "未知性别";
    }

客户的业务实际操作枚举:


public enum  tranformClientEnum {

    KEY1("status"){
        @Override
        public Map<String,Object> execute(Object oldValue,Object newValue) {
            Map<String,Object> object = new HashMap();
            object.put("fieldName","用户状态");
            object.put("oldValue", clientStatusEnum.getObjectByStatus((String) oldValue));
            object.put("newValue", clientStatusEnum.getObjectByStatus((String) newValue));
            return object;
        }
    },
    KEY2("sex"){
        @Override
        public Map<String,Object> execute(Object oldValue,Object newValue) {
            Map<String,Object> object = new HashMap();
            object.put("fieldName","用户性别");
            object.put("oldValue", clientSexEnum.getObjectBySex((String) oldValue));
            object.put("newValue", clientSexEnum.getObjectBySex((String) newValue));
            return object;
        }
    };


    private final String key;

    tranformClientEnum(String key) {
        this.key = key;
    }

    public String getKey() {
        return key;
    }

    // 抽象方法,由每个枚举实例实现
    public abstract Map<String,Object> execute(Object oldValue,Object newValue);

    // 根据 code 获取对应的 ActionType 并执行方法
    public static Map<String,Object> executeByCode(String key,Object oldValue,Object newValue) {

        //如何key里面存在则进行枚举实现
        for (tranformClientEnum action : tranformClientEnum.values()) {
            if (action.getKey().equals(key)) {
                Map<String, Object> execute = action.execute(oldValue, newValue);
                return execute;
            }
        }

        //如果key里面没有则直接输出
        Map<String,Object> map = new HashMap<>();
        map.put("fieldName",clientFieldEnum.getRemarkBybussisName(key));
        map.put("oldValue", oldValue);
        map.put("newValue", newValue);

        return map;
    }

二、测试代码:

@SpringBootTest
public class diffUtilsTest {


    @DisplayName("diffUtils测试")
    @Test
    public void auditChanges() {

        User oldEntity = new User(1L,"小明", "1", "广州","1");
        User newEntity = new User(1L,"小亮", "2", "深圳","4");

        // 获取对象的属性
        Map<String, Object> oldMap = BeanUtil.beanToMap(oldEntity);
        Map<String, Object> newMap = BeanUtil.beanToMap(newEntity);

        System.out.println("-----对象User字段的变化记录------");
        oldMap.forEach((key, oldValue) -> {
            Object newValue = newMap.get(key);
            if (newValue != null && !oldValue.equals(newValue)) {
                Map<String, Object> stringObjectMap = tranformClientEnum.executeByCode(key, oldValue, newValue);
                System.out.println("字段名称:"+stringObjectMap.get("fieldName")+"   由:"+stringObjectMap.get("oldValue")+"   变为:"+stringObjectMap.get("newValue"));
            }
        });

    }
}

三、运行结果:

ps:里面使用到的BeanUtil是导入了hutool工具包,没有引入的同学可以看看我的上一篇文章

完结撒花~~❀

你们有没有更好的方法做呢?

标签:return,String,Object,newValue,字段,oldValue,JAVA,Enums,public
From: https://blog.csdn.net/TinpeaV/article/details/141196323

相关文章

  • java反射简介
    1.反射定义 反射是一种可以间接操作目标对象的机制。当使用反射时,JVM 在运行的时候才动态加载类,对于任意类,知道其属性和方法,并不需要提前在编译期知道运行的对象是谁,允许运行时的Java程序获取类的信息并对其进行操作。2.获取类的四个方式 3.class从类中获取构造器......
  • 计算机毕业设计推荐-基于JAVA的航空机票预定管理系统
    ......
  • 进阶 Java冒泡排序递归法 有点难度哦
    简介这里有用到递归的冒泡排序思路,难度对新手很大,不明白递归和冒泡排序的小伙子可以先看看我的其他两个文章。连接在这里:Java冒泡排序https://blog.csdn.net/ouhexie/article/details/140985984?spm=1001.2014.3001.5501Java递归算法https://blog.csdn.net/ouhexie/articl......
  • 基于Java的校园外卖系统设计与实现。开题报告+答辩PPT+万字论文
    准备毕业设计的时候到了,相信大部分宝子们还没有头绪吧。看完本文会让你受益匪浅。一、项目介绍 本系统是面向所有人的外卖点餐系统。系统内的角色分为管理员和前台用户。管理员有权登录管理端进行如员工信息管理、分类、菜品与套餐管理、查看订单详情及编辑个人资料等操作......
  • java+testng+selenium实现测试用例过程的录制,生成GIF。
    1.功能需求:支持灵活配置:因为本身已有用例执行失败的截图功能,所以需要支持针对单条测试用例的配置;支持testng框架xml多线程的执行;录制内容文件小、支持调整录制每帧间隔、每条用例录制最大时长(避免用例元素未定位到时长时间录制)。2.灵活配置实现创建注解,通过在测试用......
  • JavaSE基础知识分享(六)
    写在前面前面讲的是面向对象中的多态这部分,下面让我们来看看java中常用类这部分的内容!常用类Object概述:是Java中所有类的父类,包括自己定义的类和数组都继承自Object类。成员方法hashCode()获取对象地址值的int类型形式。getClass()获取对象的类的字节码文件对......
  • java流程控制之选择结构
    if单选择结构:我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程在程序中用if语句来表达。语法为:if(布尔表达式){//为true执行语句}if双选择结构:两个判断,if-else。语法为:if(布尔表达式){//为true执行语句}else{//为......
  • java后端详解中
    1.日期时间yyyy表示当天所在的年YYYY代表是weekinwhichyear,表示当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的YYYY就是下一年。表示日期和时间的格式:newSimpleDateFormat("yyyy-MM-dd:HH:mm:ss")1)表示月份是大写的M;2)表示分钟则是小写的m;3)24小......
  • JAVA毕业设计|ssm高校宿舍管理系统的设计与开发jsp包含文档代码讲解
    收藏点赞不迷路 关注作者有好处文末获取源码一、系统展示二、万字文档展示 基于ssm高校宿舍管理系统的设计与开发jsp开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis+Vue工具:IDEA/Ecilpse、Navicat、Maven 编号:ssm283一、系统展示二、万字文档展示第......
  • JAVA毕业设计|(免费)ssm实验室管理与排课系统包含文档代码讲解
     收藏点赞不迷路 关注作者有好处编号:ssm458ssm实验室管理与排课系统开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis+Vue工具:IDEA/Ecilpse、Navicat、Maven文末获取源码(免费领源码)1.系统展示2.万字文档展示第5章系统详细设计最后对选题、开题、毕设开......