欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JeeSite | 保存信息修改记录续

程序员文章站 2023-02-03 09:10:56
前面写过两篇关于“保存信息修改记录”的内容,分别如下: JeeSite | 保存信息修改记录 JeeSite | 保存信息修改记录续 回顾 第一篇文章通过类字段的比较返回一个有字段值不同的 List,然后自己构造表字段和字典的 Map 来生成修改前和修改后的差异字符串。从而实现“信息”修改“前”和修 ......

前面写过两篇关于“保存信息修改记录”的内容,分别如下:

jeesite | 保存信息修改记录

jeesite | 保存信息修改记录续

 

回顾

        第一篇文章通过类字段的比较返回一个有字段值不同的 list,然后自己构造表字段和字典的 map 来生成修改前和修改后的差异字符串。从而实现“信息”修改“前”和修改“后”的对比记录。

        第二篇文章不再自己构造表字段和字典的 map,而是直接使用了 jeesite 自带的 gentable 类取代了自己构造表字段和字典的 map,只是需要将“代码生成”中的“业务表配置”模块维护好就可以了。第二篇文章对第一篇文章进行了改进。

 

        对于保存信息修改记录这个功能会在很多表单中进行使用,那么按照前面的解决方法,需要在每个表单对应的 controller 中增加相同的代码来完成同样的事情,这样代码就重复了。因此,本篇就将这个功能封装为一个类,这样每次使用的时候只要实例化这个类,就可以完成“信息”修改“前”和修改“后”对比记录的功能了。

 

        代码的具体功能前面都介绍过了,因此不进行太多的介绍了,只是介绍一下具体如何的封装。

 

差异字段列表生成

        在 jeesite 下的 src\main\java\com\thinkgem\jeesite\common\utils\ (该目录下存放了 jeesite 项目的通用工具类,比如文件操作类、字符串操作类、日期操作类等)下新建一个compareclassutils.java 的类文件。

        该文件的代码如下:

 1 public class compareclassutils {
 2     /**
 3      * 获取两个对象同名属性内容不相同的列表
 4      * 
 5      * @param class1
 6      *            对象1
 7      * @param class2
 8      *            对象2
 9      * @return
10      * @throws classnotfoundexception
11      * @throws illegalaccessexception
12      */
13     public static list<map<string, object>> comparetwoclass(object class1, object class2) {
14         list<map<string, object>> list = new arraylist<map<string, object>>();
15         // 获取对象的class
16         class<?> clazz1 = class1.getclass();
17         class<?> clazz2 = class2.getclass();
18         // 获取对象的属性列表
19         field[] field1 = clazz1.getdeclaredfields();
20         field[] field2 = clazz2.getdeclaredfields();
21         // 遍历属性列表field1
22         for (int i = 0; i < field1.length; i++) {
23             // 遍历属性列表field2
24             for (int j = 0; j < field2.length; j++) {
25                 // 如果field1[i]属性名与field2[j]属性名内容相同
26                 if (field1[i].getname().equals(field2[j].getname())) {
27                     if (field1[i].getname().equals(field2[j].getname())) {
28                         field1[i].setaccessible(true);
29                         field2[j].setaccessible(true);
30                         // 如果field1[i]属性值与field2[j]属性值内容不相同
31                         try {
32                             if (!comparetwo(field1[i].get(class1), field2[j].get(class2))) {
33                                 map<string, object> map2 = new hashmap<string, object>();
34                                 map2.put("name", field1[i].getname());
35                                 map2.put("old", field1[i].get(class1));
36                                 map2.put("new", field2[j].get(class2));
37                                 list.add(map2);
38                             }
39                         } catch (illegalargumentexception e) {
40                             // todo auto-generated catch block
41                             e.printstacktrace();
42                         } catch (illegalaccessexception e) {
43                             // todo auto-generated catch block
44                             e.printstacktrace();
45                         }
46                         break;
47                     }
48                 }
49             }
50         }
51 
52         return list;
53     }
54 
55     /**
56      * 对比两个数据是否内容相同
57      * 
58      * @param object1,object2
59      * @return boolean类型
60      */
61     public boolean comparetwo(object object1, object object2) {
62 
63         if (object1 == null && object2 == null) {
64             return true;
65         }
66         if (object1 == null && object2 != null) {
67             return false;
68         }
69         if (object1.equals(object2)) {
70             return true;
71         }
72         return false;
73     }
74 }

 

 

差异信息的拼接

        差异信息的拼接需要使用数据表中字段的注释,如果代码中使用了字典则需要维护好对应的字典。在前面的文章中,在 gentableservice.java 增加了两个方法,并在 gentabledao.xml 和 gentablecolumndao.xml 增加了相应的 sql。前面文章中,拼接差异信息定义在了表单对应的 controller 中,即 catmodifyinfo() 方法写在了各个表单的 controller 中,而这里只需要将 catmodifyinfo() 方法移动到 gentableservice.java 文件中即可。

        在 gentableservice.java 下添加如下代码:

 1 public string catmodifyinfo(list<map<string, object>> list, string classname) {
 2     // 根据类名获得对应的表信息
 3     gentable gentable = gettablebyclass(classname.tostring());
 4 
 5     if ( gentable == null ) {
 6         return "";
 7     }
 8 
 9     // 根据表id获取表相应的字段信息
10     list<gentablecolumn> columnlist = getcolumnbytable(gentable.getid());
11     if ( columnlist == null ) {
12         return "";
13     }
14 
15     map<string, string> mapfield = new hashmap<string, string>();
16     map<string, string> mapdict  = new hashmap<string, string>();
17 
18     // 获得字段对应的java属性和字段注释
19     for( gentablecolumn gtc : columnlist ) {
20         mapfield.put(gtc.getjavafield(), gtc.getcomments());
21     }
22 
23     // 获得字段对应的注释和对应的字典
24     for ( gentablecolumn gtc : columnlist ) {
25         if ( stringutils.isnotempty(gtc.getdicttype()) 
26                 && stringutils.isnotblank(gtc.getdicttype()) ) {
27             mapdict.put(gtc.getcomments(), gtc.getdicttype());
28         }
29     }
30 
31     // 构造的修改字符串
32     string modinfo = "";
33 
34     for ( map<string, object> mp : list) {
35         system.out.println(mp.get("name") + "---" + mp.get("old") + "---" + mp.get("new"));
36         system.out.println(mapfield.get(mp.get("name")));
37 
38         // 判断修改的值是否为字典
39         if ( mapdict.containskey(mapfield.get(mp.get("name"))) ) {
40             string oldvalue = mp.get("old").tostring();
41             string newvalue = mp.get("new").tostring();
42             string type     = mapdict.get(mapfield.get(mp.get("name")));
43             string oldstr = dictutils.getdictlabel(oldvalue, type, "");
44             string newstr = dictutils.getdictlabel(newvalue, type, "");
45             system.out.println(mapfield.get(mp.get("name")) + ":(" + oldstr + ") => (" + newstr + ");");
46             modinfo += mapfield.get(mp.get("name")) + ":(" + oldstr + ") => (" + newstr + ");"; 
47         } else {
48             modinfo += mapfield.get(mp.get("name")) + ":(" + mp.get("old") + ") => (" + mp.get("new") + ");"; 
49         }
50     }
51 
52     return modinfo;
53 }

       上面的代码不再进行解释,前面已经有过具体的说明了。

 

封装后的调用

        在 jeesite 中,新建和修改的“保存”调用的都是 controller 中的 "save" 方法,具体是修改还是新建,只要通过判断对象是否存在 id 即可,代码如下:

 1 /*
 2  * 如果id不为空,则表示为修改
 3  */
 4 if ( stringutils.isnotblank(sellcontract.getid()) ) {
 5     sellcontract sc = new sellcontract();
 6     // 获取原来的信息
 7     sc = sellcontractservice.get(sellcontract.getid());
 8     
 9     // 比较修改后的信息和未修改的信息
10     list<map<string, object>> modlist = compareclassutils.comparetwoclass(sc, sellcontract);
11     // 生成差异信息
12     string strmodifyinfo = gentableservice.catmodifyinfo(modlist, "sellcontract");
13     // 输出差异字符串
14     system.out.println(strmodifyinfo);
15     
16     // 记录修改信息
17     contractmodifyinformation cmi = new contractmodifyinformation();
18     cmi.setcontractid(sellcontract.getid());
19     cmi.setmodifycontent(strmodifyinfo);
20     cmi.setmodifydept(userutils.getuser().getoffice().getid());
21     cmi.setmodifyuser(userutils.getuser().getid());
22     cmi.setmodifydate(new date());
23     contractmodifyinformationservice.save(cmi);
24 }

        到此,具体的封装就完成了。

 


我的微信公众号:“码农up2u”

JeeSite | 保存信息修改记录续