FacultyEstimate.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using System;
  2. using System.Collections.Generic;
  3. namespace mxdemo.Mind
  4. {
  5. #region model
  6. public class FacultyForm
  7. {
  8. public int subjectId; // 这个想想「班会、体育、自习」怎么处理?
  9. public string subjectName; // 名称
  10. public bool isFixed; // 固定师资,用以区分6门合格考与等级考学科,非固定科目需要填写合格考与等级考
  11. public bool isOffical; // 正式科目,9科为正式科目,非正式科目提供的校验不一样
  12. public int classesCountPrev; // 周课时数-分班前-仅参考用
  13. public int teacherCount; // 单科老师数量
  14. public int teacherClassesCount; // 单科老师周课时数
  15. public int classesCount; // 单科总课时数,前端会提供辅助计算
  16. public int levelClassesCount; // 等级考课时数-分班后
  17. public int qualifiedClassesCount; // 合格考课时数-分班后
  18. }
  19. public class FacultyResult : FacultyForm
  20. {
  21. public int levelClassCount; // 等级考班级数
  22. public int qualifiedClassCount; // 合格考班级数
  23. public int requiredClassesCount; // 所需课时
  24. public int actualClassesCount; // 实际课时
  25. public int missingClassesCount; // 缺少课时,正数表示缺的,负数表示超的
  26. public int missingTeacherCount; // 缺少老师,正负同上
  27. }
  28. public class GroupSetting
  29. {
  30. // 略,延用之前的结构内容
  31. }
  32. public class GroupModel
  33. {
  34. // 后台自己设置标识,前端会原样返回,前端展示与操作只会用到索引
  35. public string groupIds;
  36. public List<GroupSetting> roundGroups;
  37. public List<FacultyResult> faculties;
  38. }
  39. public class ScoreImportConfig // 需要调整结构
  40. {
  41. #region 不变部分
  42. // {
  43. //"params": {},
  44. //"roundId": 14,
  45. //"schoolId": 31,
  46. //"year": 2021,
  47. //"name": "第1次选科",
  48. //"beginTime": "2022-03-05",
  49. //"endTime": "2022-03-20",
  50. //"state": "1",
  51. //"importWeight":[]
  52. #endregion
  53. #region 变更部分
  54. // 新增模型列表
  55. public List<GroupModel> groupModels;
  56. // 选择其中1个模型
  57. public int activeGroupModelIndex; // 构想的是传索引,因为前端会做删除等调整,而且新建时也可能同时创建多个引用,此时无ID能够做出区分
  58. // 选志愿的数量,默认为1
  59. public int preferenceCount = 1;
  60. #endregion
  61. #region 新增控制配置
  62. public bool rankInvisible; // 排名不可见,默认false: 排名可见
  63. public bool scoreInvisible; // 分数不可见,默认false: 分数可见
  64. public bool enableEsign; // 开启电子签名,默认false: 不需要
  65. public bool enablePaperSign; // 开启电子签名的情况下,是否需要纸质签名(促进学生使用班牌),默认false: 不需要
  66. #endregion
  67. }
  68. #endregion
  69. public interface ISelectedScoreImport
  70. {
  71. // ScoreImportConfig的结构有变化见上面region
  72. ScoreImportConfig getScoreImportConfig(int roundId);
  73. /// <summary>
  74. /// 生成空的师资表格,在校长全部重新填写的时候调用。如果是从已完成的模型复制,则不会调用,前端会自行处理
  75. /// </summary>
  76. /// <returns></returns>
  77. List<FacultyResult> generateFaculties();
  78. // 计算师资匹配结果
  79. // 构想:全量传数据,但后台只挑需要的groupModels[targetIndex]进行计算,计算完毕标记为completed=true
  80. // 计算结束,需要标记出groupModels中,completed=true的模型,最优解为isBest=true
  81. // 最优解:faculties.sum(f => Math.Abs(f.missingTeacherCount)) 总和最小的GroupModel为最优
  82. ScoreImportConfig calculateFaculty(ScoreImportConfig round, int groupModelIndex);
  83. void saveScoreImportConfig({ round: ScoreImportConfig }); // config结构变了,保存也要注意
  84. void queryScoreImportDetails({ round: ScoreImportConfig, groupModelIndex: int }); // config结构变了,查询时要指定哪个模型
  85. }
  86. }