浏览代码

变更令下达

qianxb 1 年之前
父节点
当前提交
b08ebfbc3d
共有 21 个文件被更改,包括 423 次插入43 次删除
  1. 6 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenInventory.java
  2. 5 4
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenMeter.java
  3. 0 2
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ContractInventoryForm.java
  4. 6 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/InventoryFormApply.java
  5. 21 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeFormVO2.java
  6. 7 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeNodeVO.java
  7. 15 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ChangeTokenFormController.java
  8. 18 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.java
  9. 85 4
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.xml
  10. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenMeterMapper.java
  11. 0 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenMeterMapper.xml
  12. 8 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MeterTreeContractMapper.java
  13. 19 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MeterTreeContractMapper.xml
  14. 5 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenFormService.java
  15. 5 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenInventoryService.java
  16. 0 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenMeterService.java
  17. 4 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/MeterTreeContractService.java
  18. 180 10
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java
  19. 1 10
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenMeterServiceImpl.java
  20. 31 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MeterTreeContractServiceImpl.java
  21. 6 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

+ 6 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenInventory.java

@@ -112,5 +112,11 @@ public class ChangeTokenInventory extends BaseEntity {
     @ApiModelProperty(value = "变更后金额")
     private BigDecimal changeAfterMoney;
 
+    /**
+     * 是否汇总清单,0分解清单1汇总清单
+     */
+    @ApiModelProperty(value = "是否汇总清单,0分解清单1汇总清单")
+    private Integer isCollectForm;
+
 
 }

+ 5 - 4
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenMeter.java

@@ -65,12 +65,13 @@ public class ChangeTokenMeter extends BaseEntity {
 
     @ApiModelProperty(value = "节点路径")
     private String nodeUrl;
-    /**
-     * 合同图号
-     */
-    @ApiModelProperty(value = "合同图号")
+
+    @ApiModelProperty(value = "变更后合同图号")
     private String contractPicture;
 
+    @ApiModelProperty(value = "变更前-变更合同图号")
+    private String beforeContractPicture;
+
     @ApiModelProperty(value = "变更后金额")
     private BigDecimal changeMoney;
 

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

@@ -198,6 +198,4 @@ public class ContractInventoryForm extends BaseEntity {
     @ExcelIgnore
     private Integer buildChangeTotal;
 
-
-
 }

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

@@ -106,4 +106,10 @@ public class InventoryFormApply extends BaseEntity {
     @ApiModelProperty(value = "业务日期")
     private LocalDate businessDate;
 
+    /**
+     * 审批状态
+     */
+    @ApiModelProperty(value = "审批状态,0未上报,1待审批,2已审批,3已废除")
+    private Integer approveStatus;
+
 }

+ 21 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeFormVO2.java

@@ -14,12 +14,24 @@ import java.math.BigDecimal;
 @Data
 public class ChangeFormVO2 {
 
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "合同段id")
+    private Long contractId;
+
+    @ApiModelProperty(value = "变更令id")
+    private Long changeTokenId;
+
     @ApiModelProperty(value = "合同计量单元id(部位)")
     private Long contractMeterId;
 
     @ApiModelProperty(value = "清单id")
     private Long id;
 
+    @ApiModelProperty(value = "中间表id")
+    private Long middleId;
+
     @ApiModelProperty(value = "清单编号")
     private String formNumber;
 
@@ -46,4 +58,13 @@ public class ChangeFormVO2 {
 
     @ApiModelProperty(value = "变更后金额(变更后)")
     private BigDecimal changeMoney;
+
+    @ApiModelProperty(value = "最新变更后数量")
+    private BigDecimal newestChangeTotal;
+
+    @ApiModelProperty(value = "最新变更后金额")
+    private BigDecimal newestChangeMoney;
+
+    @ApiModelProperty(value = "需要修改的中间计量申请ids")
+    private String applyIds;
 }

+ 7 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeNodeVO.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
@@ -27,6 +28,12 @@ public class ChangeNodeVO {
     @ApiModelProperty(value = "合同图号")
     private String contractPicture;
 
+    @ApiModelProperty(value = "变更前-变更合同图号")
+    private String beforeContractPicture;
+
+    @ApiModelProperty(value = "变更前-施工图金额")
+    private BigDecimal beforeBuildMoney;
+
     @ApiModelProperty(value = "变更前-变更后金额")
     private BigDecimal beforeChangeMoney;
 

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

@@ -192,7 +192,7 @@ public class ChangeTokenFormController extends BladeController {
 	 * 下达变更 变更令表
 	 */
 	@GetMapping("/executeChange")
-	@ApiOperationSupport(order = 9)
+	@ApiOperationSupport(order = 11)
 	@ApiOperation(value = "下达变更", notes = "传入当前变更令id")
 	@ApiImplicitParams(value = {
 			@ApiImplicitParam(name = "id", value = "当前变更令id", required = true),
@@ -202,5 +202,19 @@ public class ChangeTokenFormController extends BladeController {
 		return R.success("下达成功");
 	}
 
+	/**
+	 * 撤销变更 变更令表
+	 */
+	@GetMapping("/annulChange")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "撤销变更", notes = "传入当前变更令id")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "id", value = "当前变更令id", required = true),
+	})
+	public R annulChange(Long id) {
+		changeTokenFormService.annulChange(id);
+		return R.success("撤销成功");
+	}
+
 	
 }

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

@@ -18,9 +18,8 @@ package org.springblade.meter.mapper;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
-import org.springblade.meter.entity.ChangeTokenForm;
+import org.springblade.meter.entity.*;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.springblade.meter.entity.ContractInventoryForm;
 import org.springblade.meter.vo.*;
 
 import java.util.List;
@@ -50,10 +49,26 @@ public interface ChangeTokenFormMapper extends BaseMapper<ChangeTokenForm> {
 
     ChangeTokenFormVO detail(@Param("id") Long id);
 
+    //获取变更令下节点
     List<ChangeNodeVO> getNodeList(@Param("contractId") Long contractId,@Param("id") Long id);
-
+    //获取变更令下节点,附带最新施工图金额和变更后金额
+    List<ChangeNodeVO> getNodeList2(@Param("id") Long id,@Param("contractId") Long contractId);
+    //获取变更令下清单
     List<ChangeFormVO2> getFormList(@Param("contractId") Long contractId,@Param("id") Long id);
+    //获取变更令下清单,附带最新变更后数量和变更后金额
+    List<ChangeFormVO2> getFormList2(@Param("id") Long id,@Param("contractId") Long contractId);
 
     IPage<ChangeTokenPageVO> page2(IPage<ChangeTokenPageVO> page,@Param("contractId") Long contractId);
 
+    void batchUpdateForm(@Param("list") List<ContractInventoryForm> list2);
+
+    void batchUpdateTokenForm(@Param("list") List<ChangeTokenInventory> list3);
+
+    void batchUpdateMeterForm(@Param("list") List<InventoryFormMeter> list4);
+
+    void batchUpdateApplyForm(@Param("list") List<InventoryFormApply> list6);
+
+    List<ChangeFormVO2> getMultipleChange(@Param("tokenId") Long id);
+
+    List<ChangeFormVO2> getUpdateMiddleForm(@Param("tokenId") Long id);
 }

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

@@ -30,6 +30,47 @@
         <result column="approve_status" property="approveStatus"/>
         <result column="command_status" property="commandStatus"/>
     </resultMap>
+    <update id="batchUpdateForm">
+        <foreach item="item" collection="list" separator=";">
+            UPDATE s_contract_inventory_form
+            <set>
+                change_total = #{item.changeTotal},
+                change_money = #{item.changeMoney}
+            </set>
+            where id = #{item.id}
+        </foreach>
+    </update>
+    <update id="batchUpdateTokenForm">
+        <foreach item="item" collection="list" separator=";">
+            UPDATE s_change_token_inventory
+            <set>
+                change_before_total = #{item.changeBeforeTotal},
+                change_after_total = #{item.changeAfterTotal},
+                change_before_money = #{item.changeBeforeMoney},
+                change_after_money = #{item.changeAfterMoney}
+            </set>
+            where id = #{item.id}
+        </foreach>
+    </update>
+    <update id="batchUpdateMeterForm">
+        <foreach item="item" collection="list" separator=";">
+            UPDATE s_inventory_form_meter
+            <set>
+                change_build_picture_total = #{item.changeBuildPictureTotal},
+                change_build_picture_money = #{item.changeBuildPictureMoney}
+            </set>
+            where contract_form_id = #{item.contractFormId} and contract_meter_id = #{item.contractMeterId}  and is_deleted = 0
+        </foreach>
+    </update>
+    <update id="batchUpdateApplyForm">
+        <foreach item="item" collection="list" separator=";">
+            UPDATE s_inventory_form_apply
+            <set>
+                change_build_picture_total = #{item.changeBuildPictureTotal}
+            </set>
+            where id = #{item.id}
+        </foreach>
+    </update>
     <select id="getAllForm" resultType="org.springblade.meter.entity.ContractInventoryForm">
         select cif.id,
                IFNULL((select sum(build_picture_total) from s_inventory_form_meter ifm
@@ -92,7 +133,8 @@
         GROUP BY contract_form_id
     </select>
     <select id="getChangeNode" resultType="org.springblade.meter.vo.ChangeNodeVO">
-        select id,node_name,change_picture as contractPicture,change_money,change_money as beforeChangeMoney,ifnull(is_supplement,0) as isSupplement,
+        select id,node_name,change_picture as contractPicture,change_picture as beforeContractPicture,change_money,change_money as beforeChangeMoney,
+               ifnull(is_supplement,0) as isSupplement,
                 if(is_supplement = 1,'是','否') as isSupplementName
         from s_meter_tree_contract mtc
         WHERE mtc.contract_id = #{contractId} and mtc.is_deleted = 0
@@ -102,7 +144,8 @@
             FIND_IN_SET(#{id} , mtc.ancestor)
         </foreach>
         union
-        select id,node_name,change_picture as contractPicture,change_money,change_money as beforeChangeMoney,ifnull(is_supplement,0) as isSupplement,
+        select id,node_name,change_picture as contractPicture,change_picture as beforeContractPicture,change_money,change_money as beforeChangeMoney,
+               ifnull(is_supplement,0) as isSupplement,
         if(is_supplement = 1,'是','否') as isSupplementName
         from s_meter_tree_contract mtc
         WHERE mtc.contract_id = #{contractId} and mtc.is_deleted = 0
@@ -134,6 +177,15 @@
     <select id="getNodeList" resultType="org.springblade.meter.vo.ChangeNodeVO">
         select ctm.contract_meter_id as id,ctm.node_name,ctm.node_url,before_change_money,
                if(ctm.is_supplement = 1,'是','否') as isSupplementName,
+               ctm.contract_picture,ctm.change_money,before_contract_picture
+        from s_change_token_meter ctm
+        where ctm.contract_id = #{contractId} and ctm.is_deleted = 0
+          AND ctm.change_token_id = #{id}
+    </select>
+    <select id="getNodeList2" resultType="org.springblade.meter.vo.ChangeNodeVO">
+        select ctm.contract_meter_id as id,ctm.node_name,ctm.node_url,
+               (select build_picture_money from s_meter_tree_contract where id = ctm.contract_meter_id) as beforeBuildMoney,
+               (select change_money from s_meter_tree_contract where id = ctm.contract_meter_id) as beforeChangeMoney,
                ctm.contract_picture,ctm.change_money
         from s_change_token_meter ctm
         where ctm.contract_id = #{contractId} and ctm.is_deleted = 0
@@ -146,8 +198,25 @@
                cti.change_money as currentChangeMoney,cti.change_after_money as changeMoney
         from s_change_token_inventory cti
         where cti.contract_id = #{contractId} and cti.is_deleted = 0
-          AND cti.change_token_id = #{id}
+          AND cti.change_token_id = #{id} and is_collect_form = 0
+    </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,
+               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,
+               cti.id as middleId,cti.project_id,cti.contract_id,
+               (select change_build_picture_total from s_inventory_form_meter where contract_id = #{contractId} and is_deleted = 0
+                    and contract_form_id = cti.contract_form_id and contract_meter_id = cti.contract_meter_id) as newestChangeTotal,
+               (select change_build_picture_money from s_inventory_form_meter where contract_id = #{contractId} and is_deleted = 0
+                    and contract_form_id = cti.contract_form_id and contract_meter_id = cti.contract_meter_id) as newestChangeMoney,
+               (select GROUP_CONCAT(id) from s_inventory_form_apply WHERE is_deleted = 0 and approve_status = 0 and contract_form_id = cti.contract_form_id
+                  and contract_meter_id = cti.contract_meter_id and business_date > CURDATE()) as applyIds
+        from s_change_token_inventory cti
+        where cti.contract_id = #{contractId} and cti.is_deleted = 0
+          AND cti.change_token_id = #{id} and is_collect_form = 0
     </select>
+
     <select id="page2" resultType="org.springblade.meter.vo.ChangeTokenPageVO">
         select *,
                (select dict_value from blade_dict where is_deleted = 0 and code = 'meter_change_type' and dict_key = ctf.change_type) as changeTypeName,
@@ -156,7 +225,19 @@
                0 as citeStatus
         from s_change_token_form ctf
         where contract_id = #{contractId} and is_deleted = 0
-        order by change_approval_date desc
+        order by create_time desc
+    </select>
+    <select id="getMultipleChange" resultType="org.springblade.meter.vo.ChangeFormVO2">
+        select form_name
+        from s_change_token_inventory cti
+        where is_deleted = 0 and is_collect_form = 1 and change_token_id = #{tokenId}
+            and change_after_total != (select change_total from s_contract_inventory_form where is_deleted = 0 and id = cti.contract_form_id)
+    </select>
+    <select id="getUpdateMiddleForm" resultType="org.springblade.meter.vo.ChangeFormVO2">
+        select form_name
+        from s_change_token_inventory cti
+        where is_deleted = 0 and is_collect_form = 0 and change_token_id = #{tokenId}
+          and change_after_total &lt;= (select change_total from s_contract_inventory_form where is_deleted = 0 and id = cti.contract_form_id)
     </select>
 
 

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

@@ -34,5 +34,5 @@ public interface ChangeTokenMeterMapper extends BaseMapper<ChangeTokenMeter> {
 
     void deleteByTokenId(@Param("id") Long id);
 
-    List<ChangeNodeVO> getChangTokenAllNode(@Param("tokenId") Long tokenId,@Param("contractId") Long contractId);
+
 }

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

@@ -22,9 +22,6 @@
         DELETE FROM s_change_token_meter
         where change_token_id = #{id}
     </delete>
-    <select id="getChangTokenAllNode" resultType="org.springblade.meter.vo.ChangeNodeVO">
-
-    </select>
 
 
 </mapper>

+ 8 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MeterTreeContractMapper.java

@@ -3,12 +3,20 @@ package org.springblade.meter.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
+import org.springblade.meter.entity.InventoryFormMeter;
 import org.springblade.meter.entity.MeterTreeContract;
 
+import java.util.List;
+import java.util.Set;
+
 public interface MeterTreeContractMapper extends BaseMapper<MeterTreeContract> {
 
     @Select("SELECT MAX(sort) FROM s_meter_tree_contract WHERE parent_id = #{parentId} AND status = 1 AND is_deleted = 0")
     Integer selectMaxSort(@Param("parentId") Long parentId);
 
     MeterTreeContract getAllChildNodeMoney(@Param("contractId") Long contractId,@Param("id") Long id);
+
+    void batchUpdateById(@Param("list") List<MeterTreeContract> list);
+
+    List<InventoryFormMeter> getNodeAllForm(@Param("ids") Set<Long> ids);
 }

+ 19 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MeterTreeContractMapper.xml

@@ -1,11 +1,28 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.springblade.meter.mapper.MeterTreeContractMapper">
+    <update id="batchUpdateById">
+        <foreach item="item" collection="list" separator=";">
+            UPDATE s_meter_tree_contract
+            <set>
+                change_picture = #{item.contractPicture},
+                change_money = #{item.changeMoney}
+            </set>
+            where id = #{item.id}
+        </foreach>
+    </update>
 
     <select id="getAllChildNodeMoney" resultType="org.springblade.meter.entity.MeterTreeContract">
-        select sum(build_picture_money) as build_picture_money,
-               sum(change_money) as change_money
+        select ifnull(sum(build_picture_money),0) as build_picture_money,
+               ifnull(sum(change_money),0) as change_money
         from s_meter_tree_contract
         where contract_id = #{contractId} and is_deleted = 0 and  FIND_IN_SET(#{id}, ancestor)
     </select>
+    <select id="getNodeAllForm" resultType="org.springblade.meter.entity.InventoryFormMeter">
+        select contract_meter_id,change_build_picture_money
+        from s_inventory_form_meter where is_deleted = 0 and contract_meter_id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 </mapper>

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

@@ -89,4 +89,9 @@ public interface IChangeTokenFormService extends BaseService<ChangeTokenForm> {
      * 下达变更 变更令表
      */
     void executeChange(Long id);
+
+    /**
+     * 撤销变更 变更令表
+     */
+    void annulChange(Long id);
 }

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

@@ -18,6 +18,9 @@ package org.springblade.meter.service;
 
 import org.springblade.meter.entity.ChangeTokenInventory;
 import org.springblade.core.mp.base.BaseService;
+import org.springblade.meter.vo.ChangeFormVO2;
+
+import java.util.List;
 
 /**
  * 变更令与合同工程清单	中间表 服务类
@@ -28,5 +31,6 @@ import org.springblade.core.mp.base.BaseService;
 public interface IChangeTokenInventoryService extends BaseService<ChangeTokenInventory> {
 
     //删除当前变更令下的清单
-    void deleteByTokenId(Long id);
+    void deleteByTokenId(Long tokenId);
+
 }

+ 0 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenMeterService.java

@@ -33,6 +33,4 @@ public interface IChangeTokenMeterService extends BaseService<ChangeTokenMeter>
     //删除当前变更令下的清单
     void deleteByTokenId(Long tokenId);
 
-    //获取当前变更令下的所有节点
-    List<ChangeNodeVO> getChangTokenAllNode(Long tokenId,Long contractId);
 }

+ 4 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/MeterTreeContractService.java

@@ -4,6 +4,7 @@ import org.springblade.core.mp.base.BaseService;
 import org.springblade.meter.dto.MeterTreeContractSaveBatchDTO;
 import org.springblade.meter.entity.MeterTreeContract;
 import org.springblade.meter.entity.MeterTreeProject;
+import org.springblade.meter.vo.ChangeNodeVO;
 import org.springblade.meter.vo.MeterTreeContractVO;
 
 import java.util.List;
@@ -19,4 +20,7 @@ public interface MeterTreeContractService extends BaseService<MeterTreeContract>
     boolean contractSave(MeterTreeContractSaveBatchDTO dto);
 
     void getAllChildNodeMoney(MeterTreeContractVO vo);
+
+    //异步重新计算节点金额,和修改施工图号
+    void asyncCalculateNodeMoney(List<ChangeNodeVO> vos);
 }

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

@@ -17,6 +17,7 @@
 package org.springblade.meter.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AllArgsConstructor;
@@ -33,10 +34,12 @@ import org.springblade.meter.service.*;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.meter.vo.*;
 import org.springframework.beans.BeanUtils;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -69,9 +72,11 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
     private final IChangeTokenInventoryService changeTokenInventoryService;
 
     //合同计量单元与清单中间表
-
     private final IInventoryFormMeterService inventoryFormMeterService;
 
+    //合同计量单元
+    private final MeterTreeContractService meterTreeContractService;
+
 
     /**
      * 一键生成零号变更  统计每个清单节点当前分解量,设置进清单的划分数量
@@ -141,6 +146,7 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 meter.setContractMeterId(l.getId());
                 meter.setContractPicture(l.getContractPicture());
                 //设置部位基础信息,方便公式生成报表
+                meter.setBeforeContractPicture(l.getBeforeContractPicture());
                 meter.setNodeName(l.getNodeName());
                 meter.setNodeUrl(l.getNodeUrl());
                 meter.setChangeMoney(BigDecimal.ZERO);
@@ -184,8 +190,12 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                     InventoryFormMeter meter = inventoryFormMeterService.getOne(new LambdaQueryWrapper<InventoryFormMeter>()
                             .eq(InventoryFormMeter::getContractFormId, vo2.getId())
                             .eq(InventoryFormMeter::getContractMeterId, vo2.getContractMeterId()));
-                    if (meter == null || (meter.getBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1)){
+                    if (meter == null){
                         throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单("+vo2.getFormName()+")的分解信息,不能负变更");
+                    }else {
+                        if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1){
+                            throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更超过施工图变更后数量,不能负变更");
+                        }
                     }
                 }else if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == 0){
                     throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单("+vo2.getFormName()+")的变更数量为0,请确认后再提交");
@@ -203,6 +213,8 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 inventoryList.add(inventory);
             }
             changeTokenInventoryService.saveBatch(inventoryList);
+        }else {
+            throw new ServiceException("请添加变更清单后再保存");
         }
         form.setChangeMoney(big);
         this.save(form);
@@ -297,6 +309,11 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
     @Override
     @Transactional
     public void update2(ChangeTokenFormDTO dto) {
+        //获取当前变更令,判断上报状态
+        ChangeTokenForm tokenForm = this.getById(dto.getId());
+        if (tokenForm.getApproveStatus() != 0){
+            throw new ServiceException("当前变更令为上报或审批状态,不能修改");
+        }
         //复制出基础数据
         ChangeTokenForm form = new ChangeTokenForm();
         BeanUtils.copyProperties(dto,form);
@@ -321,6 +338,7 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 meter.setContractMeterId(l.getId());
                 meter.setContractPicture(l.getContractPicture());
                 //设置部位基础信息,方便公式生成报表
+                meter.setBeforeContractPicture(l.getBeforeContractPicture());
                 meter.setNodeName(l.getNodeName());
                 meter.setNodeUrl(l.getNodeUrl());
                 meter.setChangeMoney(BigDecimal.ZERO);
@@ -366,8 +384,12 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                     InventoryFormMeter meter = inventoryFormMeterService.getOne(new LambdaQueryWrapper<InventoryFormMeter>()
                             .eq(InventoryFormMeter::getContractFormId, vo2.getId())
                             .eq(InventoryFormMeter::getContractMeterId, vo2.getContractMeterId()));
-                    if (meter == null || (meter.getBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1)){
+                    if (meter == null){
                         throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单["+vo2.getFormName()+"]的分解信息,不能负变更");
+                    }else {
+                        if (meter.getBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1){
+                            throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更超过施工图变更后数量,不能负变更");
+                        }
                     }
                 }else if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == 0){
                     throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]的变更数量为0,请确认后再提交");
@@ -385,6 +407,8 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 inventoryList.add(inventory);
             }
             changeTokenInventoryService.saveBatch(inventoryList);
+        }else {
+            throw new ServiceException("请添加变更清单后再保存");
         }
         form.setChangeMoney(big);
         this.updateById(form);
@@ -476,18 +500,164 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         if (form.getCommandStatus() == 1){
             throw new ServiceException("当前变更任务已经下达,请勿重复下达");
         }
+        if (form.getApproveStatus() != 2){
+            throw new ServiceException("当前变更任务未审批通过,下达失败");
+        }
+        //为防止中途其他变更执行,获取节点和清单的最新数据进行重新计算再变更
         //获取当前变更令的变更节点
-
+        List<ChangeNodeVO> allNode = baseMapper.getNodeList2(id, form.getContractId());
         //获取当前变更令的所有变更清单
-        //清单放入节点中
-        //修改合同清单
-            // 此条清单的变更后数量和变更后金额
+        List<ChangeFormVO2> allForm = baseMapper.getFormList2(id,form.getContractId());
+        //修改合同清单,此条清单的变更后数量和变更后金额,
+        // 所有清单按照清单id分组,
+        Map<Long, List<ChangeFormVO2>> map = allForm.stream().collect(Collectors.groupingBy(ChangeFormVO2::getId));
+        //获取所有清单的最新数据进行重新计算再变更
+        List<ContractInventoryForm> formList = contractInventoryFormService.listByIds(map.keySet());
+        Map<Long, ContractInventoryForm> formMap = formList.stream().collect(Collectors.toMap(l->l.getId(),l->l));
 
+        List<ChangeTokenInventory> list1 = new ArrayList<>();
+        List<ContractInventoryForm> list2 = new ArrayList<>();
+        for (Long aLong : map.keySet()) {
+            List<ChangeFormVO2> list = map.get(aLong);
+            BigDecimal total = BigDecimal.ZERO;
+            BigDecimal money = BigDecimal.ZERO;
+            for (ChangeFormVO2 vo2 : list) {
+                total = total.add(vo2.getCurrentChangeTotal());
+                money = money.add(vo2.getCurrentChangeMoney());
+            }
+            //获取清单汇总,并且插入到中间表
+            ContractInventoryForm form2 = formMap.get(aLong);
+            ChangeFormVO2 vo2 = list.get(0);
+            ChangeTokenInventory inventory = new ChangeTokenInventory();
+            inventory.setProjectId(form2.getProjectId());
+            inventory.setContractId(form2.getContractId());
+            inventory.setChangeTokenId(vo2.getChangeTokenId());
+            inventory.setContractFormId(vo2.getId());
+            inventory.setContractMeterId(vo2.getContractMeterId());
+            //设置汇总清单的数量
+            inventory.setChangeBeforeTotal(form2.getChangeTotal());
+            inventory.setChangeTotal(total);
+            inventory.setChangeAfterTotal(inventory.getChangeBeforeTotal().add(inventory.getChangeTotal()));
+            //设置汇总清单的金额
+            inventory.setChangeBeforeMoney(form2.getChangeMoney());
+            inventory.setChangeMoney(money);
+            inventory.setChangeAfterMoney(inventory.getChangeBeforeMoney().add(inventory.getChangeMoney()));
+            //设置清单3个基础信息,因为变更后不能改变
+            inventory.setFormNumber(vo2.getFormNumber());
+            inventory.setFormName(vo2.getFormName());
+            inventory.setCurrentPrice(vo2.getCurrentPrice());
+            inventory.setIsCollectForm(1);
+            list1.add(inventory);
+            // 修改清单数量与金额
+            ContractInventoryForm fo = new ContractInventoryForm();
+            fo.setId(aLong);
+            fo.setChangeTotal(inventory.getChangeAfterTotal());
+            fo.setChangeMoney(inventory.getChangeAfterMoney());
+            list2.add(fo);
+        }
+        //批量新增清单汇总到 变更令与计量单元中间表
+        changeTokenInventoryService.saveBatch(list1);
+        //批量修改合同工程清单,因为mybatis的修改是伪批量,所以手动拼接
+        baseMapper.batchUpdateForm(list2);
         //修改清单与合同计量单元,当前节点下当前清单
-            // 修改施工图数量和施工图变更后数量,施工图金额和施工图变更后金额,并且重新计算节点金额
-        //修改清单与中间计量申请,当前节点下当前清单
-            // 只修改业务日期在今天之后的,并且未上报的,修改分解数量与变更后数量
+        // 修改施工图数量和施工图变更后数量,施工图金额和施工图变更后金额
+        //变更令与清单中间表集合,用于批量修改
+        List<ChangeTokenInventory> list3 = new ArrayList<>();
+        //清单与合同计量单元中间表集合,用于批量修改
+        List<InventoryFormMeter> list4 = new ArrayList<>();
+        //清单与合同计量单元中间表集合,用于批量保存,因为变更不存在的清单,就是新增
+        List<InventoryFormMeter> list5 = new ArrayList<>();
+        //清单与中间计量申请中间表集合,用于批量修改
+        List<InventoryFormApply> list6 = new ArrayList<>();
+        for (ChangeFormVO2 vo2 : allForm) {
+            //判断是否存在分解信息,如果不存在新增
+            if (vo2.getNewestChangeTotal() == null){
+                InventoryFormMeter meter = new InventoryFormMeter();
+                meter.setProjectId(vo2.getProjectId());
+                meter.setContractId(vo2.getContractId());
+                meter.setContractFormId(vo2.getId());
+                meter.setBuildPictureTotal(BigDecimal.ZERO);
+                meter.setBuildPictureMoney(BigDecimal.ZERO);
+                meter.setContractMeterId(vo2.getContractMeterId());
+                meter.setChangeBuildPictureTotal(vo2.getChangeTotal());
+                meter.setChangeBuildPictureMoney(vo2.getChangeMoney());
+                list5.add(meter);
+            }else {
+                //判断施工图数量是否发生变化,发生变化代表新增之后下达之前,变更过,则修改中间表的变更前数量和变更前金额
+                if (!vo2.getNewestChangeTotal().equals(vo2.getContractTotal())) {
+                    //为allForm设置最终的当前节点当前清单变更后数量,用于修改清单与中间计量申请
+                    vo2.setChangeTotal(vo2.getNewestChangeTotal().add(vo2.getCurrentChangeTotal()));
+                    vo2.setChangeMoney(vo2.getNewestChangeMoney().add(vo2.getCurrentChangeMoney()));
+                    ChangeTokenInventory ct = new ChangeTokenInventory();
+                    ct.setId(vo2.getMiddleId());
+                    ct.setChangeBeforeTotal(vo2.getNewestChangeTotal());
+                    ct.setChangeAfterTotal(vo2.getChangeTotal());
+                    ct.setChangeBeforeMoney(vo2.getNewestChangeMoney());
+                    ct.setChangeAfterMoney(vo2.getChangeMoney());
+                    list3.add(ct);
+                }
+                InventoryFormMeter meter = new InventoryFormMeter();
+                meter.setContractFormId(vo2.getId());
+                meter.setContractMeterId(vo2.getContractMeterId());
+                meter.setChangeBuildPictureTotal(vo2.getChangeTotal());
+                meter.setChangeBuildPictureMoney(vo2.getChangeMoney());
+                list4.add(meter);
+            }
+            //修改清单与中间计量申请,当前节点下当前清单,只修改业务日期在今天之后的,并且未上报的,修改分解数量与变更后数量
+            String applyIds = vo2.getApplyIds();
+            if (StringUtils.isNotBlank(applyIds)){
+                //存在值,则代表需要修改
+                List<Long> ids = Func.toLongList(applyIds);
+                for (Long along : ids) {
+                    InventoryFormApply apply = new InventoryFormApply();
+                    apply.setId(along);
+                    apply.setChangeBuildPictureTotal(vo2.getChangeTotal());
+                    list6.add(apply);
+                }
+            }
+        }
+        if (list3.size() > 0) {
+            baseMapper.batchUpdateTokenForm(list3);
+        }
+        if (list4.size() > 0) {
+            baseMapper.batchUpdateMeterForm(list4);
+        }
+        if (list5.size() > 0) {
+            inventoryFormMeterService.saveBatch(list5);
+        }
+        if (list6.size() > 0) {
+            baseMapper.batchUpdateApplyForm(list6);
+        }
+        this.update(new LambdaUpdateWrapper<ChangeTokenForm>()
+            .eq(ChangeTokenForm::getId,id)
+            .set(ChangeTokenForm::getCommandStatus,1)
+            .set(ChangeTokenForm::getCommandDate, LocalDate.now()));
+        //异步重新计算节点金额,和修改施工图号,此方法放到最后,待所有操作成功后再执行
+        meterTreeContractService.asyncCalculateNodeMoney(allNode);
+    }
+
+    @Override
+    public void annulChange(Long id) {
+        //判断当前状态是否是已下达
+        ChangeTokenForm form = this.getById(id);
+        if (form.getCommandStatus() == 0){
+            throw new ServiceException("当前变更任务不是已下达状态,撤销失败");
+        }
+        if (form.getApproveStatus() != 2){
+            throw new ServiceException("当前变更任务未审批通过,撤销失败");
+        }
+        //判断是否有清单执行过二次变更,执行过则不能撤销
+        List<ChangeFormVO2> vo2 = baseMapper.getMultipleChange(id);
+        if (vo2.size() != 0){
+            vo2.stream().map(ChangeFormVO2::getFormName).collect(Collectors.joining(",","[","]"));
+            throw new ServiceException("当前变更之后又发生过变更,请先撤销上一次变更");
+        }
+        //判断是否修改过中间计量申请,修改过则不能撤销
+        vo2 = baseMapper.getUpdateMiddleForm(id);
 
 
+        this.update(new LambdaUpdateWrapper<ChangeTokenForm>()
+                .eq(ChangeTokenForm::getId,id)
+                .set(ChangeTokenForm::getCommandStatus,0));
     }
 }

+ 1 - 10
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenMeterServiceImpl.java

@@ -40,14 +40,5 @@ public class ChangeTokenMeterServiceImpl extends BaseServiceImpl<ChangeTokenMete
         baseMapper.deleteByTokenId(id);
     }
 
-    /**
-     *     //获取当前变更令下的所有节点
-     * @param tokenId
-     * @param contractId
-     * @return
-     */
-    @Override
-    public List<ChangeNodeVO> getChangTokenAllNode(Long tokenId, Long contractId) {
-        return baseMapper.getChangTokenAllNode(tokenId,contractId);
-    }
+
 }

+ 31 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MeterTreeContractServiceImpl.java

@@ -2,6 +2,7 @@ package org.springblade.meter.service.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -10,16 +11,20 @@ import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.meter.dto.MeterTreeContractSaveBatchDTO;
 import org.springblade.meter.dto.MeterTreeContractSaveDTO;
+import org.springblade.meter.entity.InventoryFormMeter;
 import org.springblade.meter.entity.MeterTreeContract;
 import org.springblade.meter.entity.MeterTreeProject;
 import org.springblade.meter.mapper.MeterTreeContractMapper;
 import org.springblade.meter.mapper.MeterTreeProjectMapper;
 import org.springblade.meter.service.MeterTreeContractService;
+import org.springblade.meter.vo.ChangeNodeVO;
 import org.springblade.meter.vo.MeterTreeContractVO;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -534,6 +539,32 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
         vo.setChangeMoney(m.getChangeMoney());
     }
 
+    /**
+     * 异步重新计算节点金额,和修改施工图号
+     * @param vos
+     */
+    @Override
+//    @Async
+    public void asyncCalculateNodeMoney(List<ChangeNodeVO> vos) {
+        Map<Long, String> map = vos.stream().collect(Collectors.toMap(l -> l.getId(), l -> l.getContractPicture()));
+        //获取所有要重新计算的节点的最新数据
+        List<MeterTreeContract> list = this.listByIds(map.keySet());
+        //获取节点下所有分解的表单
+        List<InventoryFormMeter> formMeters = baseMapper.getNodeAllForm(map.keySet());
+        Map<Long, BigDecimal> decimalMap = formMeters.stream()
+                .collect(Collectors.groupingBy(l -> l.getContractMeterId(),
+                        Collectors.mapping(InventoryFormMeter::getChangeBuildPictureMoney,
+                                Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+        list.stream().forEach(l->{
+            String picture = map.get(l.getId());
+            l.setContractPicture(StringUtils.isBlank(picture)?"":picture);
+            //统计节点下所有分解的表单的总金额
+            l.setChangeMoney(decimalMap.get(l.getId())==null?BigDecimal.ZERO:decimalMap.get(l.getId()));
+        });
+        //拼接SQL修改合同图号和重新计算的金额
+        baseMapper.batchUpdateById(list);
+    }
+
     /**
      * 获取对应的父级的ancestor字段
      *

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

@@ -126,6 +126,10 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         if (period.getApproveStatus() != 0){
             throw new ServiceException("新增失败,当前计量期已经上报或审批");
         }
+        //校验业务日期是否填写,变更时修改
+        if (dto.getBusinessDate() == null){
+            throw new ServiceException("新增失败,请填写业务日期");
+        }
         //保存中间计量申请,设置计量金额为0,如果存在计量清单,则统计计量清单总金额
         MiddleMeterApply apply = new MiddleMeterApply();
         Long id = SnowFlakeUtil.getId();
@@ -139,6 +143,7 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
              //保存清单
             List<InventoryFormApply> formApplies = formList.stream().map(l -> {
                 InventoryFormApply formApply = new InventoryFormApply();
+                formApply.setBusinessDate(dto.getBusinessDate());
                 formApply.setProjectId(dto.getProjectId());
                 formApply.setContractId(dto.getContractId());
                 formApply.setContractFormId(l.getId());
@@ -247,6 +252,7 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
             //保存清单
             List<InventoryFormApply> formApplies = formList.stream().map(l -> {
                 InventoryFormApply formApply = new InventoryFormApply();
+                formApply.setBusinessDate(dto.getBusinessDate());
                 formApply.setProjectId(dto.getProjectId());
                 formApply.setContractId(dto.getContractId());
                 formApply.setContractFormId(l.getId());