Пример #1
0
 /// <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));
        }