public List <TimeCheckResult> GetUnwriteDoc(string szPatientID, string szVisitID) { TimeCheckQuery timeCheckQuery = new TimeCheckQuery(); timeCheckQuery.PatientID = szPatientID; timeCheckQuery.VisitID = szVisitID; this.PerformTimeCheck(timeCheckQuery); List <TimeCheckResult> lstCheckResults = this.TimeCheckResults; List <TimeCheckResult> m_lstUnWriteResults = new List <TimeCheckResult>(); for (int index = 0; index < lstCheckResults.Count; index++) { TimeCheckResult resultInfo = lstCheckResults[index]; if (resultInfo.WrittenState == WrittenState.Unwrite) { m_lstUnWriteResults.Add(resultInfo); } } return(m_lstUnWriteResults); }
public short GenerateTimeRecord(PatVisitInfo item, DateTime now) { short shRet = SystemData.ReturnValue.OK; if (string.IsNullOrEmpty(item.INCHARGE_DOCTOR)) { string szDoctorIncharge = string.Empty; //通过病人视图无法取到责任医生,由于首页未录入造成,通过最近书写的一份文书去取 shRet = EmrDocAccess.Instance.GetDoctorInChargeByEmrDoc(item.PATIENT_ID, item.VISIT_ID, ref szDoctorIncharge); if (shRet == SystemData.ReturnValue.OK) { item.INCHARGE_DOCTOR = szDoctorIncharge; } } TimeCheckQuery timeCheckQuery = new TimeCheckQuery(); timeCheckQuery.PatientID = item.PATIENT_ID; //timeCheckQuery.VisitID = item.VISIT_ID; //timeCheckQuery.VisitID = SystemParam.Instance.PatVisitLog.VISIT_ID; //编辑器VISIT_NO=VISIT_ID timeCheckQuery.VisitID = item.VISIT_NO; timeCheckQuery.VisitNO = item.VISIT_NO; timeCheckQuery.PatientName = item.PATIENT_NAME; timeCheckQuery.DeptCode = item.DEPT_CODE; try { TimeCheckEngine.Instance.PerformTimeCheck(timeCheckQuery); } catch (Exception ex) { LogManager.Instance.WriteLog("TimeCheckEngine.Instance.PerformTimeCheck 时效接口调用失败", ex); return(SystemData.ReturnValue.EXCEPTION); } //获取已经保存在数据库QC_TIME_RECORD_T表里面的时效结果 List <QcTimeRecord> lstExitQCTimeRecord = new List <QcTimeRecord>(); QcTimeRecordAccess.Instance.GetQcTimeRecords(item.PATIENT_ID, item.VISIT_ID, ref lstExitQCTimeRecord); //保存时效质控分析结果 List <TimeCheckResult> lstCheckResults = TimeCheckEngine.Instance.TimeCheckResults; if (lstCheckResults == null) { return(SystemData.ReturnValue.RES_NO_FOUND); } List <QcTimeRecord> lstQcTimeRecord = new List <QcTimeRecord>(); for (int index = 0; index < lstCheckResults.Count; index++) { QcTimeRecord qcTimeRecord = new QcTimeRecord(); TimeCheckResult resultInfo = lstCheckResults[index]; resultInfo.VisitID = item.VISIT_ID; qcTimeRecord.BeginDate = resultInfo.StartTime; qcTimeRecord.CheckDate = now; qcTimeRecord.CheckName = "系统自动"; qcTimeRecord.CreateID = resultInfo.CreatorID; qcTimeRecord.CreateName = resultInfo.CreatorName; qcTimeRecord.DeptInCharge = item.DEPT_CODE; qcTimeRecord.DeptStayed = item.DEPT_NAME; qcTimeRecord.DocID = resultInfo.DocID; qcTimeRecord.DocTitle = resultInfo.DocTitle; qcTimeRecord.DoctorInCharge = item.INCHARGE_DOCTOR; qcTimeRecord.DocTypeID = resultInfo.DocTypeID; qcTimeRecord.DocTypeName = resultInfo.DocTypeName; qcTimeRecord.EndDate = resultInfo.EndTime; qcTimeRecord.EventID = resultInfo.EventID; qcTimeRecord.EventName = resultInfo.EventName; qcTimeRecord.EventTime = resultInfo.EventTime; qcTimeRecord.PatientID = item.PATIENT_ID; qcTimeRecord.PatientName = item.PATIENT_NAME; qcTimeRecord.Point = resultInfo.QCScore; qcTimeRecord.DischargeTime = item.DISCHARGE_TIME; qcTimeRecord.QcExplain = resultInfo.ResultDesc; qcTimeRecord.IsVeto = resultInfo.IsVeto; if (resultInfo.WrittenState == WrittenState.Early) { qcTimeRecord.QcResult = SystemData.WrittenState.Early; } if (resultInfo.WrittenState == WrittenState.Normal) { qcTimeRecord.QcResult = SystemData.WrittenState.Normal; } if (resultInfo.WrittenState == WrittenState.Timeout) { qcTimeRecord.QcResult = SystemData.WrittenState.Timeout; } if (resultInfo.WrittenState == WrittenState.Unwrite) { //根据海总需求,将未书写的文书分成两种状态:一种是未书写,另一种是正常未书写。第一种代表已经超时了,需要进行扣分。 if (resultInfo.EndTime < now) { //病历未书写超过截止时间,状态为未书写超时 qcTimeRecord.QcResult = SystemData.WrittenState.Unwrite; } else { qcTimeRecord.QcResult = SystemData.WrittenState.UnwriteNormal; } } // qcTimeRecord.QcResult = SystemData.WrittenState.Unwrite; qcTimeRecord.RecNo = "0"; //未做处理 qcTimeRecord.RecordTime = resultInfo.RecordTime; qcTimeRecord.DocTime = resultInfo.DocTime; qcTimeRecord.VisitID = resultInfo.VisitID; if (!resultInfo.IsRepeat) { qcTimeRecord.QcExplain = string.Format("病人{0}{1},{2}内书写{3}" , resultInfo.EventTime.ToString("yyyy-M-d HH:mm") , resultInfo.EventName, resultInfo.WrittenPeriod, resultInfo.DocTypeName); } else { qcTimeRecord.QcExplain = string.Format("病人{0}{1},每{2}书写一次{3}" , resultInfo.EventTime.ToString("yyyy-M-d HH:mm") , resultInfo.EventName, resultInfo.WrittenPeriod, resultInfo.DocTypeName); } //判断是否已短信通知,海总需求:时效记录已存在的会写入个人统计表,进行短信通知,所以主键相同的已存数据将标记为短信通知,通过该字段避免写入统计到个人的表从而解决重复短信发送的问题。 if (lstExitQCTimeRecord != null && lstExitQCTimeRecord.Count > 0) { foreach (QcTimeRecord exitTimeRecord in lstExitQCTimeRecord) { //QCTimeRecord主键为PatientId,VisitID,DocTypeID,BeginDate,EndDate,QcResult,EventTime if (exitTimeRecord.PatientID == qcTimeRecord.PatientID && exitTimeRecord.VisitID == qcTimeRecord.VisitID && exitTimeRecord.DocTypeID == qcTimeRecord.DocTypeID && exitTimeRecord.BeginDate == qcTimeRecord.BeginDate && exitTimeRecord.EndDate == qcTimeRecord.EndDate && exitTimeRecord.QcResult == qcTimeRecord.QcResult && exitTimeRecord.EventTime == qcTimeRecord.EventTime) { //已存在的记录为当天的,则短信通知仍旧为未通知,主要是测试中会在当天运行两次以上 //实际情况是每日只会运行一次 if (qcTimeRecord.CheckDate.ToShortDateString() != exitTimeRecord.CheckDate.ToShortDateString()) { qcTimeRecord.MessageNotify = true; } } } } lstQcTimeRecord.Add(qcTimeRecord); } shRet = QcTimeRecordAccess.Instance.SavePatientQcTimeRecord(item.PATIENT_ID, item.VISIT_ID, lstQcTimeRecord); if (shRet != SystemData.ReturnValue.OK) { LogManager.Instance.WriteLog(string.Format("病人{0} 时效质控记录生成失败", item.PATIENT_NAME)); } return(shRet); }
/// <summary> /// 根据指定时效规则以及规则对应的时效事件执行结果,检查已写病历列表 /// </summary> /// <param name="timeQCRule">时效规则</param> /// <param name="lstTimeQCEventResults">规则对应的时效事件执行结果</param> /// <returns>已写病历列表时效检查结果</returns> public List <TimeCheckResult> CheckDocumentTime(TimeQCRule timeQCRule , List <TimeQCEventResult> lstTimeQCEventResults) { if (timeQCRule == null || string.IsNullOrEmpty(timeQCRule.DocTypeID)) { return(null); } //获取时效事件名称等信息 TimeQCEvent timeQCEvent = TimeEventHandler.Instance.GetTimeQCEvent(timeQCRule.EventID); if (timeQCEvent == null) { return(null); } //创建应书写的病历时间表 List <TimeCheckResult> lstTimeCheckResults = this.CreateTimeCheckTable(timeQCRule, lstTimeQCEventResults); if (lstTimeCheckResults == null || lstTimeCheckResults.Count <= 0) { return(null); } //附加本规则未书写的病历数到未写病历计数器 TimeCheckEngine.Instance.UnwriteCount += lstTimeCheckResults.Count; List <MedDocInfo> lstDocInfos = null; for (int index = 0; index < lstTimeCheckResults.Count; index++) { TimeCheckResult timeCheckResult = lstTimeCheckResults[index]; if (timeCheckResult == null) { continue; } timeCheckResult.EventID = timeQCEvent.EventID; timeCheckResult.EventName = timeQCEvent.EventName; timeCheckResult.IsVeto = timeQCRule.IsVeto; //查找当前时效检查表记录对应的文档 string szDocTypeIDList = timeCheckResult.DocTypeID; lstDocInfos = this.GetDocumentList(szDocTypeIDList); if (lstDocInfos == null || lstDocInfos.Count <= 0) { timeCheckResult.WrittenState = WrittenState.Unwrite; continue; } lstDocInfos.Sort(this.CompareByDocTime); //核对病历内部时间以及实际书写时间 for (int nDocIndex = 0; nDocIndex < lstDocInfos.Count; nDocIndex++) { MedDocInfo docInfo = lstDocInfos[nDocIndex]; //RecordTime作为文档补写依据。文档内部时间在时效规则开始时间和截止时间之间的作为补写文档 //然后通过DocTime文档的真实时间来判断超时情况。 if (docInfo.RECORD_TIME != docInfo.DefaultTime && timeCheckResult.IsRepeat && (docInfo.RECORD_TIME < timeCheckResult.StartTime || docInfo.RECORD_TIME > timeCheckResult.EndTime)) { continue; } if (timeCheckResult.EventTime > docInfo.DOC_TIME && timeCheckResult.EventTime.AddHours(-3) > docInfo.RECORD_TIME && (docInfo.DOC_TITLE.Contains("首次病程记录") || docInfo.DOC_TITLE.Contains("手术记录") || docInfo.DOC_TITLE.Contains("术后"))) { continue; } if ((docInfo.DOC_TITLE.Contains("术前小结") || docInfo.DOC_TITLE.Contains("术前讨论")) && timeCheckResult.EventTime > docInfo.RECORD_TIME.AddDays(3)) { //术前三天以上的术前讨论和术前小结,不作为本次手术的文档 continue; } long nCurrSpan = timeCheckResult.TimeSpan(docInfo); //DocTime-StartTime if (nCurrSpan < 0) { timeCheckResult.WrittenState = WrittenState.Early; } else if (docInfo.DOC_TIME.CompareTo(timeCheckResult.EndTime) <= 0) { timeCheckResult.WrittenState = WrittenState.Normal; } else { timeCheckResult.WrittenState = WrittenState.Timeout; } timeCheckResult.DocTime = docInfo.DOC_TIME; timeCheckResult.RecordTime = docInfo.RECORD_TIME; timeCheckResult.DocID = docInfo.DOC_ID; timeCheckResult.CreatorName = docInfo.CREATOR_NAME; timeCheckResult.CreatorID = docInfo.CREATOR_ID; break; } } //病历书写情况统计 foreach (TimeCheckResult result in lstTimeCheckResults) { switch (result.WrittenState) { case WrittenState.Early: TimeCheckEngine.Instance.EarlyCount += 1; break; case WrittenState.Normal: TimeCheckEngine.Instance.NormalCount += 1; break; case WrittenState.Unwrite: TimeCheckEngine.Instance.UnwriteCount += 1; break; case WrittenState.Timeout: TimeCheckEngine.Instance.TimeoutCount += 1; break; case WrittenState.Uncheck: result.WrittenState = WrittenState.Unwrite; break; default: break; } } return(lstTimeCheckResults); }
/// <summary> /// 创建一张病历正常书写的用于比对的时效检查时间表 /// </summary> /// <param name="timeQCRule">指定时效规则</param> /// <param name="lstTimeQCEventResults">时效事件执行结果</param> /// <returns>时效检查时间表列表</returns> private List <TimeCheckResult> CreateTimeCheckTable(TimeQCRule timeQCRule , List <TimeQCEventResult> lstTimeQCEventResults) { if (lstTimeQCEventResults == null || lstTimeQCEventResults.Count <= 0) { return(null); } if (TimeEventHandler.Instance.TimeCheckQuery == null) { return(null); } List <TimeCheckResult> lstTimeCheckResults = new List <TimeCheckResult>(); string szPatientID = TimeEventHandler.Instance.TimeCheckQuery.PatientID; string szPatientName = TimeEventHandler.Instance.TimeCheckQuery.PatientName; string szVisitID = TimeEventHandler.Instance.TimeCheckQuery.VisitID; string szBedCode = TimeEventHandler.Instance.TimeCheckQuery.BedCode; DateTime dtVisitTime = TimeEventHandler.Instance.TimeCheckQuery.VisitTime; //创建一张病历正常书写的时间表 for (int index = 0; index < lstTimeQCEventResults.Count; index++) { TimeQCEventResult timeQCEventResult = lstTimeQCEventResults[index]; if (timeQCEventResult == null) { continue; } if (!timeQCEventResult.EventTime.HasValue) { continue; } if (!timeQCEventResult.EndTime.HasValue) { continue; } DateTime dtPeriodTime = timeQCEventResult.EventTime.Value; do { TimeCheckResult timeCheckResult = new TimeCheckResult(); timeCheckResult.PatientID = szPatientID; timeCheckResult.VisitID = szVisitID; timeCheckResult.PatientName = szPatientName; timeCheckResult.DocTypeID = timeQCRule.DocTypeID; timeCheckResult.DocTypeName = timeQCRule.DocTypeName; timeCheckResult.BedCode = szBedCode; timeCheckResult.VisitTime = dtVisitTime; if (!GlobalMethods.Misc.IsEmptyString(timeQCRule.DocTypeAlias)) { timeCheckResult.DocTypeName = timeQCRule.DocTypeAlias; } timeCheckResult.DocTitle = timeCheckResult.DocTypeName; timeCheckResult.QCScore = timeQCRule.QCScore; timeCheckResult.ResultDesc = timeQCRule.RuleDesc; timeCheckResult.IsRepeat = timeQCRule.IsRepeat; timeCheckResult.IsStopRight = timeQCRule.IsStopRight; timeCheckResult.WrittenState = WrittenState.Uncheck; timeCheckResult.EventTime = timeQCEventResult.EventTime.Value; //timeCheckResult.InnerTime = timeCheckResult.DocTime; timeCheckResult.StartTime = dtPeriodTime; string szWrittenPeriod = timeQCRule.WrittenPeriod; string szPeriodDesc = null; timeCheckResult.EndTime = this.GetWrittenPeriod(szWrittenPeriod, dtPeriodTime, ref szPeriodDesc); timeCheckResult.WrittenPeriod = szPeriodDesc; timeCheckResult.DoctorLevel = timeQCEventResult.DoctorLevel; lstTimeCheckResults.Add(timeCheckResult); dtPeriodTime = timeCheckResult.EndTime; } while (timeQCRule.IsRepeat && dtPeriodTime < timeQCEventResult.EndTime && dtPeriodTime < timeQCRule.ValidateTime); //当转院,死亡等事件发生后, //不用再循环创建应书写病历,所以需要 dtPeriodTime < timeQCEventResult.EndTime(timeQCEventResult.EndTime:转院或死亡等事件发生时间) //while (timeQCRule.IsRepeat && dtPeriodTime < timeQCEventResult.EndTime && (!IsRuleAsDocCommited || (IsRuleAsDocCommited && dtPeriodTime < timeQCRule.ValidateTime))); } return(lstTimeCheckResults); }