TextbookQuestionService.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. package com.qxgmat.service.inline;
  2. import com.github.pagehelper.Page;
  3. import com.nuliji.tools.AbstractService;
  4. import com.nuliji.tools.PageResult;
  5. import com.nuliji.tools.Tools;
  6. import com.nuliji.tools.Transform;
  7. import com.nuliji.tools.exception.ParameterException;
  8. import com.nuliji.tools.exception.SystemException;
  9. import com.nuliji.tools.mybatis.Example;
  10. import com.qxgmat.data.constants.enums.status.DirectionStatus;
  11. import com.qxgmat.data.dao.TextbookQuestionMapper;
  12. import com.qxgmat.data.dao.entity.*;
  13. import com.qxgmat.data.inline.PaperStat;
  14. import com.qxgmat.data.relation.TextbookQuestionRelationMapper;
  15. import com.qxgmat.data.relation.entity.TextbookQuestionRelation;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18. import org.springframework.stereotype.Service;
  19. import javax.annotation.Resource;
  20. import java.text.ParseException;
  21. import java.text.SimpleDateFormat;
  22. import java.util.*;
  23. import java.util.stream.Collectors;
  24. @Service
  25. public class TextbookQuestionService extends AbstractService {
  26. private static final Logger logger = LoggerFactory.getLogger(TextbookQuestionService.class);
  27. @Resource
  28. private TextbookQuestionMapper textbookQuestionMapper;
  29. @Resource
  30. private QuestionService questionService;
  31. @Resource
  32. private TextbookQuestionRelationMapper textbookQuestionRelationMapper;
  33. private Map<String, String> adminMap = new HashMap<String, String>(){{
  34. put("", "tq");
  35. }};
  36. /**
  37. * 管理后台查询列表
  38. * @param page
  39. * @param pageSize
  40. * @param questionType
  41. * @param paperId
  42. * @param questionNoId
  43. * @param order
  44. * @param direction
  45. * @return
  46. */
  47. public Page<TextbookQuestionRelation> listAdmin(int page, int pageSize, String questionType, Number paperId, Integer questionNoId, Integer id, String order, DirectionStatus direction){
  48. if(order == null || order.isEmpty()){
  49. order = "id";
  50. }
  51. if(adminMap.containsKey(order)){
  52. order = adminMap.get(order)+".`"+Tools.underscoreName(order)+"`";
  53. }else{
  54. order = adminMap.get("")+".`"+Tools.underscoreName(order)+"`";
  55. }
  56. if (direction == null){
  57. direction = DirectionStatus.DESC;
  58. }
  59. String finalOrder = order;
  60. DirectionStatus finalDirection = direction;
  61. Page<TextbookQuestionRelation> p = page(() -> {
  62. textbookQuestionRelationMapper.listAdmin(questionType, paperId, questionNoId, id, finalOrder, finalDirection.key);
  63. }, page, pageSize);
  64. Collection ids = Transform.getIds(p, TextbookQuestionRelation.class, "id");
  65. // 获取详细数据
  66. List<TextbookQuestionRelation> list = relation(select(ids));
  67. Transform.replace(p, list, TextbookQuestionRelation.class, "id");
  68. return p;
  69. }
  70. /**
  71. * 更新所有题目及组卷title
  72. * @param libraryId
  73. * @param prefixTitle
  74. */
  75. public void updateTitle(Integer libraryId, String prefixTitle) {
  76. Example example = new Example(TextbookLibrary.class);
  77. example.and(
  78. example.createCriteria()
  79. .andEqualTo("libraryId", libraryId)
  80. );
  81. List<TextbookQuestion> questionList = select(textbookQuestionMapper, example);
  82. for(TextbookQuestion question : questionList){
  83. question.setTitle(generateTitle(prefixTitle, question.getNo()));
  84. edit(question);
  85. }
  86. }
  87. /**
  88. * 生成题目id
  89. * @param prefixTitle
  90. * @param no
  91. * @return
  92. */
  93. public String generateTitle(String prefixTitle, Integer no) {
  94. return String.format("%s-%d", prefixTitle, no);
  95. }
  96. /**
  97. * 管理后台查询列表
  98. * @param page
  99. * @param size
  100. * @param keyword
  101. * @return
  102. */
  103. public Page<TextbookQuestion> searchAdmin(int page, int size, String keyword){
  104. // 分割#号
  105. Example example = new Example(TextbookQuestion.class);
  106. if(keyword != null)
  107. example.and(
  108. example.createCriteria()
  109. .andLike("title", "%"+keyword+"%")
  110. );
  111. example.orderBy("id").desc();
  112. return page(()->select(textbookQuestionMapper, example), page, size);
  113. }
  114. /**
  115. * 获取换库表中的题目
  116. * @param libraryId
  117. * @return
  118. */
  119. public List<TextbookQuestion> listByLibrary(Integer libraryId){
  120. Example example = new Example(TextbookQuestion.class);
  121. example.and(
  122. example.createCriteria()
  123. .andEqualTo("libraryId", libraryId)
  124. );
  125. return select(textbookQuestionMapper, example);
  126. }
  127. /**
  128. * 获取往期题目
  129. * @param libraryId
  130. * @return
  131. */
  132. public List<TextbookQuestion> listByNoLibrary(Integer libraryId){
  133. Example example = new Example(TextbookQuestion.class);
  134. example.and(
  135. example.createCriteria()
  136. .andNotEqualTo("libraryId", libraryId)
  137. );
  138. return select(textbookQuestionMapper, example);
  139. }
  140. /**
  141. * 获取换库表中的最后一题
  142. * @param libraryId
  143. * @return
  144. */
  145. public TextbookQuestion lastByLibrary(Integer libraryId){
  146. Example example = new Example(TextbookQuestion.class);
  147. example.and(
  148. example.createCriteria()
  149. .andEqualTo("libraryId", libraryId)
  150. );
  151. example.orderBy("no").desc();
  152. return one(textbookQuestionMapper, example);
  153. }
  154. /**
  155. * 根据题目id获取题目列表
  156. * @param page
  157. * @param size
  158. * @param keyword
  159. * @return
  160. */
  161. public PageResult<TextbookQuestionRelation> searchNo(int page, int size, String keyword){
  162. Example example = new Example(TextbookQuestion.class);
  163. if(keyword != null)
  164. example.and(
  165. example.createCriteria()
  166. .andLike("title", "%"+keyword+"%")
  167. );
  168. example.orderBy("id").asc();
  169. Page<TextbookQuestion> p = page(()->select(textbookQuestionMapper, example), page, size);
  170. return new PageResult<>(relation(p), p.getTotal());
  171. }
  172. // /**
  173. // * 根据题目编号id列表获取关联题目
  174. // * @param ids
  175. // * @return
  176. // */
  177. // public List<TextbookQuestionRelation> listWithRelationByIds(Number[] ids){
  178. // List<TextbookQuestion> p = select(textbookQuestionMapper, ids);
  179. // return relation(p);
  180. // }
  181. //
  182. // /**
  183. // * 根据题目编号id列表获取关联题目
  184. // * @param ids
  185. // * @return
  186. // */
  187. // public Map<Number, TextbookQuestionRelation> mapWithRelationByIds(Number[] ids){
  188. // List<TextbookQuestion> p = select(textbookQuestionMapper, ids);
  189. // List<TextbookQuestionRelation> list = relation(p);
  190. // Map<Number, TextbookQuestionRelation> map = new HashMap<>();
  191. // for(TextbookQuestionRelation relation : list){
  192. // map.put(relation.getId(), relation);
  193. // }
  194. // return map;
  195. // }
  196. //
  197. // /**
  198. // * 累加做题记录到sentenceQuestion
  199. // * @param question
  200. // */
  201. // public void accumulation(UserQuestion question){
  202. // textbookQuestionRelationMapper.accumulation(question.getQuestionNoId(), 1, question.getTime(), question.getIsCorrect());
  203. // }
  204. //
  205. // /**
  206. // * 累加收藏记录到questionNo
  207. // * @param question
  208. // */
  209. // public void accumulationCollect(UserCollectQuestion question, int collect){
  210. // textbookQuestionRelationMapper.accumulationCollect(question.getQuestionNoId(), collect);
  211. // }
  212. //
  213. // /**
  214. // * 根据题目获取总试卷统计信息
  215. // * @param questionNoList
  216. // * @return
  217. // */
  218. // public PaperStat statPaper(List<TextbookQuestion> questionNoList){
  219. // PaperStat stat = new PaperStat();
  220. // Integer totalTime = 0;
  221. // Integer totalNumber = 0;
  222. // Integer totalCorrect = 0;
  223. // for(TextbookQuestion questionNo : questionNoList){
  224. // totalTime += questionNo.getTotalTime();
  225. // totalNumber += questionNo.getTotalNumber();
  226. // totalCorrect += questionNo.getTotalCorrect();
  227. // }
  228. // stat.setTotalCorrect(totalCorrect);
  229. // stat.setTotalNumber(totalNumber);
  230. // stat.setTotalTime(totalTime);
  231. // return stat;
  232. // }
  233. //
  234. // /**
  235. // * 根据试卷分组获取统计信息
  236. // * @param questionNoIdsMap
  237. // * @return
  238. // */
  239. // public Map<Integer, PaperStat> statPaperMap(Map<Integer, Integer[]> questionNoIdsMap){
  240. // Map<Integer, PaperStat> relationMap = new HashMap<>();
  241. // List<Integer> ids = new ArrayList<>();
  242. // for(Integer[] questionNoIds : questionNoIdsMap.values()){
  243. // ids.addAll(Arrays.stream(questionNoIds).collect(Collectors.toList()));
  244. // }
  245. // List<TextbookQuestion> questionNoList = select(ids);
  246. // Map questionNoMap = Transform.getMap(questionNoList, TextbookQuestion.class, "id");
  247. // List<TextbookQuestion> l = new ArrayList<>();
  248. // for(Integer k: questionNoIdsMap.keySet()){
  249. // l.clear();
  250. // for (Integer questionNoId : questionNoIdsMap.get(k)){
  251. // l.add((TextbookQuestion)questionNoMap.get(questionNoId));
  252. // }
  253. // relationMap.put(k, statPaper(l));
  254. // }
  255. //
  256. // return relationMap;
  257. // }
  258. /**
  259. * 根据题目关系,获取完整题目:列表
  260. * @param p
  261. * @return
  262. */
  263. public List<TextbookQuestionRelation> relation(List<TextbookQuestion> p){
  264. List<TextbookQuestionRelation> relationList = Transform.convert(p, TextbookQuestionRelation.class);
  265. Collection questionIds = Transform.getIds(p, TextbookQuestion.class, "questionId");
  266. List<Question> questions = questionService.select(questionIds);
  267. Transform.combine(relationList, questions, TextbookQuestionRelation.class, "questionId", "question", Question.class, "id");
  268. return relationList;
  269. }
  270. /**
  271. * 根据题目关系,获取完整题目:单个
  272. * @param p
  273. * @return
  274. */
  275. public TextbookQuestionRelation relation(TextbookQuestion p){
  276. TextbookQuestionRelation relation = Transform.convert(p, TextbookQuestionRelation.class);
  277. Question question = questionService.get(p.getQuestionId());
  278. relation.setQuestion(question);
  279. return relation;
  280. }
  281. /**
  282. * 根据题目编号获取题目
  283. * @return
  284. */
  285. public List<TextbookQuestion> listByQuestionNo(Collection questionNoIds){
  286. if (questionNoIds == null || questionNoIds.size() == 0) return new ArrayList<>();
  287. Example example = new Example(SentenceQuestion.class);
  288. example.and(
  289. example.createCriteria()
  290. .andIn("questionNoId", questionNoIds)
  291. );
  292. return select(textbookQuestionMapper, example);
  293. }
  294. public TextbookQuestion getByQuestionNo(Integer questionNoId){
  295. Example example = new Example(SentenceQuestion.class);
  296. example.and(
  297. example.createCriteria()
  298. .andEqualTo("questionNoId", questionNoId)
  299. );
  300. return one(textbookQuestionMapper, example);
  301. }
  302. public TextbookQuestion add(TextbookQuestion question){
  303. int result = insert(textbookQuestionMapper, question);
  304. question = one(textbookQuestionMapper, question.getId());
  305. if(question == null){
  306. throw new SystemException("题目添加失败");
  307. }
  308. return question;
  309. }
  310. public TextbookQuestion edit(TextbookQuestion question){
  311. TextbookQuestion in = one(textbookQuestionMapper, question.getId());
  312. if(in == null){
  313. throw new ParameterException("题目不存在");
  314. }
  315. int result = update(textbookQuestionMapper, question);
  316. return question;
  317. }
  318. public boolean delete(Number id){
  319. TextbookQuestion in = one(textbookQuestionMapper, id);
  320. if(in == null){
  321. throw new ParameterException("题目不存在");
  322. }
  323. int result = delete(textbookQuestionMapper, id);
  324. return result > 0;
  325. }
  326. public TextbookQuestion get(Number id){
  327. TextbookQuestion in = one(textbookQuestionMapper, id);
  328. if(in == null){
  329. throw new ParameterException("题目不存在");
  330. }
  331. return in;
  332. }
  333. public Page<TextbookQuestion> select(int page, int pageSize){
  334. return select(textbookQuestionMapper, page, pageSize);
  335. }
  336. public Page<TextbookQuestion> select(Integer[] ids){
  337. return page(()-> select(textbookQuestionMapper, ids), 1, ids.length);
  338. }
  339. public List<TextbookQuestion> select(Collection ids){
  340. return select(textbookQuestionMapper, ids);
  341. }
  342. }