Browse Source

Merge branch 'dev' of http://git.qmth.com.cn/wangliang/distributed-print-service into dev

xiaof 4 years ago
parent
commit
d1c74d3543

+ 27 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/CourseInfoDto.java

@@ -0,0 +1,27 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+/**
+ * @Description: 根据用户账号和用户名称查询他可命题的课程
+ * @Author: CaoZixuan
+ * @Date: 2021-04-22
+ */
+public class CourseInfoDto {
+    private String courseCode;
+    private String courseName;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+}

+ 22 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/UserSaveParams.java

@@ -0,0 +1,22 @@
+package com.qmth.distributed.print.business.bean.params;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.entity.SysUser;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 用户保存/编辑params
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/24
+ */
+public class UserSaveParams extends SysUser implements Serializable {
+
+}

+ 25 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/SysUser.java

@@ -5,8 +5,16 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.distributed.print.business.base.BaseEntity;
+import com.qmth.distributed.print.business.service.SysConfigService;
+import com.qmth.distributed.print.common.contant.SpringContextHolder;
 import com.qmth.distributed.print.common.contant.SystemConstant;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.validator.constraints.Length;
+import org.springframework.boot.SpringApplication;
+import sun.misc.BASE64Encoder;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 
 /**
@@ -32,11 +40,15 @@ public class SysUser extends BaseEntity implements Serializable {
      * 用户名
      */
     @TableField("login_name")
+    @NotBlank(message = "请输入登录名")
+    @Length(message = "登录名不能超过{max}个字符", max = 25)
     private String loginName;
     /**
      * 姓名
      */
     @TableField("real_name")
+    @NotBlank(message = "请输入姓名")
+    @Length(message = "姓名不能超过{max}个字符", max = 25)
     private String realName;
     /**
      * 密码
@@ -46,10 +58,13 @@ public class SysUser extends BaseEntity implements Serializable {
      * 手机号
      */
     @TableField("mobile_number")
+    @NotBlank(message = "请输入手机号码")
+    @Length(message = "手机号码不能超过{max}个字符", max = 25)
     private String mobileNumber;
 
     @JsonSerialize(using = ToStringSerializer.class)
     @TableField("org_id")
+    @NotNull(message = "请选择机构")
     private Long orgId;
     /**
      * 0-禁用,1-启用
@@ -70,6 +85,7 @@ public class SysUser extends BaseEntity implements Serializable {
 
     @JsonSerialize(using = ToStringSerializer.class)
     @TableField(exist = false)
+    @NotNull(message = "请选择角色")
     private Long[] roleIds;
 
     @JsonSerialize(using = ToStringSerializer.class)
@@ -82,6 +98,15 @@ public class SysUser extends BaseEntity implements Serializable {
         setUpdateId(userId);
         setCreateTime(System.currentTimeMillis());
         setUpdateTime(System.currentTimeMillis());
+        SysConfigService sysConfigService = SpringContextHolder.getBean(SysConfigService.class);
+        SysConfig sysConfig = sysConfigService.getByKey("sys.user.initPassword");
+        BASE64Encoder encoder = new BASE64Encoder();
+        setPassword(encoder.encode(StringUtils.isNoneBlank(sysConfig.getConfigValue()) ? sysConfig.getConfigValue().getBytes() : "123456".getBytes()));
+    }
+
+    public void setUpdateInfo(Long userId) {
+        setUpdateId(userId);
+        setUpdateTime(System.currentTimeMillis());
     }
 
     public Long getSchoolId() {

+ 55 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/FieldUniqueEnum.java

@@ -0,0 +1,55 @@
+package com.qmth.distributed.print.business.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: 唯一约束字段转换
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/13
+ */
+public enum FieldUniqueEnum {
+
+    user_schoolId_orgId_loginName_idx("登录名");
+
+    private String title;
+
+    private FieldUniqueEnum(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param value
+     * @return
+     */
+    public static String convertToName(String value) {
+        for (FieldUniqueEnum e : FieldUniqueEnum.values()) {
+            if (Objects.equals(value.trim(), e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 状态转换 toTitle
+     *
+     * @param value
+     * @return
+     */
+    public static String convertToTitle(String value) {
+        for (FieldUniqueEnum e : FieldUniqueEnum.values()) {
+            if (value.trim().contains(e.name())) {
+                return e.getTitle();
+            }
+        }
+        return null;
+    }
+}

+ 3 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicCourseMapper.java

@@ -3,6 +3,7 @@ package com.qmth.distributed.print.business.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.distributed.print.business.bean.dto.CourseInfoDto;
 import com.qmth.distributed.print.business.bean.params.CourseParam;
 import com.qmth.distributed.print.business.entity.BasicCourse;
 import org.apache.ibatis.annotations.Param;
@@ -22,4 +23,6 @@ public interface BasicCourseMapper extends BaseMapper<BasicCourse> {
     List<BasicCourse> listCoursesByUserId(Long id);
 
     IPage<BasicCourse> listPage(Page<BasicCourse> page, @Param("schoolId") Long schoolId, @Param("code") String code, @Param("name") String name);
+
+    List<CourseInfoDto> findByUserLoginNameAndRealName(@Param("loginName")String loginName,@Param("realName") String realName);
 }

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicCourseService.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.distributed.print.business.bean.dto.CourseInfoDto;
 import com.qmth.distributed.print.business.bean.params.BlurryParam;
 import com.qmth.distributed.print.business.bean.params.CourseParam;
 import com.qmth.distributed.print.business.entity.BasicCourse;
@@ -36,4 +37,12 @@ public interface BasicCourseService extends IService<BasicCourse> {
      * @param userId 当前用户id
      */
     void verifyCourseInfo(Long schoolId,String courseCode,String courseName,Long userId);
+
+    /**
+     * 根据用户登录名和真实名称查找其可命的课程
+     * @param loginName 登录名
+     * @param realName 真实名
+     * @return 课程集合
+     */
+    List<CourseInfoDto> findByUserLoginNameAndRealName(String loginName,String realName);
 }

+ 7 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/SysUserService.java

@@ -5,8 +5,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.distributed.print.business.bean.dto.BlurryUserDto;
 import com.qmth.distributed.print.business.bean.dto.LoginDto;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
+import com.qmth.distributed.print.business.bean.params.UserSaveParams;
 import com.qmth.distributed.print.business.entity.SysUser;
 
+import java.security.NoSuchAlgorithmException;
 import java.util.List;
 
 /**
@@ -21,13 +23,13 @@ public interface SysUserService extends IService<SysUser> {
 
     IPage<UserDto> list(String realName, String roleId, Boolean enable, Integer pageNumber, Integer pageSize);
 
-    boolean saveUser(SysUser user);
+    boolean saveUser(UserSaveParams userSaveParams);
 
-    boolean enable(SysUser user);
+    boolean enable(SysUser user) throws NoSuchAlgorithmException;
 
-    boolean resetPassword(Long id);
+    boolean resetPassword(Long id) throws NoSuchAlgorithmException;
 
-    boolean updatePassword(SysUser user);
+    boolean updatePassword(SysUser user) throws NoSuchAlgorithmException;
 
     boolean bindRoles(SysUser sysUser);
 
@@ -37,7 +39,7 @@ public interface SysUserService extends IService<SysUser> {
 
     List<SysUser> listByOrgId(Long id);
 
-    boolean saveCustomer(SysUser user);
+    boolean saveCustomer(UserSaveParams userSaveParams);
 
     IPage<UserDto> listCustomer(String realName, Boolean enable, Integer pageNumber, Integer pageSize);
 }

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicCourseServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.distributed.print.business.bean.dto.CourseInfoDto;
 import com.qmth.distributed.print.business.entity.BasicCourse;
 import com.qmth.distributed.print.business.entity.ExamTask;
 import com.qmth.distributed.print.business.entity.SysUser;
@@ -18,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.util.List;
 import java.util.Objects;
 
@@ -34,6 +36,8 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
 
     @Autowired
     private ExamTaskService examTaskService;
+    @Resource
+    private BasicCourseMapper basicCourseMapper;
 
     @Override
     public IPage<BasicCourse> list(String code, String name, Integer pageNumber, Integer pageSize) {
@@ -129,4 +133,16 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
             this.saveOrUpdate(basicCourse);
         }
     }
+
+    @Override
+    public List<CourseInfoDto> findByUserLoginNameAndRealName(String loginName, String realName) {
+        System.out.println("---");
+        if (loginName == null){
+            loginName = "";
+        }
+        if (realName == null){
+            realName = "";
+        }
+        return basicCourseMapper.findByUserLoginNameAndRealName(loginName, realName);
+    }
 }

+ 37 - 15
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -96,6 +96,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     @Resource
     AsyncCreatePdfTempleteService asyncCreatePdfTempleteService;
 
+
     @Override
     public List<ExamTask> listByCourseCode(Long schoolId, String code) {
         QueryWrapper<ExamTask> queryWrapper = new QueryWrapper<>();
@@ -280,6 +281,19 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                     }else {
                         courseCodePaperNumberMap.put(userImportDto.getCourseCode(),userImportDto.getPaperNumber());
                     }
+
+                    // 校验命题老师
+                    String excelCourseCode = userImportDto.getCourseCode();
+                    String excelTeacherAccount = userImportDto.getUserAccount();
+                    String excelTeacherName = userImportDto.getUserName();
+
+                    if (Objects.nonNull(excelTeacherAccount) || Objects.nonNull(excelTeacherName)){
+                        List<CourseInfoDto> courseInfoDtoList = basicCourseService.findByUserLoginNameAndRealName(excelTeacherAccount,excelTeacherName);
+                        if (!courseInfoDtoList.stream().map(CourseInfoDto::getCourseCode).collect(Collectors.toList()).contains(excelCourseCode)){
+                            excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[命题教师]身份信息有误"));
+                        }
+                    }
+
                 }
             }
             if (excelErrorTemp.size() > 0) {
@@ -343,25 +357,33 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 examTaskDto.setCourseName(examTaskTemp.getCourseName());
                 examTaskDto.setPaperNumber(examTaskTemp.getPaperNumber());
                 examTaskDto.setSpecialty(examTaskTemp.getSpecialty());
-                // 校验命题老师
-                if (StringUtils.isBlank(examTaskTemp.getUserAccount())) {
-                    examTaskDto.setUsers(listUsers(examTaskTemp.getCourseCode(), null));
-                } else {
+                List<BlurryUserDto> blurryUserDtoList = new ArrayList<>();
+                if (Objects.nonNull(examTaskTemp.getUserAccount()) && Objects.nonNull(examTaskTemp.getCourseCode())){
                     QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
                     queryWrapper.lambda().eq(SysUser::getLoginName, examTaskTemp.getUserAccount());
                     SysUser sysUser1 = sysUserService.getOne(queryWrapper);
-                    if (sysUser1 == null) {
-                        examTaskDto.setUsers(listUsers(examTaskTemp.getCourseCode(), null));
-                    } else {
-                        List<BlurryUserDto> blurryUserDtoList = listUsers(examTaskTemp.getCourseCode(), String.valueOf(sysUser1.getId()));
-
-                        if (blurryUserDtoList.size() == 0){
-                            //如果没有查询到模糊用户数据 可能是excel中命题老师没有该课程权限,则舍弃该用户再次查询该科目-试卷的模糊用户
-                            blurryUserDtoList = listUsers(examTaskTemp.getCourseCode(), null);
-                        }
-                        examTaskDto.setUsers(blurryUserDtoList);
-                    }
+                    blurryUserDtoList = listUsers(examTaskTemp.getCourseCode(), String.valueOf(sysUser1.getId()));
                 }
+                examTaskDto.setUsers(blurryUserDtoList);
+//                // 校验命题老师
+//                if (StringUtils.isBlank(examTaskTemp.getUserAccount())) {
+//                    examTaskDto.setUsers(listUsers(examTaskTemp.getCourseCode(), null));
+//                } else {
+//                    QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
+//                    queryWrapper.lambda().eq(SysUser::getLoginName, examTaskTemp.getUserAccount());
+//                    SysUser sysUser1 = sysUserService.getOne(queryWrapper);
+//                    if (sysUser1 == null) {
+//                        examTaskDto.setUsers(listUsers(examTaskTemp.getCourseCode(), null));
+//                    } else {
+//                        List<BlurryUserDto> blurryUserDtoList = listUsers(examTaskTemp.getCourseCode(), String.valueOf(sysUser1.getId()));
+//
+//                        if (blurryUserDtoList.size() == 0){
+//                            //如果没有查询到模糊用户数据 可能是excel中命题老师没有该课程权限,则舍弃该用户再次查询该科目-试卷的模糊用户
+//                            blurryUserDtoList = listUsers(examTaskTemp.getCourseCode(), null);
+//                        }
+//                        examTaskDto.setUsers(blurryUserDtoList);
+//                    }
+//                }
                 tasks.add(examTaskDto);
             }
         }

+ 112 - 142
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/SysUserServiceImpl.java

@@ -5,24 +5,29 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.gson.Gson;
+import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.dto.BlurryUserDto;
 import com.qmth.distributed.print.business.bean.dto.LoginDto;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
+import com.qmth.distributed.print.business.bean.params.UserSaveParams;
 import com.qmth.distributed.print.business.entity.*;
+import com.qmth.distributed.print.business.enums.FieldUniqueEnum;
 import com.qmth.distributed.print.business.enums.RoleTypeEnum;
 import com.qmth.distributed.print.business.mapper.SysUserMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.util.ServletUtil;
-import com.qmth.distributed.print.business.util.security.Md5Utils;
-import com.qmth.distributed.print.common.contant.SystemConstant;
 import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
+import com.qmth.distributed.print.common.util.ResultUtil;
 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;
 import sun.misc.BASE64Encoder;
 
 import javax.annotation.Resource;
+import java.security.NoSuchAlgorithmException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -55,15 +60,15 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Autowired
     private SysRolePrivilegeService sysRolePrivilegeService;
 
-    @Resource
-    SysUserMapper sysUserMapper;
-
     @Autowired
     CacheService cacheService;
 
     @Autowired
     private CommonService commonService;
 
+    @Resource
+    SysUserService sysUserService;
+
     @Override
     public IPage<UserDto> list(String realName, String roleId, Boolean enable, Integer pageNumber, Integer pageSize) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
@@ -84,105 +89,44 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return userDtoIPage;
     }
 
-
     @Transactional
     @Override
-    public boolean saveUser(SysUser user) {
-        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
-        user.setSchoolId(schoolId);
-        SysUser sysUser1 = (SysUser) ServletUtil.getRequestUser();
-
-        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(SysUser::getLoginName, user.getLoginName());
-        SysUser sysUser = this.getOne(queryWrapper);
-        boolean isSuccess;
-        // 新增
-        if (Objects.isNull(user.getId())) {
-            if (sysUser != null) {
-                throw ExceptionResultEnum.ERROR.exception("用户名已存在");
-            }
-            SysConfig sysConfig = sysConfigService.getByKey("sys.user.initPassword");
-            BASE64Encoder encoder = new BASE64Encoder();
-            user.setPassword(encoder.encode(StringUtils.isNoneBlank(sysConfig.getConfigValue()) ? sysConfig.getConfigValue().getBytes() : "123456".getBytes()));
-            user.setId(SystemConstant.getDbUuid());
-            user.setCreateId(sysUser1.getId());
-            user.setCreateTime(System.currentTimeMillis());
-            isSuccess = this.save(user);
-        }
-        // 修改
-        else {
-            if (sysUser != null && user.getId().longValue() != sysUser.getId().longValue()) {
-                throw ExceptionResultEnum.ERROR.exception("用户名已存在");
-            }
-            sysUser.setRealName(user.getRealName());
-            sysUser.setMobileNumber(user.getMobileNumber());
-            sysUser.setOrgId(user.getOrgId());
-            sysUser.setUpdateId(sysUser1.getId());
-            sysUser.setUpdateTime(System.currentTimeMillis());
-            isSuccess = this.updateById(sysUser);
-
-            //删除角色
-            UpdateWrapper<SysUserRole> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.lambda().eq(SysUserRole::getUserId, sysUser.getId());
-
-            //删除课程
-            basicUserCourseService.removeByUserId(sysUser.getId());
-
-            sysUserRoleService.remove(updateWrapper);
-        }
-
-        //新增用户-角色
-        for (Long roleId : user.getRoleIds()) {
-            List<SysRolePrivilege> rolePrivileges = sysRolePrivilegeService.listByRoleId(roleId);
-            for (SysRolePrivilege rolePrivilege : rolePrivileges) {
-                SysUserRole userRole = new SysUserRole();
-                userRole.setUserId(user.getId());
-                userRole.setRoleId(roleId);
-                userRole.setPrivilegeId(rolePrivilege.getPrivilegeId());
-                sysUserRoleService.save(userRole);
-            }
-            cacheService.removeRolePrivilegeCache(roleId);
-        }
-
-        // 角色里是否有考务老师角色
-        List<SysRole> sysRoles = sysRoleService.list(user.getRoleIds(), RoleTypeEnum.QUESTION_TEACHER.name());
-        if (sysRoles != null && sysRoles.size() > 0) {
-            Long[] courseIds = user.getCourseIds();
-            if (courseIds.length == 0) {
-                throw ExceptionResultEnum.ERROR.exception("请选择课程");
-            }
-
-            basicUserCourseService.saveBatch(user);
-
-        }
-
-        // 清除缓存
-        cacheService.removeUserAuthCache(user.getId());
-
-        return isSuccess;
+    public boolean saveUser(UserSaveParams userSaveParams) {
+        return saveUserCommon(userSaveParams);
     }
 
     @Override
-    public boolean enable(SysUser user) {
+    public boolean enable(SysUser user) throws NoSuchAlgorithmException {
         UpdateWrapper<SysUser> updateWrapper = new UpdateWrapper<>();
         updateWrapper.lambda().set(SysUser::getEnable, user.getEnable()).eq(SysUser::getId, user.getId());
-        return this.update(updateWrapper);
+
+        boolean success = this.update(updateWrapper);
+        //如果状态为禁用,需要踢下线重新登录
+        if (!user.getEnable()) {
+            commonService.removeUserInfo(user.getId());
+        }
+        return success;
     }
 
     @Override
-    public boolean resetPassword(Long id) {
+    public boolean resetPassword(Long id) throws NoSuchAlgorithmException {
         SysConfig sysConfig = sysConfigService.getByKey("sys.user.initPassword");
         BASE64Encoder encoder = new BASE64Encoder();
         String md5Password = encoder.encode(StringUtils.isNoneBlank(sysConfig.getConfigValue()) ? sysConfig.getConfigValue().getBytes() : "123456".getBytes());
 
         SysUser user = this.getById(id);
+        String oldPassword = user.getPassword();
         user.setPassword(md5Password);
 
+        //如果原密码和旧密码不一致,需要重新登录
+        if (!Objects.equals(user.getPassword(), oldPassword)) {
+            commonService.removeUserInfo(user.getId());
+        }
         return this.updateById(user);
     }
 
     @Override
-    public boolean updatePassword(SysUser user) {
+    public boolean updatePassword(SysUser user) throws NoSuchAlgorithmException {
         SysUser sysUser = this.getById(user.getId());
         if (sysUser == null) {
             throw ExceptionResultEnum.ERROR.exception("用户不存在");
@@ -191,7 +135,12 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             throw ExceptionResultEnum.ERROR.exception("原密码不正确");
         }
         sysUser.setPassword(user.getPassword());
-        return this.updateById(sysUser);
+        boolean success = this.updateById(sysUser);
+        //如果原密码和旧密码不一致,需要重新登录
+        if (!Objects.equals(user.getOldPassword(), sysUser.getPassword())) {
+            commonService.removeUserInfo(sysUser.getId());
+        }
+        return success;
     }
 
     @Transactional
@@ -269,64 +218,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     @Transactional
     @Override
-    public boolean saveCustomer(SysUser user) {
-        SysUser sysUser1 = (SysUser) ServletUtil.getRequestUser();
-
-        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(SysUser::getLoginName, user.getLoginName());
-        SysUser sysUser = this.getOne(queryWrapper);
-        boolean isSuccess;
-        // 新增
-        if (Objects.isNull(user.getId())) {
-            if (sysUser != null) {
-                throw ExceptionResultEnum.ERROR.exception("用户名已存在");
-            }
-            SysConfig sysConfig = sysConfigService.getByKey("sys.user.initPassword");
-            BASE64Encoder encoder = new BASE64Encoder();
-            user.setPassword(encoder.encode(StringUtils.isNoneBlank(sysConfig.getConfigValue()) ? sysConfig.getConfigValue().getBytes() : "123456".getBytes()));
-            user.setId(SystemConstant.getDbUuid());
-            user.setCreateId(sysUser1.getId());
-            user.setCreateTime(System.currentTimeMillis());
-            isSuccess = this.save(user);
-        }
-        // 修改
-        else {
-            if (sysUser != null && user.getId().longValue() != sysUser.getId().longValue()) {
-                throw ExceptionResultEnum.ERROR.exception("用户名已存在");
-            }
-            sysUser.setRealName(user.getRealName());
-            sysUser.setMobileNumber(user.getMobileNumber());
-            sysUser.setUpdateId(sysUser1.getId());
-            sysUser.setUpdateTime(System.currentTimeMillis());
-            isSuccess = this.updateById(sysUser);
-
-            //删除角色
-            UpdateWrapper<SysUserRole> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.lambda().eq(SysUserRole::getUserId, sysUser.getId());
-            sysUserRoleService.remove(updateWrapper);
-        }
-
-        //新增用户-角色
-        for (Long roleId : user.getRoleIds()) {
-            SysRole sysRole = sysRoleService.getById(roleId);
-            if(!RoleTypeEnum.CUSTOMER.name().equals(sysRole.getType().name())){
-                throw ExceptionResultEnum.ERROR.exception("只能添加客服角色的用户");
-            }
-            List<SysRolePrivilege> rolePrivileges = sysRolePrivilegeService.listByRoleId(roleId);
-            for (SysRolePrivilege rolePrivilege : rolePrivileges) {
-                SysUserRole userRole = new SysUserRole();
-                userRole.setUserId(user.getId());
-                userRole.setRoleId(roleId);
-                userRole.setPrivilegeId(rolePrivilege.getPrivilegeId());
-                sysUserRoleService.save(userRole);
-            }
-            cacheService.removeRolePrivilegeCache(roleId);
-        }
-
-        // 清除缓存
-        cacheService.removeUserAuthCache(user.getId());
-
-        return isSuccess;
+    public boolean saveCustomer(UserSaveParams userSaveParams) {
+        return saveUserCommon(userSaveParams);
     }
 
     @Override
@@ -346,4 +239,81 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         }
         return userDtoIPage;
     }
+
+    /**
+     * 保存用户公用
+     *
+     * @param userSaveParams
+     * @return
+     */
+    public boolean saveUserCommon(UserSaveParams userSaveParams) {
+        boolean isSuccess = true;
+        try {
+            Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+            SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+            Gson gson = new Gson();
+            userSaveParams.setSchoolId(schoolId);
+            SysUser sysUser = gson.fromJson(gson.toJson(userSaveParams), SysUser.class);
+            if (Objects.isNull(sysUser.getId())) {//新增用户
+                sysUser.setInsertInfo(requestUser.getId());
+                sysUserService.save(sysUser);
+                for (Long roleId : userSaveParams.getRoleIds()) {
+                    commonService.addUserRolePrivilege(sysUser, roleId);
+                }
+            } else {//修改用户
+                List<SysUserRole> sysUserRoleList = cacheService.userRolePrivilegeCache(sysUser.getId());
+                List<Long> userRolesList = Arrays.asList(userSaveParams.getRoleIds());
+                List<Long> dbUserRolesList = sysUserRoleList.stream().map(SysUserRole::getRoleId).distinct().collect(Collectors.toList());
+                int count = (int) dbUserRolesList.stream().filter(s -> userRolesList.contains(s)).count();
+                SysUser dbUser = sysUserService.getById(sysUser.getId());
+                sysUser.setUpdateInfo(requestUser.getId());
+                sysUserService.updateById(sysUser);
+                if (count == 0 || dbUserRolesList.size() != userRolesList.size()) {
+                    QueryWrapper<SysUserRole> sysUserRoleQueryWrapper = new QueryWrapper<>();
+                    sysUserRoleQueryWrapper.lambda().eq(SysUserRole::getUserId, sysUser.getId());
+                    sysUserRoleService.remove(sysUserRoleQueryWrapper);
+
+                    cacheService.removeUserRolePrivilegeCache(sysUser.getId());
+                    for (Long roleId : userSaveParams.getRoleIds()) {
+                        commonService.addUserRolePrivilege(sysUser, roleId);
+                    }
+                }
+                //如果修改了角色,需要重新登录
+                if (count == 0 || dbUserRolesList.size() != userRolesList.size()) {
+                    commonService.removeUserInfo(sysUser.getId());
+                }
+                //如果修改了机构,需更新用户缓存
+                if (dbUser.getOrgId().longValue() != sysUser.getOrgId().longValue()) {
+                    cacheService.updateUserCache(sysUser.getId());
+                    cacheService.updateUserAuthCache(sysUser.getId());
+                }
+            }
+            //用户科目全量删除全量增加
+            QueryWrapper<BasicUserCourse> basicUserCourseQueryWrapper = new QueryWrapper<>();
+            basicUserCourseQueryWrapper.lambda().eq(BasicUserCourse::getUserId, sysUser.getId());
+            basicUserCourseService.remove(basicUserCourseQueryWrapper);
+
+            List<SysRole> sysRoles = sysRoleService.list(sysUser.getRoleIds(), RoleTypeEnum.QUESTION_TEACHER.name());
+            if (sysRoles != null && sysRoles.size() > 0) {
+                Long[] courseIds = sysUser.getCourseIds();
+                if (courseIds.length == 0) {
+                    throw ExceptionResultEnum.ERROR.exception("请选择课程");
+                }
+                basicUserCourseService.saveBatch(sysUser);
+            }
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            isSuccess = false;
+            if (e instanceof DuplicateKeyException) {
+                String errorColumn = e.getCause().toString();
+                String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length()).replaceAll("'", "");
+                throw ExceptionResultEnum.SQL_ERROR.exception("[" + FieldUniqueEnum.convertToTitle(columnStr) + "]数据不允许重复插入");
+            } else if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        }
+        return isSuccess;
+    }
 }

+ 14 - 0
distributed-print-business/src/main/resources/mapper/BasicCourseMapper.xml

@@ -43,5 +43,19 @@
         </where>
         order by create_time desc
     </select>
+    <select id="findByUserLoginNameAndRealName"
+            resultType="com.qmth.distributed.print.business.bean.dto.CourseInfoDto">
+        SELECT
+            bc.code AS courseCode, bc.name AS courseName
+        FROM
+            basic_course bc
+                INNER JOIN
+            basic_user_course buc ON buc.course_id = bc.id
+                INNER JOIN
+            sys_user su ON su.id = buc.user_id
+        WHERE
+            su.login_name = #{loginName}
+          AND real_name = #{realName};
+    </select>
 
 </mapper>

+ 23 - 17
distributed-print/src/main/java/com/qmth/distributed/print/api/SysUserController.java

@@ -6,17 +6,22 @@ import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.dto.BlurryUserDto;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
+import com.qmth.distributed.print.business.bean.params.UserSaveParams;
 import com.qmth.distributed.print.business.entity.SysUser;
 import com.qmth.distributed.print.business.service.SysUserService;
 import com.qmth.distributed.print.common.util.Result;
 import com.qmth.distributed.print.common.util.ResultUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
+import java.security.NoSuchAlgorithmException;
 import java.util.List;
 
 /**
@@ -97,27 +102,31 @@ public class SysUserController {
     /**
      * 新增/修改
      *
-     * @param user
+     * @param userSaveParams
      * @return
      */
     @ApiOperation(value = "新增/修改")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
-    public Result save(@RequestBody SysUser user) {
-        boolean isSuccess = sysUserService.saveUser(user);
-        return ResultUtil.ok(isSuccess);
+    public Result save(@ApiParam(value = "用户信息", required = true) @Valid @RequestBody UserSaveParams userSaveParams, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        return ResultUtil.ok(sysUserService.saveUser(userSaveParams));
     }
 
     /**
      * 新增客服
      *
-     * @param user
+     * @param userSaveParams
      * @return
      */
     @ApiOperation(value = "新增客服")
     @RequestMapping(value = "/save_customer", method = RequestMethod.POST)
-    public Result saveCustomer(@RequestBody SysUser user) {
-        boolean isSuccess = sysUserService.saveCustomer(user);
-        return ResultUtil.ok(isSuccess);
+    public Result saveCustomer(@ApiParam(value = "用户信息", required = true) @Valid @RequestBody UserSaveParams userSaveParams, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        return ResultUtil.ok(sysUserService.saveCustomer(userSaveParams));
     }
 
     /**
@@ -128,9 +137,8 @@ public class SysUserController {
      */
     @ApiOperation(value = "启用/禁用")
     @RequestMapping(value = "/enable", method = RequestMethod.POST)
-    public Result enable(@RequestBody SysUser user) {
-        boolean isSuccess = sysUserService.enable(user);
-        return ResultUtil.ok(isSuccess);
+    public Result enable(@RequestBody SysUser user) throws NoSuchAlgorithmException {
+        return ResultUtil.ok(sysUserService.enable(user));
     }
 
     /**
@@ -141,9 +149,8 @@ public class SysUserController {
      */
     @ApiOperation(value = "重置密码")
     @RequestMapping(value = "/reset_password", method = RequestMethod.POST)
-    public Result resetPassword(@RequestBody SysUser user) {
-        boolean isSuccess = sysUserService.resetPassword(user.getId());
-        return ResultUtil.ok(isSuccess);
+    public Result resetPassword(@RequestBody SysUser user) throws NoSuchAlgorithmException {
+        return ResultUtil.ok(sysUserService.resetPassword(user.getId()));
     }
 
     /**
@@ -153,9 +160,8 @@ public class SysUserController {
      */
     @ApiOperation(value = "修改密码")
     @RequestMapping(value = "/update_password", method = RequestMethod.POST)
-    public Result updatePassword(@RequestBody SysUser user) {
-        boolean isSuccess = sysUserService.updatePassword(user);
-        return ResultUtil.ok(isSuccess);
+    public Result updatePassword(@RequestBody SysUser user) throws NoSuchAlgorithmException {
+        return ResultUtil.ok(sysUserService.updatePassword(user));
     }
 
     /**