package com.qxueyou.scc.exercise.util; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import com.qxueyou.scc.base.model.ITrace; import com.qxueyou.scc.base.util.CollectionUtils; import com.qxueyou.scc.base.util.CommonUtils; import com.qxueyou.scc.exercise.model.ExerciseItem; import com.qxueyou.scc.exercise.model.ExerciseItemAnswerU; import com.qxueyou.scc.exercise.model.ExerciseItemOption; import com.qxueyou.scc.exercise.model.ExerciseItemScore; import com.qxueyou.scc.exercise.model.ExerciseObjectImg; import com.qxueyou.scc.exercise.model.ExerciseOptionStatistics; import com.qxueyou.scc.school.model.SchEvaluate; /** * 练习工具类 * * @author zhiyong * */ public class ExerciseUtils { /** * 重新组装练习item * * @param lstItems * @return */ public static void packageExerciseItem(List lstItems, List lstUserAnswer, List lstOptionImgs) { for (ExerciseItem objExerciseItem : lstItems) { // 选项 List options = objExerciseItem.getOptions(); // 选项分数 List scores = objExerciseItem.getScores(); ExerciseUtils.packOption(options, scores, lstOptionImgs); if (lstUserAnswer == null || lstUserAnswer.isEmpty()) { continue; } for (ExerciseItemAnswerU answerU : lstUserAnswer) { // 获用户答案 if (answerU.getExerciseItemId().equals(objExerciseItem.getExerciseId())) { objExerciseItem.setAnswer(answerU.getAnswer()); break; } } } } /** * 为选项组装分数和图片 * * @return */ private static List packOption(List options, List scores, List lstOptionImgs) { if (options == null || options.isEmpty()) { return options; } if (scores == null || scores.isEmpty()) { return options; } for (ExerciseItemOption objExerciseItemOption : options) { for (ExerciseItemScore objExerciseItemScore : scores) { if (objExerciseItemScore.getAttribute1().equals(objExerciseItemOption.getOptionId())) { objExerciseItemOption.setScore((int) (Double.parseDouble(objExerciseItemScore.getScore()))); break; } } // 图片 if (lstOptionImgs == null || lstOptionImgs.isEmpty()) { continue; } for (ExerciseObjectImg objExerciseObjectImg : lstOptionImgs) { if (objExerciseObjectImg.getExerciseObjectId().equals(objExerciseItemOption.getOptionId())) { List lstImgs = new ArrayList<>(); lstImgs.add(objExerciseObjectImg); objExerciseItemOption.setImgPath(objExerciseObjectImg.getImgPath()); objExerciseItemOption.setImgs(lstImgs); break; } } } return options; } /** * 组装问卷详细统计情况 * * @param lstItems * @param objSchEvaluate * @return */ public static Map packageExerciseDetail(List lstItems, SchEvaluate objSchEvaluate) { Map mResult = new HashMap(); double iTotalAverageScore = 0; double iTotalScore = 0; for (ExerciseItem objExerciseItem : lstItems) { // 选项 List options = objExerciseItem.getOptions(); // 选项分数 List scores = objExerciseItem.getScores(); ExerciseUtils.packOption(options, scores, null); List exerciseItemAnswerU = objExerciseItem.getExerciseItemAnswerU(); // 平均分数 double dAverageScore = 0; double dUserScore = 0; // 是否存在答题学员 boolean hasAnswerU = exerciseItemAnswerU != null && !exerciseItemAnswerU.isEmpty(); if (options == null || options.isEmpty()) { continue; } // 统计每个选项的情况 LinkedHashMap mOptionsDetail = new LinkedHashMap(); LinkedHashMap mOptionOrderDetail = new LinkedHashMap(); if (!hasAnswerU) { continue; } for (ExerciseItemAnswerU objExerciseItemAnswerU : exerciseItemAnswerU) { String strAnswer = objExerciseItemAnswerU.getAnswer(); if (StringUtils.isEmpty(strAnswer)) {// 为空自动跳出循环 break; } Map mResult2 = packageItemOption(objExerciseItem, strAnswer, mOptionsDetail, mOptionOrderDetail); objExerciseItemAnswerU.setAnswerValue((String) mResult2.get("userAnswerContent")); objExerciseItem.setMaxScore((Double) mResult2.get("dMaxScore")); dUserScore += (Double) mResult2.get("dUserScore"); } // 计算平均值 if (hasAnswerU) { dAverageScore = dUserScore / exerciseItemAnswerU.size(); } // 最大值 iTotalScore += objExerciseItem.getMaxScore(); objExerciseItem.setOptionsDetail(mOptionsDetail); if(!mOptionOrderDetail.isEmpty()) { List> optionsOrderDetail = new ArrayList<>(); for (String key : mOptionOrderDetail.keySet()) { optionsOrderDetail.add(CollectionUtils.newObjectMap("optionsOrder", key, "count", mOptionOrderDetail.get(key))); } objExerciseItem.setOptionsOrderDetail(optionsOrderDetail); } objExerciseItem.setAverageScore(dAverageScore); iTotalAverageScore += dAverageScore; objExerciseItem.setScores(null); } mResult.put("iTotalAverageScore", iTotalAverageScore); mResult.put("iTotalScore", iTotalScore); mResult.put("lstExerciseItem", lstItems); mResult.put("objSchEvaluate", objSchEvaluate); return mResult; } /** * 组装问卷详细统计情况 * * @param lstItems * @param objSchEvaluate * @return */ public static Map packageUserExerciseDetail(List result, SchEvaluate objSchEvaluate, List lstExerciseObjectImg) { Map mResult = new HashMap(); double iTotalScore = 0; List lstItems = new ArrayList<>(); double dTotalScoreU = 0; String strCreator = ""; for (ExerciseItem objExerciseItem : result) { lstItems.add(objExerciseItem); List lstExerciseItemAnswerU = objExerciseItem.getExerciseItemAnswerU(); // 选项 List options = objExerciseItem.getOptions(); // 选项分数 List scores = objExerciseItem.getScores(); // 组装选项和分数 ExerciseUtils.packOption(options, scores, lstExerciseObjectImg); if (lstExerciseItemAnswerU == null || lstExerciseItemAnswerU.isEmpty()) { continue; } // 用户答案 String strAnswer = lstExerciseItemAnswerU.get(0).getAnswer(); if (StringUtils.isEmpty(strAnswer)) {// 为空自动跳出循环 break; } strCreator = lstExerciseItemAnswerU.get(0).getCreator(); if (objExerciseItem.getType() == ExerciseItem.TYPE_ESSAY_QUESTION) {// 问答题 objExerciseItem.setAnswer(strAnswer); } else { if (options == null || options.isEmpty()) { continue; } Map mResult2 = packageItemOption(objExerciseItem, strAnswer, new LinkedHashMap(), new LinkedHashMap()); objExerciseItem.setMaxScore((Double) mResult2.get("dUserScore")); iTotalScore += (Double) mResult2.get("dMaxScore"); dTotalScoreU += (Double) mResult2.get("dUserScore"); objExerciseItem.setScores(null); objExerciseItem.setAnswer((String) mResult2.get("userAnswerContent")); } } mResult.put("iTotalScore", iTotalScore); mResult.put("dTotalScoreU", dTotalScoreU); mResult.put("lstExerciseItem", lstItems); mResult.put("objSchEvaluate", objSchEvaluate); mResult.put("strUserName", strCreator); return mResult; } /** * 判断题目类型 * * @param objExerciseItem * 题目 * @param strAnswer * 用户选择答案 * @param mOptionsDetail * 统计值 * @return */ public static Map packageItemOption(ExerciseItem objExerciseItem, String strAnswer, LinkedHashMap mOptionsDetail, LinkedHashMap mOptionOrderDetail) { Map mResult = new HashMap(); // 选项 List options = objExerciseItem.getOptions(); double dMaxScore = 0; double dUserScore = 0; String[] c = "A B C D E F G H I J K L M N".split(" "); // 题目类型 int iType = objExerciseItem.getType(); int index = 0; StringBuffer userAnswerContent = new StringBuffer(256); for (ExerciseItemOption objExerciseItemOption : options) { double dScore = Double.valueOf(objExerciseItemOption.getScore()); // 获取最大值 dMaxScore = iType == 2 ? dMaxScore + dScore : dScore > dMaxScore ? dScore : dMaxScore; if (iType == ExerciseItem.TYPE_SINGLE_SELECT && strAnswer.substring(0, 1).equals(objExerciseItemOption.getOptionOrder())) {// 单选A或B或C或D_补充xxxxxx dUserScore += dScore; userAnswerContent.append(strAnswer.length() > 2 ? objExerciseItemOption.getContent() + strAnswer.substring(1, strAnswer.length()) : // 拼接补充内容 objExerciseItemOption.getContent()); mOptionsDetail.put(ExerciseUtils.getOptionsContent(objExerciseItemOption), ExerciseUtils.getValue(ExerciseUtils.getOptionsContent(objExerciseItemOption), mOptionsDetail)); mOptionOrderDetail.put(objExerciseItemOption.getOptionOrder(),mOptionsDetail.get(ExerciseUtils.getOptionsContent(objExerciseItemOption))); } else if (iType == ExerciseItem.TYPE_MULTI_SELECT) {// 多选A,B,C,D_补充xxxxxx String[] arrAnswer = strAnswer.split("_"); String[] strAnswerOrder = arrAnswer[0].split(","); for (int i = 0; i < strAnswerOrder.length; i++) { if (strAnswerOrder[i].equals(objExerciseItemOption.getOptionOrder())) { dUserScore += dScore; // 拼接补充的内容 if (index == options.size() - 1) { userAnswerContent.append(objExerciseItemOption.getContent()); userAnswerContent.append(arrAnswer.length > 1 && arrAnswer[1].length() > 2 ? "_" + strAnswer.substring(arrAnswer[0].length() + 1, strAnswer.length()) : ""); } else { userAnswerContent.append(objExerciseItemOption.getContent()).append(';'); } mOptionsDetail.put(ExerciseUtils.getOptionsContent(objExerciseItemOption), ExerciseUtils .getValue(ExerciseUtils.getOptionsContent(objExerciseItemOption), mOptionsDetail)); mOptionOrderDetail.put(objExerciseItemOption.getOptionOrder(),mOptionsDetail.get(ExerciseUtils.getOptionsContent(objExerciseItemOption))); } } } else if (iType == ExerciseItem.TYPE_SCORE && c[Integer.valueOf(strAnswer) - 1].equals(objExerciseItemOption.getOptionOrder())) {// 分值,1,2,3,4,5颗星 dUserScore += dScore; userAnswerContent.append(ExerciseUtils.getOptionsContent(objExerciseItemOption));// 给答案文字赋值 mOptionsDetail.put(ExerciseUtils.getOptionsContent(objExerciseItemOption), ExerciseUtils.getValue(ExerciseUtils.getOptionsContent(objExerciseItemOption), mOptionsDetail)); mOptionOrderDetail.put(objExerciseItemOption.getOptionOrder(),mOptionsDetail.get(ExerciseUtils.getOptionsContent(objExerciseItemOption))); } else if (iType == ExerciseItem.TYPE_MEASUREMENT && index == 0) {// 量值,直接存分数 dUserScore += Integer.valueOf(strAnswer); userAnswerContent.append(strAnswer).append("分"); mOptionsDetail.put(strAnswer + "分", mOptionsDetail.get(strAnswer + "分") == null ? 1 : mOptionsDetail.get(strAnswer + "分") + 1); mOptionOrderDetail.put(strAnswer,mOptionsDetail.get(strAnswer + "分")); } index++; } mResult.put("dMaxScore", dMaxScore); mResult.put("userAnswerContent", userAnswerContent.toString()); mResult.put("dUserScore", dUserScore); return mResult; } /** * 获取值 * * @param content * @param mOptionsDetail * @param Content * @return */ public static Integer getValue(String content, Map mOptionsDetail) { return mOptionsDetail.get(content) == null ? 1 : mOptionsDetail.get(content) + 1; } /** * 获取选项的值和分数 * * @param objExerciseItemOption * @return */ public static String getOptionsContent(ExerciseItemOption objExerciseItemOption) { return objExerciseItemOption.getContent().concat("(").concat(String.valueOf(objExerciseItemOption.getScore())) .concat("分)"); } /** * 重新组装练习item * * @param lstAllOptions * @return */ public static void packageExerciseItem(Map> optionsMap, Map answerMap, List lstAllOptions, Map> imgOptionMap) { // 上一次练习id String lastExerciseId = ""; ExerciseItemOption option = null; List lstOptions = null; StringBuffer correctAnswers = new StringBuffer(128); // 正确答案 // 4.3 题目选项 for (int i = 0; i < lstAllOptions.size(); i++) { option = lstAllOptions.get(i); if (imgOptionMap != null && imgOptionMap.get(option.getOptionId()) != null) { option.setImgs(imgOptionMap.get(option.getOptionId())); } if (i == 0) {// 第一次 lstOptions = new ArrayList(); lstOptions.add(option); if (option.getChecked()) {// 正确答案 correctAnswers.append(option.getOptionOrder()).append(','); } } else {// 第二次开始 if (lastExerciseId.equals(option.getExerciseItemId())) {// 相同 lstOptions.add(option); if (option.getChecked()) {// 正确答案 correctAnswers.append(option.getOptionOrder()).append(','); } } else {// 不相同 // 添加到map optionsMap.put(lastExerciseId, lstOptions); answerMap.put(lastExerciseId, correctAnswers.toString()); correctAnswers = new StringBuffer(128); if (option.getChecked()) {// 正确答案 correctAnswers.append(option.getOptionOrder()).append(','); } lstOptions = new ArrayList(); lstOptions.add(option); } } if (i == lstAllOptions.size() - 1) {// 最后一次 answerMap.put(option.getExerciseItemId(), correctAnswers.toString()); optionsMap.put(option.getExerciseItemId(), lstOptions); } // 上一次练习id lastExerciseId = option.getExerciseItemId(); } } /** * 重新组装练习item 题目图片 * * @param lstAllOptions * @return */ public static Map> packageExerciseItemImg(List lstImgs) { Map> imgMap = new HashMap>(); // 上一次练习id String lastExerciseId = ""; ExerciseObjectImg objImg = null; List lstImg = null; // 4.3 题目选项 for (int i = 0; i < lstImgs.size(); i++) { objImg = lstImgs.get(i); if (i == 0) {// 第一次 lstImg = new ArrayList(); lstImg.add(objImg); } else {// 第二次开始 if (lastExerciseId.equals(objImg.getExerciseObjectId())) {// 相同 lstImg.add(objImg); } else {// 不相同 // 添加到map imgMap.put(lastExerciseId, lstImg); lstImg = new ArrayList(); lstImg.add(objImg); } } if (i == lstImgs.size() - 1) {// 最后一次 imgMap.put(objImg.getExerciseObjectId(), lstImg); } // 上一次练习id lastExerciseId = objImg.getExerciseObjectId(); } return imgMap; } /** * 重新组装练习item * * @param lstAllOptions * @return */ public static void packageExerciseItemScore(Map> scoreMap, List lstAllscores) { // 上一次练习id String lastExerciseId = ""; ExerciseItemScore score = null; List lstscore = null; // 4.3 题目选项 for (int i = 0; i < lstAllscores.size(); i++) { score = lstAllscores.get(i); if (i == 0) {// 第一次 lstscore = new ArrayList(); lstscore.add(score); } else {// 第二次开始 if (lastExerciseId.equals(score.getExerciseItemId())) {// 相同 lstscore.add(score); } else {// 不相同 // 添加到map scoreMap.put(lastExerciseId, lstscore); lstscore = new ArrayList(); lstscore.add(score); } } if (i == lstAllscores.size() - 1) {// 最后一次 scoreMap.put(score.getExerciseItemId(), lstscore); } // 上一次练习id lastExerciseId = score.getExerciseItemId(); } } /** * 重新组装做题记录 ExerciseItemAnswer —— 成绩统计 * * @param lstAllOptions * @return */ public static void packageExerciseItemAnswerStatis(List answers, Map answerUMap) { // 上一次练习id String lastExerciseId = ""; ExerciseItemAnswerU answer = null; List lstAnswers = null; // 做题记录 for (int i = 0; i < answers.size(); i++) { answer = answers.get(i); if (i == 0) {// 第一次 lstAnswers = new ArrayList(); lstAnswers.add(answer); } else {// 第二次开始 if (lastExerciseId.equals(answer.getExerciseItemId())) {// 相同 lstAnswers.add(answer); } else {// 不相同 // 添加到map answerUMap.put(lastExerciseId, lstAnswers); lstAnswers = new ArrayList(); lstAnswers.add(answer); } } if (i == answers.size() - 1) {// 最后一次 answerUMap.put(answer.getExerciseItemId(), lstAnswers); } // 上一次练习id lastExerciseId = answer.getExerciseItemId(); } } /** * 重新组装题目选项ExerciseItemOption —— 成绩统计 * * @param lstAllOptions * @return */ public static void packageExerciseItemOption(List itemOptionLst, Map itemOptionMap) { // 上一次练习id String lastExerciseId = ""; ExerciseItemOption option = null; List lstOptions = null; // 题目选项 for (int i = 0; i < itemOptionLst.size(); i++) { option = itemOptionLst.get(i); if (i == 0) {// 第一次 lstOptions = new ArrayList(); lstOptions.add(option); } else {// 第二次开始 if (lastExerciseId.equals(option.getExerciseItemId())) {// 相同 lstOptions.add(option); } else {// 不相同 // 添加到map itemOptionMap.put(lastExerciseId, lstOptions); lstOptions = new ArrayList(); lstOptions.add(option); } } if (i == itemOptionLst.size() - 1) {// 最后一次 itemOptionMap.put(option.getExerciseItemId(), lstOptions); } // 上一次练习id lastExerciseId = option.getExerciseItemId(); } } /** * 重新组装题目选项统计ExerciseOptionStatistics —— 成绩统计 * * @param lstAllOptions * @return */ public static void packageExerciseOptionStatis(List claOptionStatisLst, Map optionStatisMap) { // 上一次练习id String lastExerciseId = ""; ExerciseOptionStatistics optionSta = null; List lstOptionStas = null; // 题目选项 for (int i = 0; i < claOptionStatisLst.size(); i++) { optionSta = claOptionStatisLst.get(i); if (i == 0) {// 第一次 lstOptionStas = new ArrayList(); lstOptionStas.add(optionSta); } else {// 第二次开始 if (lastExerciseId.equals(optionSta.getExerciseItemId())) {// 相同 lstOptionStas.add(optionSta); } else {// 不相同 // 添加到map optionStatisMap.put(lastExerciseId, lstOptionStas); lstOptionStas = new ArrayList(); lstOptionStas.add(optionSta); } } if (i == claOptionStatisLst.size() - 1) {// 最后一次 optionStatisMap.put(optionSta.getExerciseItemId(), lstOptionStas); } // 上一次练习id lastExerciseId = optionSta.getExerciseItemId(); } } /** * 获取转换结果 * * @param count * @param allCount * @return */ public static String getFormatValue(long count, long allCount) { double value = Double.valueOf(count) / Double.valueOf(allCount) * 100; return CommonUtils.formatDecimalFormat(value, CommonUtils.PARTEN_ONE); } /** * 获取转换结果 * * @param count * @param allCount * @return */ public static String getFormatValue(int count, int allCount) { double value = Double.valueOf(count) / Double.valueOf(allCount) * 100; return CommonUtils.formatDecimalFormat(value, CommonUtils.PARTEN_ONE); } /** * 设置新增轨迹信息 * * @param trace */ public static void setCreateTrace(ITrace trace, Map userMap) { trace.setCreateId(userMap.get("userId")); trace.setCreateTime(new Date(System.currentTimeMillis())); trace.setCreator(userMap.get("userName")); trace.setUpdateId(userMap.get("userId")); trace.setUpdateTime(new Date(System.currentTimeMillis())); trace.setUpdator(userMap.get("userName")); } /** * 设置更新轨迹信息 * * @param trace */ public static void setUpdateTrace(ITrace trace, Map userMap) { trace.setUpdateId(userMap.get("userId")); trace.setUpdateTime(new Date(System.currentTimeMillis())); trace.setUpdator(userMap.get("userName")); } /** * 转换为BigDecimal * * @param str1 * @param str2 * @return */ public static BigDecimal parseStrToBigDecimal(String str1, String str2) { return new BigDecimal( CommonUtils.formatDecimalFormat(Double.parseDouble(str1) / Double.parseDouble(str2) * 100, "#.##")); } }