Browse Source

3.4.6 20250619 数据同步加新字段

xiaofei 1 day ago
parent
commit
4fea7ee103

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

@@ -2381,7 +2381,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             } else {
                 examTask.setPaperNumber(printCommonService.autoCreatePaperNumber(examId));
             }
-            examTask.setClassDesc(examTaskDataVo.getPaperNumberDesc());
+            examTask.setClassDesc(examTaskDataVo.getClassDesc());
 
             examTask.setReview(basicPrintConfig.getReview());
             // 取课程所在机构

+ 1 - 0
distributed-print/install/mysql/init/teachcloud_db.sql

@@ -6470,6 +6470,7 @@ CREATE TABLE IF NOT EXISTS `t_sync_data`
     `exam_id`        bigint      NOT NULL COMMENT '考试ID',
     `xn` VARCHAR(45) NULL COMMENT '学年(考务)',
     `xq` VARCHAR(45) NULL COMMENT '学期(考务)',
+    `ksmc` VARCHAR(100) NULL COMMENT '考试名称(考务)',
     `data_type`      varchar(45) NOT NULL COMMENT '同步数据类型(A:机构同步,B:用户同步,C:课程同步,D:考生同步,E:命题任务同步)',
     `start_time`     bigint       DEFAULT NULL COMMENT '同步开始时间',
     `end_time`       bigint       DEFAULT NULL COMMENT '同步结束时间',

+ 2 - 1
distributed-print/install/mysql/upgrade/3.4.5.sql

@@ -147,7 +147,8 @@ ALTER TABLE `mark_student` ADD COLUMN `ai_mark_abnormal` TINYINT(1) NULL DEFAULT
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('496', 'AI阅卷(开关)', 'OpenAiMark', 'BUTTON', '897', '4', 'AUTH', '1', '0', '1');
 ALTER TABLE `t_sync_data`
     ADD COLUMN `xn` VARCHAR(45) NULL COMMENT '学年(考务)' AFTER `exam_id`,
-ADD COLUMN `xq` VARCHAR(45) NULL COMMENT '学期(考务)' AFTER `xn`;
+ADD COLUMN `xq` VARCHAR(45) NULL COMMENT '学期(考务)' AFTER `xn`,
+    ADD COLUMN `ksmc` VARCHAR(100) NULL COMMENT '考试名称(考务)' AFTER `xq`;
 
 INSERT INTO `sys_role_privilege` (`id`,`role_id`,`privilege_id`,`enable`,`school_id`) VALUES (1914588152174108680,2,1222,1,NULL);
 INSERT INTO `sys_role_privilege` (`id`,`role_id`,`privilege_id`,`enable`,`school_id`) VALUES (1914588152174108681,2,1223,1,NULL);

+ 2 - 1
distributed-print/src/main/resources/upgrade/3.4.5/3.4.5-upgrade.sql

@@ -146,7 +146,8 @@ ALTER TABLE `mark_task` ADD COLUMN `next_retry_time` BIGINT(20) NULL COMMENT '
 ALTER TABLE `mark_student` ADD COLUMN `ai_mark_abnormal` TINYINT(1) NULL DEFAULT 0 COMMENT 'ai评卷异常' AFTER `version`;
 ALTER TABLE `t_sync_data`
     ADD COLUMN `xn` VARCHAR(45) NULL COMMENT '学年(考务)' AFTER `exam_id`,
-ADD COLUMN `xq` VARCHAR(45) NULL COMMENT '学期(考务)' AFTER `xn`;
+ADD COLUMN `xq` VARCHAR(45) NULL COMMENT '学期(考务)' AFTER `xn`,
+    ADD COLUMN `ksmc` VARCHAR(45) NULL COMMENT '考试名称(考务)' AFTER `xq`;
 
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('496', 'AI阅卷(开关)', 'OpenAiMark', 'BUTTON', '897', '4', 'AUTH', '1', '0', '1');
 INSERT INTO `sys_role_privilege` (`id`,`role_id`,`privilege_id`,`enable`,`school_id`) VALUES (1914588152174108680,2,1222,1,NULL);

+ 8 - 8
distributed-print/src/test/java/com/qmth/distributed/print/AiMarkTest.java

@@ -70,10 +70,10 @@ public class AiMarkTest {
     public void test() throws Exception {
         Long examId = 664876885490008064l;
         // 空白卷有分的考生
-//        Long questionId = 667465212315566080l;
-//        Long studentId = 665602689425473536l;
-//        String paperNumber = "27210002-1";
-//        String subjectName = "马克思主义基本原理-北院/藏新";
+        Long questionId = Long.parseLong("1934559380958556162");
+        Long studentId = Long.parseLong("667325662096261120"); //667325662096261120 667325662343725056   667325664495403008
+        String paperNumber = "27160014";
+        String subjectName = "习近平新时代中国特色社会主义思想概论";
 
         // 无法评卷考生
 //        Long questionId = Long.parseLong("1934063467957837828");
@@ -82,10 +82,10 @@ public class AiMarkTest {
 //        String subjectName = "形势与政策(理论)";
 
         // code=400, body={"code":400000,"error":"request parameter invalid"}
-        Long questionId = Long.parseLong("1934063467957837827");
-        Long studentId = Long.parseLong("665624448732233728");
-        String paperNumber = "27160011";
-        String subjectName = "形势与政策(理论)";
+//        Long questionId = Long.parseLong("1934063467957837827");
+//        Long studentId = Long.parseLong("665624448732233728");
+//        String paperNumber = "27160011";
+//        String subjectName = "形势与政策(理论)";
         List<MarkOcrStudentQuestion> markOcrStudentQuestions = markOcrStudentQuestionService.listByStudentIdAndQuestionId(studentId, questionId);
         if (CollectionUtils.isEmpty(markOcrStudentQuestions)) {
             return;

+ 40 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/sync/ExamTaskDataVo.java

@@ -7,6 +7,12 @@ import io.swagger.annotations.ApiModelProperty;
  */
 public class ExamTaskDataVo {
 
+    @ApiModelProperty(value = "学年名")
+    private String xnm;
+    @ApiModelProperty(value = "学期名")
+    private String xqm;
+    @ApiModelProperty(value = "考试名称")
+    private String ksmc;
     @ApiModelProperty(value = "课程代码")
     private String courseCode;
     @ApiModelProperty(value = "课程名称")
@@ -25,9 +31,35 @@ public class ExamTaskDataVo {
     private String teacherCode;
     @ApiModelProperty(value = "命题老师名称")
     private String teacherName;
+    @ApiModelProperty(value = "教学班组成")
+    private String classDesc;
     @ApiModelProperty(value = "是否启用")
     private Boolean enable;
 
+    public String getXnm() {
+        return xnm;
+    }
+
+    public void setXnm(String xnm) {
+        this.xnm = xnm;
+    }
+
+    public String getXqm() {
+        return xqm;
+    }
+
+    public void setXqm(String xqm) {
+        this.xqm = xqm;
+    }
+
+    public String getKsmc() {
+        return ksmc;
+    }
+
+    public void setKsmc(String ksmc) {
+        this.ksmc = ksmc;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }
@@ -100,6 +132,14 @@ public class ExamTaskDataVo {
         this.teacherName = teacherName;
     }
 
+    public String getClassDesc() {
+        return classDesc;
+    }
+
+    public void setClassDesc(String classDesc) {
+        this.classDesc = classDesc;
+    }
+
     public Boolean getEnable() {
         return enable;
     }

+ 35 - 23
teachcloud-data/src/main/java/com/qmth/teachcloud/data/DataUtil.java

@@ -35,9 +35,9 @@ public class DataUtil {
 
         String sql;
         if ("ORACLE".equals(datasourceType.trim())) {
-            sql = getOracleSql(null, null, dataType, false);
+            sql = getOracleSql(null, null, null, dataType, false);
         } else if ("MYSQL".equals(datasourceType.trim())) {
-            sql = getMysqlSql(dataType, false, null, null);
+            sql = getMysqlSql(dataType, false, null, null, null);
         } else {
             throw ExceptionResultEnum.ERROR.exception("只支持Oracle和Mysql数据库");
         }
@@ -47,10 +47,10 @@ public class DataUtil {
     public List<UserDataVo> listUser(JdbcTemplate jdbcTemplate, DataType dataType, String datasourceType) {
         String sql;
         if ("ORACLE".equals(datasourceType.trim())) {
-            sql = getOracleSql(null, null, dataType, true, "code");
+            sql = getOracleSql(null, null, null, dataType, true, "code");
             return pageOracle(jdbcTemplate, sql, UserDataVo.class);
         } else if ("MYSQL".equals(datasourceType.trim())) {
-            sql = getMysqlSql(dataType, true, null, null);
+            sql = getMysqlSql(dataType, true, null, null, null);
             return pageMysql(jdbcTemplate, sql, UserDataVo.class);
         } else {
             throw ExceptionResultEnum.ERROR.exception("只支持Oracle和Mysql数据库");
@@ -60,34 +60,34 @@ public class DataUtil {
     public List<CourseDataVo> listCourse(JdbcTemplate jdbcTemplate, DataType dataType, String datasourceType) {
         String sql;
         if ("ORACLE".equals(datasourceType.trim())) {
-            sql = getOracleSql(null, null, dataType, false);
+            sql = getOracleSql(null, null, null, dataType, false);
         } else if ("MYSQL".equals(datasourceType.trim())) {
-            sql = getMysqlSql(dataType, false, null, null);
+            sql = getMysqlSql(dataType, false, null, null, null);
         } else {
             throw ExceptionResultEnum.ERROR.exception("只支持Oracle和Mysql数据库");
         }
         return query(jdbcTemplate, sql, CourseDataVo.class);
     }
 
-    public List<ExamTaskDataVo> listExamTask(JdbcTemplate jdbcTemplate, DataType dataType, String datasourceType) {
+    public List<ExamTaskDataVo> listExamTask(JdbcTemplate jdbcTemplate, DataType dataType, String datasourceType, String xn, String xq, String ksmc) {
         String sql;
         if ("ORACLE".equals(datasourceType.trim())) {
-            sql = getOracleSql(null, null, dataType, false);
+            sql = getOracleSql(xn, xq, ksmc, dataType, false);
         } else if ("MYSQL".equals(datasourceType.trim())) {
-            sql = getMysqlSql(dataType, false, null, null);
+            sql = getMysqlSql(dataType, false, xn, xq, ksmc);
         } else {
             throw ExceptionResultEnum.ERROR.exception("只支持Oracle和Mysql数据库");
         }
         return query(jdbcTemplate, sql, ExamTaskDataVo.class);
     }
 
-    public List<TSyncDataStudent> listExamStudent(JdbcTemplate jdbcTemplate, DataType dataType, String datasourceType, String xn, String xq) {
+    public List<TSyncDataStudent> listExamStudent(JdbcTemplate jdbcTemplate, DataType dataType, String datasourceType, String xn, String xq, String ksmc) {
         String sql;
         if ("ORACLE".equals(datasourceType.trim())) {
-            sql = getOracleSql(xn, xq, dataType, true, "coursecode", "studentcode");
+            sql = getOracleSql(xn, xq, ksmc, dataType, true, "coursecode", "studentcode");
             return pageOracle(jdbcTemplate, sql, TSyncDataStudent.class);
         } else if ("MYSQL".equals(datasourceType.trim())) {
-            sql = getMysqlSql(dataType, true, xn, xq);
+            sql = getMysqlSql(dataType, true, xn, xq, ksmc);
             return pageMysql(jdbcTemplate, sql, TSyncDataStudent.class);
         } else {
             throw ExceptionResultEnum.ERROR.exception("只支持Oracle和Mysql数据库");
@@ -121,7 +121,7 @@ public class DataUtil {
             List<T> list;
             int pageNumber = 0;
             do {
-                int offset = pageNumber * PAGE_SIZE ;
+                int offset = pageNumber * PAGE_SIZE;
                 list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(tClass), offset, PAGE_SIZE);
                 if (CollectionUtils.isNotEmpty(list)) {
                     listAll.addAll(list);
@@ -160,7 +160,7 @@ public class DataUtil {
         return listAll;
     }
 
-    private String getMysqlSql(DataType dataType, boolean isPage, String xn, String xq) {
+    private String getMysqlSql(DataType dataType, boolean isPage, String xn, String xq, String ksmc) {
         //sql语句
         StringJoiner sql = new StringJoiner("");
         if (isPage) {
@@ -173,6 +173,9 @@ public class DataUtil {
             if (StringUtils.isNotBlank(xq)) {
                 sql.add(" and xqm = \'" + xq + "\'");
             }
+            if (StringUtils.isNotBlank(ksmc)) {
+                sql.add(" and ksmc = \'" + ksmc + "\'");
+            }
             sql.add(" limit ?, ?");
         } else {
             sql.add("select * from ");
@@ -184,11 +187,14 @@ public class DataUtil {
             if (StringUtils.isNotBlank(xq)) {
                 sql.add(" and xqm = \'" + xq + "\'");
             }
+            if (StringUtils.isNotBlank(ksmc)) {
+                sql.add(" and ksmc = \'" + ksmc + "\'");
+            }
         }
         return sql.toString();
     }
 
-    private String getOracleSql(String xn, String xq, DataType dataType, boolean isPage, String... sortColumn) {
+    private String getOracleSql(String xn, String xq, String ksmc, DataType dataType, boolean isPage, String... sortColumn) {
         //sql语句
         String sql;
         if (isPage) {
@@ -208,6 +214,9 @@ public class DataUtil {
             if (StringUtils.isNotBlank(xq)) {
                 stringJoiner.add(" and xqm = \'" + xq + "\'");
             }
+            if (StringUtils.isNotBlank(ksmc)) {
+                stringJoiner.add(" and ksmc = \'" + ksmc + "\'");
+            }
             stringJoiner.add(" )  WHERE rn BETWEEN ? AND ?");
             sql = stringJoiner.toString();
         } else {
@@ -218,6 +227,9 @@ public class DataUtil {
             if (StringUtils.isNotBlank(xq)) {
                 sql += " and xqm = \'" + xq + "\'";
             }
+            if (StringUtils.isNotBlank(ksmc)) {
+                sql += " and ksmc = \'" + ksmc + "\'";
+            }
         }
         log.info(dataType.getName() + "数据同步sql:" + sql);
         return sql;
@@ -226,15 +238,15 @@ public class DataUtil {
 
     public static void main(String[] args) {
         DataUtil dataUtil = new DataUtil();
-        System.out.println(dataUtil.getOracleSql(null, null, DataType.B, true, "semestercode"));
-        System.out.println(dataUtil.getOracleSql(null, null, DataType.B, false, "semestercode", "examname"));
-        System.out.println(dataUtil.getOracleSql("2023-2024", "1", DataType.B, true, "semestercode"));
-        System.out.println(dataUtil.getOracleSql("2023-2024", "", DataType.B, false, "semestercode"));
+        System.out.println(dataUtil.getOracleSql(null, null, null, DataType.B, true, "semestercode"));
+        System.out.println(dataUtil.getOracleSql(null, null, null, DataType.B, false, "semestercode", "examname"));
+        System.out.println(dataUtil.getOracleSql("2023-2024", "1", null, DataType.B, true, "semestercode"));
+        System.out.println(dataUtil.getOracleSql("2023-2024", "", null, DataType.B, false, "semestercode"));
         System.out.println("------------------------------------");
-        System.out.println(dataUtil.getMysqlSql(DataType.B, true, null, null));
-        System.out.println(dataUtil.getMysqlSql(DataType.B, false, null, null));
-        System.out.println(dataUtil.getMysqlSql(DataType.B, true, "2023-2024", "1"));
-        System.out.println(dataUtil.getMysqlSql(DataType.B, false, "2023-2024", ""));
+        System.out.println(dataUtil.getMysqlSql(DataType.B, true, null, null, null));
+        System.out.println(dataUtil.getMysqlSql(DataType.B, false, null, null, null));
+        System.out.println(dataUtil.getMysqlSql(DataType.B, true, "2023-2024", "1", null));
+        System.out.println(dataUtil.getMysqlSql(DataType.B, false, "2023-2024", "", null));
     }
 
     public DataSource createDataSourceMap(Long schoolId) {

+ 11 - 0
teachcloud-data/src/main/java/com/qmth/teachcloud/data/entity/TSyncData.java

@@ -45,6 +45,9 @@ public class TSyncData implements Serializable {
     @ApiModelProperty(value = "学期(考务)")
     private String xq;
 
+    @ApiModelProperty(value = "考试名称(考务)")
+    private String ksmc;
+
     @ApiModelProperty(value = "同步数据类型(A:机构同步,B:用户同步,C:课程同步,D:考生同步,E:命题任务同步)")
     private String dataType;
 
@@ -131,6 +134,14 @@ public class TSyncData implements Serializable {
         this.xq = xq;
     }
 
+    public String getKsmc() {
+        return ksmc;
+    }
+
+    public void setKsmc(String ksmc) {
+        this.ksmc = ksmc;
+    }
+
     public String getDataType() {
         return dataType;
     }

+ 2 - 2
teachcloud-data/src/main/java/com/qmth/teachcloud/data/service/DataService.java

@@ -16,7 +16,7 @@ public interface DataService {
 
     SyncDataResult syncCourse(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType);
 
-    SyncDataResult syncStudent(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType, String xn, String xq);
+    SyncDataResult syncStudent(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType, String xn, String xq, String ksmc);
 
-    SyncDataResult syncExamTask(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType);
+    SyncDataResult syncExamTask(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType, String xn, String xq, String ksmc);
 }

+ 6 - 6
teachcloud-data/src/main/java/com/qmth/teachcloud/data/service/impl/DataServiceImpl.java

@@ -117,7 +117,7 @@ public class DataServiceImpl implements DataService {
         // 考生同步
         if (dataRange.contains(DataType.D.name())) {
             log.info("开始同步考生");
-            SyncDataResult syncDataResult = syncStudent(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString(), syncData.getXn(), syncData.getXq());
+            SyncDataResult syncDataResult = syncStudent(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString(), syncData.getXn(), syncData.getXq(), syncData.getKsmc());
             stringJoiner.add(DataType.D.name() + ":" + syncDataResult.getCount());
             sendSms = StringUtils.isNotBlank(syncDataResult.getErrMsg()) ? true : sendSms;
             log.info("结束同步考生,状态" + sendSms);
@@ -125,7 +125,7 @@ public class DataServiceImpl implements DataService {
         // 命题任务同步
         if (dataRange.contains(DataType.E.name())) {
             log.info("开始同步命题任务");
-            SyncDataResult syncDataResult = syncExamTask(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString());
+            SyncDataResult syncDataResult = syncExamTask(jdbcTemplate, schoolId, examId, datasourceType.getConfigValue().toString(), syncData.getXn(), syncData.getXq(), syncData.getKsmc());
             stringJoiner.add(DataType.E.name() + ":" + syncDataResult.getCount());
             sendSms = StringUtils.isNotBlank(syncDataResult.getErrMsg()) ? true : sendSms;
             log.info("结束同步命题任务,状态" + sendSms);
@@ -209,7 +209,7 @@ public class DataServiceImpl implements DataService {
 
     @Transactional
     @Override
-    public SyncDataResult syncStudent(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType, String xn, String xq) {
+    public SyncDataResult syncStudent(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType, String xn, String xq, String ksmc) {
         long startTime = System.currentTimeMillis();
         int successCount;
         String errMsg = null;
@@ -217,7 +217,7 @@ public class DataServiceImpl implements DataService {
         Map<String, Object> map = new HashMap<>();
         try {
             log.info("考生同步:查询待同步考生开始");
-            dataVoList = dataUtil.listExamStudent(jdbcTemplate, DataType.D, datasourceType, xn, xq);
+            dataVoList = dataUtil.listExamStudent(jdbcTemplate, DataType.D, datasourceType, xn, xq, ksmc);
             log.info("考生同步:查询待同步考生结束。数量:{}", dataVoList.size());
             log.info("考生同步:处理考试时间开始");
             for (TSyncDataStudent tSyncDataStudent : dataVoList) {
@@ -263,9 +263,9 @@ public class DataServiceImpl implements DataService {
 
     @Transactional
     @Override
-    public SyncDataResult syncExamTask(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType) {
+    public SyncDataResult syncExamTask(JdbcTemplate jdbcTemplate, Long schoolId, Long examId, String datasourceType, String xn, String xq, String ksmc) {
         long startTime = System.currentTimeMillis();
-        List<ExamTaskDataVo> dataVoList = dataUtil.listExamTask(jdbcTemplate, DataType.E, datasourceType);
+        List<ExamTaskDataVo> dataVoList = dataUtil.listExamTask(jdbcTemplate, DataType.E, datasourceType, xn, xq, ksmc);
         log.info("查询到待同步命题任务数量:" + dataVoList.size());
         StringJoiner errorMsg = new StringJoiner("\n");
         AtomicInteger i = new AtomicInteger(0);