Эх сурвалжийг харах

3.3.0 管理员个性主观题分数

xiaofei 1 жил өмнө
parent
commit
3a77b18fe3
15 өөрчлөгдсөн 315 нэмэгдсэн , 160 устгасан
  1. 12 40
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java
  2. 4 4
      distributed-print/install/mysql/upgrade/3.3.0.sql
  3. 53 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkInspectedController.java
  4. 0 19
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkStudentController.java
  5. 5 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/Task.java
  6. 19 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/TrackDTO.java
  7. 40 59
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/TrackDTO.java
  8. 31 8
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkResult.java
  9. 9 4
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkService.java
  10. 20 14
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java
  11. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkArbitrateHistoryServiceImpl.java
  12. 50 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java
  13. 59 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java
  14. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/TaskServiceImpl.java
  15. 11 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/utils/TaskLockUtil.java

+ 12 - 40
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java

@@ -50,64 +50,43 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
 
     @Resource
     private ExamTaskService examTaskService;
-
     @Resource
     private ExamCardService examCardService;
-
     @Resource
     private ExamDetailService examDetailService;
-
     @Resource
     private ExamDetailCourseService examDetailCourseService;
-
     @Resource
     private ExamStudentService examStudentService;
-
     @Resource
     @Lazy
     private PrintCommonService printCommonService;
-
     @Resource
     private ExamPrintPlanService examPrintPlanService;
-
     @Resource
-    TBTaskService tbTaskService;
-
-    @Resource
-    TBSyncTaskService tbSyncTaskService;
-
+    private TBTaskService tbTaskService;
     @Resource
-    TeachcloudCommonService teachcloudCommonService;
-
+    private TBSyncTaskService tbSyncTaskService;
     @Resource
-    RedisUtil redisUtil;
-
+    private TeachcloudCommonService teachcloudCommonService;
     @Resource
-    ActivitiService activitiService;
-
+    private RedisUtil redisUtil;
     @Resource
-    TaskService taskService;
-
+    private ActivitiService activitiService;
     @Resource
-    TFFlowApproveService tfFlowApproveService;
-
+    private TaskService taskService;
     @Resource
-    TFFlowJoinService tfFlowJoinService;
-
+    private TFFlowApproveService tfFlowApproveService;
     @Resource
-    SysUserService sysUserService;
-
+    private TFFlowJoinService tfFlowJoinService;
     @Resource
-    CommonCacheService commonCacheService;
-
+    private SysUserService sysUserService;
     @Resource
-    ExamTaskDetailMapper examTaskDetailMapper;
-
+    private CommonCacheService commonCacheService;
     @Resource
-    BasicRoleDataPermissionService basicRoleDataPermissionService;
-
+    private ExamTaskDetailMapper examTaskDetailMapper;
     @Resource
-    ExamPaperStructureService examPaperStructureService;
+    private BasicRoleDataPermissionService basicRoleDataPermissionService;
 
     @Transactional
     @Override
@@ -694,13 +673,6 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
                 .eq(TBSyncTask::getPaperNumber, paperNumber);
         tbSyncTaskService.update(tbSyncTaskUpdateWrapper);
 
-        // 评卷参数表改为作废 todo xf 20231023
-        UpdateWrapper<ExamPaperStructure> examPaperStructureUpdateWrapper = new UpdateWrapper<>();
-        examPaperStructureUpdateWrapper.lambda().set(ExamPaperStructure::getPaperNumber, paperNumberCancel)
-                .eq(ExamPaperStructure::getSchoolId, examTask.getSchoolId())
-                .eq(ExamPaperStructure::getExamId, examTask.getExamId())
-                .eq(ExamPaperStructure::getPaperNumber, paperNumber);
-        examPaperStructureService.update(examPaperStructureUpdateWrapper);
         return true;
     }
 

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

@@ -82,10 +82,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 ('954', '获取配置', '/api/admin/mark/track/getSetting', 'URL', '946', '3', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('955', '获取任务', '/api/admin/mark/track/getTask', 'URL', '946', '4', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('956', '主观题检查-获取配置', '/api/admin/mark/inspected/getSetting', 'URL', '946', '5', 'AUTH', '1', '1', '1');
-INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('957', '主观题检查-获取任务', '/api/admin/mark/inspected/getTask', 'URL', '946', '6', 'AUTH', '1', '1', '1');
-INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('958', '主观题检查-保存任务', '/api/admin/mark/inspected/saveTask', 'URL', '946', '7', 'AUTH', '1', '1', '1');
-INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('959', '客观题检查-获取任务', '/api/admin/mark/student/check/objective/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/student/check/objective/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 ('957', '主观题检查-获取任务', '/api/admin/mark/inspected/subjective/getTask', 'URL', '946', '6', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('958', '主观题检查-保存任务', '/api/admin/mark/inspected/subjective/saveTask', 'URL', '946', '7', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('959', '客观题检查-获取任务', '/api/admin/mark/inspected/objective/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/inspected/objective/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/paper/package/list', 'URL', '946', '10', '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');

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

@@ -3,10 +3,18 @@ package com.qmth.distributed.print.api.mark;
 
 import com.qmth.boot.api.constant.ApiConstant;
 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.dto.mark.manage.Task;
+import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveDetailDto;
+import com.qmth.teachcloud.mark.params.MarkResult;
+import com.qmth.teachcloud.mark.service.MarkStudentService;
 import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.Resource;
 
 /**
  * <p>
@@ -21,4 +29,47 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_MARK + "/inspected")
 public class MarkInspectedController {
 
+    @Resource
+    private MarkStudentService markStudentService;
+
+
+    /**
+     * 客观题检查任务获取
+     */
+    @ApiOperation(value = "客观题检查任务获取")
+    @RequestMapping(value = "/objective/getTask", method = RequestMethod.POST)
+    public Result getObjectiveInspectedTask(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId) {
+        StudentObjectiveDetailDto studentObjectiveDetailDto = markStudentService.getObjectiveInspectedTask(studentId);
+        return ResultUtil.ok(studentObjectiveDetailDto);
+    }
+
+    /**
+     * 客观题检查任务保存
+     */
+    @ApiOperation(value = "客观题检查任务保存")
+    @RequestMapping(value = "/objective/saveTask", method = RequestMethod.POST)
+    public Result saveObjectiveInspectedTask(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId,
+                                         @ApiParam(value = "客观题答案", required = true) @RequestParam String answers) {
+        return ResultUtil.ok(markStudentService.saveObjectiveInspectedTask(studentId, answers));
+    }
+
+    /**
+     * 主观题检查任务获取
+     */
+    @ApiOperation(value = "主观题检查任务获取")
+    @RequestMapping(value = "/subjective/getTask", method = RequestMethod.POST)
+    public Result getSubjectiveInspectedTask(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId) {
+        Task task = markStudentService.getSubjectiveInspectedTask(studentId);
+        return ResultUtil.ok(task);
+    }
+
+    /**
+     * 主观题检查任务保存
+     */
+    @ApiOperation(value = "主观题检查任务保存")
+    @RequestMapping(value = "/subjective/saveTask", method = RequestMethod.POST)
+    public Result saveSubjectiveInspectedTask(@ApiParam(value = "考生ID", required = true) @RequestBody MarkResult markResult) {
+        markStudentService.saveSubjectiveInspectedTask(markResult);
+        return ResultUtil.ok(true);
+    }
 }

+ 0 - 19
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkStudentController.java

@@ -62,23 +62,4 @@ public class MarkStudentController {
         return ResultUtil.ok(scoreListDtoIPage);
     }
 
-    /**
-     * 客观题检查任务获取
-     */
-    @ApiOperation(value = "客观题检查任务获取")
-    @RequestMapping(value = "/check/objective/getTask", method = RequestMethod.POST)
-    public Result getCheckObjectiveTask(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId) {
-        StudentObjectiveDetailDto studentObjectiveDetailDto = markStudentService.getCheckObjectiveTask(studentId);
-        return ResultUtil.ok(studentObjectiveDetailDto);
-    }
-
-    /**
-     * 客观题检查任务保存
-     */
-    @ApiOperation(value = "客观题检查任务保存")
-    @RequestMapping(value = "/check/objective/saveTask", method = RequestMethod.POST)
-    public Result saveCheckObjectiveTask(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId,
-                                         @ApiParam(value = "客观题答案", required = true) @RequestParam String answers) {
-        return ResultUtil.ok(markStudentService.saveCheckObjectiveTask(studentId, answers));
-    }
 }

+ 5 - 5
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/Task.java

@@ -14,7 +14,7 @@ public class Task implements Serializable {
     /**
      * 评卷任务编号
      */
-    private Long libraryId;
+    private Long taskId;
 
     /**
      * 考生编号
@@ -111,12 +111,12 @@ public class Task implements Serializable {
      */
     private String message;
 
-    public Long getLibraryId() {
-        return libraryId;
+    public Long getTaskId() {
+        return taskId;
     }
 
-    public void setLibraryId(Long libraryId) {
-        this.libraryId = libraryId;
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
     }
 
     public Long getStudentId() {

+ 19 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/TrackDTO.java

@@ -1,6 +1,7 @@
 package com.qmth.teachcloud.mark.dto.mark.manage;
 
 import com.qmth.teachcloud.mark.entity.*;
+import com.qmth.teachcloud.mark.params.MarkResult;
 
 import java.io.Serializable;
 
@@ -102,6 +103,24 @@ public class TrackDTO implements Serializable {
         return track;
     }
 
+    public MarkHeaderTrack transform(MarkResult markResult, MarkUserGroup markUserGroup) {
+        MarkHeaderTrack track = new MarkHeaderTrack();
+        track.setQuestionNumber(getMainNumber() + "." + getSubNumber());
+        track.setNumber(getNumber());
+        track.setStudentId(markResult.getStudentId());
+        track.setExamId(markUserGroup.getExamId());
+        track.setPaperNumber(markUserGroup.getPaperNumber());
+        track.setGroupNumber(markUserGroup.getGroupNumber());
+        track.setUserId(markUserGroup.getUserId());
+        track.setScore(getScore());
+        track.setPositionX(getPositionX());
+        track.setPositionY(getPositionY());
+        track.setOffsetIndex(getOffsetIndex());
+        track.setOffsetX(getOffsetX());
+        track.setOffsetY(getOffsetY());
+        return track;
+    }
+
     public Integer getMainNumber() {
         return mainNumber;
     }

+ 40 - 59
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/mark/TrackDTO.java

@@ -1,7 +1,9 @@
 package com.qmth.teachcloud.mark.dto.mark.mark;
 
 
-public class TrackDTO  {
+import com.qmth.teachcloud.mark.entity.*;
+
+public class TrackDTO {
 
 
     private Integer mainNumber;
@@ -72,64 +74,43 @@ public class TrackDTO  {
 //        setUnanswered(track.isUnanswered());
 //    }
 //
-//    public MarkTrack transform(MarkLibrary library, Marker marker) {
-//        MarkTrack track = new MarkTrack();
-//        track.setLibraryId(library.getId());
-//        track.setQuestionNumber(getMainNumber() + "." + getSubNumber());
-//        track.setNumber(getNumber());
-//        track.setStudentId(library.getStudentId());
-//        track.setExamId(library.getExamId());
-//        track.setSubjectCode(library.getSubjectCode());
-//        track.setGroupNumber(library.getGroupNumber());
-//        track.setMarkerId(marker.getId());
-//        track.setScore(getScore());
-//        track.setPositionX(getPositionX());
-//        track.setPositionY(getPositionY());
-//        track.setOffsetIndex(getOffsetIndex());
-//        track.setOffsetX(getOffsetX());
-//        track.setOffsetY(getOffsetY());
-//        track.setUnanswered(isUnanswered());
-//        return track;
-//    }
-//
-//    public TrialTrack transform(TrialLibrary library) {
-//        TrialTrack track = new TrialTrack();
-//        track.setLibraryId(library.getId());
-//        track.setMarkerId(library.getMarkerId());
-//        track.setQuestionNumber(getMainNumber() + "." + getSubNumber());
-//        track.setNumber(getNumber());
-//        track.setStudentId(library.getStudentId());
-//        track.setExamId(library.getExamId());
-//        track.setSubjectCode(library.getSubjectCode());
-//        track.setGroupNumber(library.getGroupNumber());
-//        track.setScore(getScore());
-//        track.setPositionX(getPositionX());
-//        track.setPositionY(getPositionY());
-//        track.setOffsetIndex(getOffsetIndex());
-//        track.setOffsetX(getOffsetX());
-//        track.setOffsetY(getOffsetY());
-//        track.setUnanswered(isUnanswered());
-//        return track;
-//    }
-//
-//    public HeaderTrack transform(ArbitrateHistory library) {
-//        HeaderTrack track = new HeaderTrack();
-//        track.setQuestionNumber(getMainNumber() + "." + getSubNumber());
-//        track.setNumber(getNumber());
-//        track.setStudentId(library.getStudentId());
-//        track.setExamId(library.getExamId());
-//        track.setSubjectCode(library.getSubjectCode());
-//        track.setGroupNumber(library.getGroupNumber());
-//        track.setUserId(library.getUserId());
-//        track.setScore(getScore());
-//        track.setPositionX(getPositionX());
-//        track.setPositionY(getPositionY());
-//        track.setOffsetIndex(getOffsetIndex());
-//        track.setOffsetX(getOffsetX());
-//        track.setOffsetY(getOffsetY());
-//        track.setUnanswered(isUnanswered());
-//        return track;
-//    }
+    public MarkTrack transform(MarkTask library, MarkUserGroup marker) {
+        MarkTrack track = new MarkTrack();
+        track.setTaskId(library.getId());
+        track.setQuestionNumber(getMainNumber() + "." + getSubNumber());
+        track.setNumber(getNumber());
+        track.setStudentId(library.getStudentId());
+        track.setExamId(library.getExamId());
+        track.setPaperNumber(library.getPaperNumber());
+        track.setGroupNumber(library.getGroupNumber());
+        track.setUserId(marker.getId());
+        track.setScore(getScore());
+        track.setPositionX(getPositionX());
+        track.setPositionY(getPositionY());
+        track.setOffsetIndex(getOffsetIndex());
+        track.setOffsetX(getOffsetX());
+        track.setOffsetY(getOffsetY());
+        return track;
+    }
+
+
+    public MarkHeaderTrack transform(MarkArbitrateHistory library) {
+        MarkHeaderTrack track = new MarkHeaderTrack();
+        track.setQuestionNumber(getMainNumber() + "." + getSubNumber());
+        track.setNumber(getNumber());
+        track.setStudentId(library.getStudentId());
+        track.setExamId(library.getExamId());
+        track.setPaperNumber(library.getPaperNumber());
+        track.setGroupNumber(library.getGroupNumber());
+        track.setUserId(library.getUpdateUserId());
+        track.setScore(getScore());
+        track.setPositionX(getPositionX());
+        track.setPositionY(getPositionY());
+        track.setOffsetIndex(getOffsetIndex());
+        track.setOffsetX(getOffsetX());
+        track.setOffsetY(getOffsetY());
+        return track;
+    }
 
     public Integer getMainNumber() {
         return mainNumber;

+ 31 - 8
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/params/MarkResult.java

@@ -18,6 +18,11 @@ public class MarkResult {
 
     public static final String SPLIT = ",";
 
+    /**
+     * 评卷员分组ID
+     */
+    private Long markUserGroupId;
+
     /**
      * 评卷状态
      */
@@ -26,12 +31,12 @@ public class MarkResult {
     /**
      * 考生编号
      */
-    private Integer studentId;
+    private Long studentId;
 
     /**
      * 评卷任务编号
      */
-    private Integer libraryId;
+    private Long taskId;
 
     /**
      * 总分
@@ -70,6 +75,14 @@ public class MarkResult {
 
     private boolean unselective;
 
+    public Long getMarkUserGroupId() {
+        return markUserGroupId;
+    }
+
+    public void setMarkUserGroupId(Long markUserGroupId) {
+        this.markUserGroupId = markUserGroupId;
+    }
+
     public String getStatusValue() {
         return statusValue;
     }
@@ -78,12 +91,12 @@ public class MarkResult {
         this.statusValue = statusValue;
     }
 
-    public Integer getLibraryId() {
-        return libraryId;
+    public Long getTaskId() {
+        return taskId;
     }
 
-    public void setLibraryId(Integer libraryId) {
-        this.libraryId = libraryId;
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
     }
 
     public double getMarkerScore() {
@@ -127,11 +140,11 @@ public class MarkResult {
         this.spent = spent;
     }
 
-    public Integer getStudentId() {
+    public Long getStudentId() {
         return studentId;
     }
 
-    public void setStudentId(Integer studentId) {
+    public void setStudentId(Long studentId) {
         this.studentId = studentId;
     }
 
@@ -145,6 +158,16 @@ public class MarkResult {
         return list;
     }
 
+    public List<MarkHeaderTrack> getTrackList(MarkResult markResult, MarkUserGroup markUserGroup) {
+        List<MarkHeaderTrack> list = new LinkedList<>();
+        if (trackList != null) {
+            for (TrackDTO dto : trackList) {
+                list.add(dto.transform(markResult, markUserGroup));
+            }
+        }
+        return list;
+    }
+
     public List<MarkTrack> getTrackList(MarkTask markTask, MarkUserGroup markUserGroup) {
         List<MarkTrack> list = new LinkedList<>();
         if (trackList != null) {

+ 9 - 4
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkService.java

@@ -3,10 +3,7 @@ package com.qmth.teachcloud.mark.service;
 import java.util.List;
 
 import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.mark.dto.mark.mark.MarkGroupDto;
-import com.qmth.teachcloud.mark.dto.mark.mark.MarkSettingDto;
-import com.qmth.teachcloud.mark.dto.mark.mark.MarkStatusDto;
-import com.qmth.teachcloud.mark.dto.mark.mark.MarkTaskDto;
+import com.qmth.teachcloud.mark.dto.mark.mark.*;
 import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkStudent;
@@ -68,4 +65,12 @@ public interface MarkService {
      * @param markGroup
      */
     void releaseByMarkGroup(MarkGroup markGroup);
+    void releaseByStudent(MarkStudent student);
+
+    /**
+     * 申请领取某个任务
+     */
+    boolean applyStudent(MarkStudent student, Long userId);
+
+    void submitHeaderTask(MarkResult markResult, MarkUserGroup markUserGroup);
 }

+ 20 - 14
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java

@@ -1,9 +1,5 @@
 package com.qmth.teachcloud.mark.service;
 
-import java.util.List;
-
-import javax.validation.constraints.NotNull;
-
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.teachcloud.common.entity.BasicExam;
@@ -18,11 +14,16 @@ import com.qmth.teachcloud.mark.bean.scanexaminfo.ScanExamInfoVo;
 import com.qmth.teachcloud.mark.bean.student.AbsentManualUpdateVo;
 import com.qmth.teachcloud.mark.bean.student.StudentQuery;
 import com.qmth.teachcloud.mark.bean.student.StudentVo;
+import com.qmth.teachcloud.mark.dto.mark.manage.Task;
 import com.qmth.teachcloud.mark.dto.mark.score.SheetUrlDto;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveDetailDto;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentScoreDetailDto;
 import com.qmth.teachcloud.mark.entity.MarkStudent;
 import com.qmth.teachcloud.mark.entity.ScanStudentPaper;
+import com.qmth.teachcloud.mark.params.MarkResult;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * <p>
@@ -37,6 +38,7 @@ public interface MarkStudentService extends IService<MarkStudent> {
     List<String> listClassByExamIdAndCourseCode(Long examId, String paperNumber);
 
     void updateSubjectiveStatusAndScore(Long studentId, SubjectiveStatus status, Double score, String scoreList);
+
     void updateSubjectiveStatusAndScore(Long examId, String paperNumber, SubjectiveStatus status, double score, String scoreList);
 
     ScanExamInfoVo getScanExamInfo(BasicExam exam);
@@ -55,9 +57,9 @@ public interface MarkStudentService extends IService<MarkStudent> {
     MarkStudent findByExamIdAndCoursePaperIdAndStudentCode(Long examId, String coursePaperId, String studentCode);
 
 
-    StudentObjectiveDetailDto getCheckObjectiveTask(Long studentId);
+    StudentObjectiveDetailDto getObjectiveInspectedTask(Long studentId);
 
-    Boolean saveCheckObjectiveTask(Long studentId, String answers);
+    Boolean saveObjectiveInspectedTask(Long studentId, String answers);
 
     int countUploadedByExamIdAndPaperNumber(Long examId, String paperNumber);
 
@@ -69,27 +71,31 @@ public interface MarkStudentService extends IService<MarkStudent> {
 
     boolean saveUploadStudent(MarkStudent student);
 
-	void updateStudentAndPaper(SysUser user, Long studentId, List<ScanStudentPaper> studentPaperList);
+    void updateStudentAndPaper(SysUser user, Long studentId, List<ScanStudentPaper> studentPaperList);
 
-	StudentVo findOne(StudentQuery query);
+    StudentVo findOne(StudentQuery query);
 
     int countByExamIdAndSecretNumber(Long examId, String secretNumber);
 
     List<MarkStudent> listByExamIdAndCoursePaperId(Long examId, String coursePaperId);
 
-	IPage<AnswerQueryVo> query(AnswerQueryDomain query);
+    IPage<AnswerQueryVo> query(AnswerQueryDomain query);
 
-	List<String> summary(AnswerQueryDomain query);
+    List<String> summary(AnswerQueryDomain query);
 
-	UpdateTimeVo omrEdit(Long userId,OmrEditDomain domain);
+    UpdateTimeVo omrEdit(Long userId, OmrEditDomain domain);
 
-	MarkStudent findByExamIdAndStudentCode(Long examId, String studentCode);
+    MarkStudent findByExamIdAndStudentCode(Long examId, String studentCode);
 
     long countStudentCountByExamIdAndPaperNumber(Long examId, String paperNumber, String paperType);
 
-	AbsentManualUpdateVo absentManualUpdate(Long examId, String coursePaperId, String studentCode);
+    AbsentManualUpdateVo absentManualUpdate(Long examId, String coursePaperId, String studentCode);
 
-	UpdateTimeVo confirm(Long examId, String coursePaperId, String studentCode, Boolean omrAbsent);
+    UpdateTimeVo confirm(Long examId, String coursePaperId, String studentCode, Boolean omrAbsent);
 
     List<Long> findIdByExamIdAndPaperNumberAndSubjectiveStatus(Long examId, String paperNumber, SubjectiveStatus unmark, SubjectiveStatus marked);
+
+    Task getSubjectiveInspectedTask(Long studentId);
+
+    void saveSubjectiveInspectedTask(MarkResult markResult);
 }

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

@@ -150,7 +150,7 @@ public class MarkArbitrateHistoryServiceImpl extends ServiceImpl<MarkArbitrateHi
     @Override
     public void saveArbitrateTask(MarkResult markResult) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        MarkArbitrateHistory markArbitrateHistory = this.getById(markResult.getLibraryId());
+        MarkArbitrateHistory markArbitrateHistory = this.getById(markResult.getTaskId());
         if (markArbitrateHistory != null) {
             try {
                 lockService.watch(LockType.EXAM_SUBJECT, markArbitrateHistory.getExamId(), markArbitrateHistory.getPaperNumber());

+ 50 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -1,6 +1,7 @@
 package com.qmth.teachcloud.mark.service.impl;
 
 import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.mark.*;
 import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
 import com.qmth.teachcloud.mark.dto.mark.mark.MarkGroupDto;
@@ -246,7 +247,7 @@ public class MarkServiceImpl implements MarkService {
      */
     @Override
     public void processArbitrate(MarkResult markResult, Long userId) {
-        MarkArbitrateHistory markArbitrateHistory = markArbitrateHistoryService.getById(markResult.getLibraryId());
+        MarkArbitrateHistory markArbitrateHistory = markArbitrateHistoryService.getById(markResult.getTaskId());
         markArbitrateHistory.setUpdateUserId(userId);
         markArbitrateHistory.setTotalScore(markResult.isUnselective() ? UN_SELECTIVE_SCORE : markResult.getMarkerScore());
         markArbitrateHistory.setScoreList(markResult.isUnselective() ? null : markResult.getScoreList());
@@ -745,4 +746,52 @@ public class MarkServiceImpl implements MarkService {
         taskLock.clear();
     }
 
+    @Override
+    public void releaseByStudent(MarkStudent student) {
+        TaskLock taskLock = TaskLockUtil.getInspectedStudentTask(getKey(student));
+        taskLock.remove(student.getId(), 1);
+    }
+
+    @Override
+    public boolean applyStudent(MarkStudent student, Long userId) {
+        TaskLock taskLock = TaskLockUtil.getInspectedStudentTask(getKey(student));
+        boolean lock = taskLock.add(student.getId(), 1, userId);
+        // 上锁失败直接返回
+        if (!lock) {
+            return false;
+        }
+        // 重复校验任务状态
+        if (student.getSubjectiveStatus().equals(SubjectiveStatus.MARKED)) {
+            return true;
+        } else {
+            taskLock.remove(student.getId(), 1, userId);
+            return false;
+        }
+    }
+
+    @Override
+    public void submitHeaderTask(MarkResult markResult, MarkUserGroup markUserGroup) {
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(markUserGroup.getExamId(), markUserGroup.getPaperNumber());
+        // 评卷是否结束
+        if (markPaper == null || markPaper.getStatus() == MarkPaperStatus.FINISH
+                || !markPaper.getStatus().toString().equals(markResult.getStatusValue())) {
+            throw ExceptionResultEnum.ERROR.exception("打分失败");
+        }
+        Long currentTime = System.currentTimeMillis();
+        // 问题卷
+        if (markResult.getTrackList() != null) {
+            markHeaderTrackService.deleteByExamIdAndPaperNumberAndGroupNumberAndStudentId(markUserGroup.getExamId(), markUserGroup.getPaperNumber(), markUserGroup.getGroupNumber(), markResult.getStudentId());
+            List<MarkHeaderTrack> tracks = markResult.getTrackList(markResult, markUserGroup);
+            for (MarkHeaderTrack t : tracks) {
+                markHeaderTrackService.saveOrUpdate(t);
+            }
+        }
+        markTaskService.updateHeaderResult(markUserGroup.getExamId(), markUserGroup.getPaperNumber(), markUserGroup.getGroupNumber(), markResult.getStudentId(), markUserGroup.getUserId(), markResult.getMarkerScore(), markResult.getScoreList(), currentTime, MarkTaskStatus.MARKED);
+        updateMarkedCount(markUserGroup.getExamId(), markUserGroup.getPaperNumber(), markUserGroup.getGroupNumber());
+        checkStudentGroup(markResult.getStudentId(), markGroupService.getByExamIdAndPaperNumberAndGroupNumber(markUserGroup.getExamId(), markUserGroup.getPaperNumber(), markUserGroup.getGroupNumber()));
+    }
+
+    private String getKey(MarkStudent student) {
+        return student.getExamId() + "_" + student.getPaperNumber();
+    }
 }

+ 59 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -17,6 +17,7 @@ import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
 import com.qmth.teachcloud.common.enums.scan.ConditionType;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
+import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.bean.UpdateTimeVo;
 import com.qmth.teachcloud.mark.bean.omredit.OmrEditDomain;
 import com.qmth.teachcloud.mark.bean.omredit.OmrEditPaper;
@@ -28,12 +29,15 @@ import com.qmth.teachcloud.mark.bean.student.AbsentManualUpdateVo;
 import com.qmth.teachcloud.mark.bean.student.StudentQuery;
 import com.qmth.teachcloud.mark.bean.student.StudentVo;
 import com.qmth.teachcloud.mark.dto.mark.ScoreInfo;
+import com.qmth.teachcloud.mark.dto.mark.manage.Task;
 import com.qmth.teachcloud.mark.dto.mark.score.*;
 import com.qmth.teachcloud.mark.entity.*;
 import com.qmth.teachcloud.mark.enums.ExamStatus;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
+import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.mapper.MarkStudentMapper;
+import com.qmth.teachcloud.mark.params.MarkResult;
 import com.qmth.teachcloud.mark.service.*;
 import com.qmth.teachcloud.mark.utils.BatchGetDataUtil;
 import com.qmth.teachcloud.mark.utils.ScoreCalculateUtil;
@@ -82,6 +86,14 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     private TeachcloudCommonService teachcloudCommonService;
     @Autowired
     private ConcurrentService concurrentService;
+    @Resource
+    private MarkService markService;
+    @Resource
+    private LockService lockService;
+    @Resource
+    private TaskService taskService;
+    @Resource
+    private MarkUserGroupService markUserGroupService;
 
 
     @Override
@@ -277,7 +289,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     }
 
     @Override
-    public StudentObjectiveDetailDto getCheckObjectiveTask(Long studentId) {
+    public StudentObjectiveDetailDto getObjectiveInspectedTask(Long studentId) {
         MarkStudent markStudent = this.getById(studentId);
         StudentObjectiveDetailDto studentObjectiveDetailDto = new StudentObjectiveDetailDto();
         if (markStudent != null) {
@@ -328,7 +340,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     }
 
     @Override
-    public Boolean saveCheckObjectiveTask(Long studentId, String answers) {
+    public Boolean saveObjectiveInspectedTask(Long studentId, String answers) {
         MarkStudent student = this.getById(studentId);
         answers = StringUtils.trimToEmpty(answers);
         if (student != null) {
@@ -665,4 +677,49 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     public List<Long> findIdByExamIdAndPaperNumberAndSubjectiveStatus(Long examId, String paperNumber, SubjectiveStatus unmark, SubjectiveStatus marked) {
         return this.baseMapper.findIdByExamIdAndPaperNumberAndSubjectiveStatus(examId, paperNumber, unmark.name(), marked.name());
     }
+
+    @Override
+    public Task getSubjectiveInspectedTask(Long studentId) {
+        Task task = null;
+        if (studentId != null) {
+            SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+            MarkStudent markStudent = this.getById(studentId);
+            releaseStudent(markStudent);
+            if (markService.applyStudent(markStudent, sysUser.getId())) {
+                task = taskService.build(studentId);
+            }
+        }
+        return task;
+    }
+
+    @Override
+    public void saveSubjectiveInspectedTask(MarkResult markResult) {
+        boolean success = false;
+        MarkUserGroup markUserGroup = markUserGroupService.getById(markResult.getMarkUserGroupId());
+        try {
+            lockService.watch(LockType.EXAM_SUBJECT, markUserGroup.getExamId(), markUserGroup.getPaperNumber());
+            lockService.watch(LockType.GROUP, markUserGroup.getExamId(), markUserGroup.getPaperNumber(), markUserGroup.getGroupNumber());
+            lockService.watch(LockType.MARK_USER_GROUP, markUserGroup.getId());
+            lockService.waitlock(LockType.STUDENT, markResult.getStudentId());
+            markService.submitHeaderTask(markResult, markUserGroup);
+        } catch (Exception e) {
+            log.error("save task error", e);
+        } finally {
+            lockService.unlock(LockType.STUDENT, markResult.getStudentId());
+            lockService.unwatch(LockType.MARK_USER_GROUP, markUserGroup.getId());
+            lockService.unwatch(LockType.GROUP, markUserGroup.getExamId(), markUserGroup.getPaperNumber(), markUserGroup.getGroupNumber());
+            lockService.unwatch(LockType.EXAM_SUBJECT, markUserGroup.getExamId(), markUserGroup.getPaperNumber());
+        }
+    }
+
+    private void releaseStudent(MarkStudent markStudent) {
+        try {
+            lockService.waitlock(LockType.STUDENT, markStudent.getId());
+            markService.releaseByStudent(markStudent);
+        } catch (Exception e) {
+            log.error("release user error", e);
+        } finally {
+            lockService.unlock(LockType.STUDENT, markStudent.getId());
+        }
+    }
 }

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

@@ -43,7 +43,7 @@ public class TaskServiceImpl implements TaskService {
         MarkStudent markStudent = markStudentService.getById(markArbitrateHistory.getStudentId());
         Task task = new Task();
         task.setStudentId(markArbitrateHistory.getStudentId());
-        task.setLibraryId(markArbitrateHistory.getId());
+        task.setTaskId(markArbitrateHistory.getId());
         task.setSecretNumber(markArbitrateHistory.getSecretNumber());
         task.setQuestionList(buildArbitrateStep(markGroup, markArbitrateHistory));
 //        task.setSpecialTagList(getHeaderTagList(history.getStudentId(), group.getNumber()));

+ 11 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/utils/TaskLockUtil.java

@@ -10,6 +10,7 @@ public class TaskLockUtil {
 
     // 识别对照任务并发处理互斥锁
     private static final Map<String, TaskLock> omrTaskMap = new HashMap<>();
+    private static final Map<String, TaskLock> inspectedStudentMap = new HashMap<>();
 
 
     public static void clearTimeoutTask(long timeoutMinute) {
@@ -40,4 +41,14 @@ public class TaskLockUtil {
         }
         return taskLock;
     }
+
+    public static TaskLock getInspectedStudentTask(String key) {
+        TaskLock taskLock = inspectedStudentMap.get(key);
+        if (taskLock == null) {
+            synchronized (inspectedStudentMap) {
+                taskLock = inspectedStudentMap.computeIfAbsent(key, k -> new TaskLock());
+            }
+        }
+        return taskLock;
+    }
 }