Browse Source

多节点同步

LHB 3 months ago
parent
commit
b047f853f4

+ 7 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreePrivate.java

@@ -1,5 +1,8 @@
 package org.springblade.manager.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
@@ -20,9 +23,13 @@ public class WbsTreePrivate extends BaseEntity {
     /**
      * 主键
      */
+    @TableId(value = "p_key_id", type = IdType.INPUT)
     @JsonProperty(value = "pKeyId")
     private Long pKeyId;
 
+    @TableField
+    private Long id;
+
     @ApiModelProperty(value = "pid")
     private Long pId;
 

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

@@ -576,7 +576,7 @@ public class WbsTreePrivateController extends BladeController {
     @ApiOperation(value = "同步项目下节点下的元素表", notes = "传入节点primaryKeyId")
     @RequestMapping(value = "/sync-node-table", method = RequestMethod.POST)
     public R syncNodeTable(@RequestParam String primaryKeyId) {
-        return R.status(wbsTreePrivateService.syncNodeTable(primaryKeyId));
+        return R.status(wbsTreePrivateService.syncNodeTable(primaryKeyId,null));
     }
 
     /**

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

@@ -65,7 +65,7 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
     void eVisInfoRepeatDel(String pid);
 
     boolean syncNodeTable(String primaryKeyId);
-    List<WbsTreePrivate> syncNodeTable(String primaryKeyIdm,String a);
+    boolean syncNodeTable(String primaryKeyIdm,String a);
 
     R addWbsTreeContractInfo(String nodeId, String primaryKeyIds, Long contractId);
 

+ 147 - 58
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -1543,68 +1543,102 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
      * @param projectId
      * @return
      */
-    public List<WbsTreePrivate> syncNodeTable(String primaryKeyId, String projectId) {
+    public boolean syncNodeTable(String primaryKeyId, String projectId) {
 
         if (StringUtils.isNotEmpty(primaryKeyId)) {
             //获取当前节点对应节点信息
             WbsTreePrivate wbsTreePrivate = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, primaryKeyId));
 
-            //当前节点对应的模板节点信息
-            WbsTree wbsTreeTemplate = wbsTreeMapper.selectOne(Wrappers.<WbsTree>lambdaQuery()
-                    .eq(WbsTree::getId, wbsTreePrivate.getTreePId()));
-
             //获取项目信息
             ProjectInfo projectInfo = projectInfoMapper.selectOne(Wrappers.<ProjectInfo>lambdaQuery().eq(ProjectInfo::getId, wbsTreePrivate.getProjectId()));
 
+            //当前项目模板对应的节点信息
+
+            List<WbsTreePrivate> templateNodes = new ArrayList<>();
+
             //结果集
             List<WbsTreePrivate> addData = new ArrayList<>();
+            List<WbsTreePrivate> editData = new ArrayList<>();
             //质检
             //当前节点引用的模板为公有模板
+
             if (("public").equals(projectInfo.getReferenceWbsTemplateType())) {
+                //当前节点对应的模板节点信息
+                WbsTree wbsTreeTemplate = wbsTreeMapper.selectOne(Wrappers.<WbsTree>lambdaQuery()
+                        .eq(WbsTree::getId, wbsTreePrivate.getTreePId()));
 
                 //模板节点的所有子节点信息
                 List<WbsTree> wbsTrees = null;
                 //当前节点信息
-                List<WbsTreePrivate> wbsTreePrivates = null;
+
                 //获取模板中当前节点的子节点的数据------------------------------------------------------------------------------------------------------------------------
                 LambdaQueryWrapper<WbsTree> wrapperTree = Wrappers.lambdaQuery();
-                wrapperTree.eq(WbsTree::getWbsId, wbsTreePrivate.getWbsId()).eq(WbsTree::getIsDeleted, 0);
+                wrapperTree.eq(WbsTree::getWbsId, wbsTreePrivate.getWbsId())
+                        .eq(WbsTree::getIsDeleted, 0);
                 if (wbsTreeTemplate.getParentId() != 0) {
                     wrapperTree.apply("FIND_IN_SET({0},ancestors)", wbsTreeTemplate.getId());
                 }
                 wbsTrees = wbsTreeMapper.selectList(wrapperTree);
+                //3、获取需要新增的节点或者表单节点信息 以及他们对应的父级节点信息--------------------------------------------------------------------------------------------
+                if (CollectionUtil.isEmpty(wbsTrees)) {
+                    throw new ServiceException("模板节点未找到");
+                }
+                templateNodes = BeanUtil.copyProperties(wbsTrees, WbsTreePrivate.class);
 
-                //2、获取当前节点的子节点的数据------------------------------------------------------------------------------------------------------------------------
+            } else if (("private").equals(projectInfo.getReferenceWbsTemplateType())) {
+                //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
+                WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery()
+                        .eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
+
+                //获取当前选中节点与私有模板对应的节点信息 父级模板项目的当前选中节点
+                wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery()
+                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
+                        .eq(WbsTreePrivate::getTreePId, wbsTreePrivate.getTreePId()));
+
+                //获取模板中当前节点的子节点的数据------------------------------------------------------------------------------------------------------------------------
                 LambdaQueryWrapper<WbsTreePrivate> wrapperPrivate = Wrappers.lambdaQuery();
-                wrapperPrivate.eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId()).eq(WbsTreePrivate::getIsDeleted, 0);
-                if (wbsTreePrivate.getTreePId() == 0) {
-                    wrapperPrivate.apply("FIND_IN_SET({0},ancestors_p_id)", wbsTreePrivate.getPId()));
+                wrapperPrivate.eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
+                        .eq(WbsTreePrivate::getIsDeleted, 0);
+                //判断如果为顶级顶级节点
+                if (wbsTreePrivate.getTreePId() != 0) {
+                    wrapperPrivate.apply("FIND_IN_SET({0},ancestors_p_id)", wbsTreePrivateRoot.getPId());
                 }
-                wbsTreePrivates = baseMapper.selectList(wrapperPrivate);
+                templateNodes = baseMapper.selectList(wrapperPrivate);
+            }
 
-                if (wbsTreePrivates.isEmpty()) {
-                    throw new ServiceException("无法找到模板对应节点,请检查模板节点");
-                }
-                //3、获取需要新增的节点或者表单节点信息 以及他们对应的父级节点信息--------------------------------------------------------------------------------------------
+            if (CollectionUtil.isEmpty(templateNodes)) {
+                throw new ServiceException("未找到模板对应节点");
+            }
 
 
-                //获取id 和 tree_p_id 组成的集合
-                Set<Long> ids = wbsTreePrivates.stream().map(WbsTreePrivate::getTreePId).collect(Collectors.toSet());
+            //2、获取当前节点的子节点的数据------------------------------------------------------------------------------------------------------------------------
+            LambdaQueryWrapper<WbsTreePrivate> wrapperPrivate = Wrappers.lambdaQuery();
+            wrapperPrivate.eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId()).eq(WbsTreePrivate::getIsDeleted, 0);
+            //判断如果为顶级顶级节点
+            if (wbsTreePrivate.getTreePId() != 0) {
+                wrapperPrivate.apply("FIND_IN_SET({0},ancestors_p_id)", wbsTreePrivate.getPId());
+            }
+            List<WbsTreePrivate> wbsTreePrivates = baseMapper.selectList(wrapperPrivate);
 
+            if (wbsTreePrivates.isEmpty()) {
+                throw new ServiceException("无法找到模板对应节点,请检查模板节点");
+            }
+            //获取id 和 tree_p_id 组成的集合
+            Set<Long> ids = wbsTreePrivates.stream().map(WbsTreePrivate::getTreePId).collect(Collectors.toSet());
+            //3.1筛选出需要新增的节点
+            List<WbsTreePrivate> addPrivateNodes = templateNodes.stream()
+                    .filter(f -> !ids.contains(f.getId()))
+                    .collect(Collectors.toList());
 
-                //3.1筛选出需要新增的节点
-                List<WbsTree> addNodes = wbsTrees.stream()
-                        .filter(f -> !ids.contains(f.getId()))
-                        .collect(Collectors.toList());
+            //3.2筛选出需要修改的节点
+            List<WbsTreePrivate> editPrivateNodes = templateNodes.stream()
+                    .filter(f -> ids.contains(f.getId()))
+                    .collect(Collectors.toList());
 
-                //3.2筛选出需要修改的节点
-                List<WbsTree> editNodes = wbsTrees.stream()
-                        .filter(f -> ids.contains(f.getId()))
-                        .collect(Collectors.toList());
 
+            //------------------------------------------------新增-------------------------------------------------------------------------
+            if (CollectionUtil.isNotEmpty(addPrivateNodes)) {
                 //将要新增的项目节点----------------------------------------------------------------------------------------------------
-                List<WbsTreePrivate> addPrivateNodes = BeanUtil.copyProperties(addNodes, WbsTreePrivate.class);
-
 
                 //先给每个新增节点赋唯一id,项目id,父级id
                 addPrivateNodes.forEach(f -> f.setPKeyId(SnowFlakeUtil.getId()));
@@ -1640,12 +1674,56 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 addData.addAll(addPrivateNodes);
             }
 
+            //------------------------------------------------编辑-------------------------------------------------------------------------
+            /**
+             * 编辑情况下
+             *  type == 1 修改基础信息
+             *  type == 2
+             */
+            if (CollectionUtil.isNotEmpty(editPrivateNodes)) {
+                Map<Long, WbsTreePrivate> editMap = wbsTreePrivates.stream().collect(Collectors.toMap(WbsTreePrivate::getId, Function.identity()));
+                for (WbsTreePrivate editNode : editPrivateNodes) {
+                    //获取旧节点
+                    WbsTreePrivate oldNode = editMap.get(editNode.getId());
+                    //
+                    if (oldNode == null) {
+                        throw new ServiceException("数据问题");
+                    }
 
-            //设置html_url----------------------------------------------------------------------------------------------------------
+                    oldNode.setNodeType(editNode.getNodeType());
+                    oldNode.setNodeName(editNode.getNodeName());
+                    oldNode.setSort(editNode.getSort());
+                    oldNode.setRemark(editNode.getRemark());
+                    oldNode.setInitTableId(editNode.getInitTableId());
+                    oldNode.setExcelId(editNode.getExcelId());
+                    oldNode.setIsExistForm(editNode.getIsExistForm());
+                    oldNode.setHtmlUrl(editNode.getHtmlUrl());
+                    oldNode.setFillRate(editNode.getFillRate());
 
-            if (addData.isEmpty()) {
-                return null;
-            } else {
+
+                    //普通节点
+                    if (editNode.getType() == 1) {
+                        //判断是否被修改过
+
+
+                    }
+                    //元素表单节点
+                    if (editNode.getType() == 2) {
+                        //判断是否关联过清表
+                        if(oldNode.getIsLinkTable() == 2){
+
+                        }
+
+                    }
+                    //是否需要编辑元素表单数据???
+                    editData.add(oldNode);
+                }
+            }
+
+
+            //设置html_url----------------------------------------------------------------------------------------------------------
+            //如果有新增的数据 旧设置html_url
+            if (CollectionUtil.isNotEmpty(addData)) {
                 try {
                     String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
                     Set<String> urls = new HashSet<>();
@@ -1668,37 +1746,48 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 } catch (Exception e) {
                     throw new ServiceException("重置表单路径错误");
                 }
-            }
-
-
-            //查询出当前项目所有节点---------------------------------------------------------------------------------------------------
-            List<WbsTreePrivate> addList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                    .eq(WbsTreePrivate::getIsDeleted, 0)
-                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()));
-
-            addList.addAll(addData);
-            //组合祖级路径 根据当前选中节点为开始
-            Map<Long, WbsTreePrivate> collect = addList.stream().collect(Collectors.toMap(WbsTreePrivate::getPKeyId, Function.identity()));
+                //查询出当前项目所有节点---------------------------------------------------------------------------------------------------
+                List<WbsTreePrivate> addList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                        .eq(WbsTreePrivate::getIsDeleted, 0)
+                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()));
 
-            addData.forEach(node -> {
-                String correctAncestors = createAncestorsPId(node, collect);
-                node.setAncestorsPId(correctAncestors);
-            });
+                addList.addAll(addData);
+                //组合祖级路径 根据当前选中节点为开始
+                Map<Long, WbsTreePrivate> collect = addList.stream().collect(Collectors.toMap(WbsTreePrivate::getPKeyId, Function.identity()));
 
-            //新增-----------------------------------------------------------------------------------------------------------------
-            List<List<WbsTreePrivate>> partition = Lists.partition(addData, 1000);
-            for (List<WbsTreePrivate> wbsTreePrivates : partition) {
-                boolean b = this.insertBatch(wbsTreePrivates, 1000);
-                //如果失败  -- - - - - 继续执行   或者把当前节点的p_key_id 记录到某个地方 方便后续处理
-                if (!b) {
-                    List<Long> collect1 = addData.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
-                    //这里可以保存到数据库指定错误日志表
+                addData.forEach(node -> {
+                    String correctAncestors = createAncestorsPId(node, collect);
+                    node.setAncestorsPId(correctAncestors);
+                });
 
-                    throw new ServiceException("新增节点失败,请联系后台人员");
+                //新增-----------------------------------------------------------------------------------------------------------------
+                List<List<WbsTreePrivate>> partition = Lists.partition(addData, 1000);
+                for (List<WbsTreePrivate> data : partition) {
+                    //单个批次一个事务,只会回滚当前批次数据
+                    boolean b = this.insertBatch(data, 1000);
+                    //如果失败  -- - - - - 继续执行   或者把当前节点的p_key_id 记录到某个地方 方便后续处理
+                    if (!b) {
+                        List<Long> collect1 = addData.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+                        //这里可以保存到数据库指定错误日志表
+
+                        throw new ServiceException("新增节点失败,请联系后台人员");
+                    }
+                }
+            } else if (CollectionUtil.isNotEmpty(editData)) {
+
+                //修改-----------------------------------------------------------------------------------------------------------------
+                List<List<WbsTreePrivate>> edits = Lists.partition(editData, 1000);
+                for (List<WbsTreePrivate> data : edits) {
+                    //单个批次一个事务,只会回滚当前批次数据
+                    boolean b = this.saveOrUpdateBatch(data, 1000);
+                    //如果失败  -- - - - - 继续执行   或者把当前节点的p_key_id 记录到某个地方 方便后续处理
+                    if (!b) {
+                        //这里可以保存到数据库指定错误日志表
+                        throw new ServiceException("修改节点失败,请联系后台人员");
+                    }
                 }
             }
-
-            return addData;
+            return true;
         } else {
             throw new ServiceException("未传指定参数,请联系后台人员");
         }