weaver-hrm-salary/src/com/engine/salary/formlua/util/ExcelParamUtil.java

1126 lines
43 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.engine.salary.formlua.util;
import com.alibaba.fastjson.JSONObject;
import com.engine.salary.formlua.entity.parameter.DataType;
import com.engine.salary.formlua.entity.parameter.IllegalList;
import com.engine.salary.formlua.entity.parameter.ParamType;
import com.engine.salary.formlua.entity.standard.execute.FixFieldType;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Array;
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;
public class ExcelParamUtil {
protected static final Logger logger = LoggerFactory.getLogger(ExcelParamUtil.class);
public final static String[] NUMBERFIELD = new String[]{"NumberComponent", "Money", "Monitor", "Raty", "ProgressBar", FixFieldType.Num.toString(), DataType.NUMBER};
public final static String[] DATEFIELD = new String[]{"DateComponent", "DateInterval", "TimeComponent", DataType.DATE};
public final static String[] TEXTFIELD = new String[]{"Text", "TextArea", "Email", "Phone", "Mobile", "IDCard", "FileComponent", "SerialNumber", "PositionComponent", "Paragraph", FixFieldType.Text.toString(), DataType.STRING};
public final static String[] SELECTFIELD = new String[]{"ImageComponent", "RadioBox", "CheckBox", "Select", "ComboSelect", "ImageRadioBox", "ImageCheckBox", "TreeSelect", "MatrixComponent", FixFieldType.Select.toString(), "option", "employee", "department", "subcompany", "operator", DataType.OPTION};
public final static String[] DATASOURCEFIELD = new String[]{"Employee", "Department", "Mainline", "Task", "Document", "Workflow", "AgendaComponent", "FormComponent", "CustomerComponent", "ClueComponent", "Subcompany",
"OrderComponent", "ContactComponent", "ChanceComponent", "ProductionComponent", "ContractComponent", "ActivityComponent", "WorkreportComponent", "CompetitorComponent", "KpiFlowComponent", "Ebuilder", "QuoteComponent", "AttendComponent", "DataSource",
FixFieldType.Department.toString(), FixFieldType.Employee.toString()};
private static String[] funcArray = IllegalList.getInstance().getNameIllegalArray();
private final static String[] NUMBERCOMPONENTS = new String[]{"NumberComponent", "Money", "Raty", "ProgressBar", "Monitor"};
private static String[] numberTypes = new String[]{"Integer", "integer", "Long", "Double", "Float", "float", "int", "double", "long", "float", "bigdecimal", "BigDecimal"};
public final static String CHECKLEVEL_NULL = "NULL";
public final static String CHECKLEVEL_STRING = "STRING";
/**
* 自定义脚本生成调用的逻辑
*
* @param funcString
* @return
*/
public static String initFunc(String funcString) {
if (StringUtils.isEmpty(funcString)) {
return funcString;
}
int startIdx = funcString.indexOf("(");
int endIdx = funcString.indexOf(")");
int funcIdx = funcString.indexOf("function");
if (startIdx == -1) {
throw new RuntimeException("【语法错误】缺少左括号(");
} else if (endIdx == -1) {
throw new RuntimeException("【语法错误】缺少右括号)");
} else if (funcIdx == -1) {
throw new RuntimeException("【语法错误】缺少function关键字");
}
String funcName = funcString.substring(funcIdx + 8, startIdx).trim();
String paramStr = funcString.substring(startIdx + 1, endIdx);
if (paramStr.trim().equalsIgnoreCase("")) {
funcString += funcName + "();";
return funcString;
}
String[] paramStrArray = paramStr.split(",");
logger.info("总参数个数:" + paramStrArray.length);
String paramNames = "";
for (int i = 0; i < paramStrArray.length; i++) {
String paramName = paramStrArray[i].trim();
if (paramNames.equalsIgnoreCase("")) {
paramNames = paramName;
} else {
paramNames += "," + paramName;
}
}
funcString += funcName + "(" + paramNames + ");";
return funcString;
}
public static String initFuncOnly(String funcString) {
if (StringUtils.isEmpty(funcString)) {
return funcString;
}
int startIdx = funcString.indexOf("(");
int endIdx = funcString.indexOf(")");
int funcIdx = funcString.indexOf("function");
if (startIdx == -1) {
throw new RuntimeException("【语法错误】缺少左括号(");
} else if (endIdx == -1) {
throw new RuntimeException("【语法错误】缺少右括号)");
} else if (funcIdx == -1) {
throw new RuntimeException("【语法错误】缺少function关键字");
}
String funcName = funcString.substring(funcIdx + 8, startIdx).trim();
String paramStr = funcString.substring(startIdx + 1, endIdx);
if (paramStr.trim().equalsIgnoreCase("")) {
funcString += funcName + "();";
return funcString;
}
String[] paramStrArray = paramStr.split(",");
logger.info("总参数个数:" + paramStrArray.length);
String paramNames = "";
for (int i = 0; i < paramStrArray.length; i++) {
String paramName = paramStrArray[i].trim();
paramName = paramName.replaceAll("int|String|Double|Float|float|double|Integer|boolean|Boolean|Object|object", "").trim();
if (paramNames.equalsIgnoreCase("")) {
paramNames = paramName;
} else {
paramNames += "," + paramName;
}
}
String func = funcName + "(" + paramNames + ");";
return func;
}
/**
* 判断控件所属的数据类型
*
* @param compnentKey FormField中的ComponentKey
* @return
*/
public static String findType(String compnentKey) {
List<String> numberList = Arrays.asList(NUMBERFIELD);
List<String> textList = Arrays.asList(TEXTFIELD);
List<String> selectList = Arrays.asList(SELECTFIELD);
List<String> dataSourceList = Arrays.asList(DATASOURCEFIELD);
List<String> dateList = Arrays.asList(DATEFIELD);
if (numberList.contains(compnentKey)) {
return DataType.NUMBER;
} else if (textList.contains(compnentKey)) {
return DataType.STRING;
} else if (dateList.contains(compnentKey)) {
return DataType.STRING;
} else if (selectList.contains(compnentKey)) {
return DataType.OPTION;
} else if (dataSourceList.contains(compnentKey)) {
return DataType.OPTION;
} else {
return "";
}
}
public static String findDataType(String compnentKey) {
List<String> numberList = Arrays.asList(NUMBERFIELD);
List<String> textList = Arrays.asList(TEXTFIELD);
List<String> selectList = Arrays.asList(SELECTFIELD);
List<String> dataSourceList = Arrays.asList(DATASOURCEFIELD);
List<String> dateList = Arrays.asList(DATEFIELD);
if (numberList.contains(compnentKey)) {
return DataType.NUMBER;
} else if (textList.contains(compnentKey)) {
return DataType.STRING;
} else if (dateList.contains(compnentKey)) {
return DataType.STRING;
} else if (selectList.contains(compnentKey)) {
return DataType.OPTION;
} else if (dataSourceList.contains(compnentKey)) {
return DataType.OPTION;
} else {
return DataType.STRING;
}
}
public static String findTestDataType(String compnentKey) {
List<String> numberList = Arrays.asList(NUMBERFIELD);
List<String> textList = Arrays.asList(TEXTFIELD);
List<String> selectList = Arrays.asList(SELECTFIELD);
List<String> dataSourceList = Arrays.asList(DATASOURCEFIELD);
List<String> dateList = Arrays.asList(DATEFIELD);
if (numberList.contains(compnentKey)) {
return DataType.NUMBER;
} else if (textList.contains(compnentKey)) {
return DataType.STRING;
} else if (dateList.contains(compnentKey)) {
return DataType.DATE;
} else if (selectList.contains(compnentKey)) {
return DataType.OPTION;
} else if (dataSourceList.contains(compnentKey)) {
return DataType.OPTION;
} else {
return DataType.STRING;
}
}
/**
* 判断变量是否为空
*
* @param objects
* @return
*/
public static boolean checkIsNull(Object... objects) {
String checkLevel = objects[objects.length - 1].toString();
List<Object> formulavars = new ArrayList<>();
for (int i = 0; i < objects.length; i++) {
Object object = objects[i];
if (object instanceof Array) {
Object[] subArray = (Object[]) object;
for (int j = 0; j < subArray.length; j++) {
formulavars.add(subArray[j]);
}
} else {
formulavars.add(object);
}
}
for (Object object : formulavars) {
switch (checkLevel) {
case CHECKLEVEL_NULL:
if (null == object) {
return true;
}
break;
case CHECKLEVEL_STRING:
if (null == object) {
return true;
}
if (object instanceof String || object instanceof Character) {
if (object.toString().trim().equals("")) {
return true;
}
}
break;
}
}
return false;
}
/**
* 替换所有中文参数为Key
*
* @param sql
* @param replaceArray
* @return
*/
public static String replaceAllParam(String sql, String[] replaceArray) {
String partternStr = "\\{.+?\\}{1}?";
Pattern pt = Pattern.compile(partternStr);
Matcher matcher = pt.matcher(sql);
int loop = 0;
while (matcher.find()) {
String matherString = matcher.group();
matherString = matherString.replaceAll("(\\{|\\})", "");
String replaceStr = replaceArray[loop];
sql = sql.replaceFirst(matherString, replaceStr);
loop++;
}
return sql;
}
/**
* 找到聚合函数的条件参数
*
* @param sql
* @return
*/
public static List<String> findAggParam(String sql) {
List<String> list = new LinkedList<>();
String partternStr = "(COUNT|SUM|MIN|MAX|AVG){1}\\(+.+?\\)+";
Pattern pt = Pattern.compile(partternStr);
Matcher matcher = pt.matcher(sql);
while (matcher.find()) {
String aggStr = matcher.group();
aggStr = aggStr.replaceAll("(COUNT|SUM|MIN|MAX|AVG){1}", "");
String[] paramArray = aggStr.split(",", 2);
if (paramArray.length == 2) {
String cndParam = paramArray[1];
cndParam = cndParam.substring(0, cndParam.length() - 1);
list.add(cndParam);
}
}
return list;
}
/**
* 替换聚合函数的条件参数,一般是从规则库返回过来的条件语句
*
* @param sql
* @param replaceArray
* @return
*/
public static String replaceAggParam(String sql, List<String> replaceArray) {
String partternStr = "(COUNT|SUM|MIN|MAX|AVG){1}\\(.+?\\){1}?";
Pattern pt = Pattern.compile(partternStr);
Matcher matcher = pt.matcher(sql);
String paramPattStr = "\\(.+?\\){1}?";
Pattern ppatt = Pattern.compile(paramPattStr);
int loop = 0;
while (matcher.find()) {
String matherString = matcher.group();
String[] paramStrArray = matherString.replaceAll("(\\(|\\))", "").split(",");
String newmatherString = matherString.replace(paramStrArray[1], "{" + replaceArray.get(loop) + "}");
sql = sql.replace(matherString, newmatherString);
loop++;
}
return sql;
}
// public static void checkParamArrayDataType(List<FormulaVar> formulavars) {
// for (FormulaVar formulaVar : formulavars) {
// if (formulaVar.getComponentKey() != null && !formulaVar.getComponentKey().equals("")) {
// String componentKey = formulaVar.getComponentKey();
// Arrays.sort(NUMBERCOMPONENTS);
// int searchIdx = Arrays.binarySearch(NUMBERCOMPONENTS, componentKey);
// if (searchIdx >= 0) {
// formulaVar.setFieldType("Number");
// }
// Arrays.sort(ReturnType.CHECK_TYPE);
// if (Arrays.binarySearch(ReturnType.CHECK_TYPE, componentKey) >= 0) {
// formulaVar.setFieldType("String");
// }
// if (formulaVar.getOptionId() != null) {
// formulaVar.setFieldType("String");
// }
// }
//
// }
// }
/**
* 替换语句中的参数为参数列表中的Key
*
* @param sql
* @param formulaVars
* @return
*/
// public static String replaceAllParam(String sql, List<FormulaVar> formulaVars) {
// if (null == formulaVars) {
// return sql;
// }
// //正则表达式匹配所有用 { } 括号包起来的变量,然后跟参数列表中的参数一一对应做替换
// String partternStr = "\\{.+?\\}{1}?";
// Pattern pt = Pattern.compile(partternStr);
// Matcher matcher = pt.matcher(sql);
//
// int loop = 0;
// //替换逻辑
// while (matcher.find()) {
// String matherString = matcher.group();
// //替换特殊字符
// matherString = matherString.replace("{", "");
// matherString = matherString.replace("}", "");
// matherString = matherString.replace("(", "\\(");
// matherString = matherString.replace(")", "\\)");
// matherString = matherString.replaceAll("\\+", "\\\\+");
// matherString = matherString.replaceAll("\\-", "\\\\-");
// matherString = matherString.replaceAll("\\*", "\\\\*");
// matherString = matherString.replaceAll("\\/", "\\\\/");
// if (formulaVars != null && loop < formulaVars.size()) {
// FormulaVar formulaVar = formulaVars.get(loop);
// //如果参数异常获取Key为空根据数据中相应的值做判断判断是什么类型的控件
// if (formulaVar.getKey() == null) {
// //表格类型变量替换
// if (formulaVar.getFormId() != null && formulaVar.getFieldId() == null) {
// sql = sql.replaceFirst(matherString, formulaVar.getFormId().toString());
// //普通变量的替换
// } else if (formulaVar.getFormId() != null && formulaVar.getFieldId() != null && formulaVar.getOptionId() == null) {
// sql = sql.replaceFirst(matherString, formulaVar.getFieldId().toString());
// } else if (formulaVar.getOptionId() != null) {
// //选项型变量的替换是用optionID
// sql = sql.replaceFirst(matherString, formulaVar.getOptionId().toString());
// } else {
// sql = sql.replaceFirst(matherString, formulaVar.getOptionId().toString());
// }
// } else {
// //普通变量的替换是用Key
// sql = sql.replaceFirst(matherString, formulaVar.getKey());
// }
// loop++;
// }
// }
//
// ExcelParamUtil.findAggParam(sql);
//
// if (loop != formulaVars.size()) {
// throw new RuntimeException("参数列表与执行语句不一致");
// }
// return sql;
// }
/**
* 替换参数
*
* @param sourceString
* @return
*/
public static String replaceParam(String sourceString) {
String formatStr = sourceString.replace("&gt;", ">")
.replace("&lt;", "<");
return formatStr;
}
/**
* 过滤 除了数字外的其他参数类型
*
* @param param
* @return
*/
public static boolean inNumber(Object param) {
boolean r = false;
Class[] paramClasses = new Class[]{Integer.class, Double.class, Float.class, Long.class, Short.class};
for (int i = 0; i < paramClasses.length; i++) {
if ((param.equals(paramClasses[i].getName())) || (param.equals(getParamType(paramClasses[i].getName())))) {
r = true;
break;
}
}
return r;
}
/**
* 获取参数名
*
* @param typeAllName
* @return
*/
public static String getParamType(String typeAllName) {
int fnameIdx = typeAllName.lastIndexOf(".");
typeAllName = typeAllName.substring(fnameIdx + 1);
List<String> numberList = Arrays.asList(numberTypes);
if (typeAllName.equals("Character")) {
return "String";
} else if (numberList.contains(typeAllName.toLowerCase())) {
return "Number";
}
return typeAllName;
}
/**
* 获取参数类型
*
* @param
* @return
*/
public static String getParamType(Object dataType) {
if (dataType instanceof DataType) {
DataType data = (DataType) dataType;
String filedType = data.getDataType();
filedType = filedType.toLowerCase();
switch (filedType) {
case "number":
filedType = ParamType.DOUBLE.getName();
break;
case "string":
filedType = ParamType.STRING.getName();
break;
case "boolean":
filedType = ParamType.BOOLEAN.getName();
break;
case "select":
filedType = ParamType.STRING.getName();
break;
case "text":
filedType = ParamType.STRING.getName();
break;
case "employee":
filedType = ParamType.STRING.getName();
break;
case "department":
filedType = ParamType.STRING.getName();
break;
case "integer":
filedType = ParamType.DOUBLE.getName();
break;
case "double":
filedType = ParamType.DOUBLE.getName();
break;
case "float":
filedType = ParamType.DOUBLE.getName();
break;
case "int":
filedType = ParamType.DOUBLE.getName();
break;
case "long":
filedType = ParamType.DOUBLE.getName();
break;
case "bigdecimal":
filedType = ParamType.DOUBLE.getName();
break;
}
return filedType;
} else {
return getParamType(dataType.getClass().getName());
}
}
/**
* 从DataType中获取值
*
* @param object
* @return
*/
public static List getParamContent(Object object) {
List<Object> dataList = new ArrayList<>();
if (object != null) {
if (object instanceof DataType) {
DataType data = (DataType) object;
dataList.add(getDataTypeContent(data));
return dataList;
} else if (object instanceof List) {
List<Object> sourceDataList = (List) object;
for (Object paramObj : sourceDataList) {
if (paramObj instanceof DataType) {
DataType pramDataType = (DataType) paramObj;
dataList.add(pramDataType.getContent());
} else {
dataList.add(paramObj);
}
}
return dataList;
} else if (object instanceof Object[]) {
Object[] sourceDataList = (Object[]) object;
for (Object paramObj : sourceDataList) {
if (paramObj instanceof DataType) {
DataType pramDataType = (DataType) paramObj;
dataList.add(pramDataType.getContent());
} else {
dataList.add(paramObj);
}
}
return dataList;
} else {
dataList.add(object);
return dataList;
}
}
dataList.add(object);
return dataList;
}
public static Object getDataTypeContent(DataType dataType) {
String properType = "";
Object content = null;
if (StringUtils.isNotEmpty(dataType.getComponentKey())) {
properType = dataType.getComponentKey();
} else if (StringUtils.isNotEmpty(dataType.getDataType())) {
properType = dataType.getDataType();
}
switch (findType(properType)) {
case DataType.NUMBER:
case DataType.STRING:
case DataType.DATE:
content = dataType.getContent();
break;
case DataType.OPTION:
content = dataType.getContent();
break;
}
return content;
}
/**
* 获取JSON的content内容
*
* @param object
* @return
*/
public static Object getParamContent(Object object, String funcType) {
Object result = null;
if (object instanceof DataType) {
DataType dataType = (DataType) object;
switch (dataType.getDataType()) {
case DataType.DATE:
if (dataType.getContent() == null || dataType.getContent().equals("")) {
return "";
}
String format = DateUtil.buildFormat(dataType.getContent().toString());
SimpleDateFormat formatter = new SimpleDateFormat(format);
try {
Date date = formatter.parse(dataType.getContent().toString());
result = funcType.equalsIgnoreCase("string") ? dataType.getContent() : date.getTime();
} catch (ParseException e) {
logger.error("err", e);
}
break;
case DataType.NUMBER:
if (null == dataType.getContent() || dataType.getContent().equals("")) {
return 0;
}
if (funcType.equalsIgnoreCase("string")) {
result = dataType.getContent();
} else {
if (!RegularUtil.isNumber(dataType.getContent())) {
return 0;
}
if (dataType.getContent().toString().indexOf(".") >= 0) {
// result=Double.parseDouble(dataType.getContent().toString());
result = new BigDecimal(dataType.getContent().toString());
} else if (dataType.getContent().toString().length() <= 9) {
result = Integer.parseInt(dataType.getContent().toString());
} else {
result = Long.parseLong(dataType.getContent().toString());
}
}
break;
case DataType.STRING:
if (null == dataType.getContent()) {
result = "";
} else {
result = dataType.getContent().toString().trim();
}
break;
case DataType.OPTION:
if (funcType.equalsIgnoreCase("string")) {
if (StringUtils.isNotEmpty(dataType.getOptionContent())) {
result = dataType.getOptionContent();
} else {
result = "";
}
} else {
result = dataType.getContent();
}
break;
case DataType.BOOL:
result = dataType.getContent();
break;
default:
if (dataType.getContent() == null) {
return "";
}
result = dataType.getContent().toString();
break;
}
} else if (object instanceof Date) {
Date date = (Date) object;
result = date.getTime();
} else {
if (funcType.equalsIgnoreCase(DataType.BOOL)) {
result = object == null ? false : object;
} else if (object instanceof Boolean) {
result = object;
} else if (object instanceof Integer || object instanceof Double || object instanceof Long || object instanceof BigDecimal) {
result = object;
} else {
result = object == null ? "" : object + "";
}
}
return result;
}
/**
* 获取参数的数据类型从DataType中获取或者直接获取
*
* @param object
* @return
*/
public static String checkParamType(Object object) {
String typeName = null;
if (object instanceof DataType) {
DataType dataType = (DataType) object;
typeName = dataType.getDataType();
} else {
typeName = ExcelParamUtil.getParamType(object.getClass().getName());
}
return typeName;
}
// /**
// * 运行公式时的参数设置
// *
// * @param formulavars
// * @param expressMap
// * @return
// */
// public static Map<String, Object> buildParam(List<FormulaVar> formulavars, Map<String, Object> expressMap) {
// checkParamArrayDataType(formulavars);//检查控件类型,设置相应控件对应的数据类型
// for (FormulaVar formulaVar : formulavars) {
// DataType dataType = new DataType();
// String key = null;
// if (formulaVar.getFormId() != null && formulaVar.getFieldId() == null) {
// key = "form" + formulaVar.getFormId();
// } else if (formulaVar.getFieldId() != null && formulaVar.getOptionId() == null) {
// String fieldId = formulaVar.getFieldId().toString();
// key = "field" + fieldId;
// dataType.setFieldId(fieldId);
// } else if (formulaVar.getOptionId() != null) {
// key = "option" + formulaVar.getOptionId();
// dataType.setContent(formulaVar.getOptionId());
// } else {
// key = "option" + formulaVar.getOptionId();
// }
//
// Arrays.sort(funcArray);
// int sidx = Arrays.binarySearch(funcArray, key);
// if (sidx >= 0) {
// throw new RuntimeException("变量名非法");
// }
// if (formulaVar.getOptionId() != null) {
// dataType.setDataType(DataType.OPTION);
// }
// if (expressMap.containsKey(key)) {
// String newKey = ExcelParamUtil.randomNumber() + "_" + key;
// expressMap.put(newKey, dataType);
// formulaVar.setKey(newKey);
// } else {
// expressMap.put(key, dataType);
// }
// }
//
// return expressMap;
// }
//
// /***
// * 验证函数时构建参数设置参数值
// * 把FormulaVar类型的参数封装成DataType类型参数
// * @param formulavars 入参类型
// * @param expressMap 返回Map
// * @return
// */
// public static Map buildLocalParam(List<FormulaVar> formulavars, Map<String, Object> expressMap, DataCollectionEmployee employee) {
//
// checkParamArrayDataType(formulavars);//检查控件类型,设置相应控件对应的数据类型
// for (FormulaVar formulaVar : formulavars) {
// DataType dataType = new DataType();
// dataType.setScore(0d);
// dataType.setName((null == formulaVar.getName() || formulaVar.getName().equals("")) ? formulaVar.getParent() : formulaVar.getName());
// dataType.setFieldId(formulaVar.getFieldId() != null ? formulaVar.getFieldId().toString() : null);
// String key = null;
// if (formulaVar.getModule() != null && !formulaVar.getModule().equals("")) {
// try {
// dataType.setModule(formulaVar.getModule());
// } catch (IllegalArgumentException e) {
// logger.error("err", e);
// dataType.setModule(formulaVar.getModule());
// }
// }
// dataType.setFormId(formulaVar.getFormId() != null ? Long.parseLong(formulaVar.getFormId()) : null);
// if (formulaVar.getName() != null && formulaVar.getName().equals("当前操作人")) {
// key = formulaVar.getKey();
// formulaVar.setContent(employee.getUserId().toString());
// dataType.setContent(formulaVar.getContent());
// dataType.setText(formulaVar.getContent());
// dataType.setDataType(DataType.OPTION);
// } else {
// if (formulaVar.getFormId() != null && formulaVar.getFieldId() == null && formulaVar.getOptionId() == null) {
// key = "form" + formulaVar.getFormId().toString();
// ThreadLocalData threadLocalData = new ThreadLocalData();
// threadLocalData.setEmployee(employee);
// threadLocalData.setModuleSource(ModuleSource.biaoge);
// ParamContext.get().setValue(formulaVar.getFormId().toString(), threadLocalData);
// } else if (formulaVar.getFieldId() != null && formulaVar.getOptionId() == null) {
// String fieldId = formulaVar.getFieldId().toString();
// key = "field" + fieldId;
// dataType.setFieldId(fieldId);
// } else if (formulaVar.getOptionId() != null) {
// key = "option" + formulaVar.getOptionId().toString();
// dataType.setContent(formulaVar.getOptionId());
// dataType.setText(formulaVar.getName());
// dataType.setFormId(null);
// } else {
// key = "option" + formulaVar.getOptionId().toString();
// }
// }
//
// Arrays.sort(funcArray);
// int sidx = Arrays.binarySearch(funcArray, key);
// if (sidx >= 0) {
// throw new RuntimeException("变量名非法");
// }
// if (formulaVar.getOptionId() != null) {
// dataType.setDataType(DataType.OPTION);
// }
//
// if (StringUtils.isEmpty(dataType.getDataType())) {
// String typeKey = null;
// if (StringUtils.isNotEmpty(formulaVar.getFieldType())) {
// typeKey = formulaVar.getFieldType();
// } else if (StringUtils.isNotEmpty(formulaVar.getType())) {
// typeKey = formulaVar.getType();
// } else if (StringUtils.isNotEmpty(formulaVar.getFieldType())) {
// typeKey = formulaVar.getFieldType();
// }
// dataType.setDataType(ExcelParamUtil.findTestDataType(typeKey));
// }
// if (StringUtils.isEmpty(dataType.getComponentKey())) {
// dataType.setComponentKey(formulaVar.getComponentKey());
// }
// if (expressMap.containsKey(key)) {
// String newKey = key + ExcelParamUtil.randomNumber();
// formulaVar.setKey(newKey);
// dataType.setAggCndKey(key);
// expressMap.put(newKey, dataType);
// } else {
// expressMap.put(key, dataType);
// }
// }
//
// return expressMap;
// }
/**
* 格式化变量为数字
*
* @param
*/
public static Object convertParamValToNumber(Object op1) {
BigDecimal oop1 = new BigDecimal(ExcelParamUtil.getParamContent(op1, "string").toString());
return oop1;
}
/**
* 格式化参数
*
* @param op1
* @param op2
* @return
*/
public static List<Object> converParamValue(Object op1, Object op2) {
List<Object> list = new ArrayList<>();
if (op1 instanceof DataType) {
list.add(op1);
DataType op1Data = (DataType) op1;
if (!(op2 instanceof DataType) && op1Data.getDataType().toLowerCase().equals("date")) {
DataType dataType = new DataType();
dataType.setDataType(DataType.STRING);
dataType.setContent(op2);
list.add(dataType);
} else if (op2 instanceof DataType && op1Data.getDataType().toLowerCase().equals("date")) {
DataType dataType = (DataType) op2;
dataType.setDataType(DataType.STRING);
list.add(dataType);
} else {
list.add(op2);
}
} else if (op2 instanceof DataType) {
DataType op2Data = (DataType) op2;
if (!(op1 instanceof DataType) && op2Data.getDataType().toLowerCase().equals("date")) {
DataType dataType = new DataType();
dataType.setDataType(DataType.STRING);
dataType.setContent(op1);
list.add(dataType);
} else if (op1 instanceof DataType && op2Data.getDataType().toLowerCase().equals("date")) {
DataType dataType = (DataType) op1;
dataType.setDataType(DataType.STRING);
list.add(dataType);
} else {
list.add(op1);
}
list.add(op2);
} else {
list.add(op1);
list.add(op2);
}
return list;
}
/**
* 统一处理参数类型不一致问题
*
* @param typeName
* @return
*/
public static String checkParamType(String typeName) {
typeName = typeName.toLowerCase();
switch (typeName) {
case "option":
typeName = ParamType.STRING.getName();
break;
case "date":
typeName = DataType.STRING;
break;
case "number":
typeName = DataType.NUMBER;
break;
case "string":
typeName = ParamType.STRING.getName();
break;
case "boolean":
typeName = ParamType.BOOLEAN.getName();
break;
case "select":
typeName = ParamType.STRING.getName();
break;
case "text":
typeName = ParamType.STRING.getName();
break;
case "employee":
typeName = ParamType.STRING.getName();
break;
case "department":
typeName = ParamType.STRING.getName();
break;
case "integer":
typeName = DataType.NUMBER;
break;
case "double":
typeName = DataType.NUMBER;
break;
case "float":
typeName = DataType.NUMBER;
break;
case "int":
typeName = DataType.NUMBER;
break;
case "long":
typeName = DataType.NUMBER;
break;
case "bigdecimal":
typeName = DataType.NUMBER;
break;
}
return typeName;
}
public static String getKeyString(Object obj) {
if (obj instanceof JSONObject) {
JSONObject jsonObject = (JSONObject) obj;
return jsonObject.getString("key");
} else {
return obj.toString();
}
}
/**
* 替换变量的错误位置
*
* @param startIdx
* @param endIdx
* @param excuteStr
*/
public static Map<String, Integer> replaceErrorPlace(int startIdx, int endIdx, String errorFunc, String excuteStr, Map<String, Object> paramMap) {
Map<String, String> kvMap = loopMap(paramMap);
Map<String, Integer> replaceMap = new HashMap<>();
String excuteLeftStr = excuteStr.substring(0, startIdx);
if (!excuteLeftStr.equals("")) {
Iterator<String> wordItaretor = kvMap.keySet().iterator();
while (wordItaretor.hasNext()) {
String key = wordItaretor.next();
String name = kvMap.get(key);
if (excuteLeftStr.indexOf(key) >= 0) {
String newStr = excuteLeftStr.replaceAll(key, name);
startIdx = startIdx - (excuteLeftStr.length() - newStr.length());
}
}
}
if (kvMap.get(errorFunc) != null) {
endIdx = startIdx + kvMap.get(errorFunc).length() - 1;
} else {
endIdx = startIdx + errorFunc.length() - 1;
}
replaceMap.put("startIdx", startIdx);
replaceMap.put("endIdx", endIdx);
return replaceMap;
}
public static Map<String, String> loopMap(Map<String, Object> paramMap) {
Map<String, String> kvMap = new HashMap<>();
Set<String> set = paramMap.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
DataType dataType = (DataType) paramMap.get(key);
kvMap.put(key, dataType.getName());
}
return kvMap;
}
public static boolean isNumber(Object object) {
String type = ExcelParamUtil.getParamType(object.getClass().getName());
Arrays.sort(numberTypes);
if (Arrays.binarySearch(numberTypes, type) >= 0) {
return true;
}
return false;
}
public static String randomNumber() {
int max = 1000, min = 1;
long randomNum = System.currentTimeMillis();
int ran3 = (int) (randomNum % (max - min) + min);
return ran3 + "";
}
/**
* 长度不够则添加元素的字符串拼接
*
* @param chars 将要拼接的字符
* @param sourceStr 源字符
* @param targetLength 目标字符长度
* @param place 位置在左还是右
* @return
*/
public static String appendString(String chars, String sourceStr, int targetLength, String place) {
StringBuilder builder = new StringBuilder(sourceStr);
while (true) {
//长度相等,不做处理
if (builder.length() == targetLength) {
break;
} else if (builder.length() > targetLength) {
//源字符长度大于目标长度则截取
int length = builder.length() - targetLength;
if ("LEFT".equals(place)) {
String tempStr = builder.substring(length, builder.length());
builder.replace(0, builder.length(), tempStr);
} else {
String tempStr = builder.substring(0, targetLength);
builder.replace(0, builder.length(), tempStr);
}
break;
}
//源字符长度小于目标长度则不断拼接
if ("LEFT".equals(place)) {
builder.insert(0, chars.replaceAll(",", ""));
} else {
builder.append(chars.replaceAll(",", ""));
}
}
return builder.toString();
}
// public static FormulaVar getFixFieldVar(List<FixedField> list, String key) {
// FormulaVar formulaVar = new FormulaVar();
// for (FixedField fixedField : list) {
// if (fixedField.getKey().equals(key)) {
// Component component = (Component) fixedField.getMatchs().get(0);
// ComponentType componentType = component.getComponentKey();
// if (componentType.equals(ComponentType.Text)) {
//
// }
// }
// }
// return formulaVar;
// }
public static String findAggCndStr(String sql, Map<String, Object> paramMap) {
String partternStr = "(COUNT|SUM|MIN|MAX|AVG|count|sum|min|max)+\\(+(.)+\\)+";
Pattern pattern = Pattern.compile(partternStr);
Matcher matcher = pattern.matcher(sql);
int i = 0;
while (matcher.find()) {
String cnd = matcher.group();
String[] cndArray = cnd.split(",", 2);
if (cndArray.length == 2) {
String realCnd = cndArray[1].substring(0, cndArray[1].length() - 1);
String key = "cnd" + i + Math.abs(realCnd.hashCode()) + "";
sql = sql.replace(realCnd, key);
realCnd = realCnd.replace("{", "");
realCnd = realCnd.replace("}", "");
paramMap.put(key, realCnd);
}
i++;
}
return sql;
}
/**
* 执行语句的断句算法,通过计算小括号的数量进行断句断点的确定,然后拆分语句
*
* @param sql
*/
public static String spliteSql(String sql, Map<String, Object> paramMap) {
List<String> strList = new ArrayList<>();
int pointIdx = 0;
char[] charArray = sql.toCharArray();
int leftBrakets = 0;
char brackeLeft = '(';
char brackeRight = ')';
boolean find = false;
for (int i = 0; i < charArray.length; i++) {
char charstr = charArray[i];
if (charstr == brackeLeft) {
find = true;
leftBrakets++;
}
if (leftBrakets != 0 && charstr == brackeRight) {
leftBrakets--;
}
if (find && leftBrakets == 0) {
pointIdx = i;
break;
}
}
pointIdx += 1;
if (pointIdx == sql.length()) {
strList.add(sql.substring(0, pointIdx));
} else {
strList.add(sql.substring(0, pointIdx));
strList.add(sql.substring(pointIdx));
}
String replaceSql = "";
for (String s : strList) {
String[] cndArray = s.split("(COUNT|SUM|MIN|MAX|count|sum|min|max)");
if (cndArray.length == 2) {
if (cndArray[0].equals("")) {
replaceSql += findAggCndStr(s, paramMap);
} else {
String realCnd = s.substring(cndArray[0].length() - 1 >= 0 ? cndArray[0].length() : 0);
replaceSql += cndArray[0] + findAggCndStr(realCnd, paramMap);
}
} else {
replaceSql += findAggCndStr(s, paramMap);
}
}
sql = replaceSql;
return sql;
}
}