Răsfoiți Sursa

公式相关:调整

yangyj 1 an în urmă
părinte
comite
d1fe54941e

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

@@ -76,7 +76,10 @@ public class FormData {
      */
     private List<ElementData> backup;
     private Map<String, ElementData> vMap = new HashMap<>();
-
+    /**
+     * 公式id
+     */
+    private Long formulaId;
     /**
      * 公式对象
      */

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -3818,7 +3818,7 @@ public class ExcelTabController extends BladeController {
      * @return
      * @throws Exception
      */
-    @PostMapping("/save_buss_data3")
+    @PostMapping("/save_buss_data2")
     @ApiOperationSupport(order = 13)
     @ApiOperation(value = "填报页面数据保存", notes = "填报页面数据保存")
     public R saveBussData(@Valid @RequestBody JSONObject dataInfo) throws Exception {

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

@@ -108,6 +108,14 @@ public class TableElementConverter implements ITableElementConverter {
     }
 
     /*优化测试新增属性start*/
+
+    public TableElementConverter(List<FormData>curFormDatas,List<FormData> processFds, Map<String, Map<String, String>> coordinateMap, CurrentNode wtc, List<NodeTable> tableAll) {
+        this.coordinateMap = coordinateMap;
+        this.nodeId = wtc.getPkId();
+        this.wbsTreeId = wtc.getId();
+        this.currentNode = wtc;
+        this.tableAll = tableAll;
+    }
     /*优化测试新增属性end*/
 
     public TableElementConverter(List<TableInfo> tableInfoList, List<KeyMapper> keyMappers, List<Formula> formulas, Map<String, Map<String, String>> coordinateMap, CurrentNode wtc, List<NodeTable> tableAll) {

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

@@ -56,6 +56,9 @@ public interface IFormulaService extends BaseService<Formula> {
      */
     List<KeyMapper> getKeyMapperList(List<Long> ids, String projectId, String nodeId, ExecuteType executeType);
 
+   void formulaInto(List<FormData> curFormDatas, String projectId, String nodeId, ExecuteType executeType);
+
+
     Map<String, Object> getElementInfoByCodes(String codes);
 
     /**根据wbs_tree_contract 的pkeyId查询项目级对应节点*/

+ 30 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -409,13 +409,21 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                            "select d.id,c.tab_ch_name tableChName,d.e_type eType,d.e_name eName,d.e_length eLength,d.e_allow_deviation eAllowDeviation,CONCAT(c.tab_en_name,':',d.e_key) code from m_table_info c join m_wbs_form_element d  on  c.id=d.f_id where d.is_deleted=0 and c.tab_en_name in("+tableNames+")"
                                            ,FormData.class
                                    );
-               List<KeyMapper> keyMappers = this.formulaService.getKeyMapperList(tableInfoList.stream().map(TableInfo::getPkeyId).filter(Func::isNotEmpty).map(Long::parseLong).collect(Collectors.toList()), tableInfoList.get(0).getProjectId(), String.valueOf(nodeId), type);
-               if (Func.isNotEmpty(keyMappers) && Func.isNotEmpty(tableAll)) {
-                   Map<String, Map<String, String>> coordinateMap = createCoordinateMap(keyMappers, type);
-                   List<Formula> formulas = this.formulaService.getFormulaList(keyMappers);
+               List<Long> pkeyIds =tableInfoList.stream().map(TableInfo::getPkeyId).map(Long::parseLong).collect(Collectors.toList());
+               List<String> curTableNames=tableAll.stream().filter(e->pkeyIds.contains(e.getPKeyId())).map(NodeTable::getInitTableName).collect(Collectors.toList());
+               List<NodeTable> curNodeTables=tableAll.stream().filter(e->curTableNames.contains(e.getInitTableName())).collect(Collectors.toList());
+               /*当前提交的元素*/
+               List<FormData> curFormDatas=processFds.stream().filter(e->curTableNames.contains(e.getTableName())).collect(Collectors.toList());
+              /*嵌入公式*/
+              this.formulaService.formulaInto(curFormDatas,tableInfoList.get(0).getProjectId(), String.valueOf(nodeId), type);
+              // List<KeyMapper> keyMappers = this.formulaService.getKeyMapperList(tableAll.stream().map(NodeTable::getPKeyId).filter(Func::isNotEmpty).collect(Collectors.toList()), tableInfoList.get(0).getProjectId(), String.valueOf(nodeId), type);
+               if (Func.isNotEmpty(tableAll)) {
+                   Map<String, Map<String, String>> coordinateMap = createCoordinateMap2(pkeyIds, type);
+                   //List<Formula> formulas = this.formulaService.getFormulaList(keyMappers);
                    /*要找到最小加载数量
                    * 1.根据依赖溯源然后确定当前页面修改数据的影响范围
                    * 2.区分能部分执行和必须整体执行公式的元素*/
+                   List<FormData> relyFds=  curFormDatas.stream().filter(e->e.getFormula()!=null&&e.getFormula().getRelyList()!=null).collect(Collectors.toList());
 
                    /*判断哪些元素是可部分执行和整体执行*/
                    CurrentNode currentNode = null;
@@ -435,7 +443,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                        projectId = Long.parseLong(wtp.getProjectId());
                    }
                    if (currentNode != null) {
-                       TableElementConverter tec = new TableElementConverter(tableInfoList, keyMappers, formulas, coordinateMap, currentNode, tableAll);
+                       TableElementConverter tec = new TableElementConverter(curFormDatas, processFds, coordinateMap, currentNode, tableAll);
                        tec.setLog(log);
                        tec.setExecuteType(type);
                        tec.setContractId(contractId);
@@ -447,7 +455,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                        } else {
                            tec.getLog().put(FormulaLog.OTHER, "没有执行任何公式");
                        }
-                       stopWatch.stop();
                        long totalTime = stopWatch.getTotalTimeMillis();
                        log.put(FormulaLog.PF, "公式执行消耗时间:" + (double)totalTime / 1000 + "秒");
                        StaticLog.info("公式执行用时:{}", totalTime);
@@ -494,6 +501,23 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
         return coordinateMap;
     }
+    private Map<String, Map<String, String>> createCoordinateMap2( List<Long> pkeyIds, ExecuteType type) {
+        Map<String, Map<String, String>> coordinateMap = new HashMap<>(pkeyIds.size() * 2);
+        if (pkeyIds.size() > 0) {
+            if (ExecuteType.TESTING.equals(type)) {
+                List<WbsTreePrivate> list = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>query().lambda().in(WbsTreePrivate::getPKeyId, pkeyIds));
+                if (list.size() > 0) {
+                    list.forEach(e -> coordinateMap.computeIfAbsent(e.getInitTableName(), k -> FormulaUtils.getElementCell(e.getHtmlUrl())));
+                }
+            } else {
+                List<WbsTreeContract> list = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>query().lambda().in(WbsTreeContract::getPKeyId, pkeyIds));
+                if (list.size() > 0) {
+                    list.forEach(e -> coordinateMap.computeIfAbsent(e.getInitTableName(), k -> FormulaUtils.getElementCell(e.getHtmlUrl())));
+                }
+            }
+        }
+        return coordinateMap;
+    }
 
     private void updateFormulaLog(String log, Long pKeyId) {
         try {

+ 71 - 46
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -15,6 +15,7 @@ import org.apache.poi.ss.usermodel.*;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.mp.base.BaseEntity;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.*;
@@ -1364,6 +1365,38 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return Collections.emptyList();
     }
 
+    @Override
+    public void formulaInto(List<FormData> curFormDatas, String projectId, String nodeId, ExecuteType executeType) {
+        if(executeType.equals(ExecuteType.INSPECTION)){
+            WbsTreePrivate wtp =wtpId(Long.parseLong(nodeId));
+            /*项目级*/
+            Long nodeIdPrivate= wtp.getId();
+            WbsTreePrivate origin =getOriginWtp(wtp.getPKeyId());
+            String wbsId =StringUtils.handleNull(origin.getPKeyId());
+            /*Wbs对应的节点*/
+            Long nodeIdWbs=origin.getId();
+            List<Map<String,Object>> efMap= this.jdbcTemplate.queryForList("select element_id elementId,formula_id formulaId,scope " +
+                    "from m_element_formula_mapping " +
+                    "where element_id in(" + curFormDatas.stream().map(FormData::getId).map(Func::toStr).collect(Collectors.joining(",")) + ") " +
+                    "and is_deleted=0 " + " and (scope=0 or (scope=1 and wbs_id="+wbsId+") or(scope=2  and wbs_id="+wbsId+" and node_id="+nodeIdWbs+")or (scope =10 and project_id = " + projectId + ") or (scope=20 and project_id =" + projectId + " and node_id=" +nodeIdPrivate +"))");
+            setFormula2(curFormDatas,efMap);
+            /*节点参数公式*/
+            setParamsFormula2( wtp.getPKeyId(),origin.getId(),curFormDatas);
+            List<Long> formulaIds = curFormDatas.stream().map(FormData::getFormulaId).distinct().collect(Collectors.toList());
+            if(formulaIds.size()>0) {
+                List<Formula> formulaList = this.listByIds(formulaIds);
+                if (formulaList.size() > 0) {
+                    Map<Long, Formula> idMap = formulaList.stream().collect(Collectors.toMap(Formula::getId, f -> f, (p, n) -> n));
+                    for (FormData fd : curFormDatas) {
+                        fd.setFormula(idMap.get(fd.getFormulaId()));
+                    }
+                }
+            }
+        }else if(executeType.equals(ExecuteType.TESTING)){
+
+        }
+    }
+
     @Override
     public WbsTreePrivate getOriginWtp(Long pkeyId) {
         WbsTreePrivate wtp = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId,pkeyId));
@@ -1480,7 +1513,31 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
 
     }
+    private void setParamsFormula2(Long privatePkeyId,Long wbsNodeId, List<FormData> list){
+        if(StringUtils.isNotEmpty(privatePkeyId,wbsNodeId)){
+            List<WbsParam> total = new ArrayList<>();
+            List<WbsParam> wpsPublic = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId,wbsNodeId));
+            /*同时获取WBS和 项目级的节点参数,如果存在同名则项目级覆盖WBS*/
+            if(Func.isNotEmpty(wpsPublic)){
+                total.addAll(wpsPublic);
+            }
+            List<WbsParam> wpsPrivate = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId,privatePkeyId));
+            if(Func.isNotEmpty(wpsPrivate)){
+                total.addAll(wpsPrivate);
+            }
+            if(Func.isNotEmpty(total)){
+                List<ElementFormulaMapping> mappingList =  this.elementFormulaMappingService.list(Wrappers.<ElementFormulaMapping>lambdaQuery().in(ElementFormulaMapping::getParamId,total.stream().map(WbsParam::getId).collect(Collectors.toList())));
+                if(Func.isNotEmpty(mappingList)){
+                    list.forEach(e->{
+                        mappingList.stream().filter(m->StringUtils.isEquals(m.getElementId(),e.getId())).findAny().ifPresent(d-> e.setFormulaId(d.getFormulaId()));
+                    });
+
+                }
+            }
 
+        }
+
+    }
     private List<KeyMapper> listForPrivate(List<Long> ids,String projectId,String nodeId){
         /**/
         List<Map<String,Object>> listMap  = listMap(ids,ExecuteType.TESTING);
@@ -1522,6 +1579,19 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             });
         }
     }
+    private void setFormula2(List<FormData> list,List<Map<String,Object>> efMap){
+        if(Func.isNotEmpty(efMap)){
+            Map<Long,List<Map<String,Object>>> efGroup= efMap.stream().collect(Collectors.groupingBy(e->Func.toLong(e.get("elementId"))));
+            list.forEach(e->{
+                List<Map<String,Object>> tmp = efGroup.get(e.getId());
+                if(Func.isNotEmpty(tmp)){
+                    tmp.stream().max(Comparator.comparing(oo->Func.toInt(oo.get("scope")))).ifPresent(d->{
+                       e.setFormulaId(Func.toLong(d.get("formulaId")));
+                    });
+                }
+            });
+        }
+    }
 
     @Override
     public List<Formula> getFormulaList(List<KeyMapper> keyMapperList) {
@@ -1537,42 +1607,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
 
 
-/*    public  List<Object> slice(List<LocalVariable>  local,String formula){
-        int min =0;
-        List<Object> result = new ArrayList<>();
-        try {
-            pretreatment(local,formula);
-            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);
-            }
-        }catch (Exception e){
-            StaticLog.error("公式:{},执行出错",formula);
-        }
-        return  result;
-    }*/
-
-/*    public void  pretreatment(List<LocalVariable>  local,String formula){
-        formula=StringUtils.removeMultiSpace(formula);
-        if(formula.contains("LIST")){
-            Matcher  m=RegexUtils.matcher("\\(([^)]*)\\)/LIST",formula);
-            while (m.find()){
-                List<String> codes=FormulaUtils.getCodeList(m.group(1).replaceAll("[+-]",","));
-                local=local.stream().peek(e->{
-                    @SuppressWarnings("unckecked")
-                    Map<String,Object> map = (Map<String, Object>) e.getCurrentMap().getOrDefault(E,new HashMap<>());
-                    int listSize=(int)codes.stream().filter(c->StringUtils.isNotEmpty(map.get(c))).count();
-                    if(listSize<=0||listSize>codes.size()){
-                        listSize=codes.size();
-                    }
-                    map.put("LIST",listSize);
-                }).collect(Collectors.toList());
-            }
-        }
-    }*/
 
 
     public  static void sort( List<FormData> list,int n){
@@ -1918,16 +1952,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     }
 
 
-    /*从方法参数中获取全部code*/
-/*    public List<String> getCodeList(String param){
-        List<String> list = new ArrayList<>();
-        if(StringUtils.isNotEmpty(param)){
-            Arrays.stream(param.split(",")).forEach(s->{
-                list.add(s.replaceAll("[E\\[\\]']",""));
-            });
-        }
-        return list;
-    }*/
+
 
     public List<String> getCodeByEl(String el){
         List<String> l = new ArrayList<>();