陈昶聿
10 天以前 2977d912b75123339657e78f9ed0a1c712d4b7b6
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java
@@ -1,6 +1,9 @@
package com.smartor.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.ruoyi.common.core.domain.entity.SysDept;
@@ -11,13 +14,16 @@
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.system.service.ISysConfigService;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.IPatMedOuthospService;
import com.smartor.service.IPatSpecificArchiveGenerateService;
import com.smartor.service.IServiceExternalService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -43,6 +49,11 @@
@Slf4j
@Service
public class ServiceExternalServiceImpl implements IServiceExternalService {
    /**
     * 龙泉人民医院机构ID
     */
    private static final String LONGQUAN_PEOPLE_HOSPITAL_ORG_ID = "47240004533118111A1001";
    @Autowired
    private SysDept2Mapper sysDeptMapper;
    @Autowired
@@ -69,6 +80,10 @@
    private Icd10Mapper icd10Mapper;
    @Autowired
    private IPatMedOuthospService patMedOuthospService;
    @Autowired
    private ISysConfigService configService;
    @Autowired
    private IPatSpecificArchiveGenerateService patSpecificArchiveGenerateService;
    @Autowired
    private PatMedOuthospMapper patMedOuthospMapper;
    @Autowired
@@ -646,6 +661,21 @@
            }).collect(Collectors.toList());
            patMedInhosp1.setLeaveicd10code(hospPatientDiagnoseInfos2.get(0).getIcd10());
            patMedInhosp1.setLeavediagname(hospPatientDiagnoseInfos2.get(0).getZhenDuanMC());
            //只有诊断名称没有诊断码的数据
            if(StringUtils.isNotEmpty(patMedInhosp1.getLeavediagname())
                    && !StringUtils.isNotEmpty(patMedInhosp1.getLeaveicd10code())){
                Icd10 icd10 = new Icd10();
                icd10.setIcdname(patMedInhosp1.getLeavediagname());
                icd10.setDelFlag("0");
                icd10.setOrgid(ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null);
                //丽水无院区,默认值是 1
                icd10.setCampusid("1");
                //通过icdCode查询一下,是否存在
                List<Icd10> icd10s = icd10Mapper.exactQueryIcd10List(icd10);
                if(CollectionUtils.isEmpty(icd10s)){
                    patMedInhosp1.setLeaveicd10code(icd10s.get(0).getIcdcode());
                }
            }
            //patMedInhosp1.setDiagname(StringUtils.isNotEmpty(patMedInhosp1.getLeavediagname()) ? patMedInhosp1.getLeavediagname() + "," + hospPatientDiagnoseInfos2.get(0).getZhenDuanMC() : hospPatientDiagnoseInfos2.get(0).getZhenDuanMC());
            patMedInhosp1.setDiagname(StringUtils.isNotEmpty(patMedInhosp1.getLeavediagname()) ? patMedInhosp1.getLeavediagname() : hospPatientDiagnoseInfos2.get(0).getZhenDuanMC());
        }
@@ -811,14 +841,35 @@
            }).collect(Collectors.toList());
            patMedInhosp1.setLeaveicd10code(hospPatientDiagnoseInfos2.get(0).getIcd10());
            patMedInhosp1.setLeavediagname(hospPatientDiagnoseInfos2.get(0).getZhenDuanMC());
            //只有诊断名称没有诊断码的数据
            if(StringUtils.isNotEmpty(patMedInhosp1.getLeavediagname())
                    && !StringUtils.isNotEmpty(patMedInhosp1.getLeaveicd10code())){
                Icd10 icd10 = new Icd10();
                icd10.setIcdname(patMedInhosp1.getLeavediagname());
                icd10.setDelFlag("0");
                icd10.setOrgid(ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null);
                //丽水无院区,默认值是 1
                icd10.setCampusid("1");
                //通过icdCode查询一下,是否存在
                List<Icd10> icd10s = icd10Mapper.exactQueryIcd10List(icd10);
                if(CollectionUtils.isEmpty(icd10s)){
                    patMedInhosp1.setLeaveicd10code(icd10s.get(0).getIcdcode());
                }
            }
            //patMedInhosp1.setDiagname(StringUtils.isNotEmpty(patMedInhosp1.getLeavediagname()) ? patMedInhosp1.getLeavediagname() + "," + hospPatientDiagnoseInfos2.get(0).getZhenDuanMC() : hospPatientDiagnoseInfos2.get(0).getZhenDuanMC());
            patMedInhosp1.setDiagname(StringUtils.isNotEmpty(patMedInhosp1.getLeavediagname()) ? patMedInhosp1.getLeavediagname() : hospPatientDiagnoseInfos2.get(0).getZhenDuanMC());
        }
        patMedInhosp1.setInhospstate("1");
        String orgid = ObjectUtils.isNotEmpty(BingRenXX) && ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null;
//        if(StringUtils.isNotEmpty(orgid) && orgid.equals("47246103233112211A1001")){
//            //缙云二院 住院记录不更新状态
//        }else {
//            patMedInhosp1.setInhospstate("1");
//        }
        if (CollectionUtils.isNotEmpty(patMedInhospList)) {
            patMedInhosp1.setUpdateTime(new Date());
            patMedInhosp1.setOrgid(ObjectUtils.isNotEmpty(BingRenXX) && ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null);
            patMedInhosp1.setOrgid(orgid);
            if (CollectionUtils.isNotEmpty(noLongTask) && noLongTask.contains(patMedInhosp1.getOrgid())) {
                //不需要长期任务随访
                patMedInhosp1.setFuflag("0");
@@ -831,7 +882,7 @@
                patMedInhosp1.setHospitalcode(ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null);
                patMedInhosp1.setLeavehospitaldistrictname(ObjectUtils.isNotEmpty(BingRenXX.get("DangQianBQMC")) ? BingRenXX.get("DangQianBQMC").toString() : null);
                patMedInhosp1.setLeavehospitaldistrictcode(ObjectUtils.isNotEmpty(BingRenXX.get("DangQianBQID")) ? BingRenXX.get("DangQianBQID").toString() : null);
                patMedInhosp1.setOrgid(ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null);
                patMedInhosp1.setOrgid(orgid);
                //丽水无院区,默认值是 1
                patMedInhosp1.setCampusid("1");
                patMedInhosp1.setPatno(ObjectUtils.isNotEmpty(BingRenXX.get("BingRenID")) ? BingRenXX.get("BingRenID").toString() : null);
@@ -1024,6 +1075,21 @@
            }).collect(Collectors.toList());
            patMedInhosp1.setLeaveicd10code(hospPatientDiagnoseInfos2.get(0).getIcd10());
            patMedInhosp1.setLeavediagname(hospPatientDiagnoseInfos2.get(0).getZhenDuanMC());
            //只有诊断名称没有诊断码的数据
            if(StringUtils.isNotEmpty(patMedInhosp1.getLeavediagname())
                    && !StringUtils.isNotEmpty(patMedInhosp1.getLeaveicd10code())){
                Icd10 icd10 = new Icd10();
                icd10.setIcdname(patMedInhosp1.getLeavediagname());
                icd10.setDelFlag("0");
                icd10.setOrgid(ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null);
                //丽水无院区,默认值是 1
                icd10.setCampusid("1");
                //通过icdCode查询一下,是否存在
                List<Icd10> icd10s = icd10Mapper.exactQueryIcd10List(icd10);
                if(CollectionUtils.isEmpty(icd10s)){
                    patMedInhosp1.setLeaveicd10code(icd10s.get(0).getIcdcode());
                }
            }
            //patMedInhosp1.setDiagname(StringUtils.isNotEmpty(patMedInhosp1.getLeavediagname()) ? patMedInhosp1.getLeavediagname() + "," + hospPatientDiagnoseInfos2.get(0).getZhenDuanMC() : hospPatientDiagnoseInfos2.get(0).getZhenDuanMC());
            patMedInhosp1.setDiagname(StringUtils.isNotEmpty(patMedInhosp1.getLeavediagname()) ? patMedInhosp1.getLeavediagname() : hospPatientDiagnoseInfos2.get(0).getZhenDuanMC());
        }
@@ -1164,7 +1230,7 @@
        List<PatMedOuthosp> patMedOuthosps = patMedOuthospMapper.callSpQueryOuthosp(patMedOuthospreq);
        for (PatMedOuthosp patMedOuthosp1 : patMedOuthosps) {
            PatArchive pa = patArchiveMapper.selectPatArchiveByPatid(patMedOuthosp1.getPatid());
            if (patArchive.getBirthdate() != null) {
            if (ObjectUtils.isNotEmpty(patArchive) && patArchive.getBirthdate() != null) {
                Map<String, String> map = calculateAge(pa.getBirthdate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), LocalDate.now());
                pa.setAge(ObjectUtils.isNotEmpty(map.get("age")) ? Long.valueOf(map.get("age")) : null);
                pa.setAgeUnit(map.get("ageUnit"));
@@ -1242,11 +1308,25 @@
            i = patMedOuthospService.insertPatMedOuthosp(patMedOuthosp);
        }
        Date adminDate = externalJZInfo.getJiuZhenRQ();
        Date adminDate = patMedOuthosp.getAdmitdate();
        //完成接诊 已经完成任务再次随访
        if(ObjectUtils.isNotEmpty(visitTimeNum) && ObjectUtils.isNotEmpty(adminDate)){
            patMedOuthospService.followUpAgainByPatMedOuthosp(patMedOuthosp, adminDate, visitTimeNum);
        if(ObjectUtils.isNotEmpty(visitTimeNum)
                && ObjectUtils.isNotEmpty(adminDate)
                && StringUtils.isNotEmpty(patMedOuthosp.getFuflag())
                && patMedOuthosp.getFuflag().equals("1")){
            if(visitTimeUnit.equals("天")){
                visitTimeNum = visitTimeNum;
            }else if(visitTimeUnit.equals("周")){
                visitTimeNum = visitTimeNum * 7;
            }else if(visitTimeUnit.equals("月")){
                visitTimeNum = visitTimeNum * 30;
            }else if(visitTimeUnit.equals("年")){
                visitTimeNum = visitTimeNum * 365;
            }
            patMedOuthospService.dealPatMedOuthosp(patMedOuthosp, visitTimeNum);
        }
        genePatSpecificArchive(patMedOuthosp, patArchive);
        if (i > 0) {
            return true;
@@ -1337,7 +1417,6 @@
        ExternalInHospPatientInfo externalInHospPatientInfo = BeanUtil.mapToBean(BingRenXX, ExternalInHospPatientInfo.class, true);
        PatArchive patArchive = addPatArchive(externalInHospPatientInfo, null, null);
        //手术信息新增
        Map<String, Object> ssxx = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("ShouShuSQ") : null;
        //手术更新
@@ -1353,12 +1432,6 @@
            externalOperationInfo = BeanUtil.mapToBean(sscx, ExternalOperationInfo.class, true);
        PatMedOperation patMedOperation = new PatMedOperation();
        patMedOperation.setPatid(patArchive.getId());
        patMedOperation.setPatcode(externalInHospPatientInfo.getBingRenID());
        patMedOperation.setPaname(externalInHospPatientInfo.getXingMing());
        patMedOperation.setLeaveldeptcode(externalInHospPatientInfo.getDangQianKSID());
        patMedOperation.setLeaveldeptname(externalInHospPatientInfo.getDangQianKSMC());
        patMedOperation.setLeavehospitaldistrictcode(externalInHospPatientInfo.getDangQianBQID());
        patMedOperation.setLeavehospitaldistrictname(externalInHospPatientInfo.getDangQianBQMC());
        patMedOperation.setOpreqcode(externalOperationInfo.getShenQingDID());
        //查询一下,该患者是否已经有这些数据
        List<PatMedOperation> patMedOperations = patMedOperationMapper.selectPatMedOperationList(patMedOperation);
@@ -1413,6 +1486,13 @@
            patMedOperation.setInhospno(externalInHospPatientInfo.getBingAnHao());
            patMedOperation.setHospitalname(externalInHospPatientInfo.getZuZhiJGMC());
            patMedOperation.setHospitalcode(externalInHospPatientInfo.getZuZhiJGID());
            patMedOperation.setPatcode(externalInHospPatientInfo.getBingRenID());
            patMedOperation.setPaname(externalInHospPatientInfo.getXingMing());
            patMedOperation.setLeaveldeptcode(externalInHospPatientInfo.getDangQianKSID());
            patMedOperation.setLeaveldeptname(externalInHospPatientInfo.getDangQianKSMC());
            patMedOperation.setLeavehospitaldistrictcode(externalInHospPatientInfo.getDangQianBQID());
            patMedOperation.setLeavehospitaldistrictname(externalInHospPatientInfo.getDangQianBQMC());
        }
        patMedOperation.setHospitaldistrictcode(null);
        patMedOperation.setHospitaldistrictname(null);
@@ -1457,6 +1537,10 @@
                return info;
            }).collect(Collectors.toList()) : null;
            if(ObjectUtils.isNotEmpty(patMedOperation.getId())){
                patMedOperationItemMapper.deleteHardPatMedOperationItemByOpId(patMedOperation.getId().toString());
            }
            //addMianTableFalg是否需要将主手术的信息放到PatMedOperation表中(只有第一个主手术信息需要放,后面的都不需要放了,也就是说,第一个放完后,就要把这个flag改成false)
            Boolean addMianTableFalg = true;
            for (ExternalOperationDetail externalOperationDetail : externalOperationDetails) {
@@ -1490,7 +1574,83 @@
                    addMianTableFalg = false;
                }
                patMedOperationItem.setCreateTime(new Date());
                patMedOperationItem.setUpdateTime(new Date());
                patMedOperationItemMapper.insertPatMedOperationItem(patMedOperationItem);
            }
        }
        return true;
    }
    @Override
    public Boolean cancelOperationInfo(Map dataMap) {
        log.info("ServiceExternalServiceImpl---cancelOperationInfo的撤销的值为:{}", dataMap);
        Map yeWuXX = (Map) dataMap.get("YeWuXX");
        Map<String, Object> BingRenXX = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("BingRenXX") : null;
        ExternalInHospPatientInfo externalInHospPatientInfo = BeanUtil.mapToBean(BingRenXX, ExternalInHospPatientInfo.class, true);
        PatArchive patArchive = addPatArchive(externalInHospPatientInfo, null, null);
        //手术撤销
        Map<String, Object> sscx = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("ShouShuCX") : null;
        ExternalOperationInfo externalOperationInfo = null;
        if (ObjectUtils.isNotEmpty(sscx))
            externalOperationInfo = BeanUtil.mapToBean(sscx, ExternalOperationInfo.class, true);
        PatMedOperation patMedOperation = new PatMedOperation();
        patMedOperation.setPatid(patArchive.getId());
        patMedOperation.setOrgid(patArchive.getOrgid());
        patMedOperation.setOpreqcode(externalOperationInfo.getShenQingDID());
        //查询一下,该患者是否已经有这些数据
        List<PatMedOperation> patMedOperations = patMedOperationMapper.selectPatMedOperationList(patMedOperation);
        if (CollectionUtils.isNotEmpty(patMedOperations)) {
            for(PatMedOperation operation : patMedOperations){
                Long id = operation.getId();
                //如果手术撤销,直接删除该条手术信息
                if (ObjectUtils.isNotEmpty(sscx)) {
                    operation.setId(id);
                    operation.setCheckFlag("1");
                    operation.setDelFlag("1");
                    //同时去查询,是否在subtask中生成任务,如果生成出得立马删除
                    //            手术随访
                    PatMedOperationItem pmoi = new PatMedOperationItem();
                    //获取需要出院手术随访,未处理的数据
                    pmoi.setOpid(operation.getId().toString());
                    List<PatMedOperationItem> patMedOperationItems
                            = patMedOperationItemMapper.selectOperationItemList(pmoi);
                    List<Long> operationItemIds = patMedOperationItems.stream()
                            .map(PatMedOperationItem::getId)
                            .filter(Objects::nonNull)
                            .distinct()
                            .collect(Collectors.toList());
                    //不需要服务了,需要通过patid和sendstate=1,2,3,5,7去查询一下,service_subtask里是否有正在执行的任务,
                    //有的话,立即停了
                    List<Long> sendstates = Arrays.asList(1L, 2L, 3L, 5L, 7L);
                    List<ServiceSubtask> serviceSubtaskList = new ArrayList<>();
                    ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
                    serviceSubtaskVO.setOrgid(patArchive.getOrgid());
                    serviceSubtaskVO.setPatid(patArchive.getId());
                    serviceSubtaskVO.setSendstates(sendstates);
                    serviceSubtaskVO.setOperationItemIds(operationItemIds);
                    serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
                    //去redis中,查询是否有subid,有的话移除cache-exist
                    if (CollectionUtils.isNotEmpty(serviceSubtaskList)) {
                        for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
                            log.info("需要移除的subId为:{}", serviceSubtask.getId().toString());
                            serviceSubtask.setSendstate(4L);
                            serviceSubtask.setRemark("手术撤销");
                            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                            redisCache.removeElementFromList("cache-exist", serviceSubtask.getId().toString());
                            redisCache.removeElementFromList("cache-0", serviceSubtask.getId().toString());
                            redisCache.removeElementFromList("cache-1", serviceSubtask.getId().toString());
                            redisCache.removeElementFromList("cache-2", serviceSubtask.getId().toString());
                            redisCache.removeElementFromList("cache-3", serviceSubtask.getId().toString());
                            redisCache.removeElementFromList("cache-4", serviceSubtask.getId().toString());
                        }
                    }
                    operation.setUpdateTime(new Date());
                    patMedOperationMapper.updatePatMedOperation(operation);
                    patMedOperationItemMapper.deleteSoftPatMedOperationItemByOpId(operation.getOpid());
                }
            }
        }
        return true;
@@ -1663,9 +1823,66 @@
        } else {
            patMedInhosp.setCreateTime(new Date());
            i = patMedInhospMapper.insertPatMedInhosp(patMedInhosp);
            if (i == 1) {
                //龙泉人民医院:新增住院信息时处理患者再入院
                stopReadmissionFollowUpTasks(patMedInhosp);
            }
        }
        if (i == 1) return true;
        return false;
    }
    /**
     * 患者再入院处理:患者再次入院后,上一次出院生成的待执行长期随访任务不再执行。
     * 目前仅对龙泉人民医院生效,避免影响其他机构。
     *
     * @param patMedInhosp 本次新增的住院信息
     */
    private void stopReadmissionFollowUpTasks(PatMedInhosp patMedInhosp) {
        if (!LONGQUAN_PEOPLE_HOSPITAL_ORG_ID.equals(patMedInhosp.getOrgid())) {
            return;
        }
        if (Objects.isNull(patMedInhosp.getPatid()) || Objects.isNull(patMedInhosp.getStarttime())) {
            log.warn("龙泉人民医院患者再入院处理跳过,patid或入院时间为空,inhospno={}", patMedInhosp.getInhospno());
            return;
        }
        try {
            ServiceSubtaskEntity subtask = new ServiceSubtaskEntity();
            subtask.setPatid(patMedInhosp.getPatid());
            subtask.setOrgid(LONGQUAN_PEOPLE_HOSPITAL_ORG_ID);
            subtask.setSendstate(2L);
            List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(subtask);
            if (CollectionUtils.isEmpty(serviceSubtaskList)) {
                return;
            }
            int stopCount = 0;
            for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
                //不是长期任务,不处理
                if (Objects.isNull(serviceSubtask.getLongSendTime())) {
                    continue;
                }
                //出院时间晚于或等于本次入院时间的任务,不属于本次入院前的待随访任务
                if (Objects.isNull(serviceSubtask.getEndtime())
                        || !serviceSubtask.getEndtime().before(patMedInhosp.getStarttime())) {
                    continue;
                }
                serviceSubtask.setSendstate(4L);
                serviceSubtask.setIsVisitAgain(2);
                serviceSubtask.setResult("error");
                serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark())
                        ? serviceSubtask.getRemark() + ";患者再入院" : "患者再入院");
                serviceSubtask.setUpdateTime(new Date());
                if (Boolean.TRUE.equals(serviceSubtaskMapper.updateServiceSubtask(serviceSubtask))) {
                    stopCount++;
                }
            }
            log.info("龙泉人民医院患者再入院处理完成,patid={},本次入院时间={},停止待执行长期任务{}条",
                    patMedInhosp.getPatid(), patMedInhosp.getStarttime(), stopCount);
        } catch (Exception e) {
            //再入院任务处理失败不影响本次住院信息入库
            log.error("龙泉人民医院患者再入院处理异常,patid={},inhospno={}",
                    patMedInhosp.getPatid(), patMedInhosp.getInhospno(), e);
        }
    }
    //新增随访任务同步
@@ -1698,6 +1915,7 @@
        Map yeWuXX = (Map) dataMap.get("YeWuXX");
        Map<String, Object> BingRenXX = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("BingRenXX") : null;
        Map<String, Object> JianChaSQ = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("JianChaSQ") : null;
        Map<String, Object> JianChaBG = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("JianChaBG") : null;
        List<HashMap<String, Object>> JianChaBWList = ObjectUtils.isNotEmpty(JianChaSQ) ? (List<HashMap<String, Object>>) JianChaSQ.get("JianChaBWList") : null;
        List<HashMap<String, Object>> ZhenDuanList = ObjectUtils.isNotEmpty(JianChaSQ) ? (List<HashMap<String, Object>>) JianChaSQ.get("ZhenDuanList") : null;
        List<HashMap<String, Object>> epai = ObjectUtils.isNotEmpty(BingRenXX) ? (List<HashMap<String, Object>>) BingRenXX.get("DiZhiXXList") : null;
@@ -1792,6 +2010,9 @@
                }
            }
        }
        if (ObjectUtils.isNotEmpty(JianChaBG)) {
            patMedInspection.setAppliyid(ObjectUtils.isNotEmpty(JianChaBG.get("ShenQingDID")) ? JianChaBG.get("ShenQingDID").toString() : null);
        }
        if (CollectionUtils.isNotEmpty(JianChaBWList)) {
            List<ExternalInspectionJC> externalInspectionJC = JianChaBWList.stream().map(map -> {
                ExternalInspectionJC info = new ExternalInspectionJC();
@@ -1837,75 +2058,192 @@
    }
    //检查详情添加
    @SuppressWarnings("unchecked")
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean addInspectBGService(Map dataMap) {
        log.info("ServiceExternalServiceImpl---addInspectBGService的新增的值为:{}", dataMap);
        Map xiaoXiTou = (Map) dataMap.get("XiaoXiTou");
        Map yeWuXX = (Map) dataMap.get("YeWuXX");
        Map<String, Object> BingRenXX = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("BingRenXX") : null;
        Map<String, Object> JianChaBG = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("JianChaBG") : null;
        List<HashMap<String, Object>> JianChaBWList = ObjectUtils.isNotEmpty(JianChaBG) ? (List<HashMap<String, Object>>) JianChaBG.get("JianChaBWList") : null;
        if (ObjectUtils.isEmpty(BingRenXX)) {
            throw new BaseException("检查报告同步失败:BingRenXX不能为空");
        }
        if (ObjectUtils.isEmpty(JianChaBG)) {
            throw new BaseException("检查报告同步失败:JianChaBG不能为空");
        }
        // 机构优先取消息头,其次取患者信息,和检查申请补建逻辑保持一致
        String orgid = ObjectUtils.isNotEmpty(xiaoXiTou) ? getMapValue(xiaoXiTou, "FaSongJGID") : null;
        if (StringUtils.isBlank(orgid)) {
            orgid = getMapValue(BingRenXX, "ZuZhiJGID");
        }
        String bingAnHao = getMapValue(BingRenXX, "BingAnHao");
        String bingRenID = getMapValue(BingRenXX, "BingRenID");
        String xingMing = getMapValue(BingRenXX, "XingMing");
        String shenQingDID = getMapValue(JianChaBG, "ShenQingDID");
        if (StringUtils.isBlank(orgid) || StringUtils.isBlank(bingAnHao) || StringUtils.isBlank(bingRenID)
                || StringUtils.isBlank(xingMing) || StringUtils.isBlank(shenQingDID)) {
            throw new BaseException("检查报告同步失败:BingRenXX.ZuZhiJGID/BingAnHao/BingRenID/XingMing、JianChaBG.ShenQingDID不能为空");
        }
        PatMedInspection patMedInspection = new PatMedInspection();
        PatMedInspectionItem patMedInspectionItem = new PatMedInspectionItem();
        patMedInspection.setOrgid(BingRenXX.get("ZuZhiJGID").toString());
        patMedInspection.setOrgid(orgid);
        //丽水无院区,默认值是 1
        patMedInspection.setCampusid("1");
        patMedInspection.setInhospno(BingRenXX.get("BingAnHao").toString());
        patMedInspection.setPatidHis(BingRenXX.get("BingRenID").toString());
        patMedInspection.setPatname(BingRenXX.get("XingMing").toString());
        patMedInspection.setAppliyid(JianChaBG.get("ShenQingDID").toString());
        patMedInspection.setInhospno(bingAnHao);
        patMedInspection.setPatidHis(bingRenID);
        patMedInspection.setPatname(xingMing);
        patMedInspection.setAppliyid(shenQingDID);
        //查找患者检查检验信息,如果无,进行新加
        List<PatMedInspection> patMedInspections = patMedInspectionMapper.selectPatMedInspectionList(patMedInspection);
        if (CollectionUtils.isNotEmpty(patMedInspections)) {
            patMedInspectionItem.setInspectionid(patMedInspections.get(0).getId().intValue());
        } else {
        if (CollectionUtils.isEmpty(patMedInspections)) {
            addInspectService(dataMap);
            List<PatMedInspection> patMedInspections2 = patMedInspectionMapper.selectPatMedInspectionList(patMedInspection);
            patMedInspectionItem.setInspectionid(patMedInspections2.get(0).getId().intValue());
            patMedInspections = patMedInspectionMapper.selectPatMedInspectionList(patMedInspection);
            if (CollectionUtils.isEmpty(patMedInspections)) {
                throw new BaseException("检查报告同步失败:未找到或创建检查主记录,ShenQingDID=" + shenQingDID);
            }
        }
        patMedInspectionItem.setInspectionid(patMedInspections.get(0).getId().intValue());
        //检查检验报告数据处理
        patMedInspectionItem.setOrgid(BingRenXX.get("ZuZhiJGID").toString());
        patMedInspectionItem.setOrgid(orgid);
        //丽水无院区,默认值是 1
        patMedInspectionItem.setCampusid("1");
        List<PatMedInspectionItem> patMedInspectionItems = patMedInspectionItemMapper.selectPatMedInspectionItemList(patMedInspectionItem);
        if (ObjectUtils.isNotEmpty(JianChaBG)) {
            patMedInspectionItem.setInspectionName(JianChaBG.get("JianChaHao").toString());
            patMedInspectionItem.setReportid(JianChaBG.get("JianChaHao").toString());
            patMedInspectionItem.setStatuscode(JianChaBG.get("DangQianZTDM").toString());
            patMedInspectionItem.setStatusname(JianChaBG.get("DangQianZTMC").toString());
            patMedInspectionItem.setReportid(JianChaBG.get("BaoGaoRID").toString());
            patMedInspectionItem.setReportername(JianChaBG.get("BaoGaoRXM").toString());
            patMedInspectionItem.setDiagimpression(JianChaBG.get("ZhenDuanYX").toString());
            patMedInspectionItem.setDiagfindings(JianChaBG.get("ZhenDuanSJ").toString());
            patMedInspectionItem.setDiagsuggestion(JianChaBG.get("ZhenDuanJY").toString());
            patMedInspectionItem.setReporturl(JianChaBG.get("BaoGaoYXDZ").toString());
            patMedInspectionItem.setCriticalFlag(Integer.valueOf(JianChaBG.get("WeiJiZBZ").toString()));
            patMedInspectionItem.setCriticalContent(JianChaBG.get("WeiJiZNR").toString());
            patMedInspectionItem.setReportdeptid(JianChaBG.get("BaoGaoKSID").toString());
            patMedInspectionItem.setReportdeptname(JianChaBG.get("BaoGaoKSMC").toString());
            patMedInspectionItem.setResultcode(JianChaBG.get("JianChaJGDM").toString());
            patMedInspectionItem.setResultname(JianChaBG.get("JianChaJGMC").toString());
            if (ObjectUtils.isNotEmpty(JianChaBG.get("BaoGaoSJ"))) {
                try {
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    patMedInspection.setOpendate(simpleDateFormat.parse(JianChaBG.get("BaoGaoSJ").toString()));
                } catch (ParseException e) {
                    e.printStackTrace();
        // 兼容 PACS 实际报文:报告人、报告时间、报告地址等字段名与标准报文存在差异
        String jianChaHao = getMapValue(JianChaBG, "JianChaHao");
        String reportId = getMapValue(JianChaBG, "BaoGaoID");
        if (StringUtils.isBlank(reportId)) {
            reportId = getMapValue(JianChaBG, "BaoGaoRID");
        }
        if (StringUtils.isBlank(reportId)) {
            reportId = jianChaHao;
        }
        String inspectionName = StringUtils.isNotBlank(jianChaHao) ? jianChaHao : reportId;
        if (StringUtils.isBlank(inspectionName)) {
            inspectionName = shenQingDID;
        }
        String reporterId = getMapValue(JianChaBG, "BaoGaoRID", "ZhiXingRID", "KaiDanRID");
        String reporterName = getMapValue(JianChaBG, "BaoGaoRXM", "ZhiXingRXM", "KaiDanRXM");
        String reportUrl = getMapValue(JianChaBG, "BaoGaoYXDZ", "TuWenBGXZDZ", "PDFurl");
        String reportDateStr = getMapValue(JianChaBG, "BaoGaoSJ", "ZhiXingSJ");
        patMedInspectionItem.setInspectionName(inspectionName);
        patMedInspectionItem.setReportid(reportId);
        patMedInspectionItem.setStatuscode(getMapValue(JianChaBG, "DangQianZTDM"));
        patMedInspectionItem.setStatusname(getMapValue(JianChaBG, "DangQianZTMC"));
        patMedInspectionItem.setReporterid(reporterId);
        patMedInspectionItem.setReportername(reporterName);
        patMedInspectionItem.setDiagimpression(getMapValue(JianChaBG, "ZhenDuanYX"));
        patMedInspectionItem.setDiagfindings(getMapValue(JianChaBG, "ZhenDuanSJ"));
        patMedInspectionItem.setDiagsuggestion(getMapValue(JianChaBG, "ZhenDuanJY"));
        patMedInspectionItem.setReporturl(reportUrl);
        patMedInspectionItem.setCriticalFlag(parseInteger(getMapValue(JianChaBG, "WeiJiZBZ")));
        patMedInspectionItem.setCriticalContent(getMapValue(JianChaBG, "WeiJiZNR"));
        patMedInspectionItem.setReportdeptid(getMapValue(JianChaBG, "BaoGaoKSID"));
        patMedInspectionItem.setReportdeptname(getMapValue(JianChaBG, "BaoGaoKSMC"));
        patMedInspectionItem.setResultcode(getMapValue(JianChaBG, "JianChaJGDM"));
        patMedInspectionItem.setResultname(getMapValue(JianChaBG, "JianChaJGMC"));
        Date reportDate = parseDateTime(reportDateStr);
        if (reportDate != null) {
            patMedInspectionItem.setReportdate(reportDate);
        }
        // 同一检查下可能存在多条报告明细,优先按报告ID、检查号匹配,避免更新错行
        PatMedInspectionItem existingItem = null;
        if (CollectionUtils.isNotEmpty(patMedInspectionItems)) {
            for (PatMedInspectionItem item : patMedInspectionItems) {
                if (StringUtils.isNotBlank(reportId) && reportId.equals(item.getReportid())) {
                    existingItem = item;
                    break;
                }
            }
            if (existingItem == null) {
                for (PatMedInspectionItem item : patMedInspectionItems) {
                    if (StringUtils.isNotBlank(inspectionName) && inspectionName.equals(item.getInspectionName())) {
                        existingItem = item;
                        break;
                    }
                }
            }
            if (existingItem == null) {
                existingItem = patMedInspectionItems.get(0);
            }
        }
        if (ObjectUtils.isNotEmpty(patMedInspectionItems)) {
        if (existingItem != null) {
            // 更新必须带上主键,否则 update ... where id = null 会影响 0 行,接口返回失败
            patMedInspectionItem.setId(existingItem.getId());
            patMedInspectionItem.setUpdateTime(new Date());
            int i = patMedInspectionItemMapper.updatePatMedInspectionItem(patMedInspectionItem);
            if (i != 1) return false;
            if (i < 1) {
                throw new BaseException("检查报告明细更新失败,id=" + existingItem.getId());
            }
        } else {
            patMedInspectionItem.setDelFlag("0");
            patMedInspectionItem.setCreateTime(new Date());
            int i = patMedInspectionItemMapper.insertPatMedInspectionItem(patMedInspectionItem);
            if (i != 1) return false;
            if (i != 1) {
                throw new BaseException("检查报告明细新增失败,ShenQingDID=" + shenQingDID);
            }
        }
        return true;
    }
    /**
     * 从报文中按顺序获取第一个非空字段,兼容不同厂商的字段命名
     */
    private String getMapValue(Map<String, Object> source, String... keys) {
        if (source == null || keys == null) {
            return null;
        }
        for (String key : keys) {
            Object value = source.get(key);
            if (value != null && StringUtils.isNotBlank(String.valueOf(value))) {
                return String.valueOf(value);
            }
        }
        return null;
    }
    /**
     * 解析检查报告时间,兼容常见日期时间格式
     */
    private Date parseDateTime(String dateTime) {
        if (StringUtils.isBlank(dateTime)) {
            return null;
        }
        String[] patterns = {"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-dd"};
        for (String pattern : patterns) {
            try {
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
                simpleDateFormat.setLenient(false);
                return simpleDateFormat.parse(dateTime);
            } catch (ParseException ignored) {
                // 尝试下一种格式
            }
        }
        log.warn("检查报告时间格式无法解析:{}", dateTime);
        return null;
    }
    /**
     * 解析检查报告数字字段,避免非数字内容导致接口报错
     */
    private Integer parseInteger(String value) {
        if (StringUtils.isBlank(value)) {
            return null;
        }
        try {
            return Integer.valueOf(value.trim());
        } catch (NumberFormatException e) {
            log.warn("检查报告数字字段无法转换:{}", value);
            return null;
        }
    }
    @Override
@@ -1983,6 +2321,13 @@
            case "SM_SQ_ShenQing":
                log.info("手术申请入参类型为:{}", type);
                addOperationInfo(dataMap);
                return true;
            case "SM_SQ_ShouShuAP":
                log.info("手术安排入参类型为:{}", type);
                return true;
            case "SM_SQ_CheXiao":
                log.info("手术撤销入参类型为:{}", type);
                cancelOperationInfo(dataMap);
                return true;
            case "TJ_YW_BaoGaoXX":
                log.info("体检报告入参类型为:{}", type);
@@ -2172,4 +2517,59 @@
        }
        return 1;
    }
    /**
     * 完成接诊时按专科档案生成配置生成妇科/儿科档案。
     *
     * <p>生成逻辑内部只对指定机构生效,未命中配置或生成失败均不影响接诊主流程。</p>
     */
    private void genePatSpecificArchive(PatMedOuthosp patMedOuthosp, PatArchive patArchive) {
        try {
            int generated = patSpecificArchiveGenerateService.generateByOuthosp(patMedOuthosp, patArchive);
            if (generated > 0) {
                log.info("完成接诊自动生成专科档案成功,outhospno={},生成数量={}",
                        patMedOuthosp.getOuthospno(), generated);
            }
        } catch (Exception e) {
            log.error("完成接诊自动生成专科档案失败,outhospno={}", patMedOuthosp.getOuthospno(), e);
        }
    }
    /**
     * 判断当前科室属于妇科还是儿科
     *
     * @param deptCode 当前科室/病区 Code,如 "D004"
     * @param orgid    医院机构ID
     * @return deptCategory:1-妇科 2-儿科;null-未配置或未命中
     */
    public String judgeDeptCategory(String deptCode, String orgid) {
        if (StringUtils.isEmpty(deptCode)) {
            return null;
        }
        // 优先取机构级配置,取不到再取全局配置
        String configValue = configService.selectConfigByKey("sys.dept.category",
                orgid);
        if (StringUtils.isEmpty(configValue)) {
            configValue = configService.selectConfigByKey("sys.dept.category");
        }
        if (StringUtils.isEmpty(configValue)) {
            return null;
        }
        JSONArray configs = JSON.parseArray(configValue);
        if (configs == null || configs.isEmpty()) {
            return null;
        }
        for (int i = 0; i < configs.size(); i++) {
            JSONObject cfg = configs.getJSONObject(i);
            JSONArray deptCodes = cfg.getJSONArray("deptCodes");
            if (deptCodes != null && deptCodes.contains(deptCode)) {
                return cfg.getString("deptCategory");
            }
        }
        return null;
    }
}