From cc479e6a056785103996cc7ea67dbd5faa3e800e Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期一, 19 十月 2026 18:07:22 +0800
Subject: [PATCH] 数据采集模块

---
 smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java |   88 ++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 84 insertions(+), 4 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 258cbe8..11638b2 100644
--- a/smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
@@ -10,12 +10,18 @@
 import com.ruoyi.common.core.domain.entity.SysUserRole;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.core.service.dto.InhospPositionRecord;
 import com.smartor.common.enums.EmergencyLevelEnum;
 import com.smartor.common.enums.ImportFlagEnum;
 import com.ruoyi.common.utils.http.HttpUtils;
 import com.smartor.common.DistinctByProperty;
 import com.smartor.domain.*;
+import com.ruoyi.outpatientvisit.domain.PatMedOuthospError;
+import com.ruoyi.outpatientvisit.domain.PatMedOuthosp;
+import com.ruoyi.inhospvisit.api.InhospVisitFacade;
+import com.ruoyi.inhospvisit.domain.PatMedInhosp;
 import com.smartor.mapper.*;
+import com.ruoyi.outpatientvisit.mapper.PatMedOuthospErrorMapper;
 import com.smartor.service.IPatArchiveService;
 import com.smartor.service.IPatMedInhospService;
 import com.smartor.service.IPatMedOuthospService;
@@ -37,12 +43,33 @@
 import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import com.ruoyi.common.core.domain.entity.PatArchive;
+import com.ruoyi.task.domain.ServiceSubtask;
+import com.ruoyi.task.mapper.ServiceSubtaskMapper;
+import com.ruoyi.task.service.impl.ServiceSubtaskServiceImpl;
 
 @Slf4j
 @Service
 public class ServiceSLTDHealthcareRecordServiceImpl implements IServiceSLTDHealthcareRecordService {
 
     private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
+
+    /**
+     * 鍦ㄩ櫌鎮h�呭綋鍓嶄綅缃煡璇㈠湴鍧�锛堢綉鍏虫牴璺緞 {@code sltd_pub_path} + 鍥哄畾鍚庣紑锛夈��
+     * <p>
+     * 涓�"鍏ラ櫌閲囬泦"鏄�<b>鍚屼竴涓帴鍙�</b>锛坽@code queryHealthcareRecordList} 鐢ㄧ殑涔熸槸瀹冿級锛�
+     * 鍖哄埆鍙槸鏈柟娉曟寜 {@code healthcareRecordNo} 鍗曟煡銆佸彧鍙栦綅缃瓧娈点�佷笉钀藉簱銆�
+     */
+    private static final String INHOSP_POSITION_PATH =
+            "/osj/hbos-thirdparty-integration/standard/common/healthcareRecord/dtcQueryHealthcareRecordList";
+
+    /**
+     * 褰撳墠浣嶇疆鏌ヨ鐨勮繛鎺�/璇昏秴鏃讹細涓�杞鎸夋偅鑰呰皟鐢ㄥ嚑鍗冩锛�
+     * 涓嶈兘璁╀竴娆℃棤鍝嶅簲鎶婇噰闆嗙嚎绋嬫棤闄愭湡鎸備綇锛坽@code HttpUtils} 鑰佹柟娉曟病鏈夎秴鏃讹級
+     */
+    private static final int INHOSP_POSITION_CONNECT_TIMEOUT_MS = 5000;
+
+    private static final int INHOSP_POSITION_READ_TIMEOUT_MS = 15000;
 
     @Autowired
     private IPatArchiveService patArchiveService;
@@ -91,7 +118,7 @@
     @Autowired
     private ServiceSubtaskMapper serviceSubtaskMapper;
     @Autowired
-    private PatMedInhospMapper patMedInhospMapper;
+    private InhospVisitFacade inhospVisitFacade;
 
     @Autowired
     private PatMedOuthospErrorMapper patMedOuthospErrorMapper;
@@ -415,6 +442,47 @@
         }
 
         return true;
+    }
+
+    @Override
+    public List<InhospPositionRecord> queryInhospPosition(ServiceSLTDInhospReqVO reqVO) {
+        // 涓�"鍏ラ櫌閲囬泦"鍏辩敤鍚屼竴濂楀叆鍙傛瀯閫狅細orgId + campusIds + statusList + healthcareRecordNo
+        Map<String, Object> requestParams = buildRequestParams(reqVO);
+        Map<String, String> headers = buildRequestHeaders();
+        String url = sltdPubPath + INHOSP_POSITION_PATH;
+        String result = HttpUtils.sendPostByHeader(url, new Gson().toJson(requestParams), headers,
+                INHOSP_POSITION_CONNECT_TIMEOUT_MS, INHOSP_POSITION_READ_TIMEOUT_MS);
+        if (StringUtils.isEmpty(result)) {
+            // sendPostByHeader 鎶婂紓甯稿悶鎺夊悗杩斿洖绌轰覆锛氳繖閲岀粷涓嶈兘褰撴垚"璇ユ偅鑰呭凡涓嶅湪闄�"锛�
+            // 鍚﹀垯鎺ュ彛鏁翠綋涓嶅彲鐢ㄦ椂浼氳璁版垚"鍑犲崈涓偅鑰呴兘鍑洪櫌浜�"锛屼笌鐪熺浉鍙嶃��
+            throw new RuntimeException("鏌ヨ鍦ㄩ櫌鎮h�呭綋鍓嶄綅缃帴鍙f棤鍝嶅簲锛宧ealthcareRecordNo=" + reqVO.getHealthcareRecordNo());
+        }
+        // getDataList 鍦ㄨ繑鍥炵爜闈� 200 鏃舵姏 RuntimeException锛沝ata 涓� []锛堣鎮h�呭凡涓嶅湪鍏ラ櫌鐘舵�侊級鏃惰繑鍥炵┖鍒楄〃
+        List<Map<String, Object>> dataList = getDataList(result, 1);
+        List<InhospPositionRecord> records = new ArrayList<>(dataList.size());
+        for (Map<String, Object> dataItem : dataList) {
+            records.add(convertToInhospPosition(dataItem));
+        }
+        return records;
+    }
+
+    /**
+     * 鍋ュ悍璁板綍 JSON 鈫� 濂戠害 DTO 鐨勯�愬瓧娈垫惉杩愶紙鍙彇"褰撳墠浣嶇疆"瑕佺敤鐨勫瓧娈碉級銆�
+     * <p>
+     * 涓�寰嬭蛋 {@code getStringValue} / {@code getLongValue}锛氭帴鍙e绌哄�煎彲鑳借繑鍥� {@code null}銆�
+     * {@code ""} 鐢氳嚦缂哄瓧娈碉紝鐩存帴璁� Gson 鍙嶅簭鍒楀寲鍒� Long 瀛楁浼氬湪绌轰覆涓婃姏 NumberFormatException銆�
+     */
+    private InhospPositionRecord convertToInhospPosition(Map<String, Object> dataItem) {
+        InhospPositionRecord record = new InhospPositionRecord();
+        record.setHealthcareRecordNo(getStringValue(dataItem, "healthcareRecordNo"));
+        record.setPatientName(getStringValue(dataItem, "patientName"));
+        record.setDeptId(getLongValue(dataItem, "deptId"));
+        record.setDeptName(getStringValue(dataItem, "deptName"));
+        record.setAreaId(getLongValue(dataItem, "areaId"));
+        record.setAreaName(getStringValue(dataItem, "areaName"));
+        record.setBedNumber(getStringValue(dataItem, "bedNumber"));
+        record.setHealthcareRecordStatus(getStringValue(dataItem, "healthcareRecordStatus"));
+        return record;
     }
 
     private String determineCry(ServiceSLTDInhospReqVO reqVO) {
@@ -852,10 +920,22 @@
     }
 
     private Boolean inHospitalDate(List<ServiceSLTDInhospResDTO> resultList, String cry) {
+        int failCount = 0;
         for (ServiceSLTDInhospResDTO dto : resultList) {
             if (Objects.isNull(dto)) continue;
-            PatArchive patArchive = processPatientArchive(dto);
-            processPatientInhospInfo(dto, patArchive, cry);
+            try {
+                PatArchive patArchive = processPatientArchive(dto);
+                processPatientInhospInfo(dto, patArchive, cry);
+            } catch (Exception e) {
+                failCount++;
+                log.error("銆恑nHospitalDate銆戝崟鏉¤褰曞鐞嗗け璐ワ紝宸茶烦杩囩户缁噰闆嗐�俿tate={}, serialnum={}, patname={}, patno={}, orgid={}, campusId={}",
+                        cry, dto.getHealthcareRecordNo(), dto.getPatientName(), dto.getMedicalRecordNo(),
+                        dto.getOrgId(), dto.getCampusId(), e);
+            }
+        }
+        if (failCount > 0) {
+            log.warn("銆恑nHospitalDate銆戞湰椤靛叡{}鏉★紝澶辫触{}鏉″凡璺宠繃锛屽叾浣檣}鏉″鐞嗗畬鎴愶紝state={}",
+                    resultList.size(), failCount, resultList.size() - failCount, cry);
         }
         return true;
     }
@@ -906,7 +986,7 @@
                             if (pmIn.getStarttime() != null) {
                                 Date dayStart = DateUtils.truncate(pmIn.getStarttime(), Calendar.DAY_OF_MONTH);
                                 Date dayEnd = DateUtils.addDays(dayStart, 1);
-                                List<PatMedInhosp> outInhosps = patMedInhospMapper.selectOutInhospByPatnoAndOutDate(
+                                List<PatMedInhosp> outInhosps = inhospVisitFacade.selectOutInhospByPatnoAndOutDate(
                                         StringUtils.trim(pmIn.getPatno()), dayStart, dayEnd);
                                 if (CollectionUtils.isNotEmpty(outInhosps)) {
                                     //瀛樺湪鍑洪櫌璁板綍锛岃鏄庤鎮h�呮槸鍐嶅叆闄紝鎶婁笂涓�娆″嚭闄骇鐢熺殑瀛愪换鍔℃敼鎴愪笉鎵ц

--
Gitblit v1.9.3