添加项目文件。

This commit is contained in:
DK
2022-03-28 15:27:40 +08:00
parent b620fcb0cf
commit dc78fd1a09
898 changed files with 173053 additions and 0 deletions
@@ -0,0 +1,231 @@
using System.ComponentModel.DataAnnotations;
using IRaCIS.Core.Infrastructure.Extention;
namespace IRaCIS.Application.Contracts
{
/// <summary>
///后台 工作量审核视图模型
/// </summary>
public class WorkLoadDetailDTO : WorkloadDTO
{
public DateTime CreateTime { get; set; }
public string ChineseName { get; set; } = String.Empty;
public string FirstName { get; set; } = String.Empty;
public string LastName { get; set; } = String.Empty;
public string Code { get; set; } = String.Empty;
public string Indication { get; set; } = String.Empty;
public int RowIntId { get; set; }
public Guid RowGuid { get; set; }
public string YearMonthStr { get; set; } = String.Empty;
public string WorkTimeStr => YearMonthStr;
public bool IsLock { get; set; } = false;
}
public class WorkLoadDetailViewModel : WorkloadDTO
{
public DateTime CreateTime { get; set; }
public string ChineseName { get; set; } = String.Empty;
public string FirstName { get; set; } = String.Empty;
public string LastName { get; set; } = String.Empty;
public string Code { get; set; } = String.Empty;
public string Indication { get; set; } = String.Empty;
public Guid RowGuid { get; set; }
public string YearMonthStr { get; set; } = String.Empty;
public bool IsLock { get; set; } = false;
public string DeclareTimeStr => CreateTime.ToString("yyyy-MM-dd");
public string WorkTimeStr => WorkTime.ToString("yyyy-MM-dd");
}
public class CalculatePaymentDTO : WorkloadDTO
{
public string TrialCode { get; set; } = String.Empty;
public decimal? TrialAdditional { get; set; }
public decimal AdjustmentMultiple { get; set; }
//public double RankPrice { get; set; }
public decimal PersonalAdditional { get; set; }
public decimal TimepointPrice { get; set; }
public decimal TimepointIn24HPrice { get; set; }
public decimal TimepointIn48HPrice { get; set; }
public decimal AdjudicationPrice { get; set; }
public decimal AdjudicationIn24HPrice { get; set; }
public decimal AdjudicationIn48HPrice { get; set; }
public decimal GlobalPrice { get; set; }
public decimal TrainingPrice { get; set; }
public decimal DowntimePrice { get; set; }
public decimal RefresherTrainingPrice { get; set; }
}
/// <summary>
/// 工作量审核数据库查询模型
/// </summary>
public class WorkloadDTO
{
public Guid? Id { get; set; }
public Guid TrialId { get; set; }
public Guid DoctorId { get; set; }
public int DataFrom { get; set; }
public DateTime WorkTime { get; set; }
public int Training { get; set; }
public int Downtime { get; set; }
public int Timepoint { get; set; }
public int TimepointIn24H { get; set; }
public int TimepointIn48H { get; set; }
public int Adjudication { get; set; }
public int AdjudicationIn24H { get; set; }
public int AdjudicationIn48H { get; set; }
public int Global { get; set; }
public int RefresherTraining { get; set; }
}
/// <summary>
/// 工作量分页列表模型 医生端查询模型
/// </summary>
public class WorkLoadQueryDTO : PageInput
{
public Guid TrialId { get; set; }
public int WorkLoadFromStatus { get; set; } // 关联枚举
public DateTime? SearchBeginDateTime { get; set; }
public DateTime? SearchEndDateTime { get; set; }
}
/// <summary>
/// 后台查询模型
/// </summary>
public class WorkLoadStatsQueryDTO : PageInput
{
public Guid? TrialId { get; set; }
public Guid? DoctorId { get; set; } = Guid.Empty;
public List<int> WorkLoadFromStatus { get; set; } = new List<int>(); // 关联枚举
public DateTime? SearchBeginDateTime { get; set; }
public DateTime? SearchEndDateTime { get; set; }
}
public class WorkLoadDetailQueryDTO
{
public Guid TrialId { get; set; } = Guid.Empty;
public Guid DoctorId { get; set; } = Guid.Empty;
public string YearMonthStr { get; set; } = String.Empty;
}
public class CalculateDoctorAndMonthDTO
{
[Required(ErrorMessage = "需要有效的时间")]
public DateTime CalculateMonth { get; set; }
[Required(ErrorMessage = "需要有效的医生列表")]
public List<Guid> NeedCalculateReviewers { get; set; } = new List<Guid>();
}
public class WorkLoadDoctorQueryDTO : PageInput
{
public Guid TrialId { get; set; } = Guid.Empty;
}
public class WorkLoadCommand : WorkloadDTO
{
public Guid CreateUserId { get; set; }
public int CreateUserType { get; set; }
public Guid UpdateUserId { get; set; }
}
public class ExistWorkloadViewModel
{
public bool IsExist { get; set; }
public WorkloadDTO WorkLoad { get; set; } = new WorkloadDTO();
}
public class WorkloadCommand : WorkloadDTO
{
}
public class WorkloadExistQueryDTO
{
public Guid TrialId { get; set; }
public Guid DoctorId { get; set; }
public DateTime WorkDate { get; set; }
}
public class WorkLoadAndTrainingDTO
{
public Guid DoctorId { get; set; }/*=Guid.Empty;*/
public string Code { get; set; } = String.Empty;
public string FirstName { get; set; } = String.Empty;
public string LastName { get; set; } = String.Empty;
public string ChineseName { get; set; } = String.Empty;
public DateTime? EnrollTime { get; set; }
public int ReviewerReadingType { get; set; }
public string? EnrollTimeStr => EnrollTime?.ToString("yyyy-MM-dd HH:mm:ss");
public DateTime? UpdateTime { get; set; }
public string? UpdateTimeStr => UpdateTime?.ToString("yyyy-MM-dd HH:mm:ss");
public int? TrainingTimes { get; set; }
public int? Downtime { get; set; }
//读片点
public int? Timepoint { get; set; }
public int? TimepointIn24H { get; set; }
public int? TimepointIn48H { get; set; }
//裁判阅片
public int? Adjudication { get; set; }
public int? AdjudicationIn24H { get; set; }
public int? AdjudicationIn48H { get; set; }
//全局阅片
public int? Global { get; set; }
public int? RefresherTraining { get; set; }
}
public class WorkLoadAndAgreementDTO : WorkLoadAndTrainingDTO
{
public DateTime? OutEnrollTime { get; set; }
public Guid AgreementId { get; set; }
public string AgreementPath { get; set; } = String.Empty;
public string? AgreementFileName => AgreementPath?.Split('/').Last();
public string AgreementFullPath => AgreementPath;
}
}
@@ -0,0 +1,98 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Application.Service.WorkLoad.DTO
{
public class EnrollViewModel
{
[StringLength(50)]
public string ChineseName { get; set; } = string.Empty;
[StringLength(100)]
public string FirstName { get; set; } = string.Empty;
[StringLength(100)]
public string LastName { get; set; } = string.Empty;
public decimal? AdjustmentMultiple { get; set; } = 0;
public Guid DoctorId { get; set; }
public Guid TrialId { get; set; }
public Guid Id { get; set; }
public int? Training { get; set; }
public int? RefresherTraining { get; set; }
public int? Timepoint { get; set; }
public int? Timepoint48H { get; set; }
public int? Timepoint24H { get; set; }
public int? Adjudication { get; set; }
public int? Adjudication48H { get; set; }
public int? Adjudication24H { get; set; }
public int? Global { get; set; }
public int? Downtime { get; set; }
public string ReviewerCode { get; set; } = string.Empty;
public int? Code { get; set; }
}
public class EnrollGetQuery:PageInput
{
public Guid TrialId { get; set; }
}
public class EnrollCommand
{
public Guid Id { get; set; }
public decimal? Training { get; set; }
public decimal? RefresherTraining { get; set; }
public decimal? Timepoint { get; set; }
public decimal? Timepoint48H { get; set; }
public decimal? Timepoint24H { get; set; }
public decimal? Adjudication { get; set; }
public decimal? Adjudication48H { get; set; }
public decimal? Adjudication24H { get; set; }
public decimal? Global { get; set; }
public decimal? Downtime { get; set; }
}
}
@@ -0,0 +1,143 @@
using IRaCIS.Core.Infrastructure.Extention;
namespace IRaCIS.Application.Contracts
{
#region TP
public class WorkloadTPDTO
{
public Guid Id { get; set; }
public Guid SiteId { get; set; }
public string SiteName { get; set; } = String.Empty;
public Guid SubjectId { get; set; }
public string SubjectCode { get; set; } = String.Empty;
public Guid SubjectVisitId { get; set; }
public string VisitName { get; set; } = String.Empty;
public decimal VisitNum { get; set; }
public Guid StudyId { get; set; }
public string StudyCode { get; set; } = String.Empty;
public string TimepointCode { get; set; } = String.Empty;
public Guid ReviewerId { get; set; }
public string ReviewerCode { get; set; } = String.Empty;
public string ReviewerFirstName { get; set; } = String.Empty;
public string ReviewerLastName { get; set; } = String.Empty;
public string ReviewerChineseName { get; set; } = String.Empty;
public int Status { get; set; }
public DateTime UpdateTime { get; set; }
}
#endregion
#region Global
public class WorkloadGlobalDTO
{
public Guid Id { get; set; }
public Guid SiteId { get; set; }
public string SiteName { get; set; } = String.Empty;
public Guid VisitId { get; set; }
public string VisitName { get; set; } = String.Empty;
public Guid TrialId { get; set; }
public Guid SubjectId { get; set; }
public string SubjectCode { get; set; } = String.Empty;
public decimal VisitNum { get; set; }
public string GlobalCode { get; set; } = String.Empty;
public Guid ReviewerId { get; set; }
public string ReviewerCode { get; set; } = String.Empty;
public string ReviewerFirstName { get; set; } = String.Empty;
public string ReviewerLastName { get; set; } = String.Empty;
public string ReviewerChineseName { get; set; } = String.Empty;
public int Status { get; set; }
public DateTime UpdateTime { get; set; }
}
#endregion
#region AD
public class WorkloadADDTO
{
public Guid Id { get; set; }
public Guid TrialId { get; set; }
public Guid SiteId { get; set; }
public string SiteName { get; set; }=String.Empty;
public Guid SubjectId { get; set; }
public string SubjectCode { get; set; } = String.Empty;
public string ADCode { get; set; } = String.Empty;
public Guid ReviewerId { get; set; }
public string ReviewerCode { get; set; } = String.Empty;
public string ReviewerFirstName { get; set; } = String.Empty;
public string ReviewerLastName { get; set; } = String.Empty;
public string ReviewerChineseName { get; set; } = String.Empty;
public int Status { get; set; }
public DateTime UpdateTime { get; set; }
public Guid Global1Id { get; set; }
public Guid Global2Id { get; set; }
}
#endregion
public class WorkloadDistributionQueryParam : PageInput
{
public Guid TrialId { get; set; } = Guid.Empty;
public Guid? SiteId { get; set; } = Guid.Empty;
public string SubjectCode { get; set; } = string.Empty;
public string WorkloadCode { get; set; } = string.Empty;
public string Reviewer { get; set; } = string.Empty;
public int? Status { get; set; }
public int? GroupId { get; set; } = 0;
}
public class WorkloadTPInfo
{
public Guid Id { get; set; }
public Guid StudyId { get; set; }
}
public class WorkloadTPCommand
{
public List<WorkloadTPInfo> TpList { get; set; } = new List<WorkloadTPInfo>();
public Guid ReviewerId { get; set; }
public string ReviewerName { get; set; } = String.Empty;
}
public class WorkloadGlobalInfo
{
public Guid Id { get; set; }
public Guid SubjectId { get; set; }
public decimal VisitNum { get; set; }
}
public class WorkloadGlobalCommand
{
public List<WorkloadGlobalInfo> GlobalList { get; set; } = new List<WorkloadGlobalInfo>();
public Guid ReviewerId { get; set; }
public string ReviewerName { get; set; } = String.Empty;
}
public class WorkloadAdCommand
{
public List<Guid> IdList { get; set; } = new List<Guid>();
public Guid ReviewerId { get; set; }
public string ReviewerName { get; set; } = String.Empty;
}
//public class WorkloadDistributionUpdateCommand
//{
// public Guid Id { get; set; }
// public Guid? ReviewerId { get; set; }
//}
public class WorkloadDetailDTO
{
public Guid Id { get; set; }
public Guid WorkloadId { get; set; }
public string OptUserName { get; set; } = String.Empty;
public DateTime OptTime { get; set; }
public string ReviewerFirstName { get; set; } = String.Empty;
public string ReviewerLastName { get; set; } = String.Empty;
public string ReviewerChineseName { get; set; } = String.Empty;
public int Status { get; set; }
}
//public class WorkloadDetailQueryParam
//{
// public int WorkloadType { get; set; } //1-tp,2-global,3-ad
// public Guid WorkloadId { get; set; }
//}
}
@@ -0,0 +1,800 @@
using AutoMapper;
using IRaCIS.Core.Infrastructure.ExpressionExtend;
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Share;
using System.Linq.Expressions;
using IRaCIS.Core.Application.Filter;
using Microsoft.AspNetCore.Mvc;
namespace IRaCIS.Application.Services
{
[ApiExplorerSettings(GroupName = "Trial")]
public class DoctorWorkloadService : BaseService, IDoctorWorkloadService
{
private readonly IRepository<Trial> _trialRepository;
private readonly IRepository<Enroll> _enrollRepository;
private readonly IRepository<Doctor> _doctorRepository;
private readonly IRepository<Workload> _doctorWorkloadRepository;
private readonly IRepository<Attachment> _attachmentRepository;
private readonly IRepository<Payment> _costStatisticsRepository;
private readonly IRepository<TrialRevenuesPrice> _trialRevenuesPriceRepository;
private readonly IRepository<TrialRevenuesPriceVerification> _trialRevenuesPriceVerificationRepository;
public DoctorWorkloadService(IRepository<Trial> clinicalTrialProjectRepository,
IRepository<Enroll> intoGroupRepository,
IRepository<Doctor> doctorInfoRepository,
IRepository<Workload> doctorWorkloadRepository,
IRepository<Attachment> attachmentRepository,
IRepository<Payment> costStatisticsRepository,
IRepository<TrialRevenuesPrice> trialRevenuesPriceRepository,
IRepository<TrialRevenuesPriceVerification> trialRevenuesPriceVerificationRepository,
IMapper mapper)
{
_trialRepository = clinicalTrialProjectRepository;
_enrollRepository = intoGroupRepository;
_doctorRepository = doctorInfoRepository;
_doctorWorkloadRepository = doctorWorkloadRepository;
_attachmentRepository = attachmentRepository;
_costStatisticsRepository = costStatisticsRepository;
_trialRevenuesPriceRepository = trialRevenuesPriceRepository;
_trialRevenuesPriceVerificationRepository = trialRevenuesPriceVerificationRepository;
}
#region \
/// <summary>
/// 保存协议- ack Sow [AUTH]
/// </summary>
[HttpPost("{trialId}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> UploadReviewerAckSOW(Guid trialId,
ReviewerAckDTO attachmentViewModel)
{
var intoGroupItem = await _enrollRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.DoctorId == attachmentViewModel.DoctorId);
if (intoGroupItem == null) return Null404NotFound(intoGroupItem);
if (attachmentViewModel.Id != Guid.Empty)
{
await _attachmentRepository.DeleteFromQueryAsync(t => t.Id == attachmentViewModel.Id);
}
var attach = _mapper.Map<Attachment>(attachmentViewModel);
var attachment = await _attachmentRepository.AddAsync(attach);
intoGroupItem.AttachmentId = attachment.Id;
await _enrollRepository.UpdateAsync(intoGroupItem);
var success = await _enrollRepository.SaveChangesAsync();
return ResponseOutput.Result(success, attachment.Id.ToString());
}
/// <summary>
/// 删除协议
/// </summary>
[HttpDelete, Route("deleteReviewerAckSOW/{trialId}/{doctorId}/{attachmentId}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> DeleteReviewerAckSOW(Guid trialId, Guid doctorId, Guid attachmentId)
{
var success1 = await _attachmentRepository.DeleteFromQueryAsync(a => a.Id == attachmentId);
var success2 = await _enrollRepository.UpdateFromQueryAsync(t => t.TrialId == trialId && t.DoctorId == doctorId, u =>
new Enroll()
{
AttachmentId = Guid.Empty
});
return ResponseOutput.Result(success1 && success2);
}
/// <summary>
/// 0代表裁判和Tp 都可以 1、代表Tp 2 代表裁判
/// </summary>
/// <returns></returns>
[HttpPost("{trialId}/{doctorId}/{reviewerReadingType}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> UpdateReviewerReadingType(Guid trialId, Guid doctorId, int type)
{
var success2 = await _enrollRepository.UpdateFromQueryAsync(t => t.TrialId == trialId && t.DoctorId == doctorId, u =>
new Enroll()
{
ReviewerReadingType = type
});
return ResponseOutput.Result(success2);
}
/// <summary>
/// 获取某个项目入组的医生工作量统计列表
/// </summary>
[HttpPost]
public async Task<PageOutput<WorkLoadAndAgreementDTO>> GetTrialEnrollmentWorkloadStats(WorkLoadDoctorQueryDTO doctorSearchModel)
{
//https://blog.csdn.net/sunshineblog/article/details/78636389
var trialId = doctorSearchModel.TrialId;
var doctorIntoGroupQueryable =
from intoGroup in _enrollRepository.Where(x => x.TrialId == trialId && x.EnrollStatus >= (int)EnrollStatus.ConfirmIntoGroup)
join doctor in _doctorRepository.AsQueryable() on intoGroup.DoctorId equals doctor.Id
join attachmentItem in _attachmentRepository.AsQueryable() on intoGroup.AttachmentId equals attachmentItem.Id into cc
from attachment in cc.DefaultIfEmpty()
join doctorWorkLoad in _doctorWorkloadRepository.Where(t => t.TrialId == trialId && t.DataFrom == (int)WorkLoadFromStatus.FinalConfirm).GroupBy(t => t.DoctorId).Select(
g => new
{
DoctorId = g.Key,
Training = g.Sum(t => t.Training),
Downtime = g.Sum(t => t.Downtime),
Timepoint = g.Sum(t => t.Timepoint),
TimepointIn24H = g.Sum(t => t.TimepointIn24H),
TimepointIn48H = g.Sum(t => t.TimepointIn48H),
Global = g.Sum(t => t.Global),
Adjudication = g.Sum(t => t.Adjudication),
AdjudicationIn24H = g.Sum(t => t.AdjudicationIn24H),
AdjudicationIn48H = g.Sum(t => t.AdjudicationIn48H),
RefresherTraining = g.Sum(t => t.RefresherTraining)
}
) on intoGroup.DoctorId equals doctorWorkLoad.DoctorId into tt //连接为了得到入组时间
from doctorWorkLoad in tt.DefaultIfEmpty()//不是每个医生都有工作量
select new WorkLoadAndAgreementDTO()
{
DoctorId = doctor.Id,
Code = doctor.ReviewerCode,
FirstName = doctor.FirstName,
LastName = doctor.LastName,
ChineseName = doctor.ChineseName,
OutEnrollTime = intoGroup.OutEnrollTime,
EnrollTime = intoGroup.EnrollTime,
AgreementId = intoGroup.AttachmentId,
ReviewerReadingType = intoGroup.ReviewerReadingType,
AgreementPath = attachment.Path,
Timepoint = doctorWorkLoad.Timepoint,
TimepointIn24H = doctorWorkLoad.TimepointIn24H,
TimepointIn48H = doctorWorkLoad.TimepointIn48H,
Adjudication = doctorWorkLoad.Adjudication,
AdjudicationIn24H = doctorWorkLoad.AdjudicationIn24H,
AdjudicationIn48H = doctorWorkLoad.AdjudicationIn48H,
Global = doctorWorkLoad.Global,
RefresherTraining = doctorWorkLoad.RefresherTraining,
TrainingTimes = doctorWorkLoad.Training,
Downtime = doctorWorkLoad.Downtime
};
var count = await doctorIntoGroupQueryable.CountAsync();
if (string.IsNullOrWhiteSpace(doctorSearchModel.SortField))
{
doctorIntoGroupQueryable = doctorIntoGroupQueryable.OrderByDescending("EnrollTime").ThenBy(u => u.Code);
}
else
{
if (doctorSearchModel.SortField == "FirstName" || doctorSearchModel.SortField == "LastName")
{
if (doctorSearchModel.Asc)
{
doctorIntoGroupQueryable = doctorIntoGroupQueryable.OrderBy("LastName").ThenBy(u => u.FirstName);
}
else
{
doctorIntoGroupQueryable = doctorIntoGroupQueryable.OrderByDescending("LastName").ThenByDescending(u => u.FirstName);
}
}
else
{
var propName = doctorSearchModel.SortField == "" ? "EnrollTime" : doctorSearchModel.SortField;
doctorIntoGroupQueryable = doctorSearchModel.Asc
? doctorIntoGroupQueryable.OrderBy(propName)
: doctorIntoGroupQueryable.OrderByDescending(propName);
}
}
//分页
doctorIntoGroupQueryable = doctorIntoGroupQueryable
.Skip((doctorSearchModel.PageIndex - 1) * doctorSearchModel.PageSize)
.Take(doctorSearchModel.PageSize);
//从数据库提取数据
var intoGroupList = doctorIntoGroupQueryable.ToList();
return new PageOutput<WorkLoadAndAgreementDTO>(doctorSearchModel.PageIndex,
doctorSearchModel.PageSize, count, intoGroupList);
}
/// <summary>
/// 获取入组某个项目的医生的最近几个月的工作量详情(带有填充数据)
/// </summary>
[HttpPost]
public PageOutput<WorkLoadDetailDTO> GetEnrollmentWorkloadStatsDetail(WorkLoadStatsQueryDTO workLoadSearch)
{
#region
Expression<Func<Workload, bool>> workloadLambda = x => true;
if (workLoadSearch.TrialId != Guid.Empty && workLoadSearch.TrialId != null)
{
workloadLambda = workloadLambda.And(x => x.TrialId == workLoadSearch.TrialId);
}
if (workLoadSearch.DoctorId != Guid.Empty && workLoadSearch.DoctorId != null)
{
workloadLambda = workloadLambda.And(t => t.DoctorId == workLoadSearch.DoctorId);
}
if (workLoadSearch.SearchBeginDateTime != null)
{
var bDate = workLoadSearch.SearchBeginDateTime;
var beginDate = new DateTime(bDate.Value.Year, bDate.Value.Month, 1);
workloadLambda = workloadLambda.And(t =>
t.WorkTime >= beginDate);
}
if (workLoadSearch.SearchEndDateTime != null)
{
var eDate = workLoadSearch.SearchEndDateTime.Value.AddMonths(1);
DateTime endDate = new DateTime(eDate.Year, eDate.Month, 1);
workloadLambda = workloadLambda.And(t =>
t.WorkTime < endDate);
}
#endregion
IQueryable<WorkLoadDetailDTO>? workLoadQueryable = default;
var tempWorkload = new List<WorkLoadDetailDTO>();
if (workLoadSearch.WorkLoadFromStatus.Contains(1))
{
workLoadQueryable = from workLoad in _doctorWorkloadRepository.Where(workloadLambda.And(t => t.DataFrom == (int)WorkLoadFromStatus.CRO))
join doctor in _doctorRepository.AsQueryable() on workLoad.DoctorId equals doctor.Id
join trial in _trialRepository.AsQueryable() on workLoad.TrialId equals trial.Id
select new WorkLoadDetailDTO()
{
Id = workLoad.Id,
DoctorId = workLoad.DoctorId,
ChineseName = doctor.ChineseName,
FirstName = doctor.FirstName,
LastName = doctor.LastName,
YearMonthStr = workLoad.YearMonth,
CreateTime = workLoad.CreateTime,
WorkTime = workLoad.WorkTime,
DataFrom = workLoad.DataFrom,
TrialId = workLoad.TrialId,
Indication = trial.Indication,
Code = trial.TrialCode,
Timepoint = workLoad.Timepoint,
TimepointIn24H = workLoad.TimepointIn24H,
TimepointIn48H = workLoad.TimepointIn48H,
Global = workLoad.Global,
RefresherTraining = workLoad.RefresherTraining,
Adjudication = workLoad.Adjudication,
AdjudicationIn24H = workLoad.AdjudicationIn24H,
AdjudicationIn48H = workLoad.AdjudicationIn48H,
Training = workLoad.Training,
Downtime = workLoad.Downtime,
IsLock = workLoad.IsLock
};
tempWorkload.AddRange(workLoadQueryable.ToList());
}
if (workLoadSearch.WorkLoadFromStatus.Contains(2))
{
workLoadQueryable = from workLoad in _doctorWorkloadRepository.Where(workloadLambda.And(t => t.DataFrom == (int)WorkLoadFromStatus.FinalConfirm))
join doctor in _doctorRepository.AsQueryable() on workLoad.DoctorId equals doctor.Id
join trial in _trialRepository.AsQueryable() on workLoad.TrialId equals trial.Id
select new WorkLoadDetailDTO()
{
Id = workLoad.Id,
DoctorId = workLoad.DoctorId,
ChineseName = doctor.ChineseName,
FirstName = doctor.FirstName,
LastName = doctor.LastName,
YearMonthStr = workLoad.YearMonth,
CreateTime = workLoad.CreateTime,
WorkTime = workLoad.WorkTime,
DataFrom = workLoad.DataFrom,
TrialId = workLoad.TrialId,
Indication = trial.Indication,
Code = trial.TrialCode,
Timepoint = workLoad.Timepoint,
TimepointIn24H = workLoad.TimepointIn24H,
TimepointIn48H = workLoad.TimepointIn48H,
Global = workLoad.Global,
RefresherTraining = workLoad.RefresherTraining,
Adjudication = workLoad.Adjudication,
AdjudicationIn24H = workLoad.AdjudicationIn24H,
AdjudicationIn48H = workLoad.AdjudicationIn48H,
Training = workLoad.Training,
Downtime = workLoad.Downtime,
IsLock = workLoad.IsLock
};
tempWorkload.AddRange(workLoadQueryable.ToList());
}
if (workLoadSearch.WorkLoadFromStatus.Contains(0))
{
workLoadQueryable =
from workLoad in (from workLoadItem in _doctorWorkloadRepository.Where(workloadLambda.And(t => t.DataFrom == (int)WorkLoadFromStatus.Doctor))
group workLoadItem by new { workLoadItem.YearMonth, workLoadItem.DoctorId, workLoadItem.TrialId, workLoadItem.IsLock } into g
select new
{
Id = Guid.NewGuid(),
DoctorId = g.Key.DoctorId,
DataFrom = 0,
TrialId = g.Key.TrialId,
IsLock = g.Key.IsLock,
YearMonthStr = g.Key.YearMonth,
Timepoint = g.Sum(workLoad => workLoad.Timepoint),
TimepointIn24H = g.Sum(workLoad => workLoad.TimepointIn24H),
TimepointIn48H = g.Sum(workLoad => workLoad.TimepointIn48H),
Global = g.Sum(workLoad => workLoad.Global),
RefresherTraining = g.Sum(workLoad => workLoad.RefresherTraining),
Adjudication = g.Sum(workLoad => workLoad.Adjudication),
AdjudicationIn24H = g.Sum(workLoad => workLoad.AdjudicationIn24H),
AdjudicationIn48H = g.Sum(workLoad => workLoad.AdjudicationIn48H),
Training = g.Sum(workLoad => workLoad.Training),
Downtime = g.Sum(workLoad => workLoad.Downtime)
})
join doctor in _doctorRepository.AsQueryable() on workLoad.DoctorId equals doctor.Id
join trial in _trialRepository.AsQueryable() on workLoad.TrialId equals trial.Id
select new WorkLoadDetailDTO()
{
Id = workLoad.Id,
DoctorId = workLoad.DoctorId,
ChineseName = doctor.ChineseName,
FirstName = doctor.FirstName,
LastName = doctor.LastName,
YearMonthStr = workLoad.YearMonthStr,
DataFrom = workLoad.DataFrom,
TrialId = workLoad.TrialId,
Indication = trial.Indication,
Code = trial.TrialCode,
Timepoint = workLoad.Timepoint,
TimepointIn24H = workLoad.TimepointIn24H,
TimepointIn48H = workLoad.TimepointIn48H,
Global = workLoad.Global,
RefresherTraining = workLoad.RefresherTraining,
Adjudication = workLoad.Adjudication,
AdjudicationIn24H = workLoad.AdjudicationIn24H,
AdjudicationIn48H = workLoad.AdjudicationIn48H,
Training = workLoad.Training,
Downtime = workLoad.Downtime,
IsLock = workLoad.IsLock
};
tempWorkload.AddRange(workLoadQueryable.ToList());
}
//workLoadQueryable = workLoadQueryable.OrderByDescending(t => t.YearMonthStr).ThenBy(t => t.DataFrom);
//取选取月份的数据
var month = (workLoadSearch.SearchEndDateTime?.Year - workLoadSearch.SearchBeginDateTime?.Year) * 12 + (workLoadSearch.SearchEndDateTime?.Month - workLoadSearch.SearchBeginDateTime?.Month) + 1;
var count = (month ?? 1) * workLoadSearch.WorkLoadFromStatus.Count;
//tempWorkload = tempWorkload.Take(count);
tempWorkload.OrderByDescending(t => t.YearMonthStr).ThenBy(t => t.DataFrom).Take(count);
//var workLoadList = workLoadQueryable.ToList();
return BuildFullData(tempWorkload, workLoadSearch);
}
/// <summary>
/// 获取来自Reviewer自己的数据,某个月添加的多条
/// </summary>
[HttpPost]
public async Task<List<WorkLoadDetailViewModel>> GetReviewerWorkLoadListDetail(
WorkLoadDetailQueryDTO workLoadSearch)
{
Expression<Func<Workload, bool>> workloadLambda = t => t.DataFrom == (int)WorkLoadFromStatus.Doctor && t.YearMonth == workLoadSearch.YearMonthStr;
if (workLoadSearch.TrialId != Guid.Empty)
{
workloadLambda = workloadLambda.And(x => x.TrialId == workLoadSearch.TrialId);
}
if (workLoadSearch.DoctorId != Guid.Empty)
{
workloadLambda = workloadLambda.And(t => t.DoctorId == workLoadSearch.DoctorId);
}
var workLoadQueryable = from workLoad in _doctorWorkloadRepository.Where(workloadLambda)
join doctor in _doctorRepository.AsQueryable() on workLoad.DoctorId equals doctor.Id
join trial in _trialRepository.AsQueryable() on workLoad.TrialId equals trial.Id
select new WorkLoadDetailViewModel()
{
Id = workLoad.Id,
DoctorId = workLoad.DoctorId,
ChineseName = doctor.ChineseName,
FirstName = doctor.FirstName,
LastName = doctor.LastName,
YearMonthStr = workLoad.YearMonth,
CreateTime = workLoad.CreateTime,
WorkTime = workLoad.WorkTime,
DataFrom = workLoad.DataFrom,
TrialId = workLoad.TrialId,
Indication = trial.Indication,
Code = trial.TrialCode,
Timepoint = workLoad.Timepoint,
TimepointIn24H = workLoad.TimepointIn24H,
TimepointIn48H = workLoad.TimepointIn48H,
Global = workLoad.Global,
Adjudication = workLoad.Adjudication,
AdjudicationIn24H = workLoad.AdjudicationIn24H,
AdjudicationIn48H = workLoad.AdjudicationIn48H,
RefresherTraining = workLoad.RefresherTraining,
Training = workLoad.Training,
Downtime = workLoad.Downtime,
IsLock = workLoad.IsLock
};
workLoadQueryable = workLoadQueryable.OrderBy("WorkTime");
var workLoadList = await workLoadQueryable.ToListAsync();
workLoadList.ForEach(t => t.RowGuid = Guid.NewGuid());
return workLoadList;
}
/// <summary>
/// 工作量是否存在,用于判断只能添加一条的工作量记录
/// </summary>
/// <summary>
/// 查询某个医生是否在某天有某个项目的工作量数据,处理添加来自医生自己的工作量数据
/// </summary>
[HttpPost]
public async Task<IResponseOutput<ExistWorkloadViewModel>> WorkloadExist(WorkloadExistQueryDTO param)
{
var isExist = false;
var exist = await _doctorWorkloadRepository.FirstOrDefaultAsync(u => u.TrialId == param.TrialId && u.DoctorId == param.DoctorId
&& u.WorkTime == param.WorkDate && u.DataFrom == 0);
if (exist != null)
{
isExist = true;
}
return ResponseOutput.Ok(new ExistWorkloadViewModel
{
IsExist = isExist,
WorkLoad = _mapper.Map<WorkloadDTO>(exist),
});
}
/// <summary>
/// 添加或更新工作量
/// </summary>
public async Task<IResponseOutput> AddOrUpdateWorkload(WorkloadCommand workLoadAddOrUpdateModel,
Guid userId)
{
var yearMonthStr = workLoadAddOrUpdateModel.WorkTime.ToString("yyyy-MM");
if (workLoadAddOrUpdateModel.Id == Guid.Empty || workLoadAddOrUpdateModel.Id == null)
{
//确定是那个医生 那个项目 那个月份做的
Expression<Func<Workload, bool>> workloadLambda = x => x.DoctorId == workLoadAddOrUpdateModel.DoctorId && x.TrialId == workLoadAddOrUpdateModel.TrialId && x.YearMonth == yearMonthStr;
//只要是来自CRO或者最终确认的 只能有一条
switch (workLoadAddOrUpdateModel.DataFrom)
{
case (int)WorkLoadFromStatus.CRO: //1 来自CRO的
workloadLambda = workloadLambda.And(t => t.DataFrom == (int)WorkLoadFromStatus.CRO);
break;
case (int)WorkLoadFromStatus.FinalConfirm: //2 最终确认的
workloadLambda = workloadLambda.And(t => t.DataFrom == (int)WorkLoadFromStatus.FinalConfirm);
var isExist = await _costStatisticsRepository.AnyAsync(u => u.YearMonth == yearMonthStr && u.DoctorId == workLoadAddOrUpdateModel.DoctorId);
if (!isExist)
{
await _costStatisticsRepository.AddAsync(new Payment
{
DoctorId = workLoadAddOrUpdateModel.DoctorId,
YearMonth = yearMonthStr,
YearMonthDate = DateTime.Parse(yearMonthStr),
IsLock = false
});
}
//处理 验证项目收入价格是否都填写了
var revenuesPriceExist = await _trialRevenuesPriceRepository.AsQueryable()
.FirstOrDefaultAsync(t => t.TrialId == workLoadAddOrUpdateModel.TrialId);
//没填写收入价格 插入记录 所有的都是false
if (revenuesPriceExist == null)
{
await _trialRevenuesPriceVerificationRepository.AddAsync(new TrialRevenuesPriceVerification()
{
TrialId = workLoadAddOrUpdateModel.TrialId,
ReviewerId = workLoadAddOrUpdateModel.DoctorId,
YearMonth = yearMonthStr,
WorkLoadDate = workLoadAddOrUpdateModel.WorkTime
});
}
else //有价格 校验 看全不全
{
var tpNeedSetPrice = workLoadAddOrUpdateModel.Timepoint > 0 &&
revenuesPriceExist.Timepoint <= 0;
var tp24HNeedSetPrice = workLoadAddOrUpdateModel.TimepointIn24H > 0 &&
revenuesPriceExist.TimepointIn24H <= 0;
var tp48NeedSetPrice = workLoadAddOrUpdateModel.TimepointIn48H > 0 &&
revenuesPriceExist.TimepointIn48H <= 0;
var adNeedSetPrice = workLoadAddOrUpdateModel.Adjudication > 0 &&
revenuesPriceExist.Adjudication <= 0;
var ad24NeedSetPrice = workLoadAddOrUpdateModel.AdjudicationIn24H > 0 &&
revenuesPriceExist.AdjudicationIn24H <= 0;
var ad48NeedSetPrice = workLoadAddOrUpdateModel.AdjudicationIn48H > 0 &&
revenuesPriceExist.AdjudicationIn48H <= 0;
var downtimeNeedSetPrice = workLoadAddOrUpdateModel.Downtime > 0 &&
revenuesPriceExist.Downtime <= 0;
var globalNeedSetPrice = workLoadAddOrUpdateModel.Global > 0 &&
revenuesPriceExist.Global <= 0;
var trainingNeedSetPrice = workLoadAddOrUpdateModel.Training > 0 &&
revenuesPriceExist.Training <= 0;
var refresherTrainingTrainingNeedSetPrice = workLoadAddOrUpdateModel.RefresherTraining > 0 &&
revenuesPriceExist.RefresherTraining <= 0;
var needAdd = tpNeedSetPrice || tp24HNeedSetPrice || tp48NeedSetPrice || adNeedSetPrice || ad24NeedSetPrice ||
ad48NeedSetPrice || downtimeNeedSetPrice || globalNeedSetPrice && trainingNeedSetPrice || refresherTrainingTrainingNeedSetPrice;
//验证不通过 增加
if (needAdd)
{
await _trialRevenuesPriceVerificationRepository.AddAsync(new TrialRevenuesPriceVerification()
{
TrialId = workLoadAddOrUpdateModel.TrialId,
ReviewerId = workLoadAddOrUpdateModel.DoctorId,
YearMonth = yearMonthStr,
WorkLoadDate = workLoadAddOrUpdateModel.WorkTime,
//需要设置价格和 有价格是相反的 数据库此字段存储的时候对应项是否有价格
Timepoint = !tpNeedSetPrice,
TimepointIn24H = !tp24HNeedSetPrice,
TimepointIn48H = !tp48NeedSetPrice,
Adjudication = !adNeedSetPrice,
AdjudicationIn24H = !ad24NeedSetPrice,
AdjudicationIn48H = !ad48NeedSetPrice,
Downtime = !downtimeNeedSetPrice,
Global = !globalNeedSetPrice,
Training = !trainingNeedSetPrice,
RefresherTraining = !refresherTrainingTrainingNeedSetPrice
});
}
}
break;
}
if (workLoadAddOrUpdateModel.DataFrom != (int)WorkLoadFromStatus.Doctor)
{
if (await _doctorWorkloadRepository.AnyAsync(workloadLambda))
{
return ResponseOutput.NotOk("This type of data can only have one");
}
}
if (workLoadAddOrUpdateModel.DataFrom == (int)WorkLoadFromStatus.Doctor)
{
Expression<Func<Workload, bool>> doctorworkloadLambda = x => x.DoctorId == workLoadAddOrUpdateModel.DoctorId && x.TrialId == workLoadAddOrUpdateModel.TrialId && x.YearMonth == yearMonthStr && workLoadAddOrUpdateModel.WorkTime == x.WorkTime;
doctorworkloadLambda = doctorworkloadLambda.And(t => t.DataFrom == (int)WorkLoadFromStatus.Doctor);
if (await _doctorWorkloadRepository.AnyAsync(doctorworkloadLambda))
{
return ResponseOutput.NotOk("This type of data can only have one");
}
}
var workLoad = _mapper.Map<Workload>(workLoadAddOrUpdateModel);
workLoad.YearMonth = yearMonthStr;
await _doctorWorkloadRepository.AddAsync(workLoad);
await _enrollRepository.UpdateFromQueryAsync(
t => t.DoctorId == workLoadAddOrUpdateModel.DoctorId && t.TrialId == workLoadAddOrUpdateModel.TrialId, u => new Enroll()
{
EnrollStatus = (int)EnrollStatus.DoctorReading,
UpdateTime = DateTime.Now
});
var success = await _doctorWorkloadRepository.SaveChangesAsync();
return ResponseOutput.Result(success, workLoad.Id);
}
else
{
//判断是否已经被锁定
var isLocked = await _costStatisticsRepository.AnyAsync(u => u.DoctorId == workLoadAddOrUpdateModel.DoctorId &&
u.YearMonth == yearMonthStr && u.IsLock);
if (isLocked)
{
return ResponseOutput.NotOk("Expenses have been settled and workload cannot be modified.");
}
var success = await _doctorWorkloadRepository.UpdateFromQueryAsync(t => t.Id == workLoadAddOrUpdateModel.Id,
u => new Workload()
{
Timepoint = workLoadAddOrUpdateModel.Timepoint,
TimepointIn24H = workLoadAddOrUpdateModel.TimepointIn24H,
TimepointIn48H = workLoadAddOrUpdateModel.TimepointIn48H,
Adjudication = workLoadAddOrUpdateModel.Adjudication,
AdjudicationIn24H = workLoadAddOrUpdateModel.AdjudicationIn24H,
AdjudicationIn48H = workLoadAddOrUpdateModel.AdjudicationIn48H,
RefresherTraining = workLoadAddOrUpdateModel.RefresherTraining,
Downtime = workLoadAddOrUpdateModel.Downtime,
Training = workLoadAddOrUpdateModel.Training,
Global = workLoadAddOrUpdateModel.Global,
UpdateTime = DateTime.Now,
UpdateUserId = userId,
WorkTime = workLoadAddOrUpdateModel.WorkTime,
YearMonth = yearMonthStr
});
return ResponseOutput.Result(success);
}
}
/// <summary>
/// 删除工作量
/// </summary>
public async Task<IResponseOutput> DeleteWorkload(Guid workloadId)
{
return ResponseOutput.Result(await _doctorWorkloadRepository.DeleteFromQueryAsync(t => t.Id == workloadId));
}
/// <summary>
/// 获取工作量详情(用于判断工作量锁定时,调用)
/// </summary>
public async Task<WorkloadDTO> GetWorkloadDetailById(Guid id)
{
var workload = await _doctorWorkloadRepository.FirstOrDefaultAsync(u => u.Id == id);
return _mapper.Map<WorkloadDTO>(workload);
}
#endregion
private PageOutput<WorkLoadDetailDTO> BuildFullData(
List<WorkLoadDetailDTO> workLoadList, WorkLoadStatsQueryDTO workLoadSearch)
{
var doctor = _doctorRepository.Where(t => t.Id == workLoadSearch.DoctorId).ProjectTo<DoctorBasicInfo>(_mapper.ConfigurationProvider).FirstOrDefault().IfNullThrowException();
//查询 1-3月的 共3个月
var month = (workLoadSearch.SearchEndDateTime?.Year - workLoadSearch.SearchBeginDateTime?.Year) * 12 +
(workLoadSearch.SearchEndDateTime?.Month - workLoadSearch.SearchBeginDateTime?.Month) + 1;
var needCount = month * workLoadSearch.WorkLoadFromStatus.Count ?? 1;
if (workLoadSearch.WorkLoadFromStatus.Contains((int)WorkLoadFromStatus.FinalConfirm))
{
if (workLoadList.Count != needCount)
{
for (int i = 0; i < month; i++)
{
var yearMonthStr = workLoadSearch.SearchBeginDateTime?.AddMonths(i).ToString("yyyy-MM");
if (!workLoadList.Any(t => t.YearMonthStr == yearMonthStr &&
t.DataFrom == (int)WorkLoadFromStatus.FinalConfirm))
{
workLoadList.Add(new WorkLoadDetailDTO()
{
Id = Guid.Empty,
DataFrom = (int)WorkLoadFromStatus.FinalConfirm,
YearMonthStr = yearMonthStr,
ChineseName = doctor.ChineseName,
FirstName = doctor.FirstName,
LastName = doctor.LastName,
Code = doctor.ReviewerCode
});
}
}
}
}
if (workLoadSearch.WorkLoadFromStatus.Contains((int)WorkLoadFromStatus.CRO))
{
if (workLoadList.Count != needCount)
{
for (int i = 0; i < month; i++)
{
var yearMonthStr = workLoadSearch.SearchBeginDateTime?.AddMonths(i).ToString("yyyy-MM");
if (!workLoadList.Any(t => t.YearMonthStr == yearMonthStr &&
t.DataFrom == (int)WorkLoadFromStatus.CRO))
{
workLoadList.Add(new WorkLoadDetailDTO()
{
Id = Guid.Empty,
DataFrom = (int)WorkLoadFromStatus.CRO,
YearMonthStr = yearMonthStr,
ChineseName = doctor.ChineseName,
FirstName = doctor.FirstName,
LastName = doctor.LastName,
Code = doctor.ReviewerCode
});
}
}
}
}
if (workLoadSearch.WorkLoadFromStatus.Contains((int)WorkLoadFromStatus.Doctor))
{
if (workLoadList.Count != needCount)
{
for (int i = 0; i < month; i++)
{
var yearMonthStr = workLoadSearch.SearchBeginDateTime?.AddMonths(i).ToString("yyyy-MM");
if (!workLoadList.Any(t => t.YearMonthStr == yearMonthStr &&
t.DataFrom == (int)WorkLoadFromStatus.Doctor))
{
workLoadList.Add(new WorkLoadDetailDTO()
{
Id = Guid.Empty,
DataFrom = (int)WorkLoadFromStatus.Doctor,
YearMonthStr = yearMonthStr,
ChineseName = doctor.ChineseName,
FirstName = doctor.FirstName,
LastName = doctor.LastName,
Code = doctor.ReviewerCode
});
}
}
}
}
workLoadList = workLoadList.OrderByDescending(t => t.YearMonthStr).ThenBy(t => t.DataFrom)
.ToList();
int tempRowId = 0;
foreach (var workLoad in workLoadList)
{
workLoad.RowGuid = Guid.NewGuid();
workLoad.RowIntId = tempRowId + 1;
tempRowId++;
}
return new PageOutput<WorkLoadDetailDTO>(1, workLoadList.Count,
workLoadList.Count, workLoadList);
}
}
}
@@ -0,0 +1,455 @@
using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Application.Filter;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Service.WorkLoad.DTO;
namespace IRaCIS.Application.Services
{
[ApiExplorerSettings(GroupName = "Enroll")]
public class EnrollService : BaseService, IEnrollService
{
private readonly IRepository<Trial> _trialRepository;
private readonly IRepository<TrialStatusDetail> _trialDetailRepository;
private readonly IRepository<TrialPaymentPrice> _TrialPaymentPriceRepository;
private readonly IRepository<Enroll> _enrollRepository;
private readonly IRepository<Doctor> _doctorRepository;
private readonly IRepository<EnrollDetail> _enrollDetailRepository;
private readonly IRepository<Workload> _workloadRepository;
public EnrollService(IRepository<Trial> clinicalTrialProjectRepository,
IRepository<TrialStatusDetail> clinicalProjectDetailRepository,
IRepository<Enroll> intoGroupRepository,
IRepository<Doctor> doctorRepository,
IRepository<TrialPaymentPrice> TrialPaymentPriceRepository,
IRepository<EnrollDetail> intoGroupDetailRepository, IRepository<Workload> workloadRepository)
{
_trialRepository = clinicalTrialProjectRepository;
_TrialPaymentPriceRepository = TrialPaymentPriceRepository;
_doctorRepository = doctorRepository;
_trialDetailRepository = clinicalProjectDetailRepository;
_enrollRepository = intoGroupRepository;
_enrollDetailRepository = intoGroupDetailRepository;
_workloadRepository = workloadRepository;
}
/// <summary>
/// 添加或更新项目医生项目价格
/// </summary>
[HttpPost]
public async Task<IResponseOutput> AddOrUpdateEnroll(EnrollCommand addOrUpdateModel)
{
var trialDoctoritem = await _enrollRepository.FirstOrDefaultAsync(u => u.Id == addOrUpdateModel.Id);
if (trialDoctoritem == null)//insert
{
var trialExt = _mapper.Map<Enroll>(addOrUpdateModel);
await _enrollRepository.AddAsync(trialExt);
}
else//update
{
await _enrollRepository.UpdateAsync(_mapper.Map(addOrUpdateModel, trialDoctoritem));
}
var success = await _enrollRepository.SaveChangesAsync();
return ResponseOutput.Result(success);
}
/// <summary>
/// 获取医生项目列表
/// </summary>
/// <param name="challengeQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageOutput<EnrollViewModel>> GetTrialDoctorList(EnrollGetQuery challengeQuery)
{
var costStatisticsQueryable = from enroll in _enrollRepository.Where(t => t.TrialId == challengeQuery.TrialId)
join dociorc in _doctorRepository.Where() on enroll.DoctorId equals dociorc.Id
join price in _TrialPaymentPriceRepository.Where() on enroll.TrialId equals price.TrialId
select new EnrollViewModel()
{
ChineseName = dociorc.ChineseName,
AdjustmentMultiple = enroll.AdjustmentMultiple,
FirstName = dociorc.FirstName,
LastName = dociorc.LastName,
DoctorId = dociorc.Id,
TrialId = challengeQuery.TrialId,
Id = enroll.Id,
Training = enroll.Training,
RefresherTraining = enroll.RefresherTraining,
Timepoint = enroll.Timepoint,
Timepoint48H = enroll.Timepoint48H,
Timepoint24H = enroll.Timepoint24H,
Adjudication = enroll.Adjudication,
Adjudication48H = enroll.Adjudication48H,
Adjudication24H = enroll.Adjudication24H,
Global = enroll.Global,
Code = dociorc.Code,
ReviewerCode = dociorc.ReviewerCode,
Downtime = enroll.Downtime,
};
return await costStatisticsQueryable.ToPagedListAsync(challengeQuery.PageIndex, challengeQuery.PageSize, "ChineseName");
//var query2 = _repository.Where<EnrollViewModel>(x => x.TrialId == challengeQuery.TrialId)
// .WhereIf(challengeQuery.TrialId != null, t => t.TrialId == challengeQuery.TrialId)
// .WhereIf(challengeQuery.DoctorId != null, t => t.DoctorId == challengeQuery.DoctorId)
// .ProjectTo<Enroll>(_mapper.ConfigurationProvider);
//var pageList = await query2.ToListAsync();
// return new PageOutput<EnrollViewModel>(challengeQuery.pageIndex, challengeQuery.pageSize,
//costStatisticsQueryable);
}
#region Reviewer select-submit-approve-confirm
/// <summary> 为项目筛选医生 提交 【select】 </summary>
/// <param name="trialId">项目Id</param>
/// <param name="doctorIdArray">医生Id数组</param>
/// <returns></returns>
[HttpPost("{trialId:guid}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> SelectReviewers(Guid trialId, Guid[] doctorIdArray)
{
var trial = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
if (trial == null) return Null404NotFound(trial);
//_trialRepository.Attach(trial);
//更新项目状态
trial.TrialEnrollStatus = (int)TrialEnrollStatus.HasApplyDownLoadResume;
//_trialRepository.Update(trial);
//添加项目状态变化记录
var trialDetail = new TrialStatusDetail()
{
TrialId = trial.Id,
TrialStatus = (int)TrialEnrollStatus.HasApplyDownLoadResume,
};
await _trialDetailRepository.AddAsync(trialDetail);
// 入组表 入组状态跟踪表
foreach (var doctorId in doctorIdArray)
{
await _enrollRepository.AddAsync(new Enroll()
{
DoctorId = doctorId,
TrialId = trialId,
EnrollStatus = (int)EnrollStatus.HasApplyDownloadResume,
});
await _enrollDetailRepository.AddAsync(new EnrollDetail()
{
DoctorId = doctorId,
TrialId = trialId,
EnrollStatus = (int)EnrollStatus.HasApplyDownloadResume,
OptUserType = (int)SystemUserType.AdminUser,
});
}
return ResponseOutput.Result(await _enrollRepository.SaveChangesAsync());
}
/// <summary>
/// 入组流程-向CRO提交医生[Submit]
/// </summary>
[HttpPost("{trialId:guid}/{commitState:int}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> SubmitReviewer(Guid trialId, Guid[] doctorIdArray, int commitState)
{
var trial = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
if (trial != null)
{
if (commitState == 1) //确认提交CRO
{
//更新项目状态
trial.TrialEnrollStatus = (int)TrialEnrollStatus.HasCommitCRO;
//添加项目详细记录
var trialDetail = new TrialStatusDetail()
{
TrialId = trial.Id,
TrialStatus = (int)TrialEnrollStatus.HasCommitCRO
};
await _trialDetailRepository.AddAsync(trialDetail);
//更新入组表 跟踪了 所以不用下面的_enrollRepository.Update(intoGroupItem);
var intoGroupList = await _enrollRepository.Where(t => t.TrialId == trialId, true).ToListAsync();
foreach (var intoGroupItem in intoGroupList)
{
if (doctorIdArray.Contains(intoGroupItem.DoctorId))
{
intoGroupItem.EnrollStatus = (int)EnrollStatus.HasCommittedToCRO;
//_enrollRepository.Update(intoGroupItem);
await _enrollDetailRepository.AddAsync(new EnrollDetail()
{
TrialDetailId = trialDetail.Id,
DoctorId = intoGroupItem.DoctorId,
TrialId = trialId,
EnrollStatus = (int)EnrollStatus.HasCommittedToCRO,
OptUserType = (int)SystemUserType.AdminUser, //后台用户
});
}
}
}
else if (commitState == 0)//回退上一步
{
//更新入组表
var intoGroupList = await _enrollRepository.Where(t => t.TrialId == trialId, true).ToListAsync();
foreach (var intoGroupItem in intoGroupList)
{
if (doctorIdArray.Contains(intoGroupItem.DoctorId))
{
intoGroupItem.EnrollStatus = (int)EnrollStatus.HasApplyDownloadResume;
//_enrollRepository.Update(intoGroupItem);
var deleteItem = await _enrollDetailRepository.FirstOrDefaultAsync(t =>
t.TrialId == trialId && t.DoctorId == intoGroupItem.DoctorId &&
t.EnrollStatus == (int)EnrollStatus.HasCommittedToCRO);
await _enrollDetailRepository.DeleteAsync(deleteItem);
}
}
}
return ResponseOutput.Result(await _enrollRepository.SaveChangesAsync());
}
return ResponseOutput.NotOk($"Cannot find trial {trialId}");
}
/// <summary>
/// 入组流程-CRO确定医生名单 [ Approve]
/// </summary>
[HttpPost("{trialId:guid}/{auditState:int}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> ApproveReviewer(Guid trialId, Guid[] doctorIdArray, int auditState)
{
var trial = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
if (trial == null) return Null404NotFound(trial);
if (auditState == 1) //确认入组
{
//var existItem = _trialRepository.FindSingleOrDefault(u => u.Id == trialId && u.TrialStatus >= (int)TrialEnrollStatus.HasConfirmedDoctorNames);
//if (existItem == null)
//{
// trial.TrialStatus = (int)TrialEnrollStatus.HasConfirmedDoctorNames;
// trial.TrialStatusStr = "Approved";
//}
//_trialRepository.Update(trial);
//更新项目状态
trial.TrialEnrollStatus = (int)TrialEnrollStatus.HasConfirmedDoctorNames;
//添加项目详细记录
var trialDetail = new TrialStatusDetail()
{
TrialId = trialId,
TrialStatus = (int)TrialEnrollStatus.HasConfirmedDoctorNames
};
await _trialDetailRepository.AddAsync(trialDetail);
//更新入组表 跟踪方式,不用下面的_enrollRepository.Update(intoGroupItem);
var intoGroupList = _enrollRepository.Where(t => t.TrialId == trialId, true).ToList();
foreach (var intoGroupItem in intoGroupList)
{
if (doctorIdArray.Contains(intoGroupItem.DoctorId))
{
intoGroupItem.EnrollStatus = (int)EnrollStatus.InviteIntoGroup;
//_enrollRepository.Update(intoGroupItem);
await _enrollDetailRepository.AddAsync(new EnrollDetail()
{
DoctorId = intoGroupItem.DoctorId,
TrialId = trialId,
EnrollStatus = (int)EnrollStatus.InviteIntoGroup,
OptUserType = (int)SystemUserType.AdminUser, //后台用户
});
}
}
}
else if (auditState == 0)//回退上一步
{
//更新入组表
var intoGroupList = _enrollRepository.Where(t => t.TrialId == trialId, true).ToList();
foreach (var intoGroupItem in intoGroupList)
{
if (doctorIdArray.Contains(intoGroupItem.DoctorId))
{
intoGroupItem.EnrollStatus = (int)EnrollStatus.HasCommittedToCRO;
//_enrollRepository.Update(intoGroupItem);
var deleteItem = await _enrollDetailRepository.FirstOrDefaultAsync(t =>
t.TrialId == trialId && t.DoctorId == intoGroupItem.DoctorId &&
t.EnrollStatus == (int)EnrollStatus.InviteIntoGroup);
await _enrollDetailRepository.DeleteAsync(deleteItem);
}
}
}
return ResponseOutput.Result(await _enrollRepository.SaveChangesAsync());
}
/// <summary>
/// 入组流程-后台确认医生入组[Confirm]
/// </summary>
[HttpPost("{trialId:guid}/{confirmState:int}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> ConfirmReviewer(Guid trialId, Guid[] doctorIdArray, int confirmState)
{
//var trial = _trialRepository.FirstOrDefault(t => t.Id == trialId);
//var existItem = _trialRepository.FindSingleOrDefault(u => u.Id == trialId && u.TrialStatus >= (int)TrialEnrollStatus.HasConfirmedDoctorNames);
//trial.TrialStatusStr = "Reading";
////trial.TrialStatus = (int)TrialStatus.HasConfirmedDoctorNames;
//_trialRepository.Update(trial);
var trial = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
if (trial == null) return Null404NotFound(trial);
//更新入组表
var intoGroupList = await _enrollRepository.Where(t => t.TrialId == trialId).ToListAsync();
if (confirmState == 1) //确认入组
{
foreach (var intoGroupItem in intoGroupList)
{
if (doctorIdArray.Contains(intoGroupItem.DoctorId))
{
intoGroupItem.EnrollStatus = (int)EnrollStatus.ConfirmIntoGroup;
intoGroupItem.EnrollTime = DateTime.Now;
await _enrollRepository.UpdateAsync(intoGroupItem);
await _enrollDetailRepository.AddAsync(new EnrollDetail()
{
DoctorId = intoGroupItem.DoctorId,
TrialId = trialId,
EnrollStatus = (int)EnrollStatus.ConfirmIntoGroup,
OptUserType = (int)SystemUserType.AdminUser, //后台用户
});
}
}
}
else if (confirmState == 0)//回退上一步
{
foreach (var intoGroupItem in intoGroupList)
{
if (doctorIdArray.Contains(intoGroupItem.DoctorId))
{
intoGroupItem.EnrollStatus = (int)EnrollStatus.InviteIntoGroup;
intoGroupItem.EnrollTime = null;
await _enrollRepository.UpdateAsync(intoGroupItem);
var deleteItem = await _enrollDetailRepository.FirstOrDefaultAsync(t =>
t.TrialId == trialId && t.DoctorId == intoGroupItem.DoctorId &&
t.EnrollStatus == (int)EnrollStatus.ConfirmIntoGroup);
await _enrollDetailRepository.DeleteAsync(deleteItem);
}
}
}
return ResponseOutput.Result(await _enrollRepository.SaveChangesAsync());
}
/// <summary>
/// optType 0表示回退,回退之后,列表没这条数据了, 1表示出组,需要填写出组时间
/// </summary>
/// <param name="trialId"></param>
/// <param name="doctorId"></param>
/// <param name="optType"></param>
/// <param name="outEnrollTime"></param>
/// <returns></returns>
[HttpPost("{trialId:guid}/{doctorId:guid}/{optType:int}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> EnrollBackOrOut(Guid trialId, Guid doctorId, int optType, DateTime? outEnrollTime)
{
var intoGroupItem = await _enrollRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.DoctorId == doctorId);
if (optType == 0)
{
var sum = _workloadRepository.Where(t =>
t.TrialId == trialId && t.DoctorId == doctorId &&
t.DataFrom == (int)WorkLoadFromStatus.FinalConfirm)
.Sum(u => u.Adjudication + u.AdjudicationIn24H + u.AdjudicationIn48H + u.Timepoint +
u.TimepointIn24H + u.TimepointIn48H + u.RefresherTraining + u.Training + u.Global +
u.Downtime);
if (sum != 0)
{
return ResponseOutput.NotOk("Reviewers with workload cannot go back");
}
intoGroupItem.EnrollStatus = (int)EnrollStatus.InviteIntoGroup;
intoGroupItem.EnrollTime = null;
await _enrollRepository.UpdateAsync(intoGroupItem);
var deleteItem = await _enrollDetailRepository.FirstOrDefaultAsync(t =>
t.TrialId == trialId && t.DoctorId == intoGroupItem.DoctorId &&
t.EnrollStatus == (int)EnrollStatus.ConfirmIntoGroup);
await _enrollDetailRepository.DeleteAsync(deleteItem);
}
else if (optType == 1)
{
intoGroupItem.OutEnrollTime = outEnrollTime;
}
return ResponseOutput.Result(await _enrollRepository.SaveChangesAsync());
}
#endregion
}
}
@@ -0,0 +1,18 @@
using IRaCIS.Application.Contracts;
namespace IRaCIS.Application.Services
{
public interface IDoctorWorkloadService
{
Task<IResponseOutput> AddOrUpdateWorkload(WorkloadCommand workLoadAddOrUpdateModel, Guid userId);
Task<IResponseOutput> DeleteReviewerAckSOW(Guid trialId, Guid doctorId, Guid attachmentId);
Task<IResponseOutput> DeleteWorkload(Guid workloadId);
PageOutput<WorkLoadDetailDTO> GetEnrollmentWorkloadStatsDetail(WorkLoadStatsQueryDTO workLoadSearch);
Task<List<WorkLoadDetailViewModel>> GetReviewerWorkLoadListDetail(WorkLoadDetailQueryDTO workLoadSearch);
Task<PageOutput<WorkLoadAndAgreementDTO>> GetTrialEnrollmentWorkloadStats(WorkLoadDoctorQueryDTO doctorSearchModel);
Task<WorkloadDTO> GetWorkloadDetailById(Guid id);
Task<IResponseOutput> UpdateReviewerReadingType(Guid trialId, Guid doctorId, int type);
Task<IResponseOutput> UploadReviewerAckSOW(Guid trialId, ReviewerAckDTO attachmentViewModel);
Task<IResponseOutput<ExistWorkloadViewModel>> WorkloadExist(WorkloadExistQueryDTO param);
}
}
@@ -0,0 +1,15 @@
using IRaCIS.Core.Application.Service.WorkLoad.DTO;
namespace IRaCIS.Application.Services
{
public interface IEnrollService
{
Task<IResponseOutput> AddOrUpdateEnroll(EnrollCommand addOrUpdateModel);
Task<IResponseOutput> ApproveReviewer(Guid trialId, Guid[] doctorIdArray, int auditState);
Task<IResponseOutput> ConfirmReviewer(Guid trialId, Guid[] doctorIdArray, int confirmState);
Task<IResponseOutput> EnrollBackOrOut(Guid trialId, Guid doctorId, int optType, DateTime? outEnrollTime);
Task<PageOutput<EnrollViewModel>> GetTrialDoctorList(EnrollGetQuery challengeQuery);
Task<IResponseOutput> SelectReviewers(Guid trialId, Guid[] doctorIdArray);
Task<IResponseOutput> SubmitReviewer(Guid trialId, Guid[] doctorIdArray, int commitState);
}
}
@@ -0,0 +1,29 @@
using System;
using IRaCIS.Core.Application.Service.WorkLoad.DTO;
using IRaCIS.Core.Infrastructure.Extention;
namespace IRaCIS.Application.Interfaces
{
public interface ITrialEnrollmentService
{
IResponseOutput AddOrUpdateEnroll(EnrollCommand addOrUpdateModel);
Task< PageOutput<EnrollViewModel>> GetTrialDoctorList(EnrollGetQuery challengeQuery);
/// <summary>入组流程-筛选医生 [select]</summary>
IResponseOutput SelectReviewers( Guid trialId, Guid[] doctorIdArray);
/// <summary>入组流程-向CRO提交医生[Submit]</summary>
IResponseOutput SubmitReviewer( Guid trialId, Guid[] doctorIdArray, int commitState);
/// <summary>入组流程-CRO确定医生名单 [ Approve]</summary>
IResponseOutput ApproveReviewer( Guid trialId, Guid[] doctorIdArray, int auditState);
/// <summary>入组流程-向CRO提交医生[Submit]</summary>
IResponseOutput ConfirmReviewer(Guid trialId, Guid[] doctorIdArray, int confirmState);
IResponseOutput EnrollBackOrOut( Guid trialId, Guid doctorId, int optType,DateTime? outEnrollTime);
}
}
@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Infrastructure.Extention;
namespace IRaCIS.Core.Application.Contracts
{
public interface IWorkloadDistributionService
{
PageOutput<WorkloadTPDTO> GetWorkloadTPList(WorkloadDistributionQueryParam param);
IResponseOutput DistributeTP(WorkloadTPCommand workloadTPCommand);
IResponseOutput UpdateDistributeTP(Guid tpId, Guid ReviewerId, Guid studyId);
PageOutput<WorkloadGlobalDTO> GetWorkloadGlobalList(WorkloadDistributionQueryParam param);
IResponseOutput DistributeGlobal(WorkloadGlobalCommand workloadGlobalCommand);
IResponseOutput UpdateDistributeGlobal(Guid tpId, Guid ReviewerId,Guid subjectId, decimal visitNum);
PageOutput<WorkloadADDTO> GetWorkloadADList(WorkloadDistributionQueryParam param);
IResponseOutput DistributeAD(WorkloadAdCommand workloadTPCommand);
IResponseOutput UpdateDistributeAD(Guid tpId, Guid ReviewerId);
IResponseOutput<List<WorkloadDetailDTO>> GetWorkloadDetail(Guid WorkloadId);
IResponseOutput UpdateGlobalStatus(Guid globalId);
}
}
@@ -0,0 +1,573 @@
//using IRaCIS.Application.Contracts;
//using IRaCIS.Core.Application.Contracts;
//using System.Linq.Expressions;
//using IRaCIS.Core.Infrastructure.ExpressionExtend;
//using IRaCIS.Core.Infra.EFCore;
//using IRaCIS.Core.Domain.Models;
//using IRaCIS.Core.Domain.Share;
//using IRaCIS.Core.Infrastructure.Extention;
//using Microsoft.AspNetCore.Mvc;
//namespace IRaCIS.Core.Application.Services
//{
// /// <summary>
// /// TP、Global、AD 工作量分配查看
// /// </summary>
// [ ApiExplorerSettings(GroupName = "Trial")]
//#pragma warning disable
// public class WorkloadDistributionService : BaseService, IWorkloadDistributionService
// {
// private readonly IWorkloadTPRepository _workloadTpRepository;
// private readonly IWorkloadGlobalRepository _workloadGlobalRepository;
// private readonly IWorkloadADRepository _workloadAdRepository;
// private readonly IRepository<SubjectVisit> _subjectVisitRepository;
// private readonly IRepository<DicomStudy> _studyRepository;
// private readonly IRepository<Doctor> _doctorRepository;
// private readonly IRepository<Subject> _subjectRepository;
// private readonly IRepository<Site> _siteRepository;
// private readonly IWorkloadDetailRepository _workloadDetailRepository;
// public WorkloadDistributionService(IWorkloadTPRepository workloadTpRepository,
// IWorkloadGlobalRepository workloadGlobalRepository,
// IWorkloadADRepository workloadAdRepository,
// IRepository<SubjectVisit> subjectVisitRepository, IRepository<DicomStudy> studyRepository,
// IRepository<Doctor> doctorRepository, IRepository<Subject> subjectRepository,
// IRepository<Site> siteRepository,
// IWorkloadDetailRepository workloadDetailRepository,
// IUserInfo userInfo)
// {
// _workloadTpRepository = workloadTpRepository;
// _workloadGlobalRepository = workloadGlobalRepository;
// _workloadAdRepository = workloadAdRepository;
// _subjectVisitRepository = subjectVisitRepository;
// _studyRepository = studyRepository;
// _doctorRepository = doctorRepository;
// _subjectRepository = subjectRepository;
// _siteRepository = siteRepository;
// _workloadDetailRepository = workloadDetailRepository;
// }
// /// <summary>
// /// 批量分配Tp
// /// </summary>
// /// <param name="workloadTPCommand"></param>
// /// <returns></returns>
// [HttpPost]
// public IResponseOutput DistributeTP(WorkloadTPCommand workloadTPCommand)
// {
// //当前采用的是没有提示到具体的TP,如有需要在修改下
// var studyIdList = workloadTPCommand.TpList.Select(u => u.StudyId);
// var temp = _workloadTpRepository.Where(u => studyIdList.Contains(u.StudyId) && u.ReviewerId == workloadTPCommand.ReviewerId);
// if (temp.Any() )
// {
// return ResponseOutput.NotOk("The TPs of different Arms of the same subject couldn't be assigned to the same reviewer.");
// }
// var success = false;
// workloadTPCommand.TpList.ForEach(t =>
// {
// _workloadDetailRepository.Add(new WorkloadDetail
// {
// WorkloadId = t.Id,
// OptUserName = _userInfo.RealName,
// OptTime = DateTime.Now,
// Status = (int)WorkloadStatus.Distributed,
// ReviewerId = workloadTPCommand.ReviewerId
// });
// _workloadDetailRepository.SaveChanges();
// success = _workloadTpRepository.Update(u => u.Id == t.Id, k => new WorkloadTP()
// {
// ReviewerId = workloadTPCommand.ReviewerId,
// Status = (int)WorkloadStatus.Distributed
// });
// });
// return ResponseOutput.Result(success);
// }
// /// <summary>
// /// 批量分配AD
// /// </summary>
// /// <param name="workloadTPCommand"></param>
// /// <returns></returns>
// [HttpPost]
// public IResponseOutput DistributeAD(WorkloadAdCommand workloadTPCommand)
// {
// var success = false;
// workloadTPCommand.IdList.ForEach(t =>
// {
// _workloadDetailRepository.Add(new WorkloadDetail
// {
// WorkloadId = t,
// OptUserName = _userInfo.RealName,
// OptTime = DateTime.Now,
// Status = (int)WorkloadStatus.Distributed,
// ReviewerId = workloadTPCommand.ReviewerId
// });
// _workloadDetailRepository.SaveChanges();
// success = _workloadAdRepository.Update(u => u.Id == t, k => new WorkloadAD()
// {
// ReviewerId = workloadTPCommand.ReviewerId,
// Status = (int)WorkloadStatus.Distributed
// });
// });
// return ResponseOutput.Result(success);
// }
// /// <summary>
// /// 批量分配Global
// /// </summary>
// /// <param name="workloadGCommand"></param>
// /// <returns></returns>
// [HttpPost]
// public IResponseOutput DistributeGlobal(WorkloadGlobalCommand workloadGCommand)
// {
// var temp = _workloadGlobalRepository.Where(u => workloadGCommand.GlobalList.Select(s => s.SubjectId).Contains(u.SubjectId)
// && workloadGCommand.GlobalList.Select(s => s.VisitNum).Contains(u.VisitNum) &&
// u.ReviewerId == workloadGCommand.ReviewerId);
// if (temp.Any())
// {
// return ResponseOutput.NotOk("The Globals of different Arms of the same subject couldn't be assigned to the same reviewer.");
// }
// var success = false;
// workloadGCommand.GlobalList.ForEach(t =>
// {
// _workloadDetailRepository.Add(new WorkloadDetail
// {
// WorkloadId = t.Id,
// OptUserName = _userInfo.RealName,
// OptTime = DateTime.Now,
// Status = (int)WorkloadStatus.Distributed,
// ReviewerId = workloadGCommand.ReviewerId
// });
// _workloadDetailRepository.SaveChanges();
// success = _workloadGlobalRepository.Update(u => u.Id == t.Id, k => new WorkloadGlobal()
// {
// ReviewerId = workloadGCommand.ReviewerId,
// Status = (int)WorkloadStatus.Distributed
// });
// });
// return ResponseOutput.Result(success);
// }
// [HttpPost]
// public PageOutput<WorkloadGlobalDTO> GetWorkloadGlobalList(WorkloadDistributionQueryParam param)
// {
// IQueryable<WorkloadGlobalDTO> query = null;
// Expression<Func<WorkloadGlobal, bool>> workloadTPLambda = x => x.TrialId == param.TrialId;
// if (param.SiteId != null)
// {
// workloadTPLambda = workloadTPLambda.And(t => t.SiteId == param.SiteId);
// }
// if (param.Status != null)
// {
// workloadTPLambda = workloadTPLambda.And(t => t.Status == param.Status);
// }
// if (!string.IsNullOrEmpty(param.WorkloadCode))
// {
// var globalCode = param.WorkloadCode.Trim();
// workloadTPLambda = workloadTPLambda.And(t => t.GlobalCode.Contains(globalCode));
// }
// if (param.GroupId != null && param.GroupId > 0)
// {
// var groupCode = "G0" + param.GroupId;
// workloadTPLambda = workloadTPLambda.And(t => t.GlobalCode.Contains(groupCode));
// }
// Expression<Func<Subject, bool>> subjectLambda = x => x.TrialId == param.TrialId;
// if (!string.IsNullOrEmpty(param.SubjectCode))
// {
// var subjectCode = param.SubjectCode.Trim();
// subjectLambda = subjectLambda.And(t => t.Code.Contains(subjectCode));
// }
// Expression<Func<Doctor, bool>> doctorLambda = x => true;
// if (!string.IsNullOrEmpty(param.Reviewer))
// {
// var reviewer = param.Reviewer.Trim();
// doctorLambda = doctorLambda.And(t => t.ChineseName.Contains(reviewer)
// || t.FirstName.Contains(reviewer) || t.LastName.Contains(reviewer));
// query = from workloadG in _workloadGlobalRepository.Where(workloadTPLambda)
// join subject in _subjectRepository.Where(subjectLambda) on workloadG.SubjectId equals subject.Id
// join site in _siteRepository.AsQueryable() on workloadG.SiteId equals site.Id
// join doctor in _doctorRepository.Where(doctorLambda) on workloadG.ReviewerId equals doctor.Id
// select new WorkloadGlobalDTO()
// {
// Id = workloadG.Id,
// ReviewerCode = doctor.ReviewerCode,
// ReviewerChineseName = doctor.ChineseName,
// ReviewerFirstName = doctor.FirstName,
// ReviewerId = doctor.Id,
// ReviewerLastName = doctor.LastName,
// SiteId = workloadG.SiteId,
// SiteName = site.SiteName,
// Status = workloadG.Status,
// GlobalCode = workloadG.GlobalCode,
// SubjectCode = subject.Code,
// VisitId = workloadG.VisitId,
// UpdateTime = workloadG.UpdateTime,
// SubjectId = workloadG.SubjectId,
// VisitNum = workloadG.VisitNum,
// VisitName = workloadG.VisitName
// };
// }
// else
// {
// query = from workloadG in _workloadGlobalRepository.Where(workloadTPLambda)
// join subject in _subjectRepository.Where(subjectLambda) on workloadG.SubjectId equals subject.Id
// join site in _siteRepository.AsQueryable() on workloadG.SiteId equals site.Id
// join doctor in _doctorRepository.Where(doctorLambda) on workloadG.ReviewerId equals doctor.Id into cc
// from doctor in cc.DefaultIfEmpty()
// select new WorkloadGlobalDTO()
// {
// Id = workloadG.Id,
// ReviewerCode = doctor.ReviewerCode,
// ReviewerChineseName = doctor.ChineseName,
// ReviewerFirstName = doctor.FirstName,
// ReviewerId = doctor.Id,
// ReviewerLastName = doctor.LastName,
// SiteId = workloadG.SiteId,
// SiteName = site.SiteName,
// Status = workloadG.Status,
// GlobalCode = workloadG.GlobalCode,
// SubjectCode = subject.Code,
// VisitId = workloadG.VisitId,
// UpdateTime = workloadG.UpdateTime,
// SubjectId = workloadG.SubjectId,
// VisitNum = workloadG.VisitNum,
// VisitName = workloadG.VisitName
// };
// }
// var count = query.Count();
// var propName = param.SortField == string.Empty ? "GlobalCode" : param.SortField;
// query = param.Asc
// ? query.OrderBy(propName).ThenBy(t => t.SiteName).ThenBy(t => t.SubjectCode)
// : query.OrderByDescending(propName).ThenBy(t => t.SiteName).ThenBy(t => t.SubjectCode);
// query = query.Skip((param.PageIndex - 1) * param.PageSize).Take(param.PageSize);
// var list = query.ToList();
// return new PageOutput<WorkloadGlobalDTO>(param.PageIndex,
// param.PageSize, count, list);
// }
// [HttpPost]
// public PageOutput<WorkloadADDTO> GetWorkloadADList(WorkloadDistributionQueryParam param)
// {
// IQueryable<WorkloadADDTO> query = null;
// Expression<Func<WorkloadAD, bool>> workloadAdLambda = x => x.TrialId == param.TrialId;
// if (param.SiteId != null)
// {
// workloadAdLambda = workloadAdLambda.And(t => t.SiteId == param.SiteId);
// }
// if (param.Status != null)
// {
// workloadAdLambda = workloadAdLambda.And(t => t.Status == param.Status);
// }
// if (!string.IsNullOrEmpty(param.WorkloadCode))
// {
// var adCode = param.WorkloadCode.Trim();
// workloadAdLambda = workloadAdLambda.And(t => t.ADCode.Contains(adCode));
// }
// Expression<Func<Subject, bool>> subjectLambda = x => x.TrialId == param.TrialId;
// if (!string.IsNullOrEmpty(param.SubjectCode))
// {
// var subjectCode = param.SubjectCode.Trim();
// subjectLambda = subjectLambda.And(t => t.Code.Contains(subjectCode));
// }
// Expression<Func<Doctor, bool>> doctorLambda = x => true;
// if (!string.IsNullOrEmpty(param.Reviewer))
// {
// var reviewer = param.Reviewer.Trim();
// doctorLambda = doctorLambda.And(t => t.ChineseName.Contains(reviewer)
// || t.FirstName.Contains(reviewer) || t.LastName.Contains(reviewer));
// query = from workloadAd in _workloadAdRepository.Where(workloadAdLambda)
// join subject in _subjectRepository.Where(subjectLambda) on workloadAd.SubjectId equals subject.Id
// join site in _siteRepository.AsQueryable() on workloadAd.SiteId equals site.Id
// join doctor in _doctorRepository.Where(doctorLambda) on workloadAd.ReviewerId equals doctor.Id
// select new WorkloadADDTO()
// {
// Id = workloadAd.Id,
// ReviewerCode = doctor.ReviewerCode,
// ReviewerChineseName = doctor.ChineseName,
// ReviewerFirstName = doctor.FirstName,
// ReviewerId = doctor.Id,
// ReviewerLastName = doctor.LastName,
// SiteId = workloadAd.SiteId,
// SiteName = site.SiteName,
// Status = workloadAd.Status,
// ADCode = workloadAd.ADCode,
// SubjectCode = subject.Code,
// SubjectId = workloadAd.SubjectId,
// UpdateTime = workloadAd.UpdateTime
// };
// }
// else
// {
// query = from workloadAd in _workloadAdRepository.Where(workloadAdLambda)
// join subject in _subjectRepository.Where(subjectLambda) on workloadAd.SubjectId equals subject.Id
// join site in _siteRepository.AsQueryable() on workloadAd.SiteId equals site.Id
// join doctor in _doctorRepository.Where(doctorLambda) on workloadAd.ReviewerId equals doctor.Id into cc
// from doctor in cc.DefaultIfEmpty()
// select new WorkloadADDTO()
// {
// Id = workloadAd.Id,
// ReviewerCode = doctor.ReviewerCode,
// ReviewerChineseName = doctor.ChineseName,
// ReviewerFirstName = doctor.FirstName,
// ReviewerId = doctor.Id,
// ReviewerLastName = doctor.LastName,
// SiteId = workloadAd.SiteId,
// SiteName = site.SiteName,
// Status = workloadAd.Status,
// ADCode = workloadAd.ADCode,
// SubjectCode = subject.Code,
// SubjectId = workloadAd.SubjectId,
// UpdateTime = workloadAd.UpdateTime
// };
// }
// var count = query.Count();
// var propName = param.SortField == string.Empty ? "ADCode" : param.SortField;
// query = param.Asc
// ? query.OrderBy(propName).ThenBy(t => t.SiteName).ThenBy(t => t.SubjectCode)
// : query.OrderByDescending(propName).ThenBy(t => t.SiteName).ThenBy(t => t.SubjectCode);
// query = query.Skip((param.PageIndex - 1) * param.PageSize).Take(param.PageSize);
// var list = query.ToList();
// return new PageOutput<WorkloadADDTO>(param.PageIndex,
// param.PageSize, count, list);
// }
// [HttpPost]
// public PageOutput<WorkloadTPDTO> GetWorkloadTPList(WorkloadDistributionQueryParam param)
// {
// IQueryable<WorkloadTPDTO> query = null;
// Expression<Func<WorkloadTP, bool>> workloadTPLambda = x => x.TrialId == param.TrialId;
// if (param.SiteId != null)
// {
// workloadTPLambda = workloadTPLambda.And(t => t.SiteId == param.SiteId);
// }
// if (param.Status != null)
// {
// workloadTPLambda = workloadTPLambda.And(t => t.Status == param.Status);
// }
// if (!string.IsNullOrEmpty(param.WorkloadCode))
// {
// var timepoint = param.WorkloadCode.Trim();
// workloadTPLambda = workloadTPLambda.And(t => t.TimepointCode.Contains(timepoint));
// }
// if (param.GroupId != null && param.GroupId > 0)
// {
// var groupCode = "T0" + param.GroupId;
// workloadTPLambda = workloadTPLambda.And(t => t.TimepointCode.Contains(groupCode));
// }
// Expression<Func<Subject, bool>> subjectLambda = x => x.TrialId == param.TrialId;
// if (!string.IsNullOrEmpty(param.SubjectCode))
// {
// var subjectCode = param.SubjectCode.Trim();
// subjectLambda = subjectLambda.And(t => t.Code.Contains(subjectCode));
// }
// Expression<Func<Doctor, bool>> doctorLambda = x => true;
// if (!string.IsNullOrEmpty(param.Reviewer))
// {
// var reviewer = param.Reviewer.Trim();
// doctorLambda = doctorLambda.And(t => t.ChineseName.Contains(reviewer)
// || t.FirstName.Contains(reviewer) || t.LastName.Contains(reviewer));
// query = from workloadTp in _workloadTpRepository.Where(workloadTPLambda)
// join subject in _subjectRepository.Where(subjectLambda) on workloadTp.SubjectId equals subject.Id
// join subjectVisit in _subjectVisitRepository.AsQueryable() on workloadTp.SubjectVisitId equals subjectVisit.Id
// join study in _studyRepository.AsQueryable() on workloadTp.StudyId equals study.Id
// join site in _siteRepository.AsQueryable() on workloadTp.SiteId equals site.Id
// join doctor in _doctorRepository.Where(doctorLambda) on workloadTp.ReviewerId equals doctor.Id
// select new WorkloadTPDTO()
// {
// Id = workloadTp.Id,
// ReviewerCode = doctor.ReviewerCode,
// ReviewerChineseName = doctor.ChineseName,
// ReviewerFirstName = doctor.FirstName,
// ReviewerId = doctor.Id,
// ReviewerLastName = doctor.LastName,
// SiteId = workloadTp.SiteId,
// SiteName = site.SiteName,
// Status = workloadTp.Status,
// StudyCode = study.StudyCode,
// StudyId = workloadTp.StudyId,
// TimepointCode = workloadTp.TimepointCode,
// SubjectCode = subject.Code,
// SubjectVisitId = workloadTp.SubjectVisitId,
// SubjectId = workloadTp.SubjectId,
// VisitNum = subjectVisit.VisitNum,
// VisitName = subjectVisit.VisitName,
// UpdateTime = workloadTp.UpdateTime
// };
// }
// else
// {
// query = from workloadTp in _workloadTpRepository.Where(workloadTPLambda)
// join subject in _subjectRepository.Where(subjectLambda) on workloadTp.SubjectId equals subject.Id
// join subjectVisit in _subjectVisitRepository.AsQueryable() on workloadTp.SubjectVisitId equals subjectVisit.Id
// join study in _studyRepository.AsQueryable() on workloadTp.StudyId equals study.Id
// join site in _siteRepository.AsQueryable() on workloadTp.SiteId equals site.Id
// join doctor in _doctorRepository.Where(doctorLambda) on workloadTp.ReviewerId equals doctor.Id into cc
// from doctor in cc.DefaultIfEmpty()
// select new WorkloadTPDTO()
// {
// Id = workloadTp.Id,
// ReviewerCode = doctor.ReviewerCode,
// ReviewerChineseName = doctor.ChineseName,
// ReviewerFirstName = doctor.FirstName,
// ReviewerId = doctor.Id,
// ReviewerLastName = doctor.LastName,
// SiteId = workloadTp.SiteId,
// SiteName = site.SiteName,
// Status = workloadTp.Status,
// StudyCode = study.StudyCode,
// StudyId = workloadTp.StudyId,
// TimepointCode = workloadTp.TimepointCode,
// SubjectCode = subject.Code,
// SubjectVisitId = workloadTp.SubjectVisitId,
// SubjectId = workloadTp.SubjectId,
// VisitNum = subjectVisit.VisitNum,
// VisitName = subjectVisit.VisitName,
// UpdateTime = workloadTp.UpdateTime
// };
// }
// var count = query.Count();
// var propName = param.SortField == string.Empty ? "TimepointCode" : param.SortField;
// query = param.Asc
// ? query.OrderBy(propName).ThenBy(t => t.SiteName).ThenBy(t => t.SubjectCode)
// : query.OrderByDescending(propName).ThenBy(t => t.SiteName).ThenBy(t => t.SubjectCode);
// query = query.Skip((param.PageIndex - 1) * param.PageSize).Take(param.PageSize);
// var list = query.ToList();
// return new PageOutput<WorkloadTPDTO>(param.PageIndex,
// param.PageSize, count, list);
// }
// //修改单个TP
// [HttpPost("{tpId:guid}/{reviewerId:guid}")]
// public IResponseOutput UpdateDistributeAD(Guid tpId, Guid reviewerId)
// {
// _workloadDetailRepository.Add(new WorkloadDetail
// {
// WorkloadId = tpId,
// OptUserName = _userInfo.RealName,
// OptTime = DateTime.Now,
// Status = (int)WorkloadStatus.Distributed,
// ReviewerId = reviewerId
// });
// _workloadDetailRepository.SaveChanges();
// var success= _workloadAdRepository.Update(t => t.Id == tpId, u => new WorkloadAD()
// {
// ReviewerId = reviewerId,
// Status = (int)WorkloadStatus.Distributed
// });
// return ResponseOutput.Result(success);
// }
// //修改单个Global
// [HttpPost("{tpId:guid}/{reviewerId:guid}/{subjectId:guid}/{visitNum}")]
// public IResponseOutput UpdateDistributeGlobal(Guid tpId, Guid reviewerId, Guid subjectId, decimal visitNum)
// {
// var temp = _workloadGlobalRepository.Where(u => u.SubjectId == subjectId &&
// u.VisitNum == visitNum &&
// u.ReviewerId == reviewerId && u.Id != tpId);
// if (temp.Any())
// {
// return ResponseOutput.NotOk("The Global of the other arm of this subject has already been assigned to this reviewer, and the assignment couldn't be performed.");
// }
// _workloadDetailRepository.Add(new WorkloadDetail
// {
// WorkloadId = tpId,
// OptUserName = _userInfo.RealName,
// OptTime = DateTime.Now,
// Status = (int)WorkloadStatus.Distributed,
// ReviewerId = reviewerId
// });
// _workloadDetailRepository.SaveChanges();
// return ResponseOutput.Result(_workloadGlobalRepository.Update(t => t.Id == tpId, u => new WorkloadGlobal()
// {
// ReviewerId = reviewerId,
// Status = (int)WorkloadStatus.Distributed
// }));
// }
// //修改单个TP
// [HttpPost("{tpId:guid}/{reviewerId:guid}/{studyId:guid}")]
// public IResponseOutput UpdateDistributeTP(Guid tpId, Guid reviewerId, Guid studyId)
// {
// var temp = _workloadTpRepository.Where(u => u.StudyId == studyId && u.ReviewerId == reviewerId && u.Id != tpId);
// if (temp.Any())
// {
// return ResponseOutput.NotOk("The TP of the other arm of this subject has already been assigned to this reviewer, and the assignment couldn't be performed.");
// }
// _workloadDetailRepository.Add(new WorkloadDetail
// {
// WorkloadId = tpId,
// OptUserName = _userInfo.RealName,
// OptTime = DateTime.Now,
// Status = (int)WorkloadStatus.Distributed,
// ReviewerId = reviewerId
// });
// _workloadDetailRepository.SaveChanges();
// return ResponseOutput.Result(_workloadTpRepository.Update(t => t.Id == tpId, u => new WorkloadTP()
// {
// ReviewerId = reviewerId,
// Status = (int)WorkloadStatus.Distributed
// }));
// }
// [HttpGet("{workloadId:guid}")]
// public IResponseOutput<List<WorkloadDetailDTO>> GetWorkloadDetail(Guid workloadId)
// {
// IQueryable<WorkloadDetailDTO> query = null;
// query = from detail in _workloadDetailRepository.Where(u => u.WorkloadId == workloadId)
// join doctor in _doctorRepository.AsQueryable() on detail.ReviewerId equals doctor.Id into cc
// from doctor in cc.DefaultIfEmpty()
// select new WorkloadDetailDTO()
// {
// OptTime = detail.OptTime,
// OptUserName = detail.OptUserName,
// ReviewerChineseName = doctor.ChineseName,
// ReviewerFirstName = doctor.FirstName,
// ReviewerLastName = doctor.LastName,
// Status = detail.Status
// };
// var list = query.OrderByDescending(u => u.OptTime).ToList();
// return ResponseOutput.Ok(list);
// }
// [HttpPost("UpdateGlobalStatus/{globalId:guid}")]
// public IResponseOutput UpdateGlobalStatus(Guid globalId)
// {
// return ResponseOutput.Result(_workloadGlobalRepository.Update(u => u.Id == globalId, t => new WorkloadGlobal()
// {
// Status = 0
// }));
// }
// }
//}
@@ -0,0 +1,21 @@
using AutoMapper;
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.Service.WorkLoad.DTO;
using IRaCIS.Core.Domain.Models;
namespace IRaCIS.Core.Application.Service
{
public class WorkLoadConfig : Profile
{
public WorkLoadConfig()
{
CreateMap<WorkloadCommand, Workload>();
CreateMap<Workload, WorkloadDTO>();
CreateMap<EnrollCommand, Enroll>();
}
}
}