using MySqlX.XDevAPI.Common; using System.Text.RegularExpressions; namespace Tiobon.Core.Services; /// /// 问卷调查 (服务) /// public class Ghre_SurveyServices : BaseServices, IGhre_SurveyServices { private readonly IBaseRepository _dal; public Ghre_SurveyServices(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) { var result = await base.QueryFilterPage(filter, condition, IsEnable); result.result.DT_TableDataT1.ForEach(async x => { x.SurveyClass = await GetParaLabel("TrainSurveyClass", x.SurveyClass); }); return result; } public override async Task Add(InsertGhre_SurveyInput entity) { entity.IsRequireLogin = true; var result = await base.Add(entity); return result; } public override async Task Update(long Id, EditGhre_SurveyInput editModel) { editModel.IsRequireLogin = true; var result = await base.Update(Id, editModel, null, ["Status"]); return result; } public override async Task> QueryForm(QueryForm body) { var result = await base.QueryForm(body); return result; } public async Task> QueryData(long id) { var entity = await base.QueryById(id); var data = Mapper.Map(entity).ToANew(); data.BeginEndTime.Add(data.BeginTime); data.BeginEndTime.Add(data.EndTime); if (entity.StaffId.IsNotEmptyOrNull()) data.StaffIds = JsonHelper.JsonToObj>(entity.StaffId); if (entity.DeptId.IsNotEmptyOrNull()) data.DeptIds = JsonHelper.JsonToObj>(entity.DeptId); var questions = await Db.Queryable().OrderBy(x => x.SortNo).Where(x => x.SurveyId == id).ToListAsync(); var options = await Db.Queryable().OrderBy(x => x.SortNo).Where(x => x.SurveyId == id).ToListAsync(); data.Questions = Mapper.Map(questions).ToANew>(); data.Questions.ForEach(x => { x.Options = Mapper.Map(options.Where(o => o.SurveyQuestionId == x.Id)).ToANew>(); }); return ServiceResult.OprateSuccess("成功", data); } public async Task> InsertByStatus(InsertGhre_SurveyInput insertModel, string status) { var data = ServiceResult.OprateSuccess("新增成功", 0); insertModel.Status = status; var id = await Add(insertModel); data.Success = id > 0; if (data.Success) data.Data = id; else return ServiceResult.OprateFailed("失败!"); return data; } public async Task UpdateStatus(InsertGhre_SurveyInput input, string status) { 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 input.Ids) { if (!BaseDal.Any(id)) continue; var entity = await BaseDal.QueryById(id); if (entity.Status == "Publish" && status == "Temporary") if (await Db.Queryable().Where(x => x.FeedbackId == id || x.ParentFeedbackId == id).AnyAsync()) throw new Exception($"问卷【{entity.SurveyName}】已被开班引用,暂不可取消发布!"); entity.UpdateIP = ip; entity.UpdateProg = api; entity.Status = status; entities.Add(entity); } var result = await BaseDal.Update(entities); return ServiceResult.OprateSuccess("执行成功!"); } public async Task> InsertData(long id, InsertGhre_SurveyExtend insertModel) { if (insertModel.BeginEndTime != null && insertModel.BeginEndTime.Count == 2) { insertModel.BeginTime = insertModel.BeginEndTime[0]; insertModel.EndTime = insertModel.BeginEndTime[1]; } var data = ServiceResult.OprateSuccess("新增成功", id); if (id == 0) { var insert = Mapper.Map(insertModel).ToANew(); insert.Status = "Temporary"; if (insertModel.StaffIds != null && insertModel.StaffIds.Any()) insert.StaffId = JsonHelper.ObjToJson(insertModel.StaffIds); if (insertModel.DeptIds != null && insertModel.DeptIds.Any()) insert.DeptId = JsonHelper.ObjToJson(insertModel.DeptIds); id = await Add(insert); for (int i = 0; i < insertModel.Questions.Count; i++) { var question = Mapper.Map(insertModel.Questions[i]).ToANew(); //question.Id = SnowFlakeSingle.instance.getID(); question.SurveyId = id; question.SortNo = i; var questionId = await Db.Insertable(question).ExecuteReturnSnowflakeIdAsync(); for (int j = 0; j < insertModel.Questions[i].Options.Count; j++) { var option = Mapper.Map(insertModel.Questions[i].Options[j]).ToANew(); option.SurveyId = id; option.SurveyQuestionId = questionId; option.SortNo = j; await Db.Insertable(option).ExecuteReturnSnowflakeIdAsync(); } } data.Data = id; } else { await Db.Deleteable().Where(x => x.SurveyId == id).ExecuteCommandAsync(); await Db.Deleteable().Where(x => x.SurveyId == id).ExecuteCommandAsync(); var insert = Mapper.Map(insertModel).ToANew(); if (insertModel.StaffIds != null && insertModel.StaffIds.Any()) insert.StaffId = JsonHelper.ObjToJson(insertModel.StaffIds); if (insertModel.DeptIds != null && insertModel.DeptIds.Any()) insert.DeptId = JsonHelper.ObjToJson(insertModel.DeptIds); await Update(id, insert, null, ["Status"]); for (int i = 0; i < insertModel.Questions.Count; i++) { var question = Mapper.Map(insertModel.Questions[i]).ToANew(); //question.Id = SnowFlakeSingle.instance.getID(); question.SurveyId = id; var questionId = await Db.Insertable(question).ExecuteReturnSnowflakeIdAsync(); for (int j = 0; j < insertModel.Questions[i].Options.Count; j++) { var option = Mapper.Map(insertModel.Questions[i].Options[j]).ToANew(); option.SurveyId = id; option.SurveyQuestionId = questionId; await Db.Insertable(option).ExecuteReturnSnowflakeIdAsync(); } } data.Message = "修改成功!"; } return data; } public async Task> QueryESSData(long id, long? openClassId = null) { long? feedbackId = null; if (openClassId != null) { if (await Db.Queryable().Where(x => x.Source == "ParentTeacher" && (x.Id == id || x.Id == openClassId)).AnyAsync()) { var feedback = await Db.Queryable().Where(x => x.Source == "ParentTeacher" && (x.Id == id || x.Id == openClassId)).FirstAsync(); feedbackId = feedback.Id; openClassId = feedback.OpenClassId; id = feedback.SurveyId.Value; } else { if (!await Db.Queryable() .Where(x => x.Source == "Trainee" && (x.SurveyId == id || x.Id == openClassId) && x.OpenClassId == openClassId).AnyAsync()) { var openClass = await Db.Queryable().Where(x => x.Id == openClassId).FirstAsync(); var feedback = new Ghre_OpenClassFeedback() { OpenClassId = openClassId, SurveyId = id, StaffId = App.User.StaffId, Source = "Trainee", EffectiveTime = DateTime.Now, ExpiryTime = DateTime.MaxValue, TeacherId = openClass.TeacherId, CourseBeginTime = openClass.StartTime, CourseEndTime = openClass.EndTime, CourseId = openClass.LinkId, Status = "N", Score = 0 }; feedbackId = await Db.Insertable(feedback).ExecuteReturnSnowflakeIdAsync(); } else feedbackId = await Db.Queryable() .Where(x => x.Source == "Trainee" && (x.SurveyId == id || x.Id == openClassId) && x.OpenClassId == openClassId).Select(x => x.Id).FirstAsync(); } } var entity = await base.QueryById(id); var data = Mapper.Map(entity).ToANew(); data.BeginEndTime.Add(data.BeginTime); data.BeginEndTime.Add(data.EndTime); if (entity.StaffId.IsNotEmptyOrNull()) data.StaffIds = JsonHelper.JsonToObj>(entity.StaffId); if (entity.DeptId.IsNotEmptyOrNull()) data.DeptIds = JsonHelper.JsonToObj>(entity.DeptId); var questions = await Db.Queryable().OrderBy(x => x.SortNo).Where(x => x.SurveyId == id).ToListAsync(); var options = await Db.Queryable().OrderBy(x => x.SortNo).Where(x => x.SurveyId == id).ToListAsync(); data.Questions = Mapper.Map(questions).ToANew>(); data.Questions.ForEach(x => { x.Options = Mapper.Map(options.Where(o => o.SurveyQuestionId == x.Id)).ToANew>(); }); #region 是否存在已提交问卷数据 data.IsSubmit = await Db.Queryable() .Where(x => x.StaffId == App.User.StaffId && x.SurveyId == id) .WhereIF(openClassId != null, x => x.OpenClassId == openClassId) .WhereIF(openClassId != null && feedbackId != null, x => x.OpenClassId == openClassId && x.OpenClassFeedbackId == feedbackId) .AnyAsync(); #endregion #region 处理已提交信息 if (data.IsSubmit) { var recordId = await Db.Queryable() .Where(x => x.StaffId == App.User.StaffId && x.SurveyId == id) .WhereIF(openClassId != null, x => x.OpenClassId == openClassId) .WhereIF(openClassId != null && feedbackId != null, x => x.OpenClassId == openClassId && x.OpenClassFeedbackId == feedbackId) .Select(x => x.Id).FirstAsync(); var recordDetails = await Db.Queryable().Where(x => x.SurveyRecordId == recordId).ToListAsync(); var recordOptions = await Db.Queryable().Where(x => x.SurveyRecordId == recordId).OrderBy(x => x.OptionContent).ToListAsync(); data.Questions.ForEach(question => { switch (question.QuestionType) { case "Multiple": case "MultipleScore": question.Value1 = recordOptions.Where(x => x.SurveyQuestionId == question.Id).Select(x => x.OptionContent).ToList(); if (question.Options.Where(x => question.Value1.Contains(x.OptionNo) && x.IsOther == true).Any()) question.Options.ForEach(o => { if (question.Value1.Contains(o.OptionNo) && o.IsOther == true) o.OtherContent = recordOptions.Where(x => x.SurveyQuestionId == question.Id && x.SurveyQuestionOptionId == o.Id) .Select(x => x.Reverse1).FirstOrDefault() ?? ""; }); break; case "Single": case "ShortAnswer": case "SingleScore": case "Rate": case "Scale": question.Value = recordOptions.Where(x => x.SurveyQuestionId == question.Id).Select(x => x.OptionContent).FirstOrDefault() ?? ""; if (question.Options.Where(x => x.OptionNo == question.Value && x.IsOther == true).Any()) question.Options.ForEach(o => { if (o.OptionNo == question.Value && o.IsOther == true) o.OtherContent = recordOptions.Where(x => x.SurveyQuestionId == question.Id).Select(x => x.Reverse1).FirstOrDefault() ?? ""; }); break; default: break; } }); } #endregion return ServiceResult.OprateSuccess("成功", data); } public async Task SubmitESSData(long id, Ghre_SurveyExtend input, long? openClassId = null) { long? feedbackId = null; if (await Db.Queryable().Where(x => x.Source == "ParentTeacher" && (x.Id == id || x.Id == openClassId)).AnyAsync()) { var feedback = await Db.Queryable().Where(x => x.Source == "ParentTeacher" && (x.Id == id || x.Id == openClassId)).FirstAsync(); feedbackId = feedback.Id; openClassId = feedback.OpenClassId; id = feedback.SurveyId.Value; } else feedbackId = await Db.Queryable() .Where(x => x.Source == "Trainee" && (x.SurveyId == id || x.Id == openClassId) && x.OpenClassId == openClassId).Select(x => x.Id).FirstAsync(); var entity = await base.QueryById(id); var lastRecord = await Db.Queryable() .Where(x => x.StaffId == App.User.StaffId && x.SurveyId == id) .WhereIF(openClassId != null, x => x.OpenClassId == openClassId) .WhereIF(openClassId != null && feedbackId != null, x => x.OpenClassFeedbackId == feedbackId) .FirstAsync(); var surveyRecordId = lastRecord?.Id; await Db.Updateable() .SetColumns(it => new Ghre_SurveyRecord() { IsEnable = 0 }, true) .Where(x => x.StaffId == App.User.StaffId && x.SurveyId == id && x.IsEnable == 1 && x.SubmitDate != null) .ExecuteCommandAsync(); await Db.Updateable() .SetColumns(it => new Ghre_SurveyRecordDetail() { IsEnable = 0 }, true) .Where(x => x.SurveyRecordId == surveyRecordId) .ExecuteCommandAsync(); await Db.Updateable() .SetColumns(it => new Ghre_SurveyRecordOption() { IsEnable = 0 }, true) .Where(x => x.SurveyRecordId == surveyRecordId) .ExecuteCommandAsync(); var questions = await Db.Queryable().OrderBy(x => x.SortNo).Where(x => x.SurveyId == id).ToListAsync(); var options = await Db.Queryable().OrderBy(x => x.SortNo).Where(x => x.SurveyId == id).ToListAsync(); //var recordId = SnowFlakeSingle.Instance.NextId(); if (lastRecord.IsNullOrEmpty() || (lastRecord != null && lastRecord.SubmitDate != null) || surveyRecordId == 0) { var record = new Ghre_SurveyRecord() { //Id = recordId, SurveyId = id, StaffId = App.User.StaffId, Score = 0, AdjustScore = 0, SubmitDate = DateTime.Now, IsView = false, OpenClassId = openClassId, OpenClassFeedbackId = feedbackId }; surveyRecordId = await Db.Insertable(record).ExecuteReturnSnowflakeIdAsync(); } else { await Db.Updateable() .SetColumns(it => new Ghre_SurveyRecord() { SubmitDate = DateTime.Now }, true) .Where(x => x.Id == surveyRecordId) .ExecuteCommandAsync(); } decimal? totalScore = 0; for (int i = 0; i < input.Questions.Count; i++) { var question = input.Questions[i]; var recordDetailId = await Db.Insertable(new Ghre_SurveyRecordDetail() { SurveyId = id, SurveyRecordId = surveyRecordId, SurveyQuestionId = question.Id, StaffId = App.User.StaffId, Score = 0 }).ExecuteReturnSnowflakeIdAsync(); var recordOptions = new List(); decimal? score = 0; switch (question.QuestionType) { case "Multiple": case "MultipleScore": for (int j = 0; j < question.Value1.Count; j++) { var option1 = new Ghre_SurveyRecordOption() { SurveyId = id, SurveyRecordId = surveyRecordId, SurveyRecordDetailId = recordDetailId, SurveyQuestionId = question.Id, //SurveyQuestionOptionId = x.Id, StaffId = App.User.StaffId, Score = 0 }; if (question.Value1.Any()) { var questionOption1 = question.Options.Where(x => x.OptionNo == question.Value1[j]).FirstOrDefault(); option1.SurveyQuestionOptionId = questionOption1?.Id; option1.Score = questionOption1?.Score; option1.OptionContent = question.Value1[j]; if (questionOption1.IsOther == true) option1.Reverse1 = questionOption1.OtherContent; } score += option1.Score; await Db.Insertable(option1).ExecuteReturnSnowflakeIdAsync(); } break; case "Single": case "SingleScore": var option = new Ghre_SurveyRecordOption() { SurveyId = id, SurveyRecordId = surveyRecordId, SurveyRecordDetailId = recordDetailId, SurveyQuestionId = question.Id, //SurveyQuestionOptionId = x.Id, StaffId = App.User.StaffId, Score = 0 }; if (question.Value.IsNotEmptyOrNull()) { var questionOption = question.Options.Where(x => x.OptionNo == question.Value).FirstOrDefault(); option.SurveyQuestionOptionId = questionOption?.Id; option.Score = questionOption?.Score; option.OptionContent = question.Value; if (questionOption.IsOther == true) option.Reverse1 = questionOption.OtherContent; score += option.Score; await Db.Insertable(option).ExecuteReturnSnowflakeIdAsync(); } break; case "Rate": case "Scale": case "ShortAnswer": option = new Ghre_SurveyRecordOption() { SurveyId = id, SurveyRecordId = surveyRecordId, SurveyRecordDetailId = recordDetailId, SurveyQuestionId = question.Id, //SurveyQuestionOptionId = x.Id, StaffId = App.User.StaffId, Score = 0 }; option.OptionContent = question.Value; await Db.Insertable(option).ExecuteReturnSnowflakeIdAsync(); break; default: break; } await Db.Updateable() .SetColumns(it => new Ghre_SurveyRecordDetail() { Score = score, UpdateTime = DateTime.Now }) .Where(it => it.Id == recordDetailId) .ExecuteCommandAsync(); totalScore += score; } #region 修正反馈单 if (feedbackId != null) await Db.Updateable() .SetColumns(it => new Ghre_OpenClassFeedback() { Score = totalScore, Status = "Y", UpdateTime = DateTime.Now }) .Where(it => it.Id == feedbackId) .ExecuteCommandAsync(); #endregion return ServiceResult.OprateSuccess("提交成功!"); } public async Task Publish(long id) { var entity = await base.QueryById(id); if (entity.Status == "Publish") return ServiceResult.OprateSuccess("发布成功!"); await Db.Updateable() .SetColumns(it => new Ghre_Survey() { Status = "Publish" }) .Where(x => x.Id == id) .ExecuteCommandAsync(); var deptIds = new List(); var staffIds = new List(); if (entity.DeptId.IsNotEmptyOrNull()) deptIds = JsonHelper.JsonToObj>(entity.DeptId); if (entity.StaffId.IsNotEmptyOrNull()) staffIds = JsonHelper.JsonToObj>(entity.StaffId); var staffIds1 = await Db.Queryable().Where(x => x.DeptID != null && deptIds.Contains(x.DeptID.Value)).Select(x => x.StaffID).ToListAsync(); staffIds.AddRange(staffIds1); staffIds = staffIds.Distinct().ToList(); var userIds = await Db.Queryable().Where(x => x.UserStaffID != null && staffIds.Contains(x.UserStaffID.Value)).Select(x => new { x.UserId, x.UserPhotoUrl }).ToListAsync(); var ToDos = userIds.Select(x => new Ghrm_MessageToDo() { ToUserID = x.UserId, GroupType = "Survey", Tag = "问卷调查", DataID = 0, DataTable = "Ghre_Survey", WorkID = 0, Title = "问卷调查填写", Content = $"问卷名称:{entity.SurveyName}
填写时间:{DateTimeHelper.ConvertToMiniuteString(entity.BeginTime)}~{DateTimeHelper.ConvertToMiniuteString(entity.EndTime)}", PicType = "Url", JumpType = "link", WEBUrl = "/F_Ess_Nav_Survey/" + id, IsAgreeBtn = "N", IsRejectBtn = "N", SortNo = 1, IsDefault = 1 }).ToList(); await Db.Insertable(ToDos).ExecuteReturnIdentityAsync(); return ServiceResult.OprateSuccess("发布成功!"); } public async Task> QueryStatistic(long id) { var data = new Ghre_SurveyStatistic(); var entity = await base.QueryById(id); var deptIds = new List(); var staffIds = new List(); if (entity.DeptId.IsNotEmptyOrNull()) deptIds = JsonHelper.JsonToObj>(entity.DeptId); if (entity.StaffId.IsNotEmptyOrNull()) staffIds = JsonHelper.JsonToObj>(entity.StaffId); var staffIds1 = await Db.Queryable().Where(x => x.DeptID != null && deptIds.Contains(x.DeptID.Value)).Select(x => x.StaffID).ToListAsync(); staffIds.AddRange(staffIds1); staffIds = staffIds.Distinct().ToList(); data.All = staffIds.Count; data.Has = await Db.Queryable().Where(x => x.SurveyId == id).CountAsync(); data.New = await Db.Queryable().Where(x => x.SurveyId == id && x.SubmitDate.Value.Date == DateTime.Now.Date).CountAsync(); var recordOptions = await Db.Queryable().Where(x => x.SurveyId == id).ToListAsync(); var questions = await Db.Queryable().OrderBy(x => x.SortNo).Where(x => x.SurveyId == id).ToListAsync(); var options = await Db.Queryable().OrderBy(x => x.SortNo).Where(x => x.SurveyId == id).ToListAsync(); data.Questions = Mapper.Map(questions).ToANew>(); data.Questions.ForEach(x => { if (x.QuestionType == "Rate") { //var totals = recordOptions.Where(a => a.SurveyQuestionId == x.Id).ToList(); decimal total = recordOptions.Where(a => a.SurveyQuestionId == x.Id).Count(); for (int i = 1; i < 6; i++) { x.Table.Add(new Ghre_SurveyStatisticQuestionTable() { OptionNo = i.ObjToString(), OptionContent = i.ObjToString(), }); } x.Table.ForEach(o => { o.Count = recordOptions.Where(a => a.SurveyQuestionId == x.Id && a.OptionContent == o.OptionContent).Count(); if (o.Count > 0 && total > 0) { o.Percent1 = o.Count / total; o.Percent1 = o.Percent1 * 100; o.Percent = $"{o.Percent1.TrimDecimalString(2)}%"; } else o.Percent = $"0%"; }); } else if (x.QuestionType == "Scale") { //var totals = recordOptions.Where(a => a.SurveyQuestionId == x.Id).ToList(); decimal total = recordOptions.Where(a => a.SurveyQuestionId == x.Id).Count(); for (int i = 1; i < 11; i++) { x.Table.Add(new Ghre_SurveyStatisticQuestionTable() { OptionNo = i.ObjToString(), OptionContent = i.ObjToString(), }); } x.Table.ForEach(o => { o.Count = recordOptions.Where(a => a.SurveyQuestionId == x.Id && a.OptionContent == o.OptionContent).Count(); if (o.Count > 0 && total > 0) { o.Percent1 = o.Count / total; o.Percent1 = o.Percent1 * 100; o.Percent = $"{o.Percent1.TrimDecimalString(2)}%"; } else o.Percent = $"0%"; }); } else if (x.QuestionType == "ShortAnswer") { if (x.WordCloudKeywords.IsNotEmptyOrNull()) { var recordOption = recordOptions.Where(a => a.SurveyQuestionId == x.Id).FirstOrDefault(); var KeywordList = x.WordCloudKeywords.Split(','); x.Table = KeywordList.Select(x => new Ghre_SurveyStatisticQuestionTable { OptionContent = x, Count = 0, Percent1 = 0 }).ToList(); x.Table.ForEach(o => { string keyword = o.OptionContent; // 使用正则表达式匹配关键字(忽略大小写) o.Count = Regex.Matches(recordOption.OptionContent, Regex.Escape(keyword), RegexOptions.None).Count; }); } } else { x.Table = Mapper.Map(options.Where(o => o.SurveyQuestionId == x.Id)).ToANew>(); decimal total = recordOptions.Where(a => a.SurveyQuestionId == x.Id).Count(); x.Table.ForEach(o => { o.Count = recordOptions.Where(a => a.SurveyQuestionOptionId == o.Id).Count(); if (o.Count > 0 && total > 0) { o.Percent1 = o.Count / total; o.Percent1 = o.Percent1 * 100; o.Percent = $"{o.Percent1.TrimDecimalString(2)}%"; } else o.Percent = $"0%"; }); } }); return ServiceResult.OprateSuccess("查询成功!", data); } public async Task Start(long id) { //await Db.Updateable() // .SetColumns(it => new Ghre_SurveyRecord() { BeginTime = DateTime.Now }) // .Where(x => x.StaffId == App.User.StaffId && x.SurveyId == id) // .ExecuteCommandAsync(); var record = new Ghre_SurveyRecord() { SurveyId = id, StaffId = App.User.StaffId, Score = 0, AdjustScore = 0, IsView = false }; await Db.Insertable(record).ExecuteReturnSnowflakeIdAsync(); return ServiceResult.OprateSuccess("记录成功!"); } public async Task QueryRecord(long id) { dynamic obj = new ExpandoObject(); dynamic data = new ExpandoObject(); var entity = await base.QueryById(id); var questions = await Db.Queryable().OrderBy(x => x.SortNo).Where(x => x.SurveyId == id).ToListAsync(); var options = await Db.Queryable().OrderBy(x => x.SortNo).Where(x => x.SurveyId == id).ToListAsync(); data.Count = await Db.Queryable().Where(x => x.SurveyId == id).CountAsync(); var records = await Db.Queryable().Where(x => x.SurveyId == id).ToListAsync(); var recordOptions = await Db.Queryable().Where(x => x.SurveyId == id).ToListAsync(); #region columns var columns = new JArray(); var item = new JObject { new JProperty("Filed", "No"), new JProperty("Name", "序号"), }; columns.Add(item); item = new JObject { new JProperty("Filed", "StaffName"), new JProperty("Name", "填写人"), }; columns.Add(item); item = new JObject { new JProperty("Filed", "BeginTime"), new JProperty("Name", "开始时间"), }; columns.Add(item); item = new JObject { new JProperty("Filed", "SubmitTime"), new JProperty("Name", "提交时间"), }; columns.Add(item); item = new JObject { new JProperty("Filed", "Duration"), new JProperty("Name", "提交时长"), }; columns.Add(item); int i = 1; questions.ForEach(x => { item = new JObject { new JProperty("Filed", "Question"+i), new JProperty("Name", "题目"+i) }; columns.Add(item); i++; }); data.Columns = columns; #endregion #region 记录 var Records = new JArray(); for (int j = 1; j <= records.Count; j++) { var record = records[i]; var StaffName = await Db.Queryable().Where(x => x.StaffID == record.StaffId).Select(x => x.StaffID).FirstAsync(); item = new JObject { new JProperty("No", i), new JProperty("StaffName", StaffName), }; columns.Add(item); } #endregion obj.Data = data; obj.Success = true; obj.code = "0"; obj.type = "success"; obj.message = "查询成功!"; obj.Status = 200; return obj; } public async Task> QueryESS(QueryBody filter) { var deptId = await Db.Queryable().Where(x => x.StaffID == App.User.StaffId).Select(x => x.DeptID).FirstAsync(); var sql1 = @$"SELECT A.Id, A.SurveyClass, A.SurveyName, A.BeginTime, A.EndTime, B.SubmitDate, A.CreateTime,A.Status SurveyStatus,A.IsAnonymous FROM Ghre_Survey A LEFT JOIN Ghre_SurveyRecord B ON A.Id = B.SurveyId AND B.IsEnable = 1 and B.StaffId=9 WHERE A.IsEnable = 1 AND A.Status ! = 'Temporary' and ({App.User.StaffId} in (select value from openjson(A.StaffID)) or {deptId} in (select value from openjson(A.deptId)))"; if (string.IsNullOrWhiteSpace(filter.orderBy)) filter.orderBy = "CreateTime DESC"; if (filter.pageSize == 0) filter.pageSize = 10000; var countSql = @$" SELECT COUNT(1) FROM ({sql1}) A"; string conditions = " "; 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)) conditions = DealConditions(conditions, name, value); } sql1 += conditions; countSql += conditions; int total = await Db.Ado.GetIntAsync(countSql); var sql = "SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY " + filter.orderBy + ") NUM FROM (SELECT * FROM (" + sql1 + " "; 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); entitys.ForEach(async x => { x.IsAnonymous1 = x.IsAnonymous == true ? "是" : "否"; x.Status = x.SubmitDate != null ? "已填" : "未填"; x.IsSubmit = x.SubmitDate != null ? true : false; x.SurveyClass = await GetParaLabel("TrainSurveyClass", x.SurveyClass); if (x.BeginTime != null && x.EndTime != null) x.BeginEndTime = $"{DateTimeHelper.ConvertToMiniuteString(x.BeginTime)}~{DateTimeHelper.ConvertToMiniuteString(x.EndTime)}"; else x.BeginEndTime = "长期"; }); return new ServicePageResult(filter.pageNum, total, filter.pageSize, entitys); } }