前面寫過兩篇關於“保存信息修改記錄”的內容,分別如下: JeeSite | 保存信息修改記錄 JeeSite | 保存信息修改記錄續 回顧 第一篇文章通過類欄位的比較返回一個有欄位值不同的 List,然後自己構造表欄位和字典的 Map 來生成修改前和修改後的差異字元串。從而實現“信息”修改“前”和修 ...
前面寫過兩篇關於“保存信息修改記錄”的內容,分別如下:
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”