Răsfoiți Sursa

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

yangyj 1 an în urmă
părinte
comite
51c86f4d4a
20 a modificat fișierele cu 505 adăugiri și 44 ștergeri
  1. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java
  2. 25 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/CopyMeterNodeDTO.java
  3. 1 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterTreeContract.java
  4. 49 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/CopyMeterNodeVO.java
  5. 63 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/CopyMeterNodeVO2.java
  6. 23 4
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  7. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java
  8. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java
  9. 3 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveAutoRuleSyncImpl.java
  10. 23 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  11. 5 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ContractInventoryFormController.java
  12. 53 31
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MeterTreeController.java
  13. 3 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InventoryFormMeterMapper.java
  14. 3 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InventoryFormMeterMapper.xml
  15. 14 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MeterTreeContractMapper.java
  16. 33 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MeterTreeContractMapper.xml
  17. 4 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.xml
  18. 8 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/MeterTreeContractService.java
  19. 181 4
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MeterTreeContractServiceImpl.java
  20. 4 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java

@@ -54,4 +54,7 @@ public interface ArchiveTreeContractClient {
     @PostMapping(API_PREFIX + "/getMeasurementPeriodNode")
     public ArchiveTreeContract getMeasurementPeriodNode(@RequestParam String projectName,@RequestParam String contractName,
                                                         @RequestParam String periodName);
+
+    @PostMapping(API_PREFIX + "/getMatchNode")
+    public ArchiveTreeContract getMatchNode(@RequestParam Long nodeId);
 }

+ 25 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/CopyMeterNodeDTO.java

@@ -0,0 +1,25 @@
+package org.springblade.meter.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.SafeHtml;
+import org.springblade.meter.vo.CopyMeterNodeVO2;
+
+import java.util.List;
+
+/**
+ * @Param   复制合同计量单元节点用于接收,传入的所有需要复制的节点id
+ * @Author wangwl
+ * @Date 2024/4/3 14:07
+ **/
+@Data
+public class CopyMeterNodeDTO {
+    @ApiModelProperty(value = "合同计量单元id(当前复制的节点)")
+    private Long id;
+
+    @ApiModelProperty(value = "合同段id")
+    private Long contractId;
+
+    @ApiModelProperty(value = "需要复制的树集合")
+    private List<CopyMeterNodeVO2> vo2s;
+}

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

@@ -35,7 +35,7 @@ public class MeterTreeContract extends BaseEntity {
     @ApiModelProperty(value = "工程类型名称")
     private String engineeringTypeName;
 
-    @ApiModelProperty(value = "数据源类型 1=项目原始引用、2=合同段手动新增、3=项目新增引用(项目是新增的)、4=导入")
+    @ApiModelProperty(value = "数据源类型 1=项目原始引用、2=合同段手动新增、3=项目新增引用(项目是新增的)、4=导入、5=复制节点")
     private Integer dataSourceType;
 
     @ApiModelProperty(value = "源节点id(项目树节点id)")

+ 49 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/CopyMeterNodeVO.java

@@ -0,0 +1,49 @@
+package org.springblade.meter.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.core.tool.node.INode;
+import org.springblade.meter.entity.MeterTreeContract;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Param   复制合同计量单元节点时,重置数据专用
+ * @Author wangwl
+ * @Date 2024/4/2 16:49
+ **/
+@Data
+public class CopyMeterNodeVO extends MeterTreeContract implements INode<CopyMeterNodeVO> {
+
+    /**
+     * 子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<CopyMeterNodeVO> children;
+
+    /**
+     * 是否有子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private Boolean hasChildren;
+
+    @Override
+    public List<CopyMeterNodeVO> getChildren() {
+        if (this.children == null) {
+            this.children = new ArrayList<>();
+        }
+        return this.children;
+    }
+
+    @ApiModelProperty(value = "新id")
+    private Long newId;
+
+    @ApiModelProperty(value = "新父id")
+    private Long newParentId;
+
+    @ApiModelProperty(value = "新祖级节点")
+    private String newAncestors;
+
+}

+ 63 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/CopyMeterNodeVO2.java

@@ -0,0 +1,63 @@
+package org.springblade.meter.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.core.tool.node.INode;
+import org.springblade.meter.entity.MeterTreeContract;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Param   复制节点时,回显当前节点的全加载树
+ * @Author wangwl
+ * @Date 2024/4/2 16:49
+ **/
+@Data
+public class CopyMeterNodeVO2  implements INode<CopyMeterNodeVO2> {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+
+    /**
+     * 子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<CopyMeterNodeVO2> children;
+
+    /**
+     * 是否有子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private Boolean hasChildren;
+
+    @Override
+    public List<CopyMeterNodeVO2> getChildren() {
+        if (this.children == null) {
+            this.children = new ArrayList<>();
+        }
+        return this.children;
+    }
+
+    @ApiModelProperty(value = "节点名")
+    private String nodeName;
+
+    @ApiModelProperty(value = "起始桩号")
+    private String startStake;
+
+    @ApiModelProperty(value = "结束桩号")
+    private String endStake;
+
+    @ApiModelProperty(value = "合同图号")
+    private String contractPicture;
+
+    @ApiModelProperty(value = "是否复制子节点0不复制1复制")
+    private Integer isAddChildNode;
+
+}

+ 23 - 4
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -996,12 +996,31 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		archivesAuto.setUnit(unit);//立卷单位
 		//archivesAuto.setQuantity();//数量/单位
 
-		archivesAuto.setSpecification(node.getSpecification());//案卷规格 从节点规格获取
+
 		//archivesAuto.setStartDate(LocalDateTime.parse(startDate));//文件开始时间
 		//archivesAuto.setEndDate(LocalDateTime.parse(endDate));//文件结束时间
+		String storageTime = node.getStorageTime();
+		String specification = node.getSpecification();
+		String rollor = node.getRollor();
+		String reviewer = node.getReviewer();
+
+		//如果没有找到立卷人,则向上找到配置立卷人的节点,取配置
+		if (StringUtils.isEmpty(node.getRollor())) {
+			ArchiveTreeContract matchNode = archiveTreeContractClient.getMatchNode(node.getId());
+
+			if (matchNode!= null  ) {
+				 storageTime = matchNode.getStorageTime();
+				 specification = matchNode.getSpecification();
+				 rollor = matchNode.getRollor();
+				 reviewer = matchNode.getReviewer();
+			}
+		}
+
+
+		archivesAuto.setSpecification(specification);//案卷规格 从节点规格获取
 
 		//TODO 保管期限
-		String storageTime = node.getStorageTime();
+		//String storageTime = node.getStorageTime();
 		if (StringUtils.isEmpty(storageTime)) {
 			//节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
 			Long nodeContractId = archivesAuto.getContractId();
@@ -1065,7 +1084,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		archivesAuto.setSecretLevel(secretLevel);
 
 		//立卷人 从节点规格获取
-		String rollor = node.getRollor();
+		//String rollor = node.getRollor();
 		if (StringUtils.isEmpty(rollor)) {
 			//节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
 			Long nodeContractId = archivesAuto.getContractId();
@@ -1089,7 +1108,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		archivesAuto.setRollor(rollor);
 
 		//审核人 从节点规格获取
-		String reviewer = node.getReviewer();
+		//String reviewer = node.getReviewer();
 		if (StringUtils.isEmpty(reviewer)) {
 			//节点没有值,就从合同段获取,没有合同段id的 用业主的合同段
 			Long nodeContractId = archivesAuto.getContractId();

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java

@@ -134,4 +134,8 @@ public class ArchiveTreeContractImpl implements ArchiveTreeContractClient {
     }
 
 
+    @Override
+    public ArchiveTreeContract getMatchNode(@RequestParam Long nodeId) {
+        return archiveTreeContractService.getMatchNode(nodeId);
+    }
 }

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.manager.service;
 
+import com.mixsmart.utils.StringUtils;
 import feign.Param;
 
 import org.springblade.manager.dto.ArchiveTreeContractAutoRuleMapDTO;
@@ -132,4 +133,6 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
     List<MyInspectTreeVO> lazyTree(Long parentId, Long projectId);
 
     Boolean startInspect(Long projectId,Integer type);
+
+    ArchiveTreeContract getMatchNode(Long nodeId);
 }

+ 3 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveAutoRuleSyncImpl.java

@@ -257,10 +257,11 @@ public class ArchiveAutoRuleSyncImpl {
                     //1.通过fromid找出项目级
                     ArchiveTreeVO2 proTreeVO2 = proMap.get(fromId);
                     //2.获取项目级groupID
-                    Long pro_groupId = proTreeVO2.getArchiveAutoGroupId();
-                    if (pro_groupId == null) {
+                    if (proTreeVO2 == null ||proTreeVO2.getArchiveAutoGroupId() == null) {
                         continue;
                     }
+                    Long pro_groupId = proTreeVO2.getArchiveAutoGroupId();
+
                     //3.,那么保存到集合  合同段ID_项目级groupID,客户级groupID
                     Long contractId = contractVO2.getContractId();
                     if (contractId != null) {

+ 23 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -1035,6 +1035,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	}
 
 
+
 	/**
 	 *
 	 * @param keyId
@@ -1546,4 +1547,26 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	}
 
 
+	public ArchiveTreeContract getMatchNode(Long nodeId) {
+		ArchiveTreeContract originalNode = this.getById(nodeId); // 保存最初的节点
+		ArchiveTreeContract currentNode = originalNode; // 从最初的节点开始
+
+		// 检查 currentNode 是否为 null,并且 currentNode 的 getRollor() 是否为空
+		while (currentNode != null && StringUtils.isEmpty(currentNode.getRollor())) {
+			Long parentId = currentNode.getParentId();
+
+			// 如果 parentId 为 null 或者 0,跳出循环,返回最初的节点
+			if (parentId == null || parentId == 0) {
+				break;
+			}
+
+			currentNode = this.getById(parentId); // 获取父节点
+		}
+
+		// 如果 currentNode 的 getRollor() 为非空,返回 currentNode,否则返回最初的节点
+		return (currentNode != null && StringUtils.isNotEmpty(currentNode.getRollor())) ? currentNode : originalNode;
+	}
+
+
+
 }

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

@@ -31,6 +31,7 @@ import org.springblade.meter.vo.ContractInventoryFormVO;
 import org.springblade.meter.vo.ContractInventoryFormVO2;
 import org.springblade.meter.vo.FormTreeVO;
 import org.springblade.meter.vo.InventoryFormDetailVO;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -56,6 +57,8 @@ public class ContractInventoryFormController extends BladeController {
 
 	private final IContractInventoryFormService contractInventoryFormService;
 
+	private final JdbcTemplate jdbcTemplate;
+
 
 	/**
 	 * 获取合同清单树
@@ -175,7 +178,8 @@ public class ContractInventoryFormController extends BladeController {
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "获取导入模板", notes = "返回导入模板URL")
 	public R<String> getImportTemplate() {
-		return R.data("https://blade-oss-chongqing.oss-cn-shenzhen.aliyuncs.com//upload/20240401/b5d3d7780a343641c0cc414dee7991f8.xls");
+		String url = jdbcTemplate.queryForObject("select dict_value from blade_dict_biz where code = 'import_template' and dict_key = 11 and is_deleted = 0", String.class);
+		return R.data(url);
 	}
 
 

+ 53 - 31
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MeterTreeController.java

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import net.logstash.logback.encoder.org.apache.commons.lang3.ObjectUtils;
@@ -20,6 +22,7 @@ import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ProjectInfo;
+import org.springblade.meter.dto.CopyMeterNodeDTO;
 import org.springblade.meter.dto.LinkMeterTreeAndWbsTreeDTO;
 import org.springblade.meter.dto.MeterTreeContractDTO;
 import org.springblade.meter.dto.MeterTreeContractSaveBatchDTO;
@@ -738,7 +741,7 @@ public class MeterTreeController extends BladeController {
         return R.data(null);
     }
 
-    @GetMapping("/contract/same-list")
+    @PostMapping("/contract/same-list")
     @ApiOperationSupport(order = 27)
     @ApiOperation(value = "合同段树节点同级列表", notes = "传入parentId")
     public R<List<MeterTreeContract>> contractSameList(@RequestParam String parentId) {
@@ -772,36 +775,8 @@ public class MeterTreeController extends BladeController {
     @GetMapping("/contract/remove")
     @ApiOperationSupport(order = 29)
     @ApiOperation(value = "合同段树节点删除", notes = "传入id")
-    public R<Object> contractRemove(@RequestParam String id) {
-        if (StringUtils.isNotEmpty(id)) {
-            MeterTreeContract obj = meterTreeContractService.getById(id);
-            if (obj != null) {
-                if (obj.getParentId().equals(0L) && obj.getAncestor().equals("0")) {
-                    throw new ServiceException("根节点无法删除");
-                }
-
-                /*子节点判断*/
-                Long countChild = meterTreeContractService.getBaseMapper().selectCount(Wrappers.<MeterTreeContract>lambdaQuery()
-                        .eq(MeterTreeContract::getTemplateId, obj.getTemplateId())
-                        .eq(MeterTreeContract::getProjectId, obj.getProjectId())
-                        .eq(MeterTreeContract::getContractId, obj.getContractId())
-                        .eq(MeterTreeContract::getStatus, 1)
-                        .like(MeterTreeContract::getAncestor, id));
-                if (countChild > 0) {
-                    throw new ServiceException("该节点下存在子节点,无法删除");
-                }
-
-                /*清单判断*/
-                Long inventoryFormMeterCount = inventoryFormMeterService.getBaseMapper().selectCount(Wrappers.<InventoryFormMeter>lambdaQuery()
-                        .eq(InventoryFormMeter::getContractMeterId, id));
-                if (inventoryFormMeterCount != null && inventoryFormMeterCount > 0) {
-                    throw new ServiceException("该节点下存在清单信息,无法删除");
-                }
-
-                return R.data(meterTreeContractService.removeById(id));
-            }
-        }
-        return R.fail("操作失败");
+    public R<Object> contractRemove(@RequestParam Long id) {
+        return meterTreeContractService.contractRemove(id);
     }
 
     @GetMapping("/contract/lock")
@@ -913,4 +888,51 @@ public class MeterTreeController extends BladeController {
         return R.success("取消关联成功");
     }
 
+    /**
+     * 动态获取计量导入模板
+     * @param type
+     * @return
+     */
+    @GetMapping("/contract/importTemplate")
+    @ApiOperationSupport(order = 37)
+    @ApiOperation(value = "获取合同计量单元导入模板", notes = "获取合同计量单元导入模板,传入type")
+    public R<String> importTemplate(Integer type) {
+        if (type == null) {
+            R.fail("操作失败,请传入type");
+        }
+        String url = jdbcTemplate.queryForObject("select dict_value from blade_dict_biz where code = 'import_template' and dict_key = "+type+" and is_deleted = 0", String.class);
+        return R.data(url);
+
+    }
+
+    /**
+     * 复制节点,获取子树
+     * @param id
+     * @return
+     */
+    @GetMapping("/contract/getCurrentNodeTree")
+    @ApiOperationSupport(order = 38)
+    @ApiOperation(value = "复制节点,获取子树", notes = "传入节点id,合同段id")
+    public R<List<CopyMeterNodeVO2>> getCurrentNodeTree(Long id,Long contractId) {
+        List<CopyMeterNodeVO2> vo2s = meterTreeContractService.getCurrentNodeTree(id,contractId);
+        return R.data(vo2s);
+    }
+
+    /**
+     * 复制节点
+     * @param dto
+     * @return
+     */
+    @PostMapping("/contract/copyNode")
+    @ApiOperationSupport(order = 39)
+    @ApiOperation(value = "复制节点", notes = "复制节点,传入节点id")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "id", value = "合同计量单元id(当前复制的节点)", required = true),
+            @ApiImplicitParam(name = "contractId", value = "合同id", required = true),
+            @ApiImplicitParam(name = "vo2s", value = "需要复制的树集合", required = true)
+    })
+    public R<String> copyNode(@RequestBody CopyMeterNodeDTO dto) {
+        return meterTreeContractService.copyNode(dto);
+    }
+
 }

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

@@ -40,4 +40,7 @@ public interface InventoryFormMeterMapper extends BaseMapper<InventoryFormMeter>
     void batchInsert(List<InventoryFormMeter> inventoryFormMeters);
 
     List<InventoryFormMeterVO> getFormByNodeIds(@Param("contractId") Long contractId,@Param("ids") List<Long> nodeIds);
+
+    //根据计量单元id,删除当前节点以及下层节点,关联的所有清单
+    void deleteByNodeId(@Param("meterId") Long meterId,@Param("contractId") Long contractId);
 }

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

@@ -30,6 +30,9 @@
             #{item.changeBuildPictureMoney})
         </foreach>
     </insert>
+    <delete id="deleteByNodeId">
+        DELETE FROM s_inventory_form_meter WHERE contract_meter_id in ( select id from s_meter_tree_contract where contract_id = #{contractId} and is_deleted = 0 and (id = #{meterId} or FIND_IN_SET(#{meterId}, ancestor)))
+    </delete>
 
     <select id="getNodeAllForm" resultType="java.lang.Long">
         select contract_form_id

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

@@ -1,6 +1,7 @@
 package org.springblade.meter.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.springblade.meter.dto.MeterTreeContractDTO;
@@ -59,4 +60,17 @@ public interface MeterTreeContractMapper extends BaseMapper<MeterTreeContract> {
     void updateBatchForm(@Param("list") List<InventoryFormMeterVO> resultFormListUpdate2);
 
     MeterTreeContractVO contractDetail(@Param("id") Long id);
+
+    List<MeterTreeContract> getAllMeterNode(@Param("id") Long id,@Param("contractId") Long contractId);
+
+    @Delete("DELETE FROM s_meter_tree_contract where contract_id = #{contractId} and is_deleted = 0 and (id = #{id} or FIND_IN_SET(#{id}, ancestor))")
+    int deleteByCondition(Long id, Long contractId);
+
+    List<MeterTreeContract> getAllLockNode(@Param("id") Long id,@Param("contractId") Long contractId);
+
+    List<CopyMeterNodeVO> getAllNeedCopyNode(@Param("ids") List<Long> ids,@Param("contractId") Long contractId);
+
+    CopyMeterNodeVO getParentNode(@Param("id") Long parentId);
+
+    List<CopyMeterNodeVO2> getCurrentNodeTree(@Param("id") Long id,@Param("contractId") Long contractId);
 }

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

@@ -155,6 +155,39 @@
                                                     and mtc2.parent_id = mtc1.id and mtc2.is_deleted = 0 ) as childTotal
         from s_meter_tree_contract mtc1 WHERE  id = #{id}
     </select>
+    <select id="getAllMeterNode" resultType="org.springblade.meter.entity.MeterTreeContract">
+        select mtc.id,mtc.node_name
+        from s_meter_tree_contract mtc inner join s_middle_meter_apply mma on mma.contract_unit_id = mtc.id and mma.contract_id = #{contractId} and mma.is_deleted = 0
+        where mtc.contract_id = #{contractId} and mtc.is_deleted = 0 and (mtc.id = #{id} or FIND_IN_SET(#{id}, mtc.ancestor))
+        GROUP by mtc.id
+    </select>
+    <select id="getAllLockNode" resultType="org.springblade.meter.entity.MeterTreeContract">
+        select mtc.id,mtc.node_name
+        from s_meter_tree_contract mtc
+        where mtc.contract_id = #{contractId} and mtc.is_deleted = 0 and is_lock = 1
+          and (mtc.id = #{id} or FIND_IN_SET(#{id}, mtc.ancestor))
+    </select>
+    <select id="getAllNeedCopyNode" resultType="org.springblade.meter.vo.CopyMeterNodeVO">
+        select *
+        from s_meter_tree_contract mtc
+        where mtc.contract_id = #{contractId} and mtc.is_deleted = 0
+          and mtc.id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        ORDER BY -mtc.sort desc,mtc.create_time,mtc.node_name
+    </select>
+    <select id="getParentNode" resultType="org.springblade.meter.vo.CopyMeterNodeVO">
+        select id as newId,parent_id as newParentId,ancestor as newAncestors
+        from s_meter_tree_contract where id = #{id}
+    </select>
+    <select id="getCurrentNodeTree" resultType="org.springblade.meter.vo.CopyMeterNodeVO2">
+        select id,parent_id,node_name,start_stake,end_stake,contract_picture,1 as isAddChildNode
+        from s_meter_tree_contract mtc
+        where mtc.contract_id = #{contractId} and mtc.is_deleted = 0
+          and (mtc.id = #{id} or FIND_IN_SET(#{id}, mtc.ancestor))
+        ORDER BY -mtc.sort desc,mtc.create_time,mtc.node_name
+    </select>
 
 
 </mapper>

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

@@ -189,7 +189,10 @@
     <select id="getCurrentMeterMoney" resultType="java.math.BigDecimal">
         select ifnull(sum(meter_money),0)
         from s_middle_meter_apply
-        where contract_id = #{contractId} and is_deleted = 0 and contract_period_id = #{contractPeriodId} and approve_status != 3
+        where contract_id = #{contractId} and is_deleted = 0 and approve_status != 3
+        <if test="contractPeriodId != -1">
+            and contract_period_id = #{contractPeriodId}
+        </if>
     </select>
 
 

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

@@ -2,12 +2,14 @@ package org.springblade.meter.service;
 
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.tool.api.R;
+import org.springblade.meter.dto.CopyMeterNodeDTO;
 import org.springblade.meter.dto.LinkMeterTreeAndWbsTreeDTO;
 import org.springblade.meter.dto.MeterTreeContractDTO;
 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.CopyMeterNodeVO2;
 import org.springblade.meter.vo.MeterTreeContractVO;
 import org.springblade.meter.vo.MeterTreeAndWbsTreeVO;
 import org.springframework.web.multipart.MultipartFile;
@@ -52,4 +54,10 @@ public interface MeterTreeContractService extends BaseService<MeterTreeContract>
     void deleteLinkWbsTree(Map<String, String> ids);
 
     MeterTreeContractVO contractDetail(Long id);
+
+    R<Object> contractRemove(Long id);
+
+    R<String> copyNode(CopyMeterNodeDTO dto);
+
+    List<CopyMeterNodeVO2> getCurrentNodeTree(Long id, Long contractId);
 }

+ 181 - 4
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MeterTreeContractServiceImpl.java

@@ -7,6 +7,7 @@ import com.google.common.base.Stopwatch;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.formula.functions.T;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springblade.common.utils.CommonUtil;
@@ -16,13 +17,11 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.node.INode;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
-import org.springblade.meter.dto.LinkMeterTreeAndWbsTreeDTO;
-import org.springblade.meter.dto.MeterTreeContractDTO;
-import org.springblade.meter.dto.MeterTreeContractSaveBatchDTO;
-import org.springblade.meter.dto.MeterTreeContractSaveDTO;
+import org.springblade.meter.dto.*;
 import org.springblade.meter.entity.*;
 import org.springblade.meter.mapper.ContractInventoryFormMapper;
 import org.springblade.meter.mapper.InventoryFormMeterMapper;
@@ -2360,6 +2359,156 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
         return baseMapper.contractDetail(id);
     }
 
+    /**
+     *删除节点,只要未被计量,都可以删除
+     * @param id
+     * @return
+     */
+    @Override
+    @Transactional
+    public R<Object> contractRemove(Long id) {
+        if (id == null){
+            throw new ServiceException("请传入id");
+        }
+        MeterTreeContract obj = this.getById(id);
+        if (obj != null) {
+            if (obj.getParentId().equals(0L) && obj.getAncestor().equals("0")) {
+                throw new ServiceException("根节点无法删除");
+            }
+        }
+        //判断当前节点和子节点是否被锁定
+        List<MeterTreeContract> list2 = baseMapper.getAllLockNode(id,obj.getContractId());
+        if (list2.size() > 0){
+            throw new ServiceException("以下"+list2.size()+"个节点已经被锁定:["+list2.stream().map(l->l.getNodeName()).collect(Collectors.joining(","))+"]");
+        }
+        //判断当前节点和子节点是否被计量,获取所有被计量的节点
+        List<MeterTreeContract> list = baseMapper.getAllMeterNode(id,obj.getContractId());
+        if (list.size() > 0){
+            throw new ServiceException("以下"+list.size()+"个节点已经被计量:["+list.stream().map(l->l.getNodeName()).collect(Collectors.joining(","))+"]");
+        }
+        //删除中间表信息
+        inventoryFormMeterMapper.deleteByNodeId(id,obj.getContractId());
+        //删除节点,并提示删除数量
+        int total = baseMapper.deleteByCondition(id,obj.getContractId());
+        return R.success("操作成功,本次删除"+total+"个节点");
+    }
+
+    /**
+     * 复制节点,根据选中的节点
+     * @param dto
+     */
+    @Override
+    public R<String> copyNode(CopyMeterNodeDTO dto) {
+        try {
+
+            //获取当前节点
+            MeterTreeContract rootNode = this.getById(dto.getId());
+            //获取当前节点父节点,用于递归结构
+            CopyMeterNodeVO vo = baseMapper.getParentNode(rootNode.getParentId());
+            if (vo == null) {
+                throw new ServiceException("根节点不能复制");
+            }
+            // 1 获取所有需要复制的节点
+            List<CopyMeterNodeVO2> vo2List = dto.getVo2s();
+            if (vo2List.size() == 0) {
+                throw new ServiceException("请勾选需要复制的节点后再保存");
+            }
+            //先转换为树
+            //再把树转换为集合
+            Long l5 = System.currentTimeMillis();
+            List<CopyMeterNodeVO2> list2 = ForestNodeMerger.merge(vo2List);
+            Long l6 = System.currentTimeMillis();
+            if (list2.size() != 1){
+                throw new ServiceException("节点集合转换树失败");
+            }
+            List<CopyMeterNodeVO2> vo2s = new ArrayList<>();
+            this.getTreeList(list2.get(0),vo2s);
+            System.out.println("转换2次树"+(l6 - l5));
+            Map<Long, CopyMeterNodeVO2> vo2Map = vo2s.stream().collect(Collectors.toMap(l -> l.getId(), l -> l));
+            List<Long> ids = vo2s.stream().map(l -> l.getId()).collect(Collectors.toList());
+            List<CopyMeterNodeVO> vos = baseMapper.getAllNeedCopyNode(ids, rootNode.getContractId());
+            // 2全部重置id(后期根据是否复制表单考虑重置施工图金额)
+            vos.stream().forEach(l -> {
+                CopyMeterNodeVO2 vo2 = vo2Map.get(l.getId());
+                l.setNewId(SnowFlakeUtil.getId());
+                l.setNodeName(vo2.getNodeName());
+                l.setStartStake(vo2.getStartStake());
+                l.setEndStake(vo2.getEndStake());
+                l.setContractPicture(vo2.getContractPicture());
+            });
+            // 3 转换为树
+            Long l1 = System.currentTimeMillis();
+            List<CopyMeterNodeVO> list = ForestNodeMerger.merge(vos);
+            Long l2 = System.currentTimeMillis();
+            System.out.println(l2 - l1);
+            if (list.size() != 1) {
+                throw new ServiceException("获取子节点错误");
+            }
+            // 4 递归为每个节点设置父id与祖级id
+            Long l3 = System.currentTimeMillis();
+            resetParentAndAncestors(list, vo);
+            Long l4 = System.currentTimeMillis();
+            System.out.println(l4 - l3);
+            // 手动转换类型
+            List<MeterTreeContract> contracts = vos.stream().map(l -> {
+                MeterTreeContract meter = new MeterTreeContract();
+                meter.setId(l.getNewId());
+                meter.setParentId(l.getNewParentId());
+                meter.setAncestor(l.getNewAncestors());
+                meter.setNodeName(l.getNodeName());
+                meter.setNodeCode(l.getNodeCode());
+                meter.setNodeType(l.getNodeType());
+                meter.setEngineeringTypeName(l.getEngineeringTypeName());
+                meter.setDataSourceType(5);
+                meter.setUpdateStatus(l.getUpdateStatus());
+                meter.setProjectId(l.getProjectId());
+                meter.setContractId(l.getContractId());
+                meter.setRemarks(l.getRemarks());
+                meter.setTenantId(l.getTenantId());
+                meter.setSort(l.getSort());
+                meter.setShowType(l.getShowType());
+                meter.setStartStake(l.getStartStake());
+                meter.setStakeType(l.getStakeType());
+                meter.setEndStake(l.getEndStake());
+                meter.setContractPicture(l.getContractPicture());
+                meter.setChangePicture(l.getChangePicture());
+                meter.setIsSupplement(l.getIsSupplement());
+                meter.setIsResolveForm(l.getIsResolveForm());
+                meter.setIsLock(l.getIsLock());
+                meter.setUpPayRatio(l.getUpPayRatio());
+                meter.setIsAutoMeter(l.getIsAutoMeter());
+                meter.setIsConcreteNode(l.getIsConcreteNode());
+                meter.setSevenRatio(l.getSevenRatio());
+                meter.setTwentyEightRatio(l.getTwentyEightRatio());
+                meter.setCalculateFormula(l.getCalculateFormula());
+                //节点金额最后通过是否复制清单来考虑设置
+                return meter;
+            }).collect(Collectors.toList());
+            // 6 保存
+            this.saveBatch(contracts);
+            return R.success("复制成功,本次复制" + contracts.size() + "个节点");
+        }catch (Exception e){
+            throw new ServiceException("复制失败:"+e.getMessage());
+        }
+    }
+
+
+    @Override
+    public List<CopyMeterNodeVO2> getCurrentNodeTree(Long id, Long contractId) {
+        //获取当前节点,以及所有子节点
+        List<CopyMeterNodeVO2> vo2s = baseMapper.getCurrentNodeTree(id,contractId);
+        //转为树
+        Long l1 = System.currentTimeMillis();
+        List<CopyMeterNodeVO2> list = ForestNodeMerger.merge(vo2s);
+        Long l2 = System.currentTimeMillis();
+        System.out.println(l2-l1);
+        //如果根节点出现2个,则代表结构错误
+        if (list.size() != 1){
+            throw new ServiceException("获取子节点错误");
+        }
+        return list;
+    }
+
     /**
      *  通过清单信息和合同计量单元节点,施工图数量,返回组装好的中间表对象
      */
@@ -2532,4 +2681,32 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
         }
     }
 
+    //递归方法,复制节点用
+    private void resetParentAndAncestors(List<CopyMeterNodeVO> list,CopyMeterNodeVO parentId){
+        for (CopyMeterNodeVO vo : list) {
+            vo.setNewParentId(parentId.getNewId());
+            vo.setNewAncestors(parentId.getNewAncestors()+","+parentId.getNewId());
+            if (vo.getChildren() != null){
+                resetParentAndAncestors(vo.getChildren(),vo);
+            }
+        }
+    }
+
+    public void getTreeList(CopyMeterNodeVO2 tree, List<CopyMeterNodeVO2> nodes) {
+        if (tree == null) {
+            return;
+        }
+
+        nodes.add(tree);
+        if (tree.getIsAddChildNode() == 0){
+            return;
+        }
+        List<CopyMeterNodeVO2> children = tree.getChildren();
+        if (children != null) {
+            for (CopyMeterNodeVO2 child : children) {
+                getTreeList(child, nodes);
+            }
+        }
+    }
+
 }

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

@@ -679,6 +679,10 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
      */
     @Override
     public String getMeterNumber(MiddleMeterApply apply) {
+        //如果计量期id为-1则代表不用查询
+        if (apply.getContractPeriodId() == -1){
+            return "";
+        }
         StringBuilder str = new StringBuilder();
         //获取合同信息
         ContractInfo info = baseMapper.getContractInfo(apply.getContractId());