yangyj 2 rokov pred
rodič
commit
ef7d335a47

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

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

@@ -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)","");

+ 7 - 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,7 +105,7 @@ 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()));
                 /*初始化元素数据集*/
                 List<ElementData> eds =fd.getValues();

+ 20 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -343,7 +343,8 @@ 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);
@@ -355,6 +356,24 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
     }
 
+    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;
+    }
+
     /**
      * 保存日志
      */

+ 16 - 12
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,7 +66,7 @@ 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);
@@ -98,11 +99,12 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @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);
@@ -116,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);
@@ -160,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")));
@@ -185,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);
         }
@@ -393,15 +395,18 @@ 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 " +
                 "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");
+        /*当前节点的参数可以是私有级和公有级*/
+
         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);
@@ -600,7 +605,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, 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));
-                        // this.jdbcTemplate.update("update m_formula set formula ='"+newformula+"' where id="+ident);
                     }
                 }
             }