//-------------------------------------------------------------------- // 此代码由T4模板自动生成 byzhouhang 20210918 // 生成时间 2021-12-23 13:20:59 // 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 //-------------------------------------------------------------------- using Microsoft.AspNetCore.Mvc; using IRaCIS.Core.Domain.Share; using System.Text.RegularExpressions; using IRaCIS.Core.Infrastructure; using IRaCIS.Application.Services; using IRaCIS.Core.Application.Auth; using IRaCIS.Application.Contracts; using Microsoft.AspNetCore.Authorization; using MailKit.Security; using MimeKit; namespace IRaCIS.Core.Application.Contracts { /// /// TrialSiteSurveyService /// [ApiExplorerSettings(GroupName = "Trial")] public class TrialSiteSurveyService : BaseService, ITrialSiteSurveyService { private readonly IRepository _trialSiteSurveyRepository; private readonly IRepository _trialSiteUserSurveyRepository; private readonly IRepository _userRepository; private readonly IRepository _trialSiteRepository; public TrialSiteSurveyService(IRepository trialSiteSurveyRepository, IRepository trialSiteUserSurveyRepository, IRepository userRepository, IRepository trialSiteRepository) { _trialSiteSurveyRepository = trialSiteSurveyRepository; _trialSiteUserSurveyRepository = trialSiteUserSurveyRepository; _userRepository = userRepository; _trialSiteRepository = trialSiteRepository; } private object lockObj { get; set; } = new object(); /// /// 发送验证码 /// /// /// /// [AllowAnonymous] public async Task SendVerifyCode(SiteSurveySendVerifyCode userInfo, [FromServices] IMailVerificationService _mailVerificationService) { var verificationType = userInfo.verificationType; //检查手机或者邮箱是否有效 if (!Regex.IsMatch(userInfo.EmailOrPhone, @"/^1[34578]\d{9}$/") && !Regex.IsMatch(userInfo.EmailOrPhone, @"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$")) { throw new BusinessValidationFailedException(verificationType == VerifyType.Email ? "Please input a legal email" : "Please input a legal phone"); } //邮箱 if (verificationType == VerifyType.Email) { //验证码 6位 int verificationCode = new Random().Next(100000, 1000000); await _mailVerificationService.AnolymousSendEmail(userInfo.EmailOrPhone, verificationCode); } //手机短信 else { } return ResponseOutput.Ok(); } /// /// 验证后 如果数据库该项目不存在该邮箱 那么就插入记录 存在 /// /// /// /// /// [HttpPost] [AllowAnonymous] public async Task VerifySendCode(LoginDto userInfo, [FromServices] ITokenService _tokenService) { var isReplaceUser = !string.IsNullOrEmpty(userInfo.ReplaceUserEmailOrPhone); if (userInfo.IsUpdate && isReplaceUser && !await _trialSiteSurveyRepository.AnyAsync(t => (t.Email == userInfo.ReplaceUserEmailOrPhone || t.Phone == userInfo.ReplaceUserEmailOrPhone) && t.SiteId == userInfo.SiteId && t.TrialId == userInfo.TrialId)) { return ResponseOutput.NotOk("该项目Site不存在该交接人的调研记录,不允许选择更新"); } if (userInfo.IsUpdate && await _trialSiteSurveyRepository.AnyAsync(t => (t.Email == userInfo.EmailOrPhone || t.Phone == userInfo.EmailOrPhone) && t.SiteId == userInfo.SiteId && t.TrialId == userInfo.TrialId && t.State != TrialSiteSurveyEnum.PMCreatedAndLock)) { return ResponseOutput.NotOk("您的记录未锁定,不允许选择更新,若已经提交,可被驳回后进行操作"); } //自己的记录锁定了 只能更新自己的,不能更新别人的(但是别人能更新自己锁定的) if (userInfo.IsUpdate && userInfo.ReplaceUserEmailOrPhone != userInfo.EmailOrPhone && await _trialSiteSurveyRepository.AnyAsync(t => (t.Email == userInfo.EmailOrPhone || t.Phone == userInfo.EmailOrPhone) && t.SiteId == userInfo.SiteId && t.TrialId == userInfo.TrialId && t.State == TrialSiteSurveyEnum.PMCreatedAndLock)) { //自己的锁了 想更新别人的 return ResponseOutput.NotOk("当前Site 您的调研记录已锁定,不允许更新其他人邮箱调研记录"); } //自己的锁定了 如果有其他未锁定的,也不能更新自己的 if (userInfo.IsUpdate && userInfo.ReplaceUserEmailOrPhone == userInfo.EmailOrPhone && await _trialSiteSurveyRepository.AnyAsync(t => (t.Email == userInfo.EmailOrPhone || t.Phone == userInfo.EmailOrPhone) && t.SiteId == userInfo.SiteId && t.TrialId == userInfo.TrialId && t.State == TrialSiteSurveyEnum.PMCreatedAndLock) && await _trialSiteSurveyRepository.AnyAsync(t => (t.Email != userInfo.EmailOrPhone && t.Phone != userInfo.EmailOrPhone) && t.SiteId == userInfo.SiteId && t.TrialId == userInfo.TrialId && t.State != TrialSiteSurveyEnum.PMCreatedAndLock)) { return ResponseOutput.NotOk("当前Site 您的调研记录已锁定,也存在其他未锁定的记录,不允许更新自己的调研记录"); } ////存在未锁定的记录,却去更新已锁定的 if (userInfo.IsUpdate && userInfo.ReplaceUserEmailOrPhone != userInfo.EmailOrPhone && await _trialSiteSurveyRepository.AnyAsync(t => t.SiteId == userInfo.SiteId && t.TrialId == userInfo.TrialId && t.State != TrialSiteSurveyEnum.PMCreatedAndLock) && await _trialSiteSurveyRepository.AnyAsync(t => (t.Email == userInfo.ReplaceUserEmailOrPhone || t.Phone == userInfo.ReplaceUserEmailOrPhone) && t.SiteId == userInfo.SiteId && t.TrialId == userInfo.TrialId && t.State == TrialSiteSurveyEnum.PMCreatedAndLock) && !await _trialSiteSurveyRepository.AnyAsync(t => (t.Email == userInfo.ReplaceUserEmailOrPhone || t.Phone == userInfo.ReplaceUserEmailOrPhone) && t.SiteId == userInfo.SiteId && t.TrialId == userInfo.TrialId && t.State != TrialSiteSurveyEnum.PMCreatedAndLock) ) { return ResponseOutput.NotOk("当前Site 存在未锁定的调研记录,不允许更新已锁定邮箱的调研记录"); } //var verificationRecord = await _repository // .FirstOrDefaultAsync(t => (t.EmailOrPhone == userInfo.EmailOrPhone) && t.Code == userInfo.verificationCode && t.CodeType == userInfo.verificationType); ////检查数据库是否存在该验证码 //if (verificationRecord == null) //{ // return ResponseOutput.NotOk("Verification code error"); //} //else //{ // //检查验证码是否失效 // if (verificationRecord.ExpirationTime < DateTime.Now) // { // return ResponseOutput.NotOk("The verification code has expired"); // } // else //验证码正确 并且 没有超时 { TrialSiteSurvey dbEntity = null; //替换交接人 if (isReplaceUser) { //该交接人的记录 是否有未锁定的 有就用未锁定的,没有就用 锁定的最后一条 var noLockedLastSurvey = await _trialSiteSurveyRepository.Where(t => (t.Email == userInfo.ReplaceUserEmailOrPhone || t.Phone == userInfo.ReplaceUserEmailOrPhone) && t.SiteId == userInfo.SiteId && t.TrialId == userInfo.TrialId && t.State == TrialSiteSurveyEnum.PMCreatedAndLock == false, true) .Include(u => u.TrialSiteEquipmentSurveyList).Include(u => u.TrialSiteUserSurveyList).OrderByDescending(t => t.CreateTime).FirstOrDefaultAsync(); //都是锁定的 if (noLockedLastSurvey == null) { var latestLock = await _trialSiteSurveyRepository.Where(t => t.SiteId == userInfo.SiteId && t.TrialId == userInfo.TrialId).OrderByDescending(t => t.CreateTime).FirstOrDefaultAsync(); if (latestLock!.Email != userInfo.ReplaceUserEmailOrPhone) { return ResponseOutput.NotOk($"该邮箱{userInfo.ReplaceUserEmailOrPhone }对应的调查表不是最新锁定的记录,不允许更新!"); } var lockedLastSurvey = await _trialSiteSurveyRepository.Where(t => (t.Email == userInfo.ReplaceUserEmailOrPhone || t.Phone == userInfo.ReplaceUserEmailOrPhone) && t.SiteId == userInfo.SiteId && t.TrialId == userInfo.TrialId && t.State == TrialSiteSurveyEnum.PMCreatedAndLock == true) .Include(u => u.TrialSiteEquipmentSurveyList).Include(u => u.TrialSiteUserSurveyList).OrderByDescending(t => t.CreateTime).FirstOrDefaultAsync().IfNullThrowConvertException(); //Copy 一份 更换邮箱 var copy = lockedLastSurvey.Clone(); copy.State = TrialSiteSurveyEnum.ToSubmit; copy.Email = userInfo.EmailOrPhone; if (userInfo.ReplaceUserEmailOrPhone != userInfo.EmailOrPhone) { copy.UserName = String.Empty; copy.Phone = String.Empty; } copy.Id = Guid.Empty; copy.TrialSiteEquipmentSurveyList.ForEach(t => t.Id = Guid.Empty); copy.TrialSiteUserSurveyList.ForEach(t => t.Id = Guid.Empty); dbEntity = await _repository.AddAsync(copy); } else { //有未锁定的 更新下邮箱 noLockedLastSurvey.Email = userInfo.EmailOrPhone; noLockedLastSurvey.UserName = String.Empty; noLockedLastSurvey.Phone = String.Empty; dbEntity = noLockedLastSurvey; } ////邮箱相同的话 就是同一个人进来 copy一份 //if (userInfo.EmailOrPhone == userInfo.ReplaceUserEmailOrPhone) //{ // dbEntity = await _repository.Where(t => (t.Email == userInfo.EmailOrPhone || t.Phone == userInfo.EmailOrPhone) && t.SiteId == userInfo.SiteId && t.TrialId == userInfo.TrialId).Include(u => u.TrialSiteEquipmentSurveyList).Include(u => u.TrialSiteUserSurveyList).FirstOrDefaultAsync().IfNullThrowConvertException(); // var clone = dbEntity.Clone(); // clone.Id = Guid.Empty; // clone.TrialSiteEquipmentSurveyList.ForEach(t => t.Id = Guid.Empty); // clone.TrialSiteUserSurveyList.ForEach(t => t.Id = Guid.Empty); // clone.State = TrialSiteSurveyEnum.ToSubmit; // dbEntity = await _repository.AddAsync(clone); //} } else { var dbEntityList = await _trialSiteSurveyRepository.Where(t => t.TrialId == userInfo.TrialId && t.SiteId == userInfo.SiteId).ToListAsync(); //没有记录 new一份 if (dbEntityList.Count == 0) { dbEntity = await _repository.AddAsync(_mapper.Map(userInfo)); } else { //该site 下不存在该邮箱的记录 if (!dbEntityList.Any(t => t.Email == userInfo.EmailOrPhone || t.Phone == userInfo.EmailOrPhone)) { return ResponseOutput.NotOk("该Site下已经有其他用户已填写的调研表,您不被允许继续填写"); } //有没有该邮箱 未锁定的 var nolockEntity = dbEntityList.Where(t => t.Email == userInfo.EmailOrPhone || t.Phone == userInfo.EmailOrPhone).FirstOrDefault(t => t.State != TrialSiteSurveyEnum.PMCreatedAndLock); // 未锁定的 为空 if (nolockEntity == null) { //查看最新锁定的 dbEntity = dbEntityList.Where(t => t.Email == userInfo.EmailOrPhone || t.Phone == userInfo.EmailOrPhone).OrderByDescending(t => t.CreateTime).FirstOrDefault(t => t.State == TrialSiteSurveyEnum.PMCreatedAndLock).IfNullThrowException(); } else //有未锁定的 直接用未锁定的 { dbEntity = nolockEntity; } } //_mapper.Map(userInfo, dbEntity); } //删除验证码历史记录 await _repository.BatchDeleteAsync(t => t.EmailOrPhone == userInfo.EmailOrPhone && t.Code == userInfo.verificationCode && t.CodeType == userInfo.verificationType); await _repository.SaveChangesAsync(); return ResponseOutput.Ok(new { TrialSiteSurveyId = dbEntity!.Id, Token = _tokenService.GetToken(IRaCISClaims.Create(new UserBasicInfo() { Id = Guid.Empty, IsReviewer = false, IsAdmin = false, RealName = "SiteSurvey", UserName = "SiteSurvey", Sex = 0, //UserType = "ShareType", UserTypeEnum = UserTypeEnum.Undefined, Code = "SiteSurvey", })) }); } //} } /// /// 直接查询相关所有数据 /// /// [HttpGet("{trialId:guid}/{trialSiteSurveyId:guid}")] public async Task GetSiteSurveyInfo(Guid trialSiteSurveyId, Guid trialId) { var result = await _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId && t.TrialId == trialId) .ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); return result; } /// /// 实际这里只会是更新 添加在login的时候做了 /// /// /// public async Task AddOrUpdateTrialSiteSurvey(TrialSiteSurveyAddOrEdit addOrEditTrialSiteSurvey) { if (addOrEditTrialSiteSurvey.Id != null) { if (await _trialSiteSurveyRepository.AnyAsync(t => t.Id == addOrEditTrialSiteSurvey.Id && t.State == TrialSiteSurveyEnum.PMCreatedAndLock)) { return ResponseOutput.NotOk("已锁定,不允许操作"); } } var entity = await _trialSiteSurveyRepository.InsertOrUpdateAsync(addOrEditTrialSiteSurvey, true); return ResponseOutput.Ok(entity.Id.ToString()); } /// /// 删除调研表 /// /// /// [HttpDelete("{trialSiteSurveyId:guid}/{trialId:guid}")] public async Task DeleteTrialSiteSurvey(Guid trialSiteSurveyId) { if (await _trialSiteSurveyRepository.AnyAsync(t => t.Id == trialSiteSurveyId && t.State == TrialSiteSurveyEnum.PMCreatedAndLock)) { return ResponseOutput.NotOk("已锁定,不允许操作"); } var success = await _trialSiteSurveyRepository.BatchDeleteAsync(t => t.Id == trialSiteSurveyId); return ResponseOutput.Result(success); } /// /// 获取 项目 site的调研记录 New /// /// [HttpPost] public async Task> GetTrialSiteSurveyList(TrialSiteSurveyQueryDTO surveyQueryDTO) { var trialSiteSurveyQueryable = _trialSiteSurveyRepository.Where(t => t.TrialId == surveyQueryDTO.TrialId).IgnoreQueryFilters() .WhereIf(surveyQueryDTO.SiteId != null, t => t.SiteId == surveyQueryDTO.SiteId) .WhereIf(surveyQueryDTO.IsDeleted != null, t => t.IsDeleted == surveyQueryDTO.IsDeleted) .WhereIf(!string.IsNullOrWhiteSpace(surveyQueryDTO.UserKeyInfo), t => t.UserName.Contains(surveyQueryDTO.UserKeyInfo) || t.Phone.Contains(surveyQueryDTO.UserKeyInfo) || t.Email.Contains(surveyQueryDTO.UserKeyInfo)) .WhereIf(surveyQueryDTO.State != null, t => t.State == surveyQueryDTO.State) .WhereIf(surveyQueryDTO.UpdateTimeBegin != null, t => t.UpdateTime >= surveyQueryDTO.UpdateTimeBegin) .WhereIf(surveyQueryDTO.UpdateTimeEnd != null, t => t.UpdateTime <= surveyQueryDTO.UpdateTimeEnd) .ProjectTo(_mapper.ConfigurationProvider); return await trialSiteSurveyQueryable.ToPagedListAsync(surveyQueryDTO.PageIndex, surveyQueryDTO.PageSize, surveyQueryDTO.SortField, surveyQueryDTO.Asc); } /// /// 项目Site调研用户列表 所有site的调研用户 最新的调研表的记录的用户 new /// /// public async Task> TrialSiteSurveyUserList(TrialSiteUserSurveyAllQuery queryParam) { var groupSelectIdQuery = _trialSiteSurveyRepository.Where(t => t.TrialId == queryParam.TrialId) .WhereIf(queryParam.SiteId != null, t => t.SiteId == queryParam.SiteId) .WhereIf(!string.IsNullOrEmpty(queryParam.FormWriterKeyInfo), t => (t.UserName).Contains(queryParam.FormWriterKeyInfo) || t.Email.Contains(queryParam.FormWriterKeyInfo) || t.Phone.Contains(queryParam.FormWriterKeyInfo)) .GroupBy(t => t.SiteId) .Select(g => g.OrderByDescending(u => u.CreateTime).Select(t => t.Id).First()); var query = _trialSiteUserSurveyRepository .Where(t => groupSelectIdQuery.Contains(t.TrialSiteSurveyId) ) .WhereIf(queryParam.UserTypeId != null, t => t.UserTypeId == queryParam.UserTypeId) .WhereIf(queryParam.IsGenerateAccount != null, t => t.IsGenerateAccount == queryParam.IsGenerateAccount) .WhereIf(queryParam.TrialRoleNameId != null, t => t.TrialRoleNameId == queryParam.TrialRoleNameId) .WhereIf(queryParam.State != null && queryParam.State != TrialSiteUserStateEnum.OverTime, t => t.InviteState == queryParam.State) .WhereIf(queryParam.State != null && queryParam.State == TrialSiteUserStateEnum.OverTime, t => t.InviteState == TrialSiteUserStateEnum.HasSend && t.ExpireTime < DateTime.Now) .WhereIf(!string.IsNullOrEmpty(queryParam.UserName), t => (t.LastName + " / " + t.FirstName).Contains(queryParam.UserName) ) .WhereIf(!string.IsNullOrEmpty(queryParam.OrganizationName), t => t.OrganizationName.Contains(queryParam.OrganizationName)) .ProjectTo(_mapper.ConfigurationProvider); //var query = _trialSiteSurveyRepository.Where(t => t.TrialId == queryParam.TrialId && t.IsAbandon == false) // .WhereIf(queryParam.SiteId != null, t => t.SiteId == queryParam.SiteId) // .WhereIf(!string.IsNullOrEmpty(queryParam.FormWriterKeyInfo), t => (t.UserName).Contains(queryParam.FormWriterKeyInfo) || t.Email.Contains(queryParam.FormWriterKeyInfo) || t.Phone.Contains(queryParam.FormWriterKeyInfo)) // .GroupBy(t => t.SiteId) // .Select(g => g.OrderByDescending(u => u.CreateTime).FirstOrDefault()) // .SelectMany(t => t.TrialSiteUserSurveyList) //.WhereIf(queryParam.UserTypeId != null, t => t.UserTypeId == queryParam.UserTypeId) //.WhereIf(queryParam.IsGenerateAccount != null, t => t.IsGenerateAccount == queryParam.IsGenerateAccount) //.WhereIf(queryParam.TrialRoleNameId != null, t => t.TrialRoleNameId == queryParam.TrialRoleNameId) //.WhereIf(queryParam.State != null && queryParam.State != TrialSiteUserStateEnum.OverTime, t => t.InviteState == queryParam.State) //.WhereIf(queryParam.State != null && queryParam.State == TrialSiteUserStateEnum.OverTime, t => t.InviteState == TrialSiteUserStateEnum.HasSend && t.ExpireTime < DateTime.Now) //.WhereIf(!string.IsNullOrEmpty(queryParam.UserKeyInfo), t => (t.LastName + " / " + t.FirstName).Contains(queryParam.UserKeyInfo) || t.Email.Contains(queryParam.UserKeyInfo) || t.Phone.Contains(queryParam.UserKeyInfo)) //.ProjectTo(_mapper.ConfigurationProvider); return await query.ToPagedListAsync(queryParam.PageIndex, queryParam.PageSize, queryParam.SortField, queryParam.Asc); //return await query.ToPagedListAsync(queryParam.PageIndex, queryParam.PageSize, queryParam.SortField, queryParam.Asc); } /// /// 初始登陆界面 项目基本信息+下拉框数据 /// /// /// [AllowAnonymous] [HttpGet("{trialId:guid}")] public async Task GetTrialSurveyInitInfo(Guid trialId) { var info = await _repository.Where(t => t.Id == trialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); return info; } /// /// 驳回 New /// /// public async Task SubmissionRejection(TrialSiteSubmitBackCommand trialSiteSubmitBackCommand) { var trialSiteSurveyId = trialSiteSubmitBackCommand.TrialSiteSurveyId; var survey = await _trialSiteSurveyRepository.FirstOrDefaultAsync(t => t.Id == trialSiteSurveyId); survey.LatestBackReason = trialSiteSubmitBackCommand.LatestBackReason; User user = null; var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //主题 messageToSend.Subject = "GRR Site survey ( Rejection )"; if (await _repository.AnyAsync(t => t.State == TrialSiteSurveyEnum.PMCreatedAndLock && t.Id == trialSiteSurveyId)) { return ResponseOutput.NotOk("已锁定,不允许操作"); } if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM) { //SPM 给填表人发 messageToSend.To.Add(new MailboxAddress(String.Empty, survey.Email)); survey.State = TrialSiteSurveyEnum.ToSubmit; } else if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM) { var hasSPMOrCPM = await _trialSiteSurveyRepository.AnyAsync(t => t.TrialId == trialSiteSubmitBackCommand.TrialId && t.Trial.TrialUserList.Any(u => u.User.UserTypeEnum == UserTypeEnum.SPM || u.User.UserTypeEnum == UserTypeEnum.CPM)); if (hasSPMOrCPM) { //PM 给SPM发 (初审人) user = await _userRepository.FirstOrDefaultAsync(t => t.Id == survey.PreliminaryUserId); messageToSend.To.Add(new MailboxAddress(String.Empty, survey.PreliminaryUserId == null ? survey.Email : user.EMail)); survey.State = TrialSiteSurveyEnum.CRCSubmitted; survey.ReviewerUserId = null; survey.ReviewerTime = null; } else { //没有SPM 给填表人发 messageToSend.To.Add(new MailboxAddress(String.Empty, survey.Email)); survey.State = TrialSiteSurveyEnum.ToSubmit; survey.PreliminaryUserId = null; survey.ReviewerUserId = null; survey.PreliminaryTime = null; survey.ReviewerTime = null; } } var builder = new BodyBuilder(); var trialInfo = await _repository.FirstOrDefaultAsync(t => t.Id == trialSiteSubmitBackCommand.TrialId); var siteInfo = await _trialSiteRepository.FirstOrDefaultAsync(t => t.TrialId == trialSiteSubmitBackCommand.TrialId && t.SiteId == survey.SiteId, true); builder.HtmlBody = @$"
{ (user == null ? survey.UserName : user.LastName + "/ " + user.FirstName)}:
您好, 您填写的中心调研表被驳回,详细信息如下:
项目编号: {trialInfo.TrialCode}
试验方案号: {trialInfo.ResearchProgramNo}
试验名称: {trialInfo.ExperimentName}
中心编号: {siteInfo.TrialSiteCode}
中心名称: {siteInfo.TrialSiteAliasName}
驳回原因: {survey.LatestBackReason}
"; messageToSend.Body = builder.ToMessageBody(); using (var smtp = new MailKit.Net.Smtp.SmtpClient()) { smtp.ServerCertificateValidationCallback = (s, c, h, e) => true; await smtp.ConnectAsync("smtp.163.com", 25, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH"); await smtp.SendAsync(messageToSend); await smtp.DisconnectAsync(true); } await _trialSiteSurveyRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } /// /// 驳回 /// /// /// /// [HttpPut("{trialId:guid}/{trialSiteSurveyId:guid}")] [Obsolete] public async Task SubmissionRejection(Guid trialId, Guid trialSiteSurveyId) { if (await _repository.AnyAsync(t => t.State == TrialSiteSurveyEnum.PMCreatedAndLock && t.Id == trialSiteSurveyId)) { return ResponseOutput.NotOk("已锁定,不允许操作"); } if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM) { await _repository.BatchUpdateAsync(t => t.Id == trialSiteSurveyId, u => new TrialSiteSurvey() { State = TrialSiteSurveyEnum.ToSubmit }); } else if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM) { var hasSPMOrCPM = await _trialSiteSurveyRepository.AnyAsync(t => t.TrialId == trialId && t.Trial.TrialUserList.Any(u => u.User.UserTypeEnum == UserTypeEnum.SPM || u.User.UserTypeEnum == UserTypeEnum.CPM)); if (hasSPMOrCPM) { await _trialSiteSurveyRepository.BatchUpdateAsync(t => t.Id == trialSiteSurveyId, u => new TrialSiteSurvey() { State = TrialSiteSurveyEnum.CRCSubmitted }); } else { await _trialSiteSurveyRepository.BatchUpdateAsync(t => t.Id == trialSiteSurveyId, u => new TrialSiteSurvey() { State = TrialSiteSurveyEnum.ToSubmit }); } } return ResponseOutput.Ok(); } [HttpPut("{trialId:guid}/{trialSiteSurveyId:guid}")] public async Task AbandonSiteSurvey(Guid trialSiteSurveyId) { var survey = (await _trialSiteSurveyRepository.FirstOrDefaultAsync(t => t.Id == trialSiteSurveyId,true)).IfNullThrowConvertException(); if (survey.State != TrialSiteSurveyEnum.ToSubmit) { return ResponseOutput.NotOk("只允许废除未提交的记录"); } survey.IsDeleted = true; await _repository.SaveChangesAsync(); return ResponseOutput.Ok(); } public async Task SendInviteEmail(InviteEmailCommand inviteEmailCommand) { var trialInfo = await _repository.FirstOrDefaultAsync(t => t.Id == inviteEmailCommand.TrialId); foreach (var item in inviteEmailCommand.UserList) { var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(String.Empty, item.Email)); //主题 messageToSend.Subject = "GRR Site survey (Trial Invite)"; var builder = new BodyBuilder(); //找下系统中是否存在该用户类型的 并且邮箱 或者手机的账户 var sysUserInfo = await _userRepository.Where(t => t.UserTypeId == item.UserTypeId && t.EMail == item.Email).Include(t => t.UserTypeRole).FirstOrDefaultAsync(); //int verificationCode = new Random().Next(100000, 1000000); //var baseApiUrl = baseUrl.Remove(baseUrl.IndexOf("#")) + "api"; if (sysUserInfo == null) { lock (lockObj) { var saveItem = _mapper.Map(item); saveItem.Code = _userRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1; saveItem.UserCode = AppSettings.UserCodePrefix + saveItem.Code.ToString("D4"); saveItem.UserName = saveItem.UserCode; saveItem.UserTypeEnum = _repository.Where(t => t.Id == saveItem.UserTypeId).Select(t => t.UserTypeEnum).First(); //saveItem.Password = MD5Helper.Md5(verificationCode.ToString()); _ = _repository.AddAsync(saveItem).Result; _ = _repository.SaveChangesAsync().Result; sysUserInfo = saveItem; } } builder.HtmlBody = @$"
{sysUserInfo.LastName + "/" + sysUserInfo.FirstName}:
您好,展影医疗作为 实验方案号:{trialInfo.ResearchProgramNo} 项目的IRC供应商,诚邀您参加该项目IRC相关工作,欢迎您提供指导和建议,非常感谢!
查看并确认
"; messageToSend.Body = builder.ToMessageBody(); using (var smtp = new MailKit.Net.Smtp.SmtpClient()) { smtp.ServerCertificateValidationCallback = (s, c, h, e) => true; smtp.MessageSent += (sender, args) => { _ = _trialSiteUserSurveyRepository.BatchUpdateAsync(t => t.Id == item.Id, u => new TrialSiteUserSurvey() { IsGenerateSuccess = true, InviteState = TrialSiteUserStateEnum.HasSend, IsJoin = null, ConfirmTime = null, RejectReason = String.Empty, SystemUserId = sysUserInfo.Id, ExpireTime = DateTime.Now.AddDays(7) }).Result; }; await smtp.ConnectAsync("smtp.163.com", 25, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH"); await smtp.SendAsync(messageToSend); await smtp.DisconnectAsync(true); } } return ResponseOutput.Ok(); } /// /// 提交 后台自动识别是谁提交 /// /// /// //[TypeFilter(typeof(TrialResourceFilter))] [HttpPost] public async Task TrialSurveySubmit(TrialSiteSurvyeSubmitDTO siteSurvyeSubmit) { var trialId = siteSurvyeSubmit.TrialId; var trialSiteSurveyId = siteSurvyeSubmit.TrialSiteSurveyId; if (_userInfo.IsAdmin) { return ResponseOutput.NotOk("不允许Admin操作"); } if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.Undefined) { var hasSPMOrCPM = await _trialSiteSurveyRepository.AnyAsync(t => t.TrialId == trialId && t.Trial.TrialUserList.Any(u => u.User.UserTypeEnum == UserTypeEnum.SPM || u.User.UserTypeEnum == UserTypeEnum.CPM)); if (hasSPMOrCPM) { await _trialSiteSurveyRepository.BatchUpdateAsync(t => t.Id == trialSiteSurveyId && t.State == TrialSiteSurveyEnum.ToSubmit, u => new TrialSiteSurvey() { State = TrialSiteSurveyEnum.CRCSubmitted }); } else { await _trialSiteSurveyRepository.BatchUpdateAsync(t => t.Id == trialSiteSurveyId && t.State == TrialSiteSurveyEnum.ToSubmit, u => new TrialSiteSurvey() { State = TrialSiteSurveyEnum.SPMApproved }); } } else if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM) { await _trialSiteSurveyRepository.BatchUpdateAsync(t => t.Id == trialSiteSurveyId && t.State == TrialSiteSurveyEnum.CRCSubmitted, u => new TrialSiteSurvey() { State = TrialSiteSurveyEnum.SPMApproved, PreliminaryUserId = _userInfo.Id, PreliminaryTime = DateTime.Now }); } else if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager) { var trialSiteSurvey = _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId).FirstOrDefault(); if (trialSiteSurvey == null) return Null404NotFound(trialSiteSurvey); //已生成的不管 管的只需要是 生成失败的并且需要生成账号的 var needGenerateList = _trialSiteUserSurveyRepository.Where(t => t.TrialSiteSurveyId == trialSiteSurveyId && t.IsGenerateAccount && t.IsGenerateSuccess == false).ProjectTo(_mapper.ConfigurationProvider).ToList(); await SendInviteEmail(new InviteEmailCommand() { TrialId = trialId, RouteUrl = siteSurvyeSubmit.RouteUrl, UserList = needGenerateList }); await _trialSiteSurveyRepository.BatchUpdateAsync(t => t.Id == trialSiteSurveyId && t.State == TrialSiteSurveyEnum.SPMApproved, u => new TrialSiteSurvey() { State = TrialSiteSurveyEnum.PMCreatedAndLock, ReviewerUserId = _userInfo.Id, ReviewerTime = DateTime.Now }); } return ResponseOutput.Ok(); } } }