From 2867cf7076a584a34e63174cec0a8b89cdd03e4c Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期五, 06 十一月 2026 13:42:55 +0800
Subject: [PATCH] Merge branch 'master' into smartor_ls_261103

---
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java |  154 +++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 143 insertions(+), 11 deletions(-)

diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java
index 29f9a5a..b7986ed 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java
@@ -11,9 +11,11 @@
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.quartz.mapper.CollectHISMapper;
 import com.ruoyi.quartz.service.ICollectHISService;
+import com.smartor.common.SpecificArchiveConstants;
 import com.smartor.domain.*;
 import com.smartor.mapper.*;
 import com.smartor.service.IPatMedOuthospService;
+import com.smartor.service.IPatSpecificArchiveGenerateService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.ArrayUtils;
@@ -23,6 +25,7 @@
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -35,6 +38,7 @@
 import com.ruoyi.outpatientvisit.mapper.PatMedOuthospMapper;
 import com.ruoyi.othervisit.domain.PatMedOperation;
 import com.ruoyi.outpatientvisit.domain.PatMedOuthosp;
+import com.ruoyi.outpatientvisit.domain.PatMedOuthospQueryReq;
 import com.ruoyi.inhospvisit.domain.PatMedInhosp;
 import com.ruoyi.common.core.domain.entity.PatArchive;
 import com.ruoyi.task.domain.entity.ServiceSubtaskEntity;
@@ -65,6 +69,9 @@
 
     @Autowired
     private IPatMedOuthospService patMedOuthospService;
+
+    @Autowired
+    private IPatSpecificArchiveGenerateService patSpecificArchiveGenerateService;
 
     @Autowired
     private SysDept2Mapper sysDept2Mapper;
@@ -297,13 +304,36 @@
      * @return
      */
     private Integer syncOuthosp(String startTime, String endTime) {
+        return syncOuthosp(startTime, endTime, null, false);
+    }
+
+    /**
+     * 鍚屾闂ㄨ瘖淇℃伅銆�
+     *
+     * @param startTime   寮�濮嬫椂闂�
+     * @param endTime     缁撴潫鏃堕棿
+     * @param orgid       鏈烘瀯ID锛屼负绌烘椂鍚屾鍏ㄩ儴鏈烘瀯
+     * @param byAdmitDate true=鎸夊氨璇婃棩鏈熻繃婊わ紙琛ラ噰锛夛紱false=鎸夋渶鍚庢洿鏂版椂闂村閲忓悓姝�
+     */
+    private Integer syncOuthosp(String startTime, String endTime, String orgid, boolean byAdmitDate) {
         Integer count = 0;
         PatMedOuthosp patMedOuthosp = new PatMedOuthosp();
-        patMedOuthosp.setLastStartTime(startTime);
-        patMedOuthosp.setLastEndTime(endTime);
+        if (byAdmitDate) {
+            patMedOuthosp.setBeginTime(parseDateTime(startTime));
+            patMedOuthosp.setEndTime(parseDateTime(endTime));
+        } else {
+            patMedOuthosp.setLastStartTime(startTime);
+            patMedOuthosp.setLastEndTime(endTime);
+        }
+        patMedOuthosp.setOrgid(orgid);
         List<PatMedOuthosp> patMedOuthosps = chMapper.selectPatMedOuthospList(patMedOuthosp);
-        log.info("鍚屾闂ㄨ瘖淇℃伅鏁伴噺" + patMedOuthosps.size());
+        log.info("鍚屾闂ㄨ瘖淇℃伅鏁伴噺锛歿}锛宱rgid={}锛宐yAdmitDate={}", patMedOuthosps.size(), orgid, byAdmitDate);
         for (PatMedOuthosp patMedOuthosp1 : patMedOuthosps) {
+            // 鎸夋満鏋勮ˉ閲囨椂锛孒IS 瑙嗗浘鏈繑鍥� orgid 鐨勮褰曡ˉ涓婃煡璇㈡潯浠朵腑鐨勬満鏋�
+            if (StringUtils.isEmpty(patMedOuthosp1.getOrgid()) && StringUtils.isNotEmpty(orgid)) {
+                patMedOuthosp1.setOrgid(orgid);
+            }
+            PatArchive localArchive = null;
             try {
                 //鎮h�呭熀鏈俊鎭�
                 PatArchive patArchive = new PatArchive();
@@ -314,26 +344,47 @@
                     pa1.setPatientno(patMedOuthosp1.getPatno());
                     List<PatArchive> patArchives1 = patArchiveMapper.selectPatArchiveList(pa1);
                     if (CollectionUtils.isNotEmpty(patArchives1)) {
-                        patArchives.get(0).setId(patArchives1.get(0).getId());
+                        localArchive = patArchives1.get(0);
+                        patArchives.get(0).setId(localArchive.getId());
                         patArchives.get(0).setUpdateTime(new Date());
                         count += patArchiveMapper.updatePatArchive(patArchives.get(0));
                     } else {
                         patArchives.get(0).setCreateTime(new Date());
                         count += patArchiveMapper.insertPatArchiveSingle(patArchives.get(0));
-
+                        localArchive = patArchives.get(0);
                     }
                 }
             } catch (Exception ex) {
                 log.info("鍚屾偅鑰呭熀鏈俊鎭�:" + ex.getMessage());
             }
 
+            // HIS 鎮h�呬俊鎭己澶辨椂锛屼粛鎸夋偅鑰呯紪鍙峰洖鏌ユ湰鍦版。妗�
+            if (localArchive == null && StringUtils.isNotEmpty(patMedOuthosp1.getPatno())) {
+                try {
+                    PatArchive localQuery = new PatArchive();
+                    localQuery.setPatientno(patMedOuthosp1.getPatno());
+                    List<PatArchive> localArchives = patArchiveMapper.selectPatArchiveList(localQuery);
+                    if (CollectionUtils.isNotEmpty(localArchives)) {
+                        localArchive = localArchives.get(0);
+                    }
+                } catch (Exception ex) {
+                    log.info("鍥炴煡鏈湴鎮h�呮。妗堝け璐�:" + ex.getMessage());
+                }
+            }
+
             try {
-                PatMedOuthosp patMedOuthospTemp = new PatMedOuthosp();
-                patMedOuthospTemp.setSerialnum(patMedOuthosp1.getSerialnum());
-                List<PatMedOuthosp> patMedOuthospsTemp = chMapper.selectPatMedOuthospList(patMedOuthosp);
-                if (patMedOuthospsTemp.size() > 0) {
+                if (localArchive != null && localArchive.getId() != null) {
+                    patMedOuthosp1.setPatid(localArchive.getId());
+                }
+                PatMedOuthosp localOuthosp = null;
+                try {
+                    localOuthosp = findLocalOuthosp(patMedOuthosp1);
+                } catch (Exception e) {
+                    log.warn("鍥炴煡鏈湴闂ㄨ瘖璁板綍澶辫触锛屾寜鏂板澶勭悊锛宻erialnum={}", patMedOuthosp1.getSerialnum(), e);
+                }
+                if (localOuthosp != null) {
                     patMedOuthosp1.setUpdateTime(new Date());
-                    patMedOuthosp1.setId(patMedOuthospsTemp.get(0).getId());
+                    patMedOuthosp1.setId(localOuthosp.getId());
                     //甯備竴 闄㈠尯id瀵瑰簲orgid锛屾満鏋刬d涓洪粯璁ょ殑1
                     if(active.equals("hzszlyy")) {
                         patMedOuthosp1.setCampusid(patMedOuthosp1.getOrgid());
@@ -349,14 +400,95 @@
                     }
                     count += patMedOuthospService.insertPatMedOuthosp(patMedOuthosp1);
                 }
+                generateSpecificArchive(patMedOuthosp1, localArchive);
             } catch (Exception ex) {
-                log.info("鍚屾鍑哄叆闄�:" + ex.getMessage());
+                log.info("鍚屾闂ㄨ瘖淇℃伅:" + ex.getMessage());
             }
         }
         return count;
     }
 
     /**
+     * 鍥炴煡鏈湴闂ㄨ瘖璁板綍锛岄伩鍏嶉噸澶嶉噰闆嗘椂鎻掑叆閲嶅鏁版嵁銆�
+     */
+    private PatMedOuthosp findLocalOuthosp(PatMedOuthosp record) {
+        if (StringUtils.isEmpty(record.getSerialnum()) && StringUtils.isEmpty(record.getOuthospno())) {
+            return null;
+        }
+        PatMedOuthospQueryReq req = new PatMedOuthospQueryReq();
+        req.setSerialnum(record.getSerialnum());
+        req.setOuthospno(record.getOuthospno());
+        req.setOrgid(record.getOrgid());
+        List<PatMedOuthosp> localList = patMedOuthospMapper.callSpQueryOuthosp(req);
+        return CollectionUtils.isNotEmpty(localList) ? localList.get(0) : null;
+    }
+
+    /**
+     * 闂ㄨ瘖鎺ヨ瘖瀹屾垚璁板綍閲囬泦鍚庣敓鎴愪笓绉戞。妗堬紙浠呬附姘村競濡囧辜淇濆仴闄㈢敓鏁堬級銆�
+     */
+    private void generateSpecificArchive(PatMedOuthosp patMedOuthosp, PatArchive patArchive) {
+        if (!SpecificArchiveConstants.LISHUI_MCH_ORG_ID.equals(patMedOuthosp.getOrgid())) {
+            return;
+        }
+        try {
+            int generated = patSpecificArchiveGenerateService.generateByOuthosp(patMedOuthosp, patArchive);
+            if (generated > 0) {
+                log.info("闂ㄨ瘖鎺ヨ瘖瀹屾垚璁板綍鐢熸垚涓撶妗f鎴愬姛锛宱uthospno={}锛岀敓鎴愭暟閲�={}",
+                        patMedOuthosp.getOuthospno(), generated);
+            }
+        } catch (Exception e) {
+            log.error("闂ㄨ瘖鎺ヨ瘖瀹屾垚璁板綍鐢熸垚涓撶妗f澶辫触锛宱uthospno={}", patMedOuthosp.getOuthospno(), e);
+        }
+    }
+
+    private Date parseDateTime(String value) {
+        if (StringUtils.isEmpty(value)) {
+            return null;
+        }
+        try {
+            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value);
+        } catch (Exception e) {
+            try {
+                return new SimpleDateFormat("yyyy-MM-dd").parse(value);
+            } catch (Exception ex) {
+                log.warn("瑙f瀽闂ㄨ瘖閲囬泦鏃堕棿澶辫触锛歿}", value);
+                return null;
+            }
+        }
+    }
+
+    /**
+     * 鍓嶇/瀹氭椂浠诲姟浼犲叆 yyyy-MM-dd 鏃讹紝缁撴潫鏃堕棿琛ラ綈鍒板綋澶� 23:59:59锛岄伩鍏嶆紡鎺夊綋澶╂暟鎹��
+     */
+    private Date normalizeEndTime(Date endTime) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(endTime);
+        if (calendar.get(Calendar.HOUR_OF_DAY) == 0 && calendar.get(Calendar.MINUTE) == 0
+                && calendar.get(Calendar.SECOND) == 0 && calendar.get(Calendar.MILLISECOND) == 0) {
+            calendar.add(Calendar.DAY_OF_MONTH, 1);
+            calendar.add(Calendar.SECOND, -1);
+            return calendar.getTime();
+        }
+        return endTime;
+    }
+
+    @Override
+    public Integer collectMchOuthospAndGenerateArchive(String orgid, Date startTime, Date endTime) {
+        if (!SpecificArchiveConstants.LISHUI_MCH_ORG_ID.equals(orgid)) {
+            log.warn("閲囬泦闂ㄨ瘖鎺ヨ瘖瀹屾垚璁板綍浠呮敮鎸佷附姘村競濡囧辜淇濆仴闄紝orgid={}", orgid);
+            return 0;
+        }
+        Date end = endTime != null ? normalizeEndTime(endTime) : new Date();
+        Date start = startTime != null ? startTime : new Date(end.getTime() - 24 * 60 * 60 * 1000L);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        log.info("寮�濮嬮噰闆嗕附姘村骞奸棬璇婃帴璇婂畬鎴愯褰曪紝鏃堕棿鑼冨洿锛歿} ~ {}", sdf.format(start), sdf.format(end));
+        int count = syncOuthosp(sdf.format(start), sdf.format(end), orgid, true);
+        log.info("涓芥按濡囧辜闂ㄨ瘖鎺ヨ瘖瀹屾垚璁板綍閲囬泦瀹屾垚锛屾椂闂磋寖鍥达細{} ~ {}锛屽鐞嗘暟閲忥細{}",
+                sdf.format(start), sdf.format(end), count);
+        return count;
+    }
+
+    /**
      * 鍚屾鎵嬫湳淇℃伅
      *
      * @param

--
Gitblit v1.9.3