Browse Source

公式相关

yangyj 2 years ago
parent
commit
a7796ac8eb

+ 14 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaBean.java

@@ -7,15 +7,22 @@ import org.springframework.beans.BeanUtils;
 /**
  * @author yangyj
  * @Date 2022/6/14 16:27
- * @description TODO
+ * @description 元素关联公式目前有六种映射关联
  */
 @Data
 public class FormulaBean {
+    /**元素库级别 关键字:elementId*/
+    public static Integer LIBRARY=0;
+    /** WBS级别 关键字: wbsId+elementId*/
     public static Integer WBS_GLOBAL=1;
+    /** WBS 节点级别 关键字:wbsId+nodeId+elementId*/
     public static Integer WBS_PART=2;
+    /**项目级别 关键字:projectId+elementId*/
     public static Integer PRO_GLOBAL=10;
+    /**项目节点级别 关键字:projectId+nodeId+elementId*/
     public static Integer PRO_PART=20;
-    public static Integer PARAM=15;
+    /**节点参数级别 关键字:projectId+nodeId+elementId*/
+    public static Integer PARAM=35;
     private Long id;
     private String formula;
     private String remark;
@@ -35,6 +42,11 @@ public class FormulaBean {
         BeanUtils.copyProperties(this,f);
         return f;
     }
+    public void checkType(){
+    }
+    public Boolean isLibrary(){
+        return LIBRARY.equals(this.scope);
+    }
     public Boolean isWbsGlobal(){
         return WBS_GLOBAL.equals(this.scope);
     }

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

@@ -1545,6 +1545,15 @@ public class CustomFunction {
 		}
         return "";
 	}
+	public static Object tableNames(List<String>treeNodes){
+		if(CollectionUtil.isNotEmpty(treeNodes)){
+			List<String>nodes=new ArrayList<>(treeNodes);
+           return   nodes.stream().filter(StringUtils::isNotEmpty).map(e->e.replaceAll("__\\d+$","")).distinct().collect(Collectors.joining("\n"));
+		}
+		return "";
+	}
+
+
 
 	public static Object qrate(Object design,Object dev,Object data){
 		return qrate(design,dev,data,0,1);

+ 32 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -105,13 +105,38 @@ public class FormulaController {
                      this.jdbcTemplate.batchUpdate(sql);
                      return R.success("公式已删除");
                  }
-                 return R.status(this.service.updateById(fa));
+                 this.service.updateById(fa);
+                 return R.data(fa.getId());
              }
          }
         return R.fail("保存不成功,请检查elementId、formula、scope字段是否为空");
     }
 
+    @PostMapping("/delete")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "删除元素公式", notes = "删除元素公式")
+    public R delete(@RequestParam String ids,Integer scope) {
+        if(StringUtils.isNotEmpty(ids,scope)){
+            String[] arr = ids.split(",");
+            for(String id:arr){
+                String[] sql;
+                if(this.elementFormulaMappingService.count(Wrappers.<ElementFormulaMapping>lambdaQuery().eq(ElementFormulaMapping::getFormulaId,id))>1){
+                    this.jdbcTemplate.execute("delete from m_element_formula_mapping where formula_id="+id +" and scope="+scope);
+                }else {
+                    /*假设这个公式没有别的有效关联,一并删除*/
+                    sql =new String[]{
+                            "delete from m_formula where id ="+id,
+                            "delete from m_element_formula_mapping where formula_id="+id +" and scope="+scope
+                    };
+                    this.jdbcTemplate.batchUpdate(sql);
+                }
 
+            }
+            return R.success("删除成功");
+        }
+
+        return R.fail("无效id");
+    }
 
     /**
      * 删除
@@ -121,9 +146,9 @@ public class FormulaController {
     @ApiOperation(value = "删除", notes = "传入id集合")
     public R remove(@RequestParam String ids) {
         if(StringUtils.isNotEmpty(ids)) {
-            List<Long> ids_d=Func.toLongList(ids);
-            this.elementFormulaMappingService.update(Wrappers.<ElementFormulaMapping>lambdaUpdate().set(ElementFormulaMapping::getIsDeleted, 1).in(ElementFormulaMapping::getFormulaId,ids_d));
-            return R.status(this.service.deleteLogic(ids_d));
+            List<Long> idsDel=Func.toLongList(ids);
+            this.elementFormulaMappingService.update(Wrappers.<ElementFormulaMapping>lambdaUpdate().set(ElementFormulaMapping::getIsDeleted, 1).in(ElementFormulaMapping::getFormulaId,idsDel));
+            return R.status(this.service.deleteLogic(idsDel));
         }
         return R.fail("无效id");
     }
@@ -142,9 +167,9 @@ public class FormulaController {
             if(Func.isNotEmpty(f.getProjectId())){
                 sb.append(" and a.project_id=").append(f.getProjectId());
             }
-            List<Map<String,Object>> maplist =    this.jdbcTemplate.queryForList("select b.* from m_element_formula_mapping a INNER JOIN m_formula b on a.formula_id=b.id where a.element_id="+f.getElementId()+" and b.is_deleted=0 and a.scope ="+f.getScope());
-            if(Func.isNotEmpty(maplist)){
-                return R.data(BeanUtil.toBean(maplist.get(0),FormulaBean.class));
+            List<Map<String,Object>> listMap = this.jdbcTemplate.queryForList("select b.* from m_element_formula_mapping a INNER JOIN m_formula b on a.formula_id=b.id where a.element_id="+f.getElementId()+" and b.is_deleted=0 and a.scope ="+f.getScope());
+            if(Func.isNotEmpty(listMap)){
+                return R.data(BeanUtil.toBean(listMap.get(0),FormulaBean.class));
             }
 
         }

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

@@ -205,10 +205,10 @@ public class WbsTreeController extends BladeController {
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "根据表单id查询所有元素", notes = "传入表单id")
     @ApiImplicitParam(name = "id", value = "表单id", required = true)
-    public R<List<WbsFormElementVO>> selectFormElements(@RequestParam("id") String id, Long nodeId, String search) {
+    public R<List<WbsFormElementVO>> selectFormElements(@RequestParam("id") String id, Long nodeId, String search,Integer type) {
         List<WbsFormElementVO> wbsFormElements = null;
         if (StringUtils.isNotEmpty(id)) {
-            wbsFormElements = wbsTreeService.selectFormElements(id, nodeId);
+            wbsFormElements = wbsTreeService.selectFormElements(id, nodeId,type);
             if (wbsFormElements.size() > 0) {
                 if (StringUtils.isNotEmpty(search)) {
                     wbsFormElements = wbsFormElements.stream().filter(e -> e.getEName().contains(search)).collect(Collectors.toList());

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

@@ -33,5 +33,5 @@ public interface IFormulaService extends BaseService<Formula> {
     void format();
 
     List<Formula> getFormulaList(List<KeyMapper> keyMapperList);
-    List<KeyMapper> getKeyMapperList(List<Long> ids);
+    List<KeyMapper> getKeyMapperList(List<Long> ids,Long projectId);
 }

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

@@ -33,7 +33,7 @@ public interface IWbsTreeService extends BaseService<WbsTree> {
 
     boolean removeTableById(String id);
 
-    List<WbsFormElementVO> selectFormElements(String id,Long nodeId);
+    List<WbsFormElementVO> selectFormElements(String id,Long nodeId,Integer type);
     List<WbsFormElementVO> selectFormElements4Formula(String id);
     // 项目级
     List<WbsFormElementVO> selectPrivateFormElements(String id);

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

@@ -338,7 +338,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             /*每次都是部分表单提交,保证跨节点跨表取数正常,其次是反向依赖的被动刷新*/
             List<AppWbsTreeContractVO> tableAll = wbsTreeContractService.searchNodeAllTable(nodeId.toString(), "1", tableInfoList.get(0).getContractId(), tableInfoList.get(0).getProjectId());
             StopWatch stopWatch = new StopWatch();
-            List<KeyMapper> keyMappers = this.formulaService.getKeyMapperList(tableInfoList.stream().map(TableInfo::getPkeyId).filter(Func::isNotEmpty).map(Long::parseLong).collect(Collectors.toList()));
+            List<KeyMapper> keyMappers = this.formulaService.getKeyMapperList(tableInfoList.stream().map(TableInfo::getPkeyId).filter(Func::isNotEmpty).map(Long::parseLong).collect(Collectors.toList()), null);
             if (Func.isNotEmpty(keyMappers)) {
                 Map<String, Map<String, String>> coordinateMap = new HashMap<>(keyMappers.size() * 2);
                 keyMappers.forEach(e -> {

+ 21 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -540,21 +540,34 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     }
 
     @Override
-    public List<KeyMapper> getKeyMapperList(List<Long> ids) {
-        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 " +
+    public List<KeyMapper> getKeyMapperList(List<Long> ids,Long projectId) {
+        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   " +
                 "from m_wbs_tree_contract a " +
                 "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");
+                "where a.p_key_id in("+ids.stream().map(String::valueOf).collect(Collectors.joining(","))+")  ORDER BY a.init_table_name");
         /*当前节点的参数可以是私有级和公有级*/
 
         if(Func.isNotEmpty(listMap)){
             /*根据元素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);
+            List<KeyMapper> list= listMap.stream().map(m->BeanUtil.toBean(m,KeyMapper.class)).collect(Collectors.toList());
+            Set<KeyMapper> set = new HashSet<>(list.size()*2);
+            StringBuilder sb = new StringBuilder("select element_id elementId,formula_id formulaId,scope from m_element_formula_mapping where scope<30 and element_id in("+list.stream().map(KeyMapper::getFieldId).map(Func::toStr).collect(Collectors.joining(","))+") and is_deleted=0 ");
+            if(projectId!=null){
+                sb.append(" and project_id=").append(projectId);
+            }
+            List<Map<String,Object>> efMap= this.jdbcTemplate.queryForList(sb.toString());
+            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.getFieldId());
+                    if(Func.isNotEmpty(tmp)){
+                        tmp.stream().max(Comparator.comparing(oo->Func.toInt(oo.get("scope")))).ifPresent(d->{
+                            e.setFormulaId(Func.toLong(d.get("formulaId")));
+                            set.add(e);
+                        });
+                    }
+                });
             }
             if(set.size()>0){
                 return new ArrayList<>(set);

+ 7 - 11
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -13,10 +13,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.*;
-import org.springblade.manager.dto.FormElementDTO;
-import org.springblade.manager.dto.WbsTreeBatchImportDTO;
-import org.springblade.manager.dto.WbsTreeContractDTO;
-import org.springblade.manager.dto.WbsTreeDTO2;
+import org.springblade.manager.dto.*;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.excel.WbsExcelBatchUtil;
 import org.springblade.manager.excel.WbsExcelUtil;
@@ -392,7 +389,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     }
 
     @Override
-    public List<WbsFormElementVO> selectFormElements(String id, Long nodeId) {
+    public List<WbsFormElementVO> selectFormElements(String id, Long nodeId,Integer type) {
         List<WbsFormElementVO> wbsFormElements = wbsTreeMapper.selectFormElements(id);
         ;
         if (Func.isEmpty(wbsFormElements)) {
@@ -405,18 +402,17 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             if (escapeChar != null) {
                 elements.setEAllowDeviation(escapeChar);
             }
-//            if (nodeId != null && elements.getNodeId() != null && com.mixsmart.utils.StringUtils.isNotEquals(nodeId, elements.getNodeId())) {
-//                /*与当前节点不相同,则认为是跨节点取数,当然跨节点位置的标记不仅有绑定节点id一种方式*/
-//                elements.setTableElementKey(elements.getNodeId() + StringPool.COLON + elements.getTableElementKey());
-//            }
         });
         String elementIds = wbsFormElements.stream().map(WbsFormElement::getId).map(String::valueOf).collect(Collectors.joining(","));
         if (Func.isNotEmpty(elementIds)) {
-            List<Long> longs = this.jdbcTemplate.queryForList("select a.id from m_wbs_form_element a inner join m_element_formula_mapping b on a.id=b.element_id where a.id in(" + elementIds + ") and b.scope=1", Long.class);
+            /*TYPE==1就是WBS级别*/
+            Integer scopeA=type==1? FormulaBean.WBS_GLOBAL:FormulaBean.PRO_GLOBAL;
+            Integer scopeB=type==1? FormulaBean.WBS_PART:FormulaBean.PRO_PART;
+            List<Long> longs = this.jdbcTemplate.queryForList("select a.id from m_wbs_form_element a inner join m_element_formula_mapping b on a.id=b.element_id where a.id in(" + elementIds + ") and b.scope="+scopeA, Long.class);
             wbsFormElements.forEach(e -> {
                 e.setGlobalFormula(longs.contains(e.getId()) ? 1 : 0);
             });
-            List<Long> longs2 = this.jdbcTemplate.queryForList("select c.element_id from m_wbs_tree a INNER JOIN m_wbs_tree b on a.parent_id=b.id INNER JOIN m_element_formula_mapping c on b.id=c.node_id where  a.id=" + id + " and c.scope=10 and c.element_id in(" + elementIds + ")", Long.class);
+            List<Long> longs2 = this.jdbcTemplate.queryForList("select c.element_id from m_wbs_tree a INNER JOIN m_wbs_tree b on a.parent_id=b.id INNER JOIN m_element_formula_mapping c on b.id=c.node_id where  a.id=" + id + " and c.scope="+scopeB+" and c.element_id in(" + elementIds + ")", Long.class);
             wbsFormElements.forEach(e -> {
                 e.setIsSaveFormula(longs2.contains(e.getId()) ? 1 : 0);
             });