Explorar o código

Merge branch 'dev' of http://219.151.181.73:3000/zhuwei/bladex into dev

lvy hai 6 días
pai
achega
fe18e2f4fc
Modificáronse 22 ficheiros con 313 adicións e 97 borrados
  1. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  2. 5 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ImageClassificationFileClient.java
  3. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveSyncLogVO.java
  4. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveSyncTrialVO.java
  5. 11 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java
  6. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  7. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ImageClassificationFileClientImpl.java
  8. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java
  9. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  10. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IArchiveFileService.java
  11. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSelfInspectionRecordService.java
  12. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java
  13. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDetectionDataServiceImpl.java
  14. 31 12
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  15. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  16. 17 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  17. 4 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  18. 9 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  19. 3 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  20. 169 71
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  21. 7 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  22. 23 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeSynchronousRecordServiceImpl.java

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java

@@ -178,4 +178,7 @@ public interface ArchiveFileClient {
 
     @PostMapping(API_PREFIX + "/saveBatchArchiveFile")
     void saveBatchArchiveFile(@RequestBody List<ArchiveFile> list);
+
+    @PostMapping(API_PREFIX + "/selectMaxSortByContractId")
+    Integer selectMaxSortByContractId(@RequestParam Long contractId);
 }

+ 5 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ImageClassificationFileClient.java

@@ -4,8 +4,10 @@ import org.springblade.business.dto.ImageClassificationFileDTO;
 import org.springblade.business.entity.ImageClassificationFile;
 import org.springblade.common.constant.BusinessConstant;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
@@ -28,4 +30,7 @@ public interface ImageClassificationFileClient {
 
     @PostMapping(API_PREFIX + "/getImageClassificationFileById")
     ImageClassificationFile getImageClassificationFileById(@RequestBody Long id);
+
+    @PostMapping(API_PREFIX + "/getImageClassificationFileByIds")
+    List<ImageClassificationFile> getImageClassificationFileByIds(@RequestBody List<Long> imageIds);
 }

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveSyncLogVO.java

@@ -36,4 +36,8 @@ public class ArchiveSyncLogVO {
 
     @ApiModelProperty("电签文件路径")
     private String eVisaPdfUrl;
+    @ApiModelProperty("父级节点")
+    private Long wbsNodeId;
+    @ApiModelProperty("文件页数")
+    private Integer page;
 }

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveSyncTrialVO.java

@@ -41,4 +41,7 @@ public class ArchiveSyncTrialVO {
 
     @ApiModelProperty(value = "排序")
     private Integer sort;
+
+    @ApiModelProperty(value = "父节点id")
+    private Long pId;
 }

+ 11 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialDetectionController.java

@@ -818,4 +818,15 @@ public class TrialDetectionController extends BladeController {
         });
         return R.data(trailDeviceUseInfoDTOS);
     }
+
+    /**
+     * 根据 设备id 查询 设备信息以及设备使用信息
+     */
+    @PostMapping("/self/updateSort")
+    @ApiOperationSupport(order = 30)
+    @ApiOperation(value = "根据类型修改排序", notes = "deviceInfoIds")
+    public R updateSort(@RequestBody TrialSelfInspectionRecordPageDTO dto) {
+        iTrialSelfInspectionRecordService.updateSort(dto);
+        return R.success("成功");
+    }
 }

+ 4 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

@@ -460,4 +460,8 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
         iArchiveFileService.saveBatch(list);
     }
 
+    @Override
+    public Integer selectMaxSortByContractId(Long contractId) {
+        return iArchiveFileService.selectMaxSortByContractId(contractId);
+    }
 }

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ImageClassificationFileClientImpl.java

@@ -8,6 +8,7 @@ import org.springblade.business.mapper.ImageClassificationFileMapper;
 import org.springblade.business.service.IImageClassificationFileService;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Collections;
 import java.util.List;
 
 @RestController
@@ -27,4 +28,8 @@ public class ImageClassificationFileClientImpl implements ImageClassificationFil
         return imageClassificationFileService.getById(id);
     }
 
+    @Override
+    public List<ImageClassificationFile> getImageClassificationFileByIds(List<Long> imageIds) {
+        return imageClassificationFileService.listByIds(imageIds);
+    }
 }

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java

@@ -122,4 +122,6 @@ public interface ArchiveFileMapper extends BaseMapper<ArchiveFile> {
     Map<String, BigDecimal> getAllArchiveAutoByContractTypeSummary(@Param("projectId") Long projectId);
 
     List<ArchiveFile> getAllArchiveFileByIds(@Param("strList") List<String> strList);
+
+    Integer selectMaxSortByContractId(@Param("contractId") Long contractId);
 }

+ 3 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml

@@ -570,4 +570,7 @@
             </foreach>
         </if>
     </select>
+    <select id="selectMaxSortByContractId" resultType="java.lang.Integer">
+        select max(sort) from u_archive_file where contract_id = #{contractId}
+    </select>
 </mapper>

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IArchiveFileService.java

@@ -76,4 +76,6 @@ public interface IArchiveFileService extends BaseService<ArchiveFile> {
     public void updateArchiveFileEx(List<ArchiveFile> files);
 
     boolean sortByFileTime(Long nodeId);
+
+    Integer selectMaxSortByContractId(Long contractId);
 }

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSelfInspectionRecordService.java

@@ -47,4 +47,6 @@ public interface ITrialSelfInspectionRecordService extends BaseService<TrialSelf
     R getSamplePdfUrl(String id,String contrctId);
 
     Long saveBaseInfo(TrialSeleInspectionRecordInfoDTO vo);
+
+    void updateSort(TrialSelfInspectionRecordPageDTO dto);
 }

+ 4 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java

@@ -365,4 +365,8 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
         }
     }
 
+    @Override
+    public Integer selectMaxSortByContractId(Long contractId) {
+        return baseMapper.selectMaxSortByContractId(contractId);
+    }
 }

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDetectionDataServiceImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.business.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;

+ 31 - 12
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.date.LocalDateTimeUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -145,17 +146,7 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
             if (org.apache.commons.lang.StringUtils.isNotEmpty(dto.getQueryStatus())) {
                 queryWrapper.lambda().eq(TrialSelfInspectionRecord::getDetectionResult, dto.getQueryStatus());
             }
-            if (dto.getSortType() != null) {
-                if (dto.getSortType().equals("1")) {
-                    queryWrapper.lambda().orderByAsc(TrialSelfInspectionRecord::getReportNo);
-                } else if (dto.getSortType().equals("2")) {
-                    queryWrapper.lambda().orderByDesc(TrialSelfInspectionRecord::getReportNo);
-                } else if (dto.getSortType().equals("3")) {
-                    queryWrapper.lambda().orderByAsc(Arrays.asList(TrialSelfInspectionRecord::getSpecificationModel, TrialSelfInspectionRecord::getReportNo));
-                } else if (dto.getSortType().equals("4")) {
-                    queryWrapper.lambda().orderByDesc(Arrays.asList(TrialSelfInspectionRecord::getSpecificationModel, TrialSelfInspectionRecord::getReportNo));
-                }
-            }
+            queryWrapper.lambda().orderByAsc(TrialSelfInspectionRecord::getSort);
 
             IPage<TrialSelfInspectionRecord> pages = this.page(page, queryWrapper.lambda().orderByDesc(true, TrialSelfInspectionRecord::getCreateTime));
             IPage<TrialSelfInspectionRecordVO> trialSelfInspectionRecordVOIPage = TrialSelfInspectionRecordWarpper.build().pageVO(pages);
@@ -2393,5 +2384,33 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         return record.getId();
     }
 
-
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateSort(TrialSelfInspectionRecordPageDTO dto) {
+        LambdaQueryWrapper<TrialSelfInspectionRecord> queryWrapper = Wrappers.<TrialSelfInspectionRecord>lambdaQuery()
+                .eq(TrialSelfInspectionRecord::getNodeId, dto.getNodeId())
+                .eq(TrialSelfInspectionRecord::getType, dto.getType())
+                .eq(TrialSelfInspectionRecord::getContractId, dto.getContractId())
+                .eq(TrialSelfInspectionRecord::getIsDeleted, 0);
+        if (dto.getSortType() != null) {
+            if (dto.getSortType().equals("1")) {
+                queryWrapper.orderByAsc(TrialSelfInspectionRecord::getReportNo);
+            } else if (dto.getSortType().equals("2")) {
+                queryWrapper.orderByDesc(TrialSelfInspectionRecord::getReportNo);
+            } else if (dto.getSortType().equals("3")) {
+                queryWrapper.orderByAsc(Arrays.asList(TrialSelfInspectionRecord::getSpecificationModel, TrialSelfInspectionRecord::getReportNo));
+            } else if (dto.getSortType().equals("4")) {
+                queryWrapper.orderByDesc(Arrays.asList(TrialSelfInspectionRecord::getSpecificationModel, TrialSelfInspectionRecord::getReportNo));
+            }
+        }
+        List<TrialSelfInspectionRecord> trialSelfInspectionRecords = baseMapper.selectList(queryWrapper);
+
+        if (CollectionUtil.isNotEmpty(trialSelfInspectionRecords)) {
+            for (int i = 0; i < trialSelfInspectionRecords.size(); i++) {
+                trialSelfInspectionRecords.get(i).setSort(i + 1);
+            }
+            //修改排序为连续排序
+            updateBatchById(trialSelfInspectionRecords);
+        }
+    }
 }

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java

@@ -180,7 +180,7 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 
     List<TrialSelfInspectionRecordFileVO> getAllTrialRecordFile(@Param("ids") List<Long> recordIds);
 
-    List<TrialClassificationConfiguration> getAllThreeTestNode();
+    List<TrialClassificationConfiguration> getAllThreeTestNode(@Param("contractId") Long contractId);
 
     List<TrialDetectionData> getAllTrialTestRecord(@Param("contractId") Long contractId);
 

+ 17 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -968,7 +968,7 @@
         select * from blade_dict_biz where parent_id != 0 and code = 'contract_log_type' and is_deleted = 0
     </select>
     <select id="getAllTrialNode" resultType="org.springblade.manager.vo.ArchiveSyncTrialVO">
-        select p_key_id,id,parent_id,node_name,full_name,node_type,sort
+        select p_key_id,id,parent_id,node_name,full_name,node_type,sort,p_id
         from m_wbs_tree_private
         where wbs_type = 2 and project_id = #{projectId} and `type` = 1 and is_deleted = 0
           and node_type in (51,52,53)
@@ -977,7 +977,7 @@
     <select id="getAllTrialRecord" resultType="org.springblade.business.entity.TrialSelfInspectionRecord">
         select *
         from u_trial_self_inspection_record
-        where contract_id = #{contractId} and is_deleted = 0 and task_status = '已审批'
+        where contract_id = #{contractId} and is_deleted = 0 and task_status = '已审批' order by sort
     </select>
     <select id="getAllTrialRecordFile"
             resultType="org.springblade.business.vo.TrialSelfInspectionRecordFileVO">
@@ -991,12 +991,21 @@
     </select>
     <select id="getAllThreeTestNode"
             resultType="org.springblade.manager.entity.TrialClassificationConfiguration">
-        select *
-        from m_trial_classification_configuration
-        where is_deleted = 0 and parent_id in
-            (
-                select id from m_trial_classification_configuration where is_deleted = 0 and parent_id = 0 and node_type in (1,2)
-                )
+        SELECT
+            *
+        FROM
+            m_trial_classification_configuration b
+        WHERE
+            is_deleted = 0
+          AND STATUS = 1
+            <if test="contractId == null">
+                and contract_id is null
+            </if>
+            <if test="contractId != null and contractId != ''">
+                and (contract_id is null OR (contract_id = #{contractId}))
+            </if>
+        ORDER BY
+            sort
     </select>
     <select id="getAllTrialTestRecord" resultType="org.springblade.business.entity.TrialDetectionData">
         select *

+ 4 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java

@@ -127,7 +127,8 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
 
     void batchUpdateIsAddConceal(@Param("private") WbsTreePrivate wbsTreePrivate,@Param("pId") Long pId);
 
-    List<ArchiveSyncLogVO> getContractAllLog(@Param("contractId") Long contractId);
+    List<ArchiveSyncLogVO> getContractAllLog(@Param("contractId") Long contractId,
+                                             @Param("wbsNodeId") Long wbsNodeId);
 
     int cancelLinkNodeTreeInfoByJL(@Param("pkeyId")String pkeyId);
 
@@ -152,4 +153,6 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
     void updateSortBatchByPKeyId(List<WbsTreePrivate> resourceData);
 
     List<ArchiveSyncLogVO> getContractAllLogMonthPack(@Param("contractId") Long contractId);
+
+    List<Long> getContractAllLogWbsNodeIds(@Param("contractId") Long contractId);
 }

+ 9 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -976,6 +976,9 @@
             contract_id = #{contractId}
           AND ucl.is_deleted = 0
           AND pdf_url IS NOT NULL
+          <if test="wbsNodeId != null">
+              AND wbs_node_id = #{wbsNodeId}
+          </if>
         ORDER BY
             record_time
     </select>
@@ -1038,6 +1041,8 @@
             pdf_url e_visa_pdf_url,
             create_user,
             create_time,
+            wbs_node_id,
+            page,
             ( SELECT node_type FROM m_wbs_tree_private WHERE p_key_id = ucl.wbs_node_id ) AS logType,
             ( SELECT node_name FROM m_wbs_tree_private WHERE p_key_id = ucl.wbs_node_id ) AS logName
         FROM
@@ -1048,4 +1053,8 @@
         ORDER BY
             record_time;
     </select>
+    <select id="getContractAllLogWbsNodeIds" resultType="java.lang.Long">
+        select DISTINCT wbs_node_id from u_contract_log  WHERE
+            contract_id = #{contractId}
+    </select>
 </mapper>

+ 3 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java

@@ -106,11 +106,13 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
     //获取数据回显
     List<Long> linkNodeTreeBynodeId(String pkeyId);
 
-    List<ArchiveSyncLogVO> getContractAllLog(Long contractId);
+    List<ArchiveSyncLogVO> getContractAllLog(Long contractId, Long wbsNodeId);
 
     void diGuiWbs(int i);
 
     WbsTreePrivateVO tree3(String wbsId, String projectId);
 
     List<ArchiveSyncLogVO> getContractAllLogMonthPack(Long contractId);
+
+    List<Long> getContractAllLogWbsNodeIds(Long contractId);
 }

+ 169 - 71
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java

@@ -1,21 +1,19 @@
 package org.springblade.manager.service.impl;
 
+import cn.hutool.core.lang.mutable.MutableInt;
 import com.alibaba.nacos.common.utils.DateFormatUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.apache.pdfbox.pdmodel.PDDocument;
 import org.springblade.archive.entity.ArchiveProjectConfig;
 import org.springblade.archive.feign.ArchiveAutoClient;
 import org.springblade.business.dto.ImageClassificationFileDTO;
-import org.springblade.business.entity.ArchiveFile;
-import org.springblade.business.entity.InformationQuery;
-import org.springblade.business.entity.TrialDetectionData;
-import org.springblade.business.entity.TrialSelfInspectionRecord;
+import org.springblade.business.entity.*;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.business.feign.ImageClassificationFileClient;
 import org.springblade.business.feign.InformationQueryClient;
-import org.springblade.business.vo.TreeVoTwo;
 import org.springblade.business.vo.TrialSelfInspectionRecordFileVO;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.ForestNodeMergerEx;
@@ -24,6 +22,7 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.enums.AssociationTypeEnum;
 import org.springblade.manager.enums.StorageTypeEnum;
@@ -42,6 +41,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -1035,6 +1035,17 @@ public class ArchiveTreeContractSyncImpl {
         Map<Long, List<TrialSelfInspectionRecord>> recordsMap = records.stream().collect(Collectors.groupingBy(TrialSelfInspectionRecord::getNodeId));
         List<ArchiveTreeContract> addNode = new ArrayList<>();
         List<ArchiveFile> addFile = new ArrayList<>();
+        //试验节点id 添加到档案的节点id映射关系 用与父节点创建
+        HashMap<Long, Long> map = new HashMap<>();
+        for (ArchiveSyncTrialVO trial : trials) {
+            map.put(trial.getPKeyId(),SnowFlakeUtil.getId());
+        }
+
+        //获取文档文件最大 sort
+        Integer sort = archiveFileClient.selectMaxSortByContractId(contractInfo.getId());
+        MutableInt mutableInt = new MutableInt();
+        mutableInt.set(sort);
+
         /**循环指定试验类型 */
         for (Integer type : TrialType) {
             //根据类型获取试验节点
@@ -1045,7 +1056,7 @@ public class ArchiveTreeContractSyncImpl {
             //循环试验节点
             for (ArchiveSyncTrialVO vo : trialVOS) {
                 //把节点转换为档案节点,挂载到同步节点下
-                ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), archiveTreeContract);
+                ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), vo.getSort(), vo.getPKeyId(), vo.getPId(), archiveTreeContract, map);
                 addNode.add(trialNode);
                 //获取出节点下面的报告,并转换为档案文件
                 List<TrialSelfInspectionRecord> files = recordsMap.get(vo.getPKeyId());
@@ -1054,7 +1065,7 @@ public class ArchiveTreeContractSyncImpl {
                 }
                 //挂载到子节点下
                 List<ArchiveFile> newArchiveFileList = files.stream().map(file -> {
-                    ArchiveFile archiveFile = trialFileCovertArchiveFile(file, trialNode);
+                    ArchiveFile archiveFile = trialFileCovertArchiveFile(file, trialNode, contractInfo, mutableInt);
                     return archiveFile;
                 }).collect(Collectors.toList());
                 addFile.addAll(newArchiveFileList);
@@ -1064,15 +1075,22 @@ public class ArchiveTreeContractSyncImpl {
         /**单独处理外委和第三方报告 */
         if (contractTrialType.contains("98")){
             //获取所有的外委和第三方节点
-            List<TrialClassificationConfiguration> threeTestNodes = archiveTreeContractMapper.getAllThreeTestNode();
+            List<TrialClassificationConfiguration> threeTestNodes = archiveTreeContractMapper.getAllThreeTestNode(contractId);
             //获取出合同段所有的检测报告
             List<TrialDetectionData> dataList = archiveTreeContractMapper.getAllTrialTestRecord(contractId);
             //检测报告,按照节点分组
             Map<Long, List<TrialDetectionData>> dataMap = dataList.stream().collect(Collectors.groupingBy(l -> l.getNodeId()));
+
+            //试验节点id 添加到档案的节点id映射关系 用与父节点创建
+            HashMap<Long, Long> map2 = new HashMap<>();
+            for (TrialClassificationConfiguration configuration : threeTestNodes) {
+                map2.put(configuration.getId(),SnowFlakeUtil.getId());
+            }
+
             //循环所有节点
             for (TrialClassificationConfiguration vo : threeTestNodes) {
                 //把节点转换为档案节点,挂载到同步节点下
-                ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), archiveTreeContract);
+                ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), vo.getNodeType() == 1 ? vo.getSort() : vo.getSort() + 100, vo.getId(), vo.getParentId(), archiveTreeContract, map2);
                 addNode.add(trialNode);
                 //获取出节点下面的报告,并转换为档案文件
                 List<TrialDetectionData> files = dataMap.get(vo.getId());
@@ -1081,57 +1099,57 @@ public class ArchiveTreeContractSyncImpl {
                 }
                 //挂载到子节点下
                 List<ArchiveFile> newArchiveFileList = files.stream().map(file -> {
-                    ArchiveFile archiveFile = trialTestFileCovertArchiveFile(file, trialNode);
+                    ArchiveFile archiveFile = trialTestFileCovertArchiveFile(file, trialNode, mutableInt);
                     return archiveFile;
                 }).collect(Collectors.toList());
                 addFile.addAll(newArchiveFileList);
             }
         }
-
+        //暂时先不做
         /**单独处理原材料资质证书 */
-        if (contractTrialType.contains("99")){
-            //获取所有的原材节点
-            List<ArchiveSyncTrialVO> trialVOS = trialsMap.get(52);
-            if (CollectionUtil.isNotEmpty(trialVOS)){
-                //查询出整个系统的附件,设计问题
-                Map<String, Attach> maps = jdbcTemplate.query("select link,original_name from blade_attach", new BeanPropertyRowMapper<>(Attach.class)).stream().collect(Collectors.toMap(Attach::getLink, Attach -> Attach, (obj1, obj2) -> obj1));
-                //获取出所有节点id
-                List<Long> nodeIds = trialVOS.stream().map(l -> l.getPKeyId()).collect(Collectors.toList());
-                //根据节点id,查询出所有的报告id
-                List<Long> recordIds = records.stream().filter(l -> nodeIds.contains(l.getNodeId())).map(l -> l.getId()).collect(Collectors.toList());
-                //根据报告id,查询出所有的报告附件
-                List<TrialSelfInspectionRecordFileVO> fileVOS = archiveTreeContractMapper.getAllTrialRecordFile(recordIds);
-                //报告附件按照节点id分组
-                Map<Long, List<TrialSelfInspectionRecordFileVO>> fileMap = fileVOS.stream().collect(Collectors.groupingBy(l -> l.getNodeId()));
-                //循环原材节点
-                for (ArchiveSyncTrialVO vo : trialVOS) {
-                    //把节点转换为档案节点,挂载到同步节点下
-                    ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), archiveTreeContract);
-                    addNode.add(trialNode);
-                    //获取出节点下面的报告下面的附件,并转换为档案文件
-                    List<TrialSelfInspectionRecordFileVO> files = fileMap.get(vo.getPKeyId());
-                    if (CollectionUtil.isEmpty(files)){
-                        continue;
-                    }
-                    //上个开发太懒,敷衍了事,重新设置附件相关值
-                    for (TrialSelfInspectionRecordFileVO file : files) {
-                        Attach attach = maps.get(file.getUrl());
-                        if (attach != null){
-                            file.setFileName(attach.getOriginalName());
-                            file.setCreateTime(attach.getCreateTime());
-                        }
-                    }
-                    //挂载到子节点下
-                    List<ArchiveFile> newArchiveFileList = files.stream().map(file -> {
-                        ArchiveFile archiveFile = trialFileCovertArchiveFile2(file, trialNode);
-                        return archiveFile;
-                    }).collect(Collectors.toList());
-                    addFile.addAll(newArchiveFileList);
-                }
-
-            }
-
-        }
+//        if (contractTrialType.contains("99")){
+//            //获取所有的原材节点
+//            List<ArchiveSyncTrialVO> trialVOS = trialsMap.get(52);
+//            if (CollectionUtil.isNotEmpty(trialVOS)){
+//                //查询出整个系统的附件,设计问题
+//                Map<String, Attach> maps = jdbcTemplate.query("select link,original_name from blade_attach", new BeanPropertyRowMapper<>(Attach.class)).stream().collect(Collectors.toMap(Attach::getLink, Attach -> Attach, (obj1, obj2) -> obj1));
+//                //获取出所有节点id
+//                List<Long> nodeIds = trialVOS.stream().map(l -> l.getPKeyId()).collect(Collectors.toList());
+//                //根据节点id,查询出所有的报告id
+//                List<Long> recordIds = records.stream().filter(l -> nodeIds.contains(l.getNodeId())).map(l -> l.getId()).collect(Collectors.toList());
+//                //根据报告id,查询出所有的报告附件
+//                List<TrialSelfInspectionRecordFileVO> fileVOS = archiveTreeContractMapper.getAllTrialRecordFile(recordIds);
+//                //报告附件按照节点id分组
+//                Map<Long, List<TrialSelfInspectionRecordFileVO>> fileMap = fileVOS.stream().collect(Collectors.groupingBy(l -> l.getNodeId()));
+//                //循环原材节点
+//                for (ArchiveSyncTrialVO vo : trialVOS) {
+//                    //把节点转换为档案节点,挂载到同步节点下
+//                    ArchiveTreeContract trialNode = createTypeNode(vo.getNodeName(), archiveTreeContract);
+//                    addNode.add(trialNode);
+//                    //获取出节点下面的报告下面的附件,并转换为档案文件
+//                    List<TrialSelfInspectionRecordFileVO> files = fileMap.get(vo.getPKeyId());
+//                    if (CollectionUtil.isEmpty(files)){
+//                        continue;
+//                    }
+//                    //上个开发太懒,敷衍了事,重新设置附件相关值
+//                    for (TrialSelfInspectionRecordFileVO file : files) {
+//                        Attach attach = maps.get(file.getUrl());
+//                        if (attach != null){
+//                            file.setFileName(attach.getOriginalName());
+//                            file.setCreateTime(attach.getCreateTime());
+//                        }
+//                    }
+//                    //挂载到子节点下
+//                    List<ArchiveFile> newArchiveFileList = files.stream().map(file -> {
+//                        ArchiveFile archiveFile = trialFileCovertArchiveFile2(file, trialNode);
+//                        return archiveFile;
+//                    }).collect(Collectors.toList());
+//                    addFile.addAll(newArchiveFileList);
+//                }
+//
+//            }
+//
+//        }
         if (addNode.size() > 0){
             addNode.stream().forEach(l->l.setTenantId(tenantId));
             archiveTreeContractMapper.batchInsertArchiveTreeContract(addNode);
@@ -1169,14 +1187,41 @@ public class ArchiveTreeContractSyncImpl {
         List<ArchiveTreeContract> addNode = new ArrayList<>();
         List<ArchiveFile> addFile = new ArrayList<>();
         //获取合同段所有的日志,并且附带类型
+        //先查询所有当前合同段下所有日志数据的父级节点
+        List<Long> wbsNodeIds =  wbsTreePrivateService.getContractAllLogWbsNodeIds(contractId);
+        if(CollectionUtil.isEmpty(wbsNodeIds)){
+            throw new ServiceException("当前合同段下没有日志资料");
+        }
         List<ArchiveSyncLogVO> logs = wbsTreePrivateService.getContractAllLogMonthPack(contractId);
         //先查按月封装 没有再查日志
         if(CollectionUtil.isEmpty(logs)){
-            logs = wbsTreePrivateService.getContractAllLog(contractId);
+            logs = wbsTreePrivateService.getContractAllLog(contractId, null);
+        } else {
+            Map<Long, List<ArchiveSyncLogVO>> collect = logs.stream().collect(Collectors.groupingBy(ArchiveSyncLogVO::getWbsNodeId));
+            for (Long f : wbsNodeIds) {
+                List<ArchiveSyncLogVO> list = collect.get(f);
+                if(CollectionUtil.isEmpty(list)){
+                    List<ArchiveSyncLogVO> contractAllLog = wbsTreePrivateService.getContractAllLog(contractId, f);
+                    //生成页数
+                    contractAllLog.forEach(x -> {
+                        InputStream inputStream = CommonUtil.getOSSInputStream(x.getPdfUrl());
+                        try (PDDocument document = PDDocument.load(inputStream)) {
+                            int numberOfPages = document.getNumberOfPages();
+                            x.setPage(numberOfPages);
+                        } catch (IOException e) {
+                            System.err.println("文件读取错误: " + e.getMessage());
+                        }
+                    });
+                    if(CollectionUtil.isNotEmpty(contractAllLog)){
+                        logs.addAll(contractAllLog);
+                    }
+                }
+            }
         }
         if (CollectionUtil.isEmpty(logs)){
             throw new ServiceException("当前合同段下没有日志资料");
         }
+        HashMap<Long, Long> map = new HashMap<>();
         //日志按照类型分组
         Map<Integer, List<ArchiveSyncLogVO>> logMap = logs.stream().collect(Collectors.groupingBy(ArchiveSyncLogVO::getLogType));
         //循环选择的日志类型
@@ -1186,7 +1231,7 @@ public class ArchiveTreeContractSyncImpl {
                 throw new ServiceException("日志存在字典中未配置的类型,请检查后再同步");
             }
             //生成子节点
-            ArchiveTreeContract logNode = createTypeNode(typeName, archiveTreeContract);
+            ArchiveTreeContract logNode = createTypeNode(typeName, 0, null, null, archiveTreeContract, map);
             /** 如果到时候修改需求,只显示有日志的,则下面文件存在再add*/
             addNode.add(logNode);
             //然后再从分组中获取,如果存在值则转换为档案文件
@@ -1265,10 +1310,11 @@ public class ArchiveTreeContractSyncImpl {
 
         List<ArchiveTreeContract> addNode = new ArrayList<>();
         List<ArchiveFile> addFile = new ArrayList<>();
+        HashMap<Long, Long> map = new HashMap<>();
         //循环下级节点
         for (ImageClassificationConfig imageType : imageTypes) {
             //把分类生成为影像资料的下级节点
-            ArchiveTreeContract imageNode = createTypeNode(imageType.getClassfName(),archiveTreeContract);
+            ArchiveTreeContract imageNode = createTypeNode(imageType.getClassfName(), 0, null, null, archiveTreeContract, map);
             addNode.add(imageNode);
             //如果当前分类下存在文件,则根据类型生成树,还是日期
 //            List<ImageClassificationFileDTO> files = imageMap.get(imageType.getId());
@@ -1375,7 +1421,27 @@ public class ArchiveTreeContractSyncImpl {
         archiveFile.setFileUrl(file.getImagesPdf());
         archiveFile.setPdfFileUrl(file.getImagesPdf());
         //文件页数  根据关联照片判断
-        long count = albumImagesService.count(Wrappers.<AlbumImages>lambdaQuery().eq(AlbumImages::getAlbumId, file.getId()));
+        List<AlbumImages> list = albumImagesService.list(Wrappers.<AlbumImages>lambdaQuery().eq(AlbumImages::getAlbumId, file.getId()));
+        int count = 0;
+        if(CollectionUtil.isNotEmpty(list)){
+            List<Long> imageIds = list.stream().map(AlbumImages::getImageId).collect(Collectors.toList());
+            if(CollectionUtil.isNotEmpty(imageIds)){
+                //可能存在一条关联记录 多张照片
+                List<ImageClassificationFile> imageClassificationFileByIds = imageClassificationFileClient.getImageClassificationFileByIds(imageIds);
+                if(CollectionUtil.isNotEmpty(imageClassificationFileByIds)){
+                    for (ImageClassificationFile f : imageClassificationFileByIds) {
+                        if(StringUtils.isNotBlank(f.getImageUrl())){
+                            if(f.getImageUrl().contains(",")){
+                                List<String> collect = Arrays.stream(f.getImageUrl().split(",")).filter(StringUtil::isNotBlank).collect(Collectors.toList());
+                                count += collect.size();
+                            }else{
+                                count++;
+                            }
+                        }
+                    }
+                }
+            }
+        }
         //2张照片为一页
         archiveFile.setFilePage((int) Math.ceil((double) count / 2));
         archiveFile.setIsApproval(0);
@@ -1521,7 +1587,7 @@ public class ArchiveTreeContractSyncImpl {
     /**
      * 质检试验检测资料 转换为 档案文件
      */
-    private ArchiveFile trialTestFileCovertArchiveFile(TrialDetectionData vo,ArchiveTreeContract parentNode)
+    private ArchiveFile trialTestFileCovertArchiveFile(TrialDetectionData vo,ArchiveTreeContract parentNode, MutableInt sort)
     {
         ArchiveFile archiveFile = new ArchiveFile();
         archiveFile.setId(SnowFlakeUtil.getId());
@@ -1529,7 +1595,20 @@ public class ArchiveTreeContractSyncImpl {
         archiveFile.setContractId(String.valueOf(parentNode.getContractId()));
         archiveFile.setNodeId(parentNode.getId()+"");
         archiveFile.setFileNumber(vo.getReportNo());
-        archiveFile.setFileName(vo.getMaterialName()+vo.getSpecificationModel());
+        //报告编号+规格型号+试验名称+试验检测报告及附件
+        StringBuffer fileName = new StringBuffer();
+        if(StringUtils.isNotBlank(vo.getReportNo())){
+            fileName.append(vo.getReportNo());
+        }
+        if(StringUtils.isNotBlank(vo.getSpecificationModel())){
+            fileName.append(vo.getSpecificationModel());
+        }
+        if(StringUtils.isNotBlank(vo.getMaterialName())){
+            fileName.append(vo.getMaterialName());
+        }
+        fileName.append("试验检测报告及附件");
+
+        archiveFile.setFileName(fileName.toString());
         if (vo.getReportDate() != null) {
             archiveFile.setFileTime(new SimpleDateFormat("yyyy-MM-dd").format(vo.getReportDate()));
         }
@@ -1539,7 +1618,8 @@ public class ArchiveTreeContractSyncImpl {
         archiveFile.setIsApproval(0);
         archiveFile.setIsCertification(1);
         archiveFile.setIsNeedCertification(0);
-        archiveFile.setDutyUser(vo.getUserName());
+        //责任人 - 委托单位名称
+        archiveFile.setDutyUser(vo.getEntrustCompany());
         archiveFile.setCreateUser(vo.getCreateUser());
         archiveFile.setStatus(0);
         archiveFile.setIsDeleted(0);
@@ -1550,7 +1630,8 @@ public class ArchiveTreeContractSyncImpl {
                 .toLocalDateTime();
         archiveFile.setFtime(localDateTime);
         archiveFile.setUtime(localDateTime);
-        archiveFile.setSort(0);
+        sort.set(sort.get() + 1);
+        archiveFile.setSort(sort.get());
         archiveFile.setPageNum("1");
         archiveFile.setSourceType(1);
         archiveFile.setIsElement(0);
@@ -1562,7 +1643,7 @@ public class ArchiveTreeContractSyncImpl {
     /**
      * 质检试验资料 转换为 档案文件
      */
-    private ArchiveFile trialFileCovertArchiveFile(TrialSelfInspectionRecord vo,ArchiveTreeContract parentNode)
+    private ArchiveFile trialFileCovertArchiveFile(TrialSelfInspectionRecord vo,ArchiveTreeContract parentNode, ContractInfo contractInfo, MutableInt sort )
     {
         ArchiveFile archiveFile = new ArchiveFile();
         archiveFile.setId(SnowFlakeUtil.getId());
@@ -1570,7 +1651,21 @@ public class ArchiveTreeContractSyncImpl {
         archiveFile.setContractId(String.valueOf(parentNode.getContractId()));
         archiveFile.setNodeId(parentNode.getId()+"");
         archiveFile.setFileNumber(vo.getReportNo());
-        archiveFile.setFileName(StringUtils.isNotBlank(vo.getSpecificationModel())?vo.getSpecificationModel():vo.getTrialProjectName());
+        //报告编号+规格型号+试验名称+试验检测报告及附件
+        StringBuffer fileName = new StringBuffer();
+        if(StringUtils.isNotBlank(vo.getReportNo())){
+            fileName.append(vo.getReportNo());
+        }
+        if(StringUtils.isNotBlank(vo.getSpecificationModel())){
+            fileName.append(vo.getSpecificationModel());
+        }
+        if(StringUtils.isNotBlank(vo.getTrialProjectName())){
+            fileName.append(vo.getTrialProjectName());
+        }
+        fileName.append("试验检测报告及附件");
+
+
+        archiveFile.setFileName(fileName.toString());
         if (vo.getReportDate() != null) {
             archiveFile.setFileTime(new SimpleDateFormat("yyyy-MM-dd").format(vo.getReportDate()));
         }
@@ -1580,7 +1675,8 @@ public class ArchiveTreeContractSyncImpl {
         archiveFile.setIsApproval(0);
         archiveFile.setIsCertification(1);
         archiveFile.setIsNeedCertification(0);
-        archiveFile.setDutyUser(vo.getTrialUserName());
+        //当前合同段单位名称 施工单位 / 监理单位
+        archiveFile.setDutyUser(contractInfo.getContractType() == 1 ? contractInfo.getConstructionUnitName() : contractInfo.getSupervisionUnitName());
         archiveFile.setCreateUser(vo.getCreateUser());
         archiveFile.setStatus(0);
         archiveFile.setIsDeleted(0);
@@ -1591,7 +1687,8 @@ public class ArchiveTreeContractSyncImpl {
                 .toLocalDateTime();
         archiveFile.setFtime(localDateTime);
         archiveFile.setUtime(localDateTime);
-        archiveFile.setSort(0);
+        sort.set(sort.get() + 1);
+        archiveFile.setSort(sort.get());
         archiveFile.setPageNum("1");
         archiveFile.setSourceType(1);
         archiveFile.setIsElement(0);
@@ -1613,8 +1710,8 @@ public class ArchiveTreeContractSyncImpl {
         archiveFile.setFileName(vo.getFileName());
         archiveFile.setFileTime(vo.getRecordTime());
         archiveFile.setFileUrl(vo.getPdfUrl());
-        archiveFile.setPdfFileUrl(vo.getEVisaPdfUrl());
-        archiveFile.setFilePage(1);
+        archiveFile.setPdfFileUrl(StringUtil.isNotBlank(vo.getEVisaPdfUrl()) ? vo.getEVisaPdfUrl() : vo.getPdfUrl());
+        archiveFile.setFilePage(vo.getPage() == null ? 0 : vo.getPage());
         archiveFile.setIsApproval(0);
         archiveFile.setIsCertification(1);
         archiveFile.setIsNeedCertification(0);
@@ -1683,18 +1780,19 @@ public class ArchiveTreeContractSyncImpl {
      * 档案同步质检影像资料时,为影像资料-日志资料   节点下级创建分类节点
      * 传入分类名称
      */
-    public ArchiveTreeContract createTypeNode(String nodeName,ArchiveTreeContract archiveTreeContract){
+    public ArchiveTreeContract createTypeNode(String nodeName, Integer sort,Long pKeyId, Long pId,ArchiveTreeContract archiveTreeContract, HashMap<Long, Long> map){
         ArchiveTreeContract archiveTreeContractTemp = new ArchiveTreeContract();
         //设置基本信息
-        archiveTreeContractTemp.setId(SnowFlakeUtil.getId());
+        archiveTreeContractTemp.setId(map.get(pKeyId) == null ? SnowFlakeUtil.getId() : map.get(pKeyId));
         archiveTreeContractTemp.setTenantId(AuthUtil.getTenantId());
         archiveTreeContractTemp.setProjectId(archiveTreeContract.getProjectId());
         archiveTreeContractTemp.setContractId(archiveTreeContract.getContractId());
-        archiveTreeContractTemp.setParentId(archiveTreeContract.getId());
+        archiveTreeContractTemp.setParentId(pId == null || map == null || map.get(pId) == null ? archiveTreeContract.getId() : map.get(pId));
         archiveTreeContractTemp.setAncestors(archiveTreeContract.getAncestors()+","+archiveTreeContract.getId());
         archiveTreeContractTemp.setNodeName(nodeName);
         archiveTreeContractTemp.setNodeType(1);
         archiveTreeContractTemp.setFullName(nodeName);
+        archiveTreeContractTemp.setSort(sort);
         archiveTreeContractTemp.setStatus(1);
         archiveTreeContractTemp.setIsDeleted(0);
         //设置关联

+ 7 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -3204,8 +3204,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
 
     @Override
-    public List<ArchiveSyncLogVO> getContractAllLog(Long contractId) {
-        return baseMapper.getContractAllLog(contractId);
+    public List<ArchiveSyncLogVO> getContractAllLog(Long contractId, Long wbsNodeId) {
+        return baseMapper.getContractAllLog(contractId, wbsNodeId);
     }
 
     @Override
@@ -3213,6 +3213,11 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return baseMapper.getContractAllLogMonthPack(contractId);
     }
 
+    @Override
+    public List<Long> getContractAllLogWbsNodeIds(Long contractId) {
+        return baseMapper.getContractAllLogWbsNodeIds(contractId);
+    }
+
     public void diGuiWbs(int i) {
         QueryWrapper<WbsTreePrivate> wbsTreePrivateQueryWrapper = new QueryWrapper<>();
         wbsTreePrivateQueryWrapper.select("p_key_id", "id", "p_id", "wbs_id", "project_id", "parent_id", "ancestors");

+ 23 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeSynchronousRecordServiceImpl.java

@@ -80,7 +80,7 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
 
 
         //记录选中节点下的表单数
-        String[] newNodeIds = mWbsTreeSynchronousRecord.getNodeId().split(",");
+        List<String> newNodeIds = Arrays.asList(mWbsTreeSynchronousRecord.getNodeId().split(","));
         for (String newNodeId : newNodeIds) {
             Long nodeIdLong = Long.valueOf(newNodeId);
             if (privateIds.contains(nodeIdLong)) {
@@ -88,6 +88,28 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
             }
         }
 
+        List<String> parentIds = new ArrayList<>();
+        //处理父节点包含子节点数据
+        for (String newNodeId : newNodeIds) {
+            WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery()
+                    .eq(WbsTreePrivate::getPKeyId, newNodeId));
+            //如果是最顶层节点
+            if(wbsTreePrivate.getPId() == 0){
+                //清空所有记录,只保留最顶层节点id
+                parentIds.clear();
+                parentIds.add(newNodeId);
+                break;
+            }
+            //如果当前节点的父节点也在列表中,去掉当前节点
+            if(newNodeIds.contains(wbsTreePrivate.getPId().toString())){
+                continue;
+            }
+            parentIds.add(newNodeId);
+        }
+        if(!parentIds.isEmpty()){
+            mWbsTreeSynchronousRecord.setNodeId(String.join(",", parentIds));
+        }
+
         //模板项目信息
         ProjectInfo tempProject = projectInfoMapper.selectOne(Wrappers.<ProjectInfo>lambdaQuery()
                 .eq(ProjectInfo::getId, mWbsTreeSynchronousRecord.getTemplateId()));