Переглянути джерело

武汉大学教研分析用户账号调整新需求

caozixuan 3 роки тому
батько
коміт
c79dcd8e84

+ 15 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/RoleTypeEnum.java

@@ -50,4 +50,19 @@ public enum RoleTypeEnum {
         return list;
     }
 
+    /**
+     * 根据desc查找枚举类
+     * @param desc desc
+     * @return 枚举类
+     */
+    public static RoleTypeEnum convertDescToEnum(String desc){
+        RoleTypeEnum res = null;
+        for (RoleTypeEnum value : RoleTypeEnum.values()) {
+            if (desc.equals(value.getDesc())) {
+                res = value;
+            }
+        }
+        return res;
+    }
+
 }

+ 62 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/excel/TeacherDto.java

@@ -0,0 +1,62 @@
+package com.qmth.teachcloud.report.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 基础教师导入
+ * @Author: CaoZixuan
+ * @Date: 2021-09-21
+ */
+public class TeacherDto implements Serializable {
+
+    @ExcelNote(value = "教师编号")
+    @NotNull
+    private String teacherCode;
+
+    @ExcelNote(value = "教师名称")
+    @NotNull
+    private String teacherName;
+
+    @ExcelNote(value = "机构名称")
+    @NotNull
+    private String orgName;
+
+    @ExcelNote(value = "角色名称")
+    @NotNull
+    private String roleName;
+
+    public String getTeacherCode() {
+        return teacherCode;
+    }
+
+    public void setTeacherCode(String teacherCode) {
+        this.teacherCode = teacherCode;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getOrgName() {
+        return orgName;
+    }
+
+    public void setOrgName(String orgName) {
+        this.orgName = orgName;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+}

+ 100 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TBTeacher.java

@@ -0,0 +1,100 @@
+package com.qmth.teachcloud.report.business.entity;
+
+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.RoleTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 教师映射表
+ * @Author: CaoZixuan
+ * @Date: 2021-09-21
+ */
+@ApiModel(value = "TBTeacher对象", description = "基础教师表")
+public class TBTeacher implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "school_id")
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "org_id")
+    private Long orgId;
+
+    @ApiModelProperty(value = "教师名称")
+    @TableField(value = "teacher_name")
+    private String teacherName;
+
+    @ApiModelProperty(value = "教师编号(学校下唯一)")
+    @TableField(value = "teacher_code")
+    private String teacherCode;
+
+    @ApiModelProperty(value = "角色类别")
+    @TableField(value = "role_type")
+    private RoleTypeEnum roleType;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherCode() {
+        return teacherCode;
+    }
+
+    public void setTeacherCode(String teacherCode) {
+        this.teacherCode = teacherCode;
+    }
+
+    public RoleTypeEnum getRoleType() {
+        return roleType;
+    }
+
+    public void setRoleType(RoleTypeEnum roleType) {
+        this.roleType = roleType;
+    }
+}

+ 13 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TBTeacherMapper.java

@@ -0,0 +1,13 @@
+package com.qmth.teachcloud.report.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.report.business.entity.TBTeacher;
+
+/**
+ * @Description: 基础教师mapper
+ * @Author: CaoZixuan
+ * @Date: 2021-09-21
+ */
+public interface TBTeacherMapper extends BaseMapper<TBTeacher> {
+
+}

+ 43 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TBTeacherService.java

@@ -0,0 +1,43 @@
+package com.qmth.teachcloud.report.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.report.business.entity.TBTeacher;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Set;
+
+/**
+ * @Description: 基础教师服务类
+ * @Author: CaoZixuan
+ * @Date: 2021-09-21
+ */
+public interface TBTeacherService extends IService<TBTeacher> {
+
+
+    /**
+     * 根据idList批量删除多余的老师 - 用户级
+     *
+     * @param idSet
+     */
+    void deleteSysUserByIdSet(Set<Long> idSet);
+
+
+    /**
+     * excel导入基础老师表信息(先做全删全增)
+     *
+     * @param file     excel
+     * @param schoolId 学校id
+     * @return 导入情况
+     */
+    String importBasicTeacherInfo(MultipartFile file, Long schoolId) throws Exception;
+
+
+    /**
+     * 同步基础教师表数据到用户表
+     * 用户表中的用户和基础教师表比对,有的把用户登录名更新为基础教师表的教师编号,没有的为用户表新增教师表的新用户
+     *
+     * @param schoolId 学校id
+     */
+    void syncTeacherInfoToSysUser(Long schoolId);
+}

+ 163 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBTeacherServiceImpl.java

@@ -0,0 +1,163 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.qmth.teachcloud.common.bean.params.UserSaveParams;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysOrg;
+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.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.RoleTypeEnum;
+import com.qmth.teachcloud.common.service.SysOrgService;
+import com.qmth.teachcloud.common.service.SysRoleService;
+import com.qmth.teachcloud.common.service.SysUserRoleService;
+import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.common.util.ExcelUtil;
+import com.qmth.teachcloud.report.business.bean.dto.excel.TeacherDto;
+import com.qmth.teachcloud.report.business.entity.TBTeacher;
+import com.qmth.teachcloud.report.business.mapper.TBTeacherMapper;
+import com.qmth.teachcloud.report.business.service.TBTeacherService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 基础教师服务实现类
+ * @Author: CaoZixuan
+ * @Date: 2021-09-21
+ */
+@Service
+public class TBTeacherServiceImpl extends ServiceImpl<TBTeacherMapper, TBTeacher> implements TBTeacherService {
+    @Resource
+    private SysUserService sysUserService;
+    @Resource
+    private SysUserRoleService sysUserRoleService;
+    @Resource
+    private SysOrgService sysOrgService;
+    @Resource
+    private SysRoleService sysRoleService;
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void deleteSysUserByIdSet(Set<Long> idSet) {
+        if (CollectionUtils.isEmpty(idSet)){
+            throw ExceptionResultEnum.ERROR.exception("请选择要删除的用户id");
+        }
+        sysUserRoleService.remove(new QueryWrapper<SysUserRole>().lambda().in(SysUserRole::getUserId,idSet));
+        sysUserService.remove(new QueryWrapper<SysUser>().lambda().in(SysUser::getId,idSet));
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public String importBasicTeacherInfo(MultipartFile file, Long schoolId) throws Exception {
+        if (Objects.isNull(file)) {
+            throw ExceptionResultEnum.ERROR.exception("附件不存在");
+        }
+        if (Objects.isNull(schoolId) || schoolId == 0) {
+            throw ExceptionResultEnum.ERROR.exception("参数缺失");
+        }
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(TeacherDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+            if (finalExcelErrorList.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+            }
+            return finalExcelList;
+        });
+
+        Map<String,String> checkCode = new HashMap<>();
+        List<TBTeacher> tbTeacherList = new ArrayList<>();
+        if (Objects.nonNull(finalList) && finalList.size() > 0) {
+            for (int i = 0; i < finalList.size(); i++) {
+                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
+                List<Object> teacherList = map.get(i);
+                for (int y = 0; y < Objects.requireNonNull(teacherList).size(); y++) {
+                    if (teacherList.get(y) instanceof TeacherDto) {
+                        // excel 数据解析
+                        TeacherDto teacherDto = (TeacherDto) teacherList.get(y);
+                        String teacherName = teacherDto.getTeacherName();
+                        String teacherCode = teacherDto.getTeacherCode();
+                        if (checkCode.containsKey(teacherCode)){
+                            throw ExceptionResultEnum.ERROR.exception("excel中存在重复的教师编号 : " + teacherCode);
+                        }
+                        checkCode.put(teacherCode,teacherName);
+
+                        String orgName = teacherDto.getOrgName();
+                        SysOrg sysOrg = sysOrgService.getOne(new QueryWrapper<SysOrg>().lambda()
+                                .eq(SysOrg::getSchoolId,schoolId)
+                                .eq(SysOrg::getName,orgName));
+                        if (Objects.isNull(sysOrg)){
+                            System.out.println(JSON.toJSONString(teacherDto));
+                            throw ExceptionResultEnum.ERROR.exception("机构不存在");
+                        }
+                        String roleName = teacherDto.getRoleName();
+                        RoleTypeEnum roleType = RoleTypeEnum.convertDescToEnum(roleName);
+                        if (roleType == null){
+                            throw ExceptionResultEnum.ERROR.exception("枚举类型不存在");
+                        }
+
+                        TBTeacher tbTeacher = new TBTeacher();
+                        tbTeacher.setId(SystemConstant.getDbUuid());
+                        tbTeacher.setSchoolId(schoolId);
+                        tbTeacher.setOrgId(sysOrg.getId());
+                        tbTeacher.setTeacherCode(teacherCode);
+                        tbTeacher.setTeacherName(teacherName);
+                        tbTeacher.setRoleType(roleType);
+                        tbTeacherList.add(tbTeacher);
+                    }
+                }
+            }
+        }
+        // 删除该学校原有数据
+        this.remove(new QueryWrapper<TBTeacher>().lambda().eq(TBTeacher::getSchoolId,schoolId));
+        // 添加数据
+        this.saveBatch(tbTeacherList);
+        return "处理数据 " + tbTeacherList.size() + "条";
+    }
+
+    @Override
+    public void syncTeacherInfoToSysUser(Long schoolId) {
+        // 基础教师表
+        List<TBTeacher> teacherList = this.list(new QueryWrapper<TBTeacher>().lambda().eq(TBTeacher::getSchoolId,schoolId));
+        List<SysUser> dbUserList = sysUserService.list(new QueryWrapper<SysUser>().lambda().eq(SysUser::getSchoolId,schoolId));
+
+        List<SysUser> sysUserUpdateList = new ArrayList<>();
+        for (TBTeacher tbTeacher : teacherList) {
+            List<SysUser> dbFilter = dbUserList.stream().filter(e -> tbTeacher.getTeacherName().equals(e.getRealName())).collect(Collectors.toList());
+            if (dbFilter.size() > 1){
+                throw ExceptionResultEnum.ERROR.exception("找到相同名称用户警告");
+            }else if (dbFilter.size() == 1){
+                // 更新教师账号
+                SysUser dbUser = dbFilter.get(0);
+                dbUser.setLoginName(tbTeacher.getTeacherCode());
+                sysUserUpdateList.add(dbUser);
+            }else {
+                // 新增教师
+                SysRole teacherRole = sysRoleService.list(new QueryWrapper<SysRole>().lambda().eq(SysRole::getType, tbTeacher.getRoleType())).get(0);
+                List<Long> roleIds = new ArrayList<>();
+                roleIds.add(teacherRole.getId());
+
+                UserSaveParams userSaveParams = new UserSaveParams();
+                userSaveParams.setSchoolId(tbTeacher.getSchoolId());
+                userSaveParams.setLoginName(tbTeacher.getTeacherCode());
+                userSaveParams.setRealName(tbTeacher.getTeacherName());
+                userSaveParams.setPassword(SystemConstant.DEFAULT_PASSWORD);
+                userSaveParams.setOrgId(tbTeacher.getOrgId());
+                userSaveParams.setEnable(true);
+                userSaveParams.setRoleIds(roleIds.toArray(new Long[0]));
+                sysUserService.saveUserNoAuth(userSaveParams);
+            }
+
+        }
+        sysUserService.updateBatchById(sysUserUpdateList);
+    }
+}

+ 5 - 0
teachcloud-report-business/src/main/resources/mapper/TBTeacherMapper.xml

@@ -0,0 +1,5 @@
+<?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.report.business.mapper.TBTeacherMapper">
+
+</mapper>

+ 39 - 0
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/BasicDatasourceController.java

@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.common.collect.Lists;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -32,6 +34,7 @@ import com.qmth.teachcloud.report.business.enums.PublishStatusEnum;
 import com.qmth.teachcloud.report.business.service.*;
 import io.swagger.annotations.*;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -100,6 +103,8 @@ public class BasicDatasourceController {
     private TBExaminationService tbExaminationService;
     @Resource
     private TBExaminationRelationService tbExaminationRelationService;
+    @Resource
+    private TBTeacherService tbTeacherService;
 
     @ApiOperation(value = "试卷数据导入")
     @RequestMapping(value = "/paper/import", method = RequestMethod.POST)
@@ -1293,6 +1298,40 @@ public class BasicDatasourceController {
         return ResultUtil.ok(Collections.singletonMap(SystemConstant.SUCCESS, true));
     }
 
+    @ApiOperation(value = "教师用户删除")
+    @RequestMapping(value = "/user_teacher/delete", method = RequestMethod.POST)
+    @Transactional(rollbackFor = Exception.class)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+    public Result userTeacherDelete(@ApiParam(value = "用户id", required = true) @RequestParam List<String> idList) {
+        if (CollectionUtils.isEmpty(idList)) {
+            throw ExceptionResultEnum.ERROR.exception("请选择要删除的用户");
+        }
+        Set<Long> idSet = idList.stream().map(SystemConstant::convertIdToLong).collect(Collectors.toSet());
+        tbTeacherService.deleteSysUserByIdSet(idSet);
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "基础教师导入")
+    @RequestMapping(value = "/basic_teacher/import", method = RequestMethod.POST)
+    @Transactional(rollbackFor = Exception.class)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+    public Result basicTeacherImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
+                                     @ApiParam(value = "学校id", required = true) @RequestParam String schoolId) throws Exception {
+        return ResultUtil.ok(tbTeacherService.importBasicTeacherInfo(file, SystemConstant.convertIdToLong(schoolId)));
+    }
+
+    @ApiOperation(value = "同步基础教师表数据到用户表")
+    @RequestMapping(value = "/sync/teacher", method = RequestMethod.POST)
+    @Transactional(rollbackFor = Exception.class)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+    public Result syncTeacherInfo(@ApiParam(value = "学校id", required = true) @RequestParam String schoolId) {
+        tbTeacherService.syncTeacherInfoToSysUser(SystemConstant.convertIdToLong(schoolId));
+        return ResultUtil.ok();
+    }
+
 
     /**
      * 更新或新增专业信息