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 System.Dynamic; using Tiobon.Core.Model; using Tiobon.Core.Common; using AgileObjects.AgileMapper; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SqlSugar; using Tiobon.Core.Common.Helper; using Microsoft.AspNetCore.Http; using Tiobon.Core.Common.UserManager; namespace Tiobon.Core.Services; /// /// 考试 (服务) /// public class Ghre_ExamServices : BaseServices, IGhre_ExamServices { private readonly IBaseRepository _dal; private readonly IGhre_CourseServices _ghre_CourseServices; private readonly IGhre_CourseSceneServices _ghre_CourseSceneServices; private readonly IGhra_StaffServices _ghra_StaffSceneServices; private readonly IGhre_ExamStaffServices _ghre_ExamStaffServices; private readonly IGhre_ExamRecordServices _ghre_ExamRecordServices; public Ghre_ExamServices(ICaching caching, IGhre_CourseServices ghre_CourseServices, IGhre_CourseSceneServices ghre_CourseSceneServices, IGhra_StaffServices ghra_StaffSceneServices, IGhre_ExamStaffServices ghre_ExamStaffServices, IGhre_ExamRecordServices ghre_ExamRecordServices, IBaseRepository dal) { this._dal = dal; base.BaseDal = dal; base._caching = caching; _ghre_CourseServices = ghre_CourseServices; _ghre_CourseSceneServices = ghre_CourseSceneServices; _ghra_StaffSceneServices = ghra_StaffSceneServices; _ghre_ExamStaffServices = ghre_ExamStaffServices; _ghre_ExamRecordServices = ghre_ExamRecordServices; } public async Task GetModuleInfo(ModuleParam param) { dynamic result = new ExpandoObject(); dynamic data = new ExpandoObject(); var Toolbar = new List(); Toolbar.Add(new Toolbar() { fnKey = "NewYN", fnKeyValue = null, fnTitle = "新增", fnType = "table", position = "left", icon = "ghr-icon-add", display = true }); Toolbar.Add(new Toolbar() { fnKey = "Release", fnKeyValue = null, fnTitle = "发布", fnType = "table", position = "left", icon = "ghr-publish", display = true }); var DT_Procedure = new DT_Procedure(); var sql = "select QueryProcedure, EditProcedure, IUDProcedure from Ghrs_Menu where MenuNo='{0}'"; sql = string.Format(sql, param.menuName, App.User.ID, param.langId); var dt = Db.Ado.GetDataTable(sql); if (dt.Rows.Count > 0) { DT_Procedure.QueryProcedure = dt.Rows[0]["QueryProcedure"].ToString(); DT_Procedure.EditProcedure = dt.Rows[0]["EditProcedure"].ToString(); DT_Procedure.IUDProcedure = dt.Rows[0]["IUDProcedure"].ToString(); } sql = $@"SELECT PageSettingQueryId, elementType, field, [dbo].[FLangKeyToValue] (Meky, {param.langId}, label) label, Meky, multipleSelect, dataType, required, palceholder, dataSourceType, dbo.FS_GetdataSourceBySet (dataSource, APIDataSourceType, Ghrs_PageSettingQuery.APIDataSourceID) dataSource, sortable, sortOrder, defaultHidden, ConfigIsShow, filterable, CAST(CASE WHEN width = '' THEN '100' ELSE width END AS INT) width, align, fixed, editable, searchable, searchRequired, searchColumnSeq, multipleSearchValue, maxTagCount, selfDefine, selectUI, isPrimaryKey, 'false' isSorted, 'false' isHidden, CASE WHEN searchColumnSeq IS NULL OR searchColumnSeq = '' THEN 'false' ELSE 'true' END isSearched, SortNo, -- searchCanOperator, ( select ParaDetailNo operator, [dbo].[FLangKeyToValue](MKey,1,ParaDetailName) operatorDesc, SqlFunction operatorIcon from Ghrs_ParaDetail where ParaMasterId=13 and IsEnable=1 and ParaDetailNo in (select Value from dbo.Fs1_GHR30_SplitString2(searchCanOperator,',')) order by (select positon from dbo.Fs1_GHR30_SplitString2(searchCanOperator,',') where value= ParaDetailNo) FOR JSON Path ) searchOperator1, '' searchColumnDefaultValue, '' AppColumnType FROM Ghrs_PageSettingQuery WHERE PageNo = '{param.menuName}' AND elementType NOT IN ('PageGroup') AND IsEnable = 1 ORDER BY SortNo ASC"; sql = string.Format(sql, param.menuName, App.User.ID, param.langId); var TableColumn = Db.Ado.SqlQuery(sql); var SearchFormFields = Mapper.Map(TableColumn).ToANew>(); SearchFormFields.ForEach(x => { if (!string.IsNullOrWhiteSpace(x.searchOperator1)) x.searchOperator = JsonConvert.DeserializeObject>(x.searchOperator1); x.searchOperator1 = null; }); #region DT_PageMutiMsg var DT_PageMutiMsg = await _caching.GetAsync>("DT_PageMutiMsg"); if (DT_PageMutiMsg == null || (DT_PageMutiMsg != null && !DT_PageMutiMsg.Any())) { sql = $@"SELECT Langkey field, CASE {param.langId} 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 (LangKey LIKE 'GHR_Page%' OR LangKey LIKE 'GHR_Common%') AND IsEnable = 1"; DT_PageMutiMsg = Db.Ado.SqlQuery(sql); if (DT_PageMutiMsg.Any()) await _caching.SetAsync("DT_PageMutiMsg", DT_PageMutiMsg); } #endregion data.Toolbar = Toolbar; data.DT_Procedure = DT_Procedure; data.SearchFormFields = SearchFormFields; data.DT_PageMutiMsg = DT_PageMutiMsg; result.Success = true; result.Status = 200; result.Data = data; result.Message = "查询成功"; return result; } public async Task QueryList(QueryBody body, string status) { var data = await QueryFilterPage1(body, status); dynamic return1 = new ExpandoObject(); dynamic result = new ExpandoObject(); dynamic DT_TablePageInfoT1 = new ExpandoObject(); result.DT_TableDataT1 = data.result.DT_TableDataT1; DT_TablePageInfoT1.PageNum = body.pageNum; DT_TablePageInfoT1.PageSize = body.pageSize; DT_TablePageInfoT1.TotalCount = data.result.DT_TablePageInfoT1.TotalCount; result.DT_TablePageInfoT1 = DT_TablePageInfoT1; dynamic CardConfig = new ExpandoObject(); CardConfig.cardTitle = "ExamName"; CardConfig.cardImage = "CoverUrl"; CardConfig.column1 = "AfterHowLongLabel"; CardConfig.column1Icon = "ghr-form-designer-deteSelect"; CardConfig.column2 = "CourseName"; CardConfig.column2Icon = "ghr-exam-paper"; CardConfig.column3 = "ExamModeLabel"; CardConfig.column3Icon = "ghr-online-exam"; CardConfig.column4 = "OpenClassName"; CardConfig.column4Icon = "ghr-link-openClass"; CardConfig.column5 = ""; CardConfig.column5Icon = ""; CardConfig.column6 = ""; CardConfig.column6Icon = ""; result.CardConfig = CardConfig; return1.result = result; return1.message = "查询成功!"; return1.Success = true; return1.code = 0; return1.type = "success"; return return1; } public async Task> QueryFilterPage1(QueryBody filter, string status = null) { RefAsync totalCount = 0; string sql = @"SELECT * FROM (SELECT A.*, B.CourseName, C.Id CourseTypeId, C.ClassName CourseType FROM Ghre_Exam A LEFT JOIN Ghre_Course B ON A.CourseId = B.Id LEFT JOIN Ghre_CourseClass C ON B.CourseClassId = C.Id WHERE A.IsEnable = 1) A"; if (string.IsNullOrWhiteSpace(filter.orderBy)) filter.orderBy = "CreateTime DESC"; string conditions = "1=1"; 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; default: break; } } } if (filter.pageSize == 0) filter.pageSize = 10000; var data = await Db.SqlQueryable(sql) .OrderBy(filter.orderBy) .ToPageListAsync(filter.pageNum, filter.pageSize, totalCount); //data.ForEach(async x => //{ // x.DifficultyLevelLabel = await GetParaLabel("DifficultyLevel", x.DifficultyLevel); // x.QuestionTypeLabel = await GetParaLabel("QuestionType", x.QuestionType); //}); return new ServicePageResult(filter.pageNum, totalCount, filter.pageSize, data); } public async Task> QueryDefault(long Id) { var input = new DefaultGhre_ExamInput(); #region baseColumns var baseColumns = new List { new DefaultGhre_ExamColumn() { label = "关联课程", field = "LinkType", elementType = "RadioBox", required = true, multipleSelect = false, editable = false, }, new DefaultGhre_ExamColumn() { label = "课程名称", field = "CourseId", elementType = "ApiSelect", required = true, multipleSelect = false, editable = true, dataSource = "api/Common/GetSelect/Ghre_Course?FW=DOTNETCORE" }, new DefaultGhre_ExamColumn() { label = "课程场景", field = "CourseSceneId", elementType = "ApiSelect", required = true, multipleSelect = false, editable = true, dataSource = "api/Common/GetSelect/Ghre_CourseScene?FW=DOTNETCORE" }, new DefaultGhre_ExamColumn() { label = "选择试卷", field = "ExamPaperId", elementType = "ApiSelect", required = true, multipleSelect = false, editable = true, dataSource = "api/Ghre_ExamPaper/GetSelect?FW=DOTNETCORE&linkId=" }, new DefaultGhre_ExamColumn() { label = "考试编号", field = "ExamNo", elementType = "Input", required =false , multipleSelect = false, editable = false }, new DefaultGhre_ExamColumn() { label = "考试名称", field = "ExamName", elementType = "Input", required = true, multipleSelect = false, editable = true, }, new DefaultGhre_ExamColumn() { label = "考试日期", field = "DateType", elementType = "RadioBox", required = true, multipleSelect = false, editable = true, }, new DefaultGhre_ExamColumn() { label = "考试区间", field = "ExamDate", elementType = "GRangePicker", required = true, multipleSelect = false, editable = true, }, new DefaultGhre_ExamColumn() { label = "学完多久", field = "AfterHowLong", elementType = "RadioBox", required = false, multipleSelect = false, editable = true, }, new DefaultGhre_ExamColumn() { label = "考试形式", field = "ExamMode", elementType = "RadioBox", required = false, multipleSelect = false, editable = true, }, new DefaultGhre_ExamColumn() { label = "线下考试地点", field = "ExamPlace", elementType = "Input", required = true, multipleSelect = false, editable = true, }, new DefaultGhre_ExamColumn() { label = "关联开班", field = "IsLinkOpenClass", elementType = "RadioBox", required = true, multipleSelect = false, editable = true }, new DefaultGhre_ExamColumn() { label = "考试说明", field = "RemarkSz", elementType = "InputTextArea", required = true, multipleSelect = false, editable = true } }; #endregion #region staffTableColumns var staffTableColumns = new List { new DefaultGhre_ExamColumn() { label = "工号", field = "StaffNo", align = "center", width=100 }, new DefaultGhre_ExamColumn() { label = "姓名", field = "StaffName", align = "center", width=100 }, new DefaultGhre_ExamColumn() { label = "部门", field = "DeptName", align = "center", width=100 }, new DefaultGhre_ExamColumn() { label = "岗位", field = "TitleName", align = "center", width=100 }, new DefaultGhre_ExamColumn() { label = "入职日期", field = "InDate", align = "center", width=100 }, new DefaultGhre_ExamColumn() { label = "邮箱", field = "Mail", align = "center", width=100 }, new DefaultGhre_ExamColumn() { label = "数据来源", field = "DataSource", align = "center", width=100 } }; #endregion #region pageData if (Id != 0) { var exam = await base.QueryById(Id); var pageData = Mapper.Map(exam).ToANew(); if (pageData.AfterHowLong != 7 && pageData.AfterHowLong != 15 && pageData.AfterHowLong != 30) { pageData.AfterHowLong1 = pageData.AfterHowLong; pageData.AfterHowLong = 0; } if (pageData.DateType == "ExamDate") pageData.ExamDate.Add(pageData.BeginTime.Value.ToString("yyyy/MM/dd")); if (pageData.DateType == "ExamDate") pageData.ExamDate.Add(pageData.EndTime.Value.ToString("yyyy/MM/dd")); input.pageData = pageData; var staffs = await _ghre_ExamStaffServices.Query(x => x.ExamId == Id); var ids = staffs.Select(x => Convert.ToInt32(x.StaffId)).ToList(); var staffTableData = await QueryStaff(ids, null); pageData.staffTableData = staffTableData.Data; } #endregion input.baseColumns = baseColumns; input.staffTableColumns = staffTableColumns; return ServiceResult.OprateSuccess("查询成功!", input); } public async Task>> QueryStaff(List Ids, string type) { string sql = @"SELECT A.StaffID, A.StaffName, A.StaffNo, A.Email Mail, B.DeptName, C.TitleName, FORMAT(A.Indate, 'yyyy/MM/dd') Indate FROM Ghra_Staff A LEFT JOIN Ghro_Dept B ON A.DeptID = B.DeptID LEFT JOIN Ghra_Title C ON A.TitleID = C.TitleID WHERE 1=1 AND A.IsEnable=1 "; if (Ids.Any()) sql += $"AND StaffID IN({string.Join(",", Ids)}) "; else sql += "AND 1!=1 "; //var list = await _ghra_StaffSceneServices.Query(x => Ids.Contains(x.StaffID)); var data = await Db.Ado.SqlQueryAsync(sql); //var data = list.Select(x => new StaffTableData() //{ // StaffID = x.StaffID, // StaffNo = x.StaffNo, // StaffName = x.StaffName, // Mail = x.Email //}).ToList(); return ServiceResult>.OprateSuccess("查询成功!", data); } public async Task> Insert1(long id, DefaultGhre_ExamPageData pageData) { if (pageData.DateType == "ExamDate") { pageData.BeginTime = Convert.ToDateTime(pageData.ExamDate[0]); pageData.EndTime = Convert.ToDateTime(pageData.ExamDate[1]); } if (pageData.AfterHowLong == 0) pageData.AfterHowLong = pageData.AfterHowLong1; if (id == 0) { if (string.IsNullOrEmpty(pageData.Status)) pageData.Status = "Draft"; var insert = Mapper.Map(pageData).ToANew(); id = await base.Add(insert); var insertStaffs = pageData.staffTableData.Select(x => new InsertGhre_ExamStaffInput() { ExamId = id, StaffId = x.StaffID, Source = x.DataSource }).ToList(); await _ghre_ExamStaffServices.Add(insertStaffs); return ServiceResult.OprateSuccess("添加成功!", id); } else { var insert = Mapper.Map(pageData).ToANew(); await base.Update(id, insert); await _ghre_ExamStaffServices.Delete(x => x.ExamId == id); var insertStaffs = pageData.staffTableData.Select(x => new InsertGhre_ExamStaffInput() { ExamId = id, StaffId = x.StaffID, Source = x.DataSource }).ToList(); await _ghre_ExamStaffServices.Add(insertStaffs); return ServiceResult.OprateSuccess("修改成功!", id); } } public async Task UpdateStatus(long[] ids, string status) { if (status != "Released" && status != "Disabled" && status != "Draft") throw new Exception("无效的状态"); HttpRequest request = UserContext.Context.Request; var api = request.Path.ObjToString().TrimEnd('/').ToLower(); var ip = GetUserIp(UserContext.Context); var entities = new List(); foreach (var id in ids) { if (id == null || !BaseDal.Any(id)) continue; var entity = await BaseDal.QueryById(id); BasePoco ent = entity; ent.UpdateIP = ip; ent.UpdateProg = api; if (status != "Released" && await _ghre_ExamRecordServices.AnyAsync(x => x.ExamId == id)) return ServiceResult.OprateFailed("已有学员参与考试,不可取消发布!"); if (status == "Released" || status == "Disabled" || status == "Draft") { entity.Status = status; entities.Add(entity); } } var result = await BaseDal.Update(entities); if (status == "Released") return ServiceResult.OprateSuccess("发布成功!"); else if (status == "Draft") return ServiceResult.OprateSuccess("取消发布成功!"); else return ServiceResult.OprateSuccess("停用成功!"); } public async Task GetStatus(long id) { if (await _ghre_ExamRecordServices.AnyAsync(x => x.ExamId == id)) return ServiceResult.OprateFailed("已有学员参与考试,不可取消发布!"); return ServiceResult.OprateSuccess("可以取消发布!"); } }