Sfoglia il codice sorgente

用户同步推送

caozixuan 2 anni fa
parent
commit
95eb405d3e
29 ha cambiato i file con 896 aggiunte e 149 eliminazioni
  1. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBSyncTaskService.java
  2. 1 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java
  3. 9 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBSyncTaskServiceImpl.java
  4. 8 7
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncSysUserDataImportService.java
  5. 1 0
      distributed-print-business/src/main/resources/mapper/TBSyncTaskMapper.xml
  6. 1 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java
  7. 30 8
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysUserController.java
  8. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/TBSyncTaskController.java
  9. 11 78
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/TBSyncTaskDto.java
  10. 24 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/UserDto.java
  11. 42 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/CloudUserPushParams.java
  12. 11 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/SyncListResult.java
  13. 25 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/SysUser.java
  14. 2 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/RoleTypeEnum.java
  15. 1 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/userPush/SyncStatusEnum.java
  16. 29 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/userPush/UserPushResultEnum.java
  17. 48 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/CloudUserPushOperateMapper.java
  18. 49 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/CloudUserPushOperateService.java
  19. 49 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/CloudUserPushService.java
  20. 2 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/PushUserTrackService.java
  21. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysUserService.java
  22. 115 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/CloudUserPushOperateServiceImpl.java
  23. 237 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/CloudUserPushServiceImpl.java
  24. 5 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysOrgServiceImpl.java
  25. 20 39
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java
  26. 7 4
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java
  27. 13 7
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/sync/CloudMarkingTaskUtils.java
  28. 151 0
      teachcloud-common/src/main/resources/mapper/CloudUserPushOperateMapper.xml
  29. 2 0
      teachcloud-common/src/main/resources/mapper/SysUserMapper.xml

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBSyncTaskService.java

@@ -46,5 +46,5 @@ public interface TBSyncTaskService extends IService<TBSyncTask> {
      *
      * @param id 任务ID
      */
-    void resync(Long id);
+    void resync(Long id) throws IllegalAccessException;
 }

+ 1 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java

@@ -18,6 +18,7 @@ import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.service.*;
+import com.qmth.distributed.print.business.service.TBSyncTaskService;
 import com.qmth.distributed.print.business.util.HtmlToPdfUtil;
 import com.qmth.distributed.print.business.util.PdfUtil;
 import com.qmth.teachcloud.common.bean.dto.MqDto;

+ 9 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBSyncTaskServiceImpl.java

@@ -17,6 +17,7 @@ import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.PushTypeEnum;
 import com.qmth.teachcloud.common.enums.TaskResultEnum;
 import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.service.CloudUserPushService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.springframework.stereotype.Service;
@@ -55,6 +56,9 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
     @Resource
     GradeBatchPaperService gradeBatchPaperService;
 
+    @Resource
+    CloudUserPushService cloudUserPushService;
+
     @Transactional
     @Override
     public TBSyncTask saveTask(Long schoolId, Long objectId, PushTypeEnum type) {
@@ -154,7 +158,8 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
     }
 
     @Override
-    public void resync(Long id) {
+    public void resync(Long id) throws IllegalAccessException {
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         TBSyncTask tbSyncTask = this.getById(id);
         if (tbSyncTask == null) {
             throw ExceptionResultEnum.ERROR.exception("任务不存在");
@@ -187,6 +192,9 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
             case CALCULATE:
                 asyncTeachCloudReportService.startCalc(gradeBatchService.getById(tbSyncTask.getObjectId()));
                 break;
+            case USER_PUSH:
+                cloudUserPushService.pushCloudUser(tbSyncTask.getObjectId(),requestUser);
+                break;
             default:
                 break;
         }

+ 8 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncSysUserDataImportService.java

@@ -1,6 +1,7 @@
 package com.qmth.distributed.print.business.templete.execute;
 
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSON;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.templete.importData.AsyncImportTaskTemplete;
 import com.qmth.distributed.print.business.templete.service.TaskLogicService;
@@ -11,6 +12,7 @@ import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.enums.TaskResultEnum;
 import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.service.CloudUserPushService;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.service.TBTaskService;
 import com.qmth.teachcloud.common.util.Result;
@@ -40,13 +42,13 @@ public class AsyncSysUserDataImportService extends AsyncImportTaskTemplete {
     public static final String OBJ_TITLE = "用户基本信息";
 
     @Resource
-    private SysUserService sysUserService;
+    private CloudUserPushService cloudUserPushService;
 
     @Override
     public Result importTask(Map<String, Object> map) throws Exception {
         TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
         InputStream inputStream = super.getUploadFileInputStream(tbTask);
-        map.put("inputStream",inputStream);
+        map.put("inputStream", inputStream);
 
         StringJoiner stringJoinerSummary = new StringJoiner("\n")
                 .add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), BEGIN_TITLE, OBJ_TITLE));
@@ -60,15 +62,14 @@ public class AsyncSysUserDataImportService extends AsyncImportTaskTemplete {
             Map<String, Object> result = taskLogicService.executeImportSysUserLogic(map);
             // 执行用户同步数据
             SysUser sysUser = (SysUser) map.get(SystemConstant.SYS_USER);
-            Long schoolId = sysUser.getSchoolId();
-            List<UserPushParam> userPushParamList = (List<UserPushParam>) result.get("userPushParamList");
-            if (userPushParamList != null && userPushParamList.size() > 0){
-                sysUserService.userPushService(userPushParamList,sysUser.getId());
+            List<Long> userIdList = JSON.parseArray(String.valueOf(result.get("userIdList")), Long.class);
+            if (userIdList != null && userIdList.size() > 0) {
+                cloudUserPushService.pushCloudUser(userIdList, sysUser);
             }
 
             stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, Long.valueOf(String.valueOf(result.get("dataCount"))), FINISH_SIZE));
             tbTask.setResult(TaskResultEnum.SUCCESS);
-        }catch (Exception e){
+        } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
             stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
             tbTask.setResult(TaskResultEnum.ERROR);

+ 1 - 0
distributed-print-business/src/main/resources/mapper/TBSyncTaskMapper.xml

@@ -9,6 +9,7 @@
             tbst.third_relate_id thirdRelateId,
             tbst.status,
             tbst.result,
+            tbst.remark,
             if(ISNULL(tbst.report_file_path),false,true) as hasReportFile,
             tbst.error_message as errorMessage,
             tbst.create_id as createId,

+ 1 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java

@@ -13,6 +13,7 @@ import com.qmth.distributed.print.business.entity.TeachClazz;
 import com.qmth.distributed.print.business.enums.DictionaryEnum;
 import com.qmth.distributed.print.business.enums.LoginTypeEnum;
 import com.qmth.distributed.print.business.service.*;
+import com.qmth.distributed.print.business.service.TBSyncTaskService;
 import com.qmth.distributed.print.business.util.PdfUtil;
 import com.qmth.teachcloud.common.bean.auth.AuthBean;
 import com.qmth.teachcloud.common.bean.result.LoginResult;

+ 30 - 8
distributed-print/src/main/java/com/qmth/distributed/print/api/SysUserController.java

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.api;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
@@ -8,12 +9,15 @@ import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.distributed.print.business.templete.execute.AsyncSysUserDataImportService;
 import com.qmth.distributed.print.business.templete.execute.AsyncUserPushService;
+import com.qmth.teachcloud.common.base.BaseEntity;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.enums.PushTypeEnum;
 import com.qmth.teachcloud.common.enums.TaskTypeEnum;
+import com.qmth.teachcloud.common.enums.userPush.SyncStatusEnum;
+import com.qmth.teachcloud.common.service.CloudUserPushService;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
@@ -32,8 +36,10 @@ import javax.validation.Valid;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import java.security.NoSuchAlgorithmException;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -59,6 +65,8 @@ public class SysUserController {
     private AsyncSysUserDataImportService asyncSysUserDataImportService;
     @Resource
     private AsyncUserPushService asyncUserPushService;
+    @Resource
+    private CloudUserPushService cloudUserPushService;
 
     /**
      * 查询
@@ -121,7 +129,12 @@ public class SysUserController {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
-        return ResultUtil.ok(sysUserService.saveUser(userSaveParams));
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        Long upUserId = sysUserService.saveUser(userSaveParams);
+        if (SystemConstant.longNotNull(upUserId)) {
+            cloudUserPushService.pushCloudUser(upUserId, requestUser);
+        }
+        return ResultUtil.ok();
     }
 
     /**
@@ -148,7 +161,11 @@ public class SysUserController {
     @ApiOperation(value = "启用/禁用")
     @RequestMapping(value = "/enable", method = RequestMethod.POST)
     public Result enable(@RequestBody SysUser user) throws NoSuchAlgorithmException, IllegalAccessException {
-        return ResultUtil.ok(sysUserService.enable(user));
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        if (sysUserService.enable(user)) {
+            cloudUserPushService.pushCloudUser(user.getId(), requestUser);
+        }
+        return ResultUtil.ok();
     }
 
     /**
@@ -205,12 +222,17 @@ public class SysUserController {
     @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
     public Result sysUserPush() throws Exception {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        Map<String, Object> map = printCommonService.savePush(PushTypeEnum.USER_PUSH);
-        map.put(SystemConstant.SYS_USER, sysUser);
-
-        asyncUserPushService.pushTask(map);
-        TBSyncTask tbSyncTask = Objects.nonNull(map.get(SystemConstant.TB_SYNC_TASK)) ? (TBSyncTask) map.get(SystemConstant.TB_SYNC_TASK) : null;
-        return Objects.nonNull(tbSyncTask) ? ResultUtil.ok(tbSyncTask.getId()) : ResultUtil.error("创建同步推送任务失败");
+        Long schoolId = sysUser.getSchoolId();
+        List<Long> userIdList = sysUserService.list(new QueryWrapper<SysUser>()
+                        .lambda()
+                        .eq(SysUser::getSchoolId, schoolId)
+                        .eq(SysUser::getSyncStatus, SyncStatusEnum.NEED_PUSH_AGAIN))
+                .stream()
+                .map(BaseEntity::getId)
+                .distinct()
+                .collect(Collectors.toList());
+        cloudUserPushService.pushCloudUser(userIdList, sysUser);
+        return ResultUtil.ok();
     }
 }
 

+ 1 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/TBSyncTaskController.java

@@ -61,7 +61,7 @@ public class TBSyncTaskController {
     @ApiOperation(value = "重新同步")
     @RequestMapping(value = "/resync", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "重新同步", response = TaskListResult.class)})
-    public Result syncQuery(@ApiParam(value = "任务ID") @RequestParam(required = false) Long id) {
+    public Result syncQuery(@ApiParam(value = "任务ID") @RequestParam(required = false) Long id) throws IllegalAccessException {
         tbSyncTaskService.resync(id);
         return ResultUtil.ok(true);
     }

+ 11 - 78
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/TBSyncTaskDto.java

@@ -1,14 +1,10 @@
 package com.qmth.teachcloud.common.bean.dto;
 
-import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import com.qmth.teachcloud.common.enums.PushTypeEnum;
-import com.qmth.teachcloud.common.enums.TaskResultEnum;
-import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.base.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
@@ -18,31 +14,8 @@ import java.io.Serializable;
  * @Author: CaoZixuan
  * @Date: 2022-05-06
  */
-public class TBSyncTaskDto implements Serializable {
+public class TBSyncTaskDto extends BaseEntity implements Serializable {
     private static final long serialVersionUID = 1L;
-    @JsonSerialize(using = ToStringSerializer.class)
-    @ApiModelProperty(value = "主键")
-    @TableId(value = "id")
-    private Long id;
-
-    @JsonSerialize(using = ToStringSerializer.class)
-    @TableField("create_id")
-    @ApiModelProperty(value = "创建人")
-    private Long createId;
-
-    @TableField(value = "create_time", fill = FieldFill.INSERT)//新增执行
-    @ApiModelProperty(value = "创建时间")
-    private Long createTime;
-
-    @JsonSerialize(using = ToStringSerializer.class)
-    @TableField("update_id")
-    @ApiModelProperty(value = "修改人")
-    private Long updateId;
-
-    @TableField(value = "update_Time", fill = FieldFill.INSERT_UPDATE) // 新增和更新执行
-    @ApiModelProperty(value = "修改时间")
-    private Long updateTime;
-
     @ApiModelProperty(value = "学校id")
     @JsonSerialize(using = ToStringSerializer.class)
     @TableField("school_id")
@@ -55,7 +28,7 @@ public class TBSyncTaskDto implements Serializable {
 
     @ApiModelProperty(value = "推送类型,USER_PUSH:用户推送")
     @TableField(value = "type")
-    private PushTypeEnum type;
+    private String type;
 
     @ApiModelProperty(value = "第三方关联id")
     @JsonSerialize(using = ToStringSerializer.class)
@@ -69,7 +42,7 @@ public class TBSyncTaskDto implements Serializable {
 
     @ApiModelProperty(value = "任务状态,INIT:未开始,RUNNING:进行中,FINISH:已完成")
     @TableField(value = "status")
-    private TaskStatusEnum status;
+    private String status;
 
     @ApiModelProperty(value = "实时摘要信息")
     @TableField(value = "summary")
@@ -77,7 +50,7 @@ public class TBSyncTaskDto implements Serializable {
 
     @ApiModelProperty(value = "数据结果,SUCCESS:成功,ERROR:失败")
     @TableField(value = "result")
-    private TaskResultEnum result;
+    private String result;
 
     @ApiModelProperty(value = "备注")
     @TableField(value = "remark")
@@ -95,46 +68,6 @@ public class TBSyncTaskDto implements Serializable {
     @TableField(value = "report_file_path")
     private String reportFilePath;
 
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public Long getCreateId() {
-        return createId;
-    }
-
-    public void setCreateId(Long createId) {
-        this.createId = createId;
-    }
-
-    public Long getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Long createTime) {
-        this.createTime = createTime;
-    }
-
-    public Long getUpdateId() {
-        return updateId;
-    }
-
-    public void setUpdateId(Long updateId) {
-        this.updateId = updateId;
-    }
-
-    public Long getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Long updateTime) {
-        this.updateTime = updateTime;
-    }
-
     public Long getSchoolId() {
         return schoolId;
     }
@@ -151,11 +84,11 @@ public class TBSyncTaskDto implements Serializable {
         this.orgId = orgId;
     }
 
-    public PushTypeEnum getType() {
+    public String getType() {
         return type;
     }
 
-    public void setType(PushTypeEnum type) {
+    public void setType(String type) {
         this.type = type;
     }
 
@@ -175,11 +108,11 @@ public class TBSyncTaskDto implements Serializable {
         this.objectId = objectId;
     }
 
-    public TaskStatusEnum getStatus() {
+    public String getStatus() {
         return status;
     }
 
-    public void setStatus(TaskStatusEnum status) {
+    public void setStatus(String status) {
         this.status = status;
     }
 
@@ -191,11 +124,11 @@ public class TBSyncTaskDto implements Serializable {
         this.summary = summary;
     }
 
-    public TaskResultEnum getResult() {
+    public String getResult() {
         return result;
     }
 
-    public void setResult(TaskResultEnum result) {
+    public void setResult(String result) {
         this.result = result;
     }
 

+ 24 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/UserDto.java

@@ -3,6 +3,8 @@ package com.qmth.teachcloud.common.bean.dto;
 
 import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.entity.SysRole;
+import com.qmth.teachcloud.common.enums.userPush.UserPushResultEnum;
+import io.swagger.annotations.ApiModelProperty;
 
 import java.util.List;
 
@@ -22,6 +24,12 @@ public class UserDto {
     private String orgName;
     private String code;
 
+    @ApiModelProperty(value = "评卷员推送状态")
+    private UserPushResultEnum markerStatus;
+
+    @ApiModelProperty(value = "科组长推送状态")
+    private UserPushResultEnum markerLeaderStatus;
+
     private List<SysRole> roles;
 
     private List<BasicCourse> courses;
@@ -121,4 +129,20 @@ public class UserDto {
     public String getCode() {
         return code;
     }
+
+    public UserPushResultEnum getMarkerStatus() {
+        return markerStatus;
+    }
+
+    public void setMarkerStatus(UserPushResultEnum markerStatus) {
+        this.markerStatus = markerStatus;
+    }
+
+    public UserPushResultEnum getMarkerLeaderStatus() {
+        return markerLeaderStatus;
+    }
+
+    public void setMarkerLeaderStatus(UserPushResultEnum markerLeaderStatus) {
+        this.markerLeaderStatus = markerLeaderStatus;
+    }
 }

+ 42 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/CloudUserPushParams.java

@@ -0,0 +1,42 @@
+package com.qmth.teachcloud.common.bean.params;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.annotation.DBVerify;
+import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 推送云阅卷用户参数
+ * @Author: CaoZixuan
+ * @Date: 2022-08-02
+ */
+public class CloudUserPushParams {
+    @ApiModelProperty(value = "系统用户id")
+    @DBVerify(value = "系统用户id",required = true)
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long userId;
+
+    @ApiModelProperty(value = "登录名")
+    @DBVerify(value = "登录名",required = true)
+    private String loginName;
+
+    @ApiModelProperty(value = "真实名称")
+    private String realName;
+
+    @ApiModelProperty(value = "密码")
+    private String password;
+
+
+
+    @ApiModelProperty(value = "是否启用")
+    private Boolean enable;
+
+    @ApiModelProperty(value = "科组长关联科目,科目代码用,分割,例如ASC,WED")
+    private String subjectCodes;
+
+    @ApiModelProperty(value = "学校id")
+    @DBVerify(value = "学校id",required = true)
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+}

+ 11 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/SyncListResult.java

@@ -35,6 +35,9 @@ public class SyncListResult implements Serializable {
     @ApiModelProperty(value = "数据结果,SUCCESS:成功,ERROR:失败")
     private String resultStr;
 
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "创建人id")
     private Long createId;
@@ -146,4 +149,12 @@ public class SyncListResult implements Serializable {
     public void setThirdRelateId(String thirdRelateId) {
         this.thirdRelateId = thirdRelateId;
     }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
 }

+ 25 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/SysUser.java

@@ -8,6 +8,7 @@ import com.qmth.teachcloud.common.base.BaseEntity;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.userPush.SyncStatusEnum;
+import com.qmth.teachcloud.common.enums.userPush.UserPushResultEnum;
 import com.qmth.teachcloud.common.service.SysConfigService;
 import com.qmth.teachcloud.common.util.Base64Util;
 import io.swagger.annotations.ApiModelProperty;
@@ -110,6 +111,14 @@ public class SysUser extends BaseEntity implements Serializable {
     @TableField(exist = false)
     private Long[] courseIds;
 
+    @ApiModelProperty(value = "评卷员推送状态")
+    @TableField("marker_status")
+    private UserPushResultEnum markerStatus;
+
+    @ApiModelProperty(value = "科组长推送状态")
+    @TableField("marker_leader_status")
+    private UserPushResultEnum markerLeaderStatus;
+
     @ApiModelProperty(value = "同步状态")
     @TableField("sync_status")
     private SyncStatusEnum syncStatus;
@@ -279,4 +288,20 @@ public class SysUser extends BaseEntity implements Serializable {
     public void setVerifyCode(String verifyCode) {
         this.verifyCode = verifyCode;
     }
+
+    public UserPushResultEnum getMarkerStatus() {
+        return markerStatus;
+    }
+
+    public void setMarkerStatus(UserPushResultEnum markerStatus) {
+        this.markerStatus = markerStatus;
+    }
+
+    public UserPushResultEnum getMarkerLeaderStatus() {
+        return markerLeaderStatus;
+    }
+
+    public void setMarkerLeaderStatus(UserPushResultEnum markerLeaderStatus) {
+        this.markerLeaderStatus = markerLeaderStatus;
+    }
 }

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/RoleTypeEnum.java

@@ -16,7 +16,8 @@ public enum RoleTypeEnum {
     PRESIDENT("学院院长"),
     TEACHER("任课老师"),
     MARKER("评卷员"),
-    MARKER_LEADER("科组长");
+    MARKER_LEADER("科组长")
+    ;
 
     RoleTypeEnum(String desc) {
         this.desc = desc;

+ 1 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/userPush/SyncStatusEnum.java

@@ -6,6 +6,7 @@ package com.qmth.teachcloud.common.enums.userPush;
  * @Date: 2021-10-27
  */
 public enum SyncStatusEnum {
+    ALREADY_PUSH("已经完成推送"),
     NEED_PUSH_AGAIN("需要重新推送"),
     ;
     SyncStatusEnum(String desc) {

+ 29 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/userPush/UserPushResultEnum.java

@@ -0,0 +1,29 @@
+package com.qmth.teachcloud.common.enums.userPush;
+
+/**
+ * @Description: 用户推送结果枚举
+ * @Author: CaoZixuan
+ * @Date: 2022-08-03
+ */
+public enum UserPushResultEnum {
+    BIND_SUCCESS("绑定成功", true),
+    BIND_FAILED("绑定失败", false),
+    UNBIND_SUCCESS("解绑成功", true),
+    UNBIND_FAILED("解绑失败", false),
+    ;
+    private final String desc;
+    private final boolean success;
+
+    UserPushResultEnum(String desc, boolean success) {
+        this.desc = desc;
+        this.success = success;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public boolean isSuccess() {
+        return success;
+    }
+}

+ 48 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/CloudUserPushOperateMapper.java

@@ -0,0 +1,48 @@
+package com.qmth.teachcloud.common.mapper;
+
+import com.qmth.teachcloud.common.bean.dto.TBSyncTaskDto;
+import com.qmth.teachcloud.common.enums.PushTypeEnum;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @Description: 推送任务共用mapper
+ * @Author: CaoZixuan
+ * @Date: 2022-08-03
+ */
+public interface CloudUserPushOperateMapper {
+    /**
+     * 新增推送任务
+     *
+     * @param tbSyncTaskDto tbSyncTaskDto
+     * @return 是否成功
+     */
+    boolean insertTBSyncTask(@Param("tbSyncTaskDto") TBSyncTaskDto tbSyncTaskDto);
+
+    /**
+     * 更新推送任务
+     *
+     * @param tbSyncTaskDto tbSyncTaskDto
+     * @return 是否成功
+     */
+    boolean updateTBSyncTask(@Param("tbSyncTaskDto") TBSyncTaskDto tbSyncTaskDto);
+
+    /**
+     * 根据id查询
+     *
+     * @param id id
+     * @return 结果
+     */
+    TBSyncTaskDto findById(@Param("id") Long id);
+
+    /**
+     * 查找推送记录
+     *
+     * @param schoolId  学校id
+     * @param objectId 关联用户id
+     * @param type      推送类型
+     * @return 推送任务集合(应该只有一条)
+     */
+    List<TBSyncTaskDto> findPushRecord(@Param("schoolId") Long schoolId, @Param("objectId") Long objectId, @Param("type") String type);
+}

+ 49 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/CloudUserPushOperateService.java

@@ -0,0 +1,49 @@
+package com.qmth.teachcloud.common.service;
+
+import com.qmth.teachcloud.common.bean.dto.TBSyncTaskDto;
+import com.qmth.teachcloud.common.bean.params.UserPushParam;
+import com.qmth.teachcloud.common.entity.SysUser;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 推送任务服务类
+ * @Author: CaoZixuan
+ * @Date: 2022-08-03
+ */
+public interface CloudUserPushOperateService {
+    /**
+     * 新增或更新推送任务
+     *
+     * @param tbSyncTaskDto obj
+     */
+    void saveOrUpdateTBSyncTask(TBSyncTaskDto tbSyncTaskDto);
+
+    /**
+     * 查询用户推送记录
+     *
+     * @param userId   用户id
+     * @param schoolId 学校id
+     * @return 记录
+     */
+    TBSyncTaskDto findUserPushRecord(Long userId, Long schoolId);
+
+
+    /**
+     * 初始化用户推送任务
+     *
+     * @param userPushMap 用户map
+     * @param requestUser 请求用户
+     */
+    void initUserPushTasks(Map<Long, List<UserPushParam>> userPushMap, SysUser requestUser);
+
+    /**
+     * 用户推送任务进行中
+     *
+     * @param userId      用户id
+     * @param requestUser 请求用户
+     * @return 。。
+     */
+    TBSyncTaskDto runningUserPushTask(Long userId, SysUser requestUser);
+}

+ 49 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/CloudUserPushService.java

@@ -0,0 +1,49 @@
+package com.qmth.teachcloud.common.service;
+
+import com.qmth.teachcloud.common.bean.params.UserPushParam;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.RoleTypeEnum;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 云阅卷用户推送服务接口
+ * @Author: CaoZixuan
+ * @Date: 2022-08-02
+ */
+public interface CloudUserPushService {
+
+    /**
+     * 推送云阅卷用户
+     *
+     * @param userId      用户id
+     * @param requestUser 请求用户
+     */
+    void pushCloudUser(Long userId, SysUser requestUser) throws IllegalAccessException;
+
+    /**
+     * 推送云阅卷用户
+     *
+     * @param userIdList  用户id集合
+     * @param requestUser 请求用户
+     */
+    void pushCloudUser(List<Long> userIdList, SysUser requestUser) throws IllegalAccessException;
+
+    /**
+     * 查询某用户是否包含系统特定角色
+     *
+     * @param userId      用户id
+     * @param defaultRole 系统默认角色
+     * @return true:包含 || false:不包含
+     */
+    boolean includeSysRole(Long userId, RoleTypeEnum defaultRole);
+
+    /**
+     * 异步推送用户
+     *
+     * @param userPushMap 用户信息
+     * @param requestUser 请求的用户
+     */
+    void asyncPushUser(Map<Long, List<UserPushParam>> userPushMap, SysUser requestUser) throws IllegalAccessException;
+}

+ 2 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/PushUserTrackService.java

@@ -26,6 +26,7 @@ public interface PushUserTrackService extends IService<PushUserTrack> {
      * @param requestUserId    请求用户id
      * @return 该用户推送轨迹记录集合(0条或2条)
      */
+    @Deprecated
     List<PushUserTrack> createPushTrackUser(Set<Long> dbRoleIdSet, Set<Long> currentRoleIdSet, Long userId, boolean enable, Long requestUserId);
 
 
@@ -35,5 +36,6 @@ public interface PushUserTrackService extends IService<PushUserTrack> {
      * @param pushUserTrackList 该用户推送轨迹记录集合(0条或2条)
      * @return 组装好的用户推送信息集合
      */
+    @Deprecated
     List<UserPushParam> analyzeUserPushSpecialPrivilege(List<PushUserTrack> pushUserTrackList);
 }

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

@@ -35,7 +35,7 @@ public interface SysUserService extends IService<SysUser> {
 
     IPage<UserDto> list(String loginName, String roleId, Boolean enable, String realName, Integer pageNumber, Integer pageSize);
 
-    boolean saveUser(UserSaveParams userSaveParams) throws IllegalAccessException;
+    Long saveUser(UserSaveParams userSaveParams) throws IllegalAccessException;
 
     /**
      * 保存用户

+ 115 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/CloudUserPushOperateServiceImpl.java

@@ -0,0 +1,115 @@
+package com.qmth.teachcloud.common.service.impl;
+
+import com.qmth.teachcloud.common.bean.dto.TBSyncTaskDto;
+import com.qmth.teachcloud.common.bean.params.UserPushParam;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.PushTypeEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.mapper.CloudUserPushOperateMapper;
+import com.qmth.teachcloud.common.service.CloudUserPushOperateService;
+import com.qmth.teachcloud.common.service.SysUserService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @Description: 推送任务服务实现类
+ * @Author: CaoZixuan
+ * @Date: 2022-08-03
+ */
+@Service
+public class CloudUserPushOperateServiceImpl implements CloudUserPushOperateService {
+    @Resource
+    private CloudUserPushOperateMapper cloudUserPushOperateMapper;
+    @Resource
+    private SysUserService sysUserService;
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void saveOrUpdateTBSyncTask(TBSyncTaskDto tbSyncTaskDto) {
+        Long id = tbSyncTaskDto.getId();
+        if (SystemConstant.longNotNull(id)) {
+            // 存在id -> 如果查询数据库中已存该id的对象则更新,否则新增 || 不存在id -> 新增
+            TBSyncTaskDto db = cloudUserPushOperateMapper.findById(id);
+            if (Objects.nonNull(db)) {
+                // 更新
+                boolean updateResult = cloudUserPushOperateMapper.updateTBSyncTask(tbSyncTaskDto);
+                if (!updateResult) {
+                    throw ExceptionResultEnum.ERROR.exception("推送任务更新失败");
+                }
+            } else {
+                // 新增
+                boolean insertResult = cloudUserPushOperateMapper.insertTBSyncTask(tbSyncTaskDto);
+                if (!insertResult) {
+                    throw ExceptionResultEnum.ERROR.exception("推送任务新增失败");
+                }
+            }
+        } else {
+            id = SystemConstant.getDbUuid();
+            tbSyncTaskDto.setId(id);
+            boolean insertResult = cloudUserPushOperateMapper.insertTBSyncTask(tbSyncTaskDto);
+            if (!insertResult) {
+                throw ExceptionResultEnum.ERROR.exception("推送任务新增失败");
+            }
+        }
+    }
+
+    @Override
+    public TBSyncTaskDto findUserPushRecord(Long userId, Long schoolId) {
+        List<TBSyncTaskDto> userPushList = cloudUserPushOperateMapper.findPushRecord(schoolId, userId, PushTypeEnum.USER_PUSH.name());
+        if (userPushList != null && userPushList.size() > 0) {
+            if (userPushList.size() > 1) {
+                throw ExceptionResultEnum.ERROR.exception("异常:用户【" + userId + "】拥有多条推送记录");
+            }
+            return userPushList.get(0);
+        } else {
+            return null;
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void initUserPushTasks(Map<Long, List<UserPushParam>> userPushMap, SysUser requestUser) {
+        Long schoolId = requestUser.getSchoolId();
+        for (Long userId : userPushMap.keySet()) {
+            TBSyncTaskDto dbRecord = this.findUserPushRecord(userId, schoolId);
+            Long id;
+            if (Objects.nonNull(dbRecord)) {
+                id = dbRecord.getId();
+            } else {
+                id = SystemConstant.getDbUuid();
+            }
+            TBSyncTaskDto tbSyncTaskDto = new TBSyncTaskDto();
+            tbSyncTaskDto.setId(id);
+            tbSyncTaskDto.setSchoolId(schoolId);
+            tbSyncTaskDto.setType(PushTypeEnum.USER_PUSH.name());
+            tbSyncTaskDto.setObjectId(userId);
+            tbSyncTaskDto.setStatus(TaskStatusEnum.INIT.name());
+            tbSyncTaskDto.setRemark(sysUserService.getById(userId).getLoginName());
+            tbSyncTaskDto.setResult(null);
+            tbSyncTaskDto.setCreateId(requestUser.getId());
+            tbSyncTaskDto.setCreateTime(System.currentTimeMillis());
+            this.saveOrUpdateTBSyncTask(tbSyncTaskDto);
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public TBSyncTaskDto runningUserPushTask(Long userId, SysUser requestUser) {
+        Long schoolId = requestUser.getSchoolId();
+        TBSyncTaskDto tbSyncTaskDto = this.findUserPushRecord(userId, schoolId);
+        if (Objects.isNull(tbSyncTaskDto)) {
+            throw ExceptionResultEnum.ERROR.exception("用户推送表信息缺失");
+        }
+        tbSyncTaskDto.setStatus(TaskStatusEnum.RUNNING.name());
+        tbSyncTaskDto.updateInfo(requestUser.getId());
+        this.saveOrUpdateTBSyncTask(tbSyncTaskDto);
+        return tbSyncTaskDto;
+    }
+}

+ 237 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/CloudUserPushServiceImpl.java

@@ -0,0 +1,237 @@
+package com.qmth.teachcloud.common.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.qmth.teachcloud.common.bean.dto.TBSyncTaskDto;
+import com.qmth.teachcloud.common.bean.params.UserPushParam;
+import com.qmth.teachcloud.common.bean.result.PushResult;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysRole;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.SysUserRole;
+import com.qmth.teachcloud.common.enums.RoleTypeEnum;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
+import com.qmth.teachcloud.common.enums.userPush.SyncStatusEnum;
+import com.qmth.teachcloud.common.enums.userPush.UserPushResultEnum;
+import com.qmth.teachcloud.common.service.*;
+import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 云阅卷用户推送服务类
+ * @Author: CaoZixuan
+ * @Date: 2022-08-02
+ */
+@Service
+public class CloudUserPushServiceImpl implements CloudUserPushService {
+    @Resource
+    private SysUserRoleService sysUserRoleService;
+    @Resource
+    private SysRoleService sysRoleService;
+    @Resource
+    private SysUserService sysUserService;
+    @Resource
+    private CloudMarkingTaskUtils stmmsUtils;
+    @Resource
+    private CloudUserPushOperateService cloudUserPushOperateService;
+
+    @Override
+    public void pushCloudUser(Long userId, SysUser requestUser) throws IllegalAccessException {
+        List<Long> userIdList = new ArrayList<>();
+        userIdList.add(userId);
+        this.pushCloudUser(userIdList,requestUser);
+    }
+
+    @Override
+    public void pushCloudUser(List<Long> userIdList, SysUser requestUser) throws IllegalAccessException {
+        Long schoolId = requestUser.getSchoolId();
+        userIdList = userIdList.stream().distinct().collect(Collectors.toList());
+        List<SysUser> sysUserList = sysUserService.listByIds(userIdList);
+        // 构建用户推送map
+        Map<Long, List<UserPushParam>> userPushMap = this.buildUserPushMap(sysUserList, schoolId);
+
+        // 初始化推送任务
+        cloudUserPushOperateService.initUserPushTasks(userPushMap,requestUser);
+        // 执行推送异步任务
+        CloudUserPushService cloudUserPushService = SpringContextHolder.getBean(CloudUserPushService.class);
+        cloudUserPushService.asyncPushUser(userPushMap,requestUser);
+    }
+
+    @Override
+    public boolean includeSysRole(Long userId, RoleTypeEnum defaultRole) {
+        SysRole sysRole = sysRoleService.getOne(new QueryWrapper<SysRole>().lambda().eq(SysRole::getType, defaultRole));
+        if (Objects.nonNull(sysRole)) {
+            SysUserRole sysUserRole = sysUserRoleService.getOne(new QueryWrapper<SysUserRole>()
+                    .lambda()
+                    .eq(SysUserRole::getUserId, userId)
+                    .eq(SysUserRole::getRoleId, sysRole.getId()));
+            return Objects.nonNull(sysUserRole);
+        }
+        return false;
+    }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    @Async
+    @Override
+    public void asyncPushUser(Map<Long, List<UserPushParam>> userPushMap, SysUser requestUser) {
+        for (Long userId : userPushMap.keySet()) {
+            String syncException = "";
+            // 更新该用户推送任务进行中
+            TBSyncTaskDto tbSyncTaskDto = cloudUserPushOperateService.runningUserPushTask(userId, requestUser);
+            // 初始化数据
+            UserPushResultEnum markerPush = null;
+            UserPushResultEnum leaderPush = null;
+            SyncStatusEnum syncStatus = null;
+            try {
+                List<UserPushParam> userPushParamList = userPushMap.get(userId);
+                for (UserPushParam userPushParam : userPushParamList) {
+                    SpecialPrivilegeEnum specialRole = userPushParam.getRole();
+                    boolean bind = userPushParam.getEnable();
+                    PushResult pushResult = stmmsUtils.syncUser(userPushParam);
+                    boolean syncResult = pushResult.getSuccess();
+                    String syncExceptionCell = null;
+
+                    if (syncResult) {
+                        // 推送成功
+                        syncStatus = SyncStatusEnum.ALREADY_PUSH;
+                        switch (specialRole) {
+                            case MARKER:
+                                markerPush = bind ? UserPushResultEnum.BIND_SUCCESS : UserPushResultEnum.UNBIND_SUCCESS;
+                                break;
+                            case SUBJECT_HEADER:
+                                leaderPush = bind ? UserPushResultEnum.BIND_SUCCESS : UserPushResultEnum.UNBIND_SUCCESS;
+                                break;
+                        }
+                    } else {
+                        // 推送失败
+                        syncStatus = SyncStatusEnum.NEED_PUSH_AGAIN;
+                        String errorMessage = pushResult.getMessage();
+                        switch (specialRole) {
+                            case MARKER:
+                                markerPush = bind ? UserPushResultEnum.BIND_FAILED : UserPushResultEnum.UNBIND_FAILED;
+                                syncExceptionCell = "【" + RoleTypeEnum.MARKER.getDesc() + markerPush.getDesc() + "】" + errorMessage + "\n";
+                                break;
+                            case SUBJECT_HEADER:
+                                leaderPush = bind ? UserPushResultEnum.BIND_FAILED : UserPushResultEnum.UNBIND_FAILED;
+                                syncExceptionCell = "【" + RoleTypeEnum.MARKER_LEADER.getDesc() + leaderPush.getDesc() + "】" + errorMessage + "\n";
+                                break;
+                        }
+                    }
+                    if (SystemConstant.strNotNull(syncExceptionCell)) {
+                        syncException = syncException + syncExceptionCell;
+                    }
+                }
+            } catch (Exception e) {
+                syncException = syncException + e.getMessage();
+            } finally {
+                // 更新'sys_user'表
+                UpdateWrapper<SysUser> sysUserUpdateWrapper = new UpdateWrapper<>();
+                sysUserUpdateWrapper.lambda().eq(SysUser::getId, userId);
+                sysUserUpdateWrapper.lambda().set(SysUser::getSyncStatus, syncStatus);
+                if (Objects.nonNull(markerPush)) {
+                    sysUserUpdateWrapper.lambda().set(SysUser::getMarkerStatus, markerPush);
+                }
+                if (Objects.nonNull(leaderPush)) {
+                    sysUserUpdateWrapper.lambda().set(SysUser::getMarkerLeaderStatus, leaderPush);
+                }
+                sysUserService.update(sysUserUpdateWrapper);
+                // 更新't_b_sync_task'表
+                if (SystemConstant.strNotNull(syncException)) {
+                    tbSyncTaskDto.setResult(TaskResultEnum.ERROR.name());
+                    tbSyncTaskDto.setErrorMessage("用户【" + sysUserService.getById(userId).getLoginName() + "】推送失败\n" + syncException);
+                } else {
+                    tbSyncTaskDto.setResult(TaskResultEnum.SUCCESS.name());
+                }
+                tbSyncTaskDto.setStatus(TaskStatusEnum.FINISH.name());
+                tbSyncTaskDto.updateInfo(requestUser.getId());
+                cloudUserPushOperateService.saveOrUpdateTBSyncTask(tbSyncTaskDto);
+            }
+        }
+    }
+
+    /**
+     * 构建用户推送map
+     * @param sysUserList 用户集合
+     * @param schoolId 学校id
+     * @return k -> userId v-> List<UserPushParam> 有且只有两条记录
+     */
+    private Map<Long, List<UserPushParam>> buildUserPushMap(List<SysUser> sysUserList, Long schoolId) {
+        Map<Long, List<UserPushParam>> userPushMap = new HashMap<>();
+
+        for (SysUser sysUser : sysUserList) {
+            // 用户基础信息
+            Long userId = sysUser.getId();
+            String loginName = sysUser.getLoginName();
+            String realName = sysUser.getRealName();
+            String password = "123456";
+
+            // 用户推送相关信息
+            boolean enable = sysUser.getEnable();
+            SyncStatusEnum syncStatus = sysUser.getSyncStatus();
+            boolean isMarker = this.includeSysRole(userId, RoleTypeEnum.MARKER);
+            boolean isLeader = this.includeSysRole(userId, RoleTypeEnum.MARKER_LEADER);
+
+            // 初始化推送对象
+            List<UserPushParam> userPushParamList = new ArrayList<>();
+            UserPushParam marker = new UserPushParam();
+            marker.setUserId(userId);
+            marker.setSchoolId(schoolId);
+            marker.setName(realName);
+            marker.setPassword(password);
+            marker.setRole(SpecialPrivilegeEnum.MARKER);
+            marker.setAccount(SpecialPrivilegeEnum.MARKER.getPrefix() + loginName);
+            marker.setEnable(false); // 给默认状态关闭
+
+            UserPushParam leader = new UserPushParam();
+            leader.setUserId(userId);
+            leader.setSchoolId(schoolId);
+            leader.setName(realName);
+            leader.setPassword(password);
+            leader.setRole(SpecialPrivilegeEnum.SUBJECT_HEADER);
+            leader.setAccount(SpecialPrivilegeEnum.SUBJECT_HEADER.getPrefix() + loginName);
+            leader.setEnable(false); // 给默认状态关闭
+
+            // 如果当前用户有评卷员角色
+            if (isMarker) {
+                // 如果用户是启用状态就绑定,禁用就解绑
+                marker.setEnable(enable);
+            }
+            // 如果当前用户有科组长角色
+            if (isLeader) {
+                // 如果用户是启用状态就绑定,禁用就解绑
+                leader.setEnable(enable);
+            }
+            // 如果当前用户既不是评卷员,也不是科组长,根据用户推送状态判断
+            if (!isMarker && !isLeader) {
+                // 如果该用户曾经推送过,则推送评卷员和科组长的解绑。
+                if (SyncStatusEnum.ALREADY_PUSH.equals(syncStatus) || SyncStatusEnum.NEED_PUSH_AGAIN.equals(syncStatus)) {
+                    // 评卷员解绑
+                    marker.setEnable(false);
+
+                    // 科组长解绑
+                    leader.setEnable(false);
+                } else {
+                    // 该用户曾经就不包含云阅卷特殊角色,现在也不包含云阅卷特殊角色
+                    marker = null;
+                    leader = null;
+                }
+            }
+            if (Objects.nonNull(marker)) {
+                userPushParamList.add(marker);
+                userPushParamList.add(leader);
+                userPushMap.put(userId, userPushParamList);
+            }
+        }
+        return userPushMap;
+    }
+}

+ 5 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysOrgServiceImpl.java

@@ -400,7 +400,11 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
         for (String orgInfo : orgInfoList) {
             // 父机构id
             Long schoolId = requestUser.getSchoolId();
-            Long parentId = requestUser.getSchoolId();
+            List<SysOrg> topLevelOrg = this.list(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getSchoolId,schoolId).eq(SysOrg::getType,OrgTypeEnum.SCHOOL));
+            if (topLevelOrg.size() != 1){
+                throw ExceptionResultEnum.ERROR.exception("顶级机构信息获取异常");
+            }
+            Long parentId = topLevelOrg.get(0).getId();
 
             String[] arr = orgInfo.split(SystemConstant.ORG_SPLIT);
             for (int i = 0; i < arr.length; i++) {

+ 20 - 39
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java

@@ -112,6 +112,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Resource
     SysRoleGroupMemberService sysRoleGroupMemberService;
 
+    @Resource
+    CloudUserPushService cloudUserPushService;
+
     @Override
     public IPage<UserDto> list(String loginName, String roleId, Boolean enable, String realName, Integer pageNumber, Integer pageSize) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
@@ -134,27 +137,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     @Transactional
     @Override
-    public boolean saveUser(UserSaveParams userSaveParams) throws IllegalAccessException {
-        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        Long oldId = userSaveParams.getId();
-        Set<Long> dbRoleIdSet = new HashSet<>();
-        Set<Long> currentRoleIdSet = new HashSet<>(Arrays.asList(userSaveParams.getRoleIds()));
-        if (SystemConstant.longNotNull(oldId)) {
-            // 编辑
-            dbRoleIdSet = new HashSet<>(sysRoleService.getUserRoles(oldId));
-        }
-        boolean result = false;
-        Long upUserId = saveUserCommon(userSaveParams, null);
-        if (SystemConstant.longNotNull(upUserId)) {
-            result = true;
-            //todo 云阅卷推送暂时去掉
-//            List<PushUserTrack> pushUserTrackList = pushUserTrackService.createPushTrackUser(dbRoleIdSet, currentRoleIdSet, upUserId, this.getById(upUserId).getEnable(), requestUser.getId());
-//            List<UserPushParam> userPushParamList = pushUserTrackService.analyzeUserPushSpecialPrivilege(pushUserTrackList);
-//            if (userPushParamList != null && userPushParamList.size() > 0) {
-//                this.userPushService(userPushParamList, requestUser.getId());
-//            }
-        }
-        return result;
+    public Long saveUser(UserSaveParams userSaveParams) {
+        return saveUserCommon(userSaveParams, null);
     }
 
     /**
@@ -705,7 +689,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     public Map<String, Object> executeSysUserImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map) {
         SysUser requestUser = (SysUser) map.get(SystemConstant.SYS_USER);
         Long schoolId = requestUser.getSchoolId();
-        List<UserPushParam> userPushParamList = new ArrayList<>();
+        List<Long> userIdList = new ArrayList<>();
         for (int i = 0; i < finalList.size(); i++) {
             LinkedMultiValueMap<Integer, Object> excelMap = finalList.get(i);
             List<Object> sysUserImportDtoList = excelMap.get(i);
@@ -730,7 +714,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                     String code = sysUserImportDto.getCode();
                     String phoneNumber = sysUserImportDto.getPhoneNumber();
                     String orgName = sysUserImportDto.getOrgName();
-                    if (!orgInfoMap.containsKey(orgName)){
+                    if (!orgInfoMap.containsKey(orgName)) {
                         throw ExceptionResultEnum.ERROR.exception("在解析的机构map集合中,没有找到excel数据中的用户机构名称【" + orgName + "】");
                     }
                     // 直接解析机构id
@@ -764,19 +748,11 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                     userSaveParams.setCode(code);
                     userSaveParams.setSchoolId(schoolId);
                     Long upUserId = this.saveUserCommon(userSaveParams, requestUser.getId());
-                    if (SystemConstant.longNotNull(upUserId)) {
-
-                        Set<Long> currentRoleIdSet = new HashSet<>(Arrays.asList(userSaveParams.getRoleIds()));
-                        List<PushUserTrack> pushUserTrackList = pushUserTrackService.createPushTrackUser(oldRoleIdSet, currentRoleIdSet, upUserId, true, requestUser.getId());
-                        List<UserPushParam> userPushParamCell = pushUserTrackService.analyzeUserPushSpecialPrivilege(pushUserTrackList);
-                        if (userPushParamCell != null && userPushParamCell.size() > 0) {
-                            userPushParamList.addAll(userPushParamCell);
-                        }
-                    }
+                    userIdList.add(upUserId);
                 }
             }
         }
-        map.put("userPushParamList", userPushParamList);
+        map.put("userIdList", userIdList);
         return map;
     }
 
@@ -854,6 +830,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     @Transactional
     @Override
+    @Deprecated
     public boolean userPushService(List<UserPushParam> userPushParamList, Long requestUserId) throws IllegalAccessException {
         SysUser requestUser = this.getById(requestUserId);
         if (Objects.isNull(requestUser)) {
@@ -862,7 +839,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         }
         boolean result = true;
         for (UserPushParam userPushParam : userPushParamList) {
-            boolean syncResult = stmmsUtils.syncUser(userPushParam);
+            boolean syncResult = stmmsUtils.syncUser(userPushParam).getSuccess();
             if (!syncResult) {
                 log.warn("-----------------------------用户同步推送失败----------------------------");
                 result = false;
@@ -1158,7 +1135,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         userBatchDisposeResult.setUserList(userList);
         userBatchDisposeResult.setUserRoleList(sysUserRoleList);
         userBatchDisposeResult.setRemoveIdSet(willRemoveUserPri);
-
         userBatchDisposeResult.setUpdateIdSet(willUpdateUserPri);
 
         return userBatchDisposeResult;
@@ -1190,10 +1166,14 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         LinkedHashSet<Long> roleIdList = new LinkedHashSet<>();
         String[] arr = roleName.split(SystemConstant.COMMA);
         for (String cell : arr) {
-            SysRole sysRole = sysRoleService.getOne(new QueryWrapper<SysRole>().lambda()
-                    .eq(SysRole::getEnable, true)
-                    .eq(SysRole::getName, cell)
-                    .eq(SysRole::getSchoolId, schoolId));
+            QueryWrapper<SysRole> sysRoleQueryWrapper = new QueryWrapper<>();
+            sysRoleQueryWrapper.lambda().eq(SysRole::getEnable, true)
+                    .eq(SysRole::getName, cell);
+            if (Objects.isNull(RoleTypeEnum.convertDescToEnum(cell))) {
+                // 自定义角色带学校id查
+                sysRoleQueryWrapper.lambda().eq(SysRole::getSchoolId, schoolId);
+            }
+            SysRole sysRole = sysRoleService.getOne(sysRoleQueryWrapper);
             if (Objects.isNull(sysRole)) {
                 throw ExceptionResultEnum.ERROR.exception("系统中不存在excel导入的角色【" + cell + "】");
             }
@@ -1209,6 +1189,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
      * @param enable        启用/禁用
      * @param requestUserId 请求人id
      */
+    @Deprecated
     private void analyzeUserEnableSpecialPrivilege(Long userId, boolean enable, Long requestUserId) throws IllegalAccessException {
         SysUser dbUser = sysUserService.getById(userId);
         if (Objects.isNull(dbUser)) {

+ 7 - 4
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java

@@ -284,15 +284,18 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
                 } else {
                     BasicSchool tbSchool = Objects.nonNull(user.getSchoolId()) ? commonCacheService.schoolCache(user.getSchoolId()) : null;
                     SysOrg org = Objects.nonNull(user.getOrgId()) ? commonCacheService.orgCache(user.getOrgId()) : null;
-                    sysPrivilegeQueryWrapper.lambda().in(SysPrivilege::getId, privilegeIds)
-                            .eq(SysPrivilege::getType, PrivilegeEnum.URL)
-                            .eq(SysPrivilege::getProperty, PrivilegePropertyEnum.AUTH);
+                    List<SysPrivilege> sysPrivilegeList = new ArrayList<>();
+                    if (privilegeIds.size() > 0){
+                        sysPrivilegeQueryWrapper.lambda().in(SysPrivilege::getId, privilegeIds)
+                                .eq(SysPrivilege::getType, PrivilegeEnum.URL)
+                                .eq(SysPrivilege::getProperty, PrivilegePropertyEnum.AUTH);
+                        sysPrivilegeList = sysPrivilegeService.list(sysPrivilegeQueryWrapper);
+                    }
 //                    if (Objects.isNull(tbSchool)) {
 //                        sysPrivilegeQueryWrapper.lambda().isNull(SysPrivilege::getSchoolId);
 //                    } else {
 //                        sysPrivilegeQueryWrapper.lambda().eq(SysPrivilege::getSchoolId, user.getSchoolId());
 //                    }
-                    List<SysPrivilege> sysPrivilegeList = sysPrivilegeService.list(sysPrivilegeQueryWrapper);
                     authBean = new AuthBean(sysRoleList, sysPrivilegeList.stream().map(s -> s.getUrl()).collect(Collectors.toSet()), tbSchool, org);
                 }
             }

+ 13 - 7
teachcloud-common/src/main/java/com/qmth/teachcloud/common/sync/CloudMarkingTaskUtils.java

@@ -6,6 +6,7 @@ import com.qmth.teachcloud.common.SignatureEntityTest;
 import com.qmth.teachcloud.common.bean.dto.stmms.*;
 import com.qmth.teachcloud.common.bean.params.UserPushParam;
 import com.qmth.teachcloud.common.bean.result.DBVerifyResult;
+import com.qmth.teachcloud.common.bean.result.PushResult;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicSchool;
@@ -14,6 +15,7 @@ import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.SyncFileTypeEnum;
 import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.util.HttpKit;
+import com.qmth.teachcloud.common.util.Result;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -90,7 +92,7 @@ public class CloudMarkingTaskUtils {
         }
     }
 
-    public boolean syncUser(UserPushParam userPushParam) throws IllegalAccessException {
+    public PushResult syncUser(UserPushParam userPushParam) throws IllegalAccessException {
         DBVerifyResult verifyResult = SystemConstant.verifyDBFields(userPushParam, userPushParam.getClass());
         if (!verifyResult.getStatus()) {
             throw ExceptionResultEnum.ERROR.exception(verifyResult.getMessage());
@@ -113,19 +115,23 @@ public class CloudMarkingTaskUtils {
         map.put("password", validParam(password, null, false, "密码"));
         map.put("role", validParam(String.valueOf(roleValue), null, true, "类型:MARKER、SUBJECT_HEADER"));
         map.put("enable", validParam(enable, true, false, "是否启用"));
+
+        PushResult pushResult = new PushResult();
+        boolean pushStatus = false;
+        String errorMessage = "";
         try {
             String result = HttpKit.sendPost(postUrl, getHeaders(schoolId, userSaveUrl), map, null, null, null);
             JSONObject jsonObject = JSONObject.parseObject(result);
             if (jsonObject.containsKey("updateTime")) {
-                return true;
-            } else {
-                log.warn("用户推送(同步)失败");
-                return false;
+                pushStatus = true;
             }
         } catch (Exception e) {
-            log.error(SystemConstant.LOG_ERROR, e);
-            return false;
+            errorMessage = e.getMessage();
+        } finally {
+            pushResult.setSuccess(pushStatus);
+            pushResult.setMessage(errorMessage);
         }
+        return pushResult;
     }
 
     /**

+ 151 - 0
teachcloud-common/src/main/resources/mapper/CloudUserPushOperateMapper.xml

@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.teachcloud.common.mapper.CloudUserPushOperateMapper">
+
+    <insert id="insertTBSyncTask">
+        INSERT INTO t_b_sync_task
+        SET
+            id = #{tbSyncTaskDto.id},
+            school_id = #{tbSyncTaskDto.schoolId},
+            org_id = #{tbSyncTaskDto.orgId},
+            type = #{tbSyncTaskDto.type},
+            third_relate_id = #{tbSyncTaskDto.thirdRelateId},
+            object_id = #{tbSyncTaskDto.objectId},
+            status = #{tbSyncTaskDto.status},
+            summary = #{tbSyncTaskDto.summary},
+            result = #{tbSyncTaskDto.result},
+            create_id = #{tbSyncTaskDto.createId},
+            create_time = #{tbSyncTaskDto.createTime},
+            update_id = #{tbSyncTaskDto.updateId},
+            update_time = #{tbSyncTaskDto.updateTime},
+            remark = #{tbSyncTaskDto.remark},
+            reset_count = #{tbSyncTaskDto.resetCount},
+            error_message = #{tbSyncTaskDto.errorMessage},
+            report_file_path = #{tbSyncTaskDto.reportFilePath}
+
+    </insert>
+    <update id="updateTBSyncTask">
+        UPDATE t_b_sync_task
+        <set>
+            <if test="tbSyncTaskDto.schoolId != null and tbSyncTaskDto.schoolId != ''">
+                school_id = #{tbSyncTaskDto.schoolId},
+            </if>
+
+            <if test="tbSyncTaskDto.orgId != null and tbSyncTaskDto.orgId != ''">
+                org_id = #{tbSyncTaskDto.orgId},
+            </if>
+
+            <if test="tbSyncTaskDto.type != null and tbSyncTaskDto.type != ''">
+                type = #{tbSyncTaskDto.type},
+            </if>
+
+            <if test="tbSyncTaskDto.thirdRelateId != null and tbSyncTaskDto.thirdRelateId != ''">
+                third_relate_id = #{tbSyncTaskDto.thirdRelateId},
+            </if>
+
+            <if test="tbSyncTaskDto.objectId != null and tbSyncTaskDto.objectId != ''">
+                object_id = #{tbSyncTaskDto.objectId},
+            </if>
+
+            <if test="tbSyncTaskDto.status != null and tbSyncTaskDto.status != ''">
+                status = #{tbSyncTaskDto.status},
+            </if>
+
+            <if test="tbSyncTaskDto.summary != null and tbSyncTaskDto.summary != ''">
+                summary = #{tbSyncTaskDto.summary},
+            </if>
+
+            <if test="tbSyncTaskDto.createId != null and tbSyncTaskDto.createId != ''">
+                create_id = #{tbSyncTaskDto.createId},
+            </if>
+
+            <if test="tbSyncTaskDto.createTime != null and tbSyncTaskDto.createTime != ''">
+                create_time = #{tbSyncTaskDto.createTime},
+            </if>
+
+            <if test="tbSyncTaskDto.schoolId != null and tbSyncTaskDto.schoolId != ''">
+                update_id = #{tbSyncTaskDto.updateId},
+            </if>
+
+            <if test="tbSyncTaskDto.schoolId != null and tbSyncTaskDto.schoolId != ''">
+                update_time = #{tbSyncTaskDto.updateTime},
+            </if>
+
+            <if test="tbSyncTaskDto.schoolId != null and tbSyncTaskDto.schoolId != ''">
+                remark = #{tbSyncTaskDto.remark},
+            </if>
+
+            <if test="tbSyncTaskDto.schoolId != null and tbSyncTaskDto.schoolId != ''">
+                reset_count = #{tbSyncTaskDto.resetCount},
+            </if>
+
+            <if test="tbSyncTaskDto.schoolId != null and tbSyncTaskDto.schoolId != ''">
+                error_message = #{tbSyncTaskDto.errorMessage},
+            </if>
+
+            <if test="tbSyncTaskDto.schoolId != null and tbSyncTaskDto.schoolId != ''">
+                report_file_path = #{tbSyncTaskDto.reportFilePath},
+            </if>
+            result = #{tbSyncTaskDto.result}
+        </set>
+        <where>
+            id = #{tbSyncTaskDto.id}
+        </where>
+    </update>
+    <select id="findById" resultType="com.qmth.teachcloud.common.bean.dto.TBSyncTaskDto">
+        SELECT
+            id,
+            school_id AS schoolId,
+            org_id AS orgId,
+            type,
+            third_relate_id AS thirdRelateId,
+            object_id AS objectId,
+            status,
+            summary,
+            result,
+            create_id AS createId,
+            create_time AS createTime,
+            update_id AS updateId,
+            update_time AS updateTime,
+            remark,
+            reset_count AS resetCount,
+            error_message AS errorMessage,
+            report_file_path AS reportFilePath
+        FROM
+            t_b_sync_task
+        WHERE id = #{id}
+    </select>
+    <select id="findPushRecord" resultType="com.qmth.teachcloud.common.bean.dto.TBSyncTaskDto">
+        SELECT
+            id,
+            school_id AS schoolId,
+            org_id AS orgId,
+            type,
+            third_relate_id AS thirdRelateId,
+            object_id AS objectId,
+            status,
+            summary,
+            result,
+            create_id AS createId,
+            create_time AS createTime,
+            update_id AS updateId,
+            update_time AS updateTime,
+            remark,
+            reset_count AS resetCount,
+            error_message AS errorMessage,
+            report_file_path AS reportFilePath
+        FROM
+            t_b_sync_task
+        <where>
+            <if test="schoolId != null and schoolId != ''">
+                AND school_id = #{schoolId}
+            </if>
+            <if test="objectId != null and objectId != ''">
+                AND object_id = #{objectId}
+            </if>
+            <if test="type != null and type != ''">
+                AND type = #{type}
+            </if>
+        </where>
+    </select>
+</mapper>

+ 2 - 0
teachcloud-common/src/main/resources/mapper/SysUserMapper.xml

@@ -46,6 +46,8 @@
             a.remark,
             a.org_id orgId,
             a.code code,
+            a.marker_status as markerStatus,
+            a.marker_leader_status as markerLeaderStatus,
             b.name orgName
         FROM
             sys_user a