自动计算触发
This commit is contained in:
@@ -154,7 +154,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
{
|
||||
IsChangeOtherTask = false,
|
||||
VisitTaskId = inDto.VisitTaskId,
|
||||
ComputationTrigger = ComputationTrigger.Report,
|
||||
ComputationTrigger = ComputationTrigger.InitialCalculation,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -209,7 +209,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
{
|
||||
await service.CalculateTask(new CalculateTaskInDto()
|
||||
{
|
||||
ComputationTrigger= ComputationTrigger.Report,
|
||||
ComputationTrigger= ComputationTrigger.InitialCalculation,
|
||||
VisitTaskId = inDto.VisitTaskId
|
||||
});
|
||||
}
|
||||
|
||||
@@ -513,88 +513,81 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
|
||||
List<ReadingCalculateData> calculateList = new List<ReadingCalculateData>()
|
||||
{
|
||||
/*
|
||||
* 保存影像质量问题
|
||||
* 如果:不正常:PET-CT不能融合, FDG-PET的评估设置为NE
|
||||
*
|
||||
* 保存二维页面病灶
|
||||
*
|
||||
* 保存
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
// 是否存在Pet
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.ExistPET,GetStringFun=GetExistPET},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.ExistPET,GetStringFun=GetExistPET ,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, } },
|
||||
|
||||
//垂直径乘积之和(SPD)
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SPD,GetDecimalFun=GetSPD},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SPD,GetDecimalFun=GetSPD,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.CTSave,ComputationTrigger.RemoveLesion,}},
|
||||
|
||||
// 与基线相比SPD变化的百分比
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SPDChange,GetStringFun=CompareBaselineSPD},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SPDChange,GetStringFun=CompareBaselineSPD,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.CTSave,ComputationTrigger.RemoveLesion,}},
|
||||
|
||||
// 脾脏垂直径
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SpleenLength,GetDecimalNullFun=GetSpleenLength,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,}},
|
||||
|
||||
// 与基线相比脾肿大增加的百分比
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SplenoncusChange,GetStringFun=GetSplenoncusChange},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SplenoncusChange,GetStringFun=GetSplenoncusChange,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,}},
|
||||
|
||||
// 与最低点相比脾脏垂直径长度的增加值
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SplenoncusAdd,GetStringFun=GetSplenoncusAdd},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SplenoncusAdd,GetStringFun=GetSplenoncusAdd,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,}},
|
||||
|
||||
// 与基线相比脾垂直径变化值
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SplenoncusDiameterChange,GetStringFun=GetSplenoncusDiameterChange},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SplenoncusDiameterChange,GetStringFun=GetSplenoncusDiameterChange,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,}},
|
||||
|
||||
// 脾肿垂直径最低点访视
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.LowestSplenoncusVisit,GetStringFun=GetLowestSplenoncusVisit},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.LowestSplenoncusVisit,GetStringFun=GetLowestSplenoncusVisit,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,}},
|
||||
|
||||
// 获取脾脏状态
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SplenicStatus,GetStringFun=GetSplenicStatus,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,}},
|
||||
|
||||
// 获取脾脏评估
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SplenicEvaluation,GetStringFun=GetSplenicEvaluation},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SplenicEvaluation,GetStringFun=GetSplenicEvaluation,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,ComputationTrigger.SplenicEvaluation,}},
|
||||
|
||||
//靶病灶评估
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.TargetLesion,GetStringFun=GetTargetLesionEvaluate},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.TargetLesion,GetStringFun=GetTargetLesionEvaluate,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.CTSave,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,ComputationTrigger.MergeLesion,}},
|
||||
|
||||
//非靶病灶评估
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.NoTargetLesion,GetStringFun=GetNoTargetLesionEvaluate},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.NoTargetLesion,GetStringFun=GetNoTargetLesionEvaluate,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.CTSave,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||||
|
||||
//新病灶评估
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.NewLesionEvaluation,GetStringFun=GetNewLesionEvaluate},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.NewLesionEvaluation,GetStringFun=GetNewLesionEvaluate,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.CTSave,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||||
|
||||
//获取肝脏评估
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.LiverAssessment,GetStringFun=GetLiverAssessment},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.LiverAssessment,GetStringFun=GetLiverAssessment,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.LiverStatus,}},
|
||||
|
||||
// // 骨髓中是否存在局灶性 FDG亲和病灶的证据
|
||||
//new ReadingCalculateData (){QuestionType=QuestionType.EvidenceFocalFDG,GetStringFun=GetEvidenceFocalFDG,ComputationTrigger=ComputationTrigger.Lesion},
|
||||
// 骨髓中是否存在局灶性 FDG亲和病灶的证据
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.EvidenceFocalFDG,GetStringFun=GetEvidenceFocalFDG,ComputationTriggerList=new List<ComputationTrigger>(){ }},
|
||||
|
||||
//CT/MRI
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.CTandMRI,GetStringFun=CTMRIEvaluation},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.CTandMRI,GetStringFun=CTMRIEvaluation,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.LiverStatus,ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,ComputationTrigger.SplenicEvaluation,ComputationTrigger.CTSave,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,ComputationTrigger.MergeLesion,}},
|
||||
|
||||
// PET 5PS评分
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.PET5PS,GetStringFun=GetPET5PS,ComputationTrigger=ComputationTrigger.Lesion},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.PET5PS,GetStringFun=GetPET5PS,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.ImageQuality, ComputationTrigger.LiverBloodPool,ComputationTrigger.MediastinalPool,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,} },
|
||||
|
||||
// 修改PET 5PS评分备注
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.PSScoreRemarks,GetStringFun=GetPET5PSRemark,ComputationTrigger=ComputationTrigger.Lesion},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.PSScoreRemarks,GetStringFun=GetPET5PSRemark,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.LiverBloodPool,ComputationTrigger.MediastinalPool,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||||
|
||||
//与基线相比摄取值变化
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.UptakeChange,GetStringFun=GetUptakeChange,ComputationTrigger=ComputationTrigger.Lesion},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.UptakeChange,GetStringFun=GetUptakeChange,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.LiverBloodPool,ComputationTrigger.MediastinalPool,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||||
|
||||
// FDG-PET 评估结果
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.FDGPET,GetStringFun=GetFDGPETOverallAssessment},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.FDGPET,GetStringFun=GetFDGPETOverallAssessment,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.ImageQuality, ComputationTrigger.LiverBloodPool,ComputationTrigger.MediastinalPool,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,ComputationTrigger.PDGPET,}},
|
||||
|
||||
// 上一次 FDG-PET 评估结果
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.LastFDGPET,GetStringFun=GetLastFDGPETOverallAssessment},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.LastFDGPET,GetStringFun=GetLastFDGPETOverallAssessment,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||||
|
||||
// 影像学整体肿瘤评估
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.ImgOncology,GetStringFun=GetImgOncology},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.ImgOncology,GetStringFun=GetImgOncology,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.LiverStatus,ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,ComputationTrigger.SplenicEvaluation,ComputationTrigger.LiverBloodPool,ComputationTrigger.MediastinalPool,ComputationTrigger.CTSave,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,ComputationTrigger.PDGPET,ComputationTrigger.MergeLesion,}},
|
||||
|
||||
|
||||
//SUVmax
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SUVmax,GetDecimalNullFun=GetSuvMax},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SUVmax,GetDecimalNullFun=GetSuvMax,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||||
|
||||
// SUVmax所在病灶
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SUVmaxLesion,GetStringFun=GetSuvMaxFocus},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.SUVmaxLesion,GetStringFun=GetSuvMaxFocus,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||||
|
||||
|
||||
//是否存在疾病
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.ExistDisease,GetStringFun=GetIsExistDisease},
|
||||
new ReadingCalculateData (){QuestionType=QuestionType.ExistDisease,GetStringFun=GetIsExistDisease,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.CTSave,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||||
|
||||
|
||||
|
||||
@@ -681,7 +674,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
}
|
||||
|
||||
|
||||
calculateList = calculateList.Where(x => x.ComputationTrigger == null || x.ComputationTrigger == inDto.ComputationTrigger).ToList();
|
||||
calculateList = calculateList.Where(x =>x.ComputationTriggerList.Contains(inDto.ComputationTrigger)).ToList();
|
||||
var typeNAList = new List<QuestionType>
|
||||
{
|
||||
QuestionType.SODChange,
|
||||
@@ -2046,13 +2039,42 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
|
||||
#endregion
|
||||
|
||||
#region 与基线相比SPD变化的百分比
|
||||
#region 脾脏垂直径
|
||||
/// <summary>
|
||||
/// 与基线相比SPD变化的百分比
|
||||
/// 获取脾脏垂直径
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<string> CompareBaselineSPD(ReadingCalculateDto inDto)
|
||||
public async Task<decimal?> GetSpleenLength(ReadingCalculateDto inDto)
|
||||
{
|
||||
|
||||
// 脾尖答案
|
||||
var splenicTopAnswer = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SplenicTopPosition).Select(x => x.Answer).FirstOrDefault();
|
||||
// 脾底答案
|
||||
var splenicBottomAnswer = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SplenicBottomPosition).Select(x => x.Answer).FirstOrDefault();
|
||||
|
||||
decimal? spleenLength=null;
|
||||
if (splenicTopAnswer != null && splenicBottomAnswer != null)
|
||||
{
|
||||
spleenLength = splenicTopAnswer.IsNullOrEmptyReturn0() - splenicBottomAnswer.IsNullOrEmptyReturn0();
|
||||
if (spleenLength < 0)
|
||||
{
|
||||
spleenLength = 0 - spleenLength;
|
||||
}
|
||||
return spleenLength;
|
||||
}
|
||||
|
||||
return spleenLength;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 与基线相比SPD变化的百分比
|
||||
/// <summary>
|
||||
/// 与基线相比SPD变化的百分比
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<string> CompareBaselineSPD(ReadingCalculateDto inDto)
|
||||
{
|
||||
if (inDto.IsBaseLine)
|
||||
{
|
||||
@@ -2400,6 +2422,23 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取脾脏状态
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<string> GetSplenicStatus(ReadingCalculateDto inDto)
|
||||
{
|
||||
var spleenLength= inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SpleenLength).Select(x => x.Answer).FirstOrDefault();
|
||||
if (spleenLength == string.Empty)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
else
|
||||
{
|
||||
return await GetSplenicState(inDto.VisitTaskId, spleenLength.IsNullOrEmptyReturn0());
|
||||
}
|
||||
}
|
||||
|
||||
#region 获取脾脏评估
|
||||
|
||||
@@ -2488,12 +2527,52 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
/// <returns></returns>
|
||||
public async Task<string> GetPET5PS(ReadingCalculateDto inDto)
|
||||
{
|
||||
//病灶最大SUVmax、肝脏血池、纵膈血池SUVmax未发生改变时,不用计算
|
||||
|
||||
// 如果是保存影像进来 PET-CT不能融合 就是NE
|
||||
if (inDto.ComputationTrigger == ComputationTrigger.ImageQuality)
|
||||
{
|
||||
if (await ImageQualityIsUnableFuse(inDto))
|
||||
{
|
||||
return PET5PSScore.NE.GetEnumInt();
|
||||
}
|
||||
}
|
||||
|
||||
// 如果不是保存肝脏血池和纵隔血池
|
||||
if (inDto.ComputationTrigger != ComputationTrigger.LiverBloodPool && inDto.ComputationTrigger != ComputationTrigger.MediastinalPool)
|
||||
{
|
||||
// 先在数据库查这几个值
|
||||
List<QuestionType?> needSearchTypes = new List<QuestionType?>()
|
||||
{
|
||||
QuestionType.SUVmax,
|
||||
QuestionType.PET5PS,
|
||||
};
|
||||
|
||||
var dataBaseDataList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && needSearchTypes.Contains(x.ReadingQuestionTrial.QuestionType)).Select(x => new
|
||||
{
|
||||
x.Answer,
|
||||
x.ReadingQuestionTrial.QuestionType
|
||||
}).ToListAsync(); ;
|
||||
|
||||
|
||||
// 数据库中最大SUVmax
|
||||
var dataBaseSUVmax = dataBaseDataList.Where(x => x.QuestionType == QuestionType.SUVmax).Select(x => x.Answer).FirstIsNullReturnEmpty();
|
||||
|
||||
// 如果SUVmax没变 就不重新计算
|
||||
if (dataBaseSUVmax == (await GetSuvMax(inDto)).ToString())
|
||||
{
|
||||
return dataBaseDataList.Where(x => x.QuestionType == QuestionType.PET5PS).Select(x => x.Answer).FirstIsNullReturnEmpty();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//if (inDto.IsBaseLine)
|
||||
//{
|
||||
// return SpleenAssessment.Stabilization.GetEnumInt();
|
||||
//}
|
||||
|
||||
|
||||
if (inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.ExistPET && x.Answer == ReadingYesOrNo.No.GetEnumInt()))
|
||||
{
|
||||
return PET5PSScore.NE.GetEnumInt();
|
||||
@@ -2577,8 +2656,33 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
/// <returns></returns>
|
||||
public async Task<string> GetUptakeChange(ReadingCalculateDto inDto)
|
||||
{
|
||||
//PET5ps评分改变时,才计算
|
||||
if (inDto.IsBaseLine)
|
||||
//PET5ps评分改变时,才计算
|
||||
|
||||
List<QuestionType?> needSearchTypes = new List<QuestionType?>()
|
||||
{
|
||||
QuestionType.PET5PS,
|
||||
QuestionType.UptakeChange,
|
||||
};
|
||||
|
||||
var dataBaseDataList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && needSearchTypes.Contains(x.ReadingQuestionTrial.QuestionType)).Select(x => new
|
||||
{
|
||||
x.Answer,
|
||||
x.ReadingQuestionTrial.QuestionType
|
||||
}).ToListAsync(); ;
|
||||
|
||||
|
||||
// 数据库中PET5ps评分
|
||||
var dataBasePET5ps = dataBaseDataList.Where(x => x.QuestionType == QuestionType.PET5PS).Select(x => x.Answer).FirstIsNullReturnEmpty();
|
||||
|
||||
|
||||
if (dataBasePET5ps == await GetPET5PS(inDto))
|
||||
{
|
||||
return dataBaseDataList.Where(x => x.QuestionType == QuestionType.UptakeChange).Select(x => x.Answer).FirstIsNullReturnEmpty();
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (inDto.IsBaseLine)
|
||||
{
|
||||
return SUVChangeVSBaseline.NA.GetEnumInt();
|
||||
}
|
||||
@@ -2658,7 +2762,23 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
public async Task<string> GetFDGPETOverallAssessment(ReadingCalculateDto inDto)
|
||||
{
|
||||
|
||||
if (inDto.IsBaseLine)
|
||||
// 如果是保存影像进来 PET-CT不能融合 就是NE
|
||||
if (inDto.ComputationTrigger == ComputationTrigger.ImageQuality)
|
||||
{
|
||||
if (await ImageQualityIsUnableFuse(inDto))
|
||||
{
|
||||
if (inDto.IsBaseLine)
|
||||
{
|
||||
return FDGPETOverallAssessment.NA.GetEnumInt();
|
||||
}
|
||||
else
|
||||
{
|
||||
return FDGPETOverallAssessment.NE.GetEnumInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (inDto.IsBaseLine)
|
||||
{
|
||||
return FDGPETOverallAssessment.NA.GetEnumInt();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user