diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/LessonPlanConstant.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/LessonPlanConstant.java index 5addc7f..557df22 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/LessonPlanConstant.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/LessonPlanConstant.java @@ -1,10 +1,17 @@ package com.yinlihupo.enlish.service.constant; -public interface LessonPlanConstant { +public class LessonPlanConstant { - String TITLE = "Title"; - String PASSAGE = "ThePassage"; - String QUIZ = "Quiz"; - String ANSWER_KEY_EXPLANATION = "AnswerKey&Explanation"; - String FULL_TRANSLATION = "FullTranslation"; + public static final String TITLE = "Title"; + public static final String PASSAGE = "ThePassage"; + public static final String QUIZ = "Quiz"; + public static final String ANSWER_KEY_EXPLANATION = "AnswerKey&Explanation"; + public static final String FULL_TRANSLATION = "FullTranslation"; + + // 正在生成学案标识 + public static final String GENERATING_PLAN = "GeneratingPlan"; + + public static String buildGeneratePlanContent(Integer studentId) { + return GENERATING_PLAN + ":" + studentId; + } } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/LessonPlanController.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/LessonPlanController.java index c2249c3..ca0f0fa 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/LessonPlanController.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/LessonPlanController.java @@ -1,5 +1,6 @@ package com.yinlihupo.enlish.service.controller; +import com.yinlihupo.enlish.service.constant.LessonPlanConstant; import com.yinlihupo.enlish.service.domain.dataobject.LessonPlansDO; import com.yinlihupo.enlish.service.domain.dataobject.VocabularyBankDO; import com.yinlihupo.enlish.service.model.vo.plan.*; @@ -13,6 +14,7 @@ import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -30,6 +32,9 @@ public class LessonPlanController { @Resource private LessonPlansService lessonPlanService; + @Resource + private RedisTemplate redisTemplate; + @Resource(name = "taskExecutor") private Executor taskExecutor; @Resource @@ -47,6 +52,9 @@ public class LessonPlanController { Integer unitId = addLessonPlanReqVO.getUnitId(); Integer wordSize = addLessonPlanReqVO.getWordSize(); try { + if (redisTemplate.opsForValue().get(LessonPlanConstant.buildGeneratePlanContent(studentId)) != null) { + throw new RuntimeException("学案正常生成中"); + } taskExecutor.execute(() -> lessonPlanService.generateLessonPlans(studentId, unitId, wordSize)); return Response.success("生成学案成功,请等待 10 分钟"); } catch (Exception e) { @@ -96,4 +104,17 @@ public class LessonPlanController { public void findPlanWordVoiceTTS(@RequestBody FindWordTTSVoiceReqVO findWordVoiceReqVO, HttpServletResponse response) { ttsUtil.generateWordVoice(findWordVoiceReqVO.getText(), response); } + + @PostMapping("check") + @ApiOperationLog(description = "检测学案是否在生成") + public Response checkLessonPlan(@RequestBody FindIsGeneratePlanReqVO findIsGeneratePlanReqVO) { + Integer studentId = findIsGeneratePlanReqVO.getStudentId(); + String key = LessonPlanConstant.buildGeneratePlanContent(studentId); + if (redisTemplate.opsForValue().get(key) != null) { + return Response.fail(); + } + return Response.success("学案生成完成"); + } + + } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/plan/FindIsGeneratePlanReqVO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/plan/FindIsGeneratePlanReqVO.java new file mode 100644 index 0000000..3c167c8 --- /dev/null +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/plan/FindIsGeneratePlanReqVO.java @@ -0,0 +1,15 @@ +package com.yinlihupo.enlish.service.model.vo.plan; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +public class FindIsGeneratePlanReqVO { + + private Integer studentId; +} diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/plan/LessonPlansServiceImpl.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/plan/LessonPlansServiceImpl.java index 7ff086d..675ff05 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/plan/LessonPlansServiceImpl.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/plan/LessonPlansServiceImpl.java @@ -12,12 +12,14 @@ import com.yinlihupo.framework.common.util.JsonUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.checkerframework.checker.nullness.qual.NonNull; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.time.LocalDateTime; import java.util.*; +import java.util.concurrent.TimeUnit; @Service @Slf4j @@ -45,10 +47,17 @@ public class LessonPlansServiceImpl implements LessonPlansService { private StudentDOMapper studentDOMapper; @Resource private PlanExamDOMapper planExamDOMapper; + @Resource + private RedisTemplate redisTemplate; @Override public void generateLessonPlans(Integer studentId, Integer unitId, Integer wordSize) { + String key = LessonPlanConstant.buildGeneratePlanContent(studentId); + redisTemplate.opsForValue().set(key, studentId); + redisTemplate.expire( key, 12, TimeUnit.MINUTES); + + log.info("开始生成计划"); List vocabularyBankDOS = vocabularyBankDOMapper.selectVocabularyBankDOAllByUnitId(unitId); UnitDO unitDO = unitDOMapper.selectByPrimaryKey(unitId); GradeUnitDO gradeUnitDO = gradeUnitDOMapper.selectByUnitId(unitId); @@ -146,7 +155,7 @@ public class LessonPlansServiceImpl implements LessonPlansService { Map map = generateWeekendPlans(checkList, i + 6, gradeDO, unitDO, studentId); LessonPlansDO lessonPlansDO = LessonPlansDO.builder() - .title(map.get("title").toString()) + .title(map.get("examStr").toString() + "复习") .gradeId(gradeDO.getId().toString()) .unitId(unitDO.getId()) .createdAt(LocalDateTime.now()) @@ -154,6 +163,13 @@ public class LessonPlansServiceImpl implements LessonPlansService { .build(); lessonPlansDOMapper.insert(lessonPlansDO); + Integer examId = (Integer) map.get("examId"); + PlanExamDO planExamDO = PlanExamDO.builder() + .planId(lessonPlansDO.getId()) + .examId(examId) + .build(); + planExamDOMapper.insert(planExamDO); + StudentLessonPlansDO studentLessonPlansDO = StudentLessonPlansDO.builder() .studentId(studentId) .planId(lessonPlansDO.getId()) @@ -177,13 +193,32 @@ public class LessonPlansServiceImpl implements LessonPlansService { } - private Map generateWeekendPlans(List checkList, + private Map generateWeekendPlans(List words, int day, GradeDO gradeDO, UnitDO unitDO, Integer studentId) throws IOException { Map data = new HashMap<>(); - data.put("title", "第" + day + "天" + "复习" + gradeDO.getTitle() + unitDO.getTitle() + studentId); - data.put("checkList", checkList); + words.forEach(word -> word.setDefinition(word.getDefinition().length() > 5 ? word.getDefinition().substring(0, 5) : word.getDefinition())); + List wordIds = words.stream().map(VocabularyBankDO::getId).toList(); + StudentDO studentDO = studentDOMapper.selectStudentById(studentId); + + String ExamTitle = gradeDO.getTitle() + unitDO.getTitle() + "教案小测第" + ExamWordsConstant.day2Chinese(day) + "天" + studentDO.getName(); + ExamWordsDO examWordsDO = ExamWordsDO.builder() + .gradeId(gradeDO.getId()) + .level(1) + .wordIds(wordIds) + .type(ExamWordsConstant.EXAM_TYPE_TEST) + .title(ExamTitle) + .createdAt(LocalDateTime.now()) + .build(); + examWordsDOMapper.insert(examWordsDO); + studentExamWordsDOMapper.insertStudentsExam(studentId, examWordsDO.getId()); + + data.put("examId", examWordsDO.getId()); + data.put("studentId", studentId); + data.put("studentStr", studentDO.getName()); + data.put("examStr", ExamTitle); + data.put("words", words); // LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); // Configure config = Configure.builder() // .bind("checkList", policy) diff --git a/enlish-service/src/main/resources/config/application-dev.yml b/enlish-service/src/main/resources/config/application-dev.yml index cda3cad..4582eb4 100644 --- a/enlish-service/src/main/resources/config/application-dev.yml +++ b/enlish-service/src/main/resources/config/application-dev.yml @@ -36,7 +36,7 @@ templates: data: C:\project\tess plan: weekday: C:\project\java\enlish_edu\enlish\enlish-service\src\main\resources\templates\tem_study_plan_v5.docx - weekend: C:\project\java\enlish_edu\enlish\enlish-service\src\main\resources\templates\study_plan_review_v1.docx + weekend: C:\project\java\enlish_edu\enlish\enlish-service\src\main\resources\templates\study_plan_review_v2.docx plan_day: 7 tmp: png: C:\project\java\enlish_edu\enlish\enlish-service\src\main\resources\tmp\png\ diff --git a/enlish-service/src/main/resources/templates/study_plan_review_v2.docx b/enlish-service/src/main/resources/templates/study_plan_review_v2.docx new file mode 100644 index 0000000..0da2b03 Binary files /dev/null and b/enlish-service/src/main/resources/templates/study_plan_review_v2.docx differ diff --git a/enlish-vue/src/api/plan.js b/enlish-vue/src/api/plan.js index c0f6e65..00fcb63 100644 --- a/enlish-vue/src/api/plan.js +++ b/enlish-vue/src/api/plan.js @@ -51,6 +51,12 @@ export function getLessonPlanWords(planId) { }) } +export function checkIsGenerated(studentId) { + return axios.post('plan/check', { + studentId: studentId + }) +} + const resolveBlob = (res, fileName) => { // 创建 Blob 对象,可以指定 type,也可以让浏览器自动推断 const blob = new Blob([res], { type: 'application/octet-stream' }); diff --git a/enlish-vue/src/layouts/components/LessonPlanDialog.vue b/enlish-vue/src/layouts/components/LessonPlanDialog.vue index 3932be0..6ebf2ac 100644 --- a/enlish-vue/src/layouts/components/LessonPlanDialog.vue +++ b/enlish-vue/src/layouts/components/LessonPlanDialog.vue @@ -39,7 +39,7 @@ const props = defineProps({ modelValue: { type: Boolean, default: false }, studentId: { type: [Number, String], required: true } }) -const emit = defineEmits(['update:modelValue']) +const emit = defineEmits(['update:modelValue', 'success']) const visible = computed({ get: () => props.modelValue, @@ -71,6 +71,7 @@ async function handleGenerate() { const d = res?.data if (d.success) { ElMessage.success('生成学案任务已提交,请等待十分钟') + emit('success', { studentId: Number(props.studentId) }) visible.value = false } else { showMessage(d.message || '生成学案失败,请联系管理员', 'error') diff --git a/enlish-vue/src/pages/LearningPlan.vue b/enlish-vue/src/pages/LearningPlan.vue index 4f625dc..b80825c 100644 --- a/enlish-vue/src/pages/LearningPlan.vue +++ b/enlish-vue/src/pages/LearningPlan.vue @@ -19,7 +19,6 @@
学案
- - diff --git a/enlish-vue/src/pages/class.vue b/enlish-vue/src/pages/class.vue index 59fb2c4..8ea48b6 100644 --- a/enlish-vue/src/pages/class.vue +++ b/enlish-vue/src/pages/class.vue @@ -59,6 +59,18 @@ + + +