Эх сурвалжийг харах

fix: 用户同步 - 引入轨迹表

caozixuan 3 жил өмнө
parent
commit
658edbd94c

+ 3 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncSysUserDataImportService.java

@@ -5,21 +5,18 @@ 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;
 import com.qmth.teachcloud.common.bean.params.UserPushParam;
-import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
 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.TaskResultEnum;
 import com.qmth.teachcloud.common.enums.TaskStatusEnum;
-import com.qmth.teachcloud.common.service.CallApiOrgCenterService;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.service.TBTaskService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -30,7 +27,6 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.StringJoiner;
-import java.util.stream.Collectors;
 
 /**
  * @Description: 系统用户批量导入
@@ -66,7 +62,9 @@ public class AsyncSysUserDataImportService extends AsyncImportTaskTemplete {
             SysUser sysUser = (SysUser) map.get(SystemConstant.SYS_USER);
             Long schoolId = sysUser.getSchoolId();
             List<UserPushParam> userPushParamList = (List<UserPushParam>) result.get("userPushParamList");
-            sysUserService.userPushService(userPushParamList,sysUser);
+            if (userPushParamList != null && userPushParamList.size() > 0){
+                sysUserService.userPushService(userPushParamList,sysUser.getId());
+            }
 
             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);

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

@@ -8,18 +8,14 @@ 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.PushBeforeRoleParam;
 import com.qmth.teachcloud.common.bean.params.UserPushParam;
 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.BeforeJudgeEnum;
 import com.qmth.teachcloud.common.enums.userPush.SyncStatusEnum;
-import com.qmth.teachcloud.common.service.BasicClazzService;
-import com.qmth.teachcloud.common.service.SysOrgService;
-import com.qmth.teachcloud.common.service.SysUserRoleService;
-import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.sync.StmmsUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,6 +44,9 @@ public class PushLogicServiceImpl implements PushLogicService {
     @Resource
     StmmsUtils stmmsUtils;
 
+    @Resource
+    private PushUserTrackService pushUserTrackService;
+
     @Resource
     SysOrgService sysOrgService;
 
@@ -73,9 +72,10 @@ public class PushLogicServiceImpl implements PushLogicService {
         count = sysUserList.size();
         for (SysUser user : sysUserList) {
             Set<Long> roleIdSet = sysUserRoleService.listRoleByUserId(user.getId()).stream().map(BaseEntity::getId).collect(Collectors.toSet());
-            PushBeforeRoleParam pushBeforeRoleParam = new PushBeforeRoleParam(null, BeforeJudgeEnum.FORBIDDEN_NECESSARY);
-            List<UserPushParam> userPushParamList = sysUserService.analyzeUserPushSpecialPrivilege(user.getId(), user.getSchoolId(), user.getCode(), user.getRealName(), user.getPassword(), roleIdSet, pushBeforeRoleParam, user.getEnable());
-            boolean syncResult = sysUserService.userPushService(userPushParamList, sysUser);
+            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++;
             }

+ 20 - 6
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/PushUserTrack.java

@@ -3,6 +3,8 @@ package com.qmth.teachcloud.common.entity;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.base.BaseEntity;
+import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
+import com.qmth.teachcloud.common.enums.userPush.UserPushTrackEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -25,11 +27,15 @@ public class PushUserTrack extends BaseEntity implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long userId;
 
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
     @ApiModelProperty(value = "身份 SpecialPrivilegeEnum: SUBJECT_HEADER('科组长权限','SubjectHeader','S_', 4), MARKER('评卷员权限','Marker','M_', 5),")
-    private String identify;
+    private SpecialPrivilegeEnum identify;
 
     @ApiModelProperty(value = "操作 UserPushTrackEnum: BIND('绑定') UNBIND('解绑') ")
-    private String operate;
+    private UserPushTrackEnum operate;
 
     public static long getSerialVersionUID() {
         return serialVersionUID;
@@ -43,19 +49,27 @@ public class PushUserTrack extends BaseEntity implements Serializable {
         this.userId = userId;
     }
 
-    public String getIdentify() {
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public SpecialPrivilegeEnum getIdentify() {
         return identify;
     }
 
-    public void setIdentify(String identify) {
+    public void setIdentify(SpecialPrivilegeEnum identify) {
         this.identify = identify;
     }
 
-    public String getOperate() {
+    public UserPushTrackEnum getOperate() {
         return operate;
     }
 
-    public void setOperate(String operate) {
+    public void setOperate(UserPushTrackEnum operate) {
         this.operate = operate;
     }
 }

+ 39 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/userPush/UserPushTrackEnum.java

@@ -0,0 +1,39 @@
+package com.qmth.teachcloud.common.enums.userPush;
+
+import java.util.Objects;
+
+/**
+ * @Description: 用户推送轨迹枚举
+ * @Author: CaoZixuan
+ * @Date: 2021-11-04
+ */
+public enum UserPushTrackEnum {
+    BIND("绑定"),
+    UNBIND("解绑"),
+    ;
+
+    UserPushTrackEnum(String desc) {
+        this.desc = desc;
+    }
+
+    private final String desc;
+
+    public String getDesc() {
+        return desc;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param desc desc
+     * @return 名称
+     */
+    public static String convertToName(String desc) {
+        for (UserPushTrackEnum e : UserPushTrackEnum.values()) {
+            if (Objects.equals(desc, e.getDesc())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+}

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

@@ -1,8 +1,12 @@
 package com.qmth.teachcloud.common.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.bean.params.UserPushParam;
 import com.qmth.teachcloud.common.entity.PushUserTrack;
 
+import java.util.List;
+import java.util.Set;
+
 /**
  * <p>
  * 用户推送轨迹表 服务类
@@ -13,4 +17,23 @@ import com.qmth.teachcloud.common.entity.PushUserTrack;
  */
 public interface PushUserTrackService extends IService<PushUserTrack> {
 
+
+    /**
+     * 创建用户推送轨迹记录(用户前后角色对比创建)
+     *
+     * @param currentRoleIdSet 当前用户角色集合
+     * @param userId           当前用户主键
+     * @param enable           启用/禁用
+     * @return 该用户推送轨迹记录集合(0条或2条)
+     */
+    List<PushUserTrack> createPushTrackUser(Set<Long> dbRoleIdSet, Set<Long> currentRoleIdSet, Long userId, boolean enable,Long requestUserId);
+
+
+    /**
+     * 根据用户推送轨迹记录解析用户推送数据
+     *
+     * @param pushUserTrackList 该用户推送轨迹记录集合(0条或2条)
+     * @return 组装好的用户推送信息集合
+     */
+    List<UserPushParam> analyzeUserPushSpecialPrivilege(List<PushUserTrack> pushUserTrackList);
 }

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

@@ -6,7 +6,6 @@ import com.qmth.teachcloud.common.bean.dto.BlurryUserDto;
 import com.qmth.teachcloud.common.bean.dto.LoginDto;
 import com.qmth.teachcloud.common.bean.dto.UserDto;
 import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
-import com.qmth.teachcloud.common.bean.params.PushBeforeRoleParam;
 import com.qmth.teachcloud.common.bean.params.UserPushParam;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.bean.result.LoginResult;
@@ -41,14 +40,15 @@ public interface SysUserService extends IService<SysUser> {
     /**
      * 更新用户登录信息(密码、手机号)
      * <p>
-     *     1.判断用户在系统中是否存在
-     *     2.判断用户原密码是否正确
-     *     3.更新密码 -> 新旧密码不一致判断
-     *     4.更新手机 -> 检验验证码正确新(不为空、正确、未过期)、手机号唯一性校验
-     *     5.若用户已经登陆且进行了密码或手机号修改 -> 清空用户登录信息
-     *     6.如果不是共用验证码则过期该用户验证码
-     *     7.调用用户登录公共方法(验证码参数使用系统共用验证码)登录用户
+     * 1.判断用户在系统中是否存在
+     * 2.判断用户原密码是否正确
+     * 3.更新密码 -> 新旧密码不一致判断
+     * 4.更新手机 -> 检验验证码正确新(不为空、正确、未过期)、手机号唯一性校验
+     * 5.若用户已经登陆且进行了密码或手机号修改 -> 清空用户登录信息
+     * 6.如果不是共用验证码则过期该用户验证码
+     * 7.调用用户登录公共方法(验证码参数使用系统共用验证码)登录用户
      * </p>
+     *
      * @param user 用户信息
      * @return 登录信息
      * @throws NoSuchAlgorithmException 异常
@@ -162,10 +162,11 @@ public interface SysUserService extends IService<SysUser> {
 
     /**
      * 强行过期用户手机号验证码(过期时间改为验证码发送时间)
-     * @param userId 用户id
+     *
+     * @param userId       用户id
      * @param mobileNumber 用户手机号
      */
-    void expiredVerifyCode(Long userId,String mobileNumber);
+    void expiredVerifyCode(Long userId, String mobileNumber);
 
     /**
      * 获取教研室id底下的人数量
@@ -177,11 +178,12 @@ public interface SysUserService extends IService<SysUser> {
 
     /**
      * 用户推送云阅卷服务
+     *
      * @param userPushParamList 推送参数
-     * @param requestUser 请求的用户信息
+     * @param requestUserId       请求的用户id
      * @throws IllegalAccessException
      */
-    boolean userPushService(List<UserPushParam> userPushParamList,SysUser requestUser) throws IllegalAccessException;
+    boolean userPushService(List<UserPushParam> userPushParamList, Long requestUserId) throws IllegalAccessException;
 
     /**
      * 自动推送用户推送失败表用户到云阅卷
@@ -190,6 +192,7 @@ public interface SysUserService extends IService<SysUser> {
 
     /**
      * 查询用户角色id查询用户特殊权限
+     *
      * @param roleIdSet 用户角色id
      * @return 用户特殊权限身份
      */
@@ -197,23 +200,9 @@ public interface SysUserService extends IService<SysUser> {
 
     /**
      * 根据用户id查询当前用户的特殊权限
+     *
      * @param userId 用户id
      * @return 用户特殊权限身份
      */
     SpecialPrivilegeEnum findUserSpecialPrivilegeByUserId(Long userId);
-
-    /**
-     * 解析用户推送状态
-     *
-     * @param userId              用户id
-     * @param schoolId            学校id
-     * @param userCode            用户工号
-     * @param realName            用户真实姓名
-     * @param password            用户密码
-     * @param currentRoleIdSet    当前用户角色id集合
-     * @param pushBeforeRoleParam 用户推送策略参数
-     * @param enable              用户启用禁用状态
-     * @return 组装好的用户推送参数集合
-     */
-    List<UserPushParam> analyzeUserPushSpecialPrivilege(Long userId, Long schoolId, String userCode, String realName, String password, Set<Long> currentRoleIdSet, PushBeforeRoleParam pushBeforeRoleParam, boolean enable);
 }

+ 163 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/PushUserTrackServiceImpl.java

@@ -1,10 +1,26 @@
 package com.qmth.teachcloud.common.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.bean.params.UserPushParam;
 import com.qmth.teachcloud.common.entity.PushUserTrack;
+import com.qmth.teachcloud.common.entity.SysPrivilege;
+import com.qmth.teachcloud.common.entity.SysRolePrivilege;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
+import com.qmth.teachcloud.common.enums.userPush.UserPushTrackEnum;
 import com.qmth.teachcloud.common.mapper.PushUserTrackMapper;
 import com.qmth.teachcloud.common.service.PushUserTrackService;
+import com.qmth.teachcloud.common.service.SysPrivilegeService;
+import com.qmth.teachcloud.common.service.SysRolePrivilegeService;
+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.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -16,5 +32,152 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class PushUserTrackServiceImpl extends ServiceImpl<PushUserTrackMapper, PushUserTrack> implements PushUserTrackService {
+    @Resource
+    SysUserService sysUserService;
+    @Resource
+    SysPrivilegeService sysPrivilegeService;
+    @Resource
+    SysRolePrivilegeService sysRolePrivilegeService;
+
+
+    @Transactional
+    @Override
+    public List<PushUserTrack> createPushTrackUser(Set<Long> dbRoleIdSet, Set<Long> currentRoleIdSet, Long userId, boolean enable,Long requestUserId) {
+        List<PushUserTrack> pushUserTrackList = new ArrayList<>();
+        SysUser currentUser = sysUserService.getById(userId);
+        if (Objects.isNull(currentUser)) {
+            throw ExceptionResultEnum.ERROR.exception("用户不存在");
+        }
+        // 查询该学校特殊权限id
+        // 评卷员权限
+        SysPrivilege marker = sysPrivilegeService.list(new QueryWrapper<SysPrivilege>().lambda()
+                .eq(SysPrivilege::getUrl, SpecialPrivilegeEnum.MARKER.getId())).get(0);
+        Long markerId = marker.getId();
+
+        // 科组长权限
+        SysPrivilege subjectHeader = sysPrivilegeService.list(new QueryWrapper<SysPrivilege>().lambda()
+                .eq(SysPrivilege::getUrl, SpecialPrivilegeEnum.SUBJECT_HEADER.getId())).get(0);
+        Long subjectHeaderId = subjectHeader.getId();
+        if (currentRoleIdSet.size() > 0) {
+            List<SysRolePrivilege> sysRolePrivilegeList = sysRolePrivilegeService.list(new QueryWrapper<SysRolePrivilege>().lambda().in(SysRolePrivilege::getRoleId, currentRoleIdSet));
+            Set<Long> priIds = sysRolePrivilegeList.stream().map(SysRolePrivilege::getPrivilegeId).collect(Collectors.toSet());
+            if (priIds.size() > 0) {
+                PushUserTrack markerTrack = new PushUserTrack();
+                markerTrack.setUserId(userId);
+                markerTrack.setSchoolId(currentUser.getSchoolId());
+                markerTrack.setIdentify(SpecialPrivilegeEnum.MARKER);
+
+                PushUserTrack headerTrack = new PushUserTrack();
+                headerTrack.setUserId(userId);
+                headerTrack.setSchoolId(currentUser.getSchoolId());
+                headerTrack.setIdentify(SpecialPrivilegeEnum.SUBJECT_HEADER);
+
+                if (priIds.contains(markerId) && !priIds.contains(subjectHeaderId)) {
+
+                    // 当前角色权限为评卷员权限
+                    if (enable) {
+                        markerTrack.setOperate(UserPushTrackEnum.BIND);
+                    } else {
+                        markerTrack.setOperate(UserPushTrackEnum.UNBIND);
+                    }
+                    headerTrack.setOperate(UserPushTrackEnum.UNBIND);
+                } else if (!priIds.contains(markerId) && priIds.contains(subjectHeaderId)) {
+
+                    // 当前角色权限为科组长权限
+                    markerTrack.setOperate(UserPushTrackEnum.UNBIND);
+                    if (enable) {
+                        headerTrack.setOperate(UserPushTrackEnum.BIND);
+                    } else {
+                        headerTrack.setOperate(UserPushTrackEnum.UNBIND);
+                    }
+                } else if (priIds.contains(markerId) && priIds.contains(subjectHeaderId)) {
+
+                    // 当前角色权限为复合权限
+                    if (enable) {
+                        markerTrack.setOperate(UserPushTrackEnum.BIND);
+                        headerTrack.setOperate(UserPushTrackEnum.BIND);
+                    } else {
+                        markerTrack.setOperate(UserPushTrackEnum.UNBIND);
+                        headerTrack.setOperate(UserPushTrackEnum.UNBIND);
+                    }
+                } else {
+                    // 无特殊权限
+                    if (dbRoleIdSet != null && dbRoleIdSet.size() > 0) {
+                        // 可以获得原角色判断
+                        List<SysRolePrivilege> beforeSysRolePrivilegeList = sysRolePrivilegeService.list(new QueryWrapper<SysRolePrivilege>().lambda().in(SysRolePrivilege::getRoleId, dbRoleIdSet));
+                        Set<Long> beforePris = beforeSysRolePrivilegeList.stream().map(SysRolePrivilege::getPrivilegeId).collect(Collectors.toSet());
+                        if (beforePris.contains(markerId) || beforePris.contains(subjectHeaderId)) {
+                            // 如果该用户原先的角色且原先用户含有特殊角色,但新用户新角色一个都不含,要发送两个解绑
+                            markerTrack.setOperate(UserPushTrackEnum.UNBIND);
+                            headerTrack.setOperate(UserPushTrackEnum.UNBIND);
+                        } else {
+                            // 原先角色从没有过特殊权限,更新后的也没有(普通用户)
+                            markerTrack = null;
+                            headerTrack = null;
+                        }
+                    } else {
+                        // 无法获取原用户表角色 -> 去轨迹表查询
+                        List<PushUserTrack> specialUserCheck = this.list(new QueryWrapper<PushUserTrack>().lambda().eq(PushUserTrack::getUserId, userId));
+                        if (specialUserCheck.size() > 0) {
+                            // 该用户是特殊用户(就算现在不是曾经也是过)
+                            List<PushUserTrack> markerCheckList = specialUserCheck.stream().filter(e -> SpecialPrivilegeEnum.MARKER.equals(e.getIdentify())).sorted(Comparator.comparing(PushUserTrack::getCreateTime).reversed()).limit(1).collect(Collectors.toList());
+                            List<PushUserTrack> headerCheckList = specialUserCheck.stream().filter(e -> SpecialPrivilegeEnum.SUBJECT_HEADER.equals(e.getIdentify())).sorted(Comparator.comparing(PushUserTrack::getCreateTime).reversed()).limit(1).collect(Collectors.toList());
+                            if (markerCheckList.size() == 0 || headerCheckList.size() == 0) {
+                                throw ExceptionResultEnum.ERROR.exception("用户轨迹表数据异常");
+                            }
+                            markerTrack.setOperate(UserPushTrackEnum.UNBIND);
+                            headerTrack.setOperate(UserPushTrackEnum.UNBIND);
+                        } else {
+                            // 原先角色从没有过特殊权限,更新后的也没有(普通用户)
+                            markerTrack = null;
+                            headerTrack = null;
+                        }
+                    }
+                }
+                if (Objects.nonNull(markerTrack)) {
+                    markerTrack.insertInfo(requestUserId);
+                    pushUserTrackList.add(markerTrack);
+                    this.save(markerTrack);
+                }
+                if (Objects.nonNull(headerTrack)) {
+                    headerTrack.insertInfo(requestUserId);
+                    pushUserTrackList.add(markerTrack);
+                    this.save(headerTrack);
+                }
+            }
+        }
+        return pushUserTrackList;
+    }
+
+
+    @Transactional
+    @Override
+    public List<UserPushParam> analyzeUserPushSpecialPrivilege(List<PushUserTrack> pushUserTrackList) {
+        List<UserPushParam> userPushParamList = new ArrayList<>();
+        if (pushUserTrackList != null && pushUserTrackList.size() > 0) {
+            for (PushUserTrack pushUserTrack : pushUserTrackList) {
+                Long userId = pushUserTrack.getUserId();
+                SysUser currentUser = sysUserService.getById(userId);
+                SpecialPrivilegeEnum identify = pushUserTrack.getIdentify();
+                UserPushTrackEnum operate = pushUserTrack.getOperate();
+
+                UserPushParam cell = new UserPushParam();
+                cell.setUserId(userId);
+                cell.setName(currentUser.getRealName());
+                cell.setPassword(currentUser.getPassword());
+                cell.setRole(identify);
+                cell.setAccount(identify.getPrefix() + currentUser.getCode());
 
+                if (UserPushTrackEnum.BIND.equals(operate)) {
+                    // 绑定
+                    cell.setEnable(true);
+                } else {
+                    // 解绑
+                    cell.setEnable(false);
+                }
+                userPushParamList.add(cell);
+            }
+        }
+        return userPushParamList;
+    }
 }

+ 86 - 172
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java

@@ -17,7 +17,6 @@ import com.qmth.teachcloud.common.bean.dto.VerifyCodeCheckDto;
 import com.qmth.teachcloud.common.bean.dto.excel.DescribeImportDto;
 import com.qmth.teachcloud.common.bean.dto.excel.SysUserImportDto;
 import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
-import com.qmth.teachcloud.common.bean.params.PushBeforeRoleParam;
 import com.qmth.teachcloud.common.bean.params.UserPushParam;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.bean.result.LoginResult;
@@ -27,7 +26,6 @@ import com.qmth.teachcloud.common.contant.SpringContextHolder;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.*;
 import com.qmth.teachcloud.common.enums.*;
-import com.qmth.teachcloud.common.enums.userPush.BeforeJudgeEnum;
 import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
 import com.qmth.teachcloud.common.enums.userPush.SyncStatusEnum;
 import com.qmth.teachcloud.common.mapper.SysUserMapper;
@@ -37,7 +35,6 @@ import com.qmth.teachcloud.common.util.Base64Util;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -59,25 +56,25 @@ import java.util.stream.Collectors;
 @Service
 public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {
 
-    @Autowired
+    @Resource
     private SysRoleService sysRoleService;
 
-    @Autowired
+    @Resource
     private BasicCourseService basicCourseService;
 
-    @Autowired
+    @Resource
     private SysConfigService sysConfigService;
 
-    @Autowired
+    @Resource
     private SysUserRoleService sysUserRoleService;
 
-    @Autowired
+    @Resource
     private SysRolePrivilegeService sysRolePrivilegeService;
 
-    @Autowired
+    @Resource
     CommonCacheService commonCacheService;
 
-    @Autowired
+    @Resource
     private TeachcloudCommonService commonService;
 
     @Resource
@@ -102,10 +99,10 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     SysPrivilegeService sysPrivilegeService;
 
     @Resource
-    CallApiOrgCenterService callApiOrgCenterService;
+    PushUserErrorService pushUserErrorService;
 
     @Resource
-    PushUserErrorService pushUserErrorService;
+    PushUserTrackService pushUserTrackService;
 
     @Resource
     StmmsUtils stmmsUtils;
@@ -133,25 +130,29 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     @Transactional
     @Override
-    public boolean saveUser(UserSaveParams userSaveParams) throws IllegalAccessException {
+    public boolean saveUser(UserSaveParams userSaveParams) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         Long oldId = userSaveParams.getId();
-        Set<Long> roleIdSet = new HashSet<>();
+        Set<Long> dbRoleIdSet = new HashSet<>();
+        Set<Long> currentRoleIdSet = new HashSet<>(Arrays.asList(userSaveParams.getRoleIds()));
         if (SystemConstant.longNotNull(oldId)) {
             // 编辑
-            roleIdSet = new HashSet<>(sysRoleService.getUserRoles(oldId));
+            dbRoleIdSet = new HashSet<>(sysRoleService.getUserRoles(oldId));
         }
         boolean result = false;
         Long upUserId = saveUserCommon(userSaveParams, null);
         if (SystemConstant.longNotNull(upUserId)) {
             result = true;
-            PushBeforeRoleParam pushBeforeRoleParam = new PushBeforeRoleParam(roleIdSet, BeforeJudgeEnum.FORBIDDEN_BY_BEFORE_ROLE);
-            List<UserPushParam> userPushParamList = this.analyzeUserPushSpecialPrivilege(upUserId, requestUser.getSchoolId(), userSaveParams.getCode(), userSaveParams.getRealName(), userSaveParams.getPassword(), new HashSet<>(Arrays.asList(userSaveParams.getRoleIds())), pushBeforeRoleParam, userSaveParams.getEnable());
-            this.userPushService(userPushParamList, requestUser);
+            List<PushUserTrack> pushUserTrackList = pushUserTrackService.createPushTrackUser(dbRoleIdSet,currentRoleIdSet,upUserId,true,requestUser.getId());
+            List<UserPushParam> userPushParamList = pushUserTrackService.analyzeUserPushSpecialPrivilege(pushUserTrackList);
+            if (userPushParamList != null && userPushParamList.size() > 0){
+                this.userPushService(userPushParamList, requestUser.getId());
+            }
         }
         return result;
     }
 
+    @Transactional
     @Override
     public boolean enable(SysUser user) throws NoSuchAlgorithmException, IllegalAccessException {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
@@ -163,9 +164,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         if (!user.getEnable()) {
             commonService.removeUserInfo(user.getId(), true);
         }
-        List<UserPushParam> userPushParamList = this.analyzeUserEnableSpecialPrivilege(requestUser.getSchoolId(), user.getId(), user.getEnable());
         if (success) {
-            this.userPushService(userPushParamList, requestUser);
+            this.analyzeUserEnableSpecialPrivilege(user.getId(), user.getEnable(),requestUser.getId());
         }
         return success;
     }
@@ -439,9 +439,10 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     /**
      * 保存用户公用
      *
-     * @param userSaveParams
+     * @param userSaveParams userSaveParams
      * @return 新增或更新的用户id
      */
+    @Transactional
     public Long saveUserCommon(UserSaveParams userSaveParams, Long requestUserId) {
         SysUserService sysUserService = SpringContextHolder.getBean(SysUserService.class);
         boolean isSuccess = true;
@@ -542,7 +543,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             isSuccess = false;
             if (e instanceof DuplicateKeyException) {
                 String errorColumn = e.getCause().toString();
-                String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length()).replaceAll("'", "");
+                String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3).replaceAll("'", "");
                 throw ExceptionResultEnum.SQL_ERROR.exception("[" + FieldUniqueEnum.convertToTitle(columnStr) + "]数据不允许重复插入");
             } else if (e instanceof ApiException) {
                 ResultUtil.error((ApiException) e, e.getMessage());
@@ -550,9 +551,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 ResultUtil.error(e.getMessage());
             }
         }
-        if (!isSuccess) {
-            resultUserId = null;
-        }
         return resultUserId;
     }
 
@@ -603,12 +601,12 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 List<SysUserRole> sysUserRoleList = commonCacheService.userRolePrivilegeCache(sysUser.getId());
                 List<Long> userRolesList = Arrays.asList(userSaveParams.getRoleIds());
                 Set<Long> dbUserRolesList = sysUserRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet());
-                int count = (int) dbUserRolesList.stream().filter(s -> userRolesList.contains(s)).count();
+                int count = (int) dbUserRolesList.stream().filter(userRolesList::contains).count();
                 SysUser dbUser = sysUserService.getById(sysUser.getId());
                 sysUser.updateInfo(requestUser.getId());
                 sysUserService.updateById(sysUser);
                 List<SysRole> list = sysUserRoleService.listRoleByUserId(sysUser.getId());
-                boolean containsQuestionTeacher = list.stream().filter(m -> RoleTypeEnum.SCHOOL_ADMIN.equals(m.getType())).count() > 0;
+                boolean containsQuestionTeacher = list.stream().anyMatch(m -> RoleTypeEnum.SCHOOL_ADMIN.equals(m.getType()));
                 if (containsQuestionTeacher || count == 0 || dbUserRolesList.size() != userRolesList.size()) {
                     QueryWrapper<SysUserRole> sysUserRoleQueryWrapper = new QueryWrapper<>();
                     sysUserRoleQueryWrapper.lambda().eq(SysUserRole::getUserId, sysUser.getId());
@@ -664,22 +662,23 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     /**
      * 过滤拥有审核权限的人
      *
-     * @param schoolId
-     * @param orgIds
-     * @param filter
-     * @param approveName
-     * @param realName
-     * @return
+     * @param schoolId schoolId
+     * @param orgIds orgIds
+     * @param filter filter
+     * @param approveName approveName
+     * @param realName realName
+     * @return return
      */
     @Override
     public List<ApproveUserResult> filterFlowPrivilege(Long schoolId, Set<Long> orgIds, Boolean filter, FlowApproveNameEnum approveName, String realName) {
         return sysUserMapper.filterFlowPrivilege(schoolId, orgIds, filter, Objects.nonNull(approveName) ? approveName.getId() : null, realName);
     }
 
+    @Transactional
     @Override
-    public Map<String, Object> executeSysUserImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map) throws NoSuchAlgorithmException {
-        SysUser sysUser = (SysUser) map.get(SystemConstant.SYS_USER);
-        Long schoolId = sysUser.getSchoolId();
+    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<>();
         for (int i = 0; i < finalList.size(); i++) {
             LinkedMultiValueMap<Integer, Object> excelMap = finalList.get(i);
@@ -703,10 +702,10 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
                 SysUser oldUser = this.getOne(new QueryWrapper<SysUser>().lambda().eq(SysUser::getCode, code).eq(SysUser::getSchoolId, schoolId));
                 Long oldUserId = null;
-                Set<Long> oldRoleSet = new HashSet<>();
+                Set<Long> oldRoleIdSet = new HashSet<>();
                 if (Objects.nonNull(oldUser)) {
                     oldUserId = oldUser.getId();
-                    oldRoleSet = new HashSet<>(sysRoleService.getUserRoles(oldUserId));
+                    oldRoleIdSet = new HashSet<>(sysRoleService.getUserRoles(oldUserId));
                 }
                 String loginName = code;
                 if (SystemConstant.longNotNull(oldUserId)) {
@@ -723,11 +722,15 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 }
                 userSaveParams.setCode(code);
                 userSaveParams.setSchoolId(schoolId);
-                Long upUserId = this.saveUserCommon(userSaveParams, sysUser.getId());
+                Long upUserId = this.saveUserCommon(userSaveParams, requestUser.getId());
                 if (SystemConstant.longNotNull(upUserId)) {
-                    PushBeforeRoleParam pushBeforeRoleParam = new PushBeforeRoleParam(oldRoleSet, BeforeJudgeEnum.FORBIDDEN_BY_BEFORE_ROLE);
-                    List<UserPushParam> pushCellList = this.analyzeUserPushSpecialPrivilege(upUserId, schoolId, userSaveParams.getCode(), userSaveParams.getRealName(), userSaveParams.getPassword(), new HashSet<>(Arrays.asList(userSaveParams.getRoleIds())), pushBeforeRoleParam, true);
-                    userPushParamList.addAll(pushCellList);
+
+                    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);
+                    }
                 }
             }
         }
@@ -763,9 +766,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     /**
      * 获取命题审批人
      *
-     * @param courseCode
-     * @param realName
-     * @return
+     * @param courseCode courseCode
+     * @param realName realName
+     * @return return
      */
     @Override
     public List<ApproveUserResult> findByAssignApprove(String courseCode, String realName) {
@@ -786,9 +789,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     /**
      * 获取教研室主任审批人
      *
-     * @param courseCode
-     * @param realName
-     * @return
+     * @param courseCode courseCode
+     * @param realName realName
+     * @return return
      */
     @Override
     public List<ApproveUserResult> findByDirectorApprove(String courseCode, String realName) {
@@ -816,9 +819,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     /**
      * 获取院长审批人
      *
-     * @param orgIds
-     * @param realName
-     * @return
+     * @param orgIds orgIds
+     * @param realName realName
+     * @return return
      */
     @Override
     public List<ApproveUserResult> findByPresidentApprove(List<Long> orgIds, String realName) {
@@ -842,11 +845,11 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     /**
      * 获取同级别下一级审批人
      *
-     * @param courseCode
-     * @param orgIds
-     * @param realName
-     * @param flowApproveNameEnum
-     * @return
+     * @param courseCode courseCode
+     * @param orgIds orgIds
+     * @param realName realName
+     * @param flowApproveNameEnum flowApproveNameEnum
+     * @return return
      */
     @Override
     public List<ApproveUserResult> findByRootApprove(String courseCode, List<Long> orgIds, String realName, FlowApproveNameEnum flowApproveNameEnum) {
@@ -865,7 +868,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 throw ExceptionResultEnum.ERROR.exception("课程机构为空");
             }
             List<SysOrg> sysOrgList = sysOrgService.findByConnectByParentId(basicCourse.getTeachingRoomId(), true, true);
-            orgIdsSet.addAll(sysOrgList.stream().map(s -> s.getId()).collect(Collectors.toSet()));
+            orgIdsSet.addAll(sysOrgList.stream().map(BaseEntity::getId).collect(Collectors.toSet()));
         } else {
             orgIdsSet.addAll(orgIds);
         }
@@ -935,7 +938,12 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     @Transactional
     @Override
-    public boolean userPushService(List<UserPushParam> userPushParamList, SysUser requestUser) {
+    public boolean userPushService(List<UserPushParam> userPushParamList, Long requestUserId) {
+        SysUser requestUser = this.getById(requestUserId);
+        if (Objects.isNull(requestUser)){
+            log.error("未找到请求用户信息 requestUserId = " + requestUserId);
+            throw ExceptionResultEnum.ERROR.exception("未找到请求用户信息");
+        }
         boolean result = true;
         for (UserPushParam userPushParam : userPushParamList) {
             boolean syncResult = stmmsUtils.syncUser(userPushParam, requestUser.getSchoolId());
@@ -962,7 +970,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     @Transactional
     @Override
-    public void autoPushUserErrorData() throws IllegalAccessException {
+    public void autoPushUserErrorData() {
         List<PushUserError> pushUserErrorList = pushUserErrorService.list();
         Set<Long> userIdSet = pushUserErrorList.stream().map(PushUserError::getUserId).collect(Collectors.toSet());
         List<SysUser> sysUserList = this.listByIds(userIdSet);
@@ -974,12 +982,12 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 Long userId = sysUser.getId();
                 Long schoolId = sysUser.getSchoolId();
                 Set<Long> roleIdSet = sysUserRoleService.listRoleByUserId(userId).stream().map(BaseEntity::getId).collect(Collectors.toSet());
-                PushBeforeRoleParam pushBeforeRoleParam = new PushBeforeRoleParam(null, BeforeJudgeEnum.FORBIDDEN_NECESSARY);
-                List<UserPushParam> userPushParamList = this.analyzeUserPushSpecialPrivilege(userId, schoolId, sysUser.getCode(), sysUser.getRealName(), sysUser.getPassword(), roleIdSet, pushBeforeRoleParam, sysUser.getEnable());
-                SysUser requestUser = new SysUser();
-                requestUser.setSchoolId(schoolId);
-                requestUser.setId(1L);
-                this.userPushService(userPushParamList, requestUser);
+
+                // TODO: 2021/11/4 系统管理员的id判断
+                Long requestUserId = 1L; // 系统管理员
+                List<PushUserTrack> pushUserTrackList = pushUserTrackService.createPushTrackUser(null,roleIdSet,userId,sysUser.getEnable(),requestUserId);
+                List<UserPushParam> userPushParamList = pushUserTrackService.analyzeUserPushSpecialPrivilege(pushUserTrackList);
+                this.userPushService(userPushParamList, requestUserId);
             }
         }
     }
@@ -1022,106 +1030,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return this.findUserSpecialPrivilegeByRoleIdSet(roleIdSet);
     }
 
-    /**
-     * 解析用户推送状态
-     *
-     * @param userId              用户id
-     * @param schoolId            学校id
-     * @param userCode            用户工号
-     * @param realName            用户真实姓名
-     * @param password            用户密码
-     * @param currentRoleIdSet    当前用户角色id集合
-     * @param pushBeforeRoleParam 用户推送策略参数
-     * @param enable              用户启用禁用状态
-     * @return 组装好的用户推送参数集合
-     */
-    @Transactional
-    @Override
-    public List<UserPushParam> analyzeUserPushSpecialPrivilege(Long userId, Long schoolId, String userCode, String realName, String password, Set<Long> currentRoleIdSet, PushBeforeRoleParam pushBeforeRoleParam, boolean enable) {
-        List<UserPushParam> userPushParamList = new ArrayList<>();
-        // 查询该学校特殊权限id
-        // 评卷员权限
-        SysPrivilege marker = sysPrivilegeService.list(new QueryWrapper<SysPrivilege>().lambda()
-                .eq(SysPrivilege::getUrl, SpecialPrivilegeEnum.MARKER.getId())).get(0);
-        Long markerId = marker.getId();
-
-        // 科组长权限
-        SysPrivilege subjectHeader = sysPrivilegeService.list(new QueryWrapper<SysPrivilege>().lambda()
-                .eq(SysPrivilege::getUrl, SpecialPrivilegeEnum.SUBJECT_HEADER.getId())).get(0);
-        Long subjectHeaderId = subjectHeader.getId();
-
-        if (currentRoleIdSet.size() > 0) {
-            List<SysRolePrivilege> sysRolePrivilegeList = sysRolePrivilegeService.list(new QueryWrapper<SysRolePrivilege>().lambda().in(SysRolePrivilege::getRoleId, currentRoleIdSet));
-            Set<Long> priIds = sysRolePrivilegeList.stream().map(SysRolePrivilege::getPrivilegeId).collect(Collectors.toSet());
-            if (priIds.size() > 0) {
-                UserPushParam markerCell = new UserPushParam();
-                markerCell.setUserId(userId);
-                markerCell.setName(realName);
-                markerCell.setPassword(password);
-                markerCell.setRole(SpecialPrivilegeEnum.MARKER);
-                markerCell.setAccount(SpecialPrivilegeEnum.MARKER.getPrefix() + userCode);
-
-                UserPushParam headerCell = new UserPushParam();
-                headerCell.setUserId(userId);
-                headerCell.setName(realName);
-                headerCell.setPassword(password);
-                headerCell.setRole(SpecialPrivilegeEnum.SUBJECT_HEADER);
-                headerCell.setAccount(SpecialPrivilegeEnum.SUBJECT_HEADER.getPrefix() + userCode);
-
-                if (priIds.contains(markerId) && !priIds.contains(subjectHeaderId)) {
-                    // 评卷员权限
-                    markerCell.setEnable(enable);
-                    headerCell.setEnable(false);
-                } else if (!priIds.contains(markerId) && priIds.contains(subjectHeaderId)) {
-                    // 科组长权限
-                    headerCell.setEnable(enable);
-                    markerCell.setEnable(false);
-                } else if (priIds.contains(markerId) && priIds.contains(subjectHeaderId)) {
-                    // 复合权限
-                    headerCell.setEnable(enable);
-                    markerCell.setEnable(enable);
-                } else {
-                    // 无特殊权限
-                    switch (pushBeforeRoleParam.getBeforeJudgeEnum()) {
-                        case FORBIDDEN_NO_NEED:
-                            // 当前用户无特殊权限,且策略为不需要禁用则不推送
-                            markerCell = null;
-                            headerCell = null;
-                            break;
-                        case FORBIDDEN_BY_BEFORE_ROLE:
-                            Set<Long> beforeRoleIdSet = pushBeforeRoleParam.getRoleIdSet();
-                            if (beforeRoleIdSet != null && beforeRoleIdSet.size() > 0) {
-                                List<SysRolePrivilege> beforeSysRolePrivilegeList = sysRolePrivilegeService.list(new QueryWrapper<SysRolePrivilege>().lambda().in(SysRolePrivilege::getRoleId, beforeRoleIdSet));
-                                Set<Long> beforePris = beforeSysRolePrivilegeList.stream().map(SysRolePrivilege::getPrivilegeId).collect(Collectors.toSet());
-                                if (beforePris.contains(markerId) || beforePris.contains(subjectHeaderId)) {
-                                    // 如果启用了判断该用户原先的角色且原先用户含有特殊角色,但新用户新角色一个都不含,要发送两个禁用
-                                    markerCell.setEnable(false);
-                                    headerCell.setEnable(false);
-                                }
-                            } else {
-                                // 不发送同步
-                                markerCell = null;
-                                headerCell = null;
-                            }
-                            break;
-                        case FORBIDDEN_NECESSARY:
-                            markerCell.setEnable(false);
-                            headerCell.setEnable(false);
-                            break;
-                    }
-                }
-                if (Objects.nonNull(markerCell)) {
-                    userPushParamList.add(markerCell);
-                }
-                if (Objects.nonNull(headerCell)) {
-                    userPushParamList.add(headerCell);
-                }
-            }
-        }
-
-        return userPushParamList;
-    }
-
     /**
      * 批量处理用户信息帮助类
      *
@@ -1240,16 +1148,22 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return roleIdList;
     }
 
-
-
-    private List<UserPushParam> analyzeUserEnableSpecialPrivilege(Long schoolId, Long userId, boolean enable) {
+    /**
+     * 用户禁用启用特殊权限判断及处理
+     * @param userId 用户id
+     * @param enable 启用/禁用
+     * @param requestUserId 请求人id
+     */
+    private void analyzeUserEnableSpecialPrivilege(Long userId, boolean enable,Long requestUserId) {
         SysUser dbUser = sysUserService.getById(userId);
         if (Objects.isNull(dbUser)) {
             throw ExceptionResultEnum.ERROR.exception("未找到系统用户");
         }
-        String code = dbUser.getCode();
-        Set<Long> roleIdList = new HashSet<>(sysRoleService.getUserRoles(userId));
-        PushBeforeRoleParam pushBeforeRoleParam = new PushBeforeRoleParam(null, BeforeJudgeEnum.FORBIDDEN_NECESSARY);
-        return this.analyzeUserPushSpecialPrivilege(userId, schoolId, code, dbUser.getRealName(), dbUser.getPassword(), roleIdList, pushBeforeRoleParam, enable);
+        Set<Long> currentRoleIdSet = new HashSet<>(sysRoleService.getUserRoles(userId));
+        List<PushUserTrack> pushUserTrackList = pushUserTrackService.createPushTrackUser(null,currentRoleIdSet,userId,enable,requestUserId);
+        List<UserPushParam> userPushParamList = pushUserTrackService.analyzeUserPushSpecialPrivilege(pushUserTrackList);
+        if (userPushParamList != null && userPushParamList.size() > 0){
+            this.userPushService(userPushParamList,requestUserId);
+        }
     }
 }

+ 20 - 20
teachcloud-common/src/main/java/com/qmth/teachcloud/common/sync/StmmsUtils.java

@@ -96,28 +96,28 @@ public class StmmsUtils {
         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, "是否启用"));
+//
+//
+//        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;
+//        }
 
-
-        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;
+        {
+            // 模拟云阅卷返回结果 3/5的成功率
+            int x = (int) (Math.random() * 10);
+            if (x > 0) {
+                // 失败
+                log.warn("x = " + x + ",云阅卷用户同步失败 \n");
+                return false;
+            } else {
+                return true;
+            }
         }
-
-//        {
-//            // 模拟云阅卷返回结果 3/5的成功率
-//            int x = (int) (Math.random() * 10);
-//            if (x > 0) {
-//                // 失败
-//                log.warn("x = " + x + ",云阅卷用户同步失败 \n");
-//                return false;
-//            } else {
-//                return true;
-//            }
-//        }
     }
 
     /**