浏览代码

新增情况统计和缺考名单导出

wangliang 1 年之前
父节点
当前提交
bc6a5ed99d

+ 2 - 0
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamReexamController.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
+import com.qmth.themis.business.annotation.RedisLimitAnnotation;
 import com.qmth.themis.business.bean.admin.ReexamListRequestBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
@@ -290,6 +291,7 @@ public class TEExamReexamController {
     @ApiOperation(value = "重考待审提醒接口")
     @RequestMapping(value = "/list_not_done_notify", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @RedisLimitAnnotation(key = "listNotDoneNotify", period = 1, count = 1)
     public Result listNotDoneNotify(@ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         Integer count = teExamReexamService.reexamPageNotDoneCount(examId, tbUser.getId(), tbUser.getOrgId());

+ 38 - 0
themis-admin/src/main/java/com/qmth/themis/admin/api/TIeReportController.java

@@ -1,8 +1,11 @@
 package com.qmth.themis.admin.api;
 
+import com.qmth.themis.business.bean.admin.ExamDeficiencyListBean;
+import com.qmth.themis.business.bean.admin.ExamViewCountListBean;
 import com.qmth.themis.business.bean.admin.InvigilateListPatrolReportBean;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.entity.TBUser;
+import com.qmth.themis.business.excel.ExportUtils;
 import com.qmth.themis.business.service.TIeReportService;
 import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
@@ -19,6 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -71,6 +75,23 @@ public class TIeReportController {
         return ResultUtil.ok(reportService.examViewCount(tbUser.getOrgId(), examId, examActivityId, roomCode, courseCode, name, identity, pageNumber, pageSize));
     }
 
+    @ApiOperation(value = "情况统计导出")
+    @RequestMapping(value = "/exam_view_count/export", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
+    public void examViewCountExport(@ApiParam(value = "考试id", required = true) @RequestParam(required = true) Long examId,
+                                    @ApiParam(value = "考场场次id", required = false) @RequestParam(required = false) Long examActivityId,
+                                    @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode,
+                                    @ApiParam(value = "科目编码", required = false) @RequestParam(required = false) String courseCode,
+                                    @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
+                                    @ApiParam(value = "唯一码", required = false) @RequestParam(required = false) String identity) throws Exception {
+        if (Objects.isNull(examId) || Objects.equals(examId, "")) {
+            throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
+        }
+        TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
+        List<ExamViewCountListBean> examViewCountListBeanList = reportService.examViewCountExport(tbUser.getOrgId(), examId, examActivityId, roomCode, courseCode, name, identity);
+        ExportUtils.exportEXCEL("情况统计", ExamViewCountListBean.class, examViewCountListBeanList, ServletUtil.getResponse());
+    }
+
     @ApiOperation(value = "缺考名单")
     @RequestMapping(value = "/exam_deficiency_list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
@@ -89,6 +110,23 @@ public class TIeReportController {
         return ResultUtil.ok(reportService.examDeficiencyList(tbUser.getOrgId(), examId, examActivityId, roomCode, courseCode, name, identity, pageNumber, pageSize));
     }
 
+    @ApiOperation(value = "缺考名单导出")
+    @RequestMapping(value = "/exam_deficiency_list/export", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
+    public void examDeficiencyListExport(@ApiParam(value = "考试id", required = true) @RequestParam(required = true) Long examId,
+                                         @ApiParam(value = "考场场次id", required = false) @RequestParam(required = false) Long examActivityId,
+                                         @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode,
+                                         @ApiParam(value = "科目编码", required = false) @RequestParam(required = false) String courseCode,
+                                         @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
+                                         @ApiParam(value = "唯一码", required = false) @RequestParam(required = false) String identity) throws Exception {
+        if (Objects.isNull(examId) || Objects.equals(examId, "")) {
+            throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
+        }
+        TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
+        List<ExamDeficiencyListBean> examDeficiencyListBeanList = reportService.examDeficiencyListExport(tbUser.getOrgId(), examId, examActivityId, roomCode, courseCode, name, identity);
+        ExportUtils.exportEXCEL("缺考名单", ExamDeficiencyListBean.class, examDeficiencyListBeanList, ServletUtil.getResponse());
+    }
+
     @ApiOperation(value = "异常处理")
     @RequestMapping(value = "/exam_exception_list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})

+ 29 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/admin/ExamDeficiencyListBean.java

@@ -2,6 +2,7 @@ package com.qmth.themis.business.bean.admin;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.themis.business.excel.ExcelProperty;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -13,6 +14,7 @@ public class ExamDeficiencyListBean implements Serializable {
     private static final long serialVersionUID = 1997861915329030074L;
 
     @ApiModelProperty(name = "考试名称")
+    @ExcelProperty(name = "批次名称(ID)", width = 30, index = 1)
     private String examName;
 
     @JsonSerialize(using = ToStringSerializer.class)
@@ -24,6 +26,7 @@ public class ExamDeficiencyListBean implements Serializable {
     private Long examActivityId;
 
     @ApiModelProperty(name = "场次代码")
+    @ExcelProperty(name = "场次代码", width = 30, index = 2)
     private String examActivityCode;
 
     @ApiModelProperty(name = "虚拟考场代码")
@@ -32,10 +35,16 @@ public class ExamDeficiencyListBean implements Serializable {
     @ApiModelProperty(name = "虚拟考场名称")
     private String roomName;
 
+    @ApiModelProperty(name = "考场名称(代码)")
+    @ExcelProperty(name = "考场名称(代码)", width = 30, index = 3)
+    private String roomNameCode;
+
     @ApiModelProperty(name = "唯一码")
+    @ExcelProperty(name = "证件号", width = 30, index = 4)
     private String identity;
 
     @ApiModelProperty(name = "姓名")
+    @ExcelProperty(name = "姓名", width = 30, index = 5)
     private String name;
 
     @ApiModelProperty(name = "科目名称")
@@ -44,6 +53,26 @@ public class ExamDeficiencyListBean implements Serializable {
     @ApiModelProperty(name = "科目编码")
     private String courseName;
 
+    @ApiModelProperty(name = "科目名称(代码)")
+    @ExcelProperty(name = "科目名称(代码)", width = 30, index = 6)
+    private String courseNameCode;
+
+    public String getRoomNameCode() {
+        return roomNameCode;
+    }
+
+    public void setRoomNameCode(String roomNameCode) {
+        this.roomNameCode = roomNameCode;
+    }
+
+    public String getCourseNameCode() {
+        return courseNameCode;
+    }
+
+    public void setCourseNameCode(String courseNameCode) {
+        this.courseNameCode = courseNameCode;
+    }
+
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }

+ 19 - 4
themis-business/src/main/java/com/qmth/themis/business/bean/admin/ExamViewCountListBean.java

@@ -4,18 +4,17 @@ import java.io.Serializable;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.themis.business.excel.ExcelProperty;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 @ApiModel("报表-情况统计返回对象")
 public class ExamViewCountListBean implements Serializable {
 
-    /**
-	 * 
-	 */
 	private static final long serialVersionUID = -4399923396400174947L;
 	
 	@ApiModelProperty(name = "考试名称")
+    @ExcelProperty(name = "批次名称(ID)", width = 30, index = 1)
     private String examName;
 
 	@JsonSerialize(using = ToStringSerializer.class)
@@ -27,6 +26,7 @@ public class ExamViewCountListBean implements Serializable {
     private Long examActivityId;
 
 	@ApiModelProperty(name = "场次代码")
+    @ExcelProperty(name = "场次代码", width = 30, index = 2)
 	private String examActivityCode;
 
     @ApiModelProperty(name = "虚拟考场代码")
@@ -35,16 +35,31 @@ public class ExamViewCountListBean implements Serializable {
     @ApiModelProperty(name = "虚拟考场名称")
     private String roomName;
 
+    @ApiModelProperty(name = "考场名称(代码)")
+    @ExcelProperty(name = "考场名称(代码)", width = 30, index = 3)
+    private String roomNameCode;
+
     @ApiModelProperty(name = "应考")
+    @ExcelProperty(name = "应考(科次)", width = 30, index = 4)
     private Long examTotal;
     
     @ApiModelProperty(name = "实考")
+    @ExcelProperty(name = "实考(科次)", width = 30, index = 5)
     private Long actualExamTotal;
     
     @ApiModelProperty(name = "缺考")
+    @ExcelProperty(name = "缺考(科次)", width = 30, index = 6)
     private Long deficiencyExamTotal;
 
-	public static long getSerialVersionUID() {
+    public String getRoomNameCode() {
+        return roomNameCode;
+    }
+
+    public void setRoomNameCode(String roomNameCode) {
+        this.roomNameCode = roomNameCode;
+    }
+
+    public static long getSerialVersionUID() {
 		return serialVersionUID;
 	}
 

+ 8 - 0
themis-business/src/main/java/com/qmth/themis/business/dao/TEExamStudentMapper.java

@@ -54,6 +54,9 @@ public interface TEExamStudentMapper extends CustomBaseMapper<TEExamStudent> {
     public IPage<ExamViewCountListBean> getTotalCountInfo(IPage<Map> iPage, @Param("orgId") Long orgId, @Param("examId") Long examId, @Param("activityId") Long activityId,
                                                           @Param("roomCode") String roomCode, @Param("courseCode") String courseCode);
 
+    public List<ExamViewCountListBean> getTotalCountInfoExport(@Param("orgId") Long orgId, @Param("examId") Long examId, @Param("activityId") Long activityId,
+                                                               @Param("roomCode") String roomCode, @Param("courseCode") String courseCode);
+
     @SuppressWarnings("MybatisXMapperMethodInspection")
     public List<Map<String, Object>> getDoneCountByActivityIds(@Param("examId") Long examId, @Param("activityIds") List<Long> activityIds);
 
@@ -72,6 +75,11 @@ public interface TEExamStudentMapper extends CustomBaseMapper<TEExamStudent> {
                                                                @Param("activityId") Long activityId, @Param("roomCode") String roomCode,
                                                                @Param("courseCode") String courseCode, @Param("name") String name, @Param("identity") String identity, @Param("activityIds") List<Long> activityIds);
 
+    public List<ExamDeficiencyListBean> getExamDeficiencyPageExport(@Param("examId") Long examId,
+                                                                     @Param("activityId") Long activityId, @Param("roomCode") String roomCode,
+                                                                     @Param("courseCode") String courseCode, @Param("name") String name, @Param("identity") String identity, @Param("activityIds") List<Long> activityIds);
+
+
     public IPage<ExamStudentLogListBean> getPageForStudentLog(IPage<ExamStudentLogListBean> iPage, @Param("orgId") Long orgId, @Param("examId") Long examId,
                                                               @Param("activityId") Long activityId, @Param("roomCode") String roomCode,
                                                               @Param("courseCode") String courseCode, @Param("name") String name, @Param("identity") String identity);

+ 31 - 6
themis-business/src/main/java/com/qmth/themis/business/service/TIeReportService.java

@@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.themis.business.bean.admin.*;
 import com.qmth.themis.business.bean.result.TimeScaleDataResult;
 
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -47,8 +45,21 @@ public interface TIeReportService {
      * @param pageSize
      * @return
      */
-    public IPage examViewCount(Long orgId, Long examId, Long examActivityId, String roomCode, String courseCode, String name,
-                               String identity, int pageNumber, int pageSize);
+    public IPage<ExamViewCountListBean> examViewCount(Long orgId, Long examId, Long examActivityId, String roomCode, String courseCode, String name, String identity, int pageNumber, int pageSize);
+
+    /**
+     * 情况统计考出
+     *
+     * @param orgId
+     * @param examId
+     * @param examActivityId
+     * @param roomCode
+     * @param courseCode
+     * @param name
+     * @param identity
+     * @return
+     */
+    public List<ExamViewCountListBean> examViewCountExport(Long orgId, Long examId, Long examActivityId, String roomCode, String courseCode, String name, String identity);
 
     /**
      * 缺考名单
@@ -64,8 +75,22 @@ public interface TIeReportService {
      * @param pageSize
      * @return
      */
-    public IPage examDeficiencyList(Long orgId, Long examId, Long examActivityId, String roomCode, String courseCode, String name,
-                                    String identity, int pageNumber, int pageSize);
+    public IPage<ExamDeficiencyListBean> examDeficiencyList(Long orgId, Long examId, Long examActivityId, String roomCode, String courseCode, String name,
+                                                            String identity, int pageNumber, int pageSize);
+
+    /**
+     * 缺考名单导出
+     *
+     * @param orgId
+     * @param examId
+     * @param examActivityId
+     * @param roomCode
+     * @param courseCode
+     * @param name
+     * @param identity
+     * @return
+     */
+    public List<ExamDeficiencyListBean> examDeficiencyListExport(Long orgId, Long examId, Long examActivityId, String roomCode, String courseCode, String name, String identity);
 
     /**
      * 异常处理

+ 43 - 2
themis-business/src/main/java/com/qmth/themis/business/service/impl/TIeReportServiceImpl.java

@@ -133,8 +133,24 @@ public class TIeReportServiceImpl implements TIeReportService {
     @Override
     public IPage<ExamViewCountListBean> examViewCount(Long orgId, Long examId, Long examActivityId, String roomCode, String courseCode, String name,
                                                       String identity, int pageNumber, int pageSize) {
-        return examStudentMapper.getTotalCountInfo(new Page<>(pageNumber, pageSize),
-                orgId, examId, examActivityId, roomCode, courseCode);
+        return examStudentMapper.getTotalCountInfo(new Page<>(pageNumber, pageSize), orgId, examId, examActivityId, roomCode, courseCode);
+    }
+
+    /**
+     * 情况统计考出
+     *
+     * @param orgId
+     * @param examId
+     * @param examActivityId
+     * @param roomCode
+     * @param courseCode
+     * @param name
+     * @param identity
+     * @return
+     */
+    @Override
+    public List<ExamViewCountListBean> examViewCountExport(Long orgId, Long examId, Long examActivityId, String roomCode, String courseCode, String name, String identity) {
+        return examStudentMapper.getTotalCountInfoExport(orgId, examId, examActivityId, roomCode, courseCode);
     }
 
     /**
@@ -169,6 +185,31 @@ public class TIeReportServiceImpl implements TIeReportService {
                 roomCode, courseCode, name, identity, absentActivityIds);
     }
 
+    /**
+     * 缺考名单导出
+     *
+     * @param orgId
+     * @param examId
+     * @param examActivityId
+     * @param roomCode
+     * @param courseCode
+     * @param name
+     * @param identity
+     * @return
+     */
+    @Override
+    public List<ExamDeficiencyListBean> examDeficiencyListExport(Long orgId, Long examId, Long examActivityId, String roomCode, String courseCode, String name, String identity) {
+        List<TEExamActivity> acs = examActivityService.findByExamIdAndOrgId(examId, orgId);
+        List<Long> absentActivityIds = new ArrayList<>();
+        for (TEExamActivity ac : acs) {
+            ExamCacheBean exam = examService.getExamCacheBean(ac.getExamId());
+            if (InvigilateMonitorStatusEnum.FINISHED.equals(exam.getMonitorStatus())) {// 结束监考的,未考试的都是缺考
+                absentActivityIds.add(ac.getId());
+            }
+        }
+        return examStudentMapper.getExamDeficiencyPageExport(examId, examActivityId, roomCode, courseCode, name, identity, absentActivityIds);
+    }
+
     /**
      * 异常处理
      *

+ 23 - 1
themis-business/src/main/resources/db/log/1.2.8.log

@@ -3,4 +3,26 @@ ALTER TABLE t_b_user ADD pwd_force TINYINT DEFAULT 0
 
 UPDATE t_b_user
 SET org_id=NULL, login_name='sysadmin', name='sysadmin', password='cW10aDIwMjIpKCo=', mobile_number=NULL, enable=1, create_time=1600932652000, update_time=1600932652000, remark='系统管理员', pwd_force=1, create_id=0, update_id=1
-WHERE id=1;
+WHERE id=1;
+
+INSERT INTO t_b_privilege
+(id, name, url, `type`, parent_id, `sequence`, remark, create_time)
+VALUES(206, '报表-情况统计导出', '/api/admin/report/exam_view_count/export', 'LINK', 24, 3, NULL, 1600932652000);
+INSERT INTO t_b_privilege
+(id, name, url, `type`, parent_id, `sequence`, remark, create_time)
+VALUES(207, '报表-缺考名单导出', '/api/admin/report/exam_deficiency_list/export', 'LINK', 24, 4, NULL, 1600932652000);
+
+INSERT INTO t_b_role_privilege
+(id, role_code, privilege_id)
+VALUES(256, 'ADMIN', 206);
+INSERT INTO t_b_role_privilege
+(id, role_code, privilege_id)
+VALUES(257, 'ADMIN', 207);
+
+/*删除进度查询菜单*/
+INSERT INTO t_b_role_privilege
+(id, role_code, privilege_id)
+VALUES(149, 'INVIGILATE', 19);
+INSERT INTO t_b_role_privilege
+(id, role_code, privilege_id)
+VALUES(153, 'ADMIN', 19);

+ 23 - 6
themis-business/src/main/resources/mapper/TEExamStudentMapper.xml

@@ -90,8 +90,7 @@
         group by t.exam_activity_id
     </select>
 
-    <select id="getTotalCountInfo"
-            resultType="com.qmth.themis.business.bean.admin.ExamViewCountListBean">
+    <sql id="getTotalCountInfoSql">
         select
         tee.name as examName,
         t.exam_id examId,
@@ -102,7 +101,8 @@
         teea.code as examActivityCode,
         tee.monitor_status as monitorStatus,
         count(toer.exam_student_id) as actualExamTotal,
-        if(teea.finish_time <![CDATA[ <= ]]> (unix_timestamp(current_timestamp()) * 1000),count(1)- count(distinct toer.exam_student_id),0) as deficiencyExamTotal
+        if(teea.finish_time <![CDATA[ <= ]]> (unix_timestamp(current_timestamp()) * 1000),count(1)- count(distinct toer.exam_student_id),0) as deficiencyExamTotal,
+        CONCAT(t.room_name,'(',t.room_code,')') as roomNameCode
         from t_e_exam_student t
         left join t_e_student h on t.student_id = h.id
         left join t_e_exam_activity teea on teea.id = t.exam_activity_id
@@ -128,6 +128,14 @@
         t.room_name
         order by
         CAST(teea.code AS UNSIGNED),CAST(t.room_code AS UNSIGNED)
+    </sql>
+
+    <select id="getTotalCountInfo" resultType="com.qmth.themis.business.bean.admin.ExamViewCountListBean">
+        <include refid="getTotalCountInfoSql" />
+    </select>
+
+    <select id="getTotalCountInfoExport" resultType="com.qmth.themis.business.bean.admin.ExamViewCountListBean">
+        <include refid="getTotalCountInfoSql" />
     </select>
 
     <select id="getDoneCountByActivityIds"
@@ -181,10 +189,11 @@
         order by tees.room_code
     </select>
 
-    <select id="getExamDeficiencyPage"
-            resultType="com.qmth.themis.business.bean.admin.ExamDeficiencyListBean">
+    <sql id="getExamDeficiencyPageSql">
         select
-        *
+        *,
+        CONCAT(t.roomName,'(',t.roomCode,')') as roomNameCode,
+        CONCAT(t.courseName,'(',t.courseCode,')') as courseNameCode
         from
         (
         select
@@ -271,6 +280,14 @@
         and toer.first_start_time is null
         and toer1.id is null) t
         order by CAST(t.examActivityCode AS UNSIGNED),CAST(t.roomCode AS UNSIGNED)
+    </sql>
+
+    <select id="getExamDeficiencyPage" resultType="com.qmth.themis.business.bean.admin.ExamDeficiencyListBean">
+        <include refid="getExamDeficiencyPageSql" />
+    </select>
+
+    <select id="getExamDeficiencyPageExport" resultType="com.qmth.themis.business.bean.admin.ExamDeficiencyListBean">
+        <include refid="getExamDeficiencyPageSql" />
     </select>
 
     <select id="getPageForStudentLog"