xiaofei 8 miesięcy temu
rodzic
commit
194ab44844
18 zmienionych plików z 150 dodań i 29 usunięć
  1. 6 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDetailCardDto.java
  2. 4 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  3. 3 0
      distributed-print-business/src/main/resources/db/log/xf.sql
  4. 1 1
      distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml
  5. 3 3
      distributed-print-business/src/main/resources/mapper/TCStatisticsMapper.xml
  6. 19 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicOperationLog.java
  7. 1 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/log/OperationTypeEnum.java
  8. 12 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/MarkStudentVo.java
  9. 18 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/score/StudentScoreDetailDto.java
  10. 10 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkStudent.java
  11. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkStudentMapper.java
  12. 3 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java
  13. 22 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java
  14. 10 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java
  15. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanBatchServiceImpl.java
  16. 2 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanPaperServiceImpl.java
  17. 10 2
      teachcloud-mark/src/main/resources/mapper/MarkPaperMapper.xml
  18. 23 1
      teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

+ 6 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDetailCardDto.java

@@ -22,7 +22,7 @@ public class ExamTaskDetailCardDto {
     private String unexposedPaperType;
     private Boolean enable;
     private String makeMethod;
-    private Integer drawCount;
+    private Boolean openAb;
 //    private String status;
     private String flowId;
     private Integer setup;
@@ -164,15 +164,15 @@ public class ExamTaskDetailCardDto {
         this.makeMethod = makeMethod;
     }
 
-    public Integer getDrawCount() {
-        return drawCount;
+    public Boolean getOpenAb() {
+        return openAb;
     }
 
-    public void setDrawCount(Integer drawCount) {
-        this.drawCount = drawCount;
+    public void setOpenAb(Boolean openAb) {
+        this.openAb = openAb;
     }
 
-//    public String getStatus() {
+    //    public String getStatus() {
 //        return status;
 //    }
 //

+ 4 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -2245,10 +2245,10 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         }
 
         String[] paperTypes = examTaskDetail.getPaperType().split(",");
-        int drawCount = examTaskDetail.getOpenAb() ? 2 : 1;
-        if (paperTypes.length - drawCount < 0) {
-            throw ExceptionResultEnum.ERROR.exception("单次抽卷数量不能大于卷型数量");
-        }
+//        int drawCount = examTaskDetail.getOpenAb() ? 2 : 1;
+//        if (paperTypes.length - drawCount < 0) {
+//            throw ExceptionResultEnum.ERROR.exception("单次抽卷数量不能大于卷型数量");
+//        }
 
         // 是否强制包含试卷
         // 未上传试卷的类型个数

+ 3 - 0
distributed-print-business/src/main/resources/db/log/xf.sql

@@ -3,3 +3,6 @@ ALTER TABLE `exam_task_detail` CHANGE COLUMN `draw_count` `open_ab` TINYINT(1) N
 update exam_task_detail set open_ab = (case open_ab when 1 then 0 else 1 end);
 
 ALTER TABLE `basic_print_config` ADD COLUMN `open_ab` TINYINT(1) NULL DEFAULT 0 COMMENT '是否开启AB卷' AFTER `card_rule_id`;
+
+-- 20224-10-11
+ALTER TABLE `mark_student` ADD COLUMN `omr_breach` TINYINT(1) NULL DEFAULT 0 COMMENT '识别违纪' AFTER `omr_absent_checked`;

+ 1 - 1
distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml

@@ -592,7 +592,7 @@
             a.remark,
             a.exposed_paper_type exposedPaperType,
             ifnull(d.make_method, a.make_method) makeMethod,
-            a.draw_count drawCount,
+            a.open_ab openAb,
             e.flow_id flowId,
             f.setup,
             f.status as flowStatus,

+ 3 - 3
distributed-print-business/src/main/resources/mapper/TCStatisticsMapper.xml

@@ -44,7 +44,7 @@
         be.semester_id as semesterId,
         (
         select
-        etd.draw_count
+        case etd.open_ab when 1 then 2 else 1 end
         from
         exam_task_detail etd
         where
@@ -148,7 +148,7 @@
                 epp.id as printPlanId,
                 epp.name as printPlanName,
                 ed.id as examDetailId,
-                IFNULL(etd.draw_count, 0) as drawCount,
+                case etd.draw_count when 1 then 2 else 1 end as drawCount,
                 IFNULL((
                 select
                     count(1)
@@ -256,7 +256,7 @@
         epp.id as printPlanId,
         epp.name as printPlanName,
         ed.id as examDetailId,
-        IFNULL(etd.draw_count, 0) as drawCount,
+        case etd.draw_count when 1 then 2 else 1 end as drawCount,
         IFNULL((
         select
         count(1)

+ 19 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicOperationLog.java

@@ -2,7 +2,9 @@ package com.qmth.teachcloud.common.entity;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.log.*;
+import com.qmth.teachcloud.common.util.ServletUtil;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -47,6 +49,23 @@ public class BasicOperationLog implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long createTime;
 
+    public BasicOperationLog() {
+    }
+
+    public BasicOperationLog(Long schoolId, OperationTypeEnum operationType, String functionName, String url, String detail, String args, String runStatus, Long userId) {
+        this.id = SystemConstant.getDbUuid();
+        this.schoolId = schoolId;
+        this.operationType = operationType;
+        this.functionName = functionName;
+        this.url = url;
+        this.detail = detail;
+        this.args = args;
+        this.runStatus = runStatus;
+        this.userId = userId;
+        this.ip = ServletUtil.getIP();
+        this.createTime = System.currentTimeMillis();
+    }
+
     public Long getId() {
         return id;
     }

+ 1 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/log/OperationTypeEnum.java

@@ -25,6 +25,7 @@ public enum OperationTypeEnum {
     SYNC("同步"),
     PREVIEW("预览"),
     SSO("单点登录"),
+    SCORE("评卷-回评"),
     OTHER("其它");
     private final String name;
 

+ 12 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/MarkStudentVo.java

@@ -23,6 +23,8 @@ public class MarkStudentVo extends MarkStudent implements Serializable {
     @ApiModelProperty(value = "科目名称")
     private String courseName;
 
+    @ApiModelProperty(value = "学号")
+    private String studentCode;
     @ApiModelProperty(value = "姓名")
     private String studentName;
 
@@ -57,6 +59,16 @@ public class MarkStudentVo extends MarkStudent implements Serializable {
         this.courseName = courseName;
     }
 
+    @Override
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    @Override
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
     public String getStudentName() {
         return studentName;
     }

+ 18 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/score/StudentScoreDetailDto.java

@@ -55,6 +55,8 @@ public class StudentScoreDetailDto {
     private BasicExamStudentStatusEnum studentStatus;
     private String studentStatusDisplay;
     private String collegeName;
+    private Boolean breach;
+    private Boolean omrBreach;
 
     public String getCollegeName() {
         return collegeName;
@@ -328,6 +330,22 @@ public class StudentScoreDetailDto {
         this.objectiveCheckFlag = objectiveCheckFlag;
     }
 
+    public Boolean getBreach() {
+        return breach;
+    }
+
+    public void setBreach(Boolean breach) {
+        this.breach = breach;
+    }
+
+    public Boolean getOmrBreach() {
+        return omrBreach;
+    }
+
+    public void setOmrBreach(Boolean omrBreach) {
+        this.omrBreach = omrBreach;
+    }
+
     public BasicExamStudentStatusEnum getStudentStatus() {
         return studentStatus;
     }

+ 10 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkStudent.java

@@ -160,6 +160,8 @@ public class MarkStudent implements Serializable {
     private Boolean omrAbsent;
     //识别缺考检查
     private Boolean omrAbsentChecked;
+    // 识别违纪
+    private Boolean omrBreach;
     //是否有填涂
     private Boolean questionFilled;
 
@@ -505,6 +507,14 @@ public class MarkStudent implements Serializable {
         this.omrAbsent = omrAbsent;
     }
 
+    public Boolean getOmrBreach() {
+        return omrBreach;
+    }
+
+    public void setOmrBreach(Boolean omrBreach) {
+        this.omrBreach = omrBreach;
+    }
+
     public Integer getCardNumber() {
         return cardNumber;
     }

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

@@ -132,4 +132,6 @@ public interface MarkStudentMapper extends BaseMapper<MarkStudent> {
     int countOmrAbsentStudent(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("paperType") String paperType, @Param("isOmrAbsentConfirm") boolean isOmrAbsentConfirm, @Param("teachClassName") String teachClassName);
 
     void updateBasicExamStudentStatus(@Param("status") String status, @Param("basicStudentId") Long basicStudentId);
+
+    MarkStudentVo getDetailById(Long studentId);
 }

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

@@ -131,7 +131,7 @@ public interface MarkStudentService extends IService<MarkStudent> {
 
     void calculateObjectiveScore(MarkStudent student);
 
-    void updateStudentAndPaper(SysUser user, Long studentId, List<ScanStudentPaper> studentPaperList);
+    void updateStudentAndPaper(SysUser user, Long studentId, List<ScanStudentPaper> studentPaperList, boolean clearMarkTask);
 
     StudentVo findOne(StudentQuery query);
 
@@ -232,4 +232,6 @@ public interface MarkStudentService extends IService<MarkStudent> {
     List<MarkStudent> listByBasicStudentIds(List<Long> basicExamStudentIds);
 
     void confirmSubjectiveInspectedTask(Long studentId);
+
+    MarkStudentVo getDetailById(Long studentId);
 }

+ 22 - 5
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -1,19 +1,22 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.BasicCourse;
-import com.qmth.teachcloud.common.entity.MarkQuestion;
-import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.*;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.log.OperationTypeEnum;
 import com.qmth.teachcloud.common.enums.mark.*;
 import com.qmth.teachcloud.common.service.BasicCourseService;
+import com.qmth.teachcloud.common.service.BasicOperationLogService;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.mark.bean.archivescore.MarkStudentScoreVo;
+import com.qmth.teachcloud.mark.dto.mark.MarkStudentVo;
 import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
 import com.qmth.teachcloud.mark.dto.mark.manage.Task;
 import com.qmth.teachcloud.mark.dto.mark.mark.MarkGroupDto;
@@ -117,6 +120,8 @@ public class MarkServiceImpl implements MarkService {
     private SysUserService sysUserService;
     @Resource
     private MarkRejectHistoryService markRejectHistoryService;
+    @Resource
+    private BasicOperationLogService basicOperationLogService;
 
     /**
      * 释放某个评卷员已完成的评卷任务
@@ -684,6 +689,8 @@ public class MarkServiceImpl implements MarkService {
                 paperNumber, group.getNumber(), false);
         List<MarkSubjectiveScore> subjectiveScores = markSubjectiveScoreService.listByStudentIdAndGroupNumber(studentId,
                 group.getNumber());
+        // 记录修改日志(按小题)
+        List<BasicOperationLog> basicOperationLogs = new ArrayList<>();
         for (int i = 0; i < questions.size(); i++) {
             MarkQuestion question = questions.get(i);
             MarkSubjectiveScore ss;
@@ -701,6 +708,12 @@ public class MarkServiceImpl implements MarkService {
             ss.setSubNumber(question.getSubNumber());
             if (score != UN_SELECTIVE_SCORE) {
                 ScoreItem item = scoreList.get(i);
+                // 分数有变动,记录日志
+                if (ss.getScore() != null && ss.getScore().doubleValue() != item.getScore().doubleValue()) {
+                    MarkStudentVo markStudent = markStudentService.getDetailById(studentId);
+                    String detail = String.format("%s(%s)课程%s试卷编号下,将%s(%s)的%s题从%s分修改为%s分", markStudent.getCourseName(), markStudent.getCourseCode(), markStudent.getPaperNumber(), markStudent.getStudentName(), markStudent.getStudentCode(), question.getMainNumber() + "-" + question.getSubNumber(), ss.getScore(), item.getScore());
+                    basicOperationLogs.add(new BasicOperationLog(Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString()), OperationTypeEnum.SCORE, OperationTypeEnum.SCORE.getName(), ServletUtil.getRequest().getServletPath(), detail, JSON.toJSONString(scoreList), "成功", ServletUtil.getRequestUserId()));
+                }
                 ss.setScore(item.getScore());
                 ss.setMainScore(0.0);
                 ss.setUncalculate(false);
@@ -719,6 +732,10 @@ public class MarkServiceImpl implements MarkService {
             // }
             markSubjectiveScoreService.saveOrUpdateByMultiId(ss);
         }
+        // 记录日志
+        if (CollectionUtils.isNotEmpty(basicOperationLogs)) {
+            basicOperationLogService.saveBatch(basicOperationLogs);
+        }
     }
 
     private void scoreCalculate(Long studentId) {
@@ -732,7 +749,7 @@ public class MarkServiceImpl implements MarkService {
         for (MarkSubjectiveScore ss : list) {
             List<MarkSubjectiveScore> mainScoreList = mainScoreMap.get(ss.getMainNumber());
             if (mainScoreList == null) {
-                mainScoreList = new ArrayList<MarkSubjectiveScore>();
+                mainScoreList = new ArrayList<>();
             }
             mainScoreList.add(ss);
             mainScoreMap.put(ss.getMainNumber(), mainScoreList);
@@ -1071,7 +1088,7 @@ public class MarkServiceImpl implements MarkService {
         }
         MarkUserGroup markUserGroup = markUserGroupService.getByExamIdAndPaperNumberAndGroupNumberAndUserId(examId,
                 paperNumber, groupNumber, userId);
-        if(markUserGroup == null){
+        if (markUserGroup == null) {
             throw ExceptionResultEnum.ERROR.exception("评卷任务被重置,请点击右上角返回按钮,重新在评卷入口菜单点击评卷");
         }
         Task task = null;

+ 10 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -821,7 +821,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     @Override
     @Transactional
     public void updateStudentAndPaper(@NotNull SysUser user, @NotNull Long id,
-                                      @NotNull List<ScanStudentPaper> studentPaperList) {
+                                      @NotNull List<ScanStudentPaper> studentPaperList, boolean clearMarkTask) {
         if (CollectionUtils.isNotEmpty(studentPaperList)) {
             for (ScanStudentPaper studentPaper : studentPaperList) {
                 studentPaper.setStudentId(id);
@@ -830,8 +830,10 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         // 清空原有绑定关系
         if (studentPaperService.removeByStudentId(id) > 0) {
             // 删除评卷任务
-            MarkStudent student = this.getById(id);
-            markService.deleteMarkTaskByStudent(student);
+            if (clearMarkTask) {
+                MarkStudent student = this.getById(id);
+                markService.deleteMarkTaskByStudent(student);
+            }
         }
         if (CollectionUtils.isNotEmpty(studentPaperList)) {
             // 保存绑定关系
@@ -2146,4 +2148,9 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             markService.releaseByStudent(markStudent);
         }
     }
+
+    @Override
+    public MarkStudentVo getDetailById(Long studentId) {
+        return this.baseMapper.getDetailById(studentId);
+    }
 }

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

@@ -177,7 +177,7 @@ public class ScanBatchServiceImpl extends ServiceImpl<ScanBatchMapper, ScanBatch
         //直接更新考生扫描状态
         concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().lock();
         try {
-            markStudentService.updateStudentAndPaper(user, student.getId(), studentPaperList);
+            markStudentService.updateStudentAndPaper(user, student.getId(), studentPaperList, false);
         } finally {
             concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().unlock();
         }

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

@@ -183,7 +183,7 @@ public class ScanPaperServiceImpl extends ServiceImpl<ScanPaperMapper, ScanPaper
             if (previousStudent != null) {
                 // 重置考生状态
                 resetStudent(previousStudent);
-                markStudentService.updateStudentAndPaper(user, previousStudent.getId(), null);
+                markStudentService.updateStudentAndPaper(user, previousStudent.getId(), null, true);
                 markStudentService.updateBasicExamStudentStatus(previousStudent.getId());
             }
             for (PaperMigratePaper vp : domain.getPapers()) {
@@ -224,7 +224,7 @@ public class ScanPaperServiceImpl extends ServiceImpl<ScanPaperMapper, ScanPaper
                 currentStudentPaperList
                         .add(new ScanStudentPaper(student.getId(), vp.getPaperNumber(), vp.getPaperId()));
             }
-            markStudentService.updateStudentAndPaper(user, student.getId(), currentStudentPaperList);
+            markStudentService.updateStudentAndPaper(user, student.getId(), currentStudentPaperList, true);
             // 返回数据结果
             return PaperMigrateVo.create(student.getId());
         } finally {

+ 10 - 2
teachcloud-mark/src/main/resources/mapper/MarkPaperMapper.xml

@@ -39,7 +39,7 @@
         mp.mark_mode markMode,
         mp.question_status questionStatus,
         mp.group_status groupStatus,
-        mp.paper_type paperType
+        group_concat(mp.paper_type) paperType
         FROM
         mark_paper mp
             LEFT JOIN
@@ -87,7 +87,15 @@
                 </if>
             </if>
         </where>
-        order by mp.id desc
+        group by mp.course_id ,
+            mp.exam_id ,
+            bc.code ,
+            bc.name ,
+            so.name ,
+            mp.paper_number ,
+            mp.mark_mode ,
+            mp.question_status ,
+            mp.group_status
     </select>
     <select id="listQualityMarkPaperByStatus" resultType="com.qmth.teachcloud.mark.entity.MarkPaper">
         SELECT exam_id      examId,

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

@@ -71,7 +71,9 @@
         ms.is_absent absent,
         ms.omr_absent omrAbsent,
         ms.is_upload upload,
-        bes.status studentStatus
+        bes.status studentStatus,
+        ms.is_breach breach,
+        ms.omr_breach omrBreach
         FROM
         (select * from mark_student where exam_id = #{examId} and paper_number = #{paperNumber}) ms
         LEFT JOIN
@@ -956,4 +958,24 @@
             </if>
         </where>
     </select>
+    <select id="getDetailById" resultType="com.qmth.teachcloud.mark.dto.mark.MarkStudentVo">
+        SELECT
+            bes.student_code,
+            bes.student_name,
+            bc.code courseCode,
+            bc.name courseName,
+            ms.paper_number,
+            bes.college_name,
+            bes.major_name,
+            bes.teach_class_name,
+            bes.class_name
+        FROM
+            mark_student ms
+                LEFT JOIN
+            basic_exam_student bes ON ms.basic_student_id = bes.id
+                LEFT JOIN
+            basic_course bc ON ms.course_id = bc.id
+        where
+            ms.id = #{studentId}
+    </select>
 </mapper>