Jelajahi Sumber

feature: 全量与kafka同步优化
1.研究生班级对应部门的额外处理

luoyb 1 tahun lalu
induk
melakukan
8377f06c24
17 mengubah file dengan 177 tambahan dan 23 penghapusan
  1. 2 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java
  2. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java
  3. 47 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java
  4. 4 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java
  5. 23 7
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java
  6. 7 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java
  7. 17 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java
  8. 17 3
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
  9. 4 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
  10. 11 0
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/SyncRemoteDeptService.java
  11. 15 3
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/strategy/impl/GraduateClassStrategyImpl.java
  12. 3 1
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/strategy/impl/HrDeptStrategyImpl.java
  13. 0 1
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/strategy/impl/TrainClassStrategyImpl.java
  14. 2 2
      ruoyi-server/ruoyi-server-common/src/main/java/org/dromara/server/common/constant/DefaultConstants.java
  15. 1 1
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/InitRunnerTest.java
  16. 17 3
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/SyncGraduateService.java
  17. 2 1
      ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/SyncTrainService.java

+ 2 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java

@@ -36,6 +36,8 @@ public interface RemoteDeptService {
      */
     RemoteDeptVo selectDeptByOtherId(String otherId, String tenantId);
 
+    RemoteDeptVo selectVoAllByOtherId(String otherId, String tenantId);
+
     /**
      * 增加新部门
      *

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java

@@ -132,4 +132,9 @@ public class SysDeptController extends BaseController {
         return R.ok(deptService.selectDeptByIds(deptIds == null ? null : List.of(deptIds)));
     }
 
+    @GetMapping(value = "/test/{deptId}")
+    public R<SysDeptVo> getTestInfo(@PathVariable String deptId) {
+        //deptService.checkDeptDataScope(deptId);
+        return R.ok(deptService.selectVoAllByOtherId(deptId));
+    }
 }

+ 47 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java

@@ -10,6 +10,8 @@ import lombok.EqualsAndHashCode;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.system.domain.SysDept;
 
+import java.util.Date;
+
 /**
  * 部门业务对象 t_sys_dept
  *
@@ -78,4 +80,49 @@ public class SysDeptBo extends BaseEntity {
      */
     private String tenantId;
 
+    /**
+     * 开班日期
+     */
+    private Date beginDate;
+
+    /**
+     * 结业日期
+     */
+    private Date endDate;
+
+    /**
+     * 报到日期
+     */
+    private Date checkDate;
+
+    /**
+     * 是否自主选房
+     */
+    private String chooseRoom;
+
+    /**
+     * 是否就餐
+     */
+    private String canEat;
+
+    /**
+     * 是否先缴费再报到
+     */
+    private String payCheck;
+
+    /**
+     * 缴费开始日期
+     */
+    private Date payBegin;
+
+    /**
+     * 缴费开始日期
+     */
+    private Date payEnd;
+
+    /**
+     * 部门状态
+     */
+    private String delFlag;
+
 }

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java

@@ -104,4 +104,8 @@ public class SysDeptVo implements Serializable {
      */
     private String otherId;
 
+    /**
+     * 结业日期
+     */
+    private Date endDate;
 }

+ 23 - 7
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java

@@ -73,16 +73,32 @@ public class RemoteDeptServiceImpl implements RemoteDeptService {
      */
     @Override
     public RemoteDeptVo selectDeptByOtherId(String otherId, String tenantId) {
-        String cacheKey = tenantId + "_dept_:" + otherId;
+        String cacheKey = tenantId + "_dept:" + otherId;
         RemoteDeptVo remoteDeptVo = RedisUtils.getCacheObject(cacheKey);
-        if (ObjectUtil.isNotEmpty(remoteDeptVo)) {
-            return remoteDeptVo;
-        } else {
+        if (!ObjectUtil.isNotEmpty(remoteDeptVo)) {
             SysDeptVo deptVo = sysDeptService.selectVoByOtherId(otherId);
             remoteDeptVo = MapstructUtils.convert(deptVo, RemoteDeptVo.class);
             RedisUtils.setCacheObject(cacheKey, remoteDeptVo, Duration.ofHours(2));
-            return remoteDeptVo;
         }
+        return remoteDeptVo;
+    }
+    /**
+     * 根据第三方对接的唯一标识符查询对应的部门信息
+     * 这里查询的条件排除了 delFlag=0
+     * @param otherId  第三方对接的唯一标识符
+     * @param tenantId 租户Id
+     * @return 部门信息
+     */
+    @Override
+    public RemoteDeptVo selectVoAllByOtherId(String otherId, String tenantId) {
+        String cacheKey = tenantId + "_dept:" + otherId;
+        RemoteDeptVo remoteDeptVo = RedisUtils.getCacheObject(cacheKey);
+        if (!ObjectUtil.isNotEmpty(remoteDeptVo)) {
+            SysDeptVo deptVo = sysDeptService.selectVoAllByOtherId(otherId);
+            remoteDeptVo = MapstructUtils.convert(deptVo, RemoteDeptVo.class);
+            RedisUtils.setCacheObject(cacheKey, remoteDeptVo, Duration.ofHours(2));
+        }
+        return remoteDeptVo;
     }
 
     /**
@@ -127,8 +143,8 @@ public class RemoteDeptServiceImpl implements RemoteDeptService {
     @Override
     public R<Object> deleteDeptByOtherId(String otherId) {
         String message = MessageFormat.format("[删除部门失败]-[部门标识Id:{0}]", otherId);
-
-        return null;
+        int count = sysDeptService.deleteDeptByOtherId(otherId);
+        return count>0? R.ok():R.fail(message);
     }
 
     /**

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java

@@ -2,6 +2,7 @@ package org.dromara.system.mapper;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Update;
 import org.dromara.common.mybatis.annotation.DataColumn;
 import org.dromara.common.mybatis.annotation.DataPermission;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
@@ -9,6 +10,7 @@ import org.dromara.system.domain.SysDept;
 import org.dromara.system.domain.vo.SysDeptVo;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -43,4 +45,9 @@ public interface SysDeptMapper extends BaseMapperPlus<SysDept, SysDeptVo> {
      */
     List<Long> selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly);
 
+
+    SysDeptVo selectVoAllByOtherId(@Param("otherId") String otherId);
+
+    @Update("update t_sys_dept set del_flag='2',update_time=#{updateTime} where other_Id=#{otherId}")
+    int deleteDeptByOtherId(@Param("otherId") String otherId, @Param("updateTime")Date updateTime);
 }

+ 17 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java

@@ -1,7 +1,6 @@
 package org.dromara.system.service;
 
 import cn.hutool.core.lang.tree.Tree;
-import org.dromara.system.api.domain.vo.RemoteDeptVo;
 import org.dromara.system.domain.bo.SysDeptBo;
 import org.dromara.system.domain.vo.SysDeptVo;
 
@@ -150,6 +149,15 @@ public interface ISysDeptService {
      */
     SysDeptVo selectVoByOtherId(String otherId);
 
+    /**
+     * 根据统一标识Id查询部门信息
+     * @param otherId 统一身份标识
+     * @return 部门信息
+     */
+    SysDeptVo selectVoAllByOtherId(String otherId);
+
+
+
     /**
      * 获取同层级的最大部门排序号
      * @param deptId 部门Id
@@ -164,4 +172,12 @@ public interface ISysDeptService {
      * @return 部门信息
      */
     SysDeptVo selectDeptByParentIdAndName(Long parentId, String deptName);
+
+    /**
+     * 删除部门管理信息
+     *
+     * @param otherId 部门ID
+     * @return 结果
+     */
+    int deleteDeptByOtherId(String otherId);
 }

+ 17 - 3
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java

@@ -34,6 +34,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -252,8 +253,10 @@ public class SysDeptServiceImpl implements ISysDeptService {
     public int insertDept(SysDeptBo bo) {
         SysDept info = baseMapper.selectById(bo.getParentId());
         // 如果父节点不为正常状态,则不允许新增子节点
-        if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) {
-            throw new ServiceException("部门停用,不允许新增");
+        if (ObjectUtil.isNotEmpty(info)) {
+            if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) {
+                throw new ServiceException("部门停用,不允许新增");
+            }
         }
         if (bo.getOrderNum() == null || bo.getOrderNum() == 0) {
             int orderNum = this.getMaxLevelOrderNumb(info.getDeptId());
@@ -270,6 +273,7 @@ public class SysDeptServiceImpl implements ISysDeptService {
 
     /**
      * 新增部门信息
+     *
      * @param bo 部门业务对象
      * @return 部门视图
      */
@@ -370,7 +374,7 @@ public class SysDeptServiceImpl implements ISysDeptService {
         }
         return baseMapper.selectList(Wrappers.lambdaQuery(SysDept.class)
             .select(SysDept::getDeptId)
-            .eq(SysDept::getParentId, deptId).or().eq(SysDept::getDeptId, deptId).or().likeRight(SysDept::getAncestors, sysDeptVo.getAncestors()+","+deptId)
+            .eq(SysDept::getParentId, deptId).or().eq(SysDept::getDeptId, deptId).or().likeRight(SysDept::getAncestors, sysDeptVo.getAncestors() + "," + deptId)
         ).stream().map(SysDept::getDeptId).toList();
     }
 
@@ -379,6 +383,11 @@ public class SysDeptServiceImpl implements ISysDeptService {
         return baseMapper.selectVoOne(new LambdaQueryWrapper<SysDept>().eq(SysDept::getOtherId, otherId));
     }
 
+    @Override
+    public SysDeptVo selectVoAllByOtherId(String otherId) {
+        return baseMapper.selectVoAllByOtherId(otherId);
+    }
+
     @Override
     public SysDeptVo selectDeptByParentIdAndName(Long parentId, String deptName) {
         return baseMapper.selectVoOne(new LambdaQueryWrapper<SysDept>()
@@ -398,4 +407,9 @@ public class SysDeptServiceImpl implements ISysDeptService {
         }
         return dept.getOrderNum();
     }
+
+    @Override
+    public int deleteDeptByOtherId(String otherId) {
+        return baseMapper.deleteDeptByOtherId(otherId,new Date());
+    }
 }

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml

@@ -33,4 +33,8 @@
         order by d.parent_id, d.order_num
     </select>
 
+    <select id="selectVoAllByOtherId" resultMap="SysDeptResult">
+        select * from t_sys_dept where other_id=#{otherId}
+    </select>
+
 </mapper>

+ 11 - 0
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/SyncRemoteDeptService.java

@@ -37,6 +37,17 @@ public class SyncRemoteDeptService {
     public RemoteDeptVo selectDeptByOtherId(String otherId, String tenantId){
         return remoteDeptService.selectDeptByOtherId(otherId, tenantId);
     }
+
+    /**
+     * 根据第三方对接的唯一标识符查询对应的部门信息
+     *
+     * @param otherId  第三方对接的唯一标识符
+     * @param tenantId 租户Id
+     * @return 部门信息
+     */
+    public RemoteDeptVo selectAllDeptByOtherId(String otherId, String tenantId){
+        return remoteDeptService.selectVoAllByOtherId(otherId, tenantId);
+    }
     /**
      * 根据父节点Id和名称查询部门
      * @param parentId 父节点

+ 15 - 3
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/strategy/impl/GraduateClassStrategyImpl.java

@@ -66,15 +66,26 @@ public class GraduateClassStrategyImpl implements ISyncDeptStrategy {
 
         try {
             String otherId = resourceDept.getDept_id();
-            RemoteDeptVo remoteDeptVo = syncRemoteDeptService.selectDeptByOtherId(otherId, tenantId);
+            String delFlag = resourceDept.getDelFlag();
+            //研究生传过来的部门数据是带了删除标志的,所以查询时不能再带上delFlag=0的条件了
+            RemoteDeptVo remoteDeptVo = syncRemoteDeptService.selectAllDeptByOtherId(otherId, tenantId);
             //将班级组装成入库的对模型
             R<RemoteDeptBo> result = setRemoteDeptBo(resourceDept, remoteDeptVo);
             if (result.getCode() == R.SUCCESS) {
                 if (remoteDeptVo != null) {
                     // 已存在此班级,更新
-                    return syncRemoteDeptService.updateDept(result.getData());
+                    if("0".equals(delFlag)) {
+                        return syncRemoteDeptService.updateDept(result.getData());
+                    } else {
+                        return syncRemoteDeptService.deleteDeptByOtherId(otherId);
+                    }
                 } else {
-                    return syncRemoteDeptService.insertDept(result.getData());
+                    if("0".equals(delFlag)) {
+                        //只增加正常的班级
+                        return syncRemoteDeptService.insertDept(result.getData());
+                    } else {
+                        return R.fail("已删除的班级不需要同步");
+                    }
                 }
             } else {
                 return R.fail(result.getMsg());
@@ -117,6 +128,7 @@ public class GraduateClassStrategyImpl implements ISyncDeptStrategy {
         if (StringUtils.isNotEmpty(resourceDept.getDelFlag())) {
             remoteDeptBo.setDelFlag(resourceDept.getDelFlag());
         }
+        remoteDeptBo.setParentId(yearDeptVo.getDeptId());
         return R.ok(remoteDeptBo);
     }
 

+ 3 - 1
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/strategy/impl/HrDeptStrategyImpl.java

@@ -111,7 +111,9 @@ public class HrDeptStrategyImpl implements ISyncDeptStrategy {
             remoteDeptBo.setParentId(remoteParentDeptVo.getDeptId());
         } else {
             //如果同步的部门的父部门在系统中不存在,则父部门为学校
-            remoteDeptBo.setParentId(DefaultConstants.PARENT_DEPT_ID);
+            if(!remoteDeptBo.getDeptId().equals(DefaultConstants.PARENT_DEPT_ID)){
+                remoteDeptBo.setParentId(DefaultConstants.PARENT_DEPT_ID);
+            }
         }
         if (StringUtils.isNotEmpty(deptNum)) {
             remoteDeptBo.setOrderNum(Integer.valueOf(deptNum));

+ 0 - 1
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/dept/strategy/impl/TrainClassStrategyImpl.java

@@ -157,7 +157,6 @@ public class TrainClassStrategyImpl implements ISyncDeptStrategy {
         remoteDeptBo.setDeptName(deptName);
         remoteDeptBo.setParentId(rootId);
         remoteDeptBo.setDeptType(DefaultConstants.YEAR_DEPT_TYPE);
-        remoteDeptBo.setParentId(rootId);
         if (StringUtils.isNotEmpty(resourceDept.getTenantId())) {
             remoteDeptBo.setTenantId(remoteDeptBo.getTenantId());
         }

+ 2 - 2
ruoyi-server/ruoyi-server-common/src/main/java/org/dromara/server/common/constant/DefaultConstants.java

@@ -51,11 +51,11 @@ public interface DefaultConstants {
     /**
      * 研究生年份父部门Id(研究生部)
      */
-    Long GRADUATE_PARENT_DEPT_ID = 162L;
+    Long GRADUATE_PARENT_DEPT_ID = 1850788795766460417L;
     /**
      * 培训班年份父部门Id(培训班)
      */
-    Long TRAIN_PARENT_DEPT_ID = 127L;
+    Long TRAIN_PARENT_DEPT_ID = 1850788897130205186L;
     /**
      * 部门类型代码
      */

+ 1 - 1
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/InitRunnerTest.java

@@ -32,6 +32,6 @@ public class InitRunnerTest implements CommandLineRunner {
         //syncGraduateClass.syncGraduate();
 
         //syncTrainService.syncTrainClass();
-        syncTrainService.syncTrainee();
+        //syncTrainService.syncTrainee();
     }
 }

+ 17 - 3
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/SyncGraduateService.java

@@ -49,10 +49,23 @@ public class SyncGraduateService {
             dept.setDept_name(list.get(2));
             dept.setBeginDate(DateUtil.parse(list.get(3), "yyyy-MM-dd HH:mm:ss"));
             dept.setEndDate(DateUtil.parse(list.get(4), "yyyy-MM-dd HH:mm:ss"));
-            dept.setDelFlag("ZC".equals(list.get(5)) ? "0 " : "1");
+            dept.setDelFlag("ZC".equals(list.get(5)) ? "0" : "1");
             resourceDeptlist.add(dept);
         }
-        log.info("[全量获取到的研究生班级数据]-共[{}]条-[{}]",resourceDeptlist.size(), JSONUtil.toJsonStr(dataBo));
+        log.info("[全量获取到的研究生班级数据]-共[{}]条-[{}]", resourceDeptlist.size(), JSONUtil.toJsonStr(dataBo));
+
+        //region 模拟测试数据
+        //List<ResourceDept> resourceDeptlist = new ArrayList<>();
+        //ResourceDept dept = new ResourceDept();
+        //dept.setDept_id("1e50c447513b4e88bad114470183b314");
+        //dept.setYear(2023);
+        //dept.setDept_name("2023级马克思硕士研究生班");
+        //dept.setBeginDate(DateUtil.parse("2023-09-08 00:00:00", "yyyy-MM-dd HH:mm:ss"));
+        //dept.setEndDate(DateUtil.parse("2026-09-08 00:00:00", "yyyy-MM-dd HH:mm:ss"));
+        //dept.setDelFlag("1");
+        //resourceDeptlist.add(dept);
+        //endregion
+
         syncDeptStrategyContent.syncDept(resourceDeptlist, SyncResourceConstants.GRADUATE_CLASS);
     }
 
@@ -62,13 +75,14 @@ public class SyncGraduateService {
 
         SyncFullDataBo dataBo = JSONUtil.toBean(req.execute().body(), SyncFullDataBo.class);
         List<ResourcePerson> resourcePersonList = getResourcePeople(dataBo);
-        log.info("[全量获取到的研究生数据]-共[{}]条-[{}]",resourcePersonList.size(), JSONUtil.toJsonStr(dataBo));
+        log.info("[全量获取到的研究生数据]-共[{}]条-[{}]", resourcePersonList.size(), JSONUtil.toJsonStr(dataBo));
 
         syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.GRADUATE);
     }
 
     /**
      * 研究生数据预处理
+     *
      * @param dataBo 研究生数据
      * @return 处理结果
      */

+ 2 - 1
ruoyi-server/ruoyi-server-sync/src/main/java/org/dromara/server/sync/service/SyncTrainService.java

@@ -66,7 +66,7 @@ public class SyncTrainService {
         SyncFullDataBo classTraineeDataBo = JSONUtil.toBean(req.execute().body(), SyncFullDataBo.class);
         List<ResourcePersonDept> resourcePersonDeptList = getResourcePersonDeptList(classTraineeDataBo);
 
-        //region 模拟测试
+        //region 模拟测试数据
         //List<ResourcePerson> resourcePersonList = new ArrayList<>();
         //ResourcePerson person = new ResourcePerson();
         //person.setTenantId(DefaultConstants.TENANT_ID);
@@ -97,6 +97,7 @@ public class SyncTrainService {
         //endregion
 
         getResourcePeople(resourcePersonDeptList, resourcePersonList);
+        log.info("[全量获取到的培训学员数据]-[{}]条-[{}]", resourcePersonList.size(), JSONUtil.toJsonStr(traineeDataBo));
 
         syncUserStrategyContent.syncUser(resourcePersonList, SyncResourceConstants.TRAINEE);
     }