deason 1 éve
szülő
commit
38c9de3a8c

+ 188 - 1
src/main/java/cn/com/qmth/examcloud/tool/service/batch_import_exam_student/BatchImportExamStudentTask.java

@@ -5,13 +5,25 @@ import cn.com.qmth.examcloud.tool.config.SysProperty;
 import cn.com.qmth.examcloud.tool.entity.TaskEntity;
 import cn.com.qmth.examcloud.tool.service.CommonService;
 import cn.com.qmth.examcloud.tool.service.TaskService;
+import cn.com.qmth.examcloud.tool.service.batch_import_exam_student.vo.ExamStudentInfo;
+import cn.com.qmth.examcloud.tool.service.batch_import_exam_student.vo.ExamStudentInfoListener;
+import cn.com.qmth.examcloud.tool.utils.HttpHelper;
+import cn.com.qmth.examcloud.tool.utils.JsonMapper;
 import cn.com.qmth.examcloud.tool.utils.StatusException;
 import cn.com.qmth.examcloud.tool.vo.user.User;
+import com.alibaba.excel.EasyExcel;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
 @Component
 public class BatchImportExamStudentTask implements TaskService {
 
@@ -34,7 +46,182 @@ public class BatchImportExamStudentTask implements TaskService {
     }
 
     private void execute(User loginUser, TaskEntity task) {
-        log.info("todo...");
+        JsonNode jsonParams = new JsonMapper().getNode(task.getParams());
+        if (jsonParams == null) {
+            throw new StatusException("任务参数解析错误!");
+        }
+
+        Long examId = jsonParams.get("examId").asLong();
+        String dataFilePath = jsonParams.get("dataFilePath").asText();
+        if (StringUtils.isBlank(dataFilePath)) {
+            throw new StatusException("参数dataFilePath不能为空!");
+        }
+
+        ExamStudentInfoListener dataListener = new ExamStudentInfoListener();
+        EasyExcel.read(dataFilePath, ExamStudentInfo.class, dataListener).sheet().doRead();
+        List<ExamStudentInfo> dataList = dataListener.getList();
+
+        Map<String, Long> orgMaps = new HashMap<>();
+        Map<String, Long> courseMaps = new HashMap<>();
+
+        int total = dataList.size();
+        boolean hasError = false;
+        for (int i = 0; i < total; i++) {
+            ExamStudentInfo examStudent = dataList.get(i);
+
+            if (StringUtils.isBlank(examStudent.getStudentName())) {
+                log.warn("共{}条 第{}条 姓名不能为空!", total, i + 1);
+                hasError = true;
+            }
+            if (StringUtils.isBlank(examStudent.getStudentCode())) {
+                log.warn("共{}条 第{}条 学号不能为空!", total, i + 1);
+                hasError = true;
+            }
+            if (StringUtils.isBlank(examStudent.getIdentityNumber())) {
+                log.warn("共{}条 第{}条 身份证号不能为空!", total, i + 1);
+                hasError = true;
+            }
+            if (StringUtils.isBlank(examStudent.getOrgCode())) {
+                log.warn("共{}条 第{}条 机构代码不能为空!", total, i + 1);
+                hasError = true;
+            }
+            if (StringUtils.isBlank(examStudent.getCourseCode())) {
+                log.warn("共{}条 第{}条 课程代码不能为空!", total, i + 1);
+                hasError = true;
+            }
+
+            Long orgId = orgMaps.get(examStudent.getOrgCode());
+            if (orgId == null) {
+                orgId = this.queryOrgIdByCode(loginUser, examStudent.getOrgCode());
+                if (orgId == null) {
+                    log.warn("共{}条 第{}条 机构代码不正确!", total, i + 1);
+                    hasError = true;
+                }
+                orgMaps.put(examStudent.getOrgCode(), orgId);
+            }
+
+            Long courseId = courseMaps.get(examStudent.getCourseCode());
+            if (courseId == null) {
+                courseId = this.queryCourseIdByCode(loginUser, examStudent.getCourseCode());
+                if (courseId == null) {
+                    log.warn("共{}条 第{}条 课程代码不正确!", total, i + 1);
+                    hasError = true;
+                }
+                courseMaps.put(examStudent.getCourseCode(), courseId);
+            }
+
+            examStudent.setExamId(examId);
+            examStudent.setOrgId(orgId);
+            examStudent.setCourseId(courseId);
+            examStudent.setStudentName(examStudent.getStudentName().trim());
+            examStudent.setStudentCode(examStudent.getStudentCode().trim());
+            examStudent.setIdentityNumber(examStudent.getIdentityNumber().trim());
+            examStudent.setOrgCode(examStudent.getOrgCode().trim());
+            examStudent.setCourseCode(examStudent.getCourseCode().trim());
+        }
+
+        if (hasError) {
+            return;
+        }
+
+        int failCount = 0;
+        for (int i = 0; i < total; i++) {
+            ExamStudentInfo examStudent = dataList.get(i);
+
+            try {
+                this.saveStudent(loginUser, examStudent);
+                log.info("共{}条 第{}条 已执行!{}", total, i + 1, examStudent.getStudentCode());
+            } catch (Exception e) {
+                failCount++;
+                log.error("共{}条 第{}条 执行失败!{} err:{}", total, i + 1, examStudent.getStudentCode(), e.getMessage());
+            }
+        }
+
+        String msg = String.format("共%s条 成功%s条 失败%s条!", total, total - failCount, failCount);
+        log.warn(msg);
+        task.setDescription(msg);
+    }
+
+    private Long queryCourseIdByCode(User loginUser, String courseCode) {
+        String url = loginUser.getServerUrl() + "/api/ecs_core/course/byCode";
+        Map<String, String> headers = new HashMap<>();
+        headers.put("key", loginUser.getKey());
+        headers.put("token", loginUser.getToken());
+
+        Map<String, String> params = new HashMap<>();
+        params.put("rootOrgId", String.valueOf(loginUser.getRootOrgId()));
+        params.put("code", courseCode);
+
+        String result = HttpHelper.get(url, headers, params);
+        log.info(result);
+
+        JsonNode value = new JsonMapper().getNode(result);
+        if (value == null) {
+            return null;
+        }
+
+        String id = value.get("id").asText();
+        if (StringUtils.isNotEmpty(id)) {
+            return Long.parseLong(id);
+        }
+
+        return null;
+    }
+
+    private Long queryOrgIdByCode(User loginUser, String orgCode) {
+        String url = loginUser.getServerUrl() + "/api/ecs_core/org/subOrgPage/0/5";
+        Map<String, String> headers = new HashMap<>();
+        headers.put("key", loginUser.getKey());
+        headers.put("token", loginUser.getToken());
+
+        Map<String, String> params = new HashMap<>();
+        params.put("parentId", String.valueOf(loginUser.getRootOrgId()));
+        params.put("code", orgCode);
+
+        String result = HttpHelper.get(url, headers, params);
+        log.info(result);
+
+        JsonNode value = new JsonMapper().getNode(result);
+        if (value == null) {
+            return null;
+        }
+
+        int total = value.get("total").asInt();
+        if (total > 0) {
+            Iterator<JsonNode> list = value.get("list").iterator();
+            while (list.hasNext()) {
+                JsonNode node = list.next();
+                if (orgCode.equals(node.get("code").asText())) {
+                    return node.get("id").asLong();
+                }
+            }
+        }
+
+        return null;
+    }
+
+    private void saveStudent(User loginUser, ExamStudentInfo examStudent) {
+        Map<String, String> headers = new HashMap<>();
+        headers.put("key", loginUser.getKey());
+        headers.put("token", loginUser.getToken());
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("examId", examStudent.getExamId());
+        params.put("courseId", examStudent.getCourseId());
+        params.put("orgId", examStudent.getOrgId());
+        params.put("studentName", examStudent.getStudentName());
+        params.put("studentCode", examStudent.getStudentCode());
+        params.put("identityNumber", examStudent.getIdentityNumber());
+        params.put("specialtyName", examStudent.getSpecialtyName());
+
+        String url = loginUser.getServerUrl() + "/api/ecs_exam_work/exam_student";
+        String result = HttpHelper.put(url, headers, params);
+        // log.info(result);
+
+        JsonNode value = new JsonMapper().getNode(result);
+        if (value == null || !value.has("id")) {
+            throw new StatusException(result);
+        }
     }
 
 }

+ 70 - 0
src/main/java/cn/com/qmth/examcloud/tool/service/batch_import_exam_student/vo/ExamStudentInfo.java

@@ -0,0 +1,70 @@
+package cn.com.qmth.examcloud.tool.service.batch_import_exam_student.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+@Setter
+@Getter
+public class ExamStudentInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private Long studentId;
+
+    @ExcelProperty(value = "姓名", index = 0)
+    private String studentName;
+
+    @ExcelProperty(value = "学号", index = 1)
+    private String studentCode;
+
+    @ExcelProperty(value = "身份证号", index = 2)
+    private String identityNumber;
+
+    private Long orgId;
+
+    @ExcelProperty(value = "机构代码", index = 3)
+    private String orgCode;
+
+    @ExcelProperty(value = "机构名称", index = 4)
+    private String orgName;
+
+    private Long courseId;
+
+    @ExcelProperty(value = "课程代码", index = 5)
+    private String courseCode;
+
+    @ExcelProperty(value = "课程名称", index = 6)
+    private String courseName;
+
+    // @ExcelProperty(value = "课程层次", index = 7)
+    private String courseLevel;
+
+    private Long examId;//考试Id
+
+    private Long examStageId;//场次Id
+
+    private Integer examStageOrder;//场次号
+
+    private String paperType;//试卷类型
+
+    @ExcelProperty(value = "专业名称", index = 7)
+    private String specialtyName;
+
+    private String examSite;//考点
+
+    private String grade;//年级
+
+    private String infoCollector;//采集人
+
+    private String phone;//电话
+
+    private String remark;//备注
+
+    private String ext1;//试卷袋编码
+
+}

+ 27 - 0
src/main/java/cn/com/qmth/examcloud/tool/service/batch_import_exam_student/vo/ExamStudentInfoListener.java

@@ -0,0 +1,27 @@
+package cn.com.qmth.examcloud.tool.service.batch_import_exam_student.vo;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ExamStudentInfoListener extends AnalysisEventListener<ExamStudentInfo> {
+
+    private List<ExamStudentInfo> list = new ArrayList<>();
+
+    @Override
+    public void invoke(ExamStudentInfo data, AnalysisContext analysisContext) {
+        list.add(data);
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        // ignore
+    }
+
+    public List<ExamStudentInfo> getList() {
+        return list;
+    }
+
+}

+ 2 - 2
src/main/java/cn/com/qmth/examcloud/tool/service/batch_update_user/vo/UserInfoListener.java

@@ -11,8 +11,8 @@ public class UserInfoListener extends AnalysisEventListener<UserInfo> {
     private List<UserInfo> list = new ArrayList<>();
 
     @Override
-    public void invoke(UserInfo userInfo, AnalysisContext analysisContext) {
-        list.add(userInfo);
+    public void invoke(UserInfo data, AnalysisContext analysisContext) {
+        list.add(data);
     }
 
     @Override

+ 9 - 12
src/test/java/cn/com/qmth/examcloud/tool/ToolTest.java

@@ -5,7 +5,7 @@ import cn.com.qmth.examcloud.tool.config.SpringContextHolder;
 import cn.com.qmth.examcloud.tool.config.SysProperty;
 import cn.com.qmth.examcloud.tool.entity.TaskEntity;
 import cn.com.qmth.examcloud.tool.service.CommonService;
-import cn.com.qmth.examcloud.tool.service.create_random_paper_template.CreateRandomPaperTemplateTask;
+import cn.com.qmth.examcloud.tool.service.batch_import_exam_student.BatchImportExamStudentTask;
 import cn.com.qmth.examcloud.tool.service.exam_record_audit.ExamRecordDataAuditTask;
 import cn.com.qmth.examcloud.tool.service.export_student_photo.ExportStudentPhotoTask;
 import cn.com.qmth.examcloud.tool.service.query_paper_struct.QueryPaperStructTask;
@@ -47,36 +47,33 @@ public class ToolTest {
     public void demo() throws Exception {
         User user = doLogin();
 
+        // this.testTask(user);
         // resetStudentPasswordTask.start(user, 0L);
         // queryPaperStructTask.start(user, 0L);
         // exportStudentPhotoTask.start(user);
         // examRecordDataAuditTask.start(user);
-        // createRandomPaperTemplate(user);
     }
 
-    private void createRandomPaperTemplate(User user) {
+    private void testTask(User user) {
         Map<String, Object> params = new HashMap<>();
-        params.put("examId", 81);
-        params.put("questionPool", 1);
-        params.put("structType", 1);
-        params.put("structName", "精确结构2023");
-        params.put("paperKeywords", "_2,_3");
-        params.put("paperStartTime", "2023-12-01 00:00:00");
+        params.put("examId", 84);
+        params.put("dataFilePath", "C:/Users/deason/Desktop/考生导入模板.xlsx");
 
         TaskEntity task = new TaskEntity();
         task.setUserToken(user.getToken());
         task.setParams(new JsonMapper().toJson(params));
 
-        SpringContextHolder.getBean(CreateRandomPaperTemplateTask.class).start(task);
+        SpringContextHolder.getBean(BatchImportExamStudentTask.class).start(task);
     }
 
     private User doLogin() {
         String serverUrl = "org0.dev39.qmth.com.cn";
         // String serverUrl = "ecs-test.ea100.com.cn";
-        // String serverUrl = "ccnu.exam-cloud.cn";
+        // String serverUrl = "exam.exam-cloud.cn";
+
         String loginName = "admin5";
         String password = "0";
-        String smsCode = "5220";
+        String smsCode = "5220"; //选填
 
         User user = commonService.login(serverUrl, loginName, password, smsCode);
         LoginSessionManager.addLoginSession(user);