using AutoMapper;
using AutoMapper.QueryableExtensions;
using IRaCIS.Application.ExpressionExtend;
using IRaCIS.Application.Interfaces;
using IRaCIS.Application.ViewModels;
using IRaCIS.Core.Application.Contracts.RequestAndResponse;
using IRaCIS.Core.Domain.Interfaces;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Infra.Data.ExpressionExtend;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
namespace IRaCIS.Application.Services
{
public class TrialWorkloadService : ITrialWorkloadService
{
private readonly ITrialRepository _trialRepository;
private readonly IEnrollRepository _enrollRepository;
private readonly IDoctorRepository _doctorRepository;
private readonly IWorkloadRepository _doctorWorkloadRepository;
private readonly IAttachmentRepository _attachmentRepository;
private readonly IPaymentRepository _costStatisticsRepository;
private readonly ITrialRevenuesPriceRepository _trialRevenuesPriceRepository;
private readonly ITrialRevenuesPriceVerificationRepository _trialRevenuesPriceVerificationRepository;
private readonly IMapper _mapper;
public TrialWorkloadService(ITrialRepository clinicalTrialProjectRepository,
IEnrollRepository intoGroupRepository,
IDoctorRepository doctorInfoRepository,
IWorkloadRepository doctorWorkloadRepository,
IAttachmentRepository attachmentRepository,
IPaymentRepository costStatisticsRepository,
ITrialRevenuesPriceRepository trialRevenuesPriceRepository,
ITrialRevenuesPriceVerificationRepository trialRevenuesPriceVerificationRepository,
IMapper mapper)
{
_trialRepository = clinicalTrialProjectRepository;
_enrollRepository = intoGroupRepository;
_doctorRepository = doctorInfoRepository;
_doctorWorkloadRepository = doctorWorkloadRepository;
_attachmentRepository = attachmentRepository;
_costStatisticsRepository = costStatisticsRepository;
_trialRevenuesPriceRepository = trialRevenuesPriceRepository;
_trialRevenuesPriceVerificationRepository = trialRevenuesPriceVerificationRepository;
_mapper = mapper;
}
#region 入组工作量统计列表 具体详情 增删改查相关 上传\删除协议
///
/// 上传入组后的Ack-SOW
///
public IResponseOutput UploadReviewerAckSOW(Guid userId, Guid trialId,
ReviewerAckDTO attachmentViewModel)
{
var intoGroupItem = _enrollRepository.GetAll().FirstOrDefault(t => t.TrialId == trialId && t.DoctorId == attachmentViewModel.DoctorId);
if (intoGroupItem != null)
{
if (attachmentViewModel.Id != Guid.Empty)
{
_attachmentRepository.Delete(t => t.Id == attachmentViewModel.Id);
}
var attach = _mapper.Map(attachmentViewModel);
var attachment = _attachmentRepository.Add(attach);
intoGroupItem.AttachmentId = attachment.Id;
_enrollRepository.Update(intoGroupItem);
var success = _enrollRepository.SaveChanges();
return ResponseOutput.Result(success, attachment.Id.ToString());
}
return ResponseOutput.NotOk("Database cannot find enroment data");
}
///
/// 删除Ack-SOW
///
public IResponseOutput DeleteReviewerAckSOW(Guid trialId, Guid doctorId, Guid attachmentId)
{
var success1 = _attachmentRepository.Delete(a => a.Id == attachmentId);
var success2 = _enrollRepository.Update(t => t.TrialId == trialId && t.DoctorId == doctorId, u =>
new Enroll()
{
AttachmentId = Guid.Empty
});
return ResponseOutput.Result(success1 && success2);
}
public IResponseOutput UpdateReviewerReadingType(Guid trialId, Guid doctorId, int type)
{
var success2 = _enrollRepository.Update(t => t.TrialId == trialId && t.DoctorId == doctorId, u =>
new Enroll()
{
ReviewerReadingType = type
});
return ResponseOutput.Result(success2);
}
///
/// 获取某个项目入组的医生工作量统计列表
///
public PageOutput GetTrialEnrollmentWorkloadStats(WorkLoadDoctorQueryDTO doctorSearchModel)
{
//https://blog.csdn.net/sunshineblog/article/details/78636389
var trialId = doctorSearchModel.TrialId;
Expression> intoGroupLambda = x => x.TrialId == trialId && x.EnrollStatus >= (int)EnrollStatus.ConfirmIntoGroup;
Expression> workloadLambda = t => t.TrialId == trialId && t.DataFrom == (int)WorkLoadFromStatus.FinalConfirm;
var doctorIntoGroupQueryable =
from intoGroup in _enrollRepository.GetAll().Where(intoGroupLambda)
join doctor in _doctorRepository.GetAll() on intoGroup.DoctorId equals doctor.Id
join attachmentItem in _attachmentRepository.GetAll() on intoGroup.AttachmentId equals attachmentItem.Id into cc
from attachment in cc.DefaultIfEmpty()
join doctorWorkLoad in _doctorWorkloadRepository.GetAll().Where(workloadLambda).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.Code,
FirstName = doctor.FirstName,
LastName = doctor.LastName,
ChineseName = doctor.ChineseName,
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 = doctorIntoGroupQueryable.Count();
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(doctorSearchModel.PageIndex,
doctorSearchModel.PageSize, count, intoGroupList);
}
///
/// 获取入组某个项目的医生的最近几个月的工作量详情(带有填充数据)
///
public PageOutput GetEnrollmentWorkloadStatsDetail(WorkLoadStatsQueryDTO workLoadSearch)
{
#region 条件查询
Expression> 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 eDate = workLoadSearch.SearchEndDateTime.Value.AddMonths(1);
var beginDate = new DateTime(bDate.Value.Year, bDate.Value.Month, 1);
DateTime endDate = new DateTime(eDate.Year, eDate.Month, 1);
workloadLambda = workloadLambda.And(t =>
t.WorkTime >= beginDate && t.WorkTime < endDate);
}
#endregion
IQueryable workLoadQueryable = default;
var tempWorkload = new List();
if (workLoadSearch.WorkLoadFromStatus.Contains(1))
{
workLoadQueryable = from workLoad in _doctorWorkloadRepository.GetAll().Where(workloadLambda.And(t => t.DataFrom == (int)WorkLoadFromStatus.CRO))
join doctor in _doctorRepository.GetAll() on workLoad.DoctorId equals doctor.Id
join trial in _trialRepository.GetAll() 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.Code,
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.GetAll().Where(workloadLambda.And(t => t.DataFrom == (int)WorkLoadFromStatus.FinalConfirm))
join doctor in _doctorRepository.GetAll() on workLoad.DoctorId equals doctor.Id
join trial in _trialRepository.GetAll() 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.Code,
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.GetAll().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.GetAll() on workLoad.DoctorId equals doctor.Id
join trial in _trialRepository.GetAll() 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.Code,
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);
}
///
/// 获取来自Reviewer自己的数据,某个月添加的多条
///
public List GetReviewerWorkLoadListDetail(
WorkLoadDetailQueryDTO workLoadSearch)
{
Expression> 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.GetAll().Where(workloadLambda)
join doctor in _doctorRepository.GetAll() on workLoad.DoctorId equals doctor.Id
join trial in _trialRepository.GetAll() 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.Code,
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 = workLoadQueryable.ToList();
workLoadList.ForEach(t => t.RowGuid = Guid.NewGuid());
return workLoadList;
}
///
/// 工作量是否存在,用于判断只能添加一条的工作量记录
///
public IResponseOutput WorkloadExist(WorkloadExistQueryDTO param)
{
var isExist = false;
var exist = _doctorWorkloadRepository.FindSingleOrDefault(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(exist),
});
}
///
/// 添加或更新工作量
///
public IResponseOutput AddOrUpdateWorkload(WorkloadCommand workLoadAddOrUpdateModel,
Guid userId)
{
var yearMonthStr = workLoadAddOrUpdateModel.WorkTime.ToString("yyyy-MM");
if (workLoadAddOrUpdateModel.Id == Guid.Empty || workLoadAddOrUpdateModel.Id == null)
{
//确定是那个医生 那个项目 那个月份做的
Expression> 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 = _costStatisticsRepository.GetAll().Any(u => u.YearMonth == yearMonthStr && u.DoctorId == workLoadAddOrUpdateModel.DoctorId);
if (!isExist)
{
_costStatisticsRepository.Add(new Payment
{
DoctorId = workLoadAddOrUpdateModel.DoctorId,
YearMonth = yearMonthStr,
YearMonthDate = DateTime.Parse(yearMonthStr),
IsLock = false
});
}
//处理 验证项目收入价格是否都填写了
var revenuesPriceExist = _trialRevenuesPriceRepository.GetAll()
.FirstOrDefault(t => t.TrialId == workLoadAddOrUpdateModel.TrialId);
//没填写收入价格 插入记录 所有的都是false
if (revenuesPriceExist == null)
{
_trialRevenuesPriceVerificationRepository.Add(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)
{
_trialRevenuesPriceVerificationRepository.Add(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 (_doctorWorkloadRepository.GetAll().Any(workloadLambda))
{
return ResponseOutput.NotOk("This type of data can only have one");
}
}
if (workLoadAddOrUpdateModel.DataFrom == (int)WorkLoadFromStatus.Doctor)
{
Expression> 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 (_doctorWorkloadRepository.GetAll().Any(doctorworkloadLambda))
{
return ResponseOutput.NotOk("This type of data can only have one");
}
}
var workLoad = _mapper.Map(workLoadAddOrUpdateModel);
workLoad.YearMonth = yearMonthStr;
_doctorWorkloadRepository.Add(workLoad);
_enrollRepository.Update(
t => t.DoctorId == workLoadAddOrUpdateModel.DoctorId && t.TrialId == workLoadAddOrUpdateModel.TrialId, u => new Enroll()
{
EnrollStatus = (int)EnrollStatus.DoctorReading,
UpdateTime = DateTime.Now
});
var success = _doctorWorkloadRepository.SaveChanges();
return ResponseOutput.Result(success, workLoad.Id);
}
else
{
//判断是否已经被锁定
var isLocked = _costStatisticsRepository.GetAll().Any(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 = _doctorWorkloadRepository.Update(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);
}
}
///
/// 删除工作量
///
public IResponseOutput DeleteWorkload(Guid workloadId)
{
return ResponseOutput.Result(_doctorWorkloadRepository.Delete(t => t.Id == workloadId));
}
///
/// 获取工作量详情(用于判断工作量锁定时,调用)
///
public WorkloadDTO GetWorkloadDetailById(Guid id)
{
var workload = _doctorWorkloadRepository.FindSingleOrDefault(u => u.Id == id);
return _mapper.Map(workload);
}
#endregion
private PageOutput BuildFullData(
List workLoadList, WorkLoadStatsQueryDTO workLoadSearch)
{
var doctor = _doctorRepository.GetAll().Where(t => t.Id == workLoadSearch.DoctorId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefault();
//查询 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.Code
});
}
}
}
}
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.Code
});
}
}
}
}
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.Code
});
}
}
}
}
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(1, workLoadList.Count,
workLoadList.Count, workLoadList);
}
}
}