using DotNetCore.CAP; using Furion.DependencyInjection; using Furion.DistributedIDGenerator; using Mapster; using Nirvana.Common; using Senparc.Weixin.Entities.TemplateMessage; using Senparc.Weixin.Open.Containers; using SqlSugar; using System; using System.Collections.Generic; using System.Threading.Tasks; using YBDevice.Body.BodyFatHelper; using YBDevice.CommonService.DevTypeInfo; using YBDevice.Core; using YBDevice.Entity; namespace YBDevice.NApi.Application.SubscriberInfo { /// /// CAP订阅相关接口 /// public class SubscriberService : ISubscriberService, ICapSubscribe, ITransient { public string component_AppId = Senparc.Weixin.Config.SenparcWeixinSetting.Component_Appid; private readonly ILoggerService _loggerService; private readonly ISqlSugarRepository repository; private readonly SqlSugarClient dbClient; private readonly IDeviceTypeService _deviceTypeService; private readonly IBodyFatHelperService _bodyFatHelperService; public SubscriberService(ISqlSugarRepository sqlSugarRepository, ILoggerService loggerService, IDeviceTypeService deviceTypeService, IBodyFatHelperService bodyFatHelperService) { _loggerService = loggerService; repository = sqlSugarRepository; dbClient = repository.Context; _deviceTypeService = deviceTypeService; _bodyFatHelperService = bodyFatHelperService; } /// /// 添加用户使用过的设备类型 /// /// [CapSubscribe("reguser.service.insertreguserdevtype")] public async Task InsertRegUserDevTypeAsync(RegUserDevTypeS2SDto data) { if (!await dbClient.Queryable().AnyAsync(x => data.DevType == x.DevType && x.UserId == data.UserId)) { var insertdata = new YB_UserEqu { Id = IDGen.NextID(), CreateTime = DateTime.Now, DevType = data.DevType, UserId = data.UserId }; await dbClient.Insertable(insertdata).ExecuteCommandAsync(); } } /// /// 更新粉丝数据 /// /// /// [CapSubscribe("fans.service.update")] public async Task UpdateFansData(YB_WXFans userinfo) { if (await dbClient.Queryable().AnyAsync(x => x.FansId == userinfo.FansId)) { await dbClient.Updateable().SetColumns(x => new YB_WXFans { HeadImgUrl = userinfo.HeadImgUrl, NickName = userinfo.NickName, Sex = userinfo.Sex, City = userinfo.City, Country = userinfo.Country, Province = userinfo.Province }).Where(x => x.Id == userinfo.Id).ExecuteCommandAsync(); } else { var fansdata = new YB_WXFans { Id = userinfo.Id, Sex = userinfo.Sex, City = userinfo.City, Country = userinfo.Country, CreateTime = DateTime.Now, FansId = userinfo.FansId, FromType = 1, HeadImgUrl = userinfo.HeadImgUrl, Language = "", NickName = userinfo.NickName, OldOpenId = userinfo.OldOpenId, Province = userinfo.Province }; await dbClient.Insertable(fansdata).ExecuteCommandAsync(); } } /// /// 添加日志 /// /// [CapSubscribe("system.service.inserterrorlogger")] public void InsertErrorLogger(string message) { _loggerService.AddLogger(message, 1); } /// /// 更新用户身高数据 /// /// /// [CapSubscribe("result.service.updateuserheightdata")] public async Task UpdateUserHeightDataAsync(UpdateUserHeightDataS2SDto data) { //更新yb_familydata var lastresult = await dbClient.Queryable().Where(x => x.FamilyId == data.familyid).FirstAsync(); var lastheight = lastresult != null ? lastresult.LastHeight : 0; lastheight = lastheight == 0 ? 0 : lastheight - data.Height; await dbClient.Updateable().SetColumns(x => new YB_FamilyData { LastHeight = data.Height, LastTimeHeight = x.LastTimeHeight + lastheight }).Where(x => x.FamilyId == data.familyid).ExecuteCommandAsync(); //更新YB_FamilyRealData decimal monthheight = data.LastHeight > data.Height ? data.LastHeight : data.Height; data.LastHeight = data.LastHeight == 0 ? 0 : data.LastHeight - data.Height; //设备类型列表 List devtypes = await _deviceTypeService.GetDevTypesAsync(data.DevType); if (devtypes.Count > 0) { await dbClient.Updateable().SetColumns(x => new YB_FamilyRealData { LastHeight = data.Height, LastTimeHeight = x.LastTimeHeight + data.LastHeight, MonthHeight = monthheight }).Where(x => x.FamilyId == data.familyid && devtypes.Contains(x.DevType)).ExecuteCommandAsync(); //更新月度成长曲线 var time = data.LastResultHeightTime.HasValue ? data.LastResultHeightTime.Value : DateTime.Now; DateTime day1 = time.Date.AddDays(1 - time.Day);//本月月初 DateTime nowtime = DateTime.Now; var reportdata = await dbClient.Queryable() .Select(x => new YB_FamilyReportData { Height = x.Height }) .FirstAsync(x => x.CreateTime == day1 && x.FamilyId == data.familyid && x.DevType == data.DevType); if (reportdata != null) { //如果身高值大于所属月度值的身高值,则进行更新 if (reportdata.Height < data.Height) { await dbClient.Updateable().SetColumns(x => new YB_FamilyReportData { Height = data.Height }).Where(x => x.CreateTime == day1 && x.FamilyId == data.familyid && devtypes.Contains(x.DevType)).ExecuteCommandAsync(); } } //增量数据更新 DateTime halfyeartime = nowtime.AddMonths(-6).Date; halfyeartime = halfyeartime.AddDays(1 - halfyeartime.Day); DateTime yeartime = nowtime.AddYears(-1).Date; yeartime = yeartime.AddDays(1 - yeartime.Day); //如果时间是半年前的那个月份中 if (time >= halfyeartime.Date && time < halfyeartime.AddMonths(1).Date && data.HalfYearHeight < data.Height) { await dbClient.Updateable().SetColumns(x => new YB_FamilyRealData { HalfYearHeight = data.Height, HalfYearHeightTime = time }) .Where(x => x.FamilyId == data.familyid && devtypes.Contains(x.DevType)).ExecuteCommandAsync(); } //如果时间是一年前的那个月份中 if (time.Date >= yeartime.Date && time.Date < yeartime.AddMonths(1).Date && data.YearHeight < data.Height) { await dbClient.Updateable().SetColumns(x => new YB_FamilyRealData { YearHeight = data.Height, YearHeightTime = time }) .Where(x => x.FamilyId == data.familyid && devtypes.Contains(x.DevType)).ExecuteCommandAsync(); } } } /// /// 更新实时数据 /// /// /// [CapSubscribe("result.service.updaterealdata")] public async Task UpdateRealData(UpdateRealDataS2SDtO data) { //更新设备测量时间 await dbClient.Updateable().SetColumns(x => new YB_Device { LastHeartTime = data.CreateTime }).Where(x => x.Id == data.DevId).ExecuteCommandAsync(); //设备今天是否活跃 int activecnt = (!data.DeviceLastHeartTime.HasValue || data.DeviceLastHeartTime.Value.Date != DateTime.Now.Date) ? 1 : 0; //更新合计统计 if (await dbClient.Queryable().AnyAsync()) { await dbClient.Updateable().SetColumns(x => new YB_Combined { TodayResultCnt = x.TodayResultCnt + 1, TotalResultCnt = x.TotalResultCnt, TodayDevCnt = x.TodayDevCnt + activecnt }).Where(x => x.Id == 1).ExecuteCommandAsync(); } else { await dbClient.Insertable(new YB_Combined { Id = 1, BusinessCnt = 0, TodayDevCnt = 1, TodayIncome = 0, TodayRegCnt = 0, TotalDevCnt = 0, TodayResultCnt = 1, TotalIncome = 0, TotalRegCnt = 0, TotalResultCnt = 1 }).ExecuteCommandAsync(); } //更新设备统计 if (await dbClient.Queryable().AnyAsync(x => x.EquId == data.DevId && x.BusinessId == data.BusinessId)) { await dbClient.Updateable().SetColumns(x => new YB_EquRealData { TodayResultCnt = x.TodayResultCnt + 1, TotalResultCnt = x.TotalResultCnt + 1 }).Where(x => x.EquId == data.DevId && x.BusinessId == data.BusinessId).ExecuteCommandAsync(); } else { await dbClient.Insertable(new YB_EquRealData { EquId = data.DevId, BusinessId = data.BusinessId, CreateTime = data.CreateTime, TodayInCome = 0, TodayRealCnt = 0, TodayResultCnt = 1, TotalInCome = 0, TotalRealCnt = 0, TotalResultCnt = 1 }).ExecuteCommandAsync(); } //更新客户统计 if (await dbClient.Queryable().AnyAsync(x => x.BusinessId == data.BusinessId)) { await dbClient.Updateable().SetColumns(x => new YB_BusinessRealData { TodayResultCnt = x.TodayResultCnt + 1, TotalResultCnt = x.TotalResultCnt + 1, TodayDevCount = x.TodayDevCount + activecnt }).Where(x => x.BusinessId == data.BusinessId).ExecuteCommandAsync(); } else { await dbClient.Insertable(new YB_BusinessRealData { BusinessId = data.BusinessId, CreateTime = data.CreateTime, TodayRealCnt = 0, TodayResultCnt = 1, TotalRealCnt = 0, TotalResultCnt = 1, Balance = 0, BusinessCount = 0, DevCount = 0, TodayDevCount = 1, TodayIncome = 0, TotalIncome = 0, TotalTxAmount = 0 }).ExecuteCommandAsync(); } } /// /// 添加测量记录 /// /// /// [CapSubscribe("result.service.insertuserresult")] public async Task InsertResultData(InsertResultDataS2SDto data) { if (data.ResultId != Guid.Empty && await dbClient.Queryable().AnyAsync(x => x.Id == data.ResultId)) { return; } List devtypes = await _deviceTypeService.GetDevTypesAsync(data.DevType); //添加一条测量记录 var result = new YB_nResult { Id = data.ResultId != Guid.Empty ? data.ResultId : IDGen.NextID(), SourceType = data.SourceType, BusinessId = data.BusinessId, CreateTime = data.CreateTime.Value, DevType = data.DevType, EquId = data.DevId, Height = data.height, Weight = data.weight, Imp = data.imp, LeftArmImp = data.LeftArmImp, RightArmImp = data.RightArmImp, LeftLegImp = data.LeftLegImp, RightLegImp = data.RightLegImp }; await dbClient.Insertable(result).ExecuteCommandAsync(); //如果是八电极wifi推送的 if (data.SourceType == 3) { //添加一条认领记录 await dbClient.Insertable(new YB_nUserResult { Id = result.Id, CreateTime = result.CreateTime, DevType = data.DevType, FamilyId = 0, FansId = null, UserId = 0, Status = 1 }).ExecuteCommandAsync(); } //如果用户认领 if (data.IsUserTake) { //增加一条认领记录 var fansid = await dbClient.Queryable().Where(x => x.Id == data.UserId).Select(x => x.FansId).FirstAsync(); //增加yb_nuserresult var userresult = new YB_nUserResult { CreateTime = result.CreateTime, FamilyId = data.familyid, Id = result.Id, UserId = data.UserId, FansId = fansid, DevType = result.DevType, Status = 1 }; await dbClient.Insertable(userresult).ExecuteCommandAsync(); var family = await dbClient.Queryable().FirstAsync(x => x.Id == data.familyid); var month = family.Birthday.ToMonth(); //如果是八电极则调用八电极算法 if (await dbClient.Queryable().AnyAsync(x => x.Code == data.DevType && x.ProType == DeviceProType.WT8)) { if (!await dbClient.Queryable().AnyAsync(x => x.Id == result.Id)) { var calcresult = await _bodyFatHelperService.CalcBody120FatAsync(data.weight, data.height, family.Age, (GenderType)family.Sex, data.LeftArmImp, data.RightArmImp, data.LeftLegImp, data.RightLegImp, data.imp); var leveljson = new MeasureLevelDto { bmiLevel = calcresult.bmiLevel, sfrLevel = calcresult.sfrLevel, SkeletalMuscleLevel = calcresult.SkeletalMuscleLevel, bodyageLevel = calcresult.bodyageLevel, bodylevel = calcresult.bodylevel, boneLevel = calcresult.boneLevel, fatLevel = calcresult.fatLevel, fat_rLevel = calcresult.fat_rLevel, fat_wLevel = calcresult.fat_wLevel, kcalLevel = calcresult.kcalLevel, muscleLevel = calcresult.muscleLevel, musulevalLevel = calcresult.musulevalLevel, proteinLevel = calcresult.proteinLevel, proteinvalLevel = calcresult.proteinvalLevel, visceralLevel = calcresult.visceralLevel, waterLevel = calcresult.waterLevel }.ToJson(); var measureresult = new YB_nMeasureResult { Id = result.Id, DevType = result.DevType, Age = family.Age, sfr = calcresult.sfr, Sex = family.Sex, bmi = calcresult.bmi, body = calcresult.body, bodyage = calcresult.bodyage, bone = calcresult.bone, cmi = calcresult.cmi, createtime = result.CreateTime, fatlevel = calcresult.fatLevel, fat_r = calcresult.fat_r, fat_w = calcresult.fat_w, Height = result.Height, Head = data.Head, kcal = calcresult.kcal, lbm = calcresult.lbm, Month = month, muscle = calcresult.muscle, muscleval = calcresult.muscleval, protein = calcresult.protein, proteinval = calcresult.proteinval, visceral = calcresult.visceral, water = calcresult.water, Weight = result.Weight, BodyFat = calcresult.bodyfatraterunk, SfrVal = calcresult.sfrval, SkeletalMuscle = calcresult.SkeletalMuscle, BodyFatVal = calcresult.bodyfatkgtrunk, LeftFootFat = calcresult.bodyfatrateleftleg, BodyMuscle = calcresult.muscleratetrunk, BodyMuscleVal = calcresult.musclekgtrunk, IdealWeight = calcresult.idealweight, LeftFootFatVal = calcresult.bodyfatkgleftleg, LeftFootMuscle = calcresult.musclerateleftleg, LeftFootMuscleVal = calcresult.musclekgleftleg, LeftHandFat = calcresult.bodyfatrateleftarm, LeftHandFatVal = calcresult.bodyfatkgleftarm, LeftHandMuscle = calcresult.musclerateleftarm, LeftHandMuscleVal = calcresult.musclekgleftarm, RightFootFat = calcresult.bodyfatraterightleg, RightFootFatVal = calcresult.bodyfatkgrightleg, RightFootMuscle = calcresult.muscleraterightleg, RightFootMuscleVal = calcresult.musclekgrightleg, RightHandFat = calcresult.bodyfatraterightarm, RightHandFatVal = calcresult.bodyfatkgrightarm, RightHandMuscle = calcresult.muscleraterightarm, RightHandMuscleVal = calcresult.musclekgrightarm }; await dbClient.Insertable(measureresult).ExecuteCommandAsync(); } } //如果是两/四点击则调用四电极算法 else { //计算结果 var calcresult = _bodyFatHelperService.CalcBodyFat(data.weight.ToDouble(), data.height.ToDouble(), family.Age, data.imp.ToInt(), (GenderType)family.Sex); //增加计算结果 var measureresult = new YB_nMeasureResult { Id = result.Id, sfr = calcresult.sfr, Sex = family.Sex, SfrVal = 0, SkeletalMuscle = 0, Age = family.Age, DevType = data.DevType, bmi = calcresult.bmi, body = calcresult.bodylevel, bodyage = calcresult.bodyage, BodyFat = 0, BodyFatVal = 0, BodyMuscle = 0, BodyMuscleVal = 0, bone = calcresult.bone, cmi = calcresult.cmi, createtime = result.CreateTime, fatlevel = calcresult.fatLevel, fat_r = calcresult.fat_r, fat_w = calcresult.fat_w, Height = data.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 = data.weight, Head = data.Head }; await dbClient.Insertable(measureresult).ExecuteCommandAsync(); } //添加用户使用过的设备类型 if (!await dbClient.Queryable().AnyAsync(x => data.DevType == x.DevType && x.UserId == data.UserId)) { var insertdata = new YB_UserEqu { Id = IDGen.NextID(), CreateTime = result.CreateTime, DevType = data.DevType, UserId = data.UserId }; await dbClient.Insertable(insertdata).ExecuteCommandAsync(); } else { await dbClient.Updateable().SetColumns(x => new YB_UserEqu { CreateTime = DateTime.Now }).Where(x => x.DevType == data.DevType && x.UserId == data.UserId).ExecuteCommandAsync(); } //记录用户最近记录信息 if (data.SourceType != 2) { if (await dbClient.Queryable().AnyAsync(x => x.UserId == data.UserId)) { await dbClient.Updateable().SetColumns(x => new YB_UserLastData { LastResultId = result.Id, LastResultTime = result.CreateTime }).Where(x => x.UserId == data.UserId).ExecuteCommandAsync(); } else { await dbClient.Insertable(new YB_UserLastData { LastResultId = result.Id, LastResultTime = result.CreateTime, UserId = data.UserId }).ExecuteCommandAsync(); } } } //如果是手动添加的记录 if (data.SourceType == 2) { var resultadd = new YB_nResultAdd { CreateTime = DateTime.Now, ResultTime = result.CreateTime, FamilyId = data.familyid, Height = result.Height, Id = result.Id, UserId = data.UserId, Weight = result.Weight, Head = data.Head }; await dbClient.Insertable(resultadd).ExecuteCommandAsync(); } //检查设备的最新测量时间是否大于传过来的时间 if (!data.DeviceLastHeartTime.HasValue || data.DeviceLastHeartTime.Value < data.CreateTime.Value) { //更新设备测量时间 await dbClient.Updateable().SetColumns(x => new YB_Device { LastHeartTime = data.CreateTime }).Where(x => x.Id == data.DevId).ExecuteCommandAsync(); } //设备今天是否活跃 int activecnt = (!data.DeviceLastHeartTime.HasValue || data.DeviceLastHeartTime.Value.Date != DateTime.Now.Date) ? 1 : 0; int todaycnt = data.CreateTime.Value.Date == DateTime.Now.Date ? 1 : 0; //更新合计统计 await dbClient.Updateable().SetColumns(x => new YB_Combined { TodayResultCnt = x.TodayResultCnt + todaycnt, TotalResultCnt = x.TotalResultCnt + 1, TodayDevCnt = x.TodayDevCnt + activecnt }).Where(x => x.Id == 1).ExecuteCommandAsync(); //更新设备统计 if (await dbClient.Queryable().AnyAsync(x => x.EquId == data.DevId && x.BusinessId == data.BusinessId)) { await dbClient.Updateable().SetColumns(x => new YB_EquRealData { TodayResultCnt = x.TodayResultCnt + todaycnt, TotalResultCnt = x.TotalResultCnt + 1 }).Where(x => x.EquId == data.DevId && x.BusinessId == data.BusinessId).ExecuteCommandAsync(); } else { await dbClient.Insertable(new YB_EquRealData { EquId = data.DevId, BusinessId = data.BusinessId, CreateTime = result.CreateTime, TodayInCome = 0, TodayRealCnt = 0, TodayResultCnt = todaycnt, TotalInCome = 0, TotalRealCnt = 0, TotalResultCnt = 1 }).ExecuteCommandAsync(); } //更新客户统计 if (await dbClient.Queryable().AnyAsync(x => x.BusinessId == data.BusinessId)) { await dbClient.Updateable().SetColumns(x => new YB_BusinessRealData { TodayResultCnt = x.TodayResultCnt + todaycnt, TotalResultCnt = x.TotalResultCnt + 1, TodayDevCount = x.TodayDevCount + activecnt }).Where(x => x.BusinessId == data.BusinessId).ExecuteCommandAsync(); } else { await dbClient.Insertable(new YB_BusinessRealData { BusinessId = data.BusinessId, CreateTime = result.CreateTime, TodayRealCnt = 0, TodayResultCnt = todaycnt, TotalRealCnt = 0, TotalResultCnt = 1, Balance = 0, BusinessCount = 0, DevCount = 0, TodayDevCount = 1, TodayIncome = 0, TotalIncome = 0, TotalTxAmount = 0 }).ExecuteCommandAsync(); } if (data.SourceType == 2) { //更新月度成长曲线 var time = data.CreateTime.Value; DateTime day1 = time.Date.AddDays(1 - time.Day);//本月月初 DateTime nowtime = DateTime.Now; var reportdata = await dbClient.Queryable() .Select(x => new YB_FamilyReportData { Height = x.Height, Weight = x.Weight, LastWeightTime = x.LastWeightTime }) .FirstAsync(x => x.CreateTime == day1 && x.FamilyId == data.familyid && x.DevType == data.DevType); if (reportdata != null) { //如果身高值大于所属月度值的身高值,则进行更新 if (reportdata.Height < data.height) { await dbClient.Updateable().SetColumns(x => new YB_FamilyReportData { Height = data.height }).Where(x => x.CreateTime == day1 && x.FamilyId == data.familyid && devtypes.Contains(x.DevType)).ExecuteCommandAsync(); } //如果体重时间大于所属月度值的最新体重,则进行更新 if (reportdata.LastWeightTime.HasValue && reportdata.LastWeightTime.Value < time) { await dbClient.Updateable().SetColumns(x => new YB_FamilyReportData { Weight = data.weight, LastWeightTime = time }).Where(x => x.CreateTime == day1 && x.FamilyId == data.familyid && devtypes.Contains(x.DevType)).ExecuteCommandAsync(); } } else if (time.Year != nowtime.Year || (time.Year == nowtime.Year && time.Month != nowtime.Month)) { await dbClient.Insertable(new YB_FamilyReportData { DevType = data.DevType, CreateTime = day1, FamilyId = data.familyid, Height = data.height, LastWeightTime = time, Weight = data.weight }).ExecuteCommandAsync(); } //增量数据更新 var familyrealdata = await dbClient.Queryable().FirstAsync(x => x.FamilyId == data.familyid && x.DevType == data.DevType); if (familyrealdata != null) { DateTime halfyeartime = nowtime.AddMonths(-6).Date; halfyeartime = halfyeartime.AddDays(1 - halfyeartime.Day); DateTime yeartime = nowtime.AddYears(-1).Date; yeartime = yeartime.AddDays(1 - yeartime.Day); //如果时间是半年前的那个月份中 if (time.Date >= halfyeartime.Date && time.Date < halfyeartime.AddMonths(1).Date && familyrealdata.HalfYearHeight < data.height) { await dbClient.Updateable().SetColumns(x => new YB_FamilyRealData { HalfYearHeight = data.height, HalfYearHeightTime = time }) .Where(x => x.FamilyId == data.familyid && devtypes.Contains(x.DevType)).ExecuteCommandAsync(); } //如果时间是一年前的那个月份中 if (time.Date >= yeartime.Date && time.Date < yeartime.AddMonths(1).Date && familyrealdata.YearHeight < data.height) { await dbClient.Updateable().SetColumns(x => new YB_FamilyRealData { YearHeight = data.height, YearHeightTime = time }) .Where(x => x.FamilyId == data.familyid && devtypes.Contains(x.DevType)).ExecuteCommandAsync(); } } } } /// /// 添加通知日志 /// /// /// [CapSubscribe("system.service.insertnoticelogger")] public async Task InsertNoticeLoggerAsync(YB_NoticeLogger message) { if (await dbClient.Queryable().AnyAsync(x => x.Id == message.Id)) { return; } var data = new YB_NoticeLogger { Ip = Net.Ip, CreateTime = DateTime.Now, FromInfo = message.FromInfo.ToStr(), Info = message.Info.ToStr(), UA = message.UA.ToStr(), UserInfo = message.UserInfo.ToStr(), Id = message.Id }; await dbClient.Insertable(data).ExecuteCommandAsync(); } /// /// 删除用户测量记录 /// /// /// [CapSubscribe("system.service.deleteuserresult")] public async Task DeleteUserDataAsync(DeleteUserDataS2SDto data) { var familydata = await dbClient.Queryable().FirstAsync(x => x.DevType == data.DevType && x.FamilyId == data.FamilyId); if (familydata == null) { return; } List devtypes = await _deviceTypeService.GetDevTypesAsync(data.DevType); var topresult = await dbClient.Queryable().Where(x => SqlFunc.Subqueryable().Where(e => e.FamilyId == data.FamilyId && e.Status == 1 && e.Id == x.Id && devtypes.Contains(e.DevType)).Any()).OrderBy(x => x.createtime, OrderByType.Desc).Select(x => new YB_nResult { Id = x.Id, CreateTime = x.createtime, Height = x.Height, Weight = x.Weight }).FirstAsync(); DateTime nowtime = DateTime.Now; //当前删除的记录值 var CurrentResult = await dbClient.Queryable().Where(x => x.Id == data.ResultId).Select(x => new YB_nResult { Id = x.Id, CreateTime = x.createtime, Height = x.Height, Weight = x.Weight }).FirstAsync(); //1、更新yb_familyrealdata记录为上一条,2、更新重量/身高变化,3、更新月度身高/重量,4、更新半年/一年身高数据 //如果删除的记录等于最新记录值 if (topresult.Id == data.ResultId) { //更新上条为最新值 var lastresultlist = await dbClient.Queryable() .Where(x => SqlFunc.Subqueryable().Where(e => e.FamilyId == data.FamilyId && e.Status == 1 && e.Id == x.Id && devtypes.Contains(e.DevType)).Any() && x.Id != data.ResultId) .OrderBy(x => x.createtime, OrderByType.Desc) .Select(x => new YB_nResult { Id = x.Id, CreateTime = x.createtime, Height = x.Height, Weight = x.Weight }).Take(2).ToListAsync(); if (lastresultlist.Count > 0) { var lastresult = lastresultlist[0]; var nextresult = lastresultlist.Count == 2 ? lastresultlist[1] : null; familydata.LastResultId = lastresult.Id; familydata.LastHeight = lastresult.Height; familydata.LastResultHeightTime = lastresult.CreateTime; familydata.LastResultTime = lastresult.CreateTime; familydata.LastTimeHeight = nextresult == null ? 0 : nextresult.Height - lastresult.Height; familydata.LastTimeWeight = nextresult == null ? 0 : nextresult.Weight - lastresult.Weight; familydata.LastWeight = lastresult.Weight; //检查是否修改月度值,最新记录的月份是否还在当前月,如果在则更新月度数据,否则置0 if (lastresult.CreateTime.Year == nowtime.Year && lastresult.CreateTime.Month == nowtime.Month) { familydata.MonthWeight = lastresult.Weight; } else { familydata.MonthWeight = 0; familydata.MonthHeight = 0; } } } else { var lastresultlist = await dbClient.Queryable().Where(x => SqlFunc.Subqueryable().Where(e => e.FamilyId == data.FamilyId && e.Status == 1 && e.Id == x.Id && devtypes.Contains(e.DevType)).Any() && x.Id != topresult.Id).OrderBy(x => x.createtime, OrderByType.Desc).Select(x => new YB_nResult { Id = x.Id, CreateTime = x.createtime, Height = x.Height, Weight = x.Weight }).Take(2).ToListAsync(); //如果记录是上一条 if (lastresultlist != null && lastresultlist.Count > 0) { var lastresult = lastresultlist[0]; if (lastresult.Id == data.ResultId) { var nextresult = lastresultlist.Count == 2 ? lastresultlist[1] : null; familydata.LastTimeHeight = nextresult == null ? 0 : nextresult.Height - topresult.Height; familydata.LastTimeWeight = nextresult == null ? 0 : nextresult.Weight - topresult.Weight; } } else { familydata.LastTimeHeight = 0; familydata.LastTimeWeight = 0; } } //检查是否引起月度身高变化 if (CurrentResult.CreateTime.Year == nowtime.Year && CurrentResult.CreateTime.Month == nowtime.Month) { if (CurrentResult.Height == familydata.MonthHeight) { DateTime monthstart = nowtime.AddDays(1 - nowtime.Day).Date; familydata.MonthHeight = await dbClient.Queryable() .Where(x => SqlFunc.Subqueryable() .Where(e => e.FamilyId == data.FamilyId && e.CreateTime >= monthstart && e.Status == 1 && e.Id == x.Id && devtypes.Contains(e.DevType)).Any()) .MaxAsync(x => x.Height); } } else { //不在本月的统计重新计算 var time = CurrentResult.CreateTime.AddDays(1 - CurrentResult.CreateTime.Day).Date; var timend = time.AddMonths(1); //检查是否引起月度记录表变化 var NewResult = await dbClient.Queryable() .Where(x => SqlFunc.Subqueryable() .Where(e => e.FamilyId == data.FamilyId && e.CreateTime >= time && e.CreateTime < timend && e.Status == 1 && e.Id == x.Id && devtypes.Contains(e.DevType)).Any()) .OrderBy(x => x.createtime, OrderByType.Desc) .Select(x => new YB_nResult { Id = x.Id, CreateTime = x.createtime, Height = x.Height, Weight = x.Weight }) .FirstAsync(); //查找本月的最大身高值和最新体重 if (NewResult != null) { var MonthHeight = await dbClient.Queryable() .Where(x => SqlFunc.Subqueryable() .Where(e => e.FamilyId == data.FamilyId && e.CreateTime >= time && e.CreateTime < timend && e.Status == 1 && e.Id == x.Id && devtypes.Contains(e.DevType)).Any()) .MaxAsync(x => x.Height); if (await dbClient.Queryable().Where(x => x.FamilyId == data.FamilyId && x.DevType == data.DevType && x.CreateTime == time).AnyAsync()) { await dbClient.Insertable(new YB_FamilyReportData { DevType = data.DevType, CreateTime = time, FamilyId = data.FamilyId, Height = MonthHeight, LastWeightTime = NewResult.CreateTime, Weight = NewResult.Weight }).ExecuteCommandAsync(); } else { await dbClient.Updateable().SetColumns(x => new YB_FamilyReportData { Height = MonthHeight, LastWeightTime = NewResult.CreateTime, Weight = NewResult.Weight }).Where(x => x.CreateTime == time && x.FamilyId == data.FamilyId && devtypes.Contains(x.DevType)).ExecuteCommandAsync(); } } } //是否引起年度数据更新 DateTime halfyeartime = nowtime.AddMonths(-6).Date; halfyeartime = halfyeartime.AddDays(1 - halfyeartime.Day); DateTime halfyearendtime = halfyeartime.AddMonths(1); DateTime yeartime = nowtime.AddYears(-1).Date; yeartime = yeartime.AddDays(1 - yeartime.Day); DateTime yearendtime = yeartime.AddMonths(1); if (CurrentResult.CreateTime.Year == halfyeartime.Year && CurrentResult.CreateTime.Month == halfyeartime.Month) { //找出最大值 var MonthHeight = await dbClient.Queryable() .Where(x => SqlFunc.Subqueryable() .Where(e => e.FamilyId == data.FamilyId && e.CreateTime >= halfyeartime && e.CreateTime < halfyearendtime && e.Status == 1 && e.Id == x.Id && devtypes.Contains(e.DevType)).Any()) .OrderBy(x => x.Height, OrderByType.Desc) .FirstAsync(); familydata.HalfYearHeight = MonthHeight != null ? MonthHeight.Height : 0; familydata.HalfYearHeightTime = MonthHeight != null ? MonthHeight.createtime : null; } if (CurrentResult.CreateTime.Year == yeartime.Year && CurrentResult.CreateTime.Month == yeartime.Month) { //找出最大值 var MonthHeight = await dbClient.Queryable() .Where(x => SqlFunc.Subqueryable() .Where(e => e.FamilyId == data.FamilyId && e.CreateTime >= yeartime && e.CreateTime < yearendtime && e.Status == 1 && e.Id == x.Id && devtypes.Contains(e.DevType)).Any()) .OrderBy(x => x.Height, OrderByType.Desc) .FirstAsync(); familydata.YearHeight = MonthHeight != null ? MonthHeight.Height : 0; familydata.YearHeightTime = MonthHeight != null ? MonthHeight.createtime : null; } //更新统计数据 await dbClient.Updateable().SetColumns(x => new YB_FamilyRealData { LastHeight = familydata.LastHeight, LastResultHeightTime = familydata.LastResultHeightTime, LastResultId = familydata.LastResultId, LastResultTime = familydata.LastResultTime, LastTimeHeight = familydata.LastTimeHeight, LastTimeWeight = familydata.LastWeight, LastWeight = familydata.LastWeight, HalfYearHeight = familydata.HalfYearHeight, HalfYearHeightTime = familydata.HalfYearHeightTime, MonthHeight = familydata.MonthHeight, MonthWeight = familydata.MonthWeight, YearHeight = familydata.YearHeight, YearHeightTime = familydata.YearHeightTime }).Where(x => x.FamilyId == data.FamilyId && devtypes.Contains(x.DevType)).ExecuteCommandAsync(); //更新记录 await dbClient.Updateable() .SetColumns(x => new YB_nUserResult { Status = 0 }) .Where(x => x.Id == data.ResultId).ExecuteCommandAsync(); } /// /// 邮件发送 /// /// public Task SendEmailAsync(SendEmailS2SDto data) { throw new NotImplementedException(); } /// /// 订阅消息发送 /// /// /// [CapSubscribe("system.service.sendsubscribemessage")] public async Task SendSubscribeMessageAsync(SendSubscribeMessageS2SDto data) { string token = await AuthorizerContainer.TryGetAuthorizerAccessTokenAsync(component_AppId, data.AppId); //解析模板参数 var tpl = await dbClient.Queryable().FirstAsync(x => x.PriTmplId == data.TplId); if (tpl == null) { return; } var keywords = tpl.KeyWords.Split('|'); var examples = tpl.Example.Split('|'); var senddata = new Dictionary(); for (var i = 0; i < keywords.Length; i++) { string val = GetSubscribeValue(examples[i]); senddata.Add(keywords[i], new TemplateMessageDataValue(val)); } string page = "pages/index/index"; var tpldata = new TemplateMessageData(senddata); var result = await Senparc.Weixin.WxOpen.AdvancedAPIs.MessageApi.SendSubscribeAsync(token, data.OpenId, data.TplId, tpldata, page); if (result.errcode != 0) { InsertErrorLogger($"订阅消息发送失败,失败原因:{result.errmsg},参数:{data.ToJson()}"); } //删除此条消息 await dbClient.Deleteable().Where(x => x.Id == data.Id).ExecuteCommandAsync(); } /// /// 解析关键字特殊值 /// /// /// public string GetSubscribeValue(string val) => (val.ToUpper()) switch { SubscribeKeyWordConst.Date => $"{DateTime.Now.ToString("yyyy/MM/dd")}", SubscribeKeyWordConst.DateTime => $"{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}", _ => val }; /// /// 添加审计日志 /// /// [CapSubscribe("system.service.insertauditlogger")] public async Task InsertAuditLogger(AduitLogS2SDto data) { var audit = data.Adapt(); audit.Id = IDGen.NextID(); audit.CreatTime = DateTime.Now; await dbClient.Insertable(audit).ExecuteCommandAsync(); } } }