Browse Source

ly 导入题目

ly 1 năm trước cách đây
mục cha
commit
984ec076bc

+ 48 - 11
master/src/main/java/com/ruoyi/project/training/elearn/controller/TElQuController.java

@@ -4,6 +4,10 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.time.LocalDate;
 import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -13,6 +17,7 @@ import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.file.ExcelUtils;
 import com.ruoyi.common.utils.file.FileUploadUtils;
 import com.ruoyi.framework.config.RuoYiConfig;
+import com.ruoyi.project.sems.domain.TSpecdevYlgd;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.training.elearn.domain.TElQuAnswer;
 import com.ruoyi.project.training.spec.domain.vo.TStPlanImportVO;
@@ -618,10 +623,13 @@ public class TElQuController extends BaseController {
         Sheet sheet = workbook.getSheetAt(0);
         int rowNum = sheet.getPhysicalNumberOfRows();
         logger.info("总行数:" + rowNum);
-        int failNumber = 0;
-        int successNumber = 0;
+        List<TElQu> list = new ArrayList<TElQu>();
         //报错行数统计
         List<Integer> failRow = new ArrayList<Integer>();
+        AtomicInteger failNumber = new AtomicInteger();
+        AtomicInteger successNumber = new AtomicInteger();
+        AtomicInteger failNum = new AtomicInteger();
+
         for (int i = 1; i < rowNum; i++) {
             try {
                 logger.info("读取行数:" + i);
@@ -745,8 +753,8 @@ public class TElQuController extends BaseController {
                                 answerList.add(answerB);
                                 answerList.add(answerC);
                             }*/
-                                // 假设 options 是一个包含选项内容的数组,cellValue 是一个包含正确答案的字符串
-                            char[] labels = {'A', 'B', 'C', 'D', 'E' , 'F' ,'J' ,'H' , 'I' ,'J' ,'K'};  // 可以扩展更多的选项
+                            // 假设 options 是一个包含选项内容的数组,cellValue 是一个包含正确答案的字符串
+                            char[] labels = {'A', 'B', 'C', 'D', 'E', 'F', 'J', 'H', 'I', 'J', 'K'};  // 可以扩展更多的选项
                             for (int c = 0; c < options.length && c < labels.length; c++) {
                                 TElQuAnswer answer = new TElQuAnswer();
                                 answer.setIsRight(0L);
@@ -781,27 +789,56 @@ public class TElQuController extends BaseController {
                         qu.setAnswerList(answerList);
                         qu.setRepoIds(repos);
                         logger.info(JSON.toJSONString(qu));
-                        tElQuService.insertTElQu(qu);
-                        successNumber++;
+                        list.add(qu);
+//                        tElQuService.insertTElQuBatch(qu , i);
                     }
                 }
             } catch (Exception e) {
-                failNumber++;
+                failNumber.getAndIncrement();
+                TElQu qu = new TElQu();
+                list.add(qu);
                 logger.error("e:" + JSON.toJSONString(e));
-                failRow.add(i + 1);
             }
         }
+        //线程池
+        ExecutorService executorService = Executors.newFixedThreadPool(30);
+        final CountDownLatch latch = new CountDownLatch(list.size()); //相同线程数量的计数
+        for (TElQu t : list
+        ) {
+            executorService.execute(() -> {
+                // -- 业务模块
+                failNum.getAndIncrement();
+                try {
+                    tElQuService.insertTElQu(t);
+                    successNumber.getAndIncrement();
+                } catch (Exception e) {
+                    failNumber.getAndIncrement();
+                    logger.info("e:" + e);
+                    failRow.add(failNum.get() + 1);
+                } finally {
+                    latch.countDown(); //线程计数
+                }
+            });
+        }
+        try {
+            latch.await(); //线程计数完毕后继续执行
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        executorService.shutdown();
         logger.info("successNumber:" + String.valueOf(successNumber));
         logger.info("failNumber:" + String.valueOf(failNumber));
         logger.info("failRow:" + String.valueOf(failRow));
+        logger.info("总行数:" + rowNum);
+        logger.info("Row:" + list.size());
         return AjaxResult.success(String.valueOf(successNumber), failRow);
     }
 
     // 通用方法:替换 <sub> 和 <sup> 标签
-    public  String replaceSubSup(String input) {
+    public String replaceSubSup(String input) {
 
         // 映射用于将字符替换为对应的 Unicode 上标或下标
-         Map<Character, String> subMap = new HashMap<>();
+        Map<Character, String> subMap = new HashMap<>();
         Map<Character, String> supMap = new HashMap<>();
         // 下标映射:支持 0-9 和小写字母a
         subMap.put('0', "\u2080");
@@ -845,7 +882,7 @@ public class TElQuController extends BaseController {
 
         int iterationCount = 0;
         // 替换 <sub> 标签
-        while (input.contains("<sub>")&& iterationCount < 500) {
+        while (input.contains("<sub>") && iterationCount < 500) {
             int startIndex = input.indexOf("<sub>");
             int endIndex = input.indexOf("</sub>");
 

+ 11 - 9
master/src/main/java/com/ruoyi/project/training/elearn/service/ITElQuService.java

@@ -5,15 +5,15 @@ import com.ruoyi.project.training.elearn.domain.TElQu;
 
 /**
  * 试题Service接口
- * 
+ *
  * @author ssy
  * @date 2024-05-28
  */
-public interface ITElQuService 
+public interface ITElQuService
 {
     /**
      * 查询试题
-     * 
+     *
      * @param quId 试题ID
      * @return 试题
      */
@@ -21,7 +21,7 @@ public interface ITElQuService
 
     /**
      * 查询试题列表
-     * 
+     *
      * @param tElQu 试题
      * @return 试题集合
      */
@@ -29,15 +29,15 @@ public interface ITElQuService
 
     /**
      * 新增试题
-     * 
+     *
      * @param tElQu 试题
      * @return 结果
      */
     public int insertTElQu(TElQu tElQu);
-
+    public int insertTElQuBatch(TElQu qu , int i);
     /**
      * 修改试题
-     * 
+     *
      * @param tElQu 试题
      * @return 结果
      */
@@ -45,7 +45,7 @@ public interface ITElQuService
 
     /**
      * 批量删除试题
-     * 
+     *
      * @param quIds 需要删除的试题ID
      * @return 结果
      */
@@ -53,9 +53,11 @@ public interface ITElQuService
 
     /**
      * 删除试题信息
-     * 
+     *
      * @param quId 试题ID
      * @return 结果
      */
     public int deleteTElQuById(Long quId);
+
+
 }

+ 39 - 1
master/src/main/java/com/ruoyi/project/training/elearn/service/impl/TElQuServiceImpl.java

@@ -4,10 +4,13 @@ import java.util.ArrayList;
 import java.util.List;
 
 import com.ruoyi.common.exception.BaseException;
+import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.project.training.elearn.domain.TElQuAnswer;
 import com.ruoyi.project.training.elearn.domain.TElQuRepo;
 import com.ruoyi.project.training.elearn.mapper.TElQuAnswerMapper;
 import com.ruoyi.project.training.elearn.mapper.TElQuRepoMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.project.training.elearn.mapper.TElQuMapper;
@@ -33,6 +36,7 @@ public class TElQuServiceImpl implements ITElQuService {
     private TElQuAnswerMapper tElQuAnswerMapper;
     @Resource
     private TElQuRepoMapper tElQuRepoMapper;
+    protected final Logger logger = LoggerFactory.getLogger(BaseController.class);
 
     /**
      * 查询试题
@@ -85,7 +89,6 @@ public class TElQuServiceImpl implements ITElQuService {
     @Transactional
     public int insertTElQu(TElQu tElQu) {
         checkData(tElQu, "");
-        new Thread(() -> {
             //更新答案
             tElQuMapper.insertTElQu(tElQu);
             for (TElQuAnswer as : tElQu.getAnswerList()
@@ -101,11 +104,46 @@ public class TElQuServiceImpl implements ITElQuService {
                 ref.setQuType(tElQu.getQuType());
                 tElQuRepoMapper.insertTElQuRepo(ref);
             }
+        return 1;
+    }
+
+    /**
+     * 新增试题
+     *
+     * @param tElQu 试题
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int insertTElQuBatch(TElQu tElQu , int i) {
+        checkData(tElQu, "");
+        new Thread(() -> {
+            try {
+                //更新答案
+                tElQuMapper.insertTElQu(tElQu);
+                for (TElQuAnswer as : tElQu.getAnswerList()
+                ) {
+                    as.setQuId(tElQu.getQuId());
+                    tElQuAnswerMapper.insertTElQuAnswer(as);
+                }
+                //更新题库
+                for (String repoId : tElQu.getRepoIds()) {
+                    TElQuRepo ref = new TElQuRepo();
+                    ref.setQuId(tElQu.getQuId());
+                    ref.setRepoId(Long.parseLong(repoId));
+                    ref.setQuType(tElQu.getQuType());
+                    tElQuRepoMapper.insertTElQuRepo(ref);
+                }
+            }catch (Exception e) {
+                logger.error("错误行数:" + i+1);
+            }
+
         }, "新增试题").start();
 
         return 1;
     }
 
+
     /**
      * 修改试题
      *