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, "抱歉,体质评估失败");
}
}
}