StudentClassDispatch.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using System;
  2. using System.Collections.Generic;
  3. namespace mxdemo.Mind
  4. {
  5. public interface IStudentClassDispatchService
  6. {
  7. // 1 班级设置 参考校长的class-manage页面
  8. // a 从年级树缓存中查找当前选科学年对应的班级进行选择
  9. // b 允许用户输入不存在的班级,输入完毕后确认是否创建新班级
  10. // 附:(创建后务必刷新缓存)(暂不考虑批量创建班级)(创建接口参考class-manage页面)
  11. // 2 应用班级设置 设置人数及分配模式,得到初步分派的结果
  12. // 3 手工微调 将查询组件化,允许加入多个对比查询,作选中操作,执行转移/或者交换操作
  13. #region model
  14. /// <summary>
  15. /// 选科轮次,仅显示分班关键字段,后续可能还会加选科流程的其它字段
  16. /// </summary>
  17. public class Round
  18. {
  19. // 本身的字段
  20. int roundId; // 选科轮次ID
  21. string groupIds; // 开放组合
  22. object[] roundGroups; // 这里包含各组合以及班级数设置
  23. // ...
  24. // 流程控制字段
  25. bool allowDispatch; // 标记当前是否可以进行分班逻辑
  26. Dictionary<int, int> enrollGroupCount; // 各组合录取人数,按组合汇总
  27. bool dispatchCompleted; // 所有学生已经分配完毕
  28. }
  29. /// <summary>
  30. /// 班级,仅显示分班关键字段
  31. /// </summary>
  32. public class Clazz
  33. {
  34. int classId;
  35. string name;
  36. }
  37. public class Student
  38. {
  39. int studentId;
  40. int sex;
  41. int rankInGroup; // 组合内排名
  42. }
  43. public class DispatchSetting
  44. {
  45. int roundId; // 轮次ID
  46. int groupId; // 组合ID
  47. int classId; // 班级
  48. int expectedCount; // 期望人数
  49. int? actualCount; // 实际人数,应用设置才产生数量
  50. int? actualCountInMale; // 实际男生,应用设置才产生数量
  51. int? actualCountInFemale; // 实际女生,应用设置才产生数量
  52. }
  53. public class DispatchResult
  54. {
  55. int roundId; // 轮次ID
  56. int groupId; // 组合ID
  57. int classId; // 班级
  58. Student[] students; // 分配的学生
  59. }
  60. public enum EnumDispatchMode
  61. {
  62. RankBalance, // 按成绩平均分配,默认按这种分配方式,可保证各个班成绩都差不多
  63. RankPriority, // 按成绩优先,会导致成绩好的集中到一起
  64. Random // 随机
  65. }
  66. /// <summary>
  67. /// 查询参数
  68. /// </summary>
  69. public class DispatchQuery
  70. {
  71. int roundId;
  72. int groupId;
  73. int classId;
  74. int? sex;
  75. }
  76. #endregion
  77. /// <summary>
  78. /// 按学年,次数查询
  79. /// ROUND: 如果allowDispatch=false,分班页仅只读不能操作
  80. /// </summary>
  81. /// <returns></returns>
  82. Round GetRoundStatus(int year, int round); // 类似/front/report/getStudentSelected
  83. /// <summary>
  84. /// 获取分班配置
  85. /// </summary>
  86. /// <param name="roundId"></param>
  87. /// <returns></returns>
  88. DispatchSetting[] GetDispatchSettings(int roundId);
  89. /// <summary>
  90. /// 保存配置
  91. /// </summary>
  92. /// <param name="settings"></param>
  93. void SaveDispatchSettings(DispatchSetting[] settings);
  94. /// <summary>
  95. /// 应用配置,分派学生,按组合执行
  96. /// </summary>
  97. /// <param name="roundId"></param>
  98. /// <param name="mode"></param>
  99. /// <returns></returns>
  100. DispatchResult ApplyDispatchSettings(int roundId, int groupId, EnumDispatchMode mode = EnumDispatchMode.RankBalance);
  101. /// <summary>
  102. /// 分派名单查询,不需要分页,按班展示,启动table排序功能
  103. /// </summary>
  104. /// <param name="roundId"></param>
  105. /// <param name="groupIds"></param>
  106. /// <returns></returns>
  107. DispatchResult GetDispatchResult(DispatchQuery query);
  108. /// <summary>
  109. /// 分派转移,用这个接口实现转移学生或者交换学生(手工操作),后台在操作成功后记得刷新setting中的3个人数汇总字段
  110. /// </summary>
  111. /// <param name="roundId"></param>
  112. /// <param name="students"></param>
  113. /// <param name="toClassId"></param>
  114. void ExchangeDispatch(int roundId, Student[] students, int toClassId);
  115. public class PublishSetting {
  116. int roundId; // 分班轮次
  117. string activeDate; // 生效日期
  118. }
  119. /// 获取当前学生分班或者班主任分班设置
  120. PublishSetting getDispatchSharedSetting(int roundId);
  121. /// <summary>
  122. /// 分配完毕后发布,锁定分班流程,与班主任分班共享设置时间
  123. /// </summary>
  124. /// <param name="roundId"></param>
  125. void PublishDispatch(PublishSetting setting);
  126. public class TeacherInfo {
  127. long userId; // 老师用户ID
  128. string nickName; // 老师称乎
  129. ... // 略
  130. }
  131. /// 获取班主任分班信息
  132. /// Map, key: classId, value: teacher-info
  133. Dictionary<long, TeacherInfo> GetHeadteacherDispatchSettings(int roundId);
  134. /// 保存班主任分班信息
  135. void SaveHeadteacherDispatchSetting(long classId, long userId);
  136. /// 维持所有原班级班主任
  137. void KeepCurrentHeadteachersAsDispatch(int roundId);
  138. /// 锁定班主任分班流程,与学生分班共享设置时间
  139. void PublishHeadteacherDispatch(PublishSetting setting)
  140. }
  141. }