Prechádzať zdrojové kódy

merge from release_v3.0

deason 5 rokov pred
rodič
commit
6f3e7df8d4

+ 4 - 6
pom.xml

@@ -3,17 +3,17 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <artifactId>examcloud-app-api</artifactId>
-    <version>2019-SNAPSHOT</version>
+    <version>v3.0-RELEASE</version>
     <packaging>jar</packaging>
 
     <parent>
         <groupId>cn.com.qmth.examcloud</groupId>
         <artifactId>examcloud-parent</artifactId>
-        <version>2019</version>
+        <version>v3.0-RELEASE</version>
     </parent>
 
     <properties>
-        <examcloud.version>2019-SNAPSHOT</examcloud.version>
+        <examcloud.version>v3.0-RELEASE</examcloud.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <java.version>1.8</java.version>
@@ -108,7 +108,7 @@
             <dependency>
                 <groupId>com.alibaba</groupId>
                 <artifactId>fastjson</artifactId>
-                <version>1.2.62</version>
+                <version>1.2.71</version>
             </dependency>
             <dependency>
                 <groupId>com.google.guava</groupId>
@@ -179,8 +179,6 @@
     </dependencyManagement>
 
     <build>
-        <finalName>examcloud-app-api</finalName>
-
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>

+ 3 - 2
shell/start.sh

@@ -1,8 +1,9 @@
 #!/bin/bash
 
 FILE_PATH=$(cd `dirname $0`; pwd)
-APP_VERSION=`cat $FILE_PATH/version`
-APP_MAIN_JAR="examcloud-app-api-"$APP_VERSION"-SNAPSHOT.jar"
+
+APP_MAIN_JAR="examcloud-app-api-v3.0-RELEASE.jar"
+
 JAVA_OPTS=`cat $FILE_PATH/start.vmoptions`
 APP_ARGS=`cat $FILE_PATH/start.args`
 

+ 2 - 2
shell/stop.sh

@@ -1,8 +1,8 @@
 #!/bin/bash
 
 FILE_PATH=$(cd `dirname $0`; pwd)
-APP_VERSION=`cat $FILE_PATH/version`
-APP_MAIN_JAR="examcloud-app-api-"$APP_VERSION"-SNAPSHOT.jar"
+
+APP_MAIN_JAR="examcloud-app-api-v3.0-RELEASE.jar"
 
 PID_LIST=`ps -ef|grep $APP_MAIN_JAR|grep java|awk '{print $2}'`
 

+ 0 - 1
shell/version

@@ -1 +0,0 @@
-2019

+ 16 - 11
src/main/java/cn/com/qmth/examcloud/app/controller/PracticeExamRestController.java

@@ -61,10 +61,15 @@ public class PracticeExamRestController {
         return oeService.startPracticeExamRecord(key, token, examStudentId);
     }
 
+    @ApiOperation(value = "获取结束练习的试卷大题结构信息接口")
+    @RequestMapping(value = "/exam/admin/record/paper/struct/list", method = {RequestMethod.POST})
+    public Result getExamAdminRecordPaperStructList(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token, @RequestParam String examRecordId,@RequestParam(required = false) String fromCache) throws Exception {
+        return oeService.getAdminExamPaperStructList(key, token, examRecordId,fromCache);
+    }
     @ApiOperation(value = "获取当前练习的试卷大题结构信息接口")
-    @RequestMapping(value = "/exam/record/paper/struct/list", method = {RequestMethod.POST})
-    public Result getExamRecordPaperStructList(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token, @RequestParam String examRecordId) throws Exception {
-        return oeService.getExamRecordPaperStructList(key, token, examRecordId);
+    @RequestMapping(value = "/exam/student/record/paper/struct/list", method = {RequestMethod.POST})
+    public Result getExamStudentRecordPaperStructList(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token, @RequestParam String examRecordId) throws Exception {
+        return oeService.getStudentExamPaperStructList(key, token, examRecordId);
     }
 
     @ApiOperation(value = "获取当前练习的考试基本信息接口")
@@ -87,8 +92,8 @@ public class PracticeExamRestController {
 
     @ApiOperation(value = "保存或更新考生作答的某个试题答案接口")
     @RequestMapping(value = "/exam/record/paper/question/answer/update", method = {RequestMethod.POST})
-    public Result updateExamRecordPaperQuestionAnswer(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token, @RequestParam Integer order, @RequestParam String studentAnswer) throws Exception {
-        return oeService.updateExamRecordPaperQuestionAnswer(key, token, order, studentAnswer);
+    public Result updateExamRecordPaperQuestionAnswer(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token, @RequestParam Integer order, @RequestParam String studentAnswer,@RequestParam(required = false) String audioPlayTimes) throws Exception {
+        return oeService.updateExamRecordPaperQuestionAnswer(key, token, order, studentAnswer,audioPlayTimes);
     }
 
     @ApiOperation(value = "当前练习的交卷接口")
@@ -111,8 +116,8 @@ public class PracticeExamRestController {
 
     @ApiOperation(value = "获取成绩报告的答题情况统计接口")
     @RequestMapping(value = "/exam/record/total", method = {RequestMethod.POST})
-    public Result getExamRecordTotalInfo(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token, @RequestParam String examRecordId) throws Exception {
-        return oeService.getExamRecordTotalInfo(key, token, examRecordId);
+    public Result getExamRecordTotalInfo(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token, @RequestParam String examRecordId,@RequestParam(required = false) String fromCache) throws Exception {
+        return oeService.getExamRecordTotalInfo(key, token, examRecordId,fromCache);
     }
 
     @ApiOperation(value = "获取作答的题列表接口")
@@ -141,14 +146,14 @@ public class PracticeExamRestController {
 
     @ApiOperation(value = "查询练习记录配置信息")
     @RequestMapping(value = "/exam/practice/end/findExamRecordDataEntity/{examRecordDataId}", method = {RequestMethod.POST})
-    public Result findExamRecordDataEntity(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token, @PathVariable Long examRecordDataId) throws Exception {
-        return oeService.findExamRecordDataEntity(key, token, examRecordDataId);
+    public Result findExamRecordDataEntity(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token, @PathVariable Long examRecordDataId,@RequestParam(required = false) String fromCache) throws Exception {
+        return oeService.findExamRecordDataEntity(key, token, examRecordDataId, fromCache);
     }
 
     @ApiOperation(value = "查询练习记录试题列表")
     @RequestMapping(value = "/exam/practice/end/getExamRecordQuestions/{examRecordDataId}", method = {RequestMethod.POST})
-    public Result getExamRecordQuestions(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token, @PathVariable Long examRecordDataId) throws Exception {
-        return oeService.getExamRecordQuestions(key, token, examRecordDataId);
+    public Result getExamRecordQuestions(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token, @PathVariable Long examRecordDataId,@RequestParam(required = false) String fromCache) throws Exception {
+        return oeService.getExamRecordQuestions(key, token, examRecordDataId,fromCache);
     }
 
     @ApiOperation(value = "查询某个试题内容")

+ 82 - 11
src/main/java/cn/com/qmth/examcloud/app/service/CoreOeService.java

@@ -1,12 +1,12 @@
 /*
- * *************************************************
- * Copyright (c) 2018 QMTH. All Rights Reserved.
- * Created by Deason on 2018-07-31 17:31:34.
+ * ************************************************* Copyright (c) 2018 QMTH.
+ * All Rights Reserved. Created by Deason on 2018-07-31 17:31:34.
  * *************************************************
  */
 
 package cn.com.qmth.examcloud.app.service;
 
+import cn.com.qmth.examcloud.app.model.GetYunSignatureReq;
 import cn.com.qmth.examcloud.app.model.Result;
 
 /**
@@ -60,7 +60,8 @@ public interface CoreOeService {
      * @return
      * @throws Exception
      */
-    Result uploadPaperAnswer(String key, String token, String examRecordId, byte[] fileBytes, String fileName, String md5) throws Exception;
+    Result uploadPaperAnswer(String key, String token, String examRecordId, byte[] fileBytes, String fileName,
+            String md5) throws Exception;
 
     /**
      * 获取某考试批次下的课程列表
@@ -103,7 +104,19 @@ public interface CoreOeService {
      * @return
      * @throws Exception
      */
-    Result getExamRecordPaperStructList(String key, String token, String examRecordId) throws Exception;
+    Result getAdminExamPaperStructList(String key, String token, String examRecordId, String fromCache)
+            throws Exception;
+
+    /**
+     * 获取当前练习的试卷大题结构信息
+     *
+     * @param key
+     * @param token
+     * @param examRecordId
+     * @return
+     * @throws Exception
+     */
+    Result getStudentExamPaperStructList(String key, String token, String examRecordId) throws Exception;
 
     /**
      * 获取当前练习的试卷试题列表
@@ -124,7 +137,8 @@ public interface CoreOeService {
      * @return
      * @throws Exception
      */
-    Result getExamRecordPaperQuestionDetail(String key, String token, String questionId, String examRecordId) throws Exception;
+    Result getExamRecordPaperQuestionDetail(String key, String token, String questionId, String examRecordId)
+            throws Exception;
 
     /**
      * 保存或更新考生作答的某个试题答案
@@ -135,7 +149,8 @@ public interface CoreOeService {
      * @return
      * @throws Exception
      */
-    Result updateExamRecordPaperQuestionAnswer(String key, String token, Integer order, String studentAnswer) throws Exception;
+    Result updateExamRecordPaperQuestionAnswer(String key, String token, Integer order, String studentAnswer,String audioPlayTimes)
+            throws Exception;
 
     /**
      * 当前练习的交卷
@@ -177,7 +192,7 @@ public interface CoreOeService {
      * @return
      * @throws Exception
      */
-    Result getExamRecordTotalInfo(String key, String token, String examRecordId) throws Exception;
+    Result getExamRecordTotalInfo(String key, String token, String examRecordId, String fromCache) throws Exception;
 
     /**
      * 获取作答的题列表
@@ -211,7 +226,8 @@ public interface CoreOeService {
      * @return
      * @throws Exception
      */
-    Result updateExamRecordQuestionAudioPlayTimes(String key, String token, String questionId, String mediaName) throws Exception;
+    Result updateExamRecordQuestionAudioPlayTimes(String key, String token, String questionId, String mediaName)
+            throws Exception;
 
     /**
      * 练习记录配置信息
@@ -222,7 +238,7 @@ public interface CoreOeService {
      * @return
      * @throws Exception
      */
-    Result findExamRecordDataEntity(String key, String token, Long examRecordDataId) throws Exception;
+    Result findExamRecordDataEntity(String key, String token, Long examRecordDataId, String fromCache) throws Exception;
 
     /**
      * 练习记录试题列表
@@ -233,6 +249,61 @@ public interface CoreOeService {
      * @return
      * @throws Exception
      */
-    Result getExamRecordQuestions(String key, String token, Long examRecordDataId) throws Exception;
+    Result getExamRecordQuestions(String key, String token, Long examRecordDataId, String fromCache) throws Exception;
+
+    /**
+     * 查询考生的考试批次属性集
+     * 
+     * @param key
+     * @param token
+     * @param examId
+     * @param keys
+     * @return
+     * @throws Exception
+     */
+    Result getExamPropertyFromCacheByStudentSession(String key, String token, Long examId, String keys)
+            throws Exception;
+
+    /**
+     * 根据Id获取试卷
+     * 
+     * @param key
+     * @param token
+     * @param paperId
+     * @return
+     */
+    Result getPaperById(String key, String token, String paperId) throws Exception;
+
+    /**获取文件上传签名
+     * @param key
+     * @param token
+     * @param req
+     * @return
+     * @throws Exception
+     */
+    Result getYunSignature(String key, String token, GetYunSignatureReq req) throws Exception;
+
+    /**获取在线考试待考列表
+     * @param key
+     * @param token
+     * @return
+     */
+    Result queryExamList(String key, String token) throws Exception;
+
+    /**获取考试记录信息
+     * @param key
+     * @param token
+     * @param examRecordDataId
+     * @return
+     */
+    Result getEndExamInfo(String key, String token, Long examRecordDataId) throws Exception;
+
+    /**根据examStudentId获取客观分信息
+     * @param key
+     * @param token
+     * @param examStudentId
+     * @return
+     */
+    Result queryObjectiveScoreList(String key, String token, Long examStudentId) throws Exception;
 
 }

+ 94 - 14
src/main/java/cn/com/qmth/examcloud/app/service/impl/CoreOeServiceImpl.java

@@ -12,14 +12,17 @@ import cn.com.qmth.examcloud.app.core.utils.DateUtils;
 import cn.com.qmth.examcloud.app.core.utils.HttpUtils;
 import cn.com.qmth.examcloud.app.core.utils.JsonMapper;
 import cn.com.qmth.examcloud.app.model.Constants;
+import cn.com.qmth.examcloud.app.model.GetYunSignatureReq;
 import cn.com.qmth.examcloud.app.model.Result;
 import cn.com.qmth.examcloud.app.service.CoreOeService;
 import cn.com.qmth.examcloud.app.core.SysProperty;
 import okhttp3.FormBody;
+import okhttp3.FormBody.Builder;
 import okhttp3.MediaType;
 import okhttp3.MultipartBody;
 import okhttp3.RequestBody;
 import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -61,14 +64,14 @@ public class CoreOeServiceImpl implements CoreOeService {
     @Override
     public Result getOfflineExamCourseList(String key, String token) throws Exception {
         //封装请求参数									
-        final String requestUrl = String.format("%s/api/ecs_oe_student/offlineExam/getOfflineCourse", sysProperty.getCoreOeStudentUrl());
+        final String requestUrl = String.format("%s/api/ecs_oe_admin/offlineExam/getOfflineCourse", sysProperty.getCoreOeAdminUrl());
         return HttpUtils.doGet(requestUrl, key, token);
     }
 
     @Override
     public Result startOfflineExamRecord(String key, String token, String examStudentId) throws Exception {
         //封装请求参数									
-        final String requestUrl = String.format("%s/api/ecs_oe_student/offlineExam/startOfflineExam?examStudentId=%s", sysProperty.getCoreOeStudentUrl(), examStudentId);
+        final String requestUrl = String.format("%s/api/ecs_oe_admin/offlineExam/startOfflineExam?examStudentId=%s", sysProperty.getCoreOeAdminUrl(), examStudentId);
         return HttpUtils.doGet(requestUrl, key, token);
     }
 
@@ -84,7 +87,7 @@ public class CoreOeServiceImpl implements CoreOeService {
             throw new ApiException("File must be not empty.");
         }
         //封装请求参数									
-        final String requestUrl = String.format("%s/api/ecs_oe_student/offlineExam/submitPaper?examRecordDataId=%s", sysProperty.getCoreOeStudentUrl(), examRecordId);
+        final String requestUrl = String.format("%s/api/ecs_oe_admin/offlineExam/submitPaper?examRecordDataId=%s", sysProperty.getCoreOeAdminUrl(), examRecordId);
         MultipartBody.Builder form = new MultipartBody.Builder().setType(MultipartBody.FORM);
         RequestBody body = RequestBody.create(MediaType.parse("application/octet-stream"), fileBytes);
         form.addFormDataPart("file", fileName, body);
@@ -96,7 +99,7 @@ public class CoreOeServiceImpl implements CoreOeService {
     @Override
     public Result getPracticeExamCourseList(String key, String token, String examId) throws Exception {
         //封装请求参数
-        final String requestUrl = String.format("%s/api/ecs_oe_student/practice/queryPracticeCourseList?examId=%s", sysProperty.getCoreOeStudentUrl(), examId);
+        final String requestUrl = String.format("%s/api/ecs_oe_admin/practice/queryPracticeCourseList?examId=%s", sysProperty.getCoreOeAdminUrl(), examId);
         return HttpUtils.doGet(requestUrl, key, token);
     }
 
@@ -115,9 +118,20 @@ public class CoreOeServiceImpl implements CoreOeService {
     }
 
     @Override
-    public Result getExamRecordPaperStructList(String key, String token, String examRecordId) throws Exception {
+    public Result getAdminExamPaperStructList(String key, String token, String examRecordId,String fromCache) throws Exception {
         //封装请求参数
-        final String requestUrl = String.format("%s/api/ecs_oe_student/examRecordPaperStruct/getExamRecordPaperStruct?examRecordDataId=%s", sysProperty.getCoreOeStudentUrl(), examRecordId);
+        String requestUrl=null;
+        if("1".equals(fromCache)) {
+            requestUrl = String.format("%s/api/ecs_oe_admin/examRecordPaperStruct/getExamRecordPaperStruct?fromCache=1&examRecordDataId=%s", sysProperty.getCoreOeAdminUrl(), examRecordId);
+        }else {
+            requestUrl = String.format("%s/api/ecs_oe_admin/examRecordPaperStruct/getExamRecordPaperStruct?examRecordDataId=%s", sysProperty.getCoreOeAdminUrl(), examRecordId);
+        }
+        return HttpUtils.doGet(requestUrl, key, token);
+    }
+    @Override
+    public Result getStudentExamPaperStructList(String key, String token, String examRecordId) throws Exception {
+        //封装请求参数
+        String requestUrl = String.format("%s/api/ecs_oe_student/examRecordPaperStruct/getExamRecordPaperStruct?fromCache=1&examRecordDataId=%s", sysProperty.getCoreOeStudentUrl(), examRecordId);
         return HttpUtils.doGet(requestUrl, key, token);
     }
 
@@ -136,13 +150,14 @@ public class CoreOeServiceImpl implements CoreOeService {
     }
 
     @Override
-    public Result updateExamRecordPaperQuestionAnswer(String key, String token, Integer order, String studentAnswer) throws Exception {
+    public Result updateExamRecordPaperQuestionAnswer(String key, String token, Integer order, String studentAnswer,String audioPlayTimes) throws Exception {
         //封装请求参数
         final String requestUrl = String.format("%s/api/ecs_oe_student/examQuestion/submitQuestionAnswer", sysProperty.getCoreOeStudentUrl());
         List<Map> paramsList = new ArrayList<Map>();
         Map<String, Object> params = new HashMap<>();
         params.put("order", order);
         params.put("studentAnswer", studentAnswer);
+        params.put("audioPlayTimes", audioPlayTimes);
         paramsList.add(params);
         String json = new JsonMapper().toJson(paramsList);
         RequestBody formBody = FormBody.create(MediaType.parse(Constants.CHARSET_JSON_UTF8), json);
@@ -166,14 +181,19 @@ public class CoreOeServiceImpl implements CoreOeService {
     @Override
     public Result getExamRecordPracticeHistoryList(String key, String token, String examStudentId) throws Exception {
         //封装请求参数
-        final String requestUrl = String.format("%s/api/ecs_oe_student/practice/queryPracticeRecordList?examStudentId=%s", sysProperty.getCoreOeStudentUrl(), examStudentId);
+        final String requestUrl = String.format("%s/api/ecs_oe_admin/practice/queryPracticeRecordList?examStudentId=%s", sysProperty.getCoreOeAdminUrl(), examStudentId);
         return HttpUtils.doGet(requestUrl, key, token);
     }
 
     @Override
-    public Result getExamRecordTotalInfo(String key, String token, String examRecordId) throws Exception {
+    public Result getExamRecordTotalInfo(String key, String token, String examRecordId,String fromCache) throws Exception {
         //封装请求参数
-        final String requestUrl = String.format("%s/api/ecs_oe_student/practice/getPracticeDetailInfo?examRecordDataId=%s", sysProperty.getCoreOeStudentUrl(), examRecordId);
+        String requestUrl=null;
+        if("1".equals(fromCache)) {
+            requestUrl = String.format("%s/api/ecs_oe_admin/practice/getPracticeDetailInfo?fromCache=1&examRecordDataId=%s", sysProperty.getCoreOeAdminUrl(), examRecordId);
+        }else {
+            requestUrl = String.format("%s/api/ecs_oe_admin/practice/getPracticeDetailInfo?examRecordDataId=%s", sysProperty.getCoreOeAdminUrl(), examRecordId);
+        }
         return HttpUtils.doGet(requestUrl, key, token);
     }
 
@@ -203,9 +223,14 @@ public class CoreOeServiceImpl implements CoreOeService {
     }
 
     @Override
-    public Result findExamRecordDataEntity(String key, String token, Long examRecordDataId) throws Exception {
+    public Result findExamRecordDataEntity(String key, String token, Long examRecordDataId,String fromCache) throws Exception {
         //封装请求参数
-        final String requestUrl = String.format("%s/api/ecs_oe_admin/exam/record/data/findExamRecordDataEntity?examRecordDataId=%s", sysProperty.getCoreOeAdminUrl(), examRecordDataId);
+        String requestUrl=null;
+        if("1".equals(fromCache)) {
+            requestUrl = String.format("%s/api/ecs_oe_admin/exam/record/data/findExamRecordDataEntity?fromCache=1&examRecordDataId=%s", sysProperty.getCoreOeAdminUrl(), examRecordDataId);
+        }else {
+            requestUrl = String.format("%s/api/ecs_oe_admin/exam/record/data/findExamRecordDataEntity?examRecordDataId=%s", sysProperty.getCoreOeAdminUrl(), examRecordDataId);
+        }
         Result<String> result = HttpUtils.doGet(requestUrl, key, token);
         if (result.isSuccess()) {
             //过滤掉为空的属性
@@ -215,9 +240,14 @@ public class CoreOeServiceImpl implements CoreOeService {
     }
 
     @Override
-    public Result getExamRecordQuestions(String key, String token, Long examRecordDataId) throws Exception {
+    public Result getExamRecordQuestions(String key, String token, Long examRecordDataId,String fromCache) throws Exception {
         //封装请求参数
-        final String requestUrl = String.format("%s/api/ecs_oe_admin/examRecordQuestions/getExamRecordQuestions?examRecordDataId=%s", sysProperty.getCoreOeAdminUrl(), examRecordDataId);
+        String requestUrl=null;
+        if("1".equals(fromCache)) {
+            requestUrl = String.format("%s/api/ecs_oe_admin/examRecordQuestions/getExamRecordQuestions?fromCache=1&examRecordDataId=%s", sysProperty.getCoreOeAdminUrl(), examRecordDataId);
+        }else {
+            requestUrl = String.format("%s/api/ecs_oe_admin/examRecordQuestions/getExamRecordQuestions?examRecordDataId=%s", sysProperty.getCoreOeAdminUrl(), examRecordDataId);
+        }
         Result<String> result = HttpUtils.doGet(requestUrl, key, token);
         if (result.isSuccess()) {
             //过滤掉为空的属性
@@ -226,4 +256,54 @@ public class CoreOeServiceImpl implements CoreOeService {
         return result;
     }
 
+    @Override
+    public Result getExamPropertyFromCacheByStudentSession(String key, String token,Long examId,String keys) throws Exception {
+        //封装请求参数
+        final String requestUrl = String.format("%s/api/ecs_exam_work/exam/getExamPropertyFromCacheByStudentSession/"+examId+"/"+keys, sysProperty.getCoreExamWorkUrl());
+        Result<String> result = HttpUtils.doGet(requestUrl, key, token);
+        return result;
+    }
+
+    @Override
+    public Result getPaperById(String key, String token, String paperId) throws Exception {
+        final String requestUrl = String.format("%s/api/ecs_ques/paper/"+paperId, sysProperty.getCoreQuestionUrl());
+        Result<String> result = HttpUtils.doGet(requestUrl, key, token);
+        return result;
+    }
+    
+    @Override
+    public Result getYunSignature(String key, String token, GetYunSignatureReq req) throws Exception {
+        //封装请求参数
+        final String requestUrl = String.format("%s/api/ecs_oe_student/examControl/yunSignature", sysProperty.getCoreOeStudentUrl());
+        Builder b= new FormBody.Builder()
+                .add("examRecordDataId", req.getExamRecordDataId())
+                .add("order", req.getOrder())
+                .add("fileMd5", req.getFileMd5())
+                .add("fileSuffix", req.getFileSuffix());
+        if(StringUtils.isNotBlank(req.getExt())) {
+                b.add("ext", req.getExt());
+        }
+        RequestBody formBody =b.build();
+                 
+        return HttpUtils.doPost(requestUrl, formBody, key, token);
+    }
+
+    @Override
+    public Result queryExamList(String key, String token) throws Exception {
+        final String requestUrl = String.format("%s/api/ecs_oe_admin/examControl/queryExamList", sysProperty.getCoreOeAdminUrl());
+        return HttpUtils.doGet(requestUrl, key, token);
+    }
+
+    @Override
+    public Result getEndExamInfo(String key, String token, Long examRecordDataId) throws Exception {
+        final String requestUrl = String.format("%s/api/ecs_oe_student/examControl/getEndExamInfo?examRecordDataId="+examRecordDataId, sysProperty.getCoreOeStudentUrl());
+        return HttpUtils.doGet(requestUrl, key, token);
+    }
+
+    @Override
+    public Result queryObjectiveScoreList(String key, String token, Long examStudentId) throws Exception {
+        final String requestUrl = String.format("%s/api/ecs_oe_admin/exam/score/queryObjectiveScoreList?examStudentId="+examStudentId, sysProperty.getCoreOeAdminUrl());
+        return HttpUtils.doGet(requestUrl, key, token);
+    }
+
 }