这段时间做了一个数据对比的功能模块。具体操作是从申请人修改自己的数据然后提交数据进行多次审批,如果审批完成那么则更新对应的数据。再此中间,审批人可以对申请人的信息进行编辑。
先说一下思路吧,这是表结构
通过进行修改数据与数据库数据进行比较,如果有改变那么进插入数据。每修改一个字段的数据则插入一条数据。applicationMainId是对应的申请主表Id,这里将不对流程操作进行解释。
首先,创建你需要接收数据的实体类,这里因为界面上展示的并不是数据库中所有的数据,所以建议不要使用与数据库对应的那张关系表。
接收到前端传递的数据之后,然后找到对应的数据库中的数据进行对比(UserChangeDo是我对应的修改数据信息表)
第一种情况:对某一模块进行修改 (数据库中有对应数据) ----这里说明一下,因为最后会通过反射来操作数据库,所以表名称和字段名称必须有
/**
*obj1 数据库对应数据
*obj2 修改之后的数据
*ignoreArr 不需要进行对比的属性
*modelType 对应表名
*feildId 对应数据主键
*userId 申请人id
*dealId 操作人id
**/
public List<UserChangeDo> compareFields(Object obj1, Object obj2, String[] ignoreArr,String modelType,Integer feildId,Integer userId,Integer dealId) {
try {
List<UserChangeDo> list = new ArrayList<>();
List<String> ignoreList = null;
if (ignoreArr!= null && ignoreArr.length > 0) {
// array转化为list
ignoreList = Arrays.asList(ignoreArr);
}
// 只有两个对象都是同一类型的才有可比性
if (obj1.getClass() == obj2.getClass()) {
Class clazz = obj1.getClass();
// 获取object的属性描述
PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,
Object.class).getPropertyDescriptors();
// 这里就是所有的属性了
for (PropertyDescriptor pd : pds) {
// 属性名
String name = pd.getName();
// 如果当前属性选择进行比较,跳到下一次循环
if (ignoreList != null && ignoreList.contains(name)) {
continue;
}
// get方法
Method readMethod = pd.getReadMethod();
// 在obj1上调用get方法等同于获得obj1的属性值
Object objBefore = readMethod.invoke(obj1);
// 在obj2上调用get方法等同于获得obj2的属性值
Object objAfter = readMethod.invoke(obj2);
// 比较这两个值是否相等
else if (!objBefore.equals(objAfter)) {
//进行赋值操作
//实例化UserChangeDo type设置为2(代表更新) 封装数据之后装入list中
}
}
}
return list;
} catch (Exception e) {
logger.error(e.getMessage());
return null;
}
}
}
第二种情况:新增模块(数据库中没有对应数据) 由于代码无法拷贝出来,所以这里只进行思路讲解以及简单的代码展示
由于员工个人信息中的工作经历可能会有多条记录,所以有以下情况
1.数据库中和前端传递都有值
此时,我们遍历两个集合。将它们的主键id进行比较,如果相同,那么进行之前的数据对比。
1.1
在此情况中,我们还需要判断前端是否有新增的数据,所以过滤出前端传递数据中没有id的数据,进行新增(由于代码比较长,所以这里会有多张图,大家谅解)
我这里加了一个specialId是为了给新增的模块一个唯一标识符 ,而且由于新增,所以是没有之前数据库的值。所以传值的时候,将obj1设置为null即可。





ok,该情况完成。
1.3
接下来判断是否有删除的数据,拿到数据中对应的id与前端传递的id进行比较。如果原来数据中有,但是现在前端传递中没有,那么说明该模块被删除了。得到删除的id进行操作。大家可以看到下面这张图,我obj2传的是null,这说明是删除。而KEY_EDUCATION是我设置的一个常量,对应的实体类名称。然后将type设置为3,代表删除。

2.数据库中有值,现在没值。这里就不多做解释了,就是删除

3.数据库没有值,但是现在有值。说明是新增 (注意:大家不要去管附件处理,因为这边只是做了一个简单地操作,针对附件的审批以后会进行详解)

ok,3种情况分析完成。接下来对应数据塞入数据库即可。
最后,这里详细讲解一下我的思路:申请人第一次申请提交之后会就会走这个流程,当第一个审批人给申请人进行审批的时候,也会进行该流程操作。这里就会用到specialId,由于每个某块的specialId都是相同的,所以从第二次开始,只要是新增的操作,前端会将对应的specialId装入对应的实体类中,然后返回给后台。此时,我们又会得到新的比较之后的数据,但是由于两次的数据中可能会有重复的操作数据(例如:申请人改动了年龄,审核人就会看到改动的数据,然而审核人并没有修改,就通过了审批。这时前端传过来的值就是之前申请人修改的值,与数据库以前的数据进行比较之后,也会被视为修改了的数据。这时候就会出现两条一样的数据。所以这时候要剔除掉这条数据,因为审核人并没有修改。亦或是申请人新增了工作经历模块,审核人看到了并没有修改,就直接通过了。此时我们就会通过specialId来进行条件作为比较)
这里说明一下,申请人提交数据之后会通过好几个人的审批才会完成整个流程,当完成流程之后才会对数据库的数据进行操作。所以在此流程中,需要去对比修改的数据。
大家请多提出观点,我会及时进行解答和修改的。谢谢大家!
本文介绍了一个数据对比功能的实现,通过Java处理申请人修改数据并进行审批流程的对比。涉及反射操作数据库,对比前后数据,处理新增、修改、删除三种情况,并利用特殊ID避免重复数据。
4871

被折叠的 条评论
为什么被折叠?



