1. 程式人生 > >aop使用,在資料修改時,記錄修改的欄位的歷史版本記錄

aop使用,在資料修改時,記錄修改的欄位的歷史版本記錄

配置在其他文章,提到過,

貼上程式碼

package com.audaque.collection.aop;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.audaque.annotation.EnumFields;
import com.audaque.annotation.PrimaryKeyFields;
import com.audaque.collection.CollectionBuidingplate;
import com.audaque.collection.CollectionBuilding;
import com.audaque.collection.CollectionGateplate;
import com.audaque.collection.CollectionHistory;
import com.audaque.collection.CollectionUnitplate;
import com.audaque.collection.Corporation;
import com.audaque.collection.House;
import com.audaque.collection.app.dao.BuildManagerDao;
import com.audaque.collection.app.dao.CollectionBuildingDao;
import com.audaque.collection.app.dao.CollectionBuildingplateDao;
import com.audaque.collection.app.dao.CollectionGateplateDao;
import com.audaque.collection.app.dao.CollectionHistoryDao;
import com.audaque.collection.app.dao.CollectionUnitplateDao;
import com.audaque.collection.app.dao.CorporationDao;
import com.audaque.collection.app.dao.HouseDao;
import com.audaque.collection.app.dao.PopulationDao;
import com.audaque.collection.app.model.CollectionBuildManager;
import com.audaque.collection.common.model.Population;
import com.yuncai.core.app.action.BaseAction;


/**
 * @Author: LGH
 * @Description: 處理表單留痕
 * @param:
 * @DATA: Created in 10:41 2018/8/15
 */
@Aspect
@Component
public class CollectionHistoryHandler extends BaseAction {

    @Autowired
    private CollectionGateplateDao collectionGateplateDao;

    @Autowired
    private CollectionBuildingplateDao collectionBuildingplateDao;

    @Autowired
    private CollectionUnitplateDao collectionUnitplateDao;

    @Autowired
    private CollectionBuildingDao collectionBuildingDao;
    @Autowired
    private CollectionHistoryDao collectionHistoryDao;
    @Autowired
    private HouseDao houseDao;
   @Autowired
   private CorporationDao corporationDao;
   @Autowired
   private PopulationDao populationDao;
   @Autowired
   private BuildManagerDao buildManagerDao;
   @Before("execution(* com.audaque.collection.app.dao..*.update*(..))")
    public void update_Before(JoinPoint joinPoint){
        System.out.println("這裡是目標方法執行前先執行1111");
        Object[] objArr = joinPoint.getArgs();
        for (Object object : objArr) {
         invokeEnum(object,"getValueByLable");
      }
    }


    
    /**
     * @Author: LGH 
     * @Description:
     * @param: 
     * @DATA: Created in 11:17 2018/8/15
     */
    private void invokeEnum(Object entity, String method){
        String id="0";
        System.out.println("這裡是目標方法執行前先執行22");
        try {
         Class clazz = entity.getClass();
         //獲取主鍵值
         Field[] fields = entity.getClass().getDeclaredFields();
         for (Field field : fields) {
            if(field.isAnnotationPresent(PrimaryKeyFields.class)){
               field.setAccessible(true);
               Object obj = field.get(entity);
               if(obj != null){ 
                  id=obj.toString();
               }
            }
         }
         JSONArray jsonArr = null;
         int type = 0;
         if(clazz.getSimpleName().equals("CollectionBuilding")){
            System.out.println("樓棟");
            CollectionBuilding oldBean= collectionBuildingDao.selectByPrimaryKey(Integer.valueOf(id));
            type = 1;
            jsonArr = contrastObj(fields, oldBean, entity);
            //collectionHistorys=contrastObj( collectionBuilding, entity,getUserId(),collectionBuilding.getBuildingId(),1, collectionHistorys);
         }else if(clazz.getSimpleName().equals("CollectionGateplate")){
            System.out.println("門牌");
            CollectionGateplate oldBean= collectionGateplateDao.selectByPrimaryKey(Integer.valueOf(id));
            type = 2;
            jsonArr = contrastObj(fields, oldBean, entity);
           // collectionHistorys=contrastObj(gateplate, entity,Integer.valueOf(id),getUserId(),2, collectionHistorys);
         }else if(clazz.getSimpleName().equals("CollectionBuidingplate")){
            System.out.println("樓盤");
            CollectionBuidingplate oldBean= collectionBuildingplateDao.selectByPrimaryKey(Integer.valueOf(id));
            type = 3;
            jsonArr = contrastObj(fields, oldBean, entity);
           // collectionHistorys=contrastObj(buidingplate, entity,Integer.valueOf(id),getUserId(),3, collectionHistorys);
         }else if(clazz.getSimpleName().equals("CollectionUnitplate")){
            System.out.println("單元牌");
            CollectionUnitplate oldBean= collectionUnitplateDao.selectByPrimaryKey(Integer.valueOf(id));
            type = 4;
            jsonArr = contrastObj(fields, oldBean, entity);
            //collectionHistorys=contrastObj(unitplate, entity,Integer.valueOf(id),getUserId(),4, collectionHistorys);
         }else if(clazz.getSimpleName().equals("House")){
            System.out.println("房屋");
            House oldBean=houseDao.selectByPrimaryKey(Integer.valueOf(id));
            type = 5;
            jsonArr = contrastObj(fields, oldBean, entity);
           // collectionHistorys=contrastObj(house, entity,Integer.valueOf(id),getUserId(),5, collectionHistorys);
         }else if(clazz.getSimpleName().equals("Corporation")){
            System.out.println("法人");
            Corporation oldBean=corporationDao.getCorporation(Integer.valueOf(id));
            type = 6;
            jsonArr = contrastObj(fields, oldBean, entity);
            // collectionHistorys=contrastObj(house, entity,Integer.valueOf(id),getUserId(),5, collectionHistorys);
         }else if(clazz.getSimpleName().equals("Population")){
            System.out.println("人口");
            Population oldBean=populationDao.queryPopulationById(Integer.valueOf(id));
            type =7;
            jsonArr = contrastObj(fields, oldBean, entity);
            // collectionHistorys=contrastObj(house, entity,Integer.valueOf(id),getUserId(),5, collectionHistorys);
         }else if(clazz.getSimpleName().equals("CollectionBuildManager")){
            System.out.println("樓棟長");
            CollectionBuildManager oldBean=null;
            oldBean=buildManagerDao.selectByPrimaryKey(Integer.valueOf(id));
            type =8;
            jsonArr = contrastObj(fields, oldBean, entity);
            // collectionHistorys=contrastObj(house, entity,Integer.valueOf(id),getUserId(),5, collectionHistorys);
         }
         ///collectionHistorys=contrastObj(building, collectionBuilding,userId,1, collectionHistorys);
         if (jsonArr!=null && jsonArr.size()>0){
            List<CollectionHistory>  collectionHistorys = new ArrayList<CollectionHistory>();
            for (int i = 0; i < jsonArr.size(); i++) {
               JSONObject json = jsonArr.getJSONObject(i);
               CollectionHistory collectionHistory=new CollectionHistory();
                    collectionHistory.setBizId(Integer.valueOf(id));
                    collectionHistory.setColumnName(json.getString("name"));
                    collectionHistory.setColumnValue(json.getString("value"));
                    collectionHistory.setCreateTime(new Date());
                    collectionHistory.setCreateUser(getUserId());
                    collectionHistory.setType(type);
                    collectionHistorys.add(collectionHistory);
            } 
             collectionHistoryDao.batchCollectionHistory(collectionHistorys);
         }

         for (Field field : fields) {
            if(field.isAnnotationPresent(EnumFields.class)){
               Class<?> efoClass = field.getAnnotation(EnumFields.class).requiredEnum();
               field.setAccessible(true);
               Object obj = field.get(entity);
               if(obj != null && efoClass != null){
                  Method efMethod = efoClass.getMethod(method, String.class);
                  Object efo = efMethod.invoke(efoClass, obj);
                  field.set(entity, efo);
               }
            }
         }
      } catch (NumberFormatException e) {
         e.printStackTrace();
      } catch (SecurityException e) {
         e.printStackTrace();
      } catch (IllegalArgumentException e) {
         e.printStackTrace();
      } catch (IllegalAccessException e) {
         e.printStackTrace();
      } catch (InvocationTargetException e) {
         e.printStackTrace();
      } catch (IntrospectionException e) {
         e.printStackTrace();
      } catch (NoSuchMethodException e) {
         e.printStackTrace();
      }
    }

    /**
     * @Title: contrastObj   
     * @Description: 歷史記錄留痕   
     * @param fields
     * @param oldBean
     * @param newBean
     * @return
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     * @throws InvocationTargetException
     * @throws IntrospectionException JSONArray  
     * @author: huafu.su
     */
    private JSONArray contrastObj(Field[] fields, Object oldBean, Object newBean)
          throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException{
       JSONArray jsonArr = new JSONArray();
       if(oldBean == null || newBean == null){
          return jsonArr;
       }
       for (Field field : fields) {
            if("serialVersionUID".equals(field.getName()) || "lastUpdateTime".equals(field.getName())|| "formData".equals(field.getName())){
            System.out.println(field.getName());
            continue;
            }else{
            PropertyDescriptor pd = new PropertyDescriptor(field.getName(), oldBean.getClass());
            Method getMethod = pd.getReadMethod();
            Object o1 = getMethod.invoke(oldBean);
            Object o2 = getMethod.invoke(newBean);
            if(o1==null || o2 == null){
               continue;
            }
            if (!o1.toString().equals(o2.toString())) {
               JSONObject json  = new JSONObject();
               json.put("name", field.getName());
               json.put("value", o1.toString());
               jsonArr.add(json);
            }
         }

        }
       return jsonArr;
    }
    /**
     * @Author: LGH
     * @Description: 歷史記錄留痕
     * @param: type 1 是樓棟 2是門牌 3是樓盤 4是單元牌
     * @DATA: Created in 16:07 2018/8/15
     */
//    public List<CollectionHistory> contrastObj(Object oldBean, Object newBean, Integer bizId,Integer userid, Integer type, List<CollectionHistory> collectionHistorys) {
//        try {
//            Class clazz = oldBean.getClass();
//            Field[] fields = oldBean.getClass().getDeclaredFields();
//            for (Field field : fields) {
//                if("serialVersionUID".equals(field.getName()) || "lastUpdateTime".equals(field.getName())){
//                    continue;
//                }
//                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
//                Method getMethod = pd.getReadMethod();
//                Object o1 = getMethod.invoke(oldBean);
//                Object o2 = getMethod.invoke(newBean);
//                if(o1==null || o2 == null){
//                    continue;
//                }
//                if (!o1.toString().equals(o2.toString())) {
//                    CollectionHistory collectionHistory=new CollectionHistory();
//                    collectionHistory.setBizId(bizId);
//                    collectionHistory.setColumnName(field.getName());
//                    collectionHistory.setColumnValue(o1.toString());
//                    collectionHistory.setCreateTime(new Date());
//                    collectionHistory.setCreateUser(userid);
//                    collectionHistory.setType(type);
//                    collectionHistorys.add(collectionHistory);
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return collectionHistorys;
//    }
}