liusheng
3 天以前 4d537968ac6efb3a5e3d0f8ea5071d5254eb63c3
代码提交
已添加3个文件
已修改6个文件
1044 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/HNGatherPatArchiveController.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java 452 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/HnDataGatherVO.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IHNGatherPatArchiveService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IXHGatherPatArchiveService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/HNGatherPatArchiveServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/XHGatherPatArchiveServiceImpl.java 445 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/HNGatherPatArchiveController.java
@@ -9,10 +9,7 @@
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.PatMedInhosp;
import com.smartor.domain.PatMedOuthosp;
import com.smartor.domain.PatMedReq;
import com.smartor.domain.PatMedRes;
import com.smartor.domain.*;
import com.smartor.service.IHNGatherPatArchiveService;
import com.smartor.service.IPatMedOuthospService;
import com.smartor.service.impl.HNGatherPatArchiveServiceImpl;
@@ -48,35 +45,12 @@
    /**
     * æ²³å—数据采集
     */
    //@PreAuthorize("@ss.hasPermi('smartor:patouthosp:list')")
    @PostMapping("/selectGatherList")
    @PostMapping("/hnDataGather")
    @ApiOperation("河南数据采集")
    public Integer selectUserList(@RequestBody PatMedInhosp patMedInhosp) {
//        Integer sd = ihnGatherPatArchiveService.selectDeptList(null);
//        Integer su = ihnGatherPatArchiveService.selectUserList(null);
//        Integer icd = ihnGatherPatArchiveService.selectIcd10List(null);
        log.info("开始按天同步用户数据,时间范围: {} åˆ° {}", patMedInhosp.getStartOutHospTime(), patMedInhosp.getEndOutHospTime());
        LocalDate startDate = patMedInhosp.getStartOutHospTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        LocalDate endDate = patMedInhosp.getEndOutHospTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        Integer po = null;
        // å¾ªçŽ¯å¤„ç†æ¯ä¸€å¤©
        for (LocalDate currentDate = startDate; !currentDate.isAfter(endDate); currentDate = currentDate.plusDays(1)) {
            PatMedInhosp dailyCondition = new PatMedInhosp();
            LocalDateTime dayStart = currentDate.atStartOfDay();
            LocalDateTime dayEnd = currentDate.atTime(23, 59, 59);
            dailyCondition.setStartOutHospTime(Date.from(dayStart.atZone(ZoneId.systemDefault()).toInstant()));
            dailyCondition.setEndOutHospTime(Date.from(dayEnd.atZone(ZoneId.systemDefault()).toInstant()));
            Integer pi = ihnGatherPatArchiveService.selectPatMedInhospList(dailyCondition);
            PatMedOuthosp patMedOuthosp = new PatMedOuthosp();
            patMedOuthosp.setBeginTime(Date.from(dayStart.atZone(ZoneId.systemDefault()).toInstant()));
            patMedOuthosp.setEndTime(Date.from(dayEnd.atZone(ZoneId.systemDefault()).toInstant()));
            po = ihnGatherPatArchiveService.selectPatMedOuthospList(patMedOuthosp);
        }
        return po;
    public AjaxResult hnDataGather(@RequestBody HnDataGatherVO hnDataGatherVO) {
        log.info("开始按天同步用户数据,时间范围: {} åˆ° {}", hnDataGatherVO.getStartOutHospTime(), hnDataGatherVO.getEndOutHospTime());
        Boolean aBoolean = ihnGatherPatArchiveService.hnDataGather(hnDataGatherVO);
        return AjaxResult.success(aBoolean);
    }
}
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -2,6 +2,7 @@
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
@@ -33,6 +34,7 @@
 *
 * @author ruoyi
 */
@Slf4j
@Component
public class SysLoginService {
    @Autowired
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -87,7 +87,7 @@
    private IServicePatientTempService iServicePatientTempService;
    @Autowired
    private PlatformTransactionManager transactionManager;
    private IHNGatherPatArchiveService ihnGatherPatArchiveService;
    @Autowired
    private SysUserImportMapper sysUserImportMapper;
@@ -125,8 +125,6 @@
    @Autowired
    IPatArchiveService patArchiveService;
    @Autowired
    IPatMedInhospService patMedInhospService;
    @Autowired
    IPatMedOuthospService patMedOuthospService;
@@ -137,14 +135,19 @@
    @Autowired
    IIvrTaskTemplateService iIvrTaskTemplateService;
    @Value("${hosp_info_url}")
    private String hospInfoUrl;
    @Autowired
    IXHGatherPatArchiveService ixhGatherPatArchiveService;
    @Value("${appid}")
    private String appid;
    @Value("${server.port}")
    private String port;
    @Value("${spring.profiles.active}")
    private String active;
    public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) {
        System.out.println(StringUtils.format("执行多参方法: å­—符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i));
@@ -211,34 +214,42 @@
     */
    public void dealHisData() {
        log.info("【dealHisData】开始执行HIS数据采集任务");
        long startTime = System.currentTimeMillis();
        // èŽ·å–æ˜¨å¤©0点到今天0点的时间范围
        LocalDateTime todayZero = LocalDateTime.now().with(LocalTime.MIN);
        LocalDateTime yesterdayZero = todayZero.minusDays(1);
        log.info("【dealHisData】采集时间范围:{} ~ {}", yesterdayZero, todayZero);
        try {
            // èŽ·å–æ˜¨å¤©0点到今天0点的时间范围
            LocalDateTime todayZero = LocalDateTime.now().with(LocalTime.MIN);
            LocalDateTime yesterdayZero = todayZero.minusDays(1);
        if (active.trim().equals("xh")) {
            try {
                // é‡‡é›†å…¥é™¢æ•°æ®
                log.info("【dealHisData】新华开始采集入院数据");
                ixhGatherPatArchiveService.getInHospDataGather("0", yesterdayZero, todayZero);
                log.info("【dealHisData】新华入院数据采集完成");
            log.info("【dealHisData】采集时间范围:{} ~ {}", yesterdayZero, todayZero);
                // é‡‡é›†å‡ºé™¢æ•°æ®
                log.info("【dealHisData】新华开始采集出院数据");
                ixhGatherPatArchiveService.getInHospDataGather("1", yesterdayZero, todayZero);
                log.info("【dealHisData】新华出院数据采集完成");
            // é‡‡é›†å…¥é™¢æ•°æ®
            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);
            // è¿™é‡Œå¯ä»¥æ·»åŠ å‘Šè­¦é€šçŸ¥é€»è¾‘ï¼Œæ¯”å¦‚å‘é€é‚®ä»¶æˆ–çŸ­ä¿¡
            } catch (Exception e) {
                log.error("【dealHisData】新华数据采集异常", e);
            }
        } else if (active.trim().equals("hn")) {
            try {
                // æ²³å—数据采集
                HnDataGatherVO hnDataGatherVO = new HnDataGatherVO();
                log.info("【dealHisData】河南开始采集数据");
                ihnGatherPatArchiveService.hnDataGather(hnDataGatherVO);
                log.info("【dealHisData】河南结束采集数据");
            } catch (Exception e) {
                log.error("【dealHisData】河南数据采集异常", e);
            }
        }
    }
    /**
     * è¿™ä¸ªåªæ˜¯æ–°åŽä¸´æ—¶ä½¿ç”¨ï¼Œå¹³æ—¶ç”¨ä¸åˆ°
     */
    public void dealHisData2() {
        //将患者信息、出入院数据全部采集
        // æŒ‡å®šçš„开始日期
@@ -251,8 +262,8 @@
        // ä»Žå¼€å§‹æ—¥æœŸåˆ°å½“前日期逐天打印
        for (LocalDate date = endDate; !date.isAfter(currentDate); date = date.plusDays(1)) {
            System.out.println(date.format(formatter));
            getInHospInfo("0", date.minusDays(1).atStartOfDay(), date.atStartOfDay());
            getInHospInfo("1", date.minusDays(1).atStartOfDay(), date.atStartOfDay());
            ixhGatherPatArchiveService.getInHospDataGather("0", date.minusDays(1).atStartOfDay(), date.atStartOfDay());
            ixhGatherPatArchiveService.getInHospDataGather("1", date.minusDays(1).atStartOfDay(), date.atStartOfDay());
        }
    }
@@ -639,389 +650,6 @@
            }
        }
    }
    /**
     * èŽ·å–æ‚£è€…å‡ºå…¥é™¢ä¿¡æ¯
     *
     * @param cry       å‡ºå…¥é™¢ç±»åž‹ï¼š0-入院,1-出院
     * @param startTime å¼€å§‹æ—¶é—´
     * @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接口获取数据
     */
    private List<ThiedInhospInfo> fetchHisData(String cry, LocalDateTime startTime, LocalDateTime endTime) {
        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("cashEndDate", endTime.format(formatter));
            req.put("currStatus", "4");
        } else {
            // å…¥é™¢å‚æ•°
            req.put("admissStartDate", startTime.format(formatter));
            req.put("admissEndDate", endTime.format(formatter));
            req.put("currStatus", "2");
        }
        return req;
    }
    /**
     * æž„建请求头
     */
    private Map<String, String> buildRequestHeaders(LocalDateTime startTime) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
        Map<String, String> header = new HashMap<>();
        header.put("x-hcsb-serviceno", "IS002347");
        header.put("x-hcsb-version", "2.0");
        header.put("x-hcsb-sourcesyscode", "14");
        header.put("x-hcsb-token", "ArGE2JnHtxG/Zx5nrnGY4eOfMUJGGJokAJHigG1BrCY=");
        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();
            return gson.fromJson(resultArray, resultType);
        } catch (Exception e) {
            log.error("【parseResponseData】解析响应数据异常,原始数据:{}", result, e);
            throw e;
        }
    }
    /**
     * ç¬¬äºŒæ­¥ï¼šä¿å­˜åŽŸå§‹æ•°æ®åˆ°æ–‡ä»¶
     */
    private void saveRawDataToFile(String cry, List<ThiedInhospInfo> dataList) {
        try {
            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);
            // æ–‡ä»¶ä¿å­˜å¤±è´¥ä¸å½±å“ä¸»æµç¨‹ï¼Œåªè®°å½•日志
        }
    }
    /**
     * ç¬¬ä¸‰æ­¥ï¼šå¤„理患者数据
     */
    private void processPatientData(List<ThiedInhospInfo> thiedInhospInfoList, String cry) {
        int successCount = 0;
        int skipCount = 0;
        int errorCount = 0;
        for (ThiedInhospInfo thiedInhospInfo : thiedInhospInfoList) {
            try {
                if (processSinglePatient(thiedInhospInfo, cry)) {
                    successCount++;
                } else {
                    skipCount++;
                }
            } catch (Exception e) {
                errorCount++;
                log.error("【processPatientData】处理患者数据异常,患者ID:{}", thiedInhospInfo.getPatiMediaNo(), e);
            }
        }
        log.info("【processPatientData】患者数据处理完成,成功:{},跳过:{},失败:{}", successCount, skipCount, errorCount);
    }
    /**
     * å¤„理单个患者数据
     */
    private boolean processSinglePatient(ThiedInhospInfo thiedInhospInfo, String cry) {
        // éªŒè¯èº«ä»½è¯å·
        if (StringUtils.isEmpty(thiedInhospInfo.getPatiIdCardNo())) {
            log.warn("【processSinglePatient】患者身份证号为空,跳过处理,患者编号:{}", thiedInhospInfo.getPatiMediaNo());
            return false;
        }
        // å¤„理患者档案信息
        PatArchive patArchive = processPatientArchive(thiedInhospInfo, cry);
        // å¤„理患者住院信息
        processPatientInhospInfo(thiedInhospInfo, patArchive, cry);
        return true;
    }
    /**
     * å¤„理患者档案信息
     */
    private PatArchive processPatientArchive(ThiedInhospInfo thiedInhospInfo, String cry) {
        // æŸ¥è¯¢æ‚£è€…是否已存在
        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 {
            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.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 {
                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());
        // è”系方式
        patArchive.setTelcode(thiedInhospInfo.getCompanyTelNum());
        patArchive.setRelativetelcode(thiedInhospInfo.getContactPersonPhone());
        // å‡ºé™¢æ–¹å¼å¤„理(死亡等特殊情况)
        if (StringUtils.isNotEmpty(thiedInhospInfo.getOutWayId()) && "4".equals(thiedInhospInfo.getOutWayId())) {
            patArchive.setNotrequiredFlag("1");
            patArchive.setNotrequiredreason(thiedInhospInfo.getOutWayName());
        }
        if ("1".equals(cry) && StringUtils.isEmpty(thiedInhospInfo.getOutWayId())) {
            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());
        } else {
            patMedInhospService.insertPatMedInhosp(patMedInhosp);
            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.setBedNo(thiedInhospInfo.getAdmissBedNo());
        // æ—¶é—´ä¿¡æ¯
        if (StringUtils.isNotEmpty(thiedInhospInfo.getAdmissDate())) {
            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) {
                log.warn("【buildPatientInhospInfo】解析出院时间失败:{}", thiedInhospInfo.getOutDate(), e);
            }
        }
        // å‡ºé™¢ä¿¡æ¯
        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.setSchemestatus("0".equals(cry) ? 1L : 2L);
        // ç³»ç»Ÿå­—段
        patMedInhosp.setDelFlag("0");
        patMedInhosp.setOrgid("1");
        return patMedInhosp;
    }
    private String getKey() {
        Map<String, String> map = new HashMap<>();
smartor/src/main/java/com/smartor/domain/HnDataGatherVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.smartor.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * æ²³å—数据采集入参对象
 *
 * @author smartor
 * @date 2023-03-04
 */
@ApiModel(value = "HnDataGatherVO", description = "河南数据采集入参对象")
@Data
public class HnDataGatherVO extends BaseEntity {
    /**
     * å¼€å§‹å‡ºé™¢æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "  ", width = 30, dateFormat = "yyyy-MM-dd")
    @ApiModelProperty(value = "开始出院日期")
    private Date startOutHospTime;
    /**
     * ç»“束出院日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "  ", width = 30, dateFormat = "yyyy-MM-dd")
    @ApiModelProperty(value = "结束出院日期")
    private Date endOutHospTime;
}
smartor/src/main/java/com/smartor/service/IHNGatherPatArchiveService.java
@@ -32,6 +32,14 @@
    public Integer selectPatMedInhospList(PatMedInhosp patMedInhosp);
    /**
     * æ²³å—数据采集
     *
     * @param patMedInhosp
     * @return
     */
    public Boolean hnDataGather(HnDataGatherVO patMedInhosp);
    /**
     * é—¨æ€¥è¯Šä¿¡æ¯
     *
     * @param id
smartor/src/main/java/com/smartor/service/IXHGatherPatArchiveService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.smartor.service;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.smartor.domain.*;
import java.time.LocalDateTime;
import java.util.List;
/**
 * æ²³å—采集患者信息接口
 *
 * @author smartor
 * @date 2023-03-04
 */
public interface IXHGatherPatArchiveService {
    /**
     * æ²³å—数据采集
     *
     * @param patMedInhosp
     * @return
     */
    public void getInHospDataGather(String cry, LocalDateTime startTime, LocalDateTime endTime);
}
smartor/src/main/java/com/smartor/service/impl/HNGatherPatArchiveServiceImpl.java
@@ -14,6 +14,9 @@
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
/**
@@ -106,6 +109,30 @@
        return 0;
    }
    @Override
    public Boolean hnDataGather(HnDataGatherVO hnDataGatherVO) {
        LocalDate startDate = hnDataGatherVO.getStartOutHospTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        LocalDate endDate = hnDataGatherVO.getEndOutHospTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        Integer po = null;
        // å¾ªçŽ¯å¤„ç†æ¯ä¸€å¤©
        for (LocalDate currentDate = startDate; !currentDate.isAfter(endDate); currentDate = currentDate.plusDays(1)) {
            PatMedInhosp dailyCondition = new PatMedInhosp();
            LocalDateTime dayStart = currentDate.atStartOfDay();
            LocalDateTime dayEnd = currentDate.atTime(23, 59, 59);
            dailyCondition.setStartOutHospTime(Date.from(dayStart.atZone(ZoneId.systemDefault()).toInstant()));
            dailyCondition.setEndOutHospTime(Date.from(dayEnd.atZone(ZoneId.systemDefault()).toInstant()));
            Integer pi = selectPatMedInhospList(dailyCondition);
            PatMedOuthosp patMedOuthosp = new PatMedOuthosp();
            patMedOuthosp.setBeginTime(Date.from(dayStart.atZone(ZoneId.systemDefault()).toInstant()));
            patMedOuthosp.setEndTime(Date.from(dayEnd.atZone(ZoneId.systemDefault()).toInstant()));
            po = selectPatMedOuthospList(patMedOuthosp);
        }
        return true;
    }
    @Override
    public Integer selectPatMedOuthospList(PatMedOuthosp patMedOuthosp) {
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java
@@ -397,8 +397,6 @@
        PatArchive patArchive = addPatArchive(externalInHospPatientInfo, externalInHospPatientAddrInfo, externalInHospPatientLiaisonInfo);
        PatMedInhosp patMedInhosp = new PatMedInhosp();
        patMedInhosp.setInhospno(externalInHospPatientInfo.getBingAnHao());
        patMedInhosp.setSerialnum(externalInHospPatientInfo.getJiuZhenYWID());
@@ -1201,6 +1199,9 @@
        PatArchive patArchive = new PatArchive();
        //如果是刚出生的小孩子,是没有身份证的,怎么处理????????
        patArchive.setIdcardno(externalInHospPatientInfo.getZhengJianHM());
        //如果身份证为空的话,就用就诊卡号代替
        if (StringUtils.isEmpty(externalInHospPatientInfo.getZhengJianHM()))
            patArchive.setIdcardno(externalInHospPatientInfo.getJiuZhenKH());
        patArchive.setOrgid(externalInHospPatientInfo.getZuZhiJGID());
        List<PatArchive> patArchives = null;
        if (ObjectUtils.isNotEmpty(patArchive.getIdcardno()))
smartor/src/main/java/com/smartor/service/impl/XHGatherPatArchiveServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,445 @@
package com.smartor.service.impl;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.SysUserDept;
import com.ruoyi.common.core.domain.entity.SysUserRole;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.smartor.domain.*;
import com.smartor.mapper.*;
import com.smartor.service.IHNGatherPatArchiveService;
import com.smartor.service.IPatArchiveService;
import com.smartor.service.IPatMedInhospService;
import com.smartor.service.IXHGatherPatArchiveService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
 * æ–°åŽæ•°æ®é‡‡é›†å¤„理
 *
 * @author smartor
 * @date 2023-03-04
 */
@Slf4j
@Service
public class XHGatherPatArchiveServiceImpl implements IXHGatherPatArchiveService {
    @Value("${hosp_info_url}")
    private String hospInfoUrl;
    @Autowired
    IPatMedInhospService patMedInhospService;
    @Autowired
    IPatArchiveService patArchiveService;
    /**
     * èŽ·å–æ‚£è€…å‡ºå…¥é™¢ä¿¡æ¯
     *
     * @param cry       å‡ºå…¥é™¢ç±»åž‹ï¼š0-入院,1-出院
     * @param startTime å¼€å§‹æ—¶é—´
     * @param endTime   ç»“束时间
     */
    @Transactional
    public void getInHospDataGather(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接口获取数据
     */
    private List<ThiedInhospInfo> fetchHisData(String cry, LocalDateTime startTime, LocalDateTime endTime) {
        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 void saveRawDataToFile(String cry, List<ThiedInhospInfo> dataList) {
        try {
            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);
            // æ–‡ä»¶ä¿å­˜å¤±è´¥ä¸å½±å“ä¸»æµç¨‹ï¼Œåªè®°å½•日志
        }
    }
    /**
     * ç¬¬ä¸‰æ­¥ï¼šå¤„理患者数据
     */
    private void processPatientData(List<ThiedInhospInfo> thiedInhospInfoList, String cry) {
        int successCount = 0;
        int skipCount = 0;
        int errorCount = 0;
        for (ThiedInhospInfo thiedInhospInfo : thiedInhospInfoList) {
            try {
                if (processSinglePatient(thiedInhospInfo, cry)) {
                    successCount++;
                } else {
                    skipCount++;
                }
            } catch (Exception e) {
                errorCount++;
                log.error("【processPatientData】处理患者数据异常,患者ID:{}", thiedInhospInfo.getPatiMediaNo(), e);
            }
        }
        log.info("【processPatientData】患者数据处理完成,成功:{},跳过:{},失败:{}", successCount, skipCount, errorCount);
    }
    /**
     * æž„建请求头
     */
    private Map<String, String> buildRequestHeaders(LocalDateTime startTime) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
        Map<String, String> header = new HashMap<>();
        header.put("x-hcsb-serviceno", "IS002347");
        header.put("x-hcsb-version", "2.0");
        header.put("x-hcsb-sourcesyscode", "14");
        header.put("x-hcsb-token", "ArGE2JnHtxG/Zx5nrnGY4eOfMUJGGJokAJHigG1BrCY=");
        header.put("x-hcsb-msgdate", startTime.format(formatter));
        return header;
    }
    /**
     * æž„建请求参数
     */
    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("cashEndDate", endTime.format(formatter));
            req.put("currStatus", "4");
        } else {
            // å…¥é™¢å‚æ•°
            req.put("admissStartDate", startTime.format(formatter));
            req.put("admissEndDate", endTime.format(formatter));
            req.put("currStatus", "2");
        }
        return req;
    }
    /**
     * è§£æžå“åº”数据
     */
    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();
            return gson.fromJson(resultArray, resultType);
        } catch (Exception e) {
            log.error("【parseResponseData】解析响应数据异常,原始数据:{}", result, e);
            throw e;
        }
    }
    /**
     * å¤„理单个患者数据
     */
    private boolean processSinglePatient(ThiedInhospInfo thiedInhospInfo, String cry) {
        // éªŒè¯èº«ä»½è¯å·
        if (StringUtils.isEmpty(thiedInhospInfo.getPatiIdCardNo())) {
            log.warn("【processSinglePatient】患者身份证号为空,跳过处理,患者编号:{}", thiedInhospInfo.getPatiMediaNo());
            return false;
        }
        // å¤„理患者档案信息
        PatArchive patArchive = processPatientArchive(thiedInhospInfo, cry);
        // å¤„理患者住院信息
        processPatientInhospInfo(thiedInhospInfo, patArchive, cry);
        return true;
    }
    /**
     * å¤„理患者档案信息
     */
    private PatArchive processPatientArchive(ThiedInhospInfo thiedInhospInfo, String cry) {
        // æŸ¥è¯¢æ‚£è€…是否已存在
        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 {
            patArchive.setId(existingArchives.get(0).getId());
            patArchiveService.updateArchive(patArchive);
            log.debug("【processPatientArchive】更新患者档案,患者编号:{}", patArchive.getPatientno());
        }
        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 {
            patMedInhospService.insertPatMedInhosp(patMedInhosp);
            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.setBedNo(thiedInhospInfo.getAdmissBedNo());
        // æ—¶é—´ä¿¡æ¯
        if (StringUtils.isNotEmpty(thiedInhospInfo.getAdmissDate())) {
            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) {
                log.warn("【buildPatientInhospInfo】解析出院时间失败:{}", thiedInhospInfo.getOutDate(), e);
            }
        }
        // å‡ºé™¢ä¿¡æ¯
        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.setSchemestatus("0".equals(cry) ? 1L : 2L);
        // ç³»ç»Ÿå­—段
        patMedInhosp.setDelFlag("0");
        patMedInhosp.setOrgid("1");
        return patMedInhosp;
    }
    /**
     * æž„建患者档案信息
     */
    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 {
                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());
        // è”系方式
        patArchive.setTelcode(thiedInhospInfo.getCompanyTelNum());
        patArchive.setRelativetelcode(thiedInhospInfo.getContactPersonPhone());
        // å‡ºé™¢æ–¹å¼å¤„理(死亡等特殊情况)
        if (StringUtils.isNotEmpty(thiedInhospInfo.getOutWayId()) && "4".equals(thiedInhospInfo.getOutWayId())) {
            patArchive.setNotrequiredFlag("1");
            patArchive.setNotrequiredreason(thiedInhospInfo.getOutWayName());
        }
        if ("1".equals(cry) && StringUtils.isEmpty(thiedInhospInfo.getOutWayId())) {
            patArchive.setNotrequiredFlag("1");
            patArchive.setNotrequiredreason("出院方式为空");
        }
        // ç³»ç»Ÿå­—段
        patArchive.setDelFlag("0");
        patArchive.setCreateTime(new Date());
        patArchive.setUpdateTime(new Date());
        return patArchive;
    }
}