/// <summary> /// 保存健康基础信息数据 /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task <bool> SaveHealthInformationAsync(SaveHealthInformationContext context) { return(await MySqlHelper.TransactionAsync(async (conn, trans) => { context.AddInfos.InsertBatch(conn); context.AddOptions.InsertBatch(conn); foreach (var item in context.UpdateInfos) { await conn.UpdateAsync(item); } foreach (var item in context.UpdateOptions) { await conn.UpdateAsync(item); } foreach (var item in context.DeleteInfos) { await conn.DeleteAsync(item); } foreach (var item in context.DeleteOptions) { await conn.DeleteAsync(item); } return true; })); }
/// <summary> /// 保存健康基础信息前的数据验证 /// </summary> /// <param name="context"></param> /// <returns></returns> private (bool, ResponseDto) CheckSaveHealthInformation(SaveHealthInformationContext context) { if (context.RequestDto.Infos == null || !context.RequestDto.Infos.Any()) { return(false, Failed(ErrorCode.UserData, "请传入至少一条健康信息")); } var checkInfoOptionRes = context.RequestDto.Infos.All(info => { if (info.InformationType == HealthInformationTypeEnum.Decimal || info.InformationType == HealthInformationTypeEnum.String) { return(true); } if (info.Options == null || !info.Options.Any()) { return(false); } return(true); }); if (!checkInfoOptionRes) { return(false, Failed(ErrorCode.UserData, "选择题和判断题需要有选项")); } return(true, null); }
public async Task <IActionResult> SaveHealthInformationAsync([FromBody] SaveHealthInformationRequestDto requestDto) { var context = new SaveHealthInformationContext(requestDto); (var checkResult, var response) = CheckSaveHealthInformation(context); if (!checkResult) { return(response); } int infoIndex = 0; int optionIndex = 0; context.RequestDto.Infos.ForEach(a => { a.Sort = ++infoIndex; optionIndex = 0; if (a.Options == null) { a.Options = new List <SaveHealthInformationRequestDto.HealthInfoOption>(); } a.Options.ForEach(b => { b.Sort = ++optionIndex; }); }); context.AllInfos = (await new HealthInformationBiz().GetListAsync(true)).ToList(); context.AllOptions = (await new HealthInformationOptionBiz().GetListAsync(true)).ToList(); GenerateHealthInfoData(context); var result = await new HealthInformationBiz().SaveHealthInformationAsync(context); return(result ? Success() : Failed(ErrorCode.DataBaseError, "保存健康基础信息失败")); }
/// <summary> /// 组织待保存的健康信息数据 /// </summary> /// <param name="context"></param> private void GenerateHealthInfoData(SaveHealthInformationContext context) { foreach (var item in context.RequestDto.Infos) { if (item.Options == null) { item.Options = new List <SaveHealthInformationRequestDto.HealthInfoOption>(); } var infoModel = new HealthInformationModel { InformationType = item.InformationType.ToString(), Sort = item.Sort, SubjectName = item.SubjectName, SubjectUnit = item.SubjectUnit, SubjectPromptText = item.SubjectPromptText, IsSingleLine = item.IsSingleLine }; //选择题不需要单位、提示语、是否单行属性 if (item.InformationType == HealthInformationTypeEnum.Enum || item.InformationType == HealthInformationTypeEnum.Bool || item.InformationType == HealthInformationTypeEnum.Array) { infoModel.SubjectUnit = string.Empty; infoModel.SubjectPromptText = string.Empty; infoModel.IsSingleLine = false; } else if (item.InformationType == HealthInformationTypeEnum.String) { infoModel.SubjectUnit = string.Empty; } //新增 if (string.IsNullOrWhiteSpace(item.InformationGuid)) { //新增信息 infoModel.InformationGuid = Guid.NewGuid().ToString("N"); infoModel.CreatedBy = UserID; infoModel.LastUpdatedBy = UserID; context.AddInfos.Add(infoModel); //新增信息选择项 context.AddOptions.AddRange(item.Options.Select(a => new HealthInformationOptionModel { OptionGuid = Guid.NewGuid().ToString("N"), InformationGuid = infoModel.InformationGuid, OptionLabel = a.OptionLabel, IsDefault = a.IsDefault, Sort = a.Sort, CreatedBy = UserID, LastUpdatedBy = UserID })); } else//编辑 { var sourcesInfoModel = context.AllInfos.FirstOrDefault(a => a.InformationGuid == item.InformationGuid); infoModel.InformationGuid = item.InformationGuid; infoModel.CreatedBy = sourcesInfoModel.CreatedBy; infoModel.CreationDate = sourcesInfoModel.CreationDate; infoModel.LastUpdatedBy = UserID; infoModel.LastUpdatedDate = DateTime.Now; context.UpdateInfos.Add(infoModel); var sourceOptions = context.AllOptions.Where(a => a.InformationGuid == item.InformationGuid);//信息原有的选择项列表 if (item.Options != null && item.Options.Any()) { //信息编辑时新增的选项 context.AddOptions.AddRange(item.Options.Where(a => string.IsNullOrWhiteSpace(a.OptionGuid)).Select(a => new HealthInformationOptionModel { OptionGuid = Guid.NewGuid().ToString("N"), InformationGuid = infoModel.InformationGuid, OptionLabel = a.OptionLabel, IsDefault = a.IsDefault, Sort = a.Sort, CreatedBy = UserID, LastUpdatedBy = UserID })); //编辑时删除的选项 var deleteOptionModels = sourceOptions.GroupJoin(item.Options.Where(a => !string.IsNullOrWhiteSpace(a.OptionGuid)), l => l.OptionGuid, r => r.OptionGuid, (l, gs) => new { left = l, right = gs.FirstOrDefault() //一对一的关系,所以只会存在一条 }).Where(a => a.right == null) .Select(a => a.left); context.DeleteOptions.AddRange(deleteOptionModels); //信息编辑时编辑的选项 var updateOptionModels = sourceOptions.Join(item.Options.Where(a => !string.IsNullOrWhiteSpace(a.OptionGuid)), a => a.OptionGuid, b => b.OptionGuid, (a, b) => new HealthInformationOptionModel { OptionGuid = a.OptionGuid, InformationGuid = a.InformationGuid, OptionLabel = b.OptionLabel, IsDefault = b.IsDefault, Sort = b.Sort, CreatedBy = a.CreatedBy, CreationDate = a.CreationDate, LastUpdatedBy = UserID, LastUpdatedDate = DateTime.Now, OrgGuid = a.OrgGuid }); context.UpdateOptions.AddRange(updateOptionModels); } else { //编辑时删除的选项 //无选项列表,有可能是从选择题并未非选择题,需要删除原来的选项列表 context.DeleteOptions.AddRange(sourceOptions); } } } //已删除的信息 var deleteInfoModels = context.AllInfos.GroupJoin(context.RequestDto.Infos, l => l.InformationGuid, r => r.InformationGuid, (l, temp) => new { left = l, right = temp.FirstOrDefault() }).Where(a => a.right == null) .Select(a => a.left); context.DeleteInfos.AddRange(deleteInfoModels); //已删除的信息下的选择项 context.DeleteOptions.AddRange(context.AllOptions.Join(deleteInfoModels, a => a.InformationGuid, b => b.InformationGuid, (a, b) => a)); }