yangyj hace 2 años
padre
commit
34c04c2595

+ 10 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaOption.java

@@ -9,7 +9,15 @@ import lombok.Data;
  */
 @Data
 public class FormulaOption {
-    private Long pKeyId;
-    private Integer value;
+    private Long id;
+    private Long parentId;
     private String key;
+    private Long contractId;
+    private String value;
+    private Long pKeyId;
+    private Integer scope;
+
+    public String toSql(){
+        return ","+pKeyId+","+parentId+","+key+","+contractId+",'"+value+"',"+pKeyId+","+scope;
+    }
 }

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

@@ -1801,6 +1801,12 @@ public class CustomFunction {
 	public static Object gfn(Object ob1,Object ob2){
 		return _gfn(ob1,ob2);
 	}
+	public static Object gfn(List<Object> list){
+		if(ListUtils.isNotEmpty(list)){
+			return _gfn(list.toArray());
+		}
+		return "";
+	}
 	/**
 	 * @Description  返回第一个不为空的对象
 	 * @Param
@@ -1830,6 +1836,23 @@ public class CustomFunction {
 	}
 
 
+	public Object checkItemName(List<Object> data,List<Object> names){
+		if(ListUtils.isNotEmpty(data)&&ListUtils.isNotEmpty(names)&&data.size()!=names.size()){
+			StringBuilder sb = new StringBuilder();
+			for(int i=0;i< data.size();i++){
+				List<Object> datas= obj2ListNe(data.get(i));
+				if(datas.stream().anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isNotEquals("/",e))){
+					sb.append(names.get(i)).append(",");
+				}
+			}
+			if(sb.length()>1){
+				sb.deleteCharAt(sb.length()-1);
+			}
+			return sb.toString();
+		}
+		return "";
+	}
+
 	/**
 	 * @Description 三元运算 bool?o1:o2 ,默认返回空字符串
 	 * @Param [bool, o1, o2]
@@ -2595,6 +2618,8 @@ public class CustomFunction {
 
 
 
+
+
 	/**
 	 * @Description String 转List
 	 * @Param [o, separator]

+ 47 - 18
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -21,15 +21,9 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.RegexUtil;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.dto.*;
-import org.springblade.manager.entity.ElementFormulaMapping;
-import org.springblade.manager.entity.Formula;
-import org.springblade.manager.entity.TextdictInfo;
-import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.entity.*;
 import org.springblade.manager.formula.KeyMapper;
-import org.springblade.manager.service.IElementFormulaMappingService;
-import org.springblade.manager.service.IExcelTabService;
-import org.springblade.manager.service.ITextdictInfoService;
-import org.springblade.manager.service.IWbsTreeContractService;
+import org.springblade.manager.service.*;
 import org.springblade.manager.service.impl.FormulaServiceImpl;
 import org.springblade.manager.wrapper.FormulaWrapper;
 import org.springframework.dao.EmptyResultDataAccessException;
@@ -56,6 +50,7 @@ public class FormulaController {
     private final IExcelTabService tabService;
     private final IElementFormulaMappingService elementFormulaMappingService;
     private final JdbcTemplate jdbcTemplate;
+    private final IContractInfoService contractInfoService;
     private final ITextdictInfoService textdictInfoService;
     /**
      * 新增或修改
@@ -315,14 +310,21 @@ public class FormulaController {
     @GetMapping("/panel")
     @ApiOperationSupport(order = 10)
     @ApiOperation(value = "公式交互面板", notes = "公式交互面板")
-    public R<Object> panel(Long pkeyId ,String key,String projectId)  {
+    public R<Object> panel(FormulaOption fo)  {
              Map<String,Object> result = new LinkedHashMap<>();
-              key=key.replaceAll("__[\\d_]+","");
-              List<KeyMapper> kms =  this.service.getKeyMapperList(Collections.singletonList(pkeyId),projectId);
+             String  key=fo.getKey();
+             if(fo.getScope()==0){
+                 /*针对元素级别*/
+               key=key.replaceAll("__[\\d_]+","");
+             }
+              ContractInfo contract = this.contractInfoService.getById(fo.getContractId());
+              List<KeyMapper> kms =  this.service.getKeyMapperList(Collections.singletonList(fo.getPKeyId()),contract.getPId());
               if(Func.isNotEmpty(kms)&&Func.isNotEmpty(kms.get(0).getFormulaId())){
                    Formula formula = this.service.getById(kms.get(0).getFormulaId());
+                   /*临时处理,等确定数据结构在优化*/
                    if(formula.getFormula().contains(".option")){
                        result.put("type","radio");
+                       result.put("scope",0);
                        Map<String,Object> info = new LinkedHashMap<>();
                        result.put("info",info);
                        info.put("label","是否引用公式数据");
@@ -334,9 +336,37 @@ public class FormulaController {
                         value.add(n);
                         y.put("label","是");
                         y.put("value",1);
-                        n.put("label","是");
-                        n.put("value",1);
-                   }
+                        n.put("label","否");
+                        n.put("value",0);
+                       List<Map<String,Object>> mapList=this.jdbcTemplate.queryForList("select id,parent_id parentId,table_id pkeyId,value,key,contract_id contractId,scope from m_formula_option where scope=0 and parent_id ="+fo.getParentId()+" and key='"+key+"' and contract_id="+fo.getContractId());
+                       if(Func.isNotEmpty(mapList)){
+                           result.put("data",mapList.get(0));
+                       }
+                   }else if (StringUtils.isEquals("MILE",formula.getNumber())){
+                      if(StringUtils.isEquals(key,formula.getRelyList().get(0).split(StringPool.COLON)[1])){
+                          result.put("type","radio");
+                          result.put("scope",1);
+                          Map<String,Object> info = new LinkedHashMap<>();
+                          result.put("info",info);
+                          info.put("label","竖直方向");
+                          List<Map<String,Object>> value = new ArrayList<>();
+                          info.put("value",value);
+                          Map<String,Object> y=new LinkedHashMap<>();
+                          Map<String,Object> n=new LinkedHashMap<>();
+                          value.add(y);
+                          value.add(n);
+                          y.put("label","是");
+                          y.put("value",1);
+                          n.put("label","否");
+                          n.put("value",0);
+                          List<Map<String,Object>> mapList=this.jdbcTemplate.queryForList("select id,parent_id parentId,table_id pkeyId,value,key,contract_id contractId,scope from m_formula_option where scope=1 and table_id="+fo.getPKeyId()+" and parent_id ="+fo.getParentId()+" and key='"+key+"' and contract_id="+fo.getContractId());
+                          if(Func.isNotEmpty(mapList)){
+                              result.put("data",mapList.get(0));
+                          }
+                      }
+                  }
+              }else{
+                  R.success("暂无公式控件");
               }
              return R.data(result);
     }
@@ -345,11 +375,10 @@ public class FormulaController {
     @ApiOperationSupport(order = 10)
     @ApiOperation(value = "公式交互面板参数保存", notes = "公式交互面板参数保存")
     public R<Object> panelSave( @RequestBody FormulaOption fo){
-            List<Map<String,Object>> mapList = this.jdbcTemplate.queryForList("select parent_id pid,contract_id cid from m_wbs_tree_contract where p_key_id="+fo.getPKeyId());
-            if(Func.isNotEmpty(mapList)){
-                  Map<String,Object> map = mapList.get(0);
-                   this.jdbcTemplate.execute("");
+            if(Func.isNotEmpty(fo.getId())){
+                this.jdbcTemplate.execute("delete from m_formula_option where id="+fo.getId());
             }
+            this.jdbcTemplate.execute("insert into m_formula_option values ("+SnowFlakeUtil.get()+fo.toSql()+")");
            return    R.success("保存成功");
     }
 

+ 9 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -248,9 +248,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     public Map<String, String> getTableCols(AppWbsTreeContractVO wbsTreeContract) throws FileNotFoundException {
         Map<String, String> dataMap = new HashMap<>();
-        if (Func.isEmpty(wbsTreeContract.getHtmlUrl())) {
-            return dataMap;
-        }
         File file1 = ResourceUtil.getFile(wbsTreeContract.getHtmlUrl());
         FileInputStream fileInputStream = new FileInputStream(file1);
         String htmlString = IoUtil.readToString(fileInputStream);
@@ -759,10 +756,13 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                              data.put(eNames.get(i),values.get(i));
                          }
                          f=f.replace(m.group(),putDataWithKey(data));
+                         if(f.contains("ENAME")){
+                             f=f.replace("ENAME",putDataWithKey(target.stream().map(FormData::getEName).collect(Collectors.toList())));
+                         }
                      }
                  }
                  if(f.contains(".option")){
-                     Matcher m = RegexUtils.matcher("T\\(com.mixsmart.utils.CustomFunction\\)\\.(option)\\(([^]]+)\\)",f);
+                     Matcher m = RegexUtils.matcher("T\\(com.mixsmart.utils.CustomFunction\\)\\.(optionC?)\\(([^]]+)\\)",f);
                      while (m.find()){
                        String[] args= m.group(2).split(",");
                        String flag=args[0];
@@ -774,6 +774,11 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                Map<String,Object> dictMap = (Map<String, Object>) this.constantMap.computeIfAbsent("OPTION",k->new HashMap<>());
                                flag=StringUtils.handleNull(dictMap.get(findStr));
                            }
+                       }else if(flag.contains("E[")){
+                           List<FormData> target = getFormDataByCode(flag);
+                           if(target.size()>1){
+                              flag= target.get(0).getValues().stream().map(ElementData::stringValue).filter(StringUtils::isNotEmpty).findFirst().orElse("0");
+                           }
                        }
                        if(Func.isBlank(flag)){
                            /*默认0*/