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 Newtonsoft.Json.Linq; using Tiobon.Core.Common; using Tiobon.Core.Model; using Newtonsoft.Json; using Tiobon.Core.Common.Helper; namespace Tiobon.Core.Services { /// /// 培训记录 (服务) /// public class Ghre_StudyRecordServices : BaseServices, IGhre_StudyRecordServices { private readonly IBaseRepository _dal; public Ghre_StudyRecordServices(ICaching caching, IBaseRepository dal) { this._dal = dal; base.BaseDal = dal; base._caching = caching; } 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 Ghre_StudyRecord_V"; var sql = @$" SELECT * FROM Ghre_StudyRecord_V 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 (name == "Date") { var jsonParam = JsonConvert.DeserializeObject(value); conditions += $" AND (Date BETWEEN '{jsonParam.columnValue[0]}' AND '{jsonParam.columnValue[1]}')"; continue; } if (!string.IsNullOrWhiteSpace(value)) conditions = DealConditions(conditions, name, value); } 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; var entitys = await Db.Ado.SqlQueryAsync(sql); entitys.ForEach(entity => { if (!string.IsNullOrWhiteSpace(entity.Indate)) entity.Indate = DateTimeHelper.ConvertToDayString(entity.Indate); }); return new ServicePageResult(filter.pageNum, total, filter.pageSize, entitys); } #region 获取ESS查询条件 public async Task> QueryESSSearchFields(QueryBody body) { var entity = new CoursePublicSearch(); string sql = @"SELECT Langkey field, CASE {2} WHEN 1 THEN isnull (Value01, LangValue) WHEN 2 THEN isnull (Value02, LangValue) WHEN 3 THEN isnull (Value03, LangValue) WHEN 4 THEN isnull (Value04, LangValue) WHEN 5 THEN isnull (Value05, LangValue) WHEN 6 THEN isnull (Value06, LangValue) WHEN 7 THEN isnull (Value07, LangValue) WHEN 8 THEN isnull (Value08, LangValue) WHEN 9 THEN isnull (Value09, LangValue) WHEN 10 THEN isnull (Value10, LangValue) END label FROM Ghrs_LangKey WHERE IsEnable = 1 AND (LangKey LIKE 'GHR_Page%' OR LangKey LIKE 'GHR_Common%')"; sql = string.Format(sql, body.menuName, App.User.ID, body.langId); entity.DT_PageMutiMsg = await Db.Ado.SqlQueryAsync(sql); entity.SearchFields.Add(new CoursePublicSearchField() { label = "课程编号/名称", field = "CourseNoOrName", elementType = "Input", editable = true, required = false, multipleSelect = false, }); entity.SearchFields.Add(new CoursePublicSearchField() { label = "课程分类", field = "CourseClassId", elementType = "ApiSelect", dataSource = "CommonList_TrainingCourseClass", editable = true, required = false, multipleSelect = false, }); entity.SearchFields.Add(new CoursePublicSearchField() { label = "课程场景", field = "CourseSceneId", elementType = "ApiSelect", dataSource = "CommonList_TrainingCourseScene", editable = true, required = false, multipleSelect = false, }); entity.SearchFields.Add(new CoursePublicSearchField() { label = "课程状态", field = "CourseStatus", elementType = "ApiSelect", dataSource = "TBParaDetail_Train_CourseIsOpen", editable = true, required = false, multipleSelect = false, }); entity.SearchFields.Add(new CoursePublicSearchField() { label = "学习状态", field = "StudyStatus", elementType = "ApiSelect", dataSource = "TBParaDetail_Train_CourseIsOpen", editable = true, required = false, multipleSelect = false, }); return ServiceResult.OprateSuccess("", entity); } #endregion #region 获取我的学习 /// /// /// /// /// /// /// public async Task> QueryESS(QueryBody filter, string condition, bool? IsEnable = true) { if (string.IsNullOrWhiteSpace(filter.orderBy)) filter.orderBy = "JoinTime DESC"; if (filter.pageSize == 0) filter.pageSize = 10000; var countSql = @$" SELECT COUNT(1) FROM Ghre_StudyRecord_V"; var sql = @$" SELECT A.Id, A.StaffId, A.CourseSnapId, A.CourseId, A.CoverUrl, A.UseDefaultCoverImage, A.DefaultCoverImageName, A.CourseName, A.StandardHour, A.CreditPoints, A.CourseBeginTime CourseBeginDate, A.CourseEndTime CourseEndDate, A.ExamDate, A.ExamBeginDate, A.ExamEndDate, A.JoinTime, A.CourseClassId, A.CourseSceneId, A.CourseType, A.ExamDateType, A.AfterHowLong FROM Ghre_StudyRecord_V A"; string conditions = $" WHERE UserId={App.User.ID} "; 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 (name == "CourseNoOrName") { var jsonParam = JsonConvert.DeserializeObject(value); conditions += $" AND CourseName LIKE '%{jsonParam.columnValue}%'"; continue; } if (name == "CourseClassId") { var jsonParam = JsonConvert.DeserializeObject(value); conditions += $" AND CourseClassId LIKE '%{jsonParam.columnValue}%' "; 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; var entitys = await Db.Ado.SqlQueryAsync(sql); entitys.ForEach(x => { if (x.CourseBeginDate != null && x.CourseEndDate != null) x.CourseDateString = DateTimeHelper.ConvertToDayString(x.CourseBeginDate) + "~" + DateTimeHelper.ConvertToDayString(x.CourseEndDate); if (x.ExamBeginDate != null && x.ExamEndDate != null) x.ExamDateString = DateTimeHelper.ConvertToDayString(x.ExamBeginDate) + "~" + DateTimeHelper.ConvertToDayString(x.ExamEndDate); else x.ExamDateString = $"学完{x.AfterHowLong}天"; }); return new ServicePageResult(filter.pageNum, total, filter.pageSize, entitys); } #endregion #region 获取课程 /// /// 获取课程 /// /// /// public async Task> QueryCourse(QueryBody body, long id) { var course = new Ghre_StudyRecordCourse(); string sql = @$"SELECT A.Id, A.CourseId, A.CourseSceneId, ISNULL (B.CourseName, G.SceneName) CourseName, B.UseDefaultCoverImage, B.DefaultCoverImageName, B.CoverUrl, B.SchoolTeacherId, B.SchoolId, B.InOrOut, E.TeacherName, -- E.TeacherEName, CASE B.InOrOut WHEN 'In' THEN C.StaffEname WHEN 'Out' THEN NULL ELSE NULL END AS TeacherEName, E.PhotoUrl TeacherPhotoUrl, CASE B.InOrOut WHEN 'In' THEN dbo.FO_DeptInfo (E.DeptID, getdate (), 1, 'DeptFullPateName') WHEN 'Out' THEN F.SchoolName ELSE NULL END AS DeptOrSchoolName, E.SkillPoints TeacherRemarkSz, B.StandardHour, B.CreditPoints, B.Outline CourseRemarkSz, A.StudyProgress FROM Ghre_StudyRecord A LEFT JOIN Ghre_Course B ON A.CourseId = B.Id LEFT JOIN Ghra_Staff c ON B.TeacherId = c.StaffID LEFT JOIN Ghre_Teacher E ON B.SchoolTeacherId = E.Id LEFT JOIN Ghre_School F ON B.SchoolId = F.Id LEFT JOIN Ghre_CourseScene G ON A.CourseSceneId = G.Id WHERE A.Id = '{id}'"; course = await Db.Ado.SqlQuerySingleAsync(sql); if (course.CourseSceneId.IsNull()) { sql = @$"SELECT A.Id, A.Source, A.Link FROM Ghre_CourseWare A WHERE A.CourseIds LIKE '%{course.CourseId}%' AND A.IsEnable = 1"; course.CourseWareList = await Db.Ado.SqlQueryAsync(sql); course.CourseWareList.ForEach(x => { x.CourseId = course.CourseId; x.CourseName = course.CourseName; }); course.CourseTeacherList = [ new Ghre_StudyRecordCourseTeacher() { TeacherName = course.TeacherName, TeacherEName = course.TeacherEName, TeacherPhotoUrl = course.TeacherPhotoUrl, DeptOrSchoolName = course.DeptOrSchoolName, TeacherRemarkSz = course.TeacherRemarkSz } ]; } else { course.CourseWareList = new List(); course.CourseTeacherList = new List(); var courses = await Db.Queryable().Where(x => x.CourseSceneId == course.CourseSceneId && x.Status == Consts.DIC_COURSE_STATUS.RELEASED).ToListAsync(); for (int i = 0; i < courses.Count; i++) { var course1 = courses[i]; sql = @$"SELECT A.Id, A.Source, A.Link FROM Ghre_CourseWare A WHERE A.CourseIds LIKE '%{course1.Id}%' AND A.IsEnable = 1"; var courseWareList = await Db.Ado.SqlQueryAsync(sql); courseWareList.ForEach(x => { x.CourseId = course.CourseId; x.CourseName = course.CourseName; }); course.CourseWareList.AddRange(courseWareList); sql = $@"SELECT a.ID, C.TeacherName, CASE A.InOrOut WHEN 'In' THEN B.StaffEname WHEN 'Out' THEN NULL ELSE NULL END AS TeacherEName, C.PhotoUrl TeacherPhotoUrl, CASE A.InOrOut WHEN 'In' THEN dbo.FO_DeptInfo (b.DeptID, getdate (), 1, 'DeptFullPateName') WHEN 'Out' THEN D.SchoolName ELSE NULL END AS DeptOrSchoolName, c.SkillPoints TeacherRemarkSz, a.CourseName FROM Ghre_Course A LEFT JOIN Ghra_Staff B ON A.TeacherId = B.StaffID LEFT JOIN Ghre_Teacher C ON A.SchoolTeacherId = C.Id LEFT JOIN Ghre_School D ON C.SchoolId = D.Id WHERE a.id = '{course1.Id}'"; course.CourseTeacherList.Add(await Db.Ado.SqlQuerySingleAsync(sql)); } } for (int j = 0; j < course.CourseWareList.Count; j++) { course.CourseWareList[j].Attachments = await Db.Queryable().Where(x => x.CourseWareId == course.CourseWareList[j].Id).ToListAsync(); } return ServiceResult.OprateSuccess("查询成功!", course); } #endregion #region 获取ESS查询条件 public async Task Join(long courseId) { var staffId = GetStaffId(); if (!await base.AnyAsync(x => x.CourseId == courseId && x.StaffId == staffId)) { var course = await Db.Queryable().Where(x => x.Id == courseId && x.Status == Consts.DIC_COURSE_STATUS.RELEASED).FirstAsync(); if (course.IsNull()) return ServiceResult.OprateFailed("无效的课程!"); DateTime courseTime = Db.GetDate(); var snap = await Db.Queryable().FirstAsync(x => x.CourseId == courseId); await base.Add(new InsertGhre_StudyRecordInput { StaffId = staffId, CourseSnapId = snap?.Id, CourseId = courseId, JoinTime = courseTime, CourseBeginTime = courseTime.Date, CourseEndTime = courseTime.Date.AddMonths(snap?.ValidityPeriod ?? 1), CourseType = "Elective", CourseStatus = Consts.DIC_STUDY_RECORD_COURSE_STATUS_IN, StudyStatus = Consts.DIC_STUDY_RECORD_STUDY_STATUS_NO_JOIN }); } return ServiceResult.OprateSuccess("加入成功!"); } #endregion } }