Browse Source

变更令撤销

qianxb 1 year ago
parent
commit
b51a5ccc8b

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

@@ -118,5 +118,8 @@ public class ChangeTokenInventory extends BaseEntity {
     @ApiModelProperty(value = "是否汇总清单,0分解清单1汇总清单")
     private Integer isCollectForm;
 
+    @ApiModelProperty(value = "需要修改的中间计量申请ids")
+    private String applyIds;
+
 
 }

+ 6 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/InventoryFormMeterVO.java

@@ -16,10 +16,13 @@
  */
 package org.springblade.meter.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.meter.entity.InventoryFormMeter;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.math.BigDecimal;
+
 /**
  * 工程清单与合同计量单元	中间表视图实体类
  *
@@ -31,4 +34,7 @@ import lombok.EqualsAndHashCode;
 public class InventoryFormMeterVO extends InventoryFormMeter {
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty(value = "当前部位当前清单当前计量总和")
+	private BigDecimal allMeterMoney;
+
 }

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

@@ -53,10 +53,14 @@ public interface ChangeTokenFormMapper extends BaseMapper<ChangeTokenForm> {
     List<ChangeNodeVO> getNodeList(@Param("contractId") Long contractId,@Param("id") Long id);
     //获取变更令下节点,附带最新施工图金额和变更后金额
     List<ChangeNodeVO> getNodeList2(@Param("id") Long id,@Param("contractId") Long contractId);
+    //获取变更令下节点,回退时使用,附带修改前的施工图号
+    List<ChangeNodeVO> getNodeList3(@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);
+    //获取变更令下清单,回退时使用,附带修改前的变更后数量与变更后金额
+    List<ChangeFormVO2> getFormList3(@Param("id") Long id,@Param("contractId") Long contractId);
 
     IPage<ChangeTokenPageVO> page2(IPage<ChangeTokenPageVO> page,@Param("contractId") Long contractId);
 
@@ -70,5 +74,11 @@ public interface ChangeTokenFormMapper extends BaseMapper<ChangeTokenForm> {
 
     List<ChangeFormVO2> getMultipleChange(@Param("tokenId") Long id);
 
-    List<ChangeFormVO2> getUpdateMiddleForm(@Param("tokenId") Long id);
+    String getUpdateMiddleForm(@Param("tokenId") Long id);
+
+    InventoryFormMeterVO getNodeFormAndMeterMoney(@Param("id") Long id,@Param("meterId") Long contractMeterId);
+
+    List<ChangeFormVO2> getAllCollectForm(@Param("tokenId") Long id);
+
+    void deleteCollectForm(@Param("tokenId")Long id);
 }

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

@@ -47,7 +47,8 @@
                 change_before_total = #{item.changeBeforeTotal},
                 change_after_total = #{item.changeAfterTotal},
                 change_before_money = #{item.changeBeforeMoney},
-                change_after_money = #{item.changeAfterMoney}
+                change_after_money = #{item.changeAfterMoney},
+                apply_ids = #{item.applyIds}
             </set>
             where id = #{item.id}
         </foreach>
@@ -71,6 +72,9 @@
             where id = #{item.id}
         </foreach>
     </update>
+    <delete id="deleteCollectForm">
+        delete from s_change_token_inventory where change_token_id = #{tokenId} and is_collect_form = 1
+    </delete>
     <select id="getAllForm" resultType="org.springblade.meter.entity.ContractInventoryForm">
         select cif.id,
                IFNULL((select sum(build_picture_total) from s_inventory_form_meter ifm
@@ -191,6 +195,13 @@
         where ctm.contract_id = #{contractId} and ctm.is_deleted = 0
           AND ctm.change_token_id = #{id}
     </select>
+    <select id="getNodeList3" resultType="org.springblade.meter.vo.ChangeNodeVO">
+        select ctm.contract_meter_id as id,
+               ctm.before_contract_picture as contractPicture
+        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="getFormList" 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_before_total as contractTotal,cti.change_total as currentChangeTotal,
@@ -216,6 +227,14 @@
         where cti.contract_id = #{contractId} and cti.is_deleted = 0
           AND cti.change_token_id = #{id} and is_collect_form = 0
     </select>
+    <select id="getFormList3" resultType="org.springblade.meter.vo.ChangeFormVO2">
+        select cti.contract_form_id as id,cti.contract_meter_id,
+               cti.change_before_total as changeTotal,
+               cti.change_before_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 is_collect_form = 0
+    </select>
 
     <select id="page2" resultType="org.springblade.meter.vo.ChangeTokenPageVO">
         select *,
@@ -233,11 +252,22 @@
         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
+    <select id="getNodeFormAndMeterMoney" resultType="org.springblade.meter.vo.InventoryFormMeterVO">
+        select change_build_picture_total,
+                (select sum(current_meter_total) from s_inventory_form_apply ifa where ifa.is_deleted = 0
+                        and ifa.contract_form_id = ifm.contract_form_id and ifa.contract_meter_id = ifm.contract_meter_id) as allMeterMoney
+        from s_inventory_form_meter ifm
+        where is_deleted = 0 and contract_form_id = #{id} and contract_meter_id = #{meterId}
+    </select>
+    <select id="getUpdateMiddleForm" resultType="java.lang.String">
+        select GROUP_CONCAT(apply_ids)
+        from s_change_token_inventory
+        WHERE change_token_id = #{tokenId} and is_deleted = 0 and is_collect_form = 0
+    </select>
+    <select id="getAllCollectForm" resultType="org.springblade.meter.vo.ChangeFormVO2">
+        select contract_form_id as id,change_before_total as contractTotal,change_before_money as contractMoney
         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)
+        where is_deleted = 0 and is_collect_form = 1 and change_token_id = #{tokenId}
     </select>
 
 

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

@@ -146,7 +146,7 @@
         select ifm.id, cif.form_number,cif.form_name,cif.current_price,cif.contract_total,cif.change_total,cif.is_supplement,
                ifm.build_picture_total,ifm.change_build_picture_total,ifm.build_picture_money,ifm.change_build_picture_money,
                if(ifm.build_picture_total=ifm.change_build_picture_total,if((select count(1) from s_inventory_form_apply
-                   where contract_id = #{contractId} and is_deleted = 0 and contract_form_id = ifm.contract_form_id)=0,0,1),1) as citeStatus,
+                   where contract_id = #{contractId} and is_deleted = 0 and contract_form_id = ifm.contract_form_id and contract_meter_id = ifm.contract_meter_id)=0,0,1),1) as citeStatus,
             IFNULL((SELECT SUM(build_picture_total) from s_inventory_form_meter WHERE contract_id = #{contractId} and contract_form_id = cif.id
                      and is_deleted = 0 and contract_meter_id and contract_meter_id != #{meterId}),0)  as otherPoseNum,
             IFNULL((SELECT SUM(build_picture_total) from s_inventory_form_meter

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

@@ -74,6 +74,9 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
     //合同计量单元与清单中间表
     private final IInventoryFormMeterService inventoryFormMeterService;
 
+    //中间计量申请与清单中间表
+    private final IInventoryFormApplyService inventoryFormApplyService;
+
     //合同计量单元
     private final MeterTreeContractService meterTreeContractService;
 
@@ -186,16 +189,19 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 }
                 //如果是负变更,判断当前节点下是否存在当前清单
                 if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == -1){
-                    //获取当前节点下当前清单的分解信息
-                    InventoryFormMeter meter = inventoryFormMeterService.getOne(new LambdaQueryWrapper<InventoryFormMeter>()
-                            .eq(InventoryFormMeter::getContractFormId, vo2.getId())
-                            .eq(InventoryFormMeter::getContractMeterId, vo2.getContractMeterId()));
+                    //获取当前节点下当前清单的分解信息,与计量总和
+                    InventoryFormMeterVO meter = baseMapper.getNodeFormAndMeterMoney(vo2.getId(),vo2.getContractMeterId());
                     if (meter == null){
-                        throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单("+vo2.getFormName()+")的分解信息,不能负变更");
+                        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()+"]负变更超过施工图变更后数量,不能负变更");
                         }
+                        //如果负变更后变更后施工图数量小于已经计量的数量,则不能负变更
+                        if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(meter.getAllMeterMoney()) == -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,请确认后再提交");
@@ -380,16 +386,19 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 }
                 //如果是负变更,判断当前节点下是否存在当前清单
                 if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == -1){
-                    //获取当前节点下当前清单的分解信息
-                    InventoryFormMeter meter = inventoryFormMeterService.getOne(new LambdaQueryWrapper<InventoryFormMeter>()
-                            .eq(InventoryFormMeter::getContractFormId, vo2.getId())
-                            .eq(InventoryFormMeter::getContractMeterId, vo2.getContractMeterId()));
+                    //获取当前节点下当前清单的分解信息,与计量总和
+                    InventoryFormMeterVO meter = baseMapper.getNodeFormAndMeterMoney(vo2.getId(),vo2.getContractMeterId());
                     if (meter == null){
                         throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单["+vo2.getFormName()+"]的分解信息,不能负变更");
                     }else {
-                        if (meter.getBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1){
+                        //如果负变更后小于变更后施工图数量,则不能负变更
+                        if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1){
                             throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更超过施工图变更后数量,不能负变更");
                         }
+                        //如果负变更后变更后施工图数量小于已经计量的数量,则不能负变更
+                        if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(meter.getAllMeterMoney()) == -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,请确认后再提交");
@@ -506,8 +515,14 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         //为防止中途其他变更执行,获取节点和清单的最新数据进行重新计算再变更
         //获取当前变更令的变更节点
         List<ChangeNodeVO> allNode = baseMapper.getNodeList2(id, form.getContractId());
+        if (allNode.size() == 0){
+            throw new ServiceException("当前变更令的变更节点为空,下达失败");
+        }
         //获取当前变更令的所有变更清单
         List<ChangeFormVO2> allForm = baseMapper.getFormList2(id,form.getContractId());
+        if (allForm.size() == 0){
+            throw new ServiceException("当前变更令的变更清单为空,下达失败");
+        }
         //修改合同清单,此条清单的变更后数量和变更后金额,
         // 所有清单按照清单id分组,
         Map<Long, List<ChangeFormVO2>> map = allForm.stream().collect(Collectors.groupingBy(ChangeFormVO2::getId));
@@ -584,7 +599,7 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 list5.add(meter);
             }else {
                 //判断施工图数量是否发生变化,发生变化代表新增之后下达之前,变更过,则修改中间表的变更前数量和变更前金额
-                if (!vo2.getNewestChangeTotal().equals(vo2.getContractTotal())) {
+                if (!vo2.getNewestChangeTotal().equals(vo2.getContractTotal()) || StringUtils.isNotBlank(vo2.getApplyIds())) {
                     //为allForm设置最终的当前节点当前清单变更后数量,用于修改清单与中间计量申请
                     vo2.setChangeTotal(vo2.getNewestChangeTotal().add(vo2.getCurrentChangeTotal()));
                     vo2.setChangeMoney(vo2.getNewestChangeMoney().add(vo2.getCurrentChangeMoney()));
@@ -594,6 +609,7 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                     ct.setChangeAfterTotal(vo2.getChangeTotal());
                     ct.setChangeBeforeMoney(vo2.getNewestChangeMoney());
                     ct.setChangeAfterMoney(vo2.getChangeMoney());
+                    ct.setApplyIds(vo2.getApplyIds());
                     list3.add(ct);
                 }
                 InventoryFormMeter meter = new InventoryFormMeter();
@@ -636,7 +652,11 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         meterTreeContractService.asyncCalculateNodeMoney(allNode);
     }
 
+    /**
+     * 撤销变更 变更令表
+     */
     @Override
+    @Transactional
     public void annulChange(Long id) {
         //判断当前状态是否是已下达
         ChangeTokenForm form = this.getById(id);
@@ -646,16 +666,67 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         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("当前变更之后又发生过变更,请先撤销上一次变更");
+            String s = vo2.stream().map(ChangeFormVO2::getFormName).distinct().collect(Collectors.joining(",", "[", "]"));
+            throw new ServiceException("清单:"+s+"在当前变更之后又发生过变更,请先撤销上一次变更");
         }
+
         //判断是否修改过中间计量申请,修改过则不能撤销
-        vo2 = baseMapper.getUpdateMiddleForm(id);
+        //获取当前变更令所有修改的中间计量申请的id
+        String ids = baseMapper.getUpdateMiddleForm(id);
+        if (StringUtils.isNotBlank(ids)){
+            //存在修改,则判断这些修改是否已经删除
+            List<Long> longs = Func.toLongList(ids);
+            List<InventoryFormApply> list = inventoryFormApplyService.listByIds(longs);
+            if (list.size() != 0){
+                String s = list.stream().map(InventoryFormApply::getFormName).distinct().collect(Collectors.joining(",", "[", "]"));
+                throw new ServiceException("当前变更令已经修改中间计量申请的清单:"+s+"的数据,不能撤销变更,删除计量之后允许撤销");
+            }
+        }
 
+        //通过汇总项修改合同清单
+        List<ChangeFormVO2> vo3 = baseMapper.getAllCollectForm(id);
+        if (vo3.size() == 0){
+            throw new ServiceException("当前变更令的变更清单为空,撤销失败");
+        }
+        List<ContractInventoryForm> list2 = new ArrayList<>();
+        for (ChangeFormVO2 vo : vo3) {
+            // 修改清单数量与金额
+            ContractInventoryForm fo = new ContractInventoryForm();
+            fo.setId(vo.getId());
+            fo.setChangeTotal(vo.getContractTotal());
+            fo.setChangeMoney(vo.getContractMoney());
+            list2.add(fo);
+        }
+        //批量修改合同工程清单,因为mybatis的修改是伪批量,所以手动拼接
+        baseMapper.batchUpdateForm(list2);
+        //批量删除汇总项,因为撤销变更后,是可以下达的状态,下达时会重新生成最新的清单数据
+        baseMapper.deleteCollectForm(id);
 
+        //修改清单与合同计量单元中间表
+        //清单与合同计量单元中间表集合,用于批量修改
+        List<InventoryFormMeter> list4 = new ArrayList<>();
+        //获取当前变更令的所有变更清单
+        List<ChangeFormVO2> allForm = baseMapper.getFormList3(id,form.getContractId());
+        for (ChangeFormVO2 v : allForm) {
+            InventoryFormMeter meter = new InventoryFormMeter();
+            meter.setContractFormId(v.getId());
+            meter.setContractMeterId(v.getContractMeterId());
+            meter.setChangeBuildPictureTotal(v.getChangeTotal());
+            meter.setChangeBuildPictureMoney(v.getChangeMoney());
+            list4.add(meter);
+        }
+        baseMapper.batchUpdateMeterForm(list4);
+        //获取当前变更令的变更节点
+        List<ChangeNodeVO> allNode = baseMapper.getNodeList3(id, form.getContractId());
+        if (allNode.size() == 0){
+            throw new ServiceException("当前变更令的变更节点为空,下达失败");
+        }
+        //异步重新计算节点金额,和还原施工图号,此方法放到最后,待所有操作成功后再执行
+        meterTreeContractService.asyncCalculateNodeMoney(allNode);
         this.update(new LambdaUpdateWrapper<ChangeTokenForm>()
                 .eq(ChangeTokenForm::getId,id)
                 .set(ChangeTokenForm::getCommandStatus,0));