《基于 LatentFactor + Redis + ES 实现动态药房分配方法》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 近期刚转战 CSDN,会严格把控文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 写在前面的话
    • 背景技术
    • 发明目的
    • 具体方案
      • 一、动态药房分配前置准备
      • 二、动态药房分配实现逻辑
      • 三、动态药房分配流程
    • LatentFactor 矩阵因子推导示例
    • 总结陈词


写在前面的话

本篇文章分享一下博主所在公司的动态药房分配的实现方案。
主要是基于 LatentFactor + Redis + ES 实现,由于涉及公司代码要求,内容主要以方案介绍为主,有需要探讨的可以留言。
好,让我们开始。


背景技术

医院药房是集管理、技术、经营、服务等于一体的综合性科室,是医院的重要职能部门之一,其管理影响着医院的药品管理水平和服务质量。随着医院管理模式不断改革和优化,在大规模的医院,药房逐渐趋于多元化管理,不再是以前的单点综合大药房。
门诊和住院往往会根据实际需要,配套建设不同的发药药房,不同的门诊或住院科室开药可以方便患者就近取药。同个科室在不同时间或工作日,都有可能动态配套不同发药药房。
传统模式下,医院采取维护药房配置清单,存储在关系型数据库的二维表中,管理不同维度下药房的分配情况。当医生开单时候将会访问药房配置表,动态获取符合要求的药房,并提示患者前往取药。
由于全院医生的开单操作十分频繁,判定分配药房这一逻辑,需要先从关系表加载药房配置表获取数据后,再进行大量的计算规则判断,在高并发情况下,整体接口响应效率较低,严重影响医生的开药效率和患者就医体验。同时,药房配置规则仅仅考虑单维度情况下的规则分配,因此,最终得出的药房结果,可能存在不是最优药房的情况。


发明目的

本方案发明的目的是基于ES 和 Redis 的相关技术领域,实现一种动态药房分配模式,最终形成一种高效的、更具科学性的的药房管理方法。
该方案具备如下特点:
1、支持维护多维度药房分配规则,包含但不限于科室、时间段、距离、药品库存等,改变了传统药房分配模式采用的单一因素简单验证方式,使得出的药房结果更加合理化和人性化;
2、利用 ES 和 Redis 等技术带来的快速查询机制,分别存储药房规则配置和药房分配结果,改变了传统药房分配模式采用关系型数据库的单独二维配置表方式带来的性能瓶颈,为高频开单操作下的药房分配逻辑的性能带来显著提升;
3、支持以定时策略对预置规则进行不断校准,排除不合理的因素,使规则制定更具备智能化和合理性等特性;


具体方案

本方案是一种基于 LatentFactor + Redis + ES 实现的动态药房分配方法,具体技术方案实现如下。

一、动态药房分配前置准备

1、部署 ES 环境,程序引入 ES 相关依赖,并进行相关配置与功能集成,ES 定义不同维度下的药房分配规则,建立相关结构索引;
2、部署 Redis 环境,程序引入 Redis 相关依赖,并进行相关配置与功能集成,Redis 定义药房规则提取的存储结构;
3、预先维护药房分配规则,包含但不限于如下:不同时间段下药房分配规则、不同科室下的默认药房分配规则、药房与药品库存的对照规则,医院科室与药房距离分布规则等等;
4、将上述维护好的规则,进行加工处理,同步分解各科室所有时间段规则数据,自动往ES的各个索引,写入动态药房基表数据。


二、动态药房分配实现逻辑

若采用动态药房分配模式,当产生药品开单时,其具体流程如下:
1、医生在医生工作站进行下医嘱或处方等操作时,相应的后端HIS服务将接收当前科室、时间、药品等信息,从ES的不同规则索引中,快速查找并命中数据,提取出相应的药房初始设定的规则;
2、程序将提取到的规则,按科室、时间段、各项药品库存、距离等不同策略,进行药房分配运算,得出当前入参情况下的最优药房,具体实现步骤如下;
a、根据入参传递的开单科室,从ES中提取出该科室对应的药房列表,列表中的每一个药房配置项,都配置了推荐因子,程序将药房列表根据推荐因子从大到小排列,暂存为临时变量A,利用LatentFactor潜在因子算法的矩阵编排,得到矩阵清单,“药房/科室 - 潜在因子矩阵”;
b、根据入参传递的开单时间段,从ES中提取出该时间段对应的药房列表,列表中的每一个药房配置项,都配置了时间段所属区段类型,包含但不限于班内班外、工作日和非工作日、节假日和特殊时段等元素,程序将结合当前时间段的正确定位,计算出符合要求的药房交集,并同科室步骤,按推荐因子排序,暂存为临时变量B,并得到相应的“药房/时间段 - 潜在因子矩阵”;
c、根据入参传递的药品信息,从ES中提取出所有药品对应的有存放药品的药房列表,针对列表数据取交集,即获得同时满足所有开单药品需要的药房信息,同时结合药品库存表,实时计算出库存最充足的药房,并同科室步骤,进行排序后,暂存为临时变量C,并得到相应的“药房/药品 - 潜在因子矩阵”;
d、根据入参传递的开单科室的楼层位置,利用定位服务Api,计算出和院内所有药房的实际距离,按距离大小进行排列,距离小的优先,排列后暂存为临时变量D,并得到相应的“药房/位置 - 潜在因子矩阵”;
e、针对上述规则计算得到的潜在矩阵列表,利用LatentFactor算法的稀疏矩阵求和,分别计算四个维度的用户期望药房评分矩阵R1-R4,最终汇总形成“用户/药房的总评分矩阵”,最终得到推荐因子从大到小排列的药房列表,逐个进行再次遍历核验,如果其中一个药房满足需求,则选定为最终分配药房,退出循环;
3、将上述规则计算运算得到的药房分配结果,以Key-Value结构存储到Redis中,其Key为入参传入的药品、科室、当前时间等信息,Value为Object类型,其包含药房分配结果、计算因子、计算耗时、推荐指数、有效利用次数等属性;当下次产生开单操作时,会优先从Redis中尝试查找结果数据。若匹配后,将根据相关Value属性,判定是否采用该结果,若采用则不需要再重复上述的ES提取以及规则运算逻辑。
4、同时将上述计算得到的药房分配结果,存储到开单的相关数据表中,同时返回给前端,流程结束,患者可以根据相应药房信息,前往药房取药;
5、动态药房分配系统会定期进行 ES 和 Redis 存储数据进行排查,当从中发现利用率较低、或计算因子较大、或存在互斥冲突的分配规则,及时调整相应的规则数据;


三、动态药房分配流程

image.png


LatentFactor 矩阵因子推导示例

背景:以三个矩阵,入参是科室A、早上、药品A、位置A为例。

image.png
image.png


总结陈词

上文介绍了博主所在公司的《基于 LatentFactor + Redis + ES 实现动态药房分配方法》方案。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW液压数据采集测试系统

液压系统是装载机的重要组成部分,通过液压传动和控制实现各项作业功能,如提升、倾斜、转向等。液压系统的性能直接影响装载机的作业效率和稳定性。为了保证装载机液压系统的正常运行和优化设计,需要对其进行数据采集和测试。本文介绍了一套基…

昇思20天

K近邻算法实现红酒聚类 1. K近邻算法(KNN) 基本概念:用于分类和回归的非参数统计方法 K近邻算法(K-Nearest-Neighbor, KNN)是一种用于分类和回归的非参数统计方法,最初由 Cover和Hart于1968年提出(Cover等…

vue学习day09-自定义指令、插槽

29、自定义指令 (1)概念:自己定义的指令,可以封装一些dom操作,扩展额外的功能。 (2)分类: 1)全局注册 2)局部注册 3)示例: 让表…

gorm多表联合查询 Joins方法 LEFT JOIN , RIGHT JOIN , INNER JOIN, FULL JOIN 使用总结

gorm中多表联合查询,我们可以使用Joins来完成,这个Joins方法很灵活,我们可以非常方便的多多表进行联合查询, 我们先来看看这个方法的官方定义和使用示例: Joins方法定义和使用示例 当然我们这里要说的使用方式是官方示…

CUDA编程 - clock 学习记录

clock 学习记录 一、完整代码二、核函数流程三、main 函数流程四、学习总结(共享内存的声明和使用):4.1、例子4.2、数据从全局内存复制到共享内存: 该程序利用CUDA并行计算能力,执行归约操作以找到每个块内的最小值&am…

C# - 异步编程和同步编程总结

在Windows Forms或WPF等桌面应用中,Invoke 和 BeginInvoke 是用来在创建控件的UI线程上安全地执行代码的关键方法,主要是为了处理多线程环境下的UI交互。 Invoke: 它是一个同步操作。当你调用 Invoke 时,当前线程会被阻塞,直到UI线…

Spark项目通用开发框架

文章目录 1. 大数据项目结构2. 类说明2.1 公共接口类2.2 TaskNameEnum指定每个任务的名称2.3 TaskRunner中编写任务的业务逻辑 3. 任务执行脚本 每个公司内部都有一套自己的架子,一般新人来了就直接在已有的架子上开发业务。 以下仅仅作为记录下自己使用的架子&…

16_网络IPC1-套接字描述符

用户数据报协议(UDP) 与 传输控制协议(TCP) 文件描述符函数使用套接字的行为 禁止套接字IO

vue 自定义滚动条同步拖动(移动端)

实现效果&#xff0c;拖动左右箭头实现图片区域同步滚动&#xff0c;到边缘停止拖动。 HTML代码 <template><div touchstart"onClick"><!--使用draggable组件 图片列表区域--><draggablev-model"select_list"end"onEnd"cl…

[Windows] 无需PS基础也香 Inpaint v10.2高级便携版

描述 对于经常在互联网上进行操作的学生&#xff0c;白领等&#xff01; 一款好用的软件总是能得心应手&#xff0c;事半功倍。 今天给大家带了一款高科技软件 Inpaint v10.2高级便携版 无需额外付费&#xff0c;永久免费&#xff01; 亲测可运行&#xff01;&#xff01; 内容…

AV1 编码标准中帧内预测技术概述

AV1 编码标准帧内预测 AV1&#xff08;AOMedia Video 1&#xff09;是一种开源的视频编码格式&#xff0c;旨在提供比现有标准更高的压缩效率和更好的视频质量。在帧内预测方面&#xff0c;AV1相较于其前身VP9和其他编解码标准&#xff0c;如H.264/AVC和H.265/HEVC&#xff0c;…

EMR 集群时钟同步问题及解决方案An error occurred (InvalidSignatureException)

目录 1. 问题描述2. 问题原因3. 解决过程4. 时钟同步的重要性5. Linux 系统中的时钟同步方式6. 检查 Linux 系统时钟同步状态7. EMR 集群中的时钟同步配置8. 时钟同步对大数据组件的影响9. 监控和告警策略10. 故障排除和最佳实践11. 自动化时钟同步管理12. 时钟同步与数据一致性…

【设计模式之美】【建造型】工厂模式实战:如何设计一个DI框架;梳理流程,通过面向接口解耦对象创建

文章目录 一. 工厂模式和 DI 容器有何区别&#xff1f;二. DI 容器的核心功能有哪些&#xff1f;1. 配置解析&#xff1a;解耦对象创建2. 对象创建3. 对象的生命周期管理 三. 如何实现一个简单的 DI 容器&#xff1f;1. 最小原型设计&#xff1a;流程梳理2. 提供执行入口&#…

GESP C++ 三级真题(2023年9月)T1 ⼩ 杨储蓄

1、 ⼩ 杨储蓄 问题描述 ⼩ 杨共有 N个储蓄罐&#xff0c;编号从0到N-1。从第1天开始&#xff0c; ⼩杨每天都会往存钱罐里 存钱。具体来说&#xff0c;第i天他会挑选一个存钱罐 ɑ i &#xff0c;并存 ⼊i元钱。过了D天后&#xff0c;他 已经忘记每个储蓄罐里都存了多少钱了&a…

git列出提交记录的文件路径

一、如何列出某次提交记录中修改过/新增的文件&#xff1f; 方法1&#xff1a;使用 git diff-tree 命令来查看某个提交记录中修改过/新增的文件。具体来说&#xff0c;你可以使用以下命令&#xff1a; git diff-tree --no-commit-id --name-only -r <commit-hash>命令解…

C++20中的constinit说明符

constinit说明符断言(assert)变量具有静态初始化&#xff0c;即零初始化和常量初始化(zero initialization and constant initialization)&#xff0c;否则程序格式不正确(program is ill-formed)。 constinit说明符声明具有静态或线程存储持续时间(thread storage duration)的…

机器人及其相关工科专业课程体系

机器人及其相关工科专业课程体系 前言传统工科专业机械工程自动化/控制工程计算机科学与技术 新兴工科专业智能制造人工智能机器人工程 总结Reference: 前言 机器人工程专业是一个多领域交叉的前沿学科&#xff0c;涉及自然科学、工程技术、社会科学、人文科学等相关学科的理论…

ozon俄罗斯ceo丨ozon平台数据分析选品神器

ozon俄罗斯ceo是玛依妮加文特。‌作为俄罗斯最大的电子商务公司Ozon Holdings的女首席执行官&#xff0c;‌玛依妮加文特被称为俄罗斯的杰夫贝索斯&#xff08;‌亚马逊CEO&#xff09;‌。‌她在公司中发挥着重要作用&#xff0c;‌不仅负责公司的日常运营和管理&#xff0c;‌…

修改表格颜色

el-table修改表头、列的背景颜色、字体样式_el-table-column背景颜色-CSDN博客 设置表头背景颜色&#xff0c;字体 <el-table :header-cell-style"rowClass" border :data"tableDataTwo" style"width: 100%"><el-table-column width&q…

数据结构初阶(C语言)-顺序表

一&#xff0c;线性表 在进行顺序表的介绍之前&#xff0c;我们先来了解下什么是线性表&#xff1a; 线性表是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串...线性表在…