yangdamao vor 2 Wochen
Ursprung
Commit
a84603e64d

+ 19 - 0
zhichen-admin/src/main/java/com/zhichen/controller/bank/QuestionController.java

@@ -299,5 +299,24 @@ public class QuestionController extends BaseController {
         return AjaxResult.success(result);
     }
 
+    @ApiOperation("题库导入")
+    @PostMapping("/importXlsx")
+    public AjaxResult<Map<String,Object>> importXlsxQuestionList(MultipartFile file,String param) throws Exception
+    {
+        List<QuestionImportV4> questionList2 =EasyPoiUtil.importExcel(file,0,1,QuestionImportV4.class);
+        Map<String,Object> result = iQuestionService.importXlsxQuestionList(questionList2,param);
+        return AjaxResult.success(result);
+    }
+
+
+    @ApiOperation("补充题库图片")
+    @PostMapping("/importImage")
+    public AjaxResult<Map<String,Object>> importImage(MultipartFile file) throws Exception
+    {
+        List<QuestionImageVo> questionList2 =EasyPoiUtil.importExcel(file,0,1,QuestionImageVo.class);
+        Map<String,Object> result = iQuestionService.importImage(questionList2);
+        return AjaxResult.success(result);
+    }
+
 
 }

+ 4 - 0
zhichen-system/src/main/java/com/zhichen/modules/bank/service/IQuestionService.java

@@ -117,4 +117,8 @@ public interface IQuestionService extends IService<Question> {
 	String getMeasureList();
 
 	String getTopicList(String topParam);
+
+	Map<String, Object> importXlsxQuestionList(List<QuestionImportV4> questionList2,String param);
+
+	Map<String, Object> importImage(List<QuestionImageVo> questionList2);
 }

+ 291 - 0
zhichen-system/src/main/java/com/zhichen/modules/bank/service/impl/QuestionServiceImpl.java

@@ -53,6 +53,7 @@ import com.zhichen.modules.goods.service.IGoodsService;
 import com.zhichen.modules.goods.vo.BankGoodsExamVo;
 import com.zhichen.modules.goods.vo.GoodsExamTimeVo;
 import com.zhichen.modules.goods.vo.GoodsUserQuestionVo;
+import com.zhichen.modules.txcos.service.CosService;
 import com.zhichen.modules.user.bo.CheckUserExamRecordBo;
 import com.zhichen.modules.user.bo.UserSpecialExamRecord;
 import com.zhichen.modules.user.domain.User;
@@ -77,6 +78,8 @@ import org.w3c.dom.NodeList;
 
 import java.io.*;
 import java.math.BigDecimal;
+import java.net.HttpURLConnection;
+import java.net.URL;
 import java.text.NumberFormat;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
@@ -165,6 +168,9 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
     @Autowired
     private OssService ossService;
 
+    @Autowired
+    private CosService cosService;
+
     @Autowired
     private IMajorService iMajorService;
 
@@ -4241,6 +4247,291 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         return HttpUtils.sendGet(QUESTION_DETAIL, topParam);
     }
 
+    @Override
+    public Map<String, Object> importXlsxQuestionList( List<QuestionImportV4> questionList2,String param) {
+        if (CollectionUtils.isEmpty(questionList2)){
+            return new HashMap<>();
+        }
+
+        for (int i = 0; i < questionList2.size(); i++) {
+            QuestionImportV4 questionImportV4 = questionList2.get(i);
+            Integer a = 0;
+            Question question = new Question();
+            question.setStatus(1);
+            question.setPublishStatus(1);
+            question.setCode(ServletUtils.getEncoded("TM"));
+            question.setFromPlat(1);
+            if (questionImportV4.getAnalysisContent().equals("单选题") && questionImportV4.getType().equals("否")){
+                //单选向下取4格
+                a = 4;
+                List<QuestionImportV4> questionImportV = questionList2.subList(i, i + a);
+                //第一个是内容
+                QuestionImportV4 v4 = questionImportV.get(0);
+                question.setContent(v4.getQuestionName());
+                question.setType(1);
+                question.setAnswerQuestion(v4.getDescribe());
+                question.setCode(ServletUtils.getEncoded("TM"));
+                //正确选项
+                Integer index = 0;
+                //转换单选选项
+                List<QuestionOptionVo> vos = new ArrayList<>();
+                for (int i1 = 0; i1 < questionImportV.size(); i1++) {
+                    QuestionImportV4 questionImportV41 = questionImportV.get(i1);
+                    QuestionOptionVo vo = new QuestionOptionVo();
+                    vo.setContent(questionImportV41.getOption());
+                    vo.setOptionsId(i1+1);
+                    if (questionImportV41.getCorrect().equals("是")){
+                        index = i1 +1;
+                    }
+                    vos.add(vo);
+                }
+                question.setAnswerQuestion(index.toString());
+                question.setJsonStr(JSONArray.toJSONString(vos));
+            }else if (questionImportV4.getAnalysisContent().equals("多选题") && questionImportV4.getType().equals("否")){
+                a = 5;
+                List<QuestionImportV4> questionImportV1 = questionList2.subList(i, i + a);
+                //第一个是内容
+                QuestionImportV4 v41 = questionImportV1.get(0);
+                question.setContent(v41.getQuestionName());
+                question.setType(2);
+                question.setAnswerQuestion(v41.getDescribe());
+                //正确选项
+                List<Integer> index1 = new ArrayList<>();
+                //转换单选选项
+                List<QuestionOptionVo> vos1 = new ArrayList<>();
+                for (int i1 = 0; i1 < questionImportV1.size(); i1++) {
+                    QuestionImportV4 questionImportV41 = questionImportV1.get(i1);
+                    QuestionOptionVo vo = new QuestionOptionVo();
+                    vo.setContent(questionImportV41.getOption());
+                    vo.setOptionsId(i1+1);
+                    if (questionImportV41.getCorrect().equals("是")){
+                        index1.add(i1+1);
+                    }
+                    vos1.add(vo);
+                }
+                question.setAnswerQuestion(index1.stream().map(x -> x.toString()).collect(Collectors.joining(",")));
+                question.setJsonStr(JSONArray.toJSONString(vos1));
+            }else if (questionImportV4.getAnalysisContent().equals("判断题") && questionImportV4.getType().equals("否")){
+                a = 2;
+                List<QuestionImportV4> questionImportV2 = questionList2.subList(i, i + a);
+                //第一个是内容
+                QuestionImportV4 v42 = questionImportV2.get(0);
+                question.setContent(v42.getQuestionName());
+                question.setType(3);
+                question.setAnswerQuestion(v42.getDescribe());
+                //正确选项
+                Integer index2 = 0;
+                //转换单选选项
+                for (QuestionImportV4 importV4 : questionImportV2) {
+                    if (importV4.getCorrect().equals("是")){
+                        index2 = importV4.getOption().equals("正确")?1:0;
+                    }
+                }
+                question.setAnswerQuestion(index2.toString());
+
+            }else if (questionImportV4.getAnalysisContent().equals("案例题")){
+                a = 1;
+                List<QuestionImportV4> questionImportV3 = questionList2.subList(i, i + a);
+                //第一个是内容
+                QuestionImportV4 v42 = questionImportV3.get(0);
+                question.setContent(v42.getQuestionName());
+                question.setType(4);
+                question.setAnswerQuestion(v42.getDescribe());
+                //截取案例题小题
+                List<QuestionImportV4> vv = new ArrayList<>();
+                for (int i1 = i+1; i1 < questionList2.size(); i1++) {
+                    QuestionImportV4 questionImportV41 = questionList2.get(i1);
+                    if (StringUtils.isNotBlank(questionImportV41.getAnalysisContent()) && questionImportV41.getAnalysisContent().equals("案例题")){
+                        //碰到下一个案例题停止循环
+                        break ;
+                    }
+                    vv.add(questionImportV41);
+                }
+                if (CollectionUtils.isNotEmpty(vv)){
+                    List<QuestionInfoVo> vv1 = new ArrayList<>();
+                    for (int i1 = 0; i1 < vv.size(); i1++) {
+                        QuestionImportV4 questionImportV41 = vv.get(i1);
+                        Integer y = 0;
+                        if (questionImportV41.getAnalysisContent().equals("单选题")){
+                            //单选向下取4格
+                            y = 4;
+                            List<QuestionImportV4> questionImportV5 = vv.subList(i1, i1 + y);
+                            QuestionImportV4 questionImportV42 = questionImportV5.get(0);
+                            QuestionInfoVo questionInfoVo = new QuestionInfoVo();
+                            questionInfoVo.setContent(questionImportV42.getQuestionName());
+                            questionInfoVo.setType(1);
+                            //正确选项
+                            Integer index = 0;
+                            //转换单选选项
+                            List<QuestionDetailVo> vos = new ArrayList<>();
+                            for (int i2 = 0; i2 < questionImportV5.size(); i2++) {
+                                QuestionImportV4 questionImportV43 = questionImportV5.get(i2);
+                                QuestionDetailVo vo = new QuestionDetailVo();
+                                vo.setContent(questionImportV43.getOption());
+                                vo.setOptionsId(i2+1);
+                                if (questionImportV43.getCorrect().equals("是")){
+                                    index = i2 +1;
+                                }
+                                vos.add(vo);
+                            }
+                            questionInfoVo.setAnswerQuestion(index.toString());
+                            questionInfoVo.setOptionsList(vos);
+                            vv1.add(questionInfoVo);
+                            a = a+y;
+                        }else if (questionImportV41.getAnalysisContent().equals("多选题")){
+                            //单选向下取5格
+                            y = 5;
+                            List<QuestionImportV4> questionImportV6 = vv.subList(i1, i1 + y);
+                            QuestionImportV4 questionImportV42 = questionImportV6.get(0);
+                            QuestionInfoVo questionInfoVo = new QuestionInfoVo();
+                            questionInfoVo.setContent(questionImportV42.getQuestionName());
+                            questionInfoVo.setType(2);
+                            //正确选项
+                            List<Integer> index = new ArrayList<>();
+                            //转换单选选项
+                            List<QuestionDetailVo> vos = new ArrayList<>();
+                            for (int i2 = 0; i2 < questionImportV6.size(); i2++) {
+                                QuestionImportV4 questionImportV43 = questionImportV6.get(i2);
+                                QuestionDetailVo vo = new QuestionDetailVo();
+                                vo.setContent(questionImportV43.getOption());
+                                vo.setOptionsId(i2+1);
+                                if (questionImportV43.getCorrect().equals("是")){
+                                    index.add(i2 +1);
+                                }
+                                vos.add(vo);
+                            }
+                            questionInfoVo.setAnswerQuestion(index.stream().map(x -> x.toString()).collect(Collectors.joining(",")));
+                            questionInfoVo.setOptionsList(vos);
+                            vv1.add(questionInfoVo);
+                            a = a+y;
+                        }else if (questionImportV41.getAnalysisContent().equals("判断题")){
+                            //单选向下取2格
+                            y = 2;
+                            List<QuestionImportV4> questionImportV7 = vv.subList(i1, i1 + y);
+                            QuestionImportV4 questionImportV42 = questionImportV7.get(0);
+                            QuestionInfoVo questionInfoVo = new QuestionInfoVo();
+                            questionInfoVo.setContent(questionImportV42.getQuestionName());
+                            questionInfoVo.setType(3);
+                            //正确选项
+                            Integer index2 = 0;
+                            //转换单选选项
+                            for (QuestionImportV4 importV4 : questionImportV7) {
+                                if (importV4.getCorrect().equals("是")){
+                                    index2 = importV4.getOption().equals("正确")?1:0;
+                                }
+                            }
+                            questionInfoVo.setAnswerQuestion(index2.toString());
+                            vv1.add(questionInfoVo);
+                            a = a+y;
+                        }
+                        i1 = i1+y-1;
+                    }
+                    question.setJsonStr(JSONArray.toJSONString(vv1));
+                }
+            }
+
+            question.setCreateTime(DateUtils.getNowTime());
+            question.setUpdateTime(DateUtils.getNowTime());
+            save(question);
+            //题目业务层次
+            QuestionBusinessImportVo importVo = JSON.parseObject(param, QuestionBusinessImportVo.class);
+            CourseEducationType educationType = iCourseEducationTypeService
+                    .getOne(new LambdaQueryWrapper<CourseEducationType>()
+                            .eq(CourseEducationType::getEducationName, importVo.getEducationName())
+                            .eq(CourseEducationType::getStatus, 1)
+                            .last("limit 1"));
+            CourseProjectType projectType = iCourseProjectTypeService.getOne(new LambdaUpdateWrapper<CourseProjectType>()
+                    .eq(CourseProjectType::getEducationId, educationType.getId())
+                    .eq(CourseProjectType::getProjectName, importVo.getProjectName())
+                    .eq(CourseProjectType::getStatus, 1)
+                    .last("limit 1"));
+            CourseBusiness business = iCourseBusinessService.getOne(new LambdaUpdateWrapper<CourseBusiness>()
+                    .eq(CourseBusiness::getProjectId, projectType.getId())
+                    .eq(CourseBusiness::getBusinessName, importVo.getBusinessName())
+                    .eq(CourseBusiness::getStatus, 1)
+                    .last("limit 1"));
+            CourseSubject courseSubject = iCourseSubjectService.getOneByName(importVo.getSubjectName(),projectType.getId());
+            QuestionBusiness business1 = new QuestionBusiness();
+            business1.setEducationTypeId(educationType.getId());
+            business1.setProjectId(projectType.getId());
+            business1.setBusinessId(business.getId());
+            business1.setSubjectId(courseSubject.getId());
+            business1.setMajorId(question.getQuestionId());
+            business1.setType(1);
+            iQuestionBusinessService.save(business1);
+
+            //重置索引
+            i = i+a-1;
+        }
+
+        return Collections.emptyMap();
+    }
+
+    @Override
+    public Map<String, Object> importImage(List<QuestionImageVo> questionList2) {
+        if (CollectionUtils.isEmpty(questionList2)){
+            return Collections.emptyMap();
+        }
+        String path = "https://www.xyyxt.net";
+        for (QuestionImageVo imageVo : questionList2) {
+            String imageUrl = imageVo.getImageUrl();
+            // 使用正则表达式匹配图片路径
+            Pattern pattern = Pattern.compile("src=\"([^\"]+)\"");
+            Matcher matcher = pattern.matcher(imageUrl);
+            String imagePath = "";
+            if (matcher.find()) {
+                imagePath = path + matcher.group(1);
+            } else {
+                continue;
+            }
+
+            // 提取单引号内的中文内容
+            // 匹配单引号内的中文字符(包括中文标点)
+            Pattern pattern1 = Pattern.compile("Title='([^']+[\\u4e00-\\u9fa5]+[^']*)'");
+            Matcher matcher1 = pattern1.matcher(imageUrl);
+            String chineseText = "";
+            if (matcher1.find()) {
+                chineseText = matcher1.group(1);
+            }else {
+                continue;
+            }
+
+            Question question = getOne(new LambdaQueryWrapper<Question>().eq(Question::getStatus, 1).eq(Question::getContent, chineseText).last("limit 1"));
+            if (ObjectUtils.isNull(question)){
+                continue;
+            }
+            String ossPath = "";
+            //上传oss图片
+            try {
+                URL url = new URL(imagePath);
+                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+                connection.setRequestMethod("GET");
+                connection.setConnectTimeout(5000);
+                connection.setReadTimeout(5000);
+
+                // 检查响应码
+                int responseCode = connection.getResponseCode();
+                if (responseCode == HttpURLConnection.HTTP_OK) {
+                    try (InputStream inputStream = connection.getInputStream()) {
+                        String s = cosService.uploadInputStream(inputStream,6);
+                        ossPath = ossHost + "/" + s;
+
+                    }
+                }
+                connection.disconnect();
+            } catch (Exception e) {
+                throw new CustomException("oss图片上传失败");
+            }
+            if (StringUtils.isNotBlank(ossPath)){
+                String format = String.format("<p>%s<img src=\"%s\"></p>", question.getContent(), ossPath);
+                question.setContent(format);
+                updateById(question);
+            }
+        }
+
+        return Collections.emptyMap();
+    }
+
     private void handlePhoto(List<ExternalQuestionDetailVo> questionDetailVos) {
         String prefix = "\\Uploads\\qdytopic\\";
         String upStr = OSS_PREFIX + "/web/Uploads/qdytopic/";

+ 34 - 0
zhichen-system/src/main/java/com/zhichen/modules/bank/vo/QuestionBusinessImportVo.java

@@ -0,0 +1,34 @@
+package com.zhichen.modules.bank.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 题目业务层次关系视图对象 mall_package
+ *
+ * @author hjl
+ * @date 2021-10-25
+ */
+@Data
+@ApiModel("题目业务层次关系视图对象")
+public class QuestionBusinessImportVo implements Serializable {
+
+	/** 教育类型id */
+	@ApiModelProperty("教育类型id")
+	private String educationName;
+	/** 业务层次id */
+	@ApiModelProperty("业务层次id")
+	private String businessName;
+	/** 项目ID */
+	@ApiModelProperty("项目ID")
+	private String projectName;
+	/** 科目id */
+	@ApiModelProperty("科目id")
+	private String subjectName;
+	@ApiModelProperty("$column.columnComment")
+	private String majorName;
+}

+ 25 - 0
zhichen-system/src/main/java/com/zhichen/modules/bank/vo/QuestionImageVo.java

@@ -0,0 +1,25 @@
+package com.zhichen.modules.bank.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+
+/**
+ * 题库题目添加对象 question
+ *
+ * @author hjl
+ * @date 2021-10-22
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class QuestionImageVo implements Serializable {
+
+    @Excel(name = "图片路径")
+    private String imageUrl;
+
+}

+ 43 - 0
zhichen-system/src/main/java/com/zhichen/modules/bank/vo/QuestionImportV4.java

@@ -0,0 +1,43 @@
+package com.zhichen.modules.bank.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+
+/**
+ * 题库题目添加对象 question
+ *
+ * @author hjl
+ * @date 2021-10-22
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class QuestionImportV4 implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 前缀名称 */
+    @Excel(name = "*题目内容")
+    private String questionName;
+
+    /** 题目正文 */
+    @Excel(name = "*题目选项")
+    private String option;
+
+    @Excel(name = "*是否正确选项")
+    private String correct;
+
+    @Excel(name = "*题型")
+    private String analysisContent;
+
+    @Excel(name = "是否案例小题")
+    private String type;
+
+    @Excel(name = "描述")
+    private String describe;
+}

+ 13 - 0
zhichen-system/src/main/java/com/zhichen/modules/bank/vo/QuestionOptionVo.java

@@ -0,0 +1,13 @@
+package com.zhichen.modules.bank.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class QuestionOptionVo implements Serializable {
+
+    private String content;
+
+    private Integer optionsId;
+}

+ 2 - 0
zhichen-system/src/main/java/com/zhichen/modules/course/mapper/CourseSubjectMapper.java

@@ -41,4 +41,6 @@ public interface CourseSubjectMapper extends BaseMapper<CourseSubject> {
 
     @InterceptorIgnore(tenantLine = "true")
     List<CourseSubject> getListByIDs(@Param("ids") List<Long> ids);
+
+    CourseSubject getOneByName(String subjectName, Long proId);
 }

+ 2 - 0
zhichen-system/src/main/java/com/zhichen/modules/course/service/ICourseSubjectService.java

@@ -62,4 +62,6 @@ public interface ICourseSubjectService extends IService<CourseSubject> {
 	List<CourseSubject> listByIdsTenant(ClassGradeListBo bgListBo);
 
     List<CourseSubject> getListByIDs(List<Long> ids);
+
+    CourseSubject getOneByName(String subjectName, Long id);
 }

+ 5 - 0
zhichen-system/src/main/java/com/zhichen/modules/course/service/impl/CourseSubjectServiceImpl.java

@@ -193,4 +193,9 @@ public class CourseSubjectServiceImpl extends ServiceImpl<CourseSubjectMapper, C
     public List<CourseSubject> getListByIDs(List<Long> ids) {
         return baseMapper.getListByIDs(ids);
     }
+
+    @Override
+    public CourseSubject getOneByName(String subjectName, Long proId) {
+        return baseMapper.getOneByName(subjectName,proId);
+    }
 }

+ 4 - 0
zhichen-system/src/main/java/com/zhichen/modules/txcos/service/CosService.java

@@ -3,9 +3,13 @@ package com.zhichen.modules.txcos.service;
 
 import com.zhichen.modules.alioss.bo.OssRequest;
 
+import java.io.InputStream;
+
 public interface CosService {
 
     String upload(OssRequest file) throws Exception;
 
+    String uploadInputStream(InputStream inputStream, Integer imageStatus)throws Exception;
+
     String uploadWithPath(OssRequest file, String path)throws Exception;
 }

+ 23 - 0
zhichen-system/src/main/java/com/zhichen/modules/txcos/service/impl/CosServiceImpl.java

@@ -62,6 +62,29 @@ public class CosServiceImpl implements CosService {
         return key;
     }
 
+    @Override
+    public String uploadInputStream(InputStream inputStream, Integer imageStatus) throws Exception{
+        // 初始化COS客户端
+        COSClient cosClient = initCOSClient();
+        OssRequest ossRequest = new OssRequest();
+        ossRequest.setImageStatus(imageStatus);
+
+        String fileName = TENGXUN_COS_DIR_PREFIX + generateRandomFilename(ossRequest);
+
+        // 指定要上传的文件
+        String bucketName = TENGXUN_COS_BUCKET_NAME;
+        String key =fileName; // 对象键,即上传到COS后的文件路径
+        ObjectMetadata metadata = new ObjectMetadata();
+        metadata.setContentType("image/jpeg"); // 设置 Content-Type
+        // 上传文件
+        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream,metadata);
+        cosClient.putObject(putObjectRequest);
+
+        // 关闭客户端
+        cosClient.shutdown();
+        return key;
+    }
+
     @Override
     public String uploadWithPath(OssRequest file, String path)throws Exception {
         // 初始化COS客户端

+ 13 - 0
zhichen-system/src/main/resources/mapper/modules/course/CourseSubjectMapper.xml

@@ -164,4 +164,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </foreach>
         </if>
     </select>
+
+    <select id="getOneByName"  resultType="com.zhichen.modules.course.domain.CourseSubject">
+        SELECT
+            cs.*
+        FROM
+            course_subject cs
+                LEFT JOIN course_subject_project csp ON cs.id = csp.subject_id
+        WHERE
+            csp.project_id = #{proId}
+          AND cs.subject_name = #{subjectName}
+          AND cs.`status` = 1
+            LIMIT 1
+    </select>
 </mapper>