ADT_A01B01_Handler.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Transactions;
  6. using System.Data;
  7. using System.Data.Common;
  8. using IL.Common;
  9. using System.Xml;
  10. using Microsoft.Practices.EnterpriseLibrary.Data;
  11. namespace MediII.Adapter.BizComponent.ADT
  12. {
  13. /// <summary>
  14. /// 住院就诊记录
  15. /// </summary>
  16. public class ADT_A01B01_Handler : ADTHandler
  17. {
  18. public override void Handler(string m,string ID)
  19. {
  20. var isql = @"insert into dbo.zhuyuan_original(No,patient_zyh,patient_id,RY_DATE,RY_UNIT,RY_BQ,RY_BED,CY_DATE,CY_UNIT,CY_BQ,age,patient_name,Sex,address,JG_DOCT_GH,SZ_DOCT_GH,Nurse_grade,ICD_CODE_RY1,ICD_CODE_RY2,ICD_CODE_RY3,ICD_CODE_RY4,ICD_CODE_CY1,ICD_CODE_CY2,ICD_CODE_CY3,ICD_CODE_CY4,CY_Kind) Value();";
  21. //初始化
  22. var rtnMsg = string.Empty;
  23. var msgHead = string.Empty;
  24. var msgBody = string.Empty;
  25. var resultCode = string.Empty;
  26. var result = string.Empty;
  27. WebService server = new WebService();
  28. OperateXmlUtil xmlHelper = new OperateXmlUtil();
  29. //读取配置的凭证号
  30. var cert = System.Configuration.ConfigurationManager.AppSettings["cert"];
  31. //读取就诊流水号
  32. //string visitNo = xmlHelper.XpathRead(m, "//*[@root='2.16.156.10011.2.5.1.9']", "extension");
  33. string visitNo = m;
  34. //拼接接口访问参数
  35. msgBody = xmlHelper.GetMsgBody(visitNo, "patient_zyh",index,size);
  36. msgHead = xmlHelper.GetMsgHead("getInHospitalInfo", cert);
  37. //接口访问
  38. rtnMsg = server.TestInterface(msgHead, msgBody);
  39. //存储访问记录
  40. MessageHelper.SaveSendMsg(Scanctx, ID, "ADT^A01[B01]", msgHead, msgBody, rtnMsg);
  41. //消息判断是否成功
  42. if (!xmlHelper.isSuccess(rtnMsg, ref resultCode, ref result))
  43. {
  44. throw new Exception("判断失败:"+result);
  45. }
  46. //更新发送表,保存留档
  47. //返回数据解析
  48. XmlNode root = xmlHelper.GetContentRootNode(rtnMsg);
  49. //是否出院
  50. string CheckOutDate = root.SelectSingleNode("//*[name()='cy_date']").InnerText;//CY_DATE
  51. if (!string.IsNullOrWhiteSpace(CheckOutDate))
  52. {
  53. try
  54. {
  55. DateTime OutDate = DateTime.Parse(CheckOutDate);
  56. if (OutDate < DateTime.Parse("2010-01-01") && OutDate > DateTime.Parse("2050-01-01"))
  57. {
  58. return;//返回,本次不解析
  59. }
  60. }
  61. catch
  62. {
  63. return;
  64. }
  65. }
  66. else
  67. {
  68. return;
  69. }
  70. //入院日期
  71. string CheckInDate = root.SelectSingleNode("//*[name()='ry_date']").InnerText;
  72. XmlNodeList list = root.SelectNodes("//returnContents//returnContent");
  73. /* 获取档案,如果存在出院日,再判断是否有相关消息任务进行中,如有,则不操作,如果没有,插入任务,同时更新档案
  74. Todo:
  75. * 1、判断出院日
  76. * 2、判断是否有相关任务进行中
  77. * 3、插入医嘱任务、插入费用任务
  78. * 4、更新档案
  79. */
  80. if (list.Count <= 0)
  81. return;
  82. int num = GetOriginalCount(visitNo);
  83. using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
  84. {
  85. if (num <= 0)
  86. {
  87. var ifsql = @"insert into dbo.zhuyuan_original(patient_zyh,patient_id,RY_DATE,RY_UNIT,RY_BQ,RY_BED,CY_DATE,CY_UNIT,CY_BQ,age,name,Sex,address,JG_DOCT_GH,SZ_DOCT_GH,Nurse_grade,ICD_CODE_RY1,ICD_CODE_RY2,ICD_CODE_RY3,ICD_CODE_RY4,ICD_CODE_CY1,ICD_CODE_CY2,ICD_CODE_CY3,ICD_CODE_CY4,CY_Kind) Values(
  88. @patient_zyh,@patient_id,@RY_DATE,@RY_UNIT,@RY_BQ,@RY_BED,@CY_DATE,@CY_UNIT,@CY_BQ,@age,@patient_name,@Sex,@address,@JG_DOCT_GH,@SZ_DOCT_GH,@Nurse_grade,@ICD_CODE_RY1,@ICD_CODE_RY2,@ICD_CODE_RY3,@ICD_CODE_RY4,@ICD_CODE_CY1,@ICD_CODE_CY2,@ICD_CODE_CY3,@ICD_CODE_CY4,@CY_Kind)";
  89. //住院患者基本档
  90. foreach (XmlElement xn in list)
  91. {
  92. var icmd = ctx.DBGetSqlStringCommand(ifsql);
  93. SetEntity(ctx, icmd, xn);
  94. SqlDataAccess.ExecuteNonQuery(ctx, icmd);
  95. }
  96. }
  97. else
  98. {
  99. var usql = @"update dbo.zhuyuan_original set RY_DATE=@RY_DATE,
  100. RY_UNIT=@RY_UNIT,
  101. RY_BQ=@RY_BQ,
  102. RY_BED=@RY_BED,
  103. CY_DATE=@CY_DATE,
  104. CY_UNIT=@CY_UNIT,
  105. CY_BQ=@CY_BQ,
  106. age=@age,
  107. name=@patient_name,
  108. Sex=@Sex,
  109. address=@address,
  110. JG_DOCT_GH=@JG_DOCT_GH,
  111. SZ_DOCT_GH=@SZ_DOCT_GH,
  112. Nurse_grade=@Nurse_grade,
  113. ICD_CODE_RY1=@ICD_CODE_RY1,
  114. ICD_CODE_RY2=@ICD_CODE_RY2,
  115. ICD_CODE_RY3=@ICD_CODE_RY3,
  116. ICD_CODE_RY4=@ICD_CODE_RY4,
  117. ICD_CODE_CY1=@ICD_CODE_CY1,
  118. ICD_CODE_CY2=@ICD_CODE_CY2,
  119. ICD_CODE_CY3=@ICD_CODE_CY3,
  120. ICD_CODE_CY4=@ICD_CODE_CY4,
  121. CY_Kind=@CY_Kind where patient_zyh=@patient_zyh and patient_id=@patient_id";
  122. foreach (XmlElement xn in list)
  123. {
  124. var ucmd = ctx.DBGetSqlStringCommand(usql);
  125. SetEntity(ctx, ucmd, xn);
  126. SqlDataAccess.ExecuteNonQuery(ctx, ucmd);
  127. }
  128. }
  129. scope.Complete();
  130. }
  131. using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
  132. {
  133. var sql = @"INSERT INTO HL7_Platform.dbo.HL7_Scan (ID ,ChartNo,VisitNo,OtherNo1,OtherNo2,OtherNo3,OtherName , TaskType , TaskStatus , UpdateUser , UpdateTime,Reserve1) VALUES (@ID ,@ChartNo ,@VisitNo ,@OtherNo1 , @OtherNo2 ,@OtherNo3 ,@OtherName ,@TaskType ,@TaskStatus , @UpdateUser , GETDATE(),@Reserve1)";
  134. if (GetScanTaskCount(visitNo, "ADT^A01[B02]") <= 0)
  135. {
  136. //住院处方单
  137. var ccmd = Scanctx.DBGetSqlStringCommand(sql);
  138. SqlDataAccess.AddInParameter(Scanctx, ccmd, "ID", DbType.AnsiString, Guid.NewGuid().ToString());
  139. SqlDataAccess.AddInParameter(Scanctx, ccmd, "ChartNo", DbType.AnsiString, visitNo);
  140. SqlDataAccess.AddInParameter(Scanctx, ccmd, "VisitNo", DbType.AnsiString, visitNo);
  141. SqlDataAccess.AddInParameter(Scanctx, ccmd, "OtherNo1", DbType.AnsiString, CheckInDate);
  142. SqlDataAccess.AddInParameter(Scanctx, ccmd, "OtherNo2", DbType.AnsiString, "");
  143. SqlDataAccess.AddInParameter(Scanctx, ccmd, "OtherNo3", DbType.AnsiString, "");
  144. SqlDataAccess.AddInParameter(Scanctx, ccmd, "OtherName", DbType.AnsiString, "住院处方单");
  145. SqlDataAccess.AddInParameter(Scanctx, ccmd, "TaskType", DbType.AnsiString, "ADT^A01[B02]");
  146. SqlDataAccess.AddInParameter(Scanctx, ccmd, "TaskStatus", DbType.Int32, 1);
  147. SqlDataAccess.AddInParameter(Scanctx, ccmd, "UpdateUser", DbType.AnsiString, "9999");
  148. SqlDataAccess.AddInParameter(Scanctx, ccmd, "Reserve1", DbType.AnsiString, "");
  149. SqlDataAccess.ExecuteNonQuery(Scanctx, ccmd);
  150. }
  151. if (GetScanTaskCount(visitNo, "ADT^A01[B03]") <= 0)
  152. {
  153. //住院收费数据明细
  154. var fcmd = Scanctx.DBGetSqlStringCommand(sql);
  155. SqlDataAccess.AddInParameter(Scanctx, fcmd, "ID", DbType.AnsiString, Guid.NewGuid().ToString());
  156. SqlDataAccess.AddInParameter(Scanctx, fcmd, "ChartNo", DbType.AnsiString, visitNo);
  157. SqlDataAccess.AddInParameter(Scanctx, fcmd, "VisitNo", DbType.AnsiString, visitNo);
  158. SqlDataAccess.AddInParameter(Scanctx, fcmd, "OtherNo1", DbType.AnsiString, CheckInDate);
  159. SqlDataAccess.AddInParameter(Scanctx, fcmd, "OtherNo2", DbType.AnsiString, "");
  160. SqlDataAccess.AddInParameter(Scanctx, fcmd, "OtherNo3", DbType.AnsiString, "");
  161. SqlDataAccess.AddInParameter(Scanctx, fcmd, "OtherName", DbType.AnsiString, "住院收费数据明细");
  162. SqlDataAccess.AddInParameter(Scanctx, fcmd, "TaskType", DbType.AnsiString, "ADT^A01[B03]");
  163. SqlDataAccess.AddInParameter(Scanctx, fcmd, "TaskStatus", DbType.Int32, 1);
  164. SqlDataAccess.AddInParameter(Scanctx, fcmd, "UpdateUser", DbType.AnsiString, "9999");
  165. SqlDataAccess.AddInParameter(Scanctx, fcmd, "Reserve1", DbType.AnsiString, "");
  166. SqlDataAccess.ExecuteNonQuery(Scanctx, fcmd);
  167. }
  168. if (GetScanTaskCount(visitNo, "ADT^A01[B04]") <= 0)
  169. {
  170. //住院转科转床
  171. var fcmd = Scanctx.DBGetSqlStringCommand(sql);
  172. SqlDataAccess.AddInParameter(Scanctx, fcmd, "ID", DbType.AnsiString, Guid.NewGuid().ToString());
  173. SqlDataAccess.AddInParameter(Scanctx, fcmd, "ChartNo", DbType.AnsiString, visitNo);
  174. SqlDataAccess.AddInParameter(Scanctx, fcmd, "VisitNo", DbType.AnsiString, visitNo);
  175. SqlDataAccess.AddInParameter(Scanctx, fcmd, "OtherNo1", DbType.AnsiString, CheckInDate);
  176. SqlDataAccess.AddInParameter(Scanctx, fcmd, "OtherNo2", DbType.AnsiString, "");
  177. SqlDataAccess.AddInParameter(Scanctx, fcmd, "OtherNo3", DbType.AnsiString, "");
  178. SqlDataAccess.AddInParameter(Scanctx, fcmd, "OtherName", DbType.AnsiString, "住院转科转床");
  179. SqlDataAccess.AddInParameter(Scanctx, fcmd, "TaskType", DbType.AnsiString, "ADT^A01[B04]");
  180. SqlDataAccess.AddInParameter(Scanctx, fcmd, "TaskStatus", DbType.Int32, 1);
  181. SqlDataAccess.AddInParameter(Scanctx, fcmd, "UpdateUser", DbType.AnsiString, "9999");
  182. SqlDataAccess.AddInParameter(Scanctx, fcmd, "Reserve1", DbType.AnsiString, "");
  183. SqlDataAccess.ExecuteNonQuery(Scanctx, fcmd);
  184. }
  185. scope.Complete();
  186. }
  187. }
  188. /// <summary>
  189. /// 获取门诊就诊次数
  190. /// </summary>
  191. /// <returns></returns>
  192. private int GetOutNumByChartNo(string chartNo)
  193. {
  194. string OutPatientSql = @"select count(1)
  195. from HealthCare.dbo.OutPatient a, HealthCare.dbo.VisitRecord b
  196. where a.VisitNo = b.VisitNo AND b.ChartNo= @ChartNo
  197. AND a.VisitStatus<>'D' ";
  198. var cmd = SqlDataAccess.GetSqlStringCommand(ctx, OutPatientSql);
  199. SqlDataAccess.AddInParameter(ctx, cmd, "ChartNo", DbType.AnsiString, chartNo);
  200. return int.Parse(StrHelepr.Obj2StrTrim(SqlDataAccess.ExecuteScalar(ctx, cmd))); //看诊次数
  201. }
  202. /// <summary>
  203. /// 获取急诊就诊次数
  204. /// </summary>
  205. /// <returns></returns>
  206. private int GetEmgNumByChartNo(string chartNo)
  207. {
  208. string EmgPatientSql = @"select count(1) from HealthCare.dbo.Emergency a, HealthCare.dbo.VisitRecord b
  209. where a.VisitNo = b.VisitNo
  210. AND b.ChartNo= @ChartNo AND a.VisitStatus<>'D' ";
  211. var cmd = SqlDataAccess.GetSqlStringCommand(ctx, EmgPatientSql);
  212. SqlDataAccess.AddInParameter(ctx, cmd, "ChartNo", DbType.AnsiString, chartNo);
  213. return int.Parse(StrHelepr.Obj2StrTrim(SqlDataAccess.ExecuteScalar(ctx, cmd))); //看诊次数
  214. }
  215. private void SetEntity(Database ctx,DbCommand icmd,XmlElement xn)
  216. {
  217. SqlDataAccess.AddInParameter(Scanctx, icmd, "patient_zyh", DbType.AnsiString, xn.SelectSingleNode("patient_zyh").InnerText);
  218. SqlDataAccess.AddInParameter(Scanctx, icmd, "patient_id", DbType.AnsiString, xn.SelectSingleNode("patient_id").InnerText);
  219. SqlDataAccess.AddInParameter(Scanctx, icmd, "RY_DATE", DbType.AnsiString, xn.SelectSingleNode("ry_date").InnerText);
  220. SqlDataAccess.AddInParameter(Scanctx, icmd, "RY_UNIT", DbType.AnsiString, xn.SelectSingleNode("ry_unit").InnerText);
  221. SqlDataAccess.AddInParameter(Scanctx, icmd, "RY_BQ", DbType.AnsiString, xn.SelectSingleNode("ry_bq").InnerText);
  222. SqlDataAccess.AddInParameter(Scanctx, icmd, "RY_BED", DbType.AnsiString, xn.SelectSingleNode("ry_bed").InnerText);
  223. SqlDataAccess.AddInParameter(Scanctx, icmd, "CY_DATE", DbType.AnsiString, xn.SelectSingleNode("cy_date").InnerText);
  224. SqlDataAccess.AddInParameter(Scanctx, icmd, "CY_UNIT", DbType.AnsiString, xn.SelectSingleNode("cy_unit").InnerText);
  225. SqlDataAccess.AddInParameter(Scanctx, icmd, "CY_BQ", DbType.AnsiString, xn.SelectSingleNode("cy_bq").InnerText);
  226. SqlDataAccess.AddInParameter(Scanctx, icmd, "age", DbType.Int32, xn.SelectSingleNode("age").InnerText);
  227. SqlDataAccess.AddInParameter(Scanctx, icmd, "patient_name", DbType.AnsiString, xn.SelectSingleNode("patient_name").InnerText);
  228. SqlDataAccess.AddInParameter(Scanctx, icmd, "Sex", DbType.AnsiString, xn.SelectSingleNode("sex").InnerText);
  229. SqlDataAccess.AddInParameter(Scanctx, icmd, "address", DbType.AnsiString, xn.SelectSingleNode("address").InnerText);
  230. SqlDataAccess.AddInParameter(Scanctx, icmd, "JG_DOCT_GH", DbType.AnsiString, xn.SelectSingleNode("jg_doct_gh").InnerText);
  231. SqlDataAccess.AddInParameter(Scanctx, icmd, "SZ_DOCT_GH", DbType.AnsiString, xn.SelectSingleNode("sz_doct_gh").InnerText);
  232. SqlDataAccess.AddInParameter(Scanctx, icmd, "Nurse_grade", DbType.AnsiString, xn.SelectSingleNode("nurse_grade").InnerText);
  233. SqlDataAccess.AddInParameter(Scanctx, icmd, "ICD_CODE_RY1", DbType.AnsiString, xn.SelectSingleNode("icd_code_ry1").InnerText);
  234. SqlDataAccess.AddInParameter(Scanctx, icmd, "ICD_CODE_RY2", DbType.AnsiString, xn.SelectSingleNode("icd_code_ry2").InnerText);
  235. SqlDataAccess.AddInParameter(Scanctx, icmd, "ICD_CODE_RY3", DbType.AnsiString, xn.SelectSingleNode("icd_code_ry3").InnerText);
  236. SqlDataAccess.AddInParameter(Scanctx, icmd, "ICD_CODE_RY4", DbType.AnsiString, xn.SelectSingleNode("icd_code_ry4").InnerText);
  237. SqlDataAccess.AddInParameter(Scanctx, icmd, "ICD_CODE_CY1", DbType.AnsiString, xn.SelectSingleNode("icd_code_cy1").InnerText);
  238. SqlDataAccess.AddInParameter(Scanctx, icmd, "ICD_CODE_CY2", DbType.AnsiString, xn.SelectSingleNode("icd_code_cy2").InnerText);
  239. SqlDataAccess.AddInParameter(Scanctx, icmd, "ICD_CODE_CY3", DbType.AnsiString, xn.SelectSingleNode("icd_code_cy3").InnerText);
  240. SqlDataAccess.AddInParameter(Scanctx, icmd, "ICD_CODE_CY4", DbType.AnsiString, xn.SelectSingleNode("icd_code_cy4").InnerText);
  241. SqlDataAccess.AddInParameter(Scanctx, icmd, "CY_Kind", DbType.AnsiString, xn.SelectSingleNode("cy_kind").InnerText);
  242. }
  243. private int GetInHospInfoCount(string VisitNo)
  244. {
  245. var sql = @"Select Count(1) from dbo.zhuyuan_original where patient_zyh=@patient_zyh";
  246. var cmd = Scanctx.DBGetSqlStringCommand(sql);
  247. Scanctx.AddInParameter(cmd, "patient_zyh", DbType.String, VisitNo);
  248. var obj = int.Parse(StrHelepr.Obj2StrTrim(Scanctx.DBExecuteScalar(cmd)));
  249. return obj;
  250. }
  251. }
  252. }