Browse Source

add:考生管理自测

caozixuan 1 year ago
parent
commit
8a18757a5c

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

@@ -169,6 +169,15 @@ public interface PrintCommonService {
      */
     Map<String, Object> saveTask(MultipartFile file, TaskTypeEnum taskTypeEnum);
 
+    /**
+     * 保存任务
+     *
+     * @param file
+     * @param taskTypeEnum
+     * @return
+     */
+    Map<String, Object> saveTask(MultipartFile file,Long semesterId,Long examId, TaskTypeEnum taskTypeEnum);
+
     /**
      * 保存任务
      *

+ 17 - 22
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamStudentServiceImpl.java

@@ -4,7 +4,6 @@ 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.google.common.collect.Lists;
 import com.qmth.distributed.print.business.bean.dto.BasicExamStudentDto;
 import com.qmth.distributed.print.business.bean.params.BasicExamStudentParam;
 import com.qmth.distributed.print.business.bean.result.BasicExamStudentResult;
@@ -13,7 +12,6 @@ import com.qmth.distributed.print.business.entity.BasicTeachClazz;
 import com.qmth.distributed.print.business.mapper.BasicExamStudentMapper;
 import com.qmth.distributed.print.business.service.BasicExamStudentService;
 import com.qmth.distributed.print.business.service.BasicTeachClazzService;
-import com.qmth.teachcloud.common.base.BaseEntity;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicCourse;
@@ -26,18 +24,17 @@ import com.qmth.teachcloud.common.util.ConvertUtil;
 import com.qmth.teachcloud.common.util.ExcelUtil;
 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.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.LinkedMultiValueMap;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.io.InputStream;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -191,13 +188,13 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
         String examRoom = basicExamStudentParam.getExamRoom();
 
         // 校验1 学期、考试、课程为下拉框,姓名、学号、教学班为文本框,均必填;
-        if (SystemConstant.longNotNull(semesterId)) {
+        if (!SystemConstant.longNotNull(semesterId)) {
             errorMsgList.add("缺少学期id");
         }
-        if (SystemConstant.longNotNull(examId)) {
+        if (!SystemConstant.longNotNull(examId)) {
             errorMsgList.add("缺少考试id");
         }
-        if (SystemConstant.strNotNull(courseCode)) {
+        if (!SystemConstant.strNotNull(courseCode)) {
             errorMsgList.add("缺少课程编号");
         }
         BasicCourse basicCourse = basicCourseService.findByCourseCode(courseCode, schoolId);
@@ -205,13 +202,13 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
             errorMsgList.add(String.format("缺少课程编号为[%s]", courseCode));
         }
 
-        if (SystemConstant.strNotNull(studentName)) {
+        if (!SystemConstant.strNotNull(studentName)) {
             errorMsgList.add("缺少学生姓名");
         }
-        if (SystemConstant.strNotNull(studentCode)) {
+        if (!SystemConstant.strNotNull(studentCode)) {
             errorMsgList.add("缺少学号");
         }
-        if (SystemConstant.strNotNull(teachClazz)) {
+        if (!SystemConstant.strNotNull(teachClazz)) {
             errorMsgList.add("缺少教学班名称");
         }
 
@@ -225,18 +222,15 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
                 // 存在教师信息,根据工号查询,不存在报错(缺少机构信息没法直接创建教师),存在更新姓名
                 SysUser teacher = sysUserService.getOne(
                         new QueryWrapper<SysUser>().lambda().eq(SysUser::getSchoolId, schoolId)
-                                .eq(SysUser::getCode, teacherCode).last(SystemConstant.LIMIT1));
+                                .eq(SysUser::getCode, teacherCode)
+                                .eq(SysUser::getRealName,teacherName)
+                                .last(SystemConstant.LIMIT1));
                 if (Objects.isNull(teacher)) {
-                    errorMsgList.add(String.format("工号为[%s]的教师不存在,请先创建", teacherCode));
+                    errorMsgList.add(String.format("工号为[%s],姓名为[%s]的教师不存在,请先创建", teacherCode,teacherName));
                 } else {
-                    String dbTeacherName = teacher.getRealName();
-                    if (!dbTeacherName.equals(teacherName)) {
-                        teacher.setRealName(teacherName);
-                        teacher.updateInfo(requestUserId);
-                        sysUserService.updateById(teacher);
-                    }
+                    teacherId = teacher.getId();
                 }
-                teacherId = teacher.getId();
+
             }
 
             if (!SystemConstant.longNotNull(examStartTime) || !SystemConstant.longNotNull(examEndTime)) {
@@ -286,6 +280,7 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
             if (!studentCode.equals(dbBasicExamStudent.getStudentCode())) {
                 throw ExceptionResultEnum.ERROR.exception("编辑考生时,学号不可更改");
             }
+            basicExamStudent.setId(id);
             basicExamStudent.updateInfo(requestUserId);
         } else {
             // 新增 (学号在考试课程下唯一)

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

@@ -1135,6 +1135,36 @@ public class PrintCommonServiceImpl implements PrintCommonService {
         return map;
     }
 
+    @Override
+    public Map<String, Object> saveTask(MultipartFile file, Long semesterId, Long examId, TaskTypeEnum taskTypeEnum) {
+        BasicAttachment basicAttachment = null;
+        Map<String, Object> map = null;
+        try {
+            PrintCommonService printCommonService = SpringContextHolder.getBean(PrintCommonService.class);
+            basicAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), UploadFileEnum.FILE);
+            if (Objects.isNull(basicAttachment)) {
+                throw ExceptionResultEnum.ATTACHMENT_ERROR.exception();
+            } else {
+                map = new HashMap<>();
+                TBTask tbTask = tbTaskService.saveTaskCommon(basicAttachment, taskTypeEnum, map, null);
+                tbTask.setSemesterId(semesterId);
+                tbTask.setExamId(examId);
+                tbTaskService.save(tbTask);
+            }
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (Objects.nonNull(basicAttachment)) {
+                basicAttachmentService.deleteAttachment(basicAttachment);
+            }
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        }
+        return map;
+    }
+
     @Override
     @Transactional
     public Map<String, Object> saveTask(Long printPlanId, MultipartFile file, TaskTypeEnum taskTypeEnum) {

+ 23 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/SyncBasicExamStudentImportService.java

@@ -7,6 +7,7 @@ import com.qmth.distributed.print.business.entity.BasicExamStudent;
 import com.qmth.distributed.print.business.service.BasicExamStudentService;
 import com.qmth.distributed.print.business.templete.importData.SyncImportTaskTemplate;
 import com.qmth.distributed.print.business.templete.service.TaskLogicService;
+import com.qmth.teachcloud.common.annotation.ExcelNote;
 import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -91,8 +92,7 @@ public class SyncBasicExamStudentImportService extends SyncImportTaskTemplate {
                 List<BasicExamStudent> basicExamStudentList = JSON.parseArray(JSON.toJSONString(result.get(SystemConstant.DATASOURCE)), BasicExamStudent.class);
                 basicExamStudentService.saveOrUpdateBatch(basicExamStudentList);
 
-            }
-            if (result.containsKey(SystemConstant.ERROR_DATA_LIST)) {
+            } else if (result.containsKey(SystemConstant.ERROR_DATA_LIST)) {
                 // 有异常数据
                 errorDataList = JSON.parseArray(JSON.toJSONString(result.get(SystemConstant.ERROR_DATA_LIST)),
                         BasicExamStudentDto.class);
@@ -133,6 +133,7 @@ public class SyncBasicExamStudentImportService extends SyncImportTaskTemplate {
             throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException {
 
         List<Field> fields = Arrays.asList(BasicExamStudentDto.class.getDeclaredFields());
+
         log.debug("导出Excel开始...");
         XSSFWorkbook wb = new XSSFWorkbook();
         XSSFSheet sheet = wb.createSheet("考生字典导入");
@@ -141,7 +142,7 @@ public class SyncBasicExamStudentImportService extends SyncImportTaskTemplate {
         defaultFont.setFontHeightInPoints((short) 12);
         defaultFont.setFontName("宋体");
 
-        int cellCount = fields.size() + 1;
+        int cellCount = fields.size();
         // 说明
         XSSFCellStyle describeStyle = wb.createCellStyle();
         describeStyle.setAlignment(HorizontalAlignment.LEFT);
@@ -173,7 +174,20 @@ public class SyncBasicExamStudentImportService extends SyncImportTaskTemplate {
         XSSFRow rowHead = sheet.createRow(1);
         for (int i = 0; i < fields.size(); i++) {
             XSSFCell cell = rowHead.createCell(i);
-            cell.setCellValue(fields.get(i).getName());
+            Field field = fields.get(i);
+            String title = "";
+            ExcelNote excelNote = field.getAnnotation(ExcelNote.class);
+
+            if (Objects.isNull(excelNote)) {
+                if (i == fields.size() - 1) {
+                    title = "异常信息";
+                } else {
+                    throw ExceptionResultEnum.ERROR.exception("未能获取dto属性注解");
+                }
+            } else {
+                title = excelNote.value();
+            }
+            cell.setCellValue(title);
             cell.setCellStyle(headerStyle);
         }
         XSSFCell lastCell = rowHead.createCell(cellCount - 1);
@@ -194,7 +208,11 @@ public class SyncBasicExamStudentImportService extends SyncImportTaskTemplate {
                 String methodName = "get" + SystemConstant.initCap(head.getName());
                 Method getMethod = basicExamStudentDto.getClass().getDeclaredMethod(methodName);
                 String value = String.valueOf(getMethod.invoke(basicExamStudentDto));
-                cell.setCellValue(value);
+                if (SystemConstant.strNotNull(value)) {
+                    cell.setCellValue(value);
+                } else {
+                    cell.setCellValue("");
+                }
                 cell.setCellStyle(exampleStyle);
             }
         }

+ 2 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -2099,7 +2099,6 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                 (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
 
                     for (int i = 0; i < finalExcelList.size(); i++) {
-                        List<String> errorMsgList = new ArrayList<>();
                         LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
                         List<Object> basicExamStudentDtoList = excelMap.get(i);
                         // 无数据,跳过
@@ -2107,6 +2106,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                             continue;
                         }
                         for (int y = 0; y < Objects.requireNonNull(basicExamStudentDtoList).size(); y++) {
+                            List<String> errorMsgList = new ArrayList<>();
                             // 行索引
                             BasicExamStudentDto basicExamStudentDto = (BasicExamStudentDto) basicExamStudentDtoList.get(
                                     y);
@@ -2184,7 +2184,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                         }
                     }
 
-                    if (!errorDataList.isEmpty()) {
+                    if (errorDataList.stream().anyMatch(e -> SystemConstant.strNotNull(e.getErrorMsg()))) {
                         map.put(SystemConstant.ERROR_DATA_LIST, errorDataList);
                     } else {
                         List<BasicExamStudent> basicExamStudentList = new ArrayList<>(studentCodeObjMap.values());

+ 15 - 0
distributed-print-business/src/main/resources/db/log/脚本-caozx.sql

@@ -0,0 +1,15 @@
+-- 考生字典管理权限设置
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1101', '分页查询', '/api/admin/basic/exam_student/page', 'URL', '1100', '1', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1102', '新增/编辑', '/api/admin/basic/exam_student/save', 'URL', '1100', '2', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1103', '导入', '/api/admin/basic/exam_student/import', 'URL', '1100', '3', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1104', '导出', '/api/admin/basic/exam_student/export', 'URL', '1100', '4', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1105', '批量删除', '/api/admin/basic/exam_student/delete', 'URL', '1100', '5', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1106', '查询', 'Select', 'BUTTON', '1100', '1', 'AUTH', '1101', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1107', '查询条件', 'Condition', 'CONDITION', '1100', '3', 'AUTH', '1101', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1108', '列表', 'List', 'LIST', '1100', '2', 'AUTH', '1101', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1109', '新增', 'Add', 'BUTTON', '1100', '4', 'AUTH', '1102', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1110', '编辑', 'Edit', 'LINK', '1100', '5', 'AUTH', '1102', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1111', '导入学生', 'Import', 'BUTTON', '1100', '6', 'AUTH', '1103', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1112', '导出学生', 'Export', 'BUTTON', '1100', '7', 'AUTH', '1104', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1113', '删除', 'Delete', 'LINK', '1100', '8', 'AUTH', '1105', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1114', '批量删除', 'DeleteBatch', 'BUTTON', '1100', '9', 'AUTH', '1105', '1', '0', '1');

+ 7 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/BasicExamStudentController.java

@@ -36,7 +36,7 @@ import java.util.stream.Collectors;
  * @author CaoZixuan
  * @since 2024-02-22
  */
-@Api(tags = "专业管理controller")
+@Api(tags = "考生字典管理controller")
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_BASIC + "/exam_student")
 public class BasicExamStudentController {
@@ -85,8 +85,12 @@ public class BasicExamStudentController {
     @RequestMapping(value = "/import", method = RequestMethod.POST)
     @ApiResponses({ @ApiResponse(code = 200, message = "返回信息", response = Result.class) })
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.IMPORT)
-    public Result basicExamStudentImportSync(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws Exception {
-        Map<String, Object> map = printCommonService.saveTask(file, TaskTypeEnum.STUDENT_IMPORT);
+    public Result basicExamStudentImportSync(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
+            @ApiParam(value = "学期id", required = true) @RequestParam String semesterId, @ApiParam(value = "考试id", required = true) @RequestParam String examId) throws Exception {
+        Map<String, Object> map = printCommonService.saveTask(file, SystemConstant.convertIdToLong(semesterId),
+                SystemConstant.convertIdToLong(examId), TaskTypeEnum.STUDENT_IMPORT);
+        map.put("semesterId",SystemConstant.convertIdToLong(semesterId));
+        map.put("examId",SystemConstant.convertIdToLong(examId));
         return syncBasicExamStudentImportService.importTask(map);
     }
 

BIN
distributed-print/src/main/resources/temps/basicExamStudent.xlsx