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/resources/mapper/quartz/CollectHISMapper.xml | 5
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java | 140 +++++++++++++++++++---
smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml | 90 +++++++++++++++
ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayListUtils.java | 58 +++++++++
smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java | 16 ++
5 files changed, 284 insertions(+), 25 deletions(-)
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayListUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayListUtils.java
new file mode 100644
index 0000000..0b3d55d
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayListUtils.java
@@ -0,0 +1,58 @@
+package com.ruoyi.common.utils;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+public class ArrayListUtils {
+
+ /**
+ * 鏍规嵁ID灏嗕袱涓狶ist鎷嗗垎涓猴細浠匧ist1鐙湁銆佷粎List2鐙湁銆佷袱鑰呭叡鏈�
+ *
+ * @param list1 鍒楄〃1
+ * @param list2 鍒楄〃2
+ * @param idExtractor ID鎻愬彇鍑芥暟
+ * @return Map鍖呭惈涓変釜Key: "onlyIn1", "onlyIn2", "common"
+ */
+ public static <T, K> Map<String, List<T>> splitListsById(List<T> list1, List<T> list2, Function<T, K> idExtractor) {
+ // 1. 鎻愬彇ID闆嗗悎锛岀敤浜庡揩閫熷垽鏂瓨鍦ㄦ��
+ Set<K> ids1 = list1.stream().map(idExtractor).collect(Collectors.toSet());
+ Set<K> ids2 = list2.stream().map(idExtractor).collect(Collectors.toSet());
+
+ // 2. 璁$畻ID灞傞潰鐨勫樊闆嗗拰浜ら泦
+ Set<K> onlyIn1Ids = new HashSet<>(ids1);
+ onlyIn1Ids.removeAll(ids2); // List1鐙湁鐨処D
+
+ Set<K> onlyIn2Ids = new HashSet<>(ids2);
+ onlyIn2Ids.removeAll(ids1); // List2鐙湁鐨処D
+
+ Set<K> commonIds = new HashSet<>(ids1);
+ commonIds.retainAll(ids2); // 鍏辨湁鐨処D
+
+ // 3. 鏍规嵁ID杩囨护鍘熷瀵硅薄鍒楄〃
+ List<T> onlyIn1 = list1.stream()
+ .filter(item -> onlyIn1Ids.contains(idExtractor.apply(item)))
+ .collect(Collectors.toList());
+
+ List<T> onlyIn2 = list2.stream()
+ .filter(item -> onlyIn2Ids.contains(idExtractor.apply(item)))
+ .collect(Collectors.toList());
+
+ // 娉ㄦ剰锛氬叡鏈夐儴鍒嗛�氬父鍚堝苟涓や釜鍒楄〃涓殑鍏冪礌锛屾垨鑰呭彧鍙栧叾涓竴涓��
+ // 杩欓噷绛栫暐鏄細淇濈暀list1鍜宭ist2涓墍鏈塈D閲嶅悎鐨勫璞★紙濡傛灉涓氬姟瑕佹眰鍘婚噸鎴栧悎骞跺璞″睘鎬э紝闇�棰濆澶勭悊锛�
+ List<T> common = new ArrayList<>();
+ common.addAll(list1.stream()
+ .filter(item -> commonIds.contains(idExtractor.apply(item)))
+ .collect(Collectors.toList()));
+// common.addAll(list2.stream()
+// .filter(item -> commonIds.contains(idExtractor.apply(item)))
+// .collect(Collectors.toList()));
+
+ Map<String, List<T>> result = new HashMap<>();
+ result.put("onlyIn1", onlyIn1);
+ result.put("onlyIn2", onlyIn2);
+ result.put("common", common);
+
+ return result;
+ }
+}
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 3760141..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";
@@ -339,6 +348,11 @@
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());
@@ -351,12 +365,12 @@
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());
@@ -370,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;
+ }
+
/**
* 鍚屾鎵嬫湳淇℃伅
*
@@ -377,34 +444,61 @@
* @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(operation.getOpid());
- patMedOperationItem.setLastStartTime(operation.getLastStartTime());
- patMedOperationItem.setLastEndTime(operation.getLastEndTime());
+ 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 {
+
+ try{
+ for (PatMedOperationItem operationItem : addItems) {
operationItem.setInhospstate(operation.getInhospstate());
operationItem.setSerialnum(operation.getSerialnum());
- 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());
+ 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 {
diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml
index 9489fe5..c88cd19 100644
--- a/ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml
+++ b/ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml
@@ -826,6 +826,7 @@
o.paname,
o.opreqid,
o.opreqcode,
+ o.canceltime,
o.opsstatus,
o.optypecode,
o.optypename,
@@ -887,7 +888,7 @@
o.nurse_name ,
o.check_flag ,
o.long_task_reason,
- o.opid ,
+ null as opid ,
o.opcode ,
o.opdesc,
o.oplevelcode ,
@@ -910,7 +911,7 @@
resultMap="PatMedOperationItemResult">
select
oi.operationid,
- oi.opid,
+ null as opid,
oi.opcode,
oi.opdesc,
oi.main_flag,
diff --git a/smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java b/smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java
index 9148404..440bf66 100644
--- a/smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java
+++ b/smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java
@@ -53,6 +53,14 @@
public int updatePatMedOperationItem(PatMedOperationItem patMedOperationItem);
/**
+ * 淇敼鎮h�呮鏌ユ楠岃褰曞瓙
+ *
+ * @param patMedOperationItem 鎮h�呮鏌ユ楠岃褰曞瓙
+ * @return 缁撴灉
+ */
+ public int updatePatMedOperationItemByOperationid(PatMedOperationItem patMedOperationItem);
+
+ /**
* 鍒犻櫎鎮h�呮鏌ユ楠岃褰曞瓙
*
* @param id 鎮h�呮鏌ユ楠岃褰曞瓙涓婚敭
@@ -79,6 +87,14 @@
/**
* 鍒犻櫎鎮h�呮鏌ユ楠岃褰曞瓙
*
+ * @param operationid 鎮h�呮鏌ユ楠岃褰曞瓙涓婚敭
+ * @return 缁撴灉
+ */
+ public int deletePatMedOperationItemByOperationid(Long operationid);
+
+ /**
+ * 鍒犻櫎鎮h�呮鏌ユ楠岃褰曞瓙
+ *
* @param opid 鎮h�呮鏌ユ楠岃褰曞瓙涓婚敭
* @return 缁撴灉
*/
diff --git a/smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml b/smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml
index ec8da0d..f654970 100644
--- a/smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml
+++ b/smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml
@@ -309,6 +309,86 @@
where id = #{id}
</update>
+ <update id="updatePatMedOperationItemByOperationid" parameterType="com.smartor.domain.PatMedOperationItem">
+ update pat_med_operation_item
+ <trim prefix="SET" suffixOverrides=",">
+ <if test="opid != null">opid =
+ #{opid},
+ </if>
+ <if test="opcode != null">opcode =
+ #{opcode},
+ </if>
+ <if test="opdesc != null">opdesc =
+ #{opdesc},
+ </if>
+ <if test="mainFlag != null">main_flag =
+ #{mainFlag},
+ </if>
+ <if test="incitypecode != null">incitypecode =
+ #{incitypecode},
+ </if>
+ <if test="incitypedesc != null">incitypedesc =
+ #{incitypedesc},
+ </if>
+ <if test="oplevelcode != null">oplevelcode =
+ #{oplevelcode},
+ </if>
+ <if test="opleveldesc != null">opleveldesc =
+ #{opleveldesc},
+ </if>
+ <if test="opposition != null">opposition =
+ #{opposition},
+ </if>
+ <if test="delFlag != null">del_flag =
+ #{delFlag},
+ </if>
+ <if test="updateBy != null">update_by =
+ #{updateBy},
+ </if>
+ <if test="updateTime != null">update_time =
+ #{updateTime},
+ </if>
+ <if test="createBy != null">create_by =
+ #{createBy},
+ </if>
+ <if test="createTime != null">create_time =
+ #{createTime},
+ </if>
+ <if test="isupload != null">isupload =
+ #{isupload},
+ </if>
+ <if test="uploadTime != null">upload_time =
+ #{uploadTime},
+ </if>
+ <if test="orgid != null">orgid =
+ #{orgid},
+ </if>
+ <if test="pguid != null">pguid =
+ #{pguid},
+ </if>
+ <if test="guid != null">guid =
+ #{guid},
+ </if>
+ <if test="pid != null">pid =
+ #{pid},
+ </if>
+ <if test="opercheckFlag != null">opercheck_flag =
+ #{opercheckFlag},
+ </if>
+ <if test="longTaskReason != null">long_task_reason =
+ #{longTaskReason},
+ </if>
+ <if test="inhospstate != null">inhospstate =
+ #{inhospstate},
+ </if>
+ <if test="serialnum != null">serialnum =
+ #{serialnum},
+ </if>
+ </trim>
+ where operationid = #{operationid}
+ and opcode = #{opcode}
+ </update>
+
<insert id="insertPatMedOperationItems">
insert into pat_med_operation_item
<trim prefix="(" suffix=")" suffixOverrides=",">
@@ -442,8 +522,18 @@
<delete id="deleteHardPatMedOperationItemByOpId" parameterType="String">
delete from pat_med_operation_item
where opid = #{opid}
+ and opercheck_flag != 1
</delete>
+ <update id="deletePatMedOperationItemByOperationid" parameterType="Long">
+ update pat_med_operation_item
+ <trim prefix="SET" suffixOverrides=",">
+ del_flag =1
+ </trim>
+ where operationid = #{operationid}
+ and opercheck_flag != 1
+ </update>
+
<update id="deleteSoftPatMedOperationItemByOpId" parameterType="String">
update pat_med_operation_item
<trim prefix="SET" suffixOverrides=",">
--
Gitblit v1.9.3