Преглед изворни кода

表单相关:优化执行公式当前节点的上下文信息

yangyj пре 2 година
родитељ
комит
3306cf37be

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

@@ -460,7 +460,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 currentNode.setProjectId(Long.parseLong(wtp.getProjectId()));
                 currentNode.setParentId(wtp.getParentId());
                 currentNode.setWbsId(Long.parseLong(publicWtp.getWbsId()));
-                currentNode.setWbsNodeId(publicWtp.getId());
+                currentNode.setWbsNodeId(wtp.getId());
                 return currentNode;
         }
         return null;

+ 37 - 45
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -1247,14 +1247,19 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
     public WbsTreePrivate getOriginWtp(Long pkeyId) {
         WbsTreePrivate wtp = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId,pkeyId));
         int i=10;
+        WbsTreePrivate publicWtp = null;
         while (i>0) {
             WbsTreePrivate tmp=  this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, wtp.getWbsId()));
             if (tmp == null) {
                 break;
             }
-            wtp = tmp;
+            publicWtp = tmp;
             i--;
         }
+        if(publicWtp!=null){
+            /*私有引用项目的wbsId其实是被复制的项目的根节点p_key_id,只有溯源才能找到真正的wbsId*/
+            wtp.setWbsId(publicWtp.getWbsId());
+        }
        return wtp;
     }
 
@@ -1262,35 +1267,31 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
     public WbsTreePrivate wtpId(Long pkeyId){
        WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,pkeyId));
        while (wtc.getOldId()!=null){
-           wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId,wtc.getOldId()).eq(WbsTreeContract::getContractId,wtc.getContractId()));
+           wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId,wtc.getOldId()).eq(WbsTreeContract::getProjectId,wtc.getProjectId()).last(" limit 1 "));
        }
-       return this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getId,wtc.getOldId()).eq(WbsTreePrivate::getProjectId,wtc.getProjectId()));
+       return this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getId,wtc.getId()).eq(WbsTreePrivate::getProjectId,wtc.getProjectId()));
     }
     private List<KeyMapper> listForContract(List<Long> ids,String projectId,String nodeId){
         String pkIds=ids.stream().map(String::valueOf).collect(Collectors.joining(","));
         List<Map<String,Object>> listMap = listMap(ids,ExecuteType.INSPECTION);
-        WbsTreePrivate origin =wtpId(Long.parseLong(nodeId));
+        WbsTreePrivate wtp =wtpId(Long.parseLong(nodeId));
         //Map<String,Object> wtpMap= this.jdbcTemplate.queryForMap("select b.id parentId,b.wbs_id wbsId from  m_wbs_tree_private b where is_deleted=0 and id="+originId+" and project_id="+projectId);
         if(Func.isNotEmpty(listMap)){
             /*当前节点的某个元素存在多种作用域的公式,作用域范围越小优先级越高*/
             List<KeyMapper> list= listMap.stream().map(m->BeanUtil.toBean(m,KeyMapper.class)).collect(Collectors.toList());
-            String nodeIdStr= StringUtils.handleNull(origin.getId());
-            if(Func.isBlank(nodeIdStr)){
-                /*暂时这么处理,严格上说要查找到项目级对应的节点*/
-                nodeIdStr="''";
-            }
-            String wbsId =StringUtils.handleNull(origin.getWbsId());
-            if(Func.isBlank(wbsId)){
-                /*暂时这么处理,严格上说要查找到项目级对应的节点*/
-                wbsId="''";
-            }
+            /*项目级*/
+            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(" + list.stream().map(KeyMapper::getFieldId).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="+nodeIdStr+")or (scope =10 and project_id = " + projectId + ") or (scope=20 and project_id =" + projectId + " and node_id=" +nodeIdStr +"))");
+                    "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 +"))");
             setFormula(list,efMap);
             /*节点参数公式*/
-            setParamsFormula( nodeId,  list);
+            setParamsFormula( wtp.getPKeyId(),origin.getId(),  list);
             if(list.size()>0){
                 return list;
             }
@@ -1298,39 +1299,30 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
         return Collections.emptyList();
     }
 
-    private void setParamsFormula(String nodeId, List<KeyMapper> list){
-        if(StringUtils.isNotEmpty(nodeId)){
-            /*存在工序节点id则检查节点参数*/
-            WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,nodeId));
-            if(wtc!=null){
-                List<WbsParam> total = new ArrayList<>();
-                WbsTreePrivate wtp = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId,wtc.getProjectId()).eq(WbsTreePrivate::getWbsId,wtc.getWbsId()).and(e->e.eq(WbsTreePrivate::getId,wtc.getId()).or().eq(WbsTreePrivate::getId,wtc.getOldId())));
-                if(wtp!=null){
-                    List<WbsParam> wpsPrivate = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId,wtp.getPKeyId()));
-                    if(Func.isEmpty(wpsPrivate)){
-                        WbsTree wt = this.wbsTreeService.getOne(Wrappers.<WbsTree>lambdaQuery().and(e->e.eq(WbsTree::getId,wtc.getId()).or().eq(WbsTree::getId,wtc.getOldId())));
-                        if(wt!=null){
-                            List<WbsParam> wpsPublic = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId,wt.getId()));
-                            if(Func.isNotEmpty(wpsPublic)){
-                                total.addAll(wpsPublic);
-                            }
-                        }
-                    }else{
-                        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.getFieldId())).findAny().ifPresent(d->{
-                                e.setFormulaId(d.getFormulaId());
-                            });
+    private void setParamsFormula(Long privatePkeyId,Long wbsNodeId, List<KeyMapper> 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.getFieldId())).findAny().ifPresent(d->{
+                            e.setFormulaId(d.getFormulaId());
                         });
+                    });
 
-                    }
                 }
             }
+
         }
 
     }