Browse Source

同步功能-单表单同步实现

LHB 2 months ago
parent
commit
51fac08e6b

+ 7 - 6
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeSynchronousRecord.java

@@ -10,14 +10,15 @@ import java.util.Date;
 
 /**
  * WBS同步记录表
+ *
  * @author LHB
  * @TableName m_wbs_tree_synchronous_record
  */
-@TableName(value ="m_wbs_tree_synchronous_record")
+@TableName(value = "m_wbs_tree_synchronous_record")
 @Data
 public class WbsTreeSynchronousRecord {
     /**
-     * id
+     * id111
      */
     @TableId
     private Long id;
@@ -33,7 +34,7 @@ public class WbsTreeSynchronousRecord {
     private String projectName;
 
     /**
-     * 同步范围(1-从后管同步,2-同步到合同段)
+     * 同步范围1 (1-从后管同步,2-同步到合同段, 3-单表单同步,4-单表强制同步)
      */
     @TableField("`range`")
     private Integer range;
@@ -61,12 +62,12 @@ public class WbsTreeSynchronousRecord {
     private String templateName;
 
     /**
-     *  同步类型 逗号拼接的编号 1.新增表单 2.清表配置 3.元素配置 4.电签配置 5.公式配置 6.默认值配置 7.表单排序
+     * 同步类型 逗号拼接的编号 1.新增表单 2.清表配置 3.元素配置 4.电签配置 5.公式配置 6.默认值配置 7.表单排序
      */
     private String type;
 
     /**
-     *  同步类型名称
+     * 同步类型名称
      */
     private String typeName;
 
@@ -80,7 +81,7 @@ public class WbsTreeSynchronousRecord {
      */
     private String nodeName;
     /**
-     * 表单Ids
+     * 表单Ids     range = 4 强制同步时  当前数据为同步源
      */
     private String formIds;
 

+ 23 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsSynchronousEViSaServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.springblade.manager.entity.TextdictInfo;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.mapper.TextdictInfoMapper;
+import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -17,17 +18,36 @@ import java.util.stream.Collectors;
 @Service
 public class WbsSynchronousEViSaServiceImpl {
 
-
+    @Autowired
+    private WbsTreePrivateMapper wbsTreePrivateMapper;
     //电签
     @Autowired
     private TextdictInfoMapper textdictInfoMapper;
+
     @Transactional(rollbackFor = Exception.class)
     public void updateTextDictInfo(Long projectId, List<Long> editPrivateIds, List<TextdictInfo> addData) {
         //删除 需要新增的节点的电签和默认值
         textdictInfoMapper.delete(Wrappers.<TextdictInfo>lambdaQuery()
-                .eq(TextdictInfo::getProjectId,projectId)
-                .in(TextdictInfo::getTabId,editPrivateIds));
+                .eq(TextdictInfo::getProjectId, projectId)
+                .in(TextdictInfo::getTabId, editPrivateIds));
 
         textdictInfoMapper.insertBatchSomeColumn(addData);
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void updateSyncPrivateForm(String htmlUrl,List<Long> collect) {
+        wbsTreePrivateMapper.update(null, Wrappers.<WbsTreePrivate>lambdaUpdate()
+                .set(WbsTreePrivate::getHtmlUrl, htmlUrl)
+                .in(WbsTreePrivate::getPKeyId,collect)
+        );
+    }
+    @Transactional(rollbackFor = Exception.class)
+    public void syncPrivateForceForm(WbsTreePrivate wbsTreePrivate, String nodeId) {
+        wbsTreePrivateMapper.update(null, Wrappers.<WbsTreePrivate>lambdaUpdate()
+                .set(WbsTreePrivate::getExcelId, wbsTreePrivate.getExcelId())
+                .set(WbsTreePrivate::getInitTableName, wbsTreePrivate.getInitTableName())
+                .set(WbsTreePrivate::getHtmlUrl, wbsTreePrivate.getHtmlUrl())
+                .in(WbsTreePrivate::getPKeyId,nodeId)
+        );
+    }
 }

+ 82 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsSynchronousServiceImpl.java

@@ -78,11 +78,36 @@ public class WbsSynchronousServiceImpl {
         //
         try {
             Integer range = wbsTreeSynchronousRecord.getRange();
+            switch (range){
+                case 1:
+                    //同步项目
+                    insertPrivateNode(wbsTreeSynchronousRecord);
+                    break;
+                case 2:
+                    //同步合同段
+                    insertContractNode(wbsTreeSynchronousRecord);
+                    break;
+                case 3:
+                    //同步元素相同的所有表单
+                    syncPrivateAllForm(wbsTreeSynchronousRecord);
+                    break;
+                case 4:
+                    //强制同步表单
+                    syncPrivateForceForm(wbsTreeSynchronousRecord);
+                    break;
+                default:
+                    break;
+            }
+
             if (range == 1) {
-                insertPrivateNode(wbsTreeSynchronousRecord);
+
             } else if (range == 2) {
-                insertContractNode(wbsTreeSynchronousRecord);
-            } else {
+
+            } else if (range == 3) {
+
+            } else if (range == 4) {
+
+            } else{
                 throw new ServiceException("同步类型错误");
             }
         } catch (Exception e) {
@@ -96,6 +121,60 @@ public class WbsSynchronousServiceImpl {
         }
     }
 
+    /**
+     * 同步所有相同元素的表单
+     * @param wbsTreeSynchronousRecord
+     */
+    private void syncPrivateAllForm(WbsTreeSynchronousRecord wbsTreeSynchronousRecord) {
+        String nodeId = wbsTreeSynchronousRecord.getNodeId();
+        WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectById(nodeId);
+        String initTableName = wbsTreePrivate.getInitTableName();
+        if(StringUtil.isBlank(initTableName)){
+            throw new ServiceException("表单未绑定实体表");
+        }
+        //在指定项目下指定实体表相同的数据
+        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                .eq(WbsTreePrivate::getInitTableName, initTableName)
+        );
+        //清表也相同的数据
+        List<WbsTreePrivate> collect = wbsTreePrivates.stream().filter(f ->
+                Objects.equals(f.getExcelId(), wbsTreePrivate.getExcelId())
+        ).collect(Collectors.toList());
+        //清表不同的数据
+        List<WbsTreePrivate> noExcelIdEq = wbsTreePrivates.stream().filter(f -> !Objects.equals(f.getExcelId(), wbsTreePrivate.getExcelId())).collect(Collectors.toList());
+        if(CollectionUtil.isEmpty(noExcelIdEq)){
+
+            StringBuffer sb = new StringBuffer();
+            for (WbsTreePrivate treePrivate : noExcelIdEq) {
+                List<WbsTreePrivate> list = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getPKeyId, Func.toLongList(treePrivate.getAncestorsPId())));
+                List<String> nodeNames = list.stream().map(WbsTreePrivate::getNodeName).collect(Collectors.toList());
+
+                sb.append(StringUtil.join(nodeNames, "/")).append(";");
+            }
+            throw new ServiceException("清表绑定错误:" + sb);
+        }
+        List<Long> ids = collect.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+        //修改数据
+        wbsSynchronousEViSaService.updateSyncPrivateForm(wbsTreePrivate.getHtmlUrl(),ids);
+    }
+
+    /**
+     *
+     * 强制同步表单
+     * @param wbsTreeSynchronousRecord
+     */
+    private void syncPrivateForceForm(WbsTreeSynchronousRecord wbsTreeSynchronousRecord) {
+        String nodeId = wbsTreeSynchronousRecord.getNodeId();
+        if(nodeId.contains(",")){
+            throw new ServiceException("不能选中多个节点");
+        }
+        String formIds = wbsTreeSynchronousRecord.getFormIds();
+        //选中的表单
+        WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectById(formIds);
+        wbsSynchronousEViSaService.syncPrivateForceForm(wbsTreePrivate,nodeId);
+    }
+
     /**
      * 项目同步 获取源节点数据和当前节点数据
      *

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

@@ -66,7 +66,6 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
                 List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(new QueryWrapper<WbsTreePrivate>().lambda()
                         .select(WbsTreePrivate::getPKeyId)
                         .eq(WbsTreePrivate::getIsDeleted, 0)
-                        .eq(WbsTreePrivate::getType, 1)
                         .apply("find_in_set({0},ancestors_p_id)", s)
                 );
                 privateIds.add(Long.valueOf(s));
@@ -100,7 +99,11 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
             count += wbsTreePrivates.size();
         }
 
+        //获取项目名称
+        ProjectInfo projectInfo = projectInfoMapper.selectById(mWbsTreeSynchronousRecord.getProjectId());
+
         mWbsTreeSynchronousRecord.setId(SnowFlakeUtil.getId());
+        mWbsTreeSynchronousRecord.setProjectName(projectInfo.getProjectName());
         //获取当前用户
         BladeUser user = SecureUtil.getUser();
         mWbsTreeSynchronousRecord.setCreateUserId(user.getUserId());
@@ -119,15 +122,18 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
         //选中节点
         WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectById(nodeId);
         List<WbsTreeSynchronousRecordVo> wbsTreePrivates = new ArrayList<>();
+        if(wbsTreePrivate == null){
+            return wbsTreePrivates;
+        }
         List<WbsTreeSynchronousRecordVo> tempProject = getTempProject(wbsTreePrivate, wbsTreePrivates);
 
         return tempProject;
     }
 
 
-    public List<WbsTreeSynchronousRecordVo> getTempProject(WbsTreePrivate wbsTreePrivate,List<WbsTreeSynchronousRecordVo> list){
+    public List<WbsTreeSynchronousRecordVo> getTempProject(WbsTreePrivate wbsTreePrivate, List<WbsTreeSynchronousRecordVo> list) {
         ProjectInfo projectInfo = projectInfoMapper.selectById(wbsTreePrivate.getProjectId());
-        if(projectInfo == null){
+        if (projectInfo == null) {
             return list;
         }
 
@@ -155,7 +161,7 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
             wbsTreeSynchronousRecordVo.setName(projectInfo1.getProjectName());
             wbsTreeSynchronousRecordVo.setType(2);
             list.add(wbsTreeSynchronousRecordVo);
-            return getTempProject(wbsTreePrivate1,list);
+            return getTempProject(wbsTreePrivate1, list);
         }
     }
 
@@ -175,22 +181,21 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
         for (WbsTreeSynchronousRecord wbsTreeSynchronousRecord : wbsTreeSynchronousRecords) {
             if (wbsTreeSynchronousRecord.getStatus() == 1) {
                 if (wbsTreeSynchronousRecord.getUpdateTime().getTime() + 600000 < System.currentTimeMillis()) {
-
                     baseMapper.update(null, Wrappers.<WbsTreeSynchronousRecord>lambdaUpdate()
                             .set(WbsTreeSynchronousRecord::getStatus, 0)
                             .eq(WbsTreeSynchronousRecord::getId, wbsTreeSynchronousRecord.getId()));
                 }
-            } else {
-                //通过线程池执行同步任务
-                wbsSynchronousService.syncExecute(wbsTreeSynchronousRecord);
-                //修改数据状态为正在同步
-                baseMapper.update(null, Wrappers.<WbsTreeSynchronousRecord>lambdaUpdate()
-                        .set(WbsTreeSynchronousRecord::getStatus, 1)
-                        .set(WbsTreeSynchronousRecord::getUpdateTime, DateTime.now())
-                        .eq(WbsTreeSynchronousRecord::getId, wbsTreeSynchronousRecord.getId()));
+                continue;
             }
 
+            //通过线程池执行同步任务
+            wbsSynchronousService.syncExecute(wbsTreeSynchronousRecord);
 
+            //修改数据状态为正在同步
+            baseMapper.update(null, Wrappers.<WbsTreeSynchronousRecord>lambdaUpdate()
+                    .set(WbsTreeSynchronousRecord::getStatus, 1)
+                    .set(WbsTreeSynchronousRecord::getUpdateTime, DateTime.now())
+                    .eq(WbsTreeSynchronousRecord::getId, wbsTreeSynchronousRecord.getId()));
         }
     }
 }