|
@@ -27,6 +27,7 @@ import org.springblade.manager.formula.impl.TableElementConverter;
|
|
|
import org.springblade.manager.mapper.FormulaMapper;
|
|
|
import org.springblade.manager.service.*;
|
|
|
import org.springblade.manager.vo.AppWbsTreeContractVO;
|
|
|
+import org.springblade.manager.vo.CurrentNode;
|
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import java.util.*;
|
|
@@ -65,10 +66,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
public final static String TABLE_LIST="TBL";
|
|
|
public final static String CHECK_ITEMS="CKI";
|
|
|
|
|
|
- public static final Pattern AP=Pattern.compile("(E|WP)\\[([^]]+)]");
|
|
|
+ public static final Pattern AP=Pattern.compile("(E|WP)\\[([^]']+)]");
|
|
|
|
|
|
public static final String IF_REG= "(?<=T\\(com.mixsmart.utils.CustomFunction\\).ifelse\\()[^,]+(?=,)";
|
|
|
- public static final Pattern IF = Pattern.compile(IF_REG);
|
|
|
+ public static final Pattern IF = Pattern.compile(IF_REG);
|
|
|
|
|
|
public static final String ELE_CODE_REG= "(?<=E\\[)[^]]+(?=\\])";
|
|
|
public static final Pattern P = Pattern.compile(ELE_CODE_REG);
|
|
@@ -94,16 +95,16 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
this.tec=tec;
|
|
|
/*初始化变量>>依赖排序>>预处理>>特殊公式>>通用公式执行>>数据格式化*/
|
|
|
this.init().sort().pre().special().calculate().format();
|
|
|
- // WbsTreeContract one= this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,tec.getNodeId()));
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public IFormulaService init() {
|
|
|
+ this.formDataMap=new HashMap<>();
|
|
|
List<FormData> list =this.tec.getFds();
|
|
|
Long contractId=this.tec.getContractId();
|
|
|
- WbsTreeContract one = this.tec.getOne();
|
|
|
- Long id =Func.isNotEmpty(one.getOldId())?Long.parseLong(one.getOldId()):one.getParentId();
|
|
|
- Long primaryKeyId=one.getPKeyId();
|
|
|
+ CurrentNode one=this.tec.getCurrentNode();
|
|
|
+ Long id =one.getId();
|
|
|
+ Long primaryKeyId=one.getPkId();
|
|
|
this.constantMap=new HashMap<>(100);
|
|
|
this.formDataList=list;
|
|
|
this.constantMap.put("contractId",contractId);
|
|
@@ -117,7 +118,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
List<WbsTreeContract> nodes = wpService.chain(contractId,id,primaryKeyId,null);
|
|
|
this.constantMap.put(CHAIN,nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
|
|
|
/*节点参数*/
|
|
|
- this.constantMap.put(WP,getWpMap(id,primaryKeyId));
|
|
|
+ this.constantMap.put(WP,getWpMap(one));
|
|
|
/*表格名称*/
|
|
|
List<AppWbsTreeContractVO> tableList =wbsTreeContractService.searchNodeAllTable(primaryKeyId.toString(), "1", contractId.toString(),info.getPId());
|
|
|
this.constantMap.put(TABLE_LIST,tableList);
|
|
@@ -161,7 +162,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
List<Map<String,Object>> textInfoMap= this.jdbcTemplate.queryForList("SELECT b.tab_id pkId, b.col_key ekey,b.col_name val ,c.init_table_name tableName " +
|
|
|
"from m_wbs_tree_contract a " +
|
|
|
"inner join m_textdict_info b on a.p_key_id=b.tab_id " +
|
|
|
- "INNER JOIN m_wbs_tree c on (a.id=c.id or a.old_id=bc.id) " +
|
|
|
+ "INNER JOIN m_wbs_tree c on (a.id=c.id or a.old_id=c.id) " +
|
|
|
"where a.p_key_id in("+ this.tec.getTableAll().stream().map(AppWbsTreeContractVO::getPKeyId).map(Func::toStr).collect(Collectors.joining(","))+") and b.type=8");
|
|
|
if(Func.isNotEmpty(textInfoMap)){
|
|
|
Map<String,List<Map<String,Object>>> tmap = textInfoMap.stream().collect(Collectors.groupingBy(m->m.get("tableName")+StringPool.COLON+m.get("ekey")));
|
|
@@ -186,14 +187,14 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
* @Author yangyj
|
|
|
* @Date 2022.10.09 11:11
|
|
|
**/
|
|
|
- public Map<String,Object> getWpMap(Long id,Long primaryKeyId){
|
|
|
+ public Map<String,Object> getWpMap(CurrentNode currentNode){
|
|
|
Map<String,Object> result = new HashMap<>(100);
|
|
|
List<WbsParam> total = new ArrayList<>();
|
|
|
- List<WbsParam> wpsPublic = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId,id));
|
|
|
+ List<WbsParam> wpsPublic = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId,currentNode.getId()));
|
|
|
if(Func.isNotEmpty(wpsPublic)){
|
|
|
total.addAll(wpsPublic);
|
|
|
}
|
|
|
- List<WbsParam> wpsPrivate = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId,primaryKeyId));
|
|
|
+ List<WbsParam> wpsPrivate = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId,currentNode.getPrivateId()));
|
|
|
if(Func.isNotEmpty(wpsPrivate)){
|
|
|
total.addAll(wpsPrivate);
|
|
|
}
|
|
@@ -246,7 +247,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
String rep =im.group();
|
|
|
Matcher fm=P.matcher(rep);
|
|
|
while (fm.find()){
|
|
|
- rep=rep.replace(fm.group(),"'+"+fm.group()+"+'");
|
|
|
+ rep=rep.replace(fm.group(),"'"+fm.group()+"'");
|
|
|
}
|
|
|
tmp=tmp.replace(im.group(),rep);
|
|
|
}
|
|
@@ -294,45 +295,50 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
Formula formula =fd.getFormula();
|
|
|
String f=formula.getFormula();
|
|
|
if(Func.isNotBlank(f)){
|
|
|
- /*聚合运算*/
|
|
|
- polymerization();
|
|
|
- Map<String, Object> currentMap = new HashMap<>(this.constantMap);
|
|
|
- List<String> relyList = fd.getFormula().getRelyList();
|
|
|
- if(CollectionUtil.isNotEmpty(relyList)){
|
|
|
- List<FormData> ele = this.formDataList.stream().filter(e->relyList.contains(e.getCode())).collect(Collectors.toList());
|
|
|
- if(ele.size()<relyList.size()){
|
|
|
- System.out.println("不满足依赖要求");
|
|
|
- }
|
|
|
- LinkedHashMap<String,FormData> fdMap =new LinkedHashMap<>();
|
|
|
- ele.forEach(e->{
|
|
|
- fdMap.put(e.getCode(),e);
|
|
|
- });
|
|
|
- CompositeDataAccess cda = new CompositeDataAccess(fdMap);
|
|
|
- List<LocalVariable> local= new ArrayList<>();
|
|
|
- while (cda.hasNext()){
|
|
|
- LinkedHashMap<String,ElementData> tip= cda.next();
|
|
|
- Map<String, Object> variable = new HashMap<>(this.constantMap);
|
|
|
- Map<String,Object> E=getMap(variable,"E");
|
|
|
- for(Map.Entry<String,ElementData> se:tip.entrySet()){
|
|
|
- E.put(se.getKey(),se.getValue().getValue());
|
|
|
+ try{
|
|
|
+ /*聚合运算*/
|
|
|
+ polymerization();
|
|
|
+ Map<String, Object> currentMap = new HashMap<>(this.constantMap);
|
|
|
+ List<String> relyList = fd.getFormula().getRelyList();
|
|
|
+ if(CollectionUtil.isNotEmpty(relyList)){
|
|
|
+ List<FormData> ele = this.formDataList.stream().filter(e->relyList.contains(e.getCode())&&e.getValues().stream().anyMatch(Func::isNotEmpty)).collect(Collectors.toList());
|
|
|
+ if(ele.size()<relyList.size()){
|
|
|
+ System.out.println(formula.getFormula()+"不满足依赖要求");
|
|
|
}
|
|
|
- local.add(new LocalVariable(0,f,variable));
|
|
|
- }
|
|
|
- if(local.size()>0){
|
|
|
- List<Object> values = slice( local,this.constantMap,f);
|
|
|
- if(values.size()>fd.getValues().size()){
|
|
|
- /*当生成的数据超过实际容量的时候,会自动合并到第一个单元格*/
|
|
|
- fd.getValues().get(0).setValue(values.stream().filter(Func::isNotEmpty).map(StringUtils::handleNull).collect(Collectors.joining("、")));
|
|
|
- }else{
|
|
|
- for(int n=0;n<values.size();n++){
|
|
|
- fd.getValues().get(n).setValue(values.get(n));
|
|
|
+ LinkedHashMap<String,FormData> fdMap =new LinkedHashMap<>();
|
|
|
+ ele.forEach(e->{
|
|
|
+ fdMap.put(e.getCode(),e);
|
|
|
+ });
|
|
|
+ CompositeDataAccess cda = new CompositeDataAccess(fdMap);
|
|
|
+ List<LocalVariable> local= new ArrayList<>();
|
|
|
+ while (cda.hasNext()){
|
|
|
+ LinkedHashMap<String,ElementData> tip= cda.next();
|
|
|
+ Map<String, Object> variable = new HashMap<>(this.constantMap);
|
|
|
+ Map<String,Object> E=getMap(variable,"E");
|
|
|
+ for(Map.Entry<String,ElementData> se:tip.entrySet()){
|
|
|
+ E.put(se.getKey(),se.getValue().getValue());
|
|
|
}
|
|
|
+ local.add(new LocalVariable(0,f,variable));
|
|
|
}
|
|
|
+ if(local.size()>0){
|
|
|
+ List<Object> values = slice(local,this.constantMap,f);
|
|
|
+ if(values.size()>fd.getValues().size()){
|
|
|
+ /*当生成的数据超过实际容量的时候,会自动合并到第一个单元格*/
|
|
|
+ fd.getValues().get(0).setValue(values.stream().filter(Func::isNotEmpty).map(StringUtils::handleNull).collect(Collectors.joining("、")));
|
|
|
+ }else{
|
|
|
+ for(int n=0;n<values.size();n++){
|
|
|
+ fd.getValues().get(n).setValue(values.get(n));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ Object data =Expression.parse(formula.getFormula()).calculate(currentMap);
|
|
|
+ write(fd,data);
|
|
|
}
|
|
|
- }else{
|
|
|
- Object data =Expression.parse(formula.getFormula()).calculate(currentMap);
|
|
|
- write(fd,data);
|
|
|
+ }catch (Exception e){
|
|
|
+ write(fd,e.getMessage());
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
/*数量不相等*/
|
|
|
fd.setUpdate(1);
|
|
@@ -353,7 +359,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
}
|
|
|
}
|
|
|
}else{
|
|
|
- if(fd.getFormula().getOutm().equals(Formula.FULL)){
|
|
|
+ if(Formula.FULL.equals(fd.getFormula().getOutm())){
|
|
|
/*填充策略*/
|
|
|
fd.getValues().forEach(e->e.setValue(data));
|
|
|
}else{
|
|
@@ -394,15 +400,24 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
|
|
|
@Override
|
|
|
public List<KeyMapper> getKeyMapperList(List<Long> ids) {
|
|
|
- List<Map<String,Object>> listMap = this.jdbcTemplate.queryForList("select b.init_table_name as tableName,a.p_key_id as pkId ,c.e_key as field,a.id as fieldId,d.scope,d.formula_id as formulaId " +
|
|
|
+// List<Map<String,Object>> listMap = this.jdbcTemplate.queryForList("select b.init_table_name as tableName,a.p_key_id as pkId ,c.e_key as field,c.id as fieldId,d.scope,d.formula_id as formulaId " +
|
|
|
+// "from m_wbs_tree_contract a " +
|
|
|
+// "INNER JOIN m_wbs_tree b on (a.old_id=b.id or a.id=b.id) " +
|
|
|
+// "INNER JOIN m_wbs_form_element c on c.f_id=b.init_table_id " +
|
|
|
+// "left JOIN m_element_formula_mapping d on c.id=d.element_id " +
|
|
|
+// "where a.p_key_id in("+ids.stream().map(String::valueOf).collect(Collectors.joining(","))+") " +
|
|
|
+// "ORDER BY b.init_table_name,d.scope");
|
|
|
+ List<Map<String,Object>> listMap = this.jdbcTemplate.queryForList(" select a.init_table_name as tableName,a.p_key_id as pkId ,c.e_key as field,c.e_name as eName,c.id as fieldId ,d.scope,d.formula_id as formulaId " +
|
|
|
"from m_wbs_tree_contract a " +
|
|
|
- "INNER JOIN m_wbs_tree b on (a.old_id=b.id or a.id=b.id) " +
|
|
|
- "INNER JOIN m_wbs_form_element c on c.f_id=b.init_table_id " +
|
|
|
- "INNER JOIN m_element_formula_mapping d on c.id=d.element_id " +
|
|
|
- "where a.p_key_id in("+ids.stream().map(String::valueOf).collect(Collectors.joining(","))+") " +
|
|
|
- "ORDER BY b.init_table_name,d.scope");
|
|
|
+ "inner join m_table_info b on a.init_table_name=b.tab_en_name " +
|
|
|
+ "INNER JOIN m_wbs_form_element c on b.id=c.f_id " +
|
|
|
+ "left join m_element_formula_mapping d on c.id=d.element_id " +
|
|
|
+ "where a.p_key_id in("+ids.stream().map(String::valueOf).collect(Collectors.joining(","))+") ORDER BY a.init_table_name,d.scope");
|
|
|
+ /*当前节点的参数可以是私有级和公有级*/
|
|
|
+
|
|
|
if(Func.isNotEmpty(listMap)){
|
|
|
- Map<Long,List<KeyMapper>> groupList= listMap.stream().map(m->BeanUtil.toBean(m, KeyMapper.class)).collect(Collectors.groupingBy(KeyMapper::getFormulaId,LinkedHashMap::new,Collectors.toList()));
|
|
|
+ /*根据元素id分组*/
|
|
|
+ Map<Long,List<KeyMapper>> groupList= listMap.stream().map(m->BeanUtil.toBean(m,KeyMapper.class)).collect(Collectors.groupingBy(KeyMapper::getFieldId,LinkedHashMap::new,Collectors.toList()));
|
|
|
Set<KeyMapper> set = new HashSet<>(groupList.size()*2);
|
|
|
for(Map.Entry<Long,List<KeyMapper>>entry:groupList.entrySet()){
|
|
|
entry.getValue().stream().max(Comparator.comparing(KeyMapper::getScope)).ifPresent(set::add);
|
|
@@ -440,7 +455,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
int min =0;
|
|
|
List<Object> result = new ArrayList<>();
|
|
|
try {
|
|
|
- /*并发执行*/
|
|
|
List<Object> r= local.stream().map(e-> Expression.parse(e.getFormula()).calculate(e.getCurrentMap())).collect(Collectors.toList());
|
|
|
if(CollectionUtil.isNotEmpty(r)&&r.stream().anyMatch(StringUtils::isNotEmpty)){
|
|
|
result.addAll(r);
|
|
@@ -491,7 +505,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
List<String> l = new ArrayList<>();
|
|
|
Matcher m = P.matcher(f.getFormula());
|
|
|
while (m.find()){
|
|
|
- l.add(m.group());
|
|
|
+ l.add(m.group().replaceAll("'",""));
|
|
|
}
|
|
|
if(l.size()>0){
|
|
|
f.setRely(String.join(",", l));
|
|
@@ -551,7 +565,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
String[] tfa=tf.split(",");
|
|
|
for(String code:tfa){
|
|
|
code=code.replace("E['","").replace("']","");
|
|
|
- target.add(this.formDataMap.get(code));
|
|
|
+ FormData fdt=this.formDataMap.get(code);
|
|
|
+ if(fdt!=null){
|
|
|
+ target.add(fdt);
|
|
|
+ }
|
|
|
}
|
|
|
if(Func.isNotEmpty(target)){
|
|
|
Object data=null;
|
|
@@ -582,6 +599,32 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+ public void batch(){
|
|
|
+ List<Map<String,Object>> list = this.jdbcTemplate.queryForList("select id,formula from m_formula where (formula like '%reasonable%' or formula like '%proportion%' or formula like '%goodSize%')");
|
|
|
+ if(ListUtils.isNotEmpty(list)){
|
|
|
+ Pattern p = Pattern.compile("^FC\\.(\\w+)\\(([^()]+)\\)");
|
|
|
+ for (Map<String,Object>map:list){
|
|
|
+ Long ident = (Long) map.get("id");
|
|
|
+ String formula = (String) map.get("formula");
|
|
|
+ Matcher m= p.matcher(formula);
|
|
|
+ if(m.find()){
|
|
|
+ String change=m.group(2);
|
|
|
+ String fn=m.group(1);
|
|
|
+ List<String> args=Arrays.stream(change.split(",")).collect(Collectors.toList());
|
|
|
+ if(args.size()<18){
|
|
|
+ args.addAll(Collections.nCopies(18-args.size(),"''"));
|
|
|
+ System.out.println("原:"+formula);
|
|
|
+ String newformula=("FC."+fn+"("+String.join(",",args)+")");
|
|
|
+ System.out.println("改:"+newformula);
|
|
|
+ this.update(Wrappers.<Formula>lambdaUpdate().set(Formula::getFormula,newformula).eq(Formula::getId,ident));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|