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.Linq; using System.Threading.Tasks; using YBDevice.Entity; using YBDevice.Entity.ViewModel; namespace YBDevice.NApi.Application.ChildBody { /// /// 儿童中医体质管理 /// public class ChildBodyService : BaseService, IChildBodyService, ITransient { private readonly ISqlSugarRepository repository; private readonly SqlSugarClient dbClient; private readonly IDistributedIDGenerator _idGen; public ChildBodyService(ISqlSugarRepository sqlSugarRepository, IDistributedIDGenerator distributedIDGenerator) { repository = sqlSugarRepository; dbClient = repository.Context; _idGen = distributedIDGenerator; } /// /// 获取已经计算的结果 /// /// /// public async Task GetInfoAsync(ChildBodyInfoC2SDto input) { var result = await dbClient.Queryable().Where(x => x.FamilyId == input.FamilyId).ToListAsync(); //获取结果 if (result != null && result.Count > 0) { var data = await GetBodyTypeAsync(result, input.FamilyId); return new ResultInfo(ResultState.SUCCESS, "计算成功", data); } else { return new ResultInfo(ResultState.FAIL, "抱歉,体质评估失败"); } } /// /// 体质结果 /// /// /// 家庭成员ID /// private async Task GetBodyTypeAsync(List result, int familyid) { var family = await dbClient.Queryable().Where(x => x.Id == familyid).Select(x => new YB_Family { Birthday = x.Birthday }).FirstAsync(); var month = family != null ? family.Birthday.ToDMonth() : 0; ChildBodySubmitResultData returndata = new ChildBodySubmitResultData() { list = new List(), ReferList = new List { "本文部分摘自《健康儿童中医体质辨识方法的研究》作者/王晓鸣,王徐静,林子良,《中华中医药学刊》" } }; //如果小于6岁 if (month <= 12 * 6 * 1.0) { returndata.ReferList.Add("《0 - 6岁儿童常见中医体质辨识》,作者 / 潘佩光,徐俐平,周俊亮,王欣,田慧"); } // 如果是生机旺盛质>=21,其他6项小于12分,此项得分<21且其他6项大于12分(否) var sjwsdata = result.Where(x => x.Type == ChildBodyTypeEnum.SJWSZ).FirstOrDefault(); string bodytype = string.Empty; string bodytype1 = string.Empty; bool hasqx = false; //是否有倾向 bool haszc = false; //是否有是 var allresult = await dbClient.Queryable() .ToListAsync(); //如果是生机旺盛质 >= 21,其他6项<=12分 if (sjwsdata != null && result.Where(x => x.Type != ChildBodyTypeEnum.SJWSZ && x.Score <= 12).Count() == 6 && sjwsdata.Score >= 21) { bodytype = $"您是{EnumHelper.GetEnumTitle(sjwsdata.Type)},"; var data = allresult.Where(x => x.Type == ChildBodyTypeEnum.SJWSZ).Adapt(); data.Result = ChildBodyTypeResult.Yes; returndata.list.Add(data); } else { bodytype = "您是"; } returndata.list = new List(); foreach (var item in result) { if (item.Type != ChildBodyTypeEnum.SJWSZ) { string title = EnumHelper.GetEnumTitle(item.Type); var data = allresult.Where(x => x.Type == item.Type).FirstOrDefault().Adapt(); if (item.Score >= 17) { bodytype += $"{title},"; data.Result = ChildBodyTypeResult.Yes; returndata.list.Add(data); haszc = true; } else if (item.Score > 12 && item.Score < 17) { bodytype1 += hasqx ? $"{title}," : $"有{title},"; hasqx = true; data.Result = ChildBodyTypeResult.MayBe; returndata.list.Add(data); } } } if (returndata.list == null || returndata.list.Count == 0) { returndata.BodyType = "您的体质情况很健康"; } else { if (!string.IsNullOrEmpty(bodytype) && haszc) { returndata.BodyType = hasqx ? $"{bodytype}{bodytype1.Substring(0, bodytype1.Length - 1) + "倾向"}" : $"{ bodytype.Substring(0, bodytype.Length - 1)}"; } else { returndata.BodyType = $"您{bodytype1.Substring(0, bodytype1.Length - 1)}"; } } return returndata; } /// /// 问答列表 /// /// /// public async Task GetListAsync(ChildBodyListC2SDto input) { if (input.IsRestart == 1) { await dbClient.Deleteable().Where(x => x.FamilyId == input.FamilyId).ExecuteCommandAsync(); } var list = await dbClient.Queryable() .Where(x => x.SameType == ChildBodyTypeEnum.UnKnown) .OrderBy(x => x.Type, OrderByType.Asc) .Select(x => new YB_ChildBodyQA { Id = x.Id, Type = x.Type, Content = x.Content, SomeValue = x.SomeValue, AlWaysValue = x.AlWaysValue, LittleValue = x.LittleValue, NoneValue = x.NoneValue, OftenValue = x.OftenValue }).ToListAsync(); var returnlist = new List(); foreach (var item in list) { if (!returnlist.Any(x => x.Id == item.Type)) { returnlist.Add(new ChildBodyListS2CDto { Id = item.Type, Name = EnumHelper.GetEnumTitle(item.Type), qalist = list.Where(x => x.Type == item.Type).Select(x => new ChildBodyListS2SDto { AlWaysValue = x.AlWaysValue, SomeValue = x.SomeValue, Title = x.Content, LittleValue = x.LittleValue, NoneValue = x.NoneValue, OftenValue = x.OftenValue, Id = x.Id }).ToList() }); } } return new ResultInfo(ResultState.SUCCESS, "success", returnlist); } /// /// 根据分数计算倾向结果 /// /// 分数 /// 类型 /// private ChildBodyTypeResult GetResult(int score, ChildBodyTypeEnum type) => (score, type) switch { ( >= 17, ChildBodyTypeEnum.PXZ) or ( >= 17, ChildBodyTypeEnum.JZZ) or ( >= 17, ChildBodyTypeEnum.RZZ) or ( >= 17, ChildBodyTypeEnum.XHPWZ) or ( >= 17, ChildBodyTypeEnum.SZZ) or ( >= 17, ChildBodyTypeEnum.TBZ) => ChildBodyTypeResult.Yes, ( > 12 and < 17, ChildBodyTypeEnum.PXZ) or ( > 12 and < 17, ChildBodyTypeEnum.JZZ) or ( > 12 and < 17, ChildBodyTypeEnum.RZZ) or ( > 12 and < 17, ChildBodyTypeEnum.XHPWZ) or ( > 12 and < 17, ChildBodyTypeEnum.SZZ) or ( > 12 and < 17, ChildBodyTypeEnum.TBZ) => ChildBodyTypeResult.MayBe, _ => ChildBodyTypeResult.No }; /// /// 结果计算 /// /// /// public async Task GetResultInfoAsync(ChildBodySumitC2SDto data) { var insertlist = new List(); var nowtime = DateTime.Now; // 获取所有的存在同类型的问题 var allsameqa = await dbClient.Queryable() .Where(x => x.SameType != ChildBodyTypeEnum.UnKnown) .Select(x => new YB_ChildBodyQA { Id = x.Id, Type = x.Type, SameId = x.SameId, SameType = x.SameType }).ToListAsync(); foreach (var item1 in allsameqa) { var samedata = data.data.Where(x => x.id == item1.SameType).FirstOrDefault(); if (samedata != null) { var tempdata = samedata.list.Where(x => item1.SameId == x.Id).FirstOrDefault(); if (tempdata != null) { // 同类型插入 data.data.ForEach(x => { if (x.id == item1.Type) { x.list.Add(new ChildBodySubmitItemS2SDto { Id = item1.Id, Score = tempdata.Score }); } }); } } } foreach (var item in data.data) { if (item.id != ChildBodyTypeEnum.SJWSZ) { var insertdata = new YB_UserChildBody { Id = _idGen.Create().ToGuid(), CreateTime = nowtime, Score = item.list != null ? item.list.Sum(e => e.Score) : 0, FamilyId = data.FamilyId, Type = item.id, UserId = authInfo.UserId }; insertdata.Result = GetResult(insertdata.Score, item.id); insertlist.Add(insertdata); } } var sjwsdata = data.data.Where(x => x.id == ChildBodyTypeEnum.SJWSZ).FirstOrDefault(); if (sjwsdata != null) { if (insertlist.Where(x => x.Score <= 12).Count() == 6 && sjwsdata.list.Sum(x => x.Score) >= 21) { insertlist.Add(new YB_UserChildBody { Id = _idGen.Create().ToGuid(), CreateTime = nowtime, Score = sjwsdata.list != null ? sjwsdata.list.Sum(e => e.Score) : 0, FamilyId = data.FamilyId, Type = sjwsdata.id, UserId = authInfo.UserId, Result = ChildBodyTypeResult.Yes }); } else { insertlist.Add(new YB_UserChildBody { Id = _idGen.Create().ToGuid(), CreateTime = nowtime, Score = sjwsdata.list != null ? sjwsdata.list.Sum(e => e.Score) : 0, FamilyId = data.FamilyId, Type = sjwsdata.id, UserId = authInfo.UserId, Result = ChildBodyTypeResult.No }); } } if (insertlist.Count > 0) { if (await dbClient.Queryable().AnyAsync(x => x.FamilyId == data.FamilyId)) { await dbClient.Deleteable().Where(x => x.FamilyId == data.FamilyId).ExecuteCommandAsync(); } await dbClient.Insertable(insertlist).ExecuteCommandAsync(); var returndata = await GetBodyTypeAsync(insertlist, data.FamilyId); return new ResultInfo(ResultState.SUCCESS, "计算成功", returndata); } return new ResultInfo(ResultState.FAIL, "抱歉,体质评估失败"); } } }