diff --git a/enlish-service/pom.xml b/enlish-service/pom.xml
index 2b47dd8..92963e1 100644
--- a/enlish-service/pom.xml
+++ b/enlish-service/pom.xml
@@ -90,6 +90,11 @@
log4j-core
+
+ com.deepoove
+ poi-tl
+
+
diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/AssessmentController.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/AssessmentController.java
new file mode 100644
index 0000000..5248e61
--- /dev/null
+++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/AssessmentController.java
@@ -0,0 +1,77 @@
+package com.yinlihupo.enlish.service.controller;
+
+
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
+import com.yinlihupo.enlish.service.enums.AssessmentsType;
+import com.yinlihupo.enlish.service.model.bo.Word;
+import com.yinlihupo.enlish.service.model.vo.assessment.AssessmentStudentReqVO;
+import com.yinlihupo.enlish.service.service.AssessmentService;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.PatchMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RequestMapping("/assessment/")
+@RestController
+@Slf4j
+public class AssessmentController {
+
+ @Resource
+ private AssessmentService assessmentService;
+
+ @PatchMapping("felt")
+ public void generateAssessmentDocxStudent(@RequestBody AssessmentStudentReqVO assessmentStudentReqVO, HttpServletResponse response) {
+ Integer studentId = assessmentStudentReqVO.getStudentId();
+ HashMap unitIdAndWordCount = assessmentStudentReqVO.getUnitIdAndWordCount();
+
+ int assessmentDocxId = assessmentService.getAssessmentDocxId(studentId, AssessmentsType.ASSESSMENT_FELT);
+ List assessmentWords;
+ if (assessmentDocxId == 0) {
+ assessmentWords = assessmentService.genAssessmentWords(studentId, unitIdAndWordCount);
+ assessmentDocxId = assessmentService.getAssessmentDocxId(studentId, AssessmentsType.ASSESSMENT_FELT);
+ } else {
+ assessmentWords = assessmentService.getAssessmentWordsById(assessmentDocxId);
+ }
+
+ LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
+ Configure config = Configure.builder()
+ .bind("words", policy)
+ .bind("answer", policy)
+ .build();
+
+ Map data = new HashMap<>();
+ data.put("assessment_id", assessmentDocxId);
+ data.put("words", assessmentWords);
+ data.put("answer", assessmentWords);
+
+ // 4. 渲染并输出
+ try (XWPFTemplate template = XWPFTemplate.compile("C:\\project\\java\\enlish_edu\\enlish\\enlish-service\\src\\main\\resources\\templates\\assessment.docx", config)) {
+ template.render(data);
+ String fileName = URLEncoder.encode( assessmentDocxId + "摸底测试.docx", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
+ response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
+ response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName);
+
+ OutputStream out = response.getOutputStream();
+ template.write(out);
+
+ out.flush();
+ out.close();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+
+ }
+}
diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/AssessmentsDO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/AssessmentsDO.java
new file mode 100644
index 0000000..ddfa26b
--- /dev/null
+++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/AssessmentsDO.java
@@ -0,0 +1,32 @@
+package com.yinlihupo.enlish.service.domain.dataobject;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Builder
+public class AssessmentsDO {
+
+ private Integer id;
+
+ private Integer studentId;
+
+ private LocalDateTime testDate;
+
+ private Integer testType;
+
+ private Integer level;
+
+ private Integer estimatedVocabSize;
+
+ private String contentDetailsJson;
+
+}
\ No newline at end of file
diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/WordMasteryLogDO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/WordMasteryLogDO.java
new file mode 100644
index 0000000..48ff77a
--- /dev/null
+++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/WordMasteryLogDO.java
@@ -0,0 +1,25 @@
+package com.yinlihupo.enlish.service.domain.dataobject;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Builder
+public class WordMasteryLogDO {
+ private Integer id;
+
+ private Integer studentId;
+
+ private Integer wordId;
+
+ private Integer reviewCount;
+
+ private BigDecimal memoryStrength;
+
+}
\ No newline at end of file
diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/AssessmentsDOMapper.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/AssessmentsDOMapper.java
new file mode 100644
index 0000000..5db630e
--- /dev/null
+++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/AssessmentsDOMapper.java
@@ -0,0 +1,24 @@
+package com.yinlihupo.enlish.service.domain.mapper;
+
+import com.yinlihupo.enlish.service.domain.dataobject.AssessmentsDO;
+import org.apache.ibatis.annotations.Param;
+
+public interface AssessmentsDOMapper {
+ int deleteByPrimaryKey(Integer id);
+
+ int insert(AssessmentsDO record);
+
+ int insertSelective(AssessmentsDO record);
+
+ AssessmentsDO selectByPrimaryKey(Integer id);
+
+ int updateByPrimaryKeySelective(AssessmentsDO record);
+
+ int updateByPrimaryKeyWithBLOBs(AssessmentsDO record);
+
+ int updateByPrimaryKey(AssessmentsDO record);
+
+ Integer selectAssessmentsIdByStudentIdAndTestType(@Param("studentId") Integer studentId, @Param("testType") Integer testType);
+
+ String selectContentDetailsJsonByAssessmentsId(@Param("assessmentsId") Integer assessmentsId);
+}
\ No newline at end of file
diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/VocabularyBankDOMapper.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/VocabularyBankDOMapper.java
index db03dd2..4418c3f 100644
--- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/VocabularyBankDOMapper.java
+++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/VocabularyBankDOMapper.java
@@ -1,6 +1,9 @@
package com.yinlihupo.enlish.service.domain.mapper;
import com.yinlihupo.enlish.service.domain.dataobject.VocabularyBankDO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
public interface VocabularyBankDOMapper {
int deleteByPrimaryKey(Integer id);
@@ -14,4 +17,6 @@ public interface VocabularyBankDOMapper {
int updateByPrimaryKeySelective(VocabularyBankDO record);
int updateByPrimaryKey(VocabularyBankDO record);
+
+ List selectVocabularyBankDOListByUnitId(@Param("unitId") Integer unitId, @Param("wordCount") Integer wordCount);
}
\ No newline at end of file
diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/WordMasteryLogDOMapper.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/WordMasteryLogDOMapper.java
new file mode 100644
index 0000000..b06d58a
--- /dev/null
+++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/WordMasteryLogDOMapper.java
@@ -0,0 +1,12 @@
+package com.yinlihupo.enlish.service.domain.mapper;
+
+import com.yinlihupo.enlish.service.domain.dataobject.WordMasteryLogDO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface WordMasteryLogDOMapper {
+
+ // 查询指定学生指定单元的词,根据记忆强度排序
+ List selectByStudentIdAndUnitIdOrderByMemoryStrength(@Param("studentId") Integer studentId, @Param("unitId") Integer unitId, @Param("limit") Integer limit);
+}
\ No newline at end of file
diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/enums/AssessmentsType.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/enums/AssessmentsType.java
new file mode 100644
index 0000000..c2bfd7b
--- /dev/null
+++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/enums/AssessmentsType.java
@@ -0,0 +1,15 @@
+package com.yinlihupo.enlish.service.enums;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum AssessmentsType {
+
+ ASSESSMENT_FELT(1, "摸底测试");
+
+ private final Integer id;
+ private final String name;
+}
diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/bo/Word.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/bo/Word.java
new file mode 100644
index 0000000..26746cb
--- /dev/null
+++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/bo/Word.java
@@ -0,0 +1,19 @@
+package com.yinlihupo.enlish.service.model.bo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Builder
+public class Word {
+
+ private Integer id;
+
+ private String title;
+
+ private String definition;
+}
diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/bo/package-info.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/bo/package-info.java
new file mode 100644
index 0000000..4cc348a
--- /dev/null
+++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/bo/package-info.java
@@ -0,0 +1,2 @@
+// 中间层:业务对象
+package com.yinlihupo.enlish.service.model.bo;
\ No newline at end of file
diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/package-info.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/package-info.java
new file mode 100644
index 0000000..a9d61b6
--- /dev/null
+++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/package-info.java
@@ -0,0 +1 @@
+package com.yinlihupo.enlish.service.model;
\ No newline at end of file
diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/assessment/AssessmentStudentReqVO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/assessment/AssessmentStudentReqVO.java
new file mode 100644
index 0000000..00f4460
--- /dev/null
+++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/assessment/AssessmentStudentReqVO.java
@@ -0,0 +1,27 @@
+package com.yinlihupo.enlish.service.model.vo.assessment;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.HashMap;
+
+// 进行摸底测试
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Builder
+public class AssessmentStudentReqVO {
+
+ /**
+ * 学生 id
+ */
+ private Integer studentId;
+
+
+ /**
+ * 单元 id 和词数
+ */
+ private HashMap unitIdAndWordCount;
+}
diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/AssessmentService.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/AssessmentService.java
new file mode 100644
index 0000000..abae1df
--- /dev/null
+++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/AssessmentService.java
@@ -0,0 +1,17 @@
+package com.yinlihupo.enlish.service.service;
+
+
+import com.yinlihupo.enlish.service.enums.AssessmentsType;
+import com.yinlihupo.enlish.service.model.bo.Word;
+
+import java.util.HashMap;
+import java.util.List;
+
+public interface AssessmentService {
+
+ List genAssessmentWords(Integer studentId, HashMap unitIdAndWordCount);
+
+ Integer getAssessmentDocxId(Integer studentId, AssessmentsType assessmentsType);
+
+ List getAssessmentWordsById(Integer id);
+}
diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/assessment/AssessmentServiceImpl.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/assessment/AssessmentServiceImpl.java
new file mode 100644
index 0000000..2950db4
--- /dev/null
+++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/assessment/AssessmentServiceImpl.java
@@ -0,0 +1,82 @@
+package com.yinlihupo.enlish.service.service.assessment;
+
+import com.yinlihupo.enlish.service.domain.dataobject.AssessmentsDO;
+import com.yinlihupo.enlish.service.domain.dataobject.VocabularyBankDO;
+import com.yinlihupo.enlish.service.domain.mapper.AssessmentsDOMapper;
+import com.yinlihupo.enlish.service.domain.mapper.VocabularyBankDOMapper;
+import com.yinlihupo.enlish.service.domain.mapper.WordMasteryLogDOMapper;
+import com.yinlihupo.enlish.service.enums.AssessmentsType;
+import com.yinlihupo.enlish.service.model.bo.Word;
+import com.yinlihupo.enlish.service.service.AssessmentService;
+import com.yinlihupo.framework.common.util.JsonUtils;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class AssessmentServiceImpl implements AssessmentService {
+
+ @Resource
+ private VocabularyBankDOMapper vocabularyBankDOMapper;
+ @Resource
+ private WordMasteryLogDOMapper wordMasteryLogDOMapper;
+ @Resource
+ private AssessmentsDOMapper assessmentsDOMapper;
+
+ @Override
+ public List genAssessmentWords(Integer studentId, HashMap unitIdAndWordCount) {
+
+ List words = new ArrayList<>();
+ for (Map.Entry entry : unitIdAndWordCount.entrySet()) {
+ Integer unitId = entry.getKey();
+ Integer wordCount = entry.getValue();
+
+ List vocabularyBankDOS = vocabularyBankDOMapper.selectVocabularyBankDOListByUnitId(unitId, wordCount);
+ words.addAll(
+ vocabularyBankDOS.stream()
+ .map(vocabularyBankDO -> Word.builder()
+ .id(vocabularyBankDO.getId())
+ .title(vocabularyBankDO.getWord())
+ .definition(vocabularyBankDO.getDefinition())
+ .build())
+ .toList()
+ );
+ }
+
+ assessmentsDOMapper.insertSelective(
+ AssessmentsDO.builder()
+ .studentId(studentId)
+ .level(0)
+ .testType(AssessmentsType.ASSESSMENT_FELT.getId())
+ .testDate(LocalDateTime.now())
+ .estimatedVocabSize(0)
+ .contentDetailsJson(JsonUtils.toJsonString(words))
+ .build()
+ );
+
+ return words;
+ }
+
+ @Override
+ public Integer getAssessmentDocxId(Integer studentId, AssessmentsType assessmentsType) {
+ return assessmentsDOMapper.selectAssessmentsIdByStudentIdAndTestType(studentId, assessmentsType.getId());
+ }
+
+ @Override
+ public List getAssessmentWordsById(Integer id) {
+ String contentJson = assessmentsDOMapper.selectContentDetailsJsonByAssessmentsId(id);
+ try {
+ return JsonUtils.parseList(contentJson, Word.class);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+
+}
diff --git a/enlish-service/src/main/resources/generatorConfig.xml b/enlish-service/src/main/resources/generatorConfig.xml
index 98b5ad0..fa7fa14 100644
--- a/enlish-service/src/main/resources/generatorConfig.xml
+++ b/enlish-service/src/main/resources/generatorConfig.xml
@@ -45,7 +45,7 @@
targetProject="src/main/java"/>
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id, student_id, test_date, test_type, level, estimated_vocab_size
+
+
+
+ content_details_json
+
+
+
+
+
+ delete from assessments
+ where id = #{id,jdbcType=INTEGER}
+
+
+
+ insert into assessments (id, student_id, test_date,
+ test_type, level, estimated_vocab_size,
+ content_details_json)
+ values (#{id,jdbcType=INTEGER}, #{studentId,jdbcType=INTEGER}, #{testDate,jdbcType=TIMESTAMP},
+ #{testType,jdbcType=INTEGER}, #{level,jdbcType=INTEGER}, #{estimatedVocabSize,jdbcType=INTEGER},
+ #{contentDetailsJson,jdbcType=LONGVARCHAR})
+
+
+
+ insert into assessments
+
+
+ id,
+
+
+ student_id,
+
+
+ test_date,
+
+
+ test_type,
+
+
+ level,
+
+
+ estimated_vocab_size,
+
+
+ content_details_json,
+
+
+
+
+ #{id,jdbcType=INTEGER},
+
+
+ #{studentId,jdbcType=INTEGER},
+
+
+ #{testDate,jdbcType=TIMESTAMP},
+
+
+ #{testType,jdbcType=INTEGER},
+
+
+ #{level,jdbcType=INTEGER},
+
+
+ #{estimatedVocabSize,jdbcType=INTEGER},
+
+
+ #{contentDetailsJson,jdbcType=LONGVARCHAR},
+
+
+
+
+
+ update assessments
+
+
+ student_id = #{studentId,jdbcType=INTEGER},
+
+
+ test_date = #{testDate,jdbcType=TIMESTAMP},
+
+
+ test_type = #{testType,jdbcType=INTEGER},
+
+
+ level = #{level,jdbcType=INTEGER},
+
+
+ estimated_vocab_size = #{estimatedVocabSize,jdbcType=INTEGER},
+
+
+ content_details_json = #{contentDetailsJson,jdbcType=LONGVARCHAR},
+
+
+ where id = #{id,jdbcType=INTEGER}
+
+
+
+ update assessments
+ set student_id = #{studentId,jdbcType=INTEGER},
+ test_date = #{testDate,jdbcType=TIMESTAMP},
+ test_type = #{testType,jdbcType=INTEGER},
+ level = #{level,jdbcType=INTEGER},
+ estimated_vocab_size = #{estimatedVocabSize,jdbcType=INTEGER},
+ content_details_json = #{contentDetailsJson,jdbcType=LONGVARCHAR}
+ where id = #{id,jdbcType=INTEGER}
+
+
+
+ update assessments
+ set student_id = #{studentId,jdbcType=INTEGER},
+ test_date = #{testDate,jdbcType=TIMESTAMP},
+ test_type = #{testType,jdbcType=INTEGER},
+ level = #{level,jdbcType=INTEGER},
+ estimated_vocab_size = #{estimatedVocabSize,jdbcType=INTEGER}
+ where id = #{id,jdbcType=INTEGER}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/enlish-service/src/main/resources/mapper/VocabularyBankDOMapper.xml b/enlish-service/src/main/resources/mapper/VocabularyBankDOMapper.xml
index 4e17f8e..4616f99 100644
--- a/enlish-service/src/main/resources/mapper/VocabularyBankDOMapper.xml
+++ b/enlish-service/src/main/resources/mapper/VocabularyBankDOMapper.xml
@@ -97,4 +97,11 @@
where id = #{id,jdbcType=INTEGER}
+
+
\ No newline at end of file
diff --git a/enlish-service/src/main/resources/mapper/WordMasteryLogDOMapper.xml b/enlish-service/src/main/resources/mapper/WordMasteryLogDOMapper.xml
new file mode 100644
index 0000000..98fcbff
--- /dev/null
+++ b/enlish-service/src/main/resources/mapper/WordMasteryLogDOMapper.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ id, student_id, word_id, review_count, memory_strength
+
+
+
+
+
\ No newline at end of file
diff --git a/enlish-service/src/main/resources/templates/assessment.docx b/enlish-service/src/main/resources/templates/assessment.docx
new file mode 100644
index 0000000..0458696
Binary files /dev/null and b/enlish-service/src/main/resources/templates/assessment.docx differ
diff --git a/pom.xml b/pom.xml
index 30b9eca..c768f7e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -103,6 +103,12 @@
2.20.0
+
+ com.deepoove
+ poi-tl
+ 1.12.1
+
+
org.projectlombok