wangliang 11 月之前
父节点
当前提交
977fde02c6

+ 8 - 0
distributed-print/install/mysql/upgrade/3.4.0.sql

@@ -408,3 +408,11 @@ VALUES(2109, '重新计算接口', '/api/admin/course/degree/report/again/calcul
 ALTER TABLE `scan_omr_task` ADD INDEX `index1` (`student_id` ASC);
 ALTER TABLE `scan_student_paper` ADD INDEX `index1` (`student_id` ASC);
 ALTER TABLE `scan_batch_paper` ADD INDEX `idx_student_id` (`student_id` ASC);
+
+-- 2024-07-18
+ALTER TABLE t_c_final_score DROP KEY t_c_final_score_unique;
+ALTER TABLE t_c_final_score ADD CONSTRAINT t_c_final_score_unique UNIQUE KEY (culture_program_id,course_id,student_code);
+
+ALTER TABLE t_c_usual_score DROP KEY t_c_usual_score_unique;
+ALTER TABLE t_c_usual_score ADD CONSTRAINT t_c_usual_score_unique UNIQUE KEY (culture_program_id,course_id,student_code);
+

+ 4 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/obe/ObeReportController.java

@@ -3,8 +3,10 @@ package com.qmth.distributed.print.api.obe;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.exception.ApiException;
+import com.qmth.boot.core.rateLimit.annotation.RateLimit;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.util.RedisUtil;
@@ -56,6 +58,7 @@ public class ObeReportController {
     @ApiOperation(value = "毕业要求达成度重新计算")
     @RequestMapping(value = "/requirements/again/calculate", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "分页查询", response = ObeCourseRequirementListResult.class)})
+    @Aac(rateLimit = @RateLimit(count = 1, period = 1000L))
     public Result requirementsAgainCalculate(@ApiParam(value = "培养方案ID", required = true) @RequestParam Long cultureProgramId) {
         String lockKey = SystemConstant.REDIS_OBE_RADAR_AGAIN_DATA_PREFIX + cultureProgramId;
         boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_LOCK_OBE_RADAR_DATA_TIME_OUT);
@@ -151,6 +154,7 @@ public class ObeReportController {
     @ApiOperation(value = "毕业要求达成度学生重新计算")
     @RequestMapping(value = "/student_requirement/again/calculate", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "毕业要求达成度学生报表", response = ScoreResult.class)})
+    @Aac(rateLimit = @RateLimit(count = 1, period = 1000L))
     public Result requirementsStudentAgainCalculate(@ApiParam(value = "培养方案ID") @RequestParam(required = false) Long cultureProgramId) {
         String lockKey = SystemConstant.REDIS_OBE_RADAR_STUDENT_DATA_PREFIX + cultureProgramId;
         boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_LOCK_OBE_RADAR_DATA_TIME_OUT);

+ 44 - 23
distributed-print/src/main/java/com/qmth/distributed/print/api/obe/TRBasicInfoController.java

@@ -106,6 +106,9 @@ public class TRBasicInfoController {
     @Resource
     TCFinalScoreService tcFinalScoreService;
 
+    @Resource
+    RedisUtil redisUtil;
+
     @ApiOperation(value = "报告管理列表")
     @RequestMapping(value = "/report/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "分页查询", response = ObeScoreResult.class)})
@@ -187,35 +190,53 @@ public class TRBasicInfoController {
     @RequestMapping(value = "/report/again/calculate", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查看报告", response = ReportResult.class)})
     @Transactional
+    @Aac(rateLimit = @RateLimit(count = 1, period = 1000L))
     public Result reportAgainCalculate(@ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId,
                                        @ApiParam(value = "课程id", required = true) @RequestParam Long courseId,
                                        @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber) {
-        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(cultureProgramId,
-                courseId);
-
-        ObeCourseWeightResult obeCourseWeightResult = trBasicInfoService.findCourseWeightResultRmi(obeCourseOutline.getId());
-        log.info("ObeCourseWeightResult:{}", JacksonUtil.parseJson(obeCourseWeightResult));
-        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber);
-        if (Objects.isNull(tcPaperStruct) || Objects.isNull(tcPaperStruct.getPaperStructDimension())) {
-            throw ExceptionResultEnum.ERROR.exception("未找到试卷蓝图信息");
+        String lockKey = SystemConstant.REDIS_COURSE_DEGREE_DATA_PREFIX + cultureProgramId + "_" + courseId;
+        boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_COURSE_DEGREE_DATA_TIME_OUT);
+        if (!lock) {
+            throw ExceptionResultEnum.ERROR.exception("正在重新计算数据,请稍候再试!");
         }
-        MarkPaper markPaper = printCommonService.getMarkPaper(null, tcPaperStruct.getPaperNumber(), courseId);
+        TRBasicInfo trBasicInfoAgainCalculate = null;
+        try {
+            SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+            ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(cultureProgramId,
+                    courseId);
 
-        TRBasicInfo trBasicInfo = trBasicInfoService.queryBasicInfo(cultureProgramId, courseId, paperNumber);
-        trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber,
-                Objects.nonNull(tcPaperStruct.getDimensionSign())
-                        && tcPaperStruct.getDimensionSign().longValue()
-                        != obeCourseWeightResult.getDimensionSign().longValue());
-
-        TRBasicInfo trBasicInfoAgainCalculate = trBasicInfoService.getReportView(null, markPaper, sysUser.getId(),
-                obeCourseWeightResult, cultureProgramId, courseId);
-        if (Objects.nonNull(trBasicInfo)) {
-            trBasicInfoAgainCalculate.setCalculate(trBasicInfo);
+            ObeCourseWeightResult obeCourseWeightResult = trBasicInfoService.findCourseWeightResultRmi(obeCourseOutline.getId());
+            log.info("ObeCourseWeightResult:{}", JacksonUtil.parseJson(obeCourseWeightResult));
+            TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber);
+            if (Objects.isNull(tcPaperStruct) || Objects.isNull(tcPaperStruct.getPaperStructDimension())) {
+                throw ExceptionResultEnum.ERROR.exception("未找到试卷蓝图信息");
+            }
+            MarkPaper markPaper = printCommonService.getMarkPaper(null, tcPaperStruct.getPaperNumber(), courseId);
+
+            TRBasicInfo trBasicInfo = trBasicInfoService.queryBasicInfo(cultureProgramId, courseId, paperNumber);
+            trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber,
+                    Objects.nonNull(tcPaperStruct.getDimensionSign())
+                            && tcPaperStruct.getDimensionSign().longValue()
+                            != obeCourseWeightResult.getDimensionSign().longValue());
+
+            trBasicInfoAgainCalculate = trBasicInfoService.getReportView(null, markPaper, sysUser.getId(),
+                    obeCourseWeightResult, cultureProgramId, courseId);
+            if (Objects.nonNull(trBasicInfo)) {
+                trBasicInfoAgainCalculate.setCalculate(trBasicInfo);
+            }
+            //课程目标达成评价明细结果-课程目标达成评价值图
+            trBasicInfoService.save(trBasicInfoAgainCalculate);
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {
+            redisUtil.releaseLock(lockKey);
         }
-        //课程目标达成评价明细结果-课程目标达成评价值图
-        trBasicInfoService.save(trBasicInfoAgainCalculate);
-        return ResultUtil.ok(trBasicInfoAgainCalculate.getReportResult());
+        return ResultUtil.ok(Objects.nonNull(trBasicInfoAgainCalculate) ? trBasicInfoAgainCalculate.getReportResult() : trBasicInfoAgainCalculate);
     }
 
     @ApiOperation(value = "保存报告")

+ 8 - 6
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -539,17 +539,19 @@ public class SystemConstant {
     public static final String REDIS_LOCK_CALCULATE_PREFIX = "redis:lock:calculate:";//计算锁
     public static final long REDIS_LOCK_CALCULATE_TIME_OUT = 60L * 60;
     public static final long REDIS_LOCK_PAPER_NUMBER_TIME_OUT = 60L * 2;
-    public static final String REDIS_FINAL_SCORE_DATA_PREFIX = "redis:lock:final:score:data";//期末考试数据锁
-    public static final String REDIS_PAPER_STRUCT_PREFIX = "redis:lock:final:score:paper:struct";//期末考试试卷结构锁
-    public static final String REDIS_OBE_RADAR_DATA_PREFIX = "redis:lock:obe:radar:data";//obe雷达报表锁
-    public static final String REDIS_OBE_RADAR_DETAIL_DATA_PREFIX = "redis:lock:obe:radar:detail:data";//obe雷达详情报表锁
-    public static final String REDIS_OBE_RADAR_AGAIN_DATA_PREFIX = "redis:lock:obe:radar:again:data";//obe雷达报表重新算锁
-    public static final String REDIS_OBE_RADAR_STUDENT_DATA_PREFIX = "redis:lock:obe:student:again:data";//obe学生重新算锁
+    public static final String REDIS_FINAL_SCORE_DATA_PREFIX = "redis:lock:final:score:data:";//期末考试数据锁
+    public static final String REDIS_PAPER_STRUCT_PREFIX = "redis:lock:final:score:paper:struct:";//期末考试试卷结构锁
+    public static final String REDIS_OBE_RADAR_DATA_PREFIX = "redis:lock:obe:radar:data:";//obe雷达报表锁
+    public static final String REDIS_OBE_RADAR_DETAIL_DATA_PREFIX = "redis:lock:obe:radar:detail:data:";//obe雷达详情报表锁
+    public static final String REDIS_OBE_RADAR_AGAIN_DATA_PREFIX = "redis:lock:obe:radar:again:data:";//obe雷达报表重新计算锁
+    public static final String REDIS_OBE_RADAR_STUDENT_DATA_PREFIX = "redis:lock:obe:student:again:data:";//obe学生重新计算锁
+    public static final String REDIS_COURSE_DEGREE_DATA_PREFIX = "redis:lock:course:degree:data:";//课程目标达成度重新计算锁
 
     public static final String REDIS_LOCK_IMPORT_EXAM_DATA = "redis:lock:import:exam:data:";//导入考务数据锁
     public static final long REDIS_LOCK_IMPORT_EXAM_DATA_TIME_OUT = 60L * 10;
     public static final long REDIS_PAPER_STRUCT_TIME_OUT = 60L * 10;
     public static final long REDIS_LOCK_OBE_RADAR_DATA_TIME_OUT = 60L * 10;
+    public static final long REDIS_COURSE_DEGREE_DATA_TIME_OUT = 60L * 10;
     /**
      * 机器心跳
      */

+ 1 - 1
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TRBasicInfoServiceImpl.java

@@ -1143,7 +1143,7 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
 
         String teachingObject = Objects.nonNull(trBasicInfo) ? trBasicInfo.getTeachingObject() : null;
         if (Objects.nonNull(markPaper.getPaperNumber())) {
-            ExamStudentDto examStudentDto = basicExamStudentService.queryExamStudent(markPaper.getExamId(), trBasicInfo.getCourseId(), markPaper.getPaperNumber());
+            ExamStudentDto examStudentDto = basicExamStudentService.queryExamStudent(markPaper.getExamId(), Objects.nonNull(trBasicInfo) ? trBasicInfo.getCourseId() : obeCourseOutline.getCourseId(), markPaper.getPaperNumber());
             teachingObject = Objects.nonNull(examStudentDto) ? examStudentDto.getClazzNames() : null;
         }