313 lines
13 KiB
C#
313 lines
13 KiB
C#
|
|
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
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 儿童中医体质管理
|
|||
|
|
/// </summary>
|
|||
|
|
public class ChildBodyService : BaseService, IChildBodyService, ITransient
|
|||
|
|
{
|
|||
|
|
private readonly ISqlSugarRepository<YB_ChildBodyQA> repository;
|
|||
|
|
private readonly SqlSugarClient dbClient;
|
|||
|
|
private readonly IDistributedIDGenerator _idGen;
|
|||
|
|
public ChildBodyService(ISqlSugarRepository<YB_ChildBodyQA> sqlSugarRepository, IDistributedIDGenerator distributedIDGenerator)
|
|||
|
|
{
|
|||
|
|
repository = sqlSugarRepository;
|
|||
|
|
dbClient = repository.Context;
|
|||
|
|
_idGen = distributedIDGenerator;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取已经计算的结果
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="input"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public async Task<ResultInfo> GetInfoAsync(ChildBodyInfoC2SDto input)
|
|||
|
|
{
|
|||
|
|
var result = await dbClient.Queryable<YB_UserChildBody>().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, "抱歉,体质评估失败");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 体质结果
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="result"></param>
|
|||
|
|
/// <param name="familyid">家庭成员ID</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
private async Task<ChildBodySubmitResultData> GetBodyTypeAsync(List<YB_UserChildBody> result, int familyid)
|
|||
|
|
{
|
|||
|
|
var family = await dbClient.Queryable<YB_Family>().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<ChildBodySubmitResult>(),
|
|||
|
|
ReferList = new List<string> {
|
|||
|
|
"本文部分摘自《健康儿童中医体质辨识方法的研究》作者/王晓鸣,王徐静,林子良,《中华中医药学刊》"
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
//如果小于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<YB_ChildBodyDetail>()
|
|||
|
|
.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<ChildBodySubmitResult>();
|
|||
|
|
data.Result = ChildBodyTypeResult.Yes;
|
|||
|
|
returndata.list.Add(data);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
bodytype = "您是";
|
|||
|
|
}
|
|||
|
|
returndata.list = new List<ChildBodySubmitResult>();
|
|||
|
|
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<ChildBodySubmitResult>();
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 问答列表
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="input"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public async Task<ResultInfo> GetListAsync(ChildBodyListC2SDto input)
|
|||
|
|
{
|
|||
|
|
if (input.IsRestart == 1)
|
|||
|
|
{
|
|||
|
|
await dbClient.Deleteable<YB_UserChildBody>().Where(x => x.FamilyId == input.FamilyId).ExecuteCommandAsync();
|
|||
|
|
}
|
|||
|
|
var list = await dbClient.Queryable<YB_ChildBodyQA>()
|
|||
|
|
.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<ChildBodyListS2CDto>();
|
|||
|
|
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);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 根据分数计算倾向结果
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="score">分数</param>
|
|||
|
|
/// <param name="type">类型</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
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
|
|||
|
|
};
|
|||
|
|
/// <summary>
|
|||
|
|
/// 结果计算
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="data"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public async Task<ResultInfo> GetResultInfoAsync(ChildBodySumitC2SDto data)
|
|||
|
|
{
|
|||
|
|
var insertlist = new List<YB_UserChildBody>();
|
|||
|
|
var nowtime = DateTime.Now;
|
|||
|
|
|
|||
|
|
// 获取所有的存在同类型的问题
|
|||
|
|
var allsameqa = await dbClient.Queryable<YB_ChildBodyQA>()
|
|||
|
|
.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<YB_UserChildBody>().AnyAsync(x => x.FamilyId == data.FamilyId))
|
|||
|
|
{
|
|||
|
|
await dbClient.Deleteable<YB_UserChildBody>().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, "抱歉,体质评估失败");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|