AfterwardsAuditDataTest.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. package org.jeecg;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.apache.commons.lang.StringUtils;
  6. import org.jeecg.modules.medical.Constant;
  7. import org.jeecg.modules.medical.entity.AfterwardsAudit;
  8. import org.jeecg.modules.medical.entity.AfterwardsAuditDetail;
  9. import org.jeecg.modules.medical.entity.MedicalInsRuleInfo;
  10. import org.jeecg.modules.medical.entity.SttlMasterBill;
  11. import org.jeecg.modules.medical.entity.SttlMasterDetailBill;
  12. import org.jeecg.modules.medical.job.AfterWaringLogTestJob;
  13. import org.jeecg.modules.medical.job.XCFYDatav_check_listJob;
  14. import org.jeecg.modules.medical.ruleengine.RuleEngine;
  15. import org.jeecg.modules.medical.ruleengine.SPELUtil;
  16. import org.jeecg.modules.medical.service.IAfterwardsAuditDetailService;
  17. import org.jeecg.modules.medical.service.IAfterwardsAuditService;
  18. import org.jeecg.modules.medical.service.IAfterwardsIncidentAuditDiagnoseService;
  19. import org.jeecg.modules.medical.service.IMedicalInsRuleInfoService;
  20. import org.jeecg.modules.medical.service.IMedicalInsRuleProjectDiagnoseService;
  21. import org.jeecg.modules.medical.service.IMedicalInsRuleProjectService;
  22. import org.jeecg.modules.medical.service.ISttlMasterBillService;
  23. import org.jeecg.modules.medical.service.ISttlMasterDetailBillService;
  24. import org.jeecg.modules.system.service.ISysDepartService;
  25. import org.jeecg.modules.system.service.ISysUserService;
  26. import org.junit.Test;
  27. import org.junit.runner.RunWith;
  28. import org.quartz.JobExecutionException;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.boot.test.context.SpringBootTest;
  31. import org.springframework.data.redis.core.RedisTemplate;
  32. import org.springframework.scheduling.annotation.Async;
  33. import org.springframework.test.context.junit4.SpringRunner;
  34. import java.math.BigDecimal;
  35. import java.util.ArrayList;
  36. import java.util.Date;
  37. import java.util.HashMap;
  38. import java.util.List;
  39. import java.util.Map;
  40. import java.util.Random;
  41. import java.util.Set;
  42. import java.util.concurrent.ConcurrentHashMap;
  43. /**
  44. * @author soft01
  45. * @time 2023/5/28 21:41
  46. * @description '生成一些模拟数据'
  47. * @parentProject medical-java
  48. */
  49. @RunWith(SpringRunner.class)
  50. @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = JeecgSystemApplication.class)
  51. @Slf4j
  52. public class AfterwardsAuditDataTest {
  53. List<Map<String, String>> doctorList = new ArrayList<>();
  54. //就诊类别;住院(hosp)/门诊(outpatient)
  55. public static final String TREATMENTTYPE = "hops";
  56. public static final String NOTICE_TYPE = "after";
  57. public static final String medicalDeptCode = "1001"; //部门代码
  58. public static final String deptName = "儿科"; //科室
  59. // public static final String doctorName = "章邯";
  60. // public static final String doctorId = "1001001";
  61. // 患者信息
  62. public static final String patientId = "A1001";
  63. public static final String patientName = "魏冉";
  64. public static final String ZYH = "H001"; // 住院号
  65. // 医嘱/处方号
  66. public static final String prescriptionNumber = "P001";
  67. // 项目类型 medicine;consumable;diagnoses;
  68. public static final String PROJECTTYPE = "medicine";
  69. public static final String PROJECTCODE = "8001";
  70. @Autowired
  71. private IAfterwardsAuditService afterwardsAuditService;
  72. @Autowired
  73. private IAfterwardsAuditDetailService afterwardsAuditDetailService;
  74. @Autowired
  75. private IAfterwardsIncidentAuditDiagnoseService afterwardsIncidentAuditDiagnoseService;
  76. @Autowired
  77. private AfterWaringLogTestJob afterWaringLogTestJob;
  78. @Autowired
  79. ISysUserService sysUserService;
  80. @Autowired
  81. ISysDepartService sysDepartService;
  82. @Autowired
  83. ISttlMasterBillService sttlMasterBillService;
  84. @Autowired
  85. ISttlMasterDetailBillService sttlMasterDetailBillService;
  86. @Autowired
  87. IMedicalInsRuleProjectService medicalInsRuleProjectService;
  88. @Autowired
  89. IMedicalInsRuleProjectDiagnoseService medicalInsRuleProjectDiagnoseService;
  90. @Autowired
  91. RuleEngine ruleEngine;
  92. @Autowired
  93. IMedicalInsRuleInfoService medicalInsRuleInfoService;
  94. @Autowired
  95. RedisTemplate redisTemplate;
  96. @Autowired
  97. org.jeecg.modules.medical.job.XCFYDatav_check_listJob XCFYDatav_check_listJob;
  98. @Test
  99. public void testXCFYDatav_check_listJob(){
  100. try {
  101. XCFYDatav_check_listJob.execute(null);
  102. } catch (JobExecutionException e) {
  103. e.printStackTrace();
  104. }
  105. }
  106. @Test
  107. public void testMAB() {
  108. try {
  109. afterWaringLogTestJob.testMasterAdmBill();
  110. } catch (Exception e) {
  111. e.printStackTrace();
  112. }
  113. }
  114. @Test
  115. public void testJob() {
  116. try {
  117. afterWaringLogTestJob.execute(null);
  118. } catch (JobExecutionException e) {
  119. e.printStackTrace();
  120. }
  121. }
  122. @Test
  123. public void insertAfterWordDetail() {
  124. QueryWrapper<SttlMasterBill> queryWrapper = new QueryWrapper();
  125. // queryWrapper.notIn("jsdjh","0182940007_20201202081355","111929226_20201124104538","20200914-3603991000-014606");
  126. // queryWrapper.isNull("state");
  127. queryWrapper.last("limit 0,10");
  128. List<SttlMasterBill> sttlMasterBills = sttlMasterBillService.list(queryWrapper);
  129. List<AfterwardsAuditDetail> detailList = new ArrayList<>();
  130. Map<String, Boolean> codeDataMap = new ConcurrentHashMap<>();
  131. String[] sAr = {"1", "2", "3"};
  132. List<MedicalInsRuleInfo> medicalInsRuleInfoList = medicalInsRuleInfoService.lambdaQuery().in(MedicalInsRuleInfo::getTreatmentType, sAr).eq(MedicalInsRuleInfo::getState, Constant.EFF_STATE).list();
  133. if (!CollectionUtil.isNotEmpty(medicalInsRuleInfoList)) {
  134. log.error("规则配置表没有有效的规则");
  135. return;
  136. }
  137. /*
  138. * 根据规则id加载规则并初始化到redis里
  139. * 后续提醒通过redis加载id,把id传入规则引擎,迅速调用对应规则
  140. */
  141. // List<MedicalInsRuleInfo> midMedicalInsRuleInfoList = new ArrayList<>();
  142. Map<Integer, MedicalInsRuleInfo> medicalMap = new HashMap<>();
  143. for (MedicalInsRuleInfo medicalInsRuleInfo : medicalInsRuleInfoList) {
  144. medicalMap.put(medicalInsRuleInfo.getId(), medicalInsRuleInfo);
  145. }
  146. for (SttlMasterBill sttlMasterBill : sttlMasterBills) {
  147. AfterwardsAudit afterwardsAudit = afterwardsAuditService.lambdaQuery().eq(AfterwardsAudit::getPrescriptionNumber, sttlMasterBill.getJsdjh()).one();
  148. if (null == afterwardsAudit) {
  149. log.error("结算单据号找不到稽核单:{}", sttlMasterBill.getJsdjh());
  150. continue;
  151. }
  152. List<SttlMasterDetailBill> sttlMasterDetailBills = sttlMasterDetailBillService.lambdaQuery().eq(SttlMasterDetailBill::getJsdjh, sttlMasterBill.getJsdjh()).list();
  153. if (CollectionUtil.isNotEmpty(sttlMasterBills)) {
  154. for (SttlMasterDetailBill sttlMasterDetailBill : sttlMasterDetailBills) {
  155. genData(sttlMasterDetailBill, codeDataMap, afterwardsAudit, medicalInsRuleInfoList, medicalMap);
  156. }
  157. }
  158. }
  159. // afterwardsAuditDetailService.saveBatch(detailList, 1000);
  160. }
  161. @Test
  162. public void insertAfterWordDetailOne() {
  163. QueryWrapper<SttlMasterBill> queryWrapper = new QueryWrapper();
  164. // queryWrapper.notIn("jsdjh","0182940007_20201202081355","111929226_20201124104538","20200914-3603991000-014606");
  165. // queryWrapper.isNull("state");
  166. queryWrapper.last("limit 1,10");
  167. List<SttlMasterBill> sttlMasterBills = sttlMasterBillService.list(queryWrapper);
  168. List<AfterwardsAuditDetail> detailList = new ArrayList<>();
  169. Map<String, Boolean> codeDataMap = new ConcurrentHashMap<>();
  170. String[] sAr = {"1", "2", "3"};
  171. List<MedicalInsRuleInfo> medicalInsRuleInfoList = medicalInsRuleInfoService.lambdaQuery().in(MedicalInsRuleInfo::getTreatmentType, sAr).eq(MedicalInsRuleInfo::getState, Constant.EFF_STATE).list();
  172. if (!CollectionUtil.isNotEmpty(medicalInsRuleInfoList)) {
  173. log.error("规则配置表没有有效的规则");
  174. return;
  175. }
  176. /*
  177. * 根据规则id加载规则并初始化到redis里
  178. * 后续提醒通过redis加载id,把id传入规则引擎,迅速调用对应规则
  179. */
  180. // List<MedicalInsRuleInfo> midMedicalInsRuleInfoList = new ArrayList<>();
  181. Map<Integer, MedicalInsRuleInfo> medicalMap = new HashMap<>();
  182. for (MedicalInsRuleInfo medicalInsRuleInfo : medicalInsRuleInfoList) {
  183. medicalMap.put(medicalInsRuleInfo.getId(), medicalInsRuleInfo);
  184. }
  185. for (SttlMasterBill sttlMasterBill : sttlMasterBills) {
  186. AfterwardsAudit afterwardsAudit = afterwardsAuditService.lambdaQuery().eq(AfterwardsAudit::getPrescriptionNumber, sttlMasterBill.getJsdjh()).one();
  187. if (null == afterwardsAudit) {
  188. log.error("结算单据号找不到稽核单:{}", sttlMasterBill.getJsdjh());
  189. continue;
  190. }
  191. List<SttlMasterDetailBill> sttlMasterDetailBills = sttlMasterDetailBillService.lambdaQuery().eq(SttlMasterDetailBill::getJsdjh, sttlMasterBill.getJsdjh()).list();
  192. if (CollectionUtil.isNotEmpty(sttlMasterBills)) {
  193. for (SttlMasterDetailBill sttlMasterDetailBill : sttlMasterDetailBills) {
  194. genData(sttlMasterDetailBill, codeDataMap, afterwardsAudit, medicalInsRuleInfoList, medicalMap);
  195. }
  196. }
  197. }
  198. // afterwardsAuditDetailService.saveBatch(detailList, 1000);
  199. }
  200. @Async("commonTaskAsyncPool")
  201. public void genData(SttlMasterDetailBill sttlMasterDetailBill, Map<String, Boolean> codeDataMap, AfterwardsAudit afterwardsAudit, List<MedicalInsRuleInfo> medicalInsRuleInfoList, Map<Integer, MedicalInsRuleInfo> medicalMap) {
  202. AfterwardsAuditDetail afterwardsAuditDetail = new AfterwardsAuditDetail();
  203. String projectCode = sttlMasterDetailBill.getYbxmbm();
  204. // if (codeDataMap.containsKey(projectCode)) {
  205. // return;
  206. // }
  207. if (StringUtils.isBlank(projectCode)) {
  208. log.error("医保编码:{}", sttlMasterDetailBill);
  209. return;
  210. }
  211. if (StringUtils.isNotBlank(projectCode)) {
  212. Set<Integer> medicalRuleInfoIdSet = RuleEngine.itemCodeAndRuleIdMap.get(projectCode);
  213. if (CollectionUtil.isEmpty(medicalRuleInfoIdSet)) {
  214. log.info("医保编码未匹配到规则:{}", projectCode);
  215. if (!codeDataMap.containsKey(projectCode)) {
  216. ruleEngine.genItemCodeAndRuleIdMapTest(projectCode, afterwardsAuditDetail, medicalInsRuleInfoList, medicalMap, codeDataMap);
  217. }
  218. } else {
  219. List<Integer> ruleIdList = new ArrayList<>(medicalRuleInfoIdSet);
  220. Integer ruleId = ruleIdList.get(0);
  221. MedicalInsRuleInfo medicalInsRuleInfo = medicalInsRuleInfoService.getById(ruleId);
  222. afterwardsAuditDetail.setMedicalInsRuleInfoId(ruleId);
  223. // MedicalInsRuleInfo medicalInsRuleInfo = medicalMap.get(medicalInsRuleProject.getMedicalInsRuleInfoId());
  224. afterwardsAuditDetail.setMedicalInsRuleInfoName(medicalInsRuleInfo.getRuleName());
  225. afterwardsAuditDetail.setMedicalInsRuleInfoCode(medicalInsRuleInfo.getRuleCode());
  226. Object desc = redisTemplate.opsForHash().get(Constant.PROJECT_VOLIDATION_DESC_KEY + ruleId, projectCode);
  227. if (null != desc && StringUtils.isNotBlank(desc.toString())) {
  228. afterwardsAuditDetail.setDescription(desc.toString());
  229. } else {
  230. afterwardsAuditDetail.setDescription(medicalInsRuleInfo.getDescription());
  231. }
  232. afterwardsAuditDetail.setTreatmentType(medicalInsRuleInfo.getTreatmentType());
  233. }
  234. }
  235. String projectType = null;
  236. if (projectCode.startsWith(Constant.CONSUMABLE_START_KEY)) {
  237. projectType = "consumable";
  238. } else if (projectCode.startsWith(Constant.RESTORATIVES_T_START_KEY) ||
  239. projectCode.startsWith(Constant.RESTORATIVES_X_START_KEY) ||
  240. projectCode.startsWith(Constant.RESTORATIVES_Z_START_KEY)) {
  241. projectType = "medicine";
  242. //耗材都是字母c开头, 药品是X或Z T, 医疗服务是数字开头
  243. } else if (SPELUtil.isNumeric(projectCode)) {
  244. projectType = "diagnoses";
  245. }
  246. afterwardsAuditDetail.setProjectType(projectType);
  247. afterwardsAuditDetail.setAfterwardsAuditId(afterwardsAudit.getId());
  248. afterwardsAuditDetail.setAmount(Double.parseDouble(sttlMasterDetailBill.get金额()));
  249. afterwardsAuditDetail.setDoctorId(afterwardsAudit.getDoctorId());
  250. afterwardsAuditDetail.setDoctorName(afterwardsAudit.getDoctorName());
  251. afterwardsAuditDetail.setMedicalDeptCode(afterwardsAudit.getMedicalDeptCode());
  252. afterwardsAuditDetail.setMedicalDeptName(afterwardsAudit.getMedicalDeptName());
  253. afterwardsAuditDetail.setNoticeType("after");
  254. afterwardsAuditDetail.setMedicalProjectCode(projectCode);
  255. afterwardsAuditDetail.setMedicalProjectName(sttlMasterDetailBill.get医保项目名称());
  256. afterwardsAuditDetail.setPatientId(afterwardsAudit.getPatientId());
  257. afterwardsAuditDetail.setPatientName(afterwardsAudit.getPatientName());
  258. afterwardsAuditDetail.setViolationLevel(0);
  259. afterwardsAuditDetail.setProejctCode(projectCode);
  260. afterwardsAuditDetail.setProejctName(sttlMasterDetailBill.get医保项目名称());
  261. afterwardsAuditDetail.setCreateTime(new Date());
  262. Double quantit = Double.parseDouble(sttlMasterDetailBill.get数量());
  263. afterwardsAuditDetail.setQuantity(quantit.intValue());
  264. afterwardsAuditDetail.setReminderLevel("1");
  265. afterwardsAuditDetail.setPrice(new BigDecimal(sttlMasterDetailBill.get单价()));
  266. afterwardsAuditDetail.setPrescriptionNumber(afterwardsAudit.getPrescriptionNumber());
  267. afterwardsAuditDetail.setOutpatientNumber(afterwardsAudit.getOutpatientNumber());
  268. // detailList.add(afterwardsAuditDetail);
  269. afterwardsAuditDetailService.save(afterwardsAuditDetail);
  270. }
  271. @Test
  272. public void generateAfterwardsAuditData() {
  273. Map<String, String> doctorItem1 = new HashMap<>();
  274. doctorItem1.put("doctorName", "章邯");
  275. doctorItem1.put("doctorId", "1001001");
  276. Map<String, String> doctorItem2 = new HashMap<>();
  277. doctorItem2.put("doctorName", "楚南公");
  278. doctorItem2.put("doctorId", "1001006");
  279. Map<String, String> doctorItem3 = new HashMap<>();
  280. doctorItem3.put("doctorName", "晓梦");
  281. doctorItem3.put("doctorId", "1001005");
  282. Map<String, String> doctorItem4 = new HashMap<>();
  283. doctorItem4.put("doctorName", "柳梦璃");
  284. doctorItem4.put("doctorId", "1002002");
  285. Map<String, String> doctorItem5 = new HashMap<>();
  286. doctorItem5.put("doctorName", "司马懿");
  287. doctorItem5.put("doctorId", "1001201");
  288. Map<String, String> doctorItem6 = new HashMap<>();
  289. doctorItem6.put("doctorName", "荀彧");
  290. doctorItem6.put("doctorId", "1001202");
  291. Map<String, String> doctorItem7 = new HashMap<>();
  292. doctorItem7.put("doctorName", "夏侯渊");
  293. doctorItem7.put("doctorId", "1001203");
  294. Map<String, String> doctorItem8 = new HashMap<>();
  295. doctorItem8.put("doctorName", "曹仁");
  296. doctorItem8.put("doctorId", "1001205");
  297. Map<String, String> doctorItem9 = new HashMap<>();
  298. doctorItem9.put("doctorName", "孙权");
  299. doctorItem9.put("doctorId", "1001206");
  300. Map<String, String> doctorItem10 = new HashMap<>();
  301. doctorItem10.put("doctorName", "鲁肃");
  302. doctorItem10.put("doctorId", "1001207");
  303. doctorList.add(doctorItem1);
  304. doctorList.add(doctorItem2);
  305. doctorList.add(doctorItem3);
  306. doctorList.add(doctorItem4);
  307. doctorList.add(doctorItem5);
  308. doctorList.add(doctorItem6);
  309. doctorList.add(doctorItem7);
  310. doctorList.add(doctorItem8);
  311. doctorList.add(doctorItem9);
  312. doctorList.add(doctorItem10);
  313. for (Map<String, String> stringStringMap : doctorList) {
  314. String doctorName = stringStringMap.get("doctorName");
  315. String doctorId = stringStringMap.get("doctorId");
  316. // 写主表
  317. AfterwardsAudit extracted = writeMaster(doctorId, doctorName);
  318. // 写从表
  319. writeSlave(doctorId, doctorName, extracted.getId(), 5);
  320. }
  321. }
  322. private void writeSlave(String doctorId, String doctorName, Integer id, int number) {
  323. for (int i = 0; i < number; i++) {
  324. AfterwardsAuditDetail aad = new AfterwardsAuditDetail();
  325. aad.setAfterwardsAuditId(id);
  326. aad.setMedicalInsRuleInfoId(1);
  327. aad.setMedicalInsRuleInfoCode("1");
  328. aad.setMedicalInsRuleInfoName("前");
  329. aad.setTreatmentType(TREATMENTTYPE);
  330. aad.setReminderLevel("1");
  331. aad.setViolationLevel(1);
  332. aad.setNoticeType(NOTICE_TYPE);
  333. aad.setMedicalDeptCode(medicalDeptCode);
  334. aad.setMedicalDeptName(deptName);
  335. aad.setDoctorName(doctorName);
  336. aad.setDoctorId(doctorId);
  337. aad.setPatientId(patientId);
  338. aad.setPatientName(patientName);
  339. aad.setOutpatientNumber(aad.getOutpatientNumber());
  340. aad.setPrescriptionNumber(prescriptionNumber);
  341. aad.setProjectType(PROJECTTYPE);
  342. aad.setProejctCode(PROJECTCODE);
  343. aad.setQuantity(1);
  344. aad.setMedicalProjectCode("8001");
  345. aad.setMedicalProjectName("1");
  346. aad.setAmount(Double.valueOf(AfterwardsAuditDataTest.getRandom()));
  347. aad.setCreateBy("admin");
  348. aad.setCreateTime(new Date());
  349. afterwardsAuditDetailService.save(aad);
  350. }
  351. }
  352. AfterwardsAudit writeMaster(String doctorId, String doctorName) {
  353. AfterwardsAudit aa = new AfterwardsAudit();
  354. aa.setTreatmentType(TREATMENTTYPE);
  355. aa.setNoticeType(NOTICE_TYPE);
  356. aa.setMedicalDeptCode(medicalDeptCode);
  357. aa.setMedicalDeptName(deptName);
  358. aa.setDoctorName(doctorName);
  359. aa.setDoctorId(doctorId);
  360. aa.setPatientId(patientId);
  361. aa.setPatientName(patientName);
  362. aa.setOutpatientNumber(ZYH);
  363. aa.setPrescriptionNumber(prescriptionNumber);
  364. aa.setFeedbackResult("SUCCESS");
  365. aa.setFeedbackCode("0000");
  366. aa.setAuditSource("system(系统)");
  367. aa.setCreateBy("admin");
  368. aa.setCreateTime(new Date());
  369. afterwardsAuditService.save(aa);
  370. return aa;
  371. }
  372. public static void main(String[] args) {
  373. getRandom();
  374. }
  375. private static double getRandom() {
  376. Random a = new Random();
  377. int i = a.nextInt(200) - 80;
  378. double v = a.nextDouble();
  379. System.out.println(i + v);
  380. return i + v;
  381. }
  382. }