CommService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. package com.ruoyi.web.service;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.google.common.collect.Lists;
  4. import com.google.common.collect.Maps;
  5. import com.ruoyi.common.core.content.VistorContextHolder;
  6. import com.ruoyi.common.core.domain.entity.SysUser;
  7. import com.ruoyi.common.core.text.Convert;
  8. import com.ruoyi.common.enums.UserRegStatus;
  9. import com.ruoyi.common.exception.CustomException;
  10. import com.ruoyi.common.utils.DateUtils;
  11. import com.ruoyi.common.utils.SecurityUtils;
  12. import com.ruoyi.common.utils.StringUtils;
  13. import com.ruoyi.common.utils.http.HttpUtils;
  14. import com.ruoyi.dz.domain.DzCards;
  15. import com.ruoyi.dz.service.IDzCardsService;
  16. import com.ruoyi.enums.CardTimeStatus;
  17. import com.ruoyi.enums.UserTypeEnum;
  18. import com.ruoyi.learn.domain.LearnKnowledgeCourse;
  19. import com.ruoyi.learn.domain.LearnKnowledgeTree;
  20. import com.ruoyi.learn.domain.LearnPaper;
  21. import com.ruoyi.learn.domain.LearnQuestions;
  22. import com.ruoyi.learn.service.ILearnPaperService;
  23. import com.ruoyi.learn.service.ILearnQuestionsService;
  24. import com.ruoyi.system.service.ISysConfigService;
  25. import com.ruoyi.system.utils.downloadpaper.DownloadPaperUtils;
  26. import org.apache.commons.io.IOUtils;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.stereotype.Service;
  29. import org.springframework.util.CollectionUtils;
  30. import javax.servlet.http.HttpServletResponse;
  31. import java.nio.charset.StandardCharsets;
  32. import java.time.LocalDate;
  33. import java.time.ZoneId;
  34. import java.util.Date;
  35. import java.util.List;
  36. import java.util.Map;
  37. import java.util.Set;
  38. import java.util.stream.Collectors;
  39. @Service
  40. public class CommService {
  41. private final ISysConfigService configService;
  42. private final IDzCardsService cardsService;
  43. @Autowired
  44. ILearnPaperService paperService;
  45. @Autowired
  46. ILearnQuestionsService learnQuestionsService;
  47. public CommService(ISysConfigService configService, IDzCardsService cardsService) {
  48. this.configService = configService;
  49. this.cardsService = cardsService;
  50. }
  51. // 检查初始密码是否提醒修改
  52. public boolean initPasswordIsModify(Date pwdUpdateDate)
  53. {
  54. Integer initPasswordModify = Convert.toInt(configService.selectConfigByKey("sys.account.initPasswordModify"));
  55. return initPasswordModify != null && initPasswordModify == 1 && pwdUpdateDate == null;
  56. }
  57. // 检查密码是否过期
  58. public boolean passwordIsExpiration(Date pwdUpdateDate)
  59. {
  60. Integer passwordValidateDays = Convert.toInt(configService.selectConfigByKey("sys.account.passwordValidateDays"));
  61. if (passwordValidateDays != null && passwordValidateDays > 0)
  62. {
  63. if (StringUtils.isNull(pwdUpdateDate))
  64. {
  65. // 如果从未修改过初始密码,直接提醒过期
  66. return true;
  67. }
  68. Date nowDate = DateUtils.getNowDate();
  69. return DateUtils.differentDaysByMillisecond(nowDate, pwdUpdateDate) > passwordValidateDays;
  70. }
  71. return false;
  72. }
  73. public void requireVip() {
  74. SysUser user = SecurityUtils.getLoginUser().getUser();
  75. if (!UserRegStatus.Student.equals(user.getRegStatus()) || null == user.getCardId()) {
  76. if (UserTypeEnum.isCard(user.getUserType())) {
  77. throw new CustomException("没有权限,请开通VIP", 405);
  78. }
  79. return;
  80. }
  81. DzCards card = cardsService.selectDzCardsByCardId(user.getCardId());
  82. Date nowDate = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());
  83. if (null == card || !CardTimeStatus.Valid.getVal().equals(card.getTimeStatus()) || (null != card.getOutDate() && card.getOutDate().getTime() < nowDate.getTime())) {
  84. throw new CustomException("没有权限,请开通VIP", 405);
  85. }
  86. }
  87. public List<LearnTeacherService.TreeNode> buildTree(List<LearnKnowledgeTree> ktList, Set<Long> knowledgeIdSet, Map<Long, Integer[]> knowCountMap) {
  88. List<LearnTeacherService.TreeNode> treeNodeList = Lists.newArrayList();
  89. Map<Long, LearnTeacherService.TreeNode> teMap = Maps.newHashMap();
  90. Integer[] counts;
  91. for(LearnKnowledgeTree kt : ktList) {
  92. LearnTeacherService.TreeNode tn;
  93. if(null != knowCountMap && null != (counts = knowCountMap.get(kt.getId()))) {
  94. tn = new LearnTeacherService.TreeNode(kt.getId(), kt.getName(),kt.getSubjectId(), counts);
  95. } else {
  96. tn = new LearnTeacherService.TreeNode(kt.getId(), kt.getName(),kt.getSubjectId(), null);
  97. }
  98. teMap.put(kt.getId(), tn);
  99. }
  100. for(LearnKnowledgeTree kt : ktList) {
  101. if(null == kt.getPid()) {
  102. treeNodeList.add(teMap.get(kt.getId()));
  103. continue;
  104. }
  105. LearnTeacherService.TreeNode parent = teMap.get(kt.getPid());
  106. LearnTeacherService.TreeNode node = teMap.get(kt.getId());
  107. if(null != node.getQuestionCount()) {
  108. if(null == parent) {
  109. continue;
  110. }
  111. parent.setQuestionCount(parent.getQuestionCount() + node.getQuestionCount());
  112. parent.setFinishedCount(parent.getFinishedCount() + node.getFinishedCount());
  113. parent.setRightCount(parent.getRightCount() + node.getRightCount());
  114. parent.calcRatio();
  115. }
  116. parent.getChildren().add(node);
  117. }
  118. if(!CollectionUtils.isEmpty(knowledgeIdSet)) {
  119. List<LearnTeacherService.TreeNode> childList;
  120. List<LearnTeacherService.TreeNode> rootList = Lists.newArrayList();
  121. for(LearnTeacherService.TreeNode tn : treeNodeList) {
  122. if(knowledgeIdSet.contains(tn.getId())) {
  123. rootList.add(tn);
  124. } else if(!(childList = tn.getChildren().stream().filter(t -> knowledgeIdSet.contains(t.getId())).collect(Collectors.toList())).isEmpty()) {
  125. tn.setChildren(childList);
  126. rootList.add(tn);
  127. }
  128. }
  129. return rootList;
  130. }
  131. return treeNodeList;
  132. }
  133. public List<LearnTeacherService.TreeNode> buildCourseKnowledgeTree(List<LearnKnowledgeCourse> ktList, Map<Long, Integer[]> knowCountMap) {
  134. List<LearnTeacherService.TreeNode> treeNodeList = Lists.newArrayList();
  135. Map<Long, LearnTeacherService.TreeNode> teMap = Maps.newHashMap();
  136. Integer[] counts;
  137. for(LearnKnowledgeCourse kt : ktList) {
  138. LearnTeacherService.TreeNode tn;
  139. if(null != knowCountMap && null != (counts = knowCountMap.get(kt.getId()))) {
  140. tn = new LearnTeacherService.TreeNode(kt.getId(), kt.getName(),null, counts);
  141. } else {
  142. tn = new LearnTeacherService.TreeNode(kt.getId(), kt.getName(),null, null);
  143. }
  144. teMap.put(kt.getId(), tn);
  145. }
  146. for(LearnKnowledgeCourse kt : ktList) {
  147. if(null == kt.getPid()) {
  148. treeNodeList.add(teMap.get(kt.getId()));
  149. continue;
  150. }
  151. LearnTeacherService.TreeNode parent = teMap.get(kt.getPid());
  152. LearnTeacherService.TreeNode node = teMap.get(kt.getId());
  153. if(null != node.getQuestionCount()) {
  154. parent.setQuestionCount(parent.getQuestionCount() + node.getQuestionCount());
  155. parent.setFinishedCount(parent.getFinishedCount() + node.getFinishedCount());
  156. parent.setRightCount(parent.getRightCount() + node.getRightCount());
  157. parent.calcRatio();
  158. }
  159. parent.getChildren().add(node);
  160. }
  161. return treeNodeList;
  162. }
  163. public String getLocation(){
  164. return getLocation(null);
  165. }
  166. public String getLocation(String location){
  167. if(org.apache.commons.lang3.StringUtils.isBlank(location)) {
  168. location = VistorContextHolder.getLocation();
  169. }
  170. if (org.apache.commons.lang3.StringUtils.isBlank(location)) {
  171. location = "湖南";
  172. }
  173. return location;
  174. }
  175. /**
  176. * 下载试卷
  177. * @param response
  178. * @param paperId
  179. */
  180. public void download(HttpServletResponse response, Long paperId){
  181. try {
  182. LearnPaper papers = paperService.selectLearnPaperById(paperId);
  183. List<LearnQuestions> questions = learnQuestionsService.selectQuestionByPaperId(paperId);
  184. byte[] data = DownloadPaperUtils.download(papers.getPaperName(), questions);
  185. response.setHeader("Pragma", "No-cache");
  186. response.setHeader("Cache-Control", "No-cache");
  187. response.setHeader("Expires", "0");
  188. response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", new String((papers.getPaperName() + ".docx").getBytes("utf-8"), "ISO-8859-1")));
  189. response.setHeader("Content-Type", "application/octet-stream");
  190. IOUtils.write(data, response.getOutputStream());
  191. } catch (Exception e) {
  192. throw new RuntimeException(e.getMessage(), e);
  193. }
  194. }
  195. public void downloadRemote(HttpServletResponse response, Long paperId,String url) {
  196. try {
  197. // 获取试卷信息
  198. LearnPaper paper = paperService.selectLearnPaperById(paperId);
  199. if (paper == null) {
  200. throw new RuntimeException("试卷不存在");
  201. }
  202. // 获取题目列表
  203. List<LearnQuestions> questions = learnQuestionsService.selectQuestionByPaperId(paperId);
  204. // 将题目列表转换为 JSON 字符串
  205. String quesJson = JSONArray.toJSONString(questions);
  206. // 远程服务器地址
  207. String remoteUrl = (StringUtils.isEmpty(url)?"https://www.dz1kt.com/prod-api":url)+"/learn/paper/downloadPaper";
  208. // 构建请求参数
  209. String params = "paperName=" + java.net.URLEncoder.encode(paper.getPaperName(), StandardCharsets.UTF_8.toString())
  210. + "&ques=" + java.net.URLEncoder.encode(quesJson, StandardCharsets.UTF_8.toString());
  211. // 设置响应头
  212. response.setHeader("Pragma", "No-cache");
  213. response.setHeader("Cache-Control", "No-cache");
  214. response.setHeader("Expires", "0");
  215. response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"",
  216. new String((paper.getPaperName() + ".docx").getBytes("utf-8"), "ISO-8859-1")));
  217. response.setHeader("Content-Type", "application/octet-stream");
  218. // 调用远程服务器并将响应流写入到本地响应
  219. HttpUtils.sendGetStream(remoteUrl, params, response.getOutputStream());
  220. } catch (Exception e) {
  221. throw new RuntimeException("下载失败: " + e.getMessage(), e);
  222. }
  223. }
  224. /**
  225. * 通用:下载试卷(外部传入数据),不依赖本地数据
  226. * @param response
  227. * @param paperName
  228. * @param questions
  229. */
  230. public void download(HttpServletResponse response, String paperName,List<LearnQuestions> questions){
  231. try {
  232. byte[] data = DownloadPaperUtils.download(paperName, questions);
  233. response.setHeader("Pragma", "No-cache");
  234. response.setHeader("Cache-Control", "No-cache");
  235. response.setHeader("Expires", "0");
  236. response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", new String((paperName + ".docx").getBytes("utf-8"), "ISO-8859-1")));
  237. response.setHeader("Content-Type", "application/octet-stream");
  238. IOUtils.write(data, response.getOutputStream());
  239. } catch (Exception e) {
  240. throw new RuntimeException(e.getMessage(), e);
  241. }
  242. }
  243. }