From f2cc333b963cb0de81aebc5ae3a8c247e99243d8 Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期二, 02 六月 2026 18:21:27 +0800
Subject: [PATCH] 【市一】同步手术视图

---
 smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java |   86 ++++++++++++++++++++++++++++++++++++++----
 1 files changed, 77 insertions(+), 9 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 386ae84..56d4bc6 100644
--- a/smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
@@ -781,7 +781,7 @@
         patMedInhosp.setDelFlag("0");
         patMedInhosp.setOrgid(dto.getOrgId());
         patMedInhosp.setCampusid(dto.getCampusId());
-        if(StringUtils.isNotEmpty(dto.getHealthcareRecordStatus())&&dto.getHealthcareRecordStatus().equals("FH0109.25"))
+        if (StringUtils.isNotEmpty(dto.getHealthcareRecordStatus()) && dto.getHealthcareRecordStatus().equals("FH0109.25"))
             patMedInhosp.setRemark("棰勫嚭闄�");
         return patMedInhosp;
     }
@@ -809,15 +809,51 @@
         patMedInhosp.setHospitaldistrictname(dto.getAreaName());
     }
 
+    /**
+     * 澶勭悊鎮h�呮。妗堬紙鏂板鎴栨洿鏂帮級
+     * 浣跨敤 Redis 鍒嗗竷寮忛攣闃叉骞跺彂閲嶅鎻掑叆
+     */
     private PatArchive processPatientArchive(ServiceSLTDInhospResDTO dto) {
-        List<PatArchive> existingArchives = null;
+        // 鏋勫缓閿佺殑 key锛氬熀浜� patientno 鎴� idcardno
+        String lockKey = "pat_archive_lock:" + 
+            (StringUtils.isNotEmpty(dto.getMedicalRecordNo()) ? dto.getMedicalRecordNo() : dto.getIdCardNo());
+        
+        // 灏濊瘯鑾峰彇鍒嗗竷寮忛攣锛屾渶澶氱瓑寰� 3 绉掞紝閿佸畾 10 绉掕嚜鍔ㄩ噴鏀�
+        Boolean lockAcquired = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS);
+        
+        if (lockAcquired == null || !lockAcquired) {
+            log.warn("銆恜rocessPatientArchive銆戣幏鍙栧垎甯冨紡閿佸け璐ワ紝璺宠繃鏈澶勭悊锛堝叾浠栫嚎绋嬫鍦ㄥ鐞嗭級锛宲atientno={}", dto.getMedicalRecordNo());
+            // 绛夊緟涓�娈垫椂闂村悗閲嶈瘯鏌ヨ
+            try {
+                Thread.sleep(500);
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+            }
+        }
+        
+        try {
+            return doProcessPatientArchive(dto);
+        } finally {
+            // 閲婃斁閿�
+            if (lockAcquired != null && lockAcquired) {
+                redisTemplate.delete(lockKey);
+            }
+        }
+    }
 
+    /**
+     * 瀹為檯鎵ц鎮h�呮。妗堝鐞嗛�昏緫
+     */
+    private PatArchive doProcessPatientArchive(ServiceSLTDInhospResDTO dto) {
+        List<PatArchive> existingArchives = null;
+        log.info("銆恜rocessPatientArchive銆戞柊澧炴偅鑰呮。妗堬紝鏌ヨ鍏ュ弬淇℃伅patientno:{}锛宨dcardno:{}", dto.getMedicalRecordNo(), dto.getIdCardNo());
         // 绗竴姝ワ細鎸� patientno 绮剧‘鏌ラ噸锛堜笌鎻掑叆鏃朵娇鐢ㄧ殑 medicalRecordNo 涓�鑷达級
-        String patientno = dto.getMedicalRecordNo() == null ? null : String.valueOf(dto.getMedicalRecordNo());
+        String patientno = StringUtils.isEmpty(dto.getMedicalRecordNo()) ? null : dto.getMedicalRecordNo();
         if (StringUtils.isNotEmpty(patientno)) {
             PatArchive queryByPatientNo = new PatArchive();
             queryByPatientNo.setPatientno(patientno);
             existingArchives = patArchiveService.selectPatArchiveList(queryByPatientNo);
+            log.debug("銆恜rocessPatientArchive銆戞寜patientno鏌ヨ锛宲atientno={}, 缁撴灉鏁伴噺={}", patientno, existingArchives.size());
         }
 
         // 绗簩姝ワ細鎸� patientno 鏌ヤ笉鍒版椂锛屾寜 idcardno 鏌ラ噸锛堝垎姝R锛岄伩鍏岮ND鏉′欢婕忔煡锛�
@@ -825,24 +861,55 @@
             PatArchive queryByIdCard = new PatArchive();
             queryByIdCard.setIdcardno(dto.getIdCardNo().trim());
             existingArchives = patArchiveService.selectPatArchiveList(queryByIdCard);
+            log.debug("銆恜rocessPatientArchive銆戞寜idcardno鏌ヨ锛宨dcardno={}, 缁撴灉鏁伴噺={}", dto.getIdCardNo(), existingArchives.size());
         }
 
         PatArchive patArchive = buildPatientArchive(dto);
-
+        log.info("銆恜rocessPatientArchive銆戞偅鑰呮。妗堟煡閲嶅畬鎴愶紝patientno={}, 鏄惁宸插瓨鍦�={}", 
+            patArchive.getPatientno(), CollectionUtils.isEmpty(existingArchives) ? "鍚�" : "鏄�(id=" + existingArchives.get(0).getId() + ")");
+        
         if (CollectionUtils.isEmpty(existingArchives)) {
             try {
-                patArchiveService.insertPatArchive(patArchive);
-                log.info("銆恜rocessPatientArchive銆戞柊澧炴偅鑰呮。妗堬紝鎮h�呯紪鍙凤細{}", patArchive.getPatientno());
+                // 鏈�缁堢‘璁ゆ煡璇紙闃插尽鎬х紪绋嬶細闃叉Redis閿佸け鏁堢瓑鏋佺鎯呭喌锛�
+                PatArchive finalQuery = new PatArchive();
+                if (StringUtils.isNotEmpty(dto.getIdCardNo())) {
+                    finalQuery.setIdcardno(dto.getIdCardNo().trim());
+                }
+                if (StringUtils.isNotEmpty(dto.getMedicalRecordNo())) {
+                    finalQuery.setPatientno(dto.getMedicalRecordNo());
+                }
+                
+                List<PatArchive> finalCheck = patArchiveService.selectPatArchiveList(finalQuery);
+                log.info("銆恜rocessPatientArchive銆戞渶缁堢‘璁ゆ煡璇紝patientno={}, idcardno={}, 缁撴灉鏁伴噺={}", 
+                    dto.getMedicalRecordNo(), dto.getIdCardNo(), finalCheck.size());
+                
+                if (CollectionUtils.isEmpty(finalCheck)) {
+                    patArchiveService.insertPatArchive(patArchive);
+                    log.info("銆恜rocessPatientArchive銆戔湏 鏂板鎮h�呮。妗堟垚鍔燂紝patientno={}, id={}", 
+                        patArchive.getPatientno(), patArchive.getId());
+                } else {
+                    // 鍏朵粬绾跨▼宸茬粡鎻掑叆锛岀洿鎺ヤ娇鐢ㄥ凡鏈夎褰�
+                    existingArchives = finalCheck;
+                    patArchive.setId(existingArchives.get(0).getId());
+                    patArchive.setNotrequiredFlag(existingArchives.get(0).getNotrequiredFlag());
+                    patArchive.setNotrequiredreason(existingArchives.get(0).getNotrequiredreason());
+                    log.info("銆恜rocessPatientArchive銆戞。妗堝凡琚叾浠栫嚎绋嬪垱寤猴紝浣跨敤宸叉湁璁板綍锛宨d={}", patArchive.getId());
+                }
             } catch (org.springframework.dao.DuplicateKeyException e) {
-                log.error("銆恜rocessPatientArchive銆戞偅鑰呮。妗堝凡瀛樺湪(骞跺彂鎻掑叆)锛岃烦杩囷細patientno={}, idcardno={}", patArchive.getPatientno(), patArchive.getIdcardno());
+                log.warn("銆恜rocessPatientArchive銆戞偅鑰呮。妗堝凡瀛樺湪(骞跺彂鎻掑叆寮傚父)锛岃烦杩囷細patientno={}, idcardno={}", 
+                    patArchive.getPatientno(), patArchive.getIdcardno());
                 // 骞跺彂鎻掑叆鍦烘櫙锛岄噸鏂版煡璇㈣幏鍙栧凡瀛樺湪鐨勮褰�
                 PatArchive queryRetry = new PatArchive();
                 queryRetry.setPatientno(patArchive.getPatientno());
+                if (StringUtils.isNotEmpty(patArchive.getIdcardno())) {
+                    queryRetry.setIdcardno(patArchive.getIdcardno());
+                }
                 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());
+                    log.info("銆恜rocessPatientArchive銆戜粠寮傚父鎭㈠锛岃幏鍙栧凡鏈夋。妗堬紝id={}", patArchive.getId());
                 }
             }
         } else {
@@ -850,7 +917,8 @@
             patArchive.setNotrequiredFlag(existingArchives.get(0).getNotrequiredFlag());
             patArchive.setNotrequiredreason(existingArchives.get(0).getNotrequiredreason());
             patArchiveService.updateArchive(patArchive);
-            log.info("銆恜rocessPatientArchive銆戞洿鏂版偅鑰呮。妗堬紝鎮h�呯紪鍙凤細{}", patArchive.getPatientno());
+            log.info("銆恜rocessPatientArchive銆戔湏 鏇存柊鎮h�呮。妗堬紝patientno={}, id={}", 
+                patArchive.getPatientno(), patArchive.getId());
         }
 
         return patArchive;
@@ -858,7 +926,7 @@
 
     private PatArchive buildPatientArchive(ServiceSLTDInhospResDTO dto) {
         PatArchive patArchive = new PatArchive();
-        patArchive.setPatientno(dto.getMedicalRecordNo() == null ? null : String.valueOf(dto.getMedicalRecordNo()));
+        patArchive.setPatientno(StringUtils.isEmpty(dto.getMedicalRecordNo()) ? null : 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());

--
Gitblit v1.9.3