Răsfoiți Sursa

3.3.0 评卷进度

xiaofei 1 an în urmă
părinte
comite
5e79599d83
32 a modificat fișierele cu 1011 adăugiri și 28 ștergeri
  1. 1 1
      distributed-print/install/mysql/upgrade/3.3.0.sql
  2. 12 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkGroupController.java
  3. 34 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkSettingController.java
  4. 77 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/manage/MarkGroupClassProgressDto.java
  5. 95 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/manage/MarkGroupProgressDto.java
  6. 34 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/manage/MarkGroupSummaryProgressDto.java
  7. 41 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/manage/MarkGroupTotalProgressDto.java
  8. 57 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/manage/MarkManageDto.java
  9. 127 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/manage/MarkerInfoDto.java
  10. 0 9
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/setting/MarkSettingDto.java
  11. 38 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/MarkPaper.java
  12. 32 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/mark/MarkStatus.java
  13. 2 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/MarkPaperMapper.java
  14. 2 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/MarkQuestionMapper.java
  15. 1 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/MarkPaperService.java
  16. 2 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/MarkQuestionService.java
  17. 1 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/MarkPaperServiceImpl.java
  18. 7 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/MarkQuestionServiceImpl.java
  19. 2 1
      teachcloud-common/src/main/resources/mapper/MarkPaperMapper.xml
  20. 10 0
      teachcloud-common/src/main/resources/mapper/MarkQuestionMapper.xml
  21. 77 6
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkGroup.java
  22. 27 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkTask.java
  23. 48 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/MarkTaskStatus.java
  24. 10 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkTaskMapper.java
  25. 5 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkGroupService.java
  26. 16 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkTaskService.java
  27. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkUserClassService.java
  28. 99 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupServiceImpl.java
  29. 80 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java
  30. 9 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserClassServiceImpl.java
  31. 1 1
      teachcloud-mark/src/main/resources/mapper/MarkGroupMapper.xml
  32. 62 0
      teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml

+ 1 - 1
distributed-print/install/mysql/upgrade/3.3.0.sql

@@ -51,7 +51,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 ('923', '导出评卷工作量', 'Export', 'BUTTON', '917', '4', 'AUTH', '926', '1', '0', '1');
 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/exportMarker', '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 ('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 ('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');

+ 12 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkGroupController.java

@@ -3,6 +3,7 @@ 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.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;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -83,4 +84,15 @@ public class MarkGroupController {
         return ResultUtil.ok(true);
     }
 
+    /**
+     * 进度列表查询
+     */
+    @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) {
+        MarkGroupSummaryProgressDto markGroupSummaryProgressDto = markGroupService.summaryGroupProgress(examId, paperNumber);
+        return ResultUtil.ok(markGroupSummaryProgressDto);
+    }
+
 }

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

@@ -4,7 +4,7 @@ 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.entrance.MarkEntranceDto;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkManageDto;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkSettingDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.MarkPaper;
@@ -12,12 +12,14 @@ import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
 import com.qmth.teachcloud.common.service.MarkPaperService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.mark.service.MarkTaskService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 
@@ -37,8 +39,11 @@ public class MarkSettingController {
     @Resource
     MarkPaperService markPaperService;
 
+    @Resource
+    MarkTaskService markTaskService;
+
     /**
-     * 评卷入口数据列表
+     * 评卷设置数据列表
      */
     @ApiOperation(value = "查询")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
@@ -72,4 +77,31 @@ public class MarkSettingController {
         markPaperService.savePaperSetting(markPaper);
         return ResultUtil.ok(true);
     }
+
+    /**
+     * 评卷管理数据列表
+     */
+    @ApiOperation(value = "查询")
+    @RequestMapping(value = "/summary", method = RequestMethod.POST)
+    public Result summary(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                          @ApiParam(value = "课程代码") @RequestParam(required = false) String courseCode,
+                          @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
+                          @ApiParam(value = "完成进度") @RequestParam(required = false) Boolean progressStatus,
+                          @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                          @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        IPage<MarkManageDto> markManageDtoIPage = markTaskService.listPaperManage(examId, courseCode, paperNumber, progressStatus, pageNumber, pageSize);
+        return ResultUtil.ok(markManageDtoIPage);
+    }
+
+    /**
+     * 导出评卷员工作量
+     */
+    @ApiOperation(value = "查询")
+    @RequestMapping(value = "/export_marker", method = RequestMethod.POST)
+    public void exportMarker(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                             @ApiParam(value = "课程代码") @RequestParam(required = false) String courseCode,
+                             @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
+                             HttpServletResponse response) {
+        markTaskService.exportMarker(examId, courseCode, paperNumber, response);
+    }
 }

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

@@ -0,0 +1,77 @@
+package com.qmth.teachcloud.common.bean.dto.mark.manage;
+
+public class MarkGroupClassProgressDto {
+
+    private String className;
+    private Integer markerCount;
+    private Integer taskCount;
+    private Integer markedCount;
+    private Integer leftCount;
+    private Integer currentCount;
+    private Double percent;
+    private Integer arbitrateCount;
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public Integer getMarkerCount() {
+        return markerCount;
+    }
+
+    public void setMarkerCount(Integer markerCount) {
+        this.markerCount = markerCount;
+    }
+
+    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 getLeftCount() {
+        return leftCount;
+    }
+
+    public void setLeftCount(Integer leftCount) {
+        this.leftCount = leftCount;
+    }
+
+    public Integer getCurrentCount() {
+        return currentCount;
+    }
+
+    public void setCurrentCount(Integer currentCount) {
+        this.currentCount = currentCount;
+    }
+
+    public Double getPercent() {
+        return percent;
+    }
+
+    public void setPercent(Double percent) {
+        this.percent = percent;
+    }
+
+    public Integer getArbitrateCount() {
+        return arbitrateCount;
+    }
+
+    public void setArbitrateCount(Integer arbitrateCount) {
+        this.arbitrateCount = arbitrateCount;
+    }
+}

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

@@ -0,0 +1,95 @@
+package com.qmth.teachcloud.common.bean.dto.mark.manage;
+
+public class MarkGroupProgressDto {
+
+    private Integer groupNumber;
+    private String scoreList;
+    private Integer markerCount;
+    private Integer taskCount;
+    private Integer markedCount;
+    private Integer leftCount;
+    private Integer currentCount;
+    private Double percent;
+    private Integer arbitrateCount;
+    private String groupQuestions;
+
+    public Integer getGroupNumber() {
+        return groupNumber;
+    }
+
+    public void setGroupNumber(Integer groupNumber) {
+        this.groupNumber = groupNumber;
+    }
+
+    public String getScoreList() {
+        return scoreList;
+    }
+
+    public void setScoreList(String scoreList) {
+        this.scoreList = scoreList;
+    }
+
+    public Integer getMarkerCount() {
+        return markerCount;
+    }
+
+    public void setMarkerCount(Integer markerCount) {
+        this.markerCount = markerCount;
+    }
+
+    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 getLeftCount() {
+        return leftCount;
+    }
+
+    public void setLeftCount(Integer leftCount) {
+        this.leftCount = leftCount;
+    }
+
+    public Integer getCurrentCount() {
+        return currentCount;
+    }
+
+    public void setCurrentCount(Integer currentCount) {
+        this.currentCount = currentCount;
+    }
+
+    public Double getPercent() {
+        return percent;
+    }
+
+    public void setPercent(Double percent) {
+        this.percent = percent;
+    }
+
+    public Integer getArbitrateCount() {
+        return arbitrateCount;
+    }
+
+    public void setArbitrateCount(Integer arbitrateCount) {
+        this.arbitrateCount = arbitrateCount;
+    }
+
+    public String getGroupQuestions() {
+        return groupQuestions;
+    }
+
+    public void setGroupQuestions(String groupQuestions) {
+        this.groupQuestions = groupQuestions;
+    }
+}

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

@@ -0,0 +1,34 @@
+package com.qmth.teachcloud.common.bean.dto.mark.manage;
+
+import java.util.List;
+
+public class MarkGroupSummaryProgressDto {
+
+    private MarkGroupTotalProgressDto totalInfo;
+    private List<MarkGroupClassProgressDto> classInfo;
+    private List<MarkGroupProgressDto> groupInfo;
+
+    public MarkGroupTotalProgressDto getTotalInfo() {
+        return totalInfo;
+    }
+
+    public void setTotalInfo(MarkGroupTotalProgressDto totalInfo) {
+        this.totalInfo = totalInfo;
+    }
+
+    public List<MarkGroupClassProgressDto> getClassInfo() {
+        return classInfo;
+    }
+
+    public void setClassInfo(List<MarkGroupClassProgressDto> classInfo) {
+        this.classInfo = classInfo;
+    }
+
+    public List<MarkGroupProgressDto> getGroupInfo() {
+        return groupInfo;
+    }
+
+    public void setGroupInfo(List<MarkGroupProgressDto> groupInfo) {
+        this.groupInfo = groupInfo;
+    }
+}

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

@@ -0,0 +1,41 @@
+package com.qmth.teachcloud.common.bean.dto.mark.manage;
+
+public class MarkGroupTotalProgressDto {
+
+    private Integer studentCount;
+    private Integer uploadCount;
+    private Integer absentCount;
+    private Double percent;
+
+    public Integer getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(Integer studentCount) {
+        this.studentCount = studentCount;
+    }
+
+    public Integer getUploadCount() {
+        return uploadCount;
+    }
+
+    public void setUploadCount(Integer uploadCount) {
+        this.uploadCount = uploadCount;
+    }
+
+    public Integer getAbsentCount() {
+        return absentCount;
+    }
+
+    public void setAbsentCount(Integer absentCount) {
+        this.absentCount = absentCount;
+    }
+
+    public Double getPercent() {
+        return percent;
+    }
+
+    public void setPercent(Double percent) {
+        this.percent = percent;
+    }
+}

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

@@ -0,0 +1,57 @@
+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 MarkManageDto {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+    private String courseCode;
+    private String courseName;
+    private String paperNumber;
+    private Double progress;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public Double getProgress() {
+        return progress;
+    }
+
+    public void setProgress(Double progress) {
+        this.progress = progress;
+    }
+}

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

@@ -0,0 +1,127 @@
+package com.qmth.teachcloud.common.bean.dto.mark.manage;
+
+import com.qmth.teachcloud.common.annotation.ExcelProperty;
+
+public class MarkerInfoDto {
+
+    private Long examId;
+
+    @ExcelProperty(name = "课程名称", width = 20, index = 1)
+    private String courseCode;
+
+    @ExcelProperty(name = "课程名称", width = 20, index = 2)
+    private String courseName;
+
+    @ExcelProperty(name = "试卷编号", width = 20, index = 3)
+    private String paperNumber;
+
+    @ExcelProperty(name = "分组序号", width = 20, index = 4)
+    private Integer groupNumber;
+
+    @ExcelProperty(name = "大题名称", width = 20, index = 5)
+    private String groupName;
+
+    @ExcelProperty(name = "分组总分", width = 20, index = 6)
+    private Double totalScore;
+
+    @ExcelProperty(name = "登录名", width = 20, index = 7)
+    private String loginName;
+
+    @ExcelProperty(name = "工号", width = 20, index = 8)
+    private String empno;
+
+    @ExcelProperty(name = "姓名", width = 20, index = 9)
+    private String realName;
+
+    @ExcelProperty(name = "评卷数量", width = 20, index = 10)
+    private long markedCount;
+
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public Integer getGroupNumber() {
+        return groupNumber;
+    }
+
+    public void setGroupNumber(Integer groupNumber) {
+        this.groupNumber = groupNumber;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getEmpno() {
+        return empno;
+    }
+
+    public void setEmpno(String empno) {
+        this.empno = empno;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public long getMarkedCount() {
+        return markedCount;
+    }
+
+    public void setMarkedCount(long markedCount) {
+        this.markedCount = markedCount;
+    }
+}

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

@@ -11,7 +11,6 @@ public class MarkSettingDto {
 
     @JsonSerialize(using = ToStringSerializer.class)
     private Long examId;
-    private Integer groupNumber;
     private String courseCode;
     private String courseName;
     private String paperNumber;
@@ -27,14 +26,6 @@ public class MarkSettingDto {
         this.examId = examId;
     }
 
-    public Integer getGroupNumber() {
-        return groupNumber;
-    }
-
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
-    }
-
     public String getCourseCode() {
         return courseCode;
     }

+ 38 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/MarkPaper.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.MarkStatus;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -46,9 +47,15 @@ public class MarkPaper implements Serializable {
     @ApiModelProperty(value = "全卷满分")
     private Double totalScore;
 
+    @ApiModelProperty(value = "考生人数")
+    private Integer studentCount;
+
     @ApiModelProperty(value = "已上传人数")
     private Integer uploadCount;
 
+    @ApiModelProperty(value = "缺考人数")
+    private Integer absentCount;
+
     @ApiModelProperty(value = "备注")
     private String remark;
 
@@ -93,6 +100,8 @@ public class MarkPaper implements Serializable {
     @ApiModelProperty(value = "是否开启分班阅")
     private Boolean openMarkClass;
 
+    private MarkStatus status;
+
     public Long getExamId() {
         return examId;
     }
@@ -142,6 +151,15 @@ public class MarkPaper implements Serializable {
     public void setTotalScore(Double totalScore) {
         this.totalScore = totalScore;
     }
+
+    public Integer getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(Integer studentCount) {
+        this.studentCount = studentCount;
+    }
+
     public Integer getUploadCount() {
         return uploadCount;
     }
@@ -149,6 +167,15 @@ public class MarkPaper implements Serializable {
     public void setUploadCount(Integer uploadCount) {
         this.uploadCount = uploadCount;
     }
+
+    public Integer getAbsentCount() {
+        return absentCount;
+    }
+
+    public void setAbsentCount(Integer absentCount) {
+        this.absentCount = absentCount;
+    }
+
     public String getRemark() {
         return remark;
     }
@@ -265,6 +292,14 @@ public class MarkPaper implements Serializable {
         this.openMarkClass = openMarkClass;
     }
 
+    public MarkStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(MarkStatus status) {
+        this.status = status;
+    }
+
     @Override
     public String toString() {
         return "MarkPaper{" +
@@ -275,7 +310,9 @@ public class MarkPaper implements Serializable {
             ", objectiveScore=" + objectiveScore +
             ", subjectiveScore=" + subjectiveScore +
             ", totalScore=" + totalScore +
+            ", studentCount=" + studentCount +
             ", uploadCount=" + uploadCount +
+            ", absentCount=" + absentCount +
             ", remark=" + remark +
             ", sheetConfig=" + sheetConfig +
             ", passScore=" + passScore +
@@ -291,6 +328,7 @@ public class MarkPaper implements Serializable {
             ", showObjectScore=" + showObjectScore +
             ", groupStatus=" + groupStatus +
             ", openMarkClass=" + openMarkClass +
+            ", status=" + status +
         "}";
     }
 }

+ 32 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/mark/MarkStatus.java

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

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/MarkPaperMapper.java

@@ -1,10 +1,10 @@
 package com.qmth.teachcloud.common.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.setting.MarkSettingDto;
 import com.qmth.teachcloud.common.entity.MarkPaper;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 
 /**
@@ -18,4 +18,5 @@ import org.apache.ibatis.annotations.Param;
 public interface MarkPaperMapper extends BaseMapper<MarkPaper> {
 
     IPage<MarkSettingDto> listPaperSetting(@Param("page") Page<MarkSettingDto> page, @Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber, @Param("groupStatus") Boolean groupStatus);
+
 }

+ 2 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/MarkQuestionMapper.java

@@ -15,4 +15,6 @@ import org.apache.ibatis.annotations.Param;
 public interface MarkQuestionMapper extends BaseMapper<MarkQuestion> {
 
     String assembleQuestionsByExamIdAndPaperNumberAndNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber);
+
+    Double sumTotalScoreByGroupNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber);
 }

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

@@ -20,4 +20,5 @@ public interface MarkPaperService extends IService<MarkPaper> {
     MarkPaper getByExamIdAndPaperNumber(Long examId, String paperNumber);
 
     void savePaperSetting(MarkPaper markPaper);
+
 }

+ 2 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/MarkQuestionService.java

@@ -39,4 +39,6 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
     String uploadSubjectiveFile(Long examId, String paperNumber, MultipartFile file, String md5);
 
     String previewAnswerFileByExamIdAndPaperNumber(Long examId, String paperNumber);
+
+    double sumTotalScoreByGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 }

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

@@ -65,4 +65,5 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
                 .eq(MarkPaper::getPaperNumber, markPaper.getPaperNumber());
         this.update(updateWrapper);
     }
+
 }

+ 7 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/MarkQuestionServiceImpl.java

@@ -173,9 +173,15 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
     @Override
     public String previewAnswerFileByExamIdAndPaperNumber(Long examId, String paperNumber) {
         MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
-        if(markPaper != null){
+        if (markPaper != null) {
             return teachcloudCommonService.filePreview(markPaper.getAnswerFilePath());
         }
         return null;
     }
+
+    @Override
+    public double sumTotalScoreByGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+        Double score = this.baseMapper.sumTotalScoreByGroupNumber(examId, paperNumber, groupNumber);
+        return score != null ? score.doubleValue() : 0d;
+    }
 }

+ 2 - 1
teachcloud-common/src/main/resources/mapper/MarkPaperMapper.xml

@@ -25,6 +25,8 @@
         <result column="mark_end_time" property="markEndTime" />
         <result column="sheet_view" property="sheetView" />
         <result column="show_object_score" property="showObjectScore" />
+        <result column="open_mark_class" property="openMarkClass" />
+        <result column="status" property="status" />
     </resultMap>
     <select id="listPaperSetting" resultType="com.qmth.teachcloud.common.bean.dto.mark.setting.MarkSettingDto">
         SELECT
@@ -48,5 +50,4 @@
                 and mp.group_status = #{groupStatus}
             </if>
     </select>
-
 </mapper>

+ 10 - 0
teachcloud-common/src/main/resources/mapper/MarkQuestionMapper.xml

@@ -31,5 +31,15 @@
           AND mq.is_objective = false
         ORDER BY mq.main_number , mq.sub_number
     </select>
+    <select id="sumTotalScoreByGroupNumber" resultType="java.lang.Double">
+        SELECT
+            SUM(CAST(q.total_score AS DECIMAL (10 , 3 )))
+        FROM
+            mark_question q
+        WHERE
+            q.exam_id = #{examId}
+          AND q.paper_number = #{paperNumber}
+          AND q.group_number = #{groupNumber}
+    </select>
 
 </mapper>

+ 77 - 6
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkGroup.java

@@ -1,14 +1,21 @@
 package com.qmth.teachcloud.mark.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
+import java.text.DecimalFormat;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.entity.MarkQuestion;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.StringUtils;
 
 /**
  * <p>
@@ -57,7 +64,7 @@ public class MarkGroup implements Serializable {
     private String scorePolicy;
 
     @ApiModelProperty(value = "任务总量")
-    private Integer libraryCount;
+    private Integer taskCount;
 
     @ApiModelProperty(value = "已评数量")
     private Integer markedCount;
@@ -65,6 +72,15 @@ 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 scoreList;
+
     public Long getExamId() {
         return examId;
     }
@@ -138,13 +154,15 @@ public class MarkGroup implements Serializable {
     public void setScorePolicy(String scorePolicy) {
         this.scorePolicy = scorePolicy;
     }
-    public Integer getLibraryCount() {
-        return libraryCount;
+
+    public Integer getTaskCount() {
+        return taskCount;
     }
 
-    public void setLibraryCount(Integer libraryCount) {
-        this.libraryCount = libraryCount;
+    public void setTaskCount(Integer taskCount) {
+        this.taskCount = taskCount;
     }
+
     public Integer getMarkedCount() {
         return markedCount;
     }
@@ -160,6 +178,59 @@ public class MarkGroup implements Serializable {
         this.leftCount = leftCount;
     }
 
+    public String getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(String mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getQuestionTitle() {
+        return questionTitle;
+    }
+
+    public void setQuestionTitle(String questionTitle) {
+        this.questionTitle = questionTitle;
+    }
+
+    public String getScoreList() {
+        return scoreList;
+    }
+
+    public void setScoreList(String scoreList) {
+        this.scoreList = scoreList;
+    }
+
+    public void setQuestionList(List<MarkQuestion> questionList) {
+        DecimalFormat format = new DecimalFormat("####.###");
+        Set<Integer> mainNumbers = new LinkedHashSet<>();
+        Set<String> mainTitles = new LinkedHashSet<>();
+        Set<String> questionTitles = new LinkedHashSet<>();
+        StringBuilder score = new StringBuilder();
+        for (MarkQuestion question : questionList) {
+            if (score.length() > 0) {
+                score.append(",");
+            }
+            score.append(format.format(question.getTotalScore()));
+            mainNumbers.add(question.getMainNumber());
+            mainTitles.add(question.getMainTitle());
+            questionTitles.add(question.getMainTitle() + '-' + question.getSubNumber());
+        }
+        this.mainNumber = StringUtils.join(mainNumbers, ",");
+        this.title = StringUtils.join(mainTitles, ",");
+        this.questionTitle = StringUtils.join(questionTitles, ",");
+        this.scoreList = score.toString();
+    }
+
     @Override
     public String toString() {
         return "MarkGroup{" +
@@ -172,7 +243,7 @@ public class MarkGroup implements Serializable {
             ", doubleRate=" + doubleRate +
             ", arbitrateThreshold=" + arbitrateThreshold +
             ", scorePolicy=" + scorePolicy +
-            ", libraryCount=" + libraryCount +
+            ", taskCount=" + taskCount +
             ", markedCount=" + markedCount +
             ", leftCount=" + leftCount +
         "}";

+ 27 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkTask.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -33,6 +34,10 @@ public class MarkTask implements Serializable {
     @ApiModelProperty(value = "考试ID")
     private Long examId;
 
+    @ApiModelProperty(value = "课程代码")
+    private String courseCode;
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
     @ApiModelProperty(value = "试卷编号")
     private String paperNumber;
 
@@ -53,7 +58,7 @@ public class MarkTask implements Serializable {
     private Integer taskNumber;
 
     @ApiModelProperty(value = "状态")
-    private String status;
+    private MarkTaskStatus status;
 
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "评卷员ID")
@@ -98,6 +103,23 @@ public class MarkTask implements Serializable {
     public void setExamId(Long examId) {
         this.examId = examId;
     }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
     public String getPaperNumber() {
         return paperNumber;
     }
@@ -140,11 +162,11 @@ public class MarkTask implements Serializable {
     public void setTaskNumber(Integer taskNumber) {
         this.taskNumber = taskNumber;
     }
-    public String getStatus() {
+    public MarkTaskStatus getStatus() {
         return status;
     }
 
-    public void setStatus(String status) {
+    public void setStatus(MarkTaskStatus status) {
         this.status = status;
     }
     public Long getUserId() {
@@ -216,6 +238,8 @@ public class MarkTask implements Serializable {
         return "MarkTask{" +
             "id=" + id +
             ", examId=" + examId +
+            ", courseCode=" + courseCode +
+            ", courseName=" + courseName +
             ", paperNumber=" + paperNumber +
             ", groupNumber=" + groupNumber +
             ", studentId=" + studentId +

+ 48 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/MarkTaskStatus.java

@@ -0,0 +1,48 @@
+package com.qmth.teachcloud.mark.enums;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public enum MarkTaskStatus {
+    WAITING("未处理", 0), MARKED("已评", 1), REJECTED("已打回", 2), WAIT_ARBITRATE("等待仲裁", 3), ARBITRATED("已仲裁", 4), PROBLEM(
+            "问题卷", 5);
+
+    private String name;
+
+    private int value;
+
+    private static List<MarkTaskStatus> options;
+
+    private MarkTaskStatus(String name, int value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public static MarkTaskStatus findByValue(int value) {
+        for (MarkTaskStatus c : MarkTaskStatus.values()) {
+            if (c.getValue() == value) {
+                return c;
+            }
+        }
+        return null;
+    }
+
+    public static List<MarkTaskStatus> getOptionList() {
+        if (options == null) {
+            options = new LinkedList<>();
+            for (MarkTaskStatus status : MarkTaskStatus.values()) {
+                options.add(status);
+            }
+        }
+        return options;
+    }
+
+}

+ 10 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkTaskMapper.java

@@ -1,7 +1,14 @@
 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.manage.MarkManageDto;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkerInfoDto;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +20,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface MarkTaskMapper extends BaseMapper<MarkTask> {
 
+    IPage<MarkManageDto> listPaperManage(@Param("page") Page<MarkManageDto> page, @Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber, @Param("progressStatus") Boolean progressStatus);
+
+    List<MarkerInfoDto> listUserMarkedCount(@Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber);
 }

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

@@ -1,6 +1,7 @@
 package com.qmth.teachcloud.mark.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+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;
 import com.qmth.teachcloud.mark.entity.MarkGroup;
@@ -25,4 +26,8 @@ public interface MarkGroupService extends IService<MarkGroup> {
     void updatePicListByExamIdAndPaperNumberAndGroupNumber(GroupPictureConfigParams groupPictureConfigParams);
 
     void updateOpenMarkClassByExamIdAndPaperNumber(Long examId, String paperNumber, Boolean openMarkClass);
+
+    MarkGroup getByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+
+    MarkGroupSummaryProgressDto summaryGroupProgress(Long examId, String paperNumber);
 }

+ 16 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkTaskService.java

@@ -1,8 +1,13 @@
 package com.qmth.teachcloud.mark.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkManageDto;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
 /**
  * <p>
  * 评卷任务表 服务类
@@ -13,4 +18,15 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface MarkTaskService extends IService<MarkTask> {
 
+    IPage<MarkManageDto> listPaperManage(Long examId, String courseCode, String paperNumber, Boolean progressStatus, Integer pageNumber, Integer pageSize);
+
+    void exportMarker(Long examId, String courseCode, String paperNumber, HttpServletResponse response);
+
+    List<MarkTask> listByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+
+    Integer markedCount(List<MarkTask> groupNumberMarkTask);
+
+    Integer waitArbitrateCount(List<MarkTask> groupNumberMarkTask);
+
+    Double calcPercent(Integer markedCount, Integer taskCount);
 }

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

@@ -27,4 +27,6 @@ public interface MarkUserClassService extends IService<MarkUserClass> {
     boolean saveMarkClassUser(MarkClassUserParams markClassUserParams);
 
     boolean deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+
+    List<MarkUserClass> listByExamIdAndPaperNumber(Long examId, String paperNumber);
 }

+ 99 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupServiceImpl.java

@@ -4,8 +4,13 @@ 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.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupClassProgressDto;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupProgressDto;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupSummaryProgressDto;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkGroupTotalProgressDto;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkGroupDto;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkGroupTaskDto;
+import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkUser;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.PictureConfig;
 import com.qmth.teachcloud.common.bean.params.mark.setting.GroupPictureConfigParams;
 import com.qmth.teachcloud.common.entity.MarkPaper;
@@ -13,8 +18,11 @@ 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.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 org.apache.commons.collections4.CollectionUtils;
@@ -25,6 +33,8 @@ 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;
 
 /**
  * <p>
@@ -49,6 +59,9 @@ public class MarkGroupServiceImpl extends ServiceImpl<MarkGroupMapper, MarkGroup
     @Resource
     MarkUserClassService markUserClassService;
 
+    @Resource
+    MarkTaskService markTaskService;
+
     @Override
     public MarkGroupTaskDto listGroupTaskByExamIdAndPaperNumber(Long examId, String paperNumber) {
         MarkGroupTaskDto markGroupTaskDto = new MarkGroupTaskDto();
@@ -89,13 +102,17 @@ public class MarkGroupServiceImpl extends ServiceImpl<MarkGroupMapper, MarkGroup
         queryWrapper.lambda().eq(MarkGroup::getExamId, examId)
                 .eq(MarkGroup::getPaperNumber, paperNumber)
                 .orderByAsc(MarkGroup::getNumber);
-        return null;
+        return this.list(queryWrapper);
     }
 
     @Transactional
     @Override
     public void deleteGroupByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
-
+        UpdateWrapper<MarkGroup> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkGroup::getExamId, examId)
+                .eq(MarkGroup::getPaperNumber, paperNumber)
+                .eq(MarkGroup::getNumber, groupNumber);
+        this.remove(updateWrapper);
     }
 
     @Override
@@ -126,4 +143,84 @@ public class MarkGroupServiceImpl extends ServiceImpl<MarkGroupMapper, MarkGroup
             markUserClassService.deleteByExamIdAndPaperNumber(examId, paperNumber);
         }
     }
+
+    @Override
+    public MarkGroup getByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+        QueryWrapper<MarkGroup> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkGroup::getExamId, examId)
+                .eq(MarkGroup::getPaperNumber, paperNumber)
+                .eq(MarkGroup::getNumber, groupNumber);
+        return this.getOne(queryWrapper);
+    }
+
+    @Override
+    public MarkGroupSummaryProgressDto summaryGroupProgress(Long examId, String paperNumber) {
+        MarkGroupSummaryProgressDto markGroupSummaryProgressDto = new MarkGroupSummaryProgressDto();
+
+        // totalInfo
+        MarkGroupTotalProgressDto markGroupTotalProgressDto = new MarkGroupTotalProgressDto();
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+        markGroupTotalProgressDto.setStudentCount(markPaper.getStudentCount());
+        markGroupTotalProgressDto.setUploadCount(markPaper.getUploadCount());
+        markGroupTotalProgressDto.setAbsentCount(markPaper.getAbsentCount());
+
+        List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, 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);
+        for (MarkGroup markGroup : markGroupList) {
+            MarkGroupProgressDto markGroupProgressDto = new MarkGroupProgressDto();
+            markGroupProgressDto.setGroupNumber(markGroup.getNumber());
+            markGroupProgressDto.setGroupQuestions(markQuestionService.assembleGroupQuestionsByExamIdAndPaperNumberAndNumber(examId, paperNumber, markGroup.getNumber()));
+            List<MarkUser> markUserList = markUserGroupService.listGroupUserByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroup.getNumber());
+            markGroupProgressDto.setMarkerCount(markUserList.size());
+            markGroup.setQuestionList(markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, paperNumber, markGroup.getNumber(), false));
+            markGroupProgressDto.setScoreList(markGroup.getScoreList());
+            List<MarkTask> groupNumberMarkTask = markTaskList.stream().filter(m -> m.getGroupNumber().equals(markGroup.getNumber())).collect(Collectors.toList());
+            markGroupProgressDto.setTaskCount(groupNumberMarkTask.size());
+            markGroupProgressDto.setMarkedCount(markTaskService.markedCount(groupNumberMarkTask));
+            markGroupProgressDto.setLeftCount(markGroupProgressDto.getTaskCount() - markGroupProgressDto.getMarkedCount());
+            // todo 正在评卷数
+//            markGroupProgressDto.setCurrentCount();
+            markGroupProgressDto.setPercent(markTaskService.calcPercent(markGroupProgressDto.getMarkedCount(), markGroupProgressDto.getTaskCount()));
+            markGroupProgressDto.setArbitrateCount(markTaskService.waitArbitrateCount(groupNumberMarkTask));
+            markGroupProgressDtoList.add(markGroupProgressDto);
+        }
+        markGroupSummaryProgressDto.setGroupInfo(markGroupProgressDtoList);
+        return markGroupSummaryProgressDto;
+    }
 }

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

@@ -1,10 +1,27 @@
 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.manage.MarkManageDto;
+import com.qmth.teachcloud.common.bean.dto.mark.manage.MarkerInfoDto;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.service.MarkQuestionService;
+import com.qmth.teachcloud.common.util.ExcelUtil;
+import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkTask;
+import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
 import com.qmth.teachcloud.mark.mapper.MarkTaskMapper;
+import com.qmth.teachcloud.mark.service.MarkGroupService;
 import com.qmth.teachcloud.mark.service.MarkTaskService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.text.DecimalFormat;
+import java.util.List;
 
 /**
  * <p>
@@ -17,4 +34,66 @@ import org.springframework.stereotype.Service;
 @Service
 public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> implements MarkTaskService {
 
+    @Resource
+    MarkGroupService markGroupService;
+
+    @Resource
+    MarkQuestionService markQuestionService;
+
+    @Override
+    public IPage<MarkManageDto> listPaperManage(Long examId, String courseCode, String paperNumber, Boolean progressStatus, Integer pageNumber, Integer pageSize) {
+        Page<MarkManageDto> page = new Page<>(pageNumber, pageSize);
+        return this.baseMapper.listPaperManage(page, examId, courseCode, paperNumber, progressStatus);
+    }
+
+    @Override
+    public void exportMarker(Long examId, String courseCode, String paperNumber, HttpServletResponse response) {
+        List<MarkerInfoDto> markerInfoDtoList = this.baseMapper.listUserMarkedCount(examId, courseCode, paperNumber);
+        for (MarkerInfoDto markerInfoDto : markerInfoDtoList) {
+            MarkGroup markGroup = markGroupService.getByExamIdAndPaperNumberAndGroupNumber(examId, markerInfoDto.getPaperNumber(), markerInfoDto.getGroupNumber());
+            markGroup.setQuestionList(markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(examId, markerInfoDto.getPaperNumber(), markerInfoDto.getGroupNumber(), false));
+            markerInfoDto.setGroupName(markGroup.getQuestionTitle());
+            markerInfoDto.setTotalScore(markQuestionService.sumTotalScoreByGroupNumber(examId, markerInfoDto.getPaperNumber(), markerInfoDto.getGroupNumber()));
+        }
+        try {
+            ExcelUtil.excelExport("评卷员工作量", MarkerInfoDto.class, markerInfoDtoList, response);
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception("导出评卷员工作量失败");
+        }
+    }
+
+    @Override
+    public List<MarkTask> listByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+        QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkTask::getExamId, examId)
+                .eq(MarkTask::getPaperNumber, paperNumber);
+        if (groupNumber != null) {
+            queryWrapper.lambda().eq(MarkTask::getGroupNumber, groupNumber);
+        }
+        return this.list(queryWrapper);
+    }
+
+    @Override
+    public Integer markedCount(List<MarkTask> markTask) {
+        if (CollectionUtils.isEmpty(markTask)) {
+            return 0;
+        }
+        long count = markTask.stream().filter(m -> m.getStatus().equals(MarkTaskStatus.MARKED) || m.getStatus().equals(MarkTaskStatus.ARBITRATED)).count();
+        return (int) count;
+    }
+
+    @Override
+    public Integer waitArbitrateCount(List<MarkTask> markTask) {
+        if (CollectionUtils.isEmpty(markTask)) {
+            return 0;
+        }
+        long count = markTask.stream().filter(m -> m.getStatus().equals(MarkTaskStatus.WAIT_ARBITRATE)).count();
+        return (int) count;
+    }
+
+    @Override
+    public Double calcPercent(Integer markedCount, Integer taskCount) {
+        String percent = taskCount > 0 ? new DecimalFormat("####.###").format(markedCount * 100.0 / taskCount) : "0";
+        return Double.parseDouble(percent);
+    }
 }

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

@@ -1,5 +1,6 @@
 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.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.common.bean.dto.mark.setting.MarkGroupDto;
@@ -118,4 +119,12 @@ public class MarkUserClassServiceImpl extends ServiceImpl<MarkUserClassMapper, M
                 .eq(MarkUserClass::getGroupNumber, groupNumber);
         return this.remove(updateWrapper);
     }
+
+    @Override
+    public List<MarkUserClass> listByExamIdAndPaperNumber(Long examId, String paperNumber) {
+        QueryWrapper<MarkUserClass> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkUserClass::getExamId, examId)
+                .eq(MarkUserClass::getPaperNumber, paperNumber);
+        return this.list(queryWrapper);
+    }
 }

+ 1 - 1
teachcloud-mark/src/main/resources/mapper/MarkGroupMapper.xml

@@ -12,7 +12,7 @@
         <result column="double_rate" property="doubleRate" />
         <result column="arbitrate_threshold" property="arbitrateThreshold" />
         <result column="score_policy" property="scorePolicy" />
-        <result column="library_count" property="libraryCount" />
+        <result column="task_count" property="taskCount" />
         <result column="marked_count" property="markedCount" />
         <result column="left_count" property="leftCount" />
     </resultMap>

+ 62 - 0
teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml

@@ -6,6 +6,8 @@
     <resultMap id="BaseResultMap" type="com.qmth.teachcloud.mark.entity.MarkTask">
         <id column="id" property="id" />
         <result column="exam_id" property="examId" />
+        <result column="course_code" property="courseCode" />
+        <result column="course_name" property="courseName" />
         <result column="paper_number" property="paperNumber" />
         <result column="group_number" property="groupNumber" />
         <result column="student_id" property="studentId" />
@@ -23,5 +25,65 @@
         <result column="header_score" property="headerScore" />
         <result column="header_score_list" property="headerScoreList" />
     </resultMap>
+    <select id="listPaperManage" resultType="com.qmth.teachcloud.common.bean.dto.mark.manage.MarkManageDto">
+        SELECT
+            exam_id examId,
+            course_code courseCode,
+            course_name courseName,
+            paper_number paperNumber,
+            COUNT(1) totalCount,
+            SUM(CASE status
+                    WHEN 'MARKED' THEN 1
+                    WHEN 'ARBITRATED' THEN 1
+                    ELSE 0
+                END) AS markedCount
+        FROM
+            mark_task
+        <where>
+            exam_id = #{examId}
+            <if test="courseCode != null and courseCode != ''">
+                and course_code = #{courseCode}
+            </if>
+            <if test="paperNumber != null and paperNumber != ''">
+                and course_code = #{courseCode}
+            </if>
+        </where>
+        GROUP BY exam_id , course_code , course_name , paper_number
+        <if test="progressStatus != null">
+            <if test="progressStatus == true">
+                HAVING totalCount > 0 AND totalCount = markedCount
+            </if>
+            <if test="progressStatus == false">
+                HAVING totalCount = 0 OR totalCount > markedCount
+            </if>
+        </if>
+    </select>
+    <select id="listUserMarkedCount"
+            resultType="com.qmth.teachcloud.common.bean.dto.mark.manage.MarkerInfoDto">
+        SELECT
+            mt.exam_id examId,
+            mt.course_code courseCode,
+            mt.course_name courseName,
+            mt.paper_number paperNumber,
+            mt.group_number groupNumber,
+            su.login_name loginName,
+            su.code empno,
+            su.real_name realName,
+            COUNT(1) markedCount
+        FROM
+            mark_task mt
+                LEFT JOIN
+            sys_user su ON mt.user_id = su.id
+        <where>
+            mt.exam_id = #{examId}
+            <if test="courseCode != null and courseCode != ''">
+                and mt.course_code = #{courseCode}
+            </if>
+            <if test="paperNumber != null and paperNumber != ''">
+                and mt.paper_number = #{paperNumber}
+            </if>
+        </where>
+        GROUP BY mt.exam_id , mt.course_code , mt.course_name , mt.paper_number , mt.group_number , su.login_name , su.code , su.real_name
+    </select>
 
 </mapper>