using Furion; using Furion.DependencyInjection; using Hinse.Health.Service; using Nirvana.Common; using YBDevice.Core; using YBDevice.Entity; namespace YBDevice.Body.BodyFatHelper { /// /// 体脂计算算法 /// public class BodyFatHelperService : IBodyFatHelperService, ITransient { private static string RequestUrl = App.Configuration["BodyApiSettings:ApiUrl"]; private static string RequestaccessSecret = App.Configuration["BodyApiSettings:AccessSecret"]; private static string RequestaccessKey = App.Configuration["BodyApiSettings:AccessKey"]; private readonly IHttpClientFactory _clientFactory; private readonly IHttp _http; private readonly IHealthCalcService _healthcalcService; public BodyFatHelperService(IHttpClientFactory clientFactory, IHttp http, IHealthCalcService healthCalcService) { _clientFactory = clientFactory; _http = http; _healthcalcService = healthCalcService; } /// /// 身体得分 /// /// /// public static double score(float bmi) => bmi switch { _ when bmi < 21.6 => bmi / 21.6 * 100, _ when bmi >= 21.6 => 21.6 / bmi * 100, _ => 60 }; /// /// 体型 /// /// 体脂率 /// 肌肉率 /// public static string body(string fat_r, string muscle) => (fat_r, muscle) switch { _ when fat_r == NewLevelModel.Error || muscle == NewLevelModel.Error => NewLevelModel.Error, _ when (fat_r == NewLevelModel.high || fat_r == NewLevelModel.mhigh) && muscle == NewLevelModel.notenu => NewLevelModel.hidefat, _ when (fat_r == NewLevelModel.high || fat_r == NewLevelModel.mhigh) && muscle == NewLevelModel.normal => NewLevelModel.fat, _ when (fat_r == NewLevelModel.high || fat_r == NewLevelModel.mhigh) && muscle == NewLevelModel.fine => NewLevelModel.strongfat, _ when (fat_r == NewLevelModel.normal) && muscle == NewLevelModel.notenu => NewLevelModel.notenumuscle, _ when (fat_r == NewLevelModel.normal) && muscle == NewLevelModel.normal => NewLevelModel.normalfat, _ when (fat_r == NewLevelModel.normal) && muscle == NewLevelModel.fine => NewLevelModel.normalmuscle, _ when (fat_r == NewLevelModel.flat) && muscle == NewLevelModel.notenu => NewLevelModel.thin, _ when (fat_r == NewLevelModel.flat) && muscle == NewLevelModel.normal => NewLevelModel.thinmuscle, _ when (fat_r == NewLevelModel.flat) && muscle == NewLevelModel.fine => NewLevelModel.perfetmuscle, _ => NewLevelModel.hidefat }; /// /// 皮下脂肪标准 /// /// /// /// /// /// public static string sfr(float sfr, double weight, int age, GenderType sex) => (weight, age, sex) switch { _ when sex == GenderType.Male && sfr < 7 && sfr > 0 => NewLevelModel.notenu, _ when sex == GenderType.FeMale && sfr < 11 && sfr > 0 => NewLevelModel.notenu, _ when sex == GenderType.Male && sfr >= 7 && sfr < 15 => NewLevelModel.normal, _ when sex == GenderType.FeMale && sfr >= 11 && sfr < 17 => NewLevelModel.normal, _ when sex == GenderType.Male && sfr >= 15 => NewLevelModel.high, _ when sex == GenderType.FeMale && sfr >= 17 => NewLevelModel.high, _ => NewLevelModel.Error }; /// /// 体重标准 /// /// /// /// /// /// public static string weight(double weight, int age, GenderType sex, int height) => (weight, age, sex, height) switch { _ when weight < 18.5 * Math.Pow(height / 100, 2) => NewLevelModel.thin, _ when weight >= 18.5 * Math.Pow(height / 100, 2) && weight < 25 * Math.Pow(height / 100, 2) => NewLevelModel.normal, _ when weight >= 25 * Math.Pow(height / 100, 2) && weight < 30 * Math.Pow(height / 100, 2) => NewLevelModel.fat, _ when weight >= 30 * Math.Pow(height / 100, 2) => NewLevelModel.mfat, _ => NewLevelModel.thin }; /// /// bmi标准 /// /// /// /// /// /// /// public static string bmi(float bmi, double weight, int age, GenderType sex, int height) => (weight, age, sex) switch { _ when bmi < 18.5 => NewLevelModel.thin, _ when bmi >= 18.5 && bmi < 25 => NewLevelModel.normal, _ when bmi >= 25 && bmi < 30 => NewLevelModel.fat, _ when bmi >= 30 => NewLevelModel.mfat, _ => NewLevelModel.thin }; /// /// 水份标准 /// /// /// /// /// /// public static string water(float water, double weight, int age, GenderType sex) => (water, weight, age, sex) switch { _ when water <= 0 => NewLevelModel.Error, _ when sex == GenderType.Male && water < 55 => NewLevelModel.notenu, _ when sex == GenderType.FeMale && water < 45 => NewLevelModel.notenu, _ when sex == GenderType.Male && water < 65 && water >= 55 => NewLevelModel.normal, _ when sex == GenderType.FeMale && water < 60 && water >= 45 => NewLevelModel.normal, _ when sex == GenderType.Male && water >= 65 => NewLevelModel.fine, _ when sex == GenderType.FeMale && water >= 60 => NewLevelModel.fine, _ => NewLevelModel.notenu }; public static string visceral(float visceral, double weight, int age, GenderType sex) => (visceral, weight, age, sex) switch { _ when visceral <= 0 => NewLevelModel.Error, _ when visceral < 9 && visceral > 0 => NewLevelModel.normal, _ when visceral < 14 && visceral >= 9 => NewLevelModel.alert, _ when visceral >= 14 => NewLevelModel.danger, _ => NewLevelModel.Error }; public static string protein(float protein, double weight, int age, GenderType sex) => (protein, weight, age, sex) switch { _ when protein <= 0 => NewLevelModel.Error, _ when sex == GenderType.Male && protein < 16 => NewLevelModel.notenu, _ when sex == GenderType.FeMale && protein < 14 => NewLevelModel.notenu, _ when sex == GenderType.Male && protein >= 16 && protein < 18 => NewLevelModel.normal, _ when sex == GenderType.FeMale && protein >= 14 && protein < 16 => NewLevelModel.normal, _ when sex == GenderType.Male && protein >= 18 => NewLevelModel.fine, _ when sex == GenderType.FeMale && protein >= 16 => NewLevelModel.fine, _ => NewLevelModel.notenu }; /// /// 内脂标准 /// /// /// /// /// /// /// /// 蛋白质标准 /// /// /// /// /// /// /// /// 肌肉率标准 /// /// /// /// /// /// public static string muscle(float muscle, double weight, int age, GenderType sex) => (muscle, weight, age, sex) switch { _ when muscle <= 0 => NewLevelModel.Error, _ when sex == GenderType.Male && muscle < 40 => NewLevelModel.notenu, _ when sex == GenderType.FeMale && muscle < 30 => NewLevelModel.notenu, _ when sex == GenderType.Male && muscle >= 40 && muscle < 60 => NewLevelModel.normal, _ when sex == GenderType.FeMale && muscle >= 30 && muscle < 50 => NewLevelModel.normal, _ when sex == GenderType.Male && muscle >= 60 => NewLevelModel.fine, _ when sex == GenderType.FeMale && muscle >= 50 => NewLevelModel.fine, _ => NewLevelModel.notenu }; /// /// 基础代谢计算标准 /// /// /// /// /// /// public static string kcal(float kcal, double weight, int age, GenderType sex) => (kcal, weight, age, sex) switch { _ when kcal <= 0 => NewLevelModel.Error, _ when age > 0 && age < 3 && ((kcal < (60.9 * weight - 54) && sex == GenderType.Male) || (kcal < (61.0 * weight - 51) && sex == GenderType.FeMale)) => NewLevelModel.flat, _ when age > 0 && age < 3 && ((kcal >= (60.9 * weight - 54) && sex == GenderType.Male) || (kcal >= (61.0 * weight - 51) && sex == GenderType.FeMale)) => NewLevelModel.fine, _ when age >= 3 && age < 10 && ((kcal < (22.7 * weight + 495) && sex == GenderType.Male) || (kcal < (22.5 * weight + 499) && sex == GenderType.FeMale)) => NewLevelModel.flat, _ when age >= 3 && age < 10 && ((kcal >= (22.7 * weight + 495) && sex == GenderType.Male) || (kcal >= (22.5 * weight + 499) && sex == GenderType.FeMale)) => NewLevelModel.fine, _ when age >= 10 && age < 18 && ((kcal < (17.5 * weight + 651) && sex == GenderType.Male) || (kcal < (12.2 * weight + 746) && sex == GenderType.FeMale)) => NewLevelModel.flat, _ when age >= 10 && age < 18 && ((kcal >= (17.5 * weight + 651) && sex == GenderType.Male) || (kcal >= (12.2 * weight + 746) && sex == GenderType.FeMale)) => NewLevelModel.fine, _ when age >= 18 && age < 30 && ((kcal < (15.3 * weight + 679) && sex == GenderType.Male) || (kcal < (14.7 * weight + 496) && sex == GenderType.FeMale)) => NewLevelModel.flat, _ when age >= 18 && age < 30 && ((kcal >= (15.3 * weight + 679) && sex == GenderType.Male) || (kcal >= (14.7 * weight + 496) && sex == GenderType.FeMale)) => NewLevelModel.fine, _ when age >= 30 && ((kcal < (11.6 * weight + 879) && sex == GenderType.Male) || (kcal < (8.7 * weight + 820) && sex == GenderType.FeMale)) => NewLevelModel.flat, _ when age >= 30 && ((kcal >= (11.6 * weight + 879) && sex == GenderType.Male) || (kcal >= (8.7 * weight + 820) && sex == GenderType.FeMale)) => NewLevelModel.fine, _ => NewLevelModel.flat }; /// /// 骨重标准 /// /// 骨重 /// /// /// public static string bone(float bone, double weight, GenderType sex) => (bone, weight, sex) switch { //_ when bone <= 0 => NewLevelModel.Error, //_ when sex == GenderType.Male && ((weight < 60 && bone < 2.4) || (weight >= 60 && weight < 75 && bone < 2.8) || (weight >= 75 && bone < 3.1)) => //NewLevelModel.notenu, //_ when sex == GenderType.FeMale && ((weight < 45 && bone < 1.7) || (weight >= 45 && weight < 60 && bone < 2.1) || (weight >= 60 && bone < 2.4)) => //NewLevelModel.notenu, //_ when sex == GenderType.Male && ((weight < 60 && bone >= 2.4 && bone <= 2.6) || (weight >= 60 && weight < 75 && bone >= 2.8 && bone <= 30) || (weight >= 75 && bone >= 3.1 && bone <= 3.3)) => //NewLevelModel.normal, //_ when sex == GenderType.FeMale && ((weight < 45 && bone >= 1.7 && bone <= 1.9) || (weight >= 45 && weight < 60 && bone <= 2.3 && bone >= 2.1) || (weight >= 60 && bone <= 2.6 && bone >= 2.4)) => //NewLevelModel.normal, //_ when sex == GenderType.Male && ((weight < 60 && bone > 2.6) || (weight >= 60 && weight < 75 && bone > 3.0) || (weight >= 75 && bone > 3.3)) => //NewLevelModel.fine, //_ when sex == GenderType.FeMale && ((weight < 45 && bone > 1.9) || (weight >= 45 && weight < 60 && bone > 2.3) || (weight >= 60 && bone > 2.6)) => //NewLevelModel.fine, //_ => NewLevelModel.notenu _ when bone <= 0 => NewLevelModel.Error, _ when sex == GenderType.Male && ((weight < 60 && bone < 2.4.ToDecimal().ToFloat()) || (weight >= 60 && weight < 75 && bone < 2.8.ToDecimal().ToFloat()) || (weight >= 75 && bone < 3.1.ToDecimal().ToFloat())) => NewLevelModel.notenu, _ when sex == GenderType.FeMale && ((weight < 45 && bone < 1.7.ToDecimal().ToFloat()) || (weight >= 45 && weight < 60 && bone < 2.1.ToDecimal().ToFloat()) || (weight >= 60 && bone < 2.4.ToDecimal().ToFloat())) => NewLevelModel.notenu, _ when sex == GenderType.Male && ((weight < 60 && bone >= 2.4.ToDecimal().ToFloat() && bone <= 2.6.ToDecimal().ToFloat()) || (weight >= 60 && weight < 75 && bone >= 2.8.ToDecimal().ToFloat() && bone <= 3.0.ToDecimal().ToFloat()) || (weight >= 75 && bone >= 3.1.ToDecimal().ToFloat() && bone <= 3.3.ToDecimal().ToFloat())) => NewLevelModel.normal, _ when sex == GenderType.FeMale && ((weight < 45 && bone >= 1.7.ToDecimal().ToFloat() && bone <= 1.9) || (weight >= 45 && weight < 60 && bone <= 2.3.ToDecimal().ToFloat() && bone >= 2.1.ToDecimal().ToFloat()) || (weight >= 60 && bone <= 2.6 && bone >= 2.4)) => NewLevelModel.normal, _ when sex == GenderType.Male && ((weight < 60 && bone > 2.6.ToDecimal().ToFloat()) || (weight >= 60 && weight < 75 && bone > 3.0.ToDecimal().ToFloat()) || (weight >= 75 && bone > 3.3.ToDecimal().ToFloat())) => NewLevelModel.fine, _ when sex == GenderType.FeMale && ((weight < 45 && bone > 1.9.ToDecimal().ToFloat()) || (weight >= 45 && weight < 60 && bone > 2.3.ToDecimal().ToFloat()) || (weight >= 60 && bone > 2.6.ToDecimal().ToFloat())) => NewLevelModel.fine, _ => NewLevelModel.notenu }; /// /// 体龄计算方法 /// /// /// /// public static string bodyage(int bodyage, int age) => (bodyage, age) switch { _ when bodyage > age => NewLevelModel.big, _ when bodyage == age => NewLevelModel.normal, _ when bodyage <= 0 => NewLevelModel.Error, _ => NewLevelModel.fine }; /// /// bmi 计算标准 /// /// BMI /// public static string bmi(float bmi) => bmi switch { _ when bmi < 18.5 && bmi > 0 => BMILevelConst.Thin, _ when bmi >= 18.5 && bmi < 25 => BMILevelConst.Normal, _ when bmi >= 25 && bmi < 30 => BMILevelConst.OverWeight, _ when bmi >= 30 && bmi <= 50 => BMILevelConst.Fat, _ => LevelConst.Error }; /// /// 脂肪率标准计算 /// /// 脂肪率 /// 0-女,1-男 /// 年龄 /// public static string Fat_r(float fat_r, GenderType sex, int age) => (fat_r, sex, age) switch { _ when sex == GenderType.Male && age < 30 && fat_r < 10 && fat_r > 0 => NewLevelModel.flat, _ when sex == GenderType.Male && age >= 30 && fat_r < 11 && fat_r > 0 => NewLevelModel.flat, _ when sex == GenderType.FeMale && age < 30 && fat_r < 20 && fat_r > 0 => NewLevelModel.flat, _ when sex == GenderType.FeMale && age >= 30 && fat_r < 21 && fat_r > 0 => NewLevelModel.flat, _ when sex == GenderType.Male && age < 30 && fat_r >= 10 && fat_r < 21 => NewLevelModel.normal, _ when sex == GenderType.Male && age >= 30 && fat_r >= 11 && fat_r < 22 => NewLevelModel.normal, _ when sex == GenderType.FeMale && age < 30 && fat_r >= 20 && fat_r < 31 => NewLevelModel.normal, _ when sex == GenderType.FeMale && age >= 30 && fat_r >= 21 && fat_r < 32 => NewLevelModel.normal, _ when sex == GenderType.Male && age < 30 && fat_r > 21 && fat_r < 26 => NewLevelModel.high, _ when sex == GenderType.Male && age >= 30 && fat_r >= 22 && fat_r < 27 => NewLevelModel.high, _ when sex == GenderType.FeMale && age < 30 && fat_r >= 31 && fat_r < 38 => NewLevelModel.high, _ when sex == GenderType.FeMale && age >= 30 && fat_r >= 32 && fat_r < 39 => NewLevelModel.high, _ when sex == GenderType.Male && age < 30 && fat_r >= 26 && fat_r <= 80 => NewLevelModel.mhigh, _ when sex == GenderType.Male && age >= 30 && fat_r >= 27 && fat_r <= 80 => NewLevelModel.mhigh, _ when sex == GenderType.FeMale && age < 30 && fat_r >= 38 && fat_r <= 80 => NewLevelModel.mhigh, _ when sex == GenderType.FeMale && age >= 30 && fat_r >= 39 && fat_r <= 80 => NewLevelModel.mhigh, _ => NewLevelModel.Error }; /// /// 计算算法 /// /// 体重 /// 身高 /// 年龄 /// 阻抗 /// 性别,1-男,2-女 /// public static BodyfatItem GetBodyfatResults(double weight, double height, int age, int adc, int sex) { BodyfatItem bodyfatItem = new BodyfatItem(); double mheight = height / 100;//米为单位的身高 if ((weight <= 0.0) || (weight > 220.0) || (height <= 0.0) || (height > 270.0) || (age <= 0) || (age > 120) || (adc <= 0) || (adc > 0x3e8) || (sex < 0) || (sex > 1)) { object[] arg = new object[] { weight, height, age, adc, sex }; if (weight != 0 && height != 0) bodyfatItem.bmi = (((double)((int)((weight / (mheight * mheight)) * 10.0))) / 10.0).ToString("0.0"); return bodyfatItem; } double num = (double)(int)(weight / (mheight * mheight) * 10.0) / 10.0; double num2 = 0.0; double num3 = 0.0; double num4 = 0.0; double num5 = 0.0; double num6 = 0.0; double num7 = 0.0; double num8 = 0.0; double num9 = 0.0; double num10 = 0.0; double num11 = 0.0; if (sex == 1) { num2 = 0.015 * weight + (2.0 - 0.00055 * (double)adc) * height / 100.0 - 1.15; num3 = (0.0 - (0.00115 * (double)adc + 0.01)) * weight + (49.64 - 0.031 * (double)adc) * height / 100.0 + (double)adc * 0.08 + (double)age * 0.04 + 15.4; num4 = 1000000.0 / (num * (2.688 * (double)adc - 78.28)) - (double)(10058 / adc) - 0.22 * (double)age + 52.6; num5 = -930000.0 / num / (1.966 * (double)adc - 58.46) + (double)(13176 / adc) - 0.06 * (double)age + 40.0; num6 = 0.898 * num5; num7 = 0.895 * num4; num8 = 0.8 * (100.0 - num5 - num4 - num2 / weight); num9 = 0.304 * weight - 25.58 * height / 100.0 + 0.131 * (double)age + 0.005 * (double)adc + 22.0; num10 = (9.0 + 0.0015 * (double)adc) * weight + (1350.0 - 0.88 * (double)adc) * height / 100.0 + (double)(188 / age) + 0.748 * (double)adc - 1053.0; num11 = (double)age * (1.0 + 0.012 * (num - 1.0)) - 21.0 + (double)(30 - age) * 0.35 + (double)(adc - 450) * 0.02 + 11.0; } else { num2 = 2.2E-05 * (double)adc * weight + (4.99 - 0.00284 * (double)adc) * height / 100.0 + 0.0012 * (double)adc - 4.45; num3 = (0.0 - (0.00115 * (double)adc + 0.01)) * weight + (49.64 - 0.031 * (double)adc) * height / 100.0 + (double)adc * 0.08 + (double)age * 0.04 + 6.0; num4 = 1000000.0 / (num * (2.467 * (double)adc - 75.37)) - (double)(14215 / adc) - 0.034 * (double)age + 43.2; num5 = -3030000.0 / (num + 20.0) / (1.966 * (double)adc - 58.46) + (double)(28176 / adc) - 0.06 * (double)age + 51.0; num6 = 0.876 * num5 + 1.66; num7 = 0.857 * num4 - 0.36; num8 = 0.75 * (100.0 - num5 - num4 - num2 / weight); num9 = 0.304 * weight - 25.58 * height / 100.0 + 0.131 * (double)age + 0.005 * (double)adc + 22.0; num10 = (0.00307 * (double)adc + 1.5) * weight + (1459.0 - 0.989 * (double)adc) * height / 100.0 + (double)age * 0.9 + 0.923 * (double)adc - 950.0; num11 = (double)age * (0.95 + 0.02 * (num - 21.2)) + (double)(adc - 500) * 0.02; } bodyfatItem.bmi = num.ToString("0.0"); num2 = ((num2 > weight * 0.15) ? (weight * 0.15) : num2); bodyfatItem.bm = ((num2 < weight * 0.02) ? (weight * 0.02) : num2).ToString("0.0"); num3 = ((num3 > 75.0) ? 75.0 : num3); bodyfatItem.rom = ((num3 < 15.0) ? 15.0 : num3).ToString("0.0"); num4 = ((num4 > 70.0) ? 70.0 : num4); bodyfatItem.moi = ((num4 < 20.0) ? 20.0 : num4).ToString("0.0"); num5 = ((num5 > 50.0) ? 50.0 : num5); bodyfatItem.bfr = ((num5 < 5.0) ? 5.0 : num5).ToString("0.0"); bodyfatItem.sfr = num6 <= 0 ? "0" : num6.ToString("0.0"); bodyfatItem.rosm = num7.ToString("0.0"); num8 = ((num8 > 50.0) ? 50.0 : num8); bodyfatItem.pp = ((num8 < 10.0) ? 10.0 : num8).ToString("0.0"); num9 = ((num9 > 20.0) ? 20.0 : num9); bodyfatItem.uvi = ((num9 < 1.0) ? 1.0 : num9).ToString("0"); bodyfatItem.bmr = num10 <= 0 ? "0" : num10.ToString("0"); if (age < 18) { num11 = age; } else { num11 = ((num11 > (double)(age + 10)) ? ((double)(age + 10)) : num11); num11 = ((num11 < (double)(age - 10)) ? ((double)(age - 10)) : num11); } bodyfatItem.physicAge = num11.ToString("0"); bodyfatItem.weight = weight; bodyfatItem.height = height; bodyfatItem.age = age; bodyfatItem.adc = adc; bodyfatItem.sex = sex; return bodyfatItem; } public static BodyfatItem Old_GetBodyfatResults(double weight, double height, int age, int adc, int sex) { BodyfatItem item = new BodyfatItem(); if ((weight <= 0.0) || ((weight > 220.0) || ((height <= 0.0) || ((height > 270.0) || ((age <= 0) || ((age > 120) || ((adc <= 0) || ((adc > 0x3e8) || ((sex < 0) || (sex > 1)))))))))) { object[] arg = new object[] { weight, height, age, adc, sex }; Console.WriteLine("[input params invalid] weight:{0} height:{1} age:{2} adc:{3} sex:{4}", arg); if (weight != 0 && height != 0) item.bmi = (((double)((int)((weight / (height * height)) * 10.0))) / 10.0).ToString("0.0"); return item; } double bmi = ((double)((int)((weight / (height * height)) * 10.0))) / 10.0; double bm = 0.0;//骨量 double rom = 0.0;//肌肉率 double moi = 0.0;//水份 double bfr = 0.0;//脂肪率 double sfr = 0.0;//皮下脂肪率 double rosm = 0.0;//骨骼肌率 double pp = 0.0;//蛋白率 double uvi = 0.0;//内脏脂肪指数 double bmr = 0.0;//基础代谢率 double physicAge = 0.0;//身体年龄 if (sex == 1) { bm = ((0.015 * weight) + (((2.0 - (0.00055 * adc)) * height) / 100.0)) + 1.15; rom = ((((-((0.00115 * adc) + 0.01) * weight) + (((49.64 - (0.031 * adc)) * height) / 100.0)) + (adc * 0.08)) + (age * 0.04)) + 15.4; moi = (((0xf_4240 / (bmi * ((2.688 * adc) - 78.28))) - (0x274a / adc)) - (0.22 * age)) + 52.6; bfr = ((((-930_000.0 / bmi) / ((1.966 * adc) - 58.46)) + (0x3378 / adc)) - (0.06 * age)) + 40.0; sfr = 0.898 * bfr; rosm = 0.895 * moi; pp = 0.8 * (((100.0 - bfr) - moi) - (bm / weight)); uvi = ((((0.304 * weight) + ((25.58 * height) / 100.0)) + (0.131 * age)) + (0.005 * adc)) - 0x16; //bmr = (((((9.0 + (0.0015 * adc)) * weight) + (((0x546 - (0.88 * adc)) * height) / 100.0)) + (0xbc / age)) + (0.748 * adc)) - 0x41d; bmr = 370 + 21.6 * weight * (1 - bfr / 100); physicAge = ((((age * (1.0 + (0.012 * (bmi - 1.0)))) - 0x15) + ((30 - age) * 0.35)) + ((adc - 450) * 0.02)) + 11.0; } else { bm = ((((2.2E-05 * adc) * weight) + (((4.99 - (0.00284 * adc)) * height) / 100.0)) + (0.0012 * adc)) + 1.15; rom = ((((-((0.00115 * adc) + 0.01) * weight) + (((49.64 - (0.031 * adc)) * height) / 100.0)) + (adc * 0.08)) + (age * 0.04)) + 6.0; moi = (((0xf_4240 / (bmi * ((2.467 * adc) - 75.37))) - (0x3787 / adc)) - (0.034 * age)) + 43.2; bfr = ((((-3_030_000.0 / (bmi + 20.0)) / ((1.966 * adc) - 58.46)) + (0x6e10 / adc)) - (0.06 * age)) + 0x33; sfr = (0.876 * bfr) + 1.66; rosm = (0.857 * moi) - 0.36; pp = 0.75 * (((100.0 - bfr) - moi) - (bm / weight)); uvi = ((((0.304 * weight) + ((25.58 * height) / 100.0)) + (0.131 * age)) + (0.005 * adc)) - 0x16; bmr = 370 + 21.6 * weight * (1 - bfr / 100); //bmr = ((((((0.00307 * adc) + 1.5) * weight) + (((0x5b3 - (0.989 * adc)) * height) / 100.0)) + (age * 0.9)) + (0.923 * adc)) - 950.0; physicAge = (age * (0.95 + (0.02 * (bmi - 21.2)))) + ((adc - 500) * 0.02); } item.bmi = bmi.ToString("0.0"); bm = (bm > (weight * 0.15)) ? (weight * 0.15) : bm; item.bm = ((bm < (weight * 0.02)) ? (weight * 0.02) : bm).ToString("0.0"); rom = (rom > 0x4b) ? 0x4b : rom; item.rom = ((rom < 15.0) ? 15.0 : rom).ToString("0.0"); moi = (moi > 70.0) ? 70.0 : moi; item.moi = ((moi < 20.0) ? 20.0 : moi).ToString("0.0"); bfr = (bfr > 50.0) ? 50.0 : bfr; item.bfr = ((bfr < 5.0) ? 5.0 : bfr).ToString("0.0"); item.sfr = sfr.ToString("0.0"); item.rosm = rosm.ToString("0.0"); pp = (pp > 50.0) ? 50.0 : pp; item.pp = ((pp < 10.0) ? 10.0 : pp).ToString("0.0"); uvi = (uvi > 20.0) ? 20.0 : uvi; item.uvi = ((uvi < 1.0) ? 1.0 : uvi).ToString("0"); item.bmr = bmr.ToString("0.0"); if (age < 0x12) { physicAge = age; } else { physicAge = (physicAge > (age + 10)) ? ((double)(age + 10)) : physicAge; physicAge = (physicAge < (age - 10)) ? ((double)(age - 10)) : physicAge; } item.physicAge = physicAge.ToString("0"); item.weight = weight; item.height = height; item.age = age; item.adc = adc; item.sex = sex; return item; } /// /// BMI值计算 /// /// 身高,厘米 /// 体重,公斤 /// public decimal CalcBMi(decimal height, decimal weight) { if (height == 0 || weight == 0) { return 0; } decimal mheight = height / (100 * 1.0m);//转换为米 return (weight / (mheight * mheight) * 10.0m / 10.0m).ToDecimal(1); } /// /// 结果计算 /// /// /// public UserMeasureModel CalcBodyFat(MeasureCalcDto model) { //算法使用的性别为0-女,1-男 GenderType sex = model.sex; int age = model.age; double weight = model.weight.ToDouble(); int height = model.height.ToInt(); decimal dweight = weight.ToDecimal(); model.StandardWeight = standweight(height, sex).ToDecimal(2); model.fat_w = (model.fat_r.ToDouble() * weight / 100).ToDecimal(2); model.lbm = ((1 - model.fat_r.ToDouble() / 100) * weight).ToDecimal(2); model.muscleval = (weight * (model.muscle.ToDouble() / 100)).ToDecimal(2); model.proteinval = (weight * (model.protein.ToDouble() / 100)).ToDecimal(2); if (model.imp <= 0) { decimal mheight = (height.ToDecimal()) / (100 * 1.0m); var returndata = new UserMeasureModel { weight = model.height, bmi = (((dweight / (mheight * mheight)) * 10.0m) / 10.0m).ToDecimal(1), standardWeight = standweight(height, sex).ToString("f2"), }; returndata.bmiLevel = bmi(model.bmi.ToFloat()); returndata.cmi = score(returndata.bmi.ToFloat()).ToDecimal(1); double levels = (weight - returndata.standardWeight.ToDouble()) / returndata.standardWeight.ToDouble(); returndata.fatLevel = fatlevel(levels); returndata.fatlevlval = levels.ToString("f2"); return returndata; } var data = new UserMeasureModel { bmi = model.bmi, bmiLevel = bmi(model.bmi.ToFloat()), fat_r = model.fat_r, fat_rLevel = Fat_r(model.fat_r.ToFloat(), sex, age), bodyage = model.bodyage, bodyageLevel = bodyage(model.bodyage, age), fat_w = model.fat_w, fat_wLevel = Fat_r(model.fat_r.ToFloat(), sex, age), bone = model.bone, boneLevel = bone(model.bone.ToFloat(), weight, sex), kcal = model.kcal < 0 ? 0 : model.kcal, kcalLevel = kcal(model.kcal.ToFloat(), weight, age, sex), muscle = model.muscle, muscleLevel = muscle(model.muscle.ToFloat(), weight, age, sex), protein = model.protein, proteinLevel = protein(model.protein.ToFloat(), weight, age, sex), visceral = model.visceral, visceralLevel = visceral(model.visceral.ToFloat(), weight, age, sex), water = model.water, waterLevel = water(model.water.ToFloat(), weight, age, sex), cmi = score(model.bmi.ToFloat()).ToDecimal(1), muscleval = model.muscleval, proteinval = model.proteinval, lbm = model.lbm, standardWeight = model.StandardWeight.ToString(), sfr = model.sfr.ToDecimal(2), sfrLevel = sfr(model.sfr.ToFloat(), weight, age, sex), body = "0", standardfat_r = fa_r_value(sex, age).ToJson(), standardbmi = bmi_value(sex, age).ToJson(), standardmuscle = muscle_value(sex, age).ToJson(), standardmuscleval = muscleval_value(sex, age, dweight).ToJson(), standardwater = water_value(sex, age).ToJson(), standardbone = bone_value(sex, age, dweight).ToJson(), standardkcal = kcal_value(sex, age, dweight).ToJson(), standardfat_w = fat_w_value(sex, age, dweight).ToJson(), standardviscera = visceral_value(sex, age).ToJson(), standardprotein = protein_value(sex, age).ToJson(), standardproteinval = proteinval_value(sex, age, dweight).ToJson(), standardbodyage = "", standardsfr = sfr_value(sex, age).ToJson(), weight = model.weight.ToDecimal(), fatlevlval = model.fatlevlval }; data.bodylevel = body(data.fat_rLevel, data.muscleLevel); data.musulevalLevel = data.muscleLevel; data.proteinvalLevel = data.proteinLevel; // double level = (weight - data.standardWeight.ToDouble()) / // data.standardWeight.ToDouble(); data.fatLevel = model.IsCalc == 1 ? model.fatlevlval : fatlevel(model.fatlevlval.ToDouble()); // data.fatlevlval = level.ToString("f2"); return data; } /// /// 二、四电极计算体脂 /// /// 体重,单位为kg /// 身高,单位为厘米 /// 年龄 /// 阻抗 /// 性别,1-男,2-女,0-未知 /// public UserMeasureModel CalcBodyFat(double weight, double height, int age, int adc, GenderType sex) { //算法使用的性别为0-女,1-男 int sexval = sex == GenderType.FeMale ? 0 : 1; var result = GetBodyfatResults(weight, height, age, adc, sexval); decimal dwegiht = weight.ToDecimal(); var data = new UserMeasureModel { bmi = result.bmi.ToDecimal(), bmiLevel = bmi(result.bmi.ToFloat()), fat_r = result.bfr.ToDecimal(), fat_rLevel = Fat_r(result.bfr.ToFloat(), sex, age), bodyage = result.physicAge.ToInt(), bodyageLevel = bodyage(result.physicAge.ToInt(), age), fat_w = (result.bfr.ToDouble() * weight / 100).ToDecimal(2), fat_wLevel = Fat_r(result.bfr.ToFloat(), sex, age), bone = result.bm.ToDecimal(), boneLevel = bone(result.bm.ToFloat(), weight, sex), kcal = result.bmr.ToDecimal() < 0 ? 0 : result.bmr.ToDecimal(), kcalLevel = kcal(result.bmr.ToFloat(), weight, age, sex), muscle = result.rom.ToDecimal(), muscleLevel = muscle(result.rom.ToFloat(), weight, age, sex), protein = result.pp.ToDecimal(), proteinLevel = protein(result.pp.ToFloat(), weight, age, sex), visceral = result.uvi.ToDecimal(), visceralLevel = visceral(result.uvi.ToFloat(), weight, age, sex), water = result.moi.ToDecimal(), waterLevel = water(result.moi.ToFloat(), weight, age, sex), cmi = score(result.bmi.ToFloat()).ToDecimal(1), muscleval = (weight * (result.rom.ToDouble() / 100)).ToDecimal(2), proteinval = (weight * (result.pp.ToDouble() / 100)).ToDecimal(2), lbm = ((1 - result.bfr.ToDouble() / 100) * weight).ToDecimal(2), standardWeight = standweight(height.ToInt(), sex).ToString("f2"), sfr = result.sfr.ToDecimal(2), sfrval = (weight * result.sfr.ToDouble() / 100).ToDecimal(2), sfrLevel = sfr(result.sfr.ToFloat(), weight, age, sex), body = "0", standardfat_r = fa_r_value(sex, age).ToJson(), standardbmi = bmi_value(sex, age).ToJson(), standardmuscle = muscle_value(sex, age).ToJson(), standardmuscleval = muscleval_value(sex, age, dwegiht).ToJson(), standardwater = water_value(sex, age).ToJson(), standardbone = bone_value(sex, age, dwegiht).ToJson(), standardkcal = kcal_value(sex, age, dwegiht).ToJson(), standardfat_w = fat_w_value(sex, age, dwegiht).ToJson(), standardviscera = visceral_value(sex, age).ToJson(), standardprotein = protein_value(sex, age).ToJson(), standardproteinval = proteinval_value(sex, age, dwegiht).ToJson(), standardbodyage = "", standardsfr = sfr_value(sex, age).ToJson(), weight = weight.ToDecimal(2), height = height.ToDecimal(2), skeletalmuscle = (weight * (result.rosm.ToDouble() / 100)).ToDecimal(2) }; data.bodylevel = body(data.fat_rLevel, data.muscleLevel); data.musulevalLevel = data.muscleLevel; data.proteinvalLevel = data.proteinLevel; double level = (weight - data.standardWeight.ToDouble()) / data.standardWeight.ToDouble(); data.fatLevel = fatlevel(level); data.fatlevlval = level.ToString("f2"); return data; } /// /// 八电极计算体脂 /// /// 体重,单位为kg /// 身高,单位为厘米 /// 年龄 /// 性别,1-男,2-女,0-未知 /// 全身阻抗 /// 左脚阻抗 /// 左手阻抗 /// 右脚阻抗 /// 右手阻抗 public async Task CalcBody120FatAsync(decimal weight, decimal height, int age, GenderType sex, decimal lefthand, decimal righthand, decimal leftfoot, decimal rightfoot, decimal body) { if (weight == 0) { var returndata = new UserMeasureDto { weight = weight, bmi = 0, idealweight = CalcStandWeight(height, sex), height = height }; returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); returndata.cmi = score(returndata.bmi.ToFloat()).ToDecimal(1); decimal levels = (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(levels.ToDouble()); return returndata; } if (height == 0) { var returndata = new UserMeasureDto { weight = weight, bmi = 0, idealweight = CalcStandWeight(height, sex), height = height }; returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); returndata.cmi = score(returndata.bmi.ToFloat()).ToDecimal(1); decimal levels = returndata.idealweight == 0 ? 0 : (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(levels.ToDouble()); return returndata; } var mheight = height / 100; //阻抗测量失败 if (body <= 0 || body == 4294967295) { var returndata = new UserMeasureDto { weight = weight, bmi = (((weight / (mheight * mheight)) * 10.0m) / 10.0m).ToDecimal(1), idealweight = CalcStandWeight(height, sex), height = height }; returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); returndata.cmi = score(returndata.bmi.ToFloat()).ToDecimal(1); decimal levels = (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(levels.ToDouble()); return returndata; } //算法使用的是0-男,1-女 string sexval = sex == GenderType.FeMale ? "0" : "1"; var requestdata = new HetaiBodyRequestS2SDto { age = age.ToString(), heightCm = height.ToString(), peopleType = "0", sex = sexval, weightKg = weight.ToString(), zLeftBodyEnCode = body.ToInt().ToString(), zLeftArmEnCode = lefthand.ToInt().ToString(), zLeftLegEnCode = leftfoot.ToInt().ToString(), zRightArmEnCode = righthand.ToInt().ToString(), zRightLegEnCode = rightfoot.ToInt().ToString() }; //Console.WriteLine(requestdata.ToJson()); var hashtable = HashTableHelper.Object2Hashtable(requestdata); var strA = Common.SortRequestParam(hashtable); var accessSecret = RequestaccessSecret; var accessKey = RequestaccessKey; var timestamp = Common.GetTimestamps(); strA = $"{strA}×tamp={timestamp}&accessSecret={accessSecret}"; var sign = Md5.md5(strA, 32).ToUpper(); var url = RequestUrl; var loggerService = App.GetService(); string errmsg = String.Empty; var response = await _http.PostBodyAsync(requestdata, accessKey, timestamp, sign, (res, erros) => { errmsg = erros; }); if (!string.IsNullOrEmpty(errmsg)) { loggerService.AddLogger($"八电极算法请求失败,参数:{requestdata.ToJson()},错误信息:{errmsg}",3); var returndata = new UserMeasureDto { weight = weight, bmi = (((weight / (mheight * mheight)) * 10.0m) / 10.0m).ToDecimal(1), idealweight = standweight(height.ToInt(), sex).ToDecimal(2), height = height }; returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); returndata.cmi = score(returndata.bmi.ToFloat()).ToDecimal(1); decimal levels = (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(levels.ToDouble()); return returndata; } var returnstr = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) { var codedata = returnstr.ToObject(); if (codedata.code != 1000) { loggerService.AddLogger($"八电极算法请求失败,参数:{requestdata.ToJson()},错误信息:{returnstr}",3); var returndata = new UserMeasureDto { weight = weight, bmi = (((weight / (mheight * mheight)) * 10.0m) / 10.0m).ToDecimal(1), idealweight = standweight(height.ToInt(), sex).ToDecimal(2), height = height }; returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); returndata.cmi = score(returndata.bmi.ToFloat()).ToDecimal(1); decimal levels = (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(levels.ToDouble()); return returndata; } else { var responsedata = returnstr.ToObject>(); var returndata = new UserMeasureDto() { weight = weight, height = height }; double dweight = weight.ToDouble(); foreach (var item in responsedata.data) { var name = item.name.ToLower(); if (name == "bmi") { returndata.bmi = (((weight / (mheight * mheight)) * 10.0m) / 10.0m).ToDecimal(1); returndata.bmiLevel = GetBodyValueLevel(name, item); returndata.bmiLevel = returndata.bmiLevel == "标准" ? "正常" : returndata.bmiLevel; } if (name == "bodyfatrate") { returndata.fat_r = GetBodyValue(name, item).ToDecimal(); //returndata.fat_rLevel = GetBodyValueLevel(name, item); returndata.fat_rLevel = Fat_r((float)returndata.fat_r, sex, age); returndata.fat_wLevel = returndata.fat_rLevel; } if (name == "bonekg") { returndata.bone = GetBodyValue(name, item).ToDecimal(); //returndata.boneLevel = GetBodyValueLevel(name, item); returndata.boneLevel = bone((float)returndata.bone, dweight, sex); } if (name == "waterrate") { returndata.water = GetBodyValue(name, item).ToDecimal(); //returndata.waterLevel = GetBodyValueLevel(name, item); returndata.waterLevel = water((float)returndata.water, dweight, age, sex); } if (name == "musclekg") { returndata.muscleval = GetBodyValue(name, item).ToDecimal(); //returndata.muscleLevel = GetBodyValueLevel(name, item); } if (name == "proteinrate") { returndata.protein = GetBodyValue(name, item).ToDecimal(); returndata.proteinval = (returndata.protein * weight / 100).ToDecimal(2); //returndata.proteinLevel = GetBodyValueLevel(name, item); returndata.proteinLevel = protein((float)returndata.protein, dweight, age, sex); returndata.proteinvalLevel = returndata.proteinLevel; } if (name == "skeletalmusclekg") { returndata.SkeletalMuscle = GetBodyValue(name, item).ToDecimal(); returndata.SkeletalMuscleLevel = GetBodyValueLevel(name, item); } if (name == "bodyfatsubcutrate") { returndata.sfr = GetBodyValue(name, item).ToDecimal(); //returndata.sfrLevel = GetBodyValueLevel(name, item); returndata.sfrLevel = sfr((float)returndata.sfr, dweight, age, sex); } if (name == "bmr") { returndata.kcal = GetBodyValue(name, item).ToDecimal(); //returndata.kcalLevel = GetBodyValueLevel(name, item); returndata.kcalLevel = kcal((float)returndata.kcal, dweight, age, sex); } if (name == "vfal") { returndata.visceral = GetBodyValue(name, item).ToDecimal(); //returndata.visceralLevel = GetBodyValueLevel(name, item); returndata.visceralLevel = visceral((float)returndata.visceral, dweight, age, sex); } if (name == "bodyage") returndata.bodyage = GetBodyValue(name, item).ToInt(); if (name == "bodyscore") returndata.cmi = GetBodyValue(name, item).ToDecimal(); if (name == "bodytype") { returndata.body = GetBodyValue(name, item); returndata.bodylevel = returndata.body; } if (name == "idealweightkg") returndata.idealweight = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatkg") returndata.fat_w = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatfreemasskg") returndata.lbm = GetBodyValue(name, item).ToDecimal(); if (name == "musclerate") { returndata.muscle = GetBodyValue(name, item).ToDecimal(); returndata.muscleLevel = muscle((float)returndata.muscle, (double)weight, age, sex); returndata.musulevalLevel = returndata.muscleLevel; } if (name == "bodyfatsubcutkg") returndata.sfrval = GetBodyValue(name, item).ToDecimal(); if (name == "muscleratetrunk") returndata.muscleratetrunk = GetBodyValue(name, item).ToDecimal(); if (name == "musclerateleftleg") returndata.musclerateleftleg = GetBodyValue(name, item).ToDecimal(); if (name == "muscleraterightleg") returndata.muscleraterightleg = GetBodyValue(name, item).ToDecimal(); if (name == "musclerateleftarm") returndata.musclerateleftarm = GetBodyValue(name, item).ToDecimal(); if (name == "muscleraterightarm") returndata.muscleraterightarm = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatratetrunk") returndata.bodyfatraterunk = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatrateleftleg") returndata.bodyfatrateleftleg = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatraterightleg") returndata.bodyfatraterightleg = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatrateleftarm") returndata.bodyfatrateleftarm = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatraterightarm") returndata.bodyfatraterightarm = GetBodyValue(name, item).ToDecimal(); if (name == "musclekgtrunk") returndata.musclekgtrunk = GetBodyValue(name, item).ToDecimal(); if (name == "musclekgleftleg") returndata.musclekgleftleg = GetBodyValue(name, item).ToDecimal(); if (name == "musclekgrightleg") returndata.musclekgrightleg = GetBodyValue(name, item).ToDecimal(); if (name == "musclekgleftarm") returndata.musclekgleftarm = GetBodyValue(name, item).ToDecimal(); if (name == "musclekgrightarm") returndata.musclekgrightarm = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatkgtrunk") returndata.bodyfatkgtrunk = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatkgleftleg") returndata.bodyfatkgleftleg = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatkgrightleg") returndata.bodyfatkgrightleg = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatkgleftarm") returndata.bodyfatkgleftarm = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatkgrightarm") returndata.bodyfatkgrightarm = GetBodyValue(name, item).ToDecimal(); } //returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); //returndata.muscleLevel = muscle(returndata.muscle.ToFloat(), returndata.weight.ToFloat(), age, sex); //returndata.fat_rLevel = Fat_r(returndata.fat_r.ToFloat(), sex, age); //returndata.fat_wLevel = Fat_r(returndata.fat_r.ToFloat(), sex, age); //returndata.waterLevel = water(returndata.water.ToFloat(), returndata.weight.ToFloat(), age, sex); //returndata.proteinLevel = protein(returndata.protein.ToFloat(), returndata.weight.ToFloat(), age, sex); //returndata.boneLevel = bone(returndata.bone.ToFloat(), returndata.weight.ToFloat(), sex); returndata.bodyageLevel = bodyage(returndata.bodyage.ToInt(), age); //returndata.kcalLevel = kcal(returndata.kcal.ToFloat(), returndata.weight.ToFloat(), age, sex); //returndata.visceralLevel = visceral(returndata.visceral.ToFloat(), returndata.weight.ToFloat(), age, sex); //returndata.sfrLevel = sfr(returndata.sfr.ToFloat(), returndata.weight.ToFloat(), age, sex, height.ToInt()); var level = (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(level.ToDouble()); return returndata; } } else { //记录日志 loggerService.AddLogger($"八电极算法请求失败,参数:{requestdata.ToJson()},错误信息:{returnstr}", 3); var returndata = new UserMeasureDto { weight = weight, bmi = (((weight / (mheight * mheight)) * 10.0m) / 10.0m).ToDecimal(1), idealweight = standweight(height.ToInt(), sex).ToDecimal(2), height = height }; returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); returndata.cmi = score(returndata.bmi.ToFloat()).ToDecimal(1); decimal levels = (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(levels.ToDouble()); return returndata; } } public async Task CalcBody120Async(decimal weight, decimal height, int age, GenderType sex, decimal lefthand, decimal righthand, decimal leftfoot, decimal rightfoot, decimal body) { if (weight == 0) { var returndata = new UserMeasureDto { weight = weight, bmi = 0, idealweight = CalcStandWeight(height, sex), height = height }; returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); returndata.cmi = score(returndata.bmi.ToFloat()).ToDecimal(1); decimal levels = (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(levels.ToDouble()); return returndata; } if (height == 0) { var returndata = new UserMeasureDto { weight = weight, bmi = 0, idealweight = CalcStandWeight(height, sex), height = height }; returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); returndata.cmi = score(returndata.bmi.ToFloat()).ToDecimal(1); decimal levels = returndata.idealweight == 0 ? 0 : (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(levels.ToDouble()); return returndata; } var mheight = height / 100; //阻抗测量失败 if (body <= 0 || body == 4294967295) { var returndata = new UserMeasureDto { weight = weight, bmi = (((weight / (mheight * mheight)) * 10.0m) / 10.0m).ToDecimal(1), idealweight = CalcStandWeight(height, sex), height = height }; returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); returndata.cmi = score(returndata.bmi.ToFloat()).ToDecimal(1); decimal levels = (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(levels.ToDouble()); return returndata; } //算法使用的是0-男,1-女 string sexval = sex == GenderType.FeMale ? "0" : "1"; var requestdata = new HetaiBodyRequestS2SDto { age = age.ToString(), heightCm = height.ToString(), peopleType = "0", sex = sexval, weightKg = weight.ToString(), zLeftBodyEnCode = body.ToInt().ToString(), zLeftArmEnCode = lefthand.ToInt().ToString(), zLeftLegEnCode = leftfoot.ToInt().ToString(), zRightArmEnCode = righthand.ToInt().ToString(), zRightLegEnCode = rightfoot.ToInt().ToString() }; //Console.WriteLine(requestdata.ToJson()); var hashtable = HashTableHelper.Object2Hashtable(requestdata); var strA = Common.SortRequestParam(hashtable); var accessSecret = RequestaccessSecret; var accessKey = RequestaccessKey; var timestamp = Common.GetTimestamps(); strA = $"{strA}×tamp={timestamp}&accessSecret={accessSecret}"; var sign = Md5.md5(strA, 32).ToUpper(); var url = RequestUrl; var loggerService = App.GetService(); string errmsg = String.Empty; var response = await _http.PostBodyAsync(requestdata, accessKey, timestamp, sign, (res, erros) => { errmsg = erros; }); if (!string.IsNullOrEmpty(errmsg)) { loggerService.AddLogger($"八电极算法请求失败,参数:{requestdata.ToJson()},错误信息:{errmsg}", 3); var returndata = new UserMeasureDto { weight = weight, bmi = (((weight / (mheight * mheight)) * 10.0m) / 10.0m).ToDecimal(1), idealweight = standweight(height.ToInt(), sex).ToDecimal(2), height = height }; returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); returndata.cmi = score(returndata.bmi.ToFloat()).ToDecimal(1); decimal levels = (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(levels.ToDouble()); return returndata; } var returnstr = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) { var codedata = returnstr.ToObject(); if (codedata.code != 1000) { loggerService.AddLogger($"八电极算法请求失败,参数:{requestdata.ToJson()},错误信息:{returnstr}", 3); var returndata = new UserMeasureDto { weight = weight, bmi = (((weight / (mheight * mheight)) * 10.0m) / 10.0m).ToDecimal(1), idealweight = standweight(height.ToInt(), sex).ToDecimal(2), height = height }; returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); returndata.cmi = score(returndata.bmi.ToFloat()).ToDecimal(1); decimal levels = (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(levels.ToDouble()); return returndata; } else { var responsedata = returnstr.ToObject>(); var returndata = new UserMeasureDto() { weight = weight, height = height }; double dweight = weight.ToDouble(); foreach (var item in responsedata.data) { var name = item.name.ToLower(); if (name == "bmi") { returndata.bmi = (((weight / (mheight * mheight)) * 10.0m) / 10.0m).ToDecimal(1); returndata.bmiLevel = GetBodyValueLevel(name, item); returndata.bmiLevel = returndata.bmiLevel == "标准" ? "正常" : returndata.bmiLevel; } if (name == "bodyfatrate") { returndata.fat_r = GetBodyValue(name, item).ToDecimal(); //returndata.fat_rLevel = GetBodyValueLevel(name, item); returndata.fat_rLevel = Fat_r((float)returndata.fat_r, sex, age); returndata.fat_wLevel = returndata.fat_rLevel; } if (name == "bonekg") { returndata.bone = GetBodyValue(name, item).ToDecimal(); //returndata.boneLevel = GetBodyValueLevel(name, item); returndata.boneLevel = bone((float)returndata.bone, dweight, sex); } if (name == "waterrate") { returndata.water = GetBodyValue(name, item).ToDecimal(); //returndata.waterLevel = GetBodyValueLevel(name, item); returndata.waterLevel = water((float)returndata.water, dweight, age, sex); } if (name == "musclekg") { returndata.muscleval = GetBodyValue(name, item).ToDecimal(); //returndata.muscleLevel = GetBodyValueLevel(name, item); } if (name == "proteinrate") { returndata.protein = GetBodyValue(name, item).ToDecimal(); returndata.proteinval = (returndata.protein * weight / 100).ToDecimal(2); //returndata.proteinLevel = GetBodyValueLevel(name, item); returndata.proteinLevel = protein((float)returndata.protein, dweight, age, sex); returndata.proteinvalLevel = returndata.proteinLevel; } if (name == "skeletalmusclekg") { returndata.SkeletalMuscle = GetBodyValue(name, item).ToDecimal(); returndata.SkeletalMuscleLevel = GetBodyValueLevel(name, item); } if (name == "bodyfatsubcutrate") { returndata.sfr = GetBodyValue(name, item).ToDecimal(); //returndata.sfrLevel = GetBodyValueLevel(name, item); returndata.sfrLevel = sfr((float)returndata.sfr, dweight, age, sex); } if (name == "bmr") { returndata.kcal = GetBodyValue(name, item).ToDecimal(); //returndata.kcalLevel = GetBodyValueLevel(name, item); returndata.kcalLevel = kcal((float)returndata.kcal, dweight, age, sex); } if (name == "vfal") { returndata.visceral = GetBodyValue(name, item).ToDecimal(); //returndata.visceralLevel = GetBodyValueLevel(name, item); returndata.visceralLevel = visceral((float)returndata.visceral, dweight, age, sex); } if (name == "bodyage") returndata.bodyage = GetBodyValue(name, item).ToInt(); if (name == "bodyscore") returndata.cmi = GetBodyValue(name, item).ToDecimal(); if (name == "bodytype") { returndata.body = GetBodyValue(name, item); returndata.bodylevel = returndata.body; } if (name == "idealweightkg") returndata.idealweight = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatkg") returndata.fat_w = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatfreemasskg") returndata.lbm = GetBodyValue(name, item).ToDecimal(); if (name == "musclerate") { returndata.muscle = GetBodyValue(name, item).ToDecimal(); returndata.muscleLevel = muscle((float)returndata.muscle, (double)weight, age, sex); returndata.musulevalLevel = returndata.muscleLevel; } if (name == "bodyfatsubcutkg") returndata.sfrval = GetBodyValue(name, item).ToDecimal(); if (name == "muscleratetrunk") returndata.muscleratetrunk = GetBodyValue(name, item).ToDecimal(); if (name == "musclerateleftleg") returndata.musclerateleftleg = GetBodyValue(name, item).ToDecimal(); if (name == "muscleraterightleg") returndata.muscleraterightleg = GetBodyValue(name, item).ToDecimal(); if (name == "musclerateleftarm") returndata.musclerateleftarm = GetBodyValue(name, item).ToDecimal(); if (name == "muscleraterightarm") returndata.muscleraterightarm = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatratetrunk") returndata.bodyfatraterunk = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatrateleftleg") returndata.bodyfatrateleftleg = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatraterightleg") returndata.bodyfatraterightleg = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatrateleftarm") returndata.bodyfatrateleftarm = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatraterightarm") returndata.bodyfatraterightarm = GetBodyValue(name, item).ToDecimal(); if (name == "musclekgtrunk") returndata.musclekgtrunk = GetBodyValue(name, item).ToDecimal(); if (name == "musclekgleftleg") returndata.musclekgleftleg = GetBodyValue(name, item).ToDecimal(); if (name == "musclekgrightleg") returndata.musclekgrightleg = GetBodyValue(name, item).ToDecimal(); if (name == "musclekgleftarm") returndata.musclekgleftarm = GetBodyValue(name, item).ToDecimal(); if (name == "musclekgrightarm") returndata.musclekgrightarm = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatkgtrunk") returndata.bodyfatkgtrunk = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatkgleftleg") returndata.bodyfatkgleftleg = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatkgrightleg") returndata.bodyfatkgrightleg = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatkgleftarm") returndata.bodyfatkgleftarm = GetBodyValue(name, item).ToDecimal(); if (name == "bodyfatkgrightarm") returndata.bodyfatkgrightarm = GetBodyValue(name, item).ToDecimal(); } //returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); //returndata.muscleLevel = muscle(returndata.muscle.ToFloat(), returndata.weight.ToFloat(), age, sex); //returndata.fat_rLevel = Fat_r(returndata.fat_r.ToFloat(), sex, age); //returndata.fat_wLevel = Fat_r(returndata.fat_r.ToFloat(), sex, age); //returndata.waterLevel = water(returndata.water.ToFloat(), returndata.weight.ToFloat(), age, sex); //returndata.proteinLevel = protein(returndata.protein.ToFloat(), returndata.weight.ToFloat(), age, sex); //returndata.boneLevel = bone(returndata.bone.ToFloat(), returndata.weight.ToFloat(), sex); returndata.bodyageLevel = bodyage(returndata.bodyage.ToInt(), age); //returndata.kcalLevel = kcal(returndata.kcal.ToFloat(), returndata.weight.ToFloat(), age, sex); //returndata.visceralLevel = visceral(returndata.visceral.ToFloat(), returndata.weight.ToFloat(), age, sex); //returndata.sfrLevel = sfr(returndata.sfr.ToFloat(), returndata.weight.ToFloat(), age, sex, height.ToInt()); var level = (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(level.ToDouble()); return returndata; } } else { //记录日志 loggerService.AddLogger($"八电极算法请求失败,参数:{requestdata.ToJson()},错误信息:{returnstr}", 3); var returndata = new UserMeasureDto { weight = weight, bmi = (((weight / (mheight * mheight)) * 10.0m) / 10.0m).ToDecimal(1), idealweight = standweight(height.ToInt(), sex).ToDecimal(2), height = height }; returndata.bmiLevel = bmi(returndata.bmi.ToFloat()); returndata.cmi = score(returndata.bmi.ToFloat()).ToDecimal(1); decimal levels = (weight - returndata.idealweight) / returndata.idealweight; returndata.fatLevel = fatlevel(levels.ToDouble()); return returndata; } } /// /// 肥胖等级 /// /// level=(体重-标准体重)/标准体重 /// public string fatlevel(double level) => level switch { //_ when level == 0 => NewLevelModel.Error, _ when level < -0.2 => NewLevelModel.weightnotenu, _ when level >= -0.2 && level < -0.1 => NewLevelModel.thin, _ when level >= -0.1 && level <= 0.1 => NewLevelModel.normal, _ when level > 0.1 && level <= 0.2 => NewLevelModel.weight, _ when level > 0.2 => NewLevelModel.mweight, _ => NewLevelModel.weightnotenu }; /// /// 标准体重 /// /// /// 性别,1-男,2-女 /// public double standweight(int height, GenderType sex) => (height, sex) switch { _ when sex == GenderType.Male => (height - 80) * 0.7, _ => (height - 70) * 0.6 }; /// /// 标准体重计算 /// /// 身高,厘米 /// 性别,1-男,2-女 /// public decimal CalcStandWeight(decimal height, GenderType sex) { decimal standheight = 0; if (sex == GenderType.Male) { standheight = (height - 80.0m) * 0.7m; } else { standheight = (height - 70.0m) * 0.6m; } return standheight < 0 ? 0 : standheight.ToDecimal(1); } /// /// 根据等级获取标准颜色 /// /// /// public string GetLevelColor(string level) => level switch { BMILevel.Thin or NewLevelModel.thin or NewLevelModel.notenu or NewLevelModel.flat or HeightLevel.LittleLow or WeightLevel.LittleLow => LevelColor.Thin, BMILevel.Normal or NewLevelModel.normal or NewLevelModel.reach or HeightLevel.Normal or WeightLevel.Normal => LevelColor.Normal, BMILevel.OverWeight or NewLevelModel.fat or NewLevelModel.high or NewLevelModel.alert or HeightLevel.Low or WeightLevel.Height => LevelColor.OverWeight, NewLevelModel.fine or HeightLevel.Height => LevelColor.Fine, BMILevel.Fat or NewLevelModel.mfat or NewLevelModel.danger or HeightLevel.MoreLow => LevelColor.Fat, _ => LevelColor.Error }; /// /// 计算算法 /// /// /// /// /// /// /// /// /// BMI标准的范围 /// /// /// /// public MeasureInfoItemValue bmi_stand(GenderType sex, int age) { return bmi_value(sex, age).Skip(1).Take(1).FirstOrDefault(); } /// /// 成人bmi范围标准 /// /// /// /// public List bmi_value(GenderType sex, int age) { var list = new List(); list.Add(new MeasureInfoItemValue { maxvalue = 18.5m, minvalue = 0, text = BMILevelConst.Thin, color = LevelColor.Thin }); list.Add(new MeasureInfoItemValue { maxvalue = 25, minvalue = 18.5m, text = BMILevelConst.Normal, color = LevelColor.Normal }); list.Add(new MeasureInfoItemValue { maxvalue = 30, minvalue = 25, text = BMILevelConst.OverWeight, color = LevelColor.OverWeight }); list.Add(new MeasureInfoItemValue { maxvalue = 50, minvalue = 30, text = BMILevelConst.Fat, color = LevelColor.Fat }); return list; } /// /// 肌肉量标准 /// /// /// /// /// public MeasureInfoItemValue muscleval_stand(GenderType sex, int age, decimal weight) { return muscleval_value(sex, age, weight).Skip(1).Take(1).FirstOrDefault(); } /// /// 肌肉重量标准范围 /// /// 性别 /// 年龄 /// 重量,kg /// public List muscleval_value(GenderType sex, int age, decimal weight) { var list = new List(); var values = muscle_value(sex, age); values.ForEach(x => { list.Add(new MeasureInfoItemValue { maxvalue = ((x.maxvalue / 100.0m) * weight).ToDecimal(1), minvalue = ((x.minvalue / 100.0m) * weight).ToDecimal(1), text = x.text, color = x.color }); }); return list; } /// /// 脂肪重量标准 /// /// /// /// /// public MeasureInfoItemValue fat_w_stand(GenderType sex, int age, decimal weight) { return fat_w_value(sex, age, weight).Skip(1).Take(1).FirstOrDefault(); } /// /// 脂肪重量标准范围 /// /// 性别 /// 年龄 /// 重量,kg /// public List fat_w_value(GenderType sex, int age, decimal weight) { var list = new List(); var values = fa_r_value(sex, age); values.ForEach(x => { list.Add(new MeasureInfoItemValue { maxvalue = ((x.maxvalue / 100.0m) * weight).ToDecimal(1), minvalue = ((x.minvalue / 100.0m) * weight).ToDecimal(1), text = x.text, color = x.color }); }); return list; } /// /// 脂肪率/体脂率标准 /// /// /// /// public MeasureInfoItemValue fat_r_stand(GenderType sex, int age) { return fa_r_value(sex, age).Skip(1).Take(1).FirstOrDefault(); } /// /// 脂肪率/体脂率范围标准 /// /// /// /// public List fa_r_value(GenderType sex, int age) => (sex, age) switch { _ when sex == GenderType.Male && age < 30 => new List { new MeasureInfoItemValue { maxvalue=10, minvalue=0, text = NewLevelModel.flat, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=21, minvalue=10, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=26, minvalue=21, text = NewLevelModel.high, color = LevelColor.OverWeight }, new MeasureInfoItemValue { maxvalue=50, minvalue=26, text = NewLevelModel.mhigh, color = LevelColor.Fat } }, _ when sex == GenderType.Male && age >= 30 => new List { new MeasureInfoItemValue { maxvalue=11, minvalue=0, text = NewLevelModel.flat, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=22, minvalue=11, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=27, minvalue=22, text = NewLevelModel.high, color = LevelColor.OverWeight }, new MeasureInfoItemValue { maxvalue=50, minvalue=27, text = NewLevelModel.mhigh, color = LevelColor.Fat } }, _ when sex == GenderType.FeMale && age < 30 => new List { new MeasureInfoItemValue { maxvalue=20, minvalue=0, text = NewLevelModel.flat, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=31, minvalue=20, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=38, minvalue=31, text = NewLevelModel.high, color = LevelColor.OverWeight }, new MeasureInfoItemValue { maxvalue=50, minvalue=38, text = NewLevelModel.mhigh, color = LevelColor.Fat } }, _ when sex == GenderType.FeMale && age >= 30 => new List { new MeasureInfoItemValue { maxvalue=21, minvalue=0, text = NewLevelModel.flat, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=32, minvalue=21, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=39, minvalue=32, text = NewLevelModel.high, color = LevelColor.OverWeight }, new MeasureInfoItemValue { maxvalue=50, minvalue=39, text = NewLevelModel.mhigh, color = LevelColor.Fat } }, _ => new List() }; /// /// 肌肉率范围 /// /// /// /// public List muscle_value(GenderType sex, int age) => (sex, age) switch { _ when sex == GenderType.Male => new List { new MeasureInfoItemValue { maxvalue=40, minvalue=0, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=60, minvalue=40, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=80, minvalue=60, text = NewLevelModel.fine, color = LevelColor.Fine } }, _ when sex == GenderType.FeMale => new List { new MeasureInfoItemValue { maxvalue=30, minvalue=0, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=50, minvalue=30, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=80, minvalue=50, text = NewLevelModel.fine, color = LevelColor.Fine } }, _ => new List() }; /// /// 水份范围 /// /// /// /// public List water_value(GenderType sex, int age) => (sex, age) switch { _ when sex == GenderType.Male => new List { new MeasureInfoItemValue { maxvalue=55, minvalue=0, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=65, minvalue=55, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=80, minvalue=65, text = NewLevelModel.fine, color = LevelColor.Fine } }, _ when sex == GenderType.FeMale => new List { new MeasureInfoItemValue { maxvalue=45, minvalue=0, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=60, minvalue=45, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=80, minvalue=60, text = NewLevelModel.fine, color = LevelColor.Fine } }, _ => new List() }; /// /// 骨骼肌量范围 /// /// /// /// public List skeletalmusclekg(GenderType sex, int age) { return new List { new MeasureInfoItemValue { maxvalue=20, minvalue=0, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=35, minvalue=20, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=50, minvalue=35, text = NewLevelModel.fine, color = LevelColor.Fine } }; } /// /// 骨量范围 /// /// /// /// 体重 /// public List bone_value(GenderType sex, int age, decimal weight) => (sex, age, weight) switch { _ when sex == GenderType.Male && weight < 60 => new List { new MeasureInfoItemValue { maxvalue=2.4m, minvalue=0, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=2.6m, minvalue=2.4m, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=5, minvalue=2.6m, text = NewLevelModel.fine, color = LevelColor.Fine } }, _ when sex == GenderType.Male && weight < 75 && weight >= 60 => new List { new MeasureInfoItemValue { maxvalue=2.8m, minvalue=0, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=3.0m, minvalue=2.8m, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=5, minvalue=3.0m, text = NewLevelModel.fine, color = LevelColor.Fine } }, _ when sex == GenderType.Male && weight >= 75 => new List { new MeasureInfoItemValue { maxvalue=3.1m, minvalue=0, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=3.3m, minvalue=3.1m, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=5, minvalue=3.3m, text = NewLevelModel.fine, color = LevelColor.Fine } }, _ when sex == GenderType.FeMale && weight < 45 => new List { new MeasureInfoItemValue { maxvalue=1.7m, minvalue=0, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=1.9m, minvalue=1.7m, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=5, minvalue=1.9m, text = NewLevelModel.fine, color = LevelColor.Fine } }, _ when sex == GenderType.FeMale && weight < 60 && weight >= 45 => new List { new MeasureInfoItemValue { maxvalue=2.1m, minvalue=0, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=2.3m, minvalue=2.1m, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=5, minvalue=2.3m, text = NewLevelModel.fine, color = LevelColor.Fine } }, _ when sex == GenderType.FeMale && weight >= 60 => new List { new MeasureInfoItemValue { maxvalue=2.4m, minvalue=0, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { maxvalue=2.6m, minvalue=2.4m, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { maxvalue=5, minvalue=2.6m, text = NewLevelModel.fine, color = LevelColor.Fine } }, _ => new List() }; /// /// 基础代谢范围 /// /// /// /// /// public List kcal_value(GenderType sex, int age, decimal weight) => (sex, age, weight) switch { _ when sex == GenderType.Male && age < 3 && age > 0 => new List { new MeasureInfoItemValue { minvalue = (60.9*weight.ToDouble()-54).ToDecimal(2), maxvalue = (60.9*weight.ToDouble()-54).ToDecimal(2) } }, _ when sex == GenderType.Male && age < 10 && age >= 3 => new List { new MeasureInfoItemValue { minvalue = (22.7*weight.ToDouble()+495).ToDecimal(2), maxvalue = (22.7*weight.ToDouble()+495).ToDecimal(2), } }, _ when sex == GenderType.Male && age < 18 && age >= 10 => new List { new MeasureInfoItemValue { minvalue = (17.5*weight.ToDouble()+651).ToDecimal(2), maxvalue = (17.5*weight.ToDouble()+651).ToDecimal(2) } }, _ when sex == GenderType.Male && age < 30 && age >= 18 => new List { new MeasureInfoItemValue { minvalue = (15.3*weight.ToDouble()+679).ToDecimal(2), maxvalue = (15.3*weight.ToDouble()+679).ToDecimal(2) } }, _ when sex == GenderType.Male && age >= 30 => new List { new MeasureInfoItemValue { minvalue = (11.6*weight.ToDouble()+879).ToDecimal(2), maxvalue = (11.6*weight.ToDouble()+879).ToDecimal(2) } }, _ when sex == GenderType.FeMale && age < 3 && age > 0 => new List { new MeasureInfoItemValue { minvalue = (61.0*weight.ToDouble()-51).ToDecimal(2), maxvalue = (61.0*weight.ToDouble()-51).ToDecimal(2) } }, _ when sex == GenderType.FeMale && age < 10 && age >= 3 => new List { new MeasureInfoItemValue { minvalue = (22.5*weight.ToDouble()+499).ToDecimal(2), maxvalue = (22.5*weight.ToDouble()+499).ToDecimal(2), } }, _ when sex == GenderType.FeMale && age < 18 && age >= 10 => new List { new MeasureInfoItemValue { minvalue = (12.2*weight.ToDouble()+746).ToDecimal(2), maxvalue = (12.2*weight.ToDouble()+746).ToDecimal(2) } }, _ when sex == GenderType.FeMale && age < 30 && age >= 18 => new List { new MeasureInfoItemValue { minvalue = (14.7*weight.ToDouble()+496).ToDecimal(2), maxvalue = (14.7*weight.ToDouble()+496).ToDecimal(2) } }, _ when sex == GenderType.FeMale && age >= 30 => new List { new MeasureInfoItemValue { minvalue = (8.7*weight.ToDouble()+820).ToDecimal(2), maxvalue = (8.7*weight.ToDouble()+820).ToDecimal(2) } }, _ => new List() }; /// /// 内脂范围 /// /// /// /// public List visceral_value(GenderType sex, int age) => (sex, age) switch { _ => new List { new MeasureInfoItemValue { minvalue=0, maxvalue=9, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { minvalue=9, maxvalue=14, text = NewLevelModel.alert, color = LevelColor.OverWeight }, new MeasureInfoItemValue { minvalue=14, maxvalue=20, text = NewLevelModel.danger, color = LevelColor.Fat } } }; /// /// 蛋白量标准范围 /// /// /// /// /// public List proteinval_value(GenderType sex, int age, decimal weight) { var list = new List(); var values = protein_value(sex, age); values.ForEach(x => { list.Add(new MeasureInfoItemValue { maxvalue = ((x.maxvalue / 100.0m) * weight).ToDecimal(1), minvalue = ((x.minvalue / 100.0m) * weight).ToDecimal(1), text = x.text, color = x.color }); }); return list; } /// /// 蛋白质范围 /// /// /// /// public List protein_value(GenderType sex, int age) => (sex, age) switch { _ when sex == GenderType.Male => new List { new MeasureInfoItemValue { minvalue=0, maxvalue=16, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { minvalue=16, maxvalue=18, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { minvalue=18, maxvalue=25, text = NewLevelModel.fine, color = LevelColor.Fine } }, _ when sex == GenderType.FeMale => new List { new MeasureInfoItemValue { minvalue=0, maxvalue=14, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { minvalue=14, maxvalue=16, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { minvalue=16, maxvalue=25, text = NewLevelModel.fine, color = LevelColor.Fine } }, _ => new List() }; /// /// 皮下脂肪范围 /// /// /// /// public List sfr_value(GenderType sex, int age) => (sex, age) switch { _ when sex == GenderType.Male => new List { new MeasureInfoItemValue { minvalue=0, maxvalue=7, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { minvalue=7, maxvalue=15, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { minvalue=15, maxvalue=25, text = NewLevelModel.high, color = LevelColor.OverWeight } }, _ when sex == GenderType.FeMale => new List { new MeasureInfoItemValue { minvalue=0, maxvalue=11, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { minvalue=11, maxvalue=17, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { minvalue=17, maxvalue=25, text = NewLevelModel.high, color = LevelColor.OverWeight } }, _ => new List() }; /// /// 皮下脂肪量范围 /// /// /// /// /// public List sfrval_value(GenderType sex, int age, decimal weight) { var list = new List(); var values = sfr_value(sex, age); values.ForEach(x => { list.Add(new MeasureInfoItemValue { maxvalue = ((x.maxvalue / 100.0m) * weight).ToDecimal(1), minvalue = ((x.minvalue / 100.0m) * weight).ToDecimal(1), text = x.text, color = x.color }); }); return list; } /// /// 骨骼肌量标准 /// /// /// /// 骨骼肌值 /// public List skeletalmusclekg_val(GenderType sex, int age, decimal val) { decimal maxval = 50; if (val > maxval) { maxval = val; } return new List { new MeasureInfoItemValue { minvalue=1, maxvalue=20, text = NewLevelModel.notenu, color = LevelColor.Thin }, new MeasureInfoItemValue { minvalue=20, maxvalue=35, text = NewLevelModel.normal, color = LevelColor.Normal }, new MeasureInfoItemValue { minvalue=35, maxvalue=maxval, text = NewLevelModel.fine, color = LevelColor.Fine } }; } /// /// 获取儿童身高范围 /// /// 1-男,2-女 /// 月龄 /// public List ChildHeightStand(GenderType sex, int month) { return null; } /// /// 获取儿童体重范围 /// /// 1-男,2-女 /// 月龄 /// public List ChildWeightStand(GenderType sex, int month) { return null; } /// /// 品传2/4电极计算体脂 /// /// 体重,单位为kg /// 身高,单位为厘米 /// 年龄 /// 阻抗 /// 性别,1-男,2-女,0-未知 /// public UserMeasureModel PCCalcBodyFat(double weight, double height, int age, int adc, GenderType sex) { adc = Adc(weight, height); //算法使用的性别为1-男,2-女 int sexval = sex == GenderType.FeMale ? 2 : 1; int IntHeight = height.ToInt(); var result = _healthcalcService.GetBodyFatResultsV3(new Hinse.Health.BodyCalcData24 { Adc = adc, Age = age, Gender = sexval, Height = IntHeight, Weight = weight }); decimal dwegiht = weight.ToDecimal(); var data = new UserMeasureModel { bmi = result.bmi.ToDecimal(2), bmiLevel = bmi(result.bmi.ToFloat()), fat_r = result.bfr.ToDecimal(2), fat_rLevel = Fat_r(result.bfr.ToFloat(), sex, age), bodyage = result.bodyage, bodyageLevel = bodyage(result.bodyage, age), fat_w = result.bfrval.ToDecimal(2), fat_wLevel = Fat_r(result.bfr.ToFloat(), sex, age), bone = result.bm.ToDecimal(2), boneLevel = bone(result.bm.ToFloat(), weight, sex), kcal = result.bmr.ToDecimal() < 0 ? 0 : result.bmr.ToDecimal(2), kcalLevel = kcal(result.bmr.ToFloat(), weight, age, sex), muscle = result.rom.ToDecimal(2), muscleLevel = muscle(result.rom.ToFloat(), weight, age, sex), protein = result.pp.ToDecimal(2), proteinLevel = protein(result.pp.ToFloat(), weight, age, sex), visceral = result.uvi.ToDecimal(2), visceralLevel = visceral(result.uvi.ToFloat(), weight, age, sex), water = result.vwc.ToDecimal(3), waterLevel = water(result.vwc.ToFloat(), weight, age, sex), cmi = score(result.bmi.ToFloat()).ToDecimal(1), muscleval = result.romval.ToDecimal(2), proteinval = result.ppval.ToDecimal(3), lbm = result.lbm.ToDecimal(2), standardWeight = standweight(IntHeight, sex).ToString("f2"), sfr = result.sfr.ToDecimal(2), sfrLevel = sfr(result.sfr.ToFloat(), weight, age, sex), body = "0", standardfat_r = fa_r_value(sex, age).ToJson(), standardbmi = bmi_value(sex, age).ToJson(), standardmuscle = muscle_value(sex, age).ToJson(), standardmuscleval = muscleval_value(sex, age, dwegiht).ToJson(), standardwater = water_value(sex, age).ToJson(), standardbone = bone_value(sex, age, dwegiht).ToJson(), standardkcal = kcal_value(sex, age, dwegiht).ToJson(), standardfat_w = fat_w_value(sex, age, dwegiht).ToJson(), standardviscera = visceral_value(sex, age).ToJson(), standardprotein = protein_value(sex, age).ToJson(), standardproteinval = proteinval_value(sex, age, dwegiht).ToJson(), standardbodyage = "", standardsfr = sfr_value(sex, age).ToJson(), weight = weight.ToDecimal(2), height = height.ToDecimal(2), skeletalmuscle = 0 }; data.bodylevel = body(data.fat_rLevel, data.muscleLevel); data.musulevalLevel = data.muscleLevel; data.proteinvalLevel = data.proteinLevel; double level = (weight - data.standardWeight.ToDouble()) / data.standardWeight.ToDouble(); data.fatLevel = fatlevel(level); data.fatlevlval = level.ToString("f2"); return data; } /// /// 获取八电极每项值 /// /// /// /// private static string GetBodyValue(string name, BodyResponseData data) => (name, data) switch { _ when name == "exerciseplanner" => data.value == null ? "" : data.value.ToString(), //训练计划 _ => data.value == null ? "" : data.value.ToString() }; /// /// 获取八电极每项值的标准 /// /// /// /// private static string GetBodyValueLevel(string name, BodyResponseData data) => (name, data) switch { _ when name == "exerciseplanner" => "", //训练计划 _ => data.level.value.ToString().Length == 1 ? $"偏{data.level.value}" : data.level.value.ToString() }; /// /// TODO:动态生成阻抗值,按照每变0.1BMI变化1.6阻抗值,20230321 /// /// 体重,kg /// 身高,cm /// private int Adc(double weight, double height) { var mheight = height / 100.0; var bmi = (weight / (mheight * mheight) * 10.0) / 10.0; double standval = 500; //基础变量 double val = 550; //标准阻抗 if (bmi < 18.5) { //每减少1点BMI值,则阻抗 550-n*10 val = standval - (18.5 - bmi) * 10.0; val = val < 450 ? 450 : val; } if (bmi >= 24 && bmi < 28) { //每增加1点BMI值,则阻抗 550+n*23 val = standval + (bmi - 24) * 30.0; } if (bmi >= 28) { //每增加1点BMI值,则阻抗 550+n*43 val = standval + (bmi - 24) * 53.0; val = val > 1000 ? 1000 : val; } return val.ToInt(); } /// /// BMI指标标准 /// public class BMILevel { /// /// 异常 /// public const string Error = "异常"; /// /// 消瘦 /// public const string Thin = "偏瘦"; /// /// 正常 /// public const string Normal = "正常"; /// /// 超重 /// public const string OverWeight = "超重"; /// /// 肥胖 /// public const string Fat = "肥胖"; } /// /// 身高标准 /// public class HeightLevel { /// /// 异常 /// public const string Error = "异常"; /// /// 严重偏矮 /// public const string MoreLow = "严重偏矮"; /// /// 矮 /// public const string Low = "矮"; /// /// 偏矮 /// public const string LittleLow = "偏矮"; /// /// 正常 /// public const string Normal = "正常"; /// /// 高 /// public const string Height = "高"; } /// /// 体重标准 /// public class WeightLevel { /// /// 异常 /// public const string Error = "异常"; /// /// 偏低 /// public const string LittleLow = "偏低"; /// /// 正常 /// public const string Normal = "正常"; /// /// 偏高 /// public const string Height = "偏高"; } /// /// 算法返回结果定义 /// public class BodyfatItem { /// /// bmi /// public string bmi; /// /// 骨量 /// public string bm; /// /// 肌肉率 /// public string rom; /// /// 水分 /// public string moi; /// /// 脂肪率 /// public string bfr; /// /// 皮下脂肪率 /// public string sfr; /// /// 骨骼肌率 /// public string rosm; /// /// 蛋白率 /// public string pp; /// /// 内脏脂肪指数 /// public string uvi; /// /// 基础代谢率 /// public string bmr; /// /// 身体年龄 /// public string physicAge; /// /// 体重 /// public double weight; /// /// 身高 /// public double height; /// /// 年龄 /// public int age; /// /// 阻抗 /// public int adc; /// /// 性别,0-女,1-男 /// public int sex; } /// /// 盛群八电极算法返回的结果 /// public class HTBodyFatReturnData : HTBodyFatReturnItem { /// /// 返回状态 GetBodyFatOk(所有参数有效) /// UserZTwoLegsError/UserAgeError/UserGenderError(除BMI及李想体重外都无效)(除BMI及理想体重外都无效) /// UserWeightError/UserHeightError(所有参数无效) /// public string ErrorType { get; set; } /// /// 体脂算法版本号,两位小数 /// public decimal VersionNumber { get; set; } /// /// 更新信息 /// public string UpdateInfo { get; set; } = ""; /// /// 脚对脚阻抗值,范围200.0-1200.0 /// public decimal ZTwoLegs { get; set; } } /// /// 盛群八电极算法返回的测量结果 /// public class HTBodyFatReturnItem { /// /// 理想体重,若体重或身高参数有误,则返回0 /// public decimal IdealWeightKg { get; set; } /// /// 人体质量指数,分辨率0.1,范围10.0-90.0 /// public decimal BMI { get; set; } /// /// 人体质量标准,有三个uansu,分别对应,瘦-普通,普通-偏胖,偏胖-肥胖的分界值 /// public List BMIRatingList { get; set; } /// /// 基础代谢,分辨率1,范围500-10000 /// public int BMR { get; set; } /// /// 基础代谢健康标准,需先调用BMR(),一个元素,对应"偏低-达标"的分界值 /// public List BMRRatingList { get; set; } /// /// 脂肪率(%), 分辨率0.1, 范围5.0% ~ 75.0% /// public decimal BodyfatPercentage { get; set; } /// /// 脂肪率健康标准,需先调用BodyfatPercentage(),返回的数组有四个元素,对应"偏瘦-标准"、“标准-警惕”、“警惕-偏胖”、“偏胖-肥胖”的分界值 /// public List BodyfatRatingList { get; set; } /// /// 骨量(kg), 分辨率0.1, 范围0.5 ~ 8.0 /// public decimal BoneKg { get; set; } /// /// 骨量等级标准,需先调用BoneKg(),两个元素,对应"不足-标准"、“标准-优秀”的分界值 /// public List BoneRatingList { get; set; } /// /// 肌肉量(kg), 分辨率0.1, 范围10.0 ~ 120.0 /// public decimal Muscle { get; set; } /// /// 肌肉量健康标准,需先调用Muscle(),两个元素,对应"不足-标准"、“标准-优秀”的分界值 /// public List MuscleRatingList { get; set; } /// /// 内脏脂肪, 分辨率1, 范围1 ~ 6 /// public int VFAL { get; set; } /// /// 内脏脂肪等级标准,两个元素,对应"标准-警惕"、"警惕-危险"的分界值 /// public List VFALRatingList { get; set; } /// /// 水分率(%), 分辨率0.1, 范围35.0% ~ 75.0% /// public decimal WaterPercentage { get; set; } /// /// 水分率健康标准,两个元素,对应"不足-标准"、“标准-优秀” /// public List WaterRatingList { get; set; } /// /// 体龄 /// public int BodyAge { get; set; } /// /// ProteinPercentage /// public decimal ProteinPercentage { get; set; } /// /// 蛋白质健康标准,两个元素,对应"不足-标准"、“标准-优秀” /// public List ProteinRatingList { get; set; } } } }