Prechádzať zdrojové kódy

期末成绩导入和同步锁

wangliang 1 rok pred
rodič
commit
1cb02c2f08

+ 42 - 6
distributed-print/src/main/java/com/qmth/distributed/print/api/TCFinalScoreController.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.gson.reflect.TypeToken;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.excel.ExcelField;
 import com.qmth.distributed.print.business.bean.params.report.PaperStructParams;
 import com.qmth.distributed.print.business.bean.result.EditResult;
@@ -19,10 +20,7 @@ import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
-import com.qmth.teachcloud.common.util.GsonUtil;
-import com.qmth.teachcloud.common.util.JacksonUtil;
-import com.qmth.teachcloud.common.util.ResultUtil;
-import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.common.util.*;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
 import com.qmth.teachcloud.mark.service.MarkQuestionService;
@@ -42,6 +40,7 @@ import javax.validation.constraints.Min;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -73,6 +72,9 @@ public class TCFinalScoreController {
     @Resource
     MarkPaperService markPaperService;
 
+    @Resource
+    RedisUtil redisUtil;
+
     @ApiOperation(value = "导入期末成绩-模板下载")
     @RequestMapping(value = "/final_score/template_download", method = RequestMethod.POST)
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.EXPORT)
@@ -108,7 +110,25 @@ public class TCFinalScoreController {
                                    @ApiParam(value = "考试id", required = true) @RequestParam Long examId,
                                    @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
                                    @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) throws IOException {
-        return ResultUtil.ok(tcFinalScoreService.finalScoreExcelImport(file, examId, courseCode, paperNumber));
+        String lockKey = SystemConstant.REDIS_FINAL_SCORE_DATA_FLOW_PREFIX + examId + "_" + courseCode + "_" + paperNumber;
+        boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_LOCK_IMPORT_EXAM_DATA_TIME_OUT);
+        if (!lock) {
+            throw ExceptionResultEnum.ERROR.exception("正在同步数据,请稍候再试!");
+        }
+        Map<String, String> map = null;
+        try {
+            map = tcFinalScoreService.finalScoreExcelImport(file, examId, courseCode, paperNumber);
+        } 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);
+        }
+        return ResultUtil.ok(map);
     }
 
     @ApiOperation(value = "同步期末成绩")
@@ -117,7 +137,23 @@ public class TCFinalScoreController {
     public Object finalScoreSync(@ApiParam(value = "考试id", required = true) @RequestParam Long examId,
                                  @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
                                  @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) throws IOException {
-        //TODO 待肖飞补充同步接口
+        String lockKey = SystemConstant.REDIS_FINAL_SCORE_DATA_FLOW_PREFIX + examId + "_" + courseCode + "_" + paperNumber;
+        boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_LOCK_IMPORT_EXAM_DATA_TIME_OUT);
+        if (!lock) {
+            throw ExceptionResultEnum.ERROR.exception("正在导入数据,请稍候再试!");
+        }
+        try {
+            //TODO 待肖飞补充同步接口
+        } 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);
+        }
         return ResultUtil.ok(true);
     }
 

+ 1 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -509,6 +509,7 @@ 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_FLOW_PREFIX = "redis:lock:final:score: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 * 60;