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 replaceAllParam(String sql, List localVars,List 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 dataMap=new HashMap<>(); Map 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"+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 replaceAllParamForTest(String sql, List 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 dataMap=new HashMap<>(); Map 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 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 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 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; } } } }