Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

liuyc 1 tahun lalu
induk
melakukan
a603f8e9f2
28 mengubah file dengan 454 tambahan dan 49 penghapusan
  1. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ContractInfo.java
  2. 26 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ExecutionTime.java
  3. 1 3
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FormulaVo.java
  4. 60 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InterimMeter.java
  5. 39 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InterimMeterPaySummary.java
  6. 67 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MeterApply.java
  7. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MeterType.java
  8. 8 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/Payment.java
  9. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ReportResult.java
  10. 21 4
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SubInterimMeterPaySummary.java
  11. 1 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenForm.java
  12. 16 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeTokenSelectVO.java
  13. 3 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java
  14. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/NodeTable.java
  15. 113 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorSpecial.java
  16. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java
  17. 4 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaDao.java
  18. 8 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaDaoImpl.java
  19. 3 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  20. 16 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java
  21. 14 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  22. 3 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ChangeTokenFormController.java
  23. 14 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MiddleMeterApplyController.java
  24. 3 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.xml
  25. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenFormService.java
  26. 1 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IMiddleMeterApplyService.java
  27. 5 5
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java
  28. 17 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ContractInfo.java

@@ -163,6 +163,9 @@ public class ContractInfo extends BaseEntity {
      */
     private Integer isArchivesAuto;
 
+    @ApiModelProperty(value = "计量是否允许超计 '0'否 '1'是")
+    private Integer isOverMeter;
+
 
     public String archivesUnit() {
 

+ 26 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ExecutionTime.java

@@ -0,0 +1,26 @@
+package org.springblade.manager.vo;
+
+/**
+ * @author yangyj
+ * @Date 2024/1/23 16:14
+ * @description 执行耗时统计
+ */
+public class ExecutionTime {
+    public static final String template="耗时:$1\n 总耗时:$2";
+    private final Long start;
+    private Long last;
+
+    public ExecutionTime() {
+        this.start=System.currentTimeMillis();
+        this.last=start;
+    }
+
+    public void info(String str){
+        long cur = System.currentTimeMillis();
+        long total=cur-start;
+        long part= cur-last;
+        last=cur;
+        String s = str+template.replace("$1",String.valueOf(part)).replace("$2",String.valueOf(total));
+        System.out.println(s);
+    }
+}

+ 1 - 3
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FormulaVo.java

@@ -5,8 +5,6 @@ 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;
@@ -14,7 +12,7 @@ import java.util.Map;
 /**
  * @author yangyj
  * @Date 2024/1/23 14:05
- * @description TODO
+ * @description 公式信息
  */
 @Data
 public class FormulaVo {

+ 60 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InterimMeter.java

@@ -0,0 +1,60 @@
+package org.springblade.manager.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author yangyj
+ * @Date 2024/1/24 15:13
+ * @description 中间计量表
+ */
+@Data
+public class InterimMeter {
+    public static final String ID="20270000000";
+    public static final String TBN="IMeter";
+    public static final String TBN_CH="中间计量表";
+
+    @JSONField(name = "key_0",label="计量单编号")
+    private String meterNumber;
+
+    @JSONField(name = "key_1",label="工程划分")
+    private String engineerDivide;
+
+    @JSONField(name = "key_2",label="部位名称")
+    private String partName;
+
+    @JSONField(name = "key_3",label="交工证书编号")
+    private String certificateNumber;
+
+    @JSONField(name = "key_4",label="计量金额")
+    private BigDecimal meterMoney;
+
+    @JSONField(name = "key_5",label="变更令编号")
+    private String changeTokenNumber;
+
+    @JSONField(name = "key_6",label="草图文件地址")
+    private String pictureUrl;
+
+    @JSONField(name = "key_7",label="草图文件名称")
+    private String pictureName;
+
+    @JSONField(name = "key_8",label="计算式")
+    private String calculateFormula;
+
+    @JSONField(name = "key_9",label="合同图号")
+    private String contractPicture;
+
+    @JSONField(name = "key_10",label="支付号")
+    private List<String> formNumberList;
+    @JSONField(name = "key_11",label="项目名称")
+    private List<String> itemNameList;
+    @JSONField(name = "key_12",label="单位")
+    private List<String> unitList;
+    @JSONField(name = "key_13",label="申报数量")
+    private List<String> completedList;
+
+}

+ 39 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InterimMeterPaySummary.java

@@ -0,0 +1,39 @@
+package org.springblade.manager.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * @author yangyj
+ * @Date 2024/1/24 14:37
+ * @description 中间计量支付汇总表
+ */
+@Data
+public class InterimMeterPaySummary {
+    public static final String ID="20260000000";
+    public static final String TBN="IMeterPaySum";
+    public static final String TBN_CH="中间计量支付汇总表";
+    @JSONField(name = "key_0",label="项目编号")
+    private String formNumber;
+    @JSONField(name = "key_1",label="项目名称",ordinal = 1)
+    private String itemName;
+    @JSONField(name = "key_2",label="凭证号",ordinal = 2)
+    private String meterNumber;
+    @JSONField(name = "key_3",label="单位",ordinal = 3)
+    private String unit;
+    @JSONField(name = "key_4",label="数量",ordinal = 4)
+    private String completed;
+    @JSONField(name = "key_5",label="单价",ordinal = 5)
+    private String price;
+    @JSONField(name = "key_6",label="金额",ordinal = 6)
+    private String money;
+    @JSONField(name = "key_7",label="备注",ordinal = 7)
+    private String remark;
+
+    public InterimMeterPaySummary(String itemName) {
+        this.itemName = itemName;
+    }
+
+    public InterimMeterPaySummary() {
+    }
+}

+ 67 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MeterApply.java

@@ -0,0 +1,67 @@
+package org.springblade.manager.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.math.BigDecimal;
+
+/**
+ * @author yangyj
+ * @Date 2024/1/24 15:54
+ * @description 中间计量申请映射
+ */
+@Data
+public class MeterApply {
+
+        private Long id;
+        /**
+         * 合同计量单元id
+         */
+        @ApiModelProperty(value = "合同计量单元id")
+        private Long contractUnitId;
+        /**
+         * 计量单编号
+         */
+        @ApiModelProperty(value = "计量单编号")
+        private String meterNumber;
+        /**
+         * 工程划分
+         */
+        @ApiModelProperty(value = "工程划分")
+        private String engineerDivide;
+        /**
+         * 部位名称
+         */
+        @ApiModelProperty(value = "部位名称")
+        private String partName;
+        /**
+         * 交工证书编号
+         */
+        @ApiModelProperty(value = "交工证书编号")
+        private String certificateNumber;
+        /**
+         * 计量金额
+         */
+        @ApiModelProperty(value = "计量金额")
+        private BigDecimal meterMoney;
+        /**
+         * 变更令编号
+         */
+        @ApiModelProperty(value = "变更令编号")
+        private String changeTokenNumber;
+        /**
+         * 草图文件
+         */
+        @ApiModelProperty(value = "草图文件地址")
+        private String pictureUrl;
+
+        @ApiModelProperty(value = "草图文件名称")
+        private String pictureName;
+        /**
+         * 计算式
+         */
+        @ApiModelProperty(value = "计算式")
+        private String calculateFormula;
+
+        @ApiModelProperty(value = "合同图号")
+        private String contractPicture;
+}

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MeterType.java

@@ -27,4 +27,6 @@ public enum MeterType {
            return values[0];
         }
     }
+
+
 }

+ 8 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/Payment.java

@@ -15,15 +15,21 @@ public class Payment {
     private Long  formId;
     /**计量单元id*/
     private Long  meterId;
+    /**中间计量申请Id*/
+    private Long  middleMeterId;
     /**清单编号*/
     private String number;
+    /**计量单编号*/
+    private String meterNumber;
     /**清单名称*/
     private String name;
+    /**单价*/
+    private String price;
     /**单位*/
     private String unit;
-    /*合同数量*/
+    /**合同数量*/
     private Integer contractTotal;
-    /*变更数量*/
+    /**变更数量*/
     private Integer changeTotal;
     /**完成数量*/
     private Integer completed;

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ReportResult.java

@@ -16,6 +16,8 @@ public class ReportResult {
     private String url;
     /**表编号*/
     private String initTableName;
+    /**清表模版*/
+    private Long excelId;
     /**表名*/
     private String name;
     /**每一页的数据,格式{y_x:val,y1_x1:val1...}{...}...*/

+ 21 - 4
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SubInterimMeterPaySummary.java

@@ -2,8 +2,11 @@ package org.springblade.manager.vo;
 
 import com.alibaba.fastjson.annotation.JSONField;
 import lombok.Data;
+import org.springblade.common.utils.BaseUtils;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @author yangyj
@@ -29,13 +32,13 @@ public class SubInterimMeterPaySummary {
     private String contractTotal;
     /**变更数量*/
     @JSONField(name = "key_4",label="变更数量",ordinal = 4)
-    private Integer revisedTotal;
+    private String revisedTotal;
     /**本次完成数量*/
     @JSONField(name = "key_5",label="本次完成数量",ordinal = 5)
-    private Integer currentPeriodCompleted;
+    private String currentPeriodCompleted;
     /**累计完成数量*/
     @JSONField(name = "key_6",label="累计完成数量",ordinal = 6)
-    private Integer completed;
+    private String completed;
     /**合同金额*/
     @JSONField(name = "key_7",label="合同金额",ordinal = 7)
     private String contractAmount;
@@ -47,8 +50,22 @@ public class SubInterimMeterPaySummary {
     private String currentPeriodPay;
     /**累计支付B金额*/
     @JSONField(name = "key_10",label="累计支付金额",ordinal = 10)
-    private BigDecimal currentPeriodEndPay;
+    private String currentPeriodEndPay;
     /**比例*/
     @JSONField(name = "key_11",label="变更令号",ordinal = 11)
     private String changeTokenId;
+
+    public void currentPeriodEndPayAdd(String n){
+          List<String> list = new ArrayList<>();
+          list.add(this.currentPeriodEndPay);
+          list.add(n);
+         this.setCurrentPeriodEndPay(list.stream().filter(BaseUtils::isNumber).map(BigDecimal::new).reduce(BigDecimal.ZERO,BigDecimal::add).toString());
+    }
+
+    public SubInterimMeterPaySummary(String itemName) {
+        this.itemName = itemName;
+    }
+
+    public SubInterimMeterPaySummary() {
+    }
 }

+ 1 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenForm.java

@@ -80,7 +80,7 @@ public class ChangeTokenForm extends BaseEntity {
      * 延长工期
      */
     @ApiModelProperty(value = "延长工期")
-    private Integer lengthenDays;
+    private String lengthenDays;
     /**
      * 变更申请金额
      */

+ 16 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeTokenSelectVO.java

@@ -0,0 +1,16 @@
+package org.springblade.meter.vo;
+
+import lombok.Data;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/1/23 11:00
+ **/
+@Data
+public class ChangeTokenSelectVO {
+    private Long contractId;
+    private Long nodeId;
+    private String ids;
+
+}

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

@@ -487,10 +487,10 @@ public class WbsParamController {
 
     /**按照项目id刷新无效文件题名*/
     @GetMapping("/file-title")
-    public R<Object> ref(Long projectId) {
+    public R<Object> ref(Long projectId,String info) {
         if (StringUtils.isNumber(projectId)) {
-            String sql ="select a.id, b.p_key_id pkeyId  from u_information_query a  join m_wbs_tree_contract b on a.wbs_id=b.p_Key_id where a.name='还未配置提名规则' and a.project_id=?";
-            List<Map<String,Object>> listMaps=this.jdbcTemplate.queryForList(sql,projectId);
+            String sql ="select a.id, b.p_key_id pkeyId  from u_information_query a  join m_wbs_tree_contract b on a.wbs_id=b.p_Key_id where a.name=? and a.project_id=?";
+            List<Map<String,Object>> listMaps=this.jdbcTemplate.queryForList(sql,info,projectId);
             if(listMaps.size()>0){
                 List<Long> pkeyIds= listMaps.stream().map(m->Long.parseLong(m.get("pkeyId").toString())).distinct().collect(Collectors.toList());
                 Map<Long,String> map = new HashMap<>(pkeyIds.size()*2);

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/NodeTable.java

@@ -12,6 +12,7 @@ public class NodeTable {
     private Long pKeyId;
     private String nodeName;
     private String initTableName;
+    private Long excelId;
     private String wbsId;
     private Integer tableType;
     private Long parentId;

+ 113 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorSpecial.java

@@ -36,6 +36,7 @@ public class ExecutorSpecial extends FormulaExecutor {
     private Function<Long, MeterPeriodInfo> interimMeterPeriodFc;
     private Function<Long, List<Payment>> paymentListFc;
     private Function<Long, List<InventoryForm>> inventoryFormFc;
+    private Function<Long, List<MeterApply>> meterApplyFc;
     public ExecutorSpecial(TableElementConverter tec) {
         super(tec);
     }
@@ -82,6 +83,16 @@ public class ExecutorSpecial extends FormulaExecutor {
         return fdm;
     }
 
+    public Integer getLineSize(List<String> codeFind){
+        int line=10;
+        Optional<FormData> formDataOp=  tec.getFormDataList().stream().filter(e-> BaseUtils.inChain(codeFind,e.getCode())).findAny();
+        if(formDataOp.isPresent()){
+            FormData target = formDataOp.get();
+           line= target.getCoordsList().size();
+        }
+        return line;
+    }
+
     @Override
     public void handle() {
         if(MeterType.MATERIAL.equals(tec.getMeterType())){
@@ -442,6 +453,8 @@ public class ExecutorSpecial extends FormulaExecutor {
         @Override
         public void parse() {
             LinkedHashMap<String,FormData> fdm = FormulaUtils.toFormDataMap(new SubprojectInterimPaymentSummary());
+            /*获取实际输出行数*/
+            this.capacity=getLineSize(new ArrayList<>(fdm.keySet()));
             Map<String,Function<List<SubprojectInterimPaymentSummary>,List<Object>>> functionMap =FormulaUtils.fieldDataFcMap(SubprojectInterimPaymentSummary.class);
             tec.getFormDataMap().putAll(fdm);
             Map<String,Summary> currentSummary = toSummary(current);
@@ -467,14 +480,7 @@ public class ExecutorSpecial extends FormulaExecutor {
                 }
                 dataList.add(sis);
             }
-            List<String> codeFind = new ArrayList<>(fdm.keySet());
-            /*获取实际输出行数*/
-            Optional<FormData> formDataOp=  tec.getFormDataList().stream().filter(e-> BaseUtils.inChain(codeFind,e.getCode())).findAny();
             List<SubprojectInterimPaymentSummary> outPutList= new ArrayList<>();
-            if(formDataOp.isPresent()){
-                  FormData target = formDataOp.get();
-                  capacity=target.getCoordsList().size();
-            }
             LinkedHashMap<String,List<SubprojectInterimPaymentSummary>> chapterGroup= dataList.stream().collect(Collectors.groupingBy(e->getPrefix(e.getFormNumber()),LinkedHashMap::new,Collectors.toList()));
             AtomicInteger loop = new AtomicInteger(chapterGroup.size());
             chapterGroup.forEach((k,v)->{
@@ -532,6 +538,7 @@ public class ExecutorSpecial extends FormulaExecutor {
 
     @Data
     public class SubIMeterPay implements Special{
+        private Integer capacity=10;
 
         @Override
         public boolean ready() {
@@ -543,12 +550,12 @@ public class ExecutorSpecial extends FormulaExecutor {
             smps.setItemName(payment.getName());
             smps.setFormNumber(payment.getNumber());
             smps.setUnit(payment.getUnit());
-            smps.setRevisedTotal(payment.getChangeTotal());
-            smps.setCurrentPeriodCompleted(payment.getCompleted());
-            smps.setCompleted(payment.getCompleted()+prePayment.getCompleted());
+            smps.setRevisedTotal(StringUtils.handleNull(payment.getChangeTotal()));
+            smps.setCurrentPeriodCompleted(StringUtils.handleNull(payment.getCompleted()));
+            smps.setCompleted(StringUtils.handleNull(payment.getCompleted()+prePayment.getCompleted()));
             smps.setRevisedAmount(payment.getChangeMoney());
             smps.setCurrentPeriodPay(payment.getMoney());
-            smps.setCurrentPeriodEndPay(new BigDecimal(payment.getMoney()).add(new BigDecimal(prePayment.getMoney())));
+            smps.setCurrentPeriodEndPay(StringUtils.handleNull(new BigDecimal(payment.getMoney()).add(new BigDecimal(prePayment.getMoney()))));
             return smps;
         };
 
@@ -558,6 +565,8 @@ public class ExecutorSpecial extends FormulaExecutor {
             /*根据每一期的s_middle_meter_apply,s_inventory_form_apply 获取对应的计量清单,然后根据清单Id配合s_inventory_form_meter查找计量单元信息*/
             /*s_change_token_inventory每个清单关联的变更令,s_change_token_meter每个计量单元关联的变更令*/
             LinkedHashMap<String,FormData> fdm = FormulaUtils.toFormDataMap(new SubInterimMeterPaySummary());
+            /*获取实际输出行数*/
+            this.capacity=getLineSize(new ArrayList<>(fdm.keySet()));
             Map<String,Function<List<SubInterimMeterPaySummary>,List<Object>>> functionMap =FormulaUtils.fieldDataFcMap(SubInterimMeterPaySummary.class);
             tec.getFormDataMap().putAll(fdm);
             try {
@@ -580,10 +589,20 @@ public class ExecutorSpecial extends FormulaExecutor {
                             }
                         }
                     });
+                    /*分组列表,每一组都是一个章节*/
                     List<List<SubInterimMeterPaySummary>> pageData =traversal(top);
                     List<SubInterimMeterPaySummary> dataList=  pageData.stream().flatMap(list->{
                         List<SubInterimMeterPaySummary> tmp =new ArrayList<>(list);
-                        tmp.add(new SubInterimMeterPaySummary());
+                        int size = (int)Math.ceil(tmp.size()/(double)this.capacity);
+                        /*每一章需要留一行做小计,其他要填充空白行*/
+                        SubInterimMeterPaySummary summary=  new SubInterimMeterPaySummary("小计");
+                        summary.setCurrentPeriodEndPay(tmp.stream().map(SubInterimMeterPaySummary::getCurrentPeriodEndPay).filter(BaseUtils::isNumber).map(BigDecimal::new).reduce(BigDecimal.ZERO,BigDecimal::add).toString());
+                        int over = size*capacity-1-tmp.size();
+                        if(over>0){
+                            /*填充空白行*/
+                            tmp.addAll(Collections.nCopies(over,new SubInterimMeterPaySummary()));
+                        }
+                        tmp.add(summary);
                        return tmp.stream();
                     }).collect(Collectors.toList());
                     /*内容输出*/
@@ -617,7 +636,7 @@ public class ExecutorSpecial extends FormulaExecutor {
                     tmpTree.peer=ss;
                 }else{
                     /*已存在则相加*/
-                    ss.setCurrentPeriodEndPay(ss.getCurrentPeriodEndPay().add(sp.getCurrentPeriodEndPay()));
+                    ss.currentPeriodEndPayAdd(sp.getCurrentPeriodEndPay());
                 }
                 node=node.getParent();
             }
@@ -652,6 +671,87 @@ public class ExecutorSpecial extends FormulaExecutor {
 
     }
 
+    @Data
+    public class IMeterPaySummary implements Special{
+        private Integer capacity=20;
+        @Override
+        public boolean ready() {
+            return current.size()>0;
+        }
+
+        @Override
+        public void parse() {
+            LinkedHashMap<String,FormData> fdm = FormulaUtils.toFormDataMap(new InterimMeterPaySummary());
+            /*获取实际输出行数*/
+            this.capacity=getLineSize(new ArrayList<>(fdm.keySet()));
+            Map<String,Function<List<InterimMeterPaySummary>,List<Object>>> functionMap =FormulaUtils.fieldDataFcMap(InterimMeterPaySummary.class);
+            tec.getFormDataMap().putAll(fdm);
+            List<InterimMeterPaySummary> dataList = new ArrayList<>();
+            for(Payment payment:current){
+                InterimMeterPaySummary imps = new InterimMeterPaySummary();
+                BeanUtils.copyProperties(payment,imps);
+                imps.setItemName(payment.getName());
+                imps.setFormNumber(payment.getNumber());
+                dataList.add(imps);
+            }
+            if(dataList.size()>0){
+                InterimMeterPaySummary summary = new InterimMeterPaySummary("合计");
+                double sum=dataList.stream().map(InterimMeterPaySummary::getMoney).filter(StringUtils::isNumber).mapToDouble(Double::parseDouble).sum();
+                summary.setMoney(StringUtils.number2StringZero(sum,2));
+                dataList.add(summary);
+            }
+            FormulaUtils.put2FormData(fdm,functionMap,dataList);
+        }
+    }
+
+    @Data
+    public class IMeter implements Special{
+        private Integer capacity=7;
+        @Override
+        public boolean ready() {
+            return current.size()>0;
+        }
+
+        @Override
+        public void parse() {
+            LinkedHashMap<String,FormData> fdm = FormulaUtils.toFormDataMap(new InterimMeter());
+            /*获取实际输出行数*/
+            this.capacity=getLineSize(new ArrayList<>(fdm.keySet()));
+            Map<String,Function<List<InterimMeter>,List<Object>>> functionMap =FormulaUtils.fieldDataFcMap(InterimMeter.class);
+            tec.getFormDataMap().putAll(fdm);
+            List<MeterApply> meterApplyList=meterApplyFc.apply(tec.getPeriodId());
+            Map<Long,List<Payment>> paymentGroup = current.stream().collect(Collectors.groupingBy(Payment::getMiddleMeterId));
+            List<InterimMeter> dataList = new ArrayList<>();
+            for(MeterApply meterApply:meterApplyList){
+                List<Payment> paymentList = paymentGroup.get(meterApply.getId());
+                List<List<Payment>> pageData = BaseUtils.splitList(paymentList,this.capacity);
+                for(List<Payment> payments:pageData){
+                    /*根据清单数量决定一条中间计量申请显示多少页*/
+                    InterimMeter iim = new InterimMeter();
+                    BeanUtils.copyProperties(meterApply,iim);
+                    int over = this.capacity-payments.size();
+                    List<String> formNumberList= payments.stream().map(Payment::getNumber).collect(Collectors.toList());
+                    List<String> itemNameList= payments.stream().map(Payment::getName).collect(Collectors.toList());
+                    List<String> unitList= payments.stream().map(Payment::getUnit).collect(Collectors.toList());
+                    List<String> completedList= payments.stream().map(p->StringUtils.handleNull(p.getCompleted())).collect(Collectors.toList());
+                    if(over>0){
+                        formNumberList.addAll(Collections.nCopies(over,StringPool.EMPTY));
+                        itemNameList.addAll(Collections.nCopies(over,StringPool.EMPTY));
+                        unitList.addAll(Collections.nCopies(over,StringPool.EMPTY));
+                        completedList.addAll(Collections.nCopies(over,StringPool.EMPTY));
+                    }
+                    iim.setFormNumberList(formNumberList);
+                    iim.setItemNameList(itemNameList);
+                    iim.setUnitList(unitList);
+                    iim.setCompletedList(completedList);
+                    dataList.add(iim);
+                }
+            }
+            FormulaUtils.put2FormData(fdm,functionMap,dataList);
+        }
+    }
+
+
     public interface  Special{
         /**是否满足执行条件*/
         boolean ready();

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java

@@ -108,7 +108,7 @@ public class TableElementConverter implements ITableElementConverter {
     /**输入输出转换,在创建TableElementConverter必须明确实例*/
     private final Converter in;
     private final Converter out;
-    /*计量属性*/
+    /**计量属性*/
     private Long periodId;
     /**计量类型*/
     private MeterType meterType;
@@ -458,6 +458,7 @@ public class TableElementConverter implements ITableElementConverter {
                    rt.setUrl(report.getHtmlUrl());
                    rt.setInitTableName(report.getInitTableName());
                    rt.setName(report.getNodeName());
+                   rt.setExcelId(report.getExcelId());
                    reportResults.add(rt);
                    List<FormData> fds =group.get(report.getInitTableName());
                    if(fds.size()>0){

+ 4 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaDao.java

@@ -15,14 +15,15 @@ public interface IFormulaDao {
     Function<Long, MeterPeriodInfo> getMeterPeriodFc();
     /**获取清单信息*/
     Function<Long, List<Material>> getMaterialFormFc();
-
     /**获取中间计量期*/
     Function<Long, MeterPeriodInfo> getInterimMeterPeriodFc();
     /**获取支付数据*/
     Function<Long, List<Payment>> getPaymentListFc();
-    /*获取合同计量清单*/
+    /**获取合同计量清单*/
     Function<Long,List<InventoryForm>> getInventoryFormFc();
-
+    /**获取计量单元树*/
     Function<Long,List<MeterTree>>  getMeterTreeFc();
+    /**获取中间计量申请*/
+    Function<Long,List<MeterApply>>  getMeterApplyFc();
 
 }

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

@@ -90,7 +90,7 @@ public class FormulaDaoImpl implements IFormulaDao {
     @Override
     public Function<Long, List<Payment>> getPaymentListFc() {
         return contractId->{
-            String paySql="select a.form_number number,a.form_name name ,a.current_meter_total completed ,current_meter_money money ,contract_meter_id meterId,b.id formId,b.chapter_number chapter, b.contract_money contractMoney,b.change_money,b.unit,contract_total ,change_total,c.sort,c.id periodId from s_inventory_form_apply a join s_contract_inventory_form b on a.contract_form_id=b.id join s_contract_meter_period c on a.contract_period_id=c.id where a.is_deleted=0 and a.approve_status=2 and a.contract_id="+contractId;
+            String paySql="select a.form_number number,a.form_name name ,a.middle_meter_id,a.current_meter_total completed ,a.current_price price,current_meter_money money,meter_number meterNumber ,contract_meter_id meterId,b.id formId,b.chapter_number chapter, b.contract_money contractMoney,b.change_money,b.unit,contract_total ,change_total,c.sort,c.id periodId from s_inventory_form_apply a join s_contract_inventory_form b on a.contract_form_id=b.id join s_contract_meter_period c on a.contract_period_id=c.id where a.is_deleted=0 and a.approve_status=2 and a.contract_id="+contractId;
             return this.jdbcTemplate.query(paySql,new BeanPropertyRowMapper<>(Payment.class));
         };
     }
@@ -111,6 +111,13 @@ public class FormulaDaoImpl implements IFormulaDao {
         };
     }
 
+    @Override
+    public Function<Long, List<MeterApply>> getMeterApplyFc() {
+        return   MeterPeriodId->{
+            String sql="select a.id,contract_unit_id,contract_period_id,period_number,meter_number,engineer_divide,part_name,certificate_number,meter_money,change_token_number,picture_url,picture_name,calculate_formula ,b.contract_picture from  s_middle_meter_apply a join s_meter_tree_contract b on a.contract_unit_id= b.id where a.contract_period_id="+MeterPeriodId;
+            return getEntityList(sql,MeterApply.class);
+        };
+    }
 
     public <T> List<T> getEntityList(String sql, Class<T> entityClass) {
         return  jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(entityClass));

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

@@ -2621,8 +2621,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         MeterType meterType = MeterType.getByIndex(type);
 
         /*元素创建*/
-        Map<String,String> parent=  getWtpParent(meterType.name(),contractInfo.getPId());
-        List<NodeTable> tableList=  this.getSqlList("select p_key_id pkeyId, node_name nodeName ,init_table_name initTableName,html_url htmlUrl  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"));
+        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  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"));
         Map<String,Map<String,String>> coordinateMap=tableList.stream().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"));
@@ -2651,6 +2651,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         special.setMaterialFormFc(this.formulaDao.getMaterialFormFc());
         special.setInterimMeterPeriodFc(this.formulaDao.getInterimMeterPeriodFc());
         special.setPaymentListFc(this.formulaDao.getPaymentListFc());
+        special.setMeterApplyFc(this.formulaDao.getMeterApplyFc());
         formulaHandleChains.add(special);
         /*通用计算*/
         formulaHandleChains.add(new ExecutorCalc(tec));

+ 16 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java

@@ -19,6 +19,7 @@ import org.springblade.manager.mapper.WbsParamMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.*;
 import org.springframework.cache.annotation.Cacheable;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -118,6 +119,21 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
     @Override
     public String createFileTitle(Long pkeyId) {
         WbsTreeContract wtc =this.treeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,pkeyId));
+        int loop=10;
+        do{
+            try {
+                WbsTreeContract  tmp = this.jdbcTemplate.queryForObject("select p_key_id, id,old_id,contract_id from m_wbs_tree_contract where id="+wtc.getOldId()+" and contract_id ="+wtc.getContractId()+" limit 1",new BeanPropertyRowMapper<>(WbsTreeContract.class));
+                if(tmp==null){
+                    loop=0;
+                }else{
+                    wtc=tmp;
+                    loop--;
+                }
+            }catch (Exception e){
+                loop=0;
+                e.printStackTrace();
+            }
+        }while (loop>0);
         return createFileTitle(wtc);
     }
 

+ 14 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -1936,18 +1936,29 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     public void batchResetHtmlUrl(List<WbsTreePrivate> wbsTreePrivateList) throws IOException, InterruptedException {
         //Thread.sleep(10000L);
         if (wbsTreePrivateList != null) {
+            String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+            String projectId = wbsTreePrivateList.get(0).getProjectId();
+            String dir = file_path + "/privateUrlCopy/" +projectId;
+            File directory = new File(dir);
+            if (!directory.exists()){
+                directory.mkdir();
+            }
             //存在htmlUrl才重新保存
+            System.out.println("copyHtml-去除空路径之前:"+wbsTreePrivateList.size());
             wbsTreePrivateList = wbsTreePrivateList.stream().filter(wtp -> StringUtils.isNotBlank(wtp.getHtmlUrl())).collect(Collectors.toList());
-            String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+            System.out.println("copyHtml-去除重复路径之前:"+wbsTreePrivateList.size());
+            wbsTreePrivateList = wbsTreePrivateList.stream().collect(Collectors.toMap(WbsTreePrivate::getHtmlUrl,wbs->wbs,(w1,w2)->w1))
+                                    .values().stream().collect(Collectors.toList());
+            System.out.println("copyHtml-去除重复路径之后:"+wbsTreePrivateList.size());
             //批量复制保存html
             for (WbsTreePrivate tree : wbsTreePrivateList) {
                 String[] split = tree.getHtmlUrl().split("/");
                 File file_in = ResourceUtil.getFile(tree.getHtmlUrl());
-                //File file_in = ResourceUtil.getFile("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\"+split[split.length-1]);
+//                File file_in = ResourceUtil.getFile("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\"+split[split.length-1]);
                 if (!file_in.exists() || file_in.length() == 0) {
                     continue;
                 }
-                String htmlUrl = file_path + "/privateUrlCopy/" + split[split.length - 1];
+                String htmlUrl = file_path + "/privateUrlCopy/" +projectId+"/"+ split[split.length - 1];
                 //String htmlUrl = "C:\\Users\\泓创研发01\\Desktop\\privateUrlCopy\\" + split[split.length-1];
                 File file_out = ResourceUtil.getFile(htmlUrl);
                 FileUtil.copy(file_in, file_out);

+ 3 - 3
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ChangeTokenFormController.java

@@ -118,7 +118,7 @@ public class ChangeTokenFormController extends BladeController {
 	/**
 	 * 新增-确认选择清单
 	 */
-	@GetMapping("/selectForm")
+	@PostMapping("/selectForm")
 	@ApiOperationSupport(order = 5)
 	@ApiOperation(value = "新增确认选择清单", notes = "传入选中的清单id,返回变更申请清单集合")
 	@ApiImplicitParams(value = {
@@ -126,8 +126,8 @@ public class ChangeTokenFormController extends BladeController {
 			@ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
 			@ApiImplicitParam(name = "ids", value = "选中的清单id,逗号拼接", required = true)
 	})
-	public R<List<ChangeFormVO2>> selectForm(Long contractId,Long nodeId,String ids) {
-		List<ChangeFormVO2> vos = changeTokenFormService.selectForm(contractId,nodeId,ids);
+	public R<List<ChangeFormVO2>> selectForm(@RequestBody ChangeTokenSelectVO vo) {
+		List<ChangeFormVO2> vos = changeTokenFormService.selectForm(vo);
 		return R.data(vos);
 	}
 

+ 14 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MiddleMeterApplyController.java

@@ -226,5 +226,18 @@ public class MiddleMeterApplyController extends BladeController {
         return R.data(middleMeterApplyService.test());
     }
 
-
+    /**
+     * 获取当前节点下,当期未被计量的所有清单
+     */
+    @PostMapping("/getCurrentNodeAllForm")
+    @ApiOperationSupport(order = 13)
+    @ApiOperation(value = "获取当前节点下,当期未被计量的所有清单", notes = "返回当前节点下,当期未被计量的所有清单集合")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "contractId", value = "合同id", required = true),
+            @ApiImplicitParam(name = "contractUnitId", value = "节点id", required = true),
+            @ApiImplicitParam(name = "contractPeriodId", value = "合同计量期id", required = true)
+    })
+    public R<List<MeterInventoryVO>> getCurrentNodeAllForm(@RequestBody MiddleMeterApply middleMeterApply) {
+        return R.data(middleMeterApplyService.getCurrentNodeAllForm(middleMeterApply));
+    }
 }

+ 3 - 3
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.xml

@@ -162,10 +162,10 @@
     <select id="selectForm" resultType="org.springblade.meter.vo.ChangeFormVO2">
         select id,form_number,form_name,current_price,
                 IFNULL((select change_build_picture_total
-        from s_inventory_form_meter ifm
-        WHERE contract_id = #{contractId} and is_deleted = 0 and ifm.contract_form_id = cif.id and ifm.contract_meter_id = #{nodeId}),0) as contractTotal
+                        from s_inventory_form_meter ifm
+                        WHERE contract_id = #{contractId} and is_deleted = 0 and ifm.contract_form_id = cif.id and ifm.contract_meter_id = #{nodeId}),0) as contractTotal
         from s_contract_inventory_form cif
-        where contract_id = #{contractId}
+        where contract_id = #{contractId} and current_price is not null
         and id in
         <foreach collection="ids" item="id" open="(" separator="," close=")">
             #{id}

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenFormService.java

@@ -58,7 +58,7 @@ public interface IChangeTokenFormService extends BaseService<ChangeTokenForm> {
     /**
      * 新增-确认选择清单
      */
-    List<ChangeFormVO2> selectForm(Long contractId,Long nodeId,String ids);
+    List<ChangeFormVO2> selectForm(ChangeTokenSelectVO vo);
 
     /**
      * 新增 变更令

+ 1 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IMiddleMeterApplyService.java

@@ -66,4 +66,5 @@ public interface IMiddleMeterApplyService extends BaseService<MiddleMeterApply>
 
     String test();
 
+    List<MeterInventoryVO> getCurrentNodeAllForm(MiddleMeterApply middleMeterApply);
 }

+ 5 - 5
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java

@@ -289,15 +289,15 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
      * 新增-确认选择清单
      */
     @Override
-    public List<ChangeFormVO2> selectForm(Long contractId,Long nodeId,String ids) {
+    public List<ChangeFormVO2> selectForm(ChangeTokenSelectVO v) {
         List<ChangeFormVO2> vos = new ArrayList<>();
-        if (StringUtils.isBlank(ids)){
+        if (StringUtils.isBlank(v.getIds())){
             return vos;
         }
-        List<Long> longs = Func.toLongList(ids);
-        vos = baseMapper.selectForm(contractId,longs,nodeId);
+        List<Long> longs = Func.toLongList(v.getIds());
+        vos = baseMapper.selectForm(v.getContractId(),longs,v.getNodeId());
         for (ChangeFormVO2 vo : vos) {
-            vo.setContractMeterId(nodeId);
+            vo.setContractMeterId(v.getNodeId());
             vo.setCurrentChangeTotal(BigDecimal.ZERO);
             vo.setChangeTotal(vo.getContractTotal());
             vo.setContractMoney(vo.getCurrentPrice().multiply(vo.getContractTotal()));

+ 17 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

@@ -538,6 +538,23 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         return "";
     }
 
+    /**
+     * 获取当前节点下,当期未被计量的所有清单
+     */
+    @Override
+    public List<MeterInventoryVO> getCurrentNodeAllForm(MiddleMeterApply apply) {
+        List<MeterInventoryVO> voList = new ArrayList<>();
+        //获取当前节点下所有未被计量的清单
+        List<ResolveInventoryVO> vos = this.addFormList(null, apply.getContractId(), apply.getContractPeriodId(), apply.getContractUnitId(), null, null);
+        if (vos.size() == 0){
+            return voList;
+        }
+        List<String> list = vos.stream().map(l -> l.getId()+"").collect(Collectors.toList());
+        String join = String.join(",", list);
+        voList = this.addResolveForm(apply.getContractId(), apply.getContractUnitId(), join);
+        return voList;
+    }
+
     //递归方法
     private void gatherSortNode(List<NodeSortVO> list,List<Long> ids){
         for (NodeSortVO vo : list) {