Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master' into master

yangyj 1 gadu atpakaļ
vecāks
revīzija
1e83207f12
19 mainītis faili ar 268 papildinājumiem un 47 dzēšanām
  1. 0 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InspectTreeVO.java
  2. 0 3
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/ChangeTokenFormDTO.java
  3. 1 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenForm.java
  4. 22 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenInventory.java
  5. 13 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenMeter.java
  6. 5 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/InventoryFormMeter.java
  7. 4 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeFormVO2.java
  8. 6 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeNodeVO.java
  9. 0 3
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeTokenFormVO.java
  10. 3 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeTokenPageVO.java
  11. 3 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ChangeTokenFormController.java
  12. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/StartPayMeterFormController.java
  13. 2 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.java
  14. 24 8
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.xml
  15. 7 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ContractInventoryFormMapper.java
  16. 21 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ContractInventoryFormMapper.xml
  17. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenFormService.java
  18. 91 10
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java
  19. 64 14
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ContractInventoryFormServiceImpl.java

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

@@ -57,7 +57,6 @@ public class InspectTreeVO implements INode<InspectTreeVO> {
     @ApiModelProperty(value = "节点名称")
     private String nodeName;
 
-
     @ApiModelProperty(value = "分属专家")
     private String nodeInfo;
 

+ 0 - 3
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/ChangeTokenFormDTO.java

@@ -40,9 +40,6 @@ public class ChangeTokenFormDTO extends ChangeTokenForm {
 	@ApiModelProperty(value = "部位集合")
 	private List<ChangeNodeVO> nodeList;
 
-	@ApiModelProperty(value = "清单集合")
-	private List<ChangeFormVO2> formList;
-
 	@ApiModelProperty(value = "附件集合")
 	private List<AttachmentForm> fileList;
 }

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

@@ -118,7 +118,7 @@ public class ChangeTokenForm extends BaseEntity {
     /**
      * 审批状态
      */
-    @ApiModelProperty(value = "审批状态")
+    @ApiModelProperty(value = "审批状态,0未上报,1待审批,2已审批,3已废除")
     private Integer approveStatus;
     /**
      * 下达状态

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

@@ -16,6 +16,8 @@
  */
 package org.springblade.meter.entity;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
@@ -54,11 +56,31 @@ public class ChangeTokenInventory extends BaseEntity {
      */
     @ApiModelProperty(value = "变更令id")
     private Long changeTokenId;
+    /**
+     * 合同计量单元id
+     */
+    @ApiModelProperty(value = "合同计量单元id(部位)")
+    private Long contractMeterId;
     /**
      * 合同工程清单id
      */
     @ApiModelProperty(value = "合同工程清单id")
     private Long contractFormId;
+    /**
+     * 清单编号
+     */
+    @ApiModelProperty(value = "清单编号")
+    private String formNumber;
+    /**
+     * 清单名称
+     */
+    @ApiModelProperty(value = "清单名称")
+    private String formName;
+    /**
+     * 当前单价
+     */
+    @ApiModelProperty(value = "当前单价")
+    private BigDecimal currentPrice;
     /**
      * 变更前数量
      */

+ 13 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenMeter.java

@@ -19,6 +19,7 @@ package org.springblade.meter.entity;
 import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
@@ -58,11 +59,23 @@ public class ChangeTokenMeter extends BaseEntity {
      */
     @ApiModelProperty(value = "合同计量单元id")
     private Long contractMeterId;
+
+    @ApiModelProperty(value = "工程名称")
+    private String nodeName;
+
+    @ApiModelProperty(value = "节点路径")
+    private String nodeUrl;
     /**
      * 合同图号
      */
     @ApiModelProperty(value = "合同图号")
     private String contractPicture;
 
+    @ApiModelProperty(value = "变更后金额")
+    private BigDecimal changeMoney;
+
+    @ApiModelProperty(value = "是否增补")
+    private Integer isSupplement;
+
 
 }

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

@@ -60,6 +60,11 @@ public class InventoryFormMeter extends BaseEntity {
      */
     @ApiModelProperty(value = "施工图数量")
     private Integer buildPictureTotal;
+    /**
+     * 变更后施工图数量
+     */
+    @ApiModelProperty(value = "变更后施工图数量")
+    private Integer changeBuildPictureTotal;
 
 
 }

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

@@ -14,7 +14,10 @@ import java.math.BigDecimal;
 @Data
 public class ChangeFormVO2 {
 
-    @ApiModelProperty(value = "id")
+    @ApiModelProperty(value = "合同计量单元id(部位)")
+    private Long contractMeterId;
+
+    @ApiModelProperty(value = "清单id")
     private Long id;
 
     @ApiModelProperty(value = "清单编号")

+ 6 - 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.List;
 
 /**
  * @Param   变更部位视图类-变更令用
@@ -29,7 +30,12 @@ public class ChangeNodeVO {
     private BigDecimal changeMoney;
 
     @ApiModelProperty(value = "是否增补")
+    private Integer isSupplement;
+
+    @ApiModelProperty(value = "是否增补名称")
     private String isSupplementName;
 
+    @ApiModelProperty(value = "清单集合")
+    private List<ChangeFormVO2> formList;
 
 }

+ 0 - 3
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeTokenFormVO.java

@@ -44,9 +44,6 @@ public class ChangeTokenFormVO extends ChangeTokenForm {
 	@ApiModelProperty(value = "部位集合")
 	private List<ChangeNodeVO> nodeList;
 
-	@ApiModelProperty(value = "清单集合")
-	private List<ChangeFormVO2> formList;
-
 	@ApiModelProperty(value = "附件集合")
 	private List<AttachmentForm> fileList;
 

+ 3 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeTokenPageVO.java

@@ -21,5 +21,8 @@ public class ChangeTokenPageVO extends ChangeTokenForm {
     @ApiModelProperty(value = "审批状态名称")
     private String approveStatusName;
 
+    @ApiModelProperty(value = "引用状态,0未引用,1引用")
+    private Integer citeStatus;
+
 
 }

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

@@ -121,10 +121,11 @@ public class ChangeTokenFormController extends BladeController {
 	@ApiOperation(value = "新增确认选择清单", notes = "传入选中的清单id,返回变更申请清单集合")
 	@ApiImplicitParams(value = {
 			@ApiImplicitParam(name = "contractId", value = "合同id", required = true),
+			@ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
 			@ApiImplicitParam(name = "ids", value = "选中的清单id,逗号拼接", required = true)
 	})
-	public R<List<ChangeFormVO2>> selectForm(Long contractId,String ids) {
-		List<ChangeFormVO2> vos = changeTokenFormService.selectForm(contractId,ids);
+	public R<List<ChangeFormVO2>> selectForm(Long contractId,Long nodeId,String ids) {
+		List<ChangeFormVO2> vos = changeTokenFormService.selectForm(contractId,nodeId,ids);
 		return R.data(vos);
 	}
 

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

@@ -62,7 +62,7 @@ public class StartPayMeterFormController extends BladeController {
 	public R<BigDecimal> getStartAmount(Long contractId) {
 		List<MeterContractInfo> list = jdbcTemplate.queryForList("select dy_total_amount from s_meter_contract_info where contract_id = " + contractId, MeterContractInfo.class);
 		if (list.size() == 0){
-			return R.data(null);
+			return R.data(new BigDecimal(0));
 		}else {
 			return R.data(list.get(0).getDyTotalAmount());
 		}

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

@@ -44,9 +44,9 @@ public interface ChangeTokenFormMapper extends BaseMapper<ChangeTokenForm> {
 
     List<Long> getNodeForm(@Param("contractId") Long contractId,@Param("nodeId") Long nodeId);
 
-    List<ChangeNodeVO> getChangeNode(@Param("contractId") Long contractId,@Param("ids") List<Long> longs);
+    List<ChangeNodeVO> getChangeNode(@Param("contractId") Long contractId,@Param("ids") List<Long> longs,@Param("id2") String ids);
 
-    List<ChangeFormVO2> selectForm(@Param("contractId") Long contractId,@Param("ids") List<Long> longs);
+    List<ChangeFormVO2> selectForm(@Param("contractId") Long contractId,@Param("ids") List<Long> longs,@Param("nodeId") Long nodeId);
 
     ChangeTokenFormVO detail(@Param("id") Long id);
 

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

@@ -92,16 +92,31 @@
         GROUP BY contract_form_id
     </select>
     <select id="getChangeNode" resultType="org.springblade.meter.vo.ChangeNodeVO">
-        select id,node_name,contract_picture,change_money,
+        select id,node_name,change_picture as contractPicture,0 as change_money,ifnull(is_supplement,0) as isSupplement,
                 if(is_supplement = 1,'是','否') as isSupplementName
-        from s_meter_tree_contract where id in
-        <foreach collection="ids" item="id" open="(" separator="," close=")">
+        from s_meter_tree_contract mtc
+        WHERE mtc.contract_id = #{contractId} and mtc.is_deleted = 0
+        and (select COUNT(1) from s_meter_tree_contract mtc2 WHERE contract_id = #{contractId} and mtc2.parent_id=mtc.id)=0
+        and
+        <foreach collection="ids" item="id" open="(" separator= "or" close=")">
+            FIND_IN_SET(#{id} , mtc.ancestor)
+        </foreach>
+        union
+        select id,node_name,change_picture as contractPicture,0 as change_money,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
+        and (select COUNT(1) from s_meter_tree_contract mtc2 WHERE contract_id = #{contractId} and mtc2.parent_id=mtc.id)=0
+        and id in
+        <foreach collection="ids" item="id" open="(" separator= "," close=")">
             #{id}
         </foreach>
     </select>
     <select id="selectForm" resultType="org.springblade.meter.vo.ChangeFormVO2">
-        select id,form_number,form_name,current_price,contract_total,0 as currentChangeTotal,contract_total as change_total,
-                change_money as contractMoney, 0 as currentChangeMoney,change_money as changeMoney
+        select id,form_number,form_name,current_price,
+                IFNULL((select change_build_picture_total
+        from s_inventory_form_meter ifm
+        WHERE contract_id = #{contractId} and is_deleted = 0 and ifm.contract_form_id = cif.id and ifm.contract_meter_id = #{nodeId}),0) as contractTotal
         from s_contract_inventory_form cif
         where contract_id = #{contractId}
         and id in
@@ -125,11 +140,11 @@
           AND ctm.change_token_id = #{id}
     </select>
     <select id="getFormList" resultType="org.springblade.meter.vo.ChangeFormVO2">
-        select cif.id,cif.form_number,cif.form_name,cif.current_price,
+        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,
                cti.change_after_total as changeTotal,cti.change_before_money as contractMoney,
                cti.change_money as currentChangeMoney,cti.change_after_money as changeMoney
-        from s_change_token_inventory cti left join s_contract_inventory_form cif on cti.contract_form_id = cif.id
+        from s_change_token_inventory cti
         where cti.contract_id = #{contractId} and cti.is_deleted = 0
           AND cti.change_token_id = #{id}
     </select>
@@ -137,7 +152,8 @@
         select *,
                (select dict_value from blade_dict where is_deleted = 0 and code = 'meter_change_type' and dict_key = ctf.change_type) as changeTypeName,
                CASE when approve_status = 0 then '未上报' when approve_status = 1 then '待审批' when approve_status = 2 then '已审批'
-                    else '已废除' end as approveStatusName
+                    else '已废除' end as approveStatusName,
+               0 as citeStatus
         from s_change_token_form ctf
         where contract_id = #{contractId}
         order by change_approval_date desc

+ 7 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ContractInventoryFormMapper.java

@@ -59,4 +59,11 @@ public interface ContractInventoryFormMapper extends BaseMapper<ContractInventor
     void updateAllChildType(@Param("id") Long id,@Param("contractId") Long contractId,@Param("formType") Integer formType);
 
     void updateAllChildChapterNumber(@Param("id") Long id,@Param("contractId") Long contractId,@Param("chapterNumber") String chapterNumber);
+
+    Integer getNodeLockInfo(@Param("id") Long id,@Param("contractId") Long contractId);
+
+    Integer getNodeCiteInfo(@Param("id") Long id,@Param("contractId") Long contractId);
+
+    Integer getNodeChangeInfo(@Param("id") Long id,@Param("contractId") Long contractId);
+
 }

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

@@ -110,5 +110,26 @@
            order by sort
         ) x
     </select>
+    <select id="getNodeLockInfo" resultType="java.lang.Integer">
+        select count(1)
+        from s_contract_inventory_form
+        where contract_id = #{contractId} and is_deleted = 0 and is_lock=1 and (id = #{id} or FIND_IN_SET(#{id},ancestors) > 0)
+    </select>
+    <select id="getNodeCiteInfo" resultType="java.lang.Integer">
+        select count(1)
+        from s_inventory_form_meter
+        where contract_id = #{contractId} and is_deleted = 0
+          and contract_form_id in ( select id
+                      from s_contract_inventory_form
+                      where contract_id = #{contractId} and is_deleted = 0 and is_lock=0 and (id = #{id} or FIND_IN_SET(#{id},ancestors) > 0))
+    </select>
+    <select id="getNodeChangeInfo" resultType="java.lang.Integer">
+        select count(1)
+        from s_change_token_inventory
+        where contract_id = #{contractId} and is_deleted = 0
+          and contract_form_id in ( select id
+                      from s_contract_inventory_form
+                      where contract_id = #{contractId} and is_deleted = 0 and is_lock=0 and (id = #{id} or FIND_IN_SET(#{id},ancestors) > 0))
+    </select>
 
 </mapper>

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

@@ -55,7 +55,7 @@ public interface IChangeTokenFormService extends BaseService<ChangeTokenForm> {
      */
     List<ChangeFormVO> addForm(ChangeTokenAddFormDTO dto);
 
-    List<ChangeFormVO2> selectForm(Long contractId,String ids);
+    List<ChangeFormVO2> selectForm(Long contractId,Long nodeId,String ids);
 
     List<ChangeNodeVO> getChangeNode(Long contractId,String ids);
 

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

@@ -38,7 +38,9 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -66,6 +68,10 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
     //变更令与合同清单中间表
     private final IChangeTokenInventoryService changeTokenInventoryService;
 
+    //合同计量单元与清单中间表
+
+    private final IInventoryFormMeterService inventoryFormMeterService;
+
 
     /**
      * 一键生成零号变更  统计每个清单节点当前分解量,设置进清单的划分数量
@@ -118,7 +124,10 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         BeanUtils.copyProperties(dto,form);
         //保存部位
         List<ChangeNodeVO> nodeList = dto.getNodeList();
+        List<ChangeFormVO2> formList = new ArrayList<>();
+        Map<Long, ChangeNodeVO> voMap = new HashMap<>();
         if (nodeList.size() != 0){
+            voMap = nodeList.stream().collect(Collectors.toMap(l -> l.getId(), l -> l));
             List<ChangeTokenMeter> meterList = nodeList.stream().map(l -> {
                 ChangeTokenMeter meter = new ChangeTokenMeter();
                 meter.setProjectId(dto.getProjectId());
@@ -126,12 +135,25 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 meter.setChangeTokenId(id);
                 meter.setContractMeterId(l.getId());
                 meter.setContractPicture(l.getContractPicture());
+                //设置部位基础信息,方便公式生成报表
+                meter.setNodeName(l.getNodeName());
+                meter.setNodeUrl(l.getNodeUrl());
+                meter.setChangeMoney(new BigDecimal(0));
+                meter.setIsSupplement(l.getIsSupplement());
+                List<ChangeFormVO2> list = l.getFormList();
+                if (list != null && list.size() != 0){
+                    formList.addAll(list);
+                    BigDecimal big = new BigDecimal(0);
+                    for (ChangeFormVO2 vo2 : list) {
+                        big = big.add(vo2.getChangeMoney());
+                    }
+                    meter.setChangeMoney(big);
+                }
                 return meter;
             }).collect(Collectors.toList());
             changeTokenMeterService.saveBatch(meterList);
         }
         //保存清单,并计算总变更金额设置进变更令
-        List<ChangeFormVO2> formList = dto.getFormList();
         if (formList.size() != 0){
             List<ChangeTokenInventory> inventoryList = new ArrayList<>();
             BigDecimal big = new BigDecimal(0);
@@ -143,6 +165,27 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 inventory.setContractFormId(vo2.getId());
                 inventory.setChangeBeforeTotal(vo2.getContractTotal());
                 inventory.setChangeTotal(vo2.getCurrentChangeTotal());
+                //设置清单3个基础信息,因为变更后不能改变
+                inventory.setFormNumber(vo2.getFormNumber());
+                inventory.setFormName(vo2.getFormName());
+                inventory.setCurrentPrice(vo2.getCurrentPrice());
+                if (vo2.getContractMeterId() == null){
+                    throw new ServiceException("未找到清单("+vo2.getFormName()+")的部位id");
+                }
+                //如果是负变更,判断当前节点下是否存在当前清单
+                if (vo2.getCurrentChangeTotal() < 0){
+                    //获取当前节点下当前清单的分解信息
+                    InventoryFormMeter meter = inventoryFormMeterService.getOne(new LambdaQueryWrapper<InventoryFormMeter>()
+                            .eq(InventoryFormMeter::getContractFormId, vo2.getId())
+                            .eq(InventoryFormMeter::getContractMeterId, vo2.getContractMeterId()));
+                    if (meter == null || (meter.getBuildPictureTotal()+vo2.getCurrentChangeTotal() < 0)){
+                        throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单("+vo2.getFormName()+")的分解信息,不能负变更");
+                    }
+                }else if (vo2.getCurrentChangeTotal() == 0){
+                    throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单("+vo2.getFormName()+")的变更数量为0,请确认后再提交");
+                }
+                //设置节点id
+                inventory.setContractMeterId(vo2.getContractMeterId());
                 //计算变更后
                 inventory.setChangeAfterTotal(inventory.getChangeBeforeTotal() + inventory.getChangeTotal());
                 inventory.setChangeBeforeMoney(vo2.getContractMoney());
@@ -202,13 +245,21 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
      * 新增-确认选择清单
      */
     @Override
-    public List<ChangeFormVO2> selectForm(Long contractId,String ids) {
+    public List<ChangeFormVO2> selectForm(Long contractId,Long nodeId,String ids) {
         List<ChangeFormVO2> vos = new ArrayList<>();
         if (StringUtils.isBlank(ids)){
             return vos;
         }
         List<Long> longs = Func.toLongList(ids);
-        vos = baseMapper.selectForm(contractId,longs);
+        vos = baseMapper.selectForm(contractId,longs,nodeId);
+        for (ChangeFormVO2 vo : vos) {
+            vo.setContractMeterId(nodeId);
+            vo.setCurrentChangeTotal(0);
+            vo.setChangeTotal(vo.getContractTotal());
+            vo.setContractMoney(vo.getCurrentPrice().multiply(new BigDecimal(vo.getContractTotal())));
+            vo.setCurrentChangeMoney(new BigDecimal(0));
+            vo.setChangeMoney(vo.getContractMoney());
+        }
         return vos;
     }
 
@@ -223,7 +274,7 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         }
         List<Long> longs = Func.toLongList(ids);
         //暂时使用循环单条查询
-        vos = baseMapper.getChangeNode(contractId,longs);
+        vos = baseMapper.getChangeNode(contractId,longs,ids);
         for (ChangeNodeVO vo : vos) {
             vo.setNodeUrl(middleMeterApplyService.getNodeDivide(vo.getId()));
         }
@@ -242,7 +293,10 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         List<ChangeNodeVO> nodeList = dto.getNodeList();
         //删除当前变更令下的部位
         changeTokenMeterService.deleteByTokenId(dto.getId());
+        List<ChangeFormVO2> formList = new ArrayList<>();
+        Map<Long, ChangeNodeVO> voMap = new HashMap<>();
         if (nodeList.size() != 0){
+            voMap = nodeList.stream().collect(Collectors.toMap(l -> l.getId(), l -> l));
             List<ChangeTokenMeter> meterList = nodeList.stream().map(l -> {
                 ChangeTokenMeter meter = new ChangeTokenMeter();
                 meter.setProjectId(dto.getProjectId());
@@ -255,7 +309,6 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
             changeTokenMeterService.saveBatch(meterList);
         }
         //保存清单,并计算总变更金额设置进变更令
-        List<ChangeFormVO2> formList = dto.getFormList();
         //删除当前变更令下的清单
         changeTokenInventoryService.deleteByTokenId(dto.getId());
         if (formList.size() != 0){
@@ -269,6 +322,25 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 inventory.setContractFormId(vo2.getId());
                 inventory.setChangeBeforeTotal(vo2.getContractTotal());
                 inventory.setChangeTotal(vo2.getCurrentChangeTotal());
+                //设置清单3个基础信息,因为变更后不能改变
+                inventory.setFormNumber(vo2.getFormNumber());
+                inventory.setFormName(vo2.getFormName());
+                inventory.setCurrentPrice(vo2.getCurrentPrice());
+                if (vo2.getContractMeterId() == null){
+                    throw new ServiceException("未找到清单("+vo2.getFormName()+")的部位id");
+                }
+                //如果是负变更,判断当前节点下是否存在当前清单
+                if (vo2.getCurrentChangeTotal() < 0){
+                    //获取当前节点下当前清单的分解信息
+                    InventoryFormMeter meter = inventoryFormMeterService.getOne(new LambdaQueryWrapper<InventoryFormMeter>()
+                            .eq(InventoryFormMeter::getContractFormId, vo2.getId())
+                            .eq(InventoryFormMeter::getContractMeterId, vo2.getContractMeterId()));
+                    if (meter == null || (meter.getBuildPictureTotal()+vo2.getCurrentChangeTotal() < 0)){
+                        throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单("+vo2.getFormName()+")的分解信息,不能负变更");
+                    }
+                }
+                //设置节点id
+                inventory.setContractMeterId(vo2.getContractMeterId());
                 //计算变更后
                 inventory.setChangeAfterTotal(inventory.getChangeBeforeTotal() + inventory.getChangeTotal());
                 inventory.setChangeBeforeMoney(vo2.getContractMoney());
@@ -307,14 +379,23 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         //查询节点信息
         List<ChangeNodeVO> nodeList = baseMapper.getNodeList(vo.getContractId(),vo.getId());
         if (nodeList.size() != 0) {
-            for (ChangeNodeVO nodeVO : nodeList) {
-                nodeVO.setNodeUrl(middleMeterApplyService.getNodeDivide(nodeVO.getId()));
+            //查询出当前变更令下所有清单信息
+            List<ChangeFormVO2> formList = baseMapper.getFormList(vo.getContractId(),vo.getId());
+            if (formList.size() != 0) {
+                //按照部位分组
+                Map<Long, List<ChangeFormVO2>> map = formList.stream().collect(Collectors.groupingBy(ChangeFormVO2::getContractMeterId));
+                for (ChangeNodeVO nodeVO : nodeList) {
+                    List<ChangeFormVO2> vo2s = map.get(nodeVO.getId());
+                    nodeVO.setFormList(vo2s);
+                    nodeVO.setNodeUrl(middleMeterApplyService.getNodeDivide(nodeVO.getId()));
+                }
+            }else {
+                for (ChangeNodeVO nodeVO : nodeList) {
+                    nodeVO.setNodeUrl(middleMeterApplyService.getNodeDivide(nodeVO.getId()));
+                }
             }
             vo.setNodeList(nodeList);
         }
-        //查询清单信息
-        List<ChangeFormVO2> formList = baseMapper.getFormList(vo.getContractId(),vo.getId());
-        vo.setFormList(formList);
         //查询附件信息
         List<AttachmentForm> list = attachmentFormService.list(new LambdaQueryWrapper<AttachmentForm>()
                 .eq(AttachmentForm::getContractId, vo.getContractId())

+ 64 - 14
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ContractInventoryFormServiceImpl.java

@@ -336,11 +336,16 @@ public class ContractInventoryFormServiceImpl extends BaseServiceImpl<ContractIn
                 throw new ServiceException("增补清单必须为清单节点");
             }
         }
-        if (form.getIsFormNode() == 1) {
+        if (form.getIsFormNode() == 1 && form.getIsSupplement() == 0) {
             if (form.getBidPrice() == null || form.getContractTotal() == null) {
                 throw new ServiceException("清单节点必须填写:中标单价和合同数量");
             }
         }
+        if (form.getIsFormNode() == 1 && form.getIsSupplement() == 1) {
+            if (form.getCurrentPrice() == null) {
+                throw new ServiceException("增补节点必须填写:现行单价");
+            }
+        }
         if (StringUtils.isBlank(form.getFormNumber())){
             throw new ServiceException("清单编号不能为空");
         }
@@ -367,17 +372,26 @@ public class ContractInventoryFormServiceImpl extends BaseServiceImpl<ContractIn
                 throw new ServiceException("子节点的清单类型,必须与父节点的清单类型相同");
             }
         }
+        //如果为清单节点则统一设置变更后数据
+        if (form.getIsFormNode() == 1){
+            if (form.getIsSupplement() == 1){
+                form.setChangePrice(form.getCurrentPrice());
+                form.setContractTotal(0);
+                form.setChangeTotal(0);
+                form.setContractMoney(new BigDecimal(0));
+                form.setChangeMoney(new BigDecimal(0));
+            }else {
+                form.setCurrentPrice(form.getBidPrice());
+                form.setChangePrice(form.getBidPrice());
+                form.setChangeTotal(form.getContractTotal());
+                form.setContractMoney(form.getBidPrice().multiply(new BigDecimal(form.getContractTotal())));
+                form.setChangeMoney(form.getChangePrice().multiply(new BigDecimal(form.getChangeTotal())));
+            }
+        }
+        //设置层级
         form.setNodeTier(parentNode.getNodeTier() + 1);
         //设置祖级节点
         form.setAncestors(parentNode.getAncestors()+","+parentNode.getId());
-        //如果不是根节点则设置层级
-//        if (parentNode.getNodeTier() != null) {
-//            int i = form.getFormNumber().split("-").length - 1;
-//            if (i != (parentNode.getNodeTier() + 1)){
-//                throw new ServiceException("清单编号规则错误,请修改后保存");
-//            }
-//            form.setNodeTier(i);
-//        }
         this.save(form);
     }
 
@@ -393,17 +407,25 @@ public class ContractInventoryFormServiceImpl extends BaseServiceImpl<ContractIn
         if (nodeInfo.getIsLock() == 1){
             throw new ServiceException("当前节点已经被锁定不能修改");
         }
+        if (form.getIsFormNode() == 1){
+            if (form.getBidPrice() == null || form.getContractTotal() == null){
+                throw new ServiceException("清单节点必须填写中标单价和合同数量");
+            }
+        }
+        //判断是否已经被分解或者被变更,包括零号变更
+        Boolean isChange = this.nodeIsChange(nodeInfo);
+        if (isChange){
+            throw new ServiceException("当前节点已经被分解或者变更,不允许修改");
+        }
         //如果当前节点类型和修改后的节点类型相同,则不校验
         if (nodeInfo.getIsFormNode().equals(form.getIsFormNode())) {
             //相同则先判断修改后节点类型是否为清单类型
             if (form.getIsFormNode().equals(1)){
-                //判断是否已经被分解或者被变更,包括零号变更
-                Boolean isChange = this.nodeIsChange(nodeInfo);
                 //发生过变更,就去判断单价和数量。没被变更或者修改过,就不去判断单价和数量是否发生改变
                 if (isChange) {
                     //判断单价和数量是否发生改变
                     if (nodeInfo.getBidPrice() != null) {
-                        if (!nodeInfo.getBidPrice().equals(form.getBidPrice())) {
+                        if (nodeInfo.getBidPrice().compareTo(form.getBidPrice()) != 0) {
                             throw new ServiceException("当前节点已经做过分解或变更,不能修改中标单价");
                         }
                     }
@@ -427,8 +449,6 @@ public class ContractInventoryFormServiceImpl extends BaseServiceImpl<ContractIn
                     throw new ServiceException("当前节点下存在节点,不能修改为清单节点");
                 }
             }else {
-                //不为清单节点:判断当前节点是否被分解或者被变更,包括零号变更
-                Boolean isChange = this.nodeIsChange(nodeInfo);
                 if (isChange){
                     throw new ServiceException("当前节点已被分解或变更,不能修改为非清单节点");
                 }
@@ -436,6 +456,21 @@ public class ContractInventoryFormServiceImpl extends BaseServiceImpl<ContractIn
                 form.setChangeMoney(null);
             }
         }
+        //如果是清单节点,又没被引用,则重新计算变更相关字段
+        if (form.getIsFormNode() == 1 && !isChange){
+            form.setCurrentPrice(form.getBidPrice());
+            form.setChangePrice(form.getBidPrice());
+            if (form.getIsSupplement() == 1){
+                form.setContractTotal(0);
+                form.setChangeTotal(0);
+                form.setContractMoney(new BigDecimal(0));
+                form.setChangeMoney(new BigDecimal(0));
+            }else {
+                form.setChangeTotal(form.getContractTotal());
+                form.setContractMoney(form.getBidPrice().multiply(new BigDecimal(form.getContractTotal())));
+                form.setChangeMoney(form.getChangePrice().multiply(new BigDecimal(form.getChangeTotal())));
+            }
+        }
         //当前节点的清单类型是否被修改了,
         if (nodeInfo.getFormType() != form.getFormType()){
             //校验是否为二级节点,
@@ -476,6 +511,21 @@ public class ContractInventoryFormServiceImpl extends BaseServiceImpl<ContractIn
      */
     @Override
     public void delete(Long id,Long contractId) {
+        //判断当前节点和子节点是否被锁定
+        Integer total = baseMapper.getNodeLockInfo(id,contractId);
+        if (total > 0) {
+            throw new ServiceException("当前节点下有子节点已经被锁定,不能删除");
+        }
+        //判断当前节点和子节点是否被分解
+        total = baseMapper.getNodeCiteInfo(id,contractId);
+        if (total > 0) {
+            throw new ServiceException("当前节点下有子节点已经被分解,不能删除");
+        }
+        //判断当前节点和子节点是否被变更
+        total = baseMapper.getNodeChangeInfo(id,contractId);
+        if (total > 0) {
+            throw new ServiceException("当前节点下有子节点已经被变更,不能删除");
+        }
         baseMapper.updateNode(id,contractId);
     }