VerifyCaseFrontSheet.java 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. package thyyxxk.webserver.service.casefrontsheet;
  2. import lombok.extern.slf4j.Slf4j;
  3. import thyyxxk.webserver.constants.Capacity;
  4. import thyyxxk.webserver.constants.sidicts.Insutype;
  5. import thyyxxk.webserver.entity.casefrontsheet.CaseFrontsheetDisdiag;
  6. import thyyxxk.webserver.entity.casefrontsheet.CaseFrontsheetMain;
  7. import thyyxxk.webserver.entity.casefrontsheet.CaseFrontsheetSurgery;
  8. import thyyxxk.webserver.entity.casefrontsheet.StandardAddressMember;
  9. import thyyxxk.webserver.entity.dictionary.CodeName;
  10. import thyyxxk.webserver.utils.DateUtil;
  11. import thyyxxk.webserver.utils.IdCardUtil;
  12. import thyyxxk.webserver.utils.StringUtil;
  13. import java.util.*;
  14. import java.util.regex.Matcher;
  15. import java.util.regex.Pattern;
  16. /**
  17. * @author dj
  18. */
  19. @Slf4j
  20. public class VerifyCaseFrontSheet {
  21. private static VerifyCaseFrontSheet INSTANCE;
  22. private VerifyCaseFrontSheet() { }
  23. public static VerifyCaseFrontSheet getInstance() {
  24. if (null == INSTANCE) {
  25. INSTANCE = new VerifyCaseFrontSheet();
  26. }
  27. return INSTANCE;
  28. }
  29. public List<CodeName> saveVerify(CaseFrontsheetMain sheet) {
  30. List<CodeName> array = new ArrayList<>();
  31. if (null != sheet.getLivePlace()) {
  32. try {
  33. byte[] livePlaceBytes = sheet.getLivePlace().getBytes("GBK");
  34. if (livePlaceBytes.length > 32) {
  35. array.add(new CodeName("livePlace", "患者现住址不能超过32个字节,当前字节数为" +
  36. livePlaceBytes.length + "(1汉字=2字节,1字母或数字=1字节)!"));
  37. }
  38. } catch (Exception e) {
  39. log.error("分析患者现住址长度出现异常", e);
  40. }
  41. }
  42. if (null != sheet.getHkPlaceName() && sheet.getHkPlaceName().length() > 10) {
  43. array.add(new CodeName("hkPlaceName", "患者户口地址不能超过10个汉字!"));
  44. }
  45. if (null != sheet.getUnitPlace() && sheet.getUnitPlace().length() > 16) {
  46. array.add(new CodeName("unitPlace", "患者单位地址不能超过16个汉字!"));
  47. }
  48. if (null != sheet.getContactAddrName() && sheet.getContactAddrName().length() > 16) {
  49. array.add(new CodeName("contactAddrName", "患者联系人地址不能超过16个汉字!"));
  50. }
  51. if (DateUtil.daysBetween(sheet.getQualityControlDate(), sheet.getDismissDate()) > 7) {
  52. array.add(new CodeName("qualityControlDate", "质控日期不能大于出院7天!"));
  53. }
  54. return connectedVerify(array, sheet, 1);
  55. }
  56. public List<CodeName> adviseVerification(String socialNo, String mainDisdiagCode) {
  57. List<CodeName> array = new ArrayList<>();
  58. if (StringUtil.invalidValue(socialNo)) {
  59. array.add(new CodeName("socialNo","请补全患者身份证!"));
  60. }
  61. if (!IdCardUtil.isValidatedIdCard(socialNo)) {
  62. array.add(new CodeName("socialNo","患者身份证不合法!"));
  63. }
  64. validateMainDiagnose(mainDisdiagCode, array);
  65. return array;
  66. }
  67. public List<CodeName> printVerify(CaseFrontsheetMain info, Integer opType) {
  68. List<CodeName> array = new ArrayList<>();
  69. if (StringUtil.isBlank(info.getPayMethod())) {
  70. array.add(new CodeName("payMethod", "医疗付费方式不能为空!"));
  71. }
  72. if (StringUtil.invalidValue(info.getName())) {
  73. array.add(new CodeName("name", "患者姓名不能为空!"));
  74. }
  75. if (null == info.getBirthDate()) {
  76. array.add(new CodeName("birthDate", "患者出生日期不能为空!"));
  77. }
  78. if (null == info.getAge()) {
  79. array.add(new CodeName("age","患者年龄不能为空!"));
  80. }
  81. if (StringUtil.invalidValue(info.getCountry())) {
  82. array.add(new CodeName("country","患者国籍不能为空!"));
  83. }
  84. if (StringUtil.invalidValue(info.getBirthPlace())) {
  85. array.add(new CodeName("birthPlaceName","患者出生地不能为空!"));
  86. }
  87. if (StringUtil.invalidValue(info.getNativePlace())) {
  88. array.add(new CodeName("nativePlaceName","患者籍贯不能为空!"));
  89. }
  90. if (StringUtil.invalidValue(info.getNation())) {
  91. array.add(new CodeName("nation","患者民族不能为空!"));
  92. }
  93. if (StringUtil.invalidValue(info.getOccupation())) {
  94. array.add(new CodeName("occupation","患者职业不能为空!"));
  95. }
  96. if (StringUtil.invalidValue(info.getMarriage())) {
  97. array.add(new CodeName("marriage","患者婚姻状况不能为空!"));
  98. }
  99. if (null == info.getStandardAddress() || info.getStandardAddress().length == 0 || null == info.getStandardAddress()[0]) {
  100. array.add(new CodeName("livePlace1","患者现住址(省/市/区)不能为空!"));
  101. }
  102. if (StringUtil.invalidValue(info.getLivePlace())) {
  103. array.add(new CodeName("livePlace2","患者现住址(街道/小区/乡镇)不能为空!"));
  104. }
  105. if (info.isDoctorPrint() && null != info.getAddressMember() && StringUtil.notBlank(info.getLivePlace())) {
  106. String liveAddress = info.getLivePlace();
  107. StandardAddressMember member = info.getAddressMember();
  108. if (liveAddress.contains(member.getProvinceName()) || liveAddress.contains(member.getCityName()) ||
  109. liveAddress.contains(member.getDistrictName())) {
  110. array.add(new CodeName("livePlace2","患者现住址有冗余重复!"));
  111. }
  112. }
  113. try {
  114. byte[] livePlaceBytes = info.getLivePlace().getBytes("GBK");
  115. if (livePlaceBytes.length > 32) {
  116. array.add(new CodeName("livePlace", "患者现住址不能超过32个字节,当前字节数为" + livePlaceBytes.length + "(1汉字=2字节,1字母或数字=1字节)!"));
  117. }
  118. } catch (Exception e) {
  119. log.error("分析患者现住址长度出现异常", e);
  120. }
  121. if (StringUtil.invalidValue(info.getPhone())) {
  122. array.add(new CodeName("phone","患者电话不能为空!"));
  123. }
  124. if (StringUtil.invalidValue(info.getHkPlaceName())) {
  125. array.add(new CodeName("hkPlaceName","患者户口地址不能为空!"));
  126. }
  127. // if (Objects.equals(info.getInsutype(), Insutype.BASIC_MEDICAL_INSURANCE_FOR_EMPLOYEES.getCode())) {
  128. // if (StringUtil.invalidValue(info.getUnitName()) || StringUtil.invalidValue(info.getUnitPlace())) {
  129. // array.add(new CodeName("unitName","患者工作单位及地址不能为空!"));
  130. // }
  131. // if (StringUtil.isBlank(info.getUnitPhone())) {
  132. // array.add(new CodeName("unitPhone","患者单位电话不能为空!"));
  133. // }
  134. // }
  135. if (StringUtil.invalidValue(info.getUnitName()) || StringUtil.invalidValue(info.getUnitPlace())) {
  136. array.add(new CodeName("unitName","患者工作单位及地址不能为空!"));
  137. }
  138. if (StringUtil.isBlank(info.getUnitPhone())) {
  139. array.add(new CodeName("unitPhone","患者单位电话不能为空!"));
  140. }
  141. if (StringUtil.isBlank(info.getUnitZipCode()) || info.getUnitZipCode().contains("-")) {
  142. array.add(new CodeName("unitZipCode", "患者工作单位邮编不能为空!"));
  143. }
  144. if (StringUtil.isBlank(info.getAddrZipCode()) || info.getAddrZipCode().contains("-")) {
  145. array.add(new CodeName("addrZipCode", "患者现住址邮编不能为空!"));
  146. }
  147. if (StringUtil.isBlank(info.getHkZipCode()) || info.getHkZipCode().contains("-")) {
  148. array.add(new CodeName("hkZipCode", "患者户口邮编不能为空!"));
  149. }
  150. if (StringUtil.invalidValue(info.getContactName())) {
  151. array.add(new CodeName("contactName","患者联系人姓名不能为空!"));
  152. }
  153. if (StringUtil.invalidValue(info.getContactRelation())) {
  154. array.add(new CodeName("contactRelation","患者联系人关系不能为空!"));
  155. }
  156. if (StringUtil.invalidValue(info.getContactAddrName())) {
  157. array.add(new CodeName("contactAddrName","患者联系人地址不能为空!"));
  158. } else {
  159. if (info.getContactAddrName().length() > 16) {
  160. array.add(new CodeName("contactAddrName", "患者联系人地址不能超过16个汉字!"));
  161. }
  162. }
  163. if (StringUtil.invalidValue(info.getContactPhone())) {
  164. array.add(new CodeName("contactPhone","患者联系人电话不能为空!"));
  165. }
  166. if (StringUtil.invalidValue(info.getZyAdmissWay())) {
  167. array.add(new CodeName("zyAdmissWay","患者入院途径不能为空!"));
  168. }
  169. if (null == info.getAdmissDate()) {
  170. array.add(new CodeName("admissDate","患者入院时间不能为空!"));
  171. }
  172. if (StringUtil.invalidValue(info.getAdmissDept())) {
  173. array.add(new CodeName("admissDept","患者入院科别不能为空!"));
  174. }
  175. if (StringUtil.invalidValue(info.getHasSurgery())) {
  176. array.add(new CodeName("hasSurgery","患者是否手术不能为空!"));
  177. }
  178. if (null == info.getDismissDate()) {
  179. array.add(new CodeName("dismissDate","患者出院时间不能为空!"));
  180. }
  181. if (StringUtil.invalidValue(info.getDismissDept())) {
  182. array.add(new CodeName("dismissDept","患者出院科别不能为空!"));
  183. }
  184. if (StringUtil.invalidValue(info.getAdmissDays())) {
  185. array.add(new CodeName("admissDays","患者住院天数不能为空!"));
  186. }
  187. if (StringUtil.isBlank(info.getClinicDiagCode()) || StringUtil.isBlank(info.getClinicDiagStr())) {
  188. array.add(new CodeName("clinicDiag", "患者门(急)诊诊断需要填写标准诊断,请补充。"));
  189. }
  190. CaseFrontsheetDisdiag disdiag = info.getDisdiagList().get(0);
  191. if (StringUtil.isBlank(disdiag.getName())) {
  192. array.add(new CodeName("disdiagMain","患者主要诊断不能为空!"));
  193. } else {
  194. // validateMainDiagnose(disdiag.getCode(), array);
  195. }
  196. if (null == info.getDisdiagList().get(0).getAdmissStatus()) {
  197. array.add(new CodeName("disdiagMainAdmStatus","患者主要诊断入院病情不能为空!"));
  198. }
  199. if (StringUtil.invalidValue(info.getAllergy())) {
  200. array.add(new CodeName("allergy","患者有无药物过敏不能为空!"));
  201. }
  202. if (null == info.getBloodType()) {
  203. array.add(new CodeName("bloodType","患者ABO血型不能为空!"));
  204. }
  205. if (null == info.getRh()) {
  206. array.add(new CodeName("rh","患者Rh血型不能为空!"));
  207. }
  208. if (StringUtil.invalidValue(info.getDeptLeader())) {
  209. array.add(new CodeName("deptLeaderName","科主任不能为空!"));
  210. }
  211. if (StringUtil.invalidValue(info.getLeaderDoctor())) {
  212. array.add(new CodeName("leaderDoctorName","主任(副主任)医师不能为空!"));
  213. }
  214. if (StringUtil.invalidValue(info.getMainDoctor())) {
  215. array.add(new CodeName("mainDoctorName","主治医师不能为空!"));
  216. }
  217. if (StringUtil.invalidValue(info.getAdmissDoctor())) {
  218. array.add(new CodeName("admissDoctorName","住院医师不能为空!"));
  219. }
  220. if (StringUtil.invalidValue(info.getDutyNurse())) {
  221. array.add(new CodeName("dutyNurseName","责任护士不能为空!"));
  222. }
  223. if (StringUtil.invalidValue(info.getCoder())) {
  224. array.add(new CodeName("coderName","编码员不能为空!"));
  225. }
  226. if (StringUtil.invalidValue(info.getQualityControlLevel())) {
  227. array.add(new CodeName("qualityControlLevel","病案质量不能为空!"));
  228. }
  229. if (StringUtil.invalidValue(info.getZyDismissWay())) {
  230. array.add(new CodeName("zyDismissWay","患者离院方式不能为空!"));
  231. }
  232. if (StringUtil.invalidValue(info.getAdmissAgainInOneMonth())) {
  233. array.add(new CodeName("admissAgainInOneMonth","患者是否有出院31天内再住院计划不能为空!"));
  234. }
  235. if (StringUtil.invalidValue(info.getQualityControlDoctor())) {
  236. array.add(new CodeName("qualityControlDoctorName","质控医生不能为空!"));
  237. }
  238. if (StringUtil.invalidValue(info.getQualityControlNurse())) {
  239. array.add(new CodeName("qualityControlNurseName","质控护士不能为空!"));
  240. }
  241. if (StringUtil.invalidValue(info.getCaseClassification())) {
  242. array.add(new CodeName("caseClassification","病例分型不能为空!"));
  243. }
  244. if (StringUtil.invalidValue(info.getHasIcu())) {
  245. array.add(new CodeName("hasIcu","实施重症监护不能为空!"));
  246. }
  247. if (StringUtil.isBlank(info.getMonopathyManagement())) {
  248. array.add(new CodeName("monopathyManagement","单病种管理不能为空!"));
  249. }
  250. if (StringUtil.isBlank(info.getClinicalPathwayManagement())) {
  251. array.add(new CodeName("clinicalPathwayManagement","实施临床路径管理不能为空!"));
  252. }
  253. if (StringUtil.isBlank(info.getUseAntibiotic())) {
  254. array.add(new CodeName("useAntibiotic","抗生素使用不能为空!"));
  255. }
  256. if (StringUtil.isBlank(info.getBacilliculture())) {
  257. array.add(new CodeName("bacilliculture","细菌培养标本送检不能为空!"));
  258. }
  259. if (zipCodeLengthWrong(info.getAddrZipCode())) {
  260. array.add(new CodeName("addrZipCode","现住址邮编长度错误!"));
  261. }
  262. if (zipCodeLengthWrong(info.getHkZipCode())) {
  263. array.add(new CodeName("hkZipCode","户口地址邮编长度错误!"));
  264. }
  265. if (zipCodeLengthWrong(info.getUnitZipCode())) {
  266. array.add(new CodeName("unitZipCode","工作地址邮编错误!"));
  267. }
  268. if (phoneLengthWrong(info.getPhone())) {
  269. array.add(new CodeName("phone","患者电话号码长度错误!"));
  270. }
  271. if (phoneLengthWrong(info.getContactPhone())) {
  272. array.add(new CodeName("contactPhone","联系人电话号码长度错误!"));
  273. }
  274. if (phoneLengthWrong(info.getUnitPhone())) {
  275. array.add(new CodeName("unitPhone","工作单位电话长度错误!"));
  276. }
  277. if (DateUtil.daysBetween(info.getDismissDate(), info.getAdmissDate()) < 0) {
  278. array.add(new CodeName("dismissDate","出院时间不能小于入院时间!"));
  279. }
  280. if (DateUtil.daysBetween(info.getBirthDate(), info.getAdmissDate()) > 0) {
  281. array.add(new CodeName("birthDate","出生时间不能大于入院时间!"));
  282. }
  283. if (DateUtil.daysBetween(info.getQualityControlDate(), info.getDismissDate()) > 7) {
  284. array.add(new CodeName("qualityControlDate","质控日期不能大于出院7天!"));
  285. }
  286. if (StringUtil.notBlank(info.getHkPlaceName()) && info.getHkPlaceName().length() > 10) {
  287. array.add(new CodeName("hkPlaceName", "患者户口地址不能超过10个汉字!"));
  288. }
  289. if (StringUtil.notBlank(info.getUnitPlace()) && info.getUnitPlace().length() > 16) {
  290. array.add(new CodeName("unitPlace", "患者单位地址不能超过16个汉字!"));
  291. }
  292. if (null != info.getAgeDays() && !isPositiveDigital(String.valueOf(info.getAgeDays()))) {
  293. array.add(new CodeName("ageDays", "不足1周岁婴儿的年龄请填写正整数。"));
  294. }
  295. if (null != info.getAgeDays() && info.getAgeDays() <= 28) {
  296. if (null == info.getNewBornWeight() || null == info.getNewBornAdmissWeight()) {
  297. array.add(new CodeName("newBornWeight","请填写新生儿出生体重和入院体重!"));
  298. }
  299. if (null != info.getNewBornWeight() && info.getNewBornWeight() < 1000) {
  300. array.add(new CodeName("newBornWeight","请填写合理的新生儿出生体重(不得少于1000g)!"));
  301. }
  302. if (null != info.getNewBornAdmissWeight() && info.getNewBornAdmissWeight() < 1000) {
  303. array.add(new CodeName("newBornAdmissWeight","请填写合理的新生儿入院体重(不得少于1000g)!"));
  304. }
  305. if (StringUtil.invalidValue(info.getXxeApgar())) {
  306. array.add(new CodeName("xxeApgar","新生儿Apgar评分不能为空!"));
  307. }
  308. }
  309. if (null != info.getAgeDays() && info.getAgeDays() > 28) {
  310. if (null != info.getNewBornWeight() || null != info.getNewBornAdmissWeight()) {
  311. array.add(new CodeName("newBornWeight","非新生儿请保持新生信息为空!"));
  312. }
  313. }
  314. if (null == info.getAgeDays() || 0 == info.getAgeDays()) {
  315. if (null != info.getNewBornWeight() || null != info.getNewBornAdmissWeight()) {
  316. array.add(new CodeName("ageDays","新生儿年龄不能为空!"));
  317. }
  318. }
  319. return connectedVerify(array, info, opType);
  320. }
  321. private List<CodeName> connectedVerify(List<CodeName> array, CaseFrontsheetMain info, Integer opType) {
  322. if (StringUtil.notBlank(info.getMarriage())) {
  323. if (info.getMarriage().equals("1") || info.getMarriage().equals("3") || info.getMarriage().equals("4")) {
  324. if (info.getContactRelation().equals("1")) {
  325. array.add(new CodeName("contactRelation", "当婚姻状况为未婚、丧偶、离婚时,患者联系人关系不允许为配偶!"));
  326. }
  327. }
  328. }
  329. if (StringUtil.notBlank(info.getZyDismissWay())) {
  330. if ("1".equals(info.getZyDismissWay()) || "2".equals(info.getZyDismissWay())) {
  331. if (StringUtil.invalidValue(info.getDismissDestination())) {
  332. array.add(new CodeName("dismissDestination","患者转入医疗机构不能为空!"));
  333. }
  334. }
  335. }
  336. if (StringUtil.notBlank(info.getHasSurgery()) && "0".equals(info.getHasSurgery()) && !"0".equals(info.getDiagConform3())) {
  337. array.add(new CodeName("diagConform3","无手术时,诊断符合情况中的术前与术后需要为【未做】!"));
  338. }
  339. if (StringUtil.notBlank(info.getHasSurgery())) {
  340. if ("1".equals(info.getHasSurgery()) || "2".equals(info.getHasSurgery()) || "3".equals(info.getHasSurgery())) {
  341. if ("0".equals(info.getDiagConform3())) {
  342. array.add(new CodeName("diagConform3","有手术时,诊断符合情况中的术前与术后不可为【未做】!"));
  343. }
  344. }
  345. }
  346. if (StringUtil.notBlank(info.getZyDismissWay()) && "4".equals(info.getZyDismissWay())) {
  347. if (StringUtil.isBlank(info.getAutopsy())) {
  348. array.add(new CodeName("autopsy", "离院方式为死亡时,尸检不能为空!"));
  349. }
  350. }
  351. if (StringUtil.validValue(info.getAutopsy()) && !"".equals(info.getAutopsy())) {
  352. if (!"4".equals(info.getZyDismissWay())) {
  353. array.add(new CodeName("zyDismissWay","尸检不为空时,需要离院方式为死亡!"));
  354. }
  355. }
  356. for (CaseFrontsheetSurgery surgery : info.getSurgeryList()) {
  357. checkSurgery(array, surgery);
  358. }
  359. if (needPathologicDiag(info.getDisdiagList().get(0).getCode()) &&
  360. (StringUtil.isBlank(info.getPathologicDiagStr()) || StringUtil.isBlank(info.getPathologicDiagCode()))) {
  361. array.add(new CodeName("pathologicDiagCode","根据患者出院主要诊断,病理诊断不能为空!"));
  362. }
  363. if (StringUtil.validValue(info.getHasIcu()) && "2".equals(info.getHasIcu()) &&
  364. (StringUtil.invalidValue(info.getIcuDays()) || StringUtil.invalidValue(info.getIcuHours()))) {
  365. array.add(new CodeName("icuHours","患者ICU时间不能为空!"));
  366. }
  367. if (StringUtil.notBlank(info.getHasSurgery()) && hasSurgery(info.getHasSurgery()) &&
  368. StringUtil.isBlank(info.getSurgeryList().get(0).getName())) {
  369. array.add(new CodeName("surgeryMain","患者有手术时,手术列表不能为空!"));
  370. }
  371. if (StringUtil.validValue(info.getAllergy()) && "2".equals(info.getAllergy()) && StringUtil.invalidValue(info.getAllergicMedicine())) {
  372. array.add(new CodeName("allergicMedicine","患者有药物过敏时,过敏药物名称不能为空!"));
  373. }
  374. if (StringUtil.validValue(info.getPathologicDiagFee()) && StringUtil.invalidValue(info.getBlh())) {
  375. array.add(new CodeName("blh","患者有病理诊断费,病理号不能为空!"));
  376. }
  377. if (hasSurgeryFee(info.getSurgeryFee()) && StringUtil.isBlank(info.getSurgeryList().get(0).getName())) {
  378. array.add(new CodeName("surgeryMain","患者有手术费,手术列表不能为空!"));
  379. }
  380. if (needHurtReason(info.getDisdiagList().get(0).getCode()) &&
  381. (StringUtil.invalidValue(info.getHurtReasonName()) || StringUtil.invalidValue(info.getHurtReasonCode()))) {
  382. array.add(new CodeName("hurtReasonName","根据患者出院主要诊断,损伤中毒诊断不能为空!"));
  383. }
  384. if (null != opType && opType != 2 && StringUtil.notBlank(info.getBloodType())) {
  385. if (!"5".equals(info.getBloodType()) && !"6".equals(info.getBloodType())) {
  386. if (!"1".equals(info.getRh()) && !"2".equals(info.getRh())) {
  387. array.add(new CodeName("rh","患者血型确定时,Rh血型应为阴或阳!"));
  388. }
  389. }
  390. }
  391. if (hasDuplicateDiag(info.getDisdiagList())) {
  392. array.add(new CodeName("diagTable","出院诊断不能存在相同的诊断编码!"));
  393. }
  394. if (hasSameSurgeryInOneDay(info.getSurgeryList())) {
  395. array.add(new CodeName("surgeryTable","同一天不能有相同的手术!"));
  396. }
  397. if (surgeryDateWrong(info.getSurgeryList(), info.getAdmissDate(), info.getDismissDate())) {
  398. array.add(new CodeName("surgeryTable","手术时间必须在入院时间和出院时间之间!"));
  399. }
  400. if ((StringUtil.notBlank(info.getBloodType()) && ("5".equals(info.getBloodType()) || "6".equals(info.getBloodType()))) &&
  401. (StringUtil.notBlank(info.getRh()) && !"0".equals(info.getRh()) && !"3".equals(info.getRh()))) {
  402. array.add(new CodeName("rh","患者血型不确定时,Rh血型应为不详或未查!"));
  403. }
  404. // if (StringUtil.validValue(info.getAutopsy()) || (StringUtil.notBlank(info.getZyDismissWay()) && "4".equals(info.getZyDismissWay()))) {
  405. // if (StringUtil.notBlank(info.getRescueTimes()) && Integer.parseInt(info.getRescueTimes()) <= 0) {
  406. // array.add(new CodeName("rescueTimes","患者死亡时,抢救次数不能小于一次!"));
  407. // }
  408. // }
  409. if (StringUtil.notBlank(info.getRescueTimes()) && Integer.parseInt(info.getRescueTimes()) < 0) {
  410. array.add(new CodeName("rescueTimes","抢救次数不能为负数!"));
  411. }
  412. if (Integer.parseInt(info.getRescueTimes()) < Integer.parseInt(info.getRescueSuccessTimes())) {
  413. array.add(new CodeName("rescueSuccessTimes","抢救成功次数不能大于抢救次数!"));
  414. }
  415. if (Integer.parseInt(info.getRescueTimes()) - Integer.parseInt(info.getRescueSuccessTimes()) > 1) {
  416. array.add(new CodeName("rescueSuccessTimes","抢救成功次数不能少于抢救次数两次!"));
  417. }
  418. return array;
  419. }
  420. private boolean hasSurgeryFee(String str) {
  421. if (StringUtil.invalidValue(str)) {
  422. return false;
  423. }
  424. return Float.parseFloat(str) > 0;
  425. }
  426. private boolean hasSurgery(String flag) {
  427. return "1".equals(flag) || "2".equals(flag) || "3".equals(flag);
  428. }
  429. private boolean isHighLevelSurgery(String level) {
  430. return StringUtil.notBlank(level) && ("3".equals(level) || "4".equals(level));
  431. }
  432. private void checkSurgery(List<CodeName> array, CaseFrontsheetSurgery surgery) {
  433. if (StringUtil.isBlank(surgery.getName())) {
  434. return;
  435. }
  436. if (!surgery.getAnaesthesia().equals("23") && !surgery.getAnaesthesia().equals("29")) {
  437. if (StringUtil.isBlank(surgery.getAnaesthesiaorName())) {
  438. array.add(new CodeName("surgeryTable", "手术" + surgery.getNo() + ",麻醉医师不能为空!"));
  439. }
  440. }
  441. if (StringUtil.isBlank(surgery.getOperator())) {
  442. array.add(new CodeName("surgeryTable","手术" + surgery.getNo() + ",术者不能为空!"));
  443. }
  444. if (surgery.getType() < 3 && StringUtil.isBlank(surgery.getLevel())) {
  445. array.add(new CodeName("surgeryTable","手术" + surgery.getNo() + "手术操作编码为介入治疗或手术时,手术级别不能为空!"));
  446. }
  447. if (isHighLevelSurgery(surgery.getLevel())) {
  448. if (StringUtil.isBlank(surgery.getAssistantOne())) {
  449. array.add(new CodeName("surgeryTable","手术" + surgery.getNo() + ",三、四级手术I助不能为空!"));
  450. }
  451. if (StringUtil.isBlank(surgery.getCutHeal())) {
  452. array.add(new CodeName("surgeryTable","手术" + surgery.getNo() + ",三、四级手术切口愈合等级不能为空!"));
  453. }
  454. if (StringUtil.isBlank(surgery.getAnaesthesia())) {
  455. array.add(new CodeName("surgeryTable","手术" + surgery.getNo() + ",三、四级手术麻醉方式不能为空!"));
  456. }
  457. if (StringUtil.isBlank(surgery.getAnaesthesiaor())) {
  458. array.add(new CodeName("surgeryTable","手术" + surgery.getNo() + ",三、四级手术麻醉医师不能为空!"));
  459. }
  460. if (StringUtil.isBlank(surgery.getAssistantTwo())) {
  461. array.add(new CodeName("surgeryTable","手术" + surgery.getNo() + ",三、四级手术II助不能为空!"));
  462. }
  463. }
  464. if (needAnstTimeButNotPresent(surgery)) {
  465. array.add(new CodeName("surgeryTable","手术" + surgery.getNo() + ",麻醉开始时间和结束时间不能为空!"));
  466. }
  467. List<String> msgs = logicalSurgeryTime(surgery.getDate(), surgery.getOpEndDate(),
  468. surgery.getAnstStartDate(), surgery.getAnstEndDate());
  469. for (String msg : msgs) {
  470. array.add(new CodeName("surgeryTable", "手术" + surgery.getNo() + "," + msg));
  471. }
  472. }
  473. private boolean needAnstTimeButNotPresent(CaseFrontsheetSurgery surgery) {
  474. if (StringUtil.isBlank(surgery.getAnaesthesia()) || surgery.getAnaesthesia().equals("23")
  475. || surgery.getAnaesthesia().equals("29")) {
  476. return false;
  477. }
  478. return StringUtil.notBlank(surgery.getAnaesthesiaor()) &&
  479. (null == surgery.getAnstStartDate() || null == surgery.getAnstEndDate());
  480. }
  481. public static List<String> logicalSurgeryTime(Date opStart, Date opEnd, Date anstStart, Date anstEnd) {
  482. List<String> errors = new ArrayList<>();
  483. if (null == opStart) {
  484. errors.add("手术开始时间不能为空。");
  485. }
  486. if (null == opEnd) {
  487. errors.add("手术结束时间不能为空。");
  488. }
  489. if (null != opStart && null != opEnd && opEnd.before(opStart)) {
  490. errors.add("手术开始时间不能晚于手术结束时间。");
  491. }
  492. if (null != anstStart && null != opStart && anstStart.after(opStart)) {
  493. errors.add("麻醉开始时间不能晚于手术开始时间。");
  494. }
  495. if (null != anstStart && null != opEnd && anstStart.after(opEnd)) {
  496. errors.add("麻醉开始时间不能晚于手术结束时间。");
  497. }
  498. if (null != anstEnd && null != opEnd && anstEnd.before(opEnd)) {
  499. errors.add("麻醉结束时间不能早于手术结束时间。");
  500. }
  501. if (null != anstEnd && null != opStart && anstEnd.before(opStart)) {
  502. errors.add("麻醉结束时间不能早于手术开始时间。");
  503. }
  504. return errors;
  505. }
  506. private void validateMainDiagnose(String code, List<CodeName> errors) {
  507. if (StringUtil.isBlank(code)) {
  508. return;
  509. }
  510. String header = code.substring(0, 3);
  511. String tail = header.substring(1);
  512. if (isNumeric(tail)) {
  513. int tailNumber = Integer.parseInt(tail);
  514. if (code.charAt(0) == 'R' && tailNumber <= 99) {
  515. errors.add(new CodeName("disdiagMain", "症状体征异常情况不能作为患者主要诊断!"));
  516. }
  517. }
  518. if (code.startsWith("B95.") || code.startsWith("B96.") || code.startsWith("B97.")) {
  519. errors.add(new CodeName("disdiagMain", "某些传染和寄生虫病编码中的细菌、病毒和其他传染性病原体(B95-B97)不能作为患者主要诊断!"));
  520. }
  521. if (code.startsWith("T31.") || code.startsWith("T32.")) {
  522. errors.add(new CodeName("disdiagMain", "烧伤及腐蚀面积不能作为患者主要诊断!"));
  523. }
  524. if (code.startsWith("Z37.") || code.startsWith("Z38.")) {
  525. errors.add(new CodeName("disdiagMain", "分娩结局不能作为患者主要诊断!"));
  526. }
  527. if (code.startsWith("Z85.")) {
  528. errors.add(new CodeName("disdiagMain", "恶性肿瘤个人史不能作为患者主要诊断!"));
  529. }
  530. if (code.startsWith("Z86.") || code.startsWith("Z87.")) {
  531. errors.add(new CodeName("disdiagMain", "既往病史不能作为患者主要诊断!"));
  532. }
  533. if (code.startsWith("Z93.")) {
  534. errors.add(new CodeName("disdiagMain", "人工造口状态不能作为患者主要诊断!"));
  535. }
  536. if (code.startsWith("Z98.")) {
  537. errors.add(new CodeName("disdiagMain", "手术后状态不能作为患者主要诊断!"));
  538. }
  539. }
  540. private boolean isNumeric(String str){
  541. Pattern pattern = Pattern.compile("[0-9]*");
  542. return pattern.matcher(str).matches();
  543. }
  544. private boolean needPathologicDiag(String diag) {
  545. if (StringUtil.invalidValue(diag)) {
  546. return false;
  547. }
  548. final char firstLetter = diag.toUpperCase().charAt(0);
  549. if (firstLetter != 'C' && firstLetter != 'D') {
  550. return false;
  551. }
  552. final String diagBase = diag.substring(1, 3);
  553. final int code;
  554. try {
  555. code = Integer.parseInt(diagBase);
  556. } catch (NumberFormatException e) {
  557. return false;
  558. }
  559. if (firstLetter == 'C') {
  560. return code >= 0 && code <= 97;
  561. } else {
  562. return (code >= 0 && code <= 9) || (code >= 10 && code <= 36) || (code >= 37 && code <= 48);
  563. }
  564. }
  565. private boolean needHurtReason(String diag) {
  566. if (StringUtil.invalidValue(diag)) {
  567. return false;
  568. }
  569. diag = diag.toUpperCase();
  570. if (diag.startsWith("SY")) {
  571. return false;
  572. }
  573. final char firstLetter = diag.charAt(0);
  574. return firstLetter == 'S' || firstLetter == 'T';
  575. }
  576. private boolean hasDuplicateDiag(List<CaseFrontsheetDisdiag> disdiags) {
  577. Map<String, String> map = new HashMap<>(Capacity.DEFAULT);
  578. for (CaseFrontsheetDisdiag diag : disdiags) {
  579. if (StringUtil.validValue(diag.getCode())) {
  580. if (map.containsKey(diag.getCode())) {
  581. return true;
  582. }
  583. map.put(diag.getCode(), diag.getName());
  584. }
  585. }
  586. return false;
  587. }
  588. private boolean hasSameSurgeryInOneDay(List<CaseFrontsheetSurgery> surgeries) {
  589. Map<String, String> map = new HashMap<>(Capacity.DEFAULT);
  590. for (CaseFrontsheetSurgery surgery : surgeries) {
  591. if (StringUtil.validValue(surgery.getCode())) {
  592. if (map.containsKey(surgery.getCode() + DateUtil.formatDatetime(surgery.getDate(), "yyyy-MM-dd HH:mm:ss"))) {
  593. return true;
  594. }
  595. map.put(surgery.getCode() + DateUtil.formatDatetime(surgery.getDate(), "yyyy-MM-dd HH:mm:ss"), surgery.getCode());
  596. }
  597. }
  598. return false;
  599. }
  600. private boolean zipCodeLengthWrong(String zipCode) {
  601. return StringUtil.notBlank(zipCode) && zipCode.length() != 6;
  602. }
  603. private boolean surgeryDateWrong(List<CaseFrontsheetSurgery> surgeries, Date admissDate, Date outmissDate) {
  604. if (null == outmissDate) {
  605. return false;
  606. }
  607. for (CaseFrontsheetSurgery item : surgeries) {
  608. if (StringUtil.isBlank(item.getCode())) {
  609. continue;
  610. }
  611. if (StringUtil.notBlank(item.getCode()) && null == item.getDate()) {
  612. return true;
  613. }
  614. long admstamp = admissDate.getTime();
  615. long srgstamp = item.getDate().getTime();
  616. long disstamp = outmissDate.getTime();
  617. if (admstamp > srgstamp || srgstamp > disstamp) {
  618. return true;
  619. }
  620. }
  621. return false;
  622. }
  623. private boolean phoneLengthWrong(String phone) {
  624. if (StringUtil.isBlank(phone)) {
  625. return false;
  626. }
  627. return phone.length() != 11 && phone.length() != 12 && phone.length() != 8;
  628. }
  629. private boolean isPositiveDigital(String string) {
  630. String regEx1 = "\\d+";
  631. Pattern p;
  632. Matcher m;
  633. p = Pattern.compile(regEx1);
  634. m = p.matcher(string);
  635. return m.matches();
  636. }
  637. }