# scm **Repository Path**: Shisb/scm ## Basic Information - **Project Name**: scm - **Description**: AI trea-solo 生成项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-01 - **Last Updated**: 2026-02-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 多租户多组织企业级医疗器械SCM系统整体架构设计(含数据库设计) 本文档基于医疗器械行业合规要求(如UDI追溯、数据隔离、操作留痕),结合多租户、多组织管理特性,依托指定技术栈(Java 17、Spring Boot 3.2、Vue 3.4等),设计“云端集中管控+家庭服务器分布式部署”的企业级SCM系统架构,实现业务高效协同、数据安全隔离、部署灵活适配,全面支撑医疗器械采购、库存、UDI追溯、费用管理等核心业务场景;同时补充完整数据库设计,适配多租户多组织隔离需求,保障数据合规、安全、可追溯。 # 一、架构设计核心原则 ## 1.1 行业适配原则 严格遵循医疗器械行业规范,支持UDI(唯一器械标识)全流程追溯、业务操作合规留痕、数据可审计,满足医疗器械经营企业对产品效期、资质、库存的精细化管控需求,同时适配行业对数据隐私和安全的高要求。 ## 1.2 多租户多组织适配原则 采用“Schema+字段”双隔离模式,实现租户间数据彻底隔离;支持多组织层级管理,适配企业集团化、多分支机构场景,确保不同组织间业务协同可控、数据权限精准划分。 ## 1.3 部署灵活原则 采用“云端+家庭服务器”双部署架构,云端聚焦集中管控、请求分发,家庭服务器聚焦本地业务落地、数据存储,兼顾云端协同效率与本地数据管控需求,支持租户按需分配部署节点。 ## 1.4 高可用与安全性原则 通过Nacos服务注册发现、Redis缓存防护、Dubbo容错机制保障系统高可用;采用HTTPS加密传输、权限双层校验、代码混淆、数据备份等措施,防范数据泄露、反编译、非法访问等风险。 ## 1.5 可扩展与标准化原则 基于DDD领域驱动设计分层架构,降低模块耦合;采用元数据驱动模式,支持页面元素、业务规则灵活配置;遵循指定技术栈规范,提供标准化工程结构、配置模板和联调规范,便于后期扩展与维护。 # 二、整体架构分层与模块设计 系统整体分为5大层级,自上而下依次为:前端交互层、云端集中管控层、跨层交互层、家庭服务器业务层、数据存储层,各层级模块职责清晰、交互闭环,同时嵌入多租户、多组织、合规管控等核心能力,形成完整架构体系。 ## 2.1 前端交互层(多端统一适配) 核心定位:面向B端管理员、操作人员及移动端用户,提供统一、适配的交互入口,基于元数据动态渲染页面,支撑多租户、多组织个性化界面展示。 ### 2.1.1 核心模块 - B端管理端:基于Vue 3.4、Vite 5、Element Plus开发,封装Pinia状态管理、Axios请求拦截,实现租户切换、组织切换、权限控制、业务操作等核心功能,适配PC端办公场景; - 移动端适配:基于UniApp开发,兼容微信小程序,支持库存查询、订单审核、消息提醒等轻量化操作,满足移动端办公需求; - 前端通用组件:封装表单、表格、菜单、按钮等通用组件,基于后端元数据JSON配置动态渲染,支持个人设置(查询条件、表格字段顺序/宽度)个性化配置; - 权限控制前端适配:根据后端返回的权限信息,动态隐藏菜单、按钮、表单字段,实现跨字段权限、数据权限的前端可视化控制。 ### 2.1.2 核心特性 支持多端统一登录(账号关联租户ID、组织ID),页面元素元数据驱动,无需修改前端代码即可调整界面展示,适配不同租户、不同组织的个性化需求;前端代码打包后部署至云端Nginx,支持静态资源缓存,提升访问速度。 ## 2.2 云端集中管控层(项目一:云服务器部署) 核心定位:系统统一入口,负责请求分发、权限前置校验、租户缓存、第三方服务集成,不承担具体业务逻辑,聚焦集中管控与协同调度,支撑多租户、多家庭服务器的规模化管理。 ### 2.2.1 核心模块 - Nginx反向代理模块:部署前端静态资源,接收所有用户请求,实现请求负载均衡、HTTPS加密、跨域处理,转发请求至统一API网关;配置路由规则,适配前后端联调与生产环境部署。 - 统一API网关模块:基于Spring Cloud Gateway开发,作为系统统一请求入口,核心职责包括:租户ID、组织ID合法性校验;跨字段权限、数据权限前置拦截;请求路由(根据租户ID分发至对应家庭服务器);参数统一校验;全局异常拦截;统一响应体封装。 - Nacos注册配置中心:管理全系统服务注册与发现(云端服务、家庭服务器业务服务),集中存储系统全局配置、租户隔离规则、第三方服务配置(OSS、微信支付)、数据库连接信息等,支持配置动态下发,无需重启服务即可完成配置更新;区分开发、测试、生产多环境配置,实现环境隔离。 - Redis租户缓存模块:专门缓存租户相关信息,包括租户基础配置(隔离方式、所属家庭服务器节点)、租户权限配置、组织架构信息、第三方服务核心凭证(OSS访问密钥、微信支付密钥);采用缓存防护策略,避免缓存穿透、击穿、雪崩,保障租户信息查询高效准确。 - 第三方服务集成模块: - 阿里云OSS集成:实现医疗器械相关文件(产品资质、UDI标签、订单附件)的上传、下载、删除、预览,按租户ID隔离文件,符合行业数据隔离要求; - 微信支付集成:实现租户年服务费在线收取、支付订单查询、支付结果回调、退款等功能,支付数据与租户ID、组织ID关联,确保支付记录可追溯,同步支付结果至对应家庭服务器。 - Dubbo消费者模块:封装Dubbo调用逻辑,作为Dubbo消费者,通过Nacos发现家庭服务器的Dubbo服务提供者,实现云端到家庭服务器的业务服务调用,支撑跨层业务协同。 ## 2.3 跨层交互层(云端与家庭服务器桥梁) 核心定位:打通云端集中管控层与家庭服务器业务层的通信链路,实现请求路由、数据同步、权限二次校验,确保跨层交互安全、高效、可追溯,支撑分布式部署场景下的业务协同。 ### 2.3.1 核心模块 - Dubbo服务调用模块:采用Dubbo作为跨层通信框架,实现“云端消费者+家庭服务器提供者”的服务调用模式,核心特性包括:负载均衡、超时重试、容错机制,保障跨层调用稳定性;数据加密传输,防范数据泄露;根据租户ID路由至指定家庭服务器节点,实现精准调用。 - 租户与组织路由模块:维护租户与家庭服务器的关联关系,基于租户ID确定对应的家庭服务器节点,实现请求精准路由;支持组织层级路由,根据组织ID确定业务范围,支撑多组织间业务协同;路由规则通过Nacos动态配置,支持租户迁移、家庭服务器节点扩容。 - 数据同步模块:实现云端与家庭服务器的数据双向同步,核心同步内容包括:租户配置、权限信息、支付结果、元数据配置;采用增量同步机制,减少同步压力,确保同步数据一致性与实时性;处理同步异常,实现异常重试与日志记录,避免数据错乱。 - 跨层权限校验模块:在Dubbo调用过程中,对用户权限进行二次校验(补充云端API网关的前置校验),重点校验数据权限(确保用户只能访问所属租户、所属组织的业务数据),形成双层权限防护,提升系统安全性;校验租户ID、组织ID合法性,拦截非法请求。 ## 2.4 家庭服务器业务层(项目二:家庭服务器部署) 核心定位:系统业务核心,负责医疗器械SCM具体业务逻辑落地、本地数据处理,每个家庭服务器对应1个或多个租户的业务节点,实现业务隔离与分布式部署,适配医疗器械企业本地数据管控需求;基于DDD领域驱动设计分层架构,确保业务逻辑清晰、可扩展。 ### 2.4.1 核心模块(DDD分层架构) 采用DDD四层架构(用户接口层、应用层、领域层、基础设施层),分层解耦,聚焦业务逻辑封装与行业适配,嵌入多租户、多组织、合规管控能力: - 用户接口层(Interfaces Layer): - 接收云端Dubbo调用请求,将请求参数转换为领域模型,调用应用层服务,返回业务处理结果; - 实现请求参数二次校验(补充云端网关校验),适配多租户、多组织业务场景的参数需求; - 定义Dubbo服务接口,作为家庭服务器业务服务的对外入口,供云端消费者调用。 - 应用层(Application Layer): - 封装医疗器械SCM核心业务流程,协调领域对象完成具体业务操作,不包含业务规则,仅负责流程调度; - 支撑多组织业务协同,如跨组织产品调拨、订单协同审核等; - 对接基础设施层,调用数据访问、缓存、日志等支撑服务,实现业务流程闭环。 - 领域层(Domain Layer):系统核心,封装医疗器械行业核心业务逻辑与业务规则,适配多租户、多组织场景: - 领域模型:定义核心实体(产品、订单、库存、租户、组织、UDI信息)、值对象,封装实体属性与行为,关联租户ID、组织ID,支撑多租户多组织数据隔离; - 领域服务:封装核心业务规则,如UDI编码校验、产品效期管理、库存预警、合规留痕等医疗器械行业特色业务逻辑; - 领域仓库接口:定义数据访问规范,隔离领域层与基础设施层,确保领域层不依赖具体数据访问实现。 - 基础设施层(Infrastructure Layer):为上层提供支撑服务,实现领域仓库接口,集成各类基础组件: - 数据访问模块:基于MyBatis-Plus开发,实现数据库访问,支撑多租户数据隔离(Schema+字段双隔离),实现租户Schema动态切换、核心表租户ID/组织ID字段自动填充; - Redis本地缓存模块:缓存当前家庭服务器下租户的高频业务数据(产品列表、库存数据、订单摘要),减少数据库查询压力,与云端Redis租户缓存联动,确保数据一致性; - 日志收集模块:收集业务操作日志、异常日志,按租户ID、组织ID分类存储,实现操作留痕,适配行业合规审计需求; - 元数据管理模块:存储页面元素元数据(菜单、按钮、表单控件、表格字段),以JSON格式提供给前端,支撑元数据驱动的页面渲染;提供元数据维护功能,支持开发人员在线维护页面元素,无需修改代码; - 权限管理模块:实现跨字段权限、数据权限的精细化管理,维护角色、权限、用户的关联关系,支持角色自定义、权限按需分配;权限信息同步至云端Redis租户缓存,确保权限校验高效; - 开发支持模块:提供代码自动生成工具(根据元数据、实体类生成mapper、service、controller代码)、数据导入导出工具,提升开发效率; - Dubbo服务提供者模块:实现云端消费者调用的Dubbo服务接口,注册至Nacos,接收云端调用请求,路由至对应业务服务,返回业务处理结果。 ## 2.5 数据存储层(云端+家庭服务器分布式存储) 核心定位:实现数据分层存储、租户隔离存储,保障数据安全、可追溯,适配多租户多组织场景与医疗器械行业数据管控需求,分为云端存储与家庭服务器本地存储两部分。 ### 2.5.1 云端存储 - Redis缓存存储:部署云端Redis集群,存储租户缓存、权限缓存、第三方服务配置缓存,支撑云端集中管控层的高效运行; - 阿里云OSS存储:存储全系统医疗器械相关文件(按租户ID隔离),实现文件统一管理、安全存储,支撑文件上传下载等业务场景。 ### 2.5.2 家庭服务器本地存储 - MySQL数据库:每个家庭服务器部署独立MySQL实例,存储对应租户的业务数据,采用“Schema+字段”双隔离模式: - Schema隔离:不同租户使用不同的数据库Schema,实现租户间数据彻底隔离,避免数据泄露; - 字段隔离:核心业务表(产品、订单、库存等)均新增tenant\_id(租户ID)、org\_id(组织ID)字段,区分不同租户、不同组织的数据,支撑多组织数据权限管控; - 数据库配置:开启事务管理,确保业务操作原子性;配置定期备份策略,保障医疗器械业务数据安全,适配行业合规要求;优化索引,提升多租户场景下的高频查询效率。 - Redis本地缓存:每个家庭服务器部署独立Redis实例,存储本地高频业务数据,减少数据库查询压力,提升业务处理效率;与云端Redis联动,同步租户配置、权限信息,确保数据一致性。 # 九、数据库设计(新增) 数据库设计严格遵循多租户多组织“Schema+字段”双隔离原则,贴合医疗器械行业合规要求(UDI追溯、效期管理、合规留痕),适配“云端+家庭服务器”分布式存储架构,分为云端数据库与家庭服务器本地数据库两部分,确保数据隔离、安全、可追溯、高性能。 ## 9.1 数据库设计核心原则 - 隔离性原则:严格遵循“Schema+字段”双隔离,云端数据库聚焦公共配置与租户关联数据,家庭服务器本地数据库按租户Schema隔离,核心表均含tenant\_id、org\_id字段,确保租户间、组织间数据彻底隔离; - 合规性原则:贴合医疗器械行业规范,设计UDI追溯、效期管理、操作留痕相关表结构,确保数据可审计、可追溯,满足行业监管要求; - 高性能原则:合理设计索引(聚焦tenant\_id、org\_id、UDI编码等高频查询字段),优化表关联逻辑,减少冗余数据;结合Redis缓存,提升多租户场景下的查询效率; - 可扩展性原则:表结构设计预留扩展字段,适配后期业务迭代(如新增产品资质类型、权限维度);遵循标准化命名规范,便于维护与扩展; - 一致性原则:云端与家庭服务器数据库数据同步遵循增量同步机制,核心数据(租户配置、支付结果)确保同步实时性,避免数据错乱; - 安全性原则:敏感数据(如支付密钥、用户密码)加密存储,设计数据备份策略,定期自动备份,防止数据丢失;限制数据库访问权限,适配系统权限管控逻辑。 ## 9.2 数据库存储架构(贴合云端+家庭服务器部署) 系统数据库采用“云端集中存储+家庭服务器本地存储”的分布式架构,两者独立部署、按需同步,既保障集中管控需求,又实现租户数据本地隔离管控。 ### 9.2.1 云端数据库(云服务器部署) 核心定位:存储全系统公共配置、租户基础信息、跨租户关联数据、第三方服务相关数据,不存储租户具体业务数据,支撑云端集中管控层运行。 - 数据库实例:1个独立MySQL实例(建议主从复制部署,保障高可用),仅1个公共Schema(scm\_cloud\_public); - 核心存储内容:租户基础信息、租户与家庭服务器关联关系、云端服务配置、微信支付记录、OSS文件关联信息、系统全局日志(非业务日志); - 同步机制:与家庭服务器本地数据库同步“租户配置更新、支付结果、元数据配置”等核心数据,采用增量同步,由跨层交互层数据同步模块负责; - 备份策略:每日全量备份+每小时增量备份,备份文件存储至阿里云OSS,保留90天,适配合规审计需求。 ### 9.2.2 家庭服务器本地数据库(家庭服务器部署) 核心定位:存储对应租户的全部业务数据,按租户Schema隔离,是系统业务数据的核心存储载体,适配医疗器械企业本地数据管控需求。 - 数据库实例:每个家庭服务器部署1个独立MySQL实例(支持单实例多Schema),无需主从复制(小型部署),中大型部署可配置主从备份; - Schema隔离规则:每个租户对应1个独立Schema,命名规范为“scm\_tenant\_xxx”(xxx为租户ID,如scm\_tenant\_1001),租户仅能访问自身Schema数据; - 核心存储内容:租户下的产品信息、UDI追溯数据、库存数据、采购/销售订单、组织架构、用户权限、业务操作日志、本地文件关联信息等所有业务数据; - 同步机制:接收云端同步的“租户配置、支付结果、元数据配置”,向云端同步“租户业务状态、需审计的操作日志”(按需),采用增量同步; - 备份策略:每日全量备份,备份文件存储在本地服务器+云端OSS(双重备份),保留180天,满足医疗器械行业数据留存要求。 ## 9.3 核心表结构设计(分云端、家庭服务器) 表结构设计遵循“简洁、合规、适配隔离”原则,字段类型贴合数据特性,核心字段(tenant\_id、org\_id、create\_time、update\_time)统一设计,所有表均设计主键(id,自增/UUID),高频查询字段设计索引。 ### 9.3.1 云端数据库核心表结构(scm\_cloud\_public Schema) 聚焦公共配置与跨租户关联数据,无需tenant\_id字段(仅1个公共Schema),核心表如下: #### 1. 租户基础信息表(cloud\_tenant) 用途:存储全系统租户基础配置,关联租户与家庭服务器,支撑租户路由与隔离,是多租户架构的核心基础表。 | 字段名 | 字段类型 | 是否非空 | 默认值 | 备注 | | ------------------------ | ------------- | ---------- | ------------------------------------------------------- | -------------------------------------------- | | id | bigint | 是 | 自增 | 主键,租户唯一ID | | tenant\_code | varchar(32) | 是 | 无 | 租户编码,唯一,如TENANT\_1001 | | tenant\_name | varchar(64) | 是 | 无 | 租户名称(医疗器械企业全称) | | home\_server\_id | bigint | 是 | 无 | 关联家庭服务器ID,用于租户路由 | | home\_server\_ip | varchar(64) | 是 | 无 | 家庭服务器IP地址,用于Dubbo调用 | | is\_valid | tinyint | 是 | 1 | 租户状态:0-无效(停用),1-有效(正常) | | expire\_time | datetime | 是 | 无 | 租户有效期(服务费到期时间),到期自动停用 | | contact\_person | varchar(32) | 否 | 无 | 租户联系人 | | contact\_phone | varchar(16) | 否 | 无 | 租户联系电话(加密存储) | | create\_time | datetime | 是 | CURRENT\_TIMESTAMP | 租户创建时间 | | update\_time | datetime | 是 | CURRENT\_TIMESTAMP ON UPDATE CURRENT\_TIMESTAMP | 租户信息更新时间 | 索引:主键索引(id)、唯一索引(tenant\_code)、普通索引(home\_server\_id、is\_valid) #### 2. 家庭服务器信息表(cloud\_home\_server) 用途:存储所有家庭服务器节点配置,支撑租户路由与服务注册发现。 | 字段名 | 字段类型 | 是否非空 | 默认值 | 备注 | | ------------------ | ------------- | ---------- | ------------------------------------------------------- | ---------------------------------------- | | id | bigint | 是 | 自增 | 主键,家庭服务器唯一ID | | server\_code | varchar(32) | 是 | 无 | 服务器编码,唯一,如HOME\_001 | | server\_name | varchar(64) | 是 | 无 | 服务器名称(自定义,如上海租户服务器) | | server\_ip | varchar(64) | 是 | 无 | 服务器IP地址,唯一 | | dubbo\_port | int | 是 | 无 | Dubbo服务提供者端口(如20881) | | mysql\_port | int | 是 | 3306 | 本地MySQL数据库端口 | | redis\_port | int | 是 | 6379 | 本地Redis端口 | | status | tinyint | 是 | 1 | 服务器状态:0-离线,1-在线,2-维护中 | | tenant\_count | int | 是 | 0 | 该服务器承载的租户数量 | | create\_time | datetime | 是 | CURRENT\_TIMESTAMP | 服务器注册时间 | | update\_time | datetime | 是 | CURRENT\_TIMESTAMP ON UPDATE CURRENT\_TIMESTAMP | 服务器信息更新时间 | 索引:主键索引(id)、唯一索引(server\_code、server\_ip)、普通索引(status) #### 3. 微信支付记录表(cloud\_wechat\_pay) 用途:存储所有租户的服务费支付记录,支撑支付回调与结果同步,适配合规追溯。 | 字段名 | 字段类型 | 是否非空 | 默认值 | 备注 | | ------------------------- | --------------- | ---------- | ------------------------------------------------------- | ---------------------------------------------------- | | id | bigint | 是 | 自增 | 主键 | | tenant\_id | bigint | 是 | 无 | 关联租户ID,对应cloud\_tenant.id | | out\_trade\_no | varchar(64) | 是 | 无 | 系统生成的支付订单号,唯一 | | wechat\_trade\_no | varchar(64) | 否 | 无 | 微信支付平台生成的订单号,支付成功后回填 | | pay\_amount | decimal(10,2) | 是 | 无 | 支付金额(元),租户年服务费 | | pay\_type | tinyint | 是 | 1 | 支付类型:1-年服务费,2-增值服务费 | | pay\_status | tinyint | 是 | 0 | 支付状态:0-未支付,1-支付成功,2-支付失败,3-退款 | | pay\_time | datetime | 否 | 无 | 支付成功时间,支付成功后回填 | | callback\_time | datetime | 否 | 无 | 微信支付回调时间 | | callback\_content | text | 否 | 无 | 微信支付回调完整内容,用于问题排查 | | create\_time | datetime | 是 | CURRENT\_TIMESTAMP | 支付订单创建时间 | | update\_time | datetime | 是 | CURRENT\_TIMESTAMP ON UPDATE CURRENT\_TIMESTAMP | 支付状态更新时间 | 索引:主键索引(id)、唯一索引(out\_trade\_no、wechat\_trade\_no)、普通索引(tenant\_id、pay\_status) ### 9.3.2 家庭服务器本地数据库核心表结构(租户Schema) 每个租户Schema(scm\_tenant\_xxx)下的表结构完全一致,核心表均含tenant\_id、org\_id字段(字段值固定为当前租户/组织ID),实现组织间数据隔离,贴合医疗器械业务场景,核心表如下: #### 1. 组织架构表(sys\_org) 用途:存储当前租户下的所有组织信息,支撑多组织层级管理与数据权限管控。 | 字段名 | 字段类型 | 是否非空 | 默认值 | 备注 | | ----------------------- | ------------- | ---------- | ------------------------------------------------------- | --------------------------------------- | | id | bigint | 是 | 自增 | 主键,组织唯一ID | | tenant\_id | bigint | 是 | 无 | 租户ID,固定为当前租户ID,字段隔离用 | | org\_code | varchar(32) | 是 | 无 | 组织编码,租户内唯一,如ORG\_001 | | org\_name | varchar(64) | 是 | 无 | 组织名称(如总部、上海分支机构) | | parent\_org\_id | bigint | 是 | 0 | 上级组织ID,0表示顶级组织(租户总部) | | org\_type | tinyint | 是 | 1 | 组织类型:1-总部,2-分支机构,3-仓库 | | contact\_person | varchar(32) | 否 | 无 | 组织联系人 | | contact\_phone | varchar(16) | 否 | 无 | 组织联系电话(加密存储) | | is\_valid | tinyint | 是 | 1 | 组织状态:0-无效,1-有效 | | create\_time | datetime | 是 | CURRENT\_TIMESTAMP | 组织创建时间 | | update\_time | datetime | 是 | CURRENT\_TIMESTAMP ON UPDATE CURRENT\_TIMESTAMP | 组织信息更新时间 | 索引:主键索引(id)、唯一索引(org\_code)、普通索引(tenant\_id、parent\_org\_id、is\_valid) #### 2. 用户表(sys\_user) 用途:存储当前租户下的所有用户信息,关联组织与角色,支撑权限管控。 | 字段名 | 字段类型 | 是否非空 | 默认值 | 备注 | | ------------------------- | -------------- | ---------- | ------------------------------------------------------- | ----------------------------------------------- | | id | bigint | 是 | 自增 | 主键,用户唯一ID | | tenant\_id | bigint | 是 | 无 | 租户ID,固定为当前租户ID,字段隔离用 | | org\_id | bigint | 是 | 无 | 关联组织ID,用户所属组织,对应sys\_org.id | | username | varchar(32) | 是 | 无 | 登录账号,租户内唯一 | | password | varchar(128) | 是 | 无 | 登录密码,MD5加密存储(加盐) | | real\_name | varchar(32) | 是 | 无 | 用户真实姓名 | | phone | varchar(16) | 否 | 无 | 用户电话(加密存储) | | email | varchar(64) | 否 | 无 | 用户邮箱(加密存储) | | role\_id | bigint | 是 | 无 | 关联角色ID,对应sys\_role.id,决定用户权限 | | is\_admin | tinyint | 是 | 0 | 是否租户管理员:0-否,1-是(拥有全部权限) | | is\_valid | tinyint | 是 | 1 | 用户状态:0-禁用,1-正常 | | last\_login\_time | datetime | 否 | 无 | 最后登录时间 | | create\_time | datetime | 是 | CURRENT\_TIMESTAMP | 用户创建时间 | | update\_time | datetime | 是 | CURRENT\_TIMESTAMP ON UPDATE CURRENT\_TIMESTAMP | 用户信息更新时间 | 索引:主键索引(id)、唯一索引(username)、普通索引(tenant\_id、org\_id、role\_id、is\_valid) #### 3. 医疗器械产品表(medical\_product) 用途:存储当前租户下的所有医疗器械产品信息,关联UDI编码,支撑产品效期、资质、库存的精细化管控,是医疗器械SCM业务的核心基础表,贴合行业合规追溯要求。 | 字段名 | 字段类型 | 是否非空 | 默认值 | 备注 | | ------------------------ | --------------- | ---------- | ------------------------------------------------------- | ------------------------------------------------------------------ | | id | bigint | 是 | 自增 | 主键,产品唯一ID | | tenant\_id | bigint | 是 | 无 | 租户ID,固定为当前租户ID,字段隔离用 | | org\_id | bigint | 是 | 无 | 关联组织ID,产品归属组织,对应sys\_org.id,支撑多组织产品管控 | | product\_code | varchar(32) | 是 | 无 | 产品内部编码,租户内唯一,便于内部管理与查询 | | udi\_code | varchar(64) | 是 | 无 | 唯一器械标识(UDI),行业合规核心字段,全流程追溯唯一标识 | | udi\_di | varchar(64) | 是 | 无 | UDI器械识别码(DI),标识产品型号规格,关联UDI数据库 | | product\_name | varchar(128) | 是 | 无 | 医疗器械产品全称,与产品资质、UDI标签名称一致 | | product\_type | tinyint | 是 | 无 | 产品类型:1-一类器械,2-二类器械,3-三类器械,贴合行业分类 | | specification | varchar(64) | 是 | 无 | 产品规格型号,如尺寸、量程、材质等关键参数 | | unit | varchar(16) | 是 | 无 | 计量单位,如个、套、箱、支,统一计量标准 | | manufacturer | varchar(64) | 是 | 无 | 生产厂家全称,需与厂家资质文件一致,支撑合规审核 | | production\_license | varchar(64) | 是 | 无 | 生产厂家医疗器械生产许可证号,合规核心字段 | | expire\_days | int | 是 | 无 | 产品有效期(天),从生产日期起计算,支撑效期预警 | | warning\_days | int | 是 | 30 | 效期预警天数,默认30天,到期前触发库存预警 | | purchase\_price | decimal(10,2) | 是 | 无 | 默认采购单价(元),可按供应商、组织单独配置 | | sale\_price | decimal(10,2) | 否 | 无 | 默认销售单价(元),无销售业务可留空 | | min\_stock | int | 是 | 1 | 最低库存阈值,低于该值触发库存短缺预警 | | max\_stock | int | 否 | 无 | 最高库存阈值,高于该值禁止超额采购(可选配置) | | is\_valid | tinyint | 是 | 1 | 产品状态:0-停用(禁止采购/销售),1-正常,2-淘汰 | | remark | varchar(255) | 否 | 无 | 备注,可存储产品特殊说明、合规要求等补充信息 | | create\_time | datetime | 是 | CURRENT\_TIMESTAMP | 产品创建时间 | | update\_time | datetime | 是 | CURRENT\_TIMESTAMP ON UPDATE CURRENT\_TIMESTAMP | 产品信息更新时间 | 索引:主键索引(id)、唯一索引(product\_code、udi\_code)、普通索引(tenant\_id、org\_id、product\_type、manufacturer、is\_valid) #### 4. UDI追溯信息表(medical\_udi\_trace) 用途:存储医疗器械UDI全流程追溯数据,关联产品、批次、出入库记录,满足行业UDI追溯合规要求,实现从生产、采购、库存到使用的全链条可追溯。 | 字段名 | 字段类型 | 是否非空 | 默认值 | 备注 | | -------------------------- | -------------- | ---------- | ----------------------- | ---------------------------------------------------------------------- | | id | bigint | 是 | 自增 | 主键,追溯记录唯一ID | | tenant\_id | bigint | 是 | 无 | 租户ID,固定为当前租户ID,字段隔离用 | | org\_id | bigint | 是 | 无 | 关联组织ID,追溯业务所属组织,对应sys\_org.id | | product\_id | bigint | 是 | 无 | 关联产品ID,对应medical\_product.id | | udi\_code | varchar(64) | 是 | 无 | 唯一器械标识(UDI),与产品表udi\_code一致 | | batch\_no | varchar(32) | 是 | 无 | 产品批次号,生产厂家生成,关联批次管理 | | production\_date | date | 是 | 无 | 产品生产日期,用于效期计算与追溯 | | expire\_date | date | 是 | 无 | 产品有效期至,由生产日期+有效期天数计算得出 | | trace\_type | tinyint | 是 | 无 | 追溯类型:1-采购入库,2-销售出库,3-库存调拨,4-报废处理,5-盘点调整 | | related\_order\_id | bigint | 是 | 无 | 关联业务订单ID,如采购单、出库单ID,便于关联查询 | | quantity | int | 是 | 无 | 追溯数量,正数表示入库/增加,负数表示出库/减少 | | operator\_id | bigint | 是 | 无 | 操作人员ID,对应sys\_user.id,实现操作留痕 | | trace\_time | datetime | 是 | CURRENT\_TIMESTAMP | 追溯记录生成时间(业务操作时间) | | trace\_remark | varchar(255) | 否 | 无 | 追溯备注,如报废原因、调拨说明等补充信息 | | ext\_info | text | 否 | 无 | 扩展信息,JSON格式存储,如供应商、接收方等额外追溯数据 | 索引:主键索引(id)、普通索引(tenant\_id、org\_id、product\_id、udi\_code、batch\_no、trace\_type、trace\_time) #### 5. 库存信息表(medical\_inventory) 用途:存储当前租户下各组织、各仓库的医疗器械库存数据,关联产品、批次、UDI信息,支撑库存精细化管控、效期预警、盘点等核心业务,贴合行业库存合规要求。 | 字段名 | 字段类型 | 是否非空 | 默认值 | 备注 | | ------------------------- | -------------- | ---------- | ------------------------------------------------------- | ----------------------------------------------------------------------------- | | id | bigint | 是 | 自增 | 主键,库存记录唯一ID | | tenant\_id | bigint | 是 | 无 | 租户ID,固定为当前租户ID,字段隔离用 | | org\_id | bigint | 是 | 无 | 关联组织ID,库存所属组织,对应sys\_org.id | | warehouse\_id | bigint | 是 | 无 | 关联仓库ID,对应medical\_warehouse.id,区分不同仓库库存 | | product\_id | bigint | 是 | 无 | 关联产品ID,对应medical\_product.id | | udi\_code | varchar(64) | 是 | 无 | 唯一器械标识(UDI),与产品表、UDI追溯表一致 | | batch\_no | varchar(32) | 是 | 无 | 产品批次号,同一产品不同批次分开管理库存 | | production\_date | date | 是 | 无 | 产品生产日期,关联效期管理 | | expire\_date | date | 是 | 无 | 产品有效期至,到期前触发效期预警,禁止出库 | | current\_quantity | int | 是 | 0 | 当前库存数量,实时更新,不可为负数 | | locked\_quantity | int | 是 | 0 | 锁定数量,如已下单未出库的数量,不可用于出库操作 | | available\_quantity | int | 是 | 0 | 可用库存数量,\=current\_quantity - locked\_quantity,用于出库判断 | | min\_stock | int | 是 | 1 | 最低库存阈值,继承产品表配置,可单独修改 | | position | varchar(32) | 否 | 无 | 库存货位,如货架号、货位号,便于仓库实物管理 | | last\_stock\_time | datetime | 否 | 无 | 最后库存变动时间,实时更新,用于追溯与审计 | | remark | varchar(255) | 否 | 无 | 库存备注,如特殊存储要求、质量异常说明等 | | create\_time | datetime | 是 | CURRENT\_TIMESTAMP | 库存记录创建时间(首次入库时间) | | update\_time | datetime | 是 | CURRENT\_TIMESTAMP ON UPDATE CURRENT\_TIMESTAMP | 库存信息更新时间(每次库存变动更新) | 索引:主键索引(id)、唯一索引(tenant\_id、org\_id、warehouse\_id、product\_id、udi\_code、batch\_no)、普通索引(expire\_date、current\_quantity、available\_quantity)