陈昶聿
4 天以前 9db295a6e2a7be9ab74e23d3fcf002086cc5713e
【市一】处理市一同步
已修改4个文件
已添加1个文件
309 ■■■■■ 文件已修改
ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayListUtils.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java 140 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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将两个List拆分为:仅List1独有、仅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独有的ID
        Set<K> onlyIn2Ids = new HashSet<>(ids2);
        onlyIn2Ids.removeAll(ids1); // List2独有的ID
        Set<K> commonIds = new HashSet<>(ids1);
        commonIds.retainAll(ids2); // å…±æœ‰çš„ID
        // 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和list2中所有ID重合的对象(如果业务要求去重或合并对象属性,需额外处理)
        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;
    }
}
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和sendstate=1,2,3,5,7去查询一下,service_subtask里是否有正在执行的任务,
        //有的话,立即停了
        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);
        //去redis中,查询是否有subid,有的话移除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 {
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,
smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java
@@ -53,6 +53,14 @@
    public int updatePatMedOperationItem(PatMedOperationItem patMedOperationItem);
    /**
     * ä¿®æ”¹æ‚£è€…检查检验记录子
     *
     * @param patMedOperationItem æ‚£è€…检查检验记录子
     * @return ç»“æžœ
     */
    public int updatePatMedOperationItemByOperationid(PatMedOperationItem patMedOperationItem);
    /**
     * åˆ é™¤æ‚£è€…检查检验记录子
     *
     * @param id æ‚£è€…检查检验记录子主键
@@ -79,6 +87,14 @@
    /**
     * åˆ é™¤æ‚£è€…检查检验记录子
     *
     * @param operationid æ‚£è€…检查检验记录子主键
     * @return ç»“æžœ
     */
    public int deletePatMedOperationItemByOperationid(Long operationid);
    /**
     * åˆ é™¤æ‚£è€…检查检验记录子
     *
     * @param opid æ‚£è€…检查检验记录子主键
     * @return ç»“æžœ
     */
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=",">