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 |  591 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 553 insertions(+), 38 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 c0c38f9..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
@@ -1,39 +1,77 @@
 package com.ruoyi.quartz.service.impl;
 
+import com.ruoyi.othervisit.api.OtherVisitFacade;
+import com.ruoyi.inhospvisit.api.InhospVisitFacade;
+import com.google.gson.Gson;
 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.redis.RedisCache;
+import com.ruoyi.common.utils.ArrayListUtils;
 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;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 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;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import com.ruoyi.othervisit.domain.PatMedOperationItem;
+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;
+import com.ruoyi.task.domain.ServiceSubtask;
+import com.ruoyi.task.mapper.ServiceSubtaskMapper;
+import com.ruoyi.patarchive.mapper.PatArchiveMapper;
+import com.ruoyi.common.core.domain.entity.Icd10;
+import com.ruoyi.common.mapper.Icd10Mapper;
+import com.ruoyi.system.mapper.ext.SysUser2Mapper;
+import com.ruoyi.system.mapper.ext.SysDept2Mapper;
+import com.ruoyi.system.mapper.ext.SysUserDeptMapper;
+import com.ruoyi.patarchive.mapper.ShardingMapper;
+import com.ruoyi.datacollection.domain.HnDataGatherVO;
 @Slf4j
 @Service
 public class CollectHISServiceImpl implements ICollectHISService {
     @Autowired
     private CollectHISMapper chMapper;
 
+    /**
+     * 鎵嬫湳鏁版嵁涓�寰嬬粡 ruoyi-othervisit 鐨勯棬闈㈠彇鐢紙璺ㄦā鍧楁暟鎹闂師鍒欙級銆�
+     */
+    @Autowired
+    private OtherVisitFacade otherVisitFacade;
+
     @Autowired
     private SysUser2Mapper sysUser2Mapper;
 
     @Autowired
-    private SysUserRole2Mapper sysUserRoleMapper;
+    private IPatMedOuthospService patMedOuthospService;
+
+    @Autowired
+    private IPatSpecificArchiveGenerateService patSpecificArchiveGenerateService;
 
     @Autowired
     private SysDept2Mapper sysDept2Mapper;
@@ -51,10 +89,13 @@
     private PatMedOuthospMapper patMedOuthospMapper;
 
     @Autowired
-    private PatMedInhospMapper patMedInhospMapper;
+    private InhospVisitFacade inhospVisitFacade;
 
     @Autowired
     private PatArchiveMapper patArchiveMapper;
+
+    @Autowired
+    private ServiceSubtaskMapper serviceSubtaskMapper;
 
     @Autowired
     private ThreadPoolTaskExecutor taskExecutor;
@@ -64,6 +105,14 @@
 
     @Autowired
     private UtilsMapper utilsMapper;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    /**
+     * 鐢ㄦ埛鍚屾浠诲姟杩愯鏍囪锛岄伩鍏嶉噸澶嶇偣鍑�/閲嶅璋冪敤骞跺彂璺戝叏閲忓悓姝�
+     */
+    private final AtomicBoolean userSyncRunning = new AtomicBoolean(false);
 
     private static final long SHARDING_THRESHOLD = 5_000_000L;
     private static final String PAT_ARCHIVE_TABLE = "pat_archive";
@@ -101,7 +150,7 @@
         Integer count = 0;
         List<Map<String, Object>> syncList = utilsMapper.getList("SELECT id,syncName,DATE_FORMAT(ADDDATE(startTime, INTERVAL -1 MINUTE), '%Y-%m-%d %H:%i:%s') startTime  FROM sys_sync_time  where state=0");
         if (syncList.size() > 0) {
-            String endTime = chMapper.getSqlString("select sysdate from healthy_inhosp where rownum=1");
+            String endTime = chMapper.getSqlString("select (sysdate-1) as endtime from healthy_inhosp where rownum=1");
             //鍚屾鎮h�呭熀鏈俊鎭�
 //            List<Map<String, Object>> syncTemp = syncList.stream().filter(row -> row.get("syncName").equals("pat_archive")).collect(Collectors.toList());
 //            if (syncTemp.size() > 0) {
@@ -112,6 +161,7 @@
             //鍚屾浣忛櫌鐥呬汉淇℃伅
             List<Map<String, Object>> syncTemp = syncList.stream().filter(row -> row.get("syncName").equals("pat_med_inhosp")).collect(Collectors.toList());
             if (syncTemp.size() > 0) {
+                log.info("startTime:" + syncTemp.get(0).get("startTime") + ", endTime: ", endTime);
                 count += syncMedInhosp(syncTemp.get(0).get("startTime") + "", endTime);
                 utilsMapper.updateSql("update sys_sync_time set startTime='" + endTime + "' where syncName='pat_med_inhosp' ");
             }
@@ -123,6 +173,12 @@
                 utilsMapper.updateSql("update sys_sync_time set startTime='" + endTime + "' where syncName='pat_med_outhosp' ");
             }
 
+            //鍚屾鎵嬫湳淇℃伅
+            syncTemp = syncList.stream().filter(row -> row.get("syncName").equals("pat_med_operation")).collect(Collectors.toList());
+            if (syncTemp.size() > 0) {
+                count += syncOper(syncTemp.get(0).get("startTime") + "", endTime);
+                utilsMapper.updateSql("update sys_sync_time set startTime='" + endTime + "' where syncName='pat_med_operation' ");
+            }
 
         } else {
             log.info("鍚屾浠诲姟鏃堕棿sys_sync_time琛ㄤ腑娌℃湁闇�瑕佸悓姝ョ殑浠诲姟");
@@ -171,7 +227,8 @@
      * @param
      * @return
      */
-    private Integer syncMedInhosp(String startTime, String endTime) {
+    @Override
+    public Integer syncMedInhosp(String startTime, String endTime) {
         Integer count = 0;
         PatMedInhosp patMedInhosp = new PatMedInhosp();
         patMedInhosp.setLastStartTime(startTime);
@@ -214,7 +271,7 @@
                 //鍚屾鍑哄叆闄�
                 PatMedInhosp pmi = new PatMedInhosp();
                 pmi.setSerialnum(pm.getSerialnum());
-                List<PatMedInhosp> patMedInhospList1 = patMedInhospMapper.selectPatMedInhospListBySerialnum(pmi);
+                List<PatMedInhosp> patMedInhospList1 = inhospVisitFacade.selectPatMedInhospListBySerialnum(pmi);
                 if (patMedInhospList1.size() == 0) {
                     pm.setCreateTime(new Date());
                     //甯備竴 闄㈠尯id瀵瑰簲orgid锛屾満鏋刬d涓洪粯璁ょ殑1
@@ -222,7 +279,7 @@
                         pm.setCampusid(pm.getOrgid());
                         pm.setOrgid("1");
                     }
-                    count += patMedInhospMapper.insertPatMedInhosp(pm);
+                    count += inhospVisitFacade.insertPatMedInhosp(pm);
                 } else {
                     pm.setInhospid(patMedInhospList1.get(0).getInhospid());
                     pm.setUpdateTime(new Date());
@@ -231,7 +288,7 @@
                         pm.setCampusid(pm.getOrgid());
                         pm.setOrgid("1");
                     }
-                    count += patMedInhospMapper.updatePatMedInhosp(pm);
+                    count += inhospVisitFacade.updatePatMedInhosp(pm);
                 }
             } catch (Exception ex) {
                 log.info("鍚屾鍑哄叆闄�:" + ex.getMessage());
@@ -247,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();
@@ -264,32 +344,53 @@
                     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());
                         patMedOuthosp1.setOrgid("1");
                     }
-                    count += patMedOuthospMapper.updatePatMedOuthosp(patMedOuthosp1);
+                    count += patMedOuthospService.updatePatMedOuthosp(patMedOuthosp1);
                 } else {
                     patMedOuthosp1.setCreateTime(new Date());
                     //甯備竴 闄㈠尯id瀵瑰簲orgid锛屾満鏋刬d涓洪粯璁ょ殑1
@@ -297,13 +398,332 @@
                         patMedOuthosp1.setCampusid(patMedOuthosp1.getOrgid());
                         patMedOuthosp1.setOrgid("1");
                     }
-                    count += patMedOuthospMapper.insertPatMedOuthosp(patMedOuthosp1);
+                    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
+     * @return
+     */
+    @Override
+    public Integer syncOper(String startTime, String endTime) {
+        Integer count = 0;
+        PatMedOperation patMedOperation = new PatMedOperation();
+        patMedOperation.setLastStartTime(startTime);
+        patMedOperation.setLastEndTime(endTime);
+        List<PatMedOperation> patMedOperations = chMapper.selectOperList(patMedOperation);
+        Map<String, Long> patIdHisMap = buildOperationPatIdHisMap(patMedOperations);
+
+        log.info("鍚屾鎵嬫湳淇℃伅鏁伴噺" + patMedOperations.size());
+        for (PatMedOperation operation : patMedOperations) {
+            try {
+                if(ObjectUtils.isNotEmpty(operation.getCanceltime())){
+                    //浣滃簾鍒犻櫎鎿嶄綔
+                    cancelOper(operation);
+                    continue;
+                }
+                Long patId = patIdHisMap.get(operation.getPatidHis());
+                if (patId == null) {
+                    patId = syncSinglePatient(operation.getPatidHis());
+                    if (patId != null) {
+                        patIdHisMap.put(operation.getPatidHis(), patId);
+                    }
+                }
+
+                if (patId != null) {
+                    operation.setPatid(patId);
+                }
+                PatMedOperation oper = new PatMedOperation();
+                oper.setOpreqid(operation.getOpreqid());
+                List<PatMedOperation> patMedOperations1 = otherVisitFacade.selectOperationList(oper);
+                if (CollectionUtils.isNotEmpty(patMedOperations1)) {
+                    operation.setId(patMedOperations1.get(0).getId());
+                    operation.setUpdateTime(new Date());
+                    count += otherVisitFacade.updateOperation(operation);
+                    syncOperItem(operation);
+                } else {
+                    operation.setCreateTime(new Date());
+                    count += otherVisitFacade.insertOperation(operation);
+                    syncOperItem(operation);
+                }
+            } catch (Exception ex) {
+                log.info("鍚屾鎵嬫湳淇℃伅:" + ex.getMessage());
+            }
+        }
+        return count;
+    }
+
+    private Integer cancelOper(PatMedOperation oper){
+        PatMedOperation operationVo = new PatMedOperation();
+        operationVo.setOpreqid(oper.getOpreqid());
+        List<PatMedOperation> operations = otherVisitFacade.selectOperationList(operationVo);
+        PatMedOperation operation = new PatMedOperation();
+        if(CollectionUtils.isEmpty(operations)){
+            return 0;
+        }else {
+            operation = operations.get(0);
+        }
+        log.info("鎵嬫湳浣滃簾id=" + operation.getId());
+        PatMedOperationItem pmoi = new PatMedOperationItem();
+        //鑾峰彇闇�瑕佸嚭闄㈡墜鏈殢璁匡紝鏈鐞嗙殑鏁版嵁
+        pmoi.setOpid(operation.getId().toString());
+        List<PatMedOperationItem> patMedOperationItems
+                = otherVisitFacade.selectOperationItemListByCondition(pmoi);
+        List<Long> operationItemIds = patMedOperationItems.stream()
+                .map(PatMedOperationItem::getId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+
+        //涓嶉渶瑕佹湇鍔′簡锛岄渶瑕侀�氳繃patid鍜宻endstate=1,2,3,5,7鍘绘煡璇竴涓嬶紝service_subtask閲屾槸鍚︽湁姝e湪鎵ц鐨勪换鍔★紝
+        //鏈夌殑璇濓紝绔嬪嵆鍋滀簡
+        List<Long> sendstates = Arrays.asList(1L, 2L, 3L, 5L, 7L);
+        List<ServiceSubtask> serviceSubtaskList = new ArrayList<>();
+        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
+        serviceSubtaskVO.setOrgid(operation.getOrgid());
+        serviceSubtaskVO.setPatid(operation.getPatid());
+        serviceSubtaskVO.setSendstates(sendstates);
+        serviceSubtaskVO.setOperationItemIds(operationItemIds);
+        serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
+        //鍘籸edis涓紝鏌ヨ鏄惁鏈塻ubid锛屾湁鐨勮瘽绉婚櫎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());
+        otherVisitFacade.updateOperation(operation);
+        otherVisitFacade.deleteSoftOperationItemByOpId(operation.getOpid());
+        return 1;
+    }
+
+    /**
+     * 鍚屾鎵嬫湳淇℃伅
+     *
+     * @param
+     * @return
+     */
+    private Integer syncOperItem(PatMedOperation operation) {
+        if(ObjectUtils.isNotEmpty(operation.getId())){
+            operation.setOpid(operation.getId().toString());
+        }
+        operation.setUpdateTime(new Date());
+        otherVisitFacade.updateOperation(operation);
+
+        Integer count = 0;
+        if(StringUtils.isNotEmpty(operation.getOpid())){
+            PatMedOperationItem patMedOperationItem = new PatMedOperationItem();
+            //patMedOperation.opReqid = patMedOperationItem.operationid
+            List<PatMedOperationItem> patMedOperationItems = new ArrayList<>();
+            if (ObjectUtils.isNotEmpty(operation.getOpreqid())){
+                patMedOperationItem.setOperationid(operation.getOpreqid());
+                patMedOperationItems = chMapper.selectOperItemList(patMedOperationItem);
+            }else {
+                log.info("鍚屾鎵嬫湳璇︽儏淇℃伅:鎵嬫湳鐢宠鍗旾D涓虹┖!");
+                return count;
+            }
+
+            PatMedOperationItem operItem = new PatMedOperationItem();
+            operItem.setOperationid(operation.getOpreqid());
+            List<PatMedOperationItem> patMedOperationItems1 = otherVisitFacade.selectOperationItemList(operItem);
+
+            Map<String, List<PatMedOperationItem>> maps = ArrayListUtils.splitListsById(patMedOperationItems,
+                    patMedOperationItems1, PatMedOperationItem::getOperationid);
+            //鍙湪瑙嗗浘鐨勬暟鎹笉鍦ㄦ湰鍦扮殑鏁版嵁锛屾墽琛屾柊澧炴搷浣�
+            List<PatMedOperationItem> addItems = maps.get("onlyIn1");
+            //鍙湪鏈湴鐨勬暟鎹笉鍦ㄨ鍥剧殑鏁版嵁锛屾墽琛屽垹闄ゆ搷浣�
+            List<PatMedOperationItem> delItems = maps.get("onlyIn2");
+            //閲嶅彔鐨勬暟鎹紝鎵ц鏇存柊鎿嶄綔 patMedOperationItems鐨勬暟鎹�
+            List<PatMedOperationItem> editItems = maps.get("common");
+
+            log.info("鍚屾鎵嬫湳璇︽儏淇℃伅鏁伴噺" + patMedOperationItems.size());
+
+            try{
+                for (PatMedOperationItem operationItem : addItems) {
+                    operationItem.setInhospstate(operation.getInhospstate());
+                    operationItem.setSerialnum(operation.getSerialnum());
+                    operationItem.setOpid(operation.getId().toString());
+                    operationItem.setOperationid(operation.getOpreqid());
+                    operationItem.setOpercheckFlag("0");
+                    operationItem.setCreateTime(new Date());
+                    count += otherVisitFacade.insertOperationItem(operationItem);
+                }
+
+                for (PatMedOperationItem operationItem : delItems) {
+                    operationItem.setUpdateTime(new Date());
+                    count += otherVisitFacade.deleteOperationItemByOperationid(operationItem.getOperationid());
+                }
+
+                for (PatMedOperationItem operationItem : editItems) {
+                    operationItem.setInhospstate(operation.getInhospstate());
+                    operationItem.setSerialnum(operation.getSerialnum());
+                    operationItem.setOpid(operation.getId().toString());
+                    operationItem.setOperationid(operation.getOpreqid());
+                    operationItem.setUpdateTime(new Date());
+                    count += otherVisitFacade.updateOperationItemByOperationid(operationItem);
+                }
+                log.info("鍚屾鎵嬫湳id={}璇︽儏淇℃伅鏁伴噺, 鏂板{}鏉★紝鍒犻櫎{}鏉★紝淇敼{}鏉�", operation.getId(), addItems.size(), delItems.size(), editItems.size());
+            } catch (Exception ex) {
+                log.info("鍚屾鎵嬫湳璇︽儏淇℃伅:" + ex.getMessage());
+            }
+
+//            try {
+//                otherVisitFacade.deleteHardOperationItemByOpId(operation.getOpid());
+//                count += otherVisitFacade.insertOperationItems(patMedOperationItems);
+//            }catch (Exception ex) {
+//                log.info("鍚屾鎵嬫湳璇︽儏淇℃伅:" + ex.getMessage());
+//            }
+        }
+        return count;
+    }
+
+    private Map<String, Long> buildOperationPatIdHisMap(List<PatMedOperation> operations) {
+        List<String> patidHiss = operations.stream()
+                .map(PatMedOperation::getPatidHis)
+                .filter(StringUtils::isNotEmpty)
+                .distinct()
+                .collect(Collectors.toList());
+
+        if (CollectionUtils.isEmpty(patidHiss)) {
+            return new HashMap<>();
+        }
+
+        return patArchiveMapper.selectPatArchiveByPatidHiss(patidHiss).stream()
+                .filter(item -> StringUtils.isNotEmpty(item.getPatidHis()) && item.getId() !=
+                        null)
+                .collect(Collectors.toMap(
+                        PatArchive::getPatidHis,
+                        PatArchive::getId,
+                        (a, b) -> a
+                ));
+    }
+
+    private Long syncSinglePatient(String patidHis) {
+        if (StringUtils.isEmpty(patidHis)) {
+            return null;
+        }
+
+        PatArchive hisQuery = new PatArchive();
+        hisQuery.setPatidHis(patidHis);
+        hisQuery.setPageSize(5);
+        List<PatArchive> hisArchives = chMapper.selectPatArchiveList(hisQuery);
+        if (CollectionUtils.isEmpty(hisArchives)) {
+            return null;
+        }
+
+        PatArchive localQuery = new PatArchive();
+        localQuery.setPatidHis(patidHis);
+        List<PatArchive> localArchives = patArchiveMapper.selectPatArchiveList(localQuery);
+
+        PatArchive hisArchive = hisArchives.get(0);
+        if (CollectionUtils.isNotEmpty(localArchives)) {
+            hisArchive.setId(localArchives.get(0).getId());
+            hisArchive.setUpdateTime(new Date());
+            patArchiveMapper.updatePatArchive(hisArchive);
+            return localArchives.get(0).getId();
+        } else {
+            hisArchive.setCreateTime(new Date());
+            patArchiveMapper.insertPatArchiveSingle(hisArchive);
+            return hisArchive.getId();
+        }
     }
 
     @Override
@@ -331,20 +751,20 @@
                 //鍏ラ櫌
                 pm.setInhospstate("0");
                 pm.setCreateTime(new Date());
-                patMedInhospMapper.insertPatMedInhosp(pm);
+                inhospVisitFacade.insertPatMedInhosp(pm);
             } else if (!Objects.isNull(patMedInhosp.getStartOutHospTime()) && !Objects.isNull(patMedInhosp.getEndOutHospTime())) {
                 //鍑洪櫌
                 pm.setInhospstate("1");
                 pm.setUpdateTime(new Date());
                 PatMedInhosp pmi = new PatMedInhosp();
                 pmi.setSerialnum(pm.getSerialnum());
-                List<PatMedInhosp> patMedInhospList1 = patMedInhospMapper.selectPatMedInhospList(pmi);
+                List<PatMedInhosp> patMedInhospList1 = inhospVisitFacade.selectPatMedInhospList(pmi);
                 if (CollectionUtils.isEmpty(patMedInhospList1)) {
                     pm.setCreateTime(new Date());
-                    patMedInhospMapper.insertPatMedInhosp(pm);
+                    inhospVisitFacade.insertPatMedInhosp(pm);
                 } else {
                     pm.setInhospid(patMedInhospList1.get(0).getInhospid());
-                    patMedInhospMapper.updatePatMedInhosp(pm);
+                    inhospVisitFacade.updatePatMedInhosp(pm);
                 }
 
             }
@@ -411,7 +831,7 @@
                 patArchiveMapper.insertPatArchiveSingle(patArchives.get(0));
                 patMedOuthosp1.setPatid(patArchives.get(0).getId());
             }
-            i = patMedOuthospMapper.insertPatMedOuthosp(patMedOuthosp1);
+            i = patMedOuthospService.insertPatMedOuthosp(patMedOuthosp1);
         }
 
         return i;
@@ -441,48 +861,138 @@
         return size;
     }
 
+    /**
+     * 寮傛鍚屾鐢ㄦ埛淇℃伅锛氭帴鍙g珛鍗宠繑鍥烇紝瀹為檯鍚屾浜ょ粰绾跨▼姹犲悗鍙版墽琛屻��
+     * 浣跨敤 AtomicBoolean 闃叉閲嶅鎻愪氦瀵艰嚧澶氫釜鍏ㄩ噺鍚屾浠诲姟骞跺彂鎵ц銆�
+     */
+    @Override
+    public boolean selectUserListAsync(SysUser sysUser) {
+        if (!userSyncRunning.compareAndSet(false, true)) {
+            log.warn("鐢ㄦ埛淇℃伅鍚屾浠诲姟姝e湪鎵ц涓紝蹇界暐鏈鎻愪氦");
+            return false;
+        }
+        try {
+            taskExecutor.execute(() -> {
+                long start = System.currentTimeMillis();
+                log.info("鐢ㄦ埛淇℃伅寮傛鍚屾浠诲姟寮�濮嬫墽琛�");
+                try {
+                    Integer count = selectUserList(sysUser);
+                    log.info("鐢ㄦ埛淇℃伅寮傛鍚屾浠诲姟鎵ц瀹屾垚锛屽鐞嗘暟閲忥細{}锛岃�楁椂锛歿}ms",
+                            count, System.currentTimeMillis() - start);
+                } catch (Throwable e) {
+                    log.error("鐢ㄦ埛淇℃伅寮傛鍚屾浠诲姟鎵ц澶辫触锛岃�楁椂锛歿}ms",
+                            System.currentTimeMillis() - start, e);
+                } finally {
+                    userSyncRunning.set(false);
+                }
+            });
+            return true;
+        } catch (RuntimeException e) {
+            userSyncRunning.set(false);
+            log.error("鐢ㄦ埛淇℃伅寮傛鍚屾浠诲姟鎻愪氦澶辫触", e);
+            return false;
+        }
+    }
+
     @Override
     public Integer selectUserList(SysUser sysUser) {
         List<SysUser> sysUserList = chMapper.selectUserList(sysUser);
         SysUser suerTemp = new SysUser();
+        //鐢ㄦ埛-鏈烘瀯鍏崇郴-绉戝
         List<SysUserDept> sysUserDeptAll = chMapper.yhyksxx(suerTemp);
+        //鐢ㄦ埛-鏈烘瀯鍏崇郴-鐥呭尯
+        List<SysUserDept> sysUserDeptBfAll = chMapper.yhybfxx(suerTemp);
         //鐢ㄦ埛-闄㈠尯鍏崇郴
         List<SysUserOrg> sysUserOrgAll = chMapper.yhyyqxx(suerTemp);
 
         log.info("sysUserList鐨勯噰闆嗗埌鐨勬暟閲忎负锛歿}", sysUserList.size());
         int i = 0;// sysUser2Mapper.batchUser(sysUserList);
         for (SysUser sysUser1 : sysUserList) {
-//            log.info("sysUser1鐨処D涓猴細{}", sysUser1.getUserId());
-//            log.info("sysUser1鐨凥ISUSERID涓猴細{}", sysUser1.getHisUserId());
             if (StringUtils.isEmpty(sysUser1.getHisUserId())) continue;
             SysUser suTemp = new SysUser();
             suTemp.setHisUserId(sysUser1.getHisUserId());
             List<SysUser> usersTemp = sysUser2Mapper.selectUserList(suTemp);
+
+            //鏂板鐢ㄦ埛涓庣瀹�
+            List<SysUserDept> sysUserDept = sysUserDeptAll.stream().filter((SysUserDept b) ->
+                    b.getUserCode().equals(sysUser1.getHisUserId())).collect(Collectors.toList());
+            //鏂板鐢ㄦ埛涓庣梾鍖�
+            List<SysUserDept> sysUserDeptBf = sysUserDeptBfAll.stream().filter((SysUserDept b) ->
+                    b.getUserCode().equals(sysUser1.getHisUserId())).collect(Collectors.toList());
+            //鏂板鐢ㄦ埛涓庨櫌鍖�
+            List<SysUserOrg> sysUserOrg = sysUserOrgAll.stream().filter((SysUserOrg o) ->
+                    o.getUserId().equals(sysUser1.getHisUserId())).collect(Collectors.toList());
+
+            List<String> userDepts = sysUserDept.stream().map(SysUserDept::getDeptCode).
+                    distinct().collect(Collectors.toList());
+
+            List<String> userDeptBfs = sysUserDeptBf.stream().map(SysUserDept::getDeptCode).
+                    distinct().collect(Collectors.toList());
+
+            //鍜宷ueryHospUserInfoList閲囬泦鐨勬暟鎹牸寮忎繚鎸佷竴鑷�
+            List<List<String>> userDeptsList = new ArrayList<>();
+            if(!userDepts.isEmpty()){
+                for(String userDept: userDepts){
+                    List<String> uDept = new ArrayList<>();
+                    uDept.add(userDept);
+                    userDeptsList.add(uDept);
+                }
+            }
+            List<List<String>> userDeptBfsList = new ArrayList<>();
+            if(!userDeptBfs.isEmpty()){
+                for(String userBfDept: userDeptBfs){
+                    List<String> uBfDept = new ArrayList<>();
+                    uBfDept.add(userBfDept);
+                    userDeptBfsList.add(uBfDept);
+                }
+            }
+
             if (usersTemp.size() > 0) {
                 sysUser1.setUserId(usersTemp.get(0).getUserId());
                 sysUser1.setUserName(sysUser1.getHisUserId());
+                //瀵瑰簲 SysUserServiceImpl selectUserByUserName2 191琛�
+                if (!org.springframework.util.CollectionUtils.isEmpty(sysUserOrg)) {
+                    sysUser1.setOrgid(sysUserOrg.get(0).getOrgid());
+                    sysUser1.setCampusid(sysUserOrg.get(0).getCampusid());
+                }
+                //灏嗛儴闂ㄦ垜鐥呭尯鏀惧埌鎸囧畾瀛楁涓�
+                Gson gson = new Gson();
+                sysUser1.setHospInfo(gson.toJson(userDeptsList));
+                sysUser1.setDeptInfo(gson.toJson(userDeptBfsList));
+
                 sysUser2Mapper.updateUser(sysUser1);
             } else {
                 sysUser1.setUserName(sysUser1.getHisUserId());
+                //灏嗛儴闂ㄦ垜鐥呭尯鏀惧埌鎸囧畾瀛楁涓�
+                Gson gson = new Gson();
+                sysUser1.setHospInfo(gson.toJson(userDeptsList));
+                sysUser1.setDeptInfo(gson.toJson(userDeptBfsList));
+
                 sysUser2Mapper.insertUser(sysUser1);
+                //瀵瑰簲 SysUserServiceImpl selectUserByUserName2 191琛�
+                if (!org.springframework.util.CollectionUtils.isEmpty(sysUserOrg)) {
+                    sysUser1.setOrgid(sysUserOrg.get(0).getOrgid());
+                    sysUser1.setCampusid(sysUserOrg.get(0).getCampusid());
+                }
                 usersTemp = sysUser2Mapper.selectUserList(suTemp);
             }
-
-            //鏂板鐢ㄦ埛涓庨儴闂�
-            //List<SysUserDept> sysUserDept = chMapper.yhyksxx(sysUser1);
-            List<SysUserDept> sysUserDept = sysUserDeptAll.stream().filter((SysUserDept b) -> b.getUserCode().equals(sysUser1.getHisUserId())).collect(Collectors.toList());
-
             for (SysUserDept sud : sysUserDept) {
-                if (usersTemp.size() > 0) {
+                if (!usersTemp.isEmpty()) {
+                    sud.setDeptType("1");
                     sud.setUserId(usersTemp.get(0).getUserId());
                     sysUserDeptMapper.insertSysUserDept(sud);
                 }
             }
-            //鏂板鐢ㄦ埛涓庨櫌鍖�
-            List<SysUserOrg> sysUserOrg = sysUserOrgAll.stream().filter((SysUserOrg o) -> o.getUserId().equals(sysUser1.getHisUserId())).collect(Collectors.toList());
+            for (SysUserDept sudb : sysUserDeptBf) {
+                if (!usersTemp.isEmpty()) {
+                    sudb.setDeptType("2");
+                    sudb.setUserId(usersTemp.get(0).getUserId());
+                    sysUserDeptMapper.insertSysUserDept(sudb);
+                }
+            }
             for (SysUserOrg suo : sysUserOrg) {
-                if (usersTemp.size() > 0) {
-                    suo.setUserId(usersTemp.get(0).getUserId());
+                if (!usersTemp.isEmpty()) {
+                    suo.setUserId(usersTemp.get(0).getUserId().toString());
                     sysUserOrgMapper.insertSysUserOrg(suo);
                 }
             }
@@ -498,7 +1008,12 @@
         log.info("selectDeptList鐨勯噰闆嗗埌鐨勬暟閲忎负锛歿}", sysDepts.size());
         // count = sysDept2Mapper.batchDept(sysDepts);
         for (SysDept row : sysDepts) {
-            SysDept sysDeptTemp = sysDept2Mapper.selectDeptByCode(row.getDeptCode(), null);
+            // 绉戝鍜岀梾鍖哄彲鑳藉叡鐢ㄥ悓涓�涓� dept_code锛屽繀椤绘寜 dept_type + orgid 绮剧‘瀹氫綅锛屽惁鍒� selectOne 浼氳繑鍥炲鏉�
+            if (StringUtils.isEmpty(row.getDeptCode())) {
+                log.warn("selectDeptList璺宠繃deptCode涓虹┖鐨勮褰曪細{}", row);
+                continue;
+            }
+            SysDept sysDeptTemp = sysDept2Mapper.selectDeptByCodeAndType(row.getDeptCode(), row.getOrgid(), row.getDeptType());
             if (sysDeptTemp != null && sysDeptTemp.getDeptName() != null) {
                 row.setDeptId(sysDeptTemp.getDeptId());
                 count += sysDept2Mapper.updateDept(row);

--
Gitblit v1.9.3