ExportCompositionService.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package com.njuzr.eaibackend.service;
  2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  3. import com.njuzr.eaibackend.exception.MyException;
  4. import com.njuzr.eaibackend.mapper.EngagementMapper;
  5. import com.njuzr.eaibackend.mapper.serviceIpml.EngagementMapperServiceImpl;
  6. import com.njuzr.eaibackend.po.Engagement;
  7. import com.njuzr.eaibackend.utils.WordExporter;
  8. import com.njuzr.eaibackend.utils.ZipExport;
  9. import com.njuzr.eaibackend.vo.AssignmentVO;
  10. import com.njuzr.eaibackend.vo.EngagementVO;
  11. import com.njuzr.eaibackend.vo.UserVO;
  12. import freemarker.template.Configuration;
  13. import freemarker.template.TemplateException;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.apache.commons.lang3.tuple.Pair;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.http.HttpStatus;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.util.CollectionUtils;
  20. import java.io.IOException;
  21. import java.util.*;
  22. import java.util.stream.Collectors;
  23. @Slf4j
  24. @Service
  25. public class ExportCompositionService {
  26. @Autowired
  27. private Configuration freemarkerConfig;
  28. @Autowired
  29. private EngagementMapper engagementMapper;
  30. @Autowired
  31. private AssignmentService assignmentService;
  32. @Autowired
  33. private UserService userService;
  34. @Autowired
  35. private WordExporter wordExporter;
  36. @Autowired
  37. private EngagementMapperServiceImpl engagementMapperServiceImpl;
  38. public Pair<UserVO, byte[]> exportWord(Long assignmentId, Long studentId) {
  39. AssignmentVO assignment = assignmentService.findAssignmentById(assignmentId);
  40. EngagementVO engagement = assignmentService.getEngagement(studentId, assignmentId);
  41. UserVO user = userService.searchUsers(new Page<>(1,1), studentId, null, null, null).getRecords().get(0);
  42. Map<String, Object> model = buildWordInfoModel(assignment, user, engagement);
  43. return Pair.of(user, wordExporter.exportCompositionWord(model));
  44. }
  45. private Map<String, Object> buildWordInfoModel(AssignmentVO assignment, UserVO user, EngagementVO engagement) {
  46. Map<String, Object> model = new HashMap<>();
  47. model.put("title", assignment.getAssignmentName());
  48. model.put("studentName", user.getName());
  49. model.put("officialNumber", user.getOfficialNumber());
  50. model.put("assignmentName", assignment.getAssignmentName());
  51. model.put("date", new Date());
  52. model.put("content", processContent(engagement.getTextContent()));
  53. return model;
  54. }
  55. public byte[] exportBatchToZip(List<Long> studentIds, Long assignmentId) {
  56. if(assignmentId == null){
  57. throw MyException.create(HttpStatus.BAD_REQUEST, "assignmentId不能为空");
  58. }
  59. if (CollectionUtils.isEmpty(studentIds)) {
  60. List<Engagement> engagements = engagementMapperServiceImpl.getEngagementByAssignmentId(assignmentId);
  61. if (CollectionUtils.isEmpty(engagements)) {
  62. return null;
  63. }
  64. studentIds = engagements.stream()
  65. .map(Engagement::getStudentId)
  66. .toList();
  67. }
  68. return exportBatchToZipByStudentIds(studentIds, assignmentId);
  69. }
  70. private byte[] exportBatchToZipByStudentIds(List<Long> studentIds, Long assignmentId) {
  71. List<ZipExport.ZipItem> zipItems = studentIds.stream()
  72. .map(studentId -> {
  73. try {
  74. Pair<UserVO, byte[]> pair = exportWord(assignmentId, studentId);
  75. UserVO student = pair.getLeft();
  76. byte[] wordBytes = pair.getRight();
  77. String fileName = String.format("%s_%s.%s", student.getName(), student.getOfficialNumber(), "docx");
  78. return new ZipExport.ZipItem(fileName, wordBytes);
  79. } catch (Exception e) {
  80. log.error("exportBatchToZip failed, studentId: {}, reason: {}", studentId, e.getMessage());
  81. return null;
  82. }
  83. })
  84. .filter(Objects::nonNull)
  85. .collect(Collectors.toList());
  86. try {
  87. return ZipExport.packToZip(zipItems);
  88. } catch (IOException e) {
  89. throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "ZIP打包失败"+e.getMessage());
  90. }
  91. }
  92. public byte[] exportWordTest(Long assignmentId, Long studentId) throws IOException, TemplateException {
  93. String assignmentName = "My Favorite Season";
  94. String content = "My favorite season is autumn. The weather is cool and comfortable, and the leaves turn golden, making the scenery beautiful. I enjoy walking in the park and listening to the sound of rustling leaves. Autumn is also a harvest season, with fruits like apples and pears ripe for picking.\n" +
  95. "During this season, my family often goes hiking or has picnics. The Mid-Autumn Festival, when we eat mooncakes and admire the full moon, is my favorite holiday. Autumn reminds me of warmth and joy.\n" +
  96. "In short, autumn is not only pleasant but also full of happy memories. That’s why I love it most.";
  97. Map<String, Object> model = new HashMap<>();
  98. model.put("title", "title_"+assignmentName);
  99. model.put("studentName", "柏琪");
  100. model.put("assignmentName", assignmentName);
  101. model.put("date", new Date());
  102. model.put("content", content.replaceAll("\n", "<br/>"));
  103. return wordExporter.exportCompositionWord(model);
  104. }
  105. private String processContent(String content) {
  106. return content.replaceAll("\n", "<br/>");
  107. }
  108. }