using Org.BouncyCastle.Tls; using YBEE.EQM.Core; namespace YBEE.EQM.Application; /// /// 家长问卷填答进度管理服务 /// public class ExamPatriarchQuestionnaireProgressService : IExamPatriarchQuestionnaireProgressService, ITransient { private readonly IRepository _rep; private readonly IExportExcelService _exportExcelService; private readonly ISysDictDataService _sysDictDataService; public ExamPatriarchQuestionnaireProgressService(IRepository rep, IExportExcelService exportExcelService, ISysDictDataService sysDictDataService) { _rep = rep; _exportExcelService = exportExcelService; _sysDictDataService = sysDictDataService; } /// /// 查询学生家长问卷明细 /// /// /// public async Task> QueryPageList(ExamStudentPatriarchQuestionnaireProgressPageInput input) { string where = "T1.exam_plan_id = @examPlanId AND T1.sys_org_id = @sysOrgId"; if (!string.IsNullOrEmpty(input.Name?.Trim())) { where = $"{where} AND T1.name LIKE '%@name%'"; } if (!string.IsNullOrEmpty(input.IdNumber?.Trim())) { where = $"{where} AND T1.id_number LIKE '%@idNumber%'"; } if (!string.IsNullOrEmpty(input.Mobile?.Trim())) { where = $"{where} AND T1.name LIKE '%@mobile%'"; } if (input.ClassNumber.HasValue) { where = $"{where} AND T1.class_number = {input.ClassNumber.Value}"; } if (input.GradeId.HasValue) { where = $"{where} AND T1.grade_id = {input.GradeId.Value}"; } var p = new { CurrentSysUserInfo.SysOrgId, input.PageSize, PageOffset = (input.PageIndex - 1) * input.PageSize, input.ExamPlanId, input.Name, input.ClassNumber, input.IdNumber, input.Mobile, }; var totalCount = await _rep.SqlScalarAsync($@" SELECT COUNT(1) AS total_count FROM exam_student AS T1 WHERE {where}", p); var items = await _rep.SqlQueriesAsync($@" SELECT ROW_NUMBER() OVER (ORDER BY T1.grade_id, T1.class_number, T2.id) AS `row_number`, T1.sys_org_branch_id, T5.`name` AS sys_org_branch_name, T1.id, T1.grade_id, T6.`name` AS grade_name, T1.course_comb_id, T1.school_class_id, T7.`name` AS school_class_name, T7.grade_begin_year, T1.class_number, T1.`name`, T1.certificate_type, T1.id_number, text_mask(T2.mobile, 3, 4) AS mobile, T2.submit_time, T2.is_completed FROM exam_student AS T1 LEFT JOIN exam_patriarch_questionnaire_progress AS T2 ON T1.id = T2.exam_student_id LEFT JOIN sys_org AS T5 ON T1.sys_org_branch_id = T5.id LEFT JOIN base_grade AS T6 ON T1.grade_id = T6.id LEFT JOIN school_class AS T7 ON T1.school_class_id = T7.id WHERE {where} LIMIT @pageSize OFFSET @pageOffset;", p); PageResult ret = new() { PageIndex = input.PageIndex, PageSize = input.PageSize, TotalCount = totalCount, Items = items }; return ret; } /// /// 导出未填答学生名单 /// /// /// public async Task ExportUncompletedExcel(ExportExamPatriarchQuestionnaireProgressInput input) { var items = await _rep.SqlQueriesAsync($@" SELECT ROW_NUMBER() OVER (ORDER BY T1.grade_id, T1.class_number, T2.id) AS `row_number`, T1.sys_org_branch_id, T5.`name` AS sys_org_branch_name, T1.id, T1.grade_id, T6.`name` AS grade_name, T1.course_comb_id, T1.school_class_id, T7.`name` AS school_class_name, T7.grade_begin_year, T1.class_number, T1.`name`, T1.certificate_type, T1.id_number, text_mask(T2.mobile, 3, 4) AS mobile, T2.submit_time, T2.is_completed FROM exam_student AS T1 LEFT JOIN exam_patriarch_questionnaire_progress AS T2 ON T1.id = T2.exam_student_id LEFT JOIN sys_org AS T5 ON T1.sys_org_branch_id = T5.id LEFT JOIN base_grade AS T6 ON T1.grade_id = T6.id LEFT JOIN school_class AS T7 ON T1.school_class_id = T7.id WHERE T1.exam_plan_id = @examPlanId AND T1.sys_org_id = @sysOrgId AND T2.is_completed IS NULL ", new { input.ExamPlanId, CurrentSysUserInfo.SysOrgId }); // 获取证件类型 var cts = await _sysDictDataService.GetListByDictTypeId(304); var certificateTypes = cts.ToDictionary(x => (Core.CertificateType)x.Value, y => y.Name); List> cols = new() { new(){ Name = "年级", Width = 18, GetCellValue = (r) => $"{r.GradeName}({r.GradeBeginYear}级)" }, new(){ Name = "班级", Width = 10, GetCellValue = (r) => $"{r.ClassNumber}班" }, new(){ Name = "校区", Width = 14, GetCellValue = (r) => r.SysOrgBranchName }, new(){ Name = "学生姓名", Width = 20, GetCellValue = (r) => r.Name }, new(){ Name = "证件类型", Width = 16, GetCellValue = (r) => certificateTypes[r.CertificateType] }, new(){ Name = "证件号码", Width = 20, GetCellValue = (r) => r.IdNumber }, }; var ret = _exportExcelService.ExportExcel(new ExportExcelDto() { Title = $"{CurrentSysUserInfo.SysOrgName}学生家长问卷未填答名单", Columns = cols, Items = items, IncludeExportTime = false, }); return ret; } /// /// 获取各班级问卷填答进度 /// /// /// public async Task> GetProgressList(int examPlanId) { var items = await _rep.SqlQueriesAsync($@" SELECT T1.grade_id * 100 + T1.class_number AS id, T1.*, T2.`name` AS grade_name, ROUND(CASE WHEN T1.total_count = 0 THEN 0 ELSE T1.completed_count * 1.0 / T1.total_count * 100 END, 2) as completed_progress FROM ( SELECT T1.grade_id, T1.grade_begin_year, T1.class_number, SUM(CASE WHEN T1.is_completed = 1 THEN T1.sub_total_count ELSE 0 END) AS completed_count, SUM(CASE WHEN T1.is_completed = 0 THEN T1.sub_total_count ELSE 0 END) AS uncompleted_count, MAX(T1.total_count) AS total_count FROM ( SELECT T1.*, IFNULL(T2.is_completed, 0) AS is_completed, T2.sub_total_count FROM ( SELECT T1.grade_id, T3.grade_begin_year, T1.class_number, COUNT(1) AS total_count FROM exam_student AS T1 LEFT JOIN exam_patriarch_questionnaire_progress AS T2 ON T1.id = T2.exam_student_id LEFT JOIN school_class AS T3 ON T1.school_class_id = T3.id WHERE T1.exam_plan_id = @examPlanId AND T1.sys_org_id = @sysOrgId GROUP BY T1.grade_id, T3.grade_begin_year, T1.class_number ) AS T1 JOIN ( SELECT T1.grade_id, T1.class_number, T2.is_completed, COUNT(1) AS sub_total_count FROM exam_student AS T1 LEFT JOIN exam_patriarch_questionnaire_progress AS T2 ON T1.id = T2.exam_student_id WHERE T1.exam_plan_id = @examPlanId AND T1.sys_org_id = @sysOrgId GROUP BY T1.grade_id, T1.class_number, T2.is_completed ) AS T2 ON T1.grade_id = T2.grade_id AND T1.class_number = T2.class_number ) AS T1 GROUP BY T1.grade_id, T1.grade_begin_year, T1.class_number ) AS T1 LEFT JOIN base_grade AS T2 ON T1.grade_id = T2.id ORDER BY T1.grade_id, T1.class_number", new { ExamPlanId = examPlanId, CurrentSysUserInfo.SysOrgId }); return items; } }