liusheng
3 天以前 c462811cd33e81a80bc089e3677975c069d9cda5
smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
@@ -15,6 +15,7 @@
import com.smartor.mapper.*;
import com.smartor.service.IPatArchiveService;
import com.smartor.service.IPatMedInhospService;
import com.smartor.service.IPatMedOuthospService;
import com.smartor.service.IServiceSLTDHealthcareRecordService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@@ -39,7 +40,6 @@
public class ServiceSLTDHealthcareRecordServiceImpl implements IServiceSLTDHealthcareRecordService {
    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String APP_KEY = "ak-zUMiOWhqXiJQWPB1pCbz0pjr";
    @Autowired
    private IPatArchiveService patArchiveService;
@@ -48,7 +48,7 @@
    private IPatMedInhospService patMedInhospService;
    @Autowired
    private PatMedOuthospMapper patMedOuthospMapper;
    private IPatMedOuthospService patMedOuthospService;
    @Autowired
    private SysUser2Mapper sysUser2Mapper;
@@ -71,12 +71,16 @@
    @Value("${userPwd}")
    private String userPwd;
    @Value("${lwl_app_key}")
    private String APP_KEY;
    @Override
    public List<ServiceSLTDInhospResDTO> queryHealthcareRecordList(ServiceSLTDInhospReqVO reqVO) {
        try {
            Map<String, Object> requestParams = buildRequestParams(reqVO);
            Map<String, String> headers = buildRequestHeaders();
            String result = HttpUtils.sendPostByHeader(sltdPubPath + "osj/hbos-thirdparty-integration/standard/common/healthcareRecord/dtcQueryHealthcareRecordList", new Gson().toJson(requestParams), headers);
            log.info("请求参数出院数据地址:{},appKey:{}", sltdPubPath + "/osj/hbos-thirdparty-integration/standard/common/healthcareRecord/dtcQueryHealthcareRecordList", APP_KEY);
            String result = HttpUtils.sendPostByHeader(sltdPubPath + "/osj/hbos-thirdparty-integration/standard/common/healthcareRecord/dtcQueryHealthcareRecordList", new Gson().toJson(requestParams), headers);
            String cry = determineCry(reqVO);
            log.info("cry的值为:{}", cry);
@@ -85,7 +89,7 @@
            return serviceSLTDInhospResDTOS;
        } catch (Exception e) {
            log.error("【queryHealthcareRecordList】调用省立同德健康记录查询接口异常,请求参数:{}", reqVO, e);
            throw new RuntimeException("调用省立同德健康记录查询接口失败", e);
            throw new RuntimeException("调用省立同德健康记录查询接口失败:" + e.getMessage());
        }
    }
@@ -163,10 +167,15 @@
                sysDept.setUpdateTime(new Date());
                sysDept.setUpdateBy(null);
                SysDept sysDept1 = sysDeptMapper.selectDeptByCode(sysDept.getDeptCode(), sysDept.getOrgid());
                // 按 deptCode + orgid + campusid 查重,避免跨院区科室重复
                SysDept sysDept1 = sysDeptMapper.selectDeptByCodeAndCampus(sysDept.getDeptCode(), sysDept.getOrgid(), sysDept.getCampusid());
                if (Objects.isNull(sysDept1)) {
                    int i = sysDeptMapper.insertDept(sysDept);
                    log.info("ServiceExternalServiceImpl---addDeptInfo是否新增成功:{}", i);
                    try {
                        int i = sysDeptMapper.insertDept(sysDept);
                        log.info("ServiceExternalServiceImpl---addDeptInfo是否新增成功:{}", i);
                    } catch (org.springframework.dao.DuplicateKeyException e) {
                        log.warn("【queryDeptWardAreaInfoList】科室已存在(并发插入),跳过:deptCode={}, orgid={}, campusid={}", sysDept.getDeptCode(), sysDept.getOrgid(), sysDept.getCampusid());
                    }
                } else {
                    sysDept.setDeptId(sysDept1.getDeptId());
                    int i = sysDeptMapper.updateDept(sysDept);
@@ -222,17 +231,16 @@
                        String professionalTitleName = getStringValue(diagnosisMap, "professionalTitleName");
                        if (professionalTitleName.contains("医师")) {
                            sysUser.setUserType("医生");
                            sysUser.setSearchscope("1");
                        }
                        if (professionalTitleName.contains("护")) {
                            sysUser.setUserType("护士");
                            sysUser.setSearchscope("2");
                        }
                        sysUser.setTitle(getStringValue(diagnosisMap, "professionalTitleName"));
                    }
                }
            }
            //如果用户的患者范围为空,则默认为0
            if (StringUtils.isEmpty(sysUser.getSearchscope())) sysUser.setSearchscope("0");
            sysUser.setPhonenumber(getStringValue(dataItem, "telephone"));
            sysUser.setUserCode(getStringValue(dataItem, "jobNumber"));
            //设置性别
@@ -245,86 +253,94 @@
            sysUser.setUpdateTime(new Date());
            sysUser.setUpdateBy("admin");
            sysUser.setCreateBy("admin");
            sysUser.setCreateBy("admin");
            sysUser.setOrgid("" + getLongValue(dataItem, "orgId"));
//            sysUser.setCampusid("" + getLongValue(dataItem, "cmpusId"));
            BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
            sysUser.setPassword(passwordEncoder.encode(userPwd));
            SysUser sysUser1 = sysUser2Mapper.selectUserByUserName(sysUser.getUserName());
            if (ObjectUtils.isNotEmpty(sysUser1)) {
                //已存在:由人工维护的字段是不需要更新的,orgid/campusid保留原值不覆盖
                sysUser.setSearchscope(null);
                sysUser.setPassword(null);
                sysUser.setUserId(sysUser1.getUserId());
                sysUser.setOrgid(null);
                sysUser.setCampusid(null);
                sysUser2Mapper.updateUser(sysUser);
            } else {
                sysUser2Mapper.insertUser(sysUser);
                try {
                    sysUser2Mapper.insertUser(sysUser);
                } catch (org.springframework.dao.DuplicateKeyException e) {
                    //并发插入场景:重新查询获取已存在记录,避免重复
                    log.warn("【queryHospUserInfoList】用户已存在(并发插入),跳过:userName={}", sysUser.getUserName());
                    SysUser existingUser = sysUser2Mapper.selectUserByUserName(sysUser.getUserName());
                    if (ObjectUtils.isNotEmpty(existingUser)) {
                        sysUser.setUserId(existingUser.getUserId());
                    }
                }
            }
            // 处理用户与部门的关系
            List businessDepts = (List<?>) dataItem.get("businessDepts");
            if (CollectionUtils.isEmpty(businessDepts)) {
                continue;
            }
            if (CollectionUtils.isNotEmpty(businessDepts)) {
                List<List<String>> deptInfoList = new ArrayList<>();
                List<List<String>> hospInfoList = new ArrayList<>();
                log.info("------businessDepts是否有值:{}", businessDepts.size());
                for (Object businessDept : businessDepts) {
                    if (businessDept instanceof Map) {
                        Map<String, Object> businessDeptMap = (Map<String, Object>) businessDept;
                        log.info("------businessDeptMap是否有值:{}", businessDeptMap);
                        String hisDeptId = getStringValue(businessDeptMap, "deptId");
                        log.info("------hisDeptId是否有值:{}, reqVO.getOrgId()的值为:{}", hisDeptId, reqVO.getCampusId());
                        //在这里,hisDeptId就是deptCode,按院区+机构查科室,避免跨院区查错
                        SysDept sysDept = sysDeptMapper.selectDeptByCodeAndCampus(hisDeptId, reqVO.getOrgId(), reqVO.getCampusId() != null ? reqVO.getCampusId().toString() : null);
                        log.info("------hisDeptId是否有值:{}, reqVO.getCampusId()的值为:{}", hisDeptId, reqVO.getCampusId());
                        if (Objects.isNull(sysDept)) continue;
                        SysUserDept sysUserDept = new SysUserDept();
                        sysUserDept.setUserId(sysUser.getUserId());
                        sysUserDept.setDeptType(sysDept.getDeptType());
                        sysUserDept.setDeptId(sysDept.getDeptId());
                        sysUserDept.setDeptCode(sysDept.getDeptCode());
                        sysUserDept.setDeptName(sysDept.getDeptName());
                        sysUserDept.setOrgid(sysDept.getOrgid());
                        sysUserDept.setCreateTime(new Date());
                        sysUserDept.setDelFlag(0L);
            List<List<String>> deptInfoList = new ArrayList<>();
            List<List<String>> hospInfoList = new ArrayList<>();
            log.info("------businessDepts是否有值:{}", businessDepts.size());
            for (Object businessDept : businessDepts) {
                if (businessDept instanceof Map) {
                    Map<String, Object> businessDeptMap = (Map<String, Object>) businessDept;
                    log.info("------businessDeptMap是否有值:{}", businessDeptMap);
//                    Long hisDeptId = (Long) personnelDeptMap.get("deptId");
                    String hisDeptId = getStringValue(businessDeptMap, "deptId");
                    log.info("------hisDeptId是否有值:{}, reqVO.getOrgId()的值为:{}", hisDeptId, reqVO.getCampusId());
                    //在这里,hisDeptId就是deptCode
                    SysDept sysDept = sysDeptMapper.selectDeptByCode(hisDeptId, reqVO.getOrgId());
                    log.info("------hisDeptId是否有值:{}, reqVO.getCampusId()的值为:{}", hisDeptId, reqVO.getCampusId());
                    if (Objects.isNull(sysDept)) continue;
                    SysUserDept sysUserDept = new SysUserDept();
                    sysUserDept.setUserId(sysUser.getUserId());
                    sysUserDept.setDeptType(sysDept.getDeptType());
                    sysUserDept.setDeptId(sysDept.getDeptId());
                    sysUserDept.setDeptCode(sysDept.getDeptCode());
                    sysUserDept.setDeptName(sysDept.getDeptName());
                    sysUserDept.setOrgid(sysDept.getOrgid());
                    sysUserDept.setCreateTime(new Date());
                    sysUserDept.setDelFlag(0L);
                    //判断一下是不是已经存在了
                    if (ObjectUtils.isNotEmpty(sysUser1) && ObjectUtils.isNotEmpty(sysDept)) {
                        SysUserDept sud = new SysUserDept();
                        sud.setUserId(sysUser1.getUserId());
                        sud.setDeptId(sysDept.getDeptId());
                        List<SysUserDept> sysUserDepts = sysUserDeptMapper.selectSysUserDeptList(sud);
                        if (CollectionUtils.isNotEmpty(sysUserDepts)) {
                            sysUserDept.setId(sysUserDepts.get(0).getId());
                            sysUserDeptMapper.updateSysUserDept(sysUserDept);
                        //判断一下用户-部门关系是不是已经存在了(无论新用户还是老用户都需要去重)
                        if (ObjectUtils.isNotEmpty(sysUser.getUserId()) && ObjectUtils.isNotEmpty(sysDept)) {
                            SysUserDept sud = new SysUserDept();
                            sud.setUserId(sysUser.getUserId());
                            sud.setDeptId(sysDept.getDeptId());
                            sud.setOrgid(sysDept.getOrgid());
                            List<SysUserDept> sysUserDepts = sysUserDeptMapper.selectSysUserDeptList(sud);
                            if (CollectionUtils.isNotEmpty(sysUserDepts)) {
                                sysUserDept.setId(sysUserDepts.get(0).getId());
                                sysUserDeptMapper.updateSysUserDept(sysUserDept);
                            } else {
                                sysUserDeptMapper.insertSysUserDept(sysUserDept);
                            }
                        }
                    } else {
                        //不存在,则新增
                        sysUserDeptMapper.insertSysUserDept(sysUserDept);
                    }
                    if (StringUtils.isNotEmpty(sysDept.getDeptType()) && sysDept.getDeptType().equals("1")) {
                        hospInfoList.add(Arrays.asList(sysDept.getDeptCode()));
                    } else if (StringUtils.isNotEmpty(sysDept.getDeptType()) && sysDept.getDeptType().equals("2")) {
                        deptInfoList.add(Arrays.asList(sysDept.getDeptCode()));
                        if (StringUtils.isNotEmpty(sysDept.getDeptType()) && sysDept.getDeptType().equals("1")) {
                            hospInfoList.add(Arrays.asList(sysDept.getDeptCode()));
                        } else if (StringUtils.isNotEmpty(sysDept.getDeptType()) && sysDept.getDeptType().equals("2")) {
                            deptInfoList.add(Arrays.asList(sysDept.getDeptCode()));
                        }
                    }
                }
                //将部门我病区放到指定字段中
                Gson gson = new Gson();
                sysUser.setHospInfo(gson.toJson(hospInfoList));
                sysUser.setDeptInfo(gson.toJson(deptInfoList));
                sysUser2Mapper.updateUser(sysUser);
            }
            //将部门我病区放到指定字段中
            Gson gson = new Gson();
            sysUser.setHospInfo(gson.toJson(hospInfoList));
            sysUser.setDeptInfo(gson.toJson(deptInfoList));
            sysUser2Mapper.updateUser(sysUser);
            //设置一个默认角色(医生角色)
            List<SysUserRole> userRoleList = new ArrayList();
            SysUserRole sur = new SysUserRole();
            sur.setUserId(sysUser.getUserId());
            sur.setRoleId(3L);
            sur.setRoleId(4L);
            sur.setOrgid(sysUser.getOrgid());
            //先查询一下,是否存在
            SysUserRole sysUserRole = sysUserRoleMapper.selectUserRoleByRoleIdAndUserId(sysUser.getUserId(), 3L);
            SysUserRole sysUserRole = sysUserRoleMapper.selectUserRoleByRoleIdAndUserId(4L, sysUser.getUserId());
            if (ObjectUtils.isNotEmpty(sysUserRole)) continue;
            userRoleList.add(sur);
@@ -392,6 +408,13 @@
        params.put("inpatientArea", null);
//        params.put("status", reqVO.getStatusList() != null && !reqVO.getStatusList().isEmpty() ? reqVO.getStatusList().get(0) : null);
        params.put("status", null);
        // 分页参数(门急诊分页采集时使用)
        if (reqVO.getCurrent() != null) {
            params.put("current", reqVO.getCurrent());
        }
        if (reqVO.getSize() != null) {
            params.put("size", reqVO.getSize());
        }
        return params;
    }
@@ -449,11 +472,21 @@
    }
    private void processResultList(List<ServiceSLTDInhospResDTO> resultList, List<String> types, String cry, String campusId) {
        for (String type : types)
        // 门诊(FH0108.01)和急诊(FH0108.03)在业务上是同一类数据,共用同一个 resultList。
        // 若 types 同时包含两者,outHospitalDate 会被调用两次导致重复入库。
        // 因此只要 types 中含有任意一个门急诊类型,就只处理一次。
        boolean outpProcessed = false;
        for (String type : types) {
            switch (type) {
                case "FH0108.01":
                    log.info("【parseResponseData】解析门诊数据");
                    outHospitalDate(resultList);
                case "FH0108.03":
                    if (!outpProcessed) {
                        log.info("【parseResponseData】解析门急诊数据,types={}", types);
                        outHospitalDate(resultList);
                        outpProcessed = true;
                    } else {
                        log.info("【parseResponseData】门急诊数据已处理,跳过 type={}", type);
                    }
                    break;
                case "FH0109.26":
                    log.info("【parseResponseData】解析住院数据");
@@ -475,14 +508,11 @@
                    log.info("【parseResponseData】解析预住院(其他)数据");
                    inHospitalDate(resultList, cry);
                    break;
//                case "FH0108.03":
//                    log.info("【parseResponseData】解析急诊数据");
//                    outHospitalDate(resultList);
//                    break;
                default:
                    log.warn("【parseResponseData】未知的数据类型:{}", type);
                    break;
            }
        }
    }
    private Boolean outHospitalDate(List<ServiceSLTDInhospResDTO> resultList) {
@@ -502,19 +532,15 @@
            try {
                //这里用自动忽略重复会有问题,如果表重新建,serialnum索引会丢失。就无法去重,所以还是需要内存里去重
                batchList = DistinctByProperty.distinctByProperty(batchList, PatMedOuthosp::getSerialnum);
                int insertCount = patMedOuthospMapper.batchInsertIgnore(batchList);
                Integer insertCount = 0;
                for (PatMedOuthosp patMedOuthosp : batchList) {
                    insertCount += patMedOuthospService.insertPatMedOuthosp(patMedOuthosp);
                }
                log.info("批量插入门急诊记录,总数:{}, 实际插入:{}", batchList.size(), insertCount);
            } catch (Exception e) {
                log.error("批量插入门急诊记录失败", e);
                // 降级为逐条插入
                for (PatMedOuthosp patMedOuthosp : batchList) {
                    try {
                        patMedOuthospMapper.insertPatMedOuthosp(patMedOuthosp);
                    } catch (Exception ex) {
                        log.warn("单条插入失败:serialnum={}", patMedOuthosp.getSerialnum());
                    }
                }
            }
        }
        return true;
@@ -540,6 +566,9 @@
        patMedOuthosp.setCreateTime(new Date());
        patMedOuthosp.setOrgid(dto.getOrgId());
        patMedOuthosp.setCampusid(dto.getCampusId());
        patMedOuthosp.setFuflag("1");
        if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1"))
            patMedOuthosp.setFuflag("0");
        return patMedOuthosp;
    }
@@ -581,8 +610,10 @@
                queryInhosp.setInhospstate("3");
                List<PatMedInhosp> patMedInhospList = patMedInhospService.selectPatMedInhosp(queryInhosp);
                if (CollectionUtils.isNotEmpty(patMedInhospList)) {
                    //如果预入院不为空,则进行修改
                    //如果预入院不为空,则进行修改(预入院→入院)
                    patMedInhosp.setInhospid(patMedInhospList.get(0).getInhospid());
                    patMedInhospService.updatePatMedInhosp(patMedInhosp);
                    log.info("由预入院更新为入院:serialnum={}", patMedInhosp.getSerialnum());
                } else {
                    //如果出院不为空,则不进行处理
                    queryInhosp.setInhospstate("1");
@@ -603,37 +634,38 @@
            }
        } else if (cry.equals("1")) {
//           出院数据处理
            if (CollectionUtils.isEmpty(existingInhosps)) {
                //如果为空,要先判断,预入院是否有值,有值的话则更新
            // 出院数据处理
            if (CollectionUtils.isNotEmpty(existingInhosps)) {
                // 已存在出院记录,直接更新(保持最新数据)
                patMedInhosp.setInhospid(existingInhosps.get(0).getInhospid());
                patMedInhospService.updatePatMedInhosp(patMedInhosp);
                log.info("出院记录已存在,执行更新:serialnum={}, orgid={}", patMedInhosp.getSerialnum(), patMedInhosp.getOrgid());
            } else {
                // 不存在出院记录,先查预入院(state=3),再查入院(state=0)
                queryInhosp.setInhospstate("3");
                log.info("-----patMedInhospList进来了不?入参为:{}", queryInhosp);
                log.info("-----查询预入院记录,入参为:{}", queryInhosp);
                List<PatMedInhosp> patMedInhospList = patMedInhospService.selectPatMedInhosp(queryInhosp);
                log.info("----patMedInhospList进来了不?返参为:{}", CollectionUtils.isEmpty(patMedInhospList) ? null : patMedInhospList.get(0).getSerialnum());
                log.info("----预入院查询结果:{}", CollectionUtils.isEmpty(patMedInhospList) ? "空" : patMedInhospList.get(0).getSerialnum());
                if (CollectionUtils.isNotEmpty(patMedInhospList)) {
                    //如果预入院不为空,则进行修改
                    // 存在预入院记录,更新为出院状态
                    patMedInhosp.setInhospid(patMedInhospList.get(0).getInhospid());
                    patMedInhospService.updatePatMedInhosp(patMedInhosp);
                    log.info("由预入院更新为出院:serialnum={}", patMedInhosp.getSerialnum());
                } else {
                    //如果入院不为空,则进行修改
                    // 再查入院记录(state=0)
                    queryInhosp.setInhospstate("0");
                    patMedInhospList = patMedInhospService.selectPatMedInhosp(queryInhosp);
                    log.debug("入院查询结果:{}", CollectionUtils.isEmpty(patMedInhospList) ? "空" : patMedInhospList.size());
                    if (CollectionUtils.isNotEmpty(patMedInhospList)) {
                        // 存在入院记录,更新为出院状态
                        patMedInhosp.setInhospid(patMedInhospList.get(0).getInhospid());
                        patMedInhospService.updatePatMedInhosp(patMedInhosp);
                    }
                }
                //如果都为空,则进行新增
                if (CollectionUtils.isEmpty(patMedInhospList)) {
                    //如果入院不为空,则进行修改
                    queryInhosp.setInhospstate("0");
                    log.debug("出院queryInhosp入参为:{}", queryInhosp);
                    List<PatMedInhosp> patMedInhosps = patMedInhospService.selectPatMedInhosp(queryInhosp);
                    log.debug("出院patMedInhospList返参为:{}", CollectionUtils.isEmpty(patMedInhosps) ? null : patMedInhosps.size());
                    if (CollectionUtils.isNotEmpty(patMedInhosps)) {
                        patMedInhospService.updatePatMedInhosp(patMedInhosp);
                        log.info("由入院更新为出院:serialnum={}", patMedInhosp.getSerialnum());
                    } else {
                        // 预入院和入院均不存在,直接新增出院记录
                        try {
                            patMedInhospService.insertPatMedInhosp(patMedInhosp);
                            log.info("新增出院记录:serialnum={}", patMedInhosp.getSerialnum());
                        } catch (org.springframework.dao.DuplicateKeyException e) {
                            log.warn("出院记录已存在,跳过:serialnum={}, orgid={}, state={}", patMedInhosp.getSerialnum(), patMedInhosp.getOrgid(), patMedInhosp.getInhospstate());
                        }
@@ -658,6 +690,8 @@
            if (locked == null || Boolean.TRUE.equals(locked)) {
                try {
                    queryInhosp.setInhospstate(null);
                    queryInhosp.setSchemestatus(null);
                    queryInhosp.setPatno(null);
                    List<PatMedInhosp> patMedInhospList3 = patMedInhospService.selectPatMedInhosp(queryInhosp);
                    if (CollectionUtils.isEmpty(patMedInhospList3)) {
                        try {
@@ -691,10 +725,45 @@
        patMedInhosp.setNurseId(dto.getChiefNurseId() == null ? "" : dto.getChiefNurseId().toString());
        patMedInhosp.setNurseName(dto.getChiefNurseName());
        patMedInhosp.setSerialnum(dto.getHealthcareRecordNo());
        patMedInhosp.setInhospno(dto.getHealthcareRecordNo());
        patMedInhosp.setFuflag("1");
        if ("0".equals(cry)) patMedInhosp.setInhospstate("0");
        if ("1".equals(cry)) patMedInhosp.setInhospstate("1");
        if ("3".equals(cry)) patMedInhosp.setInhospstate("3");
        if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1"))
            patMedInhosp.setFuflag("0");
        if ("0".equals(cry)) {
            patMedInhosp.setInhospstate("0");
            if (CollectionUtils.isNotEmpty(dto.getDiagnosisList()) && dto.getDiagnosisList().size() > 0) {
                for (ServiceSLTDDiagnosisResDTO diagnosis : dto.getDiagnosisList()) {
                    if (diagnosis.getIsMainDiagnosis() == 1) {
                        patMedInhosp.setDiagname(diagnosis.getDiagnosisDictName() == null ? "" : diagnosis.getDiagnosisDictName());
                        patMedInhosp.setIcd10code(diagnosis.getDiagnosisDictCode() == null ? "" : diagnosis.getDiagnosisDictCode());
                    }
                }
            }
        }
        if ("1".equals(cry)) {
            patMedInhosp.setInhospstate("1");
            ServiceSLTDDiagnosisResDTO mainDischargeDiagnosis = dto.getMainDischargeDiagnosis();
            log.info("-----------mainDischargeDiagnosis的值有了吗?{}", mainDischargeDiagnosis);
            if (!Objects.isNull(mainDischargeDiagnosis)) {
                if (mainDischargeDiagnosis.getIsMainDiagnosis() == 1) {
                    patMedInhosp.setLeavediagname(StringUtils.defaultString(mainDischargeDiagnosis.getDiagnosisDictName(), ""));
                    patMedInhosp.setLeaveicd10code(StringUtils.defaultString(mainDischargeDiagnosis.getDiagnosisDictCode(), ""));
                }
            }
        }
        if ("3".equals(cry)) {
            patMedInhosp.setInhospstate("3");
            if (CollectionUtils.isNotEmpty(dto.getDiagnosisList()) && dto.getDiagnosisList().size() > 0) {
                for (ServiceSLTDDiagnosisResDTO diagnosis : dto.getDiagnosisList()) {
                    if (diagnosis.getIsMainDiagnosis() == 1) {
                        patMedInhosp.setDiagname(diagnosis.getDiagnosisDictName() == null ? "" : diagnosis.getDiagnosisDictName());
                        patMedInhosp.setIcd10code(diagnosis.getDiagnosisDictCode() == null ? "" : diagnosis.getDiagnosisDictCode());
                    }
                }
            }
        }
        patMedInhosp.setHospitalcode(dto.getOrgId());
        patMedInhosp.setBedNo(dto.getBedNumber());
        patMedInhosp.setStarttime(parseDate(dto.getStartTime()));
@@ -739,17 +808,52 @@
    }
    private PatArchive processPatientArchive(ServiceSLTDInhospResDTO dto) {
        PatArchive queryArchive = new PatArchive();
        queryArchive.setIdcardno(StringUtils.isEmpty(dto.getIdCardNo()) ? "" + dto.getMedicalCardId() : dto.getIdCardNo().trim());
        List<PatArchive> existingArchives = patArchiveService.selectPatArchiveList(queryArchive);
        List<PatArchive> existingArchives = null;
        // 第一步:按 patientno 精确查重(与插入时使用的 medicalRecordNo 一致)
        String patientno = dto.getMedicalRecordNo() == null ? null : String.valueOf(dto.getMedicalRecordNo());
        if (StringUtils.isNotEmpty(patientno)) {
            PatArchive queryByPatientNo = new PatArchive();
            queryByPatientNo.setPatientno(patientno);
            existingArchives = patArchiveService.selectPatArchiveList(queryByPatientNo);
        }
        // 第二步:按 patientno 查不到时,按 idcardno 查重(分步OR,避免AND条件漏查)
        if (CollectionUtils.isEmpty(existingArchives) && StringUtils.isNotEmpty(dto.getIdCardNo())) {
            PatArchive queryByIdCard = new PatArchive();
            queryByIdCard.setIdcardno(dto.getIdCardNo().trim());
            existingArchives = patArchiveService.selectPatArchiveList(queryByIdCard);
        }
        // 第三步:按 patidHis 查重(兼容旧数据,旧数据可能以 patientId 存为 patientno)
        if (CollectionUtils.isEmpty(existingArchives) && dto.getPatientId() != null) {
            PatArchive queryByPatidHis = new PatArchive();
            queryByPatidHis.setPatientno(String.valueOf(dto.getPatientId()));
            existingArchives = patArchiveService.selectPatArchiveList(queryByPatidHis);
        }
        PatArchive patArchive = buildPatientArchive(dto);
        if (CollectionUtils.isEmpty(existingArchives)) {
            patArchiveService.insertPatArchive(patArchive);
            log.debug("【processPatientArchive】新增患者档案,患者编号:{}", patArchive.getPatientno());
            try {
                patArchiveService.insertPatArchive(patArchive);
                log.debug("【processPatientArchive】新增患者档案,患者编号:{}", patArchive.getPatientno());
            } catch (org.springframework.dao.DuplicateKeyException e) {
                log.warn("【processPatientArchive】患者档案已存在(并发插入),跳过:patientno={}, idcardno={}", patArchive.getPatientno(), patArchive.getIdcardno());
                // 并发插入场景,重新查询获取已存在的记录
                PatArchive queryRetry = new PatArchive();
                queryRetry.setPatientno(patArchive.getPatientno());
                existingArchives = patArchiveService.selectPatArchiveList(queryRetry);
                if (CollectionUtils.isNotEmpty(existingArchives)) {
                    patArchive.setId(existingArchives.get(0).getId());
                    patArchive.setNotrequiredFlag(existingArchives.get(0).getNotrequiredFlag());
                    patArchive.setNotrequiredreason(existingArchives.get(0).getNotrequiredreason());
                }
            }
        } else {
            patArchive.setId(existingArchives.get(0).getId());
            patArchive.setNotrequiredFlag(existingArchives.get(0).getNotrequiredFlag());
            patArchive.setNotrequiredreason(existingArchives.get(0).getNotrequiredreason());
            patArchiveService.updateArchive(patArchive);
            log.debug("【processPatientArchive】更新患者档案,患者编号:{}", patArchive.getPatientno());
        }
@@ -759,10 +863,11 @@
    private PatArchive buildPatientArchive(ServiceSLTDInhospResDTO dto) {
        PatArchive patArchive = new PatArchive();
        patArchive.setPatientno("" + dto.getPatientId());
        patArchive.setPatientno(dto.getMedicalRecordNo() == null ? null : String.valueOf(dto.getMedicalRecordNo()));
        patArchive.setPatidHis(dto.getPatientId() == null ? null : String.valueOf(dto.getPatientId()));
        patArchive.setIdcardno(StringUtils.isEmpty(dto.getIdCardNo()) ? "" + dto.getMedicalCardId() : dto.getIdCardNo().trim());
        patArchive.setName(dto.getPatientName());
        patArchive.setSourcefrom(2);
        patArchive.setSourcefrom(2L);
        patArchive.setPattype("2");
        patArchive.setSex("男".equals(dto.getGender()) ? 1L : 2L);
        patArchive.setNation(dto.getNation());
@@ -838,7 +943,17 @@
        dto.setCostNatureName(getStringValue(dataItem, "costNatureName"));
        dto.setCostNatureCode(getStringValue(dataItem, "costNatureCode"));
        dto.setFurtherConsultationStatus(getIntegerValue(dataItem, "furtherConsultationStatus"));
        Object mainDiagObj = dataItem.get("mainDischargeDiagnosis");
        if (mainDiagObj instanceof Map) {
            Map<String, Object> mainDiagMap = (Map<String, Object>) mainDiagObj;
            ServiceSLTDDiagnosisResDTO mainDiag = new ServiceSLTDDiagnosisResDTO();
            mainDiag.setDiagnosisDictCode(getStringValue(mainDiagMap, "diagnosisDictCode"));
            mainDiag.setDiagnosisDictName(getStringValue(mainDiagMap, "diagnosisDictName"));
            mainDiag.setDiagnosisCategory(getStringValue(mainDiagMap, "diagnosisCategory"));
            mainDiag.setRecordType(getIntegerValue(mainDiagMap, "recordType"));
            mainDiag.setIsMainDiagnosis(getIntegerValue(mainDiagMap, "isMainDiagnosis"));
            dto.setMainDischargeDiagnosis(mainDiag);
        }
        Object contactsObj = dataItem.get("residentContactInfos");
        if (contactsObj instanceof List) {
            dto.setResidentContactInfos(parseContacts((List<?>) contactsObj));