package com.qxgmat.service.inline; import com.github.pagehelper.Page; import com.nuliji.tools.AbstractService; import com.nuliji.tools.PageResult; import com.nuliji.tools.Tools; import com.nuliji.tools.Transform; import com.nuliji.tools.exception.ParameterException; import com.nuliji.tools.exception.SystemException; import com.nuliji.tools.mybatis.Example; import com.qxgmat.data.constants.enums.status.DirectionStatus; import com.qxgmat.data.dao.TextbookQuestionMapper; import com.qxgmat.data.dao.entity.*; import com.qxgmat.data.inline.PaperStat; import com.qxgmat.data.relation.TextbookQuestionRelationMapper; import com.qxgmat.data.relation.entity.TextbookQuestionRelation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @Service public class TextbookQuestionService extends AbstractService { private static final Logger logger = LoggerFactory.getLogger(TextbookQuestionService.class); @Resource private TextbookQuestionMapper textbookQuestionMapper; @Resource private QuestionService questionService; @Resource private TextbookQuestionRelationMapper textbookQuestionRelationMapper; private Map adminMap = new HashMap(){{ put("", "tq"); }}; /** * 管理后台查询列表 * @param page * @param pageSize * @param questionType * @param paperId * @param questionNoId * @param order * @param direction * @return */ public Page listAdmin(int page, int pageSize, String questionType, Number paperId, Integer questionNoId, Integer id, String order, DirectionStatus direction){ if(order == null || order.isEmpty()){ order = "id"; } if(adminMap.containsKey(order)){ order = adminMap.get(order)+".`"+Tools.underscoreName(order)+"`"; }else{ order = adminMap.get("")+".`"+Tools.underscoreName(order)+"`"; } if (direction == null){ direction = DirectionStatus.DESC; } String finalOrder = order; DirectionStatus finalDirection = direction; Page p = page(() -> { textbookQuestionRelationMapper.listAdmin(questionType, paperId, questionNoId, id, finalOrder, finalDirection.key); }, page, pageSize); Collection ids = Transform.getIds(p, TextbookQuestionRelation.class, "id"); // 获取详细数据 List list = relation(select(ids)); Transform.replace(p, list, TextbookQuestionRelation.class, "id"); return p; } /** * 更新所有题目及组卷title * @param libraryId * @param prefixTitle */ public void updateTitle(Integer libraryId, String prefixTitle) { Example example = new Example(TextbookLibrary.class); example.and( example.createCriteria() .andEqualTo("libraryId", libraryId) ); List questionList = select(textbookQuestionMapper, example); for(TextbookQuestion question : questionList){ question.setTitle(generateTitle(prefixTitle, question.getNo())); edit(question); } } /** * 生成题目id * @param prefixTitle * @param no * @return */ public String generateTitle(String prefixTitle, Integer no) { return String.format("%s-%d", prefixTitle, no); } /** * 管理后台查询列表 * @param page * @param size * @param keyword * @return */ public Page searchAdmin(int page, int size, String keyword){ // 分割#号 Example example = new Example(TextbookQuestion.class); if(keyword != null) example.and( example.createCriteria() .andLike("title", "%"+keyword+"%") ); example.orderBy("id").desc(); return page(()->select(textbookQuestionMapper, example), page, size); } /** * 获取换库表中的题目 * @param libraryId * @return */ public List listByLibrary(Integer libraryId){ Example example = new Example(TextbookQuestion.class); example.and( example.createCriteria() .andEqualTo("libraryId", libraryId) ); return select(textbookQuestionMapper, example); } /** * 获取往期题目 * @param libraryId * @return */ public List listByNoLibrary(Integer libraryId){ Example example = new Example(TextbookQuestion.class); example.and( example.createCriteria() .andNotEqualTo("libraryId", libraryId) ); return select(textbookQuestionMapper, example); } /** * 获取换库表中的最后一题 * @param libraryId * @return */ public TextbookQuestion lastByLibrary(Integer libraryId){ Example example = new Example(TextbookQuestion.class); example.and( example.createCriteria() .andEqualTo("libraryId", libraryId) ); example.orderBy("no").desc(); return one(textbookQuestionMapper, example); } /** * 根据题目id获取题目列表 * @param page * @param size * @param keyword * @return */ public PageResult searchNo(int page, int size, String keyword){ Example example = new Example(TextbookQuestion.class); if(keyword != null) example.and( example.createCriteria() .andLike("title", "%"+keyword+"%") ); example.orderBy("id").asc(); Page p = page(()->select(textbookQuestionMapper, example), page, size); return new PageResult<>(relation(p), p.getTotal()); } // /** // * 根据题目编号id列表获取关联题目 // * @param ids // * @return // */ // public List listWithRelationByIds(Number[] ids){ // List p = select(textbookQuestionMapper, ids); // return relation(p); // } // // /** // * 根据题目编号id列表获取关联题目 // * @param ids // * @return // */ // public Map mapWithRelationByIds(Number[] ids){ // List p = select(textbookQuestionMapper, ids); // List list = relation(p); // Map map = new HashMap<>(); // for(TextbookQuestionRelation relation : list){ // map.put(relation.getId(), relation); // } // return map; // } // // /** // * 累加做题记录到sentenceQuestion // * @param question // */ // public void accumulation(UserQuestion question){ // textbookQuestionRelationMapper.accumulation(question.getQuestionNoId(), 1, question.getTime(), question.getIsCorrect()); // } // // /** // * 累加收藏记录到questionNo // * @param question // */ // public void accumulationCollect(UserCollectQuestion question, int collect){ // textbookQuestionRelationMapper.accumulationCollect(question.getQuestionNoId(), collect); // } // // /** // * 根据题目获取总试卷统计信息 // * @param questionNoList // * @return // */ // public PaperStat statPaper(List questionNoList){ // PaperStat stat = new PaperStat(); // Integer totalTime = 0; // Integer totalNumber = 0; // Integer totalCorrect = 0; // for(TextbookQuestion questionNo : questionNoList){ // totalTime += questionNo.getTotalTime(); // totalNumber += questionNo.getTotalNumber(); // totalCorrect += questionNo.getTotalCorrect(); // } // stat.setTotalCorrect(totalCorrect); // stat.setTotalNumber(totalNumber); // stat.setTotalTime(totalTime); // return stat; // } // // /** // * 根据试卷分组获取统计信息 // * @param questionNoIdsMap // * @return // */ // public Map statPaperMap(Map questionNoIdsMap){ // Map relationMap = new HashMap<>(); // List ids = new ArrayList<>(); // for(Integer[] questionNoIds : questionNoIdsMap.values()){ // ids.addAll(Arrays.stream(questionNoIds).collect(Collectors.toList())); // } // List questionNoList = select(ids); // Map questionNoMap = Transform.getMap(questionNoList, TextbookQuestion.class, "id"); // List l = new ArrayList<>(); // for(Integer k: questionNoIdsMap.keySet()){ // l.clear(); // for (Integer questionNoId : questionNoIdsMap.get(k)){ // l.add((TextbookQuestion)questionNoMap.get(questionNoId)); // } // relationMap.put(k, statPaper(l)); // } // // return relationMap; // } /** * 根据题目关系,获取完整题目:列表 * @param p * @return */ public List relation(List p){ List relationList = Transform.convert(p, TextbookQuestionRelation.class); Collection questionIds = Transform.getIds(p, TextbookQuestion.class, "questionId"); List questions = questionService.select(questionIds); Transform.combine(relationList, questions, TextbookQuestionRelation.class, "questionId", "question", Question.class, "id"); return relationList; } /** * 根据题目关系,获取完整题目:单个 * @param p * @return */ public TextbookQuestionRelation relation(TextbookQuestion p){ TextbookQuestionRelation relation = Transform.convert(p, TextbookQuestionRelation.class); Question question = questionService.get(p.getQuestionId()); relation.setQuestion(question); return relation; } /** * 根据题目编号获取题目 * @return */ public List listByQuestionNo(Collection questionNoIds){ if (questionNoIds == null || questionNoIds.size() == 0) return new ArrayList<>(); Example example = new Example(SentenceQuestion.class); example.and( example.createCriteria() .andIn("questionNoId", questionNoIds) ); return select(textbookQuestionMapper, example); } public TextbookQuestion getByQuestionNo(Integer questionNoId){ Example example = new Example(SentenceQuestion.class); example.and( example.createCriteria() .andEqualTo("questionNoId", questionNoId) ); return one(textbookQuestionMapper, example); } public TextbookQuestion add(TextbookQuestion question){ int result = insert(textbookQuestionMapper, question); question = one(textbookQuestionMapper, question.getId()); if(question == null){ throw new SystemException("题目添加失败"); } return question; } public TextbookQuestion edit(TextbookQuestion question){ TextbookQuestion in = one(textbookQuestionMapper, question.getId()); if(in == null){ throw new ParameterException("题目不存在"); } int result = update(textbookQuestionMapper, question); return question; } public boolean delete(Number id){ TextbookQuestion in = one(textbookQuestionMapper, id); if(in == null){ throw new ParameterException("题目不存在"); } int result = delete(textbookQuestionMapper, id); return result > 0; } public TextbookQuestion get(Number id){ TextbookQuestion in = one(textbookQuestionMapper, id); if(in == null){ throw new ParameterException("题目不存在"); } return in; } public Page select(int page, int pageSize){ return select(textbookQuestionMapper, page, pageSize); } public Page select(Integer[] ids){ return page(()-> select(textbookQuestionMapper, ids), 1, ids.length); } public List select(Collection ids){ return select(textbookQuestionMapper, ids); } }