From 9db295a6e2a7be9ab74e23d3fcf002086cc5713e Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期五, 04 九月 2026 16:43:51 +0800
Subject: [PATCH] 【市一】处理市一同步

---
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java |  214 ++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 192 insertions(+), 22 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 5569719..524a234 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
@@ -4,10 +4,13 @@
 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.domain.*;
+import com.smartor.domain.entity.ServiceSubtaskEntity;
 import com.smartor.mapper.*;
 import com.smartor.service.IPatMedOuthospService;
 import lombok.extern.slf4j.Slf4j;
@@ -60,6 +63,9 @@
     private PatArchiveMapper patArchiveMapper;
 
     @Autowired
+    private ServiceSubtaskMapper serviceSubtaskMapper;
+
+    @Autowired
     private ThreadPoolTaskExecutor taskExecutor;
 
     @Autowired
@@ -67,6 +73,9 @@
 
     @Autowired
     private UtilsMapper utilsMapper;
+
+    @Autowired
+    private RedisCache redisCache;
 
     private static final long SHARDING_THRESHOLD = 5_000_000L;
     private static final String PAT_ARCHIVE_TABLE = "pat_archive";
@@ -108,7 +117,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) {
@@ -334,16 +343,34 @@
         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.setOpid(operation.getOpid());
+                oper.setOpreqid(operation.getOpreqid());
                 List<PatMedOperation> patMedOperations1 = patMedOperationMapper.selectPatMedOperationList(oper);
                 if (CollectionUtils.isNotEmpty(patMedOperations1)) {
                     operation.setId(patMedOperations1.get(0).getId());
                     operation.setUpdateTime(new Date());
-                    count += patMedOperationMapper.updatePatMedOperation(patMedOperations1.get(0));
+                    count += patMedOperationMapper.updatePatMedOperation(operation);
                     syncOperItem(operation);
                 } else {
                     operation.setCreateTime(new Date());
@@ -357,6 +384,59 @@
         return count;
     }
 
+    private Integer cancelOper(PatMedOperation oper){
+        PatMedOperation operationVo = new PatMedOperation();
+        operationVo.setOpreqid(oper.getOpreqid());
+        List<PatMedOperation> operations = patMedOperationMapper.selectPatMedOperationList(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
+                = patMedOperationItemMapper.selectOperationItemList(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());
+        patMedOperationMapper.updatePatMedOperation(operation);
+        patMedOperationItemMapper.deleteSoftPatMedOperationItemByOpId(operation.getOpid());
+        return 1;
+    }
+
     /**
      * 鍚屾鎵嬫湳淇℃伅
      *
@@ -364,34 +444,124 @@
      * @return
      */
     private Integer syncOperItem(PatMedOperation operation) {
+        if(ObjectUtils.isNotEmpty(operation.getId())){
+            operation.setOpid(operation.getId().toString());
+        }
+        operation.setUpdateTime(new Date());
+        patMedOperationMapper.updatePatMedOperation(operation);
+
         Integer count = 0;
-        PatMedOperationItem patMedOperationItem = new PatMedOperationItem();
-        patMedOperationItem.setOrgid(operation.getOrgid());
         if(StringUtils.isNotEmpty(operation.getOpid())){
-            patMedOperationItem.setOpid(Long.valueOf(operation.getOpid()));
+            PatMedOperationItem patMedOperationItem = new PatMedOperationItem();
+            //patMedOperation.opReqid = patMedOperationItem.operationid
+            patMedOperationItem.setOperationid(operation.getOpreqid());
             List<PatMedOperationItem> patMedOperationItems = chMapper.selectOperItemList(patMedOperationItem);
+
+            PatMedOperationItem operItem = new PatMedOperationItem();
+            operItem.setOperationid(operation.getOpreqid());
+            List<PatMedOperationItem> patMedOperationItems1 = patMedOperationItemMapper.selectPatMedOperationItemList(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());
-            for (PatMedOperationItem operationItem : patMedOperationItems) {
-                try {
-                    PatMedOperationItem operItem = new PatMedOperationItem();
-                    operItem.setOpid(operationItem.getOpid());
-                    operItem.setOperationid(operationItem.getOperationid());
-                    List<PatMedOperationItem> patMedOperationItems1 = patMedOperationItemMapper.selectPatMedOperationItemList(operItem);
-                    if (CollectionUtils.isNotEmpty(patMedOperationItems1)) {
-                        operationItem.setId(patMedOperationItems1.get(0).getId());
-                        operationItem.setUpdateTime(new Date());
-                        count += patMedOperationItemMapper.updatePatMedOperationItem(operationItem);
-                    } else {
-                        operation.setCreateTime(new Date());
-                        count += patMedOperationItemMapper.insertPatMedOperationItem(operationItem);
-                    }
-                } catch (Exception ex) {
-                    log.info("鍚屾鎵嬫湳璇︽儏淇℃伅:" + ex.getMessage());
+
+            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 += patMedOperationItemMapper.insertPatMedOperationItem(operationItem);
                 }
+
+                for (PatMedOperationItem operationItem : delItems) {
+                    operationItem.setUpdateTime(new Date());
+                    count += patMedOperationItemMapper.deletePatMedOperationItemByOperationid(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 += patMedOperationItemMapper.updatePatMedOperationItemByOperationid(operationItem);
+                }
+                log.info("鍚屾鎵嬫湳id={}璇︽儏淇℃伅鏁伴噺, 鏂板{}鏉★紝鍒犻櫎{}鏉★紝淇敼{}鏉�", operation.getId(), addItems.size(), delItems.size(), editItems.size());
+            } catch (Exception ex) {
+                log.info("鍚屾鎵嬫湳璇︽儏淇℃伅:" + ex.getMessage());
             }
+
+//            try {
+//                patMedOperationItemMapper.deleteHardPatMedOperationItemByOpId(operation.getOpid());
+//                count += patMedOperationItemMapper.insertPatMedOperationItems(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
     public Integer selectPatMedInhospList(PatMedInhosp patMedInhosp) {
         List<PatMedInhosp> patMedInhospList = chMapper.selectPatMedInhospList(patMedInhosp);

--
Gitblit v1.9.3