234 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
| //using IRaCIS.Core.Application.MediatR.CommandAndQueries;
 | |
| //using MediatR;
 | |
| //using System.Threading;
 | |
| //using System.Threading.Tasks;
 | |
| //using IRaCIS.Core.Domain.Share;
 | |
| //using IRaCIS.Core.Infra.EFCore;
 | |
| //using IRaCIS.Core.Domain.Models;
 | |
| //using System.Linq;
 | |
| //using System;
 | |
| 
 | |
| 
 | |
| //namespace IRaCIS.Core.Application.MediatR.Handlers
 | |
| //{
 | |
| 
 | |
| //    public class QAMessageHandler : IRequestHandler<QAMessageRequest, bool>
 | |
| //    {
 | |
| //        private readonly IRepository<TrialUser> _userTrialRepository;
 | |
| //        private readonly IRepository<TrialSiteUser> _userTrialSiteRepository;
 | |
| //        private readonly IRepository<DicomStudy> _studyRepository;
 | |
| //        private readonly IRepository<QANotice> _qaNoticeRepository;
 | |
| //        private readonly IUserInfo _userInfo;
 | |
| //        private readonly IRepository<QCChallenge> _qaRecordRepository;
 | |
| //        private readonly IRepository<Subject> _subjectRepository;
 | |
| //        private readonly IRepository<SubjectVisit> _subjectVisitRepository;
 | |
| 
 | |
| //        /// <summary>
 | |
| //        /// 构造函数注入
 | |
| //        /// </summary>
 | |
| 
 | |
| //        public QAMessageHandler(IRepository<DicomStudy> studyRepository, IRepository<TrialUser> userTrialRepository, IRepository<TrialSiteUser> userTrialSiteRepository, IRepository<QANotice> qaNoticeRepository, IUserInfo userInfo,
 | |
| //            IRepository<QCChallenge> qaRecordRepository, IRepository<Subject> subjectRepository, IRepository<SubjectVisit> subjectVisitRepository)
 | |
| //        {
 | |
| //            _userTrialSiteRepository = userTrialSiteRepository;
 | |
| //            _userTrialRepository = userTrialRepository;
 | |
| //            _studyRepository = studyRepository;
 | |
| //            _qaNoticeRepository = qaNoticeRepository;
 | |
| //            _userInfo = userInfo;
 | |
| //            _qaRecordRepository = qaRecordRepository;
 | |
| //            _subjectRepository = subjectRepository;
 | |
| //            _subjectVisitRepository = subjectVisitRepository;
 | |
| //        }
 | |
| 
 | |
| //        public Task<bool> Handle(QAMessageRequest request, CancellationToken cancellationToken)
 | |
| //        {
 | |
| //            var qaRecord = _qaRecordRepository.FirstOrDefault(t => t.Id == request.QCChallengeId);
 | |
| 
 | |
| //            var subjectQuery =
 | |
| //                   from sv in _subjectVisitRepository.Where(t => t.Id == qaRecord.SubjectVisitId)
 | |
| //                   join sub in _subjectRepository.AsQueryable() on sv.SubjectId equals sub.Id
 | |
| //                   select new
 | |
| //                   {
 | |
| //                       sv.VisitName,
 | |
| //                       sv.VisitNum,
 | |
| //                       SubjectName = sub.LastName + " / " + sub.FirstName,
 | |
| //                       sub.SiteId
 | |
| //                   };
 | |
| 
 | |
| //            var subject = subjectQuery.First();
 | |
| 
 | |
| 
 | |
| 
 | |
| //            //查询项目的参与者   和  负责site下CRC用户
 | |
| //            var trialUserList = _userTrialRepository.Where(t => t.TrialId == qaRecord.TrialId).ToList();
 | |
|            
 | |
| 
 | |
| //            var qaList = trialUserList.Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).ToList();
 | |
| 
 | |
| 
 | |
| //            if (request.MessageType == NoticeType.QA_AddQARecord_NoticeCRC)
 | |
| //            {
 | |
| 
 | |
| 
 | |
| //                //找出当前操作的QA   如果是pm 或者admin 代替操作 此时会有问题  所以 谁代替,就以谁的名义执行
 | |
| //                //var currentQA = qaList.First(t => t.UserId == _userInfo.Id);
 | |
| //                //var currentQA = trialUserList.First(t => t.UserId == _userInfo.Id);
 | |
| 
 | |
| //                //在项目CRC列表中筛选出  负责该study关联  site的CRC
 | |
| 
 | |
| //                var siteCRCList = _userTrialSiteRepository.Where(t =>
 | |
| //                t.SiteId == subject.SiteId && t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && t.TrialId == qaRecord.TrialId).ToList();
 | |
| 
 | |
| //                //var siteCRCList = userList.Where(t => t.SiteId == subject.SiteId && t.UserTypeEnum == UserType.ClinicalResearchCoordinator).ToList();
 | |
| 
 | |
| 
 | |
| //                var notice = new QANotice()
 | |
| //                {
 | |
| //                    TrialId = qaRecord.TrialId,
 | |
| //                    SubjectVisitId = qaRecord.SubjectVisitId,
 | |
|                    
 | |
| //                    FromUser = _userInfo.RealName,
 | |
| //                    FromUserId = _userInfo.Id,
 | |
| //                    FromUserType = _userInfo.UserTypeShortName,
 | |
| //                    NoticeTypeEnum = NoticeType.QA_AddQARecord_NoticeCRC,
 | |
| //                    NeedDeal = true,
 | |
| //                    Message = $"QA -> CRC : {_userInfo.RealName} add QA Record",
 | |
| //                    SendTime = DateTime.Now,
 | |
| 
 | |
| //                    RelationId = request.QCChallengeId
 | |
| //                };
 | |
| 
 | |
| //                siteCRCList.ForEach(t => notice.QANoticeUserList.Add(new QANoticeUser()
 | |
| //                {
 | |
| //                    QANoticeId = notice.Id,
 | |
| //                    SubjectVisitId = qaRecord.SubjectVisitId,
 | |
| //                    ToUser = t.User.LastName + " / " + t.User.FirstName,
 | |
| //                    ToUserId = t.UserId,
 | |
| //                    ToUserType = t.UserTypeRole.UserTypeShortName
 | |
| //                }));
 | |
| 
 | |
| //                //添加 发送给CRC的消息  消息和CRC是 一对多
 | |
| //                _qaNoticeRepository.Add(notice);
 | |
| 
 | |
| //            }
 | |
| 
 | |
| //            else if (request.MessageType == NoticeType.QARecordDialogPost)
 | |
| //            {
 | |
| //                #region QA通知处理  新建一条QA通知消息    需要分用户类型  记录关联Id 为了删除操作
 | |
| 
 | |
| //                //CRC  =>QA
 | |
| //                if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator)
 | |
| //                {
 | |
| //                    //PM 或者admin可以代替CRC角色 不能从CRC列表中查询用户
 | |
| //                    //var currentCRC = trialUserList.First(t => t.UserId == _userInfo.Id);
 | |
| 
 | |
| //                    var notice = new QANotice()
 | |
| //                    {
 | |
| //                        TrialId = qaRecord.TrialId,
 | |
| //                        SubjectVisitId = qaRecord.SubjectVisitId,
 | |
| //                        //FromUser = currentCRC.UserRealName,
 | |
| //                        //FromUserId = _userInfo.Id,
 | |
| //                        //FromUserType = currentCRC.UserType,
 | |
| //                        FromUser = _userInfo.RealName,
 | |
| //                        FromUserId = _userInfo.Id,
 | |
| //                        FromUserType = _userInfo.UserTypeShortName,
 | |
| //                        NoticeTypeEnum = NoticeType.CRC_QARecordDialogPost_NoticeQA,
 | |
| //                        NeedDeal = true,
 | |
| //                        Message = $"CRC -> QA : {_userInfo.RealName} post or reply  message for QA record about SubjectName:{subject.SubjectName } VisitName: {subject.VisitName} VisitNum:{subject.VisitName} !",
 | |
| //                        SendTime = DateTime.Now,
 | |
| //                        RelationId = request.QCChallengeReplyId
 | |
| //                    };
 | |
| 
 | |
| //                    qaList.ForEach(t => notice.QANoticeUserList.Add(new QANoticeUser()
 | |
| //                    {
 | |
| //                        QANoticeId = notice.Id,
 | |
| //                        SubjectVisitId = qaRecord.SubjectVisitId,
 | |
| //                        ToUser = t.User.LastName + " / " + t.User.FirstName,
 | |
| //                        ToUserId = t.UserId,
 | |
| //                        ToUserType = t.User.UserTypeRole.UserTypeShortName
 | |
| //                    }));
 | |
| 
 | |
| //                    _qaNoticeRepository.Add(notice);
 | |
| 
 | |
| //                    //这里作为 设置QA  设置 Inqa 状态的回复  或者QA和CRC对话的
 | |
| //                    var needDealNoticeList = _qaNoticeRepository.AsQueryable()
 | |
| //                        .Where(t => t.SubjectVisitId == qaRecord.SubjectVisitId && t.NeedDeal && (t.NoticeTypeEnum == NoticeType.QA_InQA_NoticeCRC
 | |
| //    || t.NoticeTypeEnum == NoticeType.QA_QARecordDialogPost_NoticeCRC || t.NoticeTypeEnum == NoticeType.QA_AddQARecord_NoticeCRC)).ToList();
 | |
| 
 | |
| //                    needDealNoticeList.ForEach(t =>
 | |
| //                    {
 | |
| //                        t.NeedDeal = false;
 | |
| //                        t.DealTime = DateTime.Now;
 | |
| //                        _qaNoticeRepository.Update(t);
 | |
| //                    });
 | |
| 
 | |
| //                }
 | |
| 
 | |
| //                if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC)
 | |
| //                {
 | |
| 
 | |
| //                    //找出当前操作的QA   如果是pm 或者admin 代替操作 此时会有问题  所以 谁代替,就以谁的名义执行
 | |
| //                    //var currentQA = qaList.First(t => t.UserId == _userInfo.Id);
 | |
| //                    //var currentQA = trialUserList.First(t => t.UserId == _userInfo.Id);
 | |
| 
 | |
| //                    //在项目CRC列表中筛选出  负责该study关联  site的CRC
 | |
| //                    //var siteCRCList = userList.Where(t => t.SiteId == subject.SiteId && t.UserTypeEnum == UserType.ClinicalResearchCoordinator).ToList();
 | |
| 
 | |
| //                    var siteCRCList = _userTrialSiteRepository.Where(t =>
 | |
| //               t.SiteId == subject.SiteId && t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && t.TrialId == qaRecord.TrialId).ToList();
 | |
| 
 | |
| //                    var notice = new QANotice()
 | |
| //                    {
 | |
| //                        TrialId = qaRecord.TrialId,
 | |
| //                        SubjectVisitId = qaRecord.SubjectVisitId,
 | |
| //                        //FromUser = currentQA.UserRealName,
 | |
| //                        //FromUserId = _userInfo.Id,
 | |
| //                        //FromUserType = currentQA.UserType,
 | |
| //                        FromUser = _userInfo.RealName,
 | |
| //                        FromUserId = _userInfo.Id,
 | |
| //                        FromUserType = _userInfo.UserTypeShortName,
 | |
| //                        NoticeTypeEnum = NoticeType.QA_QARecordDialogPost_NoticeCRC,
 | |
| //                        NeedDeal = true,
 | |
| //                        Message = $"QA -> CRC : {_userInfo.RealName} post or reply  message for  QA record about SubjectName:{subject.SubjectName } VisitName: {subject.VisitName} VisitNum:{subject.VisitName} !",
 | |
| //                        SendTime = DateTime.Now,
 | |
| //                        RelationId = request.QCChallengeReplyId
 | |
| //                    };
 | |
| 
 | |
| //                    siteCRCList.ForEach(t => notice.QANoticeUserList.Add(new QANoticeUser()
 | |
| //                    {
 | |
| //                        QANoticeId = notice.Id,
 | |
| //                        SubjectVisitId = qaRecord.SubjectVisitId,
 | |
| //                        ToUser = t.User.LastName + " / " + t.User.FirstName,
 | |
| //                        ToUserId = t.UserId,
 | |
| //                        ToUserType = t.UserTypeRole.UserTypeShortName
 | |
| //                    }));
 | |
| 
 | |
| //                    //添加 发送给CRC的消息  消息和CRC是 一对多
 | |
| //                    _qaNoticeRepository.Add(notice);
 | |
| 
 | |
| //                    //这里作为  CRC post的对话的回复
 | |
| //                    var needDealNoticeList = _qaNoticeRepository.AsQueryable()
 | |
| //                        .Where(t => t.SubjectVisitId == qaRecord.SubjectVisitId && t.NeedDeal && t.NoticeTypeEnum == NoticeType.CRC_QARecordDialogPost_NoticeQA).ToList();
 | |
| 
 | |
| //                    needDealNoticeList.ForEach(t =>
 | |
| //                    {
 | |
| //                        t.NeedDeal = false;
 | |
| //                        t.DealTime = DateTime.Now;
 | |
| //                        _qaNoticeRepository.Update(t);
 | |
| //                    });
 | |
| //                }
 | |
| 
 | |
| 
 | |
| //                #endregion
 | |
| //            }
 | |
| //            else
 | |
| //            {
 | |
| 
 | |
| //            }
 | |
| 
 | |
| 
 | |
| //            return Task.FromResult(true);
 | |
| 
 | |
| //        }
 | |
| //    }
 | |
| //} |