DirectoryMapService.cs 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982
  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Linq;
  3. using PTMedicalInsurance.Business;
  4. using PTMedicalInsurance.Common;
  5. using PTMedicalInsurance.Helper;
  6. using PTMedicalInsurance.Variables;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.ComponentModel;
  10. using System.Data;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using System.Windows.Forms;
  15. namespace PTMedicalInsurance.Forms.BasicDatas.services
  16. {
  17. class DirectoryMapService
  18. {
  19. private string errMsg;
  20. CenterBusiness cBus = new CenterBusiness();
  21. HisMainBusiness hBus = new HisMainBusiness();
  22. HisIrisServices hIS = new HisIrisServices();
  23. MIIrisServices mIS = new MIIrisServices();
  24. InvokeHelper invoker = new InvokeHelper();
  25. private GridViewSetter gvdSetter = new GridViewSetter();
  26. private DataGridViewHeaderSetService dataGridViewHeaderSetService = new DataGridViewHeaderSetService();
  27. private Func<JObject, OutParamWrapper, int> action;
  28. //private DataLoader.MyFunc<string> updateDelegate;
  29. private DataTable dtAllMapped;
  30. TradeEnum trade;
  31. int iTotalCount = 0;
  32. int currentPageIndex = 0;
  33. #region 界面标题设置
  34. /// <summary>
  35. /// 设置DataGridView标题
  36. /// </summary>
  37. public void SetDgvDirectoryHeader(int directoryType, DataGridView dgv)
  38. {
  39. switch (directoryType)
  40. {
  41. case 1://药品
  42. {
  43. gvdSetter.SetHeaderTextOfDrug(dgv);
  44. break;
  45. }
  46. case 2://诊疗
  47. {
  48. gvdSetter.SetHeaderTextOfMedicalService(dgv);
  49. break;
  50. }
  51. case 3://材料
  52. {
  53. gvdSetter.SetHeaderTextOfMaterials(dgv);
  54. break;
  55. }
  56. }
  57. }
  58. public int SetDgvDirectoryHeader( string fileName, DataGridView dgv,out string err)
  59. {
  60. return dataGridViewHeaderSetService.SetHeaderText(fileName, dgv, out err);
  61. }
  62. #endregion
  63. #region 获取入参
  64. /// <summary>
  65. /// 几个医保查询的交易组织入参
  66. /// </summary>
  67. /// <param name="Index"></param>
  68. /// <param name="funNo"></param>
  69. /// <returns></returns>
  70. #endregion
  71. #region 查询目录以及导出数据
  72. /// <summary>
  73. /// 查询His和平台的对照目录,分全部,已对照,未对照三种情况
  74. /// </summary>
  75. /// <param name="input"></param>
  76. /// <param name="mapFlag"></param>
  77. /// <returns></returns>
  78. public JObject QueryDirectory(JObject input,MapFlagEnum mapFlag)
  79. {
  80. JArray jaPagination = JArray.FromObject(input["pagination"]);
  81. JArray jaParams = JArray.FromObject(input["params"]);
  82. JObject joRtn = new JObject();
  83. JObject joHisRtn;
  84. joRtn.Add("errorCode",-1);
  85. joRtn.Add("errorMessage", "");
  86. switch (mapFlag)
  87. {
  88. case MapFlagEnum.None:
  89. return null;
  90. case MapFlagEnum.All:
  91. //全部是先调HIS,然后再匹配医保平台的对照关系
  92. if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0)
  93. {
  94. joRtn["errorCode"] = -1;
  95. joRtn["errorMessage"] = errMsg;
  96. return joRtn;
  97. }
  98. joRtn = mIS.ConvertHISDir(joHisRtn);
  99. break;
  100. case MapFlagEnum.Mapped:
  101. JArray jaTmp = (JArray)jaParams.DeepClone();
  102. ((JObject)jaTmp[0]).Remove("code");
  103. ((JObject)jaTmp[0]).Remove("descripts");
  104. ((JObject)jaTmp[0]).Remove("FindType");
  105. ((JObject)jaTmp[0]).Remove("TypeID");
  106. ((JObject)jaTmp[0]).Remove("include");
  107. ((JObject)jaTmp[0]).Remove("groupID");
  108. ((JObject)jaTmp[0]).Remove("hospID");
  109. ((JObject)jaTmp[0]).Add("hisType", ((JObject)jaTmp[0])["type"]);
  110. ((JObject)jaTmp[0]).Add("HospitalDr", Global.inf.hospitalDr);
  111. ((JObject)jaTmp[0]).Add("InterfaceDr", ((JObject)jaTmp[0])["interfaceDr"]);
  112. ((JObject)jaTmp[0]).Remove("type");
  113. ((JObject)jaTmp[0]).Remove("flag");
  114. ((JObject)jaTmp[0]).Remove("specInput");
  115. ((JObject)jaTmp[0]).Remove("interfaceDr");
  116. JObject joMiRtn = mIS.GetMappedHISDir(jaPagination, jaTmp);
  117. if (JsonHelper.parseIrisRtnValue(joMiRtn, out errMsg) != 0)
  118. {
  119. joRtn["errorCode"] = -1;
  120. joRtn["errorMessage"] = errMsg;
  121. return joRtn;
  122. }
  123. ((JObject)jaParams[0]).Add("TotalCount", joMiRtn["result"]["TotalCount"]);
  124. jaParams[0]["compareArr"] = joMiRtn["result"]["Data"];
  125. if (hIS.getHISDir(jaPagination, jaParams, out joRtn, out errMsg) != 0)
  126. {
  127. joRtn["errorCode"] = -1;
  128. joRtn["errorMessage"] = errMsg;
  129. return joRtn;
  130. }
  131. break;
  132. case MapFlagEnum.NoMapped:
  133. //1.获取全部HIS目录
  134. if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0)
  135. {
  136. joRtn["errorCode"] = -1;
  137. joRtn["errorMessage"] = errMsg;
  138. return joRtn;
  139. }
  140. //2.获取当前目录的最大值后再次获取目录
  141. int totalCount = int.Parse(joHisRtn["result"]["TotalCount"].ToString());
  142. jaPagination[0]["pageSize"] = totalCount;
  143. if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0)
  144. {
  145. joRtn["errorCode"] = -1;
  146. joRtn["errorMessage"] = errMsg;
  147. return joRtn;
  148. }
  149. //3.获取医保平台数据并匹配未对照数据
  150. joRtn = mIS.GetNoMappHISDir(joHisRtn);
  151. if (JsonHelper.parseIrisRtnValue(joRtn, out errMsg) != 0)
  152. {
  153. joRtn["errorCode"] = -1;
  154. joRtn["errorMessage"] = errMsg;
  155. }
  156. break;
  157. default:
  158. return null;
  159. }
  160. return joRtn;
  161. }
  162. /// <summary>
  163. /// 查询医保平台存储的中心目录
  164. /// </summary>
  165. /// <param name="input"></param>
  166. /// <returns></returns>
  167. public JObject QueryMiDirectory(JObject input)
  168. {
  169. return mIS.getMIDirectoryByPagination(input);
  170. }
  171. public JObject QueryExportData(JObject input, MapFlagEnum mapFlag)
  172. {
  173. Global.writeLog($"QueryExportData_INPUT:{input}");
  174. JArray jaPagination = JArray.FromObject(input["pagination"]);
  175. JArray jaParams = JArray.FromObject(input["params"]);
  176. JObject joRtn = new JObject();
  177. //假设默认每次取得条数为1000,主要是IRIS服务如果没有走流模式,会有一个字符串最大限制,导致服务无法正常返回
  178. int defaultPageSize = 1000;
  179. int currentPage = 1;
  180. jaPagination[0]["pageSize"] = defaultPageSize;
  181. jaPagination[0]["currentPage"] = currentPage;
  182. JObject joHisRtn;
  183. joRtn.Add("errorCode", -1);
  184. joRtn.Add("errorMessage", "");
  185. switch (mapFlag)
  186. {
  187. case MapFlagEnum.None:
  188. return null;
  189. case MapFlagEnum.All:
  190. //全部是先调HIS,然后再匹配医保平台的对照关系
  191. if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0)
  192. {
  193. joRtn["errorCode"] = -1;
  194. joRtn["errorMessage"] = errMsg;
  195. return joRtn;
  196. }
  197. JArray jaData = null;
  198. //获取HIS返回的总行数。这里其实应该根据默认行数跟总行数进行匹配
  199. int totalCount = int.Parse(JsonHelper.getDestValue(joHisRtn, "result.TotalCount"));
  200. if (totalCount > defaultPageSize)
  201. {
  202. while (currentPage <= (int)(totalCount / defaultPageSize))
  203. {
  204. currentPage++;
  205. jaPagination[0]["currentPage"] = currentPage;
  206. if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0)
  207. {
  208. joRtn["errorCode"] = -1;
  209. joRtn["errorMessage"] = errMsg;
  210. return joRtn;
  211. }
  212. else
  213. {
  214. JObject joConvertDirRtn = mIS.ConvertHISDir(joHisRtn);
  215. joRtn = (JObject)joConvertDirRtn.DeepClone();
  216. JArray jaTmp = JArray.FromObject(joConvertDirRtn["result"]["Data"]);
  217. if (jaData == null)
  218. {
  219. jaData = jaTmp;
  220. }
  221. else
  222. {
  223. jaData.Merge(jaTmp);
  224. }
  225. }
  226. }
  227. joRtn["result"]["Data"] = jaData;
  228. }
  229. else
  230. {
  231. joRtn = mIS.ConvertHISDir(joHisRtn);
  232. }
  233. break;
  234. case MapFlagEnum.Mapped:
  235. JObject joMiRtn = mIS.GetMappedHISDir(jaPagination, jaParams);
  236. if (JsonHelper.parseIrisRtnValue(joMiRtn, out errMsg) != 0)
  237. {
  238. joRtn["errorCode"] = -1;
  239. joRtn["errorMessage"] = errMsg;
  240. }
  241. jaData = null;
  242. //获取HIS返回的总行数。这里其实应该根据默认行数跟总行数进行匹配
  243. totalCount = int.Parse(JsonHelper.getDestValue(joMiRtn, "result.TotalCount"));
  244. if (totalCount > defaultPageSize)
  245. {
  246. while (currentPage <= (int)(totalCount / defaultPageSize))
  247. {
  248. currentPage++;
  249. jaPagination[0]["currentPage"] = currentPage;
  250. joMiRtn = mIS.GetMappedHISDir(jaPagination, jaParams);
  251. if (JsonHelper.parseIrisRtnValue(joMiRtn, out errMsg) != 0)
  252. {
  253. joRtn["errorCode"] = -1;
  254. joRtn["errorMessage"] = errMsg;
  255. return joRtn;
  256. }
  257. jaParams[0]["compareArr"] = joMiRtn["result"]["Data"];
  258. if (hIS.getHISDir(jaPagination, jaParams, out joRtn, out errMsg) != 0)
  259. {
  260. joRtn["errorCode"] = -1;
  261. joRtn["errorMessage"] = errMsg;
  262. return joRtn;
  263. }
  264. JArray jaTmp = JArray.FromObject(joRtn["result"]["Data"]);
  265. if (jaData == null)
  266. {
  267. jaData = jaTmp;
  268. }
  269. else
  270. {
  271. jaData.Merge(jaTmp);
  272. }
  273. }
  274. joRtn["result"]["Data"] = jaData;
  275. }
  276. else
  277. {
  278. jaParams[0]["compareArr"] = joMiRtn["result"]["Data"];
  279. if (hIS.getHISDir(jaPagination, jaParams, out joRtn, out errMsg) != 0)
  280. {
  281. joRtn["errorCode"] = -1;
  282. joRtn["errorMessage"] = errMsg;
  283. }
  284. }
  285. break;
  286. case MapFlagEnum.NoMapped:
  287. //1.获取全部HIS目录
  288. if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0)
  289. {
  290. joRtn["errorCode"] = -1;
  291. joRtn["errorMessage"] = errMsg;
  292. return joRtn;
  293. }
  294. jaData = null;
  295. //获取HIS返回的总行数。这里其实应该根据默认行数跟总行数进行匹配
  296. totalCount = int.Parse(JsonHelper.getDestValue(joHisRtn, "result.TotalCount"));
  297. if (totalCount > defaultPageSize)
  298. {
  299. while (currentPage <= (int)(totalCount / defaultPageSize))
  300. {
  301. currentPage++;
  302. jaPagination[0]["currentPage"] = currentPage;
  303. if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0)
  304. {
  305. joRtn["errorCode"] = -1;
  306. joRtn["errorMessage"] = errMsg;
  307. return joRtn;
  308. }
  309. joRtn = mIS.GetNoMappHISDir(joHisRtn);
  310. if (JsonHelper.parseIrisRtnValue(joRtn, out errMsg) != 0)
  311. {
  312. joRtn["errorCode"] = -1;
  313. joRtn["errorMessage"] = errMsg;
  314. return joRtn;
  315. }
  316. JArray jaTmp = JArray.FromObject(joRtn["result"]["Data"]);
  317. if (jaData == null)
  318. {
  319. jaData = jaTmp;
  320. }
  321. else
  322. {
  323. jaData.Merge(jaTmp);
  324. }
  325. }
  326. joRtn["result"]["Data"] = jaData;
  327. }
  328. else
  329. {
  330. joRtn = mIS.GetNoMappHISDir(joHisRtn);
  331. if (JsonHelper.parseIrisRtnValue(joRtn, out errMsg) != 0)
  332. {
  333. joRtn["errorCode"] = -1;
  334. joRtn["errorMessage"] = errMsg;
  335. }
  336. }
  337. break;
  338. default:
  339. return null;
  340. }
  341. return joRtn;
  342. }
  343. #endregion
  344. #region 新版导出匹配
  345. private JArray FetchAllPages(
  346. JArray pagination,
  347. JArray @params,
  348. Func<JArray, JArray, (int code, JObject result, string msg)> fetchData)
  349. {
  350. var allData = new JArray();
  351. int pageSize = 1000;
  352. int currentPage = 1;
  353. int totalCount = 0;
  354. do
  355. {
  356. pagination[0]["pageSize"] = pageSize;
  357. pagination[0]["currentPage"] = currentPage;
  358. var (code, result, errMsg) = fetchData(pagination, @params);
  359. if (code != 0)
  360. {
  361. throw new Exception($"分页请求失败: {errMsg}");
  362. }
  363. if (currentPage == 1)
  364. {
  365. totalCount = int.TryParse(JsonHelper.getDestValue(result, "result.TotalCount"), out var cnt) ? cnt : 0;
  366. }
  367. var data = result["result"]?["Data"] as JArray;
  368. if (data != null)
  369. {
  370. allData.Add(data);
  371. }
  372. currentPage++;
  373. } while (currentPage * pageSize <= totalCount); // 或 currentPage <= (totalCount + pageSize - 1) / pageSize
  374. return allData;
  375. }
  376. public JObject QueryExportDataNew(JObject input, MapFlagEnum mapFlag)
  377. {
  378. var pagination = JArray.FromObject(input["pagination"]);
  379. var @params = JArray.FromObject(input["params"]);
  380. var result = new JObject();
  381. try
  382. {
  383. switch (mapFlag)
  384. {
  385. case MapFlagEnum.All:
  386. var hisDataAll = FetchAllPages(pagination, @params, (p, pr) => hIS.getHISDir(p, pr, out var r, out var m) == 0 ? (0, r, m) : (-1, null, m));
  387. var converted = mIS.ConvertHISDir(new JObject { ["result"] = new JObject { ["Data"] = hisDataAll } });
  388. return converted;
  389. case MapFlagEnum.Mapped:
  390. var mappedDir = mIS.GetMappedHISDir(pagination, @params);
  391. if (JsonHelper.parseIrisRtnValue(mappedDir, out var errMsg) != 0)
  392. return CreateError(-1, errMsg);
  393. var compareArr = mappedDir["result"]?["Data"] as JArray ?? new JArray();
  394. var clonedParams = (JArray)@params.DeepClone();
  395. clonedParams[0]["compareArr"] = compareArr;
  396. var hisMappedData = FetchAllPages(pagination, clonedParams, (p, pr) => hIS.getHISDir(p, pr, out var r, out var m) == 0 ? (0, r, m) : (-1, r, m));
  397. result["result"] = new JObject { ["Data"] = hisMappedData };
  398. result["errorCode"] = 0;
  399. result["errorMessage"] = "";
  400. return result;
  401. case MapFlagEnum.NoMapped:
  402. var hisRawData = FetchAllPages(pagination, @params, (p, pr) => hIS.getHISDir(p, pr, out var r, out var m) == 0 ? (0, r, m) : (-1, r, m));
  403. var noMapped = mIS.GetNoMappHISDir(new JObject { ["result"] = new JObject { ["Data"] = hisRawData } });
  404. if (JsonHelper.parseIrisRtnValue(noMapped, out errMsg) != 0)
  405. return CreateError(-1, errMsg);
  406. return noMapped;
  407. default:
  408. return null;
  409. }
  410. }
  411. catch (Exception ex)
  412. {
  413. return CreateError(-1, "系统异常: " + ex.Message);
  414. }
  415. }
  416. private JObject CreateError(int code, string msg)
  417. {
  418. return new JObject
  419. {
  420. ["errorCode"] = code,
  421. ["errorMessage"] = msg
  422. };
  423. }
  424. #endregion
  425. #region 更新目录附属信息
  426. public string getDataRowValue(DataRow dr, string columnName)
  427. {
  428. if (!dr.Table.Columns.Contains(columnName))
  429. {
  430. return "";
  431. }
  432. else
  433. {
  434. return dr[columnName].ToString();
  435. }
  436. }
  437. private int updateMappedInsuInfo(DataLoaderContext context, out string errMsg)
  438. {
  439. int iFalse = 0;
  440. int iCount = 0;
  441. List<string> errList = new List<string>();
  442. //入参强制转换未JObject
  443. JObject joIn = (JObject)context.args[0];
  444. //获取iTotalCount
  445. int total = int.Parse(JsonHelper.getDestValue(joIn,"total"));
  446. //获取表数据
  447. DataTable dt = (DataTable)joIn["data"].ToObject(typeof(DataTable));
  448. //设置总进度数
  449. if (context.setProgressMaximum != null)
  450. {
  451. context.setProgressMaximum(total);
  452. }
  453. JObject joCondition = JObject.FromObject(joIn["condition"]);
  454. //遍历
  455. foreach (DataRow dr in dt.Rows)
  456. {
  457. if (joCondition.ContainsKey("hilist_code"))
  458. {
  459. joCondition["hilist_code"] = dr["InsuCode"].ToString();
  460. }
  461. else
  462. {
  463. errMsg = "未检测到相应字段";
  464. return -1; // 或者其他表示取消的返回值
  465. }
  466. OutParamWrapper outParWarp = new OutParamWrapper();
  467. if (action(joCondition, outParWarp) != 0)
  468. {
  469. iFalse++;
  470. errList.Add(outParWarp.Value);
  471. }
  472. iCount++;
  473. // 检查是否应取消操作
  474. if (context.Worker.CancellationPending)
  475. {
  476. errMsg = "操作取消!";
  477. return -1; // 或者其他表示取消的返回值
  478. }
  479. if (context.reportProgress != null)
  480. {
  481. context.reportProgress(iCount);
  482. }
  483. }
  484. if (iFalse != 0)
  485. {
  486. errMsg = ($"总共{iCount}条数据更新完成,但有{iFalse}条更新发生错误!");
  487. Global.writeLog($"{errMsg}\r\n{errList}");
  488. }
  489. else
  490. {
  491. errMsg = ($"全部数据({iCount}条)更新完成");
  492. }
  493. return iFalse;
  494. }
  495. public void batchUpdateMappedInsuInfo(JObject joIn, Form frm)
  496. {
  497. //条件
  498. JObject joCondition = (JObject)joIn["condition"].DeepClone();
  499. switch (joCondition["funno"].ToString())
  500. {
  501. case "1318":
  502. action = updateCellPriceWrapper;
  503. trade = trade.GetByCode("1318");
  504. Global.writeLog("updateCellPriceWrapper");
  505. break;
  506. default:
  507. break;
  508. }
  509. ProgressWrapper _dataLoader;
  510. _dataLoader = new ProgressWrapper(updateMappedInsuInfo, frm);
  511. _dataLoader.SetProgressBar(ProgressBarStyle.Continuous, "正在更新...", 50);
  512. _dataLoader.Start(new object[] {joIn }, (result, errMsg) =>
  513. {
  514. // 在这里处理结果和错误信息
  515. if (result == 0)
  516. {
  517. MessageBox.Show(errMsg);
  518. }
  519. else
  520. {
  521. MessageBox.Show(errMsg);
  522. }
  523. });
  524. }
  525. public void batchUpdateMappedInsuInfo(Func<JObject, OutParamWrapper, int> _action,Form frm)
  526. {
  527. action = _action;
  528. string sqlStr = $"select * from HB_MedInsuMapRelation where Interface_Dr='{Global.inf.interfaceDr}' and Hospital_Dr ='{Global.inf.hospitalDr}'";
  529. JObject joSqlstr = new JObject();
  530. joSqlstr.Add("sqlStr", sqlStr);
  531. JObject joRtn = mIS.QueryMappedData(joSqlstr, "查询所有已对照数据");
  532. iTotalCount = int.Parse(joRtn["result"]["total"].ToString());
  533. dtAllMapped = (DataTable)joRtn["result"]["data"].ToObject(typeof(DataTable));
  534. ProgressWrapper _dataLoader;
  535. _dataLoader = new ProgressWrapper(updateMappedInsuInfo, frm);
  536. _dataLoader.SetProgressBar(ProgressBarStyle.Continuous, "正在更新...", 50);
  537. _dataLoader.Start(new object[] { iTotalCount }, (result, errMsg) =>
  538. {
  539. // 在这里处理结果和错误信息
  540. if (result == 0)
  541. {
  542. MessageBox.Show(errMsg);
  543. }
  544. else
  545. {
  546. MessageBox.Show(errMsg);
  547. }
  548. });
  549. }
  550. public int updateCellPriceWrapper(JObject jo, OutParamWrapper outParamWrapper)
  551. {
  552. string err;
  553. int iresult = updateCellingPrice(jo, out err);
  554. outParamWrapper.Value = err;
  555. return iresult;
  556. }
  557. private int updateCellingPrice(DataLoaderContext context, out string err)
  558. {
  559. if (context.setProgressMaximum != null)
  560. {
  561. context.setProgressMaximum(iTotalCount);
  562. }
  563. JObject jo = new JObject();
  564. dynamic joData = null;
  565. JObject joRtn = cBus.InvokeMedicalInsuranceInquiry(trade.GetCode(), joData);
  566. if (joRtn["infcode"].ToString() == "0")
  567. {
  568. DataTable dtAuxInfo = (DataTable)joRtn["output"]["data"].ToObject(typeof(DataTable));
  569. DateTime dtToday = DateTime.Today;
  570. string cellingPrice = "";
  571. string begndate = "";
  572. string enddate = "";
  573. int iAdpater = 0;
  574. foreach (DataRow dr in dtAuxInfo.Rows)
  575. {
  576. DateTime dtBegin = getDataRowValue(dr, "begndate") == "" ? Convert.ToDateTime("2000-01-01 00:00:00") : Convert.ToDateTime(getDataRowValue(dr, "begndate"));
  577. DateTime dtEnd = getDataRowValue(dr, "enddate") == "" ? Convert.ToDateTime("2099-01-01 00:00:00") : Convert.ToDateTime(getDataRowValue(dr, "enddate"));
  578. if ((dtBegin < dtToday) && (dtToday < dtEnd))
  579. {
  580. iAdpater++;
  581. cellingPrice = dr["hilist_pric_uplmt_amt"].ToString();
  582. begndate = dr["begndate"].ToString();
  583. enddate = dr["enddate"].ToString();
  584. }
  585. }
  586. //有且只能有一条数据符合
  587. if (iAdpater == 1)
  588. {
  589. JObject joPamam = new JObject();
  590. joPamam.Add("Code", JsonHelper.getDestValue(jo, "code"));
  591. joPamam.Add("HisType", JsonHelper.getDestValue(jo, "HisType"));
  592. joPamam.Add("StartDate", begndate);
  593. joPamam.Add("EndDate", enddate);
  594. joPamam.Add("CeilingPrice", cellingPrice);
  595. JObject joUpdateRtn = mIS.UpdateDirectoryBySelf(joPamam);
  596. string error = "";
  597. if (JsonHelper.parseIrisRtnValue(joUpdateRtn, out error) != 0)
  598. {
  599. err = "修改失败:" + error;
  600. return -1;
  601. }
  602. else
  603. {
  604. err = "修改成功";
  605. return 0;
  606. }
  607. }
  608. else
  609. {
  610. err = "中心返回符合条数的记录不唯一或者为空,请检查!";
  611. return -1;
  612. }
  613. }
  614. else
  615. {
  616. err = "查询中心数据出错,请检查!";
  617. return -1;
  618. }
  619. }
  620. public int updateCellingPrice(JObject joData, out string err)
  621. {
  622. err = "";
  623. //dynamic joData = (JObject)jo.DeepClone();
  624. JObject joRtn = cBus.InvokeMedicalInsuranceInquiry(TradeEnum.InsuPriceLimitDirectory.GetCode(), joData);
  625. if (joRtn["infcode"].ToString() == "0")
  626. {
  627. DataTable dtAuxInfo = (DataTable)joRtn["output"]["data"].ToObject(typeof(DataTable));
  628. DateTime dtToday = DateTime.Today;
  629. string cellingPrice = "";
  630. string begndate = "";
  631. string enddate = "";
  632. int iAdpater = 0;
  633. foreach (DataRow dr in dtAuxInfo.Rows)
  634. {
  635. DateTime dtBegin = getDataRowValue(dr, "begndate") == "" ? Convert.ToDateTime("2000-01-01 00:00:00") : Convert.ToDateTime(getDataRowValue(dr, "begndate"));
  636. DateTime dtEnd = getDataRowValue(dr, "enddate") == "" ? Convert.ToDateTime("2099-01-01 00:00:00") : Convert.ToDateTime(getDataRowValue(dr, "enddate"));
  637. if ((dtBegin < dtToday) && (dtToday < dtEnd))
  638. {
  639. iAdpater++;
  640. cellingPrice = dr["hilist_pric_uplmt_amt"].ToString();
  641. begndate = dr["begndate"].ToString();
  642. enddate = dr["enddate"].ToString();
  643. }
  644. }
  645. //有且只能有一条数据符合
  646. if (iAdpater == 1)
  647. {
  648. JObject joPamam = new JObject();
  649. joPamam.Add("Code", JsonHelper.getDestValue(joData, "code"));
  650. joPamam.Add("HisType", JsonHelper.getDestValue(joData, "HisType"));
  651. joPamam.Add("StartDate", begndate);
  652. joPamam.Add("EndDate", enddate);
  653. joPamam.Add("CeilingPrice", cellingPrice);
  654. JObject joUpdateRtn = mIS.UpdateDirectoryBySelf(joPamam);
  655. string error = "";
  656. if (JsonHelper.parseIrisRtnValue(joUpdateRtn, out error) != 0)
  657. {
  658. err = "修改失败:" + error;
  659. return -1;
  660. }
  661. else
  662. {
  663. err = "修改成功";
  664. return 0;
  665. }
  666. }
  667. else
  668. {
  669. err = "中心返回符合条数的记录不唯一或者为空,请检查!";
  670. return -1;
  671. }
  672. }
  673. else
  674. {
  675. err = "查询中心数据出错,请检查!";
  676. return -1;
  677. }
  678. }
  679. private int updateSelfRatioWrapper(JObject jo, OutParamWrapper outParamWrapper)
  680. {
  681. string err;
  682. int iresult = updateSelfRatioInfo(jo, out err);
  683. outParamWrapper.Value = err;
  684. return iresult;
  685. }
  686. public int updateSelfRatioInfo(JObject jo, out string err)
  687. {
  688. err = "";
  689. dynamic joData = (JObject)jo.DeepClone();
  690. JObject joRtn = cBus.InvokeMedicalInsuranceInquiry(TradeEnum.PrepayPercentDirectory.GetCode(), joData);
  691. if (joRtn["infcode"].ToString() == "0")
  692. {
  693. DataTable dtRatioInfo = (DataTable)joRtn["output"]["data"].ToObject(typeof(DataTable));
  694. DateTime dtToday = DateTime.Today;
  695. string cellingPrice = "";
  696. string begndate = "";
  697. string enddate = "";
  698. int iAdpater = 0;
  699. var dataArray = JArray.FromObject(joRtn["output"]["data"]);
  700. DateTime today = DateTime.Today;
  701. var groupedResult = dataArray
  702. .Where(item =>
  703. {
  704. if (DateTime.TryParse(item["enddate"]?.ToString(), out var endDate))
  705. {
  706. return endDate.Date >= today.Date;
  707. }
  708. return false;
  709. })
  710. .GroupBy(item => item["selfpay_prop_psn_type"]?.ToString());
  711. JArray joArray = new JArray();
  712. foreach (var group in groupedResult)
  713. {
  714. foreach (var item in group)
  715. {
  716. // 将 JsonNode 转换为 JObject
  717. JObject jObj = JObject.Parse(item.ToString());
  718. dynamic joTmp = new JObject();
  719. joTmp.HospitalDr = Global.inf.hospitalDr;
  720. joTmp.InterfaceDr = Global.inf.interfaceDr;
  721. joTmp.updateUserID = Global.user.ID;
  722. joTmp.Code = jObj["hilist_code"];
  723. joTmp.PersonnelType = jObj["selfpay_prop_psn_type"];
  724. joTmp.ProportionType = jObj["selfpay_prop_type"];
  725. joTmp.Proportion = jObj["selfpay_prop"];
  726. joTmp.BeginDate = jObj["begndate"];
  727. joTmp.EndDate = jObj["enddate"];
  728. joTmp.InsuranceAreaCode = jObj["insu_admdvs"];
  729. joTmp.PoolAreaNO = jObj["poolarea_no"];
  730. joTmp.ValidFlag = jObj["vali_flag"];
  731. joTmp.RequiredID = jObj["rid"];
  732. joArray.Add(joTmp);
  733. }
  734. }
  735. string errMsg = "";
  736. InvokeHelper invoker = new InvokeHelper();
  737. joRtn = invoker.invokeInsuService(JsonHelper.setIrisInpar("09010085", joArray).ToString(), "设置自费比例");
  738. if (JsonHelper.parseIrisRtnValue(joRtn, out errMsg) != 0)
  739. {
  740. err = errMsg;
  741. return -1;
  742. }
  743. else
  744. {
  745. err = ("更新成功!");
  746. return 0;
  747. }
  748. }
  749. else
  750. {
  751. err = "查询中心数据出错,请检查!";
  752. return -1;
  753. }
  754. }
  755. private int updateAuxInfoWrapper(JObject jo, OutParamWrapper outParamWrapper)
  756. {
  757. string err;
  758. int iresult = updateAuxInfo(jo, out err);
  759. outParamWrapper.Value = err;
  760. return iresult;
  761. }
  762. public int updateAuxInfo(JObject jo, out string err)
  763. {
  764. err = "";
  765. dynamic joData = (JObject)jo.DeepClone();
  766. JObject joRtn = cBus.InvokeMedicalInsuranceInquiry(TradeEnum.InsuDirectory.GetCode(), joData);
  767. if (joRtn["infcode"].ToString() == "0")
  768. {
  769. DataTable dtAuxInfo = (DataTable)joRtn["output"]["data"].ToObject(typeof(DataTable));
  770. DateTime dtToday = DateTime.Today;
  771. string chrgitm_lv = "";
  772. string begndate = "";
  773. string enddate = "";
  774. string list_type = "";
  775. string med_chrgitm_type = "";
  776. int iAdpater = 0;
  777. foreach (DataRow dr in dtAuxInfo.Rows)
  778. {
  779. DateTime dtBegin = getDataRowValue(dr, "begndate") == "" ? Convert.ToDateTime("2000-01-01 00:00:00") : Convert.ToDateTime(getDataRowValue(dr, "begndate"));
  780. DateTime dtEnd = getDataRowValue(dr, "enddate") == "" ? Convert.ToDateTime("2099-01-01 00:00:00") : Convert.ToDateTime(getDataRowValue(dr, "enddate"));
  781. if ((dtBegin < dtToday) && (dtToday < dtEnd))
  782. {
  783. iAdpater++;
  784. chrgitm_lv = dr["chrgitm_lv"].ToString();
  785. begndate = dtBegin.ToString("yyyy-MM-dd HH:mm:ss");
  786. enddate = dtEnd.ToString("yyyy-MM-dd HH:mm:ss");
  787. list_type = dr["list_type"].ToString();
  788. med_chrgitm_type = dr["med_chrgitm_type"].ToString();
  789. }
  790. }
  791. //有且只能有一条数据符合
  792. if (iAdpater == 1)
  793. {
  794. JObject joPamam = new JObject();
  795. joPamam.Add("Code", JsonHelper.getDestValue(jo, "code"));
  796. joPamam.Add("HisType", JsonHelper.getDestValue(jo, "HisType"));
  797. joPamam.Add("StartDate", begndate);
  798. joPamam.Add("EndDate", enddate);
  799. joPamam.Add("ChargeItemLevel", chrgitm_lv);
  800. joPamam.Add("ListType", list_type);
  801. joPamam.Add("ChargeItemType", med_chrgitm_type);
  802. JObject joUpdateRtn = mIS.UpdateDirectoryBySelf(joPamam);
  803. string error = "";
  804. if (JsonHelper.parseIrisRtnValue(joUpdateRtn, out error) != 0)
  805. {
  806. err = "修改失败:" + error;
  807. return -1;
  808. }
  809. else
  810. {
  811. err = "修改成功";
  812. return 0;
  813. }
  814. }
  815. else
  816. {
  817. err = "中心返回符合条数的记录不唯一或者为空,请检查!";
  818. return -1;
  819. }
  820. }
  821. else
  822. {
  823. err = "查询中心数据出错,请检查!";
  824. return -1;
  825. }
  826. }
  827. public int updateAuxAndCellPrice(JObject jo, out string error)
  828. {
  829. string err = "";
  830. int iResult = 0;
  831. error = "";
  832. if (updateAuxInfo(jo, out err) != 0)
  833. {
  834. error = $"更新目录信息失败{err}";
  835. iResult--;
  836. }
  837. //err = "";
  838. //if (updateCellingPrice(jo, out err) != 0)
  839. //{
  840. // error = $"{error};更新限价信息失败{err}";
  841. // iResult--;
  842. //}
  843. return iResult;
  844. }
  845. #endregion
  846. #region 导入
  847. #endregion
  848. #region 处理DataError
  849. public void dataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
  850. {
  851. // 🔴 关键:阻止异常继续抛出,程序不会崩溃
  852. e.ThrowException = false;
  853. //// 可选:记录日志(用于调试)
  854. //System.Diagnostics.Debug.WriteLine($"[DataError] Context: {e.Context}, Error: {e.Exception.Message}");
  855. //// 可选:根据需要清理单元格
  856. //if (e.Context == DataGridViewDataErrorContexts.Parsing)
  857. //{
  858. // // 解析失败时,可以清空单元格或设置默认值
  859. // DataGridView dgv = (DataGridView)sender;
  860. // dgv[e.ColumnIndex, e.RowIndex].Value = null; // 或其他默认值
  861. //}
  862. }
  863. #endregion
  864. }
  865. }