using Furion.DependencyInjection; using Nirvana.Common; using SqlSugar; using YBDevice.Body.BodyFatHelper; using YBDevice.Entity; namespace YBDevice.Body.Level { /// /// 安邦儿童等级 /// public class AbLevelService : ILevelService, ITransient { private readonly ISqlSugarRepository repository; private readonly SqlSugarClient dbClient; private readonly IBodyFatHelperService _bodyFatHelperService; public AbLevelService(ISqlSugarRepository sqlSugarRepository, IBodyFatHelperService bodyFatHelperService) { repository = sqlSugarRepository; dbClient = repository.Context; _bodyFatHelperService = bodyFatHelperService; } /// /// 标准 /// /// 性别,1-男,2-女 /// 月龄 /// 值 /// 1-bmi,2-身高,3-体重,4-头围 /// public async Task LevelAsync(GenderType sex, decimal month, decimal value, LevelType type) { YB_NewHeightStand data = null; if (type == LevelType.BMI) { //如果年龄小于6个月则使用6个月的标准 if (month < 6) { data = await dbClient.Queryable().Where(x => x.Sex == sex && x.Month <= 6).OrderBy(x => x.Month, OrderByType.Desc) .Select(x => new YB_NewHeightStand { f1sd = x.f1sd, median = x.median, z1sd = x.z1sd, z2sd = x.z2sd }) .FirstAsync(); } else { data = await dbClient.Queryable().Where(x => x.Sex == sex && x.Month <= month).OrderBy(x => x.Month, OrderByType.Desc) .Select(x => new YB_NewHeightStand { f1sd = x.f1sd, median = x.median, z1sd = x.z1sd, z2sd = x.z2sd }) .FirstAsync(); } } else if (type == LevelType.Height) { data = await dbClient.Queryable().Where(x => x.Sex == sex && x.Month <= month).OrderBy(x => x.Month, OrderByType.Desc) .Select(x => new YB_NewHeightStand { f3sd = x.f3sd, f2sd = x.f2sd, f1sd = x.f1sd, median = x.median, z1sd = x.z1sd, z2sd = x.z2sd, z3sd = x.z3sd }) .FirstAsync(); } else if (type == LevelType.Weight) { //如果月龄小于0.25则使用0.25的 month = month < 0.25m ? 0.25m : month; data = await dbClient.Queryable().Where(x => x.Sex == sex && x.Month <= month).OrderBy(x => x.Month, OrderByType.Desc) .Select(x => new YB_NewHeightStand { f3sd = x.f3sd, f2sd = x.f2sd, f1sd = x.f1sd, median = x.median, z1sd = x.z1sd, z2sd = x.z2sd, z3sd = x.z3sd }) .FirstAsync(); } else if (type == LevelType.Head) { data = await dbClient.Queryable().Where(x => x.Sex == sex && x.Month <= month).OrderBy(x => x.Month, OrderByType.Desc) .Select(x => new YB_NewHeightStand { f3sd = x.f3sd, f2sd = x.f2sd, f1sd = x.f1sd, median = x.median, z1sd = x.z1sd, z2sd = x.z2sd, z3sd = x.z3sd }) .FirstAsync(); } var returndata = new LevelS2SDto { Level = GetLevelVal(data, value, type), list = data == null ? new List() : GetStandList(data, type), Data = data, Media = data != null ? data.median : 0, HeightLevel = type == LevelType.Height ? GetHeightLevelVal(data, value) : ChildHeightLevel.Normal }; //如果年龄大于16岁则使用成人BMI标准 if (month > FamilyTypeLevel.AdultMonth) { if (type == LevelType.BMI) { returndata.list = _bodyFatHelperService.bmi_value(sex, 0).Select(x => new MeasureInfoItemValue { color = x.color, maxvalue = x.maxvalue, minvalue = x.minvalue, text = x.text }).ToList(); returndata.Media = _bodyFatHelperService.bmi_stand(sex, 0).minvalue; } } else { if (data == null) { return new LevelS2SDto(); } } returndata.Color = GetLevelColor(returndata.Level, type, returndata.list); return returndata; } /// /// 获取等级值 /// /// /// 当前值 /// 1-bmi,2-身高,3-体重,4-头围 /// private string GetLevelVal(YB_NewHeightStand data, decimal val, LevelType type = LevelType.BMI) => (data, val, type) switch { _ when data == null => LevelConst.Error, _ when type == LevelType.BMI && val <= data.f1sd && val > 0 => BMILevelConst.Thin, _ when type == LevelType.BMI && val <= data.z1sd && val > data.f1sd => BMILevelConst.Normal, _ when type == LevelType.BMI && val <= data.z2sd && val > data.z1sd => BMILevelConst.OverWeight, _ when type == LevelType.BMI && val > data.z2sd => BMILevelConst.Fat, _ when type == LevelType.Height && val <= data.f2sd && val > 0 => AbHeightLevelConst.MoreLow, _ when type == LevelType.Height && val <= data.f1sd && val > data.f2sd => AbHeightLevelConst.Low, _ when type == LevelType.Height && val <= data.median && val > data.f1sd => AbHeightLevelConst.LittleLow, _ when type == LevelType.Height && val <= data.z1sd && val > data.median => AbHeightLevelConst.Normal, _ when type == LevelType.Height && val <= data.z2sd && val > data.z1sd => AbHeightLevelConst.LittleHeight, _ when type == LevelType.Height && val <= data.z3sd && val > data.z2sd => AbHeightLevelConst.Height, _ when type == LevelType.Height && val > data.z3sd => AbHeightLevelConst.MoreHeight, _ when type == LevelType.Weight && val <= data.f2sd && val > 0 => AbWeightLevelConst.MoreLow, _ when type == LevelType.Weight && val <= data.f1sd && val > data.f2sd => AbWeightLevelConst.Low, _ when type == LevelType.Weight && val <= data.median && val > data.f1sd => AbWeightLevelConst.LittleLow, _ when type == LevelType.Weight && val <= data.z1sd && val > data.median => AbWeightLevelConst.Normal, _ when type == LevelType.Weight && val <= data.z2sd && val > data.z1sd => AbWeightLevelConst.LittleHeight, _ when type == LevelType.Weight && val <= data.z3sd && val > data.z2sd => AbWeightLevelConst.LittleHeight, _ when type == LevelType.Weight && val > data.z3sd => AbWeightLevelConst.MoreHeight, _ when type == LevelType.Head && val <= data.f2sd && val > 0 => AbWeightLevelConst.MoreLow, _ when type == LevelType.Head && val <= data.f1sd && val > data.f2sd => AbWeightLevelConst.Low, _ when type == LevelType.Head && val <= data.median && val > data.f1sd => AbWeightLevelConst.LittleLow, _ when type == LevelType.Head && val <= data.z1sd && val > data.median => AbWeightLevelConst.Normal, _ when type == LevelType.Head && val <= data.z2sd && val > data.z1sd => AbWeightLevelConst.LittleHeight, _ when type == LevelType.Head && val <= data.z3sd && val > data.z2sd => AbWeightLevelConst.LittleHeight, _ when type == LevelType.Head && val > data.z3sd => AbWeightLevelConst.MoreHeight, _ => LevelConst.Error }; /// /// 获取身高等级值 /// /// /// /// private ChildHeightLevel GetHeightLevelVal(YB_NewHeightStand data, decimal val) => (data, val) switch { _ when data == null => ChildHeightLevel.Error, _ when val > 0 && val <= data.f2sd => ChildHeightLevel.MoreLow, _ when val > data.f2sd && val <= data.f1sd => ChildHeightLevel.Low, _ when val > data.f1sd && val <= data.median => ChildHeightLevel.LittleLow, _ when val > data.median && val <= data.z1sd => ChildHeightLevel.Normal, _ when val > data.z1sd && val <= data.z2sd => ChildHeightLevel.LittleHeight, _ when val > data.z2sd && val <= data.z3sd => ChildHeightLevel.Height, _ when val > data.z3sd => ChildHeightLevel.MoreHeight, _ => ChildHeightLevel.Error }; /// /// 根据等级获取标准颜色 /// /// 等级标准 /// 1-bmi,2-身高,3-体重,4-头围 /// 标准列表 /// private string GetLevelColor(string level, LevelType type, List list) { var data = list.Where(x => x.text == level).FirstOrDefault(); if (data == null) { return LevelColor.Error; } return data.color; } /// /// 获取标准列表 /// /// /// 1-bmi,2-身高,3-体重,4-头围 /// private List GetStandList(YB_NewHeightStand data, LevelType type) => type switch { LevelType.BMI => new List { new MeasureInfoItemValue{ maxvalue = data.f1sd, minvalue=0, text = BMILevelConst.Thin, color = LevelColor.Thin }, new MeasureInfoItemValue{ maxvalue = data.z1sd, minvalue=data.f1sd, text = BMILevelConst.Normal, color = LevelColor.Normal }, new MeasureInfoItemValue{ maxvalue = data.z2sd, minvalue=data.z1sd, text = BMILevelConst.OverWeight, color = LevelColor.OverWeight }, new MeasureInfoItemValue{ maxvalue = 50, minvalue=data.z2sd, text = BMILevelConst.Fat, color = LevelColor.Fat } }, LevelType.Height => new List { new MeasureInfoItemValue{ maxvalue = data.f3sd, minvalue=0, text = "", color = LevelColor.Error, Level = (int)ChildHeightLevel.MoreLow }, new MeasureInfoItemValue{ maxvalue = data.f2sd, minvalue=data.f3sd, text = AbHeightLevelConst.MoreLow, color = LevelColor.Fat, Level = (int)ChildHeightLevel.MoreLow }, new MeasureInfoItemValue{ maxvalue = data.f1sd, minvalue=data.f2sd, text = AbHeightLevelConst.Low, color = LevelColor.OverWeight, Level = (int)ChildHeightLevel.Low }, new MeasureInfoItemValue{ maxvalue = data.median, minvalue=data.f1sd, text = AbHeightLevelConst.LittleLow, color = LevelColor.Thin, Level = (int)ChildHeightLevel.LittleLow }, new MeasureInfoItemValue{ maxvalue = data.z1sd, minvalue=data.median, text = AbHeightLevelConst.Normal, color = LevelColor.Normal, Level = (int)ChildHeightLevel.Normal }, new MeasureInfoItemValue{ maxvalue = data.z2sd, minvalue=data.z1sd, text = AbHeightLevelConst.LittleHeight, color = LevelColor.LittleFine, Level = (int)ChildHeightLevel.LittleHeight }, new MeasureInfoItemValue{ maxvalue = data.z3sd, minvalue=data.z2sd, text = AbHeightLevelConst.Height, color = LevelColor.MoreFine, Level = (int)ChildHeightLevel.Height }, new MeasureInfoItemValue{ maxvalue = 0, minvalue=data.z3sd, text = AbHeightLevelConst.MoreHeight, color = LevelColor.Fine, Level = (int)ChildHeightLevel.MoreHeight } }, LevelType.Weight => new List { new MeasureInfoItemValue{ maxvalue = data.f3sd, minvalue=0, text = "", color = LevelColor.Error }, new MeasureInfoItemValue{ maxvalue = data.f2sd, minvalue=data.f3sd, text = AbWeightLevelConst.MoreLow, color = LevelColor.Fat }, new MeasureInfoItemValue{ maxvalue = data.f1sd, minvalue=data.f2sd, text = AbWeightLevelConst.Low, color = LevelColor.OverWeight }, new MeasureInfoItemValue{ maxvalue = data.median, minvalue=data.f1sd, text = AbWeightLevelConst.LittleLow, color = LevelColor.Thin }, new MeasureInfoItemValue{ maxvalue = data.z1sd, minvalue=data.median, text = AbWeightLevelConst.Normal, color = LevelColor.Normal }, new MeasureInfoItemValue{ maxvalue = data.z2sd, minvalue=data.z1sd, text = AbWeightLevelConst.LittleHeight, color = LevelColor.Thin }, new MeasureInfoItemValue{ maxvalue = data.z3sd, minvalue=data.z2sd, text = AbWeightLevelConst.Height, color = LevelColor.OverWeight }, new MeasureInfoItemValue{ maxvalue = 0, minvalue=data.z3sd, text = AbWeightLevelConst.MoreHeight, color = LevelColor.Fat } }, LevelType.Head => new List { new MeasureInfoItemValue{ maxvalue = data.f3sd, minvalue=0, text = "", color = LevelColor.Error }, new MeasureInfoItemValue{ maxvalue = data.f2sd, minvalue=data.f3sd, text = AbWeightLevelConst.MoreLow, color = LevelColor.Fat }, new MeasureInfoItemValue{ maxvalue = data.f1sd, minvalue=data.f2sd, text = AbWeightLevelConst.Low, color = LevelColor.OverWeight }, new MeasureInfoItemValue{ maxvalue = data.median, minvalue=data.f1sd, text = AbWeightLevelConst.LittleLow, color = LevelColor.Thin }, new MeasureInfoItemValue{ maxvalue = data.z1sd, minvalue=data.median, text = AbWeightLevelConst.Normal, color = LevelColor.Normal }, new MeasureInfoItemValue{ maxvalue = data.z2sd, minvalue=data.z1sd, text = AbWeightLevelConst.LittleHeight, color = LevelColor.OverWeight }, new MeasureInfoItemValue{ maxvalue = data.z3sd, minvalue=data.z2sd, text = AbWeightLevelConst.Height, color = LevelColor.Fat }, new MeasureInfoItemValue{ maxvalue = 0, minvalue=data.z3sd, text = AbWeightLevelConst.MoreHeight, color = LevelColor.Fat } }, _ => new List() }; /// /// 标准 /// /// 性别,1-男,2-女 /// 出生年龄 /// 值 /// 1-bmi,2-身高,3-体重,4-头围 /// public async Task LevelAsync(GenderType sex, DateTime brithday, decimal value, LevelType type) { decimal month = brithday.ToMonth(true); return await LevelAsync(sex, month, value, type); } /// /// 标准 /// /// 性别,1-男,2-女 /// 出生年龄 /// 值 /// 1-bmi,2-身高,3-体重,4-头围 /// public async Task LevelAsync(GenderType sex, DateTime? brithday, decimal value, LevelType type) { if (brithday == null) { return new LevelS2SDto(); } decimal month = brithday.Value.ToMonth(true); return await LevelAsync(sex, month, value, type); } } }