MeiRiYiCheng_1_old/YBDevice.NApi/DBServices/UserApp.cs

503 lines
27 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Nirvana.Common;
using Nirvana.Common.ApiBase;
using Nirvana.Data;
using Senparc.Weixin.WxOpen.Containers;
using Senparc.Weixin.WxOpen.Entities;
using Senparc.Weixin.WxOpen.Helpers;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using YBDevice.Entity;
namespace YBDevice.NApi.DBServices
{
/// <summary>
/// 注册用户管理
/// </summary>
public partial class UserApp : BaseApp
{
/// <summary>
/// 获取用户个人资料
/// </summary>
/// <param name="familyid">家庭成员ID</param>
/// <returns></returns>
public async Task<ResultInfo> GetUserInfoAsync(int familyid)
{
using (var dbClient = ReadDbContext.GetInstance())
{
var user = await dbClient.Queryable<YB_RegUser>().Where(x => x.Id == authInfo.UserId).FirstAsync();
YB_Family family = new YB_Family();
if (familyid > 0)
{
family = await dbClient.Queryable<YB_Family>().Where(x => x.Id == familyid && x.Type == 1).FirstAsync();
}
//试着获取一个最新的
if (family == null || family.Id <= 0)
{
family = await dbClient.Queryable<YB_Family>().Where(x => x.UserId == user.Id && x.Status != -1 && x.Type == 1).OrderBy(x => x.LastHeartTime, OrderByType.Desc).FirstAsync();
}
var target = await dbClient.Queryable<YB_FamilyTarget>().FirstAsync(x => x.familyid == family.Id);
var data = new UserInfoModel
{
headimg = !string.IsNullOrEmpty(family.HeadImg) ? family.HeadImg : new FamilyApp().HeadImg(family.Sex, family.Type),
sex = family.Sex,
nickname = family.Name,
isbindphone = string.IsNullOrEmpty(user.Headimg) ? false : true,
age = family.Age,
familyid = family.Id,
height = family.Height,
targetweight = target != null ? target.weight : 0,
targettime = target != null ? target.time.ToYearDate() : "-- --",
weight = family.Weight,
lasthearttime = family.LastHeartTime.HasValue ? family.LastHeartTime.Value.ToYearDate() : "-- --",
Birthday = family.Birthday.ToString("yyyy-MM-dd")
};
return new ResultInfo(ResultState.SUCCESS, "success", data);
}
}
/// <summary>
/// 解密手机号
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<ResultInfo> DecryptPhoneAsync(WxOpenDecryptSubmitModel model)
{
using (var dbClient = ReadDbContext.GetInstance())
{
var sessionBag = await SessionContainer.GetSessionAsync(model.sessionId);
if (sessionBag == null)
{
return new ResultInfo(ResultState.FAIL, "sessionId未找到");
}
var phone = EncryptHelper.DecryptPhoneNumberBySessionKey(sessionBag.SessionKey, model.encryptedData, model.iv);
//更新当前用户的手机号
await dbClient.Updateable<YB_RegUser>().SetColumns(x => new YB_RegUser
{
Phone = phone.purePhoneNumber
}).Where(x => x.Id == authInfo.UserId).ExecuteCommandAsync();
return new ResultInfo(ResultState.SUCCESS, "手机号绑定成功");
}
}
/// <summary>
/// 获取用户测量数据
/// </summary>
/// <returns></returns>
public async Task<ResultInfo> GetMeasureInfoAsync(UserMeasureInfoModel model)
{
if (model.height <= 0)
{
return new ResultInfo(ResultState.FAIL, "身高不可小于0");
}
using (var dbClient = ReadDbContext.GetInstance())
{
//获取此家庭成员的体重信息
var family = await dbClient.Queryable<YB_Family>().Where(x => x.Id == model.familyid).FirstAsync();
if (family == null)
{
return new ResultInfo(ResultState.FAIL, "家庭成员未找到");
}
int age = model.birthday.ToAge();
if (age > 100)
{
return new ResultInfo(ResultState.FAIL, "年龄过大");
}
//更新家庭成员信息
await dbClient.Updateable<YB_Family>().SetColumns(x => new YB_Family
{
Height = model.height,
Age = age,
Sex = model.sex,
Birthday = model.birthday
}).Where(x => x.Id == model.familyid).ExecuteCommandAsync();
if (!await dbClient.Queryable<YB_Measure>().AnyAsync(x => x.FamilyId == family.Id))
{
//#region 如果没有测量记录,则加载演示数据
//var ysfamily = new YSFamily();
//var ysdata = BodyFatHelper.CalcBodyFat(ysfamily.ADWeight.ToDouble(), ysfamily.ADHeight.ToDouble(),ysfamily.ADAge, ysfamily.imp, ysfamily.Sex);
//List<MeasureModels> yslistcnt = new List<MeasureModels>();
//double testheight= ysfamily.ADHeight.ToDouble();
//double testweight = ysfamily.ADWeight.ToDouble();
//var testdata = new UserMeasureModel();
//List<MeasureModels> yslistday = new List<MeasureModels>();
//for (var i = 1; i <= 10; i++)
//{
// testdata= BodyFatHelper.CalcBodyFat(testweight, testheight,ysfamily.ADAge, ysfamily.imp, ysfamily.Sex);
// var tmpdata = new MeasureModels
// {
// fat_r = testdata.fat_r,
// muscle = testdata.muscle,
// water = testdata.water,
// bone = testdata.bone,
// kcal = testdata.kcal,
// fat_w = testdata.fat_w,
// visceral = testdata.visceral,
// protein = testdata.protein,
// bodyage = testdata.bodyage,
// bmi = testdata.bmi,
// sfr = testdata.sfr,
// muscleval = testdata.muscleval,
// proteinval = testdata.proteinval,
// lbm = testdata.lbm,
// body = testdata.body,
// fatlevlval = testdata.fatlevlval,
// weight = testweight.ToDecimal(),
// timestamp = DateTime.Now.AddDays(-i).ToString()
// };
// yslistcnt.Add(tmpdata);
// yslistday.Add(tmpdata);
// testweight -= 1;
// testheight -= 1;
//}
//double lheight = (ysfamily.ADHeight - 2).ToDouble();
//var yslevelresult = BodyFatHelper.CalcBodyFat(65, lheight, ysfamily.ADAge, ysfamily.imp, ysfamily.Sex);
//var yslist = HisList(ysfamily.Sex, yslistcnt, yslistday, ysfamily.ADAge, ysdata, yslevelresult, ysfamily.ADWeight);
//#endregion
//return new ResultInfo(ResultState.SUCCESS, "success", new UserMeasureInfo
//{
// IsTest = true,
// bmi = ysdata.bmi,
// sfr = ysdata.sfr,
// sfrLevel = ysdata.sfrLevel,
// standardbmi = ysdata.standardbmi,
// standardbody = ysdata.standardbody,
// standardbodyage = ysdata.standardbodyage,
// standardbone = ysdata.standardbone,
// standardfatlevel = ysdata.standardfatlevel,
// standardfat_r = ysdata.standardfat_r,
// standardfat_w = ysdata.standardfat_w,
// standardkcal = ysdata.standardkcal,
// standardlbm = ysdata.standardlbm,
// standardmuscle = ysdata.standardmuscle,
// standardmuscleval = ysdata.standardmuscleval,
// standardprotein = ysdata.standardprotein,
// standardproteinval = ysdata.standardproteinval,
// standardsfr = ysdata.standardsfr,
// standardviscera = ysdata.standardviscera,
// standardwater = ysdata.standardwater,
// standardWeight = ysdata.standardWeight,
// bmiLevel = ysdata.bmiLevel,
// body = ysdata.body,
// bodyage = ysdata.bodyage,
// bodyageLevel = ysdata.bodyageLevel,
// bodylevel = ysdata.bodylevel,
// bone = ysdata.bone,
// boneLevel = ysdata.boneLevel,
// cmi = ysdata.cmi,
// fatLevel = ysdata.fatLevel,
// fatlevlval = ysdata.fatlevlval,
// fat_r = ysdata.fat_r,
// fat_rLevel = ysdata.fat_rLevel,
// fat_w = ysdata.fat_w,
// fat_wLevel = ysdata.fat_wLevel,
// Height =ysfamily.ADHeight,
// kcal = ysdata.kcal,
// kcalLevel = ysdata.kcalLevel,
// lbm = ysdata.lbm,
// muscle = ysdata.muscle,
// muscleLevel = ysdata.muscleLevel,
// muscleval = ysdata.muscleval,
// musulevalLevel = ysdata.musulevalLevel,
// protein = ysdata.protein,
// proteinLevel = ysdata.proteinLevel,
// proteinval = ysdata.proteinval,
// proteinvalLevel = ysdata.proteinvalLevel,
// visceral = ysdata.visceral,
// visceralLevel = ysdata.visceralLevel,
// water = ysdata.water,
// waterLevel = ysdata.waterLevel,
// Weight = ysfamily.ADWeight,
// list = yslist
//});
return new ResultInfo(ResultState.NORESULT, "未找到测量数据");
}
var result = await dbClient.Queryable<YB_ResultExt>().Where(x => SqlFunc.Subqueryable<YB_Measure>().Where(e => e.ResultId == x.ResultId && e.FamilyId == family.Id).Any())
.OrderBy(x => x.CreateTime, OrderByType.Desc)
.FirstAsync();
var data = BodyFatHelper.CalcBodyFat(result.Weight.ToDouble(), model.height.ToDouble(), age, result.Imp.ToInt(), model.sex);
var returndata = new UserMeasureInfo
{
bmi = data.bmi,
bmiLevel = data.bmiLevel,
body = data.body,
bodyage = data.bodyage,
bodyageLevel = data.bodyageLevel,
bodylevel = data.bodylevel,
bone = data.bone,
boneLevel = data.boneLevel,
cmi = data.cmi,
fatLevel = data.fatLevel,
fatlevlval = data.fatlevlval,
fat_r = data.fat_r,
fat_rLevel = data.fat_rLevel,
fat_w = data.fat_w,
fat_wLevel = data.fat_wLevel,
kcal = data.kcal,
kcalLevel = data.kcalLevel,
lbm = data.lbm,
muscle = data.muscle,
muscleLevel = data.muscleLevel,
muscleval = data.muscleval,
musulevalLevel = data.musulevalLevel,
protein = data.protein,
proteinLevel = data.proteinLevel,
proteinval = data.proteinval,
proteinvalLevel = data.proteinvalLevel,
sfr = data.sfr,
sfrLevel = data.sfrLevel,
standardbmi = data.standardbmi,
standardbody = data.standardbody,
standardbodyage = data.standardbodyage,
standardbone = data.standardbone,
standardfatlevel = data.standardfatlevel,
standardfat_r = data.standardfat_r,
standardfat_w = data.standardfat_w,
standardkcal = data.standardkcal,
standardlbm = data.standardlbm,
standardmuscle = data.standardmuscle,
standardmuscleval = data.standardmuscleval,
standardprotein = data.standardprotein,
standardproteinval = data.standardproteinval,
standardsfr = data.standardsfr,
standardviscera = data.standardviscera,
standardwater = data.standardwater,
standardWeight = data.standardWeight,
visceral = data.visceral,
visceralLevel = data.visceralLevel,
water = data.water,
waterLevel = data.waterLevel,
Height = model.height,
Weight = result.Weight
};
#region
int month = model.birthday.ToMonth();
await dbClient.Ado.UseStoredProcedure().ExecuteCommandAsync("proc_insertresult", new
{
sex = family.Sex,
age = family.Age,
month = month,
height = model.height,
weight = result.Weight,
imp = result.Imp,
ecode = result.Ecode,
familyid = model.familyid,
userid = authInfo.UserId,
fat_r = data.fat_r,
muscle = data.muscle,
water = data.water,
bone = data.bone,
kcal = data.kcal,
fat_w = data.fat_w,
visceral = data.visceral,
protein = data.protein,
bodyage = data.bodyage,
bmi = data.bmi,
cmi = data.cmi,
sfr = data.sfr,
muscleval = data.muscleval,
proteinval = data.proteinval,
lbm = data.lbm,
body = data.bodylevel,
fatlevel = data.fatLevel,
resultid = result.ResultId
});
#endregion
//获取每项的历史值
var dataset = await dbClient.Ado.UseStoredProcedure().GetDataSetAllAsync("proc_getmeasureitem_page", new
{
pagesize = model.pagesize,
pagenum = model.pagenum,
familyid = model.familyid
});
if (dataset.Tables.Count == 0)
{
returndata.list = new List<MeasureInfoItem>();
}
else
{
//BMI标准,最大值,最小值,标准范围
var listcnt = DataTableListHelper.ToList<MeasureModels>(dataset.Tables[0]);
var listday = DataTableListHelper.ToList<MeasureModels>(dataset.Tables[1]);
//最近的上上次测量结果
var lastresult = await dbClient.Queryable<YB_ResultExt>().Where(x => SqlFunc.Subqueryable<YB_Measure>().Where(e => e.ResultId == x.ResultId && e.FamilyId == family.Id).Any() && x.ResultId != result.ResultId)
.OrderBy(x => x.CreateTime, OrderByType.Desc)
.FirstAsync();
UserMeasureModel levelresult = new UserMeasureModel();
if (lastresult != null)
{
var mresult = await dbClient.Queryable<YB_Measure>().Where(x => x.ResultId == lastresult.ResultId).FirstAsync();
levelresult = BodyFatHelper.CalcBodyFat(lastresult.Weight.ToDouble(), mresult.Height.ToDouble(), mresult.Age, lastresult.Imp.ToInt(), mresult.Sex);
}
returndata.list = HisList(model.sex,listcnt,listday,age,data,levelresult,result.Weight);
}
return new ResultInfo(ResultState.SUCCESS, "success", returndata);
}
}
/// <summary>
/// 历史记录分类
/// </summary>
/// <param name="sex"></param>
/// <param name="listcnt"></param>
/// <param name="listday"></param>
/// <param name="age"></param>
/// <param name="data"></param>
/// <param name="levelresult"></param>
/// <param name="weight"></param>
/// <returns></returns>
private List<MeasureInfoItem> HisList(int sex,List<MeasureModels> listcnt,List<MeasureModels> listday,int age,UserMeasureModel data, UserMeasureModel levelresult,decimal weight)
{
List<MeasureInfoItem> info = new List<MeasureInfoItem>();
List<string> mlist = new List<string> { "bmi", "fat_r", "muscle", "water", "bone", "kcal", "fat_w", "visceral", "protein", "bodyage","sfr","body",
"muscleval","proteinval","lbm","fatlevel","weight" };
//判定时sex为0-女1-男,所以这里进行转换
sex = sex == 2 ? 0 : 1;
mlist.ForEach(x =>
{
var m = new MeasureInfoItem()
{
name = x
};
if (x == "bmi")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.bmi.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.bmi.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.slist = BodyFatHelper.bmi_value(sex, age);
m.value = data.bmi;
m.lastvalue = m.value - levelresult.bmi;
}
else if (x == "fat_r")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.fat_r.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.fat_r.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.slist = BodyFatHelper.fa_r_value(sex, age);
m.value = data.fat_r;
m.lastvalue = m.value - levelresult.fat_r;
}
else if (x == "muscle")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.muscle.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.muscle.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.slist = BodyFatHelper.muscle_value(sex, age);
m.value = data.muscle;
m.lastvalue = m.value - levelresult.muscle;
}
else if (x == "water")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.water.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.water.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.slist = BodyFatHelper.water_value(sex, age);
m.value = data.water;
m.lastvalue = m.value - levelresult.water;
}
else if (x == "bone")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.bone.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.bone.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.slist = BodyFatHelper.bone_value(sex, age, weight);
m.value = data.bone;
m.lastvalue = m.value - levelresult.bone;
}
else if (x == "kcal")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.kcal.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.kcal.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.slist = BodyFatHelper.kcal_value(sex, age, weight);
m.value = data.kcal;
m.lastvalue = m.value - levelresult.kcal;
}
else if (x == "fat_w")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.fat_w.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.fat_w.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.value = data.fat_w;
m.lastvalue = m.value - levelresult.fat_w;
}
else if (x == "visceral")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.visceral.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.visceral.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.slist = BodyFatHelper.visceral_value(sex, age);
m.value = data.visceral;
m.lastvalue = m.value - levelresult.visceral;
}
else if (x == "protein")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.protein.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.protein.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.slist = BodyFatHelper.protein_value(sex, age);
m.value = data.protein;
m.lastvalue = m.value - levelresult.protein;
}
else if (x == "bodyage")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.bodyage.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.bodyage.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.value = data.bodyage;
m.lastvalue = m.value - levelresult.bodyage;
}
else if (x == "sfr")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.sfr.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.sfr.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.slist = BodyFatHelper.sfr_value(sex, age);
m.value = data.sfr;
m.lastvalue = m.value - levelresult.sfr;
}
else if (x == "body")
{
m.list = listcnt
.Select(e => new MeasureHisItem { value = e.body, time = e.timestamp.ToYearDate() })
.ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.body, time = e.timestamp.ToYearDate() }).ToList();
m.value = 0;
m.lastvalue = 0;
}
else if (x == "muscleval")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.muscleval.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.muscleval.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.value = data.muscleval;
m.lastvalue = m.value - levelresult.muscleval;
}
else if (x == "proteinval")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.proteinval.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.proteinval.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.value = data.proteinval;
m.lastvalue = m.value - levelresult.proteinval;
}
else if (x == "lbm")
{
m.list = listcnt.Select(e => new MeasureHisItem { value = e.lbm.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.lbm.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.value = data.lbm;
m.lastvalue = m.value - levelresult.lbm; ;
}
else if (x == "fatlevel")
{
m.list = listcnt
.Select(e => new MeasureHisItem { value = BodyFatHelper.fatlevel(e.fatlevlval.ToDouble()), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = BodyFatHelper.fatlevel(e.fatlevlval.ToDouble()), time = e.timestamp.ToYearDate() }).ToList();
m.value = 0;
m.lastvalue = 0;
}
else if (x == "weight")
{
m.list = listcnt
.Select(e => new MeasureHisItem { value = e.weight.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.daylist = listday.Select(e => new MeasureHisItem { value = e.weight.ToString(), time = e.timestamp.ToYearDate() }).ToList();
m.value = data.weight;
m.lastvalue = m.value - levelresult.weight;
}
info.Add(m);
});
return info;
}
}
}