yangyj преди 1 година
родител
ревизия
d1a2a0d89a

+ 6 - 18
blade-service/blade-manager/src/main/java/com/jfireel/expression/Expression.java

@@ -13,8 +13,8 @@ public class Expression {
     private CalculateNode parseNode;
     private Deque<CalculateNode> nodes = new LinkedList<CalculateNode>();
     private String el;
-    private int function;
-    private Invoker head;
+    private final int function;
+    private final Invoker head;
     private static final Invoker DEFAULT_HEAD;
 
     static {
@@ -32,26 +32,14 @@ public class Expression {
                 new ConstantStringParser(), //
                 new NumberParser(), //
                 new IdentifierParser(), //
-                new OperatorParser()//
-        };
-        Invoker pred = new Invoker() {
-
-            @Override
-            public int parse(String el, int offset, Deque<CalculateNode> nodes, int function) {
-                return offset;
-            }
+                new OperatorParser(),//
+                new ChineseParser()
         };
+        Invoker pred = (el, offset, nodes, function) -> offset;
         for (int i = parsers.length - 1; i > -1; i--) {
             final NodeParser parser = parsers[i];
             final Invoker next = pred;
-            Invoker invoker = new Invoker() {
-
-                @Override
-                public int parse(String el, int offset, Deque<CalculateNode> nodes, int function) {
-                    return parser.parse(el, offset, nodes, function, next);
-                }
-            };
-            pred = invoker;
+            pred = (el1, offset, nodes1, function1) -> parser.parse(el1, offset, nodes1, function1, next);
         }
         DEFAULT_HEAD = pred;
     }

+ 35 - 0
blade-service/blade-manager/src/main/java/com/jfireel/expression/parse/impl/ChineseParser.java

@@ -0,0 +1,35 @@
+package com.jfireel.expression.parse.impl;
+
+import com.jfireel.expression.node.CalculateNode;
+import com.jfireel.expression.node.impl.StringNode;
+import com.jfireel.expression.parse.Invoker;
+import com.jfireel.expression.util.CharType;
+
+import java.util.Deque;
+
+/**
+ * @author yangyj
+ * @Date 2024/1/26 16:41
+ * @description 专门用来处理包含中文的变量
+ */
+public class ChineseParser extends NodeParser{
+    @Override
+    public int parse(String el, int offset, Deque<CalculateNode> nodes, int function, Invoker next) {
+        if (!CharType.isChineseChar(getChar(offset, el))) {
+            return next.parse(el, offset, nodes, function);
+        }
+        return parseChinese(el, offset, nodes);
+    }
+
+    private int parseChinese(String el, int offset, Deque<CalculateNode> nodes) {
+        int length = 0;
+        while (!CharType.isEnglishBracketOrComma(getChar(length + offset, el)) ) {
+            length++;
+        }
+        String literals = el.substring(offset, offset + length);
+        offset += length;
+        nodes.push(new StringNode(literals));
+        return offset;
+    }
+
+}

+ 1 - 1
blade-service/blade-manager/src/main/java/com/jfireel/expression/parse/impl/IdentifierParser.java

@@ -13,7 +13,7 @@ public class IdentifierParser extends NodeParser {
 
     @Override
     public int parse(String el, int offset, Deque<CalculateNode> nodes, int function, Invoker next) {
-        if (CharType.isAlphabet(getChar(offset, el)) == false) {
+        if (!CharType.isAlphabet(getChar(offset, el))) {
             return next.parse(el, offset, nodes, function);
         }
         return parseIdentifier(el, offset, nodes);

+ 3 - 7
blade-service/blade-manager/src/main/java/com/jfireel/expression/parse/impl/NumberParser.java

@@ -27,22 +27,18 @@ public class NumberParser extends NodeParser {
             if (nodes.peek() != null && nodes.peek().type() == Symbol.LEFT_PAREN) {
                 // 这种情况下,-代表是一个负数
                 return true;
-            } else if (nodes.peek() != null && nodes.peek().type() instanceof Operator == false) {
+            } else if (nodes.peek() != null && !(nodes.peek().type() instanceof Operator)) {
                 // 这种情况下,-是一个操作符
                 return false;
             } else {
                 throw new IllegalArgumentException("无法识别的-符号,不是负数也不是操作符,问题区间:" + el.substring(0, offset));
             }
-        } else if (CharType.isDigital(getChar(offset, el))) {
-            return true;
-        } else {
-            return false;
-        }
+        } else return CharType.isDigital(getChar(offset, el));
     }
 
     @Override
     public int parse(String el, int offset, Deque<CalculateNode> nodes, int function, Invoker next) {
-        if (match(el, offset, nodes, function) == false) {
+        if (!match(el, offset, nodes, function)) {
             return next.parse(el, offset, nodes, function);
         }
         int index = offset;

+ 3 - 3
blade-service/blade-manager/src/main/java/com/jfireel/expression/token/DefaultKeyWord.java

@@ -6,15 +6,15 @@ import java.util.Map;
 public enum DefaultKeyWord implements KeyWord {
     TRUE, FALSE, NULL;
 
-    private static Map<String, DefaultKeyWord> defaultKeeyWords = new HashMap<String, DefaultKeyWord>(128);
+    private static final Map<String, DefaultKeyWord> defaultKeyWords = new HashMap<>(128);
 
     static {
         for (DefaultKeyWord each : DefaultKeyWord.values()) {
-            defaultKeeyWords.put(each.name().toLowerCase(), each);
+            defaultKeyWords.put(each.name().toLowerCase(), each);
         }
     }
 
     public static DefaultKeyWord getDefaultKeyWord(String literals) {
-        return defaultKeeyWords.get(literals.toLowerCase());
+        return defaultKeyWords.get(literals.toLowerCase());
     }
 }

+ 19 - 0
blade-service/blade-manager/src/main/java/com/jfireel/expression/util/CharType.java

@@ -36,6 +36,25 @@ public class CharType {
         return ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z';
     }
 
+    /**
+     * 判断是否为中文
+     *
+     * @param ch 待判断的字符
+     * @return 是否为中文
+     */
+    public static boolean isChineseChar(final char ch) {
+        return ch >= 0x4E00 && ch <= 0x9FFF || ch >= 0x3400 && ch <= 0x4DBF;
+    }
+    /**
+     * 判断是右括号和顿号
+     *
+     * @param ch 待判断的字符
+     * @return 是否为右括号和顿号
+     */
+    public static boolean isEnglishBracketOrComma(final char ch) {
+        return ch == ')' || ch == ',';
+    }
+
     /**
      * 判断是否为数字.
      *

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

@@ -2783,7 +2783,7 @@ public class CustomFunction {
     }
 */
      /*字符模版*/
-      public static Object strTemplate(String template,List<Object>data){
+      public static Object strTemplate(List<Object>data,String template){
           if(BaseUtils.isNotEmpty(template)) {
               return data.stream().map(s -> template.replaceAll("\\{\\s*}", BaseUtils.handleNull(s))).collect(Collectors.toList());
           }

+ 10 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorInit.java

@@ -24,6 +24,8 @@ public class ExecutorInit extends FormulaExecutor {
     private  Function<Long, BaseInfo> baseInfoFc;
     private  Function<Long, MeterPeriodInfo>  meterPeriodFc;
     private Function<Long, List<MeterTree>> meterTreeFc;
+    private Function<Long, MeterPeriodInfo> interimMeterPeriodFc;
+
 
 
     public void handle() {
@@ -34,14 +36,16 @@ public class ExecutorInit extends FormulaExecutor {
         tec.formDataMap.putAll(FormulaUtils.toFormDataMap(baseInfo));
         if(MeterType.MATERIAL.equals(tec.getMeterType())||MeterType.START.equals(tec.getMeterType())){
             /*加载计量期信息*/
-            MeterPeriodInfo meterPeriod=meterPeriodFc.apply(tec.getReportId());
-            tec.setPeriodId(meterPeriod.getId());
-            tec.formDataMap.putAll(FormulaUtils.toFormDataMap(meterPeriod));
-            tec.getConstantMap().put(MeterPeriodInfo.TBN,meterPeriod);
+            tec.periodInfo=meterPeriodFc.apply(tec.getReportId());
+            tec.setPeriodId(tec.periodInfo.getId());
         }else if(MeterType.INTERIM.equals(tec.getMeterType())){
-               /*计量单元树*/
-                tec.setMeterTreeMap(getMeterTreeMapAsync(tec.getContractId()));
+            /*计量期*/
+            tec.periodInfo=interimMeterPeriodFc.apply(tec.getReportId());
+            /*计量单元树*/
+            tec.setMeterTreeMap(getMeterTreeMapAsync(tec.getContractId()));
         }
+        tec.formDataMap.putAll(FormulaUtils.toFormDataMap(tec.periodInfo));
+
 
     }
 

+ 4 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorSpecial.java

@@ -32,7 +32,6 @@ import java.util.stream.IntStream;
 @Data
 public class ExecutorSpecial extends FormulaExecutor {
     private Function<Long, List<Material>> materialFormFc;
-    private Function<Long, MeterPeriodInfo> interimMeterPeriodFc;
     private Function<Long, List<Payment>> paymentListFc;
     private Function<Long, List<InventoryForm>> inventoryFormFc;
     private Function<Long, List<MeterApply>> meterApplyFc;
@@ -44,8 +43,7 @@ public class ExecutorSpecial extends FormulaExecutor {
     private List<Payment>  previous =new ArrayList<>();
     /**本期支付信息*/
     private List<Payment>   current =new ArrayList<>();
-    /**计量期*/
-    private  MeterPeriodInfo periodInfo;
+
     private List<InterimPaymentCertificate> interimPaymentCertificates =new ArrayList<>();
     /*求百分比*/
     private BinaryOperator<String> ratioFc = (a,b)->{
@@ -283,8 +281,7 @@ public class ExecutorSpecial extends FormulaExecutor {
             /*数据获取start*/
               /*支付数据*/
              List<Payment> paymentList=paymentListFc.apply(tec.getContractId());
-             /*计量期*/
-              periodInfo=interimMeterPeriodFc.apply(tec.getPeriodId());
+
              /*合同计量清单*/
              List<InventoryForm> inventoryForms = inventoryFormFc.apply(tec.getContractId());
              InventoryForm root = null;
@@ -303,9 +300,9 @@ public class ExecutorSpecial extends FormulaExecutor {
 
              if(Func.isNotEmpty(paymentList)){
                  /*之前的计量期数据*/
-                 previous = paymentList.stream().filter(e->e.getSort()<periodInfo.getSort()).collect(Collectors.toList());
+                 previous = paymentList.stream().filter(e->e.getSort()<tec.periodInfo.getSort()).collect(Collectors.toList());
                  /*当前计量期数据*/
-                 current = paymentList.stream().filter(e-> e.getSort().equals(periodInfo.getSort())).collect(Collectors.toList());
+                 current = paymentList.stream().filter(e-> e.getSort().equals(tec.periodInfo.getSort())).collect(Collectors.toList());
                  /*往期每章节的实际花费*/
                  Map<String,BigDecimal> previousMoney= this.moneySum.apply(previous);
                  /*当前计量期每章节的实际花费*/

+ 3 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java

@@ -20,11 +20,7 @@ import org.springblade.manager.formula.FormulaLog;
 import org.springblade.manager.formula.ITableElementConverter;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.formula.NodeTable;
-import org.springblade.manager.vo.CurrentNode;
-import org.springblade.manager.vo.MeterTree;
-import org.springblade.manager.vo.MeterType;
-import org.springblade.manager.vo.ReportResult;
-import org.springframework.jdbc.core.JdbcTemplate;
+import org.springblade.manager.vo.*;
 
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
@@ -113,6 +109,8 @@ public class TableElementConverter implements ITableElementConverter {
     private  Long reportId;
     /**计量期Id*/
     private Long periodId;
+    /**计量期信息*/
+    public MeterPeriodInfo periodInfo;
     /**计量类型*/
     private MeterType meterType;
     /**计量单元树*/

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

@@ -78,8 +78,8 @@ public class FormulaDaoImpl implements IFormulaDao {
 
     @Override
     public Function<Long, MeterPeriodInfo> getInterimMeterPeriodFc() {
-        return  id->{
-            String sql="SELECT period_number name,sort from s_contract_meter_period where id ="+id;
+        return certificateId->{
+            String sql="select a.period_number number,a.sort from  s_contract_meter_period a join s_interim_pay_certificate b on a.id=b.contract_period_id where a.is_deleted=0 and b.id=="+certificateId;
             return this.jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<>(MeterPeriodInfo.class));
         };
     }

+ 11 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -2612,6 +2612,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         for(Map.Entry<String,Object> entry:map.entrySet()){
             result.put(entry.getKey(),StringUtils.handleNull(entry.getValue()));
         }
+        result.put("projectId",projectId);
         return result;
     }
 
@@ -2623,7 +2624,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
         /*元素创建*/
         Map<String,String> parent=  getWtpParent(meterType.getName(),contractInfo.getPId());
-        List<NodeTable> tableList=  this.getSqlList("select p_key_id pkeyId, node_name nodeName ,init_table_name initTableName,html_url htmlUrl ,excel_id excelId from  m_wbs_tree_private where ancestors like ? and LENGTH(html_url)>0 and is_deleted=0 and project_id=? and wbs_id=?",NodeTable.class,parent.get("path")+"%",contractInfo.getPId(),parent.get("wbsId"));
+        List<NodeTable> tableList=getTableListMeter(parent);
         Map<String,Map<String,String>> coordinateMap=tableList.parallelStream().collect(Collectors.toMap(NodeTable::getInitTableName,m->FormulaUtils.getElementCell(m.getHtmlUrl()),(v1,v2)->v2));
         List<FormData> processFds = this.createFormDataByTableName(tableList.stream().map(NodeTable::getInitTableName).collect(Collectors.joining("','")));
         listForMeter(processFds,contractInfo.getPId(),parent.get("id"));
@@ -2641,18 +2642,20 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         List<FormulaHandleChain> formulaHandleChains = new ArrayList<>();
         /*初始化*/
         ExecutorInit init= new ExecutorInit(tec);
-        init.setBaseInfoFc(this.formulaDao.getBaseInfoFc());
+/*        init.setBaseInfoFc(this.formulaDao.getBaseInfoFc());
         init.setMeterPeriodFc(this.formulaDao.getMeterPeriodFc());
-        init .setMeterTreeFc(this.formulaDao.getMeterTreeFc());
+        init .setMeterTreeFc(this.formulaDao.getMeterTreeFc());*/
+        BeanUtils.copyProperties(this.formulaDao,init);
         formulaHandleChains.add(init);
         formulaHandleChains.add(new ExecutorSort(tec));
         formulaHandleChains.add(new ExecutorPre(tec));
         /*特殊公式*/
         ExecutorSpecial special = new ExecutorSpecial(tec);
-        special.setMaterialFormFc(this.formulaDao.getMaterialFormFc());
+/*        special.setMaterialFormFc(this.formulaDao.getMaterialFormFc());
         special.setInterimMeterPeriodFc(this.formulaDao.getInterimMeterPeriodFc());
         special.setPaymentListFc(this.formulaDao.getPaymentListFc());
-        special.setMeterApplyFc(this.formulaDao.getMeterApplyFc());
+        special.setMeterApplyFc(this.formulaDao.getMeterApplyFc());*/
+        BeanUtils.copyProperties(this.formulaDao,special);
         formulaHandleChains.add(special);
         /*通用计算*/
         formulaHandleChains.add(new ExecutorCalc(tec));
@@ -2663,7 +2666,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return tec.getReportResults();
     }
 
-
+    public List<NodeTable> getTableListMeter(Map<String,String> parent){
+      return this.getSqlList("select p_key_id pkeyId, node_name nodeName ,init_table_name initTableName,html_url htmlUrl ,excel_id excelId from  m_wbs_tree_private where ancestors like ? and LENGTH(html_url)>0 and is_deleted=0 and project_id=? and wbs_id=?",NodeTable.class,parent.get("path")+"%",parent.get("projectId"),parent.get("wbsId"));
+    }