瀏覽代碼

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
liuyc 1 年之前
父節點
當前提交
dc63f550e6
共有 31 個文件被更改,包括 417 次插入181 次删除
  1. 4 0
      blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java
  2. 21 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/AdvancePaymentCertificate.java
  3. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/Material.java
  4. 22 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/StartPayForm.java
  5. 2 2
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/InventoryFormApply.java
  6. 1 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/InventoryFormMeter.java
  7. 1 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterTreeContract.java
  8. 3 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MiddleMeterApply.java
  9. 1 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ContractFromVO.java
  10. 7 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/InventoryFormApplyVO.java
  11. 6 3
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterInventoryVO.java
  12. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  13. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java
  14. 11 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorInit.java
  15. 44 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java
  16. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaDao.java
  17. 8 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaDaoImpl.java
  18. 0 11
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  19. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  20. 24 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MeterTreeController.java
  21. 99 111
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  22. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.xml
  23. 6 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InventoryFormApplyMapper.java
  24. 5 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InventoryFormApplyMapper.xml
  25. 7 7
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.xml
  26. 6 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IInventoryFormApplyService.java
  27. 2 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IInventoryFormMeterService.java
  28. 3 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java
  29. 45 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InventoryFormApplyServiceImpl.java
  30. 11 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InventoryFormMeterServiceImpl.java
  31. 69 30
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

+ 4 - 0
blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java

@@ -121,6 +121,10 @@ public class BaseUtils {
       return Pattern.matches(NUM_REG,stringValue);
     }
 
+    public static  boolean isNotNumber(Object value){
+        return !isNumber(value);
+    }
+
     /**
      * @Description  根据指定大小对LIST进行切分
      * @Param [list, chunkSize:每一段长度]

+ 21 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/AdvancePaymentCertificate.java

@@ -0,0 +1,21 @@
+package org.springblade.manager.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * @author yangyj
+ * @Date 2024/2/26 15:57
+ * @description 开工预付款支付证书
+ */
+public class AdvancePaymentCertificate {
+    public static final String ID="20280000000";
+    public static final String TBN="APayCert";
+    public static final String TBN_CH="开工预付款支付证书";
+    /**项目名称*/
+    @JSONField(name = "key_1",label="上次开工预付款",ordinal = 1)
+    private String previousStayPay;
+    @JSONField(name = "key_2",label="本次申请预付开工预付款",ordinal = 2)
+    private String currentStayPay;
+    @JSONField(name = "key_3",label="累计预付开工预付款",ordinal = 3)
+    private String totalStayPay;
+}

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

@@ -52,8 +52,8 @@ public class Material {
         data.add(index);
         data.add(materialName);
         data.add(unit);
-        data.add(price);
         data.add(meterAmount);
+        data.add(price);
         data.add(sum);
         data.add(ratio);
         data.add(advancePayment);

+ 22 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/StartPayForm.java

@@ -0,0 +1,22 @@
+package org.springblade.manager.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * @author yangyj
+ * @Date 2024/2/26 16:24
+ * @description 开工预付款计量清单
+ */
+@Data
+public class StartPayForm {
+    /**计量期id*/
+    private Long meterPeriodId;
+    /**
+     * 计量金额
+     */
+    private String meterMoney;
+    /**计量期排序*/
+    private Integer periodSort;
+}

+ 2 - 2
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/InventoryFormApply.java

@@ -108,8 +108,8 @@ public class InventoryFormApply extends BaseEntity {
     @ApiModelProperty(value = "审批状态,0未上报,1待审批,2已审批,3已废除")
     private Integer approveStatus;
 
-    @ApiModelProperty(value = "最高支付比例")
-    private Integer upPayRatio;
+    @ApiModelProperty(value = "支付比例")
+    private BigDecimal payRatio;
 
     @ApiModelProperty(value = "支付金额")
     private BigDecimal PayMoney;

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

@@ -79,7 +79,7 @@ public class InventoryFormMeter extends BaseEntity {
     private BigDecimal changeBuildPictureMoney;
 
     @ApiModelProperty(value = "最高支付比例")
-    private Integer upPayRatio;
+    private BigDecimal upPayRatio;
 
     @ApiModelProperty(value = "最高支付金额")
     private BigDecimal upPayMoney;

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

@@ -93,6 +93,6 @@ public class MeterTreeContract extends BaseEntity {
     private Integer isLock;
 
     @ApiModelProperty(value = "最高支付比例")
-    private Integer upPayRatio;
+    private BigDecimal upPayRatio;
 
 }

+ 3 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MiddleMeterApply.java

@@ -132,5 +132,8 @@ public class MiddleMeterApply extends BaseEntity {
     @ApiModelProperty(value = "审批状态,0未上报,1待审批,2已审批,3已废除")
     private Integer approveStatus;
 
+    @ApiModelProperty(value = "是否关联质检资料1是0否")
+    private Integer isLinkData;
+
 
 }

+ 1 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ContractFromVO.java

@@ -109,7 +109,7 @@ public class ContractFromVO {
     private Integer citeStatus;
 
     @ApiModelProperty(value = "最高支付比例")
-    private Integer upPayRatio;
+    private BigDecimal upPayRatio;
 
     @ApiModelProperty(value = "最高支付比例金额")
     private BigDecimal upPayMoney;

+ 7 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/InventoryFormApplyVO.java

@@ -16,10 +16,13 @@
  */
 package org.springblade.meter.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.meter.entity.InventoryFormApply;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.math.BigDecimal;
+
 /**
  * 工程清单与中间计量申请	中间表视图实体类
  *
@@ -29,6 +32,9 @@ import lombok.EqualsAndHashCode;
 @Data
 @EqualsAndHashCode(callSuper = true)
 public class InventoryFormApplyVO extends InventoryFormApply {
-	private static final long serialVersionUID = 1L;
+	private static final long serialVersionUID = 456L;
+
+	@ApiModelProperty(value = "是否关联质检资料1是0否")
+	private Integer isLinkData;
 
 }

+ 6 - 3
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterInventoryVO.java

@@ -65,12 +65,15 @@ public class MeterInventoryVO {
     private BigDecimal contractChangeAllTotal;
 
     @ApiModelProperty(value = "最高支付比例")
-    private Integer upPayRatio;
+    private BigDecimal upPayRatio;
+
+    @ApiModelProperty(value = "支付比例")
+    private BigDecimal payRatio;
 
     @ApiModelProperty(value = "最高支付金额")
     private BigDecimal upPayMoney;
 
-    @ApiModelProperty(value = "其他期支付金额")
-    private BigDecimal otherPayMoney;
+    @ApiModelProperty(value = "其他期支付比例")
+    private BigDecimal otherPayRatio;
 
 }

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

@@ -144,7 +144,8 @@ public class FormulaController {
                 old.setMap(fa.getMap());
                 old.setDev(fa.getDev());
                 old.setScale(fa.getScale());
-                this.service.update(Wrappers.<Formula>lambdaUpdate().set(Formula::getFormula,fa.getFormula()).set(Formula::getMap,fa.getMap()).set(Formula::getDev,fa.getDev()).set(Formula::getScale,fa.getScale()).eq(Formula::getId,fa.getId()));
+              //  this.service.updateById(old);
+                this.service.update(Wrappers.<Formula>lambdaUpdate().set(Formula::getFormula,fa.getFormula()).set(Formula::getMap,fa.getMap()).set(Formula::getRely,fa.getRely()).set(Formula::getDev,fa.getDev()).set(Formula::getScale,fa.getScale()).eq(Formula::getId,fa.getId()));
                 return R.data(fa.getId());
             }
         }

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java

@@ -294,6 +294,7 @@ public class WbsTreeController extends BladeController {
          Set<String> set = new HashSet<>();
          set.add(BaseInfo.ID);
          set.add(MeterPeriodInfo.ID);
+         set.add(AdvancePaymentCertificate.ID);
          set.add(InterimPaymentCertificate.ID);
          set.add(InterimPaymentSummary.ID);
          set.add(SubprojectInterimPaymentSummary.ID);
@@ -307,6 +308,7 @@ public class WbsTreeController extends BladeController {
     static {
         MODEL_MAP.put(BaseInfo.ID,FormulaUtils.toElementVos(BaseInfo.class));
         MODEL_MAP.put(MeterPeriodInfo.ID,FormulaUtils.toElementVos(MeterPeriodInfo.class));
+        MODEL_MAP.put(AdvancePaymentCertificate.ID,FormulaUtils.toElementVos(AdvancePaymentCertificate.class));
         MODEL_MAP.put(InterimPaymentCertificate.ID,FormulaUtils.toElementVos(InterimPaymentCertificate.class));
         MODEL_MAP.put(InterimPaymentSummary.ID,FormulaUtils.toElementVos(InterimPaymentSummary.class));
         MODEL_MAP.put(SubprojectInterimPaymentSummary.ID,FormulaUtils.toElementVos(SubprojectInterimPaymentSummary.class));

+ 11 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorInit.java

@@ -3,12 +3,16 @@ package org.springblade.manager.formula.impl;
 import com.mixsmart.utils.FormulaUtils;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.common.utils.BaseUtils;
+import org.springblade.core.tool.utils.RegexUtil;
 import org.springblade.manager.dto.TreeNode;
 import org.springblade.manager.vo.*;
 
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Function;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * @author yangyj
@@ -38,6 +42,13 @@ public class ExecutorInit extends FormulaExecutor {
         if(MeterType.MATERIAL.equals(tec.getMeterType())||MeterType.START.equals(tec.getMeterType())){
             /*加载计量期信息*/
             tec.periodInfo=meterPeriodFc.apply(tec.getReportId());
+            String periodNumber = tec.periodInfo.getPeriodNumber();
+            if(!BaseUtils.isNumber(periodNumber)){
+                periodNumber= RegexUtil.findResult("[\\d一二三四五六七八九十]+",periodNumber);
+              if(periodNumber!=null){
+                  tec.periodInfo.setPeriodNumber(periodNumber);
+              }
+            }
             tec.setPeriodId(tec.periodInfo.getId());
         }else if(MeterType.INTERIM.equals(tec.getMeterType())){
             /*计量期*/

+ 44 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -36,6 +36,7 @@ public class ExecutorMeter extends FormulaExecutor {
     private Function<Long, List<Payment>> paymentListFc;
     private Function<Long, List<InventoryForm>> inventoryFormFc;
     private Function<Long, List<MeterApply>> meterApplyFc;
+    private Function<Long, List<StartPayForm>> stayPayFormFc;
     private ElementWriter elementWriter;
     /*执行链*/
     private List<Special> specialList = new ArrayList<>();
@@ -93,6 +94,7 @@ public class ExecutorMeter extends FormulaExecutor {
     public void handle() {
         this.elementWriter=new MeterElementWriter();
         if(MeterType.MATERIAL.equals(tec.getMeterType())){
+            /*材料预付款支付申请表处理*/
             this.specialList.add(new MaterialCalc());
         }else if(MeterType.INTERIM.equals(tec.getMeterType())){
             this.specialList.add(new InterimPayCert());
@@ -101,11 +103,46 @@ public class ExecutorMeter extends FormulaExecutor {
             this.specialList.add(new SubIMeterPay());
             this.specialList.add(new IMeterPaySummary());
             this.specialList.add(new IMeter());
+        }else if(MeterType.START.equals(tec.getMeterType())){
+            /*开工预付款支付证书处理*/
+            this.specialList.add(new StayPayCalc());
         }
         this.specialList.stream().filter(Special::ready).forEach(Special::parse);
     }
 
+    @Data
+    public  class StayPayCalc implements Special{
 
+        @Override
+        public boolean ready() {
+            return true;
+        }
+
+        public void parse(){
+            LinkedHashMap<String,FormData>  fdm = FormulaUtils.toFormDataMap(AdvancePaymentCertificate.class);
+            List<StartPayForm> startPayForms= stayPayFormFc.apply(tec.getContractId());
+            if(Func.isNotEmpty(startPayForms)){
+                startPayForms.sort(Comparator.comparingInt(StartPayForm::getPeriodSort));
+                double sum,previousD,currentD;
+                List<StartPayForm> current = startPayForms.stream().filter(s->s.getMeterPeriodId().equals(tec.getPeriodId())).collect(Collectors.toList());
+                if(current.size()>0){
+                    StartPayForm one = current.get(0);
+                    sum= startPayForms.stream().filter(s->s.getPeriodSort()<=one.getPeriodSort()).mapToDouble(s->Double.parseDouble(s.getMeterMoney())).sum();
+                    /*累计*/
+                    elementWriter.write(fdm.get("key_3"),StringUtils.number2String(sum,2));
+                    currentD=startPayForms.stream().mapToDouble(s->Double.parseDouble(s.getMeterMoney())).sum();
+                    elementWriter.write(fdm.get("key_2"),StringUtils.number2String(currentD,2));
+                    /*上一期*/
+                  Optional<Integer> op=startPayForms.stream().map(StartPayForm::getPeriodSort).filter(s->s<one.getPeriodSort()).max(Comparator.comparingInt(s->s));
+                  if(op.isPresent()){
+                      previousD= startPayForms.stream().filter(s->s.getPeriodSort().equals(one.getPeriodSort())).mapToDouble(s->Double.parseDouble(s.getMeterMoney())).sum();
+                      elementWriter.write(fdm.get("key_1"),StringUtils.number2String(previousD,2));
+                  }
+                }
+            }
+        }
+
+    }
 
     @Data
     public  class MaterialCalc implements Special{
@@ -139,6 +176,9 @@ public class ExecutorMeter extends FormulaExecutor {
                         candidate.add(t);
                     }
                 }
+                if(candidate.size()<14){
+                    candidate.addAll(list);
+                }
            }else{
                /*假如不存在配置,则尝试自动识别*/
                 candidate.addAll(list);
@@ -180,14 +220,14 @@ public class ExecutorMeter extends FormulaExecutor {
                 for(Material m:materials){
                     m.setIndex(n++);
                     m.setRatio(baseInfo.getDeductRatio()*100+"%");
-                    m.setAdvancePayment(StringUtils.number2StringZero(Double.parseDouble(m.getSum())*baseInfo.getDeductRatio(),1));
+                    m.setAdvancePayment(StringUtils.number2StringZero(Double.parseDouble(m.getSum())*baseInfo.getDeductRatio(),2));
                 }
-                this.total=StringUtils.number2StringZero(materials.stream().mapToDouble(m->Double.parseDouble(m.getSum())).sum(),1);
-                this.totalAdvance=StringUtils.number2StringZero(materials.stream().mapToDouble(m->Double.parseDouble(m.getAdvancePayment())).sum(),1);
+                this.total=StringUtils.number2StringZero(materials.stream().mapToDouble(m->Double.parseDouble(m.getSum())).sum(),2);
+                this.totalAdvance=StringUtils.number2StringZero(materials.stream().mapToDouble(m->Double.parseDouble(m.getAdvancePayment())).sum(),2);
                 /*合计*/
                 Material summary= new Material();
                 summary.setMaterialName("合计");
-                summary.setIndex(materials.size());
+                summary.setIndex(materials.size()+1);
                 summary.setSum(this.total);
                 summary.setAdvancePayment(this.totalAdvance);
                 materials.add(summary);

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaDao.java

@@ -12,6 +12,8 @@ public interface IFormulaDao {
     Function<Long, MeterPeriodInfo> getMeterPeriodFc();
     /**获取清单信息*/
     Function<Long, List<Material>> getMaterialFormFc();
+    /**开工预付款支付清单*/
+    Function<Long, List<StartPayForm>> getStayPayFormFc();
     /**获取中间计量期*/
     Function<Long, MeterPeriodInfo> getInterimMeterPeriodFc();
     /**获取支付数据*/

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

@@ -53,7 +53,7 @@ public class FormulaDaoImpl implements IFormulaDao {
            List<MeterPeriodInfo> beans = this.jdbcTemplate.query("select b.id,b.period_number periodNumber,b.period_name periodName,a.print_date formPrintDate ,a.repayment_cause cause from s_material_start_statement a join  s_meter_period b on a.meter_period_id=b.id where a.id="+id, new BeanPropertyRowMapper<>(MeterPeriodInfo.class));
             if(beans.size()>0){
                 MeterPeriodInfo bean = beans.get(0);
-                List<Map<String,Object>> listMap= this.jdbcTemplate.queryForList("select sum(b.current_amount) currentAmount from s_meter_period a join s_meter_period b on (a.contract_id=b.contract_id and a.type=b.type) where a.id="+id+" and b.id<>"+id);
+                List<Map<String,Object>> listMap= this.jdbcTemplate.queryForList("select sum(b.current_amount) currentAmount from s_meter_period a join s_meter_period b on (a.contract_id=b.contract_id and a.type=b.type) where a.id="+bean.getId()+" and  a.sort>b.sort");
                 if(listMap.size()>0) {
                     String str=StringUtils.handleNull(listMap.get(0).get("currentAmount"));
                     if(StringUtils.isNumber(str)) {
@@ -74,6 +74,13 @@ public class FormulaDaoImpl implements IFormulaDao {
         };
     }
 
+    @Override
+    public Function<Long, List<StartPayForm>> getStayPayFormFc() {
+        return  contractId->{
+            String sql="select a.meter_money meterMoney ,b.id meterPeriodId,b.sort periodSort from s_start_pay_meter_form a join s_meter_period b on a.meter_period_id =b.id  where  a.is_deleted =0  and a.approve_status =2 and a.contract_id="+contractId;
+            return getEntityList(sql,StartPayForm.class);
+        };
+    }
 
 
     @Override

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

@@ -2046,17 +2046,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
 
 
-
-    /**
-     * @Description 元素依赖解析
-     * @Author yangyj
-     * @Date 2022.07.04 16:10
-     **/
-
-
-
-
-
     /**
      * 先把公式脚本需要聚合部分预处理
      * */

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

@@ -259,6 +259,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     static {
         Map<String, String[]> titleMap = new LinkedHashMap<>();
         titleMap.put(BaseInfo.TBN_CH, new String[]{BaseInfo.TBN, BaseInfo.ID});
+        titleMap.put(AdvancePaymentCertificate.TBN_CH, new String[]{AdvancePaymentCertificate.TBN, AdvancePaymentCertificate.ID});
         titleMap.put(MeterPeriodInfo.TBN_CH, new String[]{MeterPeriodInfo.TBN, MeterPeriodInfo.ID});
         titleMap.put(InterimPaymentCertificate.TBN_CH, new String[]{InterimPaymentCertificate.TBN, InterimPaymentCertificate.ID});
         titleMap.put(InterimPaymentSummary.TBN_CH, new String[]{InterimPaymentSummary.TBN, InterimPaymentSummary.ID});

+ 24 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MeterTreeController.java

@@ -29,9 +29,15 @@ import org.springblade.meter.vo.*;
 import org.springblade.system.entity.Dict;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.DefaultTransactionDefinition;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -49,6 +55,7 @@ public class MeterTreeController extends BladeController {
     private final MeterTreeContractService meterTreeContractService;
     private final IContractInventoryFormService contractInventoryFormService;
     private final IInventoryFormMeterService inventoryFormMeterService;
+    private final DataSourceTransactionManager transactionManager;
 
     @GetMapping("/template/detail")
     @ApiOperationSupport(order = 1)
@@ -620,10 +627,25 @@ public class MeterTreeController extends BladeController {
             }
         }
         if (ObjectUtil.isNotEmpty(dto.getDecompositionList()) && dto.getDecompositionList().size() > 0) {
+            //校验比例是否在范围之内
+            if (dto.getUpPayRatio() == null || dto.getUpPayRatio().compareTo(BigDecimal.ZERO) < 0 || dto.getUpPayRatio().compareTo(new BigDecimal("100")) > 0){
+                throw new ServiceException("修改失败,请检查支付比例是否在规定范围");
+            }
             /*最底层节点修改*/
             dto.setUpdateStatus(1); //编辑
-            boolean b1 = meterTreeContractService.updateById(dto);
-            boolean b2 = inventoryFormMeterService.updateInfo(dto.getDecompositionList(), dto.getId());
+            //控制层手动管理事务,判断未引用清单比例是否超过合同计量单元
+            TransactionDefinition def = new DefaultTransactionDefinition();
+            TransactionStatus status = transactionManager.getTransaction(def);
+            boolean b1 = false;
+            boolean b2 = false;
+            try {
+                b1 = meterTreeContractService.updateById(dto);
+                b2 = inventoryFormMeterService.updateInfo(dto.getDecompositionList(), dto.getId(),dto.getUpPayRatio());
+                transactionManager.commit(status);
+            }catch (Exception e){
+                transactionManager.rollback(status);
+                return R.fail(e.getMessage());
+            }
             if (b1 && b2) {
                 return R.success("操作成功");
             }

+ 99 - 111
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -1306,11 +1306,11 @@ public class TaskController extends BladeController {
                 MaterialMeterFormTask materialMeterFormTask = materialMeterFormServiceTask.getById(dataId);
                 MaterialMeterFormTaskVO materialMeterFormTaskVO = BeanUtil.copyProperties(materialMeterFormTask, MaterialMeterFormTaskVO.class);
                 if (materialMeterFormTaskVO != null) {
-                    if (materialMeterFormTaskVO.getMaterialConform() != null) {
-                        materialMeterFormTaskVO.setMaterialConformName(materialMeterFormTaskVO.getMaterialConform().equals(0) ? "不符合" : "符合");
+                    if(materialMeterFormTaskVO.getMaterialConform()!=null){
+                        materialMeterFormTaskVO.setMaterialConformName( materialMeterFormTaskVO.getMaterialConform().equals(0) ? "不符合" : "符合");
                     }
-                    if (materialMeterFormTaskVO.getStorageConform() != null) {
-                        materialMeterFormTaskVO.setStorageConformName(materialMeterFormTaskVO.getStorageConform() == 0 ? "不符合" : "符合");
+                    if(materialMeterFormTaskVO.getStorageConform()!=null){
+                        materialMeterFormTaskVO.setStorageConformName(materialMeterFormTaskVO.getStorageConform()==0 ? "不符合" : "符合");
                     }
                     vo.setBasicsInfo(materialMeterFormTaskVO);
                 }
@@ -2148,7 +2148,7 @@ public class TaskController extends BladeController {
                     data.setStatementName("材料预付款--" + me.getPeriodName());
 
                     //计量任务类型 1=中间计量申请,2=材料计量单,3=开工预付款计量单,4=变更令
-                    if (task.getMeterTaskType() == 2) {
+                    if(task.getMeterTaskType()==2){
                         data.setType(1);
                     }
                     materialStartStatementService.addOrUpdate(data);
@@ -2157,7 +2157,7 @@ public class TaskController extends BladeController {
                     reportId = materialS.getId();
                 }
                 /**计量公式执行 0中间,1材料,2开工*/
-                meterPdfInfo(reportId + "", 1);
+                meterPdfInfo(reportId+"",1);
 
                 /*复制业务数据状态>主任务状态>替换数据*/
                 updateCopyDataApproveStatus(task, dto).updateTaskStatus(task).displace(task, dto);
@@ -2667,12 +2667,12 @@ public class TaskController extends BladeController {
     @GetMapping("/meterPdfInfo")
     @ApiOperationSupport(order = 20)
     @ApiOperation(value = "计量生成Pdf", notes = "计量生成Pdf")
-    public R meterPdfInfo(@RequestParam String reportId, @RequestParam Integer type) {
-        return R.data(calculate(reportId, type));
+    public R meterPdfInfo( @RequestParam String reportId, @RequestParam Integer type){
+          return R.data(calculate(reportId,type));
     }
 
-    public R<String> calculate(String reportId, Integer type) {
-        if (BaseUtils.isNumber(reportId) && BaseUtils.isNumber(type)) {
+    public R<String> calculate(String reportId, Integer type){
+        if(BaseUtils.isNumber(reportId)&& BaseUtils.isNumber(type)) {
             Report report = generateReport(Long.parseLong(reportId), type);
             return R.data(generateReportsPdf(report));
         }
@@ -2680,7 +2680,7 @@ public class TaskController extends BladeController {
     }
 
     /*中期支付证书报表、开工、材料手册报表*/
-    public String generateReportsPdf(Report report) {
+    public String generateReportsPdf(Report report){
         /*报表记录新增或者重算的时候会调用当前方法,生成PDF*/
         /*保存两类PDF,一每种表独立一份用于浏览,二合成表用于电签*/
         /*数据完全独立互不影响,可以并发生成,预估PDF的总大小来决定是否全部在内存中生成PDF*/
@@ -2688,30 +2688,30 @@ public class TaskController extends BladeController {
         /*如果数据没有变化,则各表的PDF可以不用更新*/
         List<ReportResult> reportResults = formulaClient.formulaExecute3(report.getContractId(), report.getId(), report.getType());
         String fileUrl = null;
-        if (Func.isNotEmpty(reportResults)) {
+        if(Func.isNotEmpty(reportResults)){
             /*List<String> dataListPdf = new ArrayList<>();*/
             String file_path = CollectionUtils.getSysLocalFileUrl();
-            Map<String, Object> projectMap = jdbcTemplate.queryForMap("select b.project_name projectName from m_contract_info a  join  m_project_info b on a.p_id=b.id where a.id= " + report.getContractId());
-            String projectName = projectMap.getOrDefault("projectName", StringPool.EMPTY).toString();
-            /*  String fileUrl = "";*/
-            List<Map<String, Object>> excelInfo = jdbcTemplate.queryForList("SELECT id,file_url from m_excel_tab where id in(" + reportResults.stream().map(ReportResult::getExcelId).distinct().map(Objects::toString).collect(Collectors.joining(",")) + ")");
-            if (Func.isNotEmpty(excelInfo)) {
+           Map<String,Object> projectMap=jdbcTemplate.queryForMap("select b.project_name projectName from m_contract_info a  join  m_project_info b on a.p_id=b.id where a.id= "+report.getContractId());
+            String projectName = projectMap.getOrDefault("projectName",StringPool.EMPTY).toString();
+          /*  String fileUrl = "";*/
+            List<Map<String,Object>> excelInfo=jdbcTemplate.queryForList("SELECT id,file_url from m_excel_tab where id in("+reportResults.stream().map(ReportResult::getExcelId).distinct().map(Objects::toString).collect(Collectors.joining(","))+")");
+            if(Func.isNotEmpty(excelInfo)){
                 /*所有的Excel地址映射*/
-                Map<String, String> fileUrlMapping = excelInfo.stream().collect(Collectors.toMap(m -> m.get("id").toString(), m -> m.get("file_url").toString(), (v1, v2) -> v1));
+                Map<String,String> fileUrlMapping = excelInfo.stream().collect(Collectors.toMap(m->m.get("id").toString(),m->m.get("file_url").toString(),(v1,v2)->v1));
                 /*把Excel缺失的移除*/
-                reportResults.removeIf(rs -> !fileUrlMapping.containsKey(rs.getExcelId().toString()));
+                reportResults.removeIf(rs->!fileUrlMapping.containsKey(rs.getExcelId().toString()));
                 /*准备*/
-                reportResults.forEach(rs -> {
+                reportResults.forEach(rs->{
                     /*初始化路径*/
-                    rs.pathInit(file_path);
-                    rs.setExcelUrl(fileUrlMapping.get(rs.getExcelId().toString()));
+                     rs.pathInit(file_path);
+                     rs.setExcelUrl(fileUrlMapping.get(rs.getExcelId().toString()));
                     /*删除已经存在的PDF*/
                     File tabPdf;
                     try {
                         tabPdf = ResourceUtil.getFile(rs.getPdfPath());
                         if (tabPdf.exists()) {
-                            if (tabPdf.delete()) {
-                                System.out.println(rs.getPdfPath() + "删除成功");
+                            if(tabPdf.delete()){
+                                System.out.println(rs.getPdfPath()+"删除成功");
                             }
                         }
                     } catch (FileNotFoundException e) {
@@ -2719,25 +2719,23 @@ public class TaskController extends BladeController {
                     }
                 });
                 /*每种表生成一份pdf*/
-                reportResults.parallelStream().forEach(rs -> {
+                reportResults.parallelStream().forEach(rs->{
                     try {
                         byte[] excelByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(rs.getExcelUrl()));
-                        if (Func.isNotEmpty(rs.getData())) {
+                        if(Func.isNotEmpty(rs.getData())){
                             PdfReader reader = null;
                             Document doc = new Document();
-                            PdfCopy pdfCopy;
-                            pdfCopy = new PdfCopy(doc, new FileOutputStream(rs.getPdfPath()));
+                            PdfCopy  pdfCopy = new PdfCopy(doc, new FileOutputStream(rs.getPdfPath()));
                             int pageCount;
                             doc.open();
-                            String tile = projectName + StringPool.DASH + rs.getName();
-                            for (Map<String, Object> dataMap : rs.getData()) {
-                                if (Func.isNotEmpty(dataMap)) {
-                                    try {
-                                        Workbook workbook = WorkbookFactory.create(new ByteArrayInputStream(excelByte));
-                                        //获取工作表
-                                        Sheet sheet = workbook.getSheetAt(0);
-                                        sheet.setForceFormulaRecalculation(true);
-                                        // 循环Key
+                            String tile=rs.getName().contains("封面")?projectName:projectName+StringPool.DASH+rs.getName();
+                            for(Map<String,Object> dataMap:rs.getData()){
+                                try {
+                                    Workbook workbook  = WorkbookFactory.create(new ByteArrayInputStream(excelByte));
+                                    //获取工作表
+                                    Sheet sheet = workbook.getSheetAt(0);
+                                    sheet.setForceFormulaRecalculation(true);
+                                    if(Func.isNotEmpty(dataMap)) {
                                         for (String keys : dataMap.keySet()) {
                                             int y1 = Func.toInt(keys.split("_")[0]);
                                             int x1 = Func.toInt(keys.split("_")[1]);
@@ -2751,118 +2749,108 @@ public class TaskController extends BladeController {
                                                 }
                                             }
                                         }
-                                        /*设置表头*/
-                                        setTitle(sheet, tile);
-                                        /*输出到内存*/
-                                        //去掉表格虚线
-                                        sheet.setPrintGridlines(false);
-                                        //设置 整个工作表为一页
-                                        sheet.setFitToPage(true);
-                                        sheet.getPrintSetup().setPaperSize(PrintSetup.A4_PAPERSIZE);
-                                        ByteArrayOutputStream out = new ByteArrayOutputStream();
-                                        workbook.write(out);
-                                        //workbook.write(new FileOutputStream(rs.getExcelPath()));
-                                        com.aspose.cells.Workbook wb = new com.aspose.cells.Workbook(new ByteArrayInputStream(out.toByteArray()));
-                                        out.reset();
-                                        wb.save(out, SaveFormat.PDF);
-                                        reader = new PdfReader(new ByteArrayInputStream(out.toByteArray()));
-                                        pageCount = reader.getNumberOfPages();
-                                        for (int i = 1; i <= pageCount; ++i) {
-                                            pdfCopy.addPage(pdfCopy.getImportedPage(reader, i));
-                                        }
-                                        out.close();
-                                        workbook.close();
-                                    } catch (Exception e) {
-                                        e.printStackTrace();
                                     }
+                                    /*设置表头*/
+                                    setTitle(sheet,tile);
+                                    //去掉表格虚线
+                                    sheet.setPrintGridlines(false);
+                                    //设置 整个工作表为一页
+                                    sheet.setFitToPage(true);
+                                    sheet.getPrintSetup().setPaperSize(PrintSetup.A4_PAPERSIZE);
+                                    ByteArrayOutputStream out = new ByteArrayOutputStream();
+                                    workbook.write(out);
+                                    workbook.write(new FileOutputStream(rs.getExcelPath()));
+                                    com.aspose.cells.Workbook wb = new com.aspose.cells.Workbook( new ByteArrayInputStream(out.toByteArray()));
+                                    out.reset();
+                                    wb.save(out, SaveFormat.PDF);
+                                    reader = new PdfReader(new ByteArrayInputStream(out.toByteArray()));
+                                    pageCount = reader.getNumberOfPages();
+                                    for (int i = 1; i <= pageCount; ++i) {
+                                        pdfCopy.addPage(pdfCopy.getImportedPage(reader, i));
+                                    }
+                                    out.close();
+                                    workbook.close();
+                                }catch (Exception e){
+                                    e.printStackTrace();
                                 }
                             }
                             pdfCopy.flush();
                             pdfCopy.close();
-                            if (reader != null) reader.close();
+                            if(reader!=null)reader.close();
                             doc.close();
-                            rs.setPdfOssPath(CompletableFuture.supplyAsync(() -> {
-                                BladeFile bladeFile = newIOSSClient.uploadFile(rs.getName() + SnowFlakeUtil.getId() + ".pdf", rs.getPdfPath());
-                                String url = bladeFile.getLink();
-                                if (Func.isEmpty(url)) {
-                                    url = "无效链接";
+                            rs.setPdfOssPath(CompletableFuture.supplyAsync(()->{
+                                BladeFile bladeFile = newIOSSClient.uploadFile(rs.getName()+SnowFlakeUtil.getId() + ".pdf", rs.getPdfPath());
+                                String url=bladeFile.getLink();
+                                if(Func.isEmpty(url)){
+                                    url="无效链接";
                                 }
                                 return url;
                             }));
                         }
-                    } catch (Exception e) {
+                    }catch (Exception e){
                         e.printStackTrace();
                     }
                 });
                 /*合并所有表*/
-                fileUrl = report.getReportPdf(file_path, reportResults);
+                fileUrl=report.getReportPdf(file_path,reportResults);
             }
         }
-        return fileUrl;
+       return fileUrl;
     }
 
 
-    public void setTitle(Sheet sheet, String name) {
-        if (name.contains("封面")) {
-            return;
-        }
+
+    public void setTitle(Sheet sheet,String name){
         Row row = sheet.getRow(0);
         Cell cell = row.getCell(0);
         if (cell != null) {
-            Workbook workbook = sheet.getWorkbook();
-            Font font = workbook.createFont();
-            font.setFontName("黑体"); // 设置字体名称
-            font.setFontHeightInPoints((short) 20); // 设置字号为20
-            CellStyle style = workbook.createCellStyle();
-            style.setFont(font); // 将字体应用到样式中
+           /* Workbook workbook = sheet.getWorkbook();*/
+           /* Font font = workbook.createFont();*/
+            CellStyle style=cell.getCellStyle();
+/*            font.setFontName("黑体"); // 设置字体名称
+            font.setFontHeightInPoints((short) 20); // 设置字号为20*/
+            /*CellStyle style = workbook.createCellStyle();*/
+            /*style.setFont(font); // 将字体应用到样式中*/
             style.setAlignment(HorizontalAlignment.CENTER);
             style.setVerticalAlignment(VerticalAlignment.CENTER);
             cell.setCellValue(name);
-            cell.setCellStyle(style);
+            /*cell.setCellStyle(style);*/
         }
     }
 
     @Data
-    class Report {
-        public final String[] REPORT_TYPE = new String[]{"s_interim_pay_certificate", "s_material_start_statement", "s_material_start_statement"};
-        public final String[] PERIOD_TYPE = new String[]{"s_contract_meter_period", "s_meter_period", "s_meter_period"};
-        /**
-         * 报表记录id
-         */
+    class Report{
+        public final String[] REPORT_TYPE=new String[]{"s_interim_pay_certificate","s_material_start_statement","s_material_start_statement"};
+        public final String[] PERIOD_TYPE=new String[]{"s_contract_meter_period","s_meter_period","s_meter_period"};
+        /**报表记录id*/
         private Long id;
-        /**
-         * 报表PDF地址
-         */
+        /**报表PDF地址*/
         private String pdfUrl;
         /*报表对应计量期Id*/
         private Long periodId;
-        /**
-         * 计量期ID
-         */
+        /**计量期ID*/
         private Long contractId;
-        /**
-         * 计量类型,0中间计量 1材料,2开工动员
-         */
+        /**计量类型,0中间计量 1材料,2开工动员*/
         private Integer type;
 
-        /*上传并关联PDF,然后返回合并后的PDF链接*/
-        public String getReportPdf(String file_path, List<ReportResult> reportResults) {
+       /*上传并关联PDF,然后返回合并后的PDF链接*/
+        public String getReportPdf(String file_path,List<ReportResult> reportResults){
             Long dataId = SnowFlakeUtil.getId();
             String lasPdf = file_path + "/pdf//" + dataId + "_last.pdf";
             CollectionUtils.mergePdfPublicMethods(reportResults.stream().map(ReportResult::getPdfPath).collect(Collectors.toList()), lasPdf);
             BladeFile bladeFile = newIOSSClient.uploadFile(dataId + "_last.pdf", lasPdf);
-            this.pdfUrl = bladeFile.getLink();
-            Map<String, String> fileListMap = reportResults.stream().collect(Collectors.toMap(ReportResult::getName, rs -> {
+            this.pdfUrl=bladeFile.getLink();
+            Map<String,String> fileListMap = reportResults.stream().collect(Collectors.toMap(ReportResult::getName, rs-> {
                 try {
                     return rs.getPdfOssPath().get();
                 } catch (InterruptedException | ExecutionException e) {
                     e.printStackTrace();
                     return "无效地址";
                 }
-            }, (v1, v2) -> v1, LinkedHashMap::new));
-            String upSql = "update " + REPORT_TYPE[this.type] + " set raw_url=?,file_url_list=? where id=" + this.id;
-            jdbcTemplate.update(upSql, this.pdfUrl, JSON.toJSONString(fileListMap));
-            return this.pdfUrl;
+            },(v1,v2)->v1,LinkedHashMap::new));
+            String upSql = "update "+REPORT_TYPE[this.type]+" set raw_url=?,file_url_list=? where id="+this.id;
+            jdbcTemplate.update(upSql,this.pdfUrl , JSON.toJSONString(fileListMap));
+            return  this.pdfUrl;
         }
 
         public Report(Long id, Integer type) {
@@ -2871,18 +2859,18 @@ public class TaskController extends BladeController {
         }
     }
 
-    public Report generateReport(Long reportId, Integer type) {
-        Report report = new Report(reportId, type);
-        Map<String, Object> map;
-        if (type == 0) {
-            map = this.jdbcTemplate.queryForMap("select id,contract_id ,contract_period_id period_id from s_interim_pay_certificate where id = " + reportId);
-        } else {
-            map = this.jdbcTemplate.queryForMap("select id,contract_id,meter_period_id period_id  from s_material_start_statement where id = " + reportId);
+   public Report generateReport(Long reportId,Integer type){
+        Report report =new Report(reportId,type);
+        Map<String,Object> map;
+        if(type==0){
+            map = this.jdbcTemplate.queryForMap("select id,contract_id ,contract_period_id period_id from s_interim_pay_certificate where id = "+reportId);
+        }else{
+            map = this.jdbcTemplate.queryForMap("select id,contract_id,meter_period_id period_id  from s_material_start_statement where id = "+reportId);
         }
         report.setContractId(Long.parseLong(map.get("contract_id").toString()));
         report.setPeriodId(Long.parseLong(map.get("period_id").toString()));
         return report;
-    }
+   }
 
     @GetMapping("/getFixedFlowPage")
     @ApiOperationSupport(order = 21)

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

@@ -253,7 +253,7 @@
     </select>
 
     <select id="getFormList2" resultType="org.springblade.meter.vo.ChangeFormVO2">
-        select cti.contract_form_id as id,cti.form_number,cti.form_name,cti.current_price,cti.contract_meter_id,cti.change_token_id,
+        select cti.contract_form_id as id,cti.form_number,cti.form_name,cti.current_price,cti.contract_meter_id,cti.change_token_id,contract_id,
                cti.change_before_total as contractTotal,cti.change_total as currentChangeTotal,
                cti.change_after_total as changeTotal,cti.change_before_money as contractMoney,
                cti.change_money as currentChangeMoney,cti.change_after_money as changeMoney,

+ 6 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InventoryFormApplyMapper.java

@@ -19,6 +19,10 @@ package org.springblade.meter.mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.meter.entity.InventoryFormApply;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.meter.vo.ChangeFormVO2;
+import org.springblade.meter.vo.InventoryFormApplyVO;
+
+import java.util.List;
 
 /**
  * 工程清单与中间计量申请	中间表 Mapper 接口
@@ -30,4 +34,6 @@ public interface InventoryFormApplyMapper extends BaseMapper<InventoryFormApply>
 
 
     void deleteByMiddleId(@Param("id") Long id);
+
+    List<InventoryFormApplyVO> getByMeterIdAndFormId(@Param("vo") ChangeFormVO2 vo2);
 }

+ 5 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InventoryFormApplyMapper.xml

@@ -22,5 +22,10 @@
         DELETE FROM s_inventory_form_apply
         where middle_meter_id = #{id}
     </delete>
+    <select id="getByMeterIdAndFormId" resultType="org.springblade.meter.vo.InventoryFormApplyVO">
+        select * from s_inventory_form_apply
+        where is_deleted = 0 and contract_id = #{vo.contractId} and contract_form_id = #{vo.id}
+        and contract_meter_id = #{vo.contractMeterId}
+    </select>
 
 </mapper>

+ 7 - 7
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.xml

@@ -62,8 +62,8 @@
                0 as currentMeterTotal,0 as containChangeTotal,0 as currentMeterMoney,
                (IFNULL((select sum(current_meter_total) from s_inventory_form_apply where is_deleted = 0
                             and contract_meter_id = #{nodeId} and contract_form_id = cif.id),0)) as allMeterTotal,
-                (IFNULL((select sum(pay_money) from s_inventory_form_apply where is_deleted = 0
-                and contract_meter_id = #{nodeId} and contract_form_id = cif.id),0)) as otherPayMoney
+                (IFNULL((select sum(pay_ratio) from s_inventory_form_apply where is_deleted = 0
+                and contract_meter_id = #{nodeId} and contract_form_id = cif.id),0)) as otherPayRatio
         from s_contract_inventory_form  cif where contract_id = #{contractId} and is_deleted = 0 and is_form_node = 1
         AND id in
         <foreach collection="ids" item="id" open="(" separator="," close=")">
@@ -127,7 +127,7 @@
     </select>
     <select id="getForm" resultType="org.springblade.meter.vo.MeterInventoryVO">
         select ifa.id as taskDetailId,ifa.contract_form_id as id,ifa.form_number,ifa.form_name,ifa.current_price,ifa.build_picture_total as resolveTotal,
-               ifa.change_build_picture_total as changeTotal,ifa.up_pay_ratio as upPayRatio,
+               ifa.change_build_picture_total as changeTotal,ifa.pay_ratio as payRatio,
                ifa.current_meter_total as currentMeterTotal,0 as containChangeTotal,
                ifa.current_meter_money as currentMeterMoney,
                (select cif.change_total  from s_contract_inventory_form cif where cif.id = ifa.contract_form_id ) as contractChangeAllTotal,
@@ -137,10 +137,10 @@
                       and contract_meter_id = #{nodeId} and contract_form_id = ifa.contract_form_id and id != ifa.id),0)) as otherMeterTotal,
                (IFNULL((select sum(current_meter_total) from s_inventory_form_apply where is_deleted = 0
                       and contract_meter_id = #{nodeId} and contract_form_id = ifa.contract_form_id),0)) as allMeterTotal,
-               (IFNULL((select sum(pay_money) from s_inventory_form_apply where is_deleted = 0
-                      and contract_meter_id = #{nodeId} and contract_form_id = ifa.contract_form_id),0)) as otherPayMoney,
-               (select up_pay_money from s_inventory_form_meter ifm where ifm.is_deleted = 0
-                      and ifm.contract_meter_id = #{nodeId} and ifm.contract_form_id = ifa.contract_form_id) as upPayMoney
+               (IFNULL((select sum(pay_ratio) from s_inventory_form_apply ifa2 where is_deleted = 0 and ifa2.id != ifa.id
+                      and contract_meter_id = #{nodeId} and contract_form_id = ifa.contract_form_id),0)) as otherPayRatio,
+               (select up_pay_ratio from s_inventory_form_meter where is_deleted = 0
+                      and contract_meter_id = #{nodeId} and contract_form_id = ifa.contract_form_id) as upPayRatio
         from s_inventory_form_apply ifa
         where ifa.contract_id = #{contractId} and ifa.is_deleted = 0
         AND ifa.middle_meter_id = #{id}

+ 6 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IInventoryFormApplyService.java

@@ -18,6 +18,9 @@ package org.springblade.meter.service;
 
 import org.springblade.meter.entity.InventoryFormApply;
 import org.springblade.core.mp.base.BaseService;
+import org.springblade.meter.vo.ChangeFormVO2;
+
+import java.util.List;
 
 /**
  * 工程清单与中间计量申请	中间表 服务类
@@ -29,4 +32,7 @@ public interface IInventoryFormApplyService extends BaseService<InventoryFormApp
 
     void deleteByMiddleId(Long id);
 
+    //异步重新计算受变更影响的中间计量清单的支付比
+    void asyncCalculateMiddleMeterRatio(List<ChangeFormVO2> allForm);
+
 }

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

@@ -21,6 +21,7 @@ import org.springblade.meter.entity.InventoryFormMeter;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.meter.vo.ContractFromVO;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -41,7 +42,7 @@ public interface IInventoryFormMeterService extends BaseService<InventoryFormMet
     R inventoryFormMeterService(String meterId, String formIds);
 
     // 修改信息
-    boolean updateInfo(List<ContractFromVO> dataInfo,Long meterId);
+    boolean updateInfo(List<ContractFromVO> dataInfo, Long meterId, BigDecimal upPayRatio);
 
     /**
      * 删除 同合计量 清单

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

@@ -688,6 +688,9 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         if (list7.size() > 0) {
             middleMeterApplyService.asyncCalculateMiddleMeter(list7);
         }
+        //异步重新计算受变更影响的中间计量清单的支付比
+        inventoryFormApplyService.asyncCalculateMiddleMeterRatio(allForm);
+
     }
 
     /**

+ 45 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InventoryFormApplyServiceImpl.java

@@ -16,12 +16,21 @@
  */
 package org.springblade.meter.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springblade.meter.entity.InventoryFormApply;
 import org.springblade.meter.mapper.InventoryFormApplyMapper;
 import org.springblade.meter.service.IInventoryFormApplyService;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.meter.vo.ChangeFormVO2;
+import org.springblade.meter.vo.InventoryFormApplyVO;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 工程清单与中间计量申请	中间表 服务实现类
  *
@@ -36,4 +45,40 @@ public class InventoryFormApplyServiceImpl extends BaseServiceImpl<InventoryForm
     public void deleteByMiddleId(Long id) {
         baseMapper.deleteByMiddleId(id);
     }
+
+    @Override
+    @Async
+    public void asyncCalculateMiddleMeterRatio(List<ChangeFormVO2> allForm) {
+        //等待一秒
+        try {
+            Thread.sleep(1000L);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        //需要修改的数据
+        List<InventoryFormApply> needUpdateData = new ArrayList<>();
+        //目前先这样查询,后期优化
+        for (ChangeFormVO2 vo2 : allForm) {
+            //查询指定节点,指定清单,在中间计量申请和清单中间表的数据,结果为多个计量期
+            List<InventoryFormApplyVO> vos = baseMapper.getByMeterIdAndFormId(vo2);
+            //不存在则跳过
+            if (vos.size() == 0){
+                continue;
+            }
+            //循环修改
+            BigDecimal total = vo2.getNewestChangeTotal().add(vo2.getCurrentChangeTotal());
+            for (InventoryFormApplyVO vo : vos) {
+                InventoryFormApply apply = new InventoryFormApply();
+                apply.setId(vo.getId());
+                if (total.compareTo(BigDecimal.ZERO) == 0) {
+                    apply.setPayRatio(BigDecimal.ZERO);
+                }else {
+                    apply.setPayRatio(vo.getCurrentMeterTotal().divide(total,2, RoundingMode.HALF_UP));
+                }
+                needUpdateData.add(apply);
+            }
+        }
+        this.updateBatchById(needUpdateData);
+
+    }
 }

+ 11 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InventoryFormMeterServiceImpl.java

@@ -93,7 +93,7 @@ public class InventoryFormMeterServiceImpl extends BaseServiceImpl<InventoryForm
     }
 
     @Override
-    public boolean updateInfo(List<ContractFromVO> dataInfo,Long meterId) {
+    public boolean updateInfo(List<ContractFromVO> dataInfo,Long meterId, BigDecimal upPayRatio) {
         //统计施工图金额和变更后施工图金额
         BigDecimal b1 = BigDecimal.ZERO;
         BigDecimal b2 = BigDecimal.ZERO;
@@ -108,10 +108,19 @@ public class InventoryFormMeterServiceImpl extends BaseServiceImpl<InventoryForm
             if (vo.getCiteStatus() == 0 && formIsChange(meterId,vo.getContractFormId())){
                 throw new ServiceException("清单["+vo.getFormName()+"]已经变更或计量,请刷新页面");
             }
+            //校验比例是否在范围之内
+            if (vo.getUpPayRatio() == null || vo.getUpPayRatio().compareTo(BigDecimal.ZERO) < 0 || vo.getUpPayRatio().compareTo(new BigDecimal("100")) > 0){
+                throw new ServiceException("修改失败,请检查支付比例是否在规定范围");
+            }
+            if (vo.getCiteStatus() == 0){
+               if (upPayRatio.compareTo(vo.getUpPayRatio()) == -1){
+                   throw new ServiceException("修改失败,未引用的清单支付比例大于合同计量单元");
+               }
+            }
             //统计
             vo.setBuildPictureMoney(vo.getCurrentPrice().multiply(vo.getBuildPictureTotal()));
             vo.setChangeBuildPictureMoney(vo.getCurrentPrice().multiply(vo.getChangeBuildPictureTotal()));
-            vo.setUpPayMoney(vo.getChangeBuildPictureMoney().multiply(new BigDecimal(vo.getUpPayRatio()).divide(new BigDecimal(100))));
+            vo.setUpPayMoney(vo.getChangeBuildPictureMoney().multiply(vo.getUpPayRatio().divide(new BigDecimal(100))));
             b1 = b1.add(vo.getBuildPictureMoney());
             b2 = b2.add(vo.getChangeBuildPictureMoney());
             //修改,如果是已经被引用则跳过

+ 69 - 30
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

@@ -124,7 +124,10 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         //获取清单和分解信息
         List<Long> longs = Func.toLongList(ids);
         vos = baseMapper.getResolveFormInfo(contractId,nodeId,longs);
+        vos = vos.stream().filter(l-> !l.getAllMeterTotal().equals(l.getChangeTotal())).collect(Collectors.toList());
         for (MeterInventoryVO vo : vos) {
+            //默认分解清单的比例为0
+            vo.setPayRatio(new BigDecimal(0));
             //设置其他计量总数
             vo.setOtherMeterTotal(vo.getAllMeterTotal().subtract(vo.getCurrentMeterTotal()));
             //设置施工图数量是否大于合同数量
@@ -139,6 +142,21 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
     @Override
     @Transactional
     public void add(MiddleMeterApplyDTO dto) {
+        Long id = SnowFlakeUtil.getId();
+        //先保存附件,因为要判断是否关联
+        Integer isLinkData = 0;
+        List<AttachmentForm> fileList = dto.getFileList();
+        if (fileList != null && fileList.size() != 0) {
+            for (AttachmentForm file : fileList) {
+                if (isLinkData == 0  && file.getSelectId() != null){
+                    isLinkData = 1;
+                }
+                file.setProjectId(dto.getProjectId());
+                file.setContractId(dto.getContractId());
+                file.setMasterId(id);
+            }
+            attachmentFormService.saveBatch(fileList);
+        }
         //校验计量单元是否最底层节点
         Integer count = baseMapper.getNodeChild(dto.getContractId(),dto.getContractUnitId());
         if (count != 0){
@@ -157,10 +175,10 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         dto.setMeterNumber(this.getMeterNumber(dto));
         //保存中间计量申请,设置计量金额为0,如果存在计量清单,则统计计量清单总金额
         MiddleMeterApply apply = new MiddleMeterApply();
-        Long id = SnowFlakeUtil.getId();
         dto.setId(id);
         BeanUtils.copyProperties(dto,apply);
         apply.setMeterMoney(null);
+        apply.setIsLinkData(isLinkData);
         //保存计量清单
         List<MeterInventoryVO> formList = dto.getFormList();
          if (formList.size() != 0){
@@ -198,14 +216,28 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
                 formApply.setCurrentPrice(l.getCurrentPrice());
                 formApply.setBuildPictureTotal(l.getResolveTotal());
                 formApply.setChangeBuildPictureTotal(l.getChangeTotal());
-                if (l.getCurrentMeterTotal() != null && l.getCurrentPrice() != null && l.getUpPayRatio() != null) {
+                if (l.getCurrentMeterTotal() != null && l.getCurrentPrice() != null) {
                     formApply.setCurrentMeterTotal(l.getCurrentMeterTotal());
                     formApply.setCurrentMeterMoney(l.getCurrentPrice().multiply(l.getCurrentMeterTotal()));
-                    formApply.setPayMoney(formApply.getCurrentMeterMoney().multiply(new BigDecimal(l.getUpPayRatio()).divide(new BigDecimal(100))));
+
                 }else {
-                    throw new ServiceException("单价和计量数量和支付比例不能为空");
+                    throw new ServiceException("单价和计量数量不能为空");
                 }
-                formApply.setUpPayRatio(l.getUpPayRatio());
+                //校验比例是否在范围之内
+                if (l.getUpPayRatio() == null || l.getPayRatio() == null){
+                    throw new ServiceException("新增失败,支付比例不能为空");
+                }
+                if (apply.getIsLinkData() == 0) {
+                    if (l.getPayRatio().compareTo(BigDecimal.ZERO) < 0 || l.getPayRatio().add(l.getOtherPayRatio()).compareTo(l.getUpPayRatio()) > 0) {
+                        throw new ServiceException("新增失败,累计支付比例大于计量单元,计量单元比例:"+l.getUpPayRatio()+",其他期计量比例:"+l.getOtherPayRatio());
+                    }
+                }else {
+                    if (l.getPayRatio().compareTo(BigDecimal.ZERO) < 0 || l.getPayRatio().add(l.getOtherPayRatio()).compareTo(new BigDecimal(100)) > 0) {
+                        throw new ServiceException("新增失败,累计支付比例不能小于0大于100,其他期计量比例:"+l.getOtherPayRatio());
+                    }
+                }
+                formApply.setPayMoney(formApply.getCurrentMeterMoney().multiply(l.getUpPayRatio().divide(new BigDecimal(100))));
+                formApply.setPayRatio(l.getPayRatio());
                 return formApply;
             }).collect(Collectors.toList());
              for (InventoryFormApply formApply : formApplies) {
@@ -217,16 +249,6 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
              throw new ServiceException("请添加需要计量的清单");
          }
         this.save(apply);
-        //保存附件
-        List<AttachmentForm> fileList = dto.getFileList();
-        if (fileList != null && fileList.size() != 0) {
-            for (AttachmentForm file : fileList) {
-                file.setProjectId(dto.getProjectId());
-                file.setContractId(dto.getContractId());
-                file.setMasterId(id);
-            }
-            attachmentFormService.saveBatch(fileList);
-        }
 
     }
 
@@ -300,6 +322,22 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
     @Override
     @Transactional
     public void update2(MiddleMeterApplyDTO dto) {
+        //删除附件
+        attachmentFormService.deleteByMasterId(dto.getId());
+        //先保存附件,因为要判断是否关联
+        Integer isLinkData = 0;
+        List<AttachmentForm> fileList = dto.getFileList();
+        if (fileList != null && fileList.size() != 0) {
+            for (AttachmentForm file : fileList) {
+                if (isLinkData == 0  && file.getSelectId() != null){
+                    isLinkData = 1;
+                }
+                file.setProjectId(dto.getProjectId());
+                file.setContractId(dto.getContractId());
+                file.setMasterId(dto.getId());
+            }
+            attachmentFormService.saveBatch(fileList);
+        }
         //校验当前计量期是否已经上报
         ContractMeterPeriod period = contractMeterPeriodService.getById(dto.getContractPeriodId());
         if (period.getApproveStatus() != 0){
@@ -347,14 +385,27 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
                 formApply.setCurrentPrice(l.getCurrentPrice());
                 formApply.setBuildPictureTotal(l.getResolveTotal());
                 formApply.setChangeBuildPictureTotal(l.getChangeTotal());
-                if (l.getCurrentMeterTotal() != null && l.getCurrentPrice() != null && l.getUpPayRatio() != null) {
+                if (l.getCurrentMeterTotal() != null && l.getCurrentPrice() != null) {
                     formApply.setCurrentMeterTotal(l.getCurrentMeterTotal());
                     formApply.setCurrentMeterMoney(l.getCurrentPrice().multiply(l.getCurrentMeterTotal()));
-                    formApply.setPayMoney(formApply.getCurrentMeterMoney().multiply(new BigDecimal(l.getUpPayRatio()).divide(new BigDecimal(100))));
                 }else {
                     throw new ServiceException("单价和计量数量和支付比例不能为空");
                 }
-                formApply.setUpPayRatio(l.getUpPayRatio());
+                //校验比例是否在范围之内
+                if (l.getUpPayRatio() == null || l.getPayRatio() == null){
+                    throw new ServiceException("新增失败,支付比例不能为空");
+                }
+                if (apply.getIsLinkData() == 0) {
+                    if (l.getPayRatio().compareTo(BigDecimal.ZERO) < 0 || l.getPayRatio().add(l.getOtherPayRatio()).compareTo(l.getUpPayRatio()) > 0) {
+                        throw new ServiceException("新增失败,累计支付比例大于计量单元,计量单元比例:"+l.getUpPayRatio()+",其他期计量比例:"+l.getOtherPayRatio());
+                    }
+                }else {
+                    if (l.getPayRatio().compareTo(BigDecimal.ZERO) < 0 || l.getPayRatio().add(l.getOtherPayRatio()).compareTo(new BigDecimal(100)) > 0) {
+                        throw new ServiceException("新增失败,累计支付比例不能小于0大于100,其他期计量比例:"+l.getOtherPayRatio());
+                    }
+                }
+                formApply.setPayMoney(formApply.getCurrentMeterMoney().multiply(l.getUpPayRatio().divide(new BigDecimal(100))));
+                formApply.setPayRatio(l.getPayRatio());
                 return formApply;
             }).collect(Collectors.toList());
             for (InventoryFormApply formApply : formApplies) {
@@ -364,18 +415,6 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
             inventoryFormApplyService.saveBatch(formApplies);
         }
         this.updateById(apply);
-        //删除附件
-        attachmentFormService.deleteByMasterId(dto.getId());
-        //保存附件
-        List<AttachmentForm> fileList = dto.getFileList();
-        if (fileList != null && fileList.size() != 0) {
-            for (AttachmentForm file : fileList) {
-                file.setProjectId(dto.getProjectId());
-                file.setContractId(dto.getContractId());
-                file.setMasterId(dto.getId());
-            }
-            attachmentFormService.saveOrUpdateBatch(fileList);
-        }
 
     }