信息修改记录 java代码,JeeSite | 保存信息修改记录封装,批量修改封装

JeeSite | 保存信息修改记录封装,批量修改封装

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

JeeSite | 保存信息修改记录

JeeSite | 保存信息修改记录续

回顾

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

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

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

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

差异字段列表生成

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

该文件的代码如下:

1 public classCompareClassUtils {2 /**

3 * 获取两个对象同名属性内容不相同的列表4 *5 *@paramclass16 * 对象17 *@paramclass28 * 对象29 *@return

10 *@throwsClassNotFoundException11 *@throwsIllegalAccessException12 */

13 public static List>compareTwoClass(Object class1, Object class2) {14 List> list = new ArrayList>();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 map2 = new HashMap();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 returnlist;53 }54

55 /**

56 * 对比两个数据是否内容相同57 *58 *@paramobject1,object259 *@returnboolean类型60 */

61 public booleancompareTwo(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>list, String className) {2 //根据类名获得对应的表信息

3 GenTable genTable =getTableByClass(className.toString());4

5 if ( genTable == null) {6 return "";7 }8

9 //根据表id获取表相应的字段信息

10 List columnList =getColumnByTable(genTable.getId());11 if ( columnList == null) {12 return "";13 }14

15 Map mapField = new HashMap();16 Map mapDict = new HashMap();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 ( Mapmp : 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 returnmodInfo;53 }

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

封装后的调用

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

1 /*

2 * 如果id不为空,则表示为修改3 */

4 if( StringUtils.isNotBlank(sellContract.getId()) ) {5 SellContract sc = newSellContract();6 //获取原来的信息

7 sc =sellContractService.get(sellContract.getId());8

9 //比较修改后的信息和未修改的信息

10 List> modList =CompareClassUtils.compareTwoClass(sc, sellContract);11 //生成差异信息

12 String strModifyInfo = genTableService.catModifyInfo(modList, "SellContract");13 //输出差异字符串

14 System.out.println(strModifyInfo);15

16 //记录修改信息

17 ContractModifyInformation cmi = newContractModifyInformation();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(newDate());23 contractModifyInformationService.save(cmi);24 }

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

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

相关文章暂无相关文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值