using Tiobon.Core.IServices; using Tiobon.Core.Model.Models; using Tiobon.Core.Services.BASE; using Tiobon.Core.IRepository.Base; using Tiobon.Core.Common.Caches; using Tiobon.Core.Common; using Tiobon.Core.Model; using AgileObjects.AgileMapper; using Newtonsoft.Json.Linq; using Newtonsoft.Json; namespace Tiobon.Core.Services; /// /// Ghre_Teacher (服务) /// public class Ghre_TeacherServices : BaseServices, IGhre_TeacherServices { private readonly IBaseRepository _dal; private IGhre_AttachmentServices _ghre_AttachmentServices; private IGhre_TeacherAttachmentServices _ghre_TeacherAttachmentServices; public Ghre_TeacherServices(ICaching caching, IGhre_AttachmentServices ghre_AttachmentServices, IGhre_TeacherAttachmentServices ghre_TeacherAttachmentServices, IBaseRepository dal) { this._dal = dal; base.BaseDal = dal; base._caching = caching; _ghre_AttachmentServices = ghre_AttachmentServices; _ghre_TeacherAttachmentServices = ghre_TeacherAttachmentServices; } public override async Task> QueryFilterPage(QueryBody filter, string condition, bool? IsEnable = true) { if (string.IsNullOrWhiteSpace(filter.orderBy)) filter.orderBy = "CreateTime1 DESC"; if (filter.pageSize == 0) filter.pageSize = 10000; var countSql = @$" SELECT COUNT (1) FROM (SELECT A.*, A.TeacherNo + A.TeacherName TeacherName1, CASE A.TeacherType WHEN 'In' THEN B.DeptName WHEN 'Out' THEN C.SchoolName ELSE NULL END 'DeptOrSchoolName1' FROM Ghre_Teacher A LEFT JOIN Ghro_Dept B ON A.DeptID = B.DeptID LEFT JOIN Ghre_School C ON A.SchoolId = C.Id) A"; var sql1 = @$"DECLARE @langId INT = {filter.langId};"; var sql = @$"SELECT * FROM (SELECT A.*, ISNULL ((SELECT CASE WHEN @langId = 1 THEN UserName ELSE UserEname END FROM Ghrs_User B WHERE B.UserId = A.CreateBy), '') CreateDataInfo, ISNULL ((SELECT CASE WHEN @langId = 1 THEN UserName ELSE UserEname END FROM Ghrs_User B WHERE B.UserId = A.UpdateBy), '') UpdateDataInfo, ISNULL (A.UpdateTime, A.CreateTime) CreateTime1, A.TeacherNo + A.TeacherName TeacherName1, CASE A.TeacherType WHEN 'In' THEN B.DeptName WHEN 'Out' THEN C.SchoolName ELSE NULL END 'DeptOrSchoolName1' FROM Ghre_Teacher A LEFT JOIN Ghro_Dept B ON A.DeptID = B.DeptID LEFT JOIN Ghre_School C ON A.SchoolId = C.Id) A"; string conditions = " WHERE 1=1 "; if (IsEnable == true) conditions += " AND IsEnable = 1"; else if (IsEnable == false) conditions += " AND IsEnable = 0"; if (!string.IsNullOrWhiteSpace(condition)) conditions += " AND " + condition; if (filter.jsonParam != null) foreach (JProperty jProperty in filter.jsonParam.Properties()) { var name = jProperty.Name; var value = jProperty.Value.ToString(); if (name == "page" || name == "pageSize") continue; if (!string.IsNullOrWhiteSpace(value)) { var jsonParam = JsonConvert.DeserializeObject(value); switch (jsonParam.operationKey) { case "Include": conditions += $" AND {name} LIKE '%{jsonParam.columnValue}%'"; break; case "NotInclude": conditions += $" AND {name} NOT LIKE '%{jsonParam.columnValue}%'"; break; case "IsNull": conditions += $" AND {name} IS NULL"; break; case "NotNull": conditions += $" AND {name} IS NOT NULL"; break; case "Equal": conditions += $" AND {name} ='{jsonParam.columnValue}'"; break; case "NotEqual": conditions += $" AND {name} !='{jsonParam.columnValue}'"; break; case "GreaterOrEqual"://大于等于 conditions += $" AND {name} >='{jsonParam.columnValue}'"; break; case "Greater"://大于 conditions += $" AND {name} >'{jsonParam.columnValue}'"; break; case "LessOrEqual"://小于等于 conditions += $" AND {name} <='{jsonParam.columnValue}'"; break; case "Less "://小于 conditions += $" AND {name} <'{jsonParam.columnValue}'"; break; default: break; } } } sql += conditions; countSql += conditions; int total = await Db.Ado.GetIntAsync(countSql); sql = "SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY " + filter.orderBy + ") NUM FROM (SELECT * FROM (" + sql + " "; sql += ") A ) B ) C"; sql += " WHERE NUM <= " + filter.pageNum * filter.pageSize + " AND NUM >" + (filter.pageNum - 1) * filter.pageSize; sql = sql1 + sql; var entitys = await Db.Ado.SqlQueryAsync(sql); var data = new ServicePageResult(filter.pageNum, total, filter.pageSize, entitys); //}); var schoolIds = data.result.DT_TableDataT1.Where(x => x.SchoolId != null).Select(x => x.SchoolId.Value).Distinct().ToList(); var deptIDs = data.result.DT_TableDataT1.Where(x => x.DeptID != null).Select(x => x.DeptID).Distinct().ToList(); var depts = await Db.Queryable().Where(x => deptIDs.Contains(x.DeptID)).Select(x => new { x.DeptID, x.DeptName }).ToListAsync(); var schools = await Db.Queryable().Where(x => schoolIds.Contains(x.Id)).Select(x => new { x.Id, x.SchoolName }).ToListAsync(); data.result.DT_TableDataT1.ForEach(async x => { x.GenderLabel = await GetParaLabel("Gender", x.Gender); x.TeacherTypeLabel = await GetParaLabel("TrainingTeacherType", x.TeacherType); x.TeacherLevelLabel = await GetParaLabel("TrainingTeacherLevel", x.TeacherLevel); x.DeptOrSchoolName = x.TeacherType == "Out" ? schools.FirstOrDefault(o => o.Id == x.SchoolId)?.SchoolName : depts.FirstOrDefault(o => o.DeptID == x.DeptID)?.DeptName; }); return data; } public override async Task> QueryForm(QueryForm body) { var data = await base.QueryForm(body); var entitys = data.result.DT_TableDataT1; var ids = entitys.Select(x => x.Id).ToList(); var teacherAttachments = await _ghre_TeacherAttachmentServices.QueryDto(x => ids.Contains(x.TeacherId.Value)); var ids1 = teacherAttachments.Select(x => x.Id.ToString()).ToList(); var attachments = await _ghre_AttachmentServices.QueryDto(x => ids1.Contains(x.TableName)); teacherAttachments.ForEach(x => { x.Attachments = attachments.Where(o => o.TableName == x.Id.ToString()).ToList(); }); entitys.ForEach(x => { x.TeacherAttachments = teacherAttachments.Where(o => o.TeacherId == x.Id).ToList(); }); data.result.DT_TableDataT1 = entitys; return data; } public override async Task Add(InsertGhre_TeacherInput entity) { if (entity.TeacherType == "In") { entity.SchoolId = null; var staff = await Db.Queryable().FirstAsync(x => x.StaffID == entity.StaffId); if (staff != null) { entity.TeacherNo = staff.StaffNo; entity.TeacherName = staff.StaffName; } } else { entity.DeptID = null; entity.StaffId = null; } var id = await base.Add(entity); if (entity.TeacherAttachments != null && entity.TeacherAttachments.Any()) { for (int i = 0; i < entity.TeacherAttachments.Count; i++) { var insert = entity.TeacherAttachments[i]; insert.TeacherId = id; var teacherAttachmentId = await _ghre_TeacherAttachmentServices.Add(insert); if (insert.Attachments != null && insert.Attachments.Any()) for (int j = 0; j < insert.Attachments.Count; j++) { await Db.Updateable() .SetColumns(it => new Ghre_Attachment() { TableName = teacherAttachmentId.ToString(), UpdateTime = DateTime.Now }) .Where(it => it.RelativePath == insert.Attachments[j].RelativePath) .ExecuteCommandAsync(); } } } return id; } public override async Task Update(long Id, EditGhre_TeacherInput editModel) { if (editModel.TeacherType == "In") { editModel.SchoolId = null; var staff = await Db.Queryable().FirstAsync(x => x.StaffID == editModel.StaffId); if (staff != null) { editModel.TeacherNo = staff.StaffNo; editModel.TeacherName = staff.StaffName; } } else { editModel.DeptID = null; editModel.StaffId = null; } var result = await base.Update(Id, editModel); await _ghre_TeacherAttachmentServices.Delete(x => x.TeacherId == Id); if (editModel.TeacherAttachments != null && editModel.TeacherAttachments.Any()) { for (int i = 0; i < editModel.TeacherAttachments.Count; i++) { var insert = editModel.TeacherAttachments[i]; insert.TeacherId = Id; var TeacherAttachmentId = await _ghre_TeacherAttachmentServices.Add(Mapper.Map(insert).ToANew()); if (insert.Attachments != null && insert.Attachments.Any()) for (int j = 0; j < insert.Attachments.Count; j++) { await Db.Updateable() .SetColumns(it => new Ghre_Attachment() { TableName = TeacherAttachmentId.ToString(), UpdateTime = DateTime.Now }) .Where(it => it.RelativePath == insert.Attachments[j].RelativePath) .ExecuteCommandAsync(); } } } return result; } }