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