소스 검색

fix: 用户同步 - 定时任务

caozixuan 3 년 전
부모
커밋
860df75ffa

+ 4 - 27
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/PushLogicServiceImpl.java

@@ -1,20 +1,16 @@
 package com.qmth.distributed.print.business.templete.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.qmth.distributed.print.business.entity.ExamPrintPlan;
 import com.qmth.distributed.print.business.entity.TSyncExamStudentScore;
 import com.qmth.distributed.print.business.service.ExamPrintPlanService;
 import com.qmth.distributed.print.business.service.TSyncExamStudentScoreService;
 import com.qmth.distributed.print.business.templete.service.PushLogicService;
-import com.qmth.teachcloud.common.base.BaseEntity;
-import com.qmth.teachcloud.common.bean.params.UserPushParam;
+import com.qmth.teachcloud.common.bean.result.SyncCountResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicClazz;
-import com.qmth.teachcloud.common.entity.PushUserTrack;
 import com.qmth.teachcloud.common.entity.SysOrg;
 import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.common.enums.userPush.SyncStatusEnum;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.sync.StmmsUtils;
 import org.slf4j.Logger;
@@ -24,7 +20,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * @Description: 同步推送处理逻辑接口实现类
@@ -64,27 +59,9 @@ public class PushLogicServiceImpl implements PushLogicService {
         int correct = 0;
         int count = 0;
         SysUser sysUser = (SysUser) map.get(SystemConstant.SYS_USER);
-        Long schoolId = sysUser.getSchoolId();
-        // 需要同步的用户
-        List<SysUser> sysUserList = sysUserService.list(new QueryWrapper<SysUser>().lambda()
-                .eq(SysUser::getSchoolId, schoolId)
-                .eq(SysUser::getSyncStatus, SyncStatusEnum.NEED_PUSH_AGAIN));
-        count = sysUserList.size();
-        for (SysUser user : sysUserList) {
-            Set<Long> roleIdSet = sysUserRoleService.listRoleByUserId(user.getId()).stream().map(BaseEntity::getId).collect(Collectors.toSet());
-            List<PushUserTrack> pushUserTrackList = pushUserTrackService.createPushTrackUser(null, roleIdSet, user.getId(), user.getEnable(), sysUser.getId());
-            List<UserPushParam> userPushParamList = pushUserTrackService.analyzeUserPushSpecialPrivilege(pushUserTrackList);
-
-            boolean syncResult = sysUserService.userPushService(userPushParamList, sysUser.getId());
-            if (syncResult) {
-                correct++;
-            }
-            UpdateWrapper<SysUser> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.lambda().set(SysUser::getSyncStatus, null).eq(SysUser::getId, user.getId());
-            sysUserService.update(updateWrapper);
-        }
-        map.put("correct", correct);
-        map.put("count", count);
+        SyncCountResult syncCountResult = sysUserService.needPushAgainOperate(sysUser);
+        map.put("correct", syncCountResult.getCorrectCount());
+        map.put("count", syncCountResult.getTotalCount());
         return map;
     }
 

+ 27 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/SyncCountResult.java

@@ -0,0 +1,27 @@
+package com.qmth.teachcloud.common.bean.result;
+
+/**
+ * @Description: 同步统计结果类
+ * @Author: CaoZixuan
+ * @Date: 2021-11-05
+ */
+public class SyncCountResult {
+    private int totalCount;
+    private int correctCount;
+
+    public int getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(int totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public int getCorrectCount() {
+        return correctCount;
+    }
+
+    public void setCorrectCount(int correctCount) {
+        this.correctCount = correctCount;
+    }
+}

+ 3 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysUserService.java

@@ -9,6 +9,7 @@ import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
 import com.qmth.teachcloud.common.bean.params.UserPushParam;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.bean.result.LoginResult;
+import com.qmth.teachcloud.common.bean.result.SyncCountResult;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.FlowApproveNameEnum;
 import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
@@ -205,4 +206,6 @@ public interface SysUserService extends IService<SysUser> {
      * @return 用户特殊权限身份
      */
     SpecialPrivilegeEnum findUserSpecialPrivilegeByUserId(Long userId);
+
+    SyncCountResult needPushAgainOperate(SysUser requestUser) throws IllegalAccessException;
 }

+ 38 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java

@@ -20,6 +20,7 @@ import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
 import com.qmth.teachcloud.common.bean.params.UserPushParam;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.bean.result.LoginResult;
+import com.qmth.teachcloud.common.bean.result.SyncCountResult;
 import com.qmth.teachcloud.common.bean.result.UserBatchDisposeResult;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
@@ -1031,6 +1032,43 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return this.findUserSpecialPrivilegeByRoleIdSet(roleIdSet);
     }
 
+    @Transactional
+    @Override
+    public SyncCountResult needPushAgainOperate(SysUser requestUser) throws IllegalAccessException {
+        int correctCount = 0;
+        int totalCount = 0;
+        if (Objects.isNull(requestUser)){
+            throw ExceptionResultEnum.ERROR.exception("未找到请求用户");
+        }
+        Long schoolId = requestUser.getSchoolId();
+        Long requestUserId = requestUser.getId();
+        // 需要同步的用户
+        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(SysUser::getSyncStatus, SyncStatusEnum.NEED_PUSH_AGAIN);
+        if (SystemConstant.longNotNull(schoolId)){
+            queryWrapper.lambda().eq(SysUser::getSchoolId,schoolId);
+        }
+        List<SysUser> sysUserList = sysUserService.list(queryWrapper);
+        totalCount = sysUserList.size();
+        for (SysUser user : sysUserList) {
+            Set<Long> roleIdSet = sysUserRoleService.listRoleByUserId(user.getId()).stream().map(BaseEntity::getId).collect(Collectors.toSet());
+            List<PushUserTrack> pushUserTrackList = pushUserTrackService.createPushTrackUser(null, roleIdSet, user.getId(), user.getEnable(), requestUserId);
+            List<UserPushParam> userPushParamList = pushUserTrackService.analyzeUserPushSpecialPrivilege(pushUserTrackList);
+
+            boolean syncResult = sysUserService.userPushService(userPushParamList, requestUserId);
+            if (syncResult) {
+                correctCount++;
+            }
+            UpdateWrapper<SysUser> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda().set(SysUser::getSyncStatus, null).eq(SysUser::getId, user.getId());
+            sysUserService.update(updateWrapper);
+        }
+        SyncCountResult syncCountResult = new SyncCountResult();
+        syncCountResult.setTotalCount(totalCount);
+        syncCountResult.setCorrectCount(correctCount);
+        return syncCountResult;
+    }
+
     /**
      * 批量处理用户信息帮助类
      *

+ 11 - 1
teachcloud-task/src/main/java/com/qmth/teachcloud/task/enums/JobEnum.java

@@ -33,7 +33,17 @@ public enum JobEnum {
 
     REDIS_MQ_JOB("学校信息同步定时任务"),
 
-    REDIS_MQ_JOB_GROUP("学校信息同步定时任务组");
+    REDIS_MQ_JOB_GROUP("学校信息同步定时任务组"),
+
+    TIMED_SYNC_USER_PUSH_ERROR_JOB("用户推送失败再次推送定时任务"),
+
+    TIMED_SYNC_USER_PUSH_ERROR_JOB_GROUP("用户推送失败再次推送定时任务组"),
+
+    TIMED_SYNC_USER_NEED_PUSH_AGAIN_JOB("用户需重新推送再次推送定时任务"),
+
+    TIMED_SYNC_USER_NEED_PUSH_AGAIN_JOB_GROUP("用户需重新推送再次推送定时任务组"),
+    ;
+
 
     private String title;
 

+ 26 - 0
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/TimedSyncUserNeedPushAgainJob.java

@@ -0,0 +1,26 @@
+package com.qmth.teachcloud.task.job;
+
+import com.qmth.teachcloud.task.job.service.JobService;
+import org.quartz.JobExecutionContext;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: 用户需重新推送再次推送定时任务
+ * @Author: CaoZixuan
+ * @Date: 2021-11-05
+ */
+public class TimedSyncUserNeedPushAgainJob extends QuartzJobBean {
+    @Resource
+    JobService jobService;
+
+    @Override
+    protected void executeInternal(JobExecutionContext context) {
+        try {
+            jobService.needPushAgain();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 26 - 0
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/TimedSyncUserPushErrorJob.java

@@ -0,0 +1,26 @@
+package com.qmth.teachcloud.task.job;
+
+import com.qmth.teachcloud.task.job.service.JobService;
+import org.quartz.JobExecutionContext;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: 用户推送失败重新推送
+ * @Author: CaoZixuan
+ * @Date: 2021-11-05
+ */
+public class TimedSyncUserPushErrorJob extends QuartzJobBean {
+    @Resource
+    JobService jobService;
+
+    @Override
+    protected void executeInternal(JobExecutionContext context) {
+        try {
+            jobService.autoPushUserErrorData();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 4 - 4
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/JobService.java

@@ -1,10 +1,6 @@
 package com.qmth.teachcloud.task.job.service;
 
-import com.qmth.teachcloud.common.bean.dto.MqDto;
-
 import java.io.IOException;
-import java.util.Map;
-import java.util.Objects;
 
 /**
  * @Description: job service
@@ -63,4 +59,8 @@ public interface JobService {
      * 机器心跳
      */
     void machineHeart();
+
+    void autoPushUserErrorData() throws IllegalAccessException;
+
+    void needPushAgain() throws IllegalAccessException;
 }

+ 17 - 1
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java

@@ -8,9 +8,10 @@ import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.SysConfig;
+import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.service.OrgCenterDataDisposeService;
 import com.qmth.teachcloud.common.service.SysConfigService;
+import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.task.job.service.JobService;
 import org.slf4j.Logger;
@@ -67,6 +68,9 @@ public class JobServiceImpl implements JobService {
     @Resource
     RedisMachineService redisMachineService;
 
+    @Resource
+    SysUserService sysUserService;
+
     @Override
     public void updateSchoolInfo() throws IOException {
         orgCenterDataDisposeService.updateSchoolInfo();
@@ -139,6 +143,18 @@ public class JobServiceImpl implements JobService {
         redisUtil.set(SystemConstant.TASK_MACHINE_ID + redisMachineService.getMachineId(), redisMachineService.getMachineId(), 30, TimeUnit.SECONDS);
     }
 
+    @Override
+    public void autoPushUserErrorData() throws IllegalAccessException {
+        sysUserService.autoPushUserErrorData();
+    }
+
+    @Override
+    public void needPushAgain() throws IllegalAccessException {
+        SysUser requestUser = new SysUser();
+        requestUser.setId(1L);
+        sysUserService.needPushAgainOperate(requestUser);
+    }
+
     /**
      * 组装job
      *

+ 17 - 0
teachcloud-task/src/main/java/com/qmth/teachcloud/task/start/StartRunning.java

@@ -45,6 +45,23 @@ public class StartRunning implements CommandLineRunner {
         quartzService.addJob(TimedSyncSchoolJob.class, JobEnum.TIMED_SYNC_SCHOOL_JOB.name(), JobEnum.TIMED_TASK_JOB_GROUP.name(), "0 0 0 * * ?", schoolJobMap);
         log.info("增加学校信息同步定时任务 end");
 
+        log.info("增加用户推送失败再次推送定时任务 start");
+        Map userPushErrorMap = new HashMap();
+        userPushErrorMap.computeIfAbsent("name", v -> TimedSyncUserPushErrorJob.class.getName());
+        quartzService.deleteJob(JobEnum.TIMED_SYNC_USER_PUSH_ERROR_JOB.name(), JobEnum.TIMED_SYNC_USER_PUSH_ERROR_JOB_GROUP.name());
+        // 用户推送失败再次推送 每分钟推送一次
+        quartzService.addJob(TimedSyncUserPushErrorJob.class, JobEnum.TIMED_SYNC_USER_PUSH_ERROR_JOB.name(), JobEnum.TIMED_SYNC_USER_PUSH_ERROR_JOB_GROUP.name(), "0 0/1 * * * ?", userPushErrorMap);
+        log.info("增加用户推送失败再次推送定时任务 end");
+
+        log.info("增加用户需重新推送再次推送定时任务 start");
+        Map userNeedPushAgainMap = new HashMap();
+        userNeedPushAgainMap.computeIfAbsent("name", v -> TimedSyncUserNeedPushAgainJob.class.getName());
+        quartzService.deleteJob(JobEnum.TIMED_SYNC_USER_NEED_PUSH_AGAIN_JOB.name(), JobEnum.TIMED_SYNC_USER_NEED_PUSH_AGAIN_JOB_GROUP.name());
+        // 用户推送失败再次推送 每分钟推送一次
+        quartzService.addJob(TimedSyncUserNeedPushAgainJob.class, JobEnum.TIMED_SYNC_USER_NEED_PUSH_AGAIN_JOB.name(), JobEnum.TIMED_SYNC_USER_NEED_PUSH_AGAIN_JOB_GROUP.name(), "0 0 0 * * ?", userNeedPushAgainMap);
+        log.info("增加用户推送失败再次推送定时任务 end");
+
+
 //        log.info("增加重新生成pdf定时任务 start");
 //        Map taskJobMap = new HashMap();
 //        schoolJobMap.computeIfAbsent("name", v -> ResetCreatePdfJob.class.getName());