From 53675c635822794dbd79f0d0197c955af29c688f Mon Sep 17 00:00:00 2001
From: tangzy <tangzy123456>
Date: Wed, 21 Jul 2021 10:46:11 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.0.105:10010/r/zhba_management

---
 src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.xml                         |   78 +
 src/main/java/org/springblade/modules/apply/service/ApplyService.java                      |   35 
 src/main/java/org/springblade/modules/exam/controller/ExamSubjectChoicesController.java    |  144 +++
 src/main/java/org/springblade/modules/exam/wrapper/ExamPaperWrapper.java                   |   44 
 src/main/java/org/springblade/modules/apply/vo/ApplyVO.java                                |   60 +
 src/main/java/org/springblade/modules/exam/entity/ExamSubjectChoices.java                  |  117 ++
 src/main/java/org/springblade/modules/exam/service/ExamSubjectChoicesService.java          |   40 
 src/main/java/org/springblade/modules/exam/service/impl/ExamScoreServiceImpl.java          |  123 ++
 src/main/java/org/springblade/modules/exam/mapper/ExamScoreMapper.xml                      |   43 
 src/main/java/org/springblade/modules/exam/service/impl/ExamSubjectChoicesServiceImpl.java |   42 
 src/main/java/org/springblade/modules/exam/entity/ExamSubjectOption.java                   |   95 ++
 src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.xml             |   87 +
 src/main/java/org/springblade/modules/exam/entity/ExamScore.java                           |  111 ++
 src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.java                        |   40 
 src/main/java/org/springblade/modules/exam/vo/ExamResultVO.java                            |   28 
 src/main/java/org/springblade/modules/exam/service/impl/ExamSubjectOptionServiceImpl.java  |   32 
 src/main/java/org/springblade/modules/exam/service/ExamPaperService.java                   |   57 +
 src/main/java/org/springblade/modules/exam/controller/ExamSubjectOptionController.java     |  105 ++
 src/main/java/org/springblade/modules/apply/controller/ApplyController.java                |  199 ++++
 src/main/java/org/springblade/modules/exam/entity/ExamExaminationSubject.java              |   73 +
 src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.xml                      |  102 ++
 src/main/java/org/springblade/modules/exam/controller/ExamScoreController.java             |  129 ++
 src/main/java/org/springblade/modules/exam/vo/ExamPaperVO.java                             |   16 
 src/main/java/org/springblade/modules/exam/mapper/ExamSubjectOptionMapper.xml              |   33 
 src/main/java/org/springblade/modules/exam/service/impl/ExamPaperServiceImpl.java          |   72 +
 src/main/java/org/springblade/modules/exam/entity/ExamPaper.java                           |  102 ++
 src/main/java/org/springblade/modules/exam/vo/ExamSubjectOptionVO.java                     |   18 
 src/main/java/org/springblade/modules/apply/service/impl/ApplyServiceImpl.java             |   48 +
 src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.java            |   44 
 src/main/java/org/springblade/modules/exam/mapper/ExamSubjectOptionMapper.java             |   34 
 src/main/java/org/springblade/modules/exam/vo/ExamPaperSubjectVO.java                      |   23 
 src/main/java/org/springblade/modules/exam/service/ExamScoreService.java                   |   35 
 src/main/java/org/springblade/modules/exam/mapper/ExamScoreMapper.java                     |   34 
 src/main/java/org/springblade/modules/exam/vo/ExamScoreVO.java                             |   27 
 src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.java                     |   50 +
 src/main/java/org/springblade/modules/exam/controller/ExamPaperController.java             |  182 +++
 src/main/java/org/springblade/modules/apply/entity/Apply.java                              |  161 +++
 src/main/java/org/springblade/modules/exam/vo/ExamSubjectChoicesVO.java                    |   22 
 src/main/java/org/springblade/modules/exam/service/ExamSubjectOptionService.java           |   27 
 39 files changed, 2,712 insertions(+), 0 deletions(-)

diff --git a/src/main/java/org/springblade/modules/apply/controller/ApplyController.java b/src/main/java/org/springblade/modules/apply/controller/ApplyController.java
new file mode 100644
index 0000000..6aa565d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/apply/controller/ApplyController.java
@@ -0,0 +1,199 @@
+package org.springblade.modules.apply.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.apply.entity.Apply;
+import org.springblade.modules.apply.service.ApplyService;
+import org.springblade.modules.apply.vo.ApplyVO;
+import org.springblade.modules.exam.entity.ExamPaper;
+import org.springblade.modules.exam.service.ExamPaperService;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+
+/**
+ * @author zhongrj
+ * @time 2021-07-17
+ * @desc 考试报名管理控制层
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/apply")
+public class ApplyController {
+
+	private final ApplyService applyService;
+
+	private final ExamPaperService examPaperService;
+
+	/**
+	 * 自定义分页
+	 * @param query page,size
+	 * @param apply 考试报名信息对象
+	 */
+	@GetMapping("/page")
+	public R<IPage<ApplyVO>> page(ApplyVO apply, Query query) {
+		IPage<ApplyVO> pages = applyService.selectApplyPage(Condition.getPage(query), apply);
+		return R.data(pages);
+	}
+
+	/**
+	 * 分页
+	 */
+	@GetMapping("/list")
+	public R<IPage<Apply>> list(Apply apply, Query query) {
+		IPage<Apply> pages = applyService.page(Condition.getPage(query), Condition.getQueryWrapper(apply));
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增
+	 * @param apply 考试报名信息对象
+	 */
+	@PostMapping("/save")
+	@ApiOperation(value = "新增", notes = "传入apply")
+	public R save(@RequestBody Apply apply) {
+		return R.status(applyService.save(apply));
+	}
+
+
+	/**
+	 * 修改
+	 * @param apply 考试报名信息对象
+	 */
+	@PostMapping("/update")
+	public R update(@RequestBody Apply apply) {
+		return R.status(applyService.updateById(apply));
+	}
+
+	/**
+	 * 新增或修改
+	 * @param apply 考试报名信息对象
+	 */
+	@PostMapping("/submit")
+	public R submit(@RequestBody Apply apply) {
+		if (null==apply.getId()){
+			//去生成准考证号码
+			apply.setCandidateNo(getCandidateNo(apply));
+			//默认通过
+			apply.setApplyStatus(2);
+		}
+		return R.status(applyService.saveOrUpdate(apply));
+	}
+
+	/**
+	 * 生成准考证号码
+	 * @param apply 考试报名信息对象
+	 */
+	private String getCandidateNo(Apply apply) {
+		//获取考试信息
+		ExamPaper examPaper = examPaperService.getById(apply.getExamId());
+		if (null!=examPaper.getStartTime()){
+			String format = new SimpleDateFormat("yyyy-MM-dd").format(examPaper.getStartTime());
+			String year = format.substring(2,4);
+			String quarter  = null;
+			String months = null;
+			String days = null;
+			int month = Integer.parseInt(format.substring(5,7));
+			int day = Integer.parseInt(format.substring(8,10));
+			if (month>0 && month<=3){
+				quarter = "C";
+			}
+			if (month>3 && month<=6){
+				quarter = "X";
+			}
+			if (month>6 && month<=9){
+				quarter = "Q";
+			}
+			if (month>9 && month<=12){
+				quarter = "D";
+			}
+			if (month<=9){
+				months = "0" + month;
+			}
+			if (day<=9){
+				days = "0" + day;
+			}
+			//获取考试名称前缀,去除数字,字母
+			String examName
+				= examPaper.getExamName().replaceAll("\\s*", "").replaceAll("[^(\\u4e00-\\u9fa5)]", "").substring(0,1);
+
+			//前缀 = 年的最后两位  + 月份(两位) + 考试名称(中文拼音)首字母(去除数字,字母) + 考试类型 + 季度拼音首字母大写(春季就是 C)
+			String result = year
+							+ months
+							+ toFirstChar(examName).toUpperCase()
+							+ examPaper.getExamType()
+							+ quarter;
+			//查询是当前前缀已生成的数量
+			int count = applyService.getCandidateNoCount(result);
+			if (count==0){
+				return result + "0000";
+			}
+			//格式化
+			DecimalFormat decimalFormat = new DecimalFormat("0000");
+			//返回
+			return result + (decimalFormat.format(count++));
+		}
+		return null;
+	}
+
+	/**
+	 * 获取字符串拼音的第一个字母
+	 * @param chinese
+	 * @return
+	 */
+	private String toFirstChar(String chinese){
+		String pinyinStr = "";
+		char[] newChar = chinese.toCharArray();
+		//转为单个字符
+		HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
+		defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
+		defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+		for (int i = 0; i < newChar.length; i++) {
+			if (newChar[i] > 128) {
+				try {
+					pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0].charAt(0);
+				} catch (BadHanyuPinyinOutputFormatCombination e) {
+					e.printStackTrace();
+				}
+			}else{
+				pinyinStr += newChar[i];
+			}
+		}
+		return pinyinStr;
+	}
+
+	/**
+	 * 删除
+	 * @param ids 考试报名信息ids 数组
+	 */
+	@PostMapping("/remove")
+	public R remove(@ApiParam(value = "主键集合") @RequestParam String ids) {
+		return R.status(applyService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 详情
+	 * @param apply 考试报名信息对象
+	 */
+	@GetMapping("/detail")
+	@ApiOperation(value = "详情", notes = "传入apply")
+	public R<ApplyVO> details(Apply apply) {
+		//查询考试报名详情
+		ApplyVO detail = applyService.selectApplyInfo(apply);
+		//返回
+		return R.data(detail);
+	}
+
+}
diff --git a/src/main/java/org/springblade/modules/apply/entity/Apply.java b/src/main/java/org/springblade/modules/apply/entity/Apply.java
new file mode 100644
index 0000000..17673c4
--- /dev/null
+++ b/src/main/java/org/springblade/modules/apply/entity/Apply.java
@@ -0,0 +1,161 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.apply.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 考试报名实体类
+ *
+ * @author zhongrj
+ * @since 2021-07-17
+ */
+@Data
+@TableName("sys_apply")
+public class Apply implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@TableId(value = "id",type = IdType.AUTO)
+	private Long id;
+
+	/**
+	 * 用户id
+	 */
+	@TableField("user_id")
+	private Long userId;
+
+	/**
+	 * 姓名
+	 */
+	private String name;
+
+
+	/**
+	 * 身高
+	 */
+	private String height;
+
+
+	/**
+	 * 体重
+	 */
+	private String weight;
+
+	/**
+	 * 年龄
+	 */
+	private Integer age;
+
+	/**
+	 * 电子头像,用于打印准考证
+	 */
+	private String avatar;
+
+	/**
+	 * 邮箱
+	 */
+	private String email;
+
+	/**
+	 * 手机
+	 */
+	private String phone;
+
+
+	/**
+	 * 性别
+	 */
+	private Integer sex;
+
+
+	/**
+	 * 身份证
+	 */
+	@TableField("id_card_no")
+	private String idCardNo;
+
+
+	/**
+	 * 准考证号,通过审核后生成
+	 */
+	@TableField("candidate_no")
+	private String candidateNo;
+
+	/**
+	 * 报名时间
+	 */
+	@TableField("apply_time")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date applyTime;
+
+	/**
+	 * 审核时间
+	 */
+	@TableField("audit_time")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date auditTime;
+
+	/**
+	 * 考试类型
+	 */
+	@TableField("apply_exam_type")
+	private Integer applyExamType;
+
+	/**
+	 * 报名状态
+	 */
+	@TableField("apply_status")
+	private Integer applyStatus;
+
+	/**
+	 * 审核失败原因
+	 */
+	@TableField("fail_reason")
+	private String failReason;
+
+
+	/**
+	 * 考试id
+	 */
+	@TableField("exam_id")
+	private Long examId;
+
+
+	/**
+	 * 考试时间
+	 */
+	@TableField("exam_time")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date examTime;
+
+	private String examinationType;
+
+	private String examinationMx;
+}
diff --git a/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.java b/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.java
new file mode 100644
index 0000000..cc3d2d1
--- /dev/null
+++ b/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.java
@@ -0,0 +1,40 @@
+package org.springblade.modules.apply.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.apply.entity.Apply;
+import org.springblade.modules.apply.vo.ApplyVO;
+
+import java.util.List;
+
+/**
+ * 考试报名Mapper 接口
+ * @author zhongrj
+ */
+public interface ApplyMapper extends BaseMapper<Apply> {
+
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page  分页
+	 * @param apply 实体
+	 * @return
+	 */
+	List<ApplyVO> selectApplyPage(IPage page, @Param("apply") ApplyVO apply);
+
+	/**
+	 * 详情
+	 *
+	 * @param apply 考试报名信息对象
+	 */
+	ApplyVO selectApplyInfo(@Param("apply") Apply apply);
+
+	/**
+	 * 获取准考证前缀相同的数量
+	 * @param result 前缀
+	 * @return
+	 */
+    int getCandidateNoCount(@Param("result")String result);
+}
diff --git a/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.xml b/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.xml
new file mode 100644
index 0000000..2258020
--- /dev/null
+++ b/src/main/java/org/springblade/modules/apply/mapper/ApplyMapper.xml
@@ -0,0 +1,78 @@
+<?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="org.springblade.modules.apply.mapper.ApplyMapper">
+
+    <!--考试报名分页信息-->
+    <select id="selectApplyPage" resultType="org.springblade.modules.apply.vo.ApplyVO">
+        SELECT
+            sa.id,sa.user_id userId,sa.candidate_no candidateNo,apply_time,exam_id examId,
+            ke.total_score paperScore,ke.exam_type examType,ke.start_time examTime,ke.exam_name examName,
+            bu.real_name name,sa.examination_type,sa.examination_mx,
+            bd.dept_name deptName
+        FROM
+            sys_apply sa
+        left join
+            ksxt_exam ke
+        on
+            sa.exam_id = ke.id
+        left join
+            blade_user bu
+        on
+            sa.user_id = bu.id
+        left join
+            blade_dept bd
+        on
+            bd.id = bu.dept_id
+        WHERE
+            1=1
+        <if test="apply.name!=null and  apply.name!=''">
+            and sa.name like concat('%', #{apply.name},'%')
+        </if>
+        <if test="apply.applyStatus!=null">
+            and apply_status = #{apply.applyStatus}
+        </if>
+        <if test="apply.applyExamType!=null">
+            and apply_exam_type = #{apply.applyExamType}
+        </if>
+        <if test="apply.examId!=null">
+            and sa.exam_id = #{apply.examId}
+        </if>
+    </select>
+
+    <!--考试报名详情信息-->
+    <select id="selectApplyInfo" resultType="org.springblade.modules.apply.vo.ApplyVO">
+        SELECT
+            sa.id,sa.user_id userId,sa.candidate_no candidateNo,apply_time,exam_id examId,
+            ke.total_score paperScore,ke.exam_type examType,ke.start_time examTime,ke.exam_name examName,
+            bu.real_name name,sa.examination_type,sa.examination_mx,
+            bd.dept_name deptName
+        FROM
+            sys_apply sa
+        left join
+            ksxt_exam ke
+        on
+            sa.exam_id = ke.id
+        left join
+            blade_user bu
+        on
+            sa.user_id = bu.id
+        left join
+            blade_dept bd
+        on
+            bd.id = bu.dept_id
+        WHERE
+            1=1
+        <if test="apply.id!=null">
+            and sa.id = #{apply.id}
+        </if>
+    </select>
+
+    <!--获取准考证前缀相同的数量-->
+    <select id="getCandidateNoCount" resultType="java.lang.Integer">
+        select count(*) from sys_apply
+        where 1=1
+        <if test="result!=null and result!=''">
+            and candidate_no like concat('%', #{result},'%')
+        </if>
+    </select>
+</mapper>
diff --git a/src/main/java/org/springblade/modules/apply/service/ApplyService.java b/src/main/java/org/springblade/modules/apply/service/ApplyService.java
new file mode 100644
index 0000000..82aaba8
--- /dev/null
+++ b/src/main/java/org/springblade/modules/apply/service/ApplyService.java
@@ -0,0 +1,35 @@
+package org.springblade.modules.apply.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.apply.entity.Apply;
+import org.springblade.modules.apply.vo.ApplyVO;
+
+/**
+ * 考试报名服务类
+ * @author zhongrj
+ */
+public interface ApplyService extends IService<Apply> {
+
+	/**
+	 * 自定义分页
+	 * @param page
+	 * @param apply
+	 * @return
+	 */
+	IPage<ApplyVO> selectApplyPage(IPage<ApplyVO> page, ApplyVO apply);
+
+	/**
+	 * 详情
+	 * @param apply 考试报名信息对象
+	 * @return
+	 */
+	ApplyVO selectApplyInfo(Apply apply);
+
+	/**
+	 * 获取准考证前缀相同的数量
+	 * @param result 前缀
+	 * @return
+	 */
+    int getCandidateNoCount(String result);
+}
diff --git a/src/main/java/org/springblade/modules/apply/service/impl/ApplyServiceImpl.java b/src/main/java/org/springblade/modules/apply/service/impl/ApplyServiceImpl.java
new file mode 100644
index 0000000..e334db6
--- /dev/null
+++ b/src/main/java/org/springblade/modules/apply/service/impl/ApplyServiceImpl.java
@@ -0,0 +1,48 @@
+
+package org.springblade.modules.apply.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.apply.entity.Apply;
+import org.springblade.modules.apply.mapper.ApplyMapper;
+import org.springblade.modules.apply.service.ApplyService;
+import org.springblade.modules.apply.vo.ApplyVO;
+import org.springframework.stereotype.Service;
+
+/**
+ * 考试报名服务实现类
+ * @author zhongrj
+ */
+@Service
+public class ApplyServiceImpl extends ServiceImpl<ApplyMapper, Apply> implements ApplyService {
+
+	/**
+	 * 自定义分页数据
+	 * @param page 分页条件
+	 * @param apply 考试报名对象
+	 * @return
+	 */
+	@Override
+	public IPage<ApplyVO> selectApplyPage(IPage<ApplyVO> page, ApplyVO apply) {
+		return page.setRecords(baseMapper.selectApplyPage(page, apply));
+	}
+
+	/**
+	 * 详情
+	 * @param apply 考试报名信息对象
+	 */
+	@Override
+	public ApplyVO selectApplyInfo(Apply apply) {
+		return baseMapper.selectApplyInfo(apply);
+	}
+
+	/**
+	 * 获取准考证前缀相同的数量
+	 * @param result 前缀
+	 * @return
+	 */
+	@Override
+	public int getCandidateNoCount(String result) {
+		return baseMapper.getCandidateNoCount(result);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/apply/vo/ApplyVO.java b/src/main/java/org/springblade/modules/apply/vo/ApplyVO.java
new file mode 100644
index 0000000..ba74633
--- /dev/null
+++ b/src/main/java/org/springblade/modules/apply/vo/ApplyVO.java
@@ -0,0 +1,60 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.apply.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.springblade.modules.apply.entity.Apply;
+
+import java.io.Serializable;
+
+/**
+ * 考试报名实体类
+ *
+ * @author zhongrj
+ * @since 2021-07-17
+ */
+@Data
+@TableName("sys_apply")
+public class ApplyVO extends Apply implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+
+	/**
+	 * 试卷分数
+	 */
+	private Integer paperScore;
+
+	/**
+	 * 考试类型
+	 */
+	private Integer examType;
+
+
+	/**
+	 * 考试名称
+	 */
+	private String examName;
+
+
+	/**
+	 * 保安单位名称
+	 */
+	private String deptName;
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/controller/ExamPaperController.java b/src/main/java/org/springblade/modules/exam/controller/ExamPaperController.java
new file mode 100644
index 0000000..3b00c3f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/controller/ExamPaperController.java
@@ -0,0 +1,182 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright exam,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  exam, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.exam.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.exam.entity.ExamPaper;
+import org.springblade.modules.exam.service.ExamPaperService;
+import org.springblade.modules.exam.vo.ExamPaperSubjectVO;
+import org.springblade.modules.exam.vo.ExamPaperVO;
+import org.springblade.modules.exam.wrapper.ExamPaperWrapper;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 控制器
+ *
+ * @author Chill
+ */
+@RestController
+@RequestMapping("/exampaper")
+@AllArgsConstructor
+public class ExamPaperController extends BladeController {
+
+	private final ExamPaperService examPaperService;
+
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入exam")
+	public R<ExamPaperVO> detail(ExamPaper exam) {
+		ExamPaper detail = examPaperService.getOne(Condition.getQueryWrapper(exam));
+		return R.data(ExamPaperWrapper.build().entityVO(detail));
+	}
+
+	/**
+	 * 分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入exam")
+	public R<IPage<ExamPaperVO>> list(@ApiIgnore @RequestParam Map<String, Object> exam, Query query) {
+		IPage<ExamPaper> pages = examPaperService.page(Condition.getPage(query), Condition.getQueryWrapper(exam, ExamPaper.class));
+		return R.data(ExamPaperWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 分页
+	 */
+	@GetMapping("/pages")
+	public R<IPage<ExamPaperVO>> page(ExamPaperVO exam, Query query) {
+		IPage<ExamPaperVO> pages = examPaperService.selectExamPaperPage(Condition.getPage(query), exam);
+		return R.data(pages);
+	}
+
+
+	/**
+	 * 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入exam")
+	public R save(@RequestBody ExamPaper exam) {
+		return R.status(examPaperService.save(exam));
+	}
+
+	/**
+	 * 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入exam")
+	public R update(@RequestBody ExamPaper exam) {
+		return R.status(examPaperService.updateById(exam));
+	}
+
+	/**
+	 * 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入exam")
+	public R submit(@RequestBody ExamPaper exam) {
+		return R.status(examPaperService.saveOrUpdate(exam));
+	}
+
+	/**
+	 * 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入exam")
+	public R remove(@ApiParam(value = "主键集合") @RequestParam String ids) {
+		boolean temp = examPaperService.removeByIds(Func.toLongList(ids));
+		return R.status(temp);
+	}
+
+	/**
+	 * 考试题目绑定
+	 */
+	@GetMapping("/setPagerSubject")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "考试题目绑定", notes = "传入exam")
+	public R setPagerSubject(@ApiParam(value = "主键集合") ExamPaper exam) {
+
+		return R.status(true);
+	}
+
+	/**
+	 * 查询考试题目
+	 */
+	@GetMapping("/queryPagerSubject")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "考试题目绑定", notes = "传入exam")
+	public R<ExamPaperSubjectVO> queryPagerSubject(@ApiParam(value = "主键集合") ExamPaper exam) {
+		ExamPaperSubjectVO subject = examPaperService.queryPagerSubject(exam);
+		return R.data(subject);
+	}
+
+	/**
+	 * 返回当前时间
+	 */
+	@GetMapping("/getdate")
+	@ApiOperationSupport(order = 9)
+	public R getdate() {
+		Date date = new Date();
+		String strDateFormat = "yyyy-MM-dd HH:mm:ss";
+		SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat);
+		System.out.println(sdf.format(date));
+		return R.data(sdf.format(date));
+	}
+
+	/**
+	 * 自定义树
+	 * @param examPaper
+	 * @return
+	 */
+	@GetMapping("/page-tree")
+	public R pageTree(ExamPaper examPaper) {
+		List<ExamPaper> pages = examPaperService.selectExamPaperPageTree(examPaper);
+		return R.data(pages);
+	}
+
+	/**
+	 * 解除绑定
+	 */
+	@GetMapping("/UnbindSubject")
+	public R UnbindSubject(String paperid,String subjectid){
+
+		return R.status(examPaperService.UnbindSubject(paperid,subjectid));
+	}
+}
diff --git a/src/main/java/org/springblade/modules/exam/controller/ExamScoreController.java b/src/main/java/org/springblade/modules/exam/controller/ExamScoreController.java
new file mode 100644
index 0000000..9331b8e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/controller/ExamScoreController.java
@@ -0,0 +1,129 @@
+package org.springblade.modules.exam.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.exam.entity.ExamScore;
+import org.springblade.modules.exam.service.ExamScoreService;
+import org.springblade.modules.exam.vo.ExamScoreVO;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author zhongrj
+ * @time 2021-07-16
+ * @desc 考试成绩管理控制层
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/examScore")
+public class ExamScoreController {
+
+	private final ExamScoreService examScoreService;
+
+	/**
+	 * 自定义分页
+	 * @param query page,size
+	 * @param examScore 考试成绩信息对象
+	 */
+	@GetMapping("/page")
+	public R<IPage<ExamScoreVO>> page(ExamScoreVO examScore, Query query) {
+		IPage<ExamScoreVO> pages = examScoreService.selectExamScorePage(Condition.getPage(query), examScore);
+		return R.data(pages);
+	}
+
+	/**
+	 * 分页
+	 */
+	@GetMapping("/list")
+	public R<IPage<ExamScore>> list(ExamScore examScore, Query query) {
+		IPage<ExamScore> pages = examScoreService.page(Condition.getPage(query), Condition.getQueryWrapper(examScore));
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增
+	 * @param examScore 考试成绩信息对象
+	 */
+	@PostMapping("/save")
+	@ApiOperation(value = "新增", notes = "传入examScore")
+	public R save(@RequestBody ExamScore examScore) {
+		return R.status(examScoreService.save(examScore));
+	}
+
+
+	/**
+	 * 保存考试成绩
+	 * @param examScore 考试成绩信息对象
+	 */
+	@PostMapping("/saveExamScore")
+	public R saveExamScore(@RequestBody ExamScoreVO examScore) {
+		return R.status(examScoreService.saveExamScore(examScore));
+	}
+
+
+	/**
+	 * 修改
+	 * @param examScore 考试成绩信息对象
+	 */
+	@PostMapping("/update")
+	public R update(@RequestBody ExamScore examScore) {
+		return R.status(examScoreService.updateById(examScore));
+	}
+
+	/**
+	 * 修改总成绩
+	 * @param examScore 考试成绩信息对象
+	 */
+	@PostMapping("/updateExamScore")
+	public R updateExamScore(@RequestBody ExamScore examScore) {
+		if (null!=examScore.getLearnGrade() && null!=examScore.getTheoryGrade()){
+			if (examScore.getTheoryGrade()>=60 && examScore.getLearnGrade()>=60){
+				//合格
+				examScore.setQualified(0);
+			}else {
+				//不合格
+				examScore.setQualified(1);
+			}
+			int totalSocre = examScore.getLearnGrade()+examScore.getTheoryGrade();
+			examScore.setAllGrade(Math.round(totalSocre/2));
+		}
+		return R.status(examScoreService.updateById(examScore));
+	}
+
+	/**
+	 * 新增或修改
+	 * @param examScore 考试成绩信息对象
+	 */
+	@PostMapping("/submit")
+	public R submit(@RequestBody ExamScore examScore) {
+		return R.status(examScoreService.saveOrUpdate(examScore));
+	}
+
+	/**
+	 * 删除
+	 * @param ids 考试成绩信息ids 数组
+	 */
+	@PostMapping("/remove")
+	public R remove(@ApiParam(value = "主键集合") @RequestParam String ids) {
+		return R.status(examScoreService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 详情
+	 * @param examScore 考试成绩信息对象
+	 */
+	@GetMapping("/detail")
+	@ApiOperation(value = "详情", notes = "传入examScore")
+	public R<ExamScoreVO> details(ExamScore examScore) {
+		//查询考试成绩详情
+		ExamScoreVO detail = examScoreService.selectExamScoreInfo(examScore);
+		//返回
+		return R.data(detail);
+	}
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/controller/ExamSubjectChoicesController.java b/src/main/java/org/springblade/modules/exam/controller/ExamSubjectChoicesController.java
new file mode 100644
index 0000000..f7bf26d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/controller/ExamSubjectChoicesController.java
@@ -0,0 +1,144 @@
+package org.springblade.modules.exam.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.exam.entity.ExamSubjectChoices;
+import org.springblade.modules.exam.service.ExamSubjectChoicesService;
+import org.springblade.modules.exam.vo.ExamSubjectChoicesVO;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+/**
+ * @author zhongrj
+ * @time 2021-07-16
+ * @desc 选择题管理控制层
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/examSubjectChoices")
+public class ExamSubjectChoicesController {
+
+	private final ExamSubjectChoicesService examSubjectChoicesService;
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param query              page,size
+	 * @param examSubjectChoices 选择题信息对象
+	 */
+	@GetMapping("/page")
+	public R<IPage<ExamSubjectChoicesVO>> page(ExamSubjectChoicesVO examSubjectChoices, Query query) {
+		IPage<ExamSubjectChoicesVO> pages = examSubjectChoicesService.selectExamSubjectChoicesPage(Condition.getPage(query), examSubjectChoices);
+		return R.data(pages);
+	}
+
+	/**
+	 * 分页
+	 */
+	@GetMapping("/list")
+	public R<IPage<ExamSubjectChoices>> list(ExamSubjectChoices examSubjectChoices, Query query) {
+		IPage<ExamSubjectChoices> pages = examSubjectChoicesService.page(Condition.getPage(query), Condition.getQueryWrapper(examSubjectChoices));
+		return R.data(pages);
+	}
+
+
+	/**
+	 * 新增
+	 *
+	 * @param examSubjectChoices 选择题信息对象
+	 */
+	@PostMapping("/save")
+	@ApiOperation(value = "新增", notes = "传入examSubjectChoices")
+	public R save(@RequestBody ExamSubjectChoices examSubjectChoices) {
+		return R.status(examSubjectChoicesService.save(examSubjectChoices));
+	}
+
+	/**
+	 * 修改
+	 *
+	 * @param examSubjectChoices 选择题信息对象
+	 */
+	@PostMapping("/update")
+	public R update(@RequestBody ExamSubjectChoices examSubjectChoices) {
+		return R.status(examSubjectChoicesService.updateById(examSubjectChoices));
+	}
+
+	/**
+	 * 新增或修改
+	 *
+	 * @param examSubjectChoices 选择题信息对象
+	 */
+	@PostMapping("/submit")
+	public R submit(@RequestBody ExamSubjectChoices examSubjectChoices) {
+		if (null != examSubjectChoices.getId()) {
+			examSubjectChoices.setCreateDate(new Date());
+		} else {
+			examSubjectChoices.setModifyDate(new Date());
+		}
+		return R.status(examSubjectChoicesService.saveOrUpdate(examSubjectChoices));
+	}
+
+	/**
+	 * 删除
+	 *
+	 * @param ids 选择题信息ids 数组
+	 */
+	@PostMapping("/remove")
+	public R remove(@ApiParam(value = "主键集合") @RequestParam String ids) {
+		return R.status(examSubjectChoicesService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 详情
+	 *
+	 * @param examSubjectChoices 选择题信息对象
+	 */
+	@GetMapping("/detail")
+	@ApiOperation(value = "详情", notes = "传入examSubjectChoices")
+	public R<ExamSubjectChoices> detail(ExamSubjectChoices examSubjectChoices) {
+		//查询选择题详情
+		ExamSubjectChoices detail = examSubjectChoicesService.getOne(Condition.getQueryWrapper(examSubjectChoices));
+		//返回
+		return R.data(detail);
+	}
+
+
+	/**
+	 * 详情(包含选项信息)
+	 *
+	 * @param examSubjectChoices 选择题信息对象
+	 */
+	@GetMapping("/details")
+	@ApiOperation(value = "详情", notes = "传入examSubjectChoices")
+	public R<ExamSubjectChoicesVO> details(ExamSubjectChoices examSubjectChoices) {
+		//查询选择题详情
+		ExamSubjectChoicesVO detail = examSubjectChoicesService.selectExamSubjectChoicesInfo(examSubjectChoices);
+		//返回
+		return R.data(detail);
+	}
+
+	/**
+	 * 查询试卷包含的题目
+	 */
+	@GetMapping("/getEexPaperChoices")
+	public R<IPage<ExamSubjectChoicesVO>> getEexPaperChoices(ExamSubjectChoicesVO examSubjectChoices, Query query) {
+		IPage<ExamSubjectChoicesVO> pages = examSubjectChoicesService.getEexPaperChoices(Condition.getPage(query), examSubjectChoices);
+		return R.data(pages);
+	}
+
+	/**
+	 * 修改单项题目分值
+	 */
+	@PostMapping("/updateChoicesValue")
+	public R updateChoicesValue(String id,String value) {
+		return R.status(examSubjectChoicesService.updateChoicesValue(id,value));
+	}
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/controller/ExamSubjectOptionController.java b/src/main/java/org/springblade/modules/exam/controller/ExamSubjectOptionController.java
new file mode 100644
index 0000000..10ab702
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/controller/ExamSubjectOptionController.java
@@ -0,0 +1,105 @@
+package org.springblade.modules.exam.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.exam.entity.ExamSubjectOption;
+import org.springblade.modules.exam.service.ExamSubjectOptionService;
+import org.springblade.modules.exam.vo.ExamSubjectOptionVO;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+/**
+ * @author zhongrj
+ * @time 2021-07-16
+ * @desc 选择题选项管理控制层
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/examSubjectOption")
+public class ExamSubjectOptionController {
+
+	private final ExamSubjectOptionService examSubjectOptionService;
+
+	/**
+	 * 自定义分页
+	 * @param query page,size
+	 * @param examSubjectOption 选择题选项信息对象
+	 */
+	@GetMapping("/page")
+	public R<IPage<ExamSubjectOptionVO>> page(ExamSubjectOptionVO examSubjectOption, Query query) {
+		IPage<ExamSubjectOptionVO> pages = examSubjectOptionService.selectExamSubjectOptionPage(Condition.getPage(query), examSubjectOption);
+		return R.data(pages);
+	}
+
+	/**
+	 * 分页
+	 */
+	@GetMapping("/list")
+	public R<IPage<ExamSubjectOption>> list(ExamSubjectOption examSubjectOption, Query query) {
+		IPage<ExamSubjectOption> pages = examSubjectOptionService.page(Condition.getPage(query), Condition.getQueryWrapper(examSubjectOption));
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增
+	 * @param examSubjectOption 选择题选项信息对象
+	 */
+	@PostMapping("/save")
+	@ApiOperation(value = "新增", notes = "传入examSubjectOption")
+	public R save(@RequestBody ExamSubjectOption examSubjectOption) {
+		return R.status(examSubjectOptionService.save(examSubjectOption));
+	}
+
+	/**
+	 * 修改
+	 * @param examSubjectOption 选择题选项信息对象
+	 */
+	@PostMapping("/update")
+	public R update(@RequestBody ExamSubjectOption examSubjectOption) {
+		return R.status(examSubjectOptionService.updateById(examSubjectOption));
+	}
+
+	/**
+	 * 新增或修改
+	 * @param examSubjectOption 选择题选项信息对象
+	 */
+	@PostMapping("/submit")
+	public R submit(@RequestBody ExamSubjectOption examSubjectOption) {
+		if (null!=examSubjectOption.getId()){
+			examSubjectOption.setCreateDate(new Date());
+		}else {
+			examSubjectOption.setModifyDate(new Date());
+		}
+		return R.status(examSubjectOptionService.saveOrUpdate(examSubjectOption));
+	}
+
+	/**
+	 * 删除
+	 * @param ids 选择题选项信息ids 数组
+	 */
+	@PostMapping("/remove")
+	public R remove(@ApiParam(value = "主键集合") @RequestParam String ids) {
+		return R.status(examSubjectOptionService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 详情
+	 * @param examSubjectOption 选择题选项信息对象
+	 */
+	@GetMapping("/detail")
+	@ApiOperation(value = "详情", notes = "传入examSubjectOption")
+	public R<ExamSubjectOptionVO> details(ExamSubjectOption examSubjectOption) {
+		//查询选择题选项详情
+		ExamSubjectOptionVO detail = examSubjectOptionService.selectExamSubjectOptionInfo(examSubjectOption);
+		//返回
+		return R.data(detail);
+	}
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/entity/ExamExaminationSubject.java b/src/main/java/org/springblade/modules/exam/entity/ExamExaminationSubject.java
new file mode 100644
index 0000000..0866ebf
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/entity/ExamExaminationSubject.java
@@ -0,0 +1,73 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.exam.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *  试卷分类实体类
+ *
+ * @author Chill
+ */
+@Data
+@TableName("exam_examination_subject")
+public class ExamExaminationSubject implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * ID
+	 */
+	@ApiModelProperty(value = "id")
+	@TableId(value = "id", type = IdType.AUTO)
+	private Long id;
+
+	/**
+	 * 试卷id
+	 */
+	@TableField("examination_id")
+	private String examinationId;
+
+	/**
+	 * 分类
+	 */
+	@TableField("category_id")
+	private Integer categoryId;
+
+	/**
+	 * 题目id
+	 */
+	@TableField("subject_id")
+	private String subjectId;
+
+
+	/**
+	 * 题目对象
+	 */
+	private ExamSubjectChoices examSubjectChoices;
+
+
+
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/entity/ExamPaper.java b/src/main/java/org/springblade/modules/exam/entity/ExamPaper.java
new file mode 100644
index 0000000..ee02a5b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/entity/ExamPaper.java
@@ -0,0 +1,102 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.exam.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 实体类
+ *
+ * @author Chill
+ */
+@Data
+@TableName("ksxt_exam")
+public class ExamPaper implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * ID
+	 */
+	@ApiModelProperty(value = "id")
+	@TableId(value = "id", type = IdType.AUTO)
+	private Long id;
+
+	/**
+	 * 考试名称
+	 */
+	private String examName;
+
+	/**
+	 * 考试类型
+	 */
+	private Integer examType;
+
+	/**
+	 * 注意事项
+	 */
+	private String examAttention;
+
+	/**
+	 * 考试开始时间
+	 */
+	private Date startTime;
+
+	/**
+	 * 考试结束时间
+	 */
+	private Date endTime;
+
+	/**
+	 * 时间区间
+	 */
+	private String examTime;
+
+	/**
+	 * 总分
+	 */
+	private String totalScore;
+
+	/**
+	 * 状态
+	 */
+	private Integer examStatus;
+
+	/**
+	 * 创建人
+	 */
+	private String creator;
+
+	/**
+	 * 创建时间
+	 */
+	private Date creatorDate;
+
+	/**
+	 * 备注
+	 */
+	private String remark;
+
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/entity/ExamScore.java b/src/main/java/org/springblade/modules/exam/entity/ExamScore.java
new file mode 100644
index 0000000..d3ca4cd
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/entity/ExamScore.java
@@ -0,0 +1,111 @@
+package org.springblade.modules.exam.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 考试成绩实体类
+ * @author zhongrj
+ * @time 2021-07-16
+ */
+@Data
+@TableName("exam_score")
+public class ExamScore implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 考试成绩主键id
+	 */
+	@TableId(value = "id",type = IdType.AUTO)
+	private Long id;
+
+
+	/**
+	 * 准考证号
+	 */
+	@TableField("candidate_no")
+	private String candidateNo;
+
+	/**
+	 * 理论成绩
+	 */
+	@TableField("theory_grade")
+	private Integer theoryGrade;
+
+	/**
+	 * 实操成绩
+	 */
+	@TableField("learn_grade")
+	private Integer learnGrade;
+
+
+	/**
+	 * 总成绩
+	 */
+	@TableField("all_grade")
+	private Integer allGrade;
+
+
+	/**
+	 * 考试类型 0:正式考试  1: 模拟考试  2:在线联系  3:调查问卷
+	 */
+//	@TableField("exam_type")
+//	private Integer examType;
+
+
+	/**
+	 * 考试人员所属公司名称
+	 */
+	private String company;
+
+	/**
+	 * 考试开始时间
+	 */
+	@TableField("exam_time")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date examTime;
+
+	/**
+	 * 考试结束时间
+	 */
+	@TableField("exam_end_time")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date examEndTime;
+
+	/**
+	 * 考试名称
+	 */
+	@TableField("exam_name")
+	private String examName;
+
+
+	/**
+	 * 考试人员姓名
+	 */
+	@TableField("security_name")
+	private String securityName;
+
+
+	/**
+	 * 试卷总分值
+	 */
+	@TableField("all_score")
+	private Integer allScore;
+
+	/**
+	 * 是否合格  0:合格  1:不合格  2: 暂未录入实操成绩
+	 */
+	private Integer qualified;
+
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/entity/ExamSubjectChoices.java b/src/main/java/org/springblade/modules/exam/entity/ExamSubjectChoices.java
new file mode 100644
index 0000000..3cf28a3
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/entity/ExamSubjectChoices.java
@@ -0,0 +1,117 @@
+package org.springblade.modules.exam.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 选择题实体类
+ * @author zhongrj
+ * @time 2021-07-16
+ */
+@Data
+@TableName("exam_subject_choices")
+public class ExamSubjectChoices implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 选择题主键id
+	 */
+	@TableId(value = "id",type = IdType.AUTO)
+	private Long id;
+
+
+	/**
+	 * 题目 ID
+	 */
+	@TableField("category_id")
+	private Long categoryId;
+
+	/**
+	 * 题目名称
+	 */
+	@TableField("subject_name")
+	private String subjectName;
+
+	/**
+	 * 题目类型
+	 */
+	@TableField("choices_type")
+	private Integer choicesType;
+
+	/**
+	 * 参考答案
+	 */
+	private String answer;
+
+	/**
+	 * 题目分值
+	 */
+	private Integer score;
+
+	/**
+	 * 解析
+	 */
+	private String analysis;
+
+
+	/**
+	 * 难度等级
+	 */
+	private Integer level;
+
+
+	/**
+	 * 创建人
+	 */
+	private String creator;
+
+	/**
+	 * 创建时间
+	 */
+	@TableField("create_date")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date createDate;
+
+
+	/**
+	 * 修改人
+	 */
+	private String modifier;
+
+	/**
+	 * 修改时间
+	 */
+	@TableField("modify_date")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date modifyDate;
+
+	/**
+	 * 删除标记 0:正常;1:删除
+	 */
+	@TableField("del_flag")
+	private Integer delFlag;
+
+	/**
+	 * 系统编号
+	 */
+	@TableField("application_code")
+	private String applicationCode;
+
+	/**
+	 *
+	 */
+	@TableField("tenant_code")
+	private String tenantCode;
+
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/entity/ExamSubjectOption.java b/src/main/java/org/springblade/modules/exam/entity/ExamSubjectOption.java
new file mode 100644
index 0000000..3619115
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/entity/ExamSubjectOption.java
@@ -0,0 +1,95 @@
+package org.springblade.modules.exam.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 选择题选项实体类
+ * @author zhongrj
+ * @time 2021-07-16
+ */
+@Data
+@TableName("exam_subject_option")
+public class ExamSubjectOption implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 选择题主键id
+	 */
+	@TableId(value = "id",type = IdType.AUTO)
+	private Long id;
+
+
+	/**
+	 * 选择题ID
+	 */
+	@TableField("subject_choices_id")
+	private Long subjectChoicesId;
+
+	/**
+	 * 选项名称
+	 */
+	@TableField("option_name")
+	private String optionName;
+
+	/**
+	 * 选项内容
+	 */
+	@TableField("option_content")
+	private String optionContent;
+
+
+	/**
+	 * 创建人
+	 */
+	private String creator;
+
+	/**
+	 * 创建时间
+	 */
+	@TableField("create_date")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date createDate;
+
+
+	/**
+	 * 修改人
+	 */
+	private String modifier;
+
+	/**
+	 * 修改时间
+	 */
+	@TableField("modify_date")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date modifyDate;
+
+	/**
+	 * 删除标记 0:正常;1:删除
+	 */
+	@TableField("del_flag")
+	private Integer delFlag;
+
+	/**
+	 * 系统编号
+	 */
+	@TableField("application_code")
+	private String applicationCode;
+
+	/**
+	 * 租户编号
+	 */
+	@TableField("tenant_code")
+	private String tenantCode;
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.java b/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.java
new file mode 100644
index 0000000..f0280b0
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.exam.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.exam.entity.ExamPaper;
+import org.springblade.modules.exam.vo.ExamPaperSubjectVO;
+import org.springblade.modules.exam.vo.ExamPaperVO;
+
+import java.util.List;
+
+/**
+ * Mapper 接口
+ *
+ * @author Chill
+ */
+public interface ExamPaperMapper extends BaseMapper<ExamPaper> {
+
+	IPage<ExamPaperVO> selectExamPaperPage(IPage page, ExamPaperVO exam);
+
+	ExamPaperSubjectVO queryPagerSubject(@Param("paper") ExamPaper paper);
+
+	ExamPaperSubjectVO PagerSubject(@Param("paper") ExamPaper paper);
+
+	/**
+	 * 自定义树
+	 *
+	 * @param examPaper 试卷对象
+	 * @return
+	 */
+	List<ExamPaper> selectExamPaperPageTree(@Param("paper") ExamPaper examPaper);
+
+	boolean UnbindSubject(String paperid, String subjectid);
+}
diff --git a/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.xml b/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.xml
new file mode 100644
index 0000000..614c318
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/mapper/ExamPaperMapper.xml
@@ -0,0 +1,102 @@
+<?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="org.springblade.modules.exam.mapper.ExamPaperMapper">
+
+    <resultMap id="PagerSubject" type="org.springblade.modules.exam.vo.ExamPaperSubjectVO"
+               autoMapping="true">
+        <id property="id" column="id"/>
+        <collection property="examExaminationSubjects" javaType="java.util.List" ofType="org.springblade.modules.exam.entity.ExamExaminationSubject" autoMapping="true">
+            <id property="id" column="tid"/>
+            <association property="examSubjectChoices" javaType="org.springblade.modules.exam.entity.ExamSubjectChoices" resultMap="brakesResult" autoMapping="true">
+            </association>
+        </collection>
+    </resultMap>
+
+    <resultMap id="PagerSubjectAnswer" type="org.springblade.modules.exam.vo.ExamPaperSubjectVO"
+               autoMapping="true">
+        <id property="id" column="id"/>
+        <collection property="examExaminationSubjects" javaType="java.util.List" ofType="org.springblade.modules.exam.entity.ExamExaminationSubject" autoMapping="true">
+            <id property="id" column="tid"/>
+            <association property="examSubjectChoices" javaType="org.springblade.modules.exam.entity.ExamSubjectChoices" autoMapping="true">
+                <id property="id" column="sid"/>
+            </association>
+        </collection>
+    </resultMap>
+
+    <resultMap id="brakesResult" type="org.springblade.modules.exam.vo.ExamSubjectChoicesVO">
+        <id property="id" column="sid"/>
+        <id property="categoryId" column="category_id"/>
+        <id property="subjectName" column="subject_name"/>
+        <id property="choicesType" column="choices_type"/>
+        <id property="score" column="score"/>
+        <id property="analysis" column="analysis"/>
+        <id property="level" column="level"/>
+        <id property="creator" column="creator"/>
+        <id property="createDate" column="create_date"/>
+        <id property="modifier" column="modifier"/>
+        <id property="modifyDate" column="modify_date"/>
+        <id property="delFlag" column="del_flag"/>
+        <id property="applicationCode" column="application_code"/>
+        <id property="tenantCode" column="tenant_code"/>
+    </resultMap>
+
+    <select id="queryPagerSubject" resultMap="PagerSubject">
+        SELECT
+        sj.*,
+        tm.id tid,
+        tmxq.id as sid,tmxq.*
+        FROM
+        ksxt_exam sj
+        LEFT JOIN exam_examination_subject tm ON sj.id = tm.examination_id
+        LEFT JOIN exam_subject_choices tmxq ON tm.subject_id = tmxq.id
+        WHERE
+        1 = 1
+        <if test="paper.id !=null">
+        and sj.id = #{paper.id}
+        </if>
+    </select>
+
+    <select id="selectExamPaperPage" resultType="org.springblade.modules.exam.vo.ExamPaperVO">
+        SELECT
+            *
+        FROM
+            (SELECT
+                sj.*,
+                ( SELECT CASE WHEN COUNT ( * ) > 0 THEN 1 ELSE 0 END FROM sys_apply WHERE user_id = 11 ) AS show
+            FROM
+                ksxt_exam sj ) as s
+        WHERE
+            show = 1
+    </select>
+
+    <select id="PagerSubject" resultMap="PagerSubjectAnswer">
+        SELECT
+        sj.*,
+        tm.id tid,
+        tmxq.id as sid,tmxq.*
+        FROM
+        ksxt_exam sj
+        LEFT JOIN exam_examination_subject tm ON sj.id = tm.examination_id
+        LEFT JOIN exam_subject_choices tmxq ON tm.subject_id = tmxq.id
+        WHERE
+        1 = 1
+        <if test="paper.id !=null">
+        and sj.id = #{paper.id}
+        </if>
+    </select>
+
+    <!--自定义树-->
+    <select id="selectExamPaperPageTree" resultType="org.springblade.modules.exam.entity.ExamPaper">
+        select id,exam_name examName from ksxt_exam
+        where
+        1=1
+        <if test="paper.examName!=null and paper.examName!=''">
+            and exam_name like concat('%', #{paper.examName},'%')
+        </if>
+    </select>
+
+    <delete id="UnbindSubject">
+       delete from exam_examination_subject where examination_id = #{paperid} and subject_id = #{subjectid}
+    </delete>
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/exam/mapper/ExamScoreMapper.java b/src/main/java/org/springblade/modules/exam/mapper/ExamScoreMapper.java
new file mode 100644
index 0000000..84fe425
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/mapper/ExamScoreMapper.java
@@ -0,0 +1,34 @@
+package org.springblade.modules.exam.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.exam.entity.ExamScore;
+import org.springblade.modules.exam.vo.ExamScoreVO;
+
+import java.util.List;
+
+/**
+ * 考试成绩Mapper 接口
+ * @author zhongrj
+ */
+public interface ExamScoreMapper extends BaseMapper<ExamScore> {
+
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page  分页
+	 * @param examScore 实体
+	 * @return
+	 */
+	List<ExamScoreVO> selectExamScorePage(IPage page, @Param("examScore") ExamScoreVO examScore);
+
+	/**
+	 * 详情
+	 *
+	 * @param examScore 考试成绩信息对象
+	 */
+	ExamScoreVO selectExamScoreInfo(@Param("examScore") ExamScore examScore);
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/mapper/ExamScoreMapper.xml b/src/main/java/org/springblade/modules/exam/mapper/ExamScoreMapper.xml
new file mode 100644
index 0000000..dce17ed
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/mapper/ExamScoreMapper.xml
@@ -0,0 +1,43 @@
+<?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="org.springblade.modules.exam.mapper.ExamScoreMapper">
+
+    <!--考试成绩分页信息-->
+    <select id="selectExamScorePage" resultType="org.springblade.modules.exam.vo.ExamScoreVO">
+        SELECT
+         id,candidate_no candidateNo,theory_grade theoryGrade,isnull(learn_grade,-1) learnGrade,all_grade,
+         exam_name examName,security_name securityName,exam_type examType,company,exam_time examTime,
+         all_score allScore,exam_end_time examEndTime,qualified
+        FROM
+            exam_score
+        WHERE
+            1=1
+        <if test="examScore.examName!=null and  examScore.examName!=''">
+            and exam_name like concat('%', #{examScore.examName},'%')
+        </if>
+        <if test="examScore.company!=null and  examScore.company!=''">
+            and company like concat('%', #{examScore.company},'%')
+        </if>
+        <if test="examScore.securityName!=null and  examScore.securityName!=''">
+            and security_name like concat('%', #{examScore.securityName},'%')
+        </if>
+<!--        <if test="examScore.examType!=null">-->
+<!--            and exam_type = #{examScore.examType}-->
+<!--        </if>-->
+    </select>
+
+    <!--考试成绩详情信息-->
+    <select id="selectExamScoreInfo" resultType="org.springblade.modules.exam.vo.ExamScoreVO">
+        SELECT
+            id,candidate_no candidateNo,theory_grade theoryGrade,isnull(learn_grade,-1) learnGrade,all_grade,
+            exam_name examName,security_name securityName,exam_type examType,company,exam_time examTime,
+            all_score allScore,exam_end_time examEndTime,qualified
+        FROM
+            exam_score
+        WHERE
+            1=1
+        <if test="examScore.id!=null">
+            and id = #{examScore.id}
+        </if>
+    </select>
+</mapper>
diff --git a/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.java b/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.java
new file mode 100644
index 0000000..4d4eb85
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.java
@@ -0,0 +1,44 @@
+package org.springblade.modules.exam.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.exam.entity.ExamSubjectChoices;
+import org.springblade.modules.exam.vo.ExamSubjectChoicesVO;
+
+import java.util.List;
+
+/**
+ * 选择题Mapper 接口
+ * @author zhongrj
+ */
+public interface ExamSubjectChoicesMapper extends BaseMapper<ExamSubjectChoices> {
+
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page               分页
+	 * @param examSubjectChoices 实体
+	 * @return
+	 */
+	List<ExamSubjectChoicesVO> selectExamSubjectChoicesPage(IPage page, @Param("examSubjectChoices") ExamSubjectChoicesVO examSubjectChoices);
+
+	/**
+	 * 查询试卷题目
+	 * @param page
+	 * @param examSubjectChoices
+	 * @return
+	 */
+	List<ExamSubjectChoicesVO> getEexPaperChoices(IPage page, ExamSubjectChoicesVO examSubjectChoices);
+
+	/**
+	 * 详情
+	 *
+	 * @param examSubjectChoices 选择题信息对象
+	 */
+	ExamSubjectChoicesVO selectExamSubjectChoicesInfo(@Param("examSubjectChoices") ExamSubjectChoices examSubjectChoices);
+
+	boolean updateChoicesValue(String id,String value);
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.xml b/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.xml
new file mode 100644
index 0000000..35b04cb
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectChoicesMapper.xml
@@ -0,0 +1,87 @@
+<?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="org.springblade.modules.exam.mapper.ExamSubjectChoicesMapper">
+
+    <!--选择题分页信息-->
+    <select id="selectExamSubjectChoicesPage" resultType="org.springblade.modules.exam.vo.ExamSubjectChoicesVO">
+        SELECT
+            esc.*
+        FROM
+            exam_subject_choices esc
+        WHERE
+            1=1
+        <if test="examSubjectChoices.subjectName!=null and  examSubjectChoices.subjectName!=''">
+            and esc.subject_name like concat('%', #{examSubjectChoices.subjectName},'%')
+        </if>
+        <if test="examSubjectChoices.choicesType!=null and  examSubjectChoices.choicesType!=''">
+            and choices_type = #{examSubjectChoices.choicesType}
+        </if>
+    </select>
+
+    <!--查询试卷绑定的题目-->
+    <select id="getEexPaperChoices" resultType="org.springblade.modules.exam.vo.ExamSubjectChoicesVO">
+        SELECT
+            esc.*
+        FROM
+            exam_subject_choices esc
+        LEFT JOIN exam_examination_subject exa ON esc.id = exa.subject_id
+        WHERE
+            1=1
+        <if test="examSubjectChoices.id!=null and  examSubjectChoices.id!=''">
+            and exa.examination_id = #{examSubjectChoices.id}
+        </if>
+        <if test="examSubjectChoices.subjectName!=null and  examSubjectChoices.subjectName!=''">
+            and esc.subject_name like concat('%', #{examSubjectChoices.subjectName},'%')
+        </if>
+        <if test="examSubjectChoices.choicesType!=null and  examSubjectChoices.choicesType!=''">
+            and esc.choices_type = #{examSubjectChoices.choices_type}
+        </if>
+    </select>
+
+
+    <!--ExamSubjectChoicesInfoMap 多表联查 一对多查询 -->
+    <resultMap id="ExamSubjectChoicesInfoMap" type="org.springblade.modules.exam.vo.ExamSubjectChoicesVO">
+        <id property="id" column="id"/>
+        <id property="categoryId" column="category_id"/>
+        <id property="subjectName" column="subject_name"/>
+        <id property="choicesType" column="choices_type"/>
+        <id property="score" column="score"/>
+        <id property="analysis" column="analysis"/>
+        <id property="level" column="level"/>
+        <id property="creator" column="creator"/>
+        <id property="createDate" column="create_date"/>
+        <id property="modifier" column="modifier"/>
+        <id property="modifyDate" column="modify_date"/>
+        <id property="delFlag" column="del_flag"/>
+        <id property="applicationCode" column="application_code"/>
+        <id property="tenantCode" column="tenant_code"/>
+        <result column="id" property="id"/>
+        <collection property="examSubjectOptions" javaType="java.util.List" ofType="org.springblade.modules.exam.entity.ExamSubjectOption" autoMapping="true">
+            <id property="id" column="eso_id"/>
+        </collection>
+    </resultMap>
+
+
+    <!--选择题详情信息-->
+    <select id="selectExamSubjectChoicesInfo" resultMap="ExamSubjectChoicesInfoMap">
+        SELECT
+        esc.*,
+        eso.id eso_id,eso.subject_choices_id,eso.option_name,eso.option_content,eso.creator,
+        eso.create_date,eso.modifier,eso.modify_date,eso.del_flag,eso.application_code,eso.tenant_code
+        FROM
+        exam_subject_choices esc
+        left join
+        exam_subject_option eso
+        on
+        esc.id = eso.subject_choices_id
+        WHERE
+        1=1
+        <if test="examSubjectChoices.id!=null">
+            and esc.id = #{examSubjectChoices.id}
+        </if>
+    </select>
+
+    <update id="updateChoicesValue">
+        update exam_subject_choices set score = #{value} where id = #{id}
+    </update>
+</mapper>
diff --git a/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectOptionMapper.java b/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectOptionMapper.java
new file mode 100644
index 0000000..fa19e78
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectOptionMapper.java
@@ -0,0 +1,34 @@
+package org.springblade.modules.exam.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.exam.entity.ExamSubjectOption;
+import org.springblade.modules.exam.vo.ExamSubjectOptionVO;
+
+import java.util.List;
+
+/**
+ * 选择题选项Mapper 接口
+ * @author zhongrj
+ */
+public interface ExamSubjectOptionMapper extends BaseMapper<ExamSubjectOption> {
+
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page               分页
+	 * @param examSubjectOption 实体
+	 * @return
+	 */
+	List<ExamSubjectOptionVO> selectExamSubjectOptionPage(IPage page, @Param("examSubjectOption") ExamSubjectOptionVO examSubjectOption);
+
+	/**
+	 * 详情
+	 *
+	 * @param examSubjectOption 选择题选项信息对象
+	 */
+	ExamSubjectOptionVO selectExamSubjectOptionInfo(@Param("examSubjectOption") ExamSubjectOption examSubjectOption);
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectOptionMapper.xml b/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectOptionMapper.xml
new file mode 100644
index 0000000..836ae2c
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/mapper/ExamSubjectOptionMapper.xml
@@ -0,0 +1,33 @@
+<?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="org.springblade.modules.exam.mapper.ExamSubjectOptionMapper">
+
+    <!--选择题选项分页信息-->
+    <select id="selectExamSubjectOptionPage" resultType="org.springblade.modules.exam.vo.ExamSubjectOptionVO">
+        SELECT
+        *
+        FROM
+        exam_subject_option
+        WHERE
+        1=1
+        <if test="examSubjectOption.optionName!=null and  examSubjectOption.optionName!=''">
+            and option_name like concat('%', #{examSubjectOption.optionName},'%')
+        </if>
+    </select>
+
+
+
+
+    <!--选择题选项详情信息-->
+    <select id="selectExamSubjectOptionInfo" resultType="org.springblade.modules.exam.vo.ExamSubjectOptionVO">
+        SELECT
+            *
+        FROM
+        exam_subject_option
+        WHERE
+        1=1
+        <if test="examSubjectOption.id!=null">
+            and id = #{examSubjectOption.id}
+        </if>
+    </select>
+</mapper>
diff --git a/src/main/java/org/springblade/modules/exam/service/ExamPaperService.java b/src/main/java/org/springblade/modules/exam/service/ExamPaperService.java
new file mode 100644
index 0000000..edf0146
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/service/ExamPaperService.java
@@ -0,0 +1,57 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright exam,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  exam, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.exam.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.exam.entity.ExamPaper;
+import org.springblade.modules.exam.vo.ExamPaperSubjectVO;
+import org.springblade.modules.exam.vo.ExamPaperVO;
+import org.springblade.modules.exam.vo.ExamScoreVO;
+
+import java.util.List;
+
+/**
+ * 服务类
+ *
+ * @author Chill
+ */
+public interface ExamPaperService extends IService<ExamPaper> {
+
+	IPage<ExamPaperVO> selectExamPaperPage(IPage<ExamScoreVO> page, ExamPaperVO exam);
+
+	ExamPaperSubjectVO queryPagerSubject(ExamPaper paper);
+
+	/**
+	 * 计算成绩返回答案接口
+	 * @param paper
+	 * @return
+	 */
+	ExamPaperSubjectVO PagerSubject(ExamPaper paper);
+
+	/**
+	 * 自定义树
+	 * @param examPaper
+	 * @return
+	 */
+    List<ExamPaper> selectExamPaperPageTree(ExamPaper examPaper);
+
+	/**
+	 * 解除试卷和题目的绑定
+	 */
+	boolean UnbindSubject(String paperid,String subjectid);
+}
diff --git a/src/main/java/org/springblade/modules/exam/service/ExamScoreService.java b/src/main/java/org/springblade/modules/exam/service/ExamScoreService.java
new file mode 100644
index 0000000..1f8e3e8
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/service/ExamScoreService.java
@@ -0,0 +1,35 @@
+package org.springblade.modules.exam.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.exam.entity.ExamScore;
+import org.springblade.modules.exam.vo.ExamScoreVO;
+
+/**
+ * 考试成绩服务类
+ * @author zhongrj
+ */
+public interface ExamScoreService extends IService<ExamScore> {
+
+	/**
+	 * 自定义分页
+	 * @param page
+	 * @param examScore
+	 * @return
+	 */
+	IPage<ExamScoreVO> selectExamScorePage(IPage<ExamScoreVO> page, ExamScoreVO examScore);
+
+	/**
+	 * 详情
+	 * @param examScore 考试成绩信息对象
+	 * @return
+	 */
+	ExamScoreVO selectExamScoreInfo(ExamScore examScore);
+
+	/**
+	 * 保存考试成绩
+	 * @param examScore 考试成绩信息对象
+	 * @return
+	 */
+	Boolean saveExamScore(ExamScoreVO examScore);
+}
diff --git a/src/main/java/org/springblade/modules/exam/service/ExamSubjectChoicesService.java b/src/main/java/org/springblade/modules/exam/service/ExamSubjectChoicesService.java
new file mode 100644
index 0000000..10c578e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/service/ExamSubjectChoicesService.java
@@ -0,0 +1,40 @@
+package org.springblade.modules.exam.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.exam.entity.ExamSubjectChoices;
+import org.springblade.modules.exam.vo.ExamSubjectChoicesVO;
+
+/**
+ * 选择题服务类
+ * @author zhongrj
+ */
+public interface ExamSubjectChoicesService extends IService<ExamSubjectChoices> {
+
+	/**
+	 * 自定义分页
+	 * @param page
+	 * @param examSubjectChoices
+	 * @return
+	 */
+	IPage<ExamSubjectChoicesVO> selectExamSubjectChoicesPage(IPage<ExamSubjectChoicesVO> page, ExamSubjectChoicesVO examSubjectChoices);
+
+	/**
+	 * 查询试卷题目
+	 * @param page
+	 * @param examSubjectChoices
+	 * @return
+	 */
+	IPage<ExamSubjectChoicesVO> getEexPaperChoices(IPage<ExamSubjectChoicesVO> page, ExamSubjectChoicesVO examSubjectChoices);
+
+	/**
+	 * 详情
+	 * @param examSubjectChoices 选择题信息对象
+	 */
+	ExamSubjectChoicesVO selectExamSubjectChoicesInfo(ExamSubjectChoices examSubjectChoices);
+
+	/**
+	 *	修改分值
+	 */
+	boolean updateChoicesValue(String id , String value);
+}
diff --git a/src/main/java/org/springblade/modules/exam/service/ExamSubjectOptionService.java b/src/main/java/org/springblade/modules/exam/service/ExamSubjectOptionService.java
new file mode 100644
index 0000000..86ff892
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/service/ExamSubjectOptionService.java
@@ -0,0 +1,27 @@
+package org.springblade.modules.exam.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.exam.entity.ExamSubjectOption;
+import org.springblade.modules.exam.vo.ExamSubjectOptionVO;
+
+/**
+ * 选择题选项服务类
+ * @author zhongrj
+ */
+public interface ExamSubjectOptionService extends IService<ExamSubjectOption> {
+
+	/**
+	 * 自定义分页
+	 * @param page
+	 * @param examSubjectOption
+	 * @return
+	 */
+	IPage<ExamSubjectOptionVO> selectExamSubjectOptionPage(IPage<ExamSubjectOptionVO> page, ExamSubjectOptionVO examSubjectOption);
+
+	/**
+	 * 详情
+	 * @param examSubjectOption 选择题选项信息对象
+	 */
+	ExamSubjectOptionVO selectExamSubjectOptionInfo(ExamSubjectOption examSubjectOption);
+}
diff --git a/src/main/java/org/springblade/modules/exam/service/impl/ExamPaperServiceImpl.java b/src/main/java/org/springblade/modules/exam/service/impl/ExamPaperServiceImpl.java
new file mode 100644
index 0000000..83fa6c1
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/service/impl/ExamPaperServiceImpl.java
@@ -0,0 +1,72 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.exam.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.exam.entity.ExamPaper;
+import org.springblade.modules.exam.mapper.ExamPaperMapper;
+import org.springblade.modules.exam.service.ExamPaperService;
+import org.springblade.modules.exam.vo.ExamPaperSubjectVO;
+import org.springblade.modules.exam.vo.ExamPaperVO;
+import org.springblade.modules.exam.vo.ExamScoreVO;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 服务实现类
+ *
+ * @author Chill
+ */
+@Service
+public class ExamPaperServiceImpl extends ServiceImpl<ExamPaperMapper, ExamPaper> implements ExamPaperService {
+
+
+	@Override
+	public IPage<ExamPaperVO> selectExamPaperPage(IPage<ExamScoreVO> page, ExamPaperVO exam) {
+		return baseMapper.selectExamPaperPage(page,exam);
+	}
+
+	@Override
+	public ExamPaperSubjectVO queryPagerSubject(ExamPaper paper) {
+		//查询试卷分类信息
+		return baseMapper.queryPagerSubject(paper);
+	}
+
+	@Override
+	public ExamPaperSubjectVO PagerSubject(ExamPaper paper) {
+		//查询试卷分类信息
+		return baseMapper.PagerSubject(paper);
+	}
+
+	/**
+	 * 自定义树
+	 * @param examPaper 试卷对象
+	 * @return
+	 */
+	@Override
+	public List<ExamPaper> selectExamPaperPageTree(ExamPaper examPaper) {
+		return baseMapper.selectExamPaperPageTree(examPaper);
+	}
+
+	@Override
+	public boolean UnbindSubject(String paperid, String subjectid) {
+		return baseMapper.UnbindSubject(paperid,subjectid);
+	}
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/service/impl/ExamScoreServiceImpl.java b/src/main/java/org/springblade/modules/exam/service/impl/ExamScoreServiceImpl.java
new file mode 100644
index 0000000..617bc0e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/service/impl/ExamScoreServiceImpl.java
@@ -0,0 +1,123 @@
+
+package org.springblade.modules.exam.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.AllArgsConstructor;
+import org.springblade.modules.exam.entity.ExamExaminationSubject;
+import org.springblade.modules.exam.entity.ExamPaper;
+import org.springblade.modules.exam.entity.ExamScore;
+import org.springblade.modules.exam.mapper.ExamScoreMapper;
+import org.springblade.modules.exam.service.ExamPaperService;
+import org.springblade.modules.exam.service.ExamScoreService;
+import org.springblade.modules.exam.vo.ExamResultVO;
+import org.springblade.modules.exam.vo.ExamScoreVO;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 考试成绩服务实现类
+ * @author zhongrj
+ */
+@Service
+@AllArgsConstructor
+public class ExamScoreServiceImpl extends ServiceImpl<ExamScoreMapper, ExamScore> implements ExamScoreService {
+
+	private final ExamPaperService examPaperService;
+
+	/**
+	 * 自定义分页数据
+	 * @param page 分页条件
+	 * @param examScore 考试成绩对象
+	 * @return
+	 */
+	@Override
+	public IPage<ExamScoreVO> selectExamScorePage(IPage<ExamScoreVO> page, ExamScoreVO examScore) {
+		return page.setRecords(baseMapper.selectExamScorePage(page, examScore));
+	}
+
+	/**
+	 * 详情
+	 * @param examScore 考试成绩信息对象
+	 */
+	@Override
+	public ExamScoreVO selectExamScoreInfo(ExamScore examScore) {
+		return baseMapper.selectExamScoreInfo(examScore);
+	}
+
+	/**
+	 * 保存考试成绩
+	 * @param examScore 考试成绩信息对象
+	 * @return
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean saveExamScore(ExamScoreVO examScore) {
+		//取出考试结果
+		if (examScore.getExamResultVOS().size()>0){
+			List<ExamResultVO> examResultVOS = examScore.getExamResultVOS();
+			//获取试卷的内容(题号,答案)
+			ExamPaper examPaper = new ExamPaper();
+			examPaper.setId(examScore.getPapersId());
+			List<ExamExaminationSubject> examExaminationSubjects
+				= examPaperService.PagerSubject(examPaper).getExamExaminationSubjects();
+			//比对考试结果
+			//声明理论得分
+			int theoryGrade = 0;
+			for (ExamResultVO examResultVO : examResultVOS) {
+				for (ExamExaminationSubject examExaminationSubject : examExaminationSubjects) {
+					//对比题目id
+					if (examResultVO.getSubjectChoicesId().equals(examExaminationSubject.getExamSubjectChoices().getId())) {
+						//对比答案
+
+						if (examExaminationSubject.getExamSubjectChoices().getChoicesType() == 2 || examExaminationSubject.getExamSubjectChoices().getChoicesType() == 3){
+							//判断题逻辑
+							if (examResultVO.getValue().equals(examExaminationSubject.getExamSubjectChoices().getAnswer())) {
+								theoryGrade += examResultVO.getGrade();
+							}
+						}else if(examExaminationSubject.getExamSubjectChoices().getChoicesType() == 0 || examExaminationSubject.getExamSubjectChoices().getChoicesType() == 1){
+							//处理多选题的答案排序
+							String[] split = examResultVO.getValue().split(",");
+							StringBuilder builder = new StringBuilder();
+							for (String s : split) {
+								builder.append(s);
+							}
+							char[] arrayCh = builder.toString().toCharArray();
+							//利用数组帮助类自动排序
+							Arrays.sort(arrayCh);
+							String sub0 = Arrays.toString(arrayCh);
+							String sub = sub0.substring(1,sub0.length()-1).replaceAll(" ","");
+							if (sub.equals(examExaminationSubject.getExamSubjectChoices().getAnswer())) {
+								theoryGrade += examResultVO.getGrade();
+							}
+						}
+						//移除当前试卷题目答案对象
+						examExaminationSubjects.remove(examExaminationSubject);
+						break;
+					}
+				}
+			}
+			//设置理论得分
+			examScore.setTheoryGrade(theoryGrade);
+			//计算总成绩,此时没有实操成绩,总成绩为实操成绩和理论成绩和的一半
+			examScore.setAllGrade(Math.round(theoryGrade/2));
+			//设置状态
+			if (theoryGrade>=60){
+				examScore.setQualified(2);
+			}else {
+				examScore.setQualified(1);
+			}
+			//保存成绩数据
+			int i = baseMapper.insert(examScore);
+			if (i>0){
+				//返回结果
+				return true;
+			}
+		}
+		//返回结果
+		return false;
+	}
+}
diff --git a/src/main/java/org/springblade/modules/exam/service/impl/ExamSubjectChoicesServiceImpl.java b/src/main/java/org/springblade/modules/exam/service/impl/ExamSubjectChoicesServiceImpl.java
new file mode 100644
index 0000000..4e9634d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/service/impl/ExamSubjectChoicesServiceImpl.java
@@ -0,0 +1,42 @@
+
+package org.springblade.modules.exam.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.exam.entity.ExamSubjectChoices;
+import org.springblade.modules.exam.mapper.ExamSubjectChoicesMapper;
+import org.springblade.modules.exam.service.ExamSubjectChoicesService;
+import org.springblade.modules.exam.vo.ExamSubjectChoicesVO;
+import org.springframework.stereotype.Service;
+
+/**
+ * 选择题服务实现类
+ * @author zhongrj
+ */
+@Service
+public class ExamSubjectChoicesServiceImpl extends ServiceImpl<ExamSubjectChoicesMapper, ExamSubjectChoices> implements ExamSubjectChoicesService {
+
+	@Override
+	public IPage<ExamSubjectChoicesVO> selectExamSubjectChoicesPage(IPage<ExamSubjectChoicesVO> page, ExamSubjectChoicesVO examSubjectChoices) {
+		return page.setRecords(baseMapper.selectExamSubjectChoicesPage(page, examSubjectChoices));
+	}
+
+	@Override
+	public IPage<ExamSubjectChoicesVO> getEexPaperChoices(IPage<ExamSubjectChoicesVO> page, ExamSubjectChoicesVO examSubjectChoices) {
+		return page.setRecords(baseMapper.getEexPaperChoices(page, examSubjectChoices));
+	}
+
+	/**
+	 * 详情
+	 * @param examSubjectChoices 选择题信息对象
+	 */
+	@Override
+	public ExamSubjectChoicesVO selectExamSubjectChoicesInfo(ExamSubjectChoices examSubjectChoices) {
+		return baseMapper.selectExamSubjectChoicesInfo(examSubjectChoices);
+	}
+
+	@Override
+	public boolean updateChoicesValue(String id, String value) {
+		return baseMapper.updateChoicesValue(id,value);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/exam/service/impl/ExamSubjectOptionServiceImpl.java b/src/main/java/org/springblade/modules/exam/service/impl/ExamSubjectOptionServiceImpl.java
new file mode 100644
index 0000000..cb98ffc
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/service/impl/ExamSubjectOptionServiceImpl.java
@@ -0,0 +1,32 @@
+
+package org.springblade.modules.exam.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.exam.entity.ExamSubjectOption;
+import org.springblade.modules.exam.mapper.ExamSubjectOptionMapper;
+import org.springblade.modules.exam.service.ExamSubjectOptionService;
+import org.springblade.modules.exam.vo.ExamSubjectOptionVO;
+import org.springframework.stereotype.Service;
+
+/**
+ * 选择题选项服务实现类
+ * @author zhongrj
+ */
+@Service
+public class ExamSubjectOptionServiceImpl extends ServiceImpl<ExamSubjectOptionMapper, ExamSubjectOption> implements ExamSubjectOptionService {
+
+	@Override
+	public IPage<ExamSubjectOptionVO> selectExamSubjectOptionPage(IPage<ExamSubjectOptionVO> page, ExamSubjectOptionVO examSubjectOption) {
+		return page.setRecords(baseMapper.selectExamSubjectOptionPage(page, examSubjectOption));
+	}
+
+	/**
+	 * 详情
+	 * @param examSubjectOption 选择题选项信息对象
+	 */
+	@Override
+	public ExamSubjectOptionVO selectExamSubjectOptionInfo(ExamSubjectOption examSubjectOption) {
+		return baseMapper.selectExamSubjectOptionInfo(examSubjectOption);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/exam/vo/ExamPaperSubjectVO.java b/src/main/java/org/springblade/modules/exam/vo/ExamPaperSubjectVO.java
new file mode 100644
index 0000000..2d51686
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/vo/ExamPaperSubjectVO.java
@@ -0,0 +1,23 @@
+package org.springblade.modules.exam.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.exam.entity.ExamExaminationSubject;
+import org.springblade.modules.exam.entity.ExamPaper;
+
+import java.util.List;
+
+/**
+ * 考试类目视图类
+ *
+ * @author Chill
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ExamPaperSubjectVO extends ExamPaper {
+
+	/**
+	 * 考试类目
+	 */
+	private List<ExamExaminationSubject> examExaminationSubjects;
+}
diff --git a/src/main/java/org/springblade/modules/exam/vo/ExamPaperVO.java b/src/main/java/org/springblade/modules/exam/vo/ExamPaperVO.java
new file mode 100644
index 0000000..2a411c4
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/vo/ExamPaperVO.java
@@ -0,0 +1,16 @@
+package org.springblade.modules.exam.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.exam.entity.ExamPaper;
+
+/**
+ * 通知公告视图类
+ *
+ * @author Chill
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ExamPaperVO extends ExamPaper {
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/vo/ExamResultVO.java b/src/main/java/org/springblade/modules/exam/vo/ExamResultVO.java
new file mode 100644
index 0000000..6f78663
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/vo/ExamResultVO.java
@@ -0,0 +1,28 @@
+package org.springblade.modules.exam.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author zhongrj
+ */
+@Data
+public class ExamResultVO implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 题目id
+	 */
+	private Long subjectChoicesId;
+
+	/**
+	 * 提交的答案
+	 */
+	private String value;
+
+	/**
+	 * 每道题的分数
+	 */
+	private Integer grade;
+}
diff --git a/src/main/java/org/springblade/modules/exam/vo/ExamScoreVO.java b/src/main/java/org/springblade/modules/exam/vo/ExamScoreVO.java
new file mode 100644
index 0000000..89b631d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/vo/ExamScoreVO.java
@@ -0,0 +1,27 @@
+package org.springblade.modules.exam.vo;
+
+import lombok.Data;
+import org.springblade.modules.exam.entity.ExamScore;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 选择题选项实体类vo
+ * @author zhongrj
+ * @time 2021-07-16
+ */
+@Data
+public class ExamScoreVO extends ExamScore implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 试卷id
+	 */
+	private Long papersId;
+
+	/**
+	 * 考勤提交的结果
+	 */
+	private List<ExamResultVO> examResultVOS;
+}
diff --git a/src/main/java/org/springblade/modules/exam/vo/ExamSubjectChoicesVO.java b/src/main/java/org/springblade/modules/exam/vo/ExamSubjectChoicesVO.java
new file mode 100644
index 0000000..d8c32e5
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/vo/ExamSubjectChoicesVO.java
@@ -0,0 +1,22 @@
+package org.springblade.modules.exam.vo;
+
+import lombok.Data;
+import org.springblade.modules.exam.entity.ExamSubjectChoices;
+import org.springblade.modules.exam.entity.ExamSubjectOption;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 选择题实体类vo
+ * @author zhongrj
+ * @time 2021-07-16
+ */
+@Data
+public class ExamSubjectChoicesVO extends ExamSubjectChoices implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	private List<ExamSubjectOption> examSubjectOptions;
+
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/vo/ExamSubjectOptionVO.java b/src/main/java/org/springblade/modules/exam/vo/ExamSubjectOptionVO.java
new file mode 100644
index 0000000..c333fb9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/vo/ExamSubjectOptionVO.java
@@ -0,0 +1,18 @@
+package org.springblade.modules.exam.vo;
+
+import lombok.Data;
+import org.springblade.modules.exam.entity.ExamSubjectOption;
+
+import java.io.Serializable;
+
+/**
+ * 选择题选项实体类vo
+ * @author zhongrj
+ * @time 2021-07-16
+ */
+@Data
+public class ExamSubjectOptionVO extends ExamSubjectOption implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+
+}
diff --git a/src/main/java/org/springblade/modules/exam/wrapper/ExamPaperWrapper.java b/src/main/java/org/springblade/modules/exam/wrapper/ExamPaperWrapper.java
new file mode 100644
index 0000000..9275337
--- /dev/null
+++ b/src/main/java/org/springblade/modules/exam/wrapper/ExamPaperWrapper.java
@@ -0,0 +1,44 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright exam,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  exam, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.exam.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.exam.entity.ExamPaper;
+import org.springblade.modules.exam.vo.ExamPaperVO;
+
+import java.util.Objects;
+
+/**
+ * Notice包装类,返回视图层所需的字段
+ *
+ * @author Chill
+ */
+public class ExamPaperWrapper extends BaseEntityWrapper<ExamPaper, ExamPaperVO> {
+
+	public static ExamPaperWrapper build() {
+		return new ExamPaperWrapper();
+	}
+
+	@Override
+	public ExamPaperVO entityVO(ExamPaper exam) {
+		ExamPaperVO examVO = Objects.requireNonNull(BeanUtil.copy(exam, ExamPaperVO.class));
+//		String dictValue = DictCache.getValue(DictEnum.NOTICE, examVO.getCategory());
+		return examVO;
+	}
+
+}

--
Gitblit v1.9.3