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

493 lines
25 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.JSON;
import com.weaver.common.form.component.base.ComponentType;
import com.weaver.excel.formula.api.entity.DataOption;
import com.weaver.excel.formula.api.entity.FormulaVar;
import com.weaver.excel.formula.entity.parameter.DataType;
import com.weaver.excel.formula.entity.parameter.ParamFactory;
import com.weaver.excel.formula.entity.standard.front.CurrentVar;
import com.weaver.teams.domain.user.DataCollectionEmployee;
import com.weaver.teams.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExcelStandardUtil {
protected static final Logger logger = LoggerFactory.getLogger(ExcelStandardUtil.class);
public static Map<String,Object> replaceAllParam(String sql, List<FormulaVar> localVars,List<FormulaVar> dataVars, DataCollectionEmployee employee){
if(null!=localVars){
for (FormulaVar formulaVar:localVars){
if(StringUtils.isNotEmpty(formulaVar.getDataId()) && StringUtils.isEmpty(formulaVar.getFormId())){
formulaVar.setFormId(formulaVar.getDataId());
}
if(StringUtils.isNotEmpty(formulaVar.getId()) && formulaVar.getId().equalsIgnoreCase("current_department")){
formulaVar.setType("department");
formulaVar.setComponentKey(ComponentType.Department.toString());
}
if(StringUtils.isNotEmpty(formulaVar.getId()) && formulaVar.getId().equalsIgnoreCase("current_superior")){
formulaVar.setType("employee");
formulaVar.setComponentKey(ComponentType.Employee.toString());
}
}
}
Map<String,Object> dataMap=new HashMap<>();
Map<String,DataType> paramKeyMap=new HashMap<>();
//正则表达式匹配所有用 { } 括号包起来的变量,然后跟参数列表中的参数一一对应做替换
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(localVars!=null&&loop<localVars.size()){
FormulaVar localFormulaVar=localVars.get(loop);
//如果参数异常获取Key为空根据数据中相应的值做判断判断是什么类型的控件
String key=null;
if(localFormulaVar.getOptionId()!=null && StringUtils.isNotEmpty(localFormulaVar.getOptionId())){
key="key"+localFormulaVar.getOptionId();
}else if(localFormulaVar.getFieldId()!=null){
key="key"+localFormulaVar.getFieldId();
}else if(localFormulaVar.getFormId()!=null){
key="key"+localFormulaVar.getFormId();
}else if(localFormulaVar.getId() !=null){
key="key"+localFormulaVar.getId();
}else if(localFormulaVar.getId()!=null && localFormulaVar.getId().equalsIgnoreCase(CurrentVar.current_user.toString())){
key="key"+localFormulaVar.getId()+"";
sql=sql.replaceFirst(matherString,key);
}else if(localFormulaVar.getId()!=null && localFormulaVar.getId().equalsIgnoreCase(CurrentVar.current_department.toString())){
key="key"+localFormulaVar.getId()+"";
sql=sql.replaceFirst(matherString,key);
}else if(localFormulaVar.getId()!=null && localFormulaVar.getId().equalsIgnoreCase(CurrentVar.current_position.toString())){
key="key"+localFormulaVar.getId()+"";
sql=sql.replaceFirst(matherString,key);
}else if(localFormulaVar.getId()!=null && localFormulaVar.getId().equalsIgnoreCase(CurrentVar.current_superior.toString())){
key="key"+localFormulaVar.getId()+"";
sql=sql.replaceFirst(matherString,key);
}
if(key!=null){
sql=sql.replaceFirst(matherString,key);
DataType dataType=transFormulaVarToDataType(localFormulaVar,dataVars,employee);
if(dataType!=null){
if(!paramKeyMap.containsKey(key)){
paramKeyMap.put(key,dataType);
}else{
logger.info("存在同名参数:"+key+"-->"+JSON.toJSONString(dataType));
}
}else{
String typeKey=localFormulaVar.getProperKey();
if(StringUtils.isNotEmpty(localFormulaVar.getFieldType())){
typeKey=localFormulaVar.getFieldType();
}else if(StringUtils.isNotEmpty(localFormulaVar.getType())){
typeKey=localFormulaVar.getType();
}else if(StringUtils.isNotEmpty(localFormulaVar.getFieldType())){
typeKey=localFormulaVar.getFieldType();
localFormulaVar.setComponentKey(localFormulaVar.getFieldType());
}
dataType.setDataType(ExcelParamUtil.findDataType(typeKey));
dataType.setFieldId(localFormulaVar.getFieldId());
dataType.setFormId(StringUtils.isNotEmpty(localFormulaVar.getFormId())?Long.parseLong(localFormulaVar.getFormId()):null);
try {
dataType.setModule(localFormulaVar.getModule());
} catch (IllegalArgumentException e) {
logger.error("err",e);
dataType.setModule(localFormulaVar.getModule());
}
dataType.setContent("");
if(!paramKeyMap.containsKey(key)){
paramKeyMap.put(key,dataType);
}else{
logger.info("存在同名参数:"+key+"-->"+JSON.toJSONString(dataType));
}
}
}
loop++;
}
}
// if(loop!=localVars.size()){
// throw new RuntimeException("参数列表与执行语句不一致");
// }
dataMap.put("param",paramKeyMap);
dataMap.put("sql",sql);
return dataMap;
}
public static Map<String,Object> replaceAllParamForTest(String sql, List<FormulaVar> formulaVars, DataCollectionEmployee employee){
if(null==formulaVars){
return null;
}
for (FormulaVar formulaVar:formulaVars){
if(StringUtils.isNotEmpty(formulaVar.getDataId()) && StringUtils.isEmpty(formulaVar.getFormId())){
formulaVar.setFormId(formulaVar.getDataId());
if(StringUtils.isNotEmpty(formulaVar.getType()) && StringUtils.isEmpty(formulaVar.getComponentKey())){
if(formulaVar.getType().equalsIgnoreCase("operator") || formulaVar.getType().equalsIgnoreCase("employee")){
formulaVar.setComponentKey("");
}
}
}
if(StringUtils.isNotEmpty(formulaVar.getId()) && formulaVar.getId().equalsIgnoreCase("current_department")){
formulaVar.setType("department");
formulaVar.setComponentKey("Department");
}
if(StringUtils.isNotEmpty(formulaVar.getId()) && formulaVar.getId().equalsIgnoreCase("current_superior")){
formulaVar.setType("employee");
formulaVar.setComponentKey("Employee");
}
}
Map<String,Object> dataMap=new HashMap<>();
Map<String,DataType> paramKeyMap=new HashMap<>();
//正则表达式匹配所有用 { } 括号包起来的变量,然后跟参数列表中的参数一一对应做替换
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为空根据数据中相应的值做判断判断是什么类型的控件
String key=null;
if(formulaVar.getOptionId()!=null && StringUtils.isNotEmpty(formulaVar.getOptionId())){
key="key"+formulaVar.getOptionId();
sql=sql.replaceFirst(matherString,key);
}else if(formulaVar.getFieldId()!=null){
key="key"+formulaVar.getFieldId();
sql=sql.replaceFirst(matherString,key);
}else if(formulaVar.getFormId()!=null){
key="key"+formulaVar.getFormId()+"";
sql=sql.replaceFirst(matherString,key);
}else if(StringUtils.isNotEmpty(formulaVar.getFieldType())){
if(formulaVar.getFieldType().equalsIgnoreCase("option")){
key="key"+formulaVar.getId()+"";
sql=sql.replaceFirst(matherString,key);
}
}else if(formulaVar.getId()!=null){
if(formulaVar.getId().equalsIgnoreCase("current_user") || formulaVar.getId().equalsIgnoreCase("current_superior") || formulaVar.getId().equalsIgnoreCase("current_department")){
key="key"+formulaVar.getId()+"";
sql=sql.replaceFirst(matherString,key);
}else if(formulaVar.getType()!=null && formulaVar.getType().equalsIgnoreCase("department")){
key="key"+formulaVar.getId()+"";
sql=sql.replaceFirst(matherString,key);
//人员选项常量
}else if(formulaVar.getType()!=null && formulaVar.getType().equalsIgnoreCase("employee")){
key="key"+formulaVar.getId()+"";
sql=sql.replaceFirst(matherString,key);
}
}else if(StringUtils.isNotEmpty(formulaVar.getType())){
/**
* 部门选项常量
*/
if(formulaVar.getType().equalsIgnoreCase("department")){
key="key"+formulaVar.getId()+"";
sql=sql.replaceFirst(matherString,key);
//人员选项常量
}else if(formulaVar.getType().equalsIgnoreCase("employee")){
key="key"+formulaVar.getId()+"";
sql=sql.replaceFirst(matherString,key);
}
}
if(key!=null){
if(!paramKeyMap.containsKey(key)){
paramKeyMap.put(key,transFormulaVarToDataTypeTesy(formulaVar,employee));
}
}
loop++;
}
}
if(loop!=formulaVars.size()){
throw new RuntimeException("参数列表与执行语句不一致");
}
dataMap.put("param",paramKeyMap);
dataMap.put("sql",sql);
logger.info("函数校验参数:"+JSON.toJSONString(dataMap));
return dataMap;
}
private static DataType transFormulaVarToDataTypeTesy(FormulaVar formulaVar,DataCollectionEmployee employee){
DataType dataType =new DataType();
ParamFactory paramFactory=ParamFactory.getInstance();
dataType.setContent(formulaVar.getContent());
dataType.setText(formulaVar.getContent());
String typeKey=formulaVar.getProperKey();
if(StringUtils.isNotEmpty(formulaVar.getFieldType()) && StringUtils.isEmpty(typeKey)){//选项型取值
typeKey=formulaVar.getFieldType();
}else if(StringUtils.isNotEmpty(formulaVar.getType()) && StringUtils.isEmpty(typeKey)){//当前操作人取值
typeKey=formulaVar.getType();
}else if(StringUtils.isNotEmpty(formulaVar.getFieldType()) && StringUtils.isEmpty(typeKey)){
typeKey=formulaVar.getFieldType();
formulaVar.setComponentKey(formulaVar.getFieldType());
}
switch (ExcelParamUtil.findDataType(typeKey)){
case DataType.DATE:
dataType.setContent(paramFactory.getDateTimeValue());
dataType.setText(paramFactory.getDateTimeValue());
dataType.setDataType(DataType.STRING);
dataType.setComponentKey("DateComponent");
break;
case DataType.STRING:
dataType.setContent(paramFactory.getCharValue());
dataType.setText(paramFactory.getCharValue());
dataType.setDataType(DataType.STRING);
dataType.setComponentKey("Text");
break;
case DataType.NUMBER:
dataType.setContent(paramFactory.getDoubleValue());
dataType.setText(paramFactory.getDoubleValue()+"");
dataType.setDataType(DataType.NUMBER);
dataType.setComponentKey("NumberComponent");
break;
case DataType.OPTION:
dataType.setContent(paramFactory.getSelectValue());
dataType.setText(paramFactory.getSelectValue());
dataType.setScore(paramFactory.getDoubleValue());
dataType.setDataType(DataType.OPTION);
if(formulaVar.getType()!=null && (formulaVar.getType().equalsIgnoreCase("employee") || formulaVar.getType().equalsIgnoreCase("operator")) || (formulaVar.getProperKey()!=null && formulaVar.getProperKey().equalsIgnoreCase("employee"))){
dataType.setContent(employee.getId());
dataType.setComponentKey("Employee");
if(formulaVar.getId()!=null && formulaVar.getId().equalsIgnoreCase("current_superior")){
dataType.setContent(employee.getSuperiorId());
}
}else if(formulaVar.getType()!=null && (formulaVar.getType().equalsIgnoreCase(ComponentType.Department.toString()) || formulaVar.getType().equalsIgnoreCase(ComponentType.Department.toString())) || (formulaVar.getProperKey()!=null && formulaVar.getProperKey().equalsIgnoreCase(ComponentType.Department.toString()))){
dataType.setContent(employee.getDepartmentId());
dataType.setComponentKey("Department");
}else{
if(formulaVar.getFieldType()!=null && formulaVar.getFieldType().equalsIgnoreCase("Employee")){
formulaVar.setComponentKey("Employee");
dataType.setComponentKey("Employee");
}else{
dataType.setComponentKey("RadioBox");
}
}
break;
case DataType.DATASOURCE:
dataType.setContent(paramFactory.getSelectValue());
dataType.setText(paramFactory.getSelectValue());
dataType.setScore(paramFactory.getDoubleValue());
dataType.setDataType(DataType.OPTION);
dataType.setComponentKey("RadioBox");
break;
default:
break;
}
if(StringUtils.isNotEmpty(formulaVar.getDataType())){
dataType.setDataType(formulaVar.getDataType());
}
dataType.setFieldId(formulaVar.getFieldId()+"");
dataType.setFormId(formulaVar.getFormId()!=null?Long.parseLong(formulaVar.getFormId()):null);
dataType.setEmployee(employee);
if(StringUtils.isNotEmpty(formulaVar.getModule())){
try {
try {
dataType.setModule(formulaVar.getModule());
} catch (IllegalArgumentException e) {
logger.error("err",e);
dataType.setModule(formulaVar.getModule());
}
} catch (IllegalArgumentException e) {
logger.error("err",e);
dataType.setModule(formulaVar.getModule());
}
}
dataType.setName(formulaVar.getTitle());
if(StringUtils.isEmpty(dataType.getName())){
dataType.setName(formulaVar.getName());
}
return dataType;
}
private static DataType transFormulaVarToDataType(FormulaVar localFormulaVar,List<FormulaVar> dataVars,DataCollectionEmployee employee){
DataType dataType =new DataType();
if(localFormulaVar == null){
return null;
}
String typeKey=localFormulaVar.getProperKey();
if(StringUtils.isNotEmpty(localFormulaVar.getFieldType())){
typeKey=localFormulaVar.getFieldType();
}else if(StringUtils.isNotEmpty(localFormulaVar.getType())){
typeKey=localFormulaVar.getType();
}else if(StringUtils.isNotEmpty(localFormulaVar.getFieldType())){
typeKey=localFormulaVar.getFieldType();
localFormulaVar.setComponentKey(localFormulaVar.getFieldType());
}
logger.info(localFormulaVar.getId()+"typeKey=:"+typeKey);
switch (ExcelParamUtil.findDataType(typeKey)){
case DataType.DATE:
dataType.setDataType(DataType.STRING);
setContent(dataType,typeKey,localFormulaVar.getFieldId(),dataVars,"field");
if(dataType.getContent()==null){
dataType.setContent("");
}
break;
case DataType.STRING:
dataType.setDataType(DataType.STRING);
setContent(dataType,typeKey,localFormulaVar.getFieldId(),dataVars,"field");
if(dataType.getContent()==null){
dataType.setContent("");
}
break;
case DataType.NUMBER:
dataType.setDataType(DataType.NUMBER);
setContent(dataType,typeKey,localFormulaVar.getFieldId(),dataVars,"field");
break;
case DataType.OPTION:
logger.info("函数构建选项型:"+JSON.toJSONString(localFormulaVar));
dataType.setDataType(DataType.OPTION);
setContent(dataType,typeKey,localFormulaVar.getFieldId(),dataVars,"option");
if(dataType.getContent() == null){
dataType.setContent(localFormulaVar.getId()!=null?localFormulaVar.getId():localFormulaVar.getOptionId());
dataType.setText(dataType.getContent()+"");
}
//当前操作人赋值
if(localFormulaVar.getId()!=null){
switch (localFormulaVar.getId()){
case "current_user":
dataType.setContent(employee.getId());
dataType.setOptionContent(employee.getName());
break;
case "current_superior":
dataType.setContent(employee.getSuperiorId());
break;
case "current_department":
dataType.setContent(employee.getDepartmentId());
break;
case "current_position":
dataType.setContent(employee.getPositionId());
break;
default:
break;
}
logger.info("当前操作人赋值完成:"+JSON.toJSONString(dataType));
}
break;
case DataType.DATASOURCE:
dataType.setDataType(DataType.DATASOURCE);
setContent(dataType,typeKey,localFormulaVar.getFieldId(),dataVars,"option");
break;
default:
logger.info("未匹配到参数类型:"+(JSON.toJSONString(localFormulaVar)));
break;
}
if(StringUtils.isNotEmpty(localFormulaVar.getDataType())){
dataType.setDataType(localFormulaVar.getDataType());
}
if(StringUtils.isEmpty(dataType.getComponentKey())){
if(StringUtils.isNotEmpty(localFormulaVar.getFieldType())){
dataType.setComponentKey(localFormulaVar.getFieldType());
}else if(StringUtils.isNotEmpty(localFormulaVar.getProperKey())){
dataType.setComponentKey(localFormulaVar.getProperKey());
}else if(StringUtils.isNotEmpty(localFormulaVar.getComponentKey())){
dataType.setComponentKey(localFormulaVar.getComponentKey());
}
}
dataType.setFieldId(localFormulaVar.getFieldId()+"");
dataType.setFormId(localFormulaVar.getFormId()!=null?Long.parseLong(localFormulaVar.getFormId()):null);
dataType.setEmployee(employee);
if(StringUtils.isNotEmpty(localFormulaVar.getModule())){
try {
dataType.setModule(localFormulaVar.getModule());
} catch (IllegalArgumentException e) {
logger.error("err",e);
dataType.setModule(localFormulaVar.getModule());
}
}
dataType.setName(localFormulaVar.getTitle()!=null?localFormulaVar.getTitle():localFormulaVar.getName());
logger.info("构建值完毕:"+JSON.toJSONString(dataType));
return dataType;
}
private static void setContent(DataType dataType,String typeKey,String sourceVar,List<FormulaVar> targetVarList,String type){
if(sourceVar==null){
return ;
}
for (FormulaVar loopVar:targetVarList){
switch (type){
case "field":
if(sourceVar.equalsIgnoreCase(loopVar.getFieldId())){
dataType.setContent(loopVar.getContent()!=null?loopVar.getContent():"");
dataType.setText(dataType.getContent()+"");
if(StringUtils.isNotEmpty(loopVar.getsFormId())){
dataType.setSubFormId(Long.parseLong(loopVar.getsFormId()));
}
dataType.setComponentKey(loopVar.getComponentKey());
}else{
dataType.setComponentKey(typeKey);
}
break;
case "form":
if(sourceVar.equalsIgnoreCase(loopVar.getFormId())){
dataType.setContent(loopVar.getContent());
}
break;
case "option":
if(sourceVar.equalsIgnoreCase(loopVar.getFieldId())){
dataType.setContent(loopVar.getContent());
if(dataType.getContent()==null){
dataType.setContent(loopVar.getOptionId());
dataType.setText(loopVar.getOptionId());
}
//常量
if(StringUtils.isNotEmpty(loopVar.getOptionContent())){
dataType.setOptionContent(loopVar.getOptionContent());
}else if(loopVar.getDataOptionList()!=null && loopVar.getDataOptionList().size()>0){
String optionContents="";
List<DataOption> dataOptions=loopVar.getDataOptionList();
for(DataOption dataOption:dataOptions){
optionContents+=dataOption.getOptionContent()+",";
}
if(optionContents.lastIndexOf(",")>0){
optionContents=optionContents.substring(0,optionContents.lastIndexOf(","));
}
dataType.setOptionContent(optionContents);
}else {//变量
dataType.setOptionContent(loopVar.getContent());
}
dataType.setScore(loopVar.getScore());
if(StringUtils.isNotEmpty(loopVar.getsFormId())){
dataType.setSubFormId(Long.parseLong(loopVar.getsFormId()));
}
dataType.setComponentKey(loopVar.getComponentKey());
}
break;
default:
break;
}
}
}
}