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”