Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build encountered an error Details

IRC_NewDev
he 2024-12-11 13:46:19 +08:00
commit 78bc09d71a
6 changed files with 217 additions and 80 deletions

View File

@ -71,7 +71,7 @@
"CompanyShortName": "Extensive Imaging", "CompanyShortName": "Extensive Imaging",
"CompanyShortNameCN": "展影医疗", "CompanyShortNameCN": "展影医疗",
"IsEnv_US": false, "IsEnv_US": false,
"IsOpenErrorNoticeEmail": true, "IsOpenErrorNoticeEmail": false,
"ErrorNoticeEmailList": [ "872297557@qq.com" ] "ErrorNoticeEmailList": [ "872297557@qq.com" ]
}, },
"SystemPacsConfig": { "SystemPacsConfig": {

View File

@ -64,7 +64,7 @@ public static class ExcelExportHelper
foreach (var key in dic.Keys) foreach (var key in dic.Keys)
{ {
//是数组 那么找到对应的属性 进行翻译 //是数组 那么找到对应的属性 进行翻译
if (dic[key].GetType().GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IList<>))) if (dic[key]!=null && dic[key].GetType().GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IList<>)))
{ {
var newObjList = new List<object>(); var newObjList = new List<object>();
@ -74,15 +74,15 @@ public static class ExcelExportHelper
{ {
var itemDic = item.ConvertToDictionary(); var itemDic = item.ConvertToDictionary();
//处理集合里面时间类型,根据当前语言将时间转变为字符串 ////处理集合里面时间类型,根据当前语言将时间转变为字符串
foreach (var itemValuePair in itemDic) //foreach (var itemValuePair in itemDic)
{ //{
// 临床数据 11 会变成2024-01-01 // // 临床数据 11 会变成2024-01-01
if (itemValuePair.Value?.ToString().Length > 4 && DateTime.TryParse(itemValuePair.Value?.ToString(), out DateTime result)) // if (itemValuePair.Value?.ToString().Length > 8 && DateTime.TryParse(itemValuePair.Value?.ToString(), out DateTime result))
{ // {
itemDic[itemValuePair.Key] = ExportExcelConverterDate.DateTimeInternationalToString(result); // itemDic[itemValuePair.Key] = ExportExcelConverterDate.DateTimeInternationalToString(result);
} // }
} //}
foreach (var needTranslateProperty in needTranslatePropertyList) foreach (var needTranslateProperty in needTranslatePropertyList)
@ -166,7 +166,7 @@ public static class ExcelExportHelper
} }
//中文替换项目术语 //中文替换项目术语
if (data.TrialObjectNameList.Count > 0) if (data.TrialObjectNameList?.Count > 0)
{ {
var replaceObjectList = data.TrialObjectNameList; var replaceObjectList = data.TrialObjectNameList;
@ -335,14 +335,14 @@ public static class ExcelExportHelper
//var itemDic = JsonConvert.DeserializeObject<IDictionary<string, object>>(item.ToJsonNotIgnoreNull()); //var itemDic = JsonConvert.DeserializeObject<IDictionary<string, object>>(item.ToJsonNotIgnoreNull());
var itemDic = item.ConvertToDictionary(); var itemDic = item.ConvertToDictionary();
//处理集合里面时间类型,根据当前语言将时间转变为字符串 ////处理集合里面时间类型,根据当前语言将时间转变为字符串
foreach (var itemValuePair in itemDic) //foreach (var itemValuePair in itemDic)
{ //{
if (itemValuePair.Value?.ToString().Length > 4 && DateTime.TryParse(itemValuePair.Value?.ToString(), out DateTime result)) // if (itemValuePair.Value?.ToString().Length > 8 && DateTime.TryParse(itemValuePair.Value?.ToString(), out DateTime result))
{ // {
itemDic[itemValuePair.Key] = ExportExcelConverterDate.DateTimeInternationalToString(result); // itemDic[itemValuePair.Key] = ExportExcelConverterDate.DateTimeInternationalToString(result);
} // }
} //}
foreach (var needTranslateProperty in needTranslatePropertyList) foreach (var needTranslateProperty in needTranslatePropertyList)
{ {

View File

@ -933,7 +933,7 @@
<param name="_trialRepository"></param> <param name="_trialRepository"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.Common.ExcelExportService.GetCommonJudgeRatioList_Export(IRaCIS.Core.Application.ViewModel.VisitTaskQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument},IRaCIS.Application.Interfaces.IDictionaryService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})"> <member name="M:IRaCIS.Core.Application.Service.Common.ExcelExportService.GetCommonJudgeRatioList_Export(IRaCIS.Core.Application.ViewModel.VisitTaskQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument},IRaCIS.Application.Interfaces.IDictionaryService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectUser},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial})">
<summary> <summary>
裁判一致率导出 裁判一致率导出
</summary> </summary>

View File

@ -8,6 +8,7 @@ using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore.Common; using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Infra.EFCore.Migrations;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -2347,6 +2348,7 @@ namespace IRaCIS.Core.Application.Service.Common
public async Task<IActionResult> GetCommonJudgeRatioList_Export(VisitTaskQuery inQuery, public async Task<IActionResult> GetCommonJudgeRatioList_Export(VisitTaskQuery inQuery,
[FromServices] IRepository<CommonDocument> _commonDocumentRepository, [FromServices] IRepository<CommonDocument> _commonDocumentRepository,
[FromServices] IDictionaryService _dictionaryService, [FromServices] IDictionaryService _dictionaryService,
[FromServices] IRepository<SubjectUser> _subjectUserRepository,
[FromServices] IRepository<Trial> _trialRepository) [FromServices] IRepository<Trial> _trialRepository)
{ {
//每次查询必须是单标准的 //每次查询必须是单标准的
@ -2425,39 +2427,164 @@ namespace IRaCIS.Core.Application.Service.Common
.Where(g => g.Count() == 2).Any()) .Where(g => g.Count() == 2).Any())
.Count(); .Count();
//最后一个已完成的全局 没产生裁判 (之前有裁判),不算入裁判量 #region 废弃
exportInfo.judgeSubjectCount = _subjectRepository.Where(t => t.TrialId == inQuery.TrialId) ////最后一个已完成的全局 没产生裁判 (之前有裁判),不算入裁判量
.Where(t => t.SubjectVisitTaskList.AsQueryable().Where(comonTaskFilter).Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned) //exportInfo.judgeSubjectCount = _subjectRepository.Where(t => t.TrialId == inQuery.TrialId)
// .Where(t => t.SubjectVisitTaskList.AsQueryable().Where(comonTaskFilter).Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned)
// .Where(t => t.Subject.ReadModuleList.Any(c => c.SubjectVisit.VisitNum == (t.VisitTaskNum - addReadingPeriodNum) && c.TrialReadingCriterionId == trialReadingCriterionId))
// .GroupBy(t => new { t.SubjectId, t.VisitTaskNum })
// .Where(g => g.Count() == 2 )
// .Any(g => g.Any(t => t.JudgeVisitTaskId != null)))
// .Count();
//exportInfo.judgeSubjectCount = _subjectRepository.Where(t => t.TrialId == inQuery.TrialId)
// .Where(t => t.SubjectVisitTaskList.AsQueryable().Where(comonTaskFilter).Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned)
// .Where(t => t.Subject.ReadModuleList.Any(c => c.SubjectVisit.VisitNum == (t.VisitTaskNum - addReadingPeriodNum) && c.TrialReadingCriterionId == trialReadingCriterionId))
// .GroupBy(t => new { t.SubjectId, t.VisitTaskNum })
// .Where(g => g.Count() == 2)
// .Any(g => g.OrderByDescending(c => c.VisitTaskNum).FirstOrDefault().JudgeVisitTaskId != null)
// )
// .Count();
//exportInfo.DoctorSubjectStatList = _visitTaskRepository.Where(comonTaskFilter).Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned)
// //筛选全局 已完成的任务
// .Where(t => t.Subject.ReadModuleList.Any(c => c.SubjectVisit.VisitNum == (t.VisitTaskNum - addReadingPeriodNum) && c.TrialReadingCriterionId == trialReadingCriterionId))
// .GroupBy(t => new { t.DoctorUserId, t.DoctorUser.UserName, t.DoctorUser.FullName })
// .Select(g => new DoctorJudgeRatio()
// {
// DoctorUserId = g.Key.DoctorUserId,
// UserName = g.Key.UserName,
// FullName = g.Key.FullName,
// //最后一个阅片期触发裁判 且裁判已阅
// TotalJudgeCount = g.Where(t => t.JudgeVisitTaskId != null && t.JudgeVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned)
// .Where(t => t.VisitTaskNum == g.Where(c => c.SubjectId == t.SubjectId && c.JudgeVisitTaskId != null && c.JudgeVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned)
// .Max(t => t.VisitTaskNum))
// .Select(t => t.SubjectId).Distinct().Count(),
// // G-2 G-4 可能选择的是不同的医生,要以最后一次选择的为准
// JudgeAgreeCount = g.Where(t => t.JudgeVisitTaskId != null && t.JudgeVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned)
// .Where(t => t.VisitTaskNum == g.Where(c => c.SubjectId == t.SubjectId && c.JudgeVisitTaskId != null && c.JudgeVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned)
// .Max(t => t.VisitTaskNum))
// .Where(t => t.JudgeVisitTask.JudgeResultTaskId == t.Id)
// .Select(t => t.SubjectId).Distinct().Count(),
// }).ToList();
#endregion
// subjectG1 产生裁判 G2 不产生裁判 那么该患者不计入总量)
var subjectReadingPeriodList = _visitTaskRepository.Where(comonTaskFilter).Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned)
.Where(t => t.Subject.ReadModuleList.Any(c => c.SubjectVisit.VisitNum == (t.VisitTaskNum - addReadingPeriodNum) && c.TrialReadingCriterionId == trialReadingCriterionId)) .Where(t => t.Subject.ReadModuleList.Any(c => c.SubjectVisit.VisitNum == (t.VisitTaskNum - addReadingPeriodNum) && c.TrialReadingCriterionId == trialReadingCriterionId))
.GroupBy(t => new { t.SubjectId, t.VisitTaskNum }) .GroupBy(t => new { t.SubjectId, t.VisitTaskNum, t.JudgeVisitTaskId })
.Where(g => g.Count() == 2 && g.Key.VisitTaskNum == g.Max(t => t.VisitTaskNum)) .Where(g => g.Count() == 2)
.Any(g => g.Any(t => t.JudgeVisitTaskId != null))) .Select(g => new { g.Key.SubjectId, g.Key.VisitTaskNum, g.Key.JudgeVisitTaskId })
.ToList();
exportInfo.judgeSubjectCount = subjectReadingPeriodList.GroupBy(x => x.SubjectId) // 按 SubjectId 分组
.Select(g => g.OrderByDescending(x => x.VisitTaskNum).First()) // 每组取 VisitTaskNum 最大的记录
.Where(t => t.JudgeVisitTaskId != null)
.Count(); .Count();
exportInfo.DoctorSubjectStatList = _visitTaskRepository.Where(comonTaskFilter).Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned) var subjectReadingPeriodDoctorList = _visitTaskRepository.Where(comonTaskFilter).Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned)
//筛选全局 已完成的任务
.Where(t => t.Subject.ReadModuleList.Any(c => c.SubjectVisit.VisitNum == (t.VisitTaskNum - addReadingPeriodNum) && c.TrialReadingCriterionId == trialReadingCriterionId)) .Where(t => t.Subject.ReadModuleList.Any(c => c.SubjectVisit.VisitNum == (t.VisitTaskNum - addReadingPeriodNum) && c.TrialReadingCriterionId == trialReadingCriterionId))
.GroupBy(t => new { t.DoctorUserId, t.DoctorUser.UserName, t.DoctorUser.FullName }) .GroupBy(t => new { t.SubjectId, t.VisitTaskNum })
.Select(g => new DoctorJudgeRatio() .Where(g => g.Count() == 2)
.Select(g => new
{ {
DoctorUserId = g.Key.DoctorUserId, g.Key.SubjectId,
UserName = g.Key.UserName, g.Key.VisitTaskNum,
FullName = g.Key.FullName,
//最后一个阅片期触发裁判 且裁判已阅 GlobalList = g.Select(t => new
TotalJudgeCount = g.Where(t => t.JudgeVisitTaskId != null && t.JudgeVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned) {
.Where(t => t.VisitTaskNum == g.Where(c => c.SubjectId == t.SubjectId && c.JudgeVisitTaskId != null && c.JudgeVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned) t.Id,
.Max(t => t.VisitTaskNum)) t.VisitTaskNum,
.Select(t => t.SubjectId).Distinct().Count(), t.DoctorUserId,
t.DoctorUser.UserName,
t.DoctorUser.FullName,
t.JudgeVisitTaskId,
t.ReadingTaskState,
t.JudgeVisitTask.JudgeResultTaskId,
JudgeTaskState = (ReadingTaskState?)t.JudgeVisitTask.ReadingTaskState
}).ToList()
})
.ToList();
// G-2 G-4 可能选择的是不同的医生,要以最后一次选择的为准 #region 调试注释
JudgeAgreeCount = g.Where(t => t.JudgeVisitTaskId != null && t.JudgeVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned) //var cc = subjectReadingPeriodDoctorList.GroupBy(x => x.SubjectId) // 按 SubjectId 分组
.Where(t => t.VisitTaskNum == g.Where(c => c.SubjectId == t.SubjectId && c.JudgeVisitTaskId != null && c.JudgeVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned)
.Max(t => t.VisitTaskNum)) // .Where(g => g.OrderByDescending(x => x.VisitTaskNum).First().GlobalList.Any(c => c.JudgeVisitTaskId != null))
.Where(t => t.JudgeVisitTask.JudgeResultTaskId == t.Id)
.Select(t => t.SubjectId).Distinct().Count(), // .ToList();
//var ss = subjectReadingPeriodDoctorList.GroupBy(x => x.SubjectId) // 按 SubjectId 分组
// //最后一个全局没有产生裁判的subject要过滤掉 过滤后
// .Where(g => g.OrderByDescending(x => x.VisitTaskNum).First().GlobalList.Any(c => c.JudgeVisitTaskId != null))
// .Select(g => g.Where(c => c.GlobalList.Any(k => k.JudgeTaskState == ReadingTaskState.HaveSigned)).OrderByDescending(c => c.VisitTaskNum).FirstOrDefault())
// .ToList();
//var kk = subjectReadingPeriodDoctorList.GroupBy(x => x.SubjectId) // 按 SubjectId 分组
// //最后一个全局没有产生裁判的subject要过滤掉 过滤后
// .Where(g => g.OrderByDescending(x => x.VisitTaskNum).First().GlobalList.Any(c => c.JudgeVisitTaskId != null))
// // 存在 已完成的全局裁判
// .Where(subg => subg.Any(t => t.GlobalList.Any(c => c.JudgeTaskState == ReadingTaskState.HaveSigned)))
// .Select(g => g.Where(c => c.GlobalList.Any(k => k.JudgeTaskState == ReadingTaskState.HaveSigned)).OrderByDescending(c => c.VisitTaskNum).FirstOrDefault())
// .ToList();
#endregion
var filteredList = subjectReadingPeriodDoctorList.GroupBy(x => x.SubjectId) // 按 SubjectId 分组
//最后一个全局没有产生裁判的subject要过滤掉 过滤后
.Where(g => g.OrderByDescending(x => x.VisitTaskNum).First().GlobalList.Any(c => c.JudgeVisitTaskId != null))
// subject 存在 已完成的全局裁判
.Where(subg => subg.Any(t => t.GlobalList.Any(c => c.JudgeTaskState == ReadingTaskState.HaveSigned)))
//找到最大完成裁判的阅片期 // 每个subject 仅仅留最后一个已完成的全局
.Select(g => g.Where(c => c.GlobalList.Any(k => k.JudgeTaskState == ReadingTaskState.HaveSigned)).OrderByDescending(c => c.VisitTaskNum).FirstOrDefault())
.SelectMany(t => t.GlobalList.Select(u => new
{
t.SubjectId,
t.VisitTaskNum,
u.JudgeVisitTaskId,
u.DoctorUserId,
u.UserName,
u.FullName,
u.JudgeResultTaskId,
VisitTaskId = u.Id
}))
.ToList();
//找到该标准的阅片人
var armList = new List<Arm>() { Arm.SingleReadingArm, Arm.DoubleReadingArm1, Arm.DoubleReadingArm2 };
exportInfo.DoctorSubjectStatList = _subjectUserRepository.Where(t => t.TrialId == inQuery.TrialId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && armList.Contains(t.ArmEnum))
.Select(t => new DoctorJudgeRatio()
{
DoctorUserId = t.DoctorUserId,
UserName = t.DoctorUser.UserName,
FullName = t.DoctorUser.FullName,
TotalJudgeCount = 0,
JudgeAgreeCount = 0
}).Distinct().ToList();
foreach (var doctor in exportInfo.DoctorSubjectStatList)
{
if (filteredList.Any(t => t.DoctorUserId == doctor.DoctorUserId))
{
doctor.TotalJudgeCount= filteredList.Where(t=>t.DoctorUserId==doctor.DoctorUserId).Count();
doctor.JudgeAgreeCount= filteredList.Where(t => t.DoctorUserId == doctor.DoctorUserId).Count(t => t.JudgeResultTaskId == t.VisitTaskId);
}
}
}).ToList();
#endregion #endregion
#region 阅片期部分 #region 阅片期部分

View File

@ -89,17 +89,17 @@ namespace IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson
var needDealTime = dateTime.Value; var needDealTime = dateTime.Value;
if (!string.IsNullOrWhiteSpace(clientZoneId))
{
needDealTime = TimeZoneInfo.ConvertTime(needDealTime, TimeZoneInfo.Local, TimeZoneInfo.FindSystemTimeZoneById(clientZoneId));
}
if (needDealTime.Hour == 0 && needDealTime.Minute == 0 && needDealTime.Second == 0 && needDealTime.Millisecond==0) if (needDealTime.Hour == 0 && needDealTime.Minute == 0 && needDealTime.Second == 0 && needDealTime.Millisecond==0)
{ {
return needDealTime.ToString("yyyy-MM-dd"); return needDealTime.ToString("yyyy-MM-dd");
} }
else else
{ {
if (!string.IsNullOrWhiteSpace(clientZoneId))
{
needDealTime = TimeZoneInfo.ConvertTime(needDealTime, TimeZoneInfo.Local, TimeZoneInfo.FindSystemTimeZoneById(clientZoneId));
}
if (isEn_US) if (isEn_US)
{ {
//暂时保持一致,等需求确认,修改英文要展示的日期格式 //暂时保持一致,等需求确认,修改英文要展示的日期格式

View File

@ -1,4 +1,5 @@
using Newtonsoft.Json; using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson;
using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
@ -81,6 +82,15 @@ namespace IRaCIS.Core.Infrastructure.Extention
{ {
dictionary.Add(propertyName, (int)propertyValue); dictionary.Add(propertyName, (int)propertyValue);
} }
// 检查属性是否是时间类型
else if (property.PropertyType == typeof(DateTime) ||
property.PropertyType == typeof(DateTime?) && propertyValue != null)
{
DateTime.TryParse(propertyValue.ToString(), out DateTime result);
var dt = ExportExcelConverterDate.DateTimeInternationalToString(result);
// 如果需要,可以对时间值进行特定的处理
dictionary.Add(propertyName, dt);
}
else else
{ {
dictionary.Add(propertyName, propertyValue); dictionary.Add(propertyName, propertyValue);