<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
package ${pub.getPKGCodeName()}.util.helper;

import ${pub.getPKGCodeName()}.util.domain.EntityBase;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*;
import com.alibaba.fastjson.JSONObject;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

public class RuleUtils
{
	public static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

	public static Object getObj(Object object, String members)
	{
		if(object==null) {
			return null;
		}
		Object currentObj = object;
		String[] arrayOfString = members.split("\\.");
		int i = arrayOfString.length;
		for (int j = 0; j < i; ++j)
		{
			String methodName = arrayOfString[j];
			try
			{
				if(currentObj instanceof EntityBase)
				{
					currentObj=((EntityBase) currentObj).get(methodName);
					if (currentObj == null) {
						return null;
					}
				}
				else if(currentObj instanceof JSONObject)
				{
					currentObj=((JSONObject) currentObj).get(methodName);
					if (currentObj == null) {
						return null;
					}
				}
				else if(currentObj instanceof Map)
				{
					currentObj=((Map) currentObj).get(methodName);
					if (currentObj == null) {
						return null;
					}
				}
				else
				{
					Class clazz = currentObj.getClass();
					Method method = null;
					try
					{
						method=clazz.getMethod("get" , new Class[0]);
					}
					catch (Exception e2)
					{
						method=clazz.getDeclaredMethod("get" , new Class[0]);
					}

					currentObj = method.invoke(currentObj,  methodName);
					if (currentObj == null){
						return null;
					}
				}
			}
			catch (Exception e)
			{

				return null;
			}
		}
		return currentObj;
	}


	public static boolean test(Object finalObject,String option,Object exp)
	{
		if(option.equalsIgnoreCase("eq")||option.equalsIgnoreCase("equal")||option.equalsIgnoreCase("=")){
			return equal(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("noteq")||option.equalsIgnoreCase("notequal")||option.equalsIgnoreCase("<>")||option.equalsIgnoreCase("!=")){
			return !equal(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("gt")||option.equalsIgnoreCase(">")){
			return gt(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("lt")||option.equalsIgnoreCase("<")){
			return lt(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("gtandeq")||option.equalsIgnoreCase("ge")||option.equalsIgnoreCase(">=")){
			return ge(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("ltandeq")||option.equalsIgnoreCase("le")||option.equalsIgnoreCase("<=")){
			return le(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("null")||option.equalsIgnoreCase("isnull")){
			return isNull(finalObject);
		}
		else if (option.equalsIgnoreCase("notnull")||option.equalsIgnoreCase("isnotnull")){
			return isNotNull(finalObject);
		}
		else if (option.equalsIgnoreCase("like")||option.equalsIgnoreCase("matchor")){
			return matchor(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("leftlike")||option.equalsIgnoreCase("startswith")||option.equalsIgnoreCase("begin")){
			return leftmatchor(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("rightlike")||option.equalsIgnoreCase("endswith")||option.equalsIgnoreCase("end")){
			return rightmatchor(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("match")||option.equalsIgnoreCase("matchand")||option.equalsIgnoreCase("matches")){
			return matchand(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("in")){
			return in(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("notin")){
			return notin(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("NOTLIKE")){
			return notmatchor(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("LEFTNOTLIKE")){
			return !leftmatchor(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("RIGHTNOTLIKE")){
			return !rightmatchor(exp,finalObject);
		}
		else if (option.equalsIgnoreCase("NOTMATCHES")){
			return notmatchand(exp,finalObject);
		}
		else{
			return false;
		}
	}


	public static boolean equal(Object exp, Object object, String members)
	{
		return equal(exp,getObj(object, members));
	}
	public static boolean equal(Object exp, Object finalObject)
	{

		if(exp==null){
			return false;
		}
		if(finalObject ==null){
			return false;
		}

		if(exp instanceof String && ((String) exp).length()==10 && finalObject instanceof Timestamp)
		{
			return dateFormat.format(finalObject).equals(exp);
		}
		else if(exp instanceof Timestamp && finalObject instanceof Timestamp)
		{
			return dateFormat.format(finalObject).equals(dateFormat.format(exp));
		}
		else if(finalObject instanceof Timestamp)
		{
			Timestamp tm=DataObject.getTimestampValue(exp,null);
			if(tm == null) return false;
			return ObjectUtils.nullSafeEquals(tm,finalObject);
		}

		if(ObjectUtils.nullSafeEquals(exp,finalObject)){
			return true;
		}
		if(exp.toString().equalsIgnoreCase(finalObject.toString())){
			return true;
		}
		return false;
	}

	public static boolean gt(Object exp, Object object, String members)
	{
		return gt(exp,getObj(object, members));
	}
	public static boolean gt(Object exp, Object finalObject)
	{
		if(ObjectUtils.isEmpty(exp)){
            return false;
		}
        if(ObjectUtils.isEmpty(finalObject)){
            return false;
		}
        try
        {
            if(finalObject instanceof java.sql.Timestamp)
            {

				java.sql.Timestamp finalTime=(java.sql.Timestamp)finalObject;
				Timestamp tm=null;
				if (exp instanceof java.sql.Timestamp)
				{
					tm=(java.sql.Timestamp)exp;
				}
				else
				{
					tm=DataObject.getTimestampValue(exp,null);
					if(tm==null){
						return false;
					}
				}
                return finalTime.getTime()>tm.getTime();
            }
            else if (finalObject instanceof Integer)
            {
                return ((Integer) finalObject) > DataObject.getIntegerValue(exp,Integer.MAX_VALUE);
            }
            else if (finalObject instanceof Double)
            {
                return ((Double) finalObject) > DataObject.getDoubleValue(exp,Double.MAX_VALUE);
            }
            else if (finalObject instanceof Float)
            {
                return ((Float) finalObject) > DataObject.getFloatValue(exp,Float.MAX_VALUE);
            }
			else if (finalObject instanceof BigDecimal)
			{
				return ((BigDecimal) finalObject).compareTo(DataObject.getBigDecimalValue(exp,BigDecimal.valueOf(Double.MAX_VALUE)))>0;
			}
			else if (finalObject instanceof BigInteger)
			{
				return ((BigInteger) finalObject).compareTo(DataObject.getBigIntegerValue(exp,BigInteger.valueOf(Long.MAX_VALUE)))>0;
			}
			else if (finalObject instanceof Long)
			{
				return ((Long) finalObject) > DataObject.getLongValue(exp,Long.MAX_VALUE);
			}
            else if (finalObject instanceof String)
            {
                return finalObject.toString().compareToIgnoreCase(exp.toString())>0;
            }
            else{
                return false;
			}
        }
        catch(Exception ex)
        {
            return false;
        }
	}

	public static boolean lt(Object exp, Object object, String members)
	{
		return lt(exp,getObj(object, members));
	}
	public static boolean lt(Object exp, Object finalObject)
	{
		if(ObjectUtils.isEmpty(exp)){
            return false;
		}
        if(ObjectUtils.isEmpty(finalObject)){
            return false;
		}
        try
        {
            if(finalObject instanceof java.sql.Timestamp)
            {
                java.sql.Timestamp finalTime=(java.sql.Timestamp)finalObject;
				Timestamp tm=null;
				if((exp instanceof String)&& (exp.toString().trim().length()==10))
				{
					tm=new Timestamp(dateFormat.parse(exp.toString().trim()).getTime());
				}
				else if (exp instanceof java.sql.Timestamp)
				{
					tm=(java.sql.Timestamp)exp;
				}
				else
				{
					return false;
				}
                return finalTime.getTime()<tm.getTime();
            }
			else if (finalObject instanceof Integer)
			{
				return Integer.parseInt(finalObject.toString()) < Integer.parseInt(exp.toString());
			}
			else if (finalObject instanceof Double)
			{
				return Double.parseDouble(finalObject.toString()) < Double.parseDouble(exp.toString());
			}
			else if (finalObject instanceof Float)
			{
				return Float.parseFloat(finalObject.toString()) < Float.parseFloat(exp.toString());
			}
			else if (finalObject instanceof String)
			{
				return finalObject.toString().compareToIgnoreCase(exp.toString())<0;
			}
			else if (finalObject instanceof Long)
			{
				return Long.parseLong(finalObject.toString()) < Long.parseLong(exp.toString());
			}
            else
                return false;
        }
        catch(Exception ex)
        {
            return false;
        }
	}

	public static boolean ge(Object exp, Object object, String members)
	{
		return ge(exp,getObj(object, members));
	}
	public static boolean ge(Object exp, Object finalObject)
	{
		if(ObjectUtils.isEmpty(exp)){
			return false;
		}
		if(ObjectUtils.isEmpty(finalObject)){
			return false;
		}

		return (!(lt(exp, finalObject)));
	}

	public static boolean le(Object exp, Object object, String members)
	{
		return le(exp,getObj(object, members));
	}
	public static boolean le(Object exp, Object finalObject)
	{
		if(ObjectUtils.isEmpty(exp)){
			return false;
		}
		if(ObjectUtils.isEmpty(finalObject)){
			return false;
		}
		return (!(gt(exp, finalObject)));
	}

	public static boolean notin(Object expObj, Object object, String members)
	{
		return notin(expObj,getObj(object, members));
	}
	public static boolean notin(Object expObj, Object finalObject)
	{

		if (ObjectUtils.isEmpty(finalObject))
			return true;
		if (ObjectUtils.isEmpty(expObj))
			return false;
		String tvs=expObj.toString().trim();
		if(StringUtils.isEmpty(tvs)){
			return false;
		}
		return (!in(expObj,finalObject));
	}
	public static boolean in(Object expObj, Object object, String members)
	{
		return in(expObj,getObj(object, members));
	}
	public static boolean in(Object expObj, Object finalObject)
	{
        if (ObjectUtils.isEmpty(finalObject))
			return false;
		if (ObjectUtils.isEmpty(expObj))
			return false;
		String tvs=expObj.toString().trim();
		if(StringUtils.isEmpty(tvs)){
			return false;
		}

        if (finalObject instanceof Integer)
        {
            tvs="i:"+tvs;
        }
        else if (finalObject instanceof String)
        {
            tvs="s:"+tvs;
        }

		List acts = parseTvs(tvs);


		for (Iterator localIterator = acts.iterator(); localIterator.hasNext();)
		{
			Object act = localIterator.next();
			if (equal(act,finalObject))
				return true;
		}

		return false;
	}


	public static boolean isNotNull(Object object, String members)
	{
		return isNotNull(getObj(object, members));
	}
	public static boolean isNotNull(Object finalObject)
	{
		return !isNull(finalObject);
	}

	public static boolean isNull(Object object, String members)
	{
		return isNull(getObj(object, members));
	}
	public static boolean isNull(Object finalObject)
	{
		if(finalObject instanceof String){
			return StringUtils.isEmpty(finalObject.toString().trim());
		}
		return (ObjectUtils.isEmpty(finalObject));
	}


	public static boolean notmatchor(Object expObj, Object object, String members)
	{
		return notmatchor(expObj,getObj(object, members));
	}
	public static boolean notmatchor(Object expObj, Object obj)
	{
		if(ObjectUtils.isEmpty(obj)){
			return true;
		}
		if(ObjectUtils.isEmpty(expObj)){
			return false;
		}
		String exp=expObj.toString().trim();
		if(StringUtils.isEmpty(exp)){
			return false;
		}
		return (!matchor(expObj,obj));
	}

	public static boolean notmatchand(Object expObj, Object object, String members)
	{
		return notmatchand(expObj,getObj(object, members));
	}
	public static boolean notmatchand(Object expObj, Object finalObject)
	{
		if(ObjectUtils.isEmpty(finalObject)){
			return true;
		}
		if(ObjectUtils.isEmpty(expObj)){
			return false;
		}
		String exp=expObj.toString().trim();
		if(StringUtils.isEmpty(exp)){
			return false;
		}
		return (!matchand(expObj,finalObject));
	}

	public static boolean matchor(Object expObj,Object object,String members)
	{
		return matchor(expObj,getObj(object, members));
	}
	public static boolean matchor(Object expObj, Object obj)
	{
		if(ObjectUtils.isEmpty(obj)){
            return false;
		}
		if(ObjectUtils.isEmpty(expObj)){
			return false;
		}
		String exp=expObj.toString().trim();
		if(StringUtils.isEmpty(exp)){
			return false;
		}
        exp=exp.replace(";", ",");
        exp=exp.replace(";", ",");
        exp=exp.replace(",", ",");
		String[] arr=exp.split(",");
		boolean bRt=false;
		for(String strExp:arr)
		{
			bRt=(obj.toString()).matches("(.*)"+(strExp)+"(.*)");
			if(bRt)
				return true;
		}
		return bRt;
	}

	public static boolean leftmatchor(Object expObj, Object obj)
	{
		if(ObjectUtils.isEmpty(obj)){
			return false;
		}
		if(ObjectUtils.isEmpty(expObj)){
			return false;
		}
		String exp=expObj.toString().trim();
		if(StringUtils.isEmpty(exp)){
			return false;
		}
        exp=exp.replace(";", ",");
        exp=exp.replace(";", ",");
        exp=exp.replace(",", ",");
		String[] arr=exp.split(",");
		boolean bRt=false;
		for(String strExp:arr)
		{
			bRt=obj.toString().matches(strExp+"(.*)");
			if(bRt){
				return true;
			}
		}
		return bRt;
	}

	public static boolean rightmatchor(Object expObj, Object obj)
	{
		if(ObjectUtils.isEmpty(obj)){
			return false;
		}
		if(ObjectUtils.isEmpty(expObj)){
			return false;
		}
		String exp=expObj.toString().trim();
		if(StringUtils.isEmpty(exp)){
			return false;
		}
        exp=exp.replace(";", ",");
        exp=exp.replace(";", ",");
        exp=exp.replace(",", ",");
		String[] arr=exp.split(",");
		boolean bRt=false;
		for(String strExp:arr)
		{
			bRt=obj.toString().matches("(.*)"+strExp);
			if(bRt){
				return true;
			}
		}
		return bRt;
	}

	public static boolean matchand(Object expObj,Object object,String members)
	{
		return matchand(expObj,getObj(object, members));
	}
	public static boolean matchand(Object expObj,Object obj)
	{
		if(ObjectUtils.isEmpty(obj)){
			return false;
		}
		if(ObjectUtils.isEmpty(expObj)){
			return false;
		}
		String exp=expObj.toString().trim();
		if(StringUtils.isEmpty(exp)){
			return false;
		}
		exp=exp.replace(";", ",");
        exp=exp.replace(";", ",");
        exp=exp.replace(",", ",");
		String[] arr=exp.split(",");
		String objstr=obj.toString();
		boolean bRt=true;
		for(String strExp:arr)
		{
			if(strExp.trim().length()==0){
				continue;
			}
			bRt=(obj.toString()).matches("(.*)"+(strExp)+"(.*)");
			if(!bRt){
				return false;
			}
		}
		return bRt;
	}


	private static List<Object> parseTvs(String tvs)
	{
        tvs=tvs.replace(";", ",");
        tvs=tvs.replace(";", ",");
        tvs=tvs.replace(",", ",");
		String[] arrayOfString1;
		int j;
		int k;
        String value;
        String type = "s";
        String values = "";

		String[] tv = tvs.split(":");
        if(tv.length>1)
        {
            type = tv[0];
		    values = tv[1];
        }
        else
        {
            values=tvs;
        }

		List acts = new ArrayList();
		String str1 = type;
		int i = -1;
		switch (str1.hashCode())
		{
		case 105:
			if (str1.equals("i")){
				i = 0;
			}
			break;
		case 115:
			if (str1.equals("s")){
				i = 1;
			}
		}
		switch (i)
		{
		case 0:
			arrayOfString1 = values.split(",");
			j = arrayOfString1.length;
			for (k = 0; k < j; ++k)
			{
				value = arrayOfString1[k];
				acts.add(new Integer(value.trim()));
			}
			break;
		case 1:
			arrayOfString1 = values.split(",");
			j = arrayOfString1.length;
			for (k = 0; k < j; ++k)
			{
				value = arrayOfString1[k];
				acts.add(value.trim());
			}
		}
		return acts;
	}


	public static boolean inc2s(String tvs, Object finalObject)
	{
		if (ObjectUtils.isEmpty(finalObject))
			return false;

		if(StringUtils.isEmpty(tvs))
			return false;

		if (finalObject instanceof String)
		{
			tvs="s:"+tvs;
		}
		else
			return false;

		List acts = parseTvs(tvs);


		for (Iterator localIterator = acts.iterator(); localIterator.hasNext();)
		{
			Object act = localIterator.next();
			if (equal(c2s(act.toString()),c2s(finalObject.toString())))
				return true;
		}

		return false;
	}

	public static String c2s(String str)
	{
		if(str==null)
			return null;
		if(str.length()<300)
		{
			str=str.trim();//1234567890()【】〔2018〕
			str=str.replace("1","1").replace("2","2").replace("3","3").replace("4","4").
					replace("5","5").replace("6","6").replace("7","7")
					.replace("8","8").replace("9","9").replace("0","0")
					.replace("(","〔").replace(")","〕")
					.replace("(","〔").replace(")","〕")
					.replace("【","〔").replace("】","〕")
					.replace("[","〔").replace("]","〕");
		}
		return str;
	}

	public static boolean notinc2s(String tvs, Object finalObject)
	{
		return (!inc2s(tvs,finalObject));
	}
}