using MediII.Adapter.ReceiveToKCModel; using MediII.Adapter.Scanner; using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Practices.EnterpriseLibrary.Data; using NHapi.Base.Parser; using MediII.Adapter.BizComponent.Base; using System.Data; using System.Diagnostics; using IL.Common; namespace MediII.Adapter.BizComponent.UE { public abstract class DefaultDBScanner : DBScaner { private int SearchNum { get { var searchNum = System.Configuration.ConfigurationManager.AppSettings["SearchNum"]; int num = 0; if (!int.TryParse(searchNum, out num)) { num = 10; } return num; } } /// /// 门诊定时类型,0=正常;>0 隔N天 /// private int OutSearchType { get { var type = System.Configuration.ConfigurationManager.AppSettings["OutSearchType"]; int rtn = 0; if (!int.TryParse(type, out rtn)) { rtn = 0; } return rtn; } } private int DFTSearchType { get { var type = System.Configuration.ConfigurationManager.AppSettings["DFTSearchType"]; int rtn = 30; if (!int.TryParse(type, out rtn)) { rtn = 30; } return rtn; } } /// /// 住院定时类型,0=正常;>0 隔N天 /// private int InSearchType { get { var type = System.Configuration.ConfigurationManager.AppSettings["InSearchType"]; int rtn = 0; if (!int.TryParse(type, out rtn)) { rtn = 0; } return rtn; } } protected override long OnDo(DateTime dtEventTime, Action setLog) { Stopwatch stopwatch = new Stopwatch(); var type = GetMessageType(); stopwatch.Start(); try { if (setLog != null) setLog(new LogModel { Message = "开始一次消息处理扫描 消息类型:" + type }); if (type == "DFT^B03[B01]") //字典解析 { var sql = @" SELECT ID,SeqNo,ChartNo,VisitNo,OtherNo1,OtherNo2,OtherNo3,OtherName,TaskType,TaskStatus, UpdateUser,UpdateTime,Reserve1,Reserve2,Reserve3,IP,MAC,BeginTime,EndTime,Result,TaskMsg,ResultTime FROM dbo.HL7_Scan WITH(NOLOCK) WHERE TaskStatus=1 AND TaskType='{0}' AND OtherNo1 <=(GETDATE()-{1}) ORDER BY SeqNo ASC"; sql = string.Format(sql, type, DFTSearchType); try { var listRow = SqlDataAccess.ExecuteSqlStringAccessor(ctx, sql).Take(1).ToList(); if (listRow.Count() > 0) { Process(listRow, setLog, type); } } catch (Exception ex) { LogHelper.LogError(ex, LogCatagories.AdapterScan); throw ex; } } else { RunExec(type, setLog); } } finally { stopwatch.Stop(); //LogHelper.LogError(string.Format("{0}耗时{1}-->{2}", type, stopwatch.Elapsed, stopwatch.ElapsedTicks), LogCatagories.AdapterScan); } return 1; } private void RunExec(string type, Action setLog) { var num = SearchNum; var orderSeq = string.Empty; var timeSeq = string.Empty; if (type == "MFN") { orderSeq = " Sequeue ASC,"; } if (type.Substring(0, 7) == "ADT^A01" || type.Substring(0, 7) == "ADT^A02") { if (InSearchType > 0) { timeSeq = string.Format(" AND OtherNo1 <=(GETDATE()-{0})", InSearchType); } } if (type.Substring(0, 7) == "ADT^A04" || type.Substring(0, 7) == "ADT^A05") { if (OutSearchType > 0) { timeSeq = string.Format(" AND OtherNo1 <=(GETDATE()-{0})", OutSearchType); } } //var sql = @"SELECT top {0} ID , SeqNo , SourceID ,MsgConID , MsgContent ,ReplyMsg , ReceivingTime , IP ,TaskStatus ,StartTime ,EndTime ,TaskIP , TaskMac ,TaskMsg ,MessageID ,MessageType ,Remark ,Sequeue FROM dbo.HL7_Receive WITH(NOLOCK) WHERE TaskStatus='1' and MessageID='{1}' ORDER BY {2} SeqNo ASC "; var sql = @" SELECT TOP {0} ID,SeqNo,ChartNo,VisitNo,OtherNo1,OtherNo2,OtherNo3,OtherName,TaskType,TaskStatus, UpdateUser,UpdateTime,Reserve1,Reserve2,Reserve3,IP,MAC,BeginTime,EndTime,Result,TaskMsg,ResultTime FROM dbo.HL7_Scan WITH(NOLOCK) WHERE TaskStatus=1 AND IP IS null AND MAC IS NULL AND TaskType='{1}' {3} ORDER BY {2} SeqNo ASC"; sql = string.Format(sql, num, type, orderSeq, timeSeq); try { var listRow = SqlDataAccess.ExecuteSqlStringAccessor(ctx, sql).Take(num).ToList(); if (listRow.Count() > 0) { Process(listRow, setLog, type); } } catch (Exception ex) { LogHelper.LogError(ex, LogCatagories.AdapterScan); throw ex; } } private void Process(IEnumerable listRow, Action setLog,string msgType) { listRow.ToList().ForEach(o => { //验证 var model = GetListRow(o.ID); if (null != model) { try { if (setLog != null) setLog(new LogModel { Message = o.VisitNo, MessageID = o.TaskType }); SetStartBiz(o.ID); //PipeParser parser = new PipeParser(); //string mesStruct = parser.GetMessageStructure(o.MsgContent).Substring(0, 3); //var behavior = BizComponentFactory.GetBizComponent(mesStruct); var behavior = BizComponentFactory.GetBizComponent(msgType.Substring(0,msgType.IndexOf('^'))); var errMsg = behavior.Process(o.VisitNo, o.TaskType,o.ID); SetEndBiz(o.ID, errMsg); } catch (Exception ex) { if (setLog != null) setLog(new LogModel { Message = o.VisitNo, MessageID = o.TaskType, ErrorMsg = "消息处理错误 :" + ex.Message }); SetEndBiz(o.ID, ex.Message); } } }); } /// /// 获取消息类型 /// /// protected abstract string GetMessageType(); /// /// 获取当前记录 /// /// id /// protected HL7_ScanEntity GetListRow(string id) { var sql = "SELECT * FROM dbo.HL7_Scan WHERE TaskStatus='1' and ID='" + id + "'"; var model = SqlDataAccess.ExecuteSqlStringAccessor(ctx, sql).Take(1).FirstOrDefault(); return model; } //开始时间 protected int SetStartBiz(string id) { var sql = "UPDATE dbo.HL7_Scan SET BeginTime=GETDATE() , TaskStatus='2',IP=@TaskIP,Mac=@TaskMac WHERE ID=@ID"; var cmd = SqlDataAccess.GetSqlStringCommand(ctx, sql); SqlDataAccess.AddInParameter(ctx, cmd, "ID", DbType.String, id); SqlDataAccess.AddInParameter(ctx, cmd, "TaskIP", DbType.String, NetHelper.GetIP()); SqlDataAccess.AddInParameter(ctx, cmd, "TaskMac", DbType.String, NetHelper.GetMacAddress()); return SqlDataAccess.ExecuteNonQuery(ctx, cmd); } //结束时间 protected int SetEndBiz(string id, string errMsg) { var sql = "UPDATE dbo.HL7_Scan SET EndTime=GETDATE(),TaskStatus=@TaskStatus,TaskMsg=@TaskMsg WHERE ID=@ID"; var cmd = SqlDataAccess.GetSqlStringCommand(ctx, sql); SqlDataAccess.AddInParameter(ctx, cmd, "ID", DbType.String, id); if (!string.IsNullOrEmpty(errMsg)) { SqlDataAccess.AddInParameter(ctx, cmd, "TaskMsg", DbType.String, errMsg); SqlDataAccess.AddInParameter(ctx, cmd, "TaskStatus", DbType.Int32, 3); } else { SqlDataAccess.AddInParameter(ctx, cmd, "TaskMsg", DbType.String, DBNull.Value); SqlDataAccess.AddInParameter(ctx, cmd, "TaskStatus", DbType.Int32, 4); } return SqlDataAccess.ExecuteNonQuery(ctx, cmd); } public void DebugMsg(IEnumerable list,string msgType) { //Process(list, null,msgType); } } }