AfterwardsAuditDataTest.java 16 KB

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