Ver Fonte

元素显示bug

yangyj há 2 anos atrás
pai
commit
2c4eb78272

Diff do ficheiro suprimidas por serem muito extensas
+ 24 - 877
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java


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

@@ -32,6 +32,7 @@ public interface WbsTreeMapper extends EasyBaseMapper<WbsTree> {
     Integer removeTableById(@Param("id") String id);
 
     List<WbsFormElementVO> selectFormElements(@Param("id") String id);
+    List<WbsFormElementVO> selectFormElements4TableId(@Param("id") String id);
 
     List<WbsFormElementVO> selectPrivateFormElements(@Param("id") String id);
 

+ 5 - 11
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml

@@ -366,22 +366,16 @@
     </select>
 
 
-    <select id="selectFormElements_bak" resultMap="wbsFormElementMap">
-        SELECT
-            w.f_id,w.e_key,w.id,w.e_name,e_type,e_length,e_allow_deviation,e_Inspection_method,
-            (select CONCAT(init_table_name,':',w.e_key) from m_wbs_tree where id = #{id} AND status = 1 AND is_deleted = 0) AS "tableElementKey",
-            (select init_table_name from m_wbs_tree where id = w.f_id AND type = 2 AND status = 1 AND is_deleted = 0 ) AS "initTableName"
-        FROM
-            m_wbs_form_element w
-        WHERE
-            is_deleted = 0 and f_id = #{id}
-    </select>
     <select id="selectFormElements" resultMap="wbsFormElementMap">
-        select f_id,e_key,a.id,e_name,e_type,e_length,e_allow_deviation,e_Inspection_method,CONCAT(b.parent_id,':',b.init_table_name,':',e_key) as tableElementKey,init_table_name as initTableName,
+        select f_id,e_key,a.id,e_name,e_type,e_length,e_allow_deviation,e_Inspection_method,CONCAT(b.init_table_name,':',e_key) as tableElementKey,init_table_name as initTableName,
                b.parent_id as nodeId
         from m_wbs_form_element a inner join m_wbs_tree b on a.f_id=b.init_table_id
         where b.id=#{id} and a.is_deleted=0
     </select>
+    <select id="selectFormElements4TableId" resultMap="wbsFormElementMap">
+        select f_id,e_key,c.id,e_name,e_type,e_length,e_allow_deviation,e_Inspection_method,CONCAT(b.init_table_name,':',e_key) as tableElementKey,init_table_name as initTableName, b.parent_id as nodeId from m_table_info a INNER JOIN m_wbs_tree b on a.tab_en_name=b.init_table_name INNER JOIN m_wbs_form_element c on c.f_id=b.init_table_id
+        where a.id =#{id} and c.is_deleted=0
+    </select>
 
     <select id="selectPrivateFormElements" resultMap="wbsFormElementMap">
         select  * from m_wbs_form_element a

+ 69 - 61
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -5,9 +5,8 @@ import cn.hutool.core.util.HashUtil;
 import cn.hutool.log.StaticLog;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.jfireel.expression.Expression;
-import com.jfireel.expression.node.CalculateNode;
 import com.mixsmart.utils.*;
-import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.CollectionUtil;
@@ -16,13 +15,12 @@ import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.dto.LocalVariable;
+import org.springblade.manager.dto.RangeInfo;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.Formula;
 import org.springblade.manager.entity.WbsParam;
 import org.springblade.manager.entity.WbsTreeContract;
-import org.springblade.manager.formula.Container;
 import org.springblade.manager.formula.FormulaStrategyFactory;
-import org.springblade.manager.formula.ITableElementConverter;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.formula.impl.CompositeDataAccess;
 import org.springblade.manager.formula.impl.TableElementConverter;
@@ -31,8 +29,6 @@ import org.springblade.manager.service.*;
 import org.springblade.manager.vo.AppWbsTreeContractVO;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
-
-import java.io.File;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -45,7 +41,7 @@ import java.util.stream.Collectors;
  */
 
 @Service
-@AllArgsConstructor
+@RequiredArgsConstructor
 public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula> implements IFormulaService {
 
     private final IWbsParamService wpService;
@@ -54,7 +50,11 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     private final IProjectInfoService projectInfoService;
     private final IWbsTreeContractService wbsTreeContractService;
     private final JdbcTemplate jdbcTemplate;
-    private final Container env;
+    /**  private final Container env;*/
+    private   TableElementConverter tec;
+    private   Map<String,Object> constantMap;
+    private   List<FormData> formDataList;
+    private   Map<Long,Map<String,Object>> crossDataMap;
 
 
 
@@ -72,7 +72,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     public static final String ELE_CODE_REG= "(?<=E\\[)[^]]+(?=\\])";
     public static final Pattern P = Pattern.compile(ELE_CODE_REG);
     public static final Pattern P2= Pattern.compile("(?<=E\\[)[^];]+:[^];]+:[^];]+(?=\\])");
-    public static final String POLY_REG= "(checkpoints|avg|min|max|sum|join|repeat|removeEmpty|listAt)\\(([^)]+)\\)";
+    public static final String POLY_REG= "(checkpoints|quantity|avg|min|max|sum|join|repeat|removeEmpty|listAt)\\(([^)]+)\\)";
     public static final Pattern POLY = Pattern.compile(POLY_REG);
     public final static String CTI="ContractInfo";
     public final static String PJI="ProjectInfo";
@@ -90,46 +90,41 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
      **/
     @Override
     public void execute(TableElementConverter tec) {
-        this.env.tec=tec;
+        this.tec=tec;
         /*初始化变量>>依赖排序>>预处理>>特殊公式>>通用公式执行>>数据格式化*/
-        this.init()
-                .sort()
-                .pre()
-                .special()
-                .calculate()
-                .format();
+        this.init().sort().pre().special().calculate().format();
        // WbsTreeContract one=  this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,tec.getNodeId()));
     }
 
     @Override
     public IFormulaService init() {
-        List<FormData> list =this.env.tec.getFds() ;
-        Long contractId=this.env.tec.getContractId();
-        WbsTreeContract one = this.env.tec.getOne();
+        List<FormData> list =this.tec.getFds();
+        Long contractId=this.tec.getContractId();
+        WbsTreeContract one = this.tec.getOne();
         Long id =Func.isNotEmpty(one.getOldId())?Long.parseLong(one.getOldId()):one.getParentId();
         Long primaryKeyId=one.getPKeyId();
-        this.env.constantMap=new HashMap<>(100);
-        this.env.formDataList=list;
-        this.env.constantMap.put("contractId",contractId);
-        keyWord(this.env.constantMap);
+        this.constantMap=new HashMap<>(100);
+        this.formDataList=list;
+        this.constantMap.put("contractId",contractId);
+        keyWord(this.constantMap);
         ContractInfo info =this.contractInfoService.getById(contractId);
         /*合同段信息*/
-        this.env.constantMap.put(CTI,info);
+        this.constantMap.put(CTI,info);
         /*项目信息*/
-        this.env.constantMap.put(PJI,this.projectInfoService.getById(info.getPId()));
+        this.constantMap.put(PJI,this.projectInfoService.getById(info.getPId()));
         /*wbs节点链*/
         List<WbsTreeContract> nodes = wpService.chain(contractId,id,primaryKeyId,null);
-        this.env.constantMap.put(CHAIN,nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
+        this.constantMap.put(CHAIN,nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
         /*节点参数*/
-        this.env.constantMap.put(WP,getWpMap(id,primaryKeyId));
+        this.constantMap.put(WP,getWpMap(id,primaryKeyId));
         /*表格名称*/
         List<AppWbsTreeContractVO> tableList =wbsTreeContractService.searchNodeAllTable(primaryKeyId.toString(), "1", contractId.toString(),info.getPId());
-        this.env.constantMap.put(TABLE_LIST,tableList);
+        this.constantMap.put(TABLE_LIST,tableList);
         /*通过判断元素名称来确定,加入汇总公式延后执行*/
-        this.env.constantMap.put("tableNames",tableList.stream().map(WbsTreeContract::getFullName).collect(Collectors.toList()));
+        this.constantMap.put("tableNames",tableList.stream().map(WbsTreeContract::getFullName).collect(Collectors.toList()));
         /*检查是否有跨节点数据*/
         List<FormData> crossNodeFd=new ArrayList<>();
-        this.env.formDataList.forEach(fd->{
+        this.formDataList.forEach(fd->{
             if(fd.executable()){
                Matcher matcher=P2.matcher(fd.getFormula().getFormula());
                while (matcher.find()){
@@ -139,7 +134,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                        /*暂时先只取第一个满足条件的*/
                        if(Func.isNotEmpty(targets)){
                            WbsTreeContract cross = targets.get(0);
-                           Map<String,Object> dataMap= this.env.crossDataMap.computeIfAbsent(cross.getPKeyId(),(k)->this.jdbcTemplate.queryForMap("select * from " + arr[1] + " where p_key_id=" + k));
+                           Map<String,Object> dataMap= this.crossDataMap.computeIfAbsent(cross.getPKeyId(),(k)->this.jdbcTemplate.queryForMap("select * from " + arr[1] + " where p_key_id=" + k));
                            if(dataMap.size()>0){
                                String v= StringUtils.handleNull(dataMap.get(arr[2]));
                                if(StringUtils.isNotEmpty(v)){
@@ -159,15 +154,18 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         });
         if(!crossNodeFd.isEmpty()){
             System.out.println("跨节点元素:"+crossNodeFd.stream().map(FormData::getCode).collect(Collectors.joining(",")));
-           this.env.formDataList.addAll(crossNodeFd);
+           this.formDataList.addAll(crossNodeFd);
         }
         /*实测值参数*/
-        List<Map<String,Object>>  textInfoMap= this.jdbcTemplate.queryForList("SELECT b.tab_id pkId, b.col_key ekey,b.col_name val ,c.init_table_name " +
+        List<Map<String,Object>>  textInfoMap= this.jdbcTemplate.queryForList("SELECT b.tab_id pkId, b.col_key ekey,b.col_name val ,c.init_table_name tableName " +
                 "from m_wbs_tree_contract a " +
                 "inner join m_textdict_info b on a.p_key_id=b.tab_id  " +
                 "INNER JOIN m_wbs_tree c on (a.id=c.id or a.old_id=bc.id) " +
-                "where a.p_key_id in("+ this.env.tec.getTableAll().stream().map(AppWbsTreeContractVO::getPKeyId).map(Func::toStr).collect(Collectors.joining(","))+") and b.type=8");
-
+                "where a.p_key_id in("+ this.tec.getTableAll().stream().map(AppWbsTreeContractVO::getPKeyId).map(Func::toStr).collect(Collectors.joining(","))+") and b.type=8");
+         if(Func.isNotEmpty(textInfoMap)){
+             Map<String,List<Map<String,Object>>> tmap = textInfoMap.stream().collect(Collectors.groupingBy(m->m.get("tableName")+StringPool.COLON+m.get("ekey")));
+             this.constantMap.put("tmap",tmap);
+         }
         /*检查项目*/
         return this;
     }
@@ -209,26 +207,26 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public IFormulaService sort() {
-        Map<Boolean,List<FormData>> map = this.env.formDataList.stream().collect(Collectors.partitioningBy(e->Func.isNotEmpty(e.getFormula())&&e.getFormula().getFormula().contains("E[")));
-        this.env.formDataList.clear();
+        Map<Boolean,List<FormData>> map = this.formDataList.stream().collect(Collectors.partitioningBy(e->Func.isNotEmpty(e.getFormula())&&e.getFormula().getFormula().contains("E[")));
+        this.formDataList.clear();
         /*没有依赖的*/
         List<FormData> simple=map.get(false);
         if(CollectionUtil.isNotEmpty(simple)){
-            this.env.formDataList.addAll(simple);
+            this.formDataList.addAll(simple);
         }
         /*有依赖的*/
         List<FormData> rely= map.get(true);
         if(CollectionUtil.isNotEmpty(rely)){
             sort(rely,((rely.size()+1)/2)*rely.size());
-            this.env.formDataList.addAll(rely);
+            this.formDataList.addAll(rely);
         }
         return this;
     }
 
     @Override
     public IFormulaService pre() {
-        if(CollectionUtil.isNotEmpty(this.env.formDataList)){
-            for(FormData fd:this.env.formDataList){
+        if(CollectionUtil.isNotEmpty(this.formDataList)){
+            for(FormData fd:this.formDataList){
                 /*预处理公式脚本*/
                 if(!fd.executable()){
                     /*不存公式,则认为执行完成,不会再主动执行*/
@@ -261,7 +259,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 }
                 if(CHECK_ITEMS.equals(tmp)){
                    /*获取type=1的检验单或者type=4的监表*/
-                   List<WbsTreeContract> tableList= (List<WbsTreeContract>) this.env.getConstantMap().get(TABLE_LIST);
+                   List<WbsTreeContract> tableList= (List<WbsTreeContract>) this.constantMap.get(TABLE_LIST);
                    Optional<WbsTreeContract> wop=tableList.stream().filter(e->e.getTableType()==1||e.getTableType()==4).findAny();
                    if(wop.isPresent()){
                       this.jdbcTemplate.queryForList("select c.e_name name ,c.init_table_name tableName,c.e_key ekey from m_wbs_tree_contract a INNER JOIN m_wbs_tree b on (a.id=b.id or a.old_id=b.id) INNER join m_wbs_form_element c on b.init_table_id=c.f_id where a.id={}  \n");
@@ -278,9 +276,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public IFormulaService special() {
-        for(FormData fd:this.env.formDataList) {
+        for(FormData fd:this.formDataList) {
             if(Func.isNotEmpty(fd.getFormula())) {
-                formulaStrategyFactory.get(fd).forEach(e -> e.execute(this.env.formDataList, this.env.constantMap));
+                formulaStrategyFactory.get(fd).forEach(e -> e.execute(this.formDataList, this.constantMap));
             }
         }
         return this;
@@ -291,17 +289,17 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         /*公式执行*/
         /*先处理聚合类的方法*/
         /*每次执行都会构造一个只有依赖的的集合*/
-        for(FormData fd:this.env.formDataList){
+        for(FormData fd:this.formDataList){
             if(fd.verify()){
                 Formula formula =fd.getFormula();
                 String f=formula.getFormula();
                 if(Func.isNotBlank(f)){
                     /*聚合运算*/
                     polymerization();
-                    Map<String, Object> currentMap = new HashMap<>(this.env.constantMap);
+                    Map<String, Object> currentMap = new HashMap<>(this.constantMap);
                     List<String>  relyList = fd.getFormula().getRelyList();
                     if(CollectionUtil.isNotEmpty(relyList)){
-                        List<FormData>  ele = this.env.formDataList.stream().filter(e->relyList.contains(e.getCode())).collect(Collectors.toList());
+                        List<FormData>  ele = this.formDataList.stream().filter(e->relyList.contains(e.getCode())).collect(Collectors.toList());
                         if(ele.size()<relyList.size()){
                             System.out.println("不满足依赖要求");
                         }
@@ -313,7 +311,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         List<LocalVariable>  local= new ArrayList<>();
                         while (cda.hasNext()){
                            LinkedHashMap<String,ElementData> tip= cda.next();
-                            Map<String, Object> variable = new HashMap<>(this.env.constantMap);
+                            Map<String, Object> variable = new HashMap<>(this.constantMap);
                             Map<String,Object> E=getMap(variable,"E");
                             for(Map.Entry<String,ElementData> se:tip.entrySet()){
                                 E.put(se.getKey(),se.getValue().getValue());
@@ -321,7 +319,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             local.add(new LocalVariable(0,f,variable));
                         }
                         if(local.size()>0){
-                            List<Object> values = slice( local,this.env.constantMap,f);
+                            List<Object> values = slice( local,this.constantMap,f);
                             if(values.size()>fd.getValues().size()){
                                 /*当生成的数据超过实际容量的时候,会自动合并到第一个单元格*/
                                 fd.getValues().get(0).setValue(values.stream().filter(Func::isNotEmpty).map(StringUtils::handleNull).collect(Collectors.joining("、")));
@@ -382,7 +380,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public void format() {
-        for(FormData fd:this.env.formDataList){
+        for(FormData fd:this.formDataList){
             if(fd.verify()){
                     /*保留小数位*/
                     Formula f = fd.getFormula();
@@ -510,7 +508,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
      * 先把公式脚本需要聚合部分预处理
      * */
     public void  polymerization(){
-        for(FormData fd:this.env.formDataList){
+        for(FormData fd:this.formDataList){
             Formula formula = fd.getFormula();
             if(Func.isNotEmpty(formula)){
                 String f=formula.getFormula();
@@ -522,17 +520,27 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             /*聚合*/
                             Matcher m = POLY.matcher(f);
                             while (m.find()) {
-                                Map<String, Object> currentMap = new HashMap<>(this.env.constantMap);
-                                List<String> relyList = fd.getFormula().getRelyList();
-                                List<FormData> tmp = this.env.formDataList.stream().filter(e -> relyList.contains(e.getCode())).collect(Collectors.toList());
-                                Map<String, Object> E = getMap(currentMap, "E");
-                                tmp.forEach(e -> E.put(e.getCode(), e.getValues().stream().map(ElementData::getValue).collect(Collectors.toList())));
-                                Object data = Expression.parse(CustomFunction.CLASS_CALL + m.group()).calculate(currentMap);
-//                                if(StringUtils.isNotEmpty(data)) {
-//                                    data = CustomFunction.setScale(data, StringUtils.getScale(data));
-//                                }
+                                Object data=null;
+                                if(f.contains("quantity(")){
+                                    String s = m.group(1).replace("'","");
+                                    Map<String,List<Map<String,Object>>> tmap= (Map<String, List<Map<String, Object>>>) this.constantMap.getOrDefault("tmap",new HashMap<>());
+                                    List<Map<String,Object>> tableColKeyVal= tmap.get(s);
+                                    if(Func.isNotEmpty(tableColKeyVal)){
+                                        data = tableColKeyVal.stream().map(map->{RangeInfo rangeInfo=BeanUtil.toBean((Map) map.get("val"), RangeInfo.class);return rangeInfo.getSize();}).collect(Collectors.toList());
+                                    }else{
+                                        /*手动计算*/
+                                        System.out.println("");
+                                    }
+                                }else{
+                                    Map<String, Object> currentMap = new HashMap<>(this.constantMap);
+                                    List<String> relyList = fd.getFormula().getRelyList();
+                                    List<FormData> tmp = this.formDataList.stream().filter(e -> relyList.contains(e.getCode())).collect(Collectors.toList());
+                                    Map<String, Object> E = getMap(currentMap, "E");
+                                    tmp.forEach(e -> E.put(e.getCode(), e.getValues().stream().map(ElementData::getValue).collect(Collectors.toList())));
+                                    data = Expression.parse(CustomFunction.CLASS_CALL + m.group()).calculate(currentMap);
+                                }
                                 String key ="HA"+HashUtil.identityHashCode(data);
-                                this.env.constantMap.put(key,data);
+                                this.constantMap.put(key,data);
                                 f = f.replace(CustomFunction.CLASS_CALL + m.group(), key);
                                 fd.getFormula().setFormula(f);
                                 /*更新依赖*/

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

@@ -21,6 +21,7 @@ import org.springblade.manager.entity.*;
 import org.springblade.manager.excel.WbsExcelBatchUtil;
 import org.springblade.manager.excel.WbsExcelUtil;
 import org.springblade.manager.mapper.*;
+import org.springblade.manager.service.ITableInfoService;
 import org.springblade.manager.service.IWbsFormElementService;
 import org.springblade.manager.service.IWbsTreeService;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -57,6 +58,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     private final BladeRedis bladeRedis;
     private final WbsParamServiceImpl wbsParamService;
     private final JdbcTemplate jdbcTemplate;
+    private final ITableInfoService tableInfoService;
 
     @Override
     public IPage<WbsTreeVO> selectWbsTreePage(IPage<WbsTreeVO> page, WbsTreeVO wbsTree) {
@@ -309,7 +311,12 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
     @Override
     public List<WbsFormElementVO> selectFormElements(String id, Long nodeId) {
-        List<WbsFormElementVO> wbsFormElements = wbsTreeMapper.selectFormElements(id);
+        List<WbsFormElementVO> wbsFormElements =null;
+         if( this.tableInfoService.count(Wrappers.<TableInfo>lambdaQuery().eq(TableInfo::getId,id))>0){
+              wbsFormElements = wbsTreeMapper.selectFormElements4TableId(id);
+         }else{
+              wbsFormElements = wbsTreeMapper.selectFormElements(id);
+         }
         wbsFormElements.forEach(elements -> {
             String eAllowDeviation = elements.getEAllowDeviation();
             //转义

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff