NationECCodeAPI.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. using Newtonsoft.Json;
  2. using PTMedicalInsurance.Variables;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Runtime.InteropServices;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace PTMedicalInsurance.CardReaders
  10. {
  11. class NationECCodeAPI
  12. {
  13. private string url { get; set; }
  14. //电子凭证
  15. [DllImport("NationECCode.dll", EntryPoint = "NationEcTrans", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  16. static extern IntPtr NationEcTrans(StringBuilder strUrl, StringBuilder InData, StringBuilder OutData);
  17. public NationECCodeAPI(string _url)
  18. {
  19. url = _url;
  20. }
  21. public int NationEcTrans(NationECInput nationECInput, out string output )
  22. {
  23. output = "";
  24. try
  25. {
  26. StringBuilder sbURL = new StringBuilder(url);
  27. StringBuilder sbInput = new StringBuilder(JsonConvert.SerializeObject(nationECInput));
  28. StringBuilder sbOut = new StringBuilder(40960);
  29. IntPtr pInt = NationEcTrans(sbURL, sbInput, sbOut);
  30. output = sbOut.ToString();
  31. string str = Marshal.PtrToStringAnsi(pInt);
  32. if (str == "0000")
  33. {
  34. return 0;
  35. }
  36. else
  37. {
  38. return -1;
  39. }
  40. }
  41. catch (Exception ex)
  42. {
  43. output += ex.Message;
  44. throw;
  45. }
  46. finally
  47. {
  48. Global.writeLog($"NationEcTrans({url})", JsonConvert.SerializeObject(nationECInput),output);
  49. }
  50. }
  51. }
  52. class NationECInput
  53. {
  54. /// <summary>
  55. /// 机构代码
  56. /// </summary>
  57. public string orgId { get; set; }
  58. /// <summary>
  59. /// 交易类型
  60. /// </summary>
  61. public string transType { get; set; }
  62. /// <summary>
  63. /// 请求参数
  64. /// </summary>
  65. public NationECData data { get; set; }
  66. /// <summary>
  67. /// 扩展参数
  68. /// </summary>
  69. public string extra { get; set; }
  70. }
  71. class NationECData
  72. {
  73. /// <summary>
  74. /// 医保定点机构代码
  75. /// </summary>
  76. public string orgId { get; set; }
  77. /// <summary>
  78. /// 用码业务类型
  79. /// </summary>
  80. public string businessType { get; set; }
  81. /// <summary>
  82. /// 用码业务信息
  83. /// </summary>
  84. public string businessInfo { get; set; }
  85. /// <summary>
  86. /// 收款员编号
  87. /// </summary>
  88. public object operatorId { get; set; }
  89. /// <summary>
  90. /// 收款员姓名
  91. /// </summary>
  92. public string operatorName { get; set; }
  93. /// <summary>
  94. /// 医保科室编号
  95. /// </summary>
  96. public string officeId { get; set; }
  97. /// <summary>
  98. /// 科室名称
  99. /// </summary>
  100. public string officeName { get; set; }
  101. /// <summary>
  102. /// 扩展参数
  103. /// </summary>
  104. public string extData { get; set; }
  105. }
  106. class EcQueryData:NationECData
  107. {
  108. /// <summary>
  109. /// 人脸照片 字符 100k
  110. /// </summary>
  111. public string photoData { get; set; }
  112. /// <summary>
  113. /// 设备类型
  114. /// </summary>
  115. public string deviceType { get; set; }
  116. }
  117. class QrcodeGetData : NationECData
  118. {
  119. /// <summary>
  120. /// 定点医药机构本次业务流水号
  121. /// </summary>
  122. public string outBizNo { get; set; }
  123. /// <summary>
  124. /// 设备类型
  125. /// </summary>
  126. public string deviceType { get; set; }
  127. }
  128. class EcAuthData:NationECData
  129. {
  130. /// <summary>
  131. /// 定点医药机构本次业务流水号 不可重复,每次请求都需要唯一
  132. /// </summary>
  133. public string outBizNo { get; set; }
  134. }
  135. class AuthCheckData : NationECData
  136. {
  137. /// <summary>
  138. /// 定点医药机构本次业务流水号 不可重复,每次请求都需要唯一
  139. /// </summary>
  140. public string outBizNo { get; set; }
  141. /// <summary>
  142. /// 实 人 认证 业 务流水号 医保综合服务终端返回的授权码
  143. /// </summary>
  144. public string authNo { get; set; }
  145. /// <summary>
  146. /// 设备类型
  147. /// </summary>
  148. public string deviceType { get; set; }
  149. }
  150. /// <summary>
  151. /// 医保结算数据实体(继承自 NationECData)
  152. /// </summary>
  153. class SettleNotifyData : NationECData
  154. {
  155. /// <summary>
  156. /// 核身或者刷脸的医疗机构业务流水号(必填)
  157. /// 需要传核身接口或者电子凭证接口里的流水号
  158. /// </summary>
  159. public string outBizNo { get; set; }
  160. /// <summary>
  161. /// 医保/自费结算状态(必填)
  162. /// SUCCESS:结算成功, FAIL:结算失败,
  163. /// REFUND_SUCCESS:退款成功, REFUND_FAIL:退款失败
  164. /// </summary>
  165. public string medicalSettleState { get; set; }
  166. /// <summary>
  167. /// 实人认证业务流水号(可空)
  168. /// </summary>
  169. public string authNo { get; set; }
  170. // operatorId 和 operatorName 已在父类中定义
  171. /// <summary>
  172. /// 总费用(必填)字符型(金额建议为分或保留小数)
  173. /// </summary>
  174. public string totalFee { get; set; }
  175. /// <summary>
  176. /// 业务场景(必填)
  177. /// register:挂号窗口, settle:诊间, drugStore:药店
  178. /// </summary>
  179. public string bizType { get; set; }
  180. /// <summary>
  181. /// 身份证号码(可空)
  182. /// </summary>
  183. public string idNo { get; set; }
  184. /// <summary>
  185. /// 姓名(可空)
  186. /// </summary>
  187. public string userName { get; set; }
  188. /// <summary>
  189. /// 结算时间(必填)格式如:yyyy-MM-dd HH:mm:ss
  190. /// </summary>
  191. public string setlTime { get; set; }
  192. /// <summary>
  193. /// 定点机构名称(必填)
  194. /// </summary>
  195. public string hospitalName { get; set; }
  196. // officeId 和 officeName 已在父类中定义
  197. /// <summary>
  198. /// 医生姓名(可空)
  199. /// </summary>
  200. public string doctorName { get; set; }
  201. /// <summary>
  202. /// 失败原因(可空)
  203. /// </summary>
  204. public string failReason { get; set; }
  205. // ========== 以下字段在 medicalSettleState=SUCCESS 或 REFUND_SUCCESS 时必填 ==========
  206. /// <summary>
  207. /// 医保单据流水号(成功时必填)
  208. /// </summary>
  209. public string medicalSettleNo { get; set; }
  210. /// <summary>
  211. /// 自费费用(成功时必填)
  212. /// </summary>
  213. public string ownAmt { get; set; }
  214. /// <summary>
  215. /// 医保报销费用(成功时必填)
  216. /// </summary>
  217. public string hifAmt { get; set; }
  218. /// <summary>
  219. /// 个人帐户支出(成功时必填)
  220. /// </summary>
  221. public string acctAmt { get; set; }
  222. /// <summary>
  223. /// 统筹基金支出(成功时必填)
  224. /// </summary>
  225. public string hifpAmt { get; set; }
  226. /// <summary>
  227. /// 大额医疗保险支出(可空)
  228. /// </summary>
  229. public string hifmiAmt { get; set; }
  230. /// <summary>
  231. /// 公务员补助(可空)
  232. /// </summary>
  233. public string cvlservAmt { get; set; }
  234. /// <summary>
  235. /// 医疗救助(可空)
  236. /// </summary>
  237. public string maAmt { get; set; }
  238. /// <summary>
  239. /// 单病种定点医疗机构垫支(可空)
  240. /// </summary>
  241. public string hosPreAmt { get; set; }
  242. /// <summary>
  243. /// 药品超标扣款金额(可空)
  244. /// </summary>
  245. public string medOverLmtAmt { get; set; }
  246. /// <summary>
  247. /// 扶贫救助(可空)
  248. /// </summary>
  249. public string mafAmt { get; set; }
  250. /// <summary>
  251. /// 历史起付公务员返还(可空)
  252. /// </summary>
  253. public string cvlservDedcAmt { get; set; }
  254. /// <summary>
  255. /// 帐户余额(可空)
  256. /// </summary>
  257. public string balance { get; set; }
  258. }
  259. }