Răsfoiți Sursa

线下做的答题卡,下载轨迹图片后,希望在评卷区的右上角显示每个分组的得分

wangliang 3 luni în urmă
părinte
comite
e8ff4ffa06

+ 9 - 1
distributed-print/install/mysql/upgrade/3.4.2.sql

@@ -209,4 +209,12 @@ CREATE INDEX t_c_final_score_culture_program_id_IDX USING BTREE ON t_c_final_sco
 
 CREATE INDEX t_c_usual_score_culture_program_id_IDX USING BTREE ON t_c_usual_score (culture_program_id,exam_id,course_id,paper_number);
 
-CREATE INDEX t_r_basic_info_program_id_IDX USING BTREE ON t_r_basic_info (culture_program_id,exam_id,course_id,paper_number);
+CREATE INDEX t_r_basic_info_program_id_IDX USING BTREE ON t_r_basic_info (culture_program_id,exam_id,course_id,paper_number);
+
+-- 2025-03-13
+INSERT INTO sys_privilege
+(id, name, url, parent_id, `type`, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(1300, '获取评卷区', '/api/admin/mark/inspected/get_mark_area', 946, 'URL', 9, 'AUTH', NULL, 1, 1, 1);
+UPDATE sys_privilege
+SET name='成绩检查', url='ScoreCheck', `type`='MENU', parent_id=486, `sequence`=4, property='AUTH', related='1300', enable=1, default_auth=0, front_display=1
+WHERE id=946;

+ 100 - 108
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkInspectedController.java

@@ -1,108 +1,100 @@
-package com.qmth.distributed.print.api.mark;
-
-
-import com.qmth.boot.api.annotation.Aac;
-import com.qmth.boot.api.constant.ApiConstant;
-import com.qmth.teachcloud.common.annotation.OperationLogDetail;
-import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.enums.log.OperationTypeEnum;
-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.SettingDto;
-import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveDetailDto;
-import com.qmth.teachcloud.mark.params.MarkHeaderResult;
-import com.qmth.teachcloud.mark.params.MarkResult;
-import com.qmth.teachcloud.mark.service.MarkPaperService;
-import com.qmth.teachcloud.mark.service.MarkStudentService;
-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;
-
-/**
- * <p>
- * 评卷任务检查 前端控制器
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-@Api(tags = "评卷-评卷任务检查")
-@RestController
-@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_MARK + "/inspected")
-public class MarkInspectedController extends BaseController{
-
-    @Resource
-    private MarkStudentService markStudentService;
-    @Resource
-    private MarkPaperService markPaperService;
-
-    /**
-     * 配置获取
-     */
-    @ApiOperation(value = "配置获取")
-    @RequestMapping(value = "/getSetting", method = RequestMethod.POST)
-    public Result getSetting(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
-                             @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
-        SettingDto settingDto = markPaperService.getSetting(examId, paperNumber);
-        return ResultUtil.ok(settingDto);
-    }
-
-    /**
-     * 客观题检查任务获取
-     */
-    @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)
-    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "保存客观题检查任务操作,考生ID:{{studentId}}")
-    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));
-    }
-
-    /**
-     * 主观题检查任务获取
-     */
-    @Aac(auth = false)
-    @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);
-        validMarkPaperForInspect(task.getExamId(), task.getPaperNumber());
-        return ResultUtil.ok(task);
-    }
-
-    /**
-     * 主观题检查任务保存
-     */
-    @ApiOperation(value = "主观题检查任务保存")
-    @RequestMapping(value = "/subjective/saveTask", method = RequestMethod.POST)
-    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "保存主观题检查任务操作,考生ID:{{markResult.studentId}}")
-    public Result saveSubjectiveInspectedTask(@RequestBody MarkHeaderResult markResult) {
-        markStudentService.saveSubjectiveInspectedTask(markResult);
-        return ResultUtil.ok(true);
-    }
-
-    /**
-     * 主观题检查任务确认
-     */
-    @ApiOperation(value = "主观题检查任务保存")
-    @RequestMapping(value = "/subjective/confirmTask", method = RequestMethod.POST)
-    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "确认主观题检查任务操作,考生ID:{{studentId}}")
-    public Result confirmSubjectiveInspectedTask(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId) {
-        markStudentService.confirmSubjectiveInspectedTask(studentId);
-        return ResultUtil.ok(true);
-    }
-}
+package com.qmth.distributed.print.api.mark;
+
+
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.teachcloud.common.annotation.OperationLogDetail;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.enums.log.OperationTypeEnum;
+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.SettingDto;
+import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveDetailDto;
+import com.qmth.teachcloud.mark.params.MarkHeaderResult;
+import com.qmth.teachcloud.mark.service.MarkPaperService;
+import com.qmth.teachcloud.mark.service.MarkStudentService;
+import com.qmth.teachcloud.mark.service.MarkSubjectiveScoreService;
+import io.swagger.annotations.*;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 评卷任务检查 前端控制器
+ * </p>
+ *
+ * @author xf
+ * @since 2023-09-22
+ */
+@Api(tags = "评卷-评卷任务检查")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_MARK + "/inspected")
+public class MarkInspectedController extends BaseController {
+
+    @Resource
+    private MarkStudentService markStudentService;
+
+    @Resource
+    private MarkPaperService markPaperService;
+
+    @Resource
+    MarkSubjectiveScoreService markSubjectiveScoreService;
+
+    @ApiOperation(value = "配置获取")
+    @RequestMapping(value = "/getSetting", method = RequestMethod.POST)
+    public Result getSetting(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                             @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
+        SettingDto settingDto = markPaperService.getSetting(examId, paperNumber);
+        return ResultUtil.ok(settingDto);
+    }
+
+    @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)
+    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "保存客观题检查任务操作,考生ID:{{studentId}}")
+    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));
+    }
+
+    @Aac(auth = false)
+    @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);
+        validMarkPaperForInspect(task.getExamId(), task.getPaperNumber());
+        return ResultUtil.ok(task);
+    }
+
+    @ApiOperation(value = "主观题检查任务保存")
+    @RequestMapping(value = "/subjective/saveTask", method = RequestMethod.POST)
+    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "保存主观题检查任务操作,考生ID:{{markResult.studentId}}")
+    public Result saveSubjectiveInspectedTask(@RequestBody MarkHeaderResult markResult) {
+        markStudentService.saveSubjectiveInspectedTask(markResult);
+        return ResultUtil.ok(true);
+    }
+
+    @ApiOperation(value = "主观题检查任务保存")
+    @RequestMapping(value = "/subjective/confirmTask", method = RequestMethod.POST)
+    @OperationLogDetail(operationType = OperationTypeEnum.UPDATE, detail = "确认主观题检查任务操作,考生ID:{{studentId}}")
+    public Result confirmSubjectiveInspectedTask(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId) {
+        markStudentService.confirmSubjectiveInspectedTask(studentId);
+        return ResultUtil.ok(true);
+    }
+
+    @ApiOperation(value = "获取评卷区")
+    @RequestMapping(value = "/get_mark_area", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "评卷区查询", response = EditResult.class)})
+    public Result getMarkArea(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId) {
+        return ResultUtil.ok(markSubjectiveScoreService.findMarkArea(studentId));
+    }
+}

+ 92 - 94
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkTrackController.java

@@ -1,94 +1,92 @@
-package com.qmth.distributed.print.api.mark;
-
-
-import javax.annotation.Resource;
-
-import com.qmth.teachcloud.mark.enums.CardSource;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.qmth.boot.api.constant.ApiConstant;
-import com.qmth.distributed.print.business.entity.ExamCard;
-import com.qmth.distributed.print.business.service.ExamCardService;
-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.entity.MarkStudent;
-import com.qmth.teachcloud.mark.entity.ScanAnswerCard;
-import com.qmth.teachcloud.mark.service.MarkStudentService;
-import com.qmth.teachcloud.mark.service.MarkTrackService;
-import com.qmth.teachcloud.mark.service.ScanAnswerCardService;
-import com.qmth.teachcloud.mark.service.TaskService;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-
-import java.util.List;
-
-/**
- * <p>
- * 轨迹给分表 前端控制器
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-@Api(tags = "评卷-评卷轨迹")
-@RestController
-@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_MARK + "/track")
-public class MarkTrackController {
-    @Resource
-    private TaskService taskService;
-    @Resource
-    private ExamCardService examCardService;
-    @Resource
-    private MarkStudentService markStudentService;
-    @Resource
-    private ScanAnswerCardService scanAnswerCardService;
-
-
-    /**
-     * 轨迹图
-     */
-    @ApiOperation(value = "轨迹图")
-    @RequestMapping(value = "/getTask", method = RequestMethod.POST)
-    public Result listStudentScore(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId) {
-        Task task = taskService.build(studentId);
-        return ResultUtil.ok(task);
-    }
-
-    @ApiOperation(value = "考生扫描的电子卡格式")
-    @RequestMapping(value = "/getCard", method = RequestMethod.POST)
-    public Result getCard(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId) {
-        MarkStudent student = markStudentService.getById(studentId);
-        if (student.getCardNumber() != null) {
-            ScanAnswerCard scanAnswerCard = scanAnswerCardService.findByExamAndNumber(student.getExamId(), student.getCardNumber());
-            if (scanAnswerCard != null) {
-                if (StringUtils.isNotBlank(scanAnswerCard.getContent())) {
-                    ExamCard examCard = new ExamCard();
-                    examCard.setContent(scanAnswerCard.getContent());
-                    return ResultUtil.ok(examCard);
-                } else {
-                    // 自定义卡格式,取电子卡格式的cardId
-                    if (scanAnswerCard.getCardId() == null) {
-                        List<ScanAnswerCard> scanAnswerCardList = scanAnswerCardService.listByExamIdAndCoursePaperIdAndSource(scanAnswerCard.getExamId(), scanAnswerCard.getCoursePaperId(), CardSource.WEB);
-                        if (CollectionUtils.isNotEmpty(scanAnswerCardList)) {
-                            return ResultUtil.ok(examCardService.getById(scanAnswerCardList.get(0).getCardId()));
-                        }
-                    } else {
-                        return ResultUtil.ok(examCardService.getById(scanAnswerCard.getCardId()));
-                    }
-
-                }
-            }
-        }
-        return ResultUtil.ok();
-    }
-
-}
+package com.qmth.distributed.print.api.mark;
+
+
+import javax.annotation.Resource;
+
+import com.qmth.teachcloud.mark.enums.CardSource;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.entity.ExamCard;
+import com.qmth.distributed.print.business.service.ExamCardService;
+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.entity.MarkStudent;
+import com.qmth.teachcloud.mark.entity.ScanAnswerCard;
+import com.qmth.teachcloud.mark.service.MarkStudentService;
+import com.qmth.teachcloud.mark.service.MarkTrackService;
+import com.qmth.teachcloud.mark.service.ScanAnswerCardService;
+import com.qmth.teachcloud.mark.service.TaskService;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 轨迹给分表 前端控制器
+ * </p>
+ *
+ * @author xf
+ * @since 2023-09-22
+ */
+@Api(tags = "评卷-评卷轨迹")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_MARK + "/track")
+public class MarkTrackController {
+
+    @Resource
+    private TaskService taskService;
+
+    @Resource
+    private ExamCardService examCardService;
+
+    @Resource
+    private MarkStudentService markStudentService;
+
+    @Resource
+    private ScanAnswerCardService scanAnswerCardService;
+
+    @ApiOperation(value = "轨迹图")
+    @RequestMapping(value = "/getTask", method = RequestMethod.POST)
+    public Result listStudentScore(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId) {
+        Task task = taskService.build(studentId);
+        return ResultUtil.ok(task);
+    }
+
+    @ApiOperation(value = "考生扫描的电子卡格式")
+    @RequestMapping(value = "/getCard", method = RequestMethod.POST)
+    public Result getCard(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId) {
+        MarkStudent student = markStudentService.getById(studentId);
+        if (student.getCardNumber() != null) {
+            ScanAnswerCard scanAnswerCard = scanAnswerCardService.findByExamAndNumber(student.getExamId(), student.getCardNumber());
+            if (scanAnswerCard != null) {
+                if (StringUtils.isNotBlank(scanAnswerCard.getContent())) {
+                    ExamCard examCard = new ExamCard();
+                    examCard.setContent(scanAnswerCard.getContent());
+                    return ResultUtil.ok(examCard);
+                } else {
+                    // 自定义卡格式,取电子卡格式的cardId
+                    if (scanAnswerCard.getCardId() == null) {
+                        List<ScanAnswerCard> scanAnswerCardList = scanAnswerCardService.listByExamIdAndCoursePaperIdAndSource(scanAnswerCard.getExamId(), scanAnswerCard.getCoursePaperId(), CardSource.WEB);
+                        if (CollectionUtils.isNotEmpty(scanAnswerCardList)) {
+                            return ResultUtil.ok(examCardService.getById(scanAnswerCardList.get(0).getCardId()));
+                        }
+                    } else {
+                        return ResultUtil.ok(examCardService.getById(scanAnswerCard.getCardId()));
+                    }
+                }
+            }
+        }
+        return ResultUtil.ok();
+    }
+}

+ 70 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/dto/MarkAreaDto.java

@@ -0,0 +1,70 @@
+package com.qmth.teachcloud.mark.bean.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 评卷区dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2025/3/13
+ */
+public class MarkAreaDto implements Serializable {
+
+    @ApiModelProperty(value = "题目标题")
+    private String title;
+
+    @ApiModelProperty(value = "大题号")
+    private Integer mainNumber;
+
+    @ApiModelProperty(value = "小题号")
+    private Integer subNumber;
+
+    @ApiModelProperty(value = "得分")
+    private Double score;
+
+    @ApiModelProperty(value = "评卷区")
+    private String picList;
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
+    public String getPicList() {
+        return picList;
+    }
+
+    public void setPicList(String picList) {
+        this.picList = picList;
+    }
+}

+ 24 - 22
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkSubjectiveScoreMapper.java

@@ -1,22 +1,24 @@
-package com.qmth.teachcloud.mark.mapper;
-
-import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
-import com.qmth.teachcloud.mark.bean.archivescore.QuestionVo;
-import com.qmth.teachcloud.mark.entity.MarkSubjectiveScore;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-/**
- * <p>
- * 主观题得分明细表 Mapper 接口
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-public interface MarkSubjectiveScoreMapper extends MppBaseMapper<MarkSubjectiveScore> {
-
-	List<QuestionVo> getSubjectiveVo(@Param("studentIds")List<Long> studentIds);
-
-}
+package com.qmth.teachcloud.mark.mapper;
+
+import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
+import com.qmth.teachcloud.mark.bean.archivescore.QuestionVo;
+import com.qmth.teachcloud.mark.bean.dto.MarkAreaDto;
+import com.qmth.teachcloud.mark.entity.MarkSubjectiveScore;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 主观题得分明细表 Mapper 接口
+ * </p>
+ *
+ * @author xf
+ * @since 2023-09-22
+ */
+public interface MarkSubjectiveScoreMapper extends MppBaseMapper<MarkSubjectiveScore> {
+
+	List<QuestionVo> getSubjectiveVo(@Param("studentIds")List<Long> studentIds);
+
+    List<MarkAreaDto> findMarkArea(@Param("studentId") Long studentId);
+}

+ 44 - 35
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkSubjectiveScoreService.java

@@ -1,35 +1,44 @@
-package com.qmth.teachcloud.mark.service;
-
-import java.util.List;
-import java.util.Set;
-
-import com.github.jeffreyning.mybatisplus.service.IMppService;
-import com.qmth.teachcloud.mark.bean.archivescore.QuestionVo;
-import com.qmth.teachcloud.mark.entity.MarkSubjectiveScore;
-
-/**
- * <p>
- * 主观题得分明细表 服务类
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-public interface MarkSubjectiveScoreService extends IMppService<MarkSubjectiveScore> {
-
-    List<MarkSubjectiveScore> listByStudentIdAndGroupNumber(Long studentId, Integer groupNumber);
-
-    Set<Integer> listMainNumberByStudentIdAndUncalculate(Long studentId, boolean uncalculate);
-
-    List<MarkSubjectiveScore> listByStudentIdAndUncalculate(Long studentId, boolean uncalculate);
-
-    void deleteByStudentId(Long studentId);
-
-    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
-
-	List<QuestionVo> getSubjectiveVo(List<Long> studentIds);
-	
-	  List<MarkSubjectiveScore> listByStudentId(Long studentId);
-
-    void updateRejected(Long studentId, Integer groupNumber, boolean rejectd);
-}
+package com.qmth.teachcloud.mark.service;
+
+import com.github.jeffreyning.mybatisplus.service.IMppService;
+import com.qmth.teachcloud.mark.bean.archivescore.QuestionVo;
+import com.qmth.teachcloud.mark.bean.dto.MarkAreaDto;
+import com.qmth.teachcloud.mark.entity.MarkSubjectiveScore;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <p>
+ * 主观题得分明细表 服务类
+ * </p>
+ *
+ * @author xf
+ * @since 2023-09-22
+ */
+public interface MarkSubjectiveScoreService extends IMppService<MarkSubjectiveScore> {
+
+    List<MarkSubjectiveScore> listByStudentIdAndGroupNumber(Long studentId, Integer groupNumber);
+
+    Set<Integer> listMainNumberByStudentIdAndUncalculate(Long studentId, boolean uncalculate);
+
+    List<MarkSubjectiveScore> listByStudentIdAndUncalculate(Long studentId, boolean uncalculate);
+
+    void deleteByStudentId(Long studentId);
+
+    void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
+
+    List<QuestionVo> getSubjectiveVo(List<Long> studentIds);
+
+    List<MarkSubjectiveScore> listByStudentId(Long studentId);
+
+    void updateRejected(Long studentId, Integer groupNumber, boolean rejectd);
+
+    /**
+     * 根据学生id查找评卷区
+     *
+     * @param studentId
+     * @return
+     */
+    List<MarkAreaDto> findMarkArea(Long studentId);
+}

+ 137 - 127
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSubjectiveScoreServiceImpl.java

@@ -1,127 +1,137 @@
-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.github.jeffreyning.mybatisplus.service.MppServiceImpl;
-import com.qmth.teachcloud.mark.bean.archivescore.QuestionVo;
-import com.qmth.teachcloud.mark.entity.MarkSubjectiveScore;
-import com.qmth.teachcloud.mark.mapper.MarkSubjectiveScoreMapper;
-import com.qmth.teachcloud.mark.service.MarkSubjectiveScoreService;
-import org.apache.commons.collections4.CollectionUtils;
-import org.springframework.stereotype.Service;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * <p>
- * 主观题得分明细表 服务实现类
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-@Service
-public class MarkSubjectiveScoreServiceImpl extends MppServiceImpl<MarkSubjectiveScoreMapper, MarkSubjectiveScore> implements MarkSubjectiveScoreService {
-
-    @Override
-    public List<MarkSubjectiveScore> listByStudentIdAndGroupNumber(Long studentId, Integer groupNumber) {
-        QueryWrapper<MarkSubjectiveScore> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId)
-                .orderByAsc(MarkSubjectiveScore::getMainNumber)
-                .orderByAsc(MarkSubjectiveScore::getSubNumber);
-        if (groupNumber != null) {
-            queryWrapper.lambda().eq(MarkSubjectiveScore::getGroupNumber, groupNumber);
-        }
-
-        List<MarkSubjectiveScore> list = this.list(queryWrapper);
-//        sort(list);
-        return list;
-    }
-
-    @Override
-    public Set<Integer> listMainNumberByStudentIdAndUncalculate(Long studentId, boolean uncalculate) {
-        Set<Integer> mainNumbers = new HashSet<Integer>();
-        List<MarkSubjectiveScore> list = this.listByStudentIdAndUncalculate(studentId, uncalculate);
-        for (MarkSubjectiveScore subjectiveScore : list) {
-            mainNumbers.add(subjectiveScore.getMainNumber());
-        }
-        return mainNumbers;
-    }
-
-    @Override
-    public List<MarkSubjectiveScore> listByStudentIdAndUncalculate(Long studentId, boolean uncalculate) {
-        QueryWrapper<MarkSubjectiveScore> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId)
-                .eq(MarkSubjectiveScore::getUncalculate, uncalculate)
-                .orderByAsc(MarkSubjectiveScore::getMainNumber)
-                .orderByAsc(MarkSubjectiveScore::getSubNumber);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public void deleteByStudentId(Long studentId) {
-        UpdateWrapper<MarkSubjectiveScore> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId);
-        this.remove(updateWrapper);
-    }
-
-    @Override
-    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
-        UpdateWrapper<MarkSubjectiveScore> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().eq(MarkSubjectiveScore::getExamId, examId)
-                .eq(MarkSubjectiveScore::getPaperNumber, paperNumber)
-                .eq(MarkSubjectiveScore::getGroupNumber, groupNumber);
-        this.remove(updateWrapper);
-    }
-
-//    private void sort(List<MarkSubjectiveScore> list) {
-//        list.sort((o1, o2) -> {
-//            int i = o1.getMainNumber() - o2.getMainNumber();
-//            if (i == 0) {
-//                if (o1.getSubNumber().contains("-")) {
-//                    String[] o1s = o1.getSubNumber().split("-");
-//                    String[] o2s = o2.getSubNumber().split("-");
-//                    int j = Integer.parseUnsignedInt(o1s[0]) - Integer.parseUnsignedInt(o2s[0]);
-//                    if (j == 0) {
-//                        return Integer.parseUnsignedInt(o1s[1]) - Integer.parseUnsignedInt(o2s[1]);
-//                    } else {
-//                        return j;
-//                    }
-//                } else {
-//                    return Integer.parseUnsignedInt(o1.getSubNumber()) - Integer.parseUnsignedInt(o2.getSubNumber());
-//                }
-//            }
-//            return i;
-//        });
-//    }
-
-    @Override
-    public List<QuestionVo> getSubjectiveVo(List<Long> studentIds) {
-        if (CollectionUtils.isEmpty(studentIds)) {
-            return null;
-        }
-        return this.baseMapper.getSubjectiveVo(studentIds);
-    }
-
-    @Override
-    public List<MarkSubjectiveScore> listByStudentId(Long studentId) {
-        QueryWrapper<MarkSubjectiveScore> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId).orderByAsc(MarkSubjectiveScore::getMainNumber)
-                .orderByAsc(MarkSubjectiveScore::getSubNumber);
-        ;
-        List<MarkSubjectiveScore> list = this.list(queryWrapper);
-        return list;
-    }
-
-    @Override
-    public void updateRejected(Long studentId, Integer groupNumber, boolean rejectd) {
-        UpdateWrapper<MarkSubjectiveScore> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkSubjectiveScore::getRejected, rejectd)
-                .eq(MarkSubjectiveScore::getStudentId, studentId)
-                .eq(MarkSubjectiveScore::getGroupNumber, groupNumber);
-        this.update(updateWrapper);
-    }
-
-}
+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.github.jeffreyning.mybatisplus.service.MppServiceImpl;
+import com.qmth.teachcloud.mark.bean.archivescore.QuestionVo;
+import com.qmth.teachcloud.mark.bean.dto.MarkAreaDto;
+import com.qmth.teachcloud.mark.entity.MarkSubjectiveScore;
+import com.qmth.teachcloud.mark.mapper.MarkSubjectiveScoreMapper;
+import com.qmth.teachcloud.mark.service.MarkSubjectiveScoreService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <p>
+ * 主观题得分明细表 服务实现类
+ * </p>
+ *
+ * @author xf
+ * @since 2023-09-22
+ */
+@Service
+public class MarkSubjectiveScoreServiceImpl extends MppServiceImpl<MarkSubjectiveScoreMapper, MarkSubjectiveScore> implements MarkSubjectiveScoreService {
+
+    @Override
+    public List<MarkSubjectiveScore> listByStudentIdAndGroupNumber(Long studentId, Integer groupNumber) {
+        QueryWrapper<MarkSubjectiveScore> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId)
+                .orderByAsc(MarkSubjectiveScore::getMainNumber)
+                .orderByAsc(MarkSubjectiveScore::getSubNumber);
+        if (groupNumber != null) {
+            queryWrapper.lambda().eq(MarkSubjectiveScore::getGroupNumber, groupNumber);
+        }
+
+        List<MarkSubjectiveScore> list = this.list(queryWrapper);
+//        sort(list);
+        return list;
+    }
+
+    @Override
+    public Set<Integer> listMainNumberByStudentIdAndUncalculate(Long studentId, boolean uncalculate) {
+        Set<Integer> mainNumbers = new HashSet<Integer>();
+        List<MarkSubjectiveScore> list = this.listByStudentIdAndUncalculate(studentId, uncalculate);
+        for (MarkSubjectiveScore subjectiveScore : list) {
+            mainNumbers.add(subjectiveScore.getMainNumber());
+        }
+        return mainNumbers;
+    }
+
+    @Override
+    public List<MarkSubjectiveScore> listByStudentIdAndUncalculate(Long studentId, boolean uncalculate) {
+        QueryWrapper<MarkSubjectiveScore> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId)
+                .eq(MarkSubjectiveScore::getUncalculate, uncalculate)
+                .orderByAsc(MarkSubjectiveScore::getMainNumber)
+                .orderByAsc(MarkSubjectiveScore::getSubNumber);
+        return this.list(queryWrapper);
+    }
+
+    @Override
+    public void deleteByStudentId(Long studentId) {
+        UpdateWrapper<MarkSubjectiveScore> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId);
+        this.remove(updateWrapper);
+    }
+
+    @Override
+    public void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber) {
+        UpdateWrapper<MarkSubjectiveScore> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkSubjectiveScore::getExamId, examId)
+                .eq(MarkSubjectiveScore::getPaperNumber, paperNumber)
+                .eq(MarkSubjectiveScore::getGroupNumber, groupNumber);
+        this.remove(updateWrapper);
+    }
+
+//    private void sort(List<MarkSubjectiveScore> list) {
+//        list.sort((o1, o2) -> {
+//            int i = o1.getMainNumber() - o2.getMainNumber();
+//            if (i == 0) {
+//                if (o1.getSubNumber().contains("-")) {
+//                    String[] o1s = o1.getSubNumber().split("-");
+//                    String[] o2s = o2.getSubNumber().split("-");
+//                    int j = Integer.parseUnsignedInt(o1s[0]) - Integer.parseUnsignedInt(o2s[0]);
+//                    if (j == 0) {
+//                        return Integer.parseUnsignedInt(o1s[1]) - Integer.parseUnsignedInt(o2s[1]);
+//                    } else {
+//                        return j;
+//                    }
+//                } else {
+//                    return Integer.parseUnsignedInt(o1.getSubNumber()) - Integer.parseUnsignedInt(o2.getSubNumber());
+//                }
+//            }
+//            return i;
+//        });
+//    }
+
+    @Override
+    public List<QuestionVo> getSubjectiveVo(List<Long> studentIds) {
+        if (CollectionUtils.isEmpty(studentIds)) {
+            return null;
+        }
+        return this.baseMapper.getSubjectiveVo(studentIds);
+    }
+
+    @Override
+    public List<MarkSubjectiveScore> listByStudentId(Long studentId) {
+        QueryWrapper<MarkSubjectiveScore> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkSubjectiveScore::getStudentId, studentId).orderByAsc(MarkSubjectiveScore::getMainNumber)
+                .orderByAsc(MarkSubjectiveScore::getSubNumber);
+        List<MarkSubjectiveScore> list = this.list(queryWrapper);
+        return list;
+    }
+
+    @Override
+    public void updateRejected(Long studentId, Integer groupNumber, boolean rejectd) {
+        UpdateWrapper<MarkSubjectiveScore> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(MarkSubjectiveScore::getRejected, rejectd)
+                .eq(MarkSubjectiveScore::getStudentId, studentId)
+                .eq(MarkSubjectiveScore::getGroupNumber, groupNumber);
+        this.update(updateWrapper);
+    }
+
+    /**
+     * 根据学生id查找评卷区
+     *
+     * @param studentId
+     * @return
+     */
+    @Override
+    public List<MarkAreaDto> findMarkArea(Long studentId) {
+        return this.baseMapper.findMarkArea(studentId);
+    }
+}

+ 14 - 0
teachcloud-mark/src/main/resources/mapper/MarkSubjectiveScoreMapper.xml

@@ -33,4 +33,18 @@
         group by t.main_title,t.main_number,t.sub_number,t.total_score
         order by t.main_number,t.sub_number
     </select>
+
+    <select id="findMarkArea" resultType="com.qmth.teachcloud.mark.bean.dto.MarkAreaDto">
+        SELECT mq.main_title as title,
+            mq.main_number as mainNumber,
+            mq.sub_number as subNumber,
+            mss.score,
+            mg.pic_list as picList
+        FROM mark_subjective_score mss
+            left join mark_question mq on mq.exam_id = mss.exam_id and mq.paper_number = mss.paper_number and mq.main_number = mss.main_number and mq.sub_number = mss.sub_number
+            left join mark_group mg on mg.exam_id = mss.exam_id and mg.paper_number = mss.paper_number and mg.`number` = mss.group_number
+        WHERE mss.student_id = #{studentId}
+        group by mq.main_title,mq.main_number,mq.sub_number,mss.score,mg.pic_list
+        order by mq.main_number,mq.sub_number
+    </select>
 </mapper>