Prechádzať zdrojové kódy

Merge branch 'test-merge' of http://219.151.181.73:3000/zhuwei/bladex into test-merge

lvy 1 týždeň pred
rodič
commit
9d594bf2b5

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

@@ -4,6 +4,7 @@ import lombok.Data;
 import org.springblade.manager.entity.Formula;
 import org.springframework.beans.BeanUtils;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -39,6 +40,7 @@ public class FormulaBean {
     public static Integer PARAM = 35;
     private Long id;
     private String formula;
+    private List<FormulaMultipleIf> formulas;
     private String remark;
     private String number;
     private Long nodeId;

+ 23 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaIfElse.java

@@ -0,0 +1,23 @@
+package org.springblade.manager.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 公式 ifelse 返回数据
+ * @author LHB
+ */
+@Data
+public class FormulaIfElse {
+    @ApiModelProperty("参数1")
+    private String parameter1;
+
+    @ApiModelProperty("符号")
+    private String symbol;
+
+    @ApiModelProperty("参数1")
+    private String parameter2;
+
+    @ApiModelProperty("组合条件")
+    private String groupTerm;
+}

+ 21 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaMultipleIf.java

@@ -0,0 +1,21 @@
+package org.springblade.manager.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 公式 多重if 返回数据
+ * @author LHB
+ */
+@Data
+public class FormulaMultipleIf {
+    @ApiModelProperty("组合判断条件")
+    private List<FormulaIfElse> formulaIfElse;
+
+    @ApiModelProperty("满足值")
+    private String trueData;
+    @ApiModelProperty("不满足值")
+    private String falseData;
+}

+ 165 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -21,10 +21,7 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.utils.BeanUtil;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.core.tool.utils.RegexUtil;
-import org.springblade.core.tool.utils.StringPool;
+import org.springblade.core.tool.utils.*;
 import org.springblade.manager.dto.*;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.enums.ExecuteType;
@@ -80,6 +77,37 @@ public class FormulaController {
     @PostMapping("/save")
     @Deprecated
     public R save(@RequestBody FormulaBean f) {
+        //ifelseMulti 多条件处理
+        if(CollectionUtil.isNotEmpty(f.getFormulas())){
+            StringBuilder sb = new StringBuilder();
+            sb.append("FC.ifelseMulti(");
+            for (int i = 0; i < f.getFormulas().size(); i++) {
+                if(i != 0){
+                    sb.append(",(");
+                }
+                FormulaMultipleIf formulaMultipleIf = f.getFormulas().get(i);
+                //盘点条件
+                for (FormulaIfElse formulaIfElse : formulaMultipleIf.getFormulaIfElse()) {
+                    sb.append(formulaIfElse.getParameter1())
+                            .append(formulaIfElse.getSymbol())
+                            .append(formulaIfElse.getParameter2());
+                    if(StringUtils.isNotEmpty(formulaIfElse.getGroupTerm())){
+                        String s = formulaIfElse.getGroupTerm().replaceAll("&amp;&amp;", "&&");
+                        sb.append(s);
+                    }
+                }
+                sb.append(",").append(formulaMultipleIf.getTrueData());
+                //当前是否为最后一层判断
+                if(i >= f.getFormulas().size() - 1){
+                    sb.append(",").append(formulaMultipleIf.getFalseData());
+                }
+                if(i != 0){
+                    sb.append(")");
+                }
+            }
+            sb.append(")");
+            f.setFormula(sb.toString());
+        }
         return saveOrUpdate(f);
     }
 
@@ -90,6 +118,36 @@ public class FormulaController {
     @PostMapping("/update")
     @Deprecated
     public R update(@RequestBody FormulaBean f) {
+        if(CollectionUtil.isNotEmpty(f.getFormulas())){
+            StringBuilder sb = new StringBuilder();
+            sb.append("FC.ifelseMulti(");
+            for (int i = 0; i < f.getFormulas().size(); i++) {
+                if(i != 0){
+                    sb.append(",(");
+                }
+                FormulaMultipleIf formulaMultipleIf = f.getFormulas().get(i);
+                //盘点条件
+                for (FormulaIfElse formulaIfElse : formulaMultipleIf.getFormulaIfElse()) {
+                    sb.append(formulaIfElse.getParameter1())
+                            .append(formulaIfElse.getSymbol())
+                            .append(formulaIfElse.getParameter2());
+                    if(StringUtils.isNotEmpty(formulaIfElse.getGroupTerm())){
+                        String s = formulaIfElse.getGroupTerm().replaceAll("&amp;&amp;", "&&");
+                        sb.append(s);
+                    }
+                }
+                sb.append(",").append(formulaMultipleIf.getTrueData());
+                //当前是否为最后一层判断
+                if(i >= f.getFormulas().size() - 1){
+                    sb.append(",").append(formulaMultipleIf.getFalseData());
+                }
+                if(i != 0){
+                    sb.append(")");
+                }
+            }
+            sb.append(")");
+            f.setFormula(sb.toString());
+        }
         return saveOrUpdate(f);
     }
 
@@ -216,6 +274,15 @@ public class FormulaController {
                 String rely = StringUtils.handleNull(map.get("rely"));
                 FormulaBean fb = BeanUtil.toBean(map, FormulaBean.class);
                 fb.setDict(this.service.getElementInfoByCodes(rely));
+                //多重if重新组装参数
+                String formula = fb.getFormula();
+                if(formula.contains(".ifelseMulti")){
+                    //处理数据
+                    formula = formula.replaceFirst("FC.ifelseMulti","");
+                    List<FormulaMultipleIf> formulaMultipleIfs = new ArrayList<>();
+                    strParse(formula,formulaMultipleIfs);
+                    fb.setFormulas(formulaMultipleIfs);
+                }
                 return R.data(fb);
             }
 
@@ -223,6 +290,100 @@ public class FormulaController {
         return R.success("无数据");
     }
 
+
+    private Boolean strParse(String str, List<FormulaMultipleIf> formulaMultipleIfs){
+        str = str.replaceFirst("\\(","").replaceFirst("\\)$","");
+        FormulaMultipleIf formulaMultipleIf = new FormulaMultipleIf();
+        List<String> split = parseParameters(str);
+        if(split.size() == 3){
+            List<FormulaIfElse> formulaIfElses = new ArrayList<>();
+            String s0 = split.get(0);
+            String s1 = split.get(1);
+            String s2 = split.get(2);
+            //处理 判断体 E[m_20220826103001_1562990720141230080:key_40]=2
+            String[] split1 = null;
+            String groupSymbol = null;
+            if(s0.contains("||") || s0.contains("&&")){
+
+
+                if(s0.contains("||")){
+                    split1 = s0.split("\\|\\|");
+                    groupSymbol = "||";
+                }else{
+                    split1 = s0.split("&&");
+                    groupSymbol = "&&";
+                }
+            }else{
+                split1 = new String[]{s0};
+            }
+            for (String s : split1) {
+                FormulaIfElse formulaIfElse = new FormulaIfElse();
+                String s3 = strContainsSymbol(s);
+                if(!s3.isEmpty()){
+                    String[] split2 = s.split(s3);
+                    formulaIfElse.setParameter1(split2[0]);
+                    formulaIfElse.setSymbol(s3);
+                    formulaIfElse.setParameter2(split2[1]);
+                    formulaIfElse.setGroupTerm(groupSymbol);
+                    formulaIfElses.add(formulaIfElse);
+                }
+            }
+            formulaMultipleIf.setFormulaIfElse(formulaIfElses);
+            formulaMultipleIf.setTrueData(s1);
+            if(s2.contains("(")){
+                formulaMultipleIfs.add(formulaMultipleIf);
+                Boolean b = strParse(s2, formulaMultipleIfs);
+                if(!b){
+                    formulaMultipleIf.setFalseData(s2);
+                    formulaMultipleIfs.add(formulaMultipleIf);
+                }
+            }else{
+                formulaMultipleIf.setFalseData(s2);
+                formulaMultipleIfs.add(formulaMultipleIf);
+            }
+            return true;
+        }
+        return false;
+    }
+    public String strContainsSymbol(String str){
+        String s = null;
+        if(str.contains(">=")){
+            s = ">=";
+        }else if (str.contains("<=")){
+            s = "<=";
+        }else if (str.contains(">") && !str.contains("=")){
+            s = ">";
+        }else if (str.contains("<") && !str.contains("=")){
+            s = "<";
+        }else if (str.contains("=")){
+            s = "=";
+        }
+        return s;
+    }
+    // 添加参数解析方法,处理嵌套逗号
+    private List<String> parseParameters(String content) {
+        List<String> params = new ArrayList<>();
+        int depth = 0;
+        int start = 0;
+
+        for (int i = 0; i < content.length(); i++) {
+            char c = content.charAt(i);
+            if (c == '(') {
+                depth++;
+            } else if (c == ')') {
+                depth--;
+            } else if (c == ',' && depth == 0) {
+                // 只有在最外层才分割参数
+                params.add(content.substring(start, i).trim());
+                start = i + 1;
+            }
+        }
+        // 添加最后一个参数
+        params.add(content.substring(start).trim());
+
+        return params;
+    }
+
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "公式翻页查询", notes = "公式翻页查询")
     @GetMapping("/page")

+ 3 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -926,8 +926,8 @@ public class WbsTreePrivateController extends BladeController {
     @GetMapping("/getTitleRange")
     @ApiOperationSupport(order = 33)
     @ApiOperation(value = "获取题名范围",notes = "获取题名范围")
-    public R<List<TitleRangeVo>> getTitleRange(@RequestParam String projectId,@RequestParam(required = false) Long nameId){
-        List<WbsTreePrivate>list=wbsTreeService.getTitleRange(projectId);
+    public R<List<TitleRangeVo>> getTitleRange(@RequestParam String projectId,@RequestParam(required = false) Long nameId,@RequestParam(required = false) Integer wbsType){
+        List<WbsTreePrivate>list=wbsTreeService.getTitleRange(projectId,wbsType);
         List<WbsParam> list1 = iWbsParamService.getBaseMapper().selectList(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getK, "FILE_TITLE").eq(WbsParam::getProjectId, projectId));
         if(list1.size()>0){
                 //修改
@@ -986,7 +986,7 @@ public class WbsTreePrivateController extends BladeController {
                     iWbsParamService.getBaseMapper().delete(new QueryWrapper<WbsParam>().eq("name_id",dto.getNameId()));
                 }
                 if(dto.getType()==1){
-                    List<WbsTreePrivate>list=wbsTreeService.getTitleRange(dto.getProjectId()+"");
+                    List<WbsTreePrivate>list=wbsTreeService.getTitleRange(dto.getProjectId()+"",null);
                     if(list.size()>0){
                         dto.setNodeId(list.stream()
                             .map(item -> String.valueOf(item.getId()))

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.java

@@ -100,5 +100,6 @@ public interface WbsTreeMapper extends EasyBaseMapper<WbsTree> {
 
     int isThereAField(@Param("initTableName") String initTableName, @Param("keyId") String keyId);
 
-    List<WbsTreePrivate> getTitleRange(@Param("projectId")Long projectId);
+    List<WbsTreePrivate> getTitleRange(@Param("projectId")Long projectId,
+                                       @Param("wbsType")Integer wbsType);
 }

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml

@@ -568,6 +568,9 @@
     <select id="getTitleRange" resultType="org.springblade.manager.entity.WbsTreePrivate">
         SELECT id,node_name,status From m_wbs_tree_private where project_id = #{projectId} and node_type=1 and is_deleted=0 and type=1
         and parent_id !=0
+        <if test="wbsType != null">
+            and wbs_type = #{wbsType}
+        </if>
     </select>
 
 </mapper>

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

@@ -78,7 +78,7 @@ public interface IWbsTreeService extends BaseService<WbsTree> {
 
     Object getQueryValueByType(String queryValue, String wbsId, String projectId, String type);
 
-    List<WbsTreePrivate> getTitleRange(String projectId);
+    List<WbsTreePrivate> getTitleRange(String projectId,Integer wbsType);
 
     Object getQueryValueByNodeType(WbsTreePrivateQueryVO vo);
 }

+ 132 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -5660,6 +5660,113 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     } while (f.contains("ifelse") && max < 20);
                 }
             }
+            //多条件判断
+            if (f.contains("ifelseMulti")){
+                int max = 0;
+                do {
+                    // 修改正则表达式,使用非贪婪匹配来处理嵌套情况
+                    Matcher m = RegexUtils.matcher(FC_REG + "(ifelseMulti)\\(((?:[^()]++|\\([^()]*\\))*?)\\)", f);
+                    boolean found = false;
+
+                    while (m.find()) {
+                        found = true;
+                        String el = m.group();
+
+                        try {
+                            // 提取括号内的内容(去掉外层的ifelse())
+                            String content = el.replaceFirst("^" + FC_REG + "ifelseMulti\\(", "").replaceFirst("\\)$", "");
+
+                            // 解析参数,处理嵌套逗号(在括号内的逗号不应该作为分隔符)
+                            List<String> pa = parseParameters(content);
+
+                            if (pa.size() == 3) {
+                                Map<String, Object> currentMap = createCurrentMap(el, tec);
+                                //判断 为
+                                String falseStr = pa.get(2);;
+                                if(pa.get(2).contains("(")){
+                                    pa.set(2,"-10086");
+                                }
+                                String string = pa.get(0) + "?" + pa.get(1) + ":" + pa.get(2);
+                                Expression parse = Expression.parse(string);
+                                Object data = parse.calculate(currentMap);
+                                //递归计算
+                                if(Objects.equals(String.valueOf(data),"-10086")){
+                                    //进入递归算法
+                                    data = multipleIfElse(falseStr,currentMap);
+                                }
+                                f = f.replace(el, putDataWithKey(data, tec));
+                            } else {
+                                f = f.replace(el, "参数格式错误");
+                            }
+                        } catch (Exception e) {
+                            f = f.replace(el, "解析错误");
+                        }
+                    }
+
+                    max++;
+                    // 如果没有找到匹配项,提前退出循环
+                    if (!found) {
+                        break;
+                    }
+                } while (f.contains("ifelseMulti") && max < 20);
+            }
+            // switch-case 选择公式
+            if (f.contains("switchCase")){
+                int max = 0;
+                do {
+                    // 修改正则表达式,使用非贪婪匹配来处理嵌套情况
+                    Matcher m = RegexUtils.matcher(FC_REG + "(switchCase)\\(((?:[^()]++|\\([^()]*\\))*?)\\)", f);
+                    boolean found = false;
+
+                    while (m.find()) {
+                        found = true;
+                        String el = m.group();
+
+                        try {
+                            // 提取括号内的内容(去掉外层的ifelse())
+                            String content = el.replaceFirst("^" + FC_REG + "ifelseMulti\\(", "").replaceFirst("\\)$", "");
+
+
+                            //
+                            String key = null;
+                            String value = null;
+
+                            Map<String, Object> currentMap = createCurrentMap(el, tec);
+
+                            //根据分号分组 数据样例:a=x -> b=0; a=y -> c=1; else -> d=2
+                            String[] ruleArray = content.trim().split(";");
+                            for (String rule : ruleArray) {
+                                if (rule.startsWith("else")) {
+                                    String[] parts = rule.split(" -> ");
+                                    String[] action = parts[1].split("=");
+                                    key = action[0];
+                                    value = action[1];
+                                    break;
+                                }
+                                String[] parts = rule.split("->");
+                                String[] action = parts[1].split("=");
+                                Expression parse = Expression.parse(parts[0] + "?1:0");
+                                Object data = parse.calculate(currentMap);
+                                if(Objects.equals("1",String.valueOf(data))){
+                                    key = action[0];
+                                    value = action[1];
+                                    break;
+                                }
+                            }
+
+                            f = f.replace(el, putDataWithKey(value, tec));
+                        } catch (Exception e) {
+                            f = f.replace(el, "解析错误");
+                        }
+                    }
+
+                    max++;
+                    // 如果没有找到匹配项,提前退出循环
+                    if (!found) {
+                        break;
+                    }
+                } while (f.contains("switchCase") && max < 20);
+            }
             if (f.contains("avg4segment")) {
                 Matcher m = RegexUtils.matcher(FC_REG + "(avg4segment)\\(([^)]+)\\)", f);
                 while (m.find()) {
@@ -5719,6 +5826,31 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return params;
     }
 
+    private Object multipleIfElse(String str,Map<String, Object> currentMap) {
+        str = str.replaceFirst("\\(","").replaceFirst("\\)$","");
+        // 解析参数,处理嵌套逗号(在括号内的逗号不应该作为分隔符)
+        List<String> pa = parseParameters(str);
+
+        if (pa.size() == 3) {
+            String s = pa.get(2);;
+            //
+            if(pa.get(2).contains("(")){
+                pa.set(2,"-10086");
+            }
+            String string = pa.get(0) + "?" + pa.get(1) + ":" + pa.get(2);
+            Expression parse = Expression.parse(string);
+            Object data = parse.calculate(currentMap);
+            //递归计算
+            if(Objects.equals(String.valueOf(data),"-10086")){
+                //进入递归算法
+                data = multipleIfElse(s,currentMap);
+            }
+            return data;
+        } else {
+            return null;
+        }
+    }
+
     /**
      * 符号替换
      * @param s1

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

@@ -563,8 +563,8 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
 
     @Override
-    public List<WbsTreePrivate> getTitleRange(String projectId) {
-        return this.baseMapper.getTitleRange(Long.valueOf(projectId));
+    public List<WbsTreePrivate> getTitleRange(String projectId,Integer wbsType) {
+        return this.baseMapper.getTitleRange(Long.valueOf(projectId),wbsType);
     }
 
     @Override