liusheng
3 天以前 6393d6ba70099f1b47f4124e06426f016fb28052
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -212,27 +212,27 @@
    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);
            // 这里可以添加告警通知逻辑,比如发送邮件或短信
@@ -560,7 +560,6 @@
                    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 {
@@ -650,42 +649,43 @@
    /**
     * 获取患者出入院信息
     * @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接口获取数据
     */
@@ -693,29 +693,29 @@
        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));
@@ -727,10 +727,10 @@
            req.put("admissEndDate", endTime.format(formatter));
            req.put("currStatus", "2");
        }
        return req;
    }
    /**
     * 构建请求头
     */
@@ -744,23 +744,24 @@
        header.put("x-hcsb-msgdate", startTime.format(formatter));
        return header;
    }
    /**
     * 解析响应数据
     */
    private List<ThiedInhospInfo> parseResponseData(String result) {
        try {
        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();
            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();
            return gson.fromJson(resultArray, resultType);
        } catch (Exception e) {
            log.error("【parseResponseData】解析响应数据异常,原始数据:{}", result, e);
            throw e;
        }
    }
    /**
     * 第二步:保存原始数据到文件
     */
@@ -769,30 +770,30 @@
            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()) {
            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);
            // 文件保存失败不影响主流程,只记录日志
        }
    }
    /**
     * 第三步:处理患者数据
     */
@@ -800,7 +801,7 @@
        int successCount = 0;
        int skipCount = 0;
        int errorCount = 0;
        for (ThiedInhospInfo thiedInhospInfo : thiedInhospInfoList) {
            try {
                if (processSinglePatient(thiedInhospInfo, cry)) {
@@ -810,35 +811,32 @@
                }
            } 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;
    }
    /**
     * 处理患者档案信息
     */
@@ -847,66 +845,66 @@
        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);
            log.debug("【processPatientArchive】新增患者档案,患者编号:{}", patArchive.getPatientno());
                } else {
        } else {
            patArchive.setId(existingArchives.get(0).getId());
            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.setPatientno(thiedInhospInfo.getPatiMediaNo());
        patArchive.setIdcardno(thiedInhospInfo.getPatiIdCardNo().trim());
        patArchive.setName(thiedInhospInfo.getPatiRecordName());
                patArchive.setSourcefrom(2);
                patArchive.setPattype("2");
        patArchive.setSourcefrom(2);
        patArchive.setPattype("2");
        // 性别
        patArchive.setSex("男".equals(thiedInhospInfo.getPatiRecordGender()) ? 1L : 2L);
        // 民族和籍贯
                patArchive.setNation(thiedInhospInfo.getPatiNation());
                patArchive.setNativePlace(thiedInhospInfo.getPatiNationality());
        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 {
                        patArchive.setBirthdate(new SimpleDateFormat("yyyy-MM-dd").parse(thiedInhospInfo.getPatiBirthday()));
                } catch (ParseException e) {
                patArchive.setBirthdate(new SimpleDateFormat("yyyy-MM-dd").parse(thiedInhospInfo.getPatiBirthday()));
            } catch (ParseException e) {
                log.warn("【buildPatientArchive】解析出生日期失败:{}", thiedInhospInfo.getPatiBirthday(), e);
                }
            }
        }
        // 年龄
                if (thiedInhospInfo.getTreateAge() != null) {
                    patArchive.setAge(Long.valueOf(thiedInhospInfo.getTreateAge()));
                }
                patArchive.setAgeUnit(thiedInhospInfo.getTreatAgeunit());
        if (thiedInhospInfo.getTreateAge() != null) {
            patArchive.setAge(Long.valueOf(thiedInhospInfo.getTreateAge()));
        }
        patArchive.setAgeUnit(thiedInhospInfo.getTreatAgeunit());
        // 联系方式
                patArchive.setTelcode(thiedInhospInfo.getCompanyTelNum());
                patArchive.setRelativetelcode(thiedInhospInfo.getContactPersonPhone());
        patArchive.setTelcode(thiedInhospInfo.getCompanyTelNum());
        patArchive.setRelativetelcode(thiedInhospInfo.getContactPersonPhone());
        // 出院方式处理(死亡等特殊情况)
        if (StringUtils.isNotEmpty(thiedInhospInfo.getOutWayId()) && "4".equals(thiedInhospInfo.getOutWayId())) {
            patArchive.setNotrequiredFlag("1");
@@ -916,114 +914,117 @@
            patArchive.setNotrequiredFlag("1");
            patArchive.setNotrequiredreason("出院方式为空");
        }
        // 系统字段
                patArchive.setDelFlag("0");
                patArchive.setCreateTime(new Date());
                patArchive.setUpdateTime(new Date());
        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());
                } else {
            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 patMedInhosp = new PatMedInhosp();
        // 患者基本信息
                patMedInhosp.setPatid(patArchive.getId());
                patMedInhosp.setPatno(patArchive.getPatientno());
                patMedInhosp.setPatname(patArchive.getName());
        patMedInhosp.setPatid(patArchive.getId());
        patMedInhosp.setPatno(patArchive.getPatientno());
        patMedInhosp.setPatname(patArchive.getName());
        // 护理信息
                patMedInhosp.setNurseId(thiedInhospInfo.getNurseId());
                patMedInhosp.setNurseName(thiedInhospInfo.getNurseName());
        patMedInhosp.setNurseId(thiedInhospInfo.getNurseId());
        patMedInhosp.setNurseName(thiedInhospInfo.getNurseName());
        // 住院信息
                patMedInhosp.setSerialnum(thiedInhospInfo.getInpatientId());
                patMedInhosp.setFuflag("1");
        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.setHospitalcode(thiedInhospInfo.getAreaId());
        patMedInhosp.setBedNo(thiedInhospInfo.getAdmissBedNo());
        // 诊断信息
                patMedInhosp.setIcd10code(thiedInhospInfo.getDiagIcd10());
                patMedInhosp.setDiagname(thiedInhospInfo.getDiagName());
        // 时间信息
        if (StringUtils.isNotEmpty(thiedInhospInfo.getAdmissDate())) {
                try {
                        patMedInhosp.setStarttime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(thiedInhospInfo.getAdmissDate()));
                } catch (ParseException e) {
            try {
                patMedInhosp.setStarttime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(thiedInhospInfo.getAdmissDate()));
            } catch (ParseException e) {
                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()));
                } catch (ParseException e) {
            try {
                patMedInhosp.setEndtime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(thiedInhospInfo.getOutDate()));
            } catch (ParseException e) {
                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");
        patMedInhosp.setOrgid("1");
        return patMedInhosp;
    }