using IRaCIS.Application.Contracts; using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Domain.Share; using Microsoft.AspNetCore.Mvc; using IRaCIS.Core.Application.Contracts.DTO; using IRaCIS.Application.Interfaces; using Magicodes.ExporterAndImporter.Core; using Magicodes.ExporterAndImporter.Excel; using Magicodes.ExporterAndImporter.Excel.AspNetCore; namespace IRaCIS.Application.Services { [ApiExplorerSettings(GroupName = "Trial")] public class TrialMaintenanceService : BaseService, ITrialMaintenanceService { private readonly IRepository _trialUseRepository; private readonly IRepository _trialRepository; public TrialMaintenanceService(IRepository trialUseRepository, IRepository trialRepository) { _trialUseRepository = trialUseRepository; _trialRepository = trialRepository; } /// /// Setting页面 获取项目参与人员列表 /// /// /// [HttpPost] public async Task> GetMaintenanceUserList(TrialMaintenanceQuery param) { var query = _trialUseRepository.Where(t => t.TrialId == param.TrialId).IgnoreQueryFilters() .WhereIf(param.UserTypeId != null, t => t.User.UserTypeId == param.UserTypeId) .WhereIf(!string.IsNullOrWhiteSpace(param.UserName), t => t.User.UserName.Contains(param.UserName)) .WhereIf(param.IsDeleted != null, t => t.IsDeleted == param.IsDeleted) .WhereIf(!string.IsNullOrWhiteSpace(param.OrganizationName), t => t.User.OrganizationName.Contains(param.OrganizationName)) .WhereIf(!string.IsNullOrWhiteSpace(param.UserRealName), t => (t.User.LastName + " / " + t.User.FirstName).Contains(param.UserRealName)) .ProjectTo(_mapper.ConfigurationProvider); return await query.ToPagedListAsync(param.PageIndex, param.PageSize, string.IsNullOrWhiteSpace(param.SortField) ? "UpdateTime" : param.SortField, param.Asc); } //[HttpGet] //public async Task TrialUserListExport(Guid trialId) //{ // var exportInfo = new TrialUserExportDTO() // { // TrialInfo = await _trialRepository.ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(), // TrialUserList = await _trialUseRepository.Where(t => t.TrialId == trialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).ToListAsync() // }; // IExporter exporter = new ExcelExporter(); // ////模板路径 // //var tplPath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "ExportTemplates", // // "2020年春季教材订购明细样表.xlsx"); // ////创建Excel导出对象 // //IExportFileByTemplate exporter = new ExcelExporter(); // ////导出路径 // //var filePath = Path.Combine(Directory.GetCurrentDirectory(), nameof(ExportByTemplate_Test) + ".xlsx"); // //if (File.Exists(filePath)) File.Delete(filePath); // ////根据模板导出 // //await exporter.ExportByTemplate(filePath, // // new TextbookOrderInfo("湖南心莱信息科技有限公司", "湖南长沙岳麓区", "雪雁", "1367197xxxx", "雪雁", DateTime.Now.ToLongDateString(), // // new List() // // { // // new BookInfo(1, "0000000001", "《XX从入门到放弃》", "张三", "机械工业出版社", "3.14", 100, "备注"), // // new BookInfo(2, "0000000002", "《XX从入门到放弃》", "张三", "机械工业出版社", "3.14", 100, "备注"), // // new BookInfo(3, "0000000003", "《XX从入门到放弃》", "张三", "机械工业出版社", "3.14", 100, "备注") // // }), // // tplPath); // //var result = await exporter.ExportAsByteArray(list); // return new XlsxFileResult(bytes: result, fileDownloadName: $"检查导出_{DateTime.Now.ToString("yyyy-MM-dd:hh:mm:ss")}.xlsx"); //} /// Setting页面 为 site 勾选CRC用户列表 [HttpPost] public async Task> GetSiteCRCScreeningList(SiteCRCQuery param) { // 最开始过滤site已经选择的用户 现在又改回去。。。 var query = _trialUseRepository.Where(t => t.TrialId == param.TrialId) .Where(t => t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator) .WhereIf(param.UserTypeId != null, t => t.User.UserTypeId == param.UserTypeId) .WhereIf(!string.IsNullOrWhiteSpace(param.UserRealName), t => (t.User.LastName + " / " + t.User.FirstName).Contains(param.UserRealName)) .ProjectTo(_mapper.ConfigurationProvider, new { siteId = param.SiteId }); return await query.ToPagedListAsync(param.PageIndex, param.PageSize, string.IsNullOrWhiteSpace(param.SortField) ? "UpdateTime" : param.SortField, param.Asc); } /// Setting页面 项目参与人员勾选列表 [HttpPost] public async Task> GetTrialUserScreeningList(TrialUserQuery trialUserQuery) { //之前已经选择的用户 不放在列表中,现在又要改回去 废弃 var query = _repository.Where(t => t.UserTypeEnum != UserTypeEnum.SuperAdmin) .WhereIf(!string.IsNullOrWhiteSpace(trialUserQuery.UserRealName), t => (t.LastName + " / " + t.FirstName).Contains(trialUserQuery.UserRealName)) .WhereIf(!string.IsNullOrWhiteSpace(trialUserQuery.UserName), t => t.UserName.Contains(trialUserQuery.UserName)) //.WhereIf(!string.IsNullOrWhiteSpace(trialUserQuery.OrganizationName), t => t.OrganizationName.Contains(trialUserQuery.OrganizationName)) .WhereIf(trialUserQuery.UserTypeEnum != null, t => t.UserTypeEnum == trialUserQuery.UserTypeEnum) //.WhereIf(_userInfo.IsAdmin, t => t.UserTypeRole.Type == UserTypeGroup.TrialUser) //.WhereIf(!_userInfo.IsAdmin, t => t.UserTypeRole.Type == UserTypeGroup.TrialUser || t.UserTypeEnum != UserTypeEnum.ProjectManager) .ProjectTo(_mapper.ConfigurationProvider, new { trialId = trialUserQuery.TrialId }); return await query.ToPagedListAsync(trialUserQuery.PageIndex, trialUserQuery.PageSize, string.IsNullOrWhiteSpace(trialUserQuery.SortField) ? "UserRealName" : trialUserQuery.SortField, trialUserQuery.Asc); } /// /// Setting页面 批量添加项目参与人员 /// /// /// //[TrialAudit(AuditType.TrialAudit, AuditOptType.AddTrialStaff)] [HttpPost] [TypeFilter(typeof(TrialResourceFilter))] public async Task AddTrialUsers(TrialUserAddCommand[] userTrialCommands) { var addArray = _mapper.Map(userTrialCommands); var trialUsers = await _trialUseRepository.AddRangeAsync(addArray); foreach (var item in trialUsers) { item.JoinTime = DateTime.Now; } var success = await _repository.SaveChangesAsync(); return ResponseOutput.Result(success); } [TypeFilter(typeof(TrialResourceFilter))] [HttpPut] public async Task UpdateTrialUser(UpdateTrialUserCommand updateTrialUserCommand) { var trialUser = await _trialUseRepository.Where(t => t.Id == updateTrialUserCommand.Id, true, true).FirstOrDefaultAsync(); if (trialUser == null) return Null404NotFound(trialUser); if (updateTrialUserCommand.IsDeleted) { if (await _repository.AnyAsync(t => t.UserId == trialUser.UserId && t.TrialId == trialUser.TrialId)) { return ResponseOutput.NotOk("Participant has participated in site maintenance"); } if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC) { await _repository.UpdateFromQueryAsync(t => t.CurrentActionUserId == trialUser.UserId && t.TrialId == trialUser.TrialId && t.IsTake, u => new SubjectVisit() { CurrentActionUserId = null, CurrentActionUserExpireTime = null, IsTake = false }); } } _mapper.Map(updateTrialUserCommand, trialUser); await _repository.SaveChangesAsync(); return ResponseOutput.Ok(); } /// 项目参与人员退出 其中IQC退出 回去释放工作量 //[TrialAudit(AuditType.TrialAudit, AuditOptType.DeleteTrailStaff)] [HttpDelete, Route("{id:guid}/{trialId:guid}/{isDelete:bool}")] [TypeFilter(typeof(TrialResourceFilter))] [UnitOfWork] [Obsolete] public async Task DeleteMaintenanceUser(Guid id, bool isDelete) { var trialUser = await _trialUseRepository.AsQueryable().IgnoreQueryFilters().FirstOrDefaultAsync(t => t.Id == id); if (trialUser == null) return Null404NotFound(trialUser); if (await _repository.AnyAsync(t => t.UserId == trialUser.UserId && t.TrialId == trialUser.TrialId)) { return ResponseOutput.NotOk("Participant has participated in site maintenance"); } if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC && isDelete) { await _repository.UpdateFromQueryAsync(t => t.CurrentActionUserId == trialUser.UserId && t.TrialId == trialUser.TrialId && t.IsTake, u => new SubjectVisit() { CurrentActionUserId = null, CurrentActionUserExpireTime = null, IsTake = false }); } await _trialUseRepository.UpdateFromQueryAsync(t => t.Id == id, u => new TrialUser() { IsDeleted = isDelete, RemoveTime = isDelete ? DateTime.Now : null }); await _repository.SaveChangesAsync(); return ResponseOutput.Ok(); } } }