| | |
| | | public void dealHisData() { |
| | | log.info("【dealHisData】开始执行HIS数据采集任务"); |
| | | long startTime = System.currentTimeMillis(); |
| | | |
| | | |
| | | try { |
| | | // 获取昨天0点到今天0点的时间范围 |
| | | LocalDateTime todayZero = LocalDateTime.now().with(LocalTime.MIN); |
| | | LocalDateTime yesterdayZero = todayZero.minusDays(1); |
| | | |
| | | |
| | | log.info("【dealHisData】采集时间范围:{} ~ {}", yesterdayZero, todayZero); |
| | | |
| | | |
| | | // 采集入院数据 |
| | | log.info("【dealHisData】开始采集入院数据"); |
| | | getInHospInfo("0", yesterdayZero, todayZero); |
| | | log.info("【dealHisData】入院数据采集完成"); |
| | | |
| | | |
| | | // 采集出院数据 |
| | | log.info("【dealHisData】开始采集出院数据"); |
| | | getInHospInfo("1", yesterdayZero, todayZero); |
| | | log.info("【dealHisData】出院数据采集完成"); |
| | | |
| | | |
| | | long endTime = System.currentTimeMillis(); |
| | | log.info("【dealHisData】HIS数据采集任务完成,总耗时:{}ms", endTime - startTime); |
| | | |
| | | |
| | | } catch (Exception e) { |
| | | log.error("【dealHisData】HIS数据采集异常", e); |
| | | // 这里可以添加告警通知逻辑,比如发送邮件或短信 |
| | |
| | | RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample(); |
| | | String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key); |
| | | for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) { |
| | | // log.error("serviceSubtask---------进来了吗?{}", serviceSubtask); |
| | | boolean dateToday = isDateToday(serviceSubtask.getLongSendTime()); |
| | | if (dateToday) { |
| | | try { |
| | |
| | | |
| | | /** |
| | | * 获取患者出入院信息 |
| | | * @param cry 出入院类型:0-入院,1-出院 |
| | | * |
| | | * @param cry 出入院类型:0-入院,1-出院 |
| | | * @param startTime 开始时间 |
| | | * @param endTime 结束时间 |
| | | * @param endTime 结束时间 |
| | | */ |
| | | @Transactional |
| | | public void getInHospInfo(String cry, LocalDateTime startTime, LocalDateTime endTime) { |
| | | String typeName = "0".equals(cry) ? "入院" : "出院"; |
| | | log.info("【getInHospInfo】开始获取{}患者信息,时间范围:{} ~ {}", typeName, startTime, endTime); |
| | | long startTimeMillis = System.currentTimeMillis(); |
| | | |
| | | |
| | | try { |
| | | // 第一步:构建请求参数并调用HIS接口 |
| | | List<ThiedInhospInfo> thiedInhospInfoList = fetchHisData(cry, startTime, endTime); |
| | | |
| | | |
| | | if (CollectionUtils.isEmpty(thiedInhospInfoList)) { |
| | | log.info("【getInHospInfo】{}患者信息为空,跳过处理", typeName); |
| | | return; |
| | | } |
| | | |
| | | |
| | | log.info("【getInHospInfo】获取到{}条{}患者信息", thiedInhospInfoList.size(), typeName); |
| | | |
| | | |
| | | // 第二步:保存原始数据到文件(用于备份) |
| | | saveRawDataToFile(cry, thiedInhospInfoList); |
| | | |
| | | |
| | | // 第三步:处理患者数据 |
| | | processPatientData(thiedInhospInfoList, cry); |
| | | |
| | | |
| | | long endTimeMillis = System.currentTimeMillis(); |
| | | log.info("【getInHospInfo】{}患者信息处理完成,耗时:{}ms", typeName, endTimeMillis - startTimeMillis); |
| | | |
| | | |
| | | } catch (Exception e) { |
| | | log.error("【getInHospInfo】获取{}患者信息异常", typeName, e); |
| | | throw new RuntimeException("获取" + typeName + "患者信息失败", e); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 第一步:调用HIS接口获取数据 |
| | | */ |
| | |
| | | try { |
| | | // 构建请求参数 |
| | | Map<String, String> requestParams = buildRequestParams(cry, startTime, endTime); |
| | | |
| | | |
| | | // 构建请求头 |
| | | Map<String, String> headers = buildRequestHeaders(startTime); |
| | | |
| | | |
| | | // 发送HTTP请求 |
| | | String result = HttpUtils.sendPostByHeader(hospInfoUrl, new Gson().toJson(requestParams), headers); |
| | | |
| | | |
| | | // 解析响应数据 |
| | | return parseResponseData(result); |
| | | |
| | | |
| | | } catch (Exception e) { |
| | | log.error("【fetchHisData】调用HIS接口异常", e); |
| | | throw e; |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 构建请求参数 |
| | | */ |
| | | private Map<String, String> buildRequestParams(String cry, LocalDateTime startTime, LocalDateTime endTime) { |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"); |
| | | Map<String, String> req = new HashMap<>(); |
| | | |
| | | |
| | | if ("1".equals(cry)) { |
| | | // 出院参数 |
| | | req.put("cashStartDate", startTime.format(formatter)); |
| | |
| | | req.put("admissEndDate", endTime.format(formatter)); |
| | | req.put("currStatus", "2"); |
| | | } |
| | | |
| | | |
| | | return req; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 构建请求头 |
| | | */ |
| | |
| | | header.put("x-hcsb-msgdate", startTime.format(formatter)); |
| | | return header; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 解析响应数据 |
| | | */ |
| | |
| | | Gson gson = new Gson(); |
| | | JsonObject jsonObject = gson.fromJson(result, JsonObject.class); |
| | | JsonArray resultArray = jsonObject.getAsJsonObject("data").getAsJsonArray("result"); |
| | | Type resultType = new TypeToken<List<ThiedInhospInfo>>() {}.getType(); |
| | | Type resultType = new TypeToken<List<ThiedInhospInfo>>() { |
| | | }.getType(); |
| | | return gson.fromJson(resultArray, resultType); |
| | | } catch (Exception e) { |
| | | log.error("【parseResponseData】解析响应数据异常,原始数据:{}", result, e); |
| | | throw e; |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 第二步:保存原始数据到文件 |
| | | */ |
| | |
| | | String typeName = "0".equals(cry) ? "入院信息" : "出院信息"; |
| | | String filename = typeName + "_" + System.currentTimeMillis() + ".json"; |
| | | String filePath = "D:\\public\\HIS数据采集\\" + filename; |
| | | |
| | | |
| | | File file = new File(filePath); |
| | | File parentDir = file.getParentFile(); |
| | | if (!parentDir.exists()) { |
| | | parentDir.mkdirs(); |
| | | } |
| | | |
| | | |
| | | if (!file.exists()) { |
| | | file.createNewFile(); |
| | | } |
| | | |
| | | |
| | | // 将数据写入文件 |
| | | try (FileWriter writer = new FileWriter(file)) { |
| | | writer.write(new Gson().toJson(dataList)); |
| | | } |
| | | |
| | | |
| | | log.info("【saveRawDataToFile】原始数据已保存到文件:{}", filePath); |
| | | |
| | | |
| | | } catch (Exception e) { |
| | | log.error("【saveRawDataToFile】保存原始数据到文件异常", e); |
| | | // 文件保存失败不影响主流程,只记录日志 |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 第三步:处理患者数据 |
| | | */ |
| | |
| | | int successCount = 0; |
| | | int skipCount = 0; |
| | | int errorCount = 0; |
| | | |
| | | |
| | | for (ThiedInhospInfo thiedInhospInfo : thiedInhospInfoList) { |
| | | try { |
| | | if (processSinglePatient(thiedInhospInfo, cry)) { |
| | |
| | | } |
| | | } catch (Exception e) { |
| | | errorCount++; |
| | | log.error("【processPatientData】处理患者数据异常,患者ID:{}", |
| | | thiedInhospInfo.getPatiMediaNo(), e); |
| | | log.error("【processPatientData】处理患者数据异常,患者ID:{}", thiedInhospInfo.getPatiMediaNo(), e); |
| | | } |
| | | } |
| | | |
| | | log.info("【processPatientData】患者数据处理完成,成功:{},跳过:{},失败:{}", |
| | | successCount, skipCount, errorCount); |
| | | |
| | | log.info("【processPatientData】患者数据处理完成,成功:{},跳过:{},失败:{}", successCount, skipCount, errorCount); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 处理单个患者数据 |
| | | */ |
| | | private boolean processSinglePatient(ThiedInhospInfo thiedInhospInfo, String cry) { |
| | | // 验证身份证号 |
| | | if (StringUtils.isEmpty(thiedInhospInfo.getPatiIdCardNo())) { |
| | | log.warn("【processSinglePatient】患者身份证号为空,跳过处理,患者编号:{}", |
| | | thiedInhospInfo.getPatiMediaNo()); |
| | | log.warn("【processSinglePatient】患者身份证号为空,跳过处理,患者编号:{}", thiedInhospInfo.getPatiMediaNo()); |
| | | return false; |
| | | } |
| | | |
| | | |
| | | // 处理患者档案信息 |
| | | PatArchive patArchive = processPatientArchive(thiedInhospInfo, cry); |
| | | |
| | | |
| | | // 处理患者住院信息 |
| | | processPatientInhospInfo(thiedInhospInfo, patArchive, cry); |
| | | |
| | | |
| | | return true; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 处理患者档案信息 |
| | | */ |
| | |
| | | PatArchive queryArchive = new PatArchive(); |
| | | queryArchive.setIdcardno(thiedInhospInfo.getPatiIdCardNo().trim()); |
| | | List<PatArchive> existingArchives = patArchiveService.selectPatArchiveList(queryArchive); |
| | | |
| | | |
| | | // 构建患者档案信息 |
| | | PatArchive patArchive = buildPatientArchive(thiedInhospInfo, cry); |
| | | |
| | | |
| | | // 保存或更新患者档案 |
| | | if (CollectionUtils.isEmpty(existingArchives)) { |
| | | patArchiveService.insertPatArchive(patArchive); |
| | |
| | | patArchiveService.updateArchive(patArchive); |
| | | log.debug("【processPatientArchive】更新患者档案,患者编号:{}", patArchive.getPatientno()); |
| | | } |
| | | |
| | | |
| | | return patArchive; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 构建患者档案信息 |
| | | */ |
| | | private PatArchive buildPatientArchive(ThiedInhospInfo thiedInhospInfo, String cry) { |
| | | PatArchive patArchive = new PatArchive(); |
| | | |
| | | |
| | | // 基本信息 |
| | | patArchive.setPatientno(thiedInhospInfo.getPatiMediaNo()); |
| | | patArchive.setIdcardno(thiedInhospInfo.getPatiIdCardNo().trim()); |
| | | patArchive.setName(thiedInhospInfo.getPatiRecordName()); |
| | | patArchive.setSourcefrom(2); |
| | | patArchive.setPattype("2"); |
| | | |
| | | |
| | | // 性别 |
| | | patArchive.setSex("男".equals(thiedInhospInfo.getPatiRecordGender()) ? 1L : 2L); |
| | | |
| | | |
| | | // 民族和籍贯 |
| | | patArchive.setNation(thiedInhospInfo.getPatiNation()); |
| | | patArchive.setNativePlace(thiedInhospInfo.getPatiNationality()); |
| | | |
| | | |
| | | // 居住地址 |
| | | String homeAddr = thiedInhospInfo.getPatiHomeAddr(); |
| | | patArchive.setPlaceOfResidence(StringUtils.isNotEmpty(homeAddr) ? homeAddr.replace("null", "") : ""); |
| | | |
| | | |
| | | // 出生日期 |
| | | if (StringUtils.isNotEmpty(thiedInhospInfo.getPatiBirthday())) { |
| | | try { |
| | |
| | | log.warn("【buildPatientArchive】解析出生日期失败:{}", thiedInhospInfo.getPatiBirthday(), e); |
| | | } |
| | | } |
| | | |
| | | |
| | | // 年龄 |
| | | if (thiedInhospInfo.getTreateAge() != null) { |
| | | patArchive.setAge(Long.valueOf(thiedInhospInfo.getTreateAge())); |
| | | } |
| | | patArchive.setAgeUnit(thiedInhospInfo.getTreatAgeunit()); |
| | | |
| | | |
| | | // 联系方式 |
| | | patArchive.setTelcode(thiedInhospInfo.getCompanyTelNum()); |
| | | patArchive.setRelativetelcode(thiedInhospInfo.getContactPersonPhone()); |
| | | |
| | | |
| | | // 出院方式处理(死亡等特殊情况) |
| | | if (StringUtils.isNotEmpty(thiedInhospInfo.getOutWayId()) && "4".equals(thiedInhospInfo.getOutWayId())) { |
| | | patArchive.setNotrequiredFlag("1"); |
| | |
| | | patArchive.setNotrequiredFlag("1"); |
| | | patArchive.setNotrequiredreason("出院方式为空"); |
| | | } |
| | | |
| | | |
| | | // 系统字段 |
| | | patArchive.setDelFlag("0"); |
| | | patArchive.setCreateTime(new Date()); |
| | | patArchive.setUpdateTime(new Date()); |
| | | |
| | | |
| | | return patArchive; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 处理患者住院信息 |
| | | */ |
| | | private void processPatientInhospInfo(ThiedInhospInfo thiedInhospInfo, PatArchive patArchive, String cry) { |
| | | // 构建住院信息 |
| | | PatMedInhosp patMedInhosp = buildPatientInhospInfo(thiedInhospInfo, patArchive, cry); |
| | | |
| | | |
| | | // 查询是否已存在住院记录 |
| | | PatMedInhosp queryInhosp = new PatMedInhosp(); |
| | | queryInhosp.setPatno(patArchive.getPatientno()); |
| | | queryInhosp.setSerialnum(patMedInhosp.getSerialnum()); |
| | | List<PatMedInhosp> existingInhosps = patMedInhospService.selectPatMedInhospList(queryInhosp); |
| | | |
| | | |
| | | // 保存或更新住院信息 |
| | | if (CollectionUtils.isNotEmpty(existingInhosps)) { |
| | | patMedInhosp.setInhospid(existingInhosps.get(0).getInhospid()); |
| | | patMedInhospService.updatePatMedInhosp(patMedInhosp); |
| | | log.debug("【processPatientInhospInfo】更新住院信息,患者编号:{},流水号:{}", |
| | | patArchive.getPatientno(), patMedInhosp.getSerialnum()); |
| | | log.debug("【processPatientInhospInfo】更新住院信息,患者编号:{},流水号:{}", patArchive.getPatientno(), patMedInhosp.getSerialnum()); |
| | | } else { |
| | | patMedInhospService.insertPatMedInhosp(patMedInhosp); |
| | | log.debug("【processPatientInhospInfo】新增住院信息,患者编号:{},流水号:{}", |
| | | patArchive.getPatientno(), patMedInhosp.getSerialnum()); |
| | | log.debug("【processPatientInhospInfo】新增住院信息,患者编号:{},流水号:{}", patArchive.getPatientno(), patMedInhosp.getSerialnum()); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 构建患者住院信息 |
| | | */ |
| | | private PatMedInhosp buildPatientInhospInfo(ThiedInhospInfo thiedInhospInfo, PatArchive patArchive, String cry) { |
| | | PatMedInhosp patMedInhosp = new PatMedInhosp(); |
| | | |
| | | |
| | | // 患者基本信息 |
| | | patMedInhosp.setPatid(patArchive.getId()); |
| | | patMedInhosp.setPatno(patArchive.getPatientno()); |
| | | patMedInhosp.setPatname(patArchive.getName()); |
| | | |
| | | |
| | | // 护理信息 |
| | | patMedInhosp.setNurseId(thiedInhospInfo.getNurseId()); |
| | | patMedInhosp.setNurseName(thiedInhospInfo.getNurseName()); |
| | | |
| | | |
| | | // 住院信息 |
| | | patMedInhosp.setSerialnum(thiedInhospInfo.getInpatientId()); |
| | | patMedInhosp.setFuflag("1"); |
| | | patMedInhosp.setInhospstate("0".equals(cry) ? "0" : "1"); |
| | | |
| | | // 医院和科室信息 |
| | | |
| | | // 医院和床位信息 |
| | | patMedInhosp.setHospitalcode(thiedInhospInfo.getAreaId()); |
| | | patMedInhosp.setDeptcode(thiedInhospInfo.getAdmissDeptId()); |
| | | patMedInhosp.setDeptid(thiedInhospInfo.getAdmissDeptId()); |
| | | patMedInhosp.setDeptname(thiedInhospInfo.getAdmissDeptName()); |
| | | patMedInhosp.setBedNo(thiedInhospInfo.getAdmissBedNo()); |
| | | |
| | | // 诊断信息 |
| | | patMedInhosp.setIcd10code(thiedInhospInfo.getDiagIcd10()); |
| | | patMedInhosp.setDiagname(thiedInhospInfo.getDiagName()); |
| | | |
| | | |
| | | |
| | | // 时间信息 |
| | | if (StringUtils.isNotEmpty(thiedInhospInfo.getAdmissDate())) { |
| | | try { |
| | |
| | | log.warn("【buildPatientInhospInfo】解析入院时间失败:{}", thiedInhospInfo.getAdmissDate(), e); |
| | | } |
| | | } |
| | | |
| | | |
| | | if (StringUtils.isNotEmpty(thiedInhospInfo.getOutDate())) { |
| | | try { |
| | | patMedInhosp.setEndtime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(thiedInhospInfo.getOutDate())); |
| | |
| | | log.warn("【buildPatientInhospInfo】解析出院时间失败:{}", thiedInhospInfo.getOutDate(), e); |
| | | } |
| | | } |
| | | |
| | | |
| | | // 出院信息 |
| | | patMedInhosp.setLeaveldeptcode(thiedInhospInfo.getCurrDeptId()); |
| | | patMedInhosp.setLeaveldeptname(thiedInhospInfo.getCurrDeptName()); |
| | | patMedInhosp.setLeavediagname(thiedInhospInfo.getDiagName()); |
| | | patMedInhosp.setLeaveicd10code(thiedInhospInfo.getDiagIcd10()); |
| | | patMedInhosp.setOutWayId(thiedInhospInfo.getOutWayId()); |
| | | patMedInhosp.setOutWayName(thiedInhospInfo.getOutWayName()); |
| | | |
| | | if (cry.equals("1")) { |
| | | patMedInhosp.setLeaveldeptcode(thiedInhospInfo.getCurrDeptId()); |
| | | patMedInhosp.setLeaveldeptname(thiedInhospInfo.getCurrDeptName()); |
| | | patMedInhosp.setLeavediagname(thiedInhospInfo.getDiagName()); |
| | | patMedInhosp.setLeaveicd10code(thiedInhospInfo.getDiagIcd10()); |
| | | patMedInhosp.setOutWayId(thiedInhospInfo.getOutWayId()); |
| | | patMedInhosp.setOutWayName(thiedInhospInfo.getOutWayName()); |
| | | // 病区信息 |
| | | patMedInhosp.setLeavehospitaldistrictid(thiedInhospInfo.getCurrWardCode()); |
| | | patMedInhosp.setLeavehospitaldistrictcode(thiedInhospInfo.getCurrWardId()); |
| | | patMedInhosp.setLeavehospitaldistrictname(thiedInhospInfo.getCurrWardName()); |
| | | patMedInhosp.setLeaveldeptid(thiedInhospInfo.getCurrDeptCode()); |
| | | } else { |
| | | //入院 |
| | | patMedInhosp.setDeptcode(thiedInhospInfo.getCurrDeptId()); |
| | | patMedInhosp.setDeptname(thiedInhospInfo.getCurrDeptName()); |
| | | patMedInhosp.setDiagname(thiedInhospInfo.getDiagName()); |
| | | patMedInhosp.setIcd10code(thiedInhospInfo.getDiagIcd10()); |
| | | patMedInhosp.setHospitaldistrictid(thiedInhospInfo.getAdmissWardCode()); |
| | | patMedInhosp.setHospitaldistrictcode(thiedInhospInfo.getAdmissWardId()); |
| | | patMedInhosp.setHospitaldistrictname(thiedInhospInfo.getAdmissWardName()); |
| | | } |
| | | |
| | | // 医生信息 |
| | | patMedInhosp.setDrname(thiedInhospInfo.getDoctName()); |
| | | patMedInhosp.setDrcode(thiedInhospInfo.getDoctId()); |
| | | |
| | | // 病区信息 |
| | | patMedInhosp.setLeavehospitaldistrictid(thiedInhospInfo.getCurrWardCode()); |
| | | patMedInhosp.setLeavehospitaldistrictcode(thiedInhospInfo.getCurrWardId()); |
| | | patMedInhosp.setLeavehospitaldistrictname(thiedInhospInfo.getCurrWardName()); |
| | | patMedInhosp.setLeaveldeptid(thiedInhospInfo.getCurrDeptCode()); |
| | | |
| | | |
| | | |
| | | // 状态信息 |
| | | patMedInhosp.setSchemestatus("0".equals(cry) ? 1L : 2L); |
| | | |
| | | |
| | | // 系统字段 |
| | | patMedInhosp.setDelFlag("0"); |
| | | patMedInhosp.setOrgid("1"); |
| | | |
| | | |
| | | return patMedInhosp; |
| | | } |
| | | |