Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
        }