xiaofei 1 жил өмнө
parent
commit
455be0bc11
26 өөрчлөгдсөн 1686 нэмэгдсэн , 42 устгасан
  1. 2 2
      cas/pom.xml
  2. 317 0
      eds/init/exchange-eds-2.0.1.sql
  3. 6 2
      eds/pom.xml
  4. 12 2
      eds/src/main/java/com/qmth/teachcloud/eds/api/ApiController.java
  5. 15 0
      eds/src/main/java/com/qmth/teachcloud/eds/dao/StudentScoreMapper.java
  6. 121 0
      eds/src/main/java/com/qmth/teachcloud/eds/entity/StudentScore.java
  7. 191 0
      eds/src/main/java/com/qmth/teachcloud/eds/entity/SubjectiveScore.java
  8. 4 1
      eds/src/main/java/com/qmth/teachcloud/eds/enums/JobEnum.java
  9. 28 0
      eds/src/main/java/com/qmth/teachcloud/eds/job/StudentScoreSyncJob.java
  10. 5 0
      eds/src/main/java/com/qmth/teachcloud/eds/job/service/JobService.java
  11. 9 1
      eds/src/main/java/com/qmth/teachcloud/eds/job/service/impl/JobServiceImpl.java
  12. 8 0
      eds/src/main/java/com/qmth/teachcloud/eds/service/StudentScoreService.java
  13. 12 14
      eds/src/main/java/com/qmth/teachcloud/eds/service/impl/GdpuServiceImpl.java
  14. 181 0
      eds/src/main/java/com/qmth/teachcloud/eds/service/impl/StudentScoreServiceImpl.java
  15. 13 4
      eds/src/main/java/com/qmth/teachcloud/eds/start/StartRunning.java
  16. 35 10
      eds/src/main/java/com/qmth/teachcloud/eds/utils/gdpu/JdbcUtil.java
  17. 2 1
      eds/src/main/java/com/qmth/teachcloud/eds/utils/gdpu/ResultSetUtil.java
  18. 218 0
      eds/src/main/java/com/qmth/teachcloud/eds/vo/ExamQuestion.java
  19. 229 0
      eds/src/main/java/com/qmth/teachcloud/eds/vo/ExamStudent.java
  20. 112 0
      eds/src/main/java/com/qmth/teachcloud/eds/vo/ScoreItem.java
  21. 58 0
      eds/src/main/java/com/qmth/teachcloud/eds/vo/ScoreVo.java
  22. 81 0
      eds/src/main/java/com/qmth/teachcloud/eds/vo/SubjectiveScorePK.java
  23. 5 2
      eds/src/main/resources/application.properties
  24. 13 0
      eds/src/main/resources/mapper/StudentScoreMapper.xml
  25. 7 1
      pom.xml
  26. 2 2
      teachcloud-exchange-common/pom.xml

+ 2 - 2
cas/pom.xml

@@ -4,13 +4,13 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.qmth.cas.exchange</groupId>
     <artifactId>cas-exchange</artifactId>
-    <version>2.0.0.4</version>
+    <version>2.0.1.1</version>
     <packaging>jar</packaging>
 
     <parent>
         <groupId>com.qmth.teachcloud.exchange.service</groupId>
         <artifactId>teachcloud-exchange-service</artifactId>
-        <version>2.0.0.4</version>
+        <version>2.0.1.1</version>
     </parent>
 
     <dependencies>

+ 317 - 0
eds/init/exchange-eds-2.0.1.sql

@@ -0,0 +1,317 @@
+-- ----------------------------
+-- Table structure for basic_school
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `basic_school` (
+  `id` bigint NOT NULL COMMENT '主键',
+  `code` varchar(20) NOT NULL COMMENT '学校编码',
+  `name` varchar(100) DEFAULT NULL COMMENT '学校名称',
+  `enable` tinyint NOT NULL DEFAULT '1' COMMENT '是否启用,false:停用,true:启用',
+  `access_key` varchar(50) DEFAULT NULL COMMENT '访问key',
+  `access_secret` varchar(50) DEFAULT NULL COMMENT '访问秘钥',
+  `remark` text COMMENT '备注',
+  `create_id` bigint DEFAULT NULL COMMENT '创建人',
+  `create_time` bigint DEFAULT NULL COMMENT '创建时间',
+  `update_id` bigint DEFAULT NULL COMMENT '更新人',
+  `update_time` bigint DEFAULT NULL COMMENT '更新时间',
+  `logo` varchar(500) DEFAULT NULL COMMENT '学校logo',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE KEY `code` (`code`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学校表';
+
+-- ----------------------------
+-- Table structure for gdpu_jwxt_jgdmb
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `gdpu_jwxt_jgdmb` (
+  `id` int NOT NULL AUTO_INCREMENT,
+  `jg_id` varchar(45) DEFAULT NULL COMMENT '机构ID',
+  `jgmc` varchar(100) DEFAULT NULL COMMENT '机构名称',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for gdpu_jwxt_jyzr
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `gdpu_jwxt_jyzr` (
+  `id` int NOT NULL AUTO_INCREMENT,
+  `jzgh` varchar(45) DEFAULT NULL COMMENT '教职工号',
+  `jwjsmc` varchar(45) DEFAULT NULL COMMENT '角色名称',
+  `xm` varchar(45) DEFAULT NULL COMMENT '姓名',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for gdpu_jwxt_jzgxxb
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `gdpu_jwxt_jzgxxb` (
+  `id` int NOT NULL AUTO_INCREMENT,
+  `jzgh` varchar(45) DEFAULT NULL COMMENT '教职工号',
+  `xm` varchar(45) DEFAULT NULL COMMENT '姓名',
+  `jgmc` varchar(45) DEFAULT NULL COMMENT '机构名称',
+  `jg_id` varchar(45) DEFAULT NULL COMMENT '机构ID',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for gdpu_jwxt_kcdmb
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `gdpu_jwxt_kcdmb` (
+  `id` int NOT NULL AUTO_INCREMENT,
+  `kch` varchar(45) DEFAULT NULL COMMENT '课程号',
+  `kcmc` varchar(100) DEFAULT NULL COMMENT '课程名称',
+  `kkbmdm` varchar(45) DEFAULT NULL COMMENT '开课部门代码',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for gdpu_zt_xsxx
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `gdpu_zt_xsxx` (
+  `id` int NOT NULL AUTO_INCREMENT,
+  `xm` varchar(100) DEFAULT NULL COMMENT '姓名',
+  `xh` varchar(45) DEFAULT NULL COMMENT '学号',
+  `ssyx` varchar(100) DEFAULT NULL COMMENT '所属院系',
+  `impmarjor` varchar(100) DEFAULT NULL COMMENT '专业',
+  `zydm` varchar(45) DEFAULT NULL COMMENT '专业代码',
+  `bjmc` varchar(100) DEFAULT NULL COMMENT '班级名称',
+  `bjdm` varchar(45) DEFAULT NULL COMMENT '班级代码',
+  `rylx` varchar(45) DEFAULT NULL COMMENT '人员类型',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for qrtz_blob_triggers
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `qrtz_blob_triggers` (
+  `SCHED_NAME` varchar(120) NOT NULL,
+  `TRIGGER_NAME` varchar(200) NOT NULL,
+  `TRIGGER_GROUP` varchar(200) NOT NULL,
+  `BLOB_DATA` blob,
+  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`) USING BTREE,
+  KEY `SCHED_NAME` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`) USING BTREE
+) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb3;
+
+-- ----------------------------
+-- Table structure for qrtz_calendars
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `qrtz_calendars` (
+  `SCHED_NAME` varchar(120) NOT NULL,
+  `CALENDAR_NAME` varchar(200) NOT NULL,
+  `CALENDAR` blob NOT NULL,
+  PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
+
+-- ----------------------------
+-- Table structure for qrtz_cron_triggers
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `qrtz_cron_triggers` (
+  `SCHED_NAME` varchar(120) NOT NULL,
+  `TRIGGER_NAME` varchar(200) NOT NULL,
+  `TRIGGER_GROUP` varchar(200) NOT NULL,
+  `CRON_EXPRESSION` varchar(120) NOT NULL,
+  `TIME_ZONE_ID` varchar(80) DEFAULT NULL,
+  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
+
+-- ----------------------------
+-- Table structure for qrtz_fired_triggers
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `qrtz_fired_triggers` (
+  `SCHED_NAME` varchar(120) NOT NULL,
+  `ENTRY_ID` varchar(95) NOT NULL,
+  `TRIGGER_NAME` varchar(200) NOT NULL,
+  `TRIGGER_GROUP` varchar(200) NOT NULL,
+  `INSTANCE_NAME` varchar(200) NOT NULL,
+  `FIRED_TIME` bigint NOT NULL,
+  `SCHED_TIME` bigint NOT NULL,
+  `PRIORITY` int NOT NULL,
+  `STATE` varchar(16) NOT NULL,
+  `JOB_NAME` varchar(200) DEFAULT NULL,
+  `JOB_GROUP` varchar(200) DEFAULT NULL,
+  `IS_NONCONCURRENT` varchar(1) DEFAULT NULL,
+  `REQUESTS_RECOVERY` varchar(1) DEFAULT NULL,
+  PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`) USING BTREE,
+  KEY `IDX_QRTZ_FT_TRIG_INST_NAME` (`SCHED_NAME`,`INSTANCE_NAME`) USING BTREE,
+  KEY `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`) USING BTREE,
+  KEY `IDX_QRTZ_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`) USING BTREE,
+  KEY `IDX_QRTZ_FT_JG` (`SCHED_NAME`,`JOB_GROUP`) USING BTREE,
+  KEY `IDX_QRTZ_FT_T_G` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`) USING BTREE,
+  KEY `IDX_QRTZ_FT_TG` (`SCHED_NAME`,`TRIGGER_GROUP`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
+
+-- ----------------------------
+-- Table structure for qrtz_job_details
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `qrtz_job_details` (
+  `SCHED_NAME` varchar(120) NOT NULL,
+  `JOB_NAME` varchar(200) NOT NULL,
+  `JOB_GROUP` varchar(200) NOT NULL,
+  `DESCRIPTION` varchar(250) DEFAULT NULL,
+  `JOB_CLASS_NAME` varchar(250) NOT NULL,
+  `IS_DURABLE` varchar(1) NOT NULL,
+  `IS_NONCONCURRENT` varchar(1) NOT NULL,
+  `IS_UPDATE_DATA` varchar(1) NOT NULL,
+  `REQUESTS_RECOVERY` varchar(1) NOT NULL,
+  `JOB_DATA` blob,
+  PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`) USING BTREE,
+  KEY `IDX_QRTZ_J_REQ_RECOVERY` (`SCHED_NAME`,`REQUESTS_RECOVERY`) USING BTREE,
+  KEY `IDX_QRTZ_J_GRP` (`SCHED_NAME`,`JOB_GROUP`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
+
+-- ----------------------------
+-- Table structure for qrtz_locks
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `qrtz_locks` (
+  `SCHED_NAME` varchar(120) NOT NULL,
+  `LOCK_NAME` varchar(40) NOT NULL,
+  PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
+
+-- ----------------------------
+-- Table structure for qrtz_paused_trigger_grps
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `qrtz_paused_trigger_grps` (
+  `SCHED_NAME` varchar(120) NOT NULL,
+  `TRIGGER_GROUP` varchar(200) NOT NULL,
+  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
+
+-- ----------------------------
+-- Table structure for qrtz_scheduler_state
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `qrtz_scheduler_state` (
+  `SCHED_NAME` varchar(120) NOT NULL,
+  `INSTANCE_NAME` varchar(200) NOT NULL,
+  `LAST_CHECKIN_TIME` bigint NOT NULL,
+  `CHECKIN_INTERVAL` bigint NOT NULL,
+  PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
+
+-- ----------------------------
+-- Table structure for qrtz_simple_triggers
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `qrtz_simple_triggers` (
+  `SCHED_NAME` varchar(120) NOT NULL,
+  `TRIGGER_NAME` varchar(200) NOT NULL,
+  `TRIGGER_GROUP` varchar(200) NOT NULL,
+  `REPEAT_COUNT` bigint NOT NULL,
+  `REPEAT_INTERVAL` bigint NOT NULL,
+  `TIMES_TRIGGERED` bigint NOT NULL,
+  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
+
+-- ----------------------------
+-- Table structure for qrtz_simprop_triggers
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `qrtz_simprop_triggers` (
+  `SCHED_NAME` varchar(120) NOT NULL,
+  `TRIGGER_NAME` varchar(200) NOT NULL,
+  `TRIGGER_GROUP` varchar(200) NOT NULL,
+  `STR_PROP_1` varchar(512) DEFAULT NULL,
+  `STR_PROP_2` varchar(512) DEFAULT NULL,
+  `STR_PROP_3` varchar(512) DEFAULT NULL,
+  `INT_PROP_1` int DEFAULT NULL,
+  `INT_PROP_2` int DEFAULT NULL,
+  `LONG_PROP_1` bigint DEFAULT NULL,
+  `LONG_PROP_2` bigint DEFAULT NULL,
+  `DEC_PROP_1` decimal(13,4) DEFAULT NULL,
+  `DEC_PROP_2` decimal(13,4) DEFAULT NULL,
+  `BOOL_PROP_1` varchar(1) DEFAULT NULL,
+  `BOOL_PROP_2` varchar(1) DEFAULT NULL,
+  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
+
+-- ----------------------------
+-- Table structure for qrtz_triggers
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `qrtz_triggers` (
+  `SCHED_NAME` varchar(120) NOT NULL,
+  `TRIGGER_NAME` varchar(200)NOT NULL,
+  `TRIGGER_GROUP` varchar(200) NOT NULL,
+  `JOB_NAME` varchar(200) NOT NULL,
+  `JOB_GROUP` varchar(200) NOT NULL,
+  `DESCRIPTION` varchar(250) DEFAULT NULL,
+  `NEXT_FIRE_TIME` bigint DEFAULT NULL,
+  `PREV_FIRE_TIME` bigint DEFAULT NULL,
+  `PRIORITY` int DEFAULT NULL,
+  `TRIGGER_STATE` varchar(16) NOT NULL,
+  `TRIGGER_TYPE` varchar(8) NOT NULL,
+  `START_TIME` bigint NOT NULL,
+  `END_TIME` bigint DEFAULT NULL,
+  `CALENDAR_NAME` varchar(200) DEFAULT NULL,
+  `MISFIRE_INSTR` smallint DEFAULT NULL,
+  `JOB_DATA` blob,
+  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`) USING BTREE,
+  KEY `IDX_QRTZ_T_J` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`) USING BTREE,
+  KEY `IDX_QRTZ_T_JG` (`SCHED_NAME`,`JOB_GROUP`) USING BTREE,
+  KEY `IDX_QRTZ_T_C` (`SCHED_NAME`,`CALENDAR_NAME`) USING BTREE,
+  KEY `IDX_QRTZ_T_G` (`SCHED_NAME`,`TRIGGER_GROUP`) USING BTREE,
+  KEY `IDX_QRTZ_T_STATE` (`SCHED_NAME`,`TRIGGER_STATE`) USING BTREE,
+  KEY `IDX_QRTZ_T_N_STATE` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`) USING BTREE,
+  KEY `IDX_QRTZ_T_N_G_STATE` (`SCHED_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`) USING BTREE,
+  KEY `IDX_QRTZ_T_NEXT_FIRE_TIME` (`SCHED_NAME`,`NEXT_FIRE_TIME`) USING BTREE,
+  KEY `IDX_QRTZ_T_NFT_ST` (`SCHED_NAME`,`TRIGGER_STATE`,`NEXT_FIRE_TIME`) USING BTREE,
+  KEY `IDX_QRTZ_T_NFT_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`) USING BTREE,
+  KEY `IDX_QRTZ_T_NFT_ST_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_STATE`) USING BTREE,
+  KEY `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_GROUP`,`TRIGGER_STATE`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
+
+-- ----------------------------
+-- Table structure for student_score
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `student_score` (
+ `exam_id` bigint NOT NULL COMMENT '考试ID',
+ `course_code` varchar(255) NOT NULL COMMENT '课程代码',
+ `course_name` varchar(255) DEFAULT NULL COMMENT '课程名称',
+ `course_paper_id` varchar(255) NOT NULL COMMENT '课程试卷号',
+ `student_code` varchar(30) NOT NULL COMMENT '学号',
+ `student_name` varchar(100) DEFAULT NULL COMMENT '姓名',
+ `total_score` double(10,2) DEFAULT NULL COMMENT '总分',
+  `objective_score_list` mediumtext COMMENT '客观题分数详情',
+  `subjective_score_list` mediumtext COMMENT '主观题分数详情',
+  `create_time` bigint DEFAULT NULL COMMENT '创建时间',
+  PRIMARY KEY (`exam_id`,`course_paper_id`,`student_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for t_s_auth
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `t_s_auth` (
+  `id` bigint NOT NULL COMMENT '主键',
+  `school_id` bigint NOT NULL COMMENT '学校id',
+  `access_key` varchar(255) DEFAULT NULL COMMENT 'accessKey',
+  `access_secret` varchar(255) DEFAULT NULL COMMENT 'accessSecret',
+  `description` text COMMENT '离线授权证书',
+  `type` varchar(16) NOT NULL COMMENT '授权类型',
+  `create_id` bigint DEFAULT NULL COMMENT '创建人',
+  `create_time` bigint DEFAULT NULL COMMENT '创建时间',
+  `update_id` bigint DEFAULT NULL COMMENT '更新人',
+  `update_time` bigint DEFAULT NULL COMMENT '更新时间',
+  `expire_time` bigint DEFAULT NULL COMMENT '过期时间',
+  `file` mediumblob COMMENT '文件数据',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='激活授权配置表';
+
+-- ----------------------------
+-- View structure for course
+-- ----------------------------
+DROP VIEW IF EXISTS `course`;
+CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `course` AS select `gjk`.`kch` AS `课程代码`,`gjk`.`kcmc` AS `课程名称`,`gjj`.`jgmc` AS `开课学院` from (`gdpu_jwxt_kcdmb` `gjk` left join `gdpu_jwxt_jgdmb` `gjj` on((`gjk`.`kkbmdm` = `gjj`.`jg_id`)));
+
+-- ----------------------------
+-- View structure for org
+-- ----------------------------
+DROP VIEW IF EXISTS `org`;
+CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `org` AS select `gdpu_jwxt_jgdmb`.`jg_id` AS `机构ID`,`gdpu_jwxt_jgdmb`.`jgmc` AS `机构名称` from `gdpu_jwxt_jgdmb`;
+
+-- ----------------------------
+-- View structure for student
+-- ----------------------------
+DROP VIEW IF EXISTS `student`;
+CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `student` AS select `gdpu_zt_xsxx`.`xm` AS `姓名`,`gdpu_zt_xsxx`.`xh` AS `学号`,`gdpu_zt_xsxx`.`ssyx` AS `学院`,`gdpu_zt_xsxx`.`impmarjor` AS `专业`,`gdpu_zt_xsxx`.`zydm` AS `专业代码`,`gdpu_zt_xsxx`.`bjmc` AS `班级名称`,`gdpu_zt_xsxx`.`bjdm` AS `班级代码`,`gdpu_zt_xsxx`.`rylx` AS `人员类型` from `gdpu_zt_xsxx`;
+
+-- ----------------------------
+-- View structure for user_zr
+-- ----------------------------
+DROP VIEW IF EXISTS `user_zr`;
+CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `user_zr` AS select `a`.`jzgh` AS `工号`,`a`.`xm` AS `姓名`,`a`.`jgmc` AS `组织架构`,`b`.`jwjsmc` AS `角色名称` from (`gdpu_jwxt_jzgxxb` `a` left join `gdpu_jwxt_jyzr` `b` on((`a`.`jzgh` = `b`.`jzgh`)));
+

+ 6 - 2
eds/pom.xml

@@ -4,13 +4,13 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.qmth.eds.exchange</groupId>
     <artifactId>eds-exchange</artifactId>
-    <version>2.0.0.4</version>
+    <version>2.0.1.1</version>
     <packaging>jar</packaging>
 
     <parent>
         <groupId>com.qmth.teachcloud.exchange.service</groupId>
         <artifactId>teachcloud-exchange-service</artifactId>
-        <version>2.0.0.4</version>
+        <version>2.0.1.1</version>
     </parent>
 
     <dependencies>
@@ -38,6 +38,10 @@
             <artifactId>mysql-connector-java</artifactId>
             <version>8.0.29</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 12 - 2
eds/src/main/java/com/qmth/teachcloud/eds/api/ApiController.java

@@ -3,6 +3,7 @@ package com.qmth.teachcloud.eds.api;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.teachcloud.eds.service.GdpuService;
+import com.qmth.teachcloud.eds.service.StudentScoreService;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
@@ -13,7 +14,10 @@ import javax.servlet.http.HttpServletResponse;
 @Aac(auth = BOOL.FALSE)
 public class ApiController {
     @Resource
-    GdpuService gdpuService;
+    private GdpuService gdpuService;
+
+    @Resource
+    private StudentScoreService studentScoreService;
 
 //    @GetMapping("/")
 //    public String testJs() {
@@ -51,7 +55,13 @@ public class ApiController {
 
     @GetMapping("/download")
     @ResponseBody
-    public void test(HttpServletResponse response, String type) {
+    public void download(HttpServletResponse response, String type) {
         gdpuService.downloadFile(response, type);
     }
+
+    @GetMapping("/score")
+    @ResponseBody
+    public String score() {
+        return studentScoreService.syncStudentSocre();
+    }
 }

+ 15 - 0
eds/src/main/java/com/qmth/teachcloud/eds/dao/StudentScoreMapper.java

@@ -0,0 +1,15 @@
+package com.qmth.teachcloud.eds.dao;
+
+
+import com.qmth.teachcloud.eds.entity.StudentScore;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface StudentScoreMapper {
+
+    void deleteExamStudent();
+
+    void insertExamStudent(List<StudentScore> list);
+}

+ 121 - 0
eds/src/main/java/com/qmth/teachcloud/eds/entity/StudentScore.java

@@ -0,0 +1,121 @@
+package com.qmth.teachcloud.eds.entity;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 考生成绩表
+ */
+public class StudentScore {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+
+    @ApiModelProperty(value = "课程代码")
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "课程名称")
+    private String coursePaperId;
+
+    @ApiModelProperty(value = "学号")
+    private String studentCode;
+
+    @ApiModelProperty(value = "姓名")
+    private String studentName;
+
+    @ApiModelProperty(value = "总分")
+    private Double totalScore;
+
+    @ApiModelProperty(value = "客观题分数明细")
+    private String objectiveScoreList;
+
+    @ApiModelProperty(value = "主观题分数明细")
+    private String subjectiveScoreList;
+
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    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 getCoursePaperId() {
+        return coursePaperId;
+    }
+
+    public void setCoursePaperId(String coursePaperId) {
+        this.coursePaperId = coursePaperId;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getObjectiveScoreList() {
+        return objectiveScoreList;
+    }
+
+    public void setObjectiveScoreList(String objectiveScoreList) {
+        this.objectiveScoreList = objectiveScoreList;
+    }
+
+    public String getSubjectiveScoreList() {
+        return subjectiveScoreList;
+    }
+
+    public void setSubjectiveScoreList(String subjectiveScoreList) {
+        this.subjectiveScoreList = subjectiveScoreList;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+}

+ 191 - 0
eds/src/main/java/com/qmth/teachcloud/eds/entity/SubjectiveScore.java

@@ -0,0 +1,191 @@
+package com.qmth.teachcloud.eds.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qmth.teachcloud.eds.vo.SubjectiveScorePK;
+
+import java.io.Serializable;
+
+/**
+ * 主观题得分详情状态
+ */
+public class SubjectiveScore implements Serializable, Comparable<SubjectiveScore> {
+
+    private static final long serialVersionUID = 6637010422161820147L;
+
+    private SubjectiveScorePK pk;
+
+    /**
+     * 考试ID
+     */
+    @TableField(value = "exam_id")
+    private Integer examId;
+
+    /**
+     * 科目代码
+     */
+    @TableField(value = "subject_code")
+    private String subjectCode;
+
+    /**
+     * 分组序号
+     */
+    @TableField(value = "group_number")
+    private Integer groupNumber;
+
+    /**
+     * 分组总分
+     */
+    @TableField(value = "group_score")
+    private Double groupScore;
+
+    /**
+     * 大题总分
+     */
+    @TableField(value = "main_score")
+    private Double mainScore;
+
+    /**
+     * 小题得分
+     */
+    @TableField(value = "score")
+    private Double score;
+
+    /**
+     * 未作答的步骤数量
+     */
+    @TableField(value = "unanswered_count")
+    private Integer unansweredCount;
+
+    /**
+     * 未计分
+     */
+    @TableField(value = "uncalculate")
+    private Boolean uncalculate;
+
+    /**
+     * 未计分
+     */
+    @TableField(value = "rejected")
+    private Boolean rejected;
+
+    public SubjectiveScore() {
+        this.pk = new SubjectiveScorePK();
+    }
+
+    public Integer getStudentId() {
+        return pk.getStudentId();
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.pk.setStudentId(studentId);
+    }
+
+    public Integer getMainNumber() {
+        return pk.getMainNumber();
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.pk.setMainNumber(mainNumber);
+    }
+
+    public String getSubNumber() {
+        return pk.getSubNumber();
+    }
+
+    public void setSubNumber(String subNumber) {
+        this.pk.setSubNumber(subNumber);
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public Integer getGroupNumber() {
+        return groupNumber;
+    }
+
+    public void setGroupNumber(Integer groupNumber) {
+        this.groupNumber = groupNumber;
+    }
+
+    public Double getGroupScore() {
+        return groupScore;
+    }
+
+    public void setGroupScore(Double groupScore) {
+        this.groupScore = groupScore;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
+    public Double getMainScore() {
+        return mainScore;
+    }
+
+    public void setMainScore(Double mainScore) {
+        this.mainScore = mainScore;
+    }
+
+    public Integer getUnansweredCount() {
+        return unansweredCount;
+    }
+
+    public void setUnansweredCount(Integer unansweredCount) {
+        this.unansweredCount = unansweredCount;
+    }
+
+    @Override
+    public int compareTo(SubjectiveScore other) {
+        int i = this.getMainNumber() - other.getMainNumber();
+        if (i == 0) {
+            if (this.getSubNumber().contains("-")) {
+                String[] o1s = this.getSubNumber().split("-");
+                String[] o2s = other.getSubNumber().split("-");
+                int j = Integer.parseUnsignedInt(o1s[0]) - Integer.parseUnsignedInt(o2s[0]);
+                if (j == 0) {
+                    return Integer.parseUnsignedInt(o1s[1]) - Integer.parseUnsignedInt(o2s[1]);
+                } else {
+                    return j;
+                }
+            } else {
+                return Integer.parseUnsignedInt(this.getSubNumber()) - Integer.parseUnsignedInt(other.getSubNumber());
+            }
+        }
+        return i;
+    }
+
+    public Boolean getUncalculate() {
+        return uncalculate;
+    }
+
+    public void setUncalculate(Boolean uncalculate) {
+        this.uncalculate = uncalculate;
+    }
+
+    public Boolean getRejected() {
+        return rejected;
+    }
+
+    public void setRejected(Boolean rejected) {
+        this.rejected = rejected;
+    }
+
+}

+ 4 - 1
eds/src/main/java/com/qmth/teachcloud/eds/enums/JobEnum.java

@@ -7,7 +7,10 @@ public enum JobEnum {
 
     GDPU_DATA_JOB("广东药科大学数据同步定时任务"),
 
-    GDPU_DATA_JOB_GROUP("广东药科大学数据同步定时任务组");
+    GDPU_DATA_JOB_GROUP("广东药科大学数据同步定时任务组"),
+    STUDENT_SCORE_JOB("考生成绩同步定时任务"),
+
+    STUDENT_SCORE_JOB_GROUP("考生成绩同步定时任务组");
 
 
     private String title;

+ 28 - 0
eds/src/main/java/com/qmth/teachcloud/eds/job/StudentScoreSyncJob.java

@@ -0,0 +1,28 @@
+package com.qmth.teachcloud.eds.job;
+
+import com.qmth.teachcloud.eds.job.service.JobService;
+import org.quartz.JobExecutionContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import javax.annotation.Resource;
+
+/**
+ * 考生成绩同步
+ */
+public class StudentScoreSyncJob extends QuartzJobBean {
+    private final static Logger log = LoggerFactory.getLogger(StudentScoreSyncJob.class);
+
+    @Resource
+    JobService jobService;
+
+    @Override
+    protected void executeInternal(JobExecutionContext jobExecutionContext) {
+        try {
+            jobService.syncStudentScore();
+        } catch (Exception e) {
+            log.error("ERROR", e);
+        }
+    }
+}

+ 5 - 0
eds/src/main/java/com/qmth/teachcloud/eds/job/service/JobService.java

@@ -9,4 +9,9 @@ public interface JobService {
      * 广东药科大学数据同步
      */
     void syncGdpuData();
+
+    /**
+     * 考生成绩同步
+     */
+    void syncStudentScore();
 }

+ 9 - 1
eds/src/main/java/com/qmth/teachcloud/eds/job/service/impl/JobServiceImpl.java

@@ -2,6 +2,7 @@ package com.qmth.teachcloud.eds.job.service.impl;
 
 import com.qmth.teachcloud.eds.job.service.JobService;
 import com.qmth.teachcloud.eds.service.GdpuService;
+import com.qmth.teachcloud.eds.service.StudentScoreService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -16,7 +17,9 @@ public class JobServiceImpl implements JobService {
     private final static Logger log = LoggerFactory.getLogger(JobServiceImpl.class);
 
     @Resource
-    GdpuService gdpuService;
+    private GdpuService gdpuService;
+    @Resource
+    private StudentScoreService studentScoreService;
 
     /**
      * 广东药科大学数据同步
@@ -34,4 +37,9 @@ public class JobServiceImpl implements JobService {
         // 课程信息表
         gdpuService.syncJwxtKcdmb();
     }
+
+    @Override
+    public void syncStudentScore() {
+        studentScoreService.syncStudentSocre();
+    }
 }

+ 8 - 0
eds/src/main/java/com/qmth/teachcloud/eds/service/StudentScoreService.java

@@ -0,0 +1,8 @@
+package com.qmth.teachcloud.eds.service;
+
+/**
+ * 考生成绩 服务类
+ */
+public interface StudentScoreService {
+    String syncStudentSocre();
+}

+ 12 - 14
eds/src/main/java/com/qmth/teachcloud/eds/service/impl/GdpuServiceImpl.java

@@ -1,14 +1,9 @@
 package com.qmth.teachcloud.eds.service.impl;
 
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.io.IoUtil;
-import cn.hutool.poi.excel.ExcelUtil;
-import cn.hutool.poi.excel.ExcelWriter;
 import com.qmth.teachcloud.eds.dao.GdpuMapper;
 import com.qmth.teachcloud.eds.entity.*;
 import com.qmth.teachcloud.eds.service.GdpuService;
 import com.qmth.teachcloud.eds.utils.gdpu.JdbcUtil;
-import com.qmth.teachcloud.eds.vo.JgVo;
 import org.apache.commons.io.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -17,13 +12,10 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
-import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 /**
  * quartz 服务实现类
@@ -32,6 +24,12 @@ import java.util.Map;
 public class GdpuServiceImpl implements GdpuService {
     private final static Logger log = LoggerFactory.getLogger(GdpuServiceImpl.class);
 
+    // test为数据库名,?后面这句很重要,设置useSSl=false
+    static final String DB_URL = "jdbc:mysql://dexchange.gdpu.edu.cn:3306/ZNKSPT?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8";
+    // 数据库的用户名与密码,需要根据自己的设置
+    static final String USER = "ZNKSPT";
+    static final String PASS = "GdxWs@169139958$";
+
     @Resource
     private GdpuMapper gdpuMapper;
 
@@ -39,12 +37,12 @@ public class GdpuServiceImpl implements GdpuService {
     @Override
     public void syncZtXsxx() {
         String sql = "select * from zt_xsxx";
-        List<ZtXsxx> ztXsxxList = JdbcUtil.query(sql, ZtXsxx.class);
+
+        List<ZtXsxx> ztXsxxList = new JdbcUtil(DB_URL, USER, PASS).query(sql, ZtXsxx.class);
         if (!CollectionUtils.isEmpty(ztXsxxList)) {
             gdpuMapper.deleteZtXsxx();
 
 
-
             List<ZtXsxx> data = new ArrayList<>();
             //5000条提交一次
             for (ZtXsxx ztXsxx : ztXsxxList) {
@@ -64,7 +62,7 @@ public class GdpuServiceImpl implements GdpuService {
     @Override
     public void syncJwxtJgdmb() {
         String sql = "select * from jwxt_jgdmb";
-        List<JwxtJgdmb> jwxtJgdmbList = JdbcUtil.query(sql, JwxtJgdmb.class);
+        List<JwxtJgdmb> jwxtJgdmbList = new JdbcUtil(DB_URL, USER, PASS).query(sql, JwxtJgdmb.class);
         if (!CollectionUtils.isEmpty(jwxtJgdmbList)) {
             gdpuMapper.deleteJwxtJgdmb();
             gdpuMapper.insertJwxtJgdmb(jwxtJgdmbList);
@@ -74,7 +72,7 @@ public class GdpuServiceImpl implements GdpuService {
     @Override
     public void syncJwxtJyzr() {
         String sql = "select * from jwxt_jyzr";
-        List<JwxtJyzr> jwxtJyzrList = JdbcUtil.query(sql, JwxtJyzr.class);
+        List<JwxtJyzr> jwxtJyzrList = new JdbcUtil(DB_URL, USER, PASS).query(sql, JwxtJyzr.class);
         if (!CollectionUtils.isEmpty(jwxtJyzrList)) {
             gdpuMapper.deleteJwxtJyzr();
             gdpuMapper.insertJwxtJyzr(jwxtJyzrList);
@@ -84,7 +82,7 @@ public class GdpuServiceImpl implements GdpuService {
     @Override
     public void syncJwxtJzgxxb() {
         String sql = "select * from jwxt_jzgxxb";
-        List<JwxtJzgxxb> jwxtJzgxxbList = JdbcUtil.query(sql, JwxtJzgxxb.class);
+        List<JwxtJzgxxb> jwxtJzgxxbList = new JdbcUtil(DB_URL, USER, PASS).query(sql, JwxtJzgxxb.class);
         if (!CollectionUtils.isEmpty(jwxtJzgxxbList)) {
             gdpuMapper.deleteJwxtJzgxxb();
             gdpuMapper.insertJwxtJzgxxb(jwxtJzgxxbList);
@@ -94,7 +92,7 @@ public class GdpuServiceImpl implements GdpuService {
     @Override
     public void syncJwxtKcdmb() {
         String sql = "select * from jwxt_kcdmb";
-        List<JwxtKcdmb> jwxtKcdmbList = JdbcUtil.query(sql, JwxtKcdmb.class);
+        List<JwxtKcdmb> jwxtKcdmbList = new JdbcUtil(DB_URL, USER, PASS).query(sql, JwxtKcdmb.class);
         if (!CollectionUtils.isEmpty(jwxtKcdmbList)) {
             gdpuMapper.deleteJwxtKcdmb();
             gdpuMapper.insertJwxtKcdmb(jwxtKcdmbList);

+ 181 - 0
eds/src/main/java/com/qmth/teachcloud/eds/service/impl/StudentScoreServiceImpl.java

@@ -0,0 +1,181 @@
+package com.qmth.teachcloud.eds.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSON;
+import com.qmth.teachcloud.eds.dao.StudentScoreMapper;
+import com.qmth.teachcloud.eds.entity.*;
+import com.qmth.teachcloud.eds.service.StudentScoreService;
+import com.qmth.teachcloud.eds.utils.DateUtils;
+import com.qmth.teachcloud.eds.utils.gdpu.JdbcUtil;
+import com.qmth.teachcloud.eds.vo.ExamQuestion;
+import com.qmth.teachcloud.eds.vo.ExamStudent;
+import com.qmth.teachcloud.eds.vo.ScoreItem;
+import com.qmth.teachcloud.eds.vo.ScoreVo;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.text.DecimalFormat;
+import java.util.*;
+
+/**
+ * 考生成绩 服务实现类
+ */
+@Service
+public class StudentScoreServiceImpl implements StudentScoreService {
+    private final static Logger log = LoggerFactory.getLogger(StudentScoreServiceImpl.class);
+
+    static final String[] chars = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
+
+    // test为数据库名,?后面这句很重要,设置useSSl=false
+//    static final String DB_URL = "jdbc:mysql://localhost:3309/stmms_ft?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8";
+    static final String DB_URL = "jdbc:mysql://localhost:3306/stmms-ft-1.3.14?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8";
+    // 数据库的用户名与密码,需要根据自己的设置
+//    static final String USER = "stmms";
+    static final String USER = "root";
+    //    static final String PASS = "stmms";
+    static final String PASS = "12345678";
+
+    private final static Map<String, List<ExamQuestion>> questionMap = new HashMap<>();
+
+    @Value("${markingcloud.local.examTime}")
+    private Long markExamTime;
+
+    @Resource
+    private StudentScoreMapper studentScoreMapper;
+
+    @Override
+    public String syncStudentSocre() {
+        Date date = new Date(markExamTime);
+        String dateString = DateUtil.format(date, "yyyy-MM-dd HH:mm:ss");
+
+//        String sql = "select a.exam_id examId, a.subject_code subjectCode, a.subject_name subjectName,a.student_code studentCode ,a.name,a.objective_score objectiveScore,a.subjective_score subjectiveScore,a.objective_score_list objectiveScoreList,a.subjective_score_list subjectiveScoreList from eb_exam_student a left join eb_exam b on a.exam_id = b.id where b.create_time >='" + dateString +"'";
+        String sql = "select a.exam_id, a.subject_code, a.subject_name,a.student_code ,a.name,a.objective_score,a.subjective_score,a.objective_score_list,a.subjective_score_list from eb_exam_student a left join eb_exam b on a.exam_id = b.id where b.create_time >='" + dateString + "'";
+//        String sql = "select * from eb_exam_student";
+
+        List<ExamStudent> examStudentList = new JdbcUtil(DB_URL, USER, PASS).query(sql, ExamStudent.class);
+        List<StudentScore> studentScoreList = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(examStudentList)) {
+            studentScoreMapper.deleteExamStudent();
+
+            Long createTime = System.currentTimeMillis();
+            // 每一次进来都清空缓存结构
+            questionMap.clear();
+
+            for (ExamStudent examStudent : examStudentList) {
+                StudentScore studentScore = new StudentScore();
+                studentScore.setExamId(Long.valueOf(examStudent.getExamId()));
+                studentScore.setCourseCode(parseSubjectCode(examStudent.getSubjectCode()));
+                studentScore.setCourseName(examStudent.getSubjectName());
+                studentScore.setCoursePaperId(examStudent.getSubjectCode());
+                studentScore.setStudentCode(examStudent.getStudentCode());
+                studentScore.setStudentName(examStudent.getName());
+                studentScore.setTotalScore(examStudent.getTotalScore());
+                // 客观题打分明细、主观题打分明细
+                makeScoreList(examStudent, studentScore);
+                studentScore.setCreateTime(createTime);
+
+                studentScoreList.add(studentScore);
+            }
+
+            List<StudentScore> data = new ArrayList<>();
+            //2000条提交一次
+            for (StudentScore examStudent : studentScoreList) {
+                if (data.size() == 2000) {
+                    studentScoreMapper.insertExamStudent(data);
+                    data.clear();
+                }
+                data.add(examStudent);
+            }
+            //将剩下的数据也导入
+            if (!data.isEmpty()) {
+                studentScoreMapper.insertExamStudent(data);
+            }
+        }
+
+        return "设置考试日期为:[" + dateString + "]。本次成功查询[" + examStudentList.size() + "]条数据,成功处理[" + studentScoreList.size() + "]条数据";
+    }
+
+    /**
+     * 解析云阅卷科目代码中的知学知考课程代码
+     *
+     * @param subjectCode 云阅卷科目代码
+     */
+    private String parseSubjectCode(String subjectCode) {
+        int lastIndex = 0;
+        for (String aChar : chars) {
+            lastIndex = subjectCode.lastIndexOf(aChar);
+            if (lastIndex > 0) {
+                break;
+            }
+        }
+        if (lastIndex > 0) {
+            return subjectCode.substring(0, lastIndex);
+        }
+        return null;
+    }
+
+    private void makeScoreList(ExamStudent student, StudentScore studentScore) {
+        // 构造客观题得分明细
+        List<ScoreItem> scoreList = student.getScoreList(true);
+        List<ExamQuestion> questionList = listQuestions(Long.valueOf(student.getExamId()), student.getSubjectCode(), true);
+        int i = 0;
+        DecimalFormat df = new DecimalFormat("####.###");
+        List<ScoreVo> objectiveListDetail = new ArrayList<>();
+        for (ScoreItem item : scoreList) {
+            i++;
+            if (questionList.size() < i) {
+                break;
+            }
+            ExamQuestion question = questionList.get(i - 1);
+            if (question.getTotalScore() == null || question.getTotalScore() == 0) {
+                continue;
+            }
+            objectiveListDetail.add(new ScoreVo(String.valueOf(question.getMainNumber()), question.getSubNumber(), df.format(item.getScore()), StringUtils.trimToEmpty(item.getAnswer())));
+        }
+        studentScore.setObjectiveScoreList(JSON.toJSONString(objectiveListDetail));
+
+        // 构造主观题得分明细
+        scoreList = student.getScoreList(false);
+        questionList = listQuestions(Long.valueOf(student.getExamId()), student.getSubjectCode(), false);
+        List<ScoreVo> subjectiveListDetail = new ArrayList<>();
+        i = 0;
+        for (ScoreItem item : scoreList) {
+            i++;
+            if (questionList.size() < i) {
+                break;
+            }
+            ExamQuestion question = questionList.get(i - 1);
+            if (question.getTotalScore() == null || question.getTotalScore() == 0) {
+                continue;
+            }
+            subjectiveListDetail.add(new ScoreVo(String.valueOf(question.getMainNumber()), question.getSubNumber(), df.format(item.getScore())));
+        }
+        studentScore.setSubjectiveScoreList(JSON.toJSONString(subjectiveListDetail));
+    }
+
+    /**
+     * 查询科目试卷结构
+     *
+     * @param examId      考试ID
+     * @param subjectCode 科目代码
+     * @param objective   是否客观题
+     * @return list
+     */
+    private List<ExamQuestion> listQuestions(Long examId, String subjectCode, boolean objective) {
+        String key = examId + subjectCode;
+        if (questionMap.containsKey(key)) {
+            return questionMap.get(key);
+        }
+
+        String sql = "select * from eb_exam_question where exam_id =" + examId + " and subject_code = '" + subjectCode + "' and is_objective =" + objective;
+        List<ExamQuestion> questionList = new JdbcUtil(DB_URL, USER, PASS).query(sql, ExamQuestion.class);
+        questionMap.putIfAbsent(key, questionList);
+        return questionList;
+    }
+}
+

+ 13 - 4
eds/src/main/java/com/qmth/teachcloud/eds/start/StartRunning.java

@@ -2,6 +2,7 @@ package com.qmth.teachcloud.eds.start;
 
 import com.qmth.teachcloud.eds.enums.JobEnum;
 import com.qmth.teachcloud.eds.job.GdpuDataSyncJob;
+import com.qmth.teachcloud.eds.job.StudentScoreSyncJob;
 import com.qmth.teachcloud.eds.service.QuartzService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,14 +31,22 @@ public class StartRunning implements CommandLineRunner {
     @Override
     public void run(String... args) throws Exception {
         log.info("服务器启动时执行 start");
-        // 每天1点开始,每2小时一次
+        // 每天0点开始,一天一次
         log.info("增加自动同步考生定时任务 start");
-        Map JobMap = new HashMap();
-        JobMap.computeIfAbsent("name", v -> GdpuDataSyncJob.class.getName());
+        Map examDataMap = new HashMap();
+        examDataMap.computeIfAbsent("name", v -> GdpuDataSyncJob.class.getName());
         quartzService.deleteJob(JobEnum.GDPU_DATA_JOB.name(), JobEnum.GDPU_DATA_JOB_GROUP.name());
-        quartzService.addJob(GdpuDataSyncJob.class, JobEnum.GDPU_DATA_JOB.name(), JobEnum.GDPU_DATA_JOB_GROUP.name(), "0 0 0 * * ?", JobMap);
+//        quartzService.addJob(GdpuDataSyncJob.class, JobEnum.GDPU_DATA_JOB.name(), JobEnum.GDPU_DATA_JOB_GROUP.name(), "0 0 0 * * ?", examDataMap);
         log.info("增加自动同步考生定时任务 end");
 
+        // 每天1点开始,一天一次
+        log.info("增加自动同步考生成绩定时任务 start");
+        Map scoreMap = new HashMap();
+        scoreMap.computeIfAbsent("name", v -> StudentScoreSyncJob.class.getName());
+        quartzService.deleteJob(JobEnum.STUDENT_SCORE_JOB.name(), JobEnum.STUDENT_SCORE_JOB_GROUP.name());
+        quartzService.addJob(StudentScoreSyncJob.class, JobEnum.STUDENT_SCORE_JOB.name(), JobEnum.STUDENT_SCORE_JOB_GROUP.name(), "0 0 1 * * ?", scoreMap);
+        log.info("增加自动同步考生成绩定时任务 end");
+
         log.info("服务器启动时执行 end");
     }
 }

+ 35 - 10
eds/src/main/java/com/qmth/teachcloud/eds/utils/gdpu/JdbcUtil.java

@@ -7,17 +7,42 @@ public class JdbcUtil {
 
     // MySQL8.0以下版本 - JDBC驱动名及数据库URL
     static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
-    // test为数据库名,?后面这句很重要,设置useSSl=false
-    static final String DB_URL = "jdbc:mysql://dexchange.gdpu.edu.cn:3306/ZNKSPT?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8";
-//    static final String DB_URL = "jdbc:mysql://localhost:3306/exchange-2.0.0?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8";
 
-    // 数据库的用户名与密码,需要根据自己的设置
-//    static final String USER = "root";
-        static final String USER = "ZNKSPT";
-//    static final String PASS = "12345678";
-    static final String PASS = "GdxWs@169139958$";
+    private String dbUrl;
+    private String user;
+    private String pass;
 
-    public static <T> List<T> query(String sql, Class<T> clazz) {
+    public JdbcUtil(String dbUrl, String user, String pass) {
+        this.dbUrl = dbUrl;
+        this.user = user;
+        this.pass = pass;
+    }
+
+    public String getDbUrl() {
+        return dbUrl;
+    }
+
+    public void setDbUrl(String dbUrl) {
+        this.dbUrl = dbUrl;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public String getPass() {
+        return pass;
+    }
+
+    public void setPass(String pass) {
+        this.pass = pass;
+    }
+
+    public <T> List<T> query(String sql, Class<T> clazz) {
         Connection conn = null;
         Statement stmt = null;
         ResultSet rs = null;
@@ -26,7 +51,7 @@ public class JdbcUtil {
             Class.forName(JDBC_DRIVER);
 
             // 打开链接,连接数据库
-            conn = DriverManager.getConnection(DB_URL, USER, PASS);
+            conn = DriverManager.getConnection(this.dbUrl, this.user, this.pass);
             System.out.println("数据库连接成功");
 
             // 执行查询

+ 2 - 1
eds/src/main/java/com/qmth/teachcloud/eds/utils/gdpu/ResultSetUtil.java

@@ -93,7 +93,8 @@ public class ResultSetUtil {
                     }
                     key = StringUtil.toJavaAttributeName(columnName);
                     method = clazz.getDeclaredMethod(StringUtil.asserSetMethodName(key), String.class);
-                    method.invoke(t, rs.getString(columnName));
+                    String result = rs.getString(columnName);
+                    method.invoke(t, result);
                 }
                 list.add(t);
             }

+ 218 - 0
eds/src/main/java/com/qmth/teachcloud/eds/vo/ExamQuestion.java

@@ -0,0 +1,218 @@
+package com.qmth.teachcloud.eds.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+import java.util.LinkedList;
+import java.util.List;
+
+public class ExamQuestion implements Serializable {
+
+    private static final long serialVersionUID = -6614640229855098561L;
+
+    private Integer id;
+
+    @TableField(value = "exam_id")
+    private Integer examId;
+
+    @TableField(value = "subject_code")
+    private String subjectCode;
+
+    @TableField(value = "paper_type")
+    private String paperType;
+
+    @TableField(value = "is_objective")
+    private boolean objective;
+
+    @TableField(value = "main_number")
+    private Integer mainNumber;
+
+    @TableField(value = "sub_number")
+    private String subNumber;
+
+    @TableField(value = "main_title")
+    private String mainTitle;
+
+    @TableField(value = "group_number")
+    private Integer groupNumber;
+
+    @TableField(value = "answer")
+    private String answer;
+
+    @TableField(value = "total_score")
+    private Double totalScore;
+
+    @TableField(value = "interval_score")
+    private Double intervalScore;
+
+    /**
+     * 客观题判分策略
+     */
+    @TableField(value = "objective_policy")
+    private String objectivePolicy;
+
+    @TableField(value = "question_type")
+    private Integer type;
+
+    @TableField(value = "name")
+    private String name;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public boolean isObjective() {
+        return objective;
+    }
+
+    public void setObjective(boolean objective) {
+        this.objective = objective;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public String getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(String subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public String getMainTitle() {
+        return mainTitle;
+    }
+
+    public void setMainTitle(String mainTitle) {
+        this.mainTitle = mainTitle;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    // public String getName() {
+    // if (mainTitle != null && getSubNumber() != null) {
+    // return mainTitle + "-" + getSubNumber();
+    // } else {
+    // return "";
+    // }
+    // }
+
+    public List<Double> getScoreList() {
+        List<Double> list = new LinkedList<Double>();
+        if (totalScore != null && intervalScore != null) {
+            totalScore = totalScore * 100;
+            intervalScore = intervalScore * 100;
+            for (double score = 0; score <= totalScore; score += intervalScore) {
+                list.add(score / 100);
+            }
+            totalScore = totalScore / 100;
+            if (list.get(list.size() - 1) < totalScore) {
+                list.add(totalScore);
+            }
+        }
+        return list;
+    }
+
+    public double[] getScoreListArray() {
+        List<Double> list = getScoreList();
+        int length = list.size();
+        double[] array = new double[length];
+        for (int i = 0; i < list.size(); i++) {
+            array[i] = list.get(i);
+        }
+        return array;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    public Double getIntervalScore() {
+        return intervalScore;
+    }
+
+    public void setIntervalScore(Double intervalScore) {
+        this.intervalScore = intervalScore;
+    }
+
+    public String getQuestionNumber() {
+        return getMainNumber() + "." + getSubNumber();
+    }
+
+    public Integer getGroupNumber() {
+        return groupNumber;
+    }
+
+    public void setGroupNumber(Integer groupNumber) {
+        this.groupNumber = groupNumber;
+    }
+
+    public String getObjectivePolicy() {
+        return objectivePolicy;
+    }
+
+    public void setObjectivePolicy(String objectivePolicy) {
+        this.objectivePolicy = objectivePolicy;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+}

+ 229 - 0
eds/src/main/java/com/qmth/teachcloud/eds/vo/ExamStudent.java

@@ -0,0 +1,229 @@
+package com.qmth.teachcloud.eds.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 云阅卷考生对象
+ */
+public class ExamStudent implements Serializable {
+
+    protected static final long serialVersionUID = 2944870647483950851L;
+
+    public static final String ANSWER_SPLIT = ",";
+
+    public static final String SPLIT = ";";
+
+    /**
+     * 考试ID
+     */
+    @TableField(value = "exam_id")
+    private String examId;
+
+    /**
+     * 科目代码
+     */
+    @TableField(value = "subject_code")
+    private String subjectCode;
+
+    /**
+     * 科目名称
+     */
+    @TableField(value = "subject_name")
+    private String subjectName;
+
+    /**
+     * 学号
+     */
+    @TableField(value = "student_code")
+    private String studentCode;
+
+
+    /**
+     * 姓名
+     */
+    @TableField(value = "name")
+    private String name;
+
+    /**
+     * 客观总分
+     */
+    @TableField(value = "objective_score")
+    private String objectiveScore;
+
+    /**
+     * 客观题得分明细
+     */
+    @TableField(value = "objective_score_list")
+    private String objectiveScoreList;
+
+    /**
+     * 主观总分
+     */
+    @TableField(value = "subjective_score")
+    private String subjectiveScore;
+
+    /**
+     * 主观题得分明细
+     */
+    @TableField(value = "subjective_score_list")
+    private String subjectiveScoreList;
+
+    public String getExamId() {
+        return examId;
+    }
+
+    public void setExamId(String examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getObjectiveScore() {
+        return objectiveScore;
+    }
+
+    public void setObjectiveScore(String objectiveScore) {
+        this.objectiveScore = objectiveScore;
+    }
+
+    public String getSubjectiveScore() {
+        return subjectiveScore;
+    }
+
+    public void setSubjectiveScore(String subjectiveScore) {
+        this.subjectiveScore = subjectiveScore;
+    }
+
+    public String getObjectiveScoreList() {
+        return objectiveScoreList;
+    }
+
+    public void setObjectiveScoreList(String objectiveScoreList) {
+        this.objectiveScoreList = objectiveScoreList;
+    }
+
+    public String getSubjectiveScoreList() {
+        return subjectiveScoreList;
+    }
+
+    public void setSubjectiveScoreList(String subjectiveScoreList) {
+        this.subjectiveScoreList = subjectiveScoreList;
+    }
+
+    public static String buildScoreList(List<ScoreItem> scoreList) {
+        if (scoreList != null) {
+            return StringUtils.join(scoreList, SPLIT);
+        } else {
+            return null;
+        }
+    }
+
+    public void setScoreList(List<ScoreItem> scoreList, boolean objective) {
+        if (scoreList != null) {
+            if (objective) {
+                setObjectiveScoreList(StringUtils.join(scoreList, SPLIT));
+            } else {
+                setSubjectiveScoreList(StringUtils.join(scoreList, SPLIT));
+            }
+        }
+    }
+
+    public List<ScoreItem> getScoreList(boolean objective) {
+        List<ScoreItem> scoreList = new LinkedList<ScoreItem>();
+        try {
+            String[] values = StringUtils.split(objective ? objectiveScoreList : subjectiveScoreList, SPLIT);
+            for (String value : values) {
+                ScoreItem item = ScoreItem.parse(value, objective);
+                item.setObjective(objective);
+                if (item != null) {
+                    scoreList.add(item);
+                }
+            }
+        } catch (Exception e) {
+        }
+        return scoreList;
+    }
+
+    public double getTotalScore() {
+        double score = 0;
+        if (objectiveScore != null) {
+            score = add(score, Double.parseDouble(objectiveScore));
+        }
+        if (subjectiveScore != null) {
+            score = add(score, Double.parseDouble(subjectiveScore));
+        }
+        return score;
+    }
+
+    public String getObjectiveScoreString() {
+        try {
+            return ScoreItem.NUMBER_FORMAT.format(objectiveScore);
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    public String getSubjectiveScoreString() {
+        try {
+            return ScoreItem.NUMBER_FORMAT.format(subjectiveScore);
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    public String getTotalScoreString() {
+        try {
+            return ScoreItem.NUMBER_FORMAT.format(getTotalScore());
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    public static double add(double v1, double v2) {
+
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+
+        return b1.add(b2).doubleValue();
+
+    }
+
+}

+ 112 - 0
eds/src/main/java/com/qmth/teachcloud/eds/vo/ScoreItem.java

@@ -0,0 +1,112 @@
+package com.qmth.teachcloud.eds.vo;
+
+
+import com.qmth.teachcloud.eds.entity.SubjectiveScore;
+
+import java.text.DecimalFormat;
+
+public class ScoreItem {
+
+    public static final String SPLIT = ":";
+
+    public static final DecimalFormat NUMBER_FORMAT = new DecimalFormat("####.###");
+
+    private int mainNumber;
+
+    private String subNumber;
+
+    private String title;
+
+    private Double score;
+
+    private String answer;
+
+    private boolean objective;
+
+    public ScoreItem(SubjectiveScore ss) {
+        this.objective = false;
+        this.mainNumber = ss.getMainNumber();
+        this.subNumber = ss.getSubNumber();
+        this.score = ss.getScore();
+    }
+
+    public ScoreItem(boolean objective) {
+        this.objective = objective;
+    }
+
+    public int getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(int mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public String getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(String subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    public boolean isObjective() {
+        return objective;
+    }
+
+    public void setObjective(boolean objective) {
+        this.objective = objective;
+    }
+
+    public String toString() {
+        return objective ? answer + SPLIT + getScoreString() : getScoreString();
+    }
+
+    public static ScoreItem parse(String content, boolean objective) {
+        ScoreItem item = new ScoreItem(objective);
+        try {
+            if (objective) {
+                String[] values = content.split(SPLIT);
+                item.setAnswer(values[0]);
+                item.setScore(Double.valueOf(values[1]));
+            } else {
+                item.setScore(Double.valueOf(content));
+            }
+        } catch (Exception e) {
+            item = null;
+        }
+        return item;
+    }
+
+    public String getScoreString() {
+        try {
+            return NUMBER_FORMAT.format(score);
+        } catch (Exception e) {
+            return "";
+        }
+    }
+}

+ 58 - 0
eds/src/main/java/com/qmth/teachcloud/eds/vo/ScoreVo.java

@@ -0,0 +1,58 @@
+package com.qmth.teachcloud.eds.vo;
+
+public class ScoreVo {
+
+    private String mainNumber;
+
+    private String subNumber;
+    private String score;
+    private String answer;
+
+    public ScoreVo() {
+    }
+
+    public ScoreVo(String mainNumber, String subNumber, String score) {
+        this.mainNumber = mainNumber;
+        this.subNumber = subNumber;
+        this.score = score;
+    }
+
+    public ScoreVo(String mainNumber, String subNumber, String score, String answer) {
+        this.mainNumber = mainNumber;
+        this.subNumber = subNumber;
+        this.score = score;
+        this.answer = answer;
+    }
+
+    public String getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(String mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public String getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(String subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public String getScore() {
+        return score;
+    }
+
+    public void setScore(String score) {
+        this.score = score;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+}

+ 81 - 0
eds/src/main/java/com/qmth/teachcloud/eds/vo/SubjectiveScorePK.java

@@ -0,0 +1,81 @@
+package com.qmth.teachcloud.eds.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+public class SubjectiveScorePK implements Serializable {
+
+    private static final long serialVersionUID = 7186961625210327765L;
+
+    @TableField(value = "student_id")
+    private Integer studentId;
+
+    @TableField(value = "main_number")
+    private Integer mainNumber;
+
+    @TableField(value = "sub_number")
+    private String subNumber;
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public String getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(String subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    @Override
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + ((studentId == null) ? 0 : studentId.hashCode());
+        result = PRIME * result + ((mainNumber == null) ? 0 : mainNumber.hashCode());
+        result = PRIME * result + ((subNumber == null) ? 0 : subNumber.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        final SubjectiveScorePK other = (SubjectiveScorePK) obj;
+        if (studentId == null) {
+            if (other.studentId != null)
+                return false;
+        } else if (!studentId.equals(other.studentId))
+            return false;
+        if (mainNumber == null) {
+            if (other.mainNumber != null)
+                return false;
+        } else if (!mainNumber.equals(other.mainNumber))
+            return false;
+        if (subNumber == null) {
+            if (other.subNumber != null)
+                return false;
+        } else if (!subNumber.equals(other.subNumber))
+            return false;
+        return true;
+    }
+
+}

+ 5 - 2
eds/src/main/resources/application.properties

@@ -13,7 +13,7 @@ spring.application.name=cas-exchange
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=exchange-gdpu-eds
+db.name=exchange-eds-2.0.1
 db.username=root
 db.password=12345678
 
@@ -65,4 +65,7 @@ spring.freemarker.settings.default_encoding=UTF-8
 spring.freemarker.settings.classic_compatible=true
 spring.freemarker.order=1
 spring.freemarker.request-context-attribute=request
-spring.resources.static-locations=classpath:/templates/static/
+spring.resources.static-locations=classpath:/templates/static/
+
+# [1696989600000]
+markingcloud.local.examTime=1694102400000

+ 13 - 0
eds/src/main/resources/mapper/StudentScoreMapper.xml

@@ -0,0 +1,13 @@
+<?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.eds.dao.StudentScoreMapper">
+    <insert id="insertExamStudent">
+        insert into student_score(exam_id, course_code, course_name, course_paper_id, student_code, student_name, objective_score_list, subjective_score_list, create_time) values
+        <foreach collection="list" item="item" separator=",">
+            (#{item.examId}, #{item.courseCode} , #{item.courseName}, #{item.coursePaperId}, #{item.studentCode}, #{item.studentName}, #{item.objectiveScoreList},#{item.subjectiveScoreList}, #{item.createTime})
+        </foreach>
+    </insert>
+    <delete id="deleteExamStudent">
+        delete from student_score where exam_id > 0
+    </delete>
+</mapper>

+ 7 - 1
pom.xml

@@ -4,7 +4,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.qmth.teachcloud.exchange.service</groupId>
     <artifactId>teachcloud-exchange-service</artifactId>
-    <version>2.0.0.4</version>
+    <version>2.0.1.1</version>
     <packaging>pom</packaging>
 
     <modules>
@@ -42,6 +42,7 @@
         <zip4j.version>1.3.3</zip4j.version>
         <aspectj.version>1.9.6</aspectj.version>
         <nanoid.version>2.0.0</nanoid.version>
+        <commons-lang3.version>3.1</commons-lang3.version>
     </properties>
 
     <dependencyManagement>
@@ -234,6 +235,11 @@
                 <artifactId>spring-boot-starter-quartz</artifactId>
                 <version>${spring-boot.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${commons-lang3.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

+ 2 - 2
teachcloud-exchange-common/pom.xml

@@ -4,13 +4,13 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.qmth.teachcloud.exchange.common</groupId>
     <artifactId>teachcloud-exchange-common</artifactId>
-    <version>2.0.0.4</version>
+    <version>2.0.1.1</version>
     <packaging>jar</packaging>
 
     <parent>
         <groupId>com.qmth.teachcloud.exchange.service</groupId>
         <artifactId>teachcloud-exchange-service</artifactId>
-        <version>2.0.0.4</version>
+        <version>2.0.1.1</version>
     </parent>
 
     <dependencies>