Kaynağa Gözat

公式相关:节点参数同KEY复用公式

yangyj 2 yıl önce
ebeveyn
işleme
99946a9215

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

@@ -18,6 +18,10 @@ import java.util.stream.Stream;
  */
 @Data
 public class FormData {
+    /**
+     * 元素id
+     */
+    private Long id;
     /**
      * 元素码:表名_字段名
      */

+ 12 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/LocalVariable.java

@@ -1,7 +1,9 @@
 package org.springblade.manager.dto;
 
+import io.jsonwebtoken.lang.Objects;
 import lombok.Data;
-
+import org.springframework.util.ObjectUtils;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -23,4 +25,13 @@ public class LocalVariable {
         this.formula = formula;
         this.currentMap = currentMap;
     }
+
+    public Boolean hasEmptyElementValue(){
+        @SuppressWarnings("unchecked")
+        Map<String,Object> mapE= (Map<String, Object>) currentMap.getOrDefault("E",new HashMap<>());
+        if(mapE.size()>0){
+            return mapE.values().stream().anyMatch(ObjectUtils::isEmpty);
+        }
+        return true;
+    }
 }

+ 161 - 70
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java

@@ -4,6 +4,7 @@ import cn.hutool.core.date.StopWatch;
 import cn.hutool.log.StaticLog;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -33,9 +34,6 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
-
-import javax.script.ScriptEngine;
-import javax.script.ScriptEngineManager;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -99,7 +97,6 @@ public class WbsParamController {
                         this.elementFormulaMappingService.update(Wrappers.<ElementFormulaMapping>lambdaUpdate().set(ElementFormulaMapping::getIsDeleted, 1).in(ElementFormulaMapping::getParamId, pb.getDelIds()));
                     }
                 }
-                /*应该检查接触关联的参数公式还是否存在引用,不存在的情况也要删去*/
             }
             if (CollectionUtil.isNotEmpty(wps)) {
                 Map<Boolean, List<WbsParamBean>> map = wps.stream().peek(w -> w.setType(pb.getType())).collect(Collectors.partitioningBy(e -> e.getId() != null));
@@ -108,6 +105,7 @@ public class WbsParamController {
                 if (CollectionUtil.isNotEmpty(saveList)) {
                     List<WbsParam> entityList = BeanUtil.copy(saveList, WbsParam.class);
                     this.service.saveBatch(entityList);
+                    Map<String, Object> tmpMap = new HashMap<>();
                     if (!pb.isCommon()) {
                         /*新建的时候需要初始化绑定表单元素*/
                         List<Map<String, Object>> elementMap = new ArrayList<>();
@@ -127,38 +125,53 @@ public class WbsParamController {
                                             "where  b.project_id=" + pb.getProjectId() + " and a.p_key_id=" + pb.getNodeId() + "  and b.is_deleted=0 and c.is_deleted=0 ");
                         }
                         if (!elementMap.isEmpty()) {
-                            Map<String, Object> tmpMap = new HashMap<>();
                             List<Map<String, Object>> finalElementMap = elementMap;
+                           // List<Map<String,Object>> formulaIdAndKmaps=this.jdbcTemplate.queryForList("select a.id,b.k from m_formula a join m_wbs_param b on a.param_id=b.id where b.k in ("+entityList.stream().map(WbsParam::getK).collect(Collectors.joining("','","'","'"))+") AND b.type=0");
+                           Map<String,Long> fkMap=this.service.formulaIdKeyMap(entityList.stream().map(WbsParam::getK).collect(Collectors.toList()));
                             entityList.forEach(e -> {
-                                Formula 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().trim())) {
-                                    /*取层级*/
-                                    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 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().trim())) {
+//                                    /*取层级*/
+//                                    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();
                                 finalElementMap.forEach(m -> {
                                     if (StringUtils.handleNull(m.get("name")).contains(e.getName())) {
                                         ElementFormulaMapping efm = new ElementFormulaMapping();
                                         efm.setScope(FormulaBean.PARAM);
                                         efm.setParamId(e.getId());
                                         efm.setElementId(Long.parseLong(m.get("id").toString()));
-                                        efm.setFormulaId(formula.getId());
+                                        efm.setFormulaId(fkMap.get(e.getK()));
                                         this.elementFormulaMappingService.save(efm);
                                     }
                                 });
                             });
                         }
+                    }else{
+                        entityList.forEach(e -> {
+                            Formula 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);
+                            formula.setFormula("FC.tree(trees,WP[" + e.getK().replaceAll("[\\s]+","") + "])");
+                            formula.setMap(JSON.toJSONString(tmpMap));
+                            this.formulaService.save(formula);
+                            tmpMap.clear();
+                        });
                     }
                 }
                 if (CollectionUtil.isNotEmpty(updateList)) {
@@ -166,8 +179,17 @@ public class WbsParamController {
                     for (WbsParamBean b : updateList) {
                         WbsParam old = this.service.getById(b.getId());
                         if (pb.isCommon()) {
-                            if (old != null && (StringUtils.isNotEquals(old.getK(),b.getK())||StringUtils.isNotEquals(old.getRemark(),b.getRemark()))) {
+                            if (old != null && (StringUtils.isNotEquals(old.getName(),b.getName())||StringUtils.isNotEquals(old.getK(),b.getK())||StringUtils.isNotEquals(old.getRemark(),b.getRemark()))) {
                                 /*只有公式内容变化的时候才需要更新*/
+                                if(StringUtils.isNotEquals(old.getK(),b.getK())||StringUtils.isNotEquals(old.getName(),b.getName())){
+                                    LambdaUpdateWrapper<WbsParam> wrapper=Wrappers.<WbsParam>lambdaUpdate().set(WbsParam::getName,b.getName()).set(WbsParam::getK,b.getK()).eq(WbsParam::getType,1).eq(WbsParam::getK,old.getK());
+                                    this.service.update(wrapper);
+                                    if(StringUtils.isNotEquals(old.getK(),b.getK())) {
+                                        Formula formula = this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId, old.getId()));
+                                        formula.setFormula("FC.tree(trees,WP[" + b.getK() + "])");
+                                        this.formulaService.saveOrUpdate(formula);
+                                    }
+                                }
                                 old.setIsDeleted(0);
                                 BeanUtils.copyProperties(b, old);
                                 ul.add(old);
@@ -244,7 +266,7 @@ public class WbsParamController {
     @ApiOperation(value = "获取名称字典", notes = "获取名称字典")
     @GetMapping("/keymap")
     public R<List<WbsParamBean>> list2() {
-        LambdaQueryWrapper<WbsParam> queryWrapper = Wrappers.<WbsParam>query().lambda().eq(WbsParam::getType, 0);
+        LambdaQueryWrapper<WbsParam> queryWrapper = Wrappers.<WbsParam>query().lambda().eq(WbsParam::getType, 0).orderByDesc(WbsParam::getCreateTime);
         List<WbsParamBean> list = new ArrayList<>();
         List<WbsParam> data = this.service.list(queryWrapper);
         if (CollectionUtil.isNotEmpty(data)) {
@@ -263,6 +285,11 @@ public class WbsParamController {
                 .eq(WbsParam::getNodeId, wbsId)
                 .eq(WbsParam::getType, 1));
         if (data.size() > 0) {
+            List<Map<String,Object>> statistics=jdbcTemplate.queryForList("select count(*) sum,param_id id from m_element_formula_mapping a join m_wbs_param b on a.param_id= b.id where b.node_id="+wbsId+" and b.is_deleted=0  GROUP BY a.param_id");
+            Map<Long,Integer> mapSum=statistics.stream().collect(Collectors.toMap(m->Long.parseLong(m.get("id").toString()),m-> Integer.parseInt(m.get("sum").toString()),(v1,v2)->v2));
+            if(statistics.size()>1){
+                data.sort(Comparator.comparingInt((WbsParam d)->mapSum.getOrDefault(d.getId(),0)).reversed());
+            }
             return R.data(BeanUtil.copyProperties(data, WbsParamBean.class));
         }
         return R.data(null);
@@ -315,35 +342,42 @@ public class WbsParamController {
     public R<Boolean> specified(@ApiParam(value = "关联id", required = true) Long paramId, Long elementId) {
         /*先删旧关联,检查是否存在公式,没有就新增 再增新关联*/
         this.jdbcTemplate.execute("update m_element_formula_mapping set is_deleted=1 where element_id=" + elementId + " and param_id=" + paramId);
-        Formula formula = this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId, paramId));
-        if (formula == null) {
-            Map<String, Object> tmpMap = new HashMap<>();
-            formula = new Formula();
-            WbsParam param = this.service.getById(paramId);
-            formula.setOutm(Formula.FULL);
-            formula.setParamId(param.getId());
-            Map<String, String> keyMap = new HashMap<>();
-            keyMap.put("name", param.getName());
-            keyMap.put("id", param.getId().toString());
-            tmpMap.put(param.getK(), keyMap);
-            if (RegexUtil.match(ParamElements.LEVEL_REG, param.getV().trim())) {
-                /*取层级*/
-                formula.setFormula("FC.tree(trees,WP[" + param.getK() + "])");
-            } else {
-                /*直接取数*/
-                formula.setFormula("WP[" + param.getK() + "]");
-            }
-            formula.setMap(JSON.toJSONString(tmpMap));
-            this.formulaService.save(formula);
+//        Formula formula = this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId, paramId));
+//        if (formula == null) {
+//            Map<String, Object> tmpMap = new HashMap<>();
+//            formula = new Formula();
+//            WbsParam param = this.service.getById(paramId);
+//            formula.setOutm(Formula.FULL);
+//            formula.setParamId(param.getId());
+//            Map<String, String> keyMap = new HashMap<>();
+//            keyMap.put("name", param.getName());
+//            keyMap.put("id", param.getId().toString());
+//            tmpMap.put(param.getK(), keyMap);
+//            if (RegexUtil.match(ParamElements.LEVEL_REG, param.getV().trim())) {
+//                /*取层级*/
+//                formula.setFormula("FC.tree(trees,WP[" + param.getK() + "])");
+//            } else {
+//                /*直接取数*/
+//                formula.setFormula("WP[" + param.getK() + "]");
+//            }
+//            formula.setMap(JSON.toJSONString(tmpMap));
+//            this.formulaService.save(formula);
+//        }
+        WbsParam wbsParam=this.service.getById(paramId);
+        Long formulaId=this.service.formulaId(wbsParam.getK());
+        if(formulaId==null){
+            R.fail("公式不存在");
         }
         ElementFormulaMapping efm = new ElementFormulaMapping();
         efm.setScope(FormulaBean.PARAM);
         efm.setParamId(paramId);
         efm.setElementId(elementId);
-        efm.setFormulaId(formula.getId());
+        efm.setFormulaId(formulaId);
         return R.status(this.elementFormulaMappingService.save(efm));
     }
 
+
+
     @GetMapping("/refresh")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "刷新当前节点的节点参数", notes = "刷新当前节点的节点参数")
@@ -374,31 +408,32 @@ public class WbsParamController {
 
                 List<Long> longList = this.jdbcTemplate.queryForList("select element_id from m_element_formula_mapping where is_deleted=0 and scope=35 and 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<>();
+//                    Map<String, Object> tmpMap = new HashMap<>();
                     List<Map<String, Object>> finalElementMap = elementMap;
+                    Map<String,Long> fkMap = this.service.formulaIdKeyMap(paramList.stream().map(WbsParam::getK).collect(Collectors.toList()));
                     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().trim())) {
-                                /*取层级*/
-                                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;
+//                        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().trim())) {
+//                                /*取层级*/
+//                                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;
                         String name = e.getName().replace("【水】", "").trim();
                         finalElementMap.forEach(m -> {
                             if (StringUtils.handleNull(m.get("name")).contains(name)) {
@@ -408,7 +443,7 @@ public class WbsParamController {
                                     efm.setScope(FormulaBean.PARAM);
                                     efm.setParamId(e.getId());
                                     efm.setElementId(Long.parseLong(m.get("id").toString()));
-                                    efm.setFormulaId(finalFormula.getId());
+                                    efm.setFormulaId(fkMap.get(e.getK()));
                                     this.elementFormulaMappingService.save(efm);
                                 }
                             }
@@ -425,6 +460,22 @@ public class WbsParamController {
 
     }
 
+    /**节点公式创建*/
+    private Formula createFormula(WbsParam e){
+        Formula formula = new Formula();
+        Map<String, Object> tmpMap = new HashMap<>();
+        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);
+        formula.setFormula("FC.tree(trees,WP[" + e.getK() + "])");
+        formula.setMap(JSON.toJSONString(tmpMap));
+        this.formulaService.save(formula);
+        return formula;
+    }
+
     @GetMapping("/del-duplicate")
     public R<Object> duplicate() {
         try {
@@ -485,6 +536,46 @@ public class WbsParamController {
 
     @GetMapping("/test")
     public R<Object> test() {
-          return R.fail("失败");
+          /*刷模版公式*/
+        List<WbsParam> list =service.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getType,0));
+        Map<String, Object> tmpMap = new HashMap<>();
+        list.forEach(e->{
+             Formula 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);
+              formula.setFormula("FC.tree(trees,WP[" + e.getK().replaceAll("[\\s]+","") + "])");
+              formula.setMap(JSON.toJSONString(tmpMap));
+              this.formulaService.save(formula);
+              tmpMap.clear();
+          });
+          return R.success("完成");
     }
+
+
+    @GetMapping("/lack")
+    public R<Object> lack(String name) {
+        String tamplate="CREATE TABLE `"+name+"` (\n" +
+                "  `id` bigint(20) NOT NULL COMMENT '主键id',\n" +
+                "  `p_key_id` bigint(20) DEFAULT NULL COMMENT '合同段wbs树表单的p_key_id',\n" +
+                "  `group_id` bigint(20) DEFAULT NULL COMMENT '分组id',\n" +
+                "  #REPLACE\n" +
+                "  PRIMARY KEY (`id`) USING BTREE\n" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8";
+        List<Map<String,Object>> listMap= this.jdbcTemplate.queryForList("select a.tab_ch_name tabName,a.tab_en_name initTableName,b.e_name eName,b.id elementId,b.e_key  eKey ,CONCAT(a.tab_en_name,':',b.e_key) code  from m_table_info a join m_wbs_form_element b on b.f_id=a.id where a.tab_en_name in ('"+name+"') and b.is_deleted=0");
+        if(listMap.size()>0){
+            List<String> keys = listMap.stream().map(m-> Func.toStr(m.get("ekey"))).collect(Collectors.toList());
+            String target = keys.stream().distinct().filter(Func::isNotBlank).map(s-> "`"+s+"` varchar(80) DEFAULT NULL,").collect(Collectors.joining("\n"));
+            tamplate=tamplate.replace("#REPLACE",target);
+            System.out.println(tamplate);
+            this.jdbcTemplate.execute(tamplate);
+            return R.success("完成");
+        }
+        return R.fail("创建失败");
+    }
+
+
 }

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java

@@ -140,6 +140,7 @@ public class TableElementConverter implements ITableElementConverter {
                 fd.setEName(one.getEName());
                 fd.setEAllowDeviation(one.getEAllowDeviation());
                 fd.setEType(one.getEType());
+                fd.setId(one.getFieldId());
                 /*初始化元素数据集*/
                 List<ElementData> eds = fd.getValues();
                 for (int i = 0; i < kms.size(); i++) {

+ 10 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsParamService.java

@@ -1,11 +1,13 @@
 package org.springblade.manager.service;
 
 import org.springblade.core.mp.base.BaseService;
+import org.springblade.manager.entity.Formula;
 import org.springblade.manager.entity.WbsParam;
 import org.springblade.manager.entity.WbsTreeContract;
 
 import javax.validation.constraints.NotNull;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author yangyj
@@ -29,6 +31,13 @@ public interface IWbsParamService extends BaseService<WbsParam> {
     List<WbsParam> findByNodeId(Long nodeId);
 
     List<WbsTreeContract> chain(Long contractId, Long id, Long pkId, WbsTreeContract wbsTreeContract);
-     List<WbsTreeContract> tracing(@NotNull Long pkeyId);
+
+    List<WbsTreeContract> tracing(@NotNull Long pkeyId);
+    /**查重删除*/
     void duplicate(Long nodeId);
+    /**formulaId和参数key的映射*/
+    Map<String,Long> formulaIdKeyMap(List<String> ks);
+    /**指定key的formulaId映射*/
+    Long formulaId(String k);
+    Map<String, Formula> formulaKeyMap(List<String> ks);
 }

+ 40 - 11
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -351,7 +351,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             Map<String, Object> elementInfoMap=this.getElementInfoByCodes(String.join(",",missingList));
             /*1从当前节点其它表格中查找匹配的元素*/
             List<String> removeList=new ArrayList<>();
-            if(false) {/*全加载后,关闭当前节的搜索,假如后期改成依赖加载可以再次利用*/
+            /*if(false) {*//*全加载后,关闭当前节的搜索,假如后期改成依赖加载可以再次利用*//*
                 for (String r : missingList) {
                     String tn = r.substring(0, r.indexOf(StringPool.COLON));
                     String key = r.substring(r.indexOf(StringPool.COLON) + 1);
@@ -369,10 +369,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     }
                 }
                 if (Func.isNotEmpty(removeList)) {
-                    /*移除已经找到的元素数据*/
+                    *//*移除已经找到的元素数据*//*
                     missingList.removeIf(removeList::contains);
                 }
-            }
+            }*/
             if(Func.isNotEmpty(missingList)){
                 /*2从当前节点的兄弟节点中查找匹配的元素*/
                 CurrentNode currentNode = this.tec.getCurrentNode();
@@ -504,23 +504,45 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
         this.tec.getLog().append("【本节点参数情况:").append(result.entrySet().stream().map(p->logMap.get(p.getKey())+":"+p.getValue()).collect(Collectors.joining(";"))).append("】");
         /*元素动态绑定*/
-        tec.formDataMap.values().stream().filter(e->e.getIsCurrentNodeElement()&&e.getFormula()==null).forEach(e->{
-            /*执行列表里不存在,且元素的名称和节点参数名称匹配成功*/
+        Map<String,Formula> formulaIdMap = this.wpService.formulaKeyMap(total.stream().map(WbsParam::getK).collect(Collectors.toList()));
+        /**查找无绑定公式且单元格只有一个的当前表单元素*/
+        List<FormData> notFormulaFds=tec.formDataMap.values().stream().filter(e->e.getIsCurrentNodeElement()&&e.getFormula()==null&&e.getCoordsList().size()==1).collect(Collectors.toList());
+        if(notFormulaFds.size()>0){
+            notFormulaFds.forEach(e->{
+                /*执行列表里不存在,且元素的名称和节点参数名称匹配成功,暂时用参数名称是否包含元素名称作为匹配规则*/
+                total.stream().filter(p->e.getEName().contains(p.getName().replaceAll("【[\\u4E00-\\u9FFF]+】|\\s+",""))&&!tec.formDataList.contains(e)).findAny().ifPresent(d->{
+                    Formula tf= formulaIdMap.get(d.getK());
+                    if(tf!=null&&e.getId()!=null) {
+                        e.setFormula(tf);
+                        tec.formDataList.add(e);
+                        ElementFormulaMapping efm = new ElementFormulaMapping();
+                        efm.setScope(FormulaBean.PARAM);
+                        efm.setParamId(d.getId());
+                        efm.setElementId(e.getId());
+                        efm.setFormulaId(tf.getId());
+                        this.elementFormulaMappingService.save(efm);
+                    }
+                });
+            });
+        }
+    /*    tec.formDataMap.values().stream().filter(e->e.getIsCurrentNodeElement()&&e.getFormula()==null).forEach(e->{
+            *//*执行列表里不存在,且元素的名称和节点参数名称匹配成功*//*
             total.stream().filter(p->e.getEName().contains(p.getName().replace("【水】","").trim())&&!tec.formDataList.contains(e)).findAny().ifPresent(d->{
                 Formula  formula=new Formula();
                 formula.setOutm(Formula.FULL);
-                if(RegexUtil.match(ParamElements.LEVEL_REG,d.getV().trim())){
-                    /*取层级*/
+             *//*   if(RegexUtil.match(ParamElements.LEVEL_REG,d.getV().trim())){
+                    *//**//*取层级*//**//*
                     formula.setFormula("FC.tree(trees,WP["+d.getK()+"])");
                 }else{
-                    /*直接取数*/
+                    *//**//*直接取数*//**//*
                     formula.setFormula("WP["+d.getK()+"]");
-                }
+                }*//*
+                formula.setFormula("FC.tree(trees,WP["+d.getK()+"])");
                 e.setFormula(formula);
                 tec.getLog().append("动态绑定参数:").append(e.getEName()).append(";");
                 tec.formDataList.add(e);
             });
-        });
+        });*/
         return result;
     }
 
@@ -884,6 +906,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             String values=subTableInfo.stream().map(TableInfo::getDataMap).map(m->m.get(StringUtils.handleNull(e.get("ekey")))).filter(StringUtils::isNotEmpty).collect(Collectors.joining(";;"));
                             FormData tmp=  createFormDataFast(StringUtils.handleNull(e.get("ename")),StringUtils.handleNull(e.get("code")),values);
                             if(tmp!=null){
+                                String idStr =StringUtils.handleNull(e.get("fieldId"));
+                                if(Func.isNotEmpty(idStr)) {
+                                    tmp.setId(Func.toLong(idStr));
+                                }
                                 tmp.setIsCurrentNodeElement(true);
                                 tec.formDataMap.put(tmp.getCode(),tmp);
                                 tec.formDataList.add(tmp);
@@ -1345,7 +1371,10 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
         List<Object> result = new ArrayList<>();
         try {
             pretreatment(local,formula);
-            List<Object>  r= local.stream().map(e-> Expression.parse(e.getFormula()).calculate(e.getCurrentMap())).collect(Collectors.toList());
+            List<Object>  r= local.stream().map(e-> {
+                /*所有依赖元素的内容必须非空才进行计算,否则返回空值*/
+                return e.hasEmptyElementValue()?"": Expression.parse(e.getFormula()).calculate(e.getCurrentMap());
+            }).collect(Collectors.toList());
             if(CollectionUtil.isNotEmpty(r)&&r.stream().anyMatch(StringUtils::isNotEmpty)){
                 result.addAll(r);
             }

+ 42 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java

@@ -7,14 +7,12 @@ import com.mixsmart.utils.CustomFunction;
 import com.mixsmart.utils.StringUtils;
 import lombok.AllArgsConstructor;
 import org.springblade.common.utils.BaseUtils;
+import org.springblade.core.mp.base.BaseEntity;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.manager.entity.ContractInfo;
-import org.springblade.manager.entity.WbsParam;
-import org.springblade.manager.entity.WbsTreeContract;
-import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.WbsParamMapper;
 import org.springblade.manager.service.IElementFormulaMappingService;
 import org.springblade.manager.service.IFormulaService;
@@ -218,6 +216,46 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
     }
 
 
+    /**
+     * @Description 获取公式和key 的字典,复用共key公式
+     * @Param [ks]
+     * @return java.util.Map<java.lang.String,java.lang.String>
+     * @Author yangyj
+     * @Date 2023.07.27 10:30
+     **/
+    @Override
+    public Map<String,Long> formulaIdKeyMap(List<String> ks){
+        Map<String,Long> fkMap=new HashMap<>();
+        if(Func.isNotEmpty(ks)) {
+            List<Map<String, Object>> formulaIdAndKmaps = this.jdbcTemplate.queryForList("select a.id,b.k from m_formula a join m_wbs_param b on a.param_id=b.id where b.k in (" + ks.stream().filter(Func::isNotBlank).distinct().collect(Collectors.joining("','", "'", "'")) + ") AND b.type=0");
+            if(Func.isNotEmpty(formulaIdAndKmaps)) {
+                fkMap = formulaIdAndKmaps.stream().collect(Collectors.toMap(m -> m.get("k").toString(), m -> Long.parseLong(m.get("id").toString()), (p, n) -> n));
+            }
+        }
+        return fkMap;
+    }
+    @Override
+    public Long formulaId(String k){
+        if(Func.isNotBlank(k)) {
+            Map<String, Long> fkMap = formulaIdKeyMap(Collections.singletonList(k));
+            return fkMap.get(k);
+        }
+        return null;
+    }
+
+    @Override
+    public Map<String, Formula> formulaKeyMap(List<String> ks) {
+        Map<String,Formula> result = new HashMap<>();
+        Map<String,Long> fkMap= formulaIdKeyMap(ks);
+        if(fkMap.size()>0) {
+           List<Formula> list =  this.formulaService.listByIds(fkMap.values());
+           Map<Long,Formula> idMap=list.stream().collect(Collectors.toMap(BaseEntity::getId, f->f));
+           fkMap.forEach((k,v)->{
+               result.put(k,idMap.get(v));
+           });
+        }
+        return result;
+    }
 }
 
 

+ 10 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -968,8 +968,9 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     if (!insertList.isEmpty()) {
                         insertList.forEach(i -> i.setId(SnowFlakeUtil.getId()));
                         this.wbsParamServiceImpl.saveOrUpdateBatch(insertList, 1000);
-                        /*生成公式,并自动绑定元素*/
-                        Map<Long, Formula> insertFormulaMap = insertList.stream().map(e -> {
+                        /*生成公式,并自动绑定元素,同key复用一个公式*/
+                        Map<String, Long> formulaIdeyMap =this.wbsParamServiceImpl.formulaIdKeyMap(insertList.stream().map(WbsParam::getK).collect(Collectors.toList()));
+                      /*  Map<Long, Formula> insertFormulaMap = insertList.stream().map(e -> {
                             Map<String, Object> tmpMap = new HashMap<>();
                             Formula formula = new Formula();
                             formula.setOutm(Formula.FULL);
@@ -979,16 +980,16 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             keyMap.put("id", e.getId().toString());
                             tmpMap.put(e.getK(), keyMap);
                             if (RegexUtil.match(ParamElements.LEVEL_REG, e.getV().trim())) {
-                                /*取层级*/
+                                *//*取层级*//*
                                 formula.setFormula("FC.tree(trees,WP[" + e.getK() + "])");
                             } else {
-                                /*直接取数*/
+                                *//*直接取数*//*
                                 formula.setFormula("WP[" + e.getK() + "]");
                             }
                             formula.setMap(JSON.toJSONString(tmpMap));
                             formula.setId(SnowFlakeUtil.getId());
                             return formula;
-                        }).collect(Collectors.toMap(Formula::getParamId, f -> f));
+                        }).collect(Collectors.toMap(Formula::getParamId, f -> f));*/
                         List<String> nodeIds = insertList.stream().map(WbsParam::getNodeId).distinct().map(Objects::toString).collect(Collectors.toList());
                         /*每道工序下包含的元素集合*/
                         List<Map<String, Object>> listMaps = this.jdbcTemplate.queryForList(
@@ -1001,7 +1002,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                         List<ElementFormulaMapping> insertEfm = new ArrayList<>();
                         insertList.forEach(p -> {
                             List<Map<String, Object>> elementMap = groupElementNode.get(p.getNodeId().toString());
-                            Formula formula = insertFormulaMap.get(p.getId());
+                           // Formula formula = insertFormulaMap.get(p.getId());
                             if (Func.isNotEmpty(elementMap)) {
                                 elementMap.forEach(m -> {
                                     if (com.mixsmart.utils.StringUtils.handleNull(m.get("name")).contains(p.getName())) {
@@ -1010,15 +1011,15 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                         efm.setScope(FormulaBean.PARAM);
                                         efm.setParamId(p.getId());
                                         efm.setElementId(Long.parseLong(m.get("id").toString()));
-                                        efm.setFormulaId(formula.getId());
+                                        efm.setFormulaId(formulaIdeyMap.get(p.getK()));
                                         insertEfm.add(efm);
                                     }
                                 });
                             }
                         });
-                        if (insertFormulaMap.size() > 0) {
+/*                        if (insertFormulaMap.size() > 0) {
                             this.formulaService.saveBatch(insertFormulaMap.values(), 1000);
-                        }
+                        }*/
                         if (insertEfm.size() > 0) {
                             this.elementFormulaMappingService.saveBatch(insertEfm, 1000);
                         }