Browse Source

维护工具:当前节点实际执行公式获取

yangyj 1 year ago
parent
commit
0b836f92c3

+ 79 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FormulaVo.java

@@ -0,0 +1,79 @@
+package org.springblade.manager.vo;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+import org.springblade.core.tool.utils.Func;
+
+import javax.validation.constraints.Size;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author yangyj
+ * @Date 2024/1/23 14:05
+ * @description TODO
+ */
+@Data
+public class FormulaVo {
+    private Long id;
+    private String rely;
+    private String formula;
+    private String formulaParse;
+    private String number;
+    private Integer orderNum;
+    private String remark;
+    @JsonIgnore
+    private String map;
+    private Integer scale;
+    private Integer batch;
+    /**
+     * 输出模式,0自动 1填充
+     */
+    private Integer outm;
+    /**
+     * 关联的节点参数id
+     */
+    private Long paramId;
+    /**
+     * 偏差范围
+     */
+    private String dev;
+    /**
+     * 版本号
+     */
+    private Integer ver;
+
+
+    public List<String> getRelyList() {
+        if (Func.isNotBlank(rely)) {
+            return Arrays.asList(rely.split(","));
+        } else {
+            return null;
+        }
+    }
+
+
+    public JSONObject getJson() {
+        JSONObject jsonObject =JSON.parseObject(map);
+        String devStr = jsonObject.getString("deviationRangeJson");
+        if(devStr!=null&&devStr.length()>2){
+            jsonObject.fluentPut("deviationRangeJson",JSON.parseObject(devStr));
+        }
+        return jsonObject;
+    }
+
+    public void setFormulaParse(Map<String,String> dict) {
+        if(Func.isNotEmpty(rely)){
+            String f = getFormula();
+            for(String key:getRelyList()){
+                if(dict.containsKey(key)) {
+                    f = f.replace(key, dict.get(key));
+                }
+            }
+            this.formulaParse = f;
+        }
+    }
+}

+ 11 - 77
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -38,10 +38,12 @@ import org.springblade.manager.vo.CurrentNode;
 import org.springblade.manager.wrapper.FormulaWrapper;
 import org.springframework.beans.BeanUtils;
 import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.http.HttpRequest;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.validation.constraints.NotNull;
 import java.io.FileNotFoundException;
 import java.net.UnknownHostException;
@@ -570,83 +572,7 @@ public class FormulaController {
         return R.data(map);
     }
 
-  /*  public R<Object> chartInit(@RequestBody ChartOption option){
-        *//*1.获取公式配置,如果存在子公式,则一直查找到最终公式*//*
-        *//*2.查找所有依赖元素的所有数据,按表单排序*//*
-        *//*3.计算结果*//*
-        *//*4.查找当前表对应返回配置模版结合计算结果生成option*//*
-        Long pkeyId=option.getPkeyId();
-        String id=option.getId();
-        WbsTreePrivate wtp = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId,pkeyId));
-        if(wtp!=null&&Func.isNotEmpty(id)){
-            *//*获取配置*//*
-            List<Map<String,Object>> listMap= this.jdbcTemplate.queryForList("select content from m_formula_panel  a  join m_wbs_tree_private b on a.id=b.init_table_id where b.p_key_id="+pkeyId);
-            if(Func.isNotEmpty(listMap)){
-                JSONObject job = JSON.parseObject(listMap.get(0).get("content").toString());
-                *//*获取关联数据*//*
-                List<Map<String,Object>>  configList= this.jdbcTemplate.queryForList("select d.rely ,b.e_key ekey from m_wbs_tree_private a join  m_wbs_form_element b on a.init_table_id=b.f_id join m_element_formula_mapping c on b.id=c.element_id join m_formula d on c.formula_id=d.id  where p_key_id="+wtp.getPKeyId()+" and b.is_deleted=0 and  d.formula like 'FC.chart%' limit 1");
-                if(Func.isNotEmpty(configList)){
-                    Map<String,Object> config =configList.get(0);
-                    String[] rely = Func.toStr(config.get("rely")).split(",");
-                    String ky=rely[0].split(":")[1];
-                    String kx=rely[1].split(":")[1];
-                    Map<String,Map<String,Object>> formMap = option.getData();
-                    List<Map<String,Object>> dataMap;
-                    if(formMap!=null&&formMap.size()>0){
-                        dataMap=new ArrayList<>();
-                        Map<String,Object> md= new HashMap<>();
-                        dataMap.add(md);
-                        StringBuilder sy= new StringBuilder();
-                        StringBuilder sx = new StringBuilder();
-                        formMap.forEach((o,t)->{
-                            t.forEach((k,v)->{
-                                String[] ka=k.split("__");
-                                if(ky.equals(ka[0])){
-                                    sy.append(v).append("_^_").append(ka[1]).append("☆");
-                                }else if(kx.equals(ka[0])){
-                                    sx.append(v).append("_^_").append(ka[1]).append("☆");
-                                }
-                            });
-                        });
-                        if(sy.length()>1){
-                            sy.deleteCharAt(sy.length()-1);
-                        }
-                        if(sx.length()>1){
-                            sx.deleteCharAt(sx.length()-1);
-                        }
-                        md.put(ky,sy.toString());
-                        md.put(kx,sx.toString());
-                    }else{
-                        dataMap= this.jdbcTemplate.queryForList("select "+ky+","+kx+" from "+wtp.getInitTableName() +" where group_id="+id+" and p_key_id ="+pkeyId);
-                    }
-                    if(Func.isNotEmpty(dataMap)){
-                        Map<String,Object> data = dataMap.get(0);
-                        String dy= Func.toStr(data.get(ky));
-                        String dx=Func.toStr(data.get(kx));
-                        if(dy.length()>0&&dx.length()>0){
-                            Map<String,String> coordsMap = FormulaUtils.getElementCell(wtp.getHtmlUrl());
-                            List<ElementData> ly = FormulaUtils.getElementDataList(coordsMap.get(ky),dy);
-                            List<ElementData> lx = FormulaUtils.getElementDataList(coordsMap.get(kx),dx);
-                            JSONArray jsonArray =new JSONArray();
-                            for(int i=0;i< Math.min(ly.size(),lx.size());i++){
-                                ElementData edy= ly.get(i);
-                                ElementData edx = lx.get(i);
-                                if(StringUtils.isNotEmpty(edy.stringValue(),edx.stringValue())){
-                                    jsonArray.add(new JSONArray().fluentAdd(edx.numberValue()).fluentAdd(edy.numberValue()));;
-                                }
-                            }
-                            if(!jsonArray.isEmpty()){
-                                JSONObject chartData= job.getJSONArray("series").getJSONObject(0);
-                                chartData.put("data",jsonArray);
-                            }
-                        }
-                    }
-                    return R.data(job);
-                }
-            }
-        }
-        return R.data("{}");
-    }*/
+
     @PostMapping("/chart-init")
     @ApiOperationSupport(order = 11)
     public R<Object> chartInit(@RequestBody ChartOption option){
@@ -862,6 +788,7 @@ public class FormulaController {
         return R.fail("失败");
     }
 
+    /*按项目向m_wbs_tree_contract刷入is_type_private_pid字段*/
     @GetMapping("/ref")
     public R<Object> ref(Long projectId) {
         if(!StringUtils.isNumber(projectId)){
@@ -938,6 +865,12 @@ public class FormulaController {
          return this.service.evaluate(tablePkeyId);
     }
 
+    /*根据p_key_id 获取各个元素的执行公式*/
+    @GetMapping("/formulaForNode")
+    public R<Object> formulaForNode(@NotNull Long pkeyId,String tableName,String elementName){
+        return R.data(this.service.formulasForNode(pkeyId,tableName, elementName));
+    }
+
     @GetMapping("/test")
     public R<Object> meter(Long contractId,Long periodId ,Integer type){
         /* public  List<ReportResult> execute3(Long contractId,Long periodId ,Integer type)*/
@@ -946,4 +879,5 @@ public class FormulaController {
 
 
 
+
 }

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

@@ -89,7 +89,8 @@ public interface IFormulaService extends BaseService<Formula> {
     R<Object> evaluate(Long pkeyId);
     /**获取当前节点的参数wbsNodeId:WBS级id ,wtpPkeyId:项目级PkeyId*/
     List<WbsParam> getNodeWps(Long wbsNodeId,Long wtpPkeyId);
-    /*计量公式执行 0中间,1材料,2开工*/
+    /**计量公式执行 0中间,1材料,2开工*/
     List<ReportResult> execute3(Long contractId, Long periodId, Integer type);
 
+    R<Object>formulasForNode(Long pkeyId,String tableName,String elementName);
 }

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

@@ -398,6 +398,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     }
 
 
+
     @Override
     public void formulaFillData2(JSONArray dataArray, ExecuteType type) {
         try {

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

@@ -37,6 +37,7 @@ import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.*;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.vo.*;
+import org.springframework.beans.BeanUtils;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
@@ -1709,6 +1710,58 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return Collections.emptyList();
     }
 
+    @Override
+    public R<Object> formulasForNode(Long pkeyId ,String tableName,String elementName) {
+            long start = System.currentTimeMillis();
+            WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract> lambdaQuery().eq(WbsTreeContract::getPKeyId,pkeyId));
+            if(wtc!=null) {
+                System.out.println("A0耗时"+(System.currentTimeMillis()-start));
+                List<Map<String, Object>> listMap = this.jdbcTemplate.queryForList("select init_table_name number ,node_name nodeName ,b.tab_ch_name tableName from m_wbs_tree_contract a  join m_table_info b on a.init_table_name = b.tab_en_name where parent_id =?  and a.is_deleted=0 and contract_id = ?", wtc.getId(), wtc.getContractId());
+                Predicate<Map<String, Object>> tableNameFilter = map ->true;
+                if(Func.isNotEmpty(tableName)){
+                    tableNameFilter=map->map.get("nodeName").toString().contains(tableName);
+                }
+                Map<String, Map<String, Object>> tablesMap = listMap.stream().filter(tableNameFilter).collect(Collectors.toMap(m -> m.get("number").toString(), m -> m, (m1, m2) -> m1));
+                System.out.println("A1耗时"+(System.currentTimeMillis()-start));
+                if(tablesMap.size()>0) {
+                    String tableNames = String.join("','", tablesMap.keySet());
+                    List<FormData> processFds = this.createFormDataByTableName(tableNames);
+                    System.out.println("B耗时"+(System.currentTimeMillis()-start));
+                    if(processFds.size()>0) {
+                        Predicate<FormData> elementFilter = ele ->true;
+                        if(Func.isNotEmpty(elementName)){
+                            elementFilter=ele->ele.getEName().contains(elementName);
+                        }
+                        Map<String,String> dictMap = processFds.stream().collect(Collectors.toMap(FormData::getCode,fd->fd.getTableChName()+":"+fd.getEName(),(p,n)->p));
+                        processFds=processFds.stream().filter(elementFilter).collect(Collectors.toList());
+                        this.formulaInto(processFds, wtc.getProjectId(), String.valueOf(pkeyId), ExecuteType.INSPECTION);
+                        System.out.println("C耗时"+(System.currentTimeMillis()-start));
+                        Map<String, List<Map<String, Object>>> fdGroup = processFds.stream()
+                                .filter(FormData::executable)
+                                .collect(Collectors.groupingBy(
+                                        FormData::getTableChName,
+                                        Collectors.mapping(formData -> {
+                                                    Map<String, Object> show = new HashMap<>();
+                                                    FormulaVo vo= new FormulaVo();
+                                                    BeanUtils.copyProperties(formData.getFormula(),vo);
+                                                    vo.setFormulaParse(dictMap);
+                                                    show.put("formula", vo);
+                                                    show.put("name", formData.getEName());
+                                                    show.put("code",formData.getCode());
+                                                    return show;
+                                                },
+                                                Collectors.toList()
+                                        )));
+                        System.out.println("D耗时"+(System.currentTimeMillis()-start));
+                        return R.data(fdGroup);
+                    }
+                    return R.data("元素不存在");
+                }
+                return R.data("表不存在");
+            }
+            return R.data("节点不存在");
+    }
+
     @Override
     public void formulaInto(List<FormData> curFormDatas, String projectId, String nodeId, ExecuteType executeType) {
         if(executeType.equals(ExecuteType.INSPECTION)){
@@ -1806,7 +1859,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
        }
        return this.wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getId,wtc.getId()).eq(WbsTreePrivate::getProjectId,wtc.getProjectId()));
     }
-    private List<KeyMapper> listForContract(List<Long> ids,String projectId,String nodeId){
+    /*表id,项目id,节点Id*/
+    public List<KeyMapper> listForContract(List<Long> ids,String projectId,String nodeId){
         List<Map<String,Object>> listMap = listMap(ids,ExecuteType.INSPECTION);
         WbsTreePrivate wtp =wtpId(Long.parseLong(nodeId));
         if(Func.isNotEmpty(listMap)){