ToolsService.java 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package com.qxgmat.service.extend;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.qxgmat.data.constants.enums.QuestionSubject;
  5. import com.qxgmat.data.constants.enums.SettingKey;
  6. import com.qxgmat.data.dao.entity.*;
  7. import com.qxgmat.data.relation.entity.QuestionNoRelation;
  8. import com.qxgmat.data.relation.entity.SentenceQuestionRelation;
  9. import com.qxgmat.data.relation.entity.TextbookQuestionRelation;
  10. import com.qxgmat.service.inline.RankService;
  11. import com.qxgmat.service.inline.SettingService;
  12. import org.springframework.beans.factory.annotation.Value;
  13. import org.springframework.stereotype.Service;
  14. import javax.annotation.Resource;
  15. import java.util.List;
  16. @Service
  17. public class ToolsService {
  18. @Value("${examination.verbalA}")
  19. private Integer verbalA;
  20. @Value("${examination.verbalB}")
  21. private Integer verbalB;
  22. @Value("${examination.quantC}")
  23. private Integer quantC;
  24. @Value("${examination.quantD}")
  25. private Integer quantD;
  26. @Resource
  27. private SettingService settingService;
  28. @Resource
  29. private RankService rankService;
  30. /**
  31. * 根据练习时间设置计算考题考试时间
  32. * setting: {struct: {difficult: ""}}
  33. * @param relationList
  34. * @return
  35. */
  36. public Integer computerTime(QuestionNoRelation[] relationList){
  37. Setting setting = settingService.getByKey(SettingKey.EXERCISE_TIME);
  38. JSONObject value = setting.getValue();
  39. Integer time = 0;
  40. for(QuestionNoRelation relation:relationList){
  41. JSONObject difficultMap = null;
  42. for (Integer struct : relation.getModuleStruct()){
  43. // 判断结构体
  44. difficultMap = value.getJSONObject(String.valueOf(struct));
  45. if (difficultMap != null) break;
  46. }
  47. if (difficultMap == null) continue;
  48. // 判断难度
  49. String t = difficultMap.getString(relation.getQuestion().getDifficult());
  50. if (t == null || t.isEmpty()) continue;
  51. time += Integer.valueOf(t);
  52. }
  53. return time;
  54. }
  55. /**
  56. * 根据练习时间设置获取单个考题时间
  57. * setting: {struct: {difficult: ""}}
  58. * @param relation
  59. * @return
  60. */
  61. public Integer computerTime(QuestionNoRelation relation){
  62. Setting setting = settingService.getByKey(SettingKey.EXERCISE_TIME);
  63. JSONObject value = setting.getValue();
  64. JSONObject difficultMap = null;
  65. for (Integer struct : relation.getModuleStruct()){
  66. // 判断结构体
  67. difficultMap = value.getJSONObject(String.valueOf(struct));
  68. if (difficultMap != null) break;
  69. }
  70. if (difficultMap == null) return 0;
  71. // 判断难度
  72. String t = difficultMap.getString(relation.getQuestion().getDifficult());
  73. if (t == null || t.isEmpty()) return 0;
  74. return Integer.valueOf(t);
  75. }
  76. /**
  77. * 根据练习时间设置获取单个考题时间
  78. * setting: {struct: {difficult: ""}}
  79. * @param relation
  80. * @return
  81. */
  82. public Integer computerTime(TextbookQuestionRelation relation){
  83. Setting setting = settingService.getByKey(SettingKey.TEXTBOOK_TIME);
  84. JSONObject value = setting.getValue();
  85. String t = value.getString("time");
  86. if (t == null || t.isEmpty()) return 0;
  87. return Integer.valueOf(t);
  88. }
  89. /**
  90. * 根据练习时间设置计算考题考试时间
  91. * setting: {struct: {difficult: ""}}
  92. * @param relationList
  93. * @return
  94. */
  95. public Integer computerTime(TextbookQuestionRelation[] relationList){
  96. Setting setting = settingService.getByKey(SettingKey.TEXTBOOK_TIME);
  97. JSONObject value = setting.getValue();
  98. String t = value.getString("time");
  99. if (t == null || t.isEmpty()) return 0;
  100. return Integer.valueOf(t) * relationList.length;
  101. }
  102. /**
  103. * 根据长难句时间设置获取单个考题时间
  104. * setting: {time: ""}
  105. * @param relation
  106. * @return
  107. */
  108. public Integer computerTime(SentenceQuestionRelation relation){
  109. // todo 按人工还是手动
  110. Setting setting = settingService.getByKey(SettingKey.SENTENCE_TIME);
  111. JSONObject value = setting.getValue();
  112. String t = value.getString("time");
  113. if (t == null || t.isEmpty()) return 0;
  114. return Integer.valueOf(t);
  115. }
  116. /**
  117. * 根据长难句时间设置获取考题考试时间
  118. * setting: {time: ""}
  119. * @param relationList
  120. * @return
  121. */
  122. public Integer computerTime(SentenceQuestionRelation[] relationList){
  123. // todo 按人工还是手动
  124. Setting setting = settingService.getByKey(SettingKey.SENTENCE_TIME);
  125. JSONObject value = setting.getValue();
  126. String t = value.getString("time");
  127. if (t == null || t.isEmpty()) return 0;
  128. return Integer.valueOf(t) * relationList.length;
  129. }
  130. /**
  131. * 根据后台设置剔除时间,判断试题统计情况
  132. * @param question
  133. * @return
  134. */
  135. public boolean filterTime(UserQuestion question){
  136. Setting setting = settingService.getByKey(SettingKey.FILTER_TIME);
  137. JSONObject value = setting.getValue();
  138. if (value.getInteger("min")> question.getTime()) return false;
  139. if (value.getInteger("max") < question.getTime()) return false;
  140. return true;
  141. }
  142. /**
  143. * 根据考试设置,得到做题时间,做题数量
  144. * setting: {subject: { time: "", number: "" }}
  145. * @param order
  146. */
  147. public void examinationReportInit(UserReport userReport, JSONArray order){
  148. Setting setting = settingService.getByKey(SettingKey.EXAMINATION_TIME);
  149. JSONObject value = setting.getValue();
  150. Integer number = 0;
  151. Integer time = 0;
  152. for(String subject : order.toJavaList(String.class)){
  153. JSONObject one = value.getJSONObject(subject);
  154. if(one!= null && !one.isEmpty()){
  155. number += one.getInteger("number");
  156. time += one.getInteger("time");
  157. }
  158. }
  159. userReport.setQuestionNumber(number);
  160. userReport.setTime(time);
  161. }
  162. /**
  163. * 获取模考学科数据:
  164. * { time: '', number: '' }
  165. * @param subject
  166. * @return
  167. */
  168. public JSONObject examinationSubjectInit(QuestionSubject subject){
  169. Setting setting = settingService.getByKey(SettingKey.EXAMINATION_TIME);
  170. JSONObject value = setting.getValue();
  171. return value.getJSONObject(subject.key);
  172. }
  173. /**
  174. * Quant分数计算:系数c * Quant部分平均正确率 + 系数d * Quant部分题目平均难度
  175. * @param number
  176. * @param userNumber
  177. * @param difficultScore
  178. * @param correctNumber
  179. * @return
  180. */
  181. public Integer quantScore(Integer number, Integer userNumber, Integer difficultScore, Integer correctNumber){
  182. return quantC * correctNumber / number + quantD * difficultScore / userNumber;
  183. }
  184. /**
  185. * Verbal分数计算:系数a * Verbal部分题目平均正确率 + 系数b * Verbal部分题目平均难度
  186. * @param number
  187. * @param userNumber
  188. * @param difficultScore
  189. * @param correctNumber
  190. * @return
  191. */
  192. public Integer verbalScore(Integer number, Integer userNumber, Integer difficultScore, Integer correctNumber){
  193. return verbalA * correctNumber / number + verbalB * difficultScore / userNumber;
  194. }
  195. /**
  196. * IR分数计算:最高8分
  197. * @param number
  198. * @param userNumber
  199. * @param difficultScore
  200. * @param correctNumber
  201. * @return
  202. */
  203. public int irScore(Integer number, Integer userNumber, Integer difficultScore, Integer correctNumber){
  204. switch(correctNumber){
  205. case 0:
  206. case 1:
  207. return 1;
  208. case 2:
  209. return 2;
  210. case 3:
  211. case 4:
  212. return 3;
  213. case 5:
  214. return 4;
  215. case 6:
  216. return 5;
  217. case 7:
  218. return 6;
  219. case 8:
  220. return 7;
  221. case 9:
  222. default:
  223. return 8;
  224. }
  225. }
  226. /**
  227. * avg diff correct=[(550*0.3+550*0.5+550*0.4)+(650*0.6+650*0.8)+(750*0.9)]➗(3+2+1)
  228. * @param totalNumber
  229. * @param totalCorrect
  230. * @param difficultScore
  231. * @return
  232. */
  233. public float diffScore(Integer totalNumber, Integer totalCorrect, Integer difficultScore){
  234. Setting setting = settingService.getByKey(SettingKey.EXAMINATION_SCORE);
  235. JSONObject value = setting.getValue();
  236. if (value.getBooleanValue("difficult")){
  237. return difficultScore * (1- (float)totalCorrect / totalNumber);
  238. }else{
  239. return difficultScore;
  240. }
  241. }
  242. /**
  243. * 当这个结果低于500的时候统一显示为500,
  244. * 高于500时,是多少就显示多少,且必须为10的倍数,722=720,754=750,756=760
  245. * @param totalDiffScore
  246. * @param number
  247. * @return
  248. */
  249. public int avgDiffScore(float totalDiffScore, Integer number){
  250. int avg = (int)(totalDiffScore / number);
  251. if (avg < 500){
  252. return 500;
  253. }
  254. return (int) (Math.floor((int)(avg / 10)) * 10);
  255. }
  256. /**
  257. * 得出V小分和Q小分后根据总分-小分excel对应表(我方提供)算出最后考试的总分
  258. * @param quantScore
  259. * @param verbalScore
  260. * @return
  261. */
  262. public Rank totalScore(Integer quantScore, Integer verbalScore){
  263. Rank rank = rankService.search(quantScore, verbalScore);
  264. return rank != null ? rank : new Rank();
  265. }
  266. }