OrgModifyExamineUtils

  1. 工具类-两个对象比较获取变更的数据

工具类-两个对象比较获取变更的数据

package cn.swiftpass.core.common.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.*;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang.reflect.FieldUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.swiftpass.core.common.annotation.CompareVal;
import cn.swiftpass.core.common.mybatis.handler.CryptTypeHanlderHelper;
import org.springframework.util.ReflectionUtils;

/**
 * 机构变更审核工具类
 * @author chenys
 *
 */
public class OrgModifyExamineUtils {
    
    private static Logger logger = LoggerFactory.getLogger(OrgModifyExamineUtils.class);
    
    public static final String MCH_KEY = "mchInfo";
    public static final String MCH_DETAIL_KEY = "mchDetailInfo";
    public static final String MCH_BRANCH_CONF_KEY = "mchBranchConfInfo";
    public static final String CH_KEY = "chInfo";
    public static final String BANK_ACCOUNT_KEY = "bankAccountInfo";

    public static final String ACTIVITY_2C_KEY = "activity2CInfo";
    /**
     * 受益人
     */
    public static final String BENEFIT_KEY = "benefit";
    public static final String BENEFIT_OREDER_KEY = "benefitOrder";

    public static final String MCH_PAY_CONF_RATE_INFO = "mchPayConfRateInfo";
    public static final String MCH_PAY_CONF_PRODUCT_INFO = "mchPayConfProductInfo";
    public static final String MCH_RANK_LIMIT_RECORD = "mchRankLimitRecord";

    private OrgModifyExamineUtils() {}

    /**
     * 获取变更的数据
     * @param newObj
     * @param oldObj
     * @param annotationClazz
     * @return
     */
    public static Map<String,Object> getModifyData(Object newObj,Object oldObj,Class<?> annotationClazz,String...specalFields){
        if(null == annotationClazz || (null == newObj && null != oldObj) || (null != newObj && null == oldObj)){
            return null;
        }
        else if(newObj.equals(oldObj)){
            return null;
        }
        Map<String, Object> reponseMap = new HashMap<String,Object>();
        
        try{
            Class<? extends Object> clazz1 = newObj.getClass();
            Class<? extends Object> clazz2 = oldObj.getClass();
            
            for(String specalField:specalFields){
                Field field1 = null;
                Field field2 = null;
                try{
                    field1 = clazz1.getDeclaredField(specalField);
                }catch(Exception e){
                    try{
                        field1 = clazz1.getSuperclass().getDeclaredField(specalField);
                    }catch(Exception e1){
                        continue;
                    }
                }
                ReflectionUtils.makeAccessible(field1);
                Object object1 = field1.get(newObj);
                try{
                    field2 = clazz2.getDeclaredField(specalField);
                }catch(Exception e){
                    try{
                        field2 = clazz2.getSuperclass().getDeclaredField(specalField);
                    }catch(Exception e1){
                        continue;
                    }
                }
                ReflectionUtils.makeAccessible(field2);
                Object object2 = field2.get(oldObj);
                if(object1 != null && StringUtils.isNotBlank(object1.toString()) && !JudgeUtils.compareValue(object1,object2)){
                    reponseMap.put(specalField, object1);
                }
            }
            
            Field[] clazzFields = annotationClazz.getDeclaredFields();
            for(Field clazzfield: clazzFields){
                if(clazzfield.isAnnotationPresent(CompareVal.class)){
                    CompareVal compareValAnn = clazzfield.getAnnotation(CompareVal.class);
                    if(compareValAnn.value()){
                        Field field1 = null;
                        Field field2 = null;
                        try{
                            field1 = clazz1.getDeclaredField(clazzfield.getName());
                        }catch(Exception e){
                            try{
                                field1 = clazz1.getSuperclass().getDeclaredField(clazzfield.getName());
                            }catch(Exception e1){
                                continue;
                            }
                        }
                        ReflectionUtils.makeAccessible(field1);
                        Object object1 = field1.get(newObj);
                        try{
                            field2 = clazz2.getDeclaredField(clazzfield.getName());
                        }catch(Exception e){
                            try{
                                field2 = clazz2.getSuperclass().getDeclaredField(clazzfield.getName());
                            }catch(Exception e1){
                                continue;
                            }
                        }
                        ReflectionUtils.makeAccessible(field2);
                        Object object2 = field2.get(oldObj);
                        if(compareValAnn.zeroEqNull()){
                            if(object1 == null){
                                object1 = 0;
                            }
                            if(object2 == null){
                                object2 = 0 ;
                            }
                        }
                        if(object1 != null && StringUtils.isNotBlank(object1.toString()) && !JudgeUtils.compareValue(object1,object2)){
                            if(compareValAnn.doCrypt()){
                                object1 = CryptTypeHanlderHelper.doEncryptData(String.valueOf(object1), compareValAnn.cryptEnum());
                            }
                            reponseMap.put(clazzfield.getName(), object1);
                        }
                    }
                        
                }
            }
            return reponseMap;
        }catch(Exception e){
            return reponseMap;
        }
        
    }
    
    /**
     * 变更信息审核通过后设置变更数据到实体上
     * @param obj 设置数据的对象,空则根据class自动生成对象
     * @param newDataMap 需要设置到对象的数据
     * @throws Exception 
     */
    public static Object setModifyDataToEntity(Object obj,Map<String,Object> newDataMap,Class<?> clazz) {
        
            if(obj == null){
                try {
                    obj = clazz.newInstance();
                } catch (Exception e) {
                    logger.error("生成对象失败,{}",e);
                    return null;
                }
            }
            for(Entry<String, Object> dataInfo:newDataMap.entrySet()){
                try{
                    Object value = dataInfo.getValue();
                    Field field = null;
                    try{
                        field = clazz.getDeclaredField(dataInfo.getKey());
                    }catch(Exception e){
                        try{
                            field = clazz.getSuperclass().getDeclaredField(dataInfo.getKey());
                        }catch(Exception e1){
                            continue;
                        }
                    }
                    if(field.getType().toString().equals(Long.class.toString())){
                        if(dataInfo.getValue() instanceof Integer){
                            value = ((Integer)dataInfo.getValue()).longValue();
                        }else if(dataInfo.getValue() instanceof String){
                            value = Long.parseLong((String)dataInfo.getValue());
                        }
                    }else if(field.getType().toString().equals(Integer.class.toString())){
                        if(dataInfo.getValue() instanceof Long){
                            value = ((Long)dataInfo.getValue()).intValue();
                        }else if(dataInfo.getValue() instanceof String){
                            value = Integer.parseInt((String)dataInfo.getValue());
                        }
                    }else if(field.getType().toString().equals(Float.class.toString())){
                        if(dataInfo.getValue() instanceof Double){
                            value = ((Float)dataInfo.getValue()).floatValue();
                        }else if(dataInfo.getValue() instanceof String){
                            value = Float.parseFloat((String)dataInfo.getValue());
                        }
                    }else if(field.getType().toString().equals(Double.class.toString())){
                        if(dataInfo.getValue() instanceof Float){
                            value = ((Double)dataInfo.getValue()).floatValue();
                        }else if(dataInfo.getValue() instanceof String){
                            value = Double.parseDouble((String)dataInfo.getValue());
                        }else if(dataInfo.getValue() instanceof BigDecimal){
                            value = ((BigDecimal) dataInfo.getValue()).doubleValue();
                        }
                    }else if(field.getType().toString().equals(Date.class.toString())){
                        if(dataInfo.getValue() instanceof Long){
                            value = ((Long)dataInfo.getValue()).longValue();
                        }
                        else if(dataInfo.getValue() instanceof Integer){
                            value = ((Integer)dataInfo.getValue()).longValue();
                        }
                        else if(dataInfo.getValue() instanceof String){
                            value = NumberUtils.toLong((String)dataInfo.getValue());
                        }
                        Date date = new Date();
                        date.setTime((Long)value);
                        value = date;
                    }else if (field.getType().toString().equals(BigDecimal.class.toString())) {
                        if (dataInfo.getValue() instanceof Integer || dataInfo.getValue() instanceof Float
                                || dataInfo.getValue() instanceof Double || dataInfo.getValue() instanceof String) {
                            value = new BigDecimal(String.valueOf(dataInfo.getValue()));
                        }
                    }
                    try{
                        Field field1 = clazz.getDeclaredField(dataInfo.getKey());
                        CompareVal annotation = field1.getAnnotation(CompareVal.class);
                        if(annotation != null && annotation.doCrypt()){
                            CryptTypeHanlderHelper cryptTypeHanlderHelper = new  CryptTypeHanlderHelper();
                            value = cryptTypeHanlderHelper.getColumnValue(String.valueOf(value), annotation.cryptEnum());
                        }
                        Method declaredMethod = clazz.getDeclaredMethod("set"+dataInfo.getKey().substring(0, 1).toUpperCase(Locale.getDefault())+dataInfo.getKey().substring(1), field.getType());
                        ReflectionUtils.makeAccessible(declaredMethod);
//                        declaredMethod.setAccessible(true);
                        declaredMethod.invoke(obj, value);
                    }catch(Exception e){
                        try{
                            Field field1 = clazz.getSuperclass().getDeclaredField(dataInfo.getKey());
                            CompareVal annotation = field1.getAnnotation(CompareVal.class);
                            if(annotation != null && annotation.doCrypt()){
                                CryptTypeHanlderHelper cryptTypeHanlderHelper = new  CryptTypeHanlderHelper();
                                value = cryptTypeHanlderHelper.getColumnValue(String.valueOf(value), annotation.cryptEnum());
                            }
                            Method declaredMethod = clazz.getSuperclass().getDeclaredMethod("set"+dataInfo.getKey().substring(0, 1).toUpperCase(Locale.getDefault())+dataInfo.getKey().substring(1), field.getType());
                            ReflectionUtils.makeAccessible(declaredMethod);
//                            declaredMethod.setAccessible(true);
                            declaredMethod.invoke(obj, value);
                        }catch(Exception e1){
                            continue;
                        }
                        
                    }
                    
                }catch(Exception e){
                    logger.error("信息变更审核字段设置错误,fieldName={},fieldValue={}",dataInfo.getKey(),dataInfo.getValue(),e);
                }
            }
            return obj;        
    }
    public static Map<String,Object> oldDataToMapByName(String namePrefix,Map<String,Object> oldDataMap,Object obj,Set<String> fieldNames,Class<?> clazz){
        for(String fieldName:fieldNames){
            oldDataToMapFieldByName(namePrefix, oldDataMap, obj, fieldName, clazz);
        }
        return oldDataMap;
    }

    public static void oldDataToMapFieldByName(String namePrefix,Map<String,Object> oldDataMap,Object obj,String fieldName,Class<?> clazz){
        Field field = getField(fieldName, clazz);
        if(field == null){
            field = getParentField(fieldName, clazz);
        }
        if(field == null){
            return;
        }
        Object value = reSetValue(field, obj);
        oldDataMap.put(namePrefix + fieldName, value);
    }

    public static Field getField(String fieldName,Class<?> clazz){
        try {
            Field field = clazz.getDeclaredField(fieldName);
            return field;
        }catch(Exception e){
            return null;
        }
    }

    public static Field getParentField(String fieldName,Class<?> clazz){
        try {
            Field field = clazz.getSuperclass().getDeclaredField(fieldName);
            return field;
        }catch(Exception e){
            return null;
        }
    }

    public static Object reSetValue (Field field ,Object object){
        Object value = null;
        try {
            ReflectionUtils.makeAccessible(field);
            value = field.get(object);
        } catch (IllegalAccessException e) {
            logger.warn("信息变更审核字段设置错误,fieldName={}",field.getName(),e);
            return value;
        }
        if(field.isAnnotationPresent(CompareVal.class)){
            CompareVal annotation = field.getAnnotation(CompareVal.class);
            if(annotation.zeroEqNull() && value == null){
                value = 0;
            }
        }
        return value;
    }

    public static Map<String,Object> oldDataToMap(Map<String,Object> oldDataMap,Object obj,Set<String> fieldNames,Class<?> clazz){
        return oldDataToMapByName("", oldDataMap, obj, fieldNames, clazz);
    }
}

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@Inherited
public @interface CompareVal {

    /**
     * 是否比较
     * @return
     */
    boolean value() default true;
    /**
     * 所设值0与null意义相等
     * @return
     */
    boolean zeroEqNull() default false;
    /**
     * 是否加密敏感信息
     * @return
     */
    boolean doCrypt() default false;
    /**
     * 存储敏感信息加解密密钥的指定枚举类
     * @return
     */
    CryptEnum cryptEnum() default CryptEnum.ID_CARD;
}

日夜颠倒头发少 ,单纯好骗恋爱脑 ,会背九九乘法表 ,下雨只会往家跑 ,搭讪只会说你好 ---- 2050781802@qq.com

×

喜欢就点赞,疼爱就打赏

相册 说点什么 简历