Przeglądaj źródła

3.3.0 评卷员管理

xiaofei 1 rok temu
rodzic
commit
666abab086
31 zmienionych plików z 577 dodań i 82 usunięć
  1. 6 4
      distributed-print/install/mysql/upgrade/3.3.0.sql
  2. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkClassController.java
  3. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkEntranceController.java
  4. 20 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkGroupController.java
  5. 27 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkPaperController.java
  6. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkSettingController.java
  7. 84 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkUserGroupController.java
  8. 9 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/manage/MarkGroupClassProgressDto.java
  9. 100 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/manage/MarkUserGroupProgressDto.java
  10. 4 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/setting/MarkGroupTaskDto.java
  11. 4 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/setting/MarkUser.java
  12. 9 9
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/MarkPaper.java
  13. 4 4
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/mark/MarkPaperStatus.java
  14. 4 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/MarkPaperService.java
  15. 11 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/MarkPaperServiceImpl.java
  16. 28 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkGroup.java
  17. 15 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkUserGroup.java
  18. 8 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserClassMapper.java
  19. 3 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserGroupMapper.java
  20. 4 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkGroupService.java
  21. 10 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkService.java
  22. 3 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkTaskService.java
  23. 5 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserClassService.java
  24. 11 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserGroupService.java
  25. 40 44
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupServiceImpl.java
  26. 19 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java
  27. 16 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java
  28. 8 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserClassServiceImpl.java
  29. 80 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserGroupServiceImpl.java
  30. 12 0
      teachcloud-mark/src/main/resources/mapper/MarkUserClassMapper.xml
  31. 29 3
      teachcloud-mark/src/main/resources/mapper/MarkUserGroupMapper.xml

+ 6 - 4
distributed-print/install/mysql/upgrade/3.3.0.sql

@@ -52,7 +52,7 @@ INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('924', '结束评卷', 'BatchFinish', 'BUTTON', '917', '5', 'AUTH', '927', '1', '0', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('925', '列表获取', '/api/admin/mark/setting/summary', 'URL', '917', '1', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('926', '导出评卷员工作量', '/api/admin/mark/setting/export_marker', 'URL', '917', '2', 'AUTH', '1', '1', '1');
-INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('927', '结束评卷', '/api/admin/mark/exam/finish', 'URL', '917', '3', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('927', '结束评卷', '/api/admin/mark/paper/finish', 'URL', '917', '3', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('928', '进度列表查询', '/api/admin/mark/group/summary', 'URL', '917', '4', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('929', '评卷员管理列表查询', '/api/admin/mark/marker/list', 'URL', '917', '5', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('930', '重置', '/api/admin/mark/marker/reset', 'URL', '917', '6', 'AUTH', '1', '1', '1');
@@ -69,7 +69,7 @@ INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('941', '仲裁-获取评卷状态', '/api/admin/mark/arbitrate/getStatus', 'URL', '917', '17', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('942', '仲裁-获取配置信息', '/api/admin/mark/arbitrate/getSetting', 'URL', '917', '18', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('943', '仲裁-保存任务', '/api/admin/mark/arbitrate/saveTask', 'URL', '917', '19', 'AUTH', '1', '1', '1');
-INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('944', '查看详情', 'Detail', 'LINK', '917', '6', 'AUTH', '928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('944', '查看详情', 'Detail', 'LINK', '917', '6', 'AUTH', '928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,964,965', '1', '0', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('945', '结束评卷', 'Finish', 'LINK', '917', '7', 'AUTH', '927', '1', '0', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('946', '成绩检查', 'CheckScore', 'MENU', '486', '4', 'AUTH', '1', '0', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('947', '列表', 'List', 'LIST', '946', '1', 'AUTH', '952', '1', '0', '1');
@@ -87,8 +87,10 @@ INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('959', '客观题检查-获取任务', '/api/admin/mark/check/answer/getTask', 'URL', '946', '8', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('960', '客观题检查-保存任务', '/api/admin/mark/check/answer/saveTask', 'URL', '946', '9', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('961', '签到表列表', '/api/admin/mark/package/list', 'URL', '946', '10', 'AUTH', '1', '1', '1');
-INSERT INTO `teachcloud_db_dev`.`sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('962', '评卷区设置', '/api/admin/mark/group/update_picture_config', 'URL', '897', '13', 'AUTH', '1', '1', '1');
-INSERT INTO `teachcloud_db_dev`.`sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('963', '开启/关闭分班阅', '/api/admin/mark/group/update_open_mark_class', 'URL', '897', '14', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('962', '评卷区设置', '/api/admin/mark/group/update_picture_config', 'URL', '897', '13', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('963', '开启/关闭分班阅', '/api/admin/mark/group/update_open_mark_class', 'URL', '897', '14', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('964', '班级阅卷进度', '/api/admin/mark/group/class/summary', 'URL', '917', '20', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('965', '绑定评卷员', '/api/admin/mark/marker/add', '917', '21', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `sequence`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('970', '扫描端', 'scan', 'MENU', '11', '971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005', '1', '0', '0');
 UPDATE `sys_privilege` SET `name` = '打印端', `related` = '200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,973,974,975' WHERE (`id` = '199');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('971', '心跳接口', '/api/scan/server/heartbeat', 'URL', '970', '1', 'AUTH', '1', '1', '1');

+ 1 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkClassController.java

@@ -33,7 +33,7 @@ import java.util.List;
 public class MarkClassController {
 
     @Resource
-    MarkUserClassService markUserClassService;
+    private MarkUserClassService markUserClassService;
 
     /**
      * 查询

+ 1 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkEntranceController.java

@@ -34,7 +34,7 @@ import javax.validation.constraints.Min;
 public class MarkEntranceController {
 
     @Resource
-    MarkUserGroupService markUserGroupService;
+    private MarkUserGroupService markUserGroupService;
 
     /**
      * 评卷入口数据列表

+ 20 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkGroupController.java

@@ -1,8 +1,10 @@
 package com.qmth.distributed.print.api.mark;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupClassProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupSummaryProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkGroupTaskDto;
 import com.qmth.teachcloud.common.bean.params.mark.setting.GroupPictureConfigParams;
@@ -18,6 +20,8 @@ import io.swagger.annotations.*;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.util.List;
 
 /**
@@ -34,7 +38,7 @@ import java.util.List;
 public class MarkGroupController {
 
     @Resource
-    MarkGroupService markGroupService;
+    private MarkGroupService markGroupService;
 
     /**
      * 分组查询
@@ -87,12 +91,25 @@ public class MarkGroupController {
     /**
      * 进度列表查询
      */
-    @ApiOperation(value = "进度列表查询")
+    @ApiOperation(value = "进度列表")
     @RequestMapping(value = "/summary", method = RequestMethod.POST)
     public Result summary(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
-                         @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
+                          @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
         MarkGroupSummaryProgressDto markGroupSummaryProgressDto = markGroupService.summaryGroupProgress(examId, paperNumber);
         return ResultUtil.ok(markGroupSummaryProgressDto);
     }
 
+    /**
+     * 班级阅卷进度列表查询
+     */
+    @ApiOperation(value = "班级阅卷进度列表")
+    @RequestMapping(value = "/class/summary", method = RequestMethod.POST)
+    public Result classSummary(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                               @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+                               @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                               @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        IPage<MarkGroupClassProgressDto> markGroupClassProgressDtoIPage = markGroupService.summaryGroupClassProgress(examId, paperNumber, pageNumber, pageSize);
+        return ResultUtil.ok(markGroupClassProgressDtoIPage);
+    }
+
 }

+ 27 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkPaperController.java

@@ -2,12 +2,25 @@ package com.qmth.distributed.print.api.mark;
 
 
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
+import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
+import com.qmth.teachcloud.common.service.MarkPaperService;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import org.springframework.web.bind.annotation.RequestMapping;
 
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import java.util.List;
+
 /**
  * <p>
  * 考试试卷表 前端控制器
@@ -21,4 +34,18 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_MARK + "/paper")
 public class MarkPaperController {
 
+    @Resource
+    private MarkPaperService markPaperService;
+
+    /**
+     * 结束阅卷
+     */
+    @ApiOperation(value = "结束阅卷")
+    @RequestMapping(value = "/finish", method = RequestMethod.POST)
+    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.EDIT)
+    public Result finish(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                         @ApiParam(value = "试卷编号", required = true) @RequestParam List<String> paperNumbers,
+                         @ApiParam(value = "状态", required = true) @RequestParam MarkPaperStatus status) {
+        return ResultUtil.ok(markPaperService.finishPaper(examId, paperNumbers, status));
+    }
 }

+ 2 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkSettingController.java

@@ -37,10 +37,10 @@ import javax.validation.constraints.Min;
 public class MarkSettingController {
 
     @Resource
-    MarkPaperService markPaperService;
+    private MarkPaperService markPaperService;
 
     @Resource
-    MarkTaskService markTaskService;
+    private MarkTaskService markTaskService;
 
     /**
      * 评卷设置数据列表

+ 84 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkUserGroupController.java

@@ -1,13 +1,26 @@
 package com.qmth.distributed.print.api.mark;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkUserGroupProgressDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.mark.service.MarkUserGroupService;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import org.springframework.web.bind.annotation.RequestMapping;
-
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.util.List;
+
 /**
  * <p>
  * 评卷员 前端控制器
@@ -21,4 +34,74 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_MARK + "/marker")
 public class MarkUserGroupController {
 
+    @Resource
+    private MarkUserGroupService markUserGroupService;
+
+    /**
+     * 评卷员管理列表查询
+     */
+    @ApiOperation(value = "评卷员管理列表查询")
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    public Result classSummary(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                               @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+                               @ApiParam(value = "分组号") @RequestParam(required = false) Integer groupNumber,
+                               @ApiParam(value = "评卷员") @RequestParam(required = false) String loginName,
+                               @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                               @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        IPage<MarkUserGroupProgressDto> markGroupClassProgressDtoIPage = markUserGroupService.pageGroupUserByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber, loginName, pageNumber, pageSize);
+        return ResultUtil.ok(markGroupClassProgressDtoIPage);
+    }
+
+    /**
+     * 绑定评卷员
+     */
+    @ApiOperation(value = "绑定评卷员")
+    @RequestMapping(value = "/add", method = RequestMethod.POST)
+    public Result addMarker(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                            @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+                            @ApiParam(value = "分组号", required = true) @RequestParam Integer groupNumber,
+                            @ApiParam(value = "评卷员ID集合", required = true) @RequestParam List<Long> userIds) {
+        markUserGroupService.addMarkUserGroup(examId, paperNumber, groupNumber, userIds);
+        return ResultUtil.ok(true);
+    }
+
+    /**
+     * 重置评卷员
+     */
+    @ApiOperation(value = "重置评卷员")
+    @RequestMapping(value = "/reset", method = RequestMethod.POST)
+    public Result resetMarker(@ApiParam(value = "考试ID", required = true) @RequestParam Long markUserGroupId) {
+        return ResultUtil.ok();
+    }
+
+    /**
+     * 解绑评卷员
+     */
+    @ApiOperation(value = "解绑评卷员")
+    @RequestMapping(value = "/delete", method = RequestMethod.POST)
+    public Result deleteMarker(@ApiParam(value = "考试ID", required = true) @RequestParam Long markUserGroupId) {
+        markUserGroupService.deleteMarker(markUserGroupId);
+        return ResultUtil.ok(true);
+    }
+
+    /**
+     * 回收评卷员正在评卷的试卷
+     */
+    @ApiOperation(value = "回收正在评卷的试卷")
+    @RequestMapping(value = "/release", method = RequestMethod.POST)
+    public Result releaseMarker(@ApiParam(value = "评卷员ID集合", required = true) @RequestParam List<Long> markUserGroupIds) {
+        return ResultUtil.ok();
+    }
+
+    /**
+     * 设置评卷任务
+     */
+    @ApiOperation(value = "设置评卷任务")
+    @RequestMapping(value = "/setTaskCount", method = RequestMethod.POST)
+    public Result setTaskCount(@ApiParam(value = "评卷员ID集合", required = true) @RequestParam List<Long> markUserGroupIds,
+                               @ApiParam(value = "评卷任务数", required = true) @RequestParam Integer taskCount) {
+        markUserGroupService.setTaskCount(markUserGroupIds, taskCount);
+        return ResultUtil.ok(true);
+    }
+
 }

+ 9 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/manage/MarkGroupClassProgressDto.java

@@ -10,6 +10,7 @@ public class MarkGroupClassProgressDto {
     private Integer currentCount;
     private Double percent;
     private Integer arbitrateCount;
+    private String groupNumbers;
 
     public String getClassName() {
         return className;
@@ -74,4 +75,12 @@ public class MarkGroupClassProgressDto {
     public void setArbitrateCount(Integer arbitrateCount) {
         this.arbitrateCount = arbitrateCount;
     }
+
+    public String getGroupNumbers() {
+        return groupNumbers;
+    }
+
+    public void setGroupNumbers(String groupNumbers) {
+        this.groupNumbers = groupNumbers;
+    }
 }

+ 100 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/manage/MarkUserGroupProgressDto.java

@@ -0,0 +1,100 @@
+package com.qmth.teachcloud.common.bean.dto.mark.manage;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+
+public class MarkUserGroupProgressDto {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long markUserGroupId;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long userId;
+    private String loginName;
+    private String name;
+    private String orgName;
+    private Integer groupNumber;
+    private String groupQuestions;
+    private Integer taskCount;
+    private Integer markedCount;
+    private Integer currentCount;
+
+    public Long getMarkUserGroupId() {
+        return markUserGroupId;
+    }
+
+    public void setMarkUserGroupId(Long markUserGroupId) {
+        this.markUserGroupId = markUserGroupId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getOrgName() {
+        return orgName;
+    }
+
+    public void setOrgName(String orgName) {
+        this.orgName = orgName;
+    }
+
+    public Integer getGroupNumber() {
+        return groupNumber;
+    }
+
+    public void setGroupNumber(Integer groupNumber) {
+        this.groupNumber = groupNumber;
+    }
+
+    public String getGroupQuestions() {
+        return groupQuestions;
+    }
+
+    public void setGroupQuestions(String groupQuestions) {
+        this.groupQuestions = groupQuestions;
+    }
+
+    public Integer getTaskCount() {
+        return taskCount;
+    }
+
+    public void setTaskCount(Integer taskCount) {
+        this.taskCount = taskCount;
+    }
+
+    public Integer getMarkedCount() {
+        return markedCount;
+    }
+
+    public void setMarkedCount(Integer markedCount) {
+        this.markedCount = markedCount;
+    }
+
+    public Integer getCurrentCount() {
+        return currentCount;
+    }
+
+    public void setCurrentCount(Integer currentCount) {
+        this.currentCount = currentCount;
+    }
+}

+ 4 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/setting/MarkGroupTaskDto.java

@@ -1,9 +1,13 @@
 package com.qmth.teachcloud.common.bean.dto.mark.setting;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+
 import java.util.List;
 
 public class MarkGroupTaskDto {
 
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long examId;
     private String paperNumber;
     private List<MarkGroupDto> groups;

+ 4 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/setting/MarkUser.java

@@ -1,7 +1,11 @@
 package com.qmth.teachcloud.common.bean.dto.mark.setting;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+
 public class MarkUser {
 
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long userId;
     private String loginName;
     private String name;

+ 9 - 9
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/MarkPaper.java

@@ -1,13 +1,13 @@
 package com.qmth.teachcloud.common.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
+
 import java.io.Serializable;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import com.qmth.teachcloud.common.enums.mark.MarkStatus;
+import com.qmth.teachcloud.common.enums.mark.MarkMode;
+import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -81,7 +81,7 @@ public class MarkPaper implements Serializable {
     private Boolean autoScroll;
 
     @ApiModelProperty(value = "评卷模式")
-    private String markMode;
+    private MarkMode markMode;
 
     @ApiModelProperty(value = "评卷开始时间")
     private Long markStartTime;
@@ -100,7 +100,7 @@ public class MarkPaper implements Serializable {
     @ApiModelProperty(value = "是否开启分班阅")
     private Boolean openMarkClass;
 
-    private MarkStatus status;
+    private MarkPaperStatus status;
 
     public Long getExamId() {
         return examId;
@@ -236,11 +236,11 @@ public class MarkPaper implements Serializable {
         this.autoScroll = autoScroll;
     }
 
-    public String getMarkMode() {
+    public MarkMode getMarkMode() {
         return markMode;
     }
 
-    public void setMarkMode(String markMode) {
+    public void setMarkMode(MarkMode markMode) {
         this.markMode = markMode;
     }
 
@@ -292,11 +292,11 @@ public class MarkPaper implements Serializable {
         this.openMarkClass = openMarkClass;
     }
 
-    public MarkStatus getStatus() {
+    public MarkPaperStatus getStatus() {
         return status;
     }
 
-    public void setStatus(MarkStatus status) {
+    public void setStatus(MarkPaperStatus status) {
         this.status = status;
     }
 

+ 4 - 4
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/mark/MarkStatus.java → teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/mark/MarkPaperStatus.java

@@ -1,6 +1,6 @@
 package com.qmth.teachcloud.common.enums.mark;
 
-public enum MarkStatus {
+public enum MarkPaperStatus {
 
     FORMAL("正评", 1), FINISH("结束", 2);
 
@@ -8,7 +8,7 @@ public enum MarkStatus {
 
     private int value;
 
-    private MarkStatus(String name, int value) {
+    private MarkPaperStatus(String name, int value) {
         this.name = name;
         this.value = value;
     }
@@ -21,8 +21,8 @@ public enum MarkStatus {
         return value;
     }
 
-    public static MarkStatus findByName(String name) {
-        for (MarkStatus c : MarkStatus.values()) {
+    public static MarkPaperStatus findByName(String name) {
+        for (MarkPaperStatus c : MarkPaperStatus.values()) {
             if (c.toString().equalsIgnoreCase(name)) {
                 return c;
             }

+ 4 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/MarkPaperService.java

@@ -4,6 +4,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkSettingDto;
 import com.qmth.teachcloud.common.entity.MarkPaper;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
+
+import java.util.List;
 
 /**
  * <p>
@@ -21,4 +24,5 @@ public interface MarkPaperService extends IService<MarkPaper> {
 
     void savePaperSetting(MarkPaper markPaper);
 
+    Boolean finishPaper(Long examId, List<String> paperNumbers, MarkPaperStatus status);
 }

+ 11 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/MarkPaperServiceImpl.java

@@ -8,10 +8,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkSettingDto;
 import com.qmth.teachcloud.common.entity.MarkPaper;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.common.mapper.MarkPaperMapper;
 import com.qmth.teachcloud.common.service.MarkPaperService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -66,4 +68,13 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
         this.update(updateWrapper);
     }
 
+    @Override
+    public Boolean finishPaper(Long examId, List<String> paperNumbers, MarkPaperStatus status) {
+        UpdateWrapper<MarkPaper> updateWrapper =  new UpdateWrapper<>();
+        updateWrapper.lambda().set(MarkPaper::getStatus, status)
+                .eq(MarkPaper::getExamId, examId)
+                .in(MarkPaper::getPaperNumber, paperNumbers);
+        return this.update(updateWrapper);
+    }
+
 }

+ 28 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkGroup.java

@@ -72,12 +72,29 @@ public class MarkGroup implements Serializable {
     @ApiModelProperty(value = "剩余数量")
     private Integer leftCount;
 
+    /**
+     * 大题号集合(逗号分隔)
+     */
     @TableField(exist = false)
     private String mainNumber;
+    /**
+     * 大题名称集合(逗号分隔)
+     */
     @TableField(exist = false)
     private String title;
+    /**
+     * 大题名称+小题号集合(逗号分隔)
+     */
     @TableField(exist = false)
     private String questionTitle;
+    /**
+     * 大题号+小题号集合(逗号分隔)
+     */
+    @TableField(exist = false)
+    private String groupQuestions;
+    /**
+     * 主观题小题满分集合(逗号分隔)
+     */
     @TableField(exist = false)
     private String scoreList;
 
@@ -202,6 +219,14 @@ public class MarkGroup implements Serializable {
         this.questionTitle = questionTitle;
     }
 
+    public String getGroupQuestions() {
+        return groupQuestions;
+    }
+
+    public void setGroupQuestions(String groupQuestions) {
+        this.groupQuestions = groupQuestions;
+    }
+
     public String getScoreList() {
         return scoreList;
     }
@@ -215,6 +240,7 @@ public class MarkGroup implements Serializable {
         Set<Integer> mainNumbers = new LinkedHashSet<>();
         Set<String> mainTitles = new LinkedHashSet<>();
         Set<String> questionTitles = new LinkedHashSet<>();
+        Set<String> groupQuestions = new LinkedHashSet<>();
         StringBuilder score = new StringBuilder();
         for (MarkQuestion question : questionList) {
             if (score.length() > 0) {
@@ -224,10 +250,12 @@ public class MarkGroup implements Serializable {
             mainNumbers.add(question.getMainNumber());
             mainTitles.add(question.getMainTitle());
             questionTitles.add(question.getMainTitle() + '-' + question.getSubNumber());
+            groupQuestions.add(String.valueOf(question.getMainNumber() + '-' + question.getSubNumber()));
         }
         this.mainNumber = StringUtils.join(mainNumbers, ",");
         this.title = StringUtils.join(mainTitles, ",");
         this.questionTitle = StringUtils.join(questionTitles, ",");
+        this.groupQuestions = StringUtils.join(groupQuestions, ",");
         this.scoreList = score.toString();
     }
 

+ 15 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkUserGroup.java

@@ -7,6 +7,7 @@ import java.io.Serializable;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.enums.mark.MarkMode;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -44,7 +45,7 @@ public class MarkUserGroup implements Serializable {
     private Long userId;
 
     @ApiModelProperty(value = "强制评卷模式")
-    private String mode;
+    private MarkMode mode;
 
     @ApiModelProperty(value = "评卷数上限")
     private Integer topCount;
@@ -61,6 +62,17 @@ public class MarkUserGroup implements Serializable {
     @ApiModelProperty(value = "标准差")
     private Double stdevScore;
 
+    public MarkUserGroup() {
+    }
+
+    public MarkUserGroup(Long examId, String paperNumber, Integer groupNumber, Long userId, MarkMode mode) {
+        this.examId = examId;
+        this.paperNumber = paperNumber;
+        this.groupNumber = groupNumber;
+        this.userId = userId;
+        this.mode = mode;
+    }
+
     public Long getId() {
         return id;
     }
@@ -96,11 +108,11 @@ public class MarkUserGroup implements Serializable {
     public void setUserId(Long userId) {
         this.userId = userId;
     }
-    public String getMode() {
+    public MarkMode getMode() {
         return mode;
     }
 
-    public void setMode(String mode) {
+    public void setMode(MarkMode mode) {
         this.mode = mode;
     }
     public Integer getTopCount() {

+ 8 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserClassMapper.java

@@ -1,8 +1,12 @@
 package com.qmth.teachcloud.mark.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupClassProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkUser;
 import com.qmth.teachcloud.mark.entity.MarkUserClass;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -16,5 +20,7 @@ import java.util.List;
  */
 public interface MarkUserClassMapper extends BaseMapper<MarkUserClass> {
 
-    List<MarkUser> listClassMarkerByExamIdAndPaperNumberAndGroupNumberAndClassName(Long examId, String paperNumber, Integer groupNumber, String className);
+    List<MarkUser> listClassMarkerByExamIdAndPaperNumberAndGroupNumberAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("className") String className);
+
+    IPage<MarkGroupClassProgressDto> pageClassByExamIdAndPaperNumber(@Param("page") Page<MarkGroupClassProgressDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber);
 }

+ 3 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkUserGroupMapper.java

@@ -3,6 +3,7 @@ package com.qmth.teachcloud.mark.mapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.teachcloud.common.bean.dto.mark.entrance.MarkEntranceDto;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkUserGroupProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkUser;
 import com.qmth.teachcloud.mark.entity.MarkUserGroup;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -23,4 +24,6 @@ public interface MarkUserGroupMapper extends BaseMapper<MarkUserGroup> {
     IPage<MarkEntranceDto> listEntranceGroup(@Param("page") Page<MarkUserGroup> page, @Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber, @Param("userId") Long userId);
 
     List<MarkUser> listGroupUserByExamIdAndPaperNumberAndGroupNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber);
+
+    IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndGroupNumber(@Param("page") Page<MarkUserGroupProgressDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber, @Param("loginName") String loginName);
 }

+ 4 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkGroupService.java

@@ -1,6 +1,8 @@
 package com.qmth.teachcloud.mark.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupClassProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupSummaryProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkGroupTaskDto;
 import com.qmth.teachcloud.common.bean.params.mark.setting.GroupPictureConfigParams;
@@ -30,4 +32,6 @@ public interface MarkGroupService extends IService<MarkGroup> {
     MarkGroup getByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 
     MarkGroupSummaryProgressDto summaryGroupProgress(Long examId, String paperNumber);
+
+    IPage<MarkGroupClassProgressDto> summaryGroupClassProgress(Long examId, String paperNumber, Integer pageNumber, Integer pageSize);
 }

+ 10 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkService.java

@@ -0,0 +1,10 @@
+package com.qmth.teachcloud.mark.service;
+
+/**
+ * <p>
+ * 评卷相关 服务类
+ */
+public interface MarkService {
+
+    Integer applyCurrentCount();
+}

+ 3 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkTaskService.java

@@ -22,11 +22,13 @@ public interface MarkTaskService extends IService<MarkTask> {
 
     void exportMarker(Long examId, String courseCode, String paperNumber, HttpServletResponse response);
 
-    List<MarkTask> listByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+    List<MarkTask> listByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber, Long userId);
 
     Integer markedCount(List<MarkTask> groupNumberMarkTask);
 
     Integer waitArbitrateCount(List<MarkTask> groupNumberMarkTask);
 
     Double calcPercent(Integer markedCount, Integer taskCount);
+
+    int countByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber, Long userId);
 }

+ 5 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserClassService.java

@@ -1,5 +1,8 @@
 package com.qmth.teachcloud.mark.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupClassProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkUser;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkUserClassDto;
 import com.qmth.teachcloud.common.bean.params.mark.setting.MarkClassUserParams;
@@ -29,4 +32,6 @@ public interface MarkUserClassService extends IService<MarkUserClass> {
     boolean deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 
     List<MarkUserClass> listByExamIdAndPaperNumber(Long examId, String paperNumber);
+
+    IPage<MarkGroupClassProgressDto> pageClassByExamIdAndPaperNumber(Page<MarkGroupClassProgressDto> page, Long examId, String paperNumber);
 }

+ 11 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserGroupService.java

@@ -2,6 +2,7 @@ package com.qmth.teachcloud.mark.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.teachcloud.common.bean.dto.mark.entrance.MarkEntranceDto;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkUserGroupProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkUser;
 import com.qmth.teachcloud.mark.entity.MarkUserGroup;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -21,4 +22,14 @@ public interface MarkUserGroupService extends IService<MarkUserGroup> {
     IPage<MarkEntranceDto> listEntranceGroup(Long examId, String courseCode, String paperNumber, Integer pageNumber, Integer pageSize);
 
     List<MarkUser> listGroupUserByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer number);
+
+    IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber, String loginName, Integer pageNumber, Integer pageSize);
+
+    void addMarkUserGroup(Long examId, String paperNumber, Integer groupNumber, List<Long> userIds);
+
+    void setTaskCount(List<Long> markUserGroupIds, Integer taskCount);
+
+    MarkUserGroup getByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber, Long userId);
+
+    void deleteMarker(Long markUserGroupId);
 }

+ 40 - 44
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupServiceImpl.java

@@ -3,6 +3,8 @@ package com.qmth.teachcloud.mark.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupClassProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupProgressDto;
@@ -19,12 +21,8 @@ import com.qmth.teachcloud.common.service.MarkPaperService;
 import com.qmth.teachcloud.common.service.MarkQuestionService;
 import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkTask;
-import com.qmth.teachcloud.mark.entity.MarkUserClass;
 import com.qmth.teachcloud.mark.mapper.MarkGroupMapper;
-import com.qmth.teachcloud.mark.service.MarkGroupService;
-import com.qmth.teachcloud.mark.service.MarkTaskService;
-import com.qmth.teachcloud.mark.service.MarkUserClassService;
-import com.qmth.teachcloud.mark.service.MarkUserGroupService;
+import com.qmth.teachcloud.mark.service.*;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
@@ -33,7 +31,6 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -48,19 +45,21 @@ import java.util.stream.Collectors;
 public class MarkGroupServiceImpl extends ServiceImpl<MarkGroupMapper, MarkGroup> implements MarkGroupService {
 
     @Resource
-    MarkQuestionService markQuestionService;
+    private MarkQuestionService markQuestionService;
 
     @Resource
-    MarkPaperService markPaperService;
+    private MarkPaperService markPaperService;
 
     @Resource
-    MarkUserGroupService markUserGroupService;
+    private MarkUserGroupService markUserGroupService;
 
     @Resource
-    MarkUserClassService markUserClassService;
+    private MarkUserClassService markUserClassService;
 
     @Resource
-    MarkTaskService markTaskService;
+    private MarkTaskService markTaskService;
+    @Resource
+    private MarkService markService;
 
     @Override
     public MarkGroupTaskDto listGroupTaskByExamIdAndPaperNumber(Long examId, String paperNumber) {
@@ -139,7 +138,7 @@ public class MarkGroupServiceImpl extends ServiceImpl<MarkGroupMapper, MarkGroup
         markPaperService.update(updateWrapper);
 
         // 禁用,删除分班数据
-        if (!openMarkClass.booleanValue()) {
+        if (openMarkClass != null && !openMarkClass) {
             markUserClassService.deleteByExamIdAndPaperNumber(examId, paperNumber);
         }
     }
@@ -164,41 +163,12 @@ public class MarkGroupServiceImpl extends ServiceImpl<MarkGroupMapper, MarkGroup
         markGroupTotalProgressDto.setUploadCount(markPaper.getUploadCount());
         markGroupTotalProgressDto.setAbsentCount(markPaper.getAbsentCount());
 
-        List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, null);
+        List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, null, null);
         int taskCount = markTaskList.size();
         int totalMarkedCount = markTaskService.markedCount(markTaskList);
         markGroupTotalProgressDto.setPercent(markTaskService.calcPercent(totalMarkedCount, taskCount));
         markGroupSummaryProgressDto.setTotalInfo(markGroupTotalProgressDto);
 
-        // classInfo
-        if (markPaper.getOpenMarkClass()) {
-            List<MarkGroupClassProgressDto> markGroupClassProgressDtoList = new ArrayList<>();
-            List<MarkUserClass> markUserClassList = markUserClassService.listByExamIdAndPaperNumber(examId, paperNumber);
-            if (CollectionUtils.isNotEmpty(markUserClassList)) {
-                Map<String, List<MarkUserClass>> listMap = markUserClassList.stream().collect(Collectors.groupingBy(m -> m.getClassName()));
-                for (Map.Entry<String, List<MarkUserClass>> entry : listMap.entrySet()) {
-                    MarkGroupClassProgressDto markGroupClassProgressDto = new MarkGroupClassProgressDto();
-                    List<MarkTask> totalMarkTaskList = new ArrayList<>();
-                    List<MarkUser> totalMarkUserList = new ArrayList<>();
-                    for (MarkUserClass markUserClass : entry.getValue()) {
-                        totalMarkTaskList.addAll(markTaskService.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markUserClass.getGroupNumber()));
-                        totalMarkUserList.addAll(markUserGroupService.listGroupUserByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markUserClass.getGroupNumber()));
-                    }
-                    markGroupClassProgressDto.setClassName(entry.getKey());
-                    markGroupClassProgressDto.setMarkerCount(totalMarkUserList.size());
-                    markGroupClassProgressDto.setTaskCount(totalMarkTaskList.size());
-                    markGroupClassProgressDto.setMarkedCount(markTaskService.markedCount(totalMarkTaskList));
-                    markGroupClassProgressDto.setLeftCount(markGroupClassProgressDto.getTaskCount() - markGroupClassProgressDto.getMarkedCount());
-                    // todo 正在评卷数
-//                    markGroupClassProgressDto.setCurrentCount();
-                    markGroupClassProgressDto.setPercent(markTaskService.calcPercent(markGroupClassProgressDto.getMarkedCount(), markGroupClassProgressDto.getTaskCount()));
-                    markGroupClassProgressDto.setArbitrateCount(markTaskService.waitArbitrateCount(totalMarkTaskList));
-                    markGroupClassProgressDtoList.add(markGroupClassProgressDto);
-                }
-            }
-            markGroupSummaryProgressDto.setClassInfo(markGroupClassProgressDtoList);
-        }
-
         // groupInfo
         List<MarkGroupProgressDto> markGroupProgressDtoList = new ArrayList<>();
         List<MarkGroup> markGroupList = this.listGroupByExamIdAndPaperNumber(examId, paperNumber);
@@ -214,8 +184,7 @@ public class MarkGroupServiceImpl extends ServiceImpl<MarkGroupMapper, MarkGroup
             markGroupProgressDto.setTaskCount(groupNumberMarkTask.size());
             markGroupProgressDto.setMarkedCount(markTaskService.markedCount(groupNumberMarkTask));
             markGroupProgressDto.setLeftCount(markGroupProgressDto.getTaskCount() - markGroupProgressDto.getMarkedCount());
-            // todo 正在评卷数
-//            markGroupProgressDto.setCurrentCount();
+            markGroupProgressDto.setCurrentCount(markService.applyCurrentCount());
             markGroupProgressDto.setPercent(markTaskService.calcPercent(markGroupProgressDto.getMarkedCount(), markGroupProgressDto.getTaskCount()));
             markGroupProgressDto.setArbitrateCount(markTaskService.waitArbitrateCount(groupNumberMarkTask));
             markGroupProgressDtoList.add(markGroupProgressDto);
@@ -223,4 +192,31 @@ public class MarkGroupServiceImpl extends ServiceImpl<MarkGroupMapper, MarkGroup
         markGroupSummaryProgressDto.setGroupInfo(markGroupProgressDtoList);
         return markGroupSummaryProgressDto;
     }
+
+    @Override
+    public IPage<MarkGroupClassProgressDto> summaryGroupClassProgress(Long examId, String paperNumber, Integer pageNumber, Integer pageSize) {
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+        if (markPaper.getOpenMarkClass()) {
+            Page<MarkGroupClassProgressDto> page = new Page<>(pageNumber, pageSize);
+            IPage<MarkGroupClassProgressDto> markGroupClassProgressDtoIPage = markUserClassService.pageClassByExamIdAndPaperNumber(page, examId, paperNumber);
+            for (MarkGroupClassProgressDto markGroupClassProgressDto : markGroupClassProgressDtoIPage.getRecords()) {
+                List<MarkTask> totalMarkTaskList = new ArrayList<>();
+                List<MarkUser> totalMarkUserList = new ArrayList<>();
+                for (String s : markGroupClassProgressDto.getGroupNumbers().split(",")) {
+                    Integer groupNumber = Integer.parseInt(s);
+                    totalMarkTaskList.addAll(markTaskService.listByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, groupNumber, null));
+                    totalMarkUserList.addAll(markUserGroupService.listGroupUserByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber));
+                }
+                markGroupClassProgressDto.setMarkerCount(totalMarkUserList.size());
+                markGroupClassProgressDto.setTaskCount(totalMarkTaskList.size());
+                markGroupClassProgressDto.setMarkedCount(markTaskService.markedCount(totalMarkTaskList));
+                markGroupClassProgressDto.setLeftCount(markGroupClassProgressDto.getTaskCount() - markGroupClassProgressDto.getMarkedCount());
+                markGroupClassProgressDto.setCurrentCount(markService.applyCurrentCount());
+                markGroupClassProgressDto.setPercent(markTaskService.calcPercent(markGroupClassProgressDto.getMarkedCount(), markGroupClassProgressDto.getTaskCount()));
+                markGroupClassProgressDto.setArbitrateCount(markTaskService.waitArbitrateCount(totalMarkTaskList));
+            }
+            return markGroupClassProgressDtoIPage;
+        }
+        return null;
+    }
 }

+ 19 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -0,0 +1,19 @@
+package com.qmth.teachcloud.mark.service.impl;
+
+import com.qmth.teachcloud.mark.service.MarkService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class MarkServiceImpl implements MarkService {
+
+    /**
+     * 某个评卷分组已申请的评卷任务数量
+     *
+     * @return
+     */
+    @Override
+    public Integer applyCurrentCount() {
+        // todo 正在评卷数量查询 (评卷员和评卷分组分开2个方法)
+        return null;
+    }
+}

+ 16 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java

@@ -35,10 +35,10 @@ import java.util.List;
 public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> implements MarkTaskService {
 
     @Resource
-    MarkGroupService markGroupService;
+    private MarkGroupService markGroupService;
 
     @Resource
-    MarkQuestionService markQuestionService;
+    private MarkQuestionService markQuestionService;
 
     @Override
     public IPage<MarkManageDto> listPaperManage(Long examId, String courseCode, String paperNumber, Boolean progressStatus, Integer pageNumber, Integer pageSize) {
@@ -63,13 +63,16 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public List<MarkTask> listByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+    public List<MarkTask> listByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber, Long userId) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkTask::getExamId, examId)
                 .eq(MarkTask::getPaperNumber, paperNumber);
         if (groupNumber != null) {
             queryWrapper.lambda().eq(MarkTask::getGroupNumber, groupNumber);
         }
+        if (userId != null) {
+            queryWrapper.lambda().eq(MarkTask::getUserId, userId);
+        }
         return this.list(queryWrapper);
     }
 
@@ -96,4 +99,14 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
         String percent = taskCount > 0 ? new DecimalFormat("####.###").format(markedCount * 100.0 / taskCount) : "0";
         return Double.parseDouble(percent);
     }
+
+    @Override
+    public int countByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber, Long userId) {
+        QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkTask::getExamId, examId)
+                .eq(MarkTask::getPaperNumber, paperNumber)
+                .eq(MarkTask::getGroupNumber, groupNumber)
+                .eq(MarkTask::getUserId, userId);
+        return this.count(queryWrapper);
+    }
 }

+ 8 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserClassServiceImpl.java

@@ -2,7 +2,10 @@ package com.qmth.teachcloud.mark.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupClassProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkGroupDto;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkUser;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkUserClassDto;
@@ -127,4 +130,9 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
                 .eq(MarkUserClass::getPaperNumber, paperNumber);
         return this.list(queryWrapper);
     }
+
+    @Override
+    public IPage<MarkGroupClassProgressDto> pageClassByExamIdAndPaperNumber(Page<MarkGroupClassProgressDto> page, Long examId, String paperNumber) {
+        return this.baseMapper.pageClassByExamIdAndPaperNumber(page, examId, paperNumber);
+    }
 }

+ 80 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserGroupServiceImpl.java

@@ -1,22 +1,31 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.common.bean.dto.mark.entrance.MarkEntranceDto;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkUserGroupProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkUser;
+import com.qmth.teachcloud.common.entity.MarkPaper;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.service.MarkPaperService;
 import com.qmth.teachcloud.common.service.MarkQuestionService;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.mark.entity.MarkTask;
 import com.qmth.teachcloud.mark.entity.MarkUserGroup;
 import com.qmth.teachcloud.mark.mapper.MarkUserGroupMapper;
+import com.qmth.teachcloud.mark.service.MarkService;
+import com.qmth.teachcloud.mark.service.MarkTaskService;
 import com.qmth.teachcloud.mark.service.MarkUserGroupService;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
@@ -32,7 +41,13 @@ import java.util.Objects;
 public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, MarkUserGroup> implements MarkUserGroupService {
 
     @Resource
-    MarkQuestionService markQuestionService;
+    private MarkQuestionService markQuestionService;
+    @Resource
+    private MarkTaskService markTaskService;
+    @Resource
+    private MarkPaperService markPaperService;
+    @Resource
+    private MarkService markService;
 
     @Override
     public IPage<MarkEntranceDto> listEntranceGroup(Long examId, String courseCode, String paperNumber, Integer pageNumber, Integer pageSize) {
@@ -61,4 +76,68 @@ public class MarkUserGroupServiceImpl extends ServiceImpl<MarkUserGroupMapper, M
     public List<MarkUser> listGroupUserByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
         return this.baseMapper.listGroupUserByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, groupNumber);
     }
+
+    @Override
+    public IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber, String loginName, Integer pageNumber, Integer pageSize) {
+        Page<MarkUserGroupProgressDto> page = new Page<>(pageNumber, pageSize);
+        IPage<MarkUserGroupProgressDto> markUserGroupProgressDtoIPage = this.baseMapper.pageGroupUserByExamIdAndPaperNumberAndGroupNumber(page, examId, paperNumber, groupNumber, loginName);
+        for (MarkUserGroupProgressDto record : markUserGroupProgressDtoIPage.getRecords()) {
+            record.setGroupQuestions(markQuestionService.assembleGroupQuestionsByExamIdAndPaperNumberAndNumber(examId, paperNumber, record.getGroupNumber()));
+            List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, record.getGroupNumber(), record.getUserId());
+            record.setTaskCount(markTaskList.size());
+            record.setMarkedCount(markTaskService.markedCount(markTaskList));
+            record.setCurrentCount(markService.applyCurrentCount());
+        }
+        return markUserGroupProgressDtoIPage;
+    }
+
+    @Override
+    public void addMarkUserGroup(Long examId, String paperNumber, Integer groupNumber, List<Long> userIds) {
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+        if (CollectionUtils.isNotEmpty(userIds)) {
+            List<MarkUserGroup> markUserGroups = new ArrayList<>();
+            for (Long userId : userIds) {
+                MarkUserGroup markUserGroup = this.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId, paperNumber, groupNumber, userId);
+                if (markUserGroup != null) {
+                    markUserGroups.add(new MarkUserGroup(examId, paperNumber, groupNumber, userId, markPaper.getMarkMode()));
+                }
+            }
+            this.saveBatch(markUserGroups);
+        }
+    }
+
+    @Override
+    public void setTaskCount(List<Long> markUserGroupIds, Integer taskCount) {
+        for (Long markUserGroupId : markUserGroupIds) {
+            MarkUserGroup markUserGroup = this.getById(markUserGroupId);
+            if (markUserGroup != null) {
+                markUserGroup.setTopCount(taskCount);
+                this.updateById(markUserGroup);
+            }
+        }
+    }
+
+    @Override
+    public MarkUserGroup getByExamIdAndPaperNumberAndGroupNumberAndUserId(Long examId, String paperNumber, Integer groupNumber, Long userId) {
+        QueryWrapper<MarkUserGroup> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkUserGroup::getExamId, examId)
+                .eq(MarkUserGroup::getPaperNumber, paperNumber)
+                .eq(MarkUserGroup::getGroupNumber, groupNumber)
+                .eq(MarkUserGroup::getUserId, userId);
+        return this.getOne(queryWrapper);
+    }
+
+    @Override
+    public void deleteMarker(Long markUserGroupId) {
+        MarkUserGroup markUserGroup = this.getById(markUserGroupId);
+        if (markUserGroup != null) {
+            throw ExceptionResultEnum.ERROR.exception("评卷员不存在");
+        }
+        int count = markTaskService.countByExamIdAndPaperNumberAndGroupNumberAndUserId(markUserGroup.getExamId(), markUserGroup.getPaperNumber(), markUserGroup.getGroupNumber(), markUserGroup.getUserId());
+        if (count > 0) {
+            throw ExceptionResultEnum.ERROR.exception("删除评卷员失败,该评卷员已开始评卷");
+        } else {
+            this.removeById(markUserGroupId);
+        }
+    }
 }

+ 12 - 0
teachcloud-mark/src/main/resources/mapper/MarkUserClassMapper.xml

@@ -30,5 +30,17 @@
           AND muc.group_number = #{groupNumber}
           AND muc.class_name = #{className}
     </select>
+    <select id="pageClassByExamIdAndPaperNumber"
+            resultType="com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupClassProgressDto">
+        SELECT
+            class_name className,
+            GROUP_CONCAT(group_number) groupNumbers
+        FROM
+            mark_user_class
+        WHERE
+            exam_id = #{examId}
+          AND paper_number = #{paperNumber}
+        GROUP BY class_name
+    </select>
 
 </mapper>

+ 29 - 3
teachcloud-mark/src/main/resources/mapper/MarkUserGroupMapper.xml

@@ -56,10 +56,36 @@
             sys_user su ON mug.user_id = su.id
                 LEFT JOIN
             sys_org so ON su.org_id = so.id
-        WHERE
+        where
             mug.exam_id = #{examId}
-          AND mug.paper_number = #{paperNumber}
-          AND mug.group_number = #{groupNumber}
+            AND mug.paper_number = #{paperNumber}
+            AND mug.group_number = #{groupNumber}
+    </select>
+    <select id="pageGroupUserByExamIdAndPaperNumberAndGroupNumber"
+            resultType="com.qmth.teachcloud.common.bean.dto.mark.manage.MarkUserGroupProgressDto">
+        SELECT
+            mug.id markUserGroupId,
+            mug.group_number groupNumber,
+            su.id userId,
+            su.login_name loginName,
+            su.real_name name,
+            so.name orgName
+        FROM
+            mark_user_group mug
+                LEFT JOIN
+            sys_user su ON mug.user_id = su.id
+                LEFT JOIN
+            sys_org so ON su.org_id = so.id
+        <where>
+            mug.exam_id = #{examId}
+            AND mug.paper_number = #{paperNumber}
+            <if test="groupNumber != null and groupNumber != ''">
+                AND mug.group_number = #{groupNumber}
+            </if>
+            <if test="loginName != null and loginName != ''">
+                AND su.login_name like concat('%',#{loginName},'%')
+            </if>
+        </where>
     </select>
 
 </mapper>