Sfoglia il codice sorgente

合同计量单元复制节点

qianxb 1 anno fa
parent
commit
6d144d84dd

+ 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;
+
+}

+ 39 - 1
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) {
@@ -885,6 +888,11 @@ public class MeterTreeController extends BladeController {
         return R.success("取消关联成功");
     }
 
+    /**
+     * 动态获取计量导入模板
+     * @param type
+     * @return
+     */
     @GetMapping("/contract/importTemplate")
     @ApiOperationSupport(order = 37)
     @ApiOperation(value = "获取合同计量单元导入模板", notes = "获取合同计量单元导入模板,传入type")
@@ -897,4 +905,34 @@ public class MeterTreeController extends BladeController {
 
     }
 
+    /**
+     * 复制节点,获取子树
+     * @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);
+    }
+
 }

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

@@ -68,4 +68,9 @@ public interface MeterTreeContractMapper extends BaseMapper<MeterTreeContract> {
 
     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);
 }

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

@@ -167,6 +167,27 @@
         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>

+ 6 - 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;
@@ -54,4 +56,8 @@ public interface MeterTreeContractService extends BaseService<MeterTreeContract>
     MeterTreeContractVO contractDetail(Long id);
 
     R<Object> contractRemove(Long id);
+
+    R<String> copyNode(CopyMeterNodeDTO dto);
+
+    List<CopyMeterNodeVO2> getCurrentNodeTree(Long id, Long contractId);
 }

+ 147 - 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;
@@ -2394,6 +2393,122 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
         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;
+    }
+
     /**
      *  通过清单信息和合同计量单元节点,施工图数量,返回组装好的中间表对象
      */
@@ -2566,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);
+            }
+        }
+    }
+
 }