浏览代码

中间计量公式

yangyj 1 年之前
父节点
当前提交
ba80d6975c
共有 14 个文件被更改,包括 277 次插入21 次删除
  1. 26 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ExecutionTime.java
  2. 1 3
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FormulaVo.java
  3. 16 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InterimMeter.java
  4. 39 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InterimMeterPaySummary.java
  5. 66 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MeterApply.java
  6. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MeterType.java
  7. 6 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/Payment.java
  8. 7 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SubInterimMeterPaySummary.java
  9. 3 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java
  10. 81 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorSpecial.java
  11. 4 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaDao.java
  12. 8 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaDaoImpl.java
  13. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  14. 16 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java

+ 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 {

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

@@ -0,0 +1,16 @@
+package org.springblade.manager.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * @author yangyj
+ * @Date 2024/1/24 15:13
+ * @description 中间计量表
+ */
+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 formNumber;
+}

+ 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() {
+    }
+}

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

@@ -0,0 +1,66 @@
+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 {
+
+        /**
+         * 合同计量单元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];
         }
     }
+
+
 }

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

@@ -17,13 +17,17 @@ public class Payment {
     private Long  meterId;
     /**清单编号*/
     private String number;
+    /**计量单编号*/
+    private String meterNumber;
     /**清单名称*/
     private String name;
+    /**单价*/
+    private String price;
     /**单位*/
     private String unit;
-    /*合同数量*/
+    /**合同数量*/
     private Integer contractTotal;
-    /*变更数量*/
+    /**变更数量*/
     private Integer changeTotal;
     /**完成数量*/
     private Integer completed;

+ 7 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SubInterimMeterPaySummary.java

@@ -51,4 +51,11 @@ public class SubInterimMeterPaySummary {
     /**比例*/
     @JSONField(name = "key_11",label="变更令号",ordinal = 11)
     private String changeTokenId;
+
+    public SubInterimMeterPaySummary(String itemName) {
+        this.itemName = itemName;
+    }
+
+    public SubInterimMeterPaySummary() {
+    }
 }

+ 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);

+ 81 - 8
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() {
@@ -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).reduce(BigDecimal.ZERO,BigDecimal::add));
+                        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());
                     /*内容输出*/
@@ -652,6 +671,60 @@ 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<InterimMeter> dataList = new ArrayList<>();
+            FormulaUtils.put2FormData(fdm,functionMap,dataList);
+        }
+    }
+
+
     public interface  Special{
         /**是否满足执行条件*/
         boolean ready();

+ 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.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 id,node_name,node_code,parent_id,sort from  s_meter_tree_contract where   is_deleted=0 and contract_id ="+MeterPeriodId;
+            return getEntityList(sql,MeterApply.class);
+        };
+    }
 
     public <T> List<T> getEntityList(String sql, Class<T> entityClass) {
         return  jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(entityClass));

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

@@ -2621,7 +2621,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         MeterType meterType = MeterType.getByIndex(type);
 
         /*元素创建*/
-        Map<String,String> parent=  getWtpParent(meterType.name(),contractInfo.getPId());
+        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  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("','")));
@@ -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);
     }