Kaynağa Gözat

多份复制附件bug

liuyc 2 yıl önce
ebeveyn
işleme
1a3ab3bede

+ 100 - 104
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -579,7 +579,7 @@ public class InformationWriteQueryController extends BladeController {
     @ApiOperation(value = "单个废除")
     public R<Boolean> abolishOne(@RequestParam String primaryKeyId, @RequestParam String classify) {
         //查询填报状态
-        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType,1));
+        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType, 1));
         if (businessData != null) {
             //使用批量废除接口
             return this.batchAbolish(businessData.getId().toString(), primaryKeyId);
@@ -863,7 +863,7 @@ public class InformationWriteQueryController extends BladeController {
     @ApiOperation(value = "填报页单个上报")
     public R<Boolean> taskOne(@RequestBody StartTaskVO startTaskVO) throws IOException {
         //此时的ids是当前节点的primaryKeyId但并不是业务数据ID,需要根据ids和classify去查询具体的业务ID
-        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()).eq(InformationQuery::getType,1));
+        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()).eq(InformationQuery::getType, 1));
 
         //处理上报信息
         if (businessData != null) {
@@ -1449,7 +1449,7 @@ public class InformationWriteQueryController extends BladeController {
             //复制元素表附件信息
             List<WbsTreeContract> newTabs = saveList.stream().filter(f -> (new Integer(2).equals(f.getType()))).collect(Collectors.toList());
             if (newTabs.size() > 0 && oldTabs.size() > 0 && vo.getIsCopyData() == 1) {
-                this.addCopyTabFile(newTabs, oldTabs);
+                this.addCopyTabFile(new HashSet<>(newTabs), oldTabs);
             }
 
             //复制表单数据
@@ -1508,99 +1508,94 @@ public class InformationWriteQueryController extends BladeController {
                     //结果集
                     List<WbsTreeContract> addNodeList = new ArrayList<>();//新增节点
                     List<WbsTreeContract> addTabList = new ArrayList<>(); //新增表单
-                    //List<WbsTreeContract> asyncWbsTreeNodes = new ArrayList<>(); //redis同步节点
                     Set<WbsTreeContract> addChildNodesTablesOldAll = new HashSet<>(addChildNodesTables);//数据源表附件
-                    Set<WbsTreeContract> addNewFileTabs = new HashSet<>(addChildNodesTables);//新增到目标表附件
+                    Set<WbsTreeContract> addNewFileTabs = new HashSet<>();//新增到目标表附件
                     List<String> resultTablesData = new ArrayList<>();//表单数据
 
-                    //创建线程池,默认设置4个线程
-                    ExecutorService executor = Executors.newFixedThreadPool(4);
-                    try {
-                        //解析位置信息,进行复制数据构造
-                        if (toCopyNodes.size() == copyBatches.size()) {
-                            for (int i = 0; i < toCopyNodes.size(); i++) {
-                                WbsTreeContract needCopyNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
-                                //首先查询需要复制的节点的信息
-                                WbsTreeContract toCopyNode = toCopyNodes.get(i);
-                                CopyContractTreeNodeVO.CopyBatch toCopyVO = copyBatches.get(i);
-                                //asyncWbsTreeNodes.add(toCopyNode);
-                                String finalTabOwner = tabOwner;
-                                executor.submit(() -> {
-                                    if (toCopyNode != null && toCopyVO != null && needCopyNodeAndTabMap.size() > 0) {
-                                        //TODO 同节点复制
-                                        if (new Integer(1).equals(toCopyVO.getIsSameNode())) {
-                                            //1.1 选择当前节点的父级节点,新增
-                                            if (needCopyNode.getParentId().equals(toCopyNode.getId())) {
-                                                toCopyNode.setNodeName(toCopyVO.getNodeName());
-                                                toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
-
-                                                //获取缓存节点、表信息
-                                                List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
-                                                List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
-
-                                                //构造新的节点、表、数据
-                                                this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNode, toCopyNode, resultTablesData, 1, finalTabOwner, vo.getIsCopyData());
-
-                                                //1.2 选择同父级的同级节点,只复制数据
-                                            } else if (needCopyNode.getParentId().equals(toCopyNode.getParentId())) {
-                                                //构造数据
-                                                this.addCopyTabData(needCopyNode, toCopyNode, finalTabOwner, resultTablesData, addTabList, vo.getIsCopyData(), addNewFileTabs);
-                                            }
+                    //解析位置信息,进行复制数据构造
+                    if (toCopyNodes.size() == copyBatches.size()) {
+                        for (int i = 0; i < toCopyNodes.size(); i++) {
+                            WbsTreeContract needCopyNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
+                            //首先查询需要复制的节点的信息
+                            WbsTreeContract toCopyNode = toCopyNodes.get(i);
+                            CopyContractTreeNodeVO.CopyBatch toCopyVO = copyBatches.get(i);
+
+                            if (toCopyNode != null && toCopyVO != null && needCopyNodeAndTabMap.size() > 0) {
+                                //TODO 同节点复制
+                                if (new Integer(1).equals(toCopyVO.getIsSameNode())) {
+                                    //1.1 选择当前节点的父级节点,新增
+                                    if (needCopyNode.getParentId().equals(toCopyNode.getId())) {
+                                        toCopyNode.setNodeName(toCopyVO.getNodeName());
+                                        toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
+
+                                        //获取缓存节点、表信息
+                                        List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
+                                        List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
+
+                                        //构造新的节点、表、数据
+                                        this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNode, toCopyNode, resultTablesData, 1, tabOwner, vo.getIsCopyData());
+
+                                        //附件
+                                        addNewFileTabs.addAll(addTabList);
+
+                                        //1.2 选择同父级的同级节点,只复制数据
+                                    } else if (needCopyNode.getParentId().equals(toCopyNode.getParentId())) {
+                                        //构造数据
+                                        this.addCopyTabData(needCopyNode, toCopyNode, tabOwner, resultTablesData, addTabList, vo.getIsCopyData(), addNewFileTabs);
+                                    }
 
-                                            //TODO 跨节点复制
-                                        } else if (new Integer(0).equals(toCopyVO.getIsSameNode())) {
-                                            //获取需要复制节点的上级
-                                            WbsTreeContract parentNodeNeed = wbsTreeContractClient.getContractWbsTreeByContractIdAndId(needCopyNode.getParentId(), Long.parseLong(needCopyNode.getContractId()));
-
-                                            boolean var = false;
-                                            //2.1 选择的父级的同级的父级节点,新增(当复制节点父级与选择复制到的位置节点的父级id相同时,表示跨节点新增)
-                                            if (parentNodeNeed != null) {
-                                                //2.1.1 如果是跨一级的情况下:parentNodeNeed.getParentId() == toCopyNode.getParentId() ,且 parentNodeNeed.getAncestors() == toCopyNode.getAncestors() ,且节点类型必须一样
-                                                if (parentNodeNeed.getParentId().equals(toCopyNode.getParentId()) && parentNodeNeed.getAncestors().equals(toCopyNode.getAncestors()) && parentNodeNeed.getNodeType().equals(toCopyNode.getNodeType())) {
-                                                    toCopyNode.setNodeName(toCopyVO.getNodeName());
-                                                    toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
-
-                                                    //获取缓存节点、表信息
-                                                    List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
-                                                    List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
-
-                                                    //构造新的节点、表、数据
-                                                    this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNode, toCopyNode, resultTablesData, 0, finalTabOwner, vo.getIsCopyData());
-                                                    var = true;
-
-                                                } else if (!parentNodeNeed.getParentId().equals(toCopyNode.getParentId()) && !parentNodeNeed.getAncestors().equals(toCopyNode.getAncestors()) && parentNodeNeed.getNodeType().equals(toCopyNode.getNodeType())) {
-                                                    //2.1.2 如果跨多级的情况下父级id不相同 parentNodeNeed.getParentId() != toCopyNode.getParentId() ,且 parentNodeNeed.getAncestors() != toCopyNode.getAncestors() ,且节点类型必须一样
-                                                    toCopyNode.setNodeName(toCopyVO.getNodeName());
-                                                    toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
-
-                                                    //获取缓存节点、表信息
-                                                    List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
-                                                    List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
-
-                                                    //构造新的节点、表、数据
-                                                    this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNode, toCopyNode, resultTablesData, 0, finalTabOwner, vo.getIsCopyData());
-                                                    var = true;
-                                                }
-                                            }
+                                    //TODO 跨节点复制
+                                } else if (new Integer(0).equals(toCopyVO.getIsSameNode())) {
+                                    //获取需要复制节点的上级
+                                    WbsTreeContract parentNodeNeed = wbsTreeContractClient.getContractWbsTreeByContractIdAndId(needCopyNode.getParentId(), Long.parseLong(needCopyNode.getContractId()));
 
-                                            //2.2 如果点击选择的是当前复制节点本身的同等级节点,那么就只复制数据。(如果是跨节点,类型相同的情况下,只复制数据),且var=false,表示没有进行到跨节点新增的逻辑,只是跨节点复制数据
-                                            if (needCopyNode.getNodeType().equals(toCopyNode.getNodeType()) && !needCopyNode.getParentId().equals(toCopyNode.getParentId()) && !var) {
-                                                //构造数据
-                                                this.addCopyTabData(needCopyNode, toCopyNode, finalTabOwner, resultTablesData, addTabList, vo.getIsCopyData(), addNewFileTabs);
-                                            }
+                                    boolean var = false;
+                                    //2.1 选择的父级的同级的父级节点,新增(当复制节点父级与选择复制到的位置节点的父级id相同时,表示跨节点新增)
+                                    if (parentNodeNeed != null) {
+                                        //2.1.1 如果是跨一级的情况下:parentNodeNeed.getParentId() == toCopyNode.getParentId() ,且 parentNodeNeed.getAncestors() == toCopyNode.getAncestors() ,且节点类型必须一样
+                                        if (parentNodeNeed.getParentId().equals(toCopyNode.getParentId()) && parentNodeNeed.getAncestors().equals(toCopyNode.getAncestors()) && parentNodeNeed.getNodeType().equals(toCopyNode.getNodeType())) {
+                                            toCopyNode.setNodeName(toCopyVO.getNodeName());
+                                            toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
+
+                                            //获取缓存节点、表信息
+                                            List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
+                                            List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
+
+                                            //构造新的节点、表、数据
+                                            this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNode, toCopyNode, resultTablesData, 0, tabOwner, vo.getIsCopyData());
+
+                                            //附件
+                                            addNewFileTabs.addAll(addTabList);
+
+                                            var = true;
+
+                                        } else if (!parentNodeNeed.getParentId().equals(toCopyNode.getParentId()) && !parentNodeNeed.getAncestors().equals(toCopyNode.getAncestors()) && parentNodeNeed.getNodeType().equals(toCopyNode.getNodeType())) {
+                                            //2.1.2 如果跨多级的情况下父级id不相同 parentNodeNeed.getParentId() != toCopyNode.getParentId() ,且 parentNodeNeed.getAncestors() != toCopyNode.getAncestors() ,且节点类型必须一样
+                                            toCopyNode.setNodeName(toCopyVO.getNodeName());
+                                            toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
+
+                                            //获取缓存节点、表信息
+                                            List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
+                                            List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
+
+                                            //构造新的节点、表、数据
+                                            this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNode, toCopyNode, resultTablesData, 0, tabOwner, vo.getIsCopyData());
+
+                                            //附件
+                                            addNewFileTabs.addAll(addTabList);
+
+                                            var = true;
                                         }
                                     }
-                                });
+
+                                    //2.2 如果点击选择的是当前复制节点本身的同等级节点,那么就只复制数据。(如果是跨节点,类型相同的情况下,只复制数据),且var=false,表示没有进行到跨节点新增的逻辑,只是跨节点复制数据
+                                    if (needCopyNode.getNodeType().equals(toCopyNode.getNodeType()) && !needCopyNode.getParentId().equals(toCopyNode.getParentId()) && !var) {
+                                        //构造数据
+                                        this.addCopyTabData(needCopyNode, toCopyNode, tabOwner, resultTablesData, addTabList, vo.getIsCopyData(), addNewFileTabs);
+                                    }
+                                }
                             }
                         }
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    } finally {
-                        //关闭线程池
-                        executor.shutdown();
-                        //等待所有线程执行完毕
-                        while (!executor.isTerminated()) {
-                        }
                     }
 
                     //重构祖级id
@@ -1625,7 +1620,7 @@ public class InformationWriteQueryController extends BladeController {
 
                     if (addNewFileTabs.size() > 0 && addChildNodesTablesOldAll.size() > 0 && vo.getIsCopyData() == 1) {
                         //复制新增表附件
-                        this.addCopyTabFile(tabs, addChildNodesTablesOldAll);
+                        this.addCopyTabFile(addNewFileTabs, addChildNodesTablesOldAll);
                     }
 
                     if (resultTablesData.size() > 0 && vo.getIsCopyData() == 1) {
@@ -1635,15 +1630,12 @@ public class InformationWriteQueryController extends BladeController {
                             jdbcTemplate.execute(StringUtils.join(strings, ""));
                         }
                     }
+
                     if (row) {
                         //更新redis缓存
                         informationQueryService.delAsyncWbsTree(contractId);
-                        /*List<WbsTreeContract> collect = asyncWbsTreeNodes.stream().distinct().collect(Collectors.toList());
-                        for (WbsTreeContract asyncWbsTreeNode : collect) {
-                            informationQueryService.AsyncWbsTree("", asyncWbsTreeNode.getId() + "", contractId, "", "1");
-                            informationQueryService.AsyncWbsTree("", asyncWbsTreeNode.getParentId() + "", contractId, "", "1");
-                        }*/
                     }
+
                     return R.success("操作成功");
                 } else {
                     throw new ServiceException("没有找到需要复制的节点信息,请联系管理员");
@@ -1685,28 +1677,32 @@ public class InformationWriteQueryController extends BladeController {
      * 新增复制的表单文件
      */
     @Async
-    public void addCopyTabFile(List<WbsTreeContract> addChildNodesTables, Set<WbsTreeContract> addChildNodesTablesOld) {
+    public void addCopyTabFile(Set<WbsTreeContract> addChildNodesTables, Set<WbsTreeContract> addChildNodesTablesOld) {
         //获取所有数据源附件文件
         List<Long> tabFileIds = addChildNodesTablesOld.stream().distinct().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
         Map<String, List<TableFile>> tableFileOldMap = tableFileClient.getTabFilesByTabIds(StringUtils.join(tabFileIds, ",")).stream().collect(Collectors.groupingBy(TableFile::getTabId));
         if (tableFileOldMap != null && tableFileOldMap.size() > 0) {
             List<TableFile> resultFileData = new ArrayList<>();
-            List<Long> updatePKeyIds = new ArrayList<>();
-            for (WbsTreeContract tabOld : addChildNodesTablesOld) {
-                for (WbsTreeContract tabNew : addChildNodesTables) {
+            Set<Long> updatePKeyIds = new HashSet<>();
+            for (WbsTreeContract tabNew : addChildNodesTables) {
+                for (WbsTreeContract tabOld : addChildNodesTablesOld) {
                     //获取对应表
                     if (tabOld.getNodeName().equals(tabNew.getNodeName()) && (ObjectUtil.isNotEmpty(tabOld.getHtmlUrl()) && ObjectUtil.isNotEmpty(tabNew.getHtmlUrl()) && tabOld.getHtmlUrl().equals(tabNew.getHtmlUrl()))) {
                         //构建文件数据
                         List<TableFile> tab = tableFileOldMap.get(tabOld.getPKeyId() + "");
                         if (tab != null && tab.size() > 0) {
-                            tab.forEach(file -> {
-                                file.setTabId(tabNew.getPKeyId() + "");
-                                file.setId(SnowFlakeUtil.getId());
-                            });
-                            resultFileData.addAll(tab);
+                            for (TableFile tableFile : tab) {
+                                TableFile obj = BeanUtil.copyProperties(tableFile, TableFile.class);
+                                if (obj != null){
+                                    obj.setTabId(tabNew.getPKeyId() + "");
+                                    obj.setId(SnowFlakeUtil.getId());
+                                    resultFileData.add(obj);
+                                }
+                            }
                             if (ObjectUtil.isNotEmpty(tabOld) && tabOld.getTabFileType() == 2) {
                                 updatePKeyIds.add(tabNew.getPKeyId());
                             }
+                            break;
                         }
                     }
                 }
@@ -1715,7 +1711,7 @@ public class InformationWriteQueryController extends BladeController {
                 //入库
                 if (tableFileClient.saveBatch(resultFileData) && updatePKeyIds.size() > 0) {
                     //修改表的文件按钮状态
-                    wbsTreeContractClient.updateTabFileTypeByPkeyIds(updatePKeyIds);
+                    wbsTreeContractClient.updateTabFileTypeByPkeyIds(new ArrayList<>(updatePKeyIds));
                 }
             }
         }
@@ -3099,7 +3095,7 @@ public class InformationWriteQueryController extends BladeController {
             vo.setContractId(Long.valueOf(vo.getContractIdRelation()));
         }
 
-        return R.data(this.informationQueryService.selectInformationQueryPage(Condition.getPage(query), vo,node));
+        return R.data(this.informationQueryService.selectInformationQueryPage(Condition.getPage(query), vo, node));
     }
 
     /**

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java

@@ -575,6 +575,7 @@ public class TextdictInfoController extends BladeController {
         List<Long> cIdsList = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getId).distinct().collect(Collectors.toList());
         if(cIdsList!=null && cIdsList.size()>=1){
             List<Long> cPkeyIds = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                    .select(WbsTreeContract::getPKeyId)
                     .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
                     .eq(WbsTreeContract::getExcelId, wbsTreePrivate.getExcelId())
                     .eq(WbsTreeContract::getStatus, 1)

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -35,6 +35,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.*;
 import java.util.function.Function;
@@ -507,7 +508,7 @@ public class WbsTreePrivateController extends BladeController {
     @ApiOperationSupport(order = 14)
     @ApiOperation(value = "同步项目下所有节点的电签默认信息", notes = "传入项目projectId、节点pKeyId")
     @RequestMapping(value = "/sync-project-eVisa", method = RequestMethod.POST)
-    public R syncProjectEVisa(@RequestParam String projectId, @RequestParam String pKeyId) {
+    public R syncProjectEVisa(@RequestParam String projectId, @RequestParam String pKeyId) throws FileNotFoundException {
         return R.status(wbsTreePrivateService.syncProjectEVisa(projectId, pKeyId));
     }
 

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

@@ -58,7 +58,7 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
 
     boolean syncNodeParam(String projectId, String pKeyId);
 
-    boolean syncProjectEVisa(String projectId, String pKeyId);
+    boolean syncProjectEVisa(String projectId, String pKeyId) throws FileNotFoundException;
 
     void eVisInfoRepeatDel(String pid);
 

+ 44 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -40,14 +40,14 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.annotation.Resource;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.*;
-import java.util.concurrent.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @Service
 @AllArgsConstructor
@@ -802,7 +802,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 List<Long> wbsTreeIds = new ArrayList<>(map.values());
                 List<List<Long>> partition = Lists.partition(wbsTreeIds, 1000);
                 for (List<Long> ids : partition) {
-                    String sql = "select id,name,k,v,node_id,remark from m_wbs_param where node_id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
+                    String sql = "select id,name,k,v,node_id,remark from m_wbs_param where is_deleted = 0 and status = 1 and node_id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
                     List<WbsParam> wbsParams = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
                     wbsParamOldList.addAll(wbsParams);
                 }
@@ -835,7 +835,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             //当前引用模板的节点参数,数据源Map
             Map<Long, WbsParam> paramOldDataMap = wbsParamOldList.stream().collect(Collectors.toMap(WbsParam::getId, Function.identity()));
             //获取当前项目的选择的该节点的节点、以及子节点下的参数信息
-            List<WbsParam> paramListNow = wbsParamMapper.selectList(Wrappers.<WbsParam>lambdaQuery().select(WbsParam::getK, WbsParam::getV, WbsParam::getName, WbsParam::getId, WbsParam::getRemark, WbsParam::getNodeId).eq(WbsParam::getProjectId, Long.parseLong(projectId)).in(WbsParam::getNodeId, privateNodePKeyIds));
+            List<WbsParam> paramListNow = wbsParamMapper.selectList(Wrappers.<WbsParam>lambdaQuery().select(WbsParam::getK, WbsParam::getV, WbsParam::getName, WbsParam::getId, WbsParam::getRemark, WbsParam::getNodeId).eq(WbsParam::getStatus, 1).eq(WbsParam::getProjectId, Long.parseLong(projectId)).in(WbsParam::getNodeId, privateNodePKeyIds));
             //将参数名称、K和nodeId作为唯一标识存储到一个Map中
             Map<String, WbsParam> paramMap = new HashMap<>();
             for (WbsParam nowObj : paramListNow) {
@@ -911,7 +911,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     private void recursionGetChildNodesAndTabs(List<WbsTreePrivate> list, List<WbsTreePrivate> result, WbsTreePrivate obj) {
         List<Long> ids = list.stream().map(WbsTreePrivate::getId).collect(Collectors.toList());
         if (ids.size() > 0) {
-            List<WbsTreePrivate> query = jdbcTemplate.query("select p_key_id,id,type,parent_id,html_url from m_wbs_tree_private where parent_id in(" + org.apache.commons.lang.StringUtils.join(ids, ",") + ") and status = 1 and is_deleted = 0 and project_id = " + obj.getProjectId(), new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+            List<WbsTreePrivate> query = jdbcTemplate.query("select p_key_id,id,type,parent_id,html_url,project_id,excel_id from m_wbs_tree_private where parent_id in(" + org.apache.commons.lang.StringUtils.join(ids, ",") + ") and status = 1 and is_deleted = 0 and project_id = " + obj.getProjectId(), new BeanPropertyRowMapper<>(WbsTreePrivate.class));
             if (query.size() > 0) {
                 result.addAll(query);
                 recursionGetChildNodesAndTabs(query, result, obj);
@@ -920,12 +920,13 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
 
     @Override
-    public boolean syncProjectEVisa(String projectId, String pKeyId) {
+    public boolean syncProjectEVisa(String projectId, String pKeyId) throws FileNotFoundException {
         if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(pKeyId)) {
             ProjectInfo projectInfo = projectInfoMapper.selectById(projectId);
             if (projectInfo != null && ("private").equals(projectInfo.getReferenceWbsTemplateType()) && ObjectUtils.isNotEmpty(projectInfo.getReferenceWbsTemplateId())) {
                 //构造参数集合
                 List<TextdictInfo> insertData = new ArrayList<>();
+                List<WbsTreePrivate> privateList = new ArrayList<>();
                 Map<Long, List<TextdictInfo>> textDictInfoData = new HashMap<>();
 
                 //获取当前选择的节点下的所有节点、表、独立表
@@ -1006,6 +1007,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 insertData.add(obj);
                             }
                         }
+                        //表信息
+                        privateList.add(tree);
                     }
                 });
 
@@ -1026,6 +1029,12 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                         textDictInfoService.insertBatch(addList, 1000);
                     }
                 }
+
+                //修改合同段html样式
+                if (privateList.size() > 0) {
+                    this.syncEVisaDefaultInfo(privateList, projectId);
+                }
+
             }
             return true;
         } else {
@@ -1033,6 +1042,35 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         }
     }
 
+    @Async
+    public void syncEVisaDefaultInfo(List<WbsTreePrivate> list, String projectId) {
+        List<Long> ids = list.stream().map(WbsTreePrivate::getId).collect(Collectors.toList());
+        List<WbsTreeContract> contractList = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                .select(WbsTreeContract::getPKeyId, WbsTreeContract::getExcelId)
+                .eq(WbsTreeContract::getProjectId, projectId)
+                .eq(WbsTreeContract::getStatus, 1)
+                .isNotNull(WbsTreeContract::getExcelId)
+                .in(WbsTreeContract::getId, ids));
+
+        Map<Long, List<WbsTreeContract>> contractMap = contractList.stream().collect(Collectors.groupingBy(WbsTreeContract::getExcelId));
+
+        List<String> updateSQLList = new ArrayList<>();
+        for (WbsTreePrivate wbsTreePrivate : list) {
+            List<WbsTreeContract> wbsTreeContractList = contractMap.get(wbsTreePrivate.getExcelId());
+            if (wbsTreeContractList != null) {
+                String cPkeyIdsStr = org.apache.commons.lang.StringUtils.join(wbsTreeContractList.stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList()), ",");
+                String updateSql = "update m_wbs_tree_contract set html_url = '" + wbsTreePrivate.getHtmlUrl() + "' where p_key_id in (" + cPkeyIdsStr + ")";
+                updateSQLList.add(updateSql);
+            }
+        }
+        if (updateSQLList.size() > 0) {
+            List<List<String>> partition = Lists.partition(updateSQLList, 100);
+            for (List<String> sqlList : partition) {
+                jdbcTemplate.execute(org.apache.commons.lang.StringUtils.join(sqlList, "; "));
+            }
+        }
+    }
+
     @Override
     public boolean syncNodeTable(String primaryKeyId) {
         if (StringUtils.isNotEmpty(primaryKeyId)) {