Преглед изворни кода

添加考生重新上传考试答案

qinchao пре 4 година
родитељ
комит
dd2f44784e

+ 9 - 0
pom.xml

@@ -32,6 +32,10 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-mongodb</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
@@ -63,6 +67,11 @@
             <artifactId>easypoi-base</artifactId>
             <version>4.2.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.11.0</version>
+        </dependency>
 
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 29 - 0
src/main/java/cn/com/qmth/examcloud/tool/config/OssClient.java

@@ -0,0 +1,29 @@
+package cn.com.qmth.examcloud.tool.config;
+
+import cn.com.qmth.examcloud.tool.properties.OssProperties;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+@Configuration
+@EnableConfigurationProperties(OssProperties.class)
+public class OssClient {
+
+    @Autowired
+    private OssProperties ossProperties;
+
+    @Bean
+    public OSS oss(){
+        return new OSSClientBuilder().build(ossProperties.getEndpoint(),
+                ossProperties.getAccessKeyId(), ossProperties.getAccessKeySecret());
+    }
+
+}

+ 19 - 0
src/main/java/cn/com/qmth/examcloud/tool/properties/OssProperties.java

@@ -0,0 +1,19 @@
+package cn.com.qmth.examcloud.tool.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix = "oss")
+@Data
+public class OssProperties {
+
+    private String endpoint;
+
+    private String accessKeyId;
+
+    private String accessKeySecret;
+
+}
+
+
+

+ 160 - 0
src/main/java/cn/com/qmth/examcloud/tool/task/updateanswer/UpdateAnswerTask.java

@@ -0,0 +1,160 @@
+package cn.com.qmth.examcloud.tool.task.updateanswer;
+
+import cn.com.qmth.examcloud.tool.task.Task;
+import cn.com.qmth.examcloud.tool.task.updateanswer.entity.ExamRecordEntity;
+import cn.com.qmth.examcloud.tool.task.updateanswer.entity.UpdateAnswerProperties;
+import com.aliyun.oss.OSS;
+import com.mongodb.client.result.UpdateResult;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.util.List;
+import java.util.StringJoiner;
+
+/**
+ * description UpdateAnswerTask
+ *
+ * @author qinchao
+ * @date 2021/3/17 15:15
+ */
+@Component
+@Slf4j
+public class UpdateAnswerTask implements Task {
+
+    private static final String SEPARATOR = "/";
+
+    private static final String UNDERLINE = "_";
+
+    // 小程序答案上传目录
+    private static final String OE_ANSWER_FILE_PATH = "oe-answer-file";
+
+    @Autowired
+    private OSS oss;
+
+    @Autowired
+    private UpdateAnswerProperties answerProperties;
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Override
+    public void start(String params) {
+        log.info("UpdateAnswerTask start");
+        String identityNumber = answerProperties.getIdentityNumber();
+
+        List<ExamRecordEntity> list = getExamRecordList(answerProperties.getExamId(),
+                answerProperties.getCourseCode(), identityNumber);
+        for (ExamRecordEntity entity : list) {
+            File file = new File(answerProperties.getDir());
+            String[] paths = file.list();
+            if (paths != null && paths.length > 0) {
+                String delimiter = "";
+                String prefix = "<div class='photo-answers-block'>";
+                String suffix = "</div>";
+                StringJoiner sj = new StringJoiner(delimiter, prefix, suffix);
+                for (String temp : paths) {
+                    StringBuffer sb = new StringBuffer();
+                    sb.append(OE_ANSWER_FILE_PATH).append(SEPARATOR)
+                            .append(entity.getExamStudentId()).append(SEPARATOR).append(entity.getExamRecordDataId())
+                            .append(SEPARATOR).append(identityNumber).append(UNDERLINE).append(System.currentTimeMillis())
+                            .append(temp.substring(temp.lastIndexOf(".")));
+                    String filePath = sb.toString();
+                    oss.putObject(answerProperties.getBucket(), filePath,
+                            new File(answerProperties.getDir() + SEPARATOR + temp));
+                    String url = getUrl(answerProperties.getDomain(), filePath);
+                    sj.add(buildFileAnswer(url));
+                }
+                // 第二步,更新答案
+                long res = updateAnswer(entity.getExamRecordDataId(), answerProperties.getOrder(), sj.toString());
+                if (res < 1) {
+                    log.error("更新答案失败,身份证号[{}],考试记录id[{}]", identityNumber, entity.getExamId());
+                } else {
+                    log.info("更新答案成功,身份证号[{}],考试记录id[{}]", identityNumber, entity.getExamId());
+                }
+            }
+        }
+        log.info("UpdateAnswerTask end");
+    }
+
+    public List<ExamRecordEntity> getExamRecordList(Long examId, String courseCode,
+                                                    String identityNumber) {
+        String strSql = "select rd.id examRecordDataId,rd.exam_id examId, "
+                + "rd.identity_number identityNumber,c.`code` courseCode,rd.exam_student_id examStudentId "
+                + "from ec_oe_exam_record_data rd "
+                + "inner join ec_b_course c on rd.course_id=c.id " + "where rd.exam_id=" + examId
+                + " and c.`code`='" + courseCode + "'" + " and rd.identity_number='"
+                + identityNumber + "'";
+        return jdbcTemplate.query(strSql, (resultSet, i) -> {
+            ExamRecordEntity entity = new ExamRecordEntity();
+            entity.setExamRecordDataId(resultSet.getLong("examRecordDataId"));
+            entity.setExamStudentId(resultSet.getLong("examStudentId"));
+            entity.setExamId(examId);
+            entity.setCourseCode(courseCode);
+            entity.setIdentityNumber(identityNumber);
+            return entity;
+        });
+    }
+
+    public static String getUrl(String domain, String path) {
+        if (StringUtils.isBlank(domain)) {
+            return null;
+        }
+        if (StringUtils.isBlank(path)) {
+            return null;
+        }
+        if (path.startsWith("/")) {
+            path = path.substring(1);
+        }
+        return domain + "/" + path;
+    }
+
+    public static void main(String[] args) {
+        File file = new File("C:\\Users\\qinchao\\Desktop\\temp");
+        String[] list = file.list();
+        for (String s : list) {
+            System.out.println(s.substring(s.lastIndexOf(".")));
+        }
+    }
+
+    /**
+     * 构建文件格式
+     *
+     * @param fileUrl
+     * @return
+     */
+    private String buildFileAnswer(String fileUrl) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("<a href='" + fileUrl + "' target='_blank' >");
+        sb.append("<img class='photo-answer' src='" + fileUrl + "?x-oss-process=image/resize,m_lfit,h_200,w_200' />");
+        sb.append("</a>");
+        return sb.toString();
+    }
+
+    /**
+     * 更新指定试题的答案
+     *
+     * @param examRecordDataId
+     * @param order
+     * @param newAnswer
+     * @return
+     */
+    public long updateAnswer(Long examRecordDataId, Integer order, String newAnswer) {
+        // 查询相应的题目
+        Query query = Query.query(Criteria.where("examRecordDataId").is(examRecordDataId)
+                .and("examQuestionEntities.order").is(order));
+        Update update = Update.update("examQuestionEntities.$.studentAnswer", newAnswer);
+        UpdateResult upResult = mongoTemplate.updateFirst(query, update, "examRecordQuestions");
+        return upResult.getMatchedCount();
+    }
+}

+ 14 - 0
src/main/java/cn/com/qmth/examcloud/tool/task/updateanswer/entity/ExamRecordEntity.java

@@ -0,0 +1,14 @@
+package cn.com.qmth.examcloud.tool.task.updateanswer.entity;
+
+import lombok.Data;
+
+@Data
+public class ExamRecordEntity {
+
+    private Long examId;
+    private String courseCode;
+    private Long examRecordDataId;
+    private String identityNumber;
+    private Long examStudentId;
+
+}

+ 32 - 0
src/main/java/cn/com/qmth/examcloud/tool/task/updateanswer/entity/UpdateAnswerProperties.java

@@ -0,0 +1,32 @@
+package cn.com.qmth.examcloud.tool.task.updateanswer.entity;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * description UpdateAnswerVO
+ *
+ * @author qinchao
+ * @date 2021/3/17 16:45
+ */
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "updateanswer")
+public class UpdateAnswerProperties {
+
+    private String bucket;
+
+    private String domain;
+
+    private String dir;
+
+    private Long examId;
+
+    private Integer order;
+
+    private String courseCode;
+
+    private String identityNumber;
+
+}

+ 43 - 19
src/main/resources/application.properties

@@ -9,35 +9,45 @@ logging.level.org.hibernate=WARN
 logging.level.org.apache=WARN
 logging.level.cn.com.qmth=INFO
 # task config
-examcloud.task.active=true
-examcloud.task.impl=cn.com.qmth.examcloud.tool.task.demo.DemoTask
+examcloud.task.active=false
+examcloud.task.impl=cn.com.qmth.examcloud.tool.task.updateanswer.UpdateAnswerTask
 examcloud.task.params=xxx
 # datasource config
 spring.datasource.url=jdbc:mysql://${dsurl.host}:${dsurl.port}/${dsurl.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2b8&rewriteBatchedStatements=true
 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 spring.jpa.hibernate.ddl-auto=validate
-# dev
-dsurl.host=192.168.10.30
-dsurl.port=3306
-dsurl.database=exam_cloud_dev
-spring.datasource.username=exam_cloud_dev
-spring.datasource.password=exam_cloud_dev
-spring.redis.host=192.168.10.30
-spring.redis.port=6379
-spring.redis.password=examcloud
-spring.redis.database=0
 
-# test
-#dsurl.host=qmth-db4.mysql.rds.aliyuncs.com
+#mongodb
+mguri.hostAndPortGroup=dds-wz972dde5d2d78e433270.mongodb.rds.aliyuncs.com:3717
+mguri.username=exam-cloud-dev
+mguri.password=Examcloud123
+mguri.database=admin
+spring.data.mongodb.uri=mongodb://${mguri.username}:${mguri.password}@${mguri.hostAndPortGroup}/${mguri.database}
+spring.data.mongodb.grid-fs-database=examcloud-core-oe
+spring.data.mongodb.database=examcloud-core-oe
+
+# dev
+#dsurl.host=192.168.10.30
 #dsurl.port=3306
-#dsurl.database=exam_cloud_test
-#spring.datasource.username=exam_cloud_test
-#spring.datasource.password=******
-#spring.redis.host=192.168.1.91
+#dsurl.database=exam_cloud_dev
+#spring.datasource.username=exam_cloud_dev
+#spring.datasource.password=exam_cloud_dev
+#spring.redis.host=192.168.10.30
 #spring.redis.port=6379
-#spring.redis.password=******
+#spring.redis.password=examcloud
 #spring.redis.database=0
 
+# test
+dsurl.host=qmth-db4.mysql.rds.aliyuncs.com
+dsurl.port=3306
+dsurl.database=exam_cloud_test
+spring.datasource.username=exam_cloud_test
+spring.datasource.password=Examcloud123
+spring.redis.host=192.168.1.91
+spring.redis.port=6379
+spring.redis.password=jkhm45-UO8rFc-q2Eb90
+spring.redis.database=0
+
 # prod
 #dsurl.host=qmth-db1.mysql.rds.aliyuncs.com
 #dsurl.port=3306
@@ -48,3 +58,17 @@ spring.redis.database=0
 #spring.redis.port=6379
 #spring.redis.password=******
 #spring.redis.database=0
+
+# oss
+oss.endpoint=https://oss-cn-shenzhen.aliyuncs.com
+oss.accessKeyId=LTAI4FboXLCJzrjVo5dUoXaU
+oss.accessKeySecret=O0my6eSAl1Ic62WvxEf3WlMXox1LNX
+
+# oss update answer
+updateanswer.bucket=examcloud-test
+updateanswer.domain=https://ecs-test-static.qmth.com.cn
+updateanswer.dir=C:/Users/qinchao/Desktop/temp
+updateanswer.examId=282
+updateanswer.order=5
+updateanswer.courseCode=CSKC
+updateanswer.identityNumber=4213021989