ExamSpecialStudentCenterService.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. using NPOI.SS.UserModel;
  2. using NPOI.XSSF.UserModel;
  3. using YBEE.EQM.Core;
  4. namespace YBEE.EQM.Application;
  5. /// <summary>
  6. /// 特殊学生管理服务(用于中心管理)
  7. /// </summary>
  8. public class ExamSpecialStudentCenterService(
  9. IRepository<ExamSpecialStudent> rep,
  10. IExamPlanService examPlanService,
  11. IExportExcelService exportExcelService
  12. ) : IExamSpecialStudentCenterService, ITransient
  13. {
  14. /// <summary>
  15. /// 分页查询列表
  16. /// </summary>
  17. /// <param name="input"></param>
  18. /// <returns></returns>
  19. public async Task<PageResult<ExamSpecialStudentFullOutput>> QueryPageList(ExamSpecialStudentPageInput input)
  20. {
  21. var query = GetQueryBase(input);
  22. var ret = await query.OrderBy(t => t.SysOrgId).ThenBy(t => t.GradeId).ThenBy(t => t.ClassNumber).ThenBy(t => t.Id)
  23. .ProjectToType<ExamSpecialStudentFullOutput>()
  24. .ToADPagedListAsync(input.PageIndex, input.PageSize);
  25. return ret;
  26. }
  27. /// <summary>
  28. /// 获取状态数量
  29. /// </summary>
  30. /// <returns></returns>
  31. public async Task<List<StatusCount>> QueryStatusCount(ExamSpecialStudentPageInput input)
  32. {
  33. var query = GetQueryBase(input);
  34. if (query == null)
  35. {
  36. return [];
  37. }
  38. var counts = await query.GroupBy(t => t.Status).Select(t => new StatusCount { Status = (int)t.Key, Count = t.Count() }).ToListAsync();
  39. return counts;
  40. }
  41. /// <summary>
  42. /// 导出数据表格(简表)
  43. /// </summary>
  44. /// <param name="input"></param>
  45. /// <returns></returns>
  46. public async Task<(string fileName, byte[] fileBytes)> ExportSimple(ExamSpecialStudentPageInput input)
  47. {
  48. var examPlan = await examPlanService.GetById(input.ExamPlanId);
  49. var query = GetQueryBase(input);
  50. var items = await query.OrderBy(t => t.SysOrgId).ThenBy(t => t.GradeId).ThenBy(t => t.ClassNumber).ThenBy(t => t.Id)
  51. .ProjectToType<ExamSpecialStudentFullOutput>()
  52. .ToListAsync();
  53. XSSFWorkbook wb = new();
  54. ISheet sheet = wb.CreateSheet("特殊学生名单");
  55. sheet.DisplayGridlines = false;
  56. var cellStyle = exportExcelService.GetCellStyle(wb);
  57. // 行索引号
  58. int rowNum = 0;
  59. #region 列头
  60. IRow headerRow = sheet.CreateRow(rowNum++);
  61. int ci = 0;
  62. exportExcelService.AddCell("学校", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 20);
  63. exportExcelService.AddCell("年级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 8);
  64. exportExcelService.AddCell("班级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 8);
  65. exportExcelService.AddCell("姓名", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 12);
  66. exportExcelService.AddCell("证件类型", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 12);
  67. exportExcelService.AddCell("证件号码", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 18);
  68. exportExcelService.AddCell("状态", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 8);
  69. exportExcelService.AddCell("往期认定", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  70. exportExcelService.AddCell("前测科数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  71. exportExcelService.AddCell("前测成绩", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  72. sheet.CreateFreezePane(0, rowNum);
  73. #endregion
  74. #region 数据
  75. foreach (var item in items)
  76. {
  77. IRow row = sheet.CreateRow(rowNum++);
  78. int rci = 0;
  79. exportExcelService.AddCell(item.SysOrg.Name, row, rci++, cellStyle.LeftCellStyle);
  80. exportExcelService.AddCell(item.ExamGrade.Grade.Name, row, rci++, cellStyle.CenterCellStyle);
  81. exportExcelService.AddCell(item.ClassNumber, row, rci++, cellStyle.CenterCellStyle);
  82. exportExcelService.AddCell(item.Name, row, rci++, cellStyle.CenterCellStyle);
  83. exportExcelService.AddCell(item.CertificateType.GetDescription(), row, rci++, cellStyle.CenterCellStyle);
  84. exportExcelService.AddCell(item.IdNumber, row, rci++, cellStyle.CenterCellStyle);
  85. exportExcelService.AddCell(item.Status.GetDescription(), row, rci++, cellStyle.CenterCellStyle);
  86. exportExcelService.AddCell(item.IsPreIdentified ? "是" : "否", row, rci++, cellStyle.CenterCellStyle);
  87. exportExcelService.AddCell(item.PreTotalCourse, row, rci++, cellStyle.CenterCellStyle);
  88. exportExcelService.AddCell(item.PreTotalScore, row, rci++, cellStyle.CenterCellStyle);
  89. }
  90. #endregion
  91. MemoryStream ms = new();
  92. wb.Write(ms, false);
  93. ms.Flush();
  94. return ($"{examPlan.Name}-特殊学生名单.xlsx", ms.ToArray());
  95. }
  96. /// <summary>
  97. /// 导出数据表格(完整)
  98. /// </summary>
  99. /// <param name="input"></param>
  100. /// <returns></returns>
  101. public async Task<(string fileName, byte[] fileBytes)> ExportFull(ExamSpecialStudentPageInput input)
  102. {
  103. var examPlan = await examPlanService.GetById(input.ExamPlanId);
  104. var query = GetQueryBase(input);
  105. var items = await query.OrderBy(t => t.SysOrgId).ThenBy(t => t.GradeId).ThenBy(t => t.ClassNumber).ThenBy(t => t.Id)
  106. .ProjectToType<ExamSpecialStudentFullOutput>()
  107. .ToListAsync();
  108. XSSFWorkbook wb = new();
  109. ISheet sheet = wb.CreateSheet("特殊学生名单");
  110. sheet.DisplayGridlines = false;
  111. var cellStyle = exportExcelService.GetCellStyle(wb);
  112. // 行索引号
  113. int rowNum = 0;
  114. #region 列头
  115. IRow headerRow = sheet.CreateRow(rowNum++);
  116. int ci = 0;
  117. exportExcelService.AddCell("学校", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 20);
  118. exportExcelService.AddCell("年级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 8);
  119. exportExcelService.AddCell("班级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 8);
  120. exportExcelService.AddCell("姓名", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 12);
  121. exportExcelService.AddCell("证件类型", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 12);
  122. exportExcelService.AddCell("证件号码", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 18);
  123. exportExcelService.AddCell("状态", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 8);
  124. exportExcelService.AddCell("往期认定", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  125. exportExcelService.AddCell("前测科数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  126. exportExcelService.AddCell("前测成绩", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  127. exportExcelService.AddCell("特殊原因", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 40);
  128. exportExcelService.AddCell("家长电话", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 16);
  129. exportExcelService.AddCell("备注", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 40);
  130. sheet.CreateFreezePane(0, rowNum);
  131. #endregion
  132. #region 数据
  133. foreach (var item in items)
  134. {
  135. IRow row = sheet.CreateRow(rowNum++);
  136. int rci = 0;
  137. exportExcelService.AddCell(item.SysOrg.Name, row, rci++, cellStyle.LeftCellStyle);
  138. exportExcelService.AddCell(item.ExamGrade.Grade.Name, row, rci++, cellStyle.CenterCellStyle);
  139. exportExcelService.AddCell(item.ClassNumber, row, rci++, cellStyle.CenterCellStyle);
  140. exportExcelService.AddCell(item.Name, row, rci++, cellStyle.CenterCellStyle);
  141. exportExcelService.AddCell(item.CertificateType.GetDescription(), row, rci++, cellStyle.CenterCellStyle);
  142. exportExcelService.AddCell(item.IdNumber, row, rci++, cellStyle.CenterCellStyle);
  143. exportExcelService.AddCell(item.Status.GetDescription(), row, rci++, cellStyle.CenterCellStyle);
  144. exportExcelService.AddCell(item.IsPreIdentified ? "是" : "否", row, rci++, cellStyle.CenterCellStyle);
  145. exportExcelService.AddCell(item.PreTotalCourse, row, rci++, cellStyle.CenterCellStyle);
  146. exportExcelService.AddCell(item.PreTotalScore, row, rci++, cellStyle.CenterCellStyle);
  147. exportExcelService.AddCell(item.ApplyReason, row, rci++, cellStyle.LeftWrapCellStyle);
  148. exportExcelService.AddCell(item.PatriarchTel, row, rci++, cellStyle.CenterCellStyle);
  149. exportExcelService.AddCell(item.Remark, row, rci++, cellStyle.LeftWrapCellStyle);
  150. }
  151. #endregion
  152. MemoryStream ms = new();
  153. wb.Write(ms, false);
  154. ms.Flush();
  155. return ($"{examPlan.Name}-特殊学生名单.xlsx", ms.ToArray());
  156. }
  157. #region 私有方法
  158. /// <summary>
  159. /// 构建查询
  160. /// </summary>
  161. /// <param name="input"></param>
  162. /// <returns></returns>
  163. private IQueryable<ExamSpecialStudent> GetQueryBase(ExamSpecialStudentPageInput input)
  164. {
  165. var name = !string.IsNullOrEmpty(input.Name?.Trim());
  166. var idNumber = !string.IsNullOrEmpty(input.IdNumber?.Trim());
  167. var applyReason = !string.IsNullOrEmpty(input.ApplyReason?.Trim());
  168. var patriarchTel = !string.IsNullOrEmpty(input.PatriarchTel?.Trim());
  169. var studentNumber = !string.IsNullOrEmpty(input.StudentNumber?.Trim());
  170. var query = rep.DetachedEntities.Where(t => t.ExamPlanId == input.ExamPlanId)
  171. .Where((name, u => EF.Functions.Like(u.Name, $"%{input.Name.Trim()}%")))
  172. .Where((idNumber, u => EF.Functions.Like(u.IdNumber, $"%{input.IdNumber.Trim()}%")))
  173. .Where((studentNumber, u => EF.Functions.Like(u.StudentNumber, $"%{input.StudentNumber.Trim()}%")))
  174. .Where((applyReason, u => EF.Functions.Like(u.ApplyReason, $"%{input.ApplyReason.Trim()}%")))
  175. .Where((patriarchTel, u => EF.Functions.Like(u.PatriarchTel, $"%{input.PatriarchTel.Trim()}%")))
  176. .Where(input.Status.HasValue, t => t.Status == input.Status)
  177. .Where(input.CertificateType.HasValue, t => t.CertificateType == input.CertificateType)
  178. .Where(input.Gender.HasValue, t => t.Gender == input.Gender)
  179. .Where(input.GradeId.HasValue, t => t.GradeId == input.GradeId)
  180. .Where(input.ClassNumber.HasValue, t => t.ClassNumber == input.ClassNumber)
  181. .Where(input.SysOrgId.HasValue, t => t.SysOrgId == input.SysOrgId)
  182. .Where(input.SysOrgBranchId.HasValue, t => t.SchoolClass.SysOrgBranchId == input.SysOrgBranchId);
  183. return query;
  184. }
  185. #endregion
  186. }