AchievementService.cs 16 KB

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