Quellcode durchsuchen

新增课程任课老师导入

wangliang vor 3 Monaten
Ursprung
Commit
0f9024d813

+ 81 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/TeacherImportDto.java

@@ -0,0 +1,81 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.boot.tools.excel.annotation.ExcelColumn;
+import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
+import com.qmth.teachcloud.common.annotation.excelStyle.ExcelHeaderStyle;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: 任课老师导入
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2025/2/28
+ */
+@ExcelHeaderStyle
+@ExcelImportTempleteVaild(value = true)
+public class TeacherImportDto implements Serializable {
+
+    @ExcelColumn(name = "课程代码", index = 0, nullable = true)
+    private String courseCode;
+
+    @ExcelColumn(name = "课程名称", index = 1, nullable = true)
+    private String courseName;
+
+    @ExcelColumn(name = "开课学院", index = 2, nullable = true)
+    private String teachingRoomName;
+
+    @ExcelColumn(name = "任课老师工号", index = 3, nullable = true)
+    private String teacherCode;
+
+    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;
+    }
+
+    public String getTeachingRoomName() {
+        return teachingRoomName;
+    }
+
+    public void setTeachingRoomName(String teachingRoomName) {
+        this.teachingRoomName = teachingRoomName;
+    }
+
+    public String getTeacherCode() {
+        return teacherCode;
+    }
+
+    public void setTeacherCode(String teacherCode) {
+        this.teacherCode = teacherCode;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        TeacherImportDto that = (TeacherImportDto) o;
+        return courseCode.equals(that.courseCode) && courseName.equals(that.courseName) && teachingRoomName.equals(that.teachingRoomName) && teacherCode.equals(that.teacherCode);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(courseCode, courseName, teachingRoomName, teacherCode);
+    }
+}

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TeachCourse.java

@@ -57,6 +57,15 @@ public class TeachCourse extends BaseEntity implements Serializable {
 
     }
 
+    public TeachCourse(Long schoolId, Long examId, Long courseId, Long userId, Long createId) {
+        insertInfo(createId);
+        this.schoolId = schoolId;
+        this.examId = examId;
+        this.courseId = courseId;
+        this.userId = userId;
+        this.enable = true;
+    }
+
     public Long getSchoolId() {
         return schoolId;
     }

+ 11 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TeachCourseService.java

@@ -10,8 +10,10 @@ import com.qmth.teachcloud.common.bean.result.DictionaryResult;
 import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.entity.BasicExamStudent;
 import com.qmth.teachcloud.common.entity.SysUser;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Description: 教学课程服务类
@@ -76,4 +78,13 @@ public interface TeachCourseService extends IService<TeachCourse> {
     List<BasicCourse> listByUserId(Long examId, Long userId);
 
     void batchCreateTeachCourse(Long schoolId, Long examId, List<BasicExamStudent> basicExamStudentList);
+
+    /**
+     * 课程任课老师导入
+     *
+     * @param file
+     * @param examId
+     * @return
+     */
+    Map<String, String> teachCourseImport(MultipartFile file, Long examId);
 }

+ 87 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TeachCourseServiceImpl.java

@@ -4,6 +4,10 @@ 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.boot.api.exception.ApiException;
+import com.qmth.boot.tools.excel.ExcelReader;
+import com.qmth.boot.tools.excel.enums.ExcelType;
+import com.qmth.distributed.print.business.bean.dto.excel.TeacherImportDto;
 import com.qmth.distributed.print.business.bean.params.TeachCourseSelectParam;
 import com.qmth.distributed.print.business.bean.result.CourseResult;
 import com.qmth.distributed.print.business.bean.result.TeachCourseResult;
@@ -19,15 +23,20 @@ import com.qmth.teachcloud.common.bean.result.DictionaryResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.entity.BasicExamStudent;
+import com.qmth.teachcloud.common.entity.SysOrg;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.FieldUniqueEnum;
 import com.qmth.teachcloud.common.service.*;
+import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.util.*;
@@ -211,4 +220,81 @@ public class TeachCourseServiceImpl extends ServiceImpl<TeachCourseMapper, Teach
             selectCreate(teachCourseSelectParam);
         }
     }
-}
+
+    /**
+     * 课程任课老师导入
+     *
+     * @param file
+     * @param examId
+     * @return
+     */
+    @Override
+    @Transactional
+    public Map<String, String> teachCourseImport(MultipartFile file, Long examId) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        Map<String, String> messageMap = new LinkedHashMap<>();
+        try {
+            StringJoiner errorData = new StringJoiner("");
+            StringJoiner successData = new StringJoiner("");
+
+            ExcelReader excelReader = ExcelReader.create(ExcelType.XLSX, file.getInputStream(), 1);
+            List<TeacherImportDto> teacherImportDtoList = excelReader.getObjectList(TeacherImportDto.class);
+            if (CollectionUtils.isNotEmpty(teacherImportDtoList)) {
+                String[] columnNames = excelReader.getColumnNames();
+                for (int i = 0; i < columnNames.length; i++) {
+                    if (i == 0 && Objects.nonNull(columnNames[i]) && !columnNames[i].trim().contains("课程代码")) {
+                        throw ExceptionResultEnum.ERROR.exception("excel表头第一行为课程代码");
+                    } else if (i == 1 && Objects.nonNull(columnNames[i]) && !columnNames[i].trim().contains("课程名称")) {
+                        throw ExceptionResultEnum.ERROR.exception("excel表头第二行为课程名称");
+                    } else if (i == 2 && Objects.nonNull(columnNames[i]) && !columnNames[i].trim().contains("开课学院")) {
+                        throw ExceptionResultEnum.ERROR.exception("excel表头第三行为开课学院");
+                    } else if (i == 3 && Objects.nonNull(columnNames[i]) && !columnNames[i].trim().contains("任课老师工号")) {
+                        throw ExceptionResultEnum.ERROR.exception("excel表头第四行为任课老师工号");
+                    }
+                }
+
+                List<TeachCourse> teachCourseList = new ArrayList<>(teacherImportDtoList.size());
+                Set<TeacherImportDto> teacherImportDtoSet = new HashSet<>();
+                for (int i = 0; i < teacherImportDtoList.size(); i++) {
+                    TeacherImportDto teacherImportDto = teacherImportDtoList.get(i);
+                    if (!teacherImportDtoSet.add(teacherImportDto)) {
+                        errorData.add("excel第").add((i + 1) + "").add("行数据重复").add("\r\n");
+                    }
+                    if (Objects.isNull(teacherImportDto.getCourseCode()) || Objects.equals(teacherImportDto.getCourseCode().trim(), "")) {
+                        errorData.add("excel第").add((i + 1) + "").add("行[").add(columnNames[0] + "]为空;").add("\r\n");
+                    }
+                    if (Objects.isNull(teacherImportDto.getCourseName()) || Objects.equals(teacherImportDto.getCourseName().trim(), "")) {
+                        errorData.add("excel第").add((i + 1) + "").add("行[").add(columnNames[1] + "]为空;").add("\r\n");
+                    }
+                    if (Objects.isNull(teacherImportDto.getTeachingRoomName()) || Objects.equals(teacherImportDto.getTeachingRoomName().trim(), "")) {
+                        errorData.add("excel第").add((i + 1) + "").add("行[").add(columnNames[2] + "]为空;").add("\r\n");
+                    }
+                    if (Objects.isNull(teacherImportDto.getTeacherCode()) || Objects.equals(teacherImportDto.getTeacherCode().trim(), "")) {
+                        errorData.add("excel第").add((i + 1) + "").add("行[").add(columnNames[3] + "]为空;").add("\r\n");
+                    }
+                    basicCourseService.findByCourseCode(teacherImportDto.getCourseCode(), sysUser.getSchoolId());
+                    SysOrg sysOrg = sysOrgService.findOrg(sysUser.getSchoolId(), teacherImportDto.getTeachingRoomName());
+                    SysUser teacherUser = sysUserService.findByCode(sysUser.getSchoolId(), teacherImportDto.getTeacherCode());
+                    BasicCourse basicCourse = basicCourseService.getByTeachRoomIdAndCode(sysOrg.getId(), teacherImportDto.getCourseCode());
+                    Objects.requireNonNull(basicCourse, "课程代码[" + teacherImportDto.getCourseCode() + "]的开课学院[" + teacherImportDto.getTeachingRoomName() + "]不匹配");
+                    teachCourseList.add(new TeachCourse(sysUser.getSchoolId(), examId, basicCourse.getId(), teacherUser.getId(), sysUser.getId()));
+                }
+                successData.add("共导入").add(teachCourseList.size() + "").add("条数据");
+                this.saveOrUpdateBatch(teachCourseList);
+            }
+            messageMap.put(SystemConstant.SUCCESS, successData.length() > 0 ? successData.toString() : "无");
+            messageMap.put(SystemConstant.EXCEL_ERROR, errorData.length() > 0 ? errorData.toString() : "无");
+        } catch (Exception e) {
+            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, ((ApiException) e).getCode(), e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        }
+        return messageMap;
+    }
+}

+ 7 - 0
distributed-print/install/mysql/upgrade/3.4.4.sql

@@ -136,3 +136,10 @@ CREATE TABLE `t_b_version` (
 
 -- 2025-02-28
 UPDATE `sys_privilege` SET `name` = '评卷参数设置步骤状态', `url` = '/api/admin/mark/question/subjective/step/status' WHERE (`id` = '906');
+
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(1193, '课程任课老师导入', '/api/admin/basic/course/import', 'URL', 13, 1, 'AUTH', NULL, 1, 1, 1);
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(1194, '课程任课老师导入', 'AssginCourseUserImport', 'BUTTON', 576, 7, 'AUTH', '1193', 1, 0, 1);

+ 9 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/TeachCourseController.java

@@ -16,6 +16,7 @@ import io.swagger.annotations.*;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
@@ -92,4 +93,12 @@ public class TeachCourseController {
                 idList.stream().map(SystemConstant::convertIdToLong).collect(Collectors.toList()));
         return ResultUtil.ok();
     }
+
+    @ApiOperation(value = "导入课程任课老师")
+    @RequestMapping(value = "/import", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "导入成功", response = EditResult.class)})
+    public Result teacherImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
+                                @ApiParam(value = "考试id") @RequestParam(required = false) Long examId) throws Exception {
+        return ResultUtil.ok(teachCourseService.teachCourseImport(file, examId));
+    }
 }

+ 3 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FieldUniqueEnum.java

@@ -47,7 +47,9 @@ public enum FieldUniqueEnum {
 
     t_r_basic_info_unique("课程目标达成度报告"),
 
-    obe_course_requirement_report_unique("专业达成度报告");
+    obe_course_requirement_report_unique("专业达成度报告"),
+
+    teach_course_unique("任课老师课程");
 
     private String title;
 

+ 8 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysOrgService.java

@@ -190,4 +190,12 @@ public interface SysOrgService extends IService<SysOrg> {
 
     SysOrg findByParentIdAndName(Long parentId, String name);
 
+    /**
+     * 查询机构
+     *
+     * @param schoolId
+     * @param name
+     * @return
+     */
+    SysOrg findOrg(Long schoolId, String name);
 }

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

@@ -60,7 +60,7 @@ public interface SysUserService extends IService<SysUser> {
 
     Long saveUser(UserSaveParams userSaveParams) throws IllegalAccessException;
 
-    Long saveUser(UserSaveParams userSaveParams,Long requestUserId) throws IllegalAccessException;
+    Long saveUser(UserSaveParams userSaveParams, Long requestUserId) throws IllegalAccessException;
 
     /**
      * 保存用户
@@ -246,7 +246,7 @@ public interface SysUserService extends IService<SysUser> {
 
     SysUser getByUserId(Long userId);
 
-	void updateUiSetting(Long userId, String unescapeHtml);
+    void updateUiSetting(Long userId, String unescapeHtml);
 
     SysUser getByLoginName(Long schoolId, String loginName);
 
@@ -255,4 +255,13 @@ public interface SysUserService extends IService<SysUser> {
     void saveUserFromSync(Long schoolId, UserDataVo userDataVo);
 
     SysUser findBySchoolIdAndLoginName(Long schoolId, String teacherCode);
+
+    /**
+     * 根据工号查找
+     *
+     * @param schoolId
+     * @param code
+     * @return
+     */
+    SysUser findByCode(Long schoolId, String code);
 }

+ 15 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysOrgServiceImpl.java

@@ -611,6 +611,21 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
         return this.getOne(queryWrapper);
     }
 
+    /**
+     * @param schoolId
+     * @param name
+     * @return
+     */
+    @Override
+    public SysOrg findOrg(Long schoolId, String name) {
+        QueryWrapper<SysOrg> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(SysOrg::getSchoolId, schoolId)
+                .eq(SysOrg::getName, name);
+        SysOrg sysOrg = this.getOne(queryWrapper);
+        Objects.requireNonNull(sysOrg, "未找到[" + name + "]机构信息");
+        return sysOrg;
+    }
+
     /**
      * 根据子机构id深度优先搜索其父机构们
      *

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

@@ -1238,4 +1238,21 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 .eq(SysUser::getLoginName, teacherCode);
         return this.getOne(queryWrapper);
     }
+
+    /**
+     * 根据工号查找
+     *
+     * @param schoolId
+     * @param code
+     * @return
+     */
+    @Override
+    public SysUser findByCode(Long schoolId, String code) {
+        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(SysUser::getSchoolId, schoolId)
+                .eq(SysUser::getCode, code);
+        SysUser sysUser = this.getOne(queryWrapper);
+        Objects.requireNonNull(sysUser, "未找到工号为[" + code + "]用户信息");
+        return sysUser;
+    }
 }