using DotNetCore.CAP; using Furion.DependencyInjection; using Furion.DistributedIDGenerator; using Mapster; using Nirvana.Common; using Nirvana.Common.ApiBase; using SqlSugar; using System; using System.Collections.Generic; using System.Threading.Tasks; using YBDevice.Body.BodyFatHelper; using YBDevice.CommonService; using YBDevice.CommonService.DevTypeInfo; using YBDevice.Entity; using YBDevice.NApi.Application.UserInfo; namespace YBDevice.NApi.Application.MeasureInfo { /// /// 用户测量处理 /// public class ResultService : BaseService, IResultService, ITransient { private readonly ISqlSugarRepository repository; private readonly SqlSugarClient dbClient; private readonly IBodyFatHelperService _bodyFatHelperService; private readonly IDeviceTypeService _deviceTypeService; private readonly ICapPublisher _capBus; private readonly IUserService _userService; public ResultService(ISqlSugarRepository sqlSugarRepository, IBodyFatHelperService bodyFatHelperService, ICapPublisher capPublisher, IDeviceTypeService deviceTypeService, IUserService userService) { repository = sqlSugarRepository; dbClient = repository.Context; _bodyFatHelperService = bodyFatHelperService; _capBus = capPublisher; _deviceTypeService = deviceTypeService; _userService = userService; } /// /// 增加测量记录,用于蓝牙传输,适用于F01PRO /// /// /// public async Task MeasureDataAsync(MeasureDataSubmitModel model) { //检查家庭成员是否存在 if (!await dbClient.Queryable().AnyAsync(x => x.Id == model.familyid)) { return new ResultInfo(ResultState.FAIL, "家庭成员未找到"); } //检查设备是否存在 var device = await dbClient.Queryable().FirstAsync(x => x.Ecode == model.ecode); if (device == null) { return new ResultInfo(ResultState.DEVNOTFOUND, "设备未找到,请到管理端进行激活"); } if (device.Status != DeviceStatus.Run) { return new ResultInfo(ResultState.DEVNOTFOUND, "设备还未激活,请先激活"); } decimal weight = AnalyWeight(model.weight); var family = await dbClient.Queryable().FirstAsync(x => x.Id == model.familyid); //增加yb_nresult var result = new YB_nResult { Id = IDGen.NextID(), SourceType = 1, BusinessId = device.BusinessId, CreateTime = DateTime.Now, DevType = device.Type, EquId = device.Id, Height = model.height, Weight = weight, Imp = model.imp, LeftArmImp = 0, RightArmImp = 0, LeftLegImp = 0, RightLegImp = 0 }; await dbClient.Insertable(result).ExecuteCommandAsync(); //用户认领,加入认领表并进行结果计算 var month = family.Birthday.ToMonth(); var fansid = await dbClient.Queryable().Where(x => x.Id == authInfo.UserId).Select(x => x.FansId).FirstAsync(); //增加yb_nuserresult var userresult = new YB_nUserResult { CreateTime = result.CreateTime, FamilyId = model.familyid, Id = result.Id, UserId = authInfo.UserId, DevType = result.DevType, FansId = fansid, Status = 1 }; await dbClient.Insertable(userresult).ExecuteCommandAsync(); //计算结果 MeasureCalcDto calcdata = new MeasureCalcDto { weight = weight.ToString(), imp = model.imp, height = model.height, ecode = model.ecode, familyid = model.familyid, bodyage = model.bodyage, fat_r = model.fat_r, muscle = model.muscle, water = model.water, bone = model.bone, kcal = model.kcal, visceral = model.visceral, protein = model.protein, bmi = model.bmi, sfr = model.sfr, fatlevlval = model.fatlevlval, StandardWeight = model.StandardWeight, fat_w = model.fat_w, lbm = model.lbm, muscleval = model.muscleval, proteinval = model.proteinval, age = family.Age, sex = family.Sex }; var calcresult = _bodyFatHelperService.CalcBodyFat(calcdata); //增加计算结果 var measureresult = new YB_nMeasureResult { Id = result.Id, sfr = calcresult.sfr, Sex = family.Sex, SfrVal = 0, SkeletalMuscle = 0, Age = family.Age, DevType = device.Type, bmi = calcresult.bmi, body = calcresult.bodylevel, bodyage = calcresult.bodyage, BodyFat = 0, BodyFatVal = 0, BodyMuscle = 0, BodyMuscleVal = 0, bone = calcresult.bone, cmi = calcresult.cmi, createtime = DateTime.Now, fatlevel = calcresult.fatLevel, fat_r = calcresult.fat_r, fat_w = calcresult.fat_w, Height = model.height, IdealWeight = calcresult.standardWeight.ToDecimal(), kcal = calcresult.kcal, lbm = calcresult.lbm, LeftFootFat = 0, LeftFootFatVal = 0, LeftFootMuscle = 0, LeftFootMuscleVal = 0, LeftHandFat = 0, LeftHandFatVal = 0, LeftHandMuscle = 0, LeftHandMuscleVal = 0, Month = month, muscle = calcresult.muscle, muscleval = calcresult.muscleval, protein = calcresult.protein, proteinval = calcresult.proteinval, RightFootFat = 0, RightFootFatVal = 0, RightFootMuscle = 0, RightFootMuscleVal = 0, RightHandFat = 0, RightHandFatVal = 0, RightHandMuscle = 0, RightHandMuscleVal = 0, visceral = calcresult.visceral, water = calcresult.water, Weight = calcresult.weight }; await dbClient.Insertable(measureresult).ExecuteCommandAsync(); //更新家庭成员的最新体重 await dbClient.Updateable().SetColumns(x => new YB_Family { Weight = weight, Height = model.height, LastHeartTime = result.CreateTime }).Where(x => x.Id == family.Id).ExecuteCommandAsync(); //更新家庭成员统计数据 if (family.LastHeartTime.HasValue) { await dbClient.Updateable().SetColumns(x => new YB_FamilyData { LastHeight = model.height, LastWeight = weight, LastResultTime = result.CreateTime, TotalCount = x.TotalCount + 1, TodayCount = x.TodayCount + 1, LastTimeWeight = x.LastWeight - weight, LastTimeHeight = x.LastHeight - model.height, LastResultHeightTime = result.CreateTime }).Where(x => x.FamilyId == family.Id).ExecuteCommandAsync(); } else { await dbClient.Updateable().SetColumns(x => new YB_FamilyData { LastHeight = model.height, LastWeight = weight, LastResultTime = result.CreateTime, TotalCount = x.TotalCount + 1, TodayCount = x.TodayCount + 1, LastTimeWeight = 0, LastTimeHeight = 0, FirstResultTime = result.CreateTime, FirstHeight = model.height, FirstWeight = weight, LastResultHeightTime = result.CreateTime }).Where(x => x.FamilyId == family.Id).ExecuteCommandAsync(); } //更新家庭成员数据 List devtypes = await _deviceTypeService.GetDevTypesAsync(device.Type); var familyrealdata = await dbClient.Queryable().FirstAsync(x => x.FamilyId == family.Id && x.DevType == device.Type); if (familyrealdata != null) { decimal monthheight = familyrealdata.MonthHeight; decimal monthweight = familyrealdata.MonthWeight; //是否为同一个月 var nowtime = DateTime.Now; if (result.CreateTime.Year == nowtime.Year && result.CreateTime.Month == nowtime.Month) { monthheight = familyrealdata.MonthHeight > model.height ? familyrealdata.MonthHeight : model.height; monthweight = familyrealdata.LastResultTime < result.CreateTime ? weight : familyrealdata.MonthWeight; } await dbClient.Updateable().SetColumns(x => new YB_FamilyRealData { LastHeight = model.height, LastWeight = weight, LastResultTime = result.CreateTime, TotalCount = x.TotalCount + 1, TodayCount = x.TodayCount + 1, LastTimeHeight = x.LastHeight - model.height, LastTimeWeight = x.LastWeight - weight, MonthHeight = monthheight, MonthWeight = monthweight, LastResultId = result.Id, LastResultHeightTime = result.CreateTime }).Where(x => x.FamilyId == family.Id && devtypes.Contains(x.DevType)).ExecuteCommandAsync(); } //更新合计数据并添加用户设备类型 await _capBus.PublishAsync("result.service.updaterealdata", new UpdateRealDataS2SDtO { CreateTime = result.CreateTime, DevId = device.Id, familyid = family.Id, height = model.height, IsUserTake = true, UserId = userresult.UserId, weight = weight }); return new ResultInfo(ResultState.SUCCESS, "测量成功"); } /// /// 添加测量记录 /// /// /// /// /// private async Task InsertResultAsync(InsertResultC2SDto data, YB_Device device, YB_Family family) { if (!data.CreateTime.HasValue) { data.CreateTime = DateTime.Now; } var familyrealdata = await dbClient.Queryable().FirstAsync(x => x.FamilyId == data.familyid && x.DevType == device.Type); if (familyrealdata == null) { familyrealdata = new YB_FamilyRealData { FamilyId = data.familyid, FirstHeight = data.height, FirstResultTime = data.CreateTime, DevType = device.Type, CreateTime = DateTime.Now, FirstWeight = data.weight, Id = IDGen.NextID(), LastHeight = data.height, LastResultTime = data.CreateTime, LastTimeHeight = 0, LastTimeWeight = 0, LastWeight = data.weight, TodayCount = 0, TotalCount = 0, UserId = family.UserId, MonthHeight = data.height, MonthWeight = data.weight, LastResultHeightTime = data.CreateTime, LastHead = data.Head, MonthHead = data.Head }; await dbClient.Insertable(familyrealdata).ExecuteCommandAsync(); } if (data.SourceType != 2 || (data.SourceType == 2 && (!familyrealdata.LastResultTime.HasValue || familyrealdata.LastResultTime.Value <= data.CreateTime))) { //更新家庭成员的最新体重 await dbClient.Updateable().SetColumns(x => new YB_Family { Weight = data.weight, Height = data.height, LastHeartTime = data.CreateTime, Head = data.Head }).Where(x => x.Id == data.familyid).ExecuteCommandAsync(); //更新家庭成员统计数据 if (family.LastHeartTime.HasValue) { await dbClient.Updateable().SetColumns(x => new YB_FamilyData { LastHeight = data.height, LastWeight = data.weight, LastHead = data.Head, LastResultTime = data.CreateTime, TotalCount = x.TotalCount + 1, TodayCount = x.TodayCount + 1, LastTimeWeight = x.LastWeight - data.weight, LastTimeHeight = x.LastHeight - data.height, LastResultHeightTime = data.CreateTime }).Where(x => x.FamilyId == data.familyid).ExecuteCommandAsync(); } else { await dbClient.Updateable().SetColumns(x => new YB_FamilyData { LastHeight = data.height, LastWeight = data.weight, LastHead = data.Head, LastResultTime = data.CreateTime, TotalCount = x.TotalCount + 1, TodayCount = x.TodayCount + 1, LastTimeWeight = 0, LastTimeHeight = 0, FirstResultTime = data.CreateTime, FirstHeight = data.height, FirstWeight = data.weight, LastResultHeightTime = data.CreateTime }).Where(x => x.FamilyId == data.familyid).ExecuteCommandAsync(); } //更新家庭成员数据 List devtypes = await _deviceTypeService.GetDevTypesAsync(device.Type); if (familyrealdata != null) { decimal monthheight = familyrealdata.MonthHeight; decimal monthweight = familyrealdata.MonthWeight; decimal monthhead = familyrealdata.MonthHead; //是否为同一个月 var nowtime = DateTime.Now; if (data.CreateTime.Value.Year == nowtime.Year && data.CreateTime.Value.Month == nowtime.Month) { monthheight = familyrealdata.MonthHeight > data.height ? familyrealdata.MonthHeight : data.height; monthweight = familyrealdata.LastResultTime < data.CreateTime ? data.weight : familyrealdata.MonthWeight; monthhead = familyrealdata.LastResultTime < data.CreateTime ? data.Head : familyrealdata.MonthHead; } await dbClient.Updateable().SetColumns(x => new YB_FamilyRealData { LastHeight = data.height, LastWeight = data.weight, LastHead = data.Head, LastResultTime = data.CreateTime, TotalCount = x.TotalCount + 1, TodayCount = x.TodayCount + 1, LastTimeHeight = x.LastHeight - data.height, LastTimeWeight = x.LastWeight - data.weight, MonthHeight = monthheight, MonthWeight = monthweight, LastResultId = data.ResultId, LastResultHeightTime = data.CreateTime, MonthHead = monthhead }).Where(x => x.FamilyId == data.familyid && devtypes.Contains(x.DevType)).ExecuteCommandAsync(); } } await _capBus.PublishAsync("result.service.insertuserresult", new InsertResultDataS2SDto { CreateTime = data.CreateTime, SourceType = data.SourceType, BusinessId = device.BusinessId, DeviceLastHeartTime = device.LastHeartTime, DevId = device.Id, DevType = device.Type, ecode = device.Ecode, familyid = data.familyid, fansid = data.fansid, height = data.height, Head = data.Head, imp = data.imp, IsUserTake = data.IsUserTake, LeftArmImp = data.LeftArmImp, LeftLegImp = data.LeftLegImp, orderid = data.orderid, publicid = data.publicid, ResultId = data.ResultId, RightArmImp = data.RightArmImp, RightLegImp = data.RightLegImp, UserId = data.UserId, weight = data.weight }); } /// /// 解析身高 /// /// 身高值,带有单位 /// private decimal AnalyHeight(string height) { decimal dheight = 0; height = height.ToLower(); if (height.Contains("cm")) { dheight = height.Substring(0, height.Length - 2).ToDecimal(); } else if (height.Contains("ft")) { dheight = (height.Substring(0, height.Length - 2).ToDecimal()) * 0.3048m * 100; } else { dheight = height.ToDecimal(); } dheight = dheight.ToDecimal(1); return dheight; } /// /// 体重解析 /// /// 重量值,带有单位 /// private decimal AnalyWeight(string weight) { var wg = weight.ToUpper(); if (wg.Contains("LB")) { wg = (wg.Replace("LB", "").ToDouble() * 0.4536).ToString(); } else if (wg.Contains("JIN")) { wg = (wg.Replace("JIN", "").ToDouble() / 2.0).ToString(); } else if (wg.Contains("ST")) //英石 { wg = (wg.Replace("ST", "").ToDouble() * 6.35).ToString(); } else if (wg.Contains("G") && !wg.Contains("KG")) //克 { wg = (wg.Replace("G", "").ToDouble() / 1000.0).ToString(); } else { wg = wg.Replace("KG", ""); } return wg.ToDecimal(2); } /// /// 增加测量记录,用于蓝牙传输,身高带有单位(cm/ft) /// /// /// public async Task MeasureOfUnitAsync(MeasureOfUnitSubmitModel model) { //解析身高 decimal height = AnalyHeight(model.height); return await MeasureAsync(new MeasureSubmitModel { ecode = model.ecode, familyid = model.familyid, height = height, imp = model.imp, weight = model.weight, Head = model.Head }); } /// /// 增加测量记录,用于蓝牙传输 /// /// /// public async Task MeasureAsync(MeasureSubmitModel model) { //检查家庭成员是否存在 var family = await dbClient.Queryable().FirstAsync(x => x.Id == model.familyid); if (family == null) { return new ResultInfo(ResultState.FAIL, "家庭成员未找到"); } //检查设备是否存在 var device = await dbClient.Queryable().FirstAsync(x => x.Ecode == model.ecode); if (device == null) { return new ResultInfo(ResultState.DEVNOTFOUND, "设备未找到,请到管理端进行激活"); } if (device.Status != DeviceStatus.Run) { return new ResultInfo(ResultState.DEVNOTFOUND, "设备还未激活,请先激活"); } decimal weight = AnalyWeight(model.weight); await InsertResultAsync(new InsertResultC2SDto { DevId = device.Id, SourceType = 1, ecode = device.Ecode, familyid = family.Id, height = model.height, imp = model.imp, IsUserTake = true, UserId = authInfo.UserId, weight = weight, ResultId = IDGen.NextID(), CreateTime = DateTime.Now, fansid = null, LeftArmImp = 0, LeftLegImp = 0, orderid = null, publicid = "", Head = model.Head, RightArmImp = 0, RightLegImp = 0 }, device, family); return new ResultInfo(ResultState.SUCCESS, "测量成功"); } /// /// 手动增加测量记录 /// /// /// public async Task InsertMeasureAsync(UserMeasureSubmitModel model) { var family = await dbClient.Queryable().FirstAsync(x => x.Id == model.familyid); //检查家庭成员是否存在 if (family == null) { return new ResultInfo(ResultState.FAIL, "家庭成员未找到"); } //查找最近使用的设备 var familydata = await dbClient.Queryable().FirstAsync(x => x.DevType == model.DevType && x.FamilyId == model.familyid); YB_Device device = null; if (familydata != null && familydata.LastResultId.HasValue && familydata.LastResultId.Value != Guid.Empty) { var lastresult = await dbClient.Queryable().FirstAsync(x => x.Id == familydata.LastResultId); if (lastresult != null) { device = await dbClient.Queryable().FirstAsync(x => x.Id == lastresult.EquId); } } if (device == null) { device = await dbClient.Queryable().FirstAsync(x => x.Id == 1); } var ctime = model.time.ToDate(); string time = $"{ctime.Year}-{ctime.Month}-{ctime.Day} {DateTime.Now.Hour}:{DateTime.Now.Minute}:{DateTime.Now.Second}"; DateTime createtime = time.ToDate(); device.Type = model.DevType; await InsertResultAsync(new InsertResultC2SDto { DevId = device.Id, SourceType = 2, ecode = device.Ecode, familyid = family.Id, height = model.Height <= 0 ? family.Height : model.Height, imp = 0, IsUserTake = true, UserId = authInfo.UserId, weight = model.weight, CreateTime = createtime, fansid = null, LeftArmImp = 0, LeftLegImp = 0, orderid = null, publicid = "", ResultId = IDGen.NextID(), RightArmImp = 0, RightLegImp = 0, Head = model.Head }, device, family); return new ResultInfo(ResultState.SUCCESS, "记录成功"); } /// /// 获取历史记录 /// /// 查询参数 /// public async Task> GetHistoryListAsync(ParamQuery param) { int familyid = param.keyword.ToInt(); List devtypes = new List(); var tempquery = dbClient.Queryable((u, x) => new JoinQueryInfos( JoinType.Left, u.Id == x.Id )).Where((u, x) => u.FamilyId == familyid && u.Status == 1); if (param.devtype > 0) { devtypes = await _deviceTypeService.GetDevTypesAsync(param.devtype); tempquery = tempquery.Where((u, x) => SqlFunc.ContainsArray(devtypes, u.DevType)); } RefAsync totalnum = 0; var query = await tempquery.OrderBy((u, x) => x.createtime, OrderByType.Desc) .Select((u, x) => new MeasureHisList { bmi = x.bmi, body = x.body, bodyage = x.bodyage, bone = x.bone, cmi = x.cmi, createtime = SqlFunc.ToString(x.createtime), fatlevel = x.fatlevel, fat_r = x.fat_r, fat_w = x.fat_w, Height = x.Height, kcal = x.kcal, lbm = x.lbm, muscle = x.muscle, muscleval = x.muscleval, protein = x.protein, proteinval = x.proteinval, sfr = x.sfr, visceral = x.visceral, water = x.water, weight = x.Weight, Age = SqlFunc.ToString(x.Age), Month = x.Month, Id = x.Id }) .Mapper((it, cache) => { it.bmi = it.bmi.ToDecimal(1); it.createtime = it.createtime.ToYearDateTime(); it.Age = it.Month.TomAge(); it.bone = it.bone.ToDecimal(1); it.cmi = it.cmi.ToDecimal(1); it.fat_r = it.fat_r.ToDecimal(1); it.fat_w = it.fat_w.ToDecimal(1); it.kcal = it.kcal.ToDecimal(1); it.lbm = it.lbm.ToDecimal(1); it.muscle = it.muscle.ToDecimal(1); it.muscleval = it.muscleval.ToDecimal(1); it.protein = it.protein.ToDecimal(1); it.proteinval = it.proteinval.ToDecimal(1); it.sfr = it.sfr.ToDecimal(1); it.visceral = it.visceral.ToDecimal(1); it.water = it.water.ToDecimal(1); it.weight = it.weight.ToDecimal(1); }) .ToPageListAsync(param.page, param.pagesize, totalnum); return new PageParms { page = param.page, Items = query, totalnum = totalnum, limit = param.pagesize }; } /// /// 手动添加的历史记录 /// /// /// public async Task> GetAddListAsync(ParamQuery param) { var tempquery = dbClient.Queryable(); RefAsync totalnum = 0; if (!string.IsNullOrEmpty(param.keyword)) { var familyid = param.keyword.ToInt(); tempquery = tempquery.Where(x => x.FamilyId == familyid); } else { tempquery = tempquery.Where(x => x.UserId == authInfo.UserId); } var query = await tempquery.OrderBy(x => x.CreateTime, OrderByType.Desc) .Select(x => new AddResultList { CreateTime = SqlFunc.ToString(x.CreateTime), Height = x.Height, Weight = x.Weight, Id = x.Id, ResultTime = SqlFunc.ToString(x.ResultTime) }) .Mapper((it, cache) => { it.CreateTime = it.CreateTime.ToYearDateTime(); it.ResultTime = it.ResultTime.ToYearDate(); }) .ToPageListAsync(param.page, param.pagesize, totalnum); return new PageParms { page = param.page, Items = query, totalnum = totalnum, limit = param.pagesize }; } /// /// 删除手动添加的记录 /// /// /// public async Task DeleteAddResultAsync(Guid id) { var data = await dbClient.Queryable().FirstAsync(x => x.Id == id); if (data == null) { return new ResultInfo(ResultState.FAIL, "记录未找到"); } await dbClient.Deleteable().Where(x => x.Id == id).ExecuteCommandAsync(); //删除关联的记录 await DeleteAsync(new DeleteResultC2SDto { Id = id }); return new ResultInfo(ResultState.SUCCESS, "删除成功"); } /// /// 检测设备状态 /// /// 设备机器码 /// 类型,0-检测设备是否存在,1-不检测 /// public async Task CheckDevStatus(string sn, int type = 0) { if (string.IsNullOrEmpty(sn)) { return new ResultInfo(ResultState.FAIL, "设备编码不可为空"); } var equ = await dbClient.Queryable().FirstAsync(x => x.Ecode == sn); if (equ == null) { if (type == 1) { return new ResultInfo(ResultState.DEVNOTFOUND, "此设备还未激活,请先激活", new { type = 4 }); } return new ResultInfo(ResultState.DEVNOTFOUND, "此设备还未激活,请先激活"); } if (equ.Status == DeviceStatus.UnActive) { //检查设备类型, var devicetype = await dbClient.Queryable().FirstAsync(x => x.Code == equ.Type); return new ResultInfo(ResultState.DEVNOTFOUND, "此设备还未激活,请先激活", new { type = devicetype.ProType }); } if (equ.Status == (int)DeviceStatus.Stop) { return new ResultInfo(ResultState.FAIL, "此设备暂不可使用"); } return new ResultInfo(ResultState.SUCCESS, "success"); } /// /// 获取八电极历史记录 /// /// 查询参数 /// public async Task> GetBodyHistoryListAsync(ParamQuery param) { int familyid = param.keyword.ToInt(); if (familyid <= 0) { familyid = (await dbClient.Queryable().FirstAsync(x => x.UserId == authInfo.UserId && x.IsSelf == 1)).Id; } var devtypes = await _deviceTypeService.GetDevTypesAsync(param.devtype); var tempquery = dbClient.Queryable((x, b) => new JoinQueryInfos( JoinType.Left, b.Id == x.Id )).Where((x, b) => b.FamilyId == familyid && b.Status == 1 && devtypes.Contains(b.DevType)); RefAsync totalnum = 0; var query = await tempquery.OrderBy((x, b) => b.CreateTime, OrderByType.Desc) .Select((x, b) => new BodyMeasureHisList { bmi = x.bmi, body = x.body, fatLevel = x.fatlevel, bodyage = x.bodyage, bone = x.bone, cmi = x.cmi, time = b.CreateTime, fat_r = x.fat_r, fat_w = x.fat_w, height = x.Height, kcal = x.kcal, lbm = x.lbm, muscle = x.muscle, muscleval = x.muscleval, protein = x.protein, proteinval = x.proteinval, sfr = x.sfr, visceral = x.visceral, water = x.water, weight = x.Weight, age = x.Age, sfrval = x.SfrVal, SkeletalMuscle = x.SkeletalMuscle, muscleratetrunk = x.BodyMuscle, musclerateleftleg = x.LeftFootMuscle, muscleraterightleg = x.RightFootMuscle, musclerateleftarm = x.LeftHandMuscle, muscleraterightarm = x.RightHandMuscle, musclekgtrunk = x.BodyMuscleVal, musclekgleftleg = x.LeftFootMuscleVal, musclekgrightleg = x.RightFootMuscleVal, musclekgleftarm = x.LeftHandMuscleVal, musclekgrightarm = x.RightHandMuscleVal, bodyfatraterunk = x.BodyFat, bodyfatrateleftleg = x.LeftFootFat, bodyfatraterightleg = x.RightFootFat, bodyfatrateleftarm = x.LeftHandFat, bodyfatraterightarm = x.RightHandFat, bodyfatkgtrunk = x.BodyFatVal, bodyfatkgleftleg = x.LeftFootFatVal, bodyfatkgrightleg = x.RightFootFatVal, bodyfatkgleftarm = x.LeftHandFatVal, bodyfatkgrightarm = x.RightHandFatVal, idealweight = x.IdealWeight, Id = x.Id }) .Mapper((it, cache) => { if (!string.IsNullOrEmpty(it.leveljson)) { var data = it.leveljson.ToObject(); if (data != null) { it.SkeletalMuscleLevel = data.SkeletalMuscleLevel; it.fatLevel = data.fatLevel; it.fat_rLevel = data.fat_rLevel; it.muscleLevel = data.muscleLevel; it.waterLevel = data.waterLevel; it.boneLevel = data.boneLevel; it.kcalLevel = data.kcalLevel; it.fat_wLevel = data.fat_wLevel; it.visceralLevel = data.visceralLevel; it.proteinLevel = data.proteinLevel; it.bodyageLevel = data.bodyageLevel; it.bmiLevel = data.bmiLevel; it.musulevalLevel = data.musulevalLevel; it.proteinvalLevel = data.proteinvalLevel; it.sfrLevel = data.sfrLevel; it.bodylevel = data.bodylevel; } } }) .ToPageListAsync(param.page, param.pagesize, totalnum); var list = query.Adapt>(); return new PageParms { page = param.page, Items = list, totalnum = totalnum, limit = param.pagesize }; } /// /// 两次测量记录对比 /// /// /// public async Task ResultDiff(ResultDiffC2SDto data) { var firstresult = await dbClient.Queryable() .Select(x => new YB_nResult { Imp = x.Imp, LeftArmImp = x.LeftArmImp, LeftLegImp = x.LeftLegImp, RightArmImp = x.RightArmImp, RightLegImp = x.RightLegImp, Weight = x.Weight }) .FirstAsync(x => x.Id == data.FirstId); if (firstresult == null) { return new ResultInfo(ResultState.FAIL, "第一条测量记录未找到"); } var secondresult = await dbClient.Queryable() .Select(x => new YB_nResult { Imp = x.Imp, LeftArmImp = x.LeftArmImp, LeftLegImp = x.LeftLegImp, RightArmImp = x.RightArmImp, RightLegImp = x.RightLegImp, Weight = x.Weight }) .FirstAsync(x => x.Id == data.SecondId); if (secondresult == null) { return new ResultInfo(ResultState.FAIL, "第二条测量记录未找到"); } var firstres = await dbClient.Queryable() .Select(x => new YB_nMeasureResult { Height = x.Height, Sex = x.Sex, Age = x.Age, createtime = x.createtime, DevType = x.DevType, fat_r = x.fat_r, sfr = x.sfr, SfrVal = x.SfrVal, SkeletalMuscle = x.SkeletalMuscle, bmi = x.bmi, body = x.body, bodyage = x.bodyage, bone = x.bone, cmi = x.cmi, fatlevel = x.fatlevel, fat_w = x.fat_w, kcal = x.kcal, lbm = x.lbm, visceral = x.visceral, water = x.water, muscle = x.muscle, protein = x.protein }) .FirstAsync(x => x.Id == data.FirstId); var secondres = await dbClient.Queryable() .Select(x => new YB_nMeasureResult { Height = x.Height, Sex = x.Sex, Age = x.Age, createtime = x.createtime, DevType = x.DevType, fat_r = x.fat_r, sfr = x.sfr, SfrVal = x.SfrVal, SkeletalMuscle = x.SkeletalMuscle, bmi = x.bmi, body = x.body, bodyage = x.bodyage, bone = x.bone, cmi = x.cmi, fatlevel = x.fatlevel, fat_w = x.fat_w, kcal = x.kcal, lbm = x.lbm, visceral = x.visceral, water = x.water, muscle = x.muscle, protein = x.protein }) .FirstAsync(x => x.Id == data.SecondId); var family = await dbClient.Queryable().FirstAsync(x => x.Id == data.FamilyId); string headimg = family.HeadImg; if (!string.IsNullOrEmpty(headimg)) { headimg = headimg.ToLower().StartsWith("http") ? headimg : $"{APICDNURL}{headimg}"; } else { headimg = DefaultService.HeadImg(family.Sex, family.Type); } UserMeasureModel firstdata = null; //如果是八电极协议 if (await dbClient.Queryable().AnyAsync(x => x.ProType == DeviceProType.WT8 && firstres.DevType == x.Code)) { var bodydata = await _bodyFatHelperService.CalcBody120FatAsync(firstresult.Weight, firstres.Height, firstres.Age, firstres.Sex, firstresult.LeftArmImp, firstresult.RightArmImp, firstresult.LeftLegImp, firstresult.RightLegImp, firstresult.Imp); firstdata = new UserMeasureModel { bmi = firstres.bmi, bmiLevel = bodydata.bmiLevel, sfr = firstres.sfr, sfrLevel = bodydata.sfrLevel, muscleLevel = bodydata.muscleLevel, muscle = firstres.muscle, muscleval = bodydata.muscleval, body = firstres.body, fatLevel = bodydata.fatLevel, fat_r = firstres.fat_r, fat_rLevel = bodydata.fat_rLevel, fat_w = firstres.fat_w, bodyage = firstres.bodyage, bone = firstres.bone, cmi = firstres.cmi, height = bodydata.height, kcal = firstres.kcal, lbm = firstres.lbm, protein = firstres.protein, visceral = firstres.visceral, standardWeight = firstres.IdealWeight.ToString(), bodylevel = firstres.body, bodyageLevel = bodydata.bodyageLevel, boneLevel = bodydata.boneLevel, fat_wLevel = bodydata.fat_wLevel, kcalLevel = bodydata.kcalLevel, musulevalLevel = bodydata.musulevalLevel, proteinLevel = bodydata.proteinLevel, proteinval = firstres.proteinval, proteinvalLevel = bodydata.proteinvalLevel, visceralLevel = bodydata.visceralLevel, water = firstres.water, waterLevel = bodydata.waterLevel, weight = bodydata.weight, sfrval = firstres.SfrVal, skeletalmuscle = firstres.SkeletalMuscle, skeletalmuscleLevel = bodydata.SkeletalMuscleLevel }; } else { firstdata = _bodyFatHelperService.CalcBodyFat(firstresult.Weight.ToDouble(), firstres.Height.ToDouble(), firstres.Age, firstresult.Imp.ToInt(), firstres.Sex); } UserMeasureModel seconddata = null; //如果是八电极协议 if (await dbClient.Queryable().AnyAsync(x => x.ProType == DeviceProType.WT8 && secondres.DevType == x.Code)) { var bodydata = await _bodyFatHelperService.CalcBody120FatAsync(secondresult.Weight, secondres.Height, secondres.Age, secondres.Sex, secondresult.LeftArmImp, secondresult.RightArmImp, secondresult.LeftLegImp, secondresult.RightLegImp, secondresult.Imp); seconddata = new UserMeasureModel { bmi = secondres.bmi, bmiLevel = bodydata.bmiLevel, sfr = secondres.sfr, sfrLevel = bodydata.sfrLevel, muscleLevel = bodydata.muscleLevel, muscle = secondres.muscle, muscleval = bodydata.muscleval, body = secondres.body, fatLevel = bodydata.fatLevel, fat_r = secondres.fat_r, fat_rLevel = bodydata.fat_rLevel, fat_w = secondres.fat_w, bodyage = secondres.bodyage, bone = secondres.bone, cmi = secondres.cmi, height = bodydata.height, kcal = secondres.kcal, lbm = secondres.lbm, protein = secondres.protein, visceral = secondres.visceral, standardWeight = secondres.IdealWeight.ToString(), bodylevel = secondres.body, bodyageLevel = bodydata.bodyageLevel, boneLevel = bodydata.boneLevel, fat_wLevel = bodydata.fat_wLevel, kcalLevel = bodydata.kcalLevel, musulevalLevel = bodydata.musulevalLevel, proteinLevel = bodydata.proteinLevel, proteinval = secondres.proteinval, proteinvalLevel = bodydata.proteinvalLevel, visceralLevel = bodydata.visceralLevel, water = secondres.water, waterLevel = bodydata.waterLevel, weight = bodydata.weight, sfrval = secondres.SfrVal, skeletalmuscle = secondres.SkeletalMuscle, skeletalmuscleLevel = bodydata.SkeletalMuscleLevel }; } else { seconddata = _bodyFatHelperService.CalcBodyFat(secondresult.Weight.ToDouble(), secondres.Height.ToDouble(), secondres.Age, secondresult.Imp.ToInt(), (GenderType)secondres.Sex); } int day = (secondres.createtime.Date - firstres.createtime.Date).TotalDays.ToInt(); var fdata = firstdata.Adapt(); var sdata = seconddata.Adapt(); ResultDiffS2CDto returndata = null; if (firstres.createtime > secondres.createtime) { returndata = new ResultDiffS2CDto { Day = Math.Abs(day), WeightDiff = fdata.weight - sdata.weight, Fat_WDiff = fdata.fat_w - sdata.fat_w, FirstResult = sdata, SecondResult = fdata, HeadImg = headimg, NickName = family.Name, Sex = family.Sex, Time = $"{secondres.createtime.ToString("yyyy/MM/dd")}-{firstres.createtime.ToString("yyyy/MM/dd")}" }; } else { returndata = new ResultDiffS2CDto { Day = Math.Abs(day), WeightDiff = sdata.weight - fdata.weight, Fat_WDiff = sdata.fat_w - fdata.fat_w, FirstResult = fdata, SecondResult = sdata, HeadImg = headimg, NickName = family.Name, Sex = family.Sex, Time = $"{firstres.createtime.ToString("yyyy/MM/dd")}-{secondres.createtime.ToString("yyyy/MM/dd")}" }; } return new ResultInfo(ResultState.SUCCESS, "success", returndata); } /// /// 添加测量记录,针对八电极 /// /// /// public async Task InsertBodyMeasureAsync(MeasureBodySubmitC2SDto data) { //检查家庭成员是否存在 var family = await dbClient.Queryable().FirstAsync(x => x.Id == data.familyid); if (family == null) { return new ResultInfo(ResultState.FAIL, "家庭成员未找到"); } //检查设备是否存在 var device = await dbClient.Queryable().FirstAsync(x => x.Ecode == data.ecode); if (device == null) { return new ResultInfo(ResultState.DEVNOTFOUND, "设备未找到,请到管理端进行激活"); } if (device.Status != DeviceStatus.Run) { return new ResultInfo(ResultState.DEVNOTFOUND, "设备还未激活,请先激活"); } decimal weight = AnalyWeight(data.weight); decimal height = AnalyHeight(data.height); await InsertResultAsync(new InsertResultC2SDto { DevId = device.Id, SourceType = 1, ecode = device.Ecode, familyid = family.Id, height = height, imp = data.imp, IsUserTake = true, UserId = authInfo.UserId, weight = weight, LeftArmImp = data.LeftHandImp, LeftLegImp = data.LeftFootImp, RightArmImp = data.RightHandImp, RightLegImp = data.RightFootImp, CreateTime = DateTime.Now, fansid = null, orderid = null, publicid = "", ResultId = Guid.Empty }, device, family); return new ResultInfo(ResultState.SUCCESS, "测量成功"); } /// /// 添加测量记录,针对八电极,不激活 /// /// /// public async Task InsertBodyMeasureNoActiveAsync(MeasureBodySubmitC2SDto data) { //检查家庭成员是否存在 var family = await dbClient.Queryable().FirstAsync(x => x.Id == data.familyid); if (family == null) { return new ResultInfo(ResultState.FAIL, "家庭成员未找到"); } //检查设备是否存在,固定ID为29107,不激活 var did = data.Type == 2? 29108 : 29107; var device = await dbClient.Queryable().FirstAsync(x => x.Id == did); if (device == null) { return new ResultInfo(ResultState.DEVNOTFOUND, "设备未找到,请到管理端进行激活"); } if (device.Status != DeviceStatus.Run) { return new ResultInfo(ResultState.DEVNOTFOUND, "设备还未激活,请先激活"); } decimal weight = AnalyWeight(data.weight); decimal height = AnalyHeight(data.height); await InsertResultAsync(new InsertResultC2SDto { DevId = device.Id, SourceType = 1, ecode = device.Ecode, familyid = family.Id, height = height, imp = data.imp, IsUserTake = true, UserId = authInfo.UserId, weight = weight, LeftArmImp = data.LeftHandImp, LeftLegImp = data.LeftFootImp, RightArmImp = data.RightHandImp, RightLegImp = data.RightFootImp, CreateTime = DateTime.Now, fansid = null, orderid = null, publicid = "", ResultId = Guid.Empty }, device, family); return new ResultInfo(ResultState.SUCCESS, "测量成功"); } /// /// 删除测量记录 /// /// /// public async Task DeleteAsync(DeleteResultC2SDto data) { var result = await dbClient.Queryable().FirstAsync(x => x.Id == data.Id); if (result == null) { return new ResultInfo(ResultState.FAIL, "记录未找到"); } if (await dbClient.Queryable().CountAsync(x => x.FamilyId == result.FamilyId && x.Status == 1) == 1) { return new ResultInfo(ResultState.FAIL, "记录就剩一条了,无法继续删除"); } //删除记录队列 await _capBus.PublishAsync("system.service.deleteuserresult", new DeleteUserDataS2SDto { UserId = result.UserId, FamilyId = result.FamilyId, ResultId = result.Id, DevType = result.DevType, time = result.CreateTime }); return new ResultInfo(ResultState.SUCCESS, "记录删除成功"); } /// /// 测量记录详情 /// /// /// public async Task DetailAsync(ResultDetailC2SDto input) { var measureresult = await dbClient.Queryable().Where(x => x.Id == input.Id).Select(x => new YB_nMeasureResult { Month = x.Month, Age = x.Age, Weight = x.Weight, Height = x.Height, Sex = x.Sex, fat_r = x.fat_r, sfr = x.sfr, SfrVal = x.SfrVal, SkeletalMuscle = x.SkeletalMuscle, bmi = x.bmi, body = x.body, bodyage = x.bodyage, bone = x.bone, cmi = x.cmi, fatlevel = x.fatlevel, fat_w = x.fat_w, kcal = x.kcal, lbm = x.lbm, visceral = x.visceral, water = x.water, muscle = x.muscle, protein = x.protein }).FirstAsync(); if (measureresult == null) { return new ResultInfo(ResultState.FAIL, "测量记录未找到"); } var result = await dbClient.Queryable().Where(x => x.Id == input.Id).Select(x => new YB_nResult { Imp = x.Imp, LeftArmImp = x.LeftArmImp, RightArmImp = x.RightArmImp, LeftLegImp = x.LeftLegImp, RightLegImp = x.RightLegImp }).FirstAsync(); var sex = measureresult.Sex; var age = measureresult.Age; var weight = measureresult.Weight; var height = measureresult.Height; var data = await _bodyFatHelperService.CalcBody120FatAsync(weight, height, age, sex, result.LeftArmImp, result.RightArmImp, result.LeftLegImp, result.RightLegImp, result.Imp); if (data == null) { return new ResultInfo(ResultState.NORESULT, "测量结果计算失败"); } data.fat_r = measureresult.fat_r; data.sfr = measureresult.sfr; data.sfrval = measureresult.SfrVal; data.SkeletalMuscle = measureresult.SkeletalMuscle; data.bmi = measureresult.bmi; data.body = measureresult.body; data.bodyage = measureresult.bodyage; data.bone = measureresult.bone; data.cmi = measureresult.cmi; data.fatLevel = measureresult.fatlevel; data.fat_w = measureresult.fat_w; data.kcal = measureresult.kcal; data.lbm = measureresult.lbm; data.visceral = measureresult.visceral; data.water = measureresult.water; data.muscle = measureresult.muscle; data.protein = measureresult.protein; var returndata = data.Adapt(); returndata.Age = age; returndata.Sex = sex; var currentdata = data.Adapt(); var list = _userService.HisList(sex, age, weight, currentdata); if (list != null) { list.Add(new MeasureInfoItem { name = "skeletalmuscle", slist = _bodyFatHelperService.skeletalmusclekg_val(sex, age, returndata.SkeletalMuscle), Color = _bodyFatHelperService.GetLevelColor(returndata.SkeletalMuscleLevel) }); } returndata.list = list; return new ResultInfo(ResultState.SUCCESS, "success", returndata); } } }