From 6659135780e718758417efde4c8c351c69e3755b Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期四, 11 十二月 2025 15:52:19 +0800
Subject: [PATCH] 代码提交

---
 smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java |  286 +++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 218 insertions(+), 68 deletions(-)

diff --git a/smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
index ced4367..1d3a0a4 100644
--- a/smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
@@ -1,12 +1,13 @@
 package com.smartor.service.impl;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 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.DtoConversionUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.http.HttpUtils;
 import com.smartor.domain.*;
@@ -14,21 +15,21 @@
 import com.smartor.service.IPatArchiveService;
 import com.smartor.service.IPatMedInhospService;
 import com.smartor.service.IServiceSLTDHealthcareRecordService;
-import com.sun.org.apache.bcel.internal.generic.NEW;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 
-import java.lang.reflect.Array;
 import java.lang.reflect.Type;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @Service
@@ -58,6 +59,9 @@
     @Autowired
     private SysUserRole2Mapper sysUserRoleMapper;
 
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+
     @Value("${sltd_pub_path}")
     private String sltdPubPath;
 
@@ -67,15 +71,15 @@
     @Override
     public List<ServiceSLTDInhospResDTO> queryHealthcareRecordList(ServiceSLTDInhospReqVO reqVO) {
         try {
-            log.info("銆恞ueryHealthcareRecordList銆戝紑濮嬭皟鐢ㄧ渷绔嬪悓寰峰仴搴疯褰曟煡璇㈡帴鍙o紝璇锋眰鍙傛暟锛歿}", reqVO);
             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("銆恞ueryHealthcareRecordList銆戞帴鍙e搷搴旂粨鏋滐細{}", result);
 
             String cry = determineCry(reqVO);
-            return parseResponseData(result, reqVO.getHealthcareRecordTypeList(), cry, reqVO.getCampusId());
+            log.info("cry鐨勫�间负锛歿}", cry);
+            List<ServiceSLTDInhospResDTO> serviceSLTDInhospResDTOS = parseResponseData(result, CollectionUtils.isNotEmpty(reqVO.getStatusList()) ? reqVO.getStatusList() : reqVO.getHealthcareRecordTypeList(), cry, reqVO.getCampusId() != null ? reqVO.getCampusId().toString() : null);
+            log.info("serviceSLTDInhospResDTOS鏄惁杩斿洖鐨勬湁鍊硷細{}", CollectionUtils.isNotEmpty(serviceSLTDInhospResDTOS) ? "鏈�" : "娌℃湁");
+            return serviceSLTDInhospResDTOS;
         } catch (Exception e) {
             log.error("銆恞ueryHealthcareRecordList銆戣皟鐢ㄧ渷绔嬪悓寰峰仴搴疯褰曟煡璇㈡帴鍙e紓甯革紝璇锋眰鍙傛暟锛歿}", reqVO, e);
             throw new RuntimeException("璋冪敤鐪佺珛鍚屽痉鍋ュ悍璁板綍鏌ヨ鎺ュ彛澶辫触", e);
@@ -120,7 +124,7 @@
 
             Map<String, String> headers = buildRequestHeaders();
             String result = HttpUtils.sendPostByHeader(sltdPubPath + "/osj/hbos-thirdparty-integration/standard/common/dept/queryDeptList", new Gson().toJson(params), headers);
-            log.info("銆恞ueryDeptWardAreaInfoList銆戞帴鍙e搷搴旂粨鏋滐細{}", result);
+            log.info("銆恞ueryDeptWardAreaInfoList銆戞帴鍙e搷搴旂粨鏋滐細{}", StringUtils.isEmpty(result) ? "绌虹殑" : "涓嶇┖");
             List<Map<String, Object>> dataList = getDataList(result);
             log.info("-----------dataList鎺ュ彛鍝嶅簲缁撴灉锛歿}", dataList.size());
             for (Map<String, Object> dataItem : dataList) {
@@ -172,6 +176,20 @@
         return true;
     }
 
+    @Override
+    public void aa(Map<String, Object> map) {
+        List<String> types = new ArrayList<>();
+        types.add("FH0109.27");
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            String jsonString = objectMapper.writeValueAsString(map);
+            parseResponseData(jsonString, types, "1", "20001001");
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+
+    }
+
 
     /**
      * 閲囬泦鍖婚櫌鐢ㄦ埛淇℃伅
@@ -184,7 +202,7 @@
         Map<String, Object> requestParams = buildRequestParams(reqVO);
         Map<String, String> headers = buildRequestHeaders();
         String result = HttpUtils.sendPostByHeader(sltdPubPath + "/osj/hbos-thirdparty-integration/standard/common/staff/queryStaffList", new Gson().toJson(requestParams), headers);
-        log.info("銆恞ueryHealthcareRecordList銆戞帴鍙e搷搴旂粨鏋滐細{}", result);
+        log.info("銆恞ueryHealthcareRecordList銆戞帴鍙e搷搴旂粨鏋滄槸鍚︽湁鍊硷細{}", StringUtils.isEmpty(result) ? "娌″��" : "鏈夊��");
         List<Map<String, Object>> dataList = getDataList(result);
         for (Map<String, Object> dataItem : dataList) {
             SysUser sysUser = new SysUser();
@@ -314,12 +332,17 @@
     }
 
     private String determineCry(ServiceSLTDInhospReqVO reqVO) {
-        if (reqVO.getHealthcareRecordTypeList().contains("FH0108.02")) {
-            if (reqVO.getStartHeadTime() != null && reqVO.getStartTailTime() != null) {
-                return "0";
-            } else if (StringUtils.isNotEmpty(reqVO.getPreOutHospitalHeadDate()) && StringUtils.isNotEmpty(reqVO.getPreOutHospitalTailDate())) {
-                return "1";
-            }
+        if (CollectionUtils.isEmpty(reqVO.getStatusList())) return null;
+
+        if (reqVO.getStatusList().contains("FH0109.26")) {
+            //鍏ラ櫌
+            return "0";
+        } else if (reqVO.getStatusList().contains("FH0109.27")) {
+            //鍑洪櫌
+            return "1";
+        } else if (reqVO.getStatusList().contains("FH0109.22") || reqVO.getStatusList().contains("FH0109.23") || reqVO.getStatusList().contains("FH0109.53")) {
+            //棰勫叆闄�
+            return "3";
         }
         return null;
     }
@@ -353,6 +376,9 @@
         if (reqVO.getHealthcareRecordTypeList() != null && !reqVO.getHealthcareRecordTypeList().isEmpty()) {
             params.put("healthcareRecordTypeList", reqVO.getHealthcareRecordTypeList());
         }
+        if (reqVO.getStatusList() != null && !reqVO.getStatusList().isEmpty()) {
+            params.put("statusList", reqVO.getStatusList());
+        }
         params.put("subjectCode", reqVO.getPatientName());
         params.put("healthcareRecordNo", reqVO.getHealthcareRecordNo());
         params.put("orgSubjectCode", reqVO.getIdCardNo());
@@ -361,7 +387,8 @@
         }
         params.put("serviceScopes", null);
         params.put("inpatientArea", null);
-        params.put("status", reqVO.getStatusList() != null && !reqVO.getStatusList().isEmpty() ? reqVO.getStatusList().get(0) : null);
+//        params.put("status", reqVO.getStatusList() != null && !reqVO.getStatusList().isEmpty() ? reqVO.getStatusList().get(0) : null);
+        params.put("status", null);
         return params;
     }
 
@@ -372,9 +399,8 @@
         return headers;
     }
 
-    private List<ServiceSLTDInhospResDTO> parseResponseData(String result, List<String> types, String cry, Long orgid) {
+    private List<ServiceSLTDInhospResDTO> parseResponseData(String result, List<String> types, String cry, String campusId) {
         try {
-
             List<Map<String, Object>> dataList = getDataList(result);
             List<ServiceSLTDInhospResDTO> resultList = new ArrayList<>();
             for (Map<String, Object> dataItem : dataList) {
@@ -382,7 +408,7 @@
             }
             log.info("銆恜arseResponseData銆戞垚鍔熻В鏋恵}鏉″仴搴疯褰曟暟鎹�", resultList.size());
 
-            processResultList(resultList, types, cry, orgid);
+            processResultList(resultList, types, cry, campusId);
             return resultList;
         } catch (Exception e) {
             log.error("銆恜arseResponseData銆戣В鏋愬搷搴旀暟鎹紓甯革紝鍝嶅簲鍐呭锛歿}", result, e);
@@ -412,48 +438,83 @@
         Type listType = new TypeToken<List<Map<String, Object>>>() {
         }.getType();
         List<Map<String, Object>> dataList = gson.fromJson(dataJson, listType);
+
+        // 浣跨敤 Set 鍘婚噸锛岀‘淇濇病鏈夐噸澶嶇殑鏁版嵁
+        Set<Map<String, Object>> uniqueDataSet = new HashSet<>(dataList);
+        dataList = new ArrayList<>(uniqueDataSet);
         return dataList;
     }
 
-    private void processResultList(List<ServiceSLTDInhospResDTO> resultList, List<String> types, String cry, Long orgid) {
+    private void processResultList(List<ServiceSLTDInhospResDTO> resultList, List<String> types, String cry, String campusId) {
         for (String type : types)
             switch (type) {
                 case "FH0108.01":
                     log.info("銆恜arseResponseData銆戣В鏋愰棬璇婃暟鎹�");
-                    outHospitalDate(resultList, orgid);
+                    outHospitalDate(resultList);
                     break;
-                case "FH0108.02":
+                case "FH0109.26":
                     log.info("銆恜arseResponseData銆戣В鏋愪綇闄㈡暟鎹�");
-                    inHospitalDate(resultList, cry, orgid);
+                    inHospitalDate(resultList, cry);
                     break;
-                case "FH0108.03":
-                    log.info("銆恜arseResponseData銆戣В鏋愭�ヨ瘖鏁版嵁");
-                    outHospitalDate(resultList, orgid);
+                case "FH0109.22":
+                    log.info("銆恜arseResponseData銆戣В鏋愰浣忛櫌鏁版嵁");
+                    inHospitalDate(resultList, cry);
                     break;
+                case "FH0109.23":
+                    log.info("銆恜arseResponseData銆戣В鏋愰浣忛櫌锛堝緟瀹夊簥锛夋暟鎹�");
+                    inHospitalDate(resultList, cry);
+                    break;
+                case "FH0109.27":
+                    log.info("銆恜arseResponseData銆戣В鏋愬嚭闄㈡暟鎹�");
+                    inHospitalDate(resultList, cry);
+                    break;
+                case "FH0109.53":
+                    log.info("銆恜arseResponseData銆戣В鏋愰浣忛櫌锛堝叾浠栵級鏁版嵁");
+                    inHospitalDate(resultList, cry);
+                    break;
+//                case "FH0108.03":
+//                    log.info("銆恜arseResponseData銆戣В鏋愭�ヨ瘖鏁版嵁");
+//                    outHospitalDate(resultList);
+//                    break;
                 default:
                     log.warn("銆恜arseResponseData銆戞湭鐭ョ殑鏁版嵁绫诲瀷锛歿}", type);
                     break;
             }
     }
 
-    private Boolean outHospitalDate(List<ServiceSLTDInhospResDTO> resultList, Long orgid) {
+    private Boolean outHospitalDate(List<ServiceSLTDInhospResDTO> resultList) {
+        List<PatMedOuthosp> batchList = new ArrayList<>();
+        
         for (ServiceSLTDInhospResDTO dto : resultList) {
-            if (Objects.isNull(dto)) continue;
-            PatArchive patArchive = processPatientArchive(dto, orgid);
-            PatMedOuthosp patMedOuthosp = buildPatMedOuthosp(dto, patArchive, orgid);
-//            //鏌ヨ褰撳墠鏂板鐨勯棬鎬ヨ瘖鏁版嵁锛屾槸鍚﹀湪杩囨浮琛ㄤ腑鏄惁瀛樺湪锛屽鏋滃瓨鍦紝灏变笉寰�闂ㄦ�ヨ瘖琛ㄩ噷鏂板浜�(杩欎釜鍏堜笉鍐欎簡锛屾娊绌轰簡鍐嶅啓)
-//            PatMedOuthospProvisional pmop = DtoConversionUtils.sourceToTarget(patMedOuthosp, PatMedOuthospProvisional.class);
-
-            //鍏堟煡璇竴涓嬶紝鏄笉鏄凡缁忓瓨鍦ㄨ娴佹按鍙蜂簡锛屽鏋滃瓨鍦紝灏变笉鏂板浜�
-            PatMedOuthosp pmo2 = new PatMedOuthosp();
-            pmo2.setSerialnum(patMedOuthosp.getSerialnum());
-            List<PatMedOuthosp> patMedOuthosps = patMedOuthospMapper.selectPatMedOuthospList(pmo2);
-            if (CollectionUtils.isEmpty(patMedOuthosps)) patMedOuthospMapper.insertPatMedOuthosp(patMedOuthosp);
+            if (Objects.isNull(dto)) {
+                continue;
+            }
+            PatArchive patArchive = processPatientArchive(dto);
+            PatMedOuthosp patMedOuthosp = buildPatMedOuthosp(dto, patArchive);
+            batchList.add(patMedOuthosp);
+        }
+        
+        // 鎵归噺鎻掑叆锛岃嚜鍔ㄥ拷鐣ラ噸澶�
+        if (CollectionUtils.isNotEmpty(batchList)) {
+            try {
+                int insertCount = patMedOuthospMapper.batchInsertIgnore(batchList);
+                log.info("鎵归噺鎻掑叆闂ㄦ�ヨ瘖璁板綍锛屾�绘暟锛歿}, 瀹為檯鎻掑叆锛歿}", batchList.size(), insertCount);
+            } catch (Exception e) {
+                log.error("鎵归噺鎻掑叆闂ㄦ�ヨ瘖璁板綍澶辫触", e);
+                // 闄嶇骇涓洪�愭潯鎻掑叆
+                for (PatMedOuthosp patMedOuthosp : batchList) {
+                    try {
+                        patMedOuthospMapper.insertPatMedOuthosp(patMedOuthosp);
+                    } catch (Exception ex) {
+                        log.warn("鍗曟潯鎻掑叆澶辫触锛歴erialnum={}", patMedOuthosp.getSerialnum());
+                    }
+                }
+            }
         }
         return true;
     }
 
-    private PatMedOuthosp buildPatMedOuthosp(ServiceSLTDInhospResDTO dto, PatArchive patArchive, Long orgid) {
+    private PatMedOuthosp buildPatMedOuthosp(ServiceSLTDInhospResDTO dto, PatArchive patArchive) {
         PatMedOuthosp patMedOuthosp = new PatMedOuthosp();
         patMedOuthosp.setOuthospno(dto.getHealthcareRecordNo());
         patMedOuthosp.setSerialnum(dto.getHealthcareRecordNo());
@@ -488,46 +549,134 @@
         }
     }
 
-    private Boolean inHospitalDate(List<ServiceSLTDInhospResDTO> resultList, String cry, Long orgid) {
+    private Boolean inHospitalDate(List<ServiceSLTDInhospResDTO> resultList, String cry) {
         for (ServiceSLTDInhospResDTO dto : resultList) {
             if (Objects.isNull(dto)) continue;
-            PatArchive patArchive = processPatientArchive(dto, orgid);
-            processPatientInhospInfo(dto, patArchive, cry, orgid);
+            PatArchive patArchive = processPatientArchive(dto);
+            processPatientInhospInfo(dto, patArchive, cry);
         }
         return true;
     }
 
-    private void processPatientInhospInfo(ServiceSLTDInhospResDTO dto, PatArchive patArchive, String cry, Long orgid) {
-        PatMedInhosp patMedInhosp = buildPatientInhospInfo(dto, patArchive, cry, orgid);
+    private void processPatientInhospInfo(ServiceSLTDInhospResDTO dto, PatArchive patArchive, String cry) {
+        PatMedInhosp patMedInhosp = buildPatientInhospInfo(dto, patArchive, cry);
         PatMedInhosp queryInhosp = new PatMedInhosp();
-        queryInhosp.setPatno(patArchive.getPatientno());
-        queryInhosp.setSerialnum(patMedInhosp.getSerialnum());
-        queryInhosp.setOrgid(dto.getOrgId());
-        queryInhosp.setCampusid(dto.getCampusId());
+        queryInhosp.setPatno(StringUtils.trim(patArchive.getPatientno()));
+        queryInhosp.setSerialnum(StringUtils.trim(patMedInhosp.getSerialnum()));
+        queryInhosp.setOrgid(StringUtils.trim(dto.getOrgId()));
         queryInhosp.setInhospstate(cry);
-        log.info("----------------杩欓噷鐨勫叆鍙備负锛歿}", queryInhosp);
+        log.info("----------------杩欓噷鐨勫叆鍙備负锛歿},{}", queryInhosp.getPatno(), queryInhosp.getSerialnum());
         List<PatMedInhosp> existingInhosps = patMedInhospService.selectPatMedInhosp(queryInhosp);
 
-        if (cry.equals("0") && CollectionUtils.isNotEmpty(existingInhosps)) {
-            //鏂板杩囩殑鍏ラ櫌鏁版嵁锛屼笉鍐嶅鐞�
-            return;
-        } else if (cry.equals("1") && CollectionUtils.isNotEmpty(existingInhosps)) {
-            //鏂板杩囩殑鍑洪櫌鏁版嵁锛屼篃涓嶅啀澶勭悊
-            return;
-        }
+        if (cry.equals("0")) {
+            //鍏ラ櫌鏁版嵁澶勭悊
+            if (CollectionUtils.isEmpty(existingInhosps)) {
+                //濡傛灉涓虹┖锛岃鍏堝垽鏂紝棰勫叆闄㈡槸鍚︽湁鍊硷紝鏈夊�肩殑璇濆垯鏇存柊
+                queryInhosp.setInhospstate("3");
+                List<PatMedInhosp> patMedInhospList = patMedInhospService.selectPatMedInhosp(queryInhosp);
+                if (CollectionUtils.isNotEmpty(patMedInhospList)) {
+                    //濡傛灉棰勫叆闄笉涓虹┖锛屽垯杩涜淇敼
+                    patMedInhospService.updatePatMedInhosp(patMedInhosp);
+                } else {
+                    //濡傛灉鍑洪櫌涓嶄负绌猴紝鍒欎笉杩涜澶勭悊
+                    queryInhosp.setInhospstate("1");
+                    patMedInhospList = patMedInhospService.selectPatMedInhosp(queryInhosp);
+                    if (CollectionUtils.isNotEmpty(patMedInhospList)) {
+                        return;
+                    }
+                }
 
-        log.info("----------------杩欓噷鐨勮繑鍙備负锛歿}", existingInhosps);
-        if (CollectionUtils.isNotEmpty(existingInhosps)) {
-            patMedInhosp.setInhospid(existingInhosps.get(0).getInhospid());
-            patMedInhospService.updatePatMedInhosp(patMedInhosp);
-            log.debug("銆恜rocessPatientInhospInfo銆戞洿鏂颁綇闄俊鎭紝鎮h�呯紪鍙凤細{}锛屾祦姘村彿锛歿}", patArchive.getPatientno(), patMedInhosp.getSerialnum());
-        } else {
-            patMedInhospService.insertPatMedInhosp(patMedInhosp);
-            log.debug("銆恜rocessPatientInhospInfo銆戞柊澧炰綇闄俊鎭紝鎮h�呯紪鍙凤細{}锛屾祦姘村彿锛歿}", patArchive.getPatientno(), patMedInhosp.getSerialnum());
+                //濡傛灉閮戒负绌猴紝鍒欒繘琛屾柊澧�
+                if (CollectionUtils.isEmpty(patMedInhospList)) {
+                    try {
+                        patMedInhospService.insertPatMedInhosp(patMedInhosp);
+                    } catch (org.springframework.dao.DuplicateKeyException e) {
+                        log.warn("鍏ラ櫌璁板綍宸插瓨鍦紝璺宠繃锛歴erialnum={}, orgid={}, state={}", patMedInhosp.getSerialnum(), patMedInhosp.getOrgid(), patMedInhosp.getInhospstate());
+                    }
+                }
+            }
+
+        } else if (cry.equals("1")) {
+//           鍑洪櫌鏁版嵁澶勭悊
+            if (CollectionUtils.isEmpty(existingInhosps)) {
+                //濡傛灉涓虹┖锛岃鍏堝垽鏂紝棰勫叆闄㈡槸鍚︽湁鍊硷紝鏈夊�肩殑璇濆垯鏇存柊
+                queryInhosp.setInhospstate("3");
+                log.info("-----patMedInhospList杩涙潵浜嗕笉锛熷叆鍙備负锛歿}", queryInhosp);
+                List<PatMedInhosp> patMedInhospList = patMedInhospService.selectPatMedInhosp(queryInhosp);
+                log.info("----patMedInhospList杩涙潵浜嗕笉锛熻繑鍙備负锛歿}", CollectionUtils.isEmpty(patMedInhospList) ? null : patMedInhospList.get(0).getSerialnum());
+                if (CollectionUtils.isNotEmpty(patMedInhospList)) {
+                    //濡傛灉棰勫叆闄笉涓虹┖锛屽垯杩涜淇敼
+                    patMedInhospService.updatePatMedInhosp(patMedInhosp);
+                } else {
+                    //濡傛灉鍏ラ櫌涓嶄负绌猴紝鍒欒繘琛屼慨鏀�
+                    queryInhosp.setInhospstate("0");
+                    patMedInhospList = patMedInhospService.selectPatMedInhosp(queryInhosp);
+                    if (CollectionUtils.isNotEmpty(patMedInhospList)) {
+                        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);
+                    } else {
+                        try {
+                            patMedInhospService.insertPatMedInhosp(patMedInhosp);
+                        } catch (org.springframework.dao.DuplicateKeyException e) {
+                            log.warn("鍑洪櫌璁板綍宸插瓨鍦紝璺宠繃锛歴erialnum={}, orgid={}, state={}", patMedInhosp.getSerialnum(), patMedInhosp.getOrgid(), patMedInhosp.getInhospstate());
+                        }
+                    }
+                }
+            }
+        } else if ("3".equals(cry)) {
+            //棰勫叆闄㈡暟鎹鐞嗭細浠讳竴鐘舵�佸瓨鍦ㄥ垯涓嶆柊澧烇紱閮戒笉瀛樺湪鎵嶆柊澧�
+            String serialnum = patMedInhosp.getSerialnum() == null ? "" : patMedInhosp.getSerialnum().trim();
+            String orgid = patMedInhosp.getOrgid() == null ? "" : patMedInhosp.getOrgid().trim();
+            String state = patMedInhosp.getInhospstate() == null ? "" : patMedInhosp.getInhospstate();
+            String lockKey = "inhosp:lock:" + serialnum + ":" + orgid + ":" + state;
+
+            Boolean locked = false;
+            try {
+                locked = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS);
+            } catch (Exception e) {
+                log.warn("Redis閿佽幏鍙栧け璐ワ紝闄嶇骇涓虹洿鎺ユ彃鍏ワ細{}", e.getMessage());
+                locked = null; // 鏍囪Redis涓嶅彲鐢�
+            }
+
+            if (locked == null || Boolean.TRUE.equals(locked)) {
+                try {
+                    queryInhosp.setInhospstate(null);
+                    List<PatMedInhosp> patMedInhospList3 = patMedInhospService.selectPatMedInhosp(queryInhosp);
+                    if (CollectionUtils.isEmpty(patMedInhospList3)) {
+                        try {
+                            patMedInhospService.insertPatMedInhosp(patMedInhosp);
+                            log.debug("鎴愬姛鎻掑叆棰勫叆闄㈣褰曪細serialnum={}", patMedInhosp.getSerialnum());
+                        } catch (Exception e) {
+                            log.warn("棰勫叆闄㈣褰曟彃鍏ュけ璐ワ紙鍙兘宸插瓨鍦級锛歴erialnum={}, orgid={}, state={}, 閿欒锛歿}", patMedInhosp.getSerialnum(), patMedInhosp.getOrgid(), patMedInhosp.getInhospstate(), e.getMessage());
+                        }
+                    }
+                } finally {
+                    if (Boolean.TRUE.equals(locked)) {
+                        try {
+                            redisTemplate.delete(lockKey);
+                        } catch (Exception e) {
+                            log.warn("Redis閿侀噴鏀惧け璐ワ細{}", e.getMessage());
+                        }
+                    }
+                }
+            } else {
+                log.debug("棰勫叆闄㈣褰曟鍦ㄨ鍏朵粬绾跨▼澶勭悊锛岃烦杩囷細serialnum={}", patMedInhosp.getSerialnum());
+            }
         }
     }
 
-    private PatMedInhosp buildPatientInhospInfo(ServiceSLTDInhospResDTO dto, PatArchive patArchive, String cry, Long orgid) {
+    private PatMedInhosp buildPatientInhospInfo(ServiceSLTDInhospResDTO dto, PatArchive patArchive, String cry) {
         log.info("----------------buildPatientInhospInfo杩欓噷杩涙潵浜嗗悧锛焮}", cry);
         PatMedInhosp patMedInhosp = new PatMedInhosp();
         patMedInhosp.setPatid(patArchive.getId());
@@ -539,6 +688,7 @@
         patMedInhosp.setFuflag("1");
         if ("0".equals(cry)) patMedInhosp.setInhospstate("0");
         if ("1".equals(cry)) patMedInhosp.setInhospstate("1");
+        if ("3".equals(cry)) patMedInhosp.setInhospstate("3");
         patMedInhosp.setHospitalcode(dto.getOrgId());
         patMedInhosp.setBedNo(dto.getBedNumber());
         patMedInhosp.setStarttime(parseDate(dto.getStartTime()));
@@ -582,12 +732,12 @@
         patMedInhosp.setHospitaldistrictname(dto.getAreaName());
     }
 
-    private PatArchive processPatientArchive(ServiceSLTDInhospResDTO dto, Long orgid) {
+    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);
 
-        PatArchive patArchive = buildPatientArchive(dto, orgid);
+        PatArchive patArchive = buildPatientArchive(dto);
 
         if (CollectionUtils.isEmpty(existingArchives)) {
             patArchiveService.insertPatArchive(patArchive);
@@ -601,7 +751,7 @@
         return patArchive;
     }
 
-    private PatArchive buildPatientArchive(ServiceSLTDInhospResDTO dto, Long orgid) {
+    private PatArchive buildPatientArchive(ServiceSLTDInhospResDTO dto) {
         PatArchive patArchive = new PatArchive();
         patArchive.setPatientno("" + dto.getPatientId());
         patArchive.setIdcardno(StringUtils.isEmpty(dto.getIdCardNo()) ? "" + dto.getMedicalCardId() : dto.getIdCardNo().trim());

--
Gitblit v1.9.3