CaseFrontSheetMainService.java 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992
  1. package thyyxxk.webserver.service.inpatient.casefrontsheet;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.alibaba.fastjson.serializer.SerializerFeature;
  6. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.springframework.scheduling.annotation.Scheduled;
  9. import org.springframework.stereotype.Service;
  10. import org.springframework.transaction.annotation.Transactional;
  11. import org.springframework.web.client.RestTemplate;
  12. import thyyxxk.webserver.config.exception.ExceptionEnum;
  13. import thyyxxk.webserver.constants.sidicts.Insutype;
  14. import thyyxxk.webserver.constants.sidicts.MedType;
  15. import thyyxxk.webserver.dao.his.LoginDao;
  16. import thyyxxk.webserver.dao.his.inpatient.casefrontsheet.BasSelectOverviewDao;
  17. import thyyxxk.webserver.dao.his.inpatient.casefrontsheet.CaseFrontSheetDao;
  18. import thyyxxk.webserver.dao.his.inpatient.casefrontsheet.SheetCreatedDao;
  19. import thyyxxk.webserver.entity.ResultVo;
  20. import thyyxxk.webserver.entity.api.forpowersi.drgdip.frontsheetqualitycheck.QualityCheckParams;
  21. import thyyxxk.webserver.entity.casefrontsheet.*;
  22. import thyyxxk.webserver.entity.casefrontsheet.request.*;
  23. import thyyxxk.webserver.entity.casefrontsheet.response.SheetOverviewForBas;
  24. import thyyxxk.webserver.entity.covid.Region;
  25. import thyyxxk.webserver.entity.dictionary.CodeName;
  26. import thyyxxk.webserver.entity.dictionary.HisWjwMatchEntity;
  27. import thyyxxk.webserver.service.externalhttp.PowersiSrvc;
  28. import thyyxxk.webserver.service.zhuyuanyisheng.emr.EmrServer;
  29. import thyyxxk.webserver.utils.*;
  30. import java.lang.reflect.Field;
  31. import java.lang.reflect.Method;
  32. import java.util.*;
  33. import java.util.concurrent.ConcurrentHashMap;
  34. import java.util.concurrent.TimeUnit;
  35. @Slf4j
  36. @Service
  37. public class CaseFrontSheetMainService {
  38. private static ConcurrentHashMap<String, List<CodeName>> allDictionary;
  39. private final CaseFrontSheetDao dao;
  40. private final SheetCreatedDao createdDao;
  41. private final BasSelectOverviewDao basDao;
  42. private final LoginDao userDao;
  43. private final PowersiSrvc srvc;
  44. private final EmrServer emrService;
  45. public CaseFrontSheetMainService(SheetCreatedDao createdDao, CaseFrontSheetDao dao, BasSelectOverviewDao basDao,
  46. LoginDao userDao, PowersiSrvc srvc, EmrServer emrService) {
  47. this.dao = dao;
  48. this.createdDao = createdDao;
  49. this.basDao = basDao;
  50. this.userDao = userDao;
  51. this.srvc = srvc;
  52. this.emrService = emrService;
  53. if (allDictionary == null) {
  54. allDictionary = new ConcurrentHashMap<>();
  55. }
  56. }
  57. public ResultVo<Map<String, List<CodeName>>> getAllDictionary() {
  58. if (allDictionary.isEmpty()) {
  59. allDictionary.put("getMarriageCode", createdDao.getMarriageCode());
  60. allDictionary.put("getSexCode", createdDao.getSexCode());
  61. allDictionary.put("getAdmissWay", createdDao.getAdmissWay());
  62. allDictionary.put("getBloodType", createdDao.getBloodType());
  63. allDictionary.put("getAnaesthesia", createdDao.getAnaesthesia());
  64. allDictionary.put("getOperateScale", createdDao.getOperateScale());
  65. allDictionary.put("getAdmissStatus", createdDao.getAdmissStatus());
  66. allDictionary.put("getDisAdmissStatus", createdDao.getDisAdmissStatus());
  67. allDictionary.put("getCutHealGrade", createdDao.getCutHealGrade());
  68. allDictionary.put("getDisdiagStatus", createdDao.getDisdiagStatus());
  69. allDictionary.put("getHbsag", createdDao.getHbsag());
  70. allDictionary.put("getDiagConform", createdDao.getDiagConform());
  71. allDictionary.put("getDisdiagType", createdDao.getDisdiagType());
  72. allDictionary.put("getPatientStatus", createdDao.getPatientStatus());
  73. allDictionary.put("getQualityLevel", createdDao.getQualityLevel());
  74. allDictionary.put("getZyDismissWay", createdDao.getZyDismissWay());
  75. allDictionary.put("getTumorLevelT", createdDao.getTumorLevelT());
  76. allDictionary.put("getTumorLevelN", createdDao.getTumorLevelN());
  77. allDictionary.put("getTumorLevelM", createdDao.getTumorLevelM());
  78. allDictionary.put("getTumorLevel", createdDao.getTumorLevel());
  79. allDictionary.put("getRelations", createdDao.getRelations());
  80. List<CodeName> temp = new ArrayList<>();
  81. temp.add(new CodeName());
  82. temp.addAll(createdDao.getStatutoryEpidemic());
  83. allDictionary.put("getStatutoryEpidemic", temp);
  84. allDictionary.put("getClinicalPathwayManagement", createdDao.getClinicalPathwayManagement());
  85. allDictionary.put("getDrgsManagement", createdDao.getDrgsManagement());
  86. allDictionary.put("getCaseClassification", createdDao.getCaseClassification());
  87. allDictionary.put("getOccupation", createdDao.getOccupation());
  88. allDictionary.put("getCountry", createdDao.getCountry());
  89. allDictionary.put("getNation", createdDao.getNation());
  90. allDictionary.put("getPayMethod", createdDao.getPayMethod());
  91. }
  92. return ResultVoUtil.success(allDictionary);
  93. }
  94. public ResultVo<String> resetDictionary() {
  95. allDictionary.clear();
  96. return ResultVoUtil.success();
  97. }
  98. @Scheduled(cron = "0 0 3 * * ?")
  99. public void refreshDictionary() {
  100. resetDictionary();
  101. }
  102. public ResultVo<List<CodeName>> getUserWards() {
  103. String code = TokenUtil.getInstance().getTokenUserId();
  104. List<Integer> roles = createdDao.selectUserRoles(code);
  105. List<CodeName> list;
  106. if (roles.contains(7) || roles.contains(1)) {
  107. list = createdDao.getAllWards();
  108. } else {
  109. list = createdDao.getUserWards(code);
  110. }
  111. list.removeIf(Objects::isNull);
  112. return ResultVoUtil.success(list);
  113. }
  114. public ResultVo<List<CodeName>> getAllWards() {
  115. return ResultVoUtil.success(createdDao.getAllWards());
  116. }
  117. public ResultVo<List<SheetOverview>> getPatientOverview(String ward) {
  118. return ResultVoUtil.success(dao.getPatientOverview(ward));
  119. }
  120. public ResultVo<List<SheetOverview>> getOutPatient(DismissedSheetInquiry param) {
  121. param.setEnd(param.getEnd() + " 23:59:59");
  122. if (StringUtil.isBlank(param.getWard())) {
  123. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "请选择科室!");
  124. }
  125. return ResultVoUtil.success(dao.getOutPatients(param));
  126. }
  127. /**
  128. * 查询病案首页汇总
  129. *
  130. * @param param 查询的条件
  131. * @return 返回数据
  132. */
  133. public ResultVo<SheetOverviewForBas> getOutPatientForBas(DismissedSheetInquiry param) {
  134. SheetOverviewForBas response = new SheetOverviewForBas();
  135. if (StringUtil.notBlank(param.getWard())) {
  136. int cd = dao.getCDBlfxCount(param.getWard());
  137. int all = dao.getAllDisPatientCount(param.getWard());
  138. if (cd == 0 || all == 0) {
  139. response.setCdPercentage("0.00%");
  140. } else {
  141. response.setCdPercentage(DecimalUtil.getPercent(cd, all));
  142. }
  143. }
  144. if (StringUtil.notBlank(param.getStart())) {
  145. param.setStart(param.getStart() + " 00:00:00");
  146. }
  147. if (StringUtil.notBlank(param.getEnd())) {
  148. param.setEnd(param.getEnd() + " 23:59:59");
  149. }
  150. List<SheetOverview> baseList;
  151. List<SheetOverview> seedList;
  152. if (StringUtil.notBlank(param.getBah())) {
  153. baseList = basDao.selectPatientsFromSignedBase(param);
  154. seedList = basDao.selectPatientsForBasByBah(param);
  155. baseList = removeDuplicateData(baseList, seedList);
  156. if (baseList.isEmpty()) {
  157. String describe = param.getFileStatus() == 0 ? "未归档" : "已归档";
  158. return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST,
  159. "没有找到此患者的" + describe + "病案。");
  160. }
  161. if (param.getLateFlag() != 3) {
  162. baseList.removeIf(item -> !item.getLateFlag().equals(param.getLateFlag()));
  163. }
  164. response.setList(baseList);
  165. return ResultVoUtil.success(response);
  166. }
  167. if (StringUtil.notBlank(param.getWard())) {
  168. baseList = basDao.selectPatientsForBasByWard2(param);
  169. seedList = basDao.selectPatientsForBasByWard(param);
  170. baseList = removeDuplicateData(baseList, seedList);
  171. if (param.getLateFlag() != 3) {
  172. baseList.removeIf(item -> !item.getLateFlag().equals(param.getLateFlag()));
  173. }
  174. response.setList(baseList);
  175. return ResultVoUtil.success(response);
  176. }
  177. baseList = basDao.selectPatientsForBasByFileStatus2(param);
  178. seedList = basDao.selectPatientsForBasByFileStatus(param);
  179. baseList = removeDuplicateData(baseList, seedList);
  180. if (param.getLateFlag() != 3) {
  181. baseList.removeIf(item -> !item.getLateFlag().equals(param.getLateFlag()));
  182. }
  183. response.setList(baseList);
  184. return ResultVoUtil.success(response);
  185. }
  186. private List<SheetOverview> removeDuplicateData(List<SheetOverview> baseList,
  187. List<SheetOverview> seedList) {
  188. if (baseList.isEmpty()) {
  189. return seedList;
  190. }
  191. if (seedList.isEmpty()) {
  192. return baseList;
  193. }
  194. Map<String, Integer> map = new HashMap<>(seedList.size());
  195. for (SheetOverview overview : seedList) {
  196. String key = overview.getBah().trim() + "-" + overview.getTimes();
  197. map.put(key, 1);
  198. }
  199. baseList.removeIf(item -> map.containsKey(item.getBah().trim() + "-" + item.getTimes()));
  200. baseList.addAll(seedList);
  201. return baseList;
  202. }
  203. public ResultVo<CaseFrontsheetMain> getPatientInfo(SheetOverview overview) {
  204. String bah = overview.getBah();
  205. Integer times = overview.getTimes();
  206. if (overview.getRenew()) {
  207. dao.deleteOldSheet(bah, times);
  208. }
  209. StandardAddressMember standardAddressMember = getStandardAddressMember(bah);
  210. CaseFrontsheetMain sheet = dao.selectSignedSheetMain(bah, times);
  211. if (null != sheet) {
  212. sheet.setDisdiagList(getSheetDisDiags(bah, times, 1));
  213. sheet.setSurgeryList(getSheetSurgeries(bah, times, 1));
  214. if (null != standardAddressMember) {
  215. sheet.setStandardAddress(standardAddressMember.makeStandardAddress());
  216. }
  217. if (sheet.getAge() == 0 && null == sheet.getAgeDays()) {
  218. sheet.setAgeDays(DateUtil.calculateNewBornAge(sheet.getBirthDate(), sheet.getAdmissDate()));
  219. dao.updateNewBornAge(bah, times, sheet.getAgeDays());
  220. }
  221. if (StringUtil.isBlank(sheet.getMedType())) {
  222. String psnmedtype = dao.selectMedType(sheet.getBah(), sheet.getAdmissTimes());
  223. MedType medType = MedType.get(psnmedtype);
  224. if (null != medType) {
  225. sheet.setMedType(psnmedtype);
  226. sheet.setMedTypeName(medType.getName());
  227. }
  228. }
  229. if (null == sheet.getDismissDate()) {
  230. Date dismissDate = dao.getDismissDateFromYzActOrder("yz_act_order", bah, times);
  231. if (null == dismissDate) {
  232. dismissDate = dao.getDismissDateFromYzActOrder("yz_inact_order", bah, times);
  233. }
  234. sheet.setDismissDate(dismissDate);
  235. Integer days = DateUtil.daysBetween(dismissDate, sheet.getAdmissDate());
  236. sheet.setAdmissDays(0 == days ? "1" : String.valueOf(days));
  237. }
  238. if (StringUtil.isBlank(sheet.getAdmissDays()) || sheet.getAdmissDays().equals("-1")) {
  239. Integer days = DateUtil.daysBetween(sheet.getDismissDate(), sheet.getAdmissDate());
  240. sheet.setAdmissDays(0 == days ? "1" : String.valueOf(days));
  241. }
  242. autoFillPart(sheet);
  243. return ResultVoUtil.success(sheet);
  244. }
  245. int flag = overview.getInOutFlag();
  246. if (flag == 2) {
  247. flag = dao.selectActCount(bah, times) > 0 ? 1 : 2;
  248. }
  249. sheet = dao.getAPatientMi(bah);
  250. CaseFrontsheetMain sheet1 = flag == 1 ? dao.getZyActPatient("zy_actpatient", "yz_act_order", bah, times) :
  251. dao.getZyActPatient("zy_inactpatient", "yz_inact_order", bah, times);
  252. if (null == sheet1) {
  253. sheet1 = flag == 1 ? dao.getZyActPatient("zy_inactpatient", "yz_inact_order", bah, times) :
  254. dao.getZyActPatient("zy_actpatient", "yz_act_order", bah, times);
  255. }
  256. sheet.setAge(DateUtil.calculateAge(sheet.getBirthDate(), sheet1.getAdmissDate()));
  257. if (null != sheet.getAge() && sheet.getAge() == 0) {
  258. sheet.setAgeDays(DateUtil.calculateNewBornAge(sheet.getBirthDate(), sheet1.getAdmissDate()));
  259. }
  260. if (StringUtil.isBlank(sheet1.getMedType())) {
  261. String injurySerialNo = dao.selectInjurySerialNo(bah, times);
  262. if (StringUtil.notBlank(injurySerialNo)) {
  263. sheet1.setMedType("42");
  264. }
  265. }
  266. sheet1.setMedTypeName(MedType.getName(sheet1.getMedType()));
  267. sheet1.setInsutype(Insutype.getName(sheet1.getInsutype()));
  268. final int hasInfant = dao.getInfant(bah, times);
  269. sheet1.setHasInfant(String.valueOf(hasInfant));
  270. if (null == sheet1.getDismissDate()) {
  271. final Date dismissDate = flag == 1 ?
  272. dao.getDismissDateFromYzActOrder("yz_inact_order", bah, times)
  273. : dao.getDismissDateFromYzActOrder("yz_act_order", bah, times);
  274. sheet1.setDismissDate(dismissDate);
  275. }
  276. CaseFrontsheetMain sheet2 = dao.getBatjBa1(bah, times);
  277. if (sheet2 == null && dao.isBatjBa1Exist(bah, times) == 0) {
  278. dao.createBatjBa1(bah, times, sheet.getName(), sheet1.getAdmissDate(),
  279. sheet1.getAdmissDept(), sheet1.getAdmissWard());
  280. log.info("insert batjBa1>>> " + bah + ", " + times);
  281. }
  282. CaseFrontsheetMain sheet3 = flag == 1 ? dao.getBatjBa2ForInPatient(bah, times) :
  283. dao.getBatjBa2ForOutPatient(bah, times);
  284. if (sheet3 == null && dao.isBatjBa2Exist(bah, times) == 0) {
  285. dao.createBatjBa2(bah, times);
  286. log.info("insert batjBa2>>> " + bah + ", " + times);
  287. }
  288. mergeObject(sheet1, sheet);
  289. mergeObject(sheet2, sheet);
  290. mergeObject(sheet3, sheet);
  291. Integer days = DateUtil.daysBetween(sheet.getDismissDate(), sheet.getAdmissDate());
  292. sheet.setAdmissDays(0 == days ? "1" : String.valueOf(days));
  293. if (null == sheet.getQualityControlDate()) {
  294. sheet.setQualityControlDate(new Date());
  295. }
  296. sheet.setDisdiagList(getSheetDisDiags(bah, times, 0));
  297. sheet.setSurgeryList(getSheetSurgeries(bah, times, 0));
  298. if (null == standardAddressMember) {
  299. sheet.setLivePlaceCombo(sheet.getLivePlace());
  300. } else {
  301. sheet.setStandardAddress(standardAddressMember.makeStandardAddress());
  302. sheet.setLivePlaceCombo(standardAddressMember.makeAddressCombo() + sheet.getLivePlace());
  303. }
  304. List<CodeName> patCharges = dao.selectPatCharges(bah, times);
  305. for (CodeName item : patCharges) {
  306. String code = String.valueOf(item.getCode().charAt(0)).toUpperCase() +
  307. item.getCode().substring(1);
  308. try {
  309. Method m = sheet.getClass().getMethod("set" + code, String.class);
  310. m.invoke(sheet, item.getName());
  311. } catch (Exception e) {
  312. log.error("反射出错", e);
  313. }
  314. }
  315. sheet.setSurgicalFee(DecimalUtil.add(sheet.getAnesthetizeFee(), sheet.getSurgeryFee()));
  316. autoFillPart(sheet);
  317. return ResultVoUtil.success(sheet);
  318. }
  319. private void autoFillPart(CaseFrontsheetMain sheet) {
  320. String patNo = sheet.getBah();
  321. int times = sheet.getAdmissTimes();
  322. if (StringUtil.isBlank(sheet.getCaseClassification())) {
  323. String blfxElement = dao.selectBlfxElement(patNo, times);
  324. if (StringUtil.notBlank(blfxElement)) {
  325. JSONObject blfxObj = JSONObject.parseObject(blfxElement);
  326. JSONArray blfxArray = blfxObj.getJSONArray("病例分型");
  327. if (null != blfxArray && !blfxArray.isEmpty()) {
  328. JSONObject blfxItem = blfxArray.getJSONObject(0);
  329. sheet.setCaseClassification(blfxItem.getString("code"));
  330. }
  331. }
  332. }
  333. if (StringUtil.isBlank(sheet.getBacilliculture())) {
  334. int bacillicultureCount = dao.selectBacillicultureCount(patNo, times);
  335. sheet.setBacilliculture(bacillicultureCount > 0 ? "1" : "2");
  336. }
  337. if (StringUtil.isBlank(sheet.getStatutoryEpidemic())) {
  338. List<Map<String, String>> epidemics = dao.selectStatutoryEpidemic(patNo, times);
  339. if (ListUtil.notBlank(epidemics)) {
  340. Map<String, String> epidemic = epidemics.get(0);
  341. if (StringUtil.notBlank(epidemic.get("a"))) {
  342. sheet.setStatutoryEpidemic("1");
  343. } else if (StringUtil.notBlank(epidemic.get("b"))) {
  344. sheet.setStatutoryEpidemic("2");
  345. } else if (StringUtil.notBlank(epidemic.get("c"))) {
  346. sheet.setStatutoryEpidemic("3");
  347. }
  348. }
  349. }
  350. if (StringUtil.isBlank(sheet.getUseAntibiotic())) {
  351. int antibioticCounts = dao.selectAntibiotics(patNo, times);
  352. sheet.setUseAntibiotic(antibioticCounts > 0 ? "1" : "2");
  353. }
  354. }
  355. private StandardAddressMember getStandardAddressMember(String bah) {
  356. StandardAddressMember member = dao.selectStandardAddressMember(bah);
  357. if (null != member) {
  358. return member;
  359. }
  360. String socialNo = dao.selectSocialNo(bah);
  361. if (null == socialNo || socialNo.trim().length() < 15) {
  362. return null;
  363. }
  364. Integer district;
  365. try {
  366. district = Integer.parseInt(socialNo.substring(0, 6));
  367. } catch (Exception e) {
  368. return null;
  369. }
  370. Region city = dao.selectParentRegion(district);
  371. if (null == city) {
  372. return null;
  373. }
  374. Region province = dao.selectParentRegion(city.getCode());
  375. if (null == province) {
  376. return null;
  377. }
  378. member = new StandardAddressMember();
  379. member.setCityCode(city.getCode());
  380. member.setCityName(city.getName());
  381. member.setDistrictCode(district);
  382. member.setDistrictName(dao.selectRegionName(district));
  383. member.setProvinceCode(province.getCode());
  384. member.setProvinceName(province.getName());
  385. return member;
  386. }
  387. private List<CaseFrontsheetDisdiag> getSheetDisDiags(String bah, int times, int status) {
  388. List<CaseFrontsheetDisdiag> disdiags = status == 1 ?
  389. dao.selectSignedSheetDiags(bah, times) : dao.getDisdiags(bah, times);
  390. if (disdiags.isEmpty()) {
  391. JSONObject emrPatientData = emrService.getEmrPatientData(bah, times);
  392. JSONArray diagList;
  393. try {
  394. diagList = emrPatientData.getJSONArray("出院诊断");
  395. } catch (Exception e) {
  396. diagList = null;
  397. }
  398. if (null != diagList) {
  399. for (int i = 0; i < diagList.size(); i++) {
  400. JSONObject diagItem = diagList.getJSONObject(i);
  401. CaseFrontsheetDisdiag diag = dao.selectDiagInfoByCode(diagItem.getString("code"));
  402. if (null != diag) {
  403. diag.setNo(disdiags.size() + 1);
  404. disdiags.add(diag);
  405. }
  406. }
  407. }
  408. }
  409. while (disdiags.size() < 27) {
  410. disdiags.add(new CaseFrontsheetDisdiag());
  411. }
  412. return disdiags;
  413. }
  414. private List<CaseFrontsheetSurgery> getSheetSurgeries(String bah, int times, int status) {
  415. List<CaseFrontsheetSurgery> surgeries = status == 1 ?
  416. dao.selectSignedSheetSurgeries(bah, times) : dao.getSurgeries(bah, times);
  417. if (surgeries.isEmpty()) {
  418. JSONArray oprtList = emrService.getPatientSurgery(bah, times);
  419. for (int i = 0; i < oprtList.size(); i++) {
  420. JSONObject oprtItem = oprtList.getJSONObject(i);
  421. JSONObject oprtName;
  422. try {
  423. oprtName = oprtItem.getJSONObject("手术名称");
  424. } catch (Exception e) {
  425. continue;
  426. }
  427. if (null == oprtName) {
  428. continue;
  429. }
  430. JSONArray oprtNameVals = oprtName.getJSONArray("value");
  431. if (null == oprtNameVals) {
  432. continue;
  433. }
  434. String opdate = oprtItem.getJSONObject("手术日期").getString("value");
  435. JSONArray oprtorArr = oprtItem.getJSONObject("术者").getJSONArray("value");
  436. JSONObject oprtor = null == oprtorArr ? new JSONObject() : oprtorArr.getJSONObject(0);
  437. JSONObject assis1 = new JSONObject();
  438. JSONObject firstAssist = oprtItem.getJSONObject("第一助手");
  439. if (null != firstAssist) {
  440. JSONArray assis1Arr = firstAssist.getJSONArray("value");
  441. assis1 = null == assis1Arr ? assis1 : assis1Arr.getJSONObject(0);
  442. }
  443. JSONObject assis2 = new JSONObject();
  444. JSONObject secondAssist = oprtItem.getJSONObject("第二助手");
  445. if (null != secondAssist) {
  446. JSONArray assis2Arr = secondAssist.getJSONArray("value");
  447. assis2 = null == assis2Arr ? assis2 : assis2Arr.getJSONObject(0);
  448. }
  449. JSONObject anstor = new JSONObject();
  450. JSONObject anesDor = oprtItem.getJSONObject("麻醉医生");
  451. if (null != anesDor) {
  452. JSONArray anstorArr = anesDor.getJSONArray("value");
  453. anstor = null == anstorArr ? anstor : anstorArr.getJSONObject(0);
  454. }
  455. for (int j = 0; j < oprtNameVals.size(); j++) {
  456. JSONObject oprtCodeName = oprtNameVals.getJSONObject(j);
  457. CaseFrontsheetSurgery surgery = dao.selectSurgeryByCode(oprtCodeName.getString("code"));
  458. if (null != surgery) {
  459. surgery.setNo(surgeries.size() + 1);
  460. surgery.setDate(DateUtil.parse(opdate));
  461. surgery.setOperator(oprtor.getString("code"));
  462. surgery.setOperatorName(oprtor.getString("name"));
  463. surgery.setAssistantOne(assis1.getString("code"));
  464. surgery.setAssistantOneName(assis1.getString("name"));
  465. surgery.setAssistantTwo(assis2.getString("code"));
  466. surgery.setAssistantTwoName(assis2.getString("name"));
  467. surgery.setAnaesthesiaor(anstor.getString("code"));
  468. surgery.setAnaesthesiaorName(anstor.getString("name"));
  469. surgeries.add(surgery);
  470. }
  471. }
  472. }
  473. }
  474. while (surgeries.size() < 5) {
  475. surgeries.add(new CaseFrontsheetSurgery());
  476. }
  477. return surgeries;
  478. }
  479. private void mergeObject(CaseFrontsheetMain origin, CaseFrontsheetMain destination) {
  480. if (origin == null || destination == null) {
  481. return;
  482. }
  483. Field[] fields = destination.getClass().getDeclaredFields();
  484. for (Field field : fields) {
  485. try {
  486. field.setAccessible(true);
  487. Object valueD = field.get(origin);
  488. Object valueO = field.get(destination);
  489. if (null == valueO) {
  490. field.set(destination, valueD);
  491. }
  492. field.setAccessible(false);
  493. } catch (Exception e) {
  494. log.error("合并实体类出错", e);
  495. }
  496. }
  497. }
  498. private ResultVo<List<CodeName>> saveSheet(CaseFrontsheetMain sheet) {
  499. String bah = sheet.getBah();
  500. int times = sheet.getAdmissTimes();
  501. if (StringUtil.notBlank(sheet.getSocialNo())) {
  502. sheet.setSocialNo(sheet.getSocialNo().toUpperCase());
  503. }
  504. dao.updateAPatientMi(sheet);
  505. Integer[] addrs = sheet.getStandardAddress();
  506. if (null != addrs && addrs.length > 0) {
  507. Integer province = addrs[0];
  508. Integer city = addrs.length > 1 ? addrs[1] : null;
  509. Integer district = addrs.length > 2 ? addrs[2] : null;
  510. dao.updateAddressCascader(bah, province, city, district);
  511. }
  512. dao.updateZyActPatient(bah, times, sheet.getAutopsy(), sheet.getDiagConform1(),
  513. sheet.getDiagConform2(), sheet.getDiagConform3(), sheet.getDiagConform4(),
  514. sheet.getDiagConform5(), sheet.getHasSurgery(), sheet.getPathologicDiagStr(),
  515. sheet.getPathologicDiagCode(), sheet.getClinicDiagCode(), sheet.getClinicDiagStr());
  516. dao.updateZyInActPatient(bah, times, sheet.getAutopsy(), sheet.getDiagConform1(), sheet.getDiagConform2(),
  517. sheet.getDiagConform3(), sheet.getDiagConform4(), sheet.getDiagConform5(), sheet.getHasSurgery(),
  518. sheet.getPathologicDiagStr(), sheet.getPathologicDiagCode(), sheet.getClinicDiagCode(), sheet.getClinicDiagStr());
  519. dao.updateBatjBa1(sheet);
  520. dao.updateBatjBa2(sheet);
  521. dao.deleteOldDisdiag(bah, times);
  522. if (!sheet.getDisdiagList().isEmpty()) {
  523. List<CaseFrontsheetDisdiag> diags = sheet.getDisdiagList();
  524. for (int i = 0; i < diags.size(); i++) {
  525. CaseFrontsheetDisdiag item = diags.get(i);
  526. if (StringUtil.isBlank(item.getCode())) {
  527. break;
  528. }
  529. item.setNo(i + 1);
  530. item.setBah(bah);
  531. item.setTimes(times);
  532. dao.writeNewDisdiag(item);
  533. }
  534. }
  535. dao.deleteOldSurgeryRecord(bah, times);
  536. if (!sheet.getSurgeryList().isEmpty()) {
  537. List<CaseFrontsheetSurgery> surgeries = sheet.getSurgeryList();
  538. for (int i = 0; i < surgeries.size(); i++) {
  539. CaseFrontsheetSurgery item = surgeries.get(i);
  540. if (StringUtil.isBlank(item.getCode())) {
  541. break;
  542. }
  543. if (null == item.getDate()) {
  544. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "手术日期不能为空!");
  545. }
  546. item.setNo(i + 1);
  547. item.setBah(bah);
  548. item.setTimes(times);
  549. dao.writeNewZySurgeryRecord(item);
  550. }
  551. }
  552. return ResultVoUtil.success();
  553. }
  554. private ResultVo<List<CodeName>> archiveSheet(CaseFrontsheetMain sheet) {
  555. String staff = TokenUtil.getInstance().getTokenUserId();
  556. List<Integer> roles = userDao.getUserRoles(staff);
  557. if (roles.contains(7) || roles.contains(1)) {
  558. String bah = sheet.getBah();
  559. int times = sheet.getAdmissTimes();
  560. int lateFlag = isLateSubmit(sheet.getDismissDate()) ? 1 : 0;
  561. sheet.setLateFlag(lateFlag);
  562. //插入数据 SignDate 签收日期 在点击签收后 向数据库中插入
  563. sheet.setSignDate(new Date());
  564. sheet.setSignStaff(staff);
  565. sheet.setFileStatus(1);
  566. //判断是否已经插入过了
  567. Integer fileStatus = dao.selectFileStatus(sheet.getBah(), sheet.getAdmissTimes());
  568. if (null == fileStatus) {
  569. insertSheetData(sheet);
  570. basDao.updateActFileStatus(bah, times, 1);
  571. return ResultVoUtil.success();
  572. }
  573. if (fileStatus == 1) {
  574. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "请勿重复签收 ( ˉ ⌓ ˉ ๑)");
  575. }
  576. dao.updateSignStatus(bah, times, lateFlag, staff);
  577. basDao.updateActFileStatus(bah, times, 1);
  578. return ResultVoUtil.success();
  579. }
  580. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "您没有签收首页的权限。");
  581. }
  582. private void insertSheetData(CaseFrontsheetMain sheet) {
  583. dao.deleteOldSheet(sheet.getBah(), sheet.getAdmissTimes());
  584. //在t_case_frontsheet_main表中插入 主体的内容
  585. dao.insert(sheet);
  586. //循环插主要的诊断
  587. QueryWrapper<CaseFrontsheetDisdiag> diagWrapper = new QueryWrapper<>();
  588. diagWrapper.eq("bah", sheet.getBah());
  589. diagWrapper.eq("times", sheet.getAdmissTimes());
  590. createdDao.delete(diagWrapper);
  591. for (CaseFrontsheetDisdiag caseFrontsheetDisdiag : sheet.getDisdiagList()) {
  592. caseFrontsheetDisdiag.setBah(sheet.getBah());
  593. caseFrontsheetDisdiag.setTimes(sheet.getAdmissTimes());
  594. if (caseFrontsheetDisdiag.getNo() != null) {
  595. createdDao.insert(caseFrontsheetDisdiag);
  596. }
  597. }
  598. //循环插入做过的手术
  599. QueryWrapper<CaseFrontsheetSurgery> surgeryWrapper = new QueryWrapper<>();
  600. surgeryWrapper.eq("bah", sheet.getBah());
  601. surgeryWrapper.eq("times", sheet.getAdmissTimes());
  602. basDao.delete(surgeryWrapper);
  603. for (CaseFrontsheetSurgery caseFrontsheetSurgery : sheet.getSurgeryList()) {
  604. caseFrontsheetSurgery.setBah(sheet.getBah());
  605. caseFrontsheetSurgery.setTimes(sheet.getAdmissTimes());
  606. if (caseFrontsheetSurgery.getNo() != null) {
  607. basDao.insert(caseFrontsheetSurgery);
  608. }
  609. }
  610. }
  611. @Transactional(rollbackFor = Exception.class)
  612. public synchronized ResultVo<String> unArchiveSheet(OpCaseFrontsheet param) {
  613. CaseFrontsheetMain sheet = param.getSheet();
  614. if (sheet.getFileStatus() == 0) {
  615. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "未签收的病案首页无需解除签收!");
  616. }
  617. dao.deleteOldSheet(sheet.getBah(), sheet.getAdmissTimes());
  618. Map<String, Object> map = new HashMap<>();
  619. map.put("bah", sheet.getBah());
  620. map.put("times", sheet.getAdmissTimes());
  621. createdDao.deleteByMap(map);
  622. basDao.deleteByMap(map);
  623. log.info("解除签收状态, 操作员:{} >>> 住院号:{}, 住院次数:{}",
  624. param.getStaffId(), sheet.getBah(), sheet.getAdmissTimes());
  625. basDao.updateActFileStatus(sheet.getBah(), sheet.getAdmissTimes(), 0);
  626. dao.writeBaOpLog(param.getOpType(), param.getStaffId(), sheet.getBah(), sheet.getAdmissTimes());
  627. log.info("写入病案操作日志, 操作员:{} >>> 住院号:{}, 住院次数:{}, 操作编码:{}",
  628. param.getStaffId(), sheet.getBah(), sheet.getAdmissTimes(), param.getOpType());
  629. return ResultVoUtil.success("已成功解除签收。");
  630. }
  631. private JSONObject powersiQualityCheck(CaseFrontsheetMain sheet) {
  632. JSONObject obj = new JSONObject();
  633. obj.put("functionId", "100138");
  634. JSONObject baseinfo = new JSONObject();
  635. baseinfo.put("name", sheet.getName());
  636. baseinfo.put("age", sheet.getAge());
  637. baseinfo.put("sex_id", sheet.getSex());
  638. Integer agedays = sheet.getAgeDays();
  639. baseinfo.put("nwb_age", agedays);
  640. baseinfo.put("out_hosp_id", FilterUtil.filterDismissWay(sheet.getZyDismissWay()));
  641. baseinfo.put("is_autopsy_id", sheet.getAutopsy());
  642. JSONObject inputParam = new JSONObject();
  643. inputParam.put("baseInfo", baseinfo);
  644. JSONArray hsptzdDagnsInfo = new JSONArray();
  645. for (CaseFrontsheetDisdiag diag : sheet.getDisdiagList()) {
  646. if (null == diag.getNo()) {
  647. break;
  648. }
  649. JSONObject itm = new JSONObject();
  650. itm.put("icd_code", diag.getCode());
  651. itm.put("dagns_type", diag.getNo() == 1 ? 1 : 2);
  652. itm.put("disease_name", diag.getName());
  653. itm.put("order", diag.getNo());
  654. hsptzdDagnsInfo.add(itm);
  655. }
  656. inputParam.put("hsptzdDagnsInfo", hsptzdDagnsInfo);
  657. JSONArray hsptzdOprtInfo = new JSONArray();
  658. for (CaseFrontsheetSurgery surgery : sheet.getSurgeryList()) {
  659. if (null == surgery.getNo()) {
  660. break;
  661. }
  662. JSONObject itm = new JSONObject();
  663. itm.put("oprt_code", surgery.getCode());
  664. itm.put("oprt_name", surgery.getName());
  665. itm.put("oprt_type", surgery.getNo() == 1 ? 1 : 2);
  666. itm.put("order", surgery.getNo());
  667. hsptzdOprtInfo.add(itm);
  668. }
  669. inputParam.put("hsptzdOprtInfo", hsptzdOprtInfo);
  670. obj.put("inputParam", inputParam);
  671. try {
  672. JSONObject result = srvc.setlQualityControl(obj);
  673. log.info("\n病案质控接口:\n参数:{}\n结果:{}", obj, result);
  674. return result;
  675. } catch (Exception e) {
  676. log.error("创智诊断校验访问失败:http://172.16.32.183:8917/mmg-transceiver/interfaceFactory/call");
  677. return null;
  678. }
  679. }
  680. public ResultVo<Map<String, List<CodeName>>> printVerification(OpCaseFrontsheet param) {
  681. CaseFrontsheetMain sheet = param.getSheet();
  682. Integer status = dao.selectFileStatus(sheet.getBah(), sheet.getAdmissTimes());
  683. if (null != status && status == 1) {
  684. List<Integer> roles = dao.getUserRoles(param.getStaffId());
  685. if (roles.contains(60)) {
  686. return ResultVoUtil.success();
  687. }
  688. if (!roles.contains(7)) {
  689. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "已最终归档病案首页无法打印!");
  690. }
  691. }
  692. sheet.setIsDoctorPrint(true);
  693. sheet.setAddressMember(getStandardAddress(sheet.getStandardAddress()));
  694. ResultVo<List<CodeName>> save = saveSheet(sheet);
  695. if (save.getCode() != ExceptionEnum.SUCCESS.getCode()) {
  696. Map<String, List<CodeName>> map = new HashMap<>();
  697. map.put("force", save.getData());
  698. return ResultVoUtil.fail(ExceptionEnum.INTERNAL_SERVER_ERROR, "校验未通过。", map);
  699. }
  700. Map<String, List<CodeName>> warnings = beginAnalyzeSheet(sheet, param.getOpType());
  701. if (warnings.get("force").isEmpty()) {
  702. if (param.getPage() == 2) {
  703. insertSheetAfterPrint(sheet);
  704. }
  705. if (warnings.get("advice").isEmpty()) {
  706. return ResultVoUtil.success();
  707. }
  708. }
  709. return ResultVoUtil.fail(ExceptionEnum.INTERNAL_SERVER_ERROR, "校验未通过。", warnings);
  710. }
  711. private void insertSheetAfterPrint(CaseFrontsheetMain sheet) {
  712. String bah = sheet.getBah();
  713. int times = sheet.getAdmissTimes();
  714. Integer fileStatus = dao.selectFileStatus(bah, times);
  715. if (null == fileStatus || 0 == fileStatus) {
  716. sheet.setFileStatus(0);
  717. insertSheetData(sheet);
  718. }
  719. }
  720. public ResultVo<List<CodeName>> saveVerify(OpCaseFrontsheet info) {
  721. CaseFrontsheetMain sheet = info.getSheet();
  722. if (sheet.getFileStatus() == 1 && !userDao.getUserRoles(TokenUtil.getInstance().getTokenUserId()).contains(7)) {
  723. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "已签收的病案首页无法保存,如需保存,请联系病案室对此病案解除签收。");
  724. }
  725. sheet.setAddressMember(getStandardAddress(sheet.getStandardAddress()));
  726. sheet.getSurgeryList().forEach(item -> {
  727. if (StringUtil.notBlank(item.getCode())) {
  728. item.setType(dao.selectOperationType(item.getCode()));
  729. }
  730. });
  731. final String bah = sheet.getBah();
  732. final int times = sheet.getAdmissTimes();
  733. int optype = info.getOpType();
  734. if (optype == 2) {
  735. dao.writeBaOpLog(optype, info.getStaffId(), bah, times);
  736. return archiveSheet(sheet);
  737. }
  738. List<CodeName> message = VerifyCaseFrontSheet.getInstance().saveVerify(sheet);
  739. if (message.isEmpty()) {
  740. dao.writeBaOpLog(optype, info.getStaffId(), bah, times);
  741. if (!sheet.getDisdiagList().isEmpty()) {
  742. sheet.setMainDisdiagStatus(sheet.getDisdiagList().get(0).getDismissStatus());
  743. }
  744. return optype == 1 ? saveSheet(sheet) : archiveSheet(sheet);
  745. }
  746. return ResultVoUtil.fail(ExceptionEnum.INTERNAL_SERVER_ERROR, "校验未通过。", message);
  747. }
  748. private Map<String, List<CodeName>> beginAnalyzeSheet(CaseFrontsheetMain sheet, int optype) {
  749. sheet.getSurgeryList().forEach(item -> {
  750. if (StringUtil.notBlank(item.getCode())) {
  751. item.setType(dao.selectOperationType(item.getCode()));
  752. }
  753. });
  754. List<CodeName> force = VerifyCaseFrontSheet.getInstance().printVerify(sheet, optype);
  755. CaseFrontsheetDisdiag disdiag = sheet.getDisdiagList().get(0);
  756. List<CodeName> advice = VerifyCaseFrontSheet.getInstance().adviseVerification(sheet.getSocialNo(), disdiag.getCode());
  757. setlQualityControlPass(sheet, advice);
  758. surgeryChargesVerify(sheet, advice);
  759. JSONObject powersi = powersiQualityCheck(sheet);
  760. if (null != powersi) {
  761. JSONObject responseEntity = powersi.getJSONObject("responseEntity");
  762. if (null != responseEntity) {
  763. JSONArray retarr = responseEntity.getJSONArray("newSettleMemInfo");
  764. if (null != retarr && !retarr.isEmpty()) {
  765. for (int i = 0; i < retarr.size(); i++) {
  766. advice.add(new CodeName("", retarr.getJSONObject(i).getString("result_msg")));
  767. }
  768. }
  769. }
  770. }
  771. Map<String, List<CodeName>> map = new HashMap<>();
  772. map.put("force", force);
  773. map.put("advice", advice);
  774. return map;
  775. }
  776. public ResultVo<Map<String, List<CodeName>>> sheetVerification(SheetOverview view) {
  777. if (StringUtil.isBlank(view.getBah()) || null == view.getTimes() || null == view.getInOutFlag()) {
  778. return ResultVoUtil.fail(ExceptionEnum.NULL_POINTER, "住院号、住院次数、在院状态不能为空。");
  779. }
  780. CaseFrontsheetMain sheet = getPatientInfo(view).getData();
  781. if (null == sheet) {
  782. return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST, "没有查询到病案数据。");
  783. }
  784. Map<String, List<CodeName>> warnings = beginAnalyzeSheet(sheet, 4);
  785. List<CodeName> forces = warnings.get("force");
  786. if (view.getInOutFlag() == 1) {
  787. forces.removeIf(item -> Objects.equals(item.getCode(), "dismissDate"));
  788. forces.removeIf(item -> Objects.equals(item.getCode(), "pathologicDiagCode"));
  789. }
  790. return ResultVoUtil.success(warnings);
  791. }
  792. public ResultVo<List<YiBaoDisdiag>> getYbDiags(String bah, int times) {
  793. List<YiBaoDisdiag> diags = dao.getYbDiags(bah, times);
  794. return ResultVoUtil.success(diags);
  795. }
  796. @Transactional
  797. public ResultVo<String> saveYbDiags(SaveYbDiag param) {
  798. dao.deleteOldYbDiag(param.getBah(), param.getTimes());
  799. List<String> diagCodes = new ArrayList<>();
  800. for (int i = 0; i < param.getYbDiags().size(); i++) {
  801. YiBaoDisdiag diag = param.getYbDiags().get(i);
  802. if (StringUtil.isBlank(diag.getCode())) {
  803. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "【诊断序号:" + diag.getNo() + "】诊断编码不能为空!");
  804. }
  805. if (StringUtil.isBlank(diag.getName())) {
  806. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "【诊断序号:" + diag.getNo() + "】诊断名称不能为空!");
  807. }
  808. if (StringUtil.isBlank(diag.getCyzg())) {
  809. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "【诊断序号:" + diag.getNo() + "】出院转归不能为空!");
  810. }
  811. if (null == diag.getSiDiagType()) {
  812. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "【诊断序号:" + diag.getNo() + "】诊断类别不能为空!");
  813. }
  814. if (diagCodes.contains(diag.getCode())) {
  815. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "【诊断编码:" + diag.getCode() + "】请勿填入重复的诊断!");
  816. }
  817. diagCodes.add(diag.getCode());
  818. diag.setNo(i + 1);
  819. diag.setBah(param.getBah());
  820. diag.setTimes(param.getTimes());
  821. dao.insertNewYbDiag(diag);
  822. }
  823. return ResultVoUtil.success();
  824. }
  825. public ResultVo<List<SheetOverview>> advanceSearch(AdvanceSearch param) {
  826. return ResultVoUtil.success(dao.advanceSearch(param));
  827. }
  828. public ResultVo<String> fetchSsfz(String code, String bah, Integer times) {
  829. DisefamilyGrade disefamilyGrade = dao.selectDisefamilyGrade(code);
  830. if (null == disefamilyGrade) {
  831. return ResultVoUtil.success("无对照的病种。");
  832. }
  833. boolean hasModified = dao.selectModified(bah, times) > 0;
  834. List<String> surgeries = hasModified ? dao.selectPatientSurgeryCodes(bah, times, "batj_ba4_modify")
  835. : dao.selectPatientSurgeryCodes(bah, times, "batj_ba4");
  836. if (ListUtil.isBlank(surgeries)) {
  837. return ResultVoUtil.success("有对照的非手术分值:" + disefamilyGrade.getNoneOprnGrade());
  838. }
  839. List<OprnDisefamilyGrade> oprnGrades = dao.selectOperationDisefamilies(disefamilyGrade.getDisefamilyCode());
  840. int ssfz = 0;
  841. for (OprnDisefamilyGrade oprn : oprnGrades) {
  842. if (surgeries.contains(oprn.getOprnCode())) {
  843. if (oprn.getOprnGrade() > ssfz) {
  844. ssfz = oprn.getOprnGrade();
  845. }
  846. }
  847. }
  848. if (ssfz != 0) {
  849. return ResultVoUtil.success("有对照的手术分值:" + ssfz);
  850. }
  851. return ResultVoUtil.success("有对照的非手术分值:" + disefamilyGrade.getNoneOprnGrade());
  852. }
  853. private boolean isLateSubmit(Date dismissDate) {
  854. long days = (System.currentTimeMillis() - dismissDate.getTime()) / 1000 / (3600 * 24);
  855. return (int) days > 7;
  856. }
  857. public void increaseDiagWeight(String code) {
  858. dao.increaseDiagWeight(code);
  859. }
  860. public ResultVo<CodeName> selectSiDiagByBaDiag(String code) {
  861. CodeName result = dao.selectSiDiagByBaDiag(code);
  862. if (null == result) {
  863. return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST, "没有查询到此诊断的医保对照诊断。");
  864. }
  865. return ResultVoUtil.success(result);
  866. }
  867. private StandardAddressMember getStandardAddress(Integer[] addrs) {
  868. if (null == addrs || addrs.length < 3) {
  869. return null;
  870. }
  871. return dao.selectStandardAddressMember2(addrs[0], addrs[1], addrs[2]);
  872. }
  873. private void setlQualityControlPass(CaseFrontsheetMain sheet, List<CodeName> messages) {
  874. String patNo = sheet.getBah();
  875. int times = sheet.getAdmissTimes();
  876. String admdvs = dao.selectSetlInsuplcAdmdvs(patNo, times);
  877. if (StringUtil.notBlank(admdvs) && admdvs.startsWith("43")) {
  878. Integer qualityPassed = dao.qualityPass(patNo, times);
  879. if (null == qualityPassed || qualityPassed != 1) {
  880. messages.add(new CodeName("", "此患者医保结算清单质控未通过!"));
  881. }
  882. }
  883. }
  884. private void surgeryChargesVerify(CaseFrontsheetMain sheet, List<CodeName> messages) {
  885. List<CaseFrontsheetSurgery> surgeries = sheet.getSurgeryList();
  886. if (null != surgeries && !surgeries.isEmpty()) {
  887. List<HisWjwMatchEntity> surgeryChargeCode = dao.selectSurgeryChargeCode(surgeries);
  888. for (HisWjwMatchEntity entity : surgeryChargeCode) {
  889. if (StringUtil.notBlank(entity.getWjwCode())) {
  890. entity.setChargeCode(entity.getWjwCode().split("\\^"));
  891. entity.setChargeName(entity.getWjwName().split("\\^"));
  892. Integer chargeSumamt = dao.selectChargeSumamt(sheet.getBah(), sheet.getAdmissTimes(), entity.getChargeCode());
  893. if (null == chargeSumamt || chargeSumamt < 1) {
  894. String charges = entity.getWjwName().replaceAll("\\^", ",");
  895. messages.add(new CodeName("surgeryTable", "患者有手术【" + entity.getName() +
  896. "】,但没有找到对应的收费项目【" + charges + "】。"));
  897. }
  898. }
  899. }
  900. }
  901. }
  902. public ResultVo<String> frontsheetQualityCheck(CaseFrontsheetMain sheet) {
  903. List<CodeName> anstWays = dao.selectZdAnstWays();
  904. Map<String, CodeName> anstWaysMap = new HashMap<>();
  905. for (CodeName item : anstWays) {
  906. anstWaysMap.put(item.getCode(), item);
  907. }
  908. List<CodeName> countries = dao.selectZdCountries();
  909. Map<String, CodeName> countriesMap = new HashMap<>();
  910. for (CodeName item : countries) {
  911. countriesMap.put(item.getCode(), item);
  912. }
  913. List<CodeName> nations = dao.selectZdNations();
  914. Map<String, CodeName> nationsMap = new HashMap<>();
  915. for (CodeName item : nations) {
  916. nationsMap.put(item.getCode(), item);
  917. }
  918. QualityCheckParams params = new QualityCheckParams();
  919. params.setBaseInfo(FrontSheetUtil.fillBaseInfoFromSheet(sheet, countriesMap, nationsMap));
  920. params.setDiseInfoList(FrontSheetUtil.fillDiseInfoFromSheet(sheet.getDisdiagList()));
  921. params.setOprtInfoList(FrontSheetUtil.fillOprtInfoFromSheet(sheet.getSurgeryList(), anstWaysMap));
  922. JSONObject jsonParams = JSONObject.parseObject(JSON.toJSONString(params, SerializerFeature.WriteNullStringAsEmpty));
  923. String url = "http://172.16.32.126:8080/drg_web/drgGroupThird/V2/groupAndQuality.action";
  924. RestTemplate template = new RestTemplate();
  925. String result = template.postForObject(url, jsonParams, String.class);
  926. result = "http://172.16.32.126:8080" + result;
  927. String url2 = "http://172.16.32.126:8080/drg_web/drgGroupThird/V2/drgGroupAndQuality.action";
  928. String result2 = template.postForObject(url2, jsonParams, String.class);
  929. log.info("病案质控:\n参数:{}\n结果:{}", jsonParams, result2);
  930. return ResultVoUtil.success(result);
  931. }
  932. public ResultVo<String> isMedinsSetl(String patNo, Integer times) {
  933. String admdvs = dao.selectSetlInsuplcAdmdvs(patNo, times);
  934. if (StringUtil.isBlank(admdvs)) {
  935. return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST, "自费及工伤患者无需进行医保结算单质控。");
  936. }
  937. if (!admdvs.startsWith("43")) {
  938. return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST, "跨省异地患者无需进行医保结算单质控。");
  939. }
  940. return ResultVoUtil.success();
  941. }
  942. }