CaseFrontSheetMainService.java 39 KB

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