Jelajahi Sumber

新增AI智能评卷待复核

wangliang 2 bulan lalu
induk
melakukan
3656dea873

+ 7 - 1
distributed-print/install/mysql/upgrade/3.4.5.sql

@@ -82,4 +82,10 @@ INSERT INTO sys_privilege
 VALUES(1226, 'AI智能评卷导出', '/api/admin/mark/setting/ai/mark/export', 'URL', 917, 3, 'AUTH', NULL, 1, 1, 1);
 INSERT INTO sys_privilege
 (id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
-VALUES(1227, 'AI智能评卷统计', 'Export', 'BUTTON', 917, 4, 'AUTH', '1226', 1, 0, 1);
+VALUES(1227, 'AI智能评卷统计', 'Export', 'BUTTON', 917, 4, 'AUTH', '1226', 1, 0, 1);
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(1228, '获取AI智能评卷任务数量', '/api/admin/mark/inspected/ai/mark/getTask/count', 'URL', 946, 6, 'AUTH', NULL, 1, 1, 1);
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(1229, 'AI智能评卷待复核', 'InspectedAiMark', 'LINK', 946, 9, 'AUTH', '1228', 1, 0, 1);

+ 12 - 6
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkInspectedController.java

@@ -1,19 +1,17 @@
 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.ExceptionResultEnum;
 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.bean.dto.MarkAreaDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
+import com.qmth.teachcloud.mark.dto.mark.score.MarkAiScoreDto;
 import com.qmth.teachcloud.mark.dto.mark.score.SettingDto;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveDetailDto;
-import com.qmth.teachcloud.mark.entity.MarkStudent;
 import com.qmth.teachcloud.mark.params.MarkHeaderResult;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
 import com.qmth.teachcloud.mark.service.MarkStudentService;
@@ -80,12 +78,11 @@ public class MarkInspectedController extends BaseController {
     /**
      * 主观题检查任务获取
      */
-    @Aac(auth = false)
     @ApiOperation(value = "主观题检查任务获取")
     @RequestMapping(value = "/subjective/getTask", method = RequestMethod.POST)
     public Result getSubjectiveInspectedTask(@ApiParam(value = "考生ID") @RequestParam(required = false) Long studentId,
-                                             @ApiParam(value = "考ID", required = true) @RequestParam Long examId,
-                                             @ApiParam(value = "考生ID", required = true) @RequestParam String paperNumber) {
+                                             @ApiParam(value = "考ID", required = true) @RequestParam Long examId,
+                                             @ApiParam(value = "试卷编码", required = true) @RequestParam String paperNumber) {
         validMarkPaperForInspect(examId, paperNumber);
         Task task = markStudentService.getSubjectiveInspectedTask(studentId);
         return ResultUtil.ok(task);
@@ -119,4 +116,13 @@ public class MarkInspectedController extends BaseController {
     public Result getMarkArea(@ApiParam(value = "考生ID", required = true) @RequestParam Long studentId) {
         return ResultUtil.ok(markSubjectiveScoreService.findMarkArea(studentId));
     }
+
+    @ApiOperation(value = "获取AI智能评卷任务数量")
+    @RequestMapping(value = "/ai/mark/getTask/count", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "AI智能评卷任务数量", response = MarkAiScoreDto.class)})
+    public Result getAiMarkInspectedTaskCount(@ApiParam(value = "考生ID", required = true) @RequestParam Long examId,
+                                              @ApiParam(value = "试卷编码", required = true) @RequestParam String paperNumber) {
+
+        return ResultUtil.ok(markStudentService.findScoreByAiMark(examId, paperNumber));
+    }
 }

+ 62 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/score/MarkAiScoreDto.java

@@ -0,0 +1,62 @@
+package com.qmth.teachcloud.mark.dto.mark.score;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: AI智能评卷分数
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2025/4/14
+ */
+public class MarkAiScoreDto implements Serializable {
+
+    @ApiModelProperty(value = "主键")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long studentId;
+
+    @ApiModelProperty(value = "试卷总分")
+    private Double totalScore;
+
+    @ApiModelProperty(value = "试卷及格分")
+    private Double passScore;
+
+    @ApiModelProperty(value = "学生总分")
+    private Double studentTotalScore;
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public Double getPassScore() {
+        return passScore;
+    }
+
+    public void setPassScore(Double passScore) {
+        this.passScore = passScore;
+    }
+
+    public Double getStudentTotalScore() {
+        return studentTotalScore;
+    }
+
+    public void setStudentTotalScore(Double studentTotalScore) {
+        this.studentTotalScore = studentTotalScore;
+    }
+}

+ 11 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkStudentMapper.java

@@ -15,6 +15,7 @@ import com.qmth.teachcloud.mark.bean.student.StudentVo;
 import com.qmth.teachcloud.mark.dto.UnexistStudentDto;
 import com.qmth.teachcloud.mark.dto.mark.AbInfoVo;
 import com.qmth.teachcloud.mark.dto.mark.MarkStudentVo;
+import com.qmth.teachcloud.mark.dto.mark.score.MarkAiScoreDto;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentScoreDetailDto;
 import com.qmth.teachcloud.mark.entity.MarkStudent;
 import org.apache.ibatis.annotations.Param;
@@ -79,6 +80,7 @@ public interface MarkStudentMapper extends BaseMapper<MarkStudent> {
     List<MarkStudent> listAbsentOrBreachMarkTaskStudent(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
 
     IPage<MarkStudent> listUnMarkTaskStudent(@Param("page") Page<MarkStudent> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId);
+
     IPage<MarkStudent> listUnMarkDoubleTaskStudent(@Param("page") Page<MarkStudent> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId);
 
     StudentVo findOne(@Param("query") StudentQuery query);
@@ -168,4 +170,13 @@ public interface MarkStudentMapper extends BaseMapper<MarkStudent> {
     IPage<MarkStudent> findNeedScoreCalculateStudent(@Param("page") Page<MarkStudent> page);
 
     BasicExam getBasicExamById(@Param("examId") Long examId);
+
+    /**
+     * 根据考试id和试卷编码查找AI评卷分数
+     *
+     * @param examId
+     * @param paperNumber
+     * @return
+     */
+    List<MarkAiScoreDto> findScoreByAiMark(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
 }

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

@@ -1,14 +1,5 @@
 package com.qmth.teachcloud.mark.service;
 
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.constraints.NotNull;
-
-import org.springframework.web.multipart.MultipartFile;
-
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -37,15 +28,19 @@ import com.qmth.teachcloud.mark.dto.mark.AbInfoVo;
 import com.qmth.teachcloud.mark.dto.mark.MarkStudentVo;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
 import com.qmth.teachcloud.mark.dto.mark.manage.TaskArchive;
-import com.qmth.teachcloud.mark.dto.mark.score.SheetUrlDto;
-import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveAnswerDto;
-import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveDetailDto;
-import com.qmth.teachcloud.mark.dto.mark.score.StudentScoreDetailDto;
+import com.qmth.teachcloud.mark.dto.mark.score.*;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkStudent;
 import com.qmth.teachcloud.mark.entity.ScanStudentPaper;
 import com.qmth.teachcloud.mark.enums.PaperTypeCheckStatus;
 import com.qmth.teachcloud.mark.params.MarkHeaderResult;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotNull;
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -139,6 +134,7 @@ public interface MarkStudentService extends IService<MarkStudent> {
     List<MarkStudent> listAbsentOrBreachMarkTaskStudent(Long examId, String paperNumber);
 
     List<MarkStudent> listUnMarkTaskStudent(Long examId, String paperNumber, Long questionId, int pageSize);
+
     List<MarkStudent> listUnMarkDoubleTaskStudent(Long examId, String paperNumber, Long questionId, int pageSize);
 
     void calculateObjectiveScore(MarkStudent student);
@@ -150,6 +146,7 @@ public interface MarkStudentService extends IService<MarkStudent> {
     int countByExamIdAndSecretNumber(Long examId, String secretNumber);
 
     List<MarkStudent> listByExamIdAndCoursePaperId(Long examId, String coursePaperId);
+
     List<MarkStudent> listByExamIdAndPaperNumber(Long examId, String paperNumber);
 
     IPage<AnswerQueryVo> query(AnswerQueryDomain query);
@@ -188,7 +185,7 @@ public interface MarkStudentService extends IService<MarkStudent> {
 
     int countOmrAbsentStudent(Long examId, String paperNumber, boolean isOmrAbsentConfirm, String teachClassName);
 
-    String scoreReportDownload(ArchiveStudentQuery query,MultipartFile file, HttpServletResponse response);
+    String scoreReportDownload(ArchiveStudentQuery query, MultipartFile file, HttpServletResponse response);
 
     void deleteByExamIdAndPaperNumber(Long examId, String paperNumber);
 
@@ -303,4 +300,13 @@ public interface MarkStudentService extends IService<MarkStudent> {
     String getCardContent(MarkStudentVo markStudent);
 
     Set<Long> listStudentIds(Long examId, String paperNumber, List<String> classNames);
+
+    /**
+     * 根据考试id和试卷编码查找AI评卷分数
+     *
+     * @param examId
+     * @param paperNumber
+     * @return
+     */
+    List<MarkAiScoreDto> findScoreByAiMark(Long examId, String paperNumber);
 }

+ 40 - 30
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -1,35 +1,5 @@
 package com.qmth.teachcloud.mark.service.impl;
 
-import java.awt.*;
-import java.awt.color.ColorSpace;
-import java.awt.image.BufferedImage;
-import java.awt.image.ColorConvertOp;
-import java.io.*;
-import java.lang.reflect.Field;
-import java.math.BigDecimal;
-import java.net.URLEncoder;
-import java.util.*;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import javax.annotation.Resource;
-import javax.imageio.ImageIO;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.constraints.NotNull;
-
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.FillPatternType;
-import org.apache.poi.ss.usermodel.IndexedColors;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.FileCopyUtils;
-import org.springframework.web.multipart.MultipartFile;
-
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -87,6 +57,34 @@ import com.qmth.teachcloud.mark.service.*;
 import com.qmth.teachcloud.mark.utils.BatchGetDataUtil;
 import com.qmth.teachcloud.mark.utils.Calculator;
 import com.qmth.teachcloud.mark.utils.ScoreCalculateUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.FillPatternType;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.FileCopyUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotNull;
+import java.awt.*;
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorConvertOp;
+import java.io.*;
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -2586,4 +2584,16 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         List<MarkStudent> students = this.list(queryWrapper);
         return students.stream().map(MarkStudent::getId).collect(Collectors.toSet());
     }
+
+    /**
+     * 根据考试id和试卷编码查找AI评卷分数
+     *
+     * @param examId
+     * @param paperNumber
+     * @return
+     */
+    @Override
+    public List<MarkAiScoreDto> findScoreByAiMark(Long examId, String paperNumber) {
+        return this.baseMapper.findScoreByAiMark(examId, paperNumber);
+    }
 }

+ 23 - 0
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -1097,4 +1097,27 @@
     <select id="getBasicExamById" resultType="com.qmth.teachcloud.common.entity.BasicExam">
         select * from basic_exam be where be.id = #{examId}
     </select>
+
+    <select id="findScoreByAiMark" resultType="com.qmth.teachcloud.mark.dto.mark.score.MarkAiScoreDto">
+        select * from(select distinct ms.id as studentId,
+            mp.total_score as totalScore,
+            mp.total_score * mp.pass_score / 100 as passScore,
+        ifnull(ms.objective_score, 0) + ifnull(ms.subjective_score, 0) as studentTotalScore
+        from mark_student ms
+        left join mark_task mt on mt.student_id = ms.id
+        left join mark_paper mp on mp.exam_id = ms.exam_id and mp.paper_number = ms.paper_number
+        <where>
+            <if test="examId != null and examId != ''">
+                and mt.exam_id = #{examId}
+            </if>
+            <if test="paperNumber != null and paperNumber != ''">
+                and mt.paper_number = #{paperNumber}
+            </if>
+            and mt.ai_marked = true
+            and ms.subjective_status = 'MARK'
+            and ms.subjective_score_list is not null
+        </where>) t
+        where (t.studentTotalScore = t.totalScore or t.studentTotalScore <![CDATA[ < ]]> passScore)
+        order by t.studentTotalScore
+    </select>
 </mapper>