添加项目文件。
This commit is contained in:
@@ -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>();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user