Jelajahi Sumber

同步功能-统计同步数量、新增同步任务数据验证、列表添加状态名称字段

LHB 2 bulan lalu
induk
melakukan
26ea37a0e7

+ 5 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeSynchronousRecord.java

@@ -100,6 +100,11 @@ public class WbsTreeSynchronousRecord {
      * 状态(0-未同步,1-正在同步,2-已同步,3-同步失败)
      */
     private Integer status;
+    /**
+     * 状态(0-未同步,1-正在同步,2-已同步,3-同步失败)
+     */
+    @TableField(exist = false)
+    private String statusName;
     /**
      * 错误信息
      */

+ 40 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeSynchronousRecordController.java

@@ -44,12 +44,32 @@ public class WbsTreeSynchronousRecordController {
     @GetMapping("/page")
     public R<IPage<WbsTreeSynchronousRecord>> selectAll(WbsTreeSynchronousRecord record, Query query) {
         LambdaQueryWrapper<WbsTreeSynchronousRecord> lambda = new QueryWrapper().lambda();
-        lambda.eq(record.getProjectId() != null, WbsTreeSynchronousRecord::getProjectId, record.getProjectId())
+        lambda
+                .eq(record.getProjectId() != null, WbsTreeSynchronousRecord::getProjectId, record.getProjectId())
+                .eq(record.getStatus() != null, WbsTreeSynchronousRecord::getStatus, record.getStatus())
                 .eq(record.getRange() != null, WbsTreeSynchronousRecord::getRange, record.getRange());
         if (!StringUtil.isBlank(record.getType())) {
             lambda.apply("FIND_IN_SET({0},type)", record.getType());
         }
         IPage<WbsTreeSynchronousRecord> page = mWbsTreeSynchronousRecordService.page(Condition.getPage(query), lambda);
+        for (WbsTreeSynchronousRecord pageRecord : page.getRecords()) {
+            switch (pageRecord.getStatus()) {
+                case 0:
+                    pageRecord.setStatusName("待同步");
+                    break;
+                case 1:
+                    pageRecord.setStatusName("正在同步");
+                    break;
+                case 2:
+                    pageRecord.setStatusName("已同步");
+                    break;
+                case 3:
+                    pageRecord.setStatusName("同步失败");
+                    break;
+                default:
+                    break;
+            }
+        }
         return R.data(page);
     }
 
@@ -73,6 +93,23 @@ public class WbsTreeSynchronousRecordController {
      */
     @PostMapping("add")
     public R<Integer> insert(@RequestBody WbsTreeSynchronousRecord mWbsTreeSynchronousRecord) {
+        if (StringUtil.isBlank(mWbsTreeSynchronousRecord.getType())) {
+            return R.fail("请选择同步类型");
+        }
+        if (mWbsTreeSynchronousRecord.getRange() == null) {
+            return R.fail("请选择同步范围");
+        }
+
+        if (mWbsTreeSynchronousRecord.getRange() == 2 && StringUtil.isBlank(mWbsTreeSynchronousRecord.getContractRange())) {
+            return R.fail("请选择合同同步范围");
+        }
+        if (mWbsTreeSynchronousRecord.getProjectId() == null) {
+            return R.fail("项目Id为空");
+        }
+        if (mWbsTreeSynchronousRecord.getTemplateId() == null) {
+            return R.fail("同步源为空");
+        }
+
         return R.data(this.mWbsTreeSynchronousRecordService.insert(mWbsTreeSynchronousRecord));
     }
 
@@ -85,14 +122,14 @@ public class WbsTreeSynchronousRecordController {
     }
 
 
-
     /**
      * 获取当前项目的模板项目
+     *
      * @param nodeIds 节点ids 逗号拼接
      */
     @GetMapping("getTempProject")
     public R<List<WbsTreeSynchronousRecordVo>> getProjectTemplate(@RequestParam String nodeIds) {
-        if(StringUtil.isBlank(nodeIds)){
+        if (StringUtil.isBlank(nodeIds)) {
             return R.fail("参数不能为空");
         }
         return R.data(this.mWbsTreeSynchronousRecordService.getProjectTemplate(nodeIds));

+ 48 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsSynchronousEViSaServiceImpl.java

@@ -3,9 +3,11 @@ package org.springblade.manager.service.impl;
 import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.springblade.manager.entity.TextdictInfo;
+import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.entity.WbsTreeSynchronousRecord;
 import org.springblade.manager.mapper.TextdictInfoMapper;
+import org.springblade.manager.mapper.WbsTreeContractMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.mapper.WbsTreeSynchronousRecordMapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -13,6 +15,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @author LHB
@@ -22,6 +27,8 @@ public class WbsSynchronousEViSaServiceImpl {
 
     @Autowired
     private WbsTreePrivateMapper wbsTreePrivateMapper;
+    @Autowired
+    private WbsTreeContractMapper wbsTreeContractMapper;
     //电签
     @Autowired
     private TextdictInfoMapper textdictInfoMapper;
@@ -67,4 +74,45 @@ public class WbsSynchronousEViSaServiceImpl {
                 .set(WbsTreeSynchronousRecord::getUpdateTime, DateTime.now())
                 .eq(WbsTreeSynchronousRecord::getId, id));
     }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    public void updatePrivate(WbsTreeSynchronousRecord wbsTreeSynchronousRecord, List<WbsTreePrivate> editPrivateNodes) {
+        Map<Long, List<WbsTreePrivate>> collect1 = editPrivateNodes.stream().collect(Collectors.groupingBy(WbsTreePrivate::getPId));
+        Set<Long> pIds = collect1.keySet();
+        Integer nodeNumEnd = 0;
+        for (Long pId : pIds) {
+            List<WbsTreePrivate> list = collect1.get(pId);
+            for (WbsTreePrivate treePrivate : list) {
+                treePrivate.setUpdateTime(DateTime.now());
+                treePrivate.setUpdateUser(wbsTreeSynchronousRecord.getCreateUserId());
+                wbsTreePrivateMapper.updateById(treePrivate);
+            }
+            nodeNumEnd++;
+            synchronousRecordMapper.update(null, Wrappers.<WbsTreeSynchronousRecord>lambdaUpdate()
+                    .set(WbsTreeSynchronousRecord::getNodeNumEnd, nodeNumEnd)
+                    .set(WbsTreeSynchronousRecord::getUpdateTime, DateTime.now())
+                    .eq(WbsTreeSynchronousRecord::getId, wbsTreeSynchronousRecord.getId()));
+        }
+    }
+    @Transactional(rollbackFor = Exception.class)
+    public void updateContract(WbsTreeSynchronousRecord wbsTreeSynchronousRecord, List<WbsTreeContract> editContractNodes) {
+        Map<Long, List<WbsTreeContract>> collect1 = editContractNodes.stream().collect(Collectors.groupingBy(WbsTreeContract::getPId));
+        Set<Long> pIds = collect1.keySet();
+        Integer nodeNumEnd = 0;
+        for (Long pId : pIds) {
+            List<WbsTreeContract> list = collect1.get(pId);
+            for (WbsTreeContract treeContract : list) {
+                treeContract.setUpdateTime(DateTime.now());
+                treeContract.setUpdateUser(wbsTreeSynchronousRecord.getCreateUserId());
+                wbsTreeContractMapper.updateById(treeContract);
+            }
+            nodeNumEnd++;
+            synchronousRecordMapper.update(null, Wrappers.<WbsTreeSynchronousRecord>lambdaUpdate()
+                    .set(WbsTreeSynchronousRecord::getNodeNumEnd, nodeNumEnd)
+                    .set(WbsTreeSynchronousRecord::getUpdateTime, DateTime.now())
+                    .eq(WbsTreeSynchronousRecord::getId, wbsTreeSynchronousRecord.getId()));
+        }
+
+    }
 }

+ 89 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsSynchronousServiceImpl.java

@@ -201,6 +201,7 @@ public class WbsSynchronousServiceImpl {
         //获取项目信息
         ProjectInfo projectInfo = projectInfoMapper.selectOne(Wrappers.<ProjectInfo>lambdaQuery().eq(ProjectInfo::getId, wbsTreeSynchronousRecord.getProjectId()));
 
+        List<WbsTreePrivate> editData = new ArrayList<>();
 
         for (String primaryKeyId : nodeIds) {
             if (StringUtils.isNotEmpty(primaryKeyId)) {
@@ -448,9 +449,9 @@ public class WbsSynchronousServiceImpl {
                         case 1:
                             insertPrivateForm(wbsTreeSynchronousRecord, wbsTreePrivates, addPrivateNodes);
                             //如果同时选择新增表单和其他的同步类型  在操作其他类型的时候需要添加新的表单
-                            if (CollectionUtil.isNotEmpty(addPrivateNodes)) {
-                                editPrivateNodes.addAll(addPrivateNodes.stream().filter(f -> f.getType() == 2).collect(Collectors.toList()));
-                            }
+//                            if (CollectionUtil.isNotEmpty(addPrivateNodes)) {
+//                                editPrivateNodes.addAll(addPrivateNodes.stream().filter(f -> f.getType() == 2).collect(Collectors.toList()));
+//                            }
                             break;
                         //清表
                         case 2:
@@ -461,11 +462,7 @@ public class WbsSynchronousServiceImpl {
                             //排序
                         case 7:
                             //元素配置
-                            for (WbsTreePrivate editPrivateNode : editPrivateNodes) {
-                                editPrivateNode.setUpdateTime(DateTime.now());
-                                editPrivateNode.setUpdateUser(wbsTreeSynchronousRecord.getCreateUserId());
-                                wbsTreePrivateMapper.updateById(editPrivateNode);
-                            }
+                            editData.addAll(editPrivateNodes);
                             break;
                         //电签 如果有数据 与节点绑定
                         case 4:
@@ -480,6 +477,8 @@ public class WbsSynchronousServiceImpl {
                 }
             }
         }
+        //更新数据的同时统计最小节点数量
+        wbsSynchronousEViSaService.updatePrivate(wbsTreeSynchronousRecord,editData);
         synchronousRecordMapper.update(null, Wrappers.<WbsTreeSynchronousRecord>lambdaUpdate()
                 .set(WbsTreeSynchronousRecord::getStatus, 2)
                 .set(WbsTreeSynchronousRecord::getErrorMsg, null)
@@ -525,7 +524,7 @@ public class WbsSynchronousServiceImpl {
         //获取当前项目所有合同---------------------------------------------------------------------------------------------------
         List<ContractInfo> contractInfos = contractInfoMapper.selectContractIdByProjectId(String.valueOf(wbsTreeSynchronousRecord.getProjectId()));
 
-
+        List<WbsTreeContract> editData = new ArrayList<>();
         for (String primaryKeyId : nodeIds) {
 
             //获取当前节点对应节点信息
@@ -731,13 +730,7 @@ public class WbsSynchronousServiceImpl {
                             case 5:
                                 //排序
                             case 7:
-                                if (CollectionUtil.isNotEmpty(editContractNodes)) {
-                                    for (WbsTreeContract editContractNode : editContractNodes) {
-                                        editContractNode.setUpdateTime(DateTime.now());
-                                        editContractNode.setUpdateUser(wbsTreeSynchronousRecord.getCreateUserId());
-                                        wbsTreeContractMapper.updateById(editContractNode);
-                                    }
-                                }
+                                editData.addAll(editContractNodes);
                                 break;
                             default:
                                 break;
@@ -745,7 +738,13 @@ public class WbsSynchronousServiceImpl {
                     }
                 }
             }
+
         }
+
+
+        //合同段同步同时记录数量
+        wbsSynchronousEViSaService.updateContract(wbsTreeSynchronousRecord,editData);
+
         synchronousRecordMapper.update(null, Wrappers.<WbsTreeSynchronousRecord>lambdaUpdate()
                 .set(WbsTreeSynchronousRecord::getStatus, 2)
                 .set(WbsTreeSynchronousRecord::getErrorMsg, null)
@@ -1173,4 +1172,78 @@ public class WbsSynchronousServiceImpl {
         // 将路径列表转换为字符串并返回
         return String.join(",", path.stream().map(String::valueOf).toArray(String[]::new));
     }
+
+
+    /**
+     * 获取指定节点的所有最新节点
+     */
+    public Set<Long> getMinNodes(WbsTreeSynchronousRecord record) {
+
+        Set<Long> collect = null;
+        try {
+
+
+            collect = new HashSet<>();
+            Integer range = record.getRange();
+            String nodeId = record.getNodeId();
+            if (range == 1) {
+                if (StringUtil.isNotBlank(record.getFormIds())) {
+                    List<WbsTreePrivate> list = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                            .select(WbsTreePrivate::getPKeyId, WbsTreePrivate::getPId)
+                            .eq(WbsTreePrivate::getIsDeleted, 0)
+                            .eq(WbsTreePrivate::getType, 2)
+                            .eq(WbsTreePrivate::getProjectId, record.getProjectId())
+                            .in(WbsTreePrivate::getPKeyId, Func.toLongList(record.getFormIds())));
+                    collect = list.stream().map(WbsTreePrivate::getPId).collect(Collectors.toSet());
+                } else {
+
+                    Set<Long> split = Arrays.stream(nodeId.split(","))
+                            .map(Long::parseLong)
+                            .collect(Collectors.toSet());
+                    for (Long id : split) {
+                        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                                .select(WbsTreePrivate::getPKeyId, WbsTreePrivate::getPId)
+                                .eq(WbsTreePrivate::getIsDeleted, 0)
+                                .eq(WbsTreePrivate::getType, 2)
+                                .apply("find_in_set({0},ancestors_p_id)", id));
+                        collect.addAll(wbsTreePrivates.stream().map(WbsTreePrivate::getPId).collect(Collectors.toSet()));
+                    }
+                }
+                return collect;
+            }
+            if (range == 2) {
+                if (StringUtil.isNotBlank(record.getFormIds())) {
+                    List<WbsTreeContract> list = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                            .select(WbsTreeContract::getPKeyId, WbsTreeContract::getPId)
+                            .eq(WbsTreeContract::getIsDeleted, 0)
+                            .eq(WbsTreeContract::getProjectId, record.getProjectId())
+                            .in(WbsTreeContract::getIsTypePrivatePid, Func.toLongList(record.getFormIds())));
+                    collect = list.stream().map(WbsTreeContract::getPId).collect(Collectors.toSet());
+                } else {
+
+                    List<WbsTreeContract> initNode = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                            .select(WbsTreeContract::getPKeyId, WbsTreeContract::getPId)
+                            .eq(WbsTreeContract::getIsDeleted, 0)
+                            .eq(WbsTreeContract::getProjectId, record.getProjectId())
+                            .in(WbsTreeContract::getIsTypePrivatePid, Func.toLongList(record.getNodeId())));
+
+                    for (WbsTreeContract wbsTreeContract : initNode) {
+                        List<WbsTreeContract> wbsTreeContracts = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                                .select(WbsTreeContract::getPKeyId, WbsTreeContract::getPId)
+                                .eq(WbsTreeContract::getIsDeleted, 0)
+                                .eq(WbsTreeContract::getType, 2)
+                                .eq(WbsTreeContract::getProjectId, record.getProjectId())
+                                .apply("find_in_set({0},ancestors_p_id)", wbsTreeContract.getPKeyId()));
+                        collect.addAll(wbsTreeContracts.stream().map(WbsTreeContract::getPId).collect(Collectors.toSet()));
+                    }
+                }
+            }
+        } catch (ServiceException e) {
+            throw new ServiceException(e.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ServiceException("系统错误");
+        }
+        return collect;
+    }
 }

+ 18 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeSynchronousRecordServiceImpl.java

@@ -20,9 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -107,17 +105,29 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
         mWbsTreeSynchronousRecord.setId(SnowFlakeUtil.getId());
         mWbsTreeSynchronousRecord.setProjectName(projectInfo.getProjectName());
 
-
+        if (mWbsTreeSynchronousRecord.getRange() == 1 || mWbsTreeSynchronousRecord.getRange() == 2) {
+            Set<Long> minNodes = wbsSynchronousService.getMinNodes(mWbsTreeSynchronousRecord);
+            mWbsTreeSynchronousRecord.setNodeNum(minNodes.size());
+        }
         //类型为3 、 4
         if (mWbsTreeSynchronousRecord.getRange() == 3) {
             mWbsTreeSynchronousRecord.setRangeName("单表单同步");
+            mWbsTreeSynchronousRecord.setNodeNum(1);
         }
         if (mWbsTreeSynchronousRecord.getRange() == 4) {
             mWbsTreeSynchronousRecord.setRangeName("单表强制同步");
+            mWbsTreeSynchronousRecord.setNodeNum(1);
             if (StringUtil.isBlank(mWbsTreeSynchronousRecord.getFormIds())) {
                 throw new ServiceException("请选择表单");
             }
         }
+        List<Long> collect = Arrays.stream(mWbsTreeSynchronousRecord.getNodeId().split(",")).map(Long::parseLong).collect(Collectors.toList());
+        //节点名称
+        List<WbsTreePrivate> list = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                .select(WbsTreePrivate::getPKeyId, WbsTreePrivate::getNodeName)
+                .in(WbsTreePrivate::getPKeyId, collect));
+        List<String> nodeNames = list.stream().map(WbsTreePrivate::getNodeName).collect(Collectors.toList());
+        mWbsTreeSynchronousRecord.setNodeName(String.join(",", nodeNames));
 
         //获取当前用户
         BladeUser user = SecureUtil.getUser();
@@ -175,13 +185,13 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
         if (wbsTreePrivate == null) {
             return wbsTreePrivates;
         }
-        List<WbsTreeSynchronousRecordVo> tempProject = getTempProject(wbsTreePrivate, wbsTreePrivates);
+        List<WbsTreeSynchronousRecordVo> tempProject = getTempProject(nodeId, wbsTreePrivate, wbsTreePrivates);
 
         return tempProject;
     }
 
 
-    public List<WbsTreeSynchronousRecordVo> getTempProject(WbsTreePrivate wbsTreePrivate, List<WbsTreeSynchronousRecordVo> list) {
+    public List<WbsTreeSynchronousRecordVo> getTempProject(String nodeId, WbsTreePrivate wbsTreePrivate, List<WbsTreeSynchronousRecordVo> list) {
         ProjectInfo projectInfo = projectInfoMapper.selectById(wbsTreePrivate.getProjectId());
         if (projectInfo == null) {
             return list;
@@ -198,7 +208,7 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
             //公共项目
             WbsInfo wbsInfo = wbsInfoMapper.selectById(wbsTreePrivate.getWbsId());
             WbsTreeSynchronousRecordVo wbsTreeSynchronousRecordVo = new WbsTreeSynchronousRecordVo();
-            wbsTreeSynchronousRecordVo.setId(wbsInfo.getId());
+            wbsTreeSynchronousRecordVo.setId(Long.valueOf(nodeId));
             wbsTreeSynchronousRecordVo.setName(wbsInfo.getWbsName());
             wbsTreeSynchronousRecordVo.setType(1);
             list.add(wbsTreeSynchronousRecordVo);
@@ -212,7 +222,7 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
             wbsTreeSynchronousRecordVo.setType(2);
             wbsTreeSynchronousRecordVo.setWbsId(wbsTreePrivate1.getWbsId());
             list.add(wbsTreeSynchronousRecordVo);
-            return getTempProject(wbsTreePrivate1, list);
+            return getTempProject(nodeId, wbsTreePrivate1, list);
         }
     }