//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
//{
// ///
// /// TP、Global、AD 工作量分配查看
// ///
// [ 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 _subjectVisitRepository;
// private readonly IRepository _studyRepository;
// private readonly IRepository _doctorRepository;
// private readonly IRepository _subjectRepository;
// private readonly IRepository _siteRepository;
// private readonly IWorkloadDetailRepository _workloadDetailRepository;
// public WorkloadDistributionService(IWorkloadTPRepository workloadTpRepository,
// IWorkloadGlobalRepository workloadGlobalRepository,
// IWorkloadADRepository workloadAdRepository,
// IRepository subjectVisitRepository, IRepository studyRepository,
// IRepository doctorRepository, IRepository subjectRepository,
// IRepository siteRepository,
// IWorkloadDetailRepository workloadDetailRepository,
// IUserInfo userInfo)
// {
// _workloadTpRepository = workloadTpRepository;
// _workloadGlobalRepository = workloadGlobalRepository;
// _workloadAdRepository = workloadAdRepository;
// _subjectVisitRepository = subjectVisitRepository;
// _studyRepository = studyRepository;
// _doctorRepository = doctorRepository;
// _subjectRepository = subjectRepository;
// _siteRepository = siteRepository;
// _workloadDetailRepository = workloadDetailRepository;
// }
// ///
// /// 批量分配Tp
// ///
// ///
// ///
// [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);
// }
// ///
// /// 批量分配AD
// ///
// ///
// ///
// [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);
// }
// ///
// /// 批量分配Global
// ///
// ///
// ///
// [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 GetWorkloadGlobalList(WorkloadDistributionQueryParam param)
// {
// IQueryable query = null;
// Expression> 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> 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> 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(param.PageIndex,
// param.PageSize, count, list);
// }
// [HttpPost]
// public PageOutput GetWorkloadADList(WorkloadDistributionQueryParam param)
// {
// IQueryable query = null;
// Expression> 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> 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> 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(param.PageIndex,
// param.PageSize, count, list);
// }
// [HttpPost]
// public PageOutput GetWorkloadTPList(WorkloadDistributionQueryParam param)
// {
// IQueryable query = null;
// Expression> 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> 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> 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(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> GetWorkloadDetail(Guid workloadId)
// {
// IQueryable 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
// }));
// }
// }
//}