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.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);
}
}