AchievementService.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. using HTEXLib.COMM.Helpers;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using TEAMModelOS.SDK;
  6. using TEAMModelOS.SDK.Models;
  7. namespace TEAMModelOS.Services.Analysis
  8. {
  9. public static class AchievementService
  10. {
  11. //处理各个班级均分分析
  12. public static Dictionary<string, object> GetAverage(List<ExamResultDto> exams, List<string> gav, List<string> cav, List<List<double>> subSum, List<OldStudent> students)
  13. {
  14. Dictionary<string, object> Average = new Dictionary<string, object>();
  15. List<List<string>> classAverage = new List<List<string>>();
  16. HashSet<string> classList = new HashSet<string>();
  17. List<string> keys = new List<string>();
  18. if (exams.IsNotEmpty())
  19. {
  20. keys.Add("setNo");
  21. keys.Add("name");
  22. keys.Add("score");
  23. keys.Add("classAverage");
  24. keys.Add("gradeAverage");
  25. int j = 0;
  26. exams[0].classes.ForEach(c =>
  27. {
  28. //c.Keys遍历key值
  29. foreach (string key in c.Keys)
  30. {
  31. classList.Add(key);
  32. }
  33. int k = 0;
  34. //每个班级平均分
  35. foreach (int[] value in c.Values)
  36. {
  37. for (int i = value[0]; i <= value[1]; i++)
  38. {
  39. List<string> stuPoint = new List<string>();
  40. keys.ForEach(x =>
  41. {
  42. stuPoint.Add("-");
  43. });
  44. stuPoint[0] = (i + 1).ToString();
  45. foreach (OldStudent ss in students)
  46. {
  47. if (exams[0].ids[i].Equals(ss.studentId))
  48. {
  49. stuPoint[1] = ss.name;
  50. break;
  51. }
  52. }
  53. stuPoint[2] = subSum[j][k].ToString() ;
  54. stuPoint[3] = cav[j];
  55. stuPoint[4] = gav[0];
  56. classAverage.Add(stuPoint);
  57. k++;
  58. }
  59. j++;
  60. }
  61. });
  62. Average.Add("keys",keys);
  63. Average.Add("datas", classAverage);
  64. }
  65. return Average;
  66. }
  67. public static List<Dictionary<string, object>> GetPR(List<ExamResultDto> exams, List<List<double>> subSum,List<OldStudent> students)
  68. {
  69. // 计算公式 PR=100- (100*R-50)/N
  70. List<Dictionary<string, object>> subPR = new List<Dictionary<string, object>>();
  71. List<Dictionary<string, object>> datas = new List<Dictionary<string, object>>();
  72. HashSet<string> classList = new HashSet<string>();
  73. List<string> keys = new List<string>();
  74. List<string> className = new List<string>();
  75. if (exams.IsNotEmpty()) {
  76. keys.Add("name");
  77. keys.Add("setNo");
  78. keys.Add("score");
  79. keys.Add("classRank");
  80. keys.Add("classPR");
  81. keys.Add("gradeRank");
  82. keys.Add("gradePR");
  83. keys.Add("areaRank");
  84. keys.Add("areaPR");
  85. //keys.Add("classAverage");
  86. //keys.Add("gradeAverage");
  87. exams.ForEach(e =>
  88. {
  89. Dictionary<string, object> PR = new Dictionary<string, object>
  90. {
  91. { "name", e.subjectCode }
  92. };
  93. List<string> stuPRG = new List<string>();
  94. List<string> ClassAverage = new List<string>();
  95. List<List<List<string>>> classPR = new List<List<List<string>>>();
  96. //初始化科目总分
  97. double subjectPoint = 0;
  98. //科目平均分
  99. double subAverage = 0;
  100. e.classes.ForEach(c =>
  101. {
  102. List<List<string>> classPRL = new List<List<string>>();
  103. //c.Keys遍历key值
  104. List<string> stuPR = new List<string>();
  105. //初始化各班参考人数
  106. int counts = 0;
  107. //初始化班级缺考人数
  108. int classCount = 0;
  109. //初始化班级平均分
  110. double points = 0;
  111. //初始化班级总分
  112. double classPoint = 0;
  113. foreach (string key in c.Keys)
  114. {
  115. classList.Add(key);
  116. }
  117. //每个班级平均分
  118. foreach (int[] value in c.Values)
  119. {
  120. int seatNo = 1;
  121. for (int i = value[0]; i <= value[1]; i++)
  122. {
  123. List<string> SPR = new List<string>();
  124. keys.ForEach(x =>
  125. {
  126. SPR.Add("-");
  127. });
  128. if (e.result[i].Sum() == 0)
  129. {
  130. classCount++;
  131. seatNo++;
  132. continue;
  133. }
  134. stuPR.Add(e.result[i].Sum().ToString());
  135. stuPRG.Add(e.result[i].Sum().ToString());
  136. SPR[1] = seatNo.ToString() ;
  137. SPR[2] = e.result[i].Sum().ToString();
  138. SPR[0] = e.ids[i];
  139. classPRL.Add(SPR);
  140. //计算班级PR值
  141. //int classPR = 100 - (100*)
  142. classPoint += e.result[i].Sum();
  143. seatNo++;
  144. }
  145. counts = value[1] - value[0] - classCount + 1;
  146. points = Convert.ToDouble(classPoint) / counts;
  147. ClassAverage.Add(points.ToString("0.00"));
  148. }
  149. //foreach (List<string> pl in classPRL) {
  150. //单科计算班级排名
  151. stuPR.Sort(delegate (string s1, string s2) { return double.Parse(s2).CompareTo(double.Parse(s1)); });
  152. foreach (List<string> pl in classPRL) {
  153. int index = stuPR.IndexOf(pl[2]);
  154. //int gradeIndex = stuPRG.IndexOf(pl[2]);
  155. pl[3] = (index + 1).ToString();
  156. int CPR = 100 - (100 * int.Parse(pl[3]) - 50) / stuPR.Count;
  157. pl[4] = CPR.ToString();
  158. //pl.Add(index.ToString());
  159. foreach (OldStudent ss in students)
  160. {
  161. if (pl[0].Equals(ss.studentId))
  162. {
  163. pl[0] = ss.name;
  164. break;
  165. }
  166. }
  167. }
  168. //}
  169. classPR.Add(classPRL);
  170. });
  171. //科目平均分
  172. ClassAverage.ForEach(a =>
  173. {
  174. subjectPoint += Convert.ToDouble(a);
  175. });
  176. subAverage = subjectPoint / ClassAverage.Count();
  177. className = new List<string>();
  178. foreach (string cla in classList)
  179. {
  180. className.Add(cla);
  181. }
  182. //单科计算年级排名
  183. stuPRG.Sort(delegate (string s1, string s2) { return double.Parse(s2).CompareTo(double.Parse(s1)); });
  184. foreach (List<List<string>> p2 in classPR) {
  185. foreach (List<string> p3 in p2) {
  186. int index = stuPRG.IndexOf(p3[2]);
  187. p3[5] = (index + 1).ToString();
  188. int GPR = 100 - (100 * int.Parse(p3[5]) - 50) / stuPRG.Count;
  189. p3[6] = GPR.ToString();
  190. }
  191. }
  192. Dictionary<string, object> data = new Dictionary<string, object>();
  193. Dictionary<string, object> classData = new Dictionary<string, object>();
  194. for (int i =0;i< classPR.Count;i++) {
  195. data.Add(className[i], classPR[i]);
  196. classData.Add(className[i], ClassAverage[i]);
  197. //data.Add(i.ToString(), ClassAverage[i]);
  198. }
  199. PR.Add("keys", keys);
  200. PR.Add("datas", data);
  201. PR.Add("classAverage", classData);
  202. PR.Add("gradeAverage", subAverage.ToString("0.00"));
  203. PR.Add("areaAverage", subAverage.ToString("0.00"));
  204. subPR.Add(PR);
  205. });
  206. //处理全科PR值计算
  207. List<string> stuIds = exams[0].ids;
  208. /*for (int k=0;k< stuIds.Count;k++) {
  209. if (stuIds[k].Equals("0")) {
  210. stuIds.Remove(stuIds[k]);
  211. }
  212. }*/
  213. Dictionary<string, object> dataAll = new Dictionary<string, object>();
  214. dataAll.Add("name", "Total");
  215. dataAll.Add("keys",keys);
  216. List<double> stuAll = new List<double>();
  217. List<double> sortGradePoint = new List<double>();
  218. Dictionary<string, object> classInfo = new Dictionary<string, object>();
  219. List<List<List<string>>> GradePR = new List<List<List<string>>>();
  220. int m = 0;
  221. int p = 0;
  222. List<string> allClassAverages = new List<string>();
  223. Dictionary<string, object> classAllData = new Dictionary<string, object>();
  224. foreach (List<double> classPoint in subSum)
  225. {
  226. List<double> sortClassPoint = new List<double>();
  227. int n = 1;
  228. //初始化缺考人数
  229. int people = 0;
  230. double sumTotle = 0;
  231. List<List<string>> classStuInfo = new List<List<string>>();
  232. for (int i = 0;i < classPoint.Count();i++) {
  233. List<string> stu = new List<string>();
  234. keys.ForEach(x =>
  235. {
  236. stu.Add("-");
  237. });
  238. if (stuIds[m] .Equals("0"))
  239. {
  240. people++;
  241. n++;
  242. m++;
  243. continue;
  244. }
  245. stu[0] = stuIds[m];
  246. stu[1] = n.ToString();
  247. stu[2] = classPoint[i].ToString();
  248. sortClassPoint.Add(classPoint[i]);
  249. stuAll.Add(classPoint[i]);
  250. sortGradePoint.Add(classPoint[i]);
  251. sumTotle += classPoint[i];
  252. n++;
  253. m++;
  254. classStuInfo.Add(stu);
  255. }
  256. double allClassAverage = sumTotle / (classPoint.Count - people);
  257. classAllData.Add(className[p], allClassAverage.ToString("0.00"));
  258. //allClassAverages.Add(allClassAverage.ToString("0.00"));
  259. GradePR.Add(classStuInfo);
  260. sortClassPoint.Sort(delegate (double s1, double s2) { return s2.CompareTo(s1); });
  261. foreach (List<string> stuIn in classStuInfo) {
  262. int index = sortClassPoint.IndexOf(double.Parse(stuIn[2]));
  263. stuIn[3] = (index + 1).ToString();
  264. int CPR = 100 - (100 * (index + 1) - 50) / sortClassPoint.Count;
  265. stuIn[4] = CPR.ToString();
  266. foreach (OldStudent ss in students)
  267. {
  268. if (stuIn[0].Equals(ss.studentId))
  269. {
  270. stuIn[0] = ss.name;
  271. break;
  272. }
  273. }
  274. }
  275. p++;
  276. }
  277. sortGradePoint.Sort(delegate (double s1, double s2) { return s2.CompareTo(s1); });
  278. double allGradeAverage = sortGradePoint.Sum() / sortGradePoint.Count();
  279. foreach (List<List<string>> gradeInfo in GradePR)
  280. {
  281. foreach (List<string> info in gradeInfo)
  282. {
  283. int index = sortGradePoint.IndexOf(double.Parse(info[2]));
  284. info[5] = (index + 1).ToString();
  285. int GPR = 100 - (100 * int.Parse(info[5]) - 50) / sortGradePoint.Count;
  286. info[6] = GPR.ToString();
  287. }
  288. }
  289. Dictionary<string, object> classDataAll = new Dictionary<string, object>();
  290. for (int i = 0; i < GradePR.Count; i++)
  291. {
  292. classDataAll.Add(className[i], GradePR[i]);
  293. }
  294. dataAll.Add("datas", classDataAll);
  295. dataAll.Add("classAverage", classAllData);
  296. dataAll.Add("gradeAverage", allGradeAverage.ToString("0.00"));
  297. dataAll.Add("areaAverage", allGradeAverage.ToString("0.00"));
  298. subPR.Add(dataAll);
  299. }
  300. return subPR;
  301. }
  302. public static List<List<string>> ReName(List<List<string>> datas, List<string> ids, List<Dictionary<string, int[]>> classToName, List<OldStudent> students)
  303. {
  304. foreach (List<string> tableName in datas)
  305. {
  306. int index = ids.IndexOf(tableName[0]);
  307. if (index == -1)
  308. {
  309. continue;
  310. }
  311. foreach (Dictionary<string, int[]> classKey in classToName)
  312. {
  313. bool flag = false;
  314. foreach (KeyValuePair<string, int[]> kvp in classKey)
  315. {
  316. if (kvp.Value[1] >= index && index >= kvp.Value[0])
  317. {
  318. tableName[1] = kvp.Key;
  319. flag = true;
  320. break;
  321. }
  322. }
  323. if (flag)
  324. {
  325. break;
  326. }
  327. }
  328. foreach (OldStudent ss in students)
  329. {
  330. if (tableName[0].Equals(ss.studentId))
  331. {
  332. tableName[0] = ss.name;
  333. break;
  334. }
  335. }
  336. }
  337. return datas;
  338. }
  339. }
  340. }