Browse Source

Merge remote-tracking branch 'origin/master'

liuyc 2 years ago
parent
commit
53e4028473

+ 1 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormData.java

@@ -72,6 +72,7 @@ public class FormData {
     private Integer update=0;
     /**是否完成执行*/
     private Boolean finished=false;
+    /**元素和单元格的映射信息*/
     public  List<Coords> coordsList= new ArrayList<>();
     public static final String CODE_REG="[^:]+:[^:]+";
 

+ 15 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/CurrentNode.java

@@ -0,0 +1,15 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+/**
+ * @author yangyj
+ * @Date 2022/12/31 16:34
+ * @description TODO
+ */
+@Data
+public class CurrentNode {
+    private Long pkId;
+    private Long privateId;
+    private Long id;
+}

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

@@ -428,16 +428,16 @@ public class CustomFunction {
 
 	public static Object dateMax(Object range){
 		if(StringUtils.isNotEmpty(range)){
-			String[] s= Func.toStr(range).split("Z");
-			return dateCp(s[0]+"Z",s[1]+"Z",false);
+			String[] s= Func.toStr(range).replaceAll("[\\[\\]]","").split(",");
+			return dateCp(s[0],s[1],false);
 		}
 		return StringPool.EMPTY;
 	}
 
 	public static Object dateMin(Object range){
 		if(StringUtils.isNotEmpty(range)){
-			String[] s= Func.toStr(range).split("Z");
-			return dateCp(s[0]+"Z",s[1]+"Z",true);
+			String[] s= Func.toStr(range).replaceAll("[[|]]","").split(",");
+			return dateCp(s[0],s[1],true);
 		}
 		return StringPool.EMPTY;
 	}
@@ -1523,8 +1523,9 @@ public class CustomFunction {
 		return r;
 	}
 
-	public static Object tree(List<String>nodes,String param){
-		if(CollectionUtil.isNotEmpty(nodes)&& Func.isNotBlank(param)){
+	public static Object tree(List<String>treeNodes,String param){
+		if(CollectionUtil.isNotEmpty(treeNodes)&& Func.isNotBlank(param)){
+			List<String>nodes=new ArrayList<>(treeNodes);
 			Collections.reverse(nodes);
 			List<String> result = new ArrayList<>();
 			param=param.replaceAll("(?i:c)","");
@@ -2513,7 +2514,7 @@ public class CustomFunction {
 			if(StringUtils.isEmpty(s)){
 				s="、";
 			}
-			return 	op.map(CustomFunction::obj2List).get().stream().map(StringUtils::handleNull).collect(Collectors.joining(s));
+			return 	op.map(CustomFunction::obj2ListNe).get().stream().map(StringUtils::handleNull).collect(Collectors.joining(s));
 		};
 		return "";
 	}
@@ -2731,5 +2732,4 @@ public class CustomFunction {
 
 
 
-
 }

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/bean/TableInfo.java

@@ -12,12 +12,15 @@ import java.util.List;
  */
 @Data
 public class TableInfo {
+    /**表单数据*/
     private LinkedHashMap<String,String> dataMap;
     private String pkeyId;
     private String contractId;
     private String classify;
     private String projectId;
     private String groupId="0";
+    /**待更新状态*/
+    private boolean toBeUpdated;
 
     // =============================== 首件相关 start ===============================
     /**

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -216,6 +216,9 @@ public class FormulaController {
             }
             if(Func.isBlank(info.getDev())){
                info.setDev("-3,3");
+            }else{
+                info.setDev(info.getDev().replaceAll("[\\[\\]()()]",""));
+                /*左右极限非包含暂时不用管*/
             }
             if(Func.isNotEmpty(info.getCapacity())){
                 info.setSize(info.getCapacity());

+ 80 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.mixsmart.utils.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -27,8 +28,6 @@ import org.springblade.manager.service.IFormulaService;
 import org.springblade.manager.service.IWbsParamService;
 import org.springblade.manager.vo.ParamBean;
 import org.springblade.manager.vo.ParamSearch;
-import org.springblade.manager.vo.TableElementParam;
-import org.springblade.manager.vo.WbsFormElementVO;
 import org.springblade.manager.wrapper.WbsParamWrapper;
 import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -56,7 +55,6 @@ public class WbsParamController {
     /**
      * 保存或修改
      * @param wp
-     * @return
      */
     @PostMapping("/saveOrUpdate")
     @ApiOperationSupport(order = 1)
@@ -319,5 +317,84 @@ public class WbsParamController {
        return   R.status(this.elementFormulaMappingService.save(efm));
     }
 
+    @GetMapping("/refresh")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "刷新当前节点的节点参数", notes = "刷新当前节点的节点参数")
+    public R refresh(Long nodeId,Integer type,Long projectId) {
+        try {
+            /*先查出所有的节点参数*/
+            List<WbsParam> paramList=  this.service.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId,nodeId));
+            if(Func.isNotEmpty(paramList)){
+                List<Map<String,Object>> elementMap=new ArrayList<>();
+                /*当前节点所包含的所有元素*/
+                if(StringUtils.isEquals(0,type)){
+                    /*wbs*/
+                    elementMap= this.jdbcTemplate.queryForList(
+                            "select a.e_name as name ,a.id " +
+                                    "from m_wbs_form_element a " +
+                                    "inner join m_wbs_tree b on a.f_id=b.init_table_id " +
+                                    "inner join m_wbs_tree c on b.parent_id=c.id " +
+                                    "where a.is_deleted=0 and c.id="+nodeId
+                    );
+                }else{
+                    /*project*/
+                    elementMap= this.jdbcTemplate.queryForList(
+                            "select c.e_name as name ,c.id from m_wbs_tree_private a " +
+                                    "inner join m_wbs_tree_private b on a.id=b.parent_id " +
+                                    "inner join m_wbs_form_element c on  b.init_table_id=c.f_id " +
+                                    "where  b.project_id="+projectId+" and a.p_key_id="+nodeId+"  and b.is_deleted=0 and c.is_deleted=0 ");
+                }
+
+                List<Long> longList=this.jdbcTemplate.queryForList("select element_id from m_element_formula_mapping where param_id in("+paramList.stream().map(WbsParam::getId).map(String::valueOf).collect(Collectors.joining(","))+")",Long.class);
+                if(Func.isNotEmpty(elementMap)){
+                    Map<String,Object> tmpMap=new HashMap<>();
+                    List<Map<String, Object>> finalElementMap = elementMap;
+                    paramList.forEach(e->{
+                        Formula formula = this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId,e.getId()));
+                        if(formula==null){
+                            formula=new Formula();
+                            formula.setOutm(Formula.FULL);
+                            formula.setParamId(e.getId());
+                            Map<String,String> keyMap= new HashMap<>();
+                            keyMap.put("name",e.getName());
+                            keyMap.put("id",e.getId().toString());
+                            tmpMap.put(e.getK(),keyMap);
+                            if(RegexUtil.match(ParamElements.LEVEL_REG,e.getV())){
+                                /*取层级*/
+                                formula.setFormula("FC.tree(trees,WP["+e.getK()+"])");
+                            }else{
+                                /*直接取数*/
+                                formula.setFormula("WP["+e.getK()+"]");
+                            }
+                            formula.setMap(JSON.toJSONString(tmpMap));
+                            this.formulaService.save(formula);
+                            tmpMap.clear();
+                        }
+                        Formula finalFormula = formula;
+                        finalElementMap.forEach(m->{
+                            if(m.get("name").toString().contains(e.getName())){
+                                /*匹配名称,且该元素没有绑定任何节点参数公式*/
+                                if(longList.stream().noneMatch(k->StringUtils.isEquals(k,m.get("id")))){
+                                    ElementFormulaMapping efm = new ElementFormulaMapping();
+                                    efm.setScope(FormulaBean.PARAM);
+                                    efm.setParamId(e.getId());
+                                    efm.setElementId(Long.parseLong(m.get("id").toString()));
+                                    efm.setFormulaId(finalFormula.getId());
+                                    this.elementFormulaMappingService.save(efm);
+                                }
+                            }
+                        });
+                    });
+                }
+            }
+
+            return R.success("操作成功");
+        }catch (Exception e){
+            e.printStackTrace();
+            return R.fail("操作失败");
+        }
+
+    }
+
 
 }

+ 4 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java

@@ -1,11 +1,6 @@
 package org.springblade.manager.controller;
 
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.extra.tokenizer.Result;
-import cn.hutool.extra.tokenizer.TokenizerEngine;
-import cn.hutool.extra.tokenizer.TokenizerUtil;
-import cn.hutool.extra.tokenizer.Word;
-import cn.hutool.extra.tokenizer.engine.hanlp.HanLPEngine;
+
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -26,21 +21,19 @@ import org.springblade.manager.excel.WbsFormElementBatchExcel;
 import org.springblade.manager.excel.WbsTreeExcel;
 import org.springblade.manager.mapper.WbsInfoMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
+import org.springblade.manager.service.IFormulaService;
 import org.springblade.manager.service.IWbsFormElementService;
 import org.springblade.manager.vo.*;
 import org.springblade.system.cache.DictCache;
 import org.springblade.system.enums.DictEnum;
-import org.springframework.transaction.annotation.Transactional;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
-import org.springblade.manager.wrapper.WbsTreeWrapper;
 import org.springblade.manager.service.IWbsTreeService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springframework.web.multipart.MultipartFile;
-
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
-
 import java.io.IOException;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -211,6 +204,7 @@ public class WbsTreeController extends BladeController {
                 return R.data(wbsFormElements);
             }
         }
+
         return R.data(wbsFormElements, "未查询到元素");
     }
 

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/KeyMapper.java

@@ -18,6 +18,8 @@ public class KeyMapper {
     private  String field;
     /**initTableName*/
     private  String tableName;
+    /**元素中文名*/
+    private  String eName;
     /**公式优先级*/
     private Integer scope;
     /**公式id*/

+ 8 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java

@@ -17,6 +17,7 @@ import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.formula.ITableElementConverter;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.vo.AppWbsTreeContractVO;
+import org.springblade.manager.vo.CurrentNode;
 
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -44,21 +45,21 @@ public class TableElementConverter implements ITableElementConverter {
     List<FormData> fds =new ArrayList<>();
     Map<String,Map<String,String>> coordinateMap;
     Map<String,ElementData> elementDataMap = new HashMap<>();
-    WbsTreeContract one;
+    CurrentNode currentNode;
     List<AppWbsTreeContractVO> tableAll;
 
 
-    public TableElementConverter(List<TableInfo> tableInfoList, List<KeyMapper> keyMappers, List<Formula> formulas, Map<String,Map<String,String>> coordinateMap, WbsTreeContract wtc,List<AppWbsTreeContractVO> tableAll) {
+    public TableElementConverter(List<TableInfo> tableInfoList, List<KeyMapper> keyMappers, List<Formula> formulas, Map<String,Map<String,String>> coordinateMap, CurrentNode wtc,List<AppWbsTreeContractVO> tableAll) {
         this.tableInfoList = tableInfoList;
         this.keyMappers = keyMappers;
         this.formulas = formulas;
         this.coordinateMap=coordinateMap;
-        this.nodeId=wtc.getPKeyId();
-        this.wbsTreeId=Func.isNotEmpty(wtc.getOldId())? Long.valueOf(wtc.getOldId()) :wtc.getId();
+        this.nodeId=wtc.getPkId();
+        this.wbsTreeId=wtc.getId();
         if(Func.isNotEmpty(tableInfoList)){
             this.contractId = Long.parseLong(tableInfoList.get(0).getContractId());
         }
-        this.one=wtc;
+        this.currentNode=wtc;
         this.tableAll=tableAll;
     }
 
@@ -104,8 +105,9 @@ public class TableElementConverter implements ITableElementConverter {
                 /*过滤掉本节点的前缀信息*/
 //                String sf= formula.getFormula().replace(this.wbsTreeId+StringPool.COLON,StringPool.EMPTY);
 //                formula.setFormula(sf);
-                relyParse(formula);
+//                relyParse(formula);
                 FormData fd=new FormData(codeAndId[0],new ArrayList<>(),formula,this.coordinateMap.get(one.getTableName()).get(one.getField()));
+                fd.setEName(one.getEName());
                 /*初始化元素数据集*/
                 List<ElementData> eds =fd.getValues();
                 String coords = this.coordinateMap.get(fd.getTableName()).get(fd.getKey());

+ 21 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -343,18 +343,37 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 stopWatch.start("公式处理");
                 List<Formula> formulas = this.formulaService.getFormulaList(keyMappers);
                 WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, nodeId));
-                TableElementConverter tec = new TableElementConverter(tableInfoList, keyMappers, formulas, coordinateMap,wtc,tableAll);
+                CurrentNode currentNode = createCurrentNode(wtc);
+                TableElementConverter tec = new TableElementConverter(tableInfoList, keyMappers, formulas, coordinateMap,currentNode,tableAll);
                 if (tec.isPresent()) {
                     tec.before();
                     this.formulaService.execute(tec);
                     tec.after();
                 }
                 stopWatch.stop();
-                StaticLog.info("工时执行用时:{}", stopWatch.getTotalTimeMillis());
+                StaticLog.info("公式执行用时:{}", stopWatch.getTotalTimeMillis());
             }
         }
     }
 
+    public CurrentNode createCurrentNode(WbsTreeContract wtc){
+        if(wtc!=null){
+            CurrentNode currentNode = new CurrentNode();
+            currentNode.setPkId(wtc.getPKeyId());
+            List<Long> ids=this.jdbcTemplate.queryForList("select id from m_wbs_tree where id in("+wtc.getId()+","+wtc.getOldId()+")",Long.class);
+            if(Func.isNotEmpty(ids)){
+                Long id = ids.get(0);
+                currentNode.setId(id);
+               List<Long> privateIds= this.jdbcTemplate.queryForList("select p_key_id from m_wbs_tree_private where id="+id+" and  project_id="+wtc.getProjectId(),Long.class);
+               if(Func.isNotEmpty(privateIds)){
+                   currentNode.setPrivateId(privateIds.get(0));
+                   return currentNode;
+               }
+            }
+        }
+        return null;
+    }
+
     /**
      * 保存日志
      */

+ 100 - 57
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -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));
+                    }
+                }
+            }
+        }
+    }
+
 }
 
 

+ 3 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -311,11 +311,9 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
     @Override
     public List<WbsFormElementVO> selectFormElements(String id, Long nodeId) {
-        List<WbsFormElementVO> wbsFormElements = null;
-        if (this.tableInfoService.count(Wrappers.<TableInfo>lambdaQuery().eq(TableInfo::getId, id)) > 0) {
+        List<WbsFormElementVO> wbsFormElements  = wbsTreeMapper.selectFormElements(id);;
+        if (Func.isEmpty(wbsFormElements)) {
             wbsFormElements = wbsTreeMapper.selectFormElements4TableId(id);
-        } else {
-            wbsFormElements = wbsTreeMapper.selectFormElements(id);
         }
         wbsFormElements.forEach(elements -> {
             String eAllowDeviation = elements.getEAllowDeviation();
@@ -324,7 +322,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             if (escapeChar != null) {
                 elements.setEAllowDeviation(escapeChar);
             }
-            if (nodeId != null && com.mixsmart.utils.StringUtils.isNotEquals(nodeId, elements.getNodeId())) {
+            if (nodeId != null &&elements.getNodeId()!=null&& com.mixsmart.utils.StringUtils.isNotEquals(nodeId, elements.getNodeId())) {
                 /*与当前节点不相同,则认为是跨节点取数,当然跨节点位置的标记不仅有绑定节点id一种方式*/
                 elements.setTableElementKey(elements.getNodeId() + StringPool.COLON + elements.getTableElementKey());
             }