xiatian пре 3 месеци
родитељ
комит
4d48b43b75

+ 92 - 0
src/main/java/cn/com/qmth/am/bean/ModelSpeed.java

@@ -0,0 +1,92 @@
+package cn.com.qmth.am.bean;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.am.utils.Calculator;
+
+@Component
+public class ModelSpeed {
+
+    private Long ocrStartTime;
+
+    private Long markingStartTime;
+
+    private AtomicInteger ocrCount = new AtomicInteger(0);
+
+    private AtomicInteger markingCount = new AtomicInteger(0);
+
+    private Double ocrSpeed;
+
+    private Double markingSpeed;
+
+    public void addOcrCOunt() {
+        ocrCount.addAndGet(1);
+    }
+
+    public void addMarkingCount() {
+        markingCount.addAndGet(1);
+    }
+
+    public void ocrStart() {
+        this.ocrStartTime = System.currentTimeMillis();
+        this.ocrSpeed = null;
+    }
+
+    public void ocrEnd() {
+        this.ocrStartTime = null;
+        this.ocrCount = new AtomicInteger(0);
+
+    }
+
+    public void markingStart() {
+        this.markingStartTime = System.currentTimeMillis();
+        this.markingSpeed = null;
+    }
+
+    public void markingEnd() {
+        this.markingStartTime = null;
+        this.markingCount = new AtomicInteger(0);
+
+    }
+
+    public String getOcrSpeed() {
+        String txt = "个/秒";
+        Long start = this.ocrStartTime;
+        if (start == null) {
+            Double speed = this.ocrSpeed;
+            if (speed != null) {
+                return speed + txt;
+            } else {
+                return "-";
+            }
+        } else {
+            return getSpeed(start, this.ocrCount) + txt;
+        }
+    }
+
+    public String getMarkingSpeed() {
+        String txt = "个/秒";
+        Long start = this.markingStartTime;
+        if (start == null) {
+            Double speed = this.markingSpeed;
+            if (speed != null) {
+                return speed + txt;
+            } else {
+                return "-";
+            }
+        } else {
+            return getSpeed(start, this.markingCount) + txt;
+        }
+    }
+
+    private Double getSpeed(long startTime, AtomicInteger count) {
+        long end = System.currentTimeMillis();
+        if (count.get() == 0) {
+            return 0.0;
+        } else {
+            return Calculator.divide(Calculator.multiply(count.get(), 1000), end - startTime, 2);
+        }
+    }
+}

+ 6 - 0
src/main/java/cn/com/qmth/am/controller/AdminController.java

@@ -31,6 +31,7 @@ import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.core.concurrent.service.ConcurrentService;
 
 import cn.com.qmth.am.bean.DataKey;
+import cn.com.qmth.am.bean.ModelSpeed;
 import cn.com.qmth.am.bean.StudentScoreVo;
 import cn.com.qmth.am.config.SysProperty;
 import cn.com.qmth.am.entity.QuestionEntity;
@@ -49,6 +50,9 @@ import io.swagger.annotations.ApiOperation;
 @Aac(strict = false, auth = false)
 public class AdminController {
 
+    @Autowired
+    private ModelSpeed modelSpeed;
+
     @Autowired
     private QuestionService questionService;
 
@@ -267,6 +271,8 @@ public class AdminController {
         sb.append(" | 评分是否开启:" + (sysProperty.getMarkingTaskEnable() ? "是" : "否"));
         sb.append(" | 科目总数:" + qsCourse);
         sb.append(" | 小题总数:" + qstotal);
+        sb.append(" | ocr速度:" + modelSpeed.getOcrSpeed());
+        sb.append(" | 评分速度:" + modelSpeed.getMarkingSpeed());
         sb.append("\r\n");
         List<StudentScoreVo> vos = studentScoreService.getInfoByExam(examId);
         if (CollectionUtils.isEmpty(vos)) {

+ 27 - 14
src/main/java/cn/com/qmth/am/service/impl/StudentScoreServiceImpl.java

@@ -36,6 +36,7 @@ import cn.com.qmth.am.bean.AiMarkingDto;
 import cn.com.qmth.am.bean.AnswerImageDto;
 import cn.com.qmth.am.bean.AutoScoreEnRequest;
 import cn.com.qmth.am.bean.ImageSlice;
+import cn.com.qmth.am.bean.ModelSpeed;
 import cn.com.qmth.am.bean.OcrDto;
 import cn.com.qmth.am.bean.StudentScoreImageDto;
 import cn.com.qmth.am.bean.StudentScoreInfo;
@@ -71,6 +72,9 @@ public class StudentScoreServiceImpl extends ServiceImpl<StudentScoreDao, Studen
     @Autowired
     private QuestionService questionService;
 
+    @Autowired
+    private ModelSpeed modelSpeed;
+
     @Transactional
     @Override
     public void saveByQuestion(List<QuestionEntity> qlist, List<String> examNumbers) {
@@ -130,6 +134,15 @@ public class StudentScoreServiceImpl extends ServiceImpl<StudentScoreDao, Studen
         this.update(wrapper);
     }
 
+    private void updateMarkingErr(Long id, String err) {
+        UpdateWrapper<StudentScoreEntity> wrapper = new UpdateWrapper<>();
+        LambdaUpdateWrapper<StudentScoreEntity> lw = wrapper.lambda();
+        lw.set(StudentScoreEntity::getScoreStatus, DataStatus.FAILED);
+        lw.set(StudentScoreEntity::getErrMsg, err);
+        lw.eq(StudentScoreEntity::getId, id);
+        this.update(wrapper);
+    }
+
     @Transactional
     @Override
     public void createSlice(OcrDto ocrDto) {
@@ -313,13 +326,13 @@ public class StudentScoreServiceImpl extends ServiceImpl<StudentScoreDao, Studen
     // }
     // }
 
-    @Transactional
     @Override
     public void ocr(StudentScoreImageDto dto) {
         try {
             String ret = ocrDispose(dto);
             if (ret != null) {
                 updateAnswer(dto.getStudentScoreId(), ret);
+                modelSpeed.addOcrCOunt();
             } else {
                 ocrErr(dto, "ocr失败,返回null");
             }
@@ -400,7 +413,6 @@ public class StudentScoreServiceImpl extends ServiceImpl<StudentScoreDao, Studen
     // return this.list(wrapper);
     // }
 
-    @Transactional
     @Override
     public void aiMarking(StudentScoreEntity score) {
         AiMarkingDto dto = new AiMarkingDto();
@@ -429,8 +441,9 @@ public class StudentScoreServiceImpl extends ServiceImpl<StudentScoreDao, Studen
                     stepScore.add(d);
                 }
                 updateScore(score.getId(), ret.getTotalScore(), stepScore);
+                modelSpeed.addMarkingCount();
             } else {
-                updateScoreNone(score.getId(), 0.0);
+                updateMarkingErr(score.getId(), "making失败,返回null");
             }
         } catch (Exception e) {
             aiScoreErr(dto, e.getMessage());
@@ -476,17 +489,17 @@ public class StudentScoreServiceImpl extends ServiceImpl<StudentScoreDao, Studen
         this.update(wrapper);
     }
 
-    private void updateScoreNone(Long id, Double aiScore) {
-        UpdateWrapper<StudentScoreEntity> wrapper = new UpdateWrapper<>();
-        LambdaUpdateWrapper<StudentScoreEntity> lw = wrapper.lambda();
-        lw.set(StudentScoreEntity::getScoreStatus, DataStatus.SUCCESS);
-        lw.set(StudentScoreEntity::getAiScore, aiScore);
-        lw.set(StudentScoreEntity::getStepScore, null);
-        lw.set(StudentScoreEntity::getErrMsg, null);
-        lw.set(StudentScoreEntity::getScoreNone, true);
-        lw.eq(StudentScoreEntity::getId, id);
-        this.update(wrapper);
-    }
+    // private void updateScoreNone(Long id, Double aiScore) {
+    // UpdateWrapper<StudentScoreEntity> wrapper = new UpdateWrapper<>();
+    // LambdaUpdateWrapper<StudentScoreEntity> lw = wrapper.lambda();
+    // lw.set(StudentScoreEntity::getScoreStatus, DataStatus.SUCCESS);
+    // lw.set(StudentScoreEntity::getAiScore, aiScore);
+    // lw.set(StudentScoreEntity::getStepScore, null);
+    // lw.set(StudentScoreEntity::getErrMsg, null);
+    // lw.set(StudentScoreEntity::getScoreNone, true);
+    // lw.eq(StudentScoreEntity::getId, id);
+    // this.update(wrapper);
+    // }
 
     private void aiScoreErr(AiMarkingDto dto, String err) {
         updateScoreErr(dto.getScoreInfo().getId(), err);

+ 6 - 0
src/main/java/cn/com/qmth/am/task/AiMarkingJob.java

@@ -16,6 +16,7 @@ import org.springframework.stereotype.Service;
 
 import com.qmth.boot.core.concurrent.service.ConcurrentService;
 
+import cn.com.qmth.am.bean.ModelSpeed;
 import cn.com.qmth.am.config.SysProperty;
 import cn.com.qmth.am.consumer.MarkingConsumer;
 import cn.com.qmth.am.entity.StudentScoreEntity;
@@ -37,6 +38,9 @@ public class AiMarkingJob {
 
     private ExecutorService executor;
 
+    @Autowired
+    private ModelSpeed modelSpeed;
+
     @PostConstruct
     public void initExecutor() {
         int threadCount = sysProperty.getMarkingThreadCount();
@@ -76,6 +80,7 @@ public class AiMarkingJob {
     private void dispose() {
         List<StudentScoreEntity> scores = studentScoreService.findAllToAiMarking();
         if (CollectionUtils.isNotEmpty(scores)) {
+            modelSpeed.markingStart();
             CountDownLatch endGate = new CountDownLatch(scores.size());
             for (StudentScoreEntity score : scores) {
                 if (!sysProperty.getMarkingTaskEnable()) {
@@ -91,6 +96,7 @@ public class AiMarkingJob {
             } catch (InterruptedException e) {
                 throw new RuntimeException(e);
             }
+            modelSpeed.markingEnd();
         }
     }
 

+ 6 - 0
src/main/java/cn/com/qmth/am/task/OcrJob.java

@@ -18,6 +18,7 @@ import org.springframework.stereotype.Service;
 
 import com.qmth.boot.core.concurrent.service.ConcurrentService;
 
+import cn.com.qmth.am.bean.ModelSpeed;
 import cn.com.qmth.am.bean.OcrDto;
 import cn.com.qmth.am.config.OcrServerCfg;
 import cn.com.qmth.am.config.SysProperty;
@@ -47,6 +48,9 @@ public class OcrJob {
     @Autowired
     private OcrServerCfg ocrServerCfg;
 
+    @Autowired
+    private ModelSpeed modelSpeed;
+
     private ExecutorService executor;
 
     @PostConstruct
@@ -86,7 +90,9 @@ public class OcrJob {
             if (!lock) {
                 return;
             }
+            modelSpeed.ocrStart();
             this.dispose(scores, qs);
+            modelSpeed.ocrEnd();
         } finally {
             if (lock) {
                 concurrentService.getReadWriteLock(LockType.OCR.name()).writeLock().unlock();