| | |
| | | @Value("${lwl_app_key}") |
| | | private String APP_KEY; |
| | | |
| | | |
| | | @Value("${spring.profiles.active}") |
| | | private String active; |
| | | |
| | | @Override |
| | | public List<ServiceSLTDInhospResDTO> queryHealthcareRecordList(ServiceSLTDInhospReqVO reqVO) { |
| | | try { |
| | |
| | | private String determineCry(ServiceSLTDInhospReqVO reqVO) { |
| | | if (CollectionUtils.isEmpty(reqVO.getStatusList())) return null; |
| | | |
| | | if (reqVO.getStatusList().contains("FH0109.26")) { |
| | | if (reqVO.getStatusList().contains("FH0109.24")) { |
| | | //入院 |
| | | return "0"; |
| | | } else if (reqVO.getStatusList().contains("FH0109.27")) { |
| | |
| | | log.info("【parseResponseData】门急诊数据已处理,跳过 type={}", type); |
| | | } |
| | | break; |
| | | case "FH0109.26": |
| | | case "FH0109.24": |
| | | log.info("【parseResponseData】解析住院数据"); |
| | | inHospitalDate(resultList, cry); |
| | | break; |
| | |
| | | patMedInhosp.setCampusid(dto.getCampusId()); |
| | | if (StringUtils.isNotEmpty(dto.getHealthcareRecordStatus()) && dto.getHealthcareRecordStatus().equals("FH0109.25")) |
| | | patMedInhosp.setRemark("预出院"); |
| | | if (active.equals("nhfy") && dto.getAreaId() != null && dto.getAreaId().toString().equals("40003483") && StringUtils.isNotEmpty(patMedInhosp.getPatname())) { |
| | | //南华附一的产科,要求不生成“之子、之女、之婴”的随访任务 |
| | | if (patMedInhosp.getPatname().contains("之子") || patMedInhosp.getPatname().contains("之女") || patMedInhosp.getPatname().contains("之婴")) { |
| | | patMedInhosp.setDeptcheckFlag("3"); |
| | | patMedInhosp.setWardcheckFlag("3"); |
| | | patMedInhosp.setDiagcheckFlag("3"); |
| | | patMedInhosp.setRemark(patMedInhosp.getRemark() + ";不生成之子、之女、之婴问卷"); |
| | | } |
| | | } |
| | | |
| | | return patMedInhosp; |
| | | } |
| | | |
| | |
| | | */ |
| | | private PatArchive processPatientArchive(ServiceSLTDInhospResDTO dto) { |
| | | // 构建锁的 key:基于 patientno 或 idcardno |
| | | String lockKey = "pat_archive_lock:" + |
| | | (StringUtils.isNotEmpty(dto.getMedicalRecordNo()) ? dto.getMedicalRecordNo() : dto.getIdCardNo()); |
| | | |
| | | String lockKey = "pat_archive_lock:" + (StringUtils.isNotEmpty(dto.getMedicalRecordNo()) ? dto.getMedicalRecordNo() : dto.getIdCardNo()); |
| | | |
| | | // 尝试获取分布式锁,最多等待 3 秒,锁定 10 秒自动释放 |
| | | Boolean lockAcquired = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS); |
| | | |
| | | |
| | | if (lockAcquired == null || !lockAcquired) { |
| | | log.warn("【processPatientArchive】获取分布式锁失败,跳过本次处理(其他线程正在处理),patientno={}", dto.getMedicalRecordNo()); |
| | | // 等待一段时间后重试查询 |
| | |
| | | Thread.currentThread().interrupt(); |
| | | } |
| | | } |
| | | |
| | | |
| | | try { |
| | | return doProcessPatientArchive(dto); |
| | | } finally { |
| | |
| | | } |
| | | |
| | | PatArchive patArchive = buildPatientArchive(dto); |
| | | log.info("【processPatientArchive】患者档案查重完成,patientno={}, 是否已存在={}", |
| | | patArchive.getPatientno(), CollectionUtils.isEmpty(existingArchives) ? "否" : "是(id=" + existingArchives.get(0).getId() + ")"); |
| | | |
| | | log.info("【processPatientArchive】患者档案查重完成,patientno={}, 是否已存在={}", patArchive.getPatientno(), CollectionUtils.isEmpty(existingArchives) ? "否" : "是(id=" + existingArchives.get(0).getId() + ")"); |
| | | |
| | | if (CollectionUtils.isEmpty(existingArchives)) { |
| | | try { |
| | | // 最终确认查询(防御性编程:防止Redis锁失效等极端情况) |
| | |
| | | if (StringUtils.isNotEmpty(dto.getMedicalRecordNo())) { |
| | | finalQuery.setPatientno(dto.getMedicalRecordNo()); |
| | | } |
| | | |
| | | |
| | | List<PatArchive> finalCheck = patArchiveService.selectPatArchiveList(finalQuery); |
| | | log.info("【processPatientArchive】最终确认查询,patientno={}, idcardno={}, 结果数量={}", |
| | | dto.getMedicalRecordNo(), dto.getIdCardNo(), finalCheck.size()); |
| | | |
| | | log.info("【processPatientArchive】最终确认查询,patientno={}, idcardno={}, 结果数量={}", dto.getMedicalRecordNo(), dto.getIdCardNo(), finalCheck.size()); |
| | | |
| | | if (CollectionUtils.isEmpty(finalCheck)) { |
| | | patArchiveService.insertPatArchive(patArchive); |
| | | log.info("【processPatientArchive】✓ 新增患者档案成功,patientno={}, id={}", |
| | | patArchive.getPatientno(), patArchive.getId()); |
| | | log.info("【processPatientArchive】✓ 新增患者档案成功,patientno={}, id={}", patArchive.getPatientno(), patArchive.getId()); |
| | | } else { |
| | | // 其他线程已经插入,直接使用已有记录 |
| | | existingArchives = finalCheck; |
| | |
| | | log.info("【processPatientArchive】档案已被其他线程创建,使用已有记录,id={}", patArchive.getId()); |
| | | } |
| | | } catch (org.springframework.dao.DuplicateKeyException e) { |
| | | log.warn("【processPatientArchive】患者档案已存在(并发插入异常),跳过:patientno={}, idcardno={}", |
| | | patArchive.getPatientno(), patArchive.getIdcardno()); |
| | | log.warn("【processPatientArchive】患者档案已存在(并发插入异常),跳过:patientno={}, idcardno={}", patArchive.getPatientno(), patArchive.getIdcardno()); |
| | | // 并发插入场景,重新查询获取已存在的记录 |
| | | PatArchive queryRetry = new PatArchive(); |
| | | queryRetry.setPatientno(patArchive.getPatientno()); |
| | |
| | | patArchive.setNotrequiredFlag(existingArchives.get(0).getNotrequiredFlag()); |
| | | patArchive.setNotrequiredreason(existingArchives.get(0).getNotrequiredreason()); |
| | | patArchiveService.updateArchive(patArchive); |
| | | log.info("【processPatientArchive】✓ 更新患者档案,patientno={}, id={}", |
| | | patArchive.getPatientno(), patArchive.getId()); |
| | | log.info("【processPatientArchive】✓ 更新患者档案,patientno={}, id={}", patArchive.getPatientno(), patArchive.getId()); |
| | | } |
| | | |
| | | return patArchive; |