yangyj 3 år sedan
förälder
incheckning
c41e4748f8

+ 3631 - 0
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -0,0 +1,3631 @@
+package com.mixsmart.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.jfireel.expression.Expression;
+import com.mixsmart.security.SecurityUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.http.Consts;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.message.BasicNameValuePair;
+import org.springblade.core.tool.utils.CollectionUtil;
+import org.springblade.core.tool.utils.Func;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import static java.math.BigDecimal.ROUND_CEILING;
+import static java.math.BigDecimal.ROUND_HALF_UP;
+
+
+public class CustomFunction {
+
+	//定义存储天气数据
+	public static final  Map<String,Object> weatherMap=new HashMap<>();
+	
+	/**
+	 * 类调用地址前缀
+	 */
+	public static final String CLASS_CALL = "T(com.mixsmart.utils.CustomFunction).";
+	public static final String CONCAT = "@";
+	/**
+	 * 获取区间内随机值
+	 * @param min
+	 * @param max
+	 * @param scale 返回值保留的小时位数 (传参为浮点型时使用)
+	 * @return
+	 * @author:rock
+	 * @time:2020年2月20日 下午4:14:00
+	 */
+	public static Object getRangeRandom(Object min, Object max, Object scale) {
+		int sc = objectChangeInt(scale);
+		if(min != null && max != null) {
+			String i = min.toString();
+			String x = max.toString();
+			if(StringUtils.isNumber(i) && StringUtils.isNumber(x)) {
+				Random random = new Random();
+				if(sc == 0) {
+					//整数处理
+					int mi = Integer.parseInt(i);
+					int ma = Integer.parseInt(x);
+					return random.nextInt(ma - mi + 1) + mi;
+				} else if(sc > 0) {
+					//处理浮点数
+					double mi = Double.parseDouble(i);
+					double ma = Double.parseDouble(x);
+					double result = mi + (ma - mi) * random.nextDouble();
+					BigDecimal b = new BigDecimal(result);
+					return b.setScale(sc, ROUND_HALF_UP);
+				}
+			}
+		}
+		return null;
+	}
+	
+	/**
+	 * 取绝对值
+	 * @param value
+	 * @param scaleObj
+	 * @return
+	 * @author:rock
+	 * @time:2020年2月20日 下午5:03:39
+	 */
+	public static Object abs(Object value, Object scaleObj) {
+		if(StringUtils.isNumber(value)) {
+			int scale = objectChangeInt(scaleObj);
+			String valueStr = value.toString();
+			if(scale <= 0) {
+				//整型处理
+				int v = 0;
+				if(valueStr.contains(".")) {
+					v = Integer.parseInt(valueStr.substring(0, valueStr.indexOf(".")));
+				} else {
+					v = Integer.parseInt(valueStr);
+				}
+				return Math.abs(v);
+			} else if(scale > 0) {
+				double d = Math.abs(Double.parseDouble(valueStr));
+				BigDecimal big = new BigDecimal(d);
+				return big.setScale(scale, ROUND_HALF_UP);
+			}
+		}
+		return null;
+	}
+	
+	/**
+	 * 根据指定范围value获取随机数数组
+	 * @param hz 频率
+	 * @param startValue 初始值
+	 * @param rangeValue 范围值
+	 * @param scaleObj 返回列表的数值小数点位数,为0时是整数
+	 * @return
+	 * @author:rock
+	 * @time:2020年4月11日 下午4:53:34
+	 */
+	public static List<Object> getRangeRandomList(Object hz, Object startValue, Object rangeValue, Object scaleObj) {
+		//返回结果列表
+		List<Object> result = new ArrayList<>();
+
+		if(StringUtils.isEmpty(rangeValue) ) {
+			return result;
+		}
+		//返回列表大小
+		int size = objectChangeInt(hz);
+		//小数位数
+		int scale = objectChangeInt(scaleObj);
+
+
+//		if(StringUtils.isEmpty(startValue)){
+//			return result;
+//		}
+
+		//
+		boolean isExistFlag1 = false;
+		boolean isExistFlag2 = false;
+		BigDecimal design = new BigDecimal(0);
+		if(StringUtils.isNumber(startValue)) {
+			design = new BigDecimal(startValue.toString());
+			randomList(result, startValue, rangeValue, design, size, scale);
+		} else if(StringUtils.isNotEmpty(startValue)) {
+			String sv = startValue.toString();
+			int flagIndex = sv.indexOf("1:");
+			if(flagIndex != -1) {
+				isExistFlag1 = true;
+				design = new BigDecimal(sv.substring(flagIndex+2, sv.length()));
+				randomList(result, startValue, rangeValue, design, size, scale);
+			} else if((flagIndex = sv.indexOf("1:")) != -1) {
+				isExistFlag1 = true;
+				design = new BigDecimal(sv.substring(flagIndex+2, sv.length()));
+				randomList(result, startValue, rangeValue, design, size, scale);
+			} else if((flagIndex = sv.indexOf("/")) != -1) {
+				String[] designs = sv.split("/");
+				for (int i = 0; i < designs.length; i++) {
+					String rs = designs[i].trim();
+					if(StringUtils.isNumber(rs)) {
+						List<Object> tmpResult = new ArrayList<>();
+						randomList(tmpResult, startValue, rangeValue, new BigDecimal(rs), size, scale);
+						//分组内混乱
+						Collections.shuffle(tmpResult);
+						result.addAll(tmpResult);
+					}
+				}
+			} else if((flagIndex = sv.indexOf("*")) != -1) {
+				String[] designs = sv.split("\\*");
+				for (int i = 0; i < designs.length; i++) {
+					String rs = designs[i].trim();
+					if(StringUtils.isNumber(rs)) {
+						List<Object> tmpResult = new ArrayList<>();
+
+						randomList(tmpResult, startValue, rangeValue, new BigDecimal(rs), size, scale);
+
+						//分组内混乱
+						Collections.shuffle(tmpResult);
+						if (i == 0) {
+							result.addAll(tmpResult);
+						}else {
+							for (int j=0;j < result.size();j++) {
+								Object tmp = result.get(j) + "×" +  tmpResult.get(j);
+								result.set(j,tmp);
+							}
+						}
+
+					}
+				}
+			}
+			else if((flagIndex = sv.indexOf("×")) != -1 ) {
+				if(rangeValue.toString().contains("×")) {
+					String[] ranges = rangeValue.toString().split("×");
+					String[] designs = sv.split("×");
+					if (ranges.length == designs.length) {
+						for (int i = 0; i < designs.length; i++) {
+							String rs = designs[i].trim();
+							if (StringUtils.isNumber(rs)) {
+								isExistFlag2 = true;
+								randomList(result, startValue, ranges[i], new BigDecimal(rs), size, scale);
+							}
+						}
+					}
+				}else{
+					String[] designs = sv.split("×");
+					for (int i = 0; i < designs.length; i++) {
+						String rs = designs[i].trim();
+						if (StringUtils.isNumber(rs)) {
+							isExistFlag2 = true;
+							randomList(result, startValue, rangeValue, new BigDecimal(rs), size, scale);
+						}
+					}
+				}
+			}
+		} else {
+			//if(rangeValue.toString().contains("<")) {
+				randomList(result, startValue, rangeValue, design, size, scale);
+			//}
+		}
+		
+		if(!result.isEmpty()) {
+			if(isExistFlag1) {
+				List<Object> list = new ArrayList<>();
+				for (Object o : result) {
+					list.add("1:" + o);
+				}
+				result = list;
+			}
+			if(isExistFlag2 && result.size() == 2*size) {
+				List<Object> list = new ArrayList<>();
+				for (int i = 0; i < size; i++) {
+					list.add(result.get(i) + "×" + result.get(i+size));
+				}
+				result = list;
+			}
+		}
+		return result;
+	}
+
+     /*FUNC.groupByStake(桩号,宽幅,数据,模式)*/
+	public  static Object  groupByStake(Object stake,Object line,Object data ,Object mode){
+		if(stake instanceof List){
+			List<Object> _stake =(List<Object>) removeByReg(stake,"ZD\\d*");
+			List<Object> datas = (List<Object>) data;
+			List<Object> result = new ArrayList<>();
+            int max =(int) Math.ceil((double)datas.size()/Double.parseDouble(line.toString()));
+            for(int i=0;i<max&&i<_stake.size();i++){
+            	String s = handleNull(_stake.get(i));
+            	if(StringUtils.isEquals(1,mode)){
+					if(Pattern.matches(".+V$",s)){
+						int ln=StringUtils.handleObj2Integer(line);
+						result.addAll((List<Object>)subList(datas,i*ln+1,(i+1)*ln));
+					}
+				}else{
+					if(!Pattern.matches(".+V$",s)){
+						int ln=StringUtils.handleObj2Integer(line);
+						result.addAll((List<Object>)subList(datas,i*ln+1,(i+1)*ln));
+					}
+				}
+
+			}
+            return result;
+		}
+		return null;
+	}
+
+	/**
+	 * 
+	 * @param result
+	 * @param
+	 * @param
+	 * @param size
+	 * @param scale
+	 * @author:rock
+	 * @time:2020年5月20日 下午2:05:19
+	 */
+	public static void randomList(List<Object> result, Object startValue, Object rangeValue, BigDecimal design, int size, int scale){
+		BigDecimal min = new BigDecimal(0);
+		BigDecimal max = new BigDecimal(0);
+		String[] values = null;
+		String range = rangeValue.toString();
+		if(range.contains(",")) {
+			values = range.split(",");
+			boolean b = false;
+			boolean c = false;
+			if(StringUtils.isNotEmpty(startValue)){
+				int i = 0;
+				for (String value:values){
+
+					if(value.equals(startValue.toString()))
+					{
+						if (i==0) {
+							b = true;
+						}else {
+							c = true;
+						}
+						break;
+					}
+					i++;
+//					if(value.equals(startValue.toString())){
+//						b = true;
+//						break;
+//					}else {
+//						b = false;
+//						c = true;
+//					}
+				}
+			}
+			if(range.contains("%")) {
+				BigDecimal value = new BigDecimal(0);
+				int index = values[0].indexOf("%");
+				if(index != -1) {
+					value = new BigDecimal(values[0].substring(0, index)).divide(new BigDecimal(100));
+					min = design.add(design.multiply(value));
+				} else {
+					value = new BigDecimal(values[0]);
+					min = design.add(design.multiply(value));
+				}
+				index = values[1].indexOf("%");
+				if(index != -1) {
+					value = new BigDecimal(values[1].substring(0, index)).divide(new BigDecimal(100));
+					max = design.add(design.multiply(value));
+				} else {
+					value = new BigDecimal(values[1]);
+					max = design.add(value);
+				}
+			} else if (b){
+				min = new BigDecimal(values[0]);
+				max = new BigDecimal(values[1]);
+			}else if (c){
+				min = design.add(new BigDecimal(values[0]));
+				max = new BigDecimal(values[1]);
+			}else{
+				min = design.add(new BigDecimal(values[0]));
+				max = design.add(new BigDecimal(values[1]));
+			}
+		} else if(range.contains("<")){
+			range = range.replace("<", "");
+			if(StringUtils.isNumber(range)) {
+				if(StringUtils.isNumber(startValue)) {
+					min = design;
+					max = design.add(new BigDecimal(range));
+				} else {
+					max = new BigDecimal(range);
+				}
+			}
+		} else if(range.contains("≤")){
+			range = range.replace("≤", "");
+			if(StringUtils.isNumber(range)) {
+				if(StringUtils.isNumber(startValue)) {
+					min = design;
+					if(scale == 0) {
+						max = design.add(new BigDecimal(range)).add(new BigDecimal(1));
+					} else if(scale > 0){
+						int temp = scale;
+						BigDecimal b = new BigDecimal(1);
+						while (temp > 0) {
+							b = b.divide(new BigDecimal(10), scale, ROUND_HALF_UP);
+							temp--;
+						}
+						max = design.add(new BigDecimal(range)).add(b);
+					}
+				} else {
+					if(scale == 0) {
+						max = new BigDecimal(range).add(new BigDecimal(1));
+					} else if(scale > 0){
+						int temp = scale;
+						BigDecimal b = new BigDecimal(1);
+						while (temp > 0) {
+							b = b.divide(new BigDecimal(10), scale, ROUND_HALF_UP);
+							temp--;
+						}
+						max = new BigDecimal(range).add(b);
+					}
+				}
+			}
+		}
+		else if(range.contains("(")){
+			range = range.replace("(", "");
+			if(StringUtils.isNumber(range)) {
+				min = design;
+				max = design.add(new BigDecimal(range));
+				if (scale > 0) {
+					double sup = 1d/(10*scale);
+					BigDecimal supDec = new BigDecimal(sup);
+
+					if(max.subtract(supDec).compareTo(min.add(supDec)) > 0) {
+						double mi = min.doubleValue() + sup;
+						min = new BigDecimal(mi);
+					}
+				}
+			}
+		}else if(range.contains("%")){
+             min=new BigDecimal(0);
+             range=range.replaceAll("%","");
+             max=design.multiply(new BigDecimal(range)).divide(new BigDecimal(100),scale,ROUND_HALF_UP);
+		}
+		else {
+			if(StringUtils.isNumber(range)) {
+
+				min = design;
+				max = design.add(new BigDecimal(range));
+			}
+		}
+		//范围值大小判断
+		if(min.compareTo(max) > 0) {
+			BigDecimal temp = min;
+			min = max;
+			max = temp;
+		}
+		if(max != null && min != null) {
+			Random random = new Random();
+			if(scale == 0) {
+				//整数处理
+				if(max.compareTo(min.add(new BigDecimal(1))) > 0) {
+
+					if(min.toString().contains(".") || max.toString().contains(".")){
+						//包含小数点时当作小数处理(09-22,2250号单)
+						double mi = min.doubleValue();
+						double ma = max.doubleValue();
+						BigDecimal b = new BigDecimal(0);
+						for (int i = 0; i < size; i++) {
+							b = new BigDecimal(mi + (ma - mi) * random.nextDouble());
+							result.add(b.setScale(scale, ROUND_HALF_UP));
+						}
+
+					} else {
+						//最小值+1是保证生成的随机数不包含临界值
+						int mi = min.intValue() + 1;
+						int ma = max.intValue();
+						int medianvalue = ma - mi;
+						if(medianvalue == 1){
+							ma = ma + 1;
+						}
+						medianvalue = ma - mi;
+						if(medianvalue != 0) {
+							for (int i = 0; i < size; i++) {
+								result.add(random.nextInt(ma - mi) + mi);
+							}
+						}
+					}
+				}else if (max.compareTo(min)==0) {
+					//偏差值为0的处理
+					for (int i = 0; i < size; i++) {
+						result.add(max);
+					}
+				}else if (max.compareTo(min.add(new BigDecimal(1))) == 0    //偏差值就是1,无设计值随机
+						&& max.compareTo(new BigDecimal(1)) == 0) {
+					//偏差值为0的处理
+					for (int i = 0; i < size; i++) {
+						result.add(max);
+					}
+				}
+			} else if(scale > 0){
+				//浮动数处理
+				//double sup = 1d/(10*scale);
+				//BigDecimal supDec = new BigDecimal(sup);
+				//if(max.subtract(supDec).compareTo(min.add(supDec)) > 0) {
+					//临界值问题处理
+					//double mi = min.doubleValue() + sup;
+					//double ma = max.doubleValue() - sup;
+				if(max.compareTo(min) > 0) {
+					double mi = min.doubleValue();
+					double ma = max.doubleValue();
+					BigDecimal b = new BigDecimal(0);
+					for (int i = 0; i < size; i++) {
+						b = new BigDecimal(mi + (ma - mi) * random.nextDouble());
+						result.add(b.setScale(scale, ROUND_HALF_UP));
+					}
+				}else if (max.compareTo(min)==0) {
+					//偏差值为0的处理
+					for (int i = 0; i < size; i++) {
+						result.add(max.setScale(scale, ROUND_HALF_UP));
+					}
+				}
+			}
+		}
+	}
+	
+	/**
+	 * 获取单个随机值
+	 * @param startValue 初始值
+	 * @param rangeValue 偏差范围
+	 * @param scaleObj 保留小数位数
+	 * @return
+	 * @author:rock
+	 * @time:2020年5月18日 下午2:02:57
+	 */
+	public static Object getRangeRandomValue(Object startValue, Object rangeValue, Object scaleObj) {
+		List<Object> list = getRangeRandomList(1, startValue, rangeValue, scaleObj);
+		if(list != null && !list.isEmpty()) {
+			return list.get(0);
+		}
+		return null;
+	}
+	
+	/**
+	 * Object转换int,默认返回0
+	 * @param value
+	 * @return
+	 * @author:rock
+	 * @time:2020年5月15日 下午6:50:06
+	 */
+	public static int objectChangeInt(Object value) {
+		if(StringUtils.isNumber(value)) {
+			String s = value.toString();
+			if(s.contains(".")) {
+				return Integer.parseInt(s.substring(0, s.indexOf(".")));
+			} else {
+				return Integer.parseInt(s);
+			}
+		}
+		return 0;
+	}
+	
+	/**
+	 * 根据桩号类型生成桩号
+	 * @param
+	 * @return
+	 * @author:rock
+	 * @time:2020年4月30日 下午6:09:26
+	 */
+	public static String createStationOld(Object stationType) {
+		if(StringUtils.isEmpty(stationType)) {
+			return null;
+		}
+		String value = "K";
+		String st = String.valueOf(stationType);
+		if(st.contains(value)) {
+			return st;
+		}
+		int len = st.length();
+		if(st.contains(".")) {
+			len = st.indexOf(".");
+		}
+		if(len > 3) {
+			value = value + st.substring(0, len - 3) + "+" + st.substring(len - 3);
+		} else if(len == 3) {
+			value = value + "0+" + st;
+		} else if(len < 3){
+			if(len == 1) {
+				value = value + "0+00" + st;
+			} else if(len == 2){
+				value = value + "0+0" + st;
+			}
+		}
+		return value;
+	}
+
+	/**
+	 * @Description  根据桩号类型生成桩号
+	 * @Param [stationType]
+	 * @return java.lang.String
+	 * @Author yangyj
+	 * @Date 2021.01.20 17:43
+	 **/
+	public static String createStation(Object stationType) {
+		if(StringUtils.isNotEmpty(stationType)) {
+
+		    Matcher m =  matcher("[~|-]",handleNull(stationType));
+		    if(m.find()){
+		    	StringBuilder sb = new StringBuilder();
+		    	String  splitchar = m.group(0);
+                String[] arr = stationType.toString().split(splitchar);
+                for(String str:arr){
+                	sb.append(singleStation(str)+splitchar);
+				}
+                if(sb.length()>0){
+                	return sb.deleteCharAt(sb.length()-1).toString();
+				}
+			}else {
+		    	return  singleStation(stationType);
+			}
+		}
+	    return "";
+	}
+
+	public static Matcher matcher(String regex, String value) {
+		Pattern pattern = Pattern.compile(regex);
+		return pattern.matcher(value);
+	}
+
+	/**
+	 * @Description 记录表5输入桩号代码解析,2G1#1+100>>2G1K0+100
+	 * @Param [stake]
+	 * @return java.lang.String[] result[0]:返回桩号前缀;result[1]:实际显示前缀;result[2]:里程数
+	 * @Author yangyj
+	 * @Date 2021.04.09 11:49
+	 **/
+	public static String[] decodeStake(Object stake){
+		String[] result = new String[]{"","",""};
+		if(StringUtils.isNotEmpty(stake)){
+			String stakeStr = StringUtils.repaceBlank(stake.toString().toUpperCase());
+			Matcher m ;
+			if(stake.toString().contains("+")){
+				m = matcher("(([A-Z0-9]*)(#\\d*)?)\\+([\\d||\\.]*)", stakeStr);
+				if(m.find()){
+					String partNoD = m.group(1);
+					String partNoV = m.group(2);
+					String kilometer = m.group(4);
+					result[0]=partNoD;
+					result[1]=partNoV;
+					result[2]=kilometer;
+				}
+			}else{
+				m =matcher("([A-Z]*)([\\d||\\.]*)", stakeStr);
+				if(m.find()){
+					String partNo = m.group(1);
+					String kilometer = m.group(2);
+					result[0]=partNo;
+					result[1]=partNo;
+					result[2]=kilometer;
+				}
+			}
+
+		}
+		return result;
+	}
+	public static String[] standardStake(Object stake){
+		String[] result = new String[]{"",""};
+		if(StringUtils.isNotEmpty(stake)){
+			String stakeStr = StringUtils.repaceBlank(stake.toString().toUpperCase());
+			Matcher m  = matcher("([A-Z0-9]{0,3})K(\\d{1,3})\\+([\\d||\\.]*)", stakeStr);
+			Matcher m2  = matcher("([A-Z]{0,3})([\\d||\\.]+)", stakeStr);
+			if(m.find()){
+				String partNo = m.group(1);
+				double km = Double.parseDouble(m.group(2));
+				double meter = Double.parseDouble(m.group(3));
+				result[0]=partNo;
+				int scale=getScale(meter);
+				result[1]=StringUtils.number2String(km*1000+meter,scale);
+			}else if(m2.find()){
+				result[0]=m2.group(1);
+				result[1]=m2.group(2);
+			}
+
+		}
+		return result;
+	}
+	/**
+	 * @Description 获取最大小数位
+	 * @Param [number]
+	 * @return int
+	 * @Author yangyj
+	 * @Date 2021.12.23 15:08
+	 **/
+	public  static Integer getScale(Object ...number){
+		int max=0;
+		for(Object n:number){
+			if(StringUtils.isNotEmpty(n)){
+				String[] sa = n.toString().split(",");
+				for(String s:sa){
+					Matcher m = matcher("(\\d)+.(\\d)+",s);
+					if(m.find()){
+						max=Math.max(new StringBuilder(m.group()).reverse().toString().indexOf("."),max);
+					}
+				}
+			}
+		}
+		return max;
+	}
+	public static String singleStation(Object station) {
+		if(StringUtils.isNotEmpty(station)) {
+			Object zhdata =station;
+			String zhdatastr = zhdata.toString().toUpperCase();
+			if(zhdatastr.contains("+")&&zhdatastr.contains("K")){
+				return zhdatastr;
+			}
+			String[] stake = decodeStake(zhdatastr);
+			String partNo =stake[1];
+			String kilometer = stake[2];
+			if(StringUtils.isNotEmpty(kilometer)){
+				partNo= handleNull(partNo);
+				int ks = (int) Math.floor(Double.parseDouble(kilometer)/1000);
+				double ke =new BigDecimal(kilometer).subtract(new BigDecimal(String.valueOf(ks*1000))).doubleValue();
+				String temp = ""+ke;
+				if((int)Double.parseDouble(temp)==Double.parseDouble(temp)){
+					temp = String.valueOf((int)Double.parseDouble(temp));
+				}
+				String sf="000";
+				if(temp.length()<3){
+					temp = sf.substring(0,3-temp.length())+temp;
+				}
+				if((temp.contains(".")&&temp.indexOf(".")<=2)){
+					temp = sf.substring(0,3-temp.indexOf("."))+temp;
+				}
+				return  partNo+"K"+ks+"+"+temp;
+			}
+		}
+		return "";
+	}
+	
+
+	public static Object calculate(Object a, Object b, Object scaleObj, Integer type) {
+		boolean nullFlag = false;
+		if(type == null) {
+			return null;
+		}
+		if (StringUtils.isEmpty(a)&&StringUtils.isEmpty(b)){
+			return null;
+		}
+		if(StringUtils.isEmpty(a) && type == 7){
+			nullFlag = true;
+			a=0;
+		}
+		if(StringUtils.isEmpty(b) && type == 7){
+			nullFlag = true;
+			b=0;
+		}
+		if(StringUtils.isNotEmpty(a) && StringUtils.isNotEmpty(b)) {
+			try {
+				int scale = objectChangeInt(scaleObj);
+				String aStr = a.toString();
+				String bStr = b.toString();
+				double ad = Double.parseDouble(aStr);
+				double bd=0;
+				if (type == 6) {
+					//判断设计值是否包含"/"
+					if (bStr.contains("/")){
+						bd = bStr.split("/").length;
+						return  (int) (ad*bd);
+					}else{
+						return  (int) ad;
+					}
+				}
+				bd = Double.parseDouble(bStr);
+				double result = 0;
+				if(type == 1) {
+					result = ad+bd;
+				} else if(type == 2) {
+					result = ad-bd;
+				} else if(type == 3) {
+					result = ad*bd;
+				} else if(type == 4) {
+					result = ad/bd;
+				} else if(type == 5) {
+					result = ad%bd;
+				} else if(type == 7&&ad*bd!=0&&!nullFlag){
+					return  (int) Math.ceil(ad*bd);
+				}else {
+					return null;
+				}
+				BigDecimal big = new BigDecimal(result);
+				return big.setScale(scale, ROUND_HALF_UP);
+			} catch (NumberFormatException e) {
+				e.printStackTrace();
+			}
+		}
+		return null;
+	}
+
+
+
+	/**
+	 * 求列表内数据的平均值
+	 * @param scaleObj 平均值保留小数位数,0时为整数
+	 * @param list
+	 * @return
+	 * @author:rock
+	 * @time:2020年5月8日 下午4:20:10
+	 */
+	public static Object avg(Integer scaleObj, List<Object> list) {
+		Object result = null;
+		if(ListUtils.isNotEmpty(list)){
+			int size = list.size();
+			if(list != null && size > 0) {
+				int scale = objectChangeInt(scaleObj);
+				double sum = 0;
+				for (Object data : list) {
+					if(StringUtils.isNumber(data)) {
+						sum += Double.parseDouble(data.toString());
+					} else {
+						//非数字类型则忽略,且总数大小要减一
+						size--;
+					}
+				}
+				if(scale == 0) {
+					//整数处理
+					result = (int)(sum / size);
+				} else if(scale > 0) {
+					result = new BigDecimal(sum).divide(new BigDecimal(size), scale, ROUND_HALF_UP);
+				}
+			}
+		}
+		return result;
+	}
+	
+
+	
+	/**
+	 * 列表求和
+	 * @param scaleObj
+	 * @param list
+	 * @return
+	 * @author:rock
+	 * @time:2020年5月18日 下午2:26:26
+	 */
+	public static Object sum(Object scaleObj, List<Object> list) {
+		Object result = null;
+		if(list != null && list.size() > 0) {
+			int scale = objectChangeInt(scaleObj);
+			double sum = 0;
+			for (Object data : list) {
+				if(StringUtils.isNumber(data)) {
+					sum += Double.parseDouble(data.toString());
+				}
+			}
+			if(scale == 0) {
+				//整数
+				result = (int)sum;
+			} else if(scale > 0) {
+				//浮点数
+				BigDecimal big = new BigDecimal(sum);
+				result = big.setScale(scale, ROUND_HALF_UP);
+			}
+		}
+		return result;
+	}
+	
+	/**
+	 * 桩长实际值=桩长设计值+范围值(0~0.1m)的随机数
+	 * @param designValue
+	 * @param range
+	 * @param scale
+	 * @return
+	 * @author:rock
+	 * @time:2020年5月19日 下午3:57:26
+	 */
+	public static Object pileLengthValue(Object designValue, Object range, Object scale) {
+		if(StringUtils.isNumber(designValue) && StringUtils.isNotEmpty(range)) {
+			int sc = objectChangeInt(scale);
+			Object randomValue = getRangeRandomValue(0, range, sc);
+			if(StringUtils.isNumber(randomValue)) {
+				BigDecimal big = new BigDecimal(designValue.toString()).add(new BigDecimal(randomValue.toString()));
+				designValue = big.setScale(sc, ROUND_HALF_UP);
+			}
+		}
+		return designValue;
+	}
+	
+	/**
+	 * 判断value是否存在range范围内
+	 * @param value
+	 * @param rangeValue 格式 “1,10” ;即最小值和最大值加用逗号隔开 
+	 * @return
+	 * @author:rock
+	 * @time:2020年5月28日 下午4:40:53
+	 */
+	public static boolean existInRange(Object value, Object rangeValue) {
+		if(StringUtils.isNumber(value) && rangeValue != null) {
+			BigDecimal min = new BigDecimal(0);
+			BigDecimal max = new BigDecimal(0);
+			String[] values = null;
+			String range = rangeValue.toString();
+			if(range.contains(",")) {
+				values = range.split(",");
+				if(StringUtils.isNumber(values[0]) && StringUtils.isNumber(values[1])) {
+					min = new BigDecimal(values[0]);
+					max = new BigDecimal(values[1]);
+				}
+			} else if(range.contains("<")){
+				range = range.replace("<", "");
+				if(StringUtils.isNumber(range)) {
+					max = new BigDecimal(range);
+				}
+			} else if(range.contains("≤")){
+				range = range.replace("≤", "");
+				if(StringUtils.isNumber(range)) {
+					max = new BigDecimal(range);
+				}
+			} else {
+				if(StringUtils.isNumber(range)) {
+					max = new BigDecimal(range);
+				}
+			}
+			//范围值大小判断
+			if(min.compareTo(max) > 0) {
+				BigDecimal temp = min;
+				min = max;
+				max = temp;
+			}
+			BigDecimal v = new BigDecimal(value.toString());
+			if(v.compareTo(min) > 0 && v.compareTo(max) < 0) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * 判断value是否存在range范围内
+	 * @param value
+	 * @param rangeValue 格式 “1,10” ;即最小值和最大值加用逗号隔开
+	 * @return
+	 * @author:rock
+	 * @time:2020年5月28日 下午4:40:53
+	 */
+	public static boolean existInRangeAbs(Object value, Object rangeValue) {
+		if(StringUtils.isNumber(value) && rangeValue != null) {
+			BigDecimal min = new BigDecimal(0);
+			BigDecimal max = new BigDecimal(0);
+			String[] values = null;
+			String range = rangeValue.toString();
+			if(range.contains(",")) {
+				values = range.split(",");
+				if(StringUtils.isNumber(values[0]) && StringUtils.isNumber(values[1])) {
+					min = new BigDecimal(values[0]);
+					max = new BigDecimal(values[1]);
+				}
+			} else if(range.contains("<")){
+				range = range.replace("<", "");
+				if(StringUtils.isNumber(range)) {
+					max = new BigDecimal(range);
+				}
+			} else if(range.contains("≤")){
+				range = range.replace("≤", "");
+				if(StringUtils.isNumber(range)) {
+					max = new BigDecimal(range);
+				}
+			} else {
+				if(StringUtils.isNumber(range)) {
+					max = new BigDecimal(range);
+				}
+			}
+			//范围值大小判断
+			if(min.compareTo(max) > 0) {
+				BigDecimal temp = min;
+				min = max;
+				max = temp;
+			}
+			BigDecimal v = new BigDecimal(value.toString());
+			v =v.abs();
+
+			if(v.compareTo(min) > 0 && v.compareTo(max) < 0) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 *  @author: willSir
+	 *  @Date:  2020/8/14 - 11:40
+	 *  @Description:
+	 *  检验时间获取的如果是施工时间,施工时间时间段为一天内,就只显示施工开始时间,如果时间段不是同一天,就获取施工结束时间。
+	 *  需要修改:TABLE['t_pf_RecordTable015']['shigongkaishiriqi']+'~'+TABLE['t_pf_RecordTable015']['shigongjieshuriqi']
+	 *  为:FUNC.existOneDay(TABLE['t_pf_RecordTable015']['shigongkaishiriqi'],TABLE['t_pf_RecordTable015']['shigongjieshuriqi'])
+	 */
+	public static Object existOneDay(Object value1, Object value2){
+		if(null==value1 && null==value2){
+			return null;
+		}else if(StringUtils.isNotEmpty(value2)){
+			return  value2.toString();
+		}else if(StringUtils.isNotEmpty(value1)){
+			return  value1.toString();
+		}else {
+			return value2.toString();
+		}
+
+	}
+	/**
+	 *  @author: willSir
+	 *  @Date:  2020/8/17 - 9:54
+	 *  @Description:  一个自定义的预防公式报错的方法
+	 *  FUNC.correctFormula(“公式错误”)
+	 */
+	public static Object correctFormula(String str){
+ 		if(StringUtils.isNotEmpty(str)) {
+			return str;
+		}
+ 		return "";
+	}
+
+
+	/** * 对年月日进行组合成日期格式
+	 * @param year 年 month 月 day 日
+	 * @return String 日期格式的字符串
+	 * @author:renhao
+	 * @time:2020年8月18日
+	 **/
+	public  static  String dataProcessing(int year,int month,int day){
+		if(month>=10){
+			if(day>=10){
+				return year+"."+month+"."+day;
+			}else {
+				return year+"."+month+".0"+day;
+			}
+		}else {
+			if(day>=10){
+				return year+".0"+month+"."+day;
+			}else {
+				return year+".0"+month+".0"+day;
+			}
+		}
+	}
+	/**
+	 * @Description  输出勾选复选框
+	 * @Param [o1, o2]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.06.29 10:35
+	 **/
+	public  static Object checkbox(Object o1,Object o2){
+		if(StringUtils.isNotEmpty(o1)&&StringUtils.isNotEmpty(o2)){
+			if(o1.equals(o2)){
+				return "\u2611";
+			}
+		}
+		return "";
+	}
+	/**
+	 * @Description 返回n个空格,用于输出字符串格式化
+	 * @Param [n]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.06.29 11:41
+	 **/
+	public  static Object space(Object n){
+		if(StringUtils.isNumber(n)){
+			return  String.join("", Collections.nCopies(Integer.parseInt(n.toString()), "\u0020"));
+		}
+		return "";
+	}
+
+
+
+
+
+
+	public  static Object storageTime(Object years){
+       if(StringUtils.isNotEmpty(years)){
+       	 if(StringUtils.isEquals("9999",years)){
+       	 	return "永久";
+		 }else{
+            return years+"年";
+		 }
+	   }
+       return "";
+	}
+
+
+
+
+	public  static Object extractName(Object name){
+		if(StringUtils.isNotEmpty(name)){
+			String fileName = handleNull(name);
+			int index = fileName.lastIndexOf(".pdf");
+			if(index==-1){
+				return  fileName;
+			}else{
+			    return fileName.substring(0,fileName.lastIndexOf("."));
+			}
+		}
+		return "";
+	}
+
+
+
+	/**
+	 * @Description 字符串中是包含中文
+	 * @Param [chars]
+	 * @return boolean
+	 * @Author yangyj
+	 * @Date 2021.09.17 14:31
+	 **/
+   public  static boolean containsZH(Object chars){
+		Matcher m =matcher("[\u4e00-\u9fa5]",handleNull(chars));
+		 return m.find();
+   }
+
+	/**
+	 * @Description 字符串中是包含数字
+	 * @Param [chars]
+	 * @return boolean
+	 * @Author yangyj
+	 * @Date 2021.09.17 14:31
+	 **/
+	public  static boolean containsD(Object chars){
+		Matcher m =matcher("\\d",handleNull(chars));
+		return m.find();
+	}
+
+
+	/**
+	 * @Description 封装超链接
+	 * @Param [uri]
+	 * @return java.lang.String
+	 * @Author yangyj
+	 * @Date 2021.10.14 16:15
+	 **/
+   public static String uri(Object uri){
+   	 if(StringUtils.isNotEmpty(uri)){
+   	 	return "URI<"+handleNull(uri)+">";
+	 }
+   	  return "";
+   }
+
+
+
+
+
+
+
+
+
+	/**
+	 * @Description  获取相隔多少天后的日期
+	 * @Param [date, n:相隔天数,正数代表未来,负数代表历史]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.10.27 10:21
+	 **/
+	public static Object dateAfter(Object date ,Object n){
+		if(StringUtils.isNotEmpty(date)&&StringUtils.isNumber(n)){
+			Calendar cal = Calendar.getInstance();
+			Date d= parseDate(date.toString());
+			if(d!=null){
+				cal.setTime(d);
+				cal.add(Calendar.DATE,StringUtils.handObj2Integer(n));
+				if(date.toString().contains("-")){
+					return dateToStr(cal.getTime(),"yyyy-MM-dd");
+				}	if(date.toString().contains("年")){
+					return dateToStr(cal.getTime(),"yyyy年MM月dd日");
+				}else{
+					return dateToStr(cal.getTime(),"yyyy.MM.dd");
+				}
+			}
+		}
+		return "";
+	}
+
+	public static String dateToStr(Date date, String formatter) {
+		String value = null;
+		if(null != date) {
+			if(StringUtils.isEmpty(formatter)) {
+				formatter = "yyyy-MM-dd HH:mm:ss";
+			}
+			SimpleDateFormat dateFormat = new SimpleDateFormat(formatter);
+			value = dateFormat.format(date);
+			dateFormat = null;
+		}
+		return value;
+	}
+
+
+
+	private static Object crack(String password){
+//		return  SecurityUtils.desDecode(password, SSOUtils.getSecretKey());
+		return  SecurityUtils.desDecode(password, "qazwertyuioptgb");
+	}
+	/**
+	 * @Description 计算t1~t2,t3~t4 两个时间段的合计时间,unit 输入数值的单位
+	 * @Param [t1, t2, t3, t4, unit]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.07.02 15:47
+	 **/
+	public static Object totalTime(Object t1,Object t2,Object t3,Object t4,Object unit){
+		if(StringUtils.isNotEmpty(t1)&&StringUtils.isNotEmpty(t2)&&StringUtils.isNotEmpty(t3)&&StringUtils.isNotEmpty(t4)&&StringUtils.isNotEmpty(unit)){
+			return 	conversionUnit((Long.parseLong(minutesPassedRecent(t1,t2).toString())+Long.parseLong(minutesPassedRecent(t3,t4).toString())),unit);
+		}
+		return  "";
+	}
+	/**
+	 * @Description 字符串日期转指定格式日期
+	 * @Param [date, format:输出格式]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.07.02 15:55
+	 **/
+	public  static  Object dateFormatter(Object date,Object format){
+		if(StringUtils.isNotEmpty(date)&&StringUtils.isNotEmpty(format)){
+			Matcher m =	matcher("(\\d{4})\\D(\\d{2})\\D(\\d{2})日?\\s*(\\d{0,2})(\\D\\d{1,2})?",date.toString());
+            if(m.find()){
+                  String yyyy = handleNull(m.group(1));
+				  String MM = handleNull(m.group(2));
+				  String dd = handleNull(m.group(3));
+				  String HH = handleNull(m.group(4));
+			      String mm = handleNull(m.group(5));
+				  String d = handleNull(format);
+                  if(StringUtils.isNotEmpty(yyyy)){
+                  	d=d.replace("yyyy",yyyy);
+				  }
+				  if(StringUtils.isNotEmpty(MM)){
+					d=d.replace("MM",MM);
+			 	  }
+				  if(StringUtils.isNotEmpty(dd)){
+					d=d.replace("dd",dd);
+				  }
+			      if(StringUtils.isNotEmpty(HH)){
+			    		d=d.replace("HH",HH);
+			      }
+			    	if(StringUtils.isNotEmpty(mm)){
+			    		mm=mm.replaceAll("\\D","");
+			    		d=d.replace("mm",mm);
+			    	}
+			    	return  d;
+			}
+		}
+		return "";
+	}
+	/**
+	 * @Description 字符串日期转指定格式日期
+	 * @Param [date, format1:输入格式, format2:输出格式]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.07.02 15:57
+	 **/
+//	public  static  Object dateFormatter(Object date,Object format1,Object format2){
+//		if(StringUtils.isNotEmpty(date)&&StringUtils.isNotEmpty(format1)&&StringUtils.isNotEmpty(format2)){
+//			return 	dateToStr(parseDate(date.toString(),format1.toString()),format2.toString()) ;
+//		}
+//		return "";
+//	}
+
+
+	/**
+	 * @Description 求偏差值
+	 * @Param [list, design]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.09.18 10:43
+	 **/
+	public  static  Object deviation(Object list,Object design){
+		if(StringUtils.isNotEmpty(list)&&StringUtils.isNumber(design)){
+			List<Object> result = new ArrayList<>();
+			List<Object> tmp;
+			if(list instanceof List){
+				tmp = (List<Object>) list;
+			}else{
+				tmp=Arrays.asList(list.toString().split("[,|-|~|,]"));
+			}
+			int dev =StringUtils.handObj2Integer(design);
+			for(Object e:tmp){
+				if(containsZH(e)){
+					/*不允许包含中文*/
+					return "";
+				}
+				result.add(StringUtils.handObj2Integer(e)-dev);
+			}
+			if(ListUtils.isNotEmpty(result)){
+				return result;
+			}
+		}
+		return "";
+	}
+
+
+
+	/**
+	 * @Description 把日期格式化成 'xxxx年xx月xx日 星期x' 字符串
+	 * @Param [date]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.06.21 14:27
+	 **/
+    public  static  Object toDateAndWeek(Object date){
+		if(StringUtils.isNotEmpty(date)){
+			Date d = parseDate(handleNull(date));
+			String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
+			Calendar calendar=Calendar.getInstance();
+			assert d != null;
+			calendar.setTime(d);
+			String week = weekDays[calendar.get(Calendar.DAY_OF_WEEK)-1];
+			return  dateToStr(d,"yyyy年MM月dd日")+" "+week;
+		}
+		return  null;
+	}
+
+	public static  Object conversionUnit(Object data,Object unit){
+    	if(StringUtils.isNumber(data)&&StringUtils.isNotEmpty(unit)){
+    		//统一转化成毫秒在处理
+			long ms=0;
+			long l=Long.parseLong(data.toString());
+			final long s=1000L;
+			final long m=s*60;
+			final long H=m*60;
+			final long D=H*24;
+			final long M=D*30;
+			final long Y=D*365;
+			if(StringUtils.isEquals("Y",unit.toString())){
+				ms=l*Y;
+			}else if(StringUtils.isEquals("M",unit.toString())){
+				ms=l*M;
+			}else if(StringUtils.isEquals("D",unit.toString())){
+				ms=l*D;
+			}else if(StringUtils.isEquals("H",unit.toString())){
+				ms=l*H;
+			}else if(StringUtils.isEquals("m",unit.toString())){
+				ms=l*m;
+			}
+            StringBuilder sb = new StringBuilder();
+			if(ms/Y!=0){
+				sb.append(ms/Y).append("年");
+				ms=ms%Y;
+			}
+			if(ms/M!=0){
+				sb.append(ms/M).append("月");
+				ms=ms%M;
+			}
+			if(ms/D!=0){
+				sb.append(ms/D).append("日");
+				ms=ms%D;
+			}
+			if(ms/H!=0){
+				sb.append(ms/H).append("时");
+				ms=ms%H;
+			}
+			if(ms/m!=0){
+				sb.append(ms/m).append("分");
+				ms=ms%m;
+			}
+			if(sb.length()>0){
+				return sb.toString();
+			}
+		}
+		return  "";
+	}
+
+	public static  Object fileSize(Object data){
+    	return fileSize(data,null);
+	}
+	public static  Object fileSize(Object data,Object unit){
+		if(StringUtils.isNumber(data)){
+			if(StringUtils.isEmpty(unit)){
+				unit="K";
+			}
+			//统一转化成KB在处理
+			long ms=0;
+			long l=Long.parseLong(data.toString());
+			final long KB=1L;
+			final long MB=1024*KB;
+			final long GB=1024*MB;
+			final long TB=1024*GB;
+			if(StringUtils.isEquals("K",unit.toString().toUpperCase())){
+				ms=l*KB;
+			}else if(StringUtils.isEquals("M",unit.toString().toUpperCase())){
+				ms=l*MB;
+			}else if(StringUtils.isEquals("G",unit.toString().toUpperCase())){
+				ms=l*GB;
+			}else if(StringUtils.isEquals("T",unit.toString().toUpperCase())){
+				ms=l*TB;
+			}
+			if(ms/TB!=0){
+		        return  new BigDecimal(ms).divide(new BigDecimal(TB),2,ROUND_HALF_UP)+"TB";
+			}
+			if(ms/GB!=0){
+				return  new BigDecimal(ms).divide(new BigDecimal(GB),1,ROUND_HALF_UP)+"GB";
+			}
+			if(ms/MB!=0){
+				return  new BigDecimal(ms).divide(new BigDecimal(MB),0,ROUND_HALF_UP)+"MB";
+			}
+			return ms+"KB";
+		}
+		return  "";
+	}
+
+	public static  Object hoursPassed(Object t1,Object t2){
+    	return timePassed(t1,t2,"H",0,"yyyy-MM-dd HH");
+	}
+	public static  Object minutesPassed(Object t1,Object t2){
+		return timePassed(t1,t2,"m",0,"yyyy-MM-dd HH:mm");
+	}
+	/**
+	 * @Description 输入时间格式:mm:ss(例如01:33)
+	 * @Param [t1, t2]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.07.02 17:45
+	 **/
+	public static  Object minutesPassedRecent(Object t1,Object t2){
+		String year = Calendar.getInstance().get(Calendar.YEAR)+".";
+		int month= Calendar.getInstance().get(Calendar.MONTH)+1;
+		String mstr="";
+		if(month<10){
+			mstr="0"+month+".";
+		}else{
+			mstr=month+".";
+		}
+		int day =   Calendar.getInstance().get(Calendar.DATE)+1;
+		String dstr="";
+		if(day<10){
+			dstr ="0"+day+" ";
+		}else {
+			dstr =day+" ";
+		}
+		t1=year+mstr+dstr+t1;
+		t2=year+mstr+dstr+t2;
+		return timePassed(t1,t2,"m",0,"yyyy-MM-dd HH:mm");
+	}
+	public static  Object hoursPassedRecent(Object t1,Object t2){
+    	 String year = Calendar.getInstance().get(Calendar.YEAR)+"年";
+         t1=year+t1;t1=t1.toString().replace("日"," ").replace("时"," ");
+         t2=year+t2;t2=t2.toString().replace("日"," ").replace("时"," ");
+		return timePassed(t1,t2,"H",0,"yyyy-MM-dd HH");
+	}
+	public static Date parseDate(String dateStr) {
+		if(StringUtils.isEmpty(dateStr)) {
+			return null;
+		}
+		if(!dateStr.contains("-")){
+			dateStr=StringUtils.repaceBlank(dateStr);
+			Matcher m =	matcher("\\d{4}(.)\\d{2}(.)\\d{2}(.?)",dateStr);
+			if(m.find()){
+				Set<String> set = new HashSet<>();
+				set.add(m.group(1));
+				set.add(m.group(2));
+				if(StringUtils.isNotEmpty(m.group(3))){
+					set.add(m.group(3));
+				}
+				if(!set.isEmpty()){
+					for(String str:set){
+						dateStr=dateStr.replace(str,"-");
+					}
+				}
+			}
+		}
+		Date datetime = null;
+		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+		try {
+			datetime = dateFormat.parse(dateStr);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return datetime;
+	}
+	public static Date parseDate(String dateStr,String format) {
+		if(StringUtils.isEmpty(dateStr)||StringUtils.isEmpty(format)) {
+			return null;
+		}
+		if(!dateStr.contains("-")){
+			Matcher m =	matcher("\\d{4}(.)\\d{2}(.)\\d{2}(日?)",dateStr);
+			if(m.find()){
+				Set<String> set = new HashSet<>();
+				set.add(m.group(1));
+				set.add(m.group(2));
+				if(StringUtils.isNotEmpty(m.group(3))){
+					dateStr=dateStr.replace(m.group(3),"");
+				}
+				if(!set.isEmpty()){
+					for(String str:set){
+						dateStr=dateStr.replace(str,"-");
+					}
+				}
+			}
+		}
+		Date datetime = null;
+		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+		try {
+			datetime = dateFormat.parse(dateStr);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return datetime;
+	}
+	public static String handleNull(Object obj) {
+		if (null == obj) {
+			return "";
+		} else {
+			return obj.toString().trim();
+		}
+	}
+
+	/**
+	 * @Description 返回时间间隔差
+	 * @Param [t1:开始时间, t2:结束时间, mode:返回值单位:Y年 M月 D日 H时 m分,scale:保留小数位, format:输入日期格式]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.07.01 09:57
+	 **/
+	public static  Object timePassed(Object t1,Object t2,Object mode,Object scale,Object format){
+    	if(StringUtils.isNotEmpty(t1)&&StringUtils.isNotEmpty(t2)&&StringUtils.isNotEmpty(mode)&&StringUtils.isNotEmpty(scale)&&StringUtils.isNotEmpty(format)){
+//    		mode=mode.toString().toUpperCase();
+			Date d1 = parseDate(handleNull(t1),handleNull(format));
+			Date d2 = parseDate(handleNull(t2),handleNull(format));
+			assert d2 != null;
+			assert d1 != null;
+			if(d1.after(d2)&&StringUtils.isEquals("H",mode)){
+				/*假如是计算相差单位是小时,当开始时间大于结束时间,需要考虑跨年的情况*/
+                   Calendar c =Calendar.getInstance();
+                   c.setTime(d1);
+				   c.add(Calendar.YEAR, -1);
+				   d1=c.getTime();
+			}
+			long range = d2.getTime()-d1.getTime();
+			long r=0;
+			if(StringUtils.isEquals("Y",mode.toString())){
+                r=range/(1000L *3600*24*365);
+			}else if(StringUtils.isEquals("M",mode.toString())){
+				r=range/(1000L *3600*24*30);
+			}else if(StringUtils.isEquals("D",mode.toString())){
+				r=range/(1000L *3600*24);
+			}else if(StringUtils.isEquals("H",mode.toString())){
+				r=range/(1000L *3600);
+			}else if(StringUtils.isEquals("m",mode.toString())){
+				r=range/(1000L *60);
+			}
+			BigDecimal b = new BigDecimal(r);
+			if(!StringUtils.isNumber(scale)){
+                 scale=0;
+			}
+			return b.setScale(Integer.parseInt(scale.toString()),ROUND_HALF_UP);
+		}
+    	return "";
+	}
+
+
+
+
+
+	public static Object k2d(Object k){
+		Matcher mt = matcher("[A-Z]*(\\d*)\\+([\\d|\\.]*)",k.toString());
+		if(mt.find()){
+		   return  Double.parseDouble(mt.group(1))*1000+Double.parseDouble(mt.group(2));
+		}
+		return -1;
+	}
+
+	/**
+	 * @Description   开方
+	 * @Param [a:被开方数, scale:结果的小数位]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2020.12.10 15:10
+	 **/
+	public static Object sqrt(Object a,Object scale) {
+		if(StringUtils.isNumber(a)&&StringUtils.isNumber(scale)){
+			Double d = Math.sqrt(Double.parseDouble(a.toString()));
+			BigDecimal r = new BigDecimal(d);
+			return  r.setScale((int)Double.parseDouble(scale.toString()), ROUND_HALF_UP);
+		}
+		return 0;
+	}
+	/**
+	 * @Description   开方
+	 * @Param [a:被开方数 结果取整]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2020.12.10 15:10
+	 **/
+	public static Object sqrt(Object a) {
+		if(StringUtils.isNumber(a)){
+			return sqrt(a,0);
+		}
+		return 0;
+	}
+
+	/**
+	 * @Description   两者最大值
+	 * @Param [a:被开方数, scale:结果的小数位]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2020.12.10 15:10
+	 **/
+	public static Object max(Object a,Object b,Object scale) {
+		if(StringUtils.isNumber(a)&&StringUtils.isNumber(b)&&StringUtils.isNumber(scale)){
+			Double d = Math.max(Double.parseDouble(a.toString()),Double.parseDouble(b.toString()));
+			BigDecimal r = new BigDecimal(d);
+			return  r.setScale((int)Double.parseDouble(scale.toString()), ROUND_HALF_UP);
+		}
+		return 0;
+	}
+
+	/**
+	 * @Description   两者最大值
+	 * @Param [a:被开方数, scale:结果取整]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2020.12.10 15:10
+	 **/
+	public static Object max(Object a,Object b) {
+		a=parse(a);
+		b=parse(b);
+		if(StringUtils.isNumber(a)&&StringUtils.isNumber(b)){
+			return  max(a,b,0);
+		}
+		return 0;
+	}
+
+    /**
+     * @Description   两者最小值
+     * @Param [a:被开方数, scale:结果的小数位]
+     * @return java.lang.Object
+     * @Author yangyj
+     * @Date 2020.12.10 15:10
+     **/
+    public static Object min(Object a,Object b,Object scale) {
+        if(StringUtils.isNumber(a)&&StringUtils.isNumber(b)&&StringUtils.isNumber(scale)){
+            double d = Math.min(Double.parseDouble(a.toString()),Double.parseDouble(b.toString()));
+            BigDecimal r = new BigDecimal(d);
+            return  r.setScale((int)Double.parseDouble(scale.toString()), ROUND_HALF_UP);
+        }
+        return 0;
+    }
+
+    /**
+     * @Description   两者最小值
+     * @Param [a:被开方数, scale:结果取整]
+     * @return java.lang.Object
+     * @Author yangyj
+     * @Date 2020.12.10 15:10
+     **/
+    public static Object min(Object a,Object b) {
+    	a=parse(a);
+    	b=parse(b);
+        if(StringUtils.isNumber(a)&&StringUtils.isNumber(b)){
+            return  min(a,b,0);
+        }
+        return 0;
+    }
+
+	/**
+	 * @Description   平方
+	 * @Param [a:开方数, scale:结果的小数位]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2020.12.10 15:10
+	 **/
+	public static Object pow(Object a,Object b,Object scale) {
+		if(StringUtils.isNumber(a)&&StringUtils.isNumber(b)&&StringUtils.isNumber(scale)){
+			double d = Math.pow(Double.parseDouble(a.toString()),Double.parseDouble(b.toString()));
+			BigDecimal r = new BigDecimal(d);
+			return  r.setScale((int)Double.parseDouble(scale.toString()), ROUND_HALF_UP);
+		}
+		return 0;
+	}
+
+	/**
+	 * @Description   平方
+	 * @Param [a:底數, scale:结果取整]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2020.12.10 15:10
+	 **/
+	public static Object pow(Object a,Object b) {
+		if(StringUtils.isNumber(a)&&StringUtils.isNumber(b)){
+			return  pow(a,b,0);
+		}
+		return 0;
+	}
+	/**
+	 * @Description   EL表达式解析
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2020.12.10 15:10
+	 **/
+	public static Object parse(Object a) {
+		if(StringUtils.isNotEmpty(a)&&!StringUtils.isNumber(a)){
+			return  Expression.parse(a.toString()).calculate().toString();
+		}
+		return a;
+	}
+
+
+
+
+	/**
+	 * 获取动态行最后一行指定值
+	 */
+	public static Object  lastMapValByKey(Object table,Object key){
+        ArrayList<HashMap<String, Object>> list = objToArray(table);
+        if(ListUtils.isNotEmpty(list)){
+			for(int i=list.size()-1;i>=0;i--){
+				if(list.get(i).get(key) != null){
+					return list.get(i).get(key);
+				}
+			}
+		}
+       return "";
+	}
+	/**
+	 * 获取动态行第一行指定值
+	 */
+	public static Object  firstMapValByKey(Object table,Object key){
+		ArrayList<HashMap<String, Object>> list = objToArray(table);
+		if(ListUtils.isNotEmpty(list)){
+			for(int i=0;i<list.size();i++){
+				if(list.get(i).get(key) != null){
+					return list.get(i).get(key);
+				}
+			}
+		}
+		return "";
+	}
+	/**
+	 * 获取累计最后一个值
+	 */
+	public static Object  lastMapVal(Object scaleObj,Object table,Object key){
+		Object result = null;
+		ArrayList<HashMap<String, Object>> list = objToArray(table);
+		if(list != null && list.size() > 0) {
+			int scale = objectChangeInt(scaleObj);
+			double sum = 0;
+			for (Map<String,Object> data : list) {
+				if(StringUtils.isNumber(data.get(key))) {
+					sum += Double.parseDouble(data.get(key).toString());
+				}
+			}
+			if(scale == 0) {
+				//整数
+				result = (int)sum;
+			} else if(scale > 0) {
+				//浮点数
+				BigDecimal big = new BigDecimal(sum);
+				result = big.setScale(scale, ROUND_HALF_UP);
+			}
+		}
+		return result;
+	}
+	/**@yangyj
+	 * 构造随机正负数
+	 */
+	public static Object  minusOrPlus(){
+		Random rm = new Random();
+        if(rm.nextBoolean()){
+			return "-1";
+		}else{
+           	return "1";
+		}
+
+	}
+
+	/**
+	 * yangyj
+	 * 混合两个序列内容
+	 * @param la
+	 * @param lb
+	 * @return
+	 */
+ 	public static  List<Object>  mixedMList(List<Object> la ,List<Object> lb){
+		 List<Object> res = new ArrayList<>();
+		 res.addAll(la);
+		 res.addAll(lb);
+		Collections.shuffle(res);
+		return res;
+	}
+
+
+
+	/**@yangyj
+	 *根据取值范围获取随机数值,例子:FUNC.getRandomListPro('X','X+10',TABLE['t_pf_UniversalTable124_2']['hanfengchicunguiding'],TABLE['t_pf_UniversalTable124_2']['hanfengchicunpinlv'],0)
+	 * @param designv
+	 * @param hz
+	 * @return
+	 */
+	public static List<Object> getRandomListPro(Object min,Object max,Object designv,Object hz,Object scale){
+         if(max!=null&&hz!=null&&min!=null&&scale!=null){
+         	 if(StringUtils.isEmpty(designv)){
+         	 	designv="0";
+			 }
+         	 min=min.toString().replace("X",designv.toString());
+			 max=max.toString().replace("X",designv.toString());
+			 if(min.toString().startsWith("-")){
+			 	min="'"+min+"'";
+			 }
+			 if(max.toString().startsWith("+")){
+				 max="'"+max+"'";
+			 }
+			 if(!StringUtils.isNumber(min)){
+				 min=Expression.parse(min.toString()).calculate().toString();
+			 }
+			 if(!StringUtils.isNumber(max)){
+				 max=Expression.parse(max.toString()).calculate().toString();
+			 }
+			 return getRangeRandomList(hz, 0, min+","+max, scale);
+		 }
+		return null;
+	}
+
+	/**
+	 * @Description 生成用户指定范围实测值
+	 * @Param [n 数量, design 设计值, scope 偏差范围, rate 合格率0~1, scale保留小数位]
+	 * @return java.util.List<java.lang.Object>
+	 * @Author yangyj
+	 * @Date 2021.08.27 14:47
+	 **/
+	public static List<Object> cmv(Object n, Object design, Object scope, Object rate, Object scale){
+		if(StringUtils.isNotEmpty(n)&&StringUtils.isNotEmpty(design)&&StringUtils.isNotEmpty(scope)&&StringUtils.isNotEmpty(rate)&&StringUtils.isNotEmpty(scale)){
+			return rangeList(n,design,scope,1,scale,rate);
+		}
+		return null;
+	}
+
+	/**
+	 * @Description 生成用户指定范围实测值(重庆需求)
+	 * @Param [n 数量, design 设计值, scope 偏差范围, rate 合格率0~1, scale保留小数位]
+	 * @return java.util.List<java.lang.Object>
+	 * @Author huangjn
+	 * @Date 2021.08.27 14:47
+	 **/
+	public static List<Object> cmvcq(Object n, Object design, Object scope, Object rate, Object scale){
+		if(StringUtils.isNotEmpty(n) && StringUtils.isNotEmpty(design) &&
+				StringUtils.isNotEmpty(scope) && StringUtils.isNotEmpty(rate) && StringUtils.isNotEmpty(scale)){
+			String[] arr = handleNull(scope).split("[,|,]");
+			double minD = Math.abs(Double.parseDouble(arr[0]));
+			double maxD = Math.abs(Double.parseDouble(arr[1]));
+			int size = Integer.parseInt(n.toString());
+			double rateD = Double.parseDouble(rate.toString());
+			double m = Math.ceil(size * rateD);
+			List<Object> qualified = getRandomListPro("(X)-0.001-"+minD,"(X)+0.001+"+maxD,design,m,scale);
+			if(m < size){
+				Random r = new Random();
+				int le = r.nextInt((int) (size - m));
+				int gt = (int) (size - m - le);
+				//重庆需求,大于设计值的才算不合格,那么需要在生成指定个数且在合格范围内的合格值后,生成一定个数的不合格值且这些不合格值一定是大于设计值
+				List<Object> unQualified = getRandomListPro("(X)+1+" + maxD,"(X)+2.1+" + maxD, design, le + gt, scale);
+
+				return mixedMList(qualified,unQualified);
+			}else{
+				return qualified;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * @Description 检测是否存在客户手填的内容 ,不存在则批量生成实测值
+	 * @Param [param, customData]
+	 * @return java.util.List<java.lang.Object>
+	 * @Author yangyj
+	 * @Date 2021.12.22 10:52 update
+	 **/
+	public static List<Object> batchCmv(String param,Object customData){
+		boolean fi=true;
+		if(customData!=null){
+			ArrayList<HashMap<String,Object>> tmp = objToArray(customData);
+			if(ListUtils.isNotEmpty(tmp)){
+		      if(tmp.get(0).entrySet().stream().anyMatch(e->StringUtils.isNotEquals("id",e.getKey())&&StringUtils.isNotEmpty(e.getValue()))){
+		      	fi=false;
+			  }
+			}
+		}
+		if(StringUtils.isNotEmpty(param)&&fi){
+			param=param.replaceAll("\\s","").replaceAll("(","(").replaceAll(")",")");
+			//每组格式:项目名称(项目)合格率(0.9)数量(20)设计值(100)偏差范围(-10,10)保留小数位(0);
+			List<Object> result = new ArrayList<>();
+			String[] ss = param.split("[;|;]");
+			int i=1;
+			/*前一个项目名称*/
+			String pre=ss[0].split("\\)合格率\\(")[0];
+			for(String xm:ss){
+				Map<String,String> map = new HashMap();
+				String[] args = xm.split("\\)");
+				for(String a:args){
+					if(StringUtils.isNotEmpty(a)){
+						String[] kv=a.split("\\(");
+						map.put(kv[0],kv[1]);
+					}
+				}
+				List<Object> datas = cmv(map.get("数量"),map.get("设计值"),map.get("偏差范围"),map.get("合格率"),map.get("保留小数位"));
+				if(ListUtils.isNotEmpty(datas)){
+					List<Object> tmp = new ArrayList<>();
+					int n= datas.size();
+					int index=0;
+					String _pre=xm.split("\\)合格率\\(")[0];
+					if(StringUtils.isNotEquals(pre,_pre)){
+						i++;
+						pre=_pre;
+					}
+					while (n>=15){
+						tmp.add(i);
+						tmp.add(map.get("项目名称"));
+						tmp.add(map.get("项目名称"));
+						tmp.addAll(datas.subList(index,index+15));
+						index=index+15;
+						n=n-15;
+						tmp.add(map.get("设计值"));
+					}
+					if(n>0){
+						int fill=15-n;
+						tmp.add(i);
+						tmp.add(map.get("项目名称"));
+						tmp.add(map.get("项目名称"));
+						tmp.addAll(datas.subList(index,datas.size()));
+					    for(int j=0;j<fill;j++){
+							tmp.add(map.get(""));
+						}
+						tmp.add(map.get("设计值"));
+					}
+					result.addAll(tmp);
+				}
+			}
+			if(result.size()>0){
+				return  result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * @Description 累加器
+	 * @Param [scale:保留小数位, args:累加对象,支持动态数量]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.05.18 10:40
+	 **/
+	public static  Object _sumObj(Object scale,Object...args){
+		 double result = 0d;
+		 boolean flag = false;
+         for(Object obj:args){
+         	if(StringUtils.isNotEmpty(obj)&&StringUtils.isNumber(obj)){
+				result+=Double.parseDouble(obj.toString());
+				flag=true;
+			}
+		 }
+         if(flag){
+			 BigDecimal r = new BigDecimal(result);
+			 return  r.setScale((int)Double.parseDouble(scale.toString()), ROUND_HALF_UP);
+		 }
+		return "";
+	}
+	/**
+	 * @Description 累加公式,最大支持20个数累加,第一个参数是保留小数位
+	 * @Param [scale,...obj]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.06.17 13:51
+	 **/
+	public static  Object sumObj(Object scale,Object o1,Object o2){
+		return _sumObj(scale,o1,o2);
+	}
+	public static  Object sumObj(Object scale,Object o1,Object o2,Object o3){
+
+		return _sumObj(scale,o1,o2,o3);
+	}
+	public static  Object sumObj(Object scale,Object o1,Object o2,Object o3,Object o4){
+		return _sumObj(scale,o1,o2,o3,o4);
+	}
+	public static  Object sumObj(Object scale,Object o1,Object o2,Object o3,Object o4,Object o5){
+		return _sumObj(scale,o1,o2,o3,o4,o5);
+	}
+	public static  Object sumObj(Object scale,Object o1,Object o2,Object o3,Object o4,Object o5,Object o6){
+		return _sumObj(scale,o1,o2,o3,o4,o5,o6);
+	}
+	public static  Object sumObj(Object scale,Object o1,Object o2,Object o3,Object o4,Object o5,Object o6,Object o7){
+		return _sumObj(scale,o1,o2,o3,o4,o5,o6,o7);
+	}
+	public static  Object sumObj(Object scale,Object o1,Object o2,Object o3,Object o4,Object o5,Object o6,Object o7,Object o8){
+		return _sumObj(scale,o1,o2,o3,o4,o5,o6,o7,o8);
+	}
+	public static  Object sumObj(Object scale,Object o1,Object o2,Object o3,Object o4,Object o5,Object o6,Object o7,Object o8,Object o9){
+		return _sumObj(scale,o1,o2,o3,o4,o5,o6,o7,o8,o9);
+	}
+	public static  Object sumObj(Object scale,Object o1,Object o2,Object o3,Object o4,Object o5,Object o6,Object o7,Object o8,Object o9,Object o10){
+		return _sumObj(scale,o1,o2,o3,o4,o5,o6,o7,o8,o9,o10);
+	}
+	public static  Object sumObj(Object scale,Object o1,Object o2,Object o3,Object o4,Object o5,Object o6,Object o7,Object o8,Object o9,Object o10,Object o11){
+		return _sumObj(scale,o1,o2,o3,o4,o5,o6,o7,o8,o9,o10,o11);
+	}
+	public static  Object sumObj(Object scale,Object o1,Object o2,Object o3,Object o4,Object o5,Object o6,Object o7,Object o8,Object o9,Object o10,Object o11,Object o12){
+		return _sumObj(scale,o1,o2,o3,o4,o5,o6,o7,o8,o9,o10,o11,o12);
+	}
+	public static  Object sumObj(Object scale,Object o1,Object o2,Object o3,Object o4,Object o5,Object o6,Object o7,Object o8,Object o9,Object o10,Object o11,Object o12,Object o13){
+		return _sumObj(scale,o1,o2,o3,o4,o5,o6,o7,o8,o9,o10,o11,o12,o13);
+	}
+	public static  Object sumObj(Object scale,Object o1,Object o2,Object o3,Object o4,Object o5,Object o6,Object o7,Object o8,Object o9,Object o10,Object o11,Object o12,Object o13,Object o14){
+		return _sumObj(scale,o1,o2,o3,o4,o5,o6,o7,o8,o9,o10,o11,o12,o13,o14);
+	}
+	public static  Object sumObj(Object scale,Object o1,Object o2,Object o3,Object o4,Object o5,Object o6,Object o7,Object o8,Object o9,Object o10,Object o11,Object o12,Object o13,Object o14,Object o15){
+		return _sumObj(scale,o1,o2,o3,o4,o5,o6,o7,o8,o9,o10,o11,o12,o13,o14,o15);
+	}
+
+
+
+
+	public static Object dataFormatter(Object o,Object type){
+		if(o!=null&&o instanceof List){
+			ArrayList<Object> data = (ArrayList<Object>) o;
+			List<Object> result = new ArrayList<>();
+			for(Object ob:data){
+                 result.add(ob+"%");
+			}
+			return result;
+		}
+       return  null;
+	}
+
+
+
+	/**@yangyj
+	 * getDivisorRandomList
+	 * 生成的随机数是divisor的整数倍
+	 * @param hz
+	 * @param scaleObj
+	 * @return
+	 */
+
+	public static List<Object> getDivisorRL( Object min,Object max, Object designv,Object hz, Object scaleObj,Object divisor) {
+		List<Object> result =new ArrayList<Object>();
+		if(StringUtils.isEmpty(min) || StringUtils.isEmpty(max) || StringUtils.isEmpty(designv) || StringUtils.isEmpty(hz) || StringUtils.isEmpty(scaleObj) || StringUtils.isEmpty(divisor)){
+			return  result;
+		}
+		min=min.toString().replace("X",designv.toString());
+		max=max.toString().replace("X",designv.toString());
+		Double s = Double.parseDouble(Expression.parse(min.toString()).calculate().toString())/Double.parseDouble(divisor.toString());
+		Double e = Double.parseDouble(Expression.parse(max.toString()).calculate().toString())/Double.parseDouble(divisor.toString());
+		List<Object>  list = getRandomListPro(s,e,0,hz,0);
+		for(Object obj:list){
+			result.add(String.format("%."+scaleObj.toString()+"f",Double.parseDouble(obj.toString())*Double.parseDouble(divisor.toString())));
+		}
+		return  result;
+	}
+
+
+	/**
+     * @yangyj 判断取值,例子:FUNC.ifVal('X<=2?2:(X-1)*3',TABLE[tablename][fieldname])
+     * @param ari  运算表达式
+     * @param designv 设计值(未知量X的值)
+     * @return
+     */
+	public static Object ifVal(Object ari,Object designv){
+          if(designv==null){
+          	  return "";
+		  }
+          if(StringUtils.isEmpty(designv.toString())){
+          	return "";
+          }
+		 ari = ari.toString().replaceAll("[\\t\\n\\r]", "");
+		 ari=ari.toString().replace("X",designv.toString());
+         return  Expression.parse(ari.toString()).calculate().toString();
+	}
+	/**
+	 * @Description  空白或者/都判断为空
+	 * @Param [data]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.04.01 15:04
+	 **/
+	public static Object isNotEmpty(Object data){
+	      List<Object> list = obj2List(data);
+         return  list.stream().map(StringUtils::handleNull).anyMatch(e->!e.contains("/"));
+	}
+
+	public static Object isPass(Object data){
+		List<Object> list = obj2List(data);
+		return  list.stream().map(StringUtils::handleNull).map(e-> !e.contains("/")&&StringUtils.isNotEmpty(e)?"合格":"").collect(Collectors.toList());
+	}
+
+
+
+
+	/**
+	 * @Description 评定表实测值
+	 * @Param [data, remark]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.01.13 15:26
+	 **/
+	public static Object eval(Object data ,Object remark){
+		if(data!=null){
+			if(data instanceof  List){
+				data = removeEmpty(data);
+				List<Object> datas = (List<Object>) data;
+                if(datas.size()<=10&&datas.size()>0){
+				  return join(datas,"、");
+				}
+			}else{
+				if(StringUtils.isNotEmpty(data)){
+					return handleNull(data);
+				}
+			}
+		}
+		return remark;
+	}
+
+	public static Object model100(Object data ,Object remark){
+		if(data!=null){
+			if(data instanceof  List){
+				data = removeEmpty(data);
+				List<Object> datas = (List<Object>) data;
+				if(datas.size()<=10&&datas.size()>0){
+					return join(datas,"、");
+				}else{
+					return remark;
+				}
+			}
+		}
+		return "";
+	}
+
+
+
+
+
+	/**
+	 * @Description 共检点合格点公式
+	 * @Param [data 数据, remark超出10个后的提示, design实际值, dev偏差值]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.02.11 10:09
+	 **/
+	public static Object checkpoints(Object data ,Object remark,Object design,Object dev){
+		if(data!=null){
+			    if(data instanceof  String &&((String) data).contains("NumberFormatException")){
+			    	return data;
+				}
+				Object[] R=ck(data,design,dev);
+				if(R[0]!=null&&R[1]!=null&&R[2]!=null){
+					int checkpoints=Integer.parseInt(R[0].toString());
+					int passpoints=Integer.parseInt(R[1].toString());
+					List<Object> result = (List<Object>) R[2];
+					boolean	over=checkpoints>result.size();
+					if(checkpoints<=0){
+						return "/";
+					}else if(ListUtils.isNotEmpty(result)&&result.size()<=10&&!over){
+						result=	result.stream().map(obj->{
+							if(StringUtils.isNumber(obj)){
+								if(obj.toString().contains(".")){
+									BigDecimal big = new BigDecimal(obj.toString());
+									String s = big.toString();
+									return s.replaceAll("(0+|\\.0+)$","");
+								}
+							}
+							return obj;
+						}).collect(Collectors.toList());
+						return join(result,"、");
+					}else{
+						if(StringUtils.isEmpty(remark)){
+							remark ="共检点,合格点";
+						}
+						return remark.toString().replace("共检","共检"+checkpoints).replace("合格","合格"+passpoints);
+					}
+				}
+		}
+		return "/";
+	}
+
+	public static Object[] ck(Object data ,Object design,Object dev){
+		Object[] r=new Object[3];
+		List<Object> result = new ArrayList<>();
+		List<Object> datas = obj2List(removeEmpty(data));
+		if(ListUtils.isNotEmpty(datas)){
+			int checkpoints=0;
+			int passpoints=0;
+			List<Object> designList = obj2List(design);
+			if(ListUtils.isNotEmpty(designList)){
+				design=designList.get(0);
+			}
+			for(Object e:datas){
+				String s = handleNull(e);
+				if(StringUtils.isNotEmpty(s)){
+					if(containsZH(s)){
+						Matcher m =matcher("[\u4e00-\u9fa5]+(\\d+)\\D*合格(\\d+)\\D+",s);
+						if(m.find()){
+							checkpoints+=Integer.parseInt(m.group(1));
+							passpoints+=Integer.parseInt(m.group(2));
+						}
+					}else{
+						result.add(s);
+					}
+				}
+			}
+			result=result.stream().map(StringUtils::handleNull).map(String::trim).filter(e->!StringUtils.isEquals("/",e)).collect(Collectors.toList());
+			if(result.size()>0){
+				List<Object> pl = passList(design,dev,result,1);
+				passpoints+= pl.size();
+				result=obj2List(result);
+				checkpoints+=result.size();
+			}else{
+				System.out.println();
+			}
+			r[0]=checkpoints;
+			r[1]=passpoints;
+			r[2]=result;
+		}
+		return r;
+	}
+
+	public static Object tree(List<String>nodes,String param){
+		if(CollectionUtil.isNotEmpty(nodes)&& Func.isNotBlank(param)){
+			List<String> result = new ArrayList<>();
+			param=param.replaceAll("[cC]","");
+			List<String> list = Arrays.asList(param.split("-"));
+			List<Integer> index =list.stream().map(Integer::parseInt).collect(Collectors.toList());
+			for(Integer i:index){
+				result.add(nodes.get(i));
+			}
+			return String.join(",", result);
+		}
+        return "";
+	}
+
+	public static Object qrate(Object design,Object dev,Object data){
+		return qrate(design,dev,data,0,1);
+	}
+	public static Object qrate(Object design,Object dev,Object data,Object scale){
+		return qrate(design,dev,data,scale,1);
+	}
+	/**
+	 * @Description Qualified rate of measured value 计算合格率
+	 * @Param [design: 设计值, dev:偏差范围或规定值, xN:偏差值单位转设计值单位倍率, data:数据, scale:保留小数位]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.01.14 09:56
+	 **/
+	public static Object qrate(Object design,Object dev,Object data,Object scale,Object xN){
+		 if(data!=null&&StringUtils.isNotEmpty(design,dev,xN)){
+              Object[] R=ck(data,design,dev);
+              if(R[0]!=null&&R[1]!=null&&Math.abs(Double.parseDouble(R[0].toString()))>0){
+                	String result=StringUtils.number2String(Double.parseDouble(R[1].toString())*100/Double.parseDouble(R[0].toString()),scale);
+				  if(result.contains(".")){
+					  result =result.replaceAll("(0+|\\.0+)$","");
+				  }
+				  return result;
+			  }
+		 }
+		return "";
+	}
+	public static Object easyRate(Object data){
+		if(null!=data){
+			List<Object> datas = obj2List(data);
+			if(datas.stream().anyMatch(e->containsZH(e))){
+				return 100;
+			}
+		}
+		return "";
+	}
+	/**
+	 * @Description 筛选合格的部分
+	 * @Param [design, dev, data, xN]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.02.12 13:59
+	 **/
+	public static List<Object> passList(Object design,Object dev,Object data,Object xN){
+		List<Object> result = new ArrayList<>();
+		List<Object> datas = obj2List(data);
+		datas= (List<Object>) removeEmpty(datas);
+		Double[] range=scopeParse(dev,design,xN);
+		assert range != null;
+		double finalMin = range[0];
+		double finalMax = range[1];
+        List<Object> l1 =   datas.stream().map(StringUtils::handleNull).filter(e->e.contains("*")||e.contains("X")||e.contains("x") ||e.contains("×")||e.contains("/")).collect(Collectors.toList());
+        if(ListUtils.isNotEmpty(l1)){
+        	for(Object obj:l1){
+               String[] arr = obj.toString().split("[×xX*/]");
+               if(Arrays.stream(Arrays.stream(arr).toArray()).allMatch(StringUtils::isNumber)){
+               	    if(Arrays.stream(Arrays.stream(arr).toArray()).map(StringUtils::handleNull).map(Double::parseDouble).noneMatch(e->e>finalMax ||e< finalMin)){
+               	    	result.add(obj);
+					}
+			   }
+			}
+		}
+		List<Object> l2 =   datas.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).map(Double::parseDouble).filter(e->e<= finalMax &&e>= finalMin).collect(Collectors.toList());
+		if(ListUtils.isNotEmpty(l2)){
+			result.addAll(l2);
+		}
+		return  result;
+	}
+
+
+	public static Double[] scopeParse(Object dev, Object design, Object xN){
+		if(StringUtils.isNotEmpty(dev)){
+ 			Double[] result = new Double[2];
+			double designD=Double.parseDouble(design.toString());
+			double xND=Double.parseDouble(xN.toString());
+			String devStr = dev.toString();
+			double min=0;
+			double max=0;
+			devStr=devStr.replaceAll("\\s+","");
+			if(devStr.contains("≤")||devStr.contains("<=")||devStr.contains("<")){
+				devStr=devStr.replace("≤","").replace("<=","");
+				max=designD+Double.parseDouble(devStr)*xND;
+			}else if(devStr.contains("≥")||devStr.contains(">=")||devStr.contains(">")){
+				devStr=devStr.replace("≥","").replace(">=","");
+				min=designD+Double.parseDouble(devStr)*xND;
+				max=Double.MAX_VALUE;
+			}else if(devStr.contains(",")||devStr.contains(",")){
+				String[] arr = devStr.split("[,,]");
+				min = designD+Double.parseDouble(arr[0])*xND;
+				max = designD+Double.parseDouble(arr[1])*xND;
+			}else if(devStr.contains("%")){
+				devStr=devStr.replace("%","");
+				double devD =Math.abs(Double.parseDouble(devStr)*designD/100);
+				min = designD-devD;
+				max = designD+devD;
+			}else if(devStr.contains("±")){
+				devStr=devStr.replace("±","");
+				double devD =Math.abs(Double.parseDouble(devStr)*xND);
+				min = designD-devD;
+				max = designD+devD;
+			}
+				result[0]=min;
+				result[1]=max;
+				return result;
+		}
+		return null;
+	}
+
+	/*specifiedRangeList*/
+	public static List<Object>  rangeList(Object hz,Object design,Object dev,Object xN,Object scale,Object passRate){
+		 List<Object> result = new ArrayList<>();
+		 if(StringUtils.isNotEmpty(design,dev,hz)){
+			 if(StringUtils.isEmpty(scale)){
+				 scale=0;
+			 }
+             if(StringUtils.isEmpty(passRate)){
+             	passRate=1;
+			 }
+             if(StringUtils.isEmpty(xN)){
+             	xN=1;
+			 }
+			 Double[] range=scopeParse(dev,design,xN);
+             int scaleI= Integer.parseInt(scale.toString());
+             int min=0,max=0;
+			 assert range != null;
+			 if(range.length>0){
+				 min = (int)(range[0]*Math.pow(10,scaleI));
+				 max = (int)(range[1]*Math.pow(10,scaleI));
+			 }
+			 Random rd= new Random();
+			 int hzi=new BigDecimal(hz.toString()).multiply(new BigDecimal(passRate.toString())).setScale(0,ROUND_CEILING).intValue();
+			 for(int i=0;i<hzi;i++){
+			 	BigDecimal tb = new BigDecimal(rd.nextInt(max-min+1)+min).divide(BigDecimal.valueOf(Math.pow(10,scaleI)),scaleI,ROUND_HALF_UP);
+			 	if(scaleI>0){
+					result.add(tb.doubleValue());
+				}else{
+					result.add(tb.intValue());
+				}
+
+			 }
+			 int total=StringUtils.handleObj2Integer(hz);
+			 if(total-hzi>0){
+			 	for(int k=0;k<total-hzi;k++){
+					BigDecimal tb;
+                    if(rd.nextBoolean()){
+						 tb = new BigDecimal(rd.nextInt(((max-min)/2))+max+1).divide(BigDecimal.valueOf(Math.pow(10,scaleI)),scaleI,ROUND_HALF_UP);
+					}else{
+						 tb = new BigDecimal(min-1-rd.nextInt(((max-min)/2))).divide(BigDecimal.valueOf(Math.pow(10,scaleI)),scaleI,ROUND_HALF_UP);
+					}
+					if(scaleI>0){
+						result.add(tb.doubleValue());
+					}else{
+						result.add(tb.intValue());
+					}
+				}
+			 	if(ListUtils.isNotEmpty(result)){
+					Collections.shuffle(result);
+				}
+			 }
+		 }
+		 return  result;
+	}
+
+	/**
+	 * @Description obj 转List
+	 * @Param [obj]
+	 * @return java.util.List<java.lang.Object>
+	 * @Author yangyj
+	 * @Date 2022.01.13 15:40
+	 **/
+	public static List<Object> obj2List(Object obj){
+		List<Object> result = new ArrayList<>();
+		if(obj!=null){
+			 List<Object> datas = new ArrayList<>();
+			if(obj instanceof  List){
+				datas =  (List<Object>) obj;
+			}else {
+				datas.add(obj);
+			}
+			if(ListUtils.isNotEmpty(datas)){
+				for(Object e:datas){
+					if(StringUtils.isNotEmpty(e)&&!CustomFunction.containsZH(e.toString())&&(e.toString().contains("、")||e.toString().contains(",")||e.toString().contains(" ")||e.toString().contains(","))){
+						String s=e.toString().trim();
+						if(s.contains(" ")){
+							s=s.replaceAll("\\s+","、");
+						}
+						Object[] bs = s.split("[、,,]");
+						result.addAll(Arrays.asList(bs));
+					}else{
+						result.add(e);
+					}
+				}
+			}
+		}
+		return  result;
+	}
+	/**
+	 * @Description 对象转字符串,list取第一个对象
+	 * @Param [obj]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.02.11 15:14
+	 **/
+	public static Object o2Str(Object obj){
+		String result = "";
+		if(obj!=null){
+			List<Object> datas =obj2List(obj);
+			if(ListUtils.isNotEmpty(datas)){
+				return handleNull(datas.get(0));
+			}
+		}
+		return  result;
+	}
+
+	public static Object getFirstNonNull(Object ob1,Object ob2,Object ob3){
+		return _getFirstNonNull(ob1,ob2,ob3);
+	}
+	public static Object getFirstNonNull(Object ob1,Object ob2){
+		return _getFirstNonNull(ob1,ob2);
+	}
+	/**
+	 * @Description  返回第一个不为空的对象
+	 * @Param
+	 * @Author yangyj
+	 * @Date 2022.01.04 13:57
+	 **/
+	public static Object _getFirstNonNull(Object ...obs){
+		   if(obs!=null){
+		   	 for(Object ob:obs){
+		   	 	if(ob instanceof List){
+		   	 		List<Object> list =obj2List(ob);
+		   	 		if(ListUtils.isNotEmpty(list)&&list.stream().anyMatch(StringUtils::isNotEmpty)){
+						return  ob;
+					}
+				}else if(ob instanceof Map){
+		   	 		if(MapUtils.isNotEmpty((Map)ob)){
+						return ob;
+					}
+				}else{
+		   	 		if(StringUtils.isNotEmpty(ob)&&StringUtils.isNotEquals("/",ob)){
+		   	 			return ob;
+					}
+				}
+			 }
+		   }
+           return null;
+	}
+
+
+	/**
+	 * @Description 三元运算 bool?o1:o2 ,默认返回空字符串
+	 * @Param [bool, o1, o2]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.01.29 13:54
+	 **/
+	public static Object ifValObj(Object bool,Object o1 ,Object o2){
+		Boolean fi;
+          if(bool instanceof Boolean){
+			 fi = (Boolean) bool;
+		  }else{
+          	return "";
+		  }
+         return fi?o1:o2;
+	}
+	/*太多写错公式名称的,应该是下面的方法名称比较容易接受*/
+	public static Object isValObj(Object bool,Object o1 ,Object o2){
+		return  ifValObj(bool,o1,o2);
+	}
+	/**
+	 * @Description  判断o1中是否包含字符串o2
+	 * @Param [o1, o2]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.01.29 14:04
+	 **/
+	public static Object ifContains(Object o1 ,Object o2){
+		if(StringUtils.isNotEmpty(o1)&&StringUtils.isNotEmpty(o2)){
+			return o1.toString().contains(o2.toString());
+		}
+		return false;
+	}
+	/**
+	 * @Description 判断两个对象是否相等
+	 * @Param [o1, o2]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.08.23 16:51
+	 **/
+	public static Object isEq(Object o1 ,Object o2){
+		if(StringUtils.isNotEmpty(o1)||StringUtils.isNotEmpty(o2)){
+		      return  StringUtils.isEquals(o1,o2);
+		}
+		return false;
+	}
+		/**
+         * @yangyj
+         * 单极点区间范围判断
+         * @param value 数据
+         * @param o1    比较对象1
+         * @param o2    比较对象2
+         * @param type  <=&&<
+         * @return
+         */
+	public static  Object isVisible(Object value,Object o1 ,Object o2,Object type){
+		if(o1!=null&&o2!=null){
+			double fi =Double.parseDouble(o1.toString())-Double.parseDouble(o2.toString());
+			if(type.equals("<=")){
+				if(fi<=0){
+					return value;
+				}
+			}else{
+				if(fi<0){
+					return value;
+				}
+			}
+		}
+		//如果不存在判断条件对象的值
+		if((o1==null||o2==null)&&type.equals("<=")){
+            return value;
+        }
+        return "";
+	}
+
+	/**@yangyj
+	 * 双极点区间范围判断
+	 * @param value
+	 * @param o1
+	 * @param o2
+	 * @param o3
+	 * @return
+	 */
+	public static  Object isVisibleD(Object value,Object o1 ,Object o2,Object o3){
+		Object r1=isVisible(value,o1,o2,"<");
+		Object r2=isVisible(value,o2,o3,"<=");
+		if(r1!=""&&r2!=""){
+			return  value;
+		}
+		return "";
+	}
+
+
+		/**@yangyj
+         *获取列表最小值
+         * @return
+         */
+	public static  Object getListMin(Object object){
+		if(object instanceof  ArrayList){
+			ArrayList<Object> arrayList = (ArrayList<Object>) object;
+			if(ListUtils.isNotEmpty(arrayList)){
+				arrayList.sort(((o1, o2) -> {
+					Integer io1= Integer.valueOf(o1.toString());
+					Integer io2 = Integer.valueOf(o2.toString());
+					return io1.compareTo(io2);
+				}));
+				return arrayList.get(0);
+			}
+		}
+		return "";
+	}
+
+
+
+
+	/**
+	 * @Description 计算数据集的合格率
+	 * @Param [list:数据集, design:设计值, dev:偏差范围, scale:保存小数位]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.10.26 09:34
+	 **/
+	public static  Object getListTick(Object list,Object design,Object dev,Object scale){
+		if(list!=null&&design!=null&&StringUtils.isNotEmpty(dev)){
+			if(!StringUtils.isNumber(scale)){
+				scale=0;
+			}
+			Matcher m = matcher("(-?\\d+(\\.\\d+)?)[h|H]?[,|,](\\+?\\d+(\\.\\d+)?)[h|H]?",dev.toString().replaceAll("[(|)]",""));
+			if(list instanceof  List&&m.find()){
+				List<Object> arrayList = (ArrayList<Object>) list;
+				double tick=0;
+				double designD= Double.parseDouble(handleNull(design));
+				double h=1;
+				if(dev.toString().toUpperCase(Locale.ROOT).contains("H")){
+					h=designD;
+				}
+				for(Object obj:arrayList){
+                    double dx = Double.parseDouble(handleNull(obj))-designD;
+					if(Double.parseDouble(m.group(1))*h<=dx&&dx<=Double.parseDouble(m.group(3))*h){
+                       tick++;
+					}
+				}
+			    if(tick>0){
+			    	BigDecimal a= new BigDecimal(tick);
+			    	BigDecimal b= new BigDecimal(arrayList.size());
+
+			    	return a.divide(b,8,ROUND_HALF_UP).multiply(new BigDecimal(100)).setScale(StringUtils.handleObj2Integer(scale.toString()),ROUND_HALF_UP);
+				}else{
+			    	return "0";
+				}
+			}
+		}
+		return "";
+	}
+	/**
+	 * @Description   指定表字段 数据
+	 * @Param [table, field]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.10.11 11:28
+	 **/
+	public static Object getTaleRow(Object table,Object field){
+		if(table!=null&&field!=null){
+			List<Object>  datas = new ArrayList<Object>();
+			ArrayList<HashMap<String,Object>> list=objToArray(table);
+			if(ListUtils.isNotEmpty(list)){
+				for(HashMap<String, Object> ob:list){
+					datas.add(ob.get(field));
+				}
+			}
+			return datas;
+		}
+      return null;
+	}
+
+
+
+	/**
+	 * @Description 获取最后一个对象
+	 * @Param [list]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.08.09 14:37
+	 **/
+	public static  Object getListLast(Object o){
+		if(o instanceof List){
+			List<Object> list = (List<Object>) o;
+			if(ListUtils.isNotEmpty(list)){
+				return list.get(list.size()-1);
+			}
+		}
+		return "";
+	}
+	/**
+	 * @Description 获取最后一个对象
+	 * @Param [list]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.08.09 14:37
+	 **/
+	public static  Object getListnum(Object o,Integer type){
+		if(o == null){
+			return "";
+		}
+		if(o instanceof List){
+			List<Object> list = (List<Object>) o;
+			if(ListUtils.isNotEmpty(list) || list.size() > type){
+				return list.get(type);
+			}
+		}else{
+			return o.toString();
+		}
+		return "";
+	}
+	/**
+	 * @Description 根据参数,取包含有对应参数的list
+	 * @Param [list],o是list,str是包含的字符串,type=1包含,2未包含
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.08.09 14:37
+	 **/
+	public static  Object getListtype(Object o,Object objstr,Integer type){
+		if(o == null || type == null){
+			return "";
+		}
+		String str = "";
+		if(objstr != null ){
+			str =objstr.toString();
+		}
+		List<Object> result = new ArrayList<>();
+		if(o instanceof List){
+			List<Object> list = (List<Object>) o;
+			if(ListUtils.isNotEmpty(list)){
+				for(Object obj : list){
+					if(obj == null){
+						continue;
+					}
+					if(type == 2){
+						if(!obj.toString().contains(str)){
+							result.add(obj);
+						}
+					}else{
+						if(obj.toString().contains(str)){
+							result.add(obj);
+						}
+					}
+
+				}
+				return result;
+			}
+		}else{
+			if(type == 2 && !o.toString().contains(str)){
+				return o.toString();
+			}else if(type == 1 && o.toString().contains(str)){
+				return o.toString();
+			}
+		}
+		return "";
+	}
+	/**
+	 * @Description 过滤掉List中的空对象
+	 * @Param [o]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.07.28 11:16
+	 **/
+	public static  Object removeEmpty(Object o){
+		List<Object> result = new ArrayList<>();
+		if(o instanceof  List){
+			for(Object e:(List<Object>)o){
+				if(StringUtils.isNotEmpty(e)){
+					result.add(e);
+				}
+			}
+		}else{
+			result.add(o);
+		}
+		return result;
+	}
+	/**
+	 * @Description 过滤掉List中的相同的对象
+	 * @Param [o]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.07.28 11:16
+	 **/
+	public static  Object removeeqEmpty(Object o){
+		List<Object> result = new ArrayList<>();
+		if(o instanceof  List){
+			for(Object e:(List<Object>)o){
+				if(StringUtils.isNotEmpty(e) && !result.contains(e)){
+					result.add(e);
+				}
+			}
+		}else{
+			result.add(o);
+		}
+		return result;
+	}
+	/**
+	 * @Description 设置保留小数位
+	 * @Param
+	 * @return
+	 * @Author yangyj
+	 * @Date 2021.12.31 17:14
+	 **/
+	public static  Object setScale(Object o,Object scale){
+		if(StringUtils.isNumber(scale)&&o!=null){
+			if(o instanceof  List){
+				List<Object> result = new ArrayList<>();
+				for(Object e:(List<Object>)o){
+					if(StringUtils.isNumber(e)){
+						result.add(StringUtils.number2String(e,scale));
+					}else{
+						result.add("");
+					}
+				}
+				return result;
+			}else{
+				if(StringUtils.isNumber(o)){
+					return StringUtils.number2String(o,scale);
+				}
+			}
+		}
+		return "";
+	}
+
+
+	public static  Object abs(Object o){
+		/**
+		 * @Description  测试
+		 * @Param [o]
+		 * @return java.lang.Object
+		 * @Author yangyj
+		 * @Date 2022.03.21 15:43
+		 **/
+		if(o!=null){
+			if(o instanceof  List){
+				List<Object> result = new ArrayList<>();
+				List<Object> datas = obj2List(o);
+				if(ListUtils.isNotEmpty(datas)){
+					for(Object e:datas){
+						if(StringUtils.isNotEmpty(e)){
+							result.add(e.toString().replaceAll("^-",""));
+						}
+					}
+				}
+				return  result;
+			}else{
+				return o.toString().replaceAll("^-","");
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * @Description 返回正则式匹配内容
+	 * @Param [regex:正则式, value:匹配的字符串, i:group(i), g:是否返回全局搜索,全局搜索返回的是列表]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.01.08 16:31
+	 **/
+	public static Object matcherFindGroup(String regex, String value ,int i,boolean g){
+		Matcher m = matcher(regex,value);
+		List<Object> result = new ArrayList<>();
+		while (m.find()){
+			result.add(m.group(i));
+		}
+		if(ListUtils.isNotEmpty(result)){
+			if(g){
+				return result;
+			}else {
+				return result.get(0);
+			}
+		}
+		return null;
+	}
+	/**
+	 * @Description 放大缩小
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.01.14 14:17
+	 **/
+	public static  Object xN(Object o,Object xN){
+		String cur="";
+		try{
+			if(StringUtils.isNotEmpty(o)&&StringUtils.isNumber(xN)){
+				double xND=Double.parseDouble(xN.toString());
+				List<Object> outList = new ArrayList<>();
+				if(o instanceof List){
+					List<Object> datas = (List<Object>)o;
+					for(Object e:datas){
+						if(StringUtils.isNotEmpty(e)){
+							String[] as = e.toString().split("[^\\d.]");
+							Object m= matcherFindGroup("[^\\d.]",e.toString(),0,false);
+							StringBuilder d = new StringBuilder();
+							for(int i=0;i<as.length;i++){
+								String s=as[i];
+								cur=s;
+								int scale = (int) Math.max(getScale(s)-Math.log10(xND),0);
+                                d.append(StringUtils.number2String(Double.parseDouble(s) * xND, scale)).append(i!=as.length-1&&m!=null?m:"");
+							}
+							outList.add(d.toString());
+						}
+					}
+					if(ListUtils.isNotEmpty(outList)){
+						return outList;
+					}
+				}else{
+					List<Object> datas = Arrays.asList(o.toString().split("[、, ,]"));
+					Matcher m = matcher("[、, ,]",o.toString());
+					String s="、";
+					if(m.find()){
+						s=handleNull(m.group());
+					}
+					if(ListUtils.isNotEmpty(datas)){
+						for(Object e:datas){
+							if(StringUtils.isNotEmpty(e)){
+								int scale = (int) Math.max(getScale(s)-Math.log10(xND),0);
+								cur=e.toString();
+								outList.add(StringUtils.number2String(Double.parseDouble(e.toString())*xND,scale));
+							}
+						}
+					}
+					if(ListUtils.isNotEmpty(outList)){
+						return StringUtils.join(outList.stream().map(StringUtils::handleNull).collect(Collectors.toList()),s);
+					}
+				}
+			}
+		}catch (NumberFormatException e){
+			e.printStackTrace();
+			String  error = "";
+			if(e.getMessage().contains("multiple points")){
+				error=cur+"包含多个小数点";
+			}else {
+				error=cur;
+			}
+			return "NumberFormatException(数字格式异常,请检查)"+error;
+		}
+		return "";
+	}
+	public static  Object repeat(Object data){
+		List<Object> result = new ArrayList<>();
+		if(data!=null){
+			List<Object> list = obj2List(removeEmpty(data));
+			result=list.stream().distinct().collect(Collectors.toList());
+		}
+		return  result;
+	}
+	/**
+	 * @Description  截取list subList(list,1,5) 返回list的第1到第5个元素
+	 * @Param [o]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.07.28 11:16
+	 **/
+	public static  Object subList(Object o,Object  start ,Object end){
+		List<Object> result = new ArrayList<>();
+		if(o instanceof  List){
+			 result = (List<Object>) o;
+			 int s=StringUtils.handleObj2Integer(start);
+			 int e=StringUtils.handleObj2Integer(end);
+			 s= Math.max(s, 1);
+			 if(e<=0){
+			 	e=result.size();
+			 }
+			 return result.subList(s-1,e);
+		}
+		return result;
+	}
+
+	/**
+	 * @Description 获取G8测点偏差
+	 * @Param [cd, pc]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.02.25 11:05
+	 **/
+	public static  Object g8dx(Object cd,Object pc){
+		if(cd!=null&&pc!=null){
+			List<Object> result = new ArrayList<>();
+			List<Object> stakes=obj2List(cd);
+			List<Object> dx=obj2List(pc);
+			if(ListUtils.isNotEmpty(stakes)&&dx.size()>=stakes.size()){
+				Object bmd = stakes.get(0);
+				if(StringUtils.isNotEmpty(bmd)){
+					for(int i=0;i<stakes.size();i++){
+						  Object cp = stakes.get(i);
+                          if(StringUtils.isNotEmpty(cp)&&StringUtils.isNotEquals(bmd,cp)){
+							  Matcher m = matcher("(?i)zd\\d+",cp.toString());
+							  if(!m.find()){
+							  	 result.add(dx.get(i));
+							  }
+						  }
+					}
+					return result;
+				}
+			}
+		}
+		return "";
+	}
+	public static  Object g8stakes(Object cd){
+		if(cd!=null){
+			List<Object> result = new ArrayList<>();
+			List<Object> stakes=obj2List(cd);
+			if(ListUtils.isNotEmpty(stakes)){
+				Object bmd = stakes.get(0);
+				if(StringUtils.isNotEmpty(bmd)){
+					for (Object cp : stakes) {
+						if (StringUtils.isNotEmpty(cp) && StringUtils.isNotEquals(bmd, cp)) {
+							Matcher m = matcher("(?i)zd\\d+", cp.toString());
+							if (!m.find()) {
+								result.add(cp);
+							}
+						}
+					}
+					return result;
+				}
+			}
+		}
+		return "";
+	}
+	public static  List<Object> g8c103(Object cd,Object sj, Object sc,Object dx){
+		List<Object> result = new ArrayList<>();
+		if(cd!=null&&sj!=null&&sc!=null&&dx!=null){
+			List<Object> cds=obj2List(cd);
+			List<Object> sjs=obj2List(sj);
+			List<Object> scs=obj2List(sc);
+			List<Object> dxs=obj2List(dx);
+			int min=Math.min(Math.min(sjs.size(),scs.size()),dxs.size());
+			if(ListUtils.isNotEmpty(cds)&&min>=cds.size()){
+				Object bmd = cds.get(0);
+				if(StringUtils.isNotEmpty(bmd)){
+					for(int i=0;i<cds.size();i++){
+						Object cp = cds.get(i);
+						if(StringUtils.isNotEmpty(cp)&&StringUtils.isNotEquals(bmd,cp)){
+							Matcher m = matcher("(?i)zd\\d+",cp.toString());
+							if(!m.find()){
+								if(StringUtils.isNumber(cp)){
+									result.add("");
+									result.add("");
+									result.add("");
+									result.add(dxs.get(i));
+								}else {
+									result.add(sjs.get(i));
+									result.add(scs.get(i));
+									result.add(dxs.get(i));
+									result.add("");
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+        return result;
+	}
+
+	public static  List<Object> g8zzds(Object cd,Object dx,Object fi){
+		List<Object> result = new ArrayList<>();
+		if(cd!=null&&dx!=null){
+			List<Object> cds=obj2List(cd);
+			List<Object> dxs=obj2List(dx);
+			boolean bol= (boolean) fi;
+			int min=dxs.size();
+			if(ListUtils.isNotEmpty(cds)&&min>=cds.size()){
+				Object bmd = cds.get(0);
+				List<String> l1 = new ArrayList<>();
+				List<String> l2 = new ArrayList<>();
+				List<String> l3 = new ArrayList<>();
+				List<String> dyn ;
+				if(bol){
+					dyn=l3;
+				}else{
+					dyn=l2;
+				}
+				if(StringUtils.isNotEmpty(bmd)){
+					for(int i=0;i<cds.size();i++){
+						Object cp = cds.get(i);
+						if(StringUtils.isNotEmpty(cp)&&StringUtils.isNotEquals(bmd,cp)){
+							Matcher m = matcher("(?i)zd\\d+",cp.toString());
+							if(!m.find()){
+								if(StringUtils.isNumber(cp)){
+									dyn.add(handleNull(dxs.get(i)));
+								}else {
+							    	l1.add(handleNull(dxs.get(i)));
+								}
+							}
+						}
+					}
+					result.add(StringUtils.join(l1,","));
+					result.add(StringUtils.join(l2,","));
+					result.add(StringUtils.join(l3,","));
+				}
+			}
+		}
+		return  result;
+	}
+
+	public static List<Object> gcc(Object zh,Object sj,Object sc,Object dx,Object mode){
+		List<Object> result = new ArrayList<>();
+		if(zh!=null&&sj!=null&&sc!=null&&dx!=null){
+			List<Object> cds=obj2List(zh);
+			List<Object> sjs=obj2List(sj);
+			List<Object> scs=obj2List(sc);
+			List<Object> dxs=obj2List(dx);
+			int min=Math.min(Math.min(dxs.size(),sjs.size()),scs.size());
+			if(ListUtils.isNotEmpty(cds)&&min>=cds.size()){
+				Object bmd = cds.get(0);
+				if(StringUtils.isNotEmpty(bmd)){
+					for(int i=0;i<cds.size();i++){
+						Object cp = cds.get(i);
+						if(StringUtils.isNotEmpty(cp)&&StringUtils.isNotEquals(bmd,cp)){
+							Matcher m = matcher("(?i)zd\\d+",cp.toString());
+							if(!m.find()){
+								if(StringUtils.isEquals(mode,0)){
+									if(!Pattern.matches(".+(?i)v$",cp.toString())){
+										result.add(sjs.get(i));
+										result.add(scs.get(i));
+										result.add(dxs.get(i));
+									}
+								}else if(StringUtils.isEquals(mode,1)){
+									if(Pattern.matches(".+(?i)v$",cp.toString())){
+										result.add(sjs.get(i));
+										result.add(scs.get(i));
+										result.add(dxs.get(i));
+									}
+								}
+
+							}
+						}
+					}
+				}
+			}
+		}
+		return  result;
+	}
+
+	/**
+	 * @Description 获取最后一份G8
+	 * @Param [data, out]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.04.02 17:46
+	 **/
+	public static  Object g8zd(Object data,Object out){
+		List<Object> result = new ArrayList<>();
+		if(StringUtils.isNotEmpty(out)&&data instanceof List){
+			List<Object> datas =obj2List(data);
+			String bm = handleNull(datas.get(0));
+			List<Object> cds = new ArrayList<>();
+			List<Object> bhs = new ArrayList<>();
+			List<Object> hss = new ArrayList<>();
+			List<Object> qss = new ArrayList<>();
+			List<Object> ygs = new ArrayList<>();
+			List<Object> scs = new ArrayList<>();
+			List<Object> sjs = new ArrayList<>();
+			List<Object> dxs = new ArrayList<>();
+			for(int n=0;n<datas.size();n++){
+                 int m=n%13;
+                 Object d=datas.get(n);
+                 if(m==0){
+                 	cds.add(d);
+				 }else if(m==1){
+					 bhs.add(d);
+				 }else if(m==2){
+					 hss.add(d);
+				 }else if(m==4){
+					 qss.add(d);
+				 }else if(m==6){
+					 ygs.add(d);
+				 }else if(m==8){
+					 scs.add(d);
+				 }else if(m==10){
+					 sjs.add(d);
+				 }else if(m==12){
+					 dxs.add(d);
+				 }
+			}
+			/*同时存在超过一组水准点,则存在多张复制表*/
+			if(cds.stream().filter(e -> StringUtils.isEquals(bm, e)).count() >2){
+				Collections.reverse(cds);
+				int length =0;
+				int count=0;
+				for(int x=0;x<cds.size();x++){
+					if(StringUtils.isEquals(cds.get(x),bm)){
+						/*倒序后,第一次bm点到第二次bm点为一组*/
+						if(count==2){
+							length=x+1;
+							break;
+						}else{
+							count++;
+						}
+
+					}
+				}
+				Collections.reverse(cds);
+				cds = cds.stream().skip(cds.size()-length).collect(Collectors.toList());
+				bhs = bhs.stream().skip(bhs.size()-length).collect(Collectors.toList());
+				hss = hss.stream().skip(hss.size()-length).collect(Collectors.toList());
+				qss = qss.stream().skip(qss.size()-length).collect(Collectors.toList());
+				ygs = ygs.stream().skip(ygs.size()-length).collect(Collectors.toList());
+				scs = scs.stream().skip(scs.size()-length).collect(Collectors.toList());
+				sjs = sjs.stream().skip(sjs.size()-length).collect(Collectors.toList());
+				dxs = dxs.stream().skip(dxs.size()-length).collect(Collectors.toList());
+			}
+			if(cds.size()>0){
+				String BM=handleNull(cds.get(0));
+				for(int i=0;i<bhs.size();i++){
+					Object _bh=bhs.get(i);
+					if(StringUtils.isNotEmpty(_bh)){
+						int k=i;
+						boolean loop=true;
+						do{
+							Object _cd=cds.get(k);
+							if(StringUtils.isNotEmpty(_cd)&&(_cd.toString().contains("ZD")||StringUtils.isEquals(BM,_cd))){
+								loop=false;
+							}else{
+								k--;
+							}
+						}while (k>=0&&loop);
+						String outStr=handleNull(out);
+						if(outStr.contains("桩号")){
+							result.add(handleNull(cds.get(i))+"  "+_bh);
+						}
+						if(outStr.contains("后视")){
+							result.add(hss.get(k));
+						}
+						if(outStr.contains("前视")){
+							result.add(qss.get(k));
+						}
+						if(outStr.contains("仪器高")){
+							result.add(ygs.get(k));
+						}
+						if(outStr.contains("实测高程、设计高程、高程差")){
+							if(_bh.toString().contains("右")){
+								result.addAll(Arrays.asList("","",scs.get(i)));
+								result.addAll(Arrays.asList("","",sjs.get(i)));
+								result.addAll(Arrays.asList("","",dxs.get(i)));
+							}else if(_bh.toString().contains("左")){
+								result.addAll(Arrays.asList(scs.get(i),"",""));
+								result.addAll(Arrays.asList(sjs.get(i),"",""));
+								result.addAll(Arrays.asList(dxs.get(i),"",""));
+							}else{
+								result.addAll(Arrays.asList("",scs.get(i),""));
+								result.addAll(Arrays.asList("",sjs.get(i),""));
+								result.addAll(Arrays.asList("",dxs.get(i),""));
+							}
+						}
+					}
+				}
+			}
+
+		}
+		return result;
+	}
+
+	/**
+	 * @Description  list 去头尾
+	 * @Param [o]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.12.31 14:53
+	 **/
+	public static  Object removeHT(Object o){
+		List<Object> result = new ArrayList<>();
+		if(o instanceof  List){
+			result= (List<Object>) o;
+			if(result.size()>2){
+				int end =result.size();
+				for(int i=result.size()-1;i>1;i--){
+					if(StringUtils.isNotEmpty(result.get(i))){
+						end=i;
+						break;
+					}
+				}
+				return subList(result,2,end);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @Description  list 去头
+	 * @Param [o]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.12.31 14:53
+	 **/
+	public static  Object removeH(Object o){
+		List<Object> result = new ArrayList<>();
+		if(o instanceof  List){
+			result= (List<Object>) o;
+			if(result.size()>2){
+				return subList(result,2,result.size());
+			}
+		}
+		return result;
+	}
+
+
+	public static  Object removeByReg(Object o,Object reg){
+		List<Object> result = new ArrayList<>();
+		if(o instanceof  List && StringUtils.isNotEmpty(reg)){
+			result= (List<Object>) o;
+			return result.stream().map(StringUtils::handleNull).filter(e->!Pattern.matches(reg.toString(),e)).collect(Collectors.toList());
+		}
+		return result;
+	}
+
+	/**
+	 * @Description 获取动态行某列内容
+	 * @Param [data, field]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.01.08 10:02
+	 **/
+	public static  Object getColumn(Object data ,Object field){
+	   if(StringUtils.isNotEmpty(field)){
+	   	    List<HashMap<String,Object>> _data =objToArray(data);
+	   	    if(ListUtils.isNotEmpty(_data)){
+	   	    	return  _data.stream().map(e->e.get(field.toString())).collect(Collectors.toList());
+			}
+	   }
+		return data;
+	}
+
+	/**
+	 * @Description 合并多个list
+	 * @Param [listArr]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.12.31 15:10
+	 **/
+	public static  Object mergeList(Object l1,Object l2){
+		return _mergeList(l1,l2);
+	}
+	public static  Object mergeList(Object l1,Object l2,Object l3){
+		return _mergeList(l1,l2,l3);
+	}
+	public static  Object mergeList(Object l1,Object l2,Object l3,Object l4){
+		return _mergeList(l1,l2,l3,l4);
+	}
+	public static  Object mergeList(Object l1,Object l2,Object l3,Object l4,Object l5){
+		return _mergeList(l1,l2,l3,l4,l5);
+	}
+	public static  Object mergeList(Object l1,Object l2,Object l3,Object l4,Object l5,Object l6){
+		return _mergeList(l1,l2,l3,l4,l5,l6);
+	}
+	public static  Object mergeList(Object l1,Object l2,Object l3,Object l4,Object l5,Object l6,Object l7){
+		return _mergeList(l1,l2,l3,l4,l5,l6,l7);
+	}
+	public static  Object mergeList(Object l1,Object l2,Object l3,Object l4,Object l5,Object l6,Object l7,Object l8){
+		return _mergeList(l1,l2,l3,l4,l5,l6,l7,l8);
+	}
+	public static  Object _mergeList(Object ...listArr){
+		List<Object> result = new ArrayList<>();
+	    if(listArr!=null&&listArr.length>=2){
+	    	List<List<Object>> tmp =new ArrayList<>();
+	    	int max=0;
+	    	for(Object o:listArr){
+				List<Object> list = Collections.singletonList("");
+	    		if(o instanceof List){
+	    			list = (List<Object>) o;
+					max=Math.max(max,list.size());
+				}
+	    		tmp.add(list);
+			}
+	    	if(ListUtils.isNotEmpty(tmp)){
+	    		for(int i=0;i<max;i++){
+	    			for(List<Object> _l:tmp){
+	    				if(_l.size()>i){
+	    					result.add(_l.get(i));
+						}else{
+	    					result.add("");
+						}
+					}
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @Description 删除列表最后一个数据
+	 * @Param [o]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.07.28 15:47
+	 **/
+	public static  Object remLast(Object o){
+		if(o instanceof  List){
+		     rem(o,	((List<Object>)o).size()-1);
+		}
+		return  o;
+	}
+	/**
+	 * @Description list 转 string
+	 * @Param [o, separator:分隔符]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.07.28 15:50
+	 **/
+	public static  Object _join(Object o,Object separator){
+		StringBuilder r = new StringBuilder();
+		if(o instanceof  List){
+			if(null==separator){
+				separator=space(1);
+			}
+			for(Object e:(List<Object>)o){
+				if(StringUtils.isNotEmpty(e)){
+					r.append(handleNull(e)).append(separator);
+				}
+			}
+		}else if(StringUtils.isNotEmpty(o)){
+			r.append(o).append(",");
+		}
+		if(r.length()>0){
+			r.deleteCharAt(r.length()-1);
+		}
+		return  r;
+	}
+	public static  Object __join(Object ...args){
+		StringBuilder r = new StringBuilder();
+		if(args!=null){
+			if(args.length>=2){
+				String separator=handleNull(args[args.length-1]);
+				for(int i=0;i<args.length-1;i++){
+					r.append(_join(args[i],separator)).append(separator);
+				}
+				if(r.length()>0){
+					r.deleteCharAt(r.length()-1);
+				}
+			}else{
+               return _join(args[0],"、");
+			}
+		}
+		return  r.toString();
+	}
+	public static  Object join(Object o1,Object o2,Object o3,Object separator){
+		return __join(o1,o2,o3,separator);
+	}
+	public static  Object join(Object o1,Object o2,Object separator){
+		return __join(o1,o2,separator);
+	}
+	public static  Object join(Object o1,Object separator){
+		return __join(o1,separator);
+	}
+	public static  Object join(Object o1){
+		return __join(o1);
+	}
+	/**
+	 * @Description String 转List
+	 * @Param [o, separator]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2021.12.03 15:09
+	 **/
+	public static  Object split(Object o,Object separator){
+		 if(StringUtils.isNotEmpty(o,separator)){
+			 System.out.println(separator);
+		 	String[] arr = o.toString().split(separator.toString());
+		    return 	Arrays.stream(arr).collect(Collectors.toList());
+		 }
+         return null;
+	}
+	public static  Object split(Object o){
+		return split(o,"/|,|、|,|;|;|\\\\|(\\s+)");
+	}
+
+	/**
+	 * @Description  删除下标为index的元素
+	 * @Param [o, index]
+	 * @return void
+	 * @Author yangyj
+	 * @Date 2021.07.28 15:52
+	 **/
+	public static  void rem(Object o,Object index){
+		if(o instanceof  List&&StringUtils.isNumber(index)){
+			((List<Object>)o).remove(StringUtils.handleObj2Integer(index).intValue());
+		}
+	}
+
+	/**
+	 * @Description  根据百分比返回子集list内容
+	 * @Param [obj:数据源, percent:0-100]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2020.12.04 09:24
+	 **/
+	public  static Object getListPercent(Object obj,Object percent){
+		if(obj!=null&&percent!=null){
+			if(obj instanceof  List){
+				ArrayList<Object> list = (ArrayList<Object>) obj;
+				Collections.shuffle(list);
+				int n = (int) Math.round((Double.parseDouble(percent.toString())/100)*list.size());
+				if(n<=list.size()){
+					return  list.subList(0,n);
+				}
+				return list;
+			}
+		}
+		return "";
+	}
+
+
+
+	public static Object  doForTableList(Object ot,Object type){
+		if(ot!=null){
+			//记录表46:构造深度平均值
+			if(type.toString().equals("0")){
+				List<Object>  datas = new ArrayList<Object>();
+				if(ot instanceof  HashMap){
+					HashMap mp = (HashMap) ot;
+					if(mp.size()>0){
+						datas.add(mp.get("TdGZSD"));
+					}
+				}else if(ot instanceof  ArrayList){
+					ArrayList<HashMap<String,Object>> list = (ArrayList<HashMap<String, Object>>) ot;
+					if(ListUtils.isNotEmpty(list)){
+						for(HashMap<String, Object> ob:list){
+							datas.add(ob.get("TdGZSD"));
+						}
+					}
+				}
+				return  avg(1,datas);
+			}
+
+		}
+
+		return  null;
+	}
+
+
+
+
+	public static boolean isNumeric(String str){
+		Pattern pattern = Pattern.compile("[0-9.]*");
+		return pattern.matcher(str).matches();
+	}
+
+
+
+	/**
+	 * @Description  把Object 转换成 ArrayList<HashMap<String, Object>>
+	 * @Param [obj]
+	 * @return java.util.ArrayList<java.util.HashMap<java.lang.String,java.lang.Object>>
+	 * @Author yangyj
+	 * @Date 2020.12.11 09:44
+	 **/
+	public static ArrayList<HashMap<String,Object>> objToArray(Object obj){
+		if(obj instanceof  ArrayList){
+			return (ArrayList<HashMap<String, Object>>) obj;
+		}else if(obj instanceof  HashMap){
+			ArrayList<HashMap<String, Object>> array = new ArrayList<HashMap<String, Object>>();
+			HashMap<String, Object> map =	(HashMap<String, Object>) obj  ;
+			if(map.size()>0){
+				array.add(map);
+			}
+			return array;
+		}
+       return null;
+	}
+
+
+
+	/**
+	 *  @author: zhifk
+	 *  @Date:  2020/9/4 - 11:00
+	 *  @Description:
+	 *  value1:公式所在单元格的分类,value2:选择的分类,value3:从记录表获得的共检点合格点
+	 *  根据选择的分类判断是否是该分类的共检点合格点
+	 *  为:FUNC.isfenlei(TABLE['t_pf_RecordTable015']['shigongkaishiriqi'],'板拱',FORMULA[‘公式编号’])
+	 */
+	public static Object isfenlei(Object value1,Object value2,Object value3){
+		if( StringUtils.isEmpty(value1)  || StringUtils.isEmpty(value2) || StringUtils.isEmpty(value3)){
+			return null;
+		}
+		if(value1.toString().contains(value2.toString())){
+			return value3;
+		}
+		return null;
+	}
+
+
+
+	public  static Object dXd(Object design,Object data){
+		return dXd(design,data,1,getScale(design,data));
+	}
+	public  static Object dXd(Object design,Object data,Object xN){
+		int scale=0;
+		if(StringUtils.isNotEmpty(design,data,xN)){
+			 scale=getScale(design,data);
+			 scale= (int) (scale-Math.log10(Double.parseDouble(xN.toString())));
+		}
+		return dXd(design,data,xN,scale);
+	}
+	/**
+	 * @Description 求偏差公式  支持AXA-BXB=DXD或者A-B=D的格式
+	 * @Param [design:设计值, data:实测值, xN:倍率, scale:保留小数位]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.01.20 09:45
+	 **/
+	public  static Object dXd(Object design,Object data,Object xN,Object scale){
+		if(StringUtils.isNotEmpty(design,data)){
+			if(StringUtils.isEmpty(xN)){
+				xN=1;
+			}
+			if(StringUtils.isEmpty(scale)){
+				scale=0;
+			}
+			String delimiter=handleNull(matcherFindGroup("[^0-9.]",design.toString(),0,false));
+			if(StringUtils.isEmpty(delimiter)){
+				delimiter=CONCAT;
+			}
+			String[] dArr=handleNull(design).split("["+delimiter+"]");
+			String[] bArr=handleNull(data).split("["+delimiter+"]");
+			Object _dx=null;
+			for(int n=0;n<dArr.length;n++){
+				BigDecimal a = new BigDecimal(dArr[n]);
+				BigDecimal b = new BigDecimal(bArr[n]);
+				String _data=b.subtract(a).multiply(new BigDecimal(xN.toString())).setScale(Integer.parseInt(scale.toString()), ROUND_HALF_UP).toString();
+				if(StringUtils.isNotEmpty(_dx)){
+					_dx=StringUtils.join(_dx,_data,delimiter);
+				}else{
+					_dx=_data;
+				}
+			}
+			return _dx;
+		}
+		return "";
+	}
+
+
+	public  static Object over10(Object C82 ,Object C81 ,Object xmm, Object remark){
+         List<Object> list = obj2List(C82);
+         if(ListUtils.isNotEmpty(list)){
+         	if(list.stream().map(StringUtils::handleNull).anyMatch(e->e.contains(xmm.toString()))){
+				return remark;
+			}
+		 }
+		List<Object> list2 =obj2List(C81);
+		if(ListUtils.isNotEmpty(list2)){
+			return list2.stream().filter(StringUtils::isNotEmpty).map(StringUtils::handleNull).collect(Collectors.joining("、"));
+		}else{
+			return "";
+		}
+	}
+
+	/**
+	 * @Description 字符串连接
+	 * @Param [obs]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.02.12 17:21
+	 **/
+	public  static Object _concat(Object ...obs){
+		StringBuilder sb  = new StringBuilder();
+		if(obs!=null){
+			for(Object ob:obs){
+				sb.append(handleNull(ob));
+			}
+		}
+        return sb.toString();
+	}
+	public  static Object concat(Object o1,Object o2,Object o3,Object o4){
+		return _concat(o1,o2,o3,o4);
+	}
+	public  static Object concat(Object o1,Object o2,Object o3){
+		return _concat(o1,o2,o3);
+	}
+	public  static Object concat(Object o1,Object o2){
+		return _concat(o1,o2);
+	}
+	public  static Object concat(Object o1){
+		return _concat(o1);
+	}
+
+
+	/**
+	 * @Description 总体标准差
+	 * @Param [data, scale]
+	 * @return java.lang.Object
+	 * @Author yangyj
+	 * @Date 2022.04.14 11:32
+	 **/
+	public  static Object sd(Object data,Object scale){
+		if(data!=null&&StringUtils.isNumber(scale)){
+			data=removeEmpty(data);
+			List<Object> datas=obj2List(data);
+			int total=datas.size();
+			List<String> _datas=datas.stream().map(StringUtils::handleNull).collect(Collectors.toList());
+			double avgVal=_datas.stream().mapToDouble(Double::parseDouble).average().orElse(0D);
+			double result=Math.sqrt(_datas.stream().mapToDouble(Double::parseDouble).map(e->Math.pow(e-avgVal,2)).sum()/total);
+			return  StringUtils.number2String(result,scale);
+		}
+		return "";
+	}
+
+
+
+//	public static void main(String[] args)  {
+//	}
+
+}

+ 13 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -31,15 +31,24 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
      **/
     public void execute(Map variables, List<FormData> list,List<Formula> formulas ){
              Map<Boolean,List<FormData>> map = list.stream().collect(Collectors.partitioningBy(e->e!=null&&e.getFormula().getFormula().contains("E[")));
-             /*有依赖的*/
+            List<FormData>total = new ArrayList<>();
+             /*没有依赖的*/
+             List<FormData> simple=map.get(false);
+             if(CollectionUtil.isNotEmpty(simple)){
+                 total.addAll(simple);
+             }
+            /*有依赖的*/
              List<FormData> rely= map.get(true);
              if(CollectionUtil.isNotEmpty(rely)){
                   sort(rely,((rely.size()+1)/2)*rely.size());
+                  total.addAll(rely);
              }
-             /*没有依赖的*/
-             List<FormData> simple=map.get(false);
-
+            if(CollectionUtil.isNotEmpty(total)){
+                /*预处理*/
+                for(FormData fd:total){
 
+                }
+            }
     }