package jnpf.util; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import jnpf.model.cultivate.po.exam.FtbCultivateExam; import jnpf.model.cultivate.po.exam.FtbCultivateExamUser; import jnpf.model.cultivate.po.exam.FtbCultivateExamUserDetail; import jnpf.model.cultivate.po.paper.FtbCultivateTestPaper; import jnpf.model.cultivate.po.question.FtbCultivateQuestion; import jnpf.model.cultivate.req.paper.PaperConfigReq; import jnpf.model.cultivate.resp.*; import jnpf.model.cultivate.v2.exam.po.CultivateExam; import jnpf.model.cultivate.v2.exam.vo.V2ExamStatisticsForPersonExcelVo; import jnpf.model.cultivate.v2.exam.vo.V2ExamStatisticsForPersonVo; import jnpf.model.enums.CourseEnums; import jnpf.model.personnels.dto.staff.roster.WorkerGroupDataDto; import org.apache.commons.lang3.StringUtils; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * 题目分析工具类 */ public class QuestionAnalysisUtil { /** * 初始化返回值 * * @return */ public static Map initAnalysQuestionCount() { HashMap map = new HashMap<>(); map.put(String.valueOf(CourseEnums.QuestionType.SINGLE.getCode()), new PaperConfigReq.QuestionNum(0, 0, 0)); map.put(String.valueOf(CourseEnums.QuestionType.MULTI.getCode()), new PaperConfigReq.QuestionNum(0, 0, 0)); map.put(String.valueOf(CourseEnums.QuestionType.JUDGE.getCode()), new PaperConfigReq.QuestionNum(0, 0, 0)); map.put(String.valueOf(CourseEnums.QuestionType.FILL.getCode()), new PaperConfigReq.QuestionNum(0, 0, 0)); map.put(String.valueOf(CourseEnums.QuestionType.INPUT.getCode()), new PaperConfigReq.QuestionNum(0, 0, 0)); map.put(String.valueOf(CourseEnums.QuestionType.ONE_OR_MULTI.getCode()), new PaperConfigReq.QuestionNum(0, 0, 0)); return map; } /** * 分析题目数量 * * @param map * @param questionList * @return */ public static void analysQuestionCount(Map map, List questionList) { if (CollectionUtil.isNotEmpty(questionList)) { for (FtbCultivateQuestion question : questionList) { String type = String.valueOf(question.getType()); PaperConfigReq.QuestionNum questionNum = map.get(type); if (question.getDifficulty().equals(CourseEnums.QuestionDifficulty.EASY.getCode())) { questionNum.setSimpleNum(questionNum.getSimpleNum() + 1); } else if (question.getDifficulty().equals(CourseEnums.QuestionDifficulty.MIDDLE.getCode())) { questionNum.setGeneralNum(questionNum.getGeneralNum() + 1); } else if (question.getDifficulty().equals(CourseEnums.QuestionDifficulty.MAX.getCode())) { questionNum.setHardNum(questionNum.getHardNum() + 1); } } } } /** * 计算百分比 * * @param score 用户考试分数 * @param total 试卷总分数 * @return */ public static Integer calculatePercentage(int score, int total) { if (total == 0) { return 0; // 避免除以零的错误 } return (int) Math.round((score / (float) total) * 100); } /** * 计算用户考试的状态 * * @param exam 考试信息 * @param paper 试卷信息 * @param score 用户考试的总分数 * @return */ public static Integer calculateUserExamStatus(FtbCultivateExam exam, FtbCultivateTestPaper paper, Integer score) { int examTotleScore = paper.getTotalScore();//试卷总分数 //合格 Integer passType = exam.getPassType();//合格分数类型(1固定分,2百分比 Integer passMark = exam.getPassMark();//合格分数 if (CourseEnums.ExamScoreCheckType.FIXED.getCode().equals(passType)) { if (score >= passMark) { //已经合格,检测是否优秀 if (checkIsVeryPass(examTotleScore, score, exam.getExcellentType(), exam.getExcellentMark())) { return CourseEnums.ExamStatus.VERY_PASS.getCode(); } return CourseEnums.ExamStatus.PASS.getCode(); } else { ///不合格 return CourseEnums.ExamStatus.NO_PASS.getCode(); } } else { Integer calculateScore = QuestionAnalysisUtil.calculateScore(passMark, examTotleScore); if (score >= calculateScore) { //已经合格 判断是否优秀 if (checkIsVeryPass(examTotleScore, score, exam.getExcellentType(), exam.getExcellentMark())) { return CourseEnums.ExamStatus.VERY_PASS.getCode(); } return CourseEnums.ExamStatus.PASS.getCode(); } else { //不合格 return CourseEnums.ExamStatus.NO_PASS.getCode(); } } } public static Integer calculateUserExamStatus(FtbCultivateExam exam, Integer examTotleScore, Integer score) { //合格 Integer passType = exam.getPassType();//合格分数类型(1固定分,2百分比 Integer passMark = exam.getPassMark();//合格分数 if (CourseEnums.ExamScoreCheckType.FIXED.getCode().equals(passType)) { if (score >= passMark) { //已经合格,检测是否优秀 if (checkIsVeryPass(examTotleScore, score, exam.getExcellentType(), exam.getExcellentMark())) { return CourseEnums.ExamStatus.VERY_PASS.getCode(); } return CourseEnums.ExamStatus.PASS.getCode(); } else { ///不合格 return CourseEnums.ExamStatus.NO_PASS.getCode(); } } else { Integer calculateScore = QuestionAnalysisUtil.calculateScore(passMark, examTotleScore); if (score >= calculateScore) { //已经合格 判断是否优秀 if (checkIsVeryPass(examTotleScore, score, exam.getExcellentType(), exam.getExcellentMark())) { return CourseEnums.ExamStatus.VERY_PASS.getCode(); } return CourseEnums.ExamStatus.PASS.getCode(); } else { //不合格 return CourseEnums.ExamStatus.NO_PASS.getCode(); } } } /** * 判断是否优秀 * * @param totleScore 考试总分数 * @param score 用户考试分数 * @param excellentType 优秀分数类型(1固定分,2百分比) * @param excellentMark 优秀分数 * @return false 不优秀 true 优秀 */ public static boolean checkIsVeryPass(Integer totleScore, Integer score, Integer excellentType, Integer excellentMark) { if (CourseEnums.ExamScoreCheckType.FIXED.getCode().equals(excellentType)) { //固定分 if (score >= excellentMark) { return true; } return false; } Integer calculateScore = QuestionAnalysisUtil.calculateScore(excellentMark, totleScore); if (score >= calculateScore) { return true; } return false; } /** * 转换试卷题目 * * @param questionList * @param examUserDetailList * @return */ public static PaperQuestionVo convertPaperQuestionVo(List questionList, List examUserDetailList) { PaperQuestionVo vo = new PaperQuestionVo(new HashMap<>()); if (CollectionUtil.isEmpty(questionList)) { return vo; } List appQuestionVoList = BeanUtil.copyToList(questionList, AppQuestionVo.class); if (CollectionUtil.isNotEmpty(examUserDetailList)) { //examUserDetailList 转换成 题目id 的map Map examUserDetailMap = examUserDetailList.stream().collect(Collectors.toMap(FtbCultivateExamUserDetail::getQuestionId, Function.identity())); //填充用户答案 for (AppQuestionVo appQuestionVo : appQuestionVoList) { FtbCultivateExamUserDetail detail = examUserDetailMap.get(appQuestionVo.getQuestionId()); if (null != detail) { appQuestionVo.setUserAnswer(examUserDetailMap.get(appQuestionVo.getId()).getUserAnswer()); appQuestionVo.setIsComplete(true); } } } Map> questionOptionMap = new HashMap<>(); //填充题目选项 for (AppQuestionVo appQuestionVo : appQuestionVoList) { String type = String.valueOf(appQuestionVo.getType()); List questionOptionVoList = questionOptionMap.get(type); if (CollectionUtil.isEmpty(questionOptionVoList)) { questionOptionVoList = new ArrayList<>(); } questionOptionVoList.add(appQuestionVo); questionOptionMap.put(type, questionOptionVoList); } vo.setQuestionMap(questionOptionMap); return vo; } /** * 多选题判断是否正确 * * @param answer 标准答案 * @param userAnswer 用户答案 * @return true 正确 false 错误 */ public static boolean checkMultiRight(String answer, String userAnswer) { if (StringUtils.isEmpty(answer) || StringUtils.isEmpty(userAnswer)) { return false; } if (answer.equals(userAnswer)) { return true; } List answerList = Arrays.asList(answer.split(",")); List userAnswerList = Arrays.asList(userAnswer.split(",")); if (answerList.size() != userAnswerList.size()) { return false; } Collections.sort(answerList); Collections.sort(userAnswerList); String answerStr = String.join(",", answerList); String userAnswerStr = String.join(",", userAnswerList); if (answerStr.equals(userAnswerStr)) { return true; } return false; } /** * 计算两个日期之间的秒数 * * @param start * @param end * @return */ public static Long differenceSecond(Date start, Date end) { //计算两个日期之间的秒数 Calendar calendar1 = Calendar.getInstance(); Calendar calendar2 = Calendar.getInstance(); // 设置Calendar对象的时间为date1和date2 calendar1.setTime(start); calendar2.setTime(end); // 计算两个日期之间的秒数差 return (calendar2.getTimeInMillis() - calendar1.getTimeInMillis()) / 1000; } /** * 统计用户考试总数和已完成数 * * @param examUserList * @return */ public static UserExamCount countCompleteAndTotleExamNum(List examUserList) { Set totle = new HashSet<>(); Set complete = new HashSet<>(); for (FtbCultivateExamUser examUser : examUserList) { StringBuilder sbTotle = new StringBuilder() .append(examUser.getExamId()) .append(examUser.getExamSource()) .append(examUser.getRelationRankId()) .append(examUser.getRelationCourseExamId()) .append(examUser.getRelationPositionExamId()); totle.add(sbTotle.toString()); if (!CourseEnums.ExamStatus.WAIT.getCode().equals(examUser.getStatus()) && !CourseEnums.ExamStatus.OVERDUE.getCode().equals(examUser.getStatus())) { StringBuilder completeTotle = new StringBuilder() .append(examUser.getExamId()) .append(examUser.getExamSource()) .append(examUser.getRelationRankId()) .append(examUser.getRelationCourseExamId()) .append(examUser.getRelationPositionExamId()); complete.add(completeTotle.toString()); } } UserExamCount userExamCount = new UserExamCount(); userExamCount.setTotleNum(totle.size()); userExamCount.setCompleteNum(complete.size()); return userExamCount; } /** * 获取统计开始日期 * * @param date 目标日期 * @param type 统计类型 1月,2季度,3年 * @return */ public static Date getStatisticsStartDate(Date date, Integer type) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); if (type == 1) { calendar.add(Calendar.MONTH, -1); } else if (type == 2) { calendar.add(Calendar.MONTH, -3); } else { calendar.add(Calendar.YEAR, -1); } return calendar.getTime(); } /** * 统计用户考试合格率 * * @param examUserList */ public static StatisticsResultDto statisticeLv(List examUserList) { StatisticsResultDto dto = new StatisticsResultDto(); if (CollectionUtil.isEmpty(examUserList)) { return dto; } int totle = examUserList.size(); int pass = 0; int noPass = 0; int excellent = 0; for (FtbCultivateExamUser examUser : examUserList) { if (CourseEnums.ExamStatus.PASS.getCode().equals(examUser.getStatus())) { pass++; } else if (CourseEnums.ExamStatus.VERY_PASS.getCode().equals(examUser.getStatus())) { pass++; excellent++; } else if (CourseEnums.ExamStatus.NO_PASS.getCode().equals(examUser.getStatus())) { noPass++; } } dto.setPass(pass); dto.setNoPass(noPass); dto.setTotle(totle); dto.setExcellent(excellent); dto.setPassLv(Double.valueOf(Math.round((pass / (float) totle) * 100))); dto.setExcellentLv(Double.valueOf(Math.round((excellent / (float) totle) * 100))); dto.setNoPassLv(Double.valueOf(Math.round((noPass / (float) totle) * 100))); return dto; } public static StatisticsResultDto statisticeLvForAppExam(List examUserList) { StatisticsResultDto dto = new StatisticsResultDto(); if (CollectionUtil.isEmpty(examUserList)) { return dto; } int totle = examUserList.size(); int pass = 0; int noPass = 0; int excellent = 0; for (AppExamListVo examUser : examUserList) { if (CourseEnums.ExamStatus.PASS.getCode().equals(examUser.getStatus())) { pass++; } else if (CourseEnums.ExamStatus.VERY_PASS.getCode().equals(examUser.getStatus())) { excellent++; } else if (CourseEnums.ExamStatus.NO_PASS.getCode().equals(examUser.getStatus())) { noPass++; } } dto.setPass(pass); dto.setNoPass(noPass); dto.setTotle(totle); dto.setExcellent(excellent); dto.setPassLv(Double.valueOf(Math.round(((pass + excellent) / (float) totle) * 100))); dto.setExcellentLv(Double.valueOf(Math.round((excellent / (float) totle) * 100))); dto.setNoPassLv(Double.valueOf(Math.round((noPass / (float) totle) * 100))); return dto; } /** * 统计合格数量 和 总数量 * * @param examUserList * @return */ public static UserExamCount countPassAndTotleExamNum(List examUserList) { Set totle = new HashSet<>(); Set pass = new HashSet<>(); Set noPassNum = new HashSet<>(); Set waitNumSet = new HashSet<>(); for (FtbCultivateExamUser examUser : examUserList) { StringBuilder sbTotle = new StringBuilder() .append(examUser.getExamId()) .append(examUser.getUserId()) .append(examUser.getExamSource()) .append(examUser.getRelationRankId()) .append(examUser.getRelationCourseExamId()) .append(examUser.getRelationPositionExamId()); totle.add(sbTotle.toString()); if (CourseEnums.ExamStatus.PASS.getCode().equals(examUser.getStatus()) || CourseEnums.ExamStatus.VERY_PASS.getCode().equals(examUser.getStatus())) { StringBuilder passTotle = new StringBuilder() .append(examUser.getExamId()) .append(examUser.getUserId()) .append(examUser.getExamSource()) .append(examUser.getRelationRankId()) .append(examUser.getRelationCourseExamId()) .append(examUser.getRelationPositionExamId()); pass.add(passTotle.toString()); } if (CourseEnums.ExamStatus.NO_PASS.getCode().equals(examUser.getStatus())) { StringBuilder noPassSb = new StringBuilder() .append(examUser.getExamId()) .append(examUser.getUserId()) .append(examUser.getExamSource()) .append(examUser.getRelationRankId()) .append(examUser.getRelationCourseExamId()) .append(examUser.getRelationPositionExamId()); noPassNum.add(noPassSb.toString()); } if (CourseEnums.ExamStatus.WAIT_CHECK.getCode().equals(examUser.getStatus())) { StringBuilder waitSb = new StringBuilder() .append(examUser.getExamId()) .append(examUser.getUserId()) .append(examUser.getExamSource()) .append(examUser.getRelationRankId()) .append(examUser.getRelationCourseExamId()) .append(examUser.getRelationPositionExamId()); waitNumSet.add(waitSb.toString()); } } UserExamCount userExamCount = new UserExamCount(); userExamCount.setTotleNum(totle.size()); userExamCount.setPassTotleNum(pass.size()); userExamCount.setNoPassNum(noPassNum.size()); userExamCount.setWaitNum(waitNumSet.size()); return userExamCount; } /** * 统计初试复试合格率 * * @param examUserList * @return */ public static StatisticsResultFirstAndRepeatDto statisticeFirstAndRepeatLv(List examUserList) { Set totle = new HashSet<>(); Map pass = new HashMap<>(); for (FtbCultivateExamUser examUser : examUserList) { StringBuilder sbTotleKey = new StringBuilder() .append(examUser.getExamId()) .append(examUser.getExamSource()) .append(examUser.getRelationRankId()) .append(examUser.getRelationCourseExamId()) .append(examUser.getRelationPositionExamId()); totle.add(sbTotleKey.toString()); if (CourseEnums.ExamStatus.PASS.getCode().equals(examUser.getStatus()) || CourseEnums.ExamStatus.VERY_PASS.getCode().equals(examUser.getStatus())) { StringBuilder sbPassKey = new StringBuilder() .append(examUser.getExamId()) .append(examUser.getExamSource()) .append(examUser.getRelationRankId()) .append(examUser.getRelationCourseExamId()) .append(examUser.getRelationPositionExamId()); String key = sbPassKey.toString(); Integer num = pass.get(key); if (null == num) { pass.put(key, 1); } else { pass.put(key, num + 1); } } } StatisticsResultFirstAndRepeatDto dto = new StatisticsResultFirstAndRepeatDto(); dto.setTotle(totle.size()); //遍历 pass int firstPass = 0; int repeatPass = 0; for (Map.Entry entry : pass.entrySet()) { String key = entry.getKey(); Integer num = entry.getValue(); if (num == 1) { firstPass++; } else { repeatPass++; } } dto.setFirstPass(firstPass); dto.setRepeatPass(repeatPass); dto.setFirstPassLv(Double.valueOf(Math.round((firstPass / (float) dto.getTotle()) * 100))); dto.setRepeatPassLv(Double.valueOf(Math.round((repeatPass / (float) dto.getTotle()) * 100))); return dto; } /** * 计算合格分数 * * @param num1 * @param num2 * @return */ public static Integer calculateScore(Integer num1, Integer num2) { if (num1 == null || num1 == 0) { return 0; } if (num2 == null || num2 == 0) { return 0; } double lv = (double) num1 / 100 * num2; DecimalFormat df = new DecimalFormat("#"); return Integer.valueOf(df.format(lv)); } public static BigDecimal calculateScoreV2(Integer num1, Integer num2) { if (num1 == null || num1 == 0) { return new BigDecimal(0); } if (num2 == null || num2 == 0) { return new BigDecimal(0); } return new BigDecimal(num1).multiply(new BigDecimal(num2)).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP); } public static void main(String[] args) throws InterruptedException { Date date = new Date(); Thread.sleep(1000); Date now = new Date(); if (now.after(date)) { System.out.println("在之后"); } else { System.out.println("不在之后"); } } /** * 获取最高分 * * @param list * @return */ public static UserRankingVo getMaxScore(List list) { UserRankingVo vo = list.get(0); for (UserRankingVo userRankingVo : list) { int score = Integer.parseInt(userRankingVo.getScore()); int maxScore = Integer.parseInt(vo.getScore()); if (score > maxScore) { vo = userRankingVo; } } return vo; } public static ExamStatisticsForPersonExcelVo convertToExcelPersonvo(ExamStatisticsForPersonVo vo) { ExamStatisticsForPersonExcelVo excel = new ExamStatisticsForPersonExcelVo(); excel.setUserName(vo.getUserName()); excel.setSystemWokerId(vo.getSystemWokerId()); List userOrgList = vo.getUserOrgList(); if (CollectionUtil.isNotEmpty(userOrgList)) { List names = userOrgList.stream() .map(WorkerGroupDataDto::getAffiliatedOrgName) .collect(Collectors.toList()); excel.setOrgName(String.join(",", names)); List orgIds = userOrgList.stream() .map(WorkerGroupDataDto::getOrgEncode) .collect(Collectors.toList()); excel.setOrgId(String.join(",", orgIds)); List positionAndRanks = new ArrayList<>(); for (WorkerGroupDataDto workerGroupDataDto : userOrgList) { positionAndRanks.add(workerGroupDataDto.getAffiliatedPositionName() + "_" + workerGroupDataDto.getAffiliatedRankName()); } excel.setPositionAndRank(String.join(",", positionAndRanks)); List positionIds = userOrgList.stream() .map(WorkerGroupDataDto::getPositionEncode) .collect(Collectors.toList()); excel.setPositonId(String.join(",", positionIds)); } if (null != vo.getStudyPostionName()) { excel.setStudyPositionAndRank(vo.getStudyPostionName()); } //试卷类型,1岗位学习试卷,2常规试卷 if (vo.getExamType() == 0) { excel.setExamType("岗位学习考试"); } else if (vo.getExamType() == 1) { excel.setExamType("自定义考试"); } if (null != vo.getFinishtime()) { excel.setFinishtime(DateUtil.format(vo.getFinishtime(), DatePattern.NORM_DATETIME_PATTERN)); } if (null != vo.getDuration()) { excel.setDuration(vo.getDuration() / 60 + "分钟"); } if (null != vo.getExamTime()) { excel.setExamTime(vo.getExamTime() + "分钟"); } if (null != vo.getScore()) { excel.setScore(vo.getScore() + ""); } //(0待考试,1待批阅,2已逾期,3合格,4不合格,5优秀) if (vo.getStatus() == 0 || vo.getStatus() == 2) { excel.setExamStatus("待考"); } else { excel.setExamStatus("已考"); } if (vo.getStatus() == 1) { excel.setExamResult("待批阅"); } else if (vo.getStatus() == 3) { excel.setExamResult("合格"); } else if (vo.getStatus() == 4) { excel.setExamResult("不合格"); } else if (vo.getStatus() == 5) { excel.setExamResult("优秀"); } return excel; } public static V2ExamStatisticsForPersonExcelVo convertToExcelPersonvoV2(V2ExamStatisticsForPersonVo vo) { V2ExamStatisticsForPersonExcelVo excel = new V2ExamStatisticsForPersonExcelVo(); excel.setUserName(vo.getUserName()); excel.setSystemWorkerId(vo.getSystemWorkerId()); excel.setOrgName(vo.getOrganizeName()); excel.setOrgId(vo.getOrganizeId()); if (StringUtils.isEmpty(vo.getGradeName())) { excel.setPositionAndRank(vo.getPositionName()); } else { excel.setPositionAndRank(vo.getPositionName() + "_" + vo.getGradeName()); } excel.setPositionId(vo.getPositionEnCode()); if (null != vo.getStudyPositionName()) { excel.setStudyPositionAndRank(vo.getStudyPositionName()); } excel.setExamName(vo.getExamName()); //试卷类型,1岗位学习试卷,2常规试卷 if (vo.getExamType() == 0) { excel.setExamType("岗位学习考试"); } else if (vo.getExamType() == 1) { excel.setExamType("自定义考试"); } if (null != vo.getFinishtime()) { excel.setFinishtime(DateUtil.format(vo.getFinishtime(), DatePattern.NORM_DATETIME_PATTERN)); } if (null != vo.getDuration()) { excel.setDuration(vo.getDuration() / 60 + "分钟"); } if (null != vo.getExamTime()) { excel.setExamTime(vo.getExamTime() + "分钟"); } if (null != vo.getScore()) { excel.setScore(vo.getScore() + ""); } //(0待考试,1待批阅,2已逾期,3合格,4不合格,5优秀) if (vo.getStatus() == 0 || vo.getStatus() == 2) { excel.setExamStatus("待考"); } else { excel.setExamStatus("已考"); } if (vo.getStatus() == 1) { excel.setExamResult("待批阅"); } else if (vo.getStatus() == 3) { excel.setExamResult("合格"); } else if (vo.getStatus() == 4) { excel.setExamResult("不合格"); } else if (vo.getStatus() == 5) { excel.setExamResult("优秀"); } return excel; } /** * 对应字符串list去重复 * * @param list * @return */ public static List uniqueStringList(List list) { if (CollectionUtil.isEmpty(list)) { return new ArrayList<>(); } List filteredList = list.stream() .filter(str -> !str.isEmpty()) .collect(Collectors.toList()); Set uniqueSet = new HashSet<>(filteredList); return new ArrayList<>(uniqueSet); } public static BigDecimal calPassScore(Integer totalScore, CultivateExam exam) { //合格 Integer type = exam.getPassType();//合格分数类型(1固定分,2百分比 Integer mark = exam.getPassMark();//合格分数 if (CourseEnums.ExamScoreCheckType.FIXED.getCode().equals(type)) { return new BigDecimal(mark); } else { return calculateScoreV2(mark, totalScore); } } public static BigDecimal calExcellentScore(Integer totalScore, CultivateExam exam) { Integer type = exam.getExcellentType();//优秀分数类型(1固定分,2百分比 Integer mark = exam.getExcellentMark();//优秀分数 if (CourseEnums.ExamScoreCheckType.FIXED.getCode().equals(type)) { return new BigDecimal(mark); } else { return calculateScoreV2(mark, totalScore); } } }