Procházet zdrojové kódy

Merge remote-tracking branch 'origin/dev' into dev

wangliang před 4 roky
rodič
revize
baf99dbadb

+ 69 - 0
themis-backend/src/main/java/com/qmth/themis/backend/api/TEOpenController.java

@@ -0,0 +1,69 @@
+package com.qmth.themis.backend.api;
+
+import javax.annotation.Resource;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.qmth.themis.business.service.TEOpenService;
+import com.qmth.themis.business.util.RedisUtil;
+import com.qmth.themis.common.exception.BusinessException;
+import com.qmth.themis.common.util.Result;
+import com.qmth.themis.common.util.ResultUtil;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+
+/**开放接口
+ * @Description: 
+ * @Author: xiatian
+ * @Date: 2020-10-19
+ */
+@Api(tags = "开放接口")
+@RestController
+@RequestMapping("/${prefix.url.open}")
+public class TEOpenController {
+
+    @Resource
+    private TEOpenService openService;
+
+    @Resource
+    RedisUtil redisUtil;
+
+
+    @ApiOperation(value = "获取考试详情")
+    @RequestMapping(value = "/exam/query", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
+    public Result examQueryPage(@ApiParam(value = "考试id", required = false) @RequestParam(required = false) Long examId,
+                                     @ApiParam(value = "考试code", required = false) @RequestParam(required = false) String code,
+                                     @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                                     @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+    	if(pageSize>20) {
+    		throw new BusinessException("每页最大条数为20");
+    	}
+        return ResultUtil.ok(openService.examQueryPage(examId, code, pageNumber, pageSize));
+    }
+    
+    @ApiOperation(value = "获取考试课程详情")
+    @RequestMapping(value = "/exam/course/query", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
+    public Result examCourseQueryPage(@ApiParam(value = "考试id", required = true) @RequestParam Long examId,
+                                     @ApiParam(value = "课程code", required = false) @RequestParam(required = false) String courseCode,
+                                     @ApiParam(value = "是否有试卷", required = false) @RequestParam(required = false) Boolean hasPaper,
+                                     @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                                     @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+    	if(pageSize>100) {
+    		throw new BusinessException("每页最大条数为100");
+    	}
+    	if(examId==null) {
+    		throw new BusinessException("考试id不能为空");
+    	}
+        return ResultUtil.ok(openService.examCourseQueryPage(examId, courseCode,hasPaper, pageNumber, pageSize));
+    }
+
+}

+ 1 - 0
themis-backend/src/main/resources/application.properties

@@ -162,6 +162,7 @@ rocketmq.producer.customized-trace-topic=my-trace-topic
 
 #api\u524D\u7F00
 prefix.url.admin=api/admin
+prefix.url.open=api/open
 
 #\u65E0\u9700\u9274\u6743\u7684url
 no.auth.urls=/webjars/**,/druid/**,/swagger-ui.html,/doc.html,/swagger-resources/**,/v2/api-docs,/webjars/springfox-swagger-ui/**,/api/admin/user/login/account,/api/admin/sys/org/queryByOrgCode,/file/**,/upload/**,/client/**,/base_photo/**,/frontend/**

+ 90 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/backend/OpenExamBean.java

@@ -0,0 +1,90 @@
+package com.qmth.themis.business.bean.backend;
+
+import com.qmth.themis.business.enums.ExamModeEnum;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("开放接口-考试详情")
+public class OpenExamBean {
+
+	@ApiModelProperty(name = "考试id")
+    private Long id;
+
+	@ApiModelProperty(value = "考试code")
+    private String code;
+
+    @ApiModelProperty(value = "批次名称")
+    private String name;
+
+    @ApiModelProperty(value = "批次标注,可用于多个考试批次归类")
+    private String tag;
+
+    @ApiModelProperty(value = "批次开始时间")
+    private Long startTime;
+
+    @ApiModelProperty(value = "批次结束时间")
+    private Long endTime;
+    
+    @ApiModelProperty(value = "模式")
+    private ExamModeEnum mode;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getTag() {
+		return tag;
+	}
+
+	public void setTag(String tag) {
+		this.tag = tag;
+	}
+
+	public Long getStartTime() {
+		return startTime;
+	}
+
+	public void setStartTime(Long startTime) {
+		this.startTime = startTime;
+	}
+
+	public Long getEndTime() {
+		return endTime;
+	}
+
+	public void setEndTime(Long endTime) {
+		this.endTime = endTime;
+	}
+
+	public ExamModeEnum getMode() {
+		return mode;
+	}
+
+	public void setMode(ExamModeEnum mode) {
+		this.mode = mode;
+	}
+    
+    
+    
+}

+ 65 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/backend/OpenExamCourseBean.java

@@ -0,0 +1,65 @@
+package com.qmth.themis.business.bean.backend;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("开放接口-考试课程详情")
+public class OpenExamCourseBean {
+
+	@ApiModelProperty(value = "课程code")
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "试卷数")
+    private Integer paperCount;
+
+    @ApiModelProperty(value = "是否开启客观题乱序")
+    private Boolean objectiveShuffle;
+
+    @ApiModelProperty(value = "是否选项乱序")
+    private Boolean optionShuffle;
+
+	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 Integer getPaperCount() {
+		return paperCount;
+	}
+
+	public void setPaperCount(Integer paperCount) {
+		this.paperCount = paperCount;
+	}
+
+	public Boolean getObjectiveShuffle() {
+		return objectiveShuffle;
+	}
+
+	public void setObjectiveShuffle(Boolean objectiveShuffle) {
+		this.objectiveShuffle = objectiveShuffle;
+	}
+
+	public Boolean getOptionShuffle() {
+		return optionShuffle;
+	}
+
+	public void setOptionShuffle(Boolean optionShuffle) {
+		this.optionShuffle = optionShuffle;
+	}
+    
+    
+}

+ 8 - 4
themis-business/src/main/java/com/qmth/themis/business/dao/TEExamCourseMapper.java

@@ -1,13 +1,15 @@
 package com.qmth.themis.business.dao;
 
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.themis.business.bean.backend.OpenExamCourseBean;
 import com.qmth.themis.business.dto.response.TEExamCourseDto;
 import com.qmth.themis.business.entity.TEExamCourse;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.Map;
 
 /**
  * @Description: 考试科目 Mapper 接口
@@ -33,4 +35,6 @@ public interface TEExamCourseMapper extends BaseMapper<TEExamCourse> {
     public IPage<TEExamCourseDto> examCourseQuery(IPage<Map> iPage, @Param("id") Long id, @Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("courseName") String courseName, @Param("hasPaper") Integer hasPaper);
 
     public TEExamCourse findByExamIdAndCourseCode(@Param("examId") Long examId, @Param("courseCode") String courseCode);
+
+	public IPage<OpenExamCourseBean> examCourseQueryForOpen(IPage<OpenExamCourseBean> ipage,@Param("examId") Long examId, @Param("courseCode") String courseCode,@Param("hasPaper") Boolean hasPaper);
 }

+ 9 - 6
themis-business/src/main/java/com/qmth/themis/business/dao/TEExamMapper.java

@@ -1,19 +1,20 @@
 package com.qmth.themis.business.dao;
 
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.themis.business.bean.backend.OpenExamBean;
 import com.qmth.themis.business.dto.response.TEExamDto;
 import com.qmth.themis.business.dto.response.TEExamQueryDto;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.enums.InvigilateMonitorStatusEnum;
 import com.qmth.themis.business.enums.ScoreStatusEnum;
 
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-import java.util.Map;
-
 /**
  * @Description: 考试批次 Mapper 接口
  * @Param:
@@ -69,4 +70,6 @@ public interface TEExamMapper extends BaseMapper<TEExam> {
 	public void updateInvigilateMonitorStatus(@Param("monitorStatus") InvigilateMonitorStatusEnum monitorStatus,@Param("examId") Long examId);
 
 	public void updateScoreStatus(@Param("scoreStatus") ScoreStatusEnum scoreStatus,@Param("examId") Long examId);
+	
+	public IPage<OpenExamBean> examQueryForOpen(IPage<OpenExamBean> iPage, @Param("id") Long id, @Param("code") String code);
 }

+ 12 - 0
themis-business/src/main/java/com/qmth/themis/business/domain/PrefixUrlDomain.java

@@ -20,6 +20,8 @@ public class PrefixUrlDomain implements Serializable {
     String mobile;
 
     String third;
+    
+    String open;
 
     public String getAdmin() {
         return admin;
@@ -60,4 +62,14 @@ public class PrefixUrlDomain implements Serializable {
     public void setThird(String third) {
         this.third = third;
     }
+
+	public String getOpen() {
+		return open;
+	}
+
+	public void setOpen(String open) {
+		this.open = open;
+	}
+    
+    
 }

+ 13 - 0
themis-business/src/main/java/com/qmth/themis/business/service/TEOpenService.java

@@ -0,0 +1,13 @@
+package com.qmth.themis.business.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.themis.business.bean.backend.OpenExamBean;
+import com.qmth.themis.business.bean.backend.OpenExamCourseBean;
+
+public interface TEOpenService {
+
+	public IPage<OpenExamBean> examQueryPage(Long examId, String examCode, int pageNumber, int pageSize);
+
+	public IPage<OpenExamCourseBean> examCourseQueryPage(Long examId, String courseCode, Boolean hasPaper, int pageNumber, int pageSize);
+
+}

+ 84 - 26
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java

@@ -1,14 +1,65 @@
 package com.qmth.themis.business.service.impl;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.UUID;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.themis.business.bean.exam.*;
+import com.qmth.themis.business.bean.exam.AnswerSubmitBean;
+import com.qmth.themis.business.bean.exam.AudioLeftPlayCountSubmitBean;
+import com.qmth.themis.business.bean.exam.ExamFileUploadBean;
+import com.qmth.themis.business.bean.exam.ExamFinishBean;
+import com.qmth.themis.business.bean.exam.ExamPrepareBean;
+import com.qmth.themis.business.bean.exam.ExamResultBean;
+import com.qmth.themis.business.bean.exam.ExamResumeBean;
+import com.qmth.themis.business.bean.exam.ExamStartBean;
+import com.qmth.themis.business.bean.exam.StudentPaperStructBean;
 import com.qmth.themis.business.cache.ExamActivityRecordCacheUtil;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.ExamingDataCacheUtil;
 import com.qmth.themis.business.cache.RedisKeyHelper;
-import com.qmth.themis.business.cache.bean.*;
+import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
+import com.qmth.themis.business.cache.bean.ExamActivityRecordCacheBean;
+import com.qmth.themis.business.cache.bean.ExamCacheBean;
+import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
+import com.qmth.themis.business.cache.bean.ExamPaperCacheBean;
+import com.qmth.themis.business.cache.bean.ExamStudentAnswerCacheBean;
+import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
+import com.qmth.themis.business.cache.bean.ExamStudentPaperStructCacheBean;
+import com.qmth.themis.business.cache.bean.ObjectiveAnswerCacheBean;
 import com.qmth.themis.business.config.SystemConfig;
 import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
@@ -22,33 +73,40 @@ import com.qmth.themis.business.entity.TBSession;
 import com.qmth.themis.business.entity.TBTaskHistory;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.entity.TOeExamRecord;
-import com.qmth.themis.business.enums.*;
-import com.qmth.themis.business.service.*;
-import com.qmth.themis.business.util.*;
+import com.qmth.themis.business.enums.EntryAuthenticationPolicyEnum;
+import com.qmth.themis.business.enums.ExamModeEnum;
+import com.qmth.themis.business.enums.ExamRecordFieldEnum;
+import com.qmth.themis.business.enums.ExamRecordStatusEnum;
+import com.qmth.themis.business.enums.FinishExamResultEnum;
+import com.qmth.themis.business.enums.FinishTypeEnum;
+import com.qmth.themis.business.enums.HardwareTestEnum;
+import com.qmth.themis.business.enums.InvigilateMonitorStatusEnum;
+import com.qmth.themis.business.enums.InvigilateVerifyEnum;
+import com.qmth.themis.business.enums.MonitorStatusSourceEnum;
+import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
+import com.qmth.themis.business.enums.MqTagEnum;
+import com.qmth.themis.business.enums.MqTopicEnum;
+import com.qmth.themis.business.enums.ReviewResultEnum;
+import com.qmth.themis.business.enums.ScoreStatusEnum;
+import com.qmth.themis.business.enums.SystemOperationEnum;
+import com.qmth.themis.business.enums.TaskStatusEnum;
+import com.qmth.themis.business.enums.WebsocketStatusEnum;
+import com.qmth.themis.business.service.MqDtoService;
+import com.qmth.themis.business.service.TBTaskHistoryService;
+import com.qmth.themis.business.service.TEExamActivityService;
+import com.qmth.themis.business.service.TEExamCourseService;
+import com.qmth.themis.business.service.TEExamPaperService;
+import com.qmth.themis.business.service.TEExamService;
+import com.qmth.themis.business.service.TEExamStudentService;
+import com.qmth.themis.business.service.TOeExamRecordService;
+import com.qmth.themis.business.util.JacksonUtil;
+import com.qmth.themis.business.util.OssUtil;
+import com.qmth.themis.business.util.RedisUtil;
+import com.qmth.themis.business.util.ServletUtil;
+import com.qmth.themis.business.util.TencentYunUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.IpUtil;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.springframework.beans.BeanUtils;
-import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.CachePut;
-import org.springframework.cache.annotation.Cacheable;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.annotation.Resource;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
 
 /**
  * @Description: 考试批次 服务实现类

+ 42 - 0
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEOpenServiceImpl.java

@@ -0,0 +1,42 @@
+package com.qmth.themis.business.service.impl;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.themis.business.bean.backend.OpenExamBean;
+import com.qmth.themis.business.bean.backend.OpenExamCourseBean;
+import com.qmth.themis.business.dao.TEExamCourseMapper;
+import com.qmth.themis.business.dao.TEExamMapper;
+import com.qmth.themis.business.service.TEOpenService;
+
+@Service
+public class TEOpenServiceImpl implements TEOpenService {
+
+    @Resource
+    TEExamMapper teExamMapper;
+    
+    @Resource
+    TEExamCourseMapper examCourseMapper;
+	
+	
+	@Override
+	public IPage<OpenExamBean> examQueryPage(Long examId, String examCode, int pageNumber, int pageSize) {
+		Page<OpenExamBean> ipage = new Page<>(pageNumber, pageSize);
+        ipage.addOrder(OrderItem.desc("t.create_time"));
+		return teExamMapper.examQueryForOpen(ipage, examId, examCode);
+	}
+
+
+	@Override
+	public IPage<OpenExamCourseBean> examCourseQueryPage(Long examId, String courseCode, Boolean hasPaper,
+			int pageNumber, int pageSize) {
+		Page<OpenExamCourseBean> ipage = new Page<>(pageNumber, pageSize);
+        ipage.addOrder(OrderItem.desc("t.create_time"));
+		return examCourseMapper.examCourseQueryForOpen(ipage, examId,courseCode, hasPaper);
+	}
+
+}

+ 27 - 0
themis-business/src/main/resources/mapper/TEExamCourseMapper.xml

@@ -72,4 +72,31 @@
 		select * from t_e_exam_course t
 		where t.exam_id=#{examId} and t.course_code =#{courseCode}
 	</select>
+	
+	<select id="examCourseQueryForOpen"
+		resultType="com.qmth.themis.business.bean.backend.OpenExamCourseBean">
+		SELECT
+			t.course_code courseCode,
+			t.course_name courseName,
+			t.paper_count paperCount,
+			t.objective_shuffle objectiveShuffle,
+			t.option_shuffle optionShuffle
+		FROM
+			t_e_exam_course t left join t_e_exam f on t.exam_id=f.id
+		WHERE
+			f.enable=1
+		AND	t.exam_id = #{examId}
+		<if test="courseCode != null and courseCode !='' ">
+		AND t.course_code = #{courseCode}
+		</if>
+		<if test="hasPaper != null">
+			<if test="hasPaper">
+			AND t.paper_count>0
+			</if>
+			<if test="!hasPaper">
+			AND (t.paper_count is null or t.paper_count=0)
+			</if>
+		</if>
+	</select>
+	
 </mapper>

+ 19 - 0
themis-business/src/main/resources/mapper/TEExamMapper.xml

@@ -181,4 +181,23 @@
     	update t_e_exam set score_status=#{scoreStatus} where id=#{examId}
     </update>
     
+    <select id="examQueryForOpen" resultType="com.qmth.themis.business.bean.backend.OpenExamBean">
+    	SELECT
+			t.id,
+			t. CODE,
+			t. NAME,
+			t.tag,
+			t. MODE,
+			t.start_time startTime,
+			t.end_time endTime
+		FROM
+			t_e_exam t
+		WHERE t.enable=1
+		<if test="id != null">
+		AND	t.id = #{id}
+		</if>
+		<if test="code != null and code !='' ">
+		AND t.code = #{code}
+		</if>
+    </select>
 </mapper>