# 休药期标准管理 — 技术方案 > 依据:同目录 `休药期标准管理功能需求.md`。本模块**不设发布/下架**(无 `publish_status` 等字段);仅 **知识库同步** 维度与 CRUD。库表、接口与其它标准模块实现相互独立。 --- ## 1. 技术架构 | 项 | 说明 | | --- | --- | | **后端** | RuoYi **v3.9.2**(**springboot2** 分支):JDK 8、Spring Boot 2.x、Spring MVC、MyBatis、Druid | | **数据库** | MySQL **5.7.39**,InnoDB,`utf8mb4` | | **前端** | 若依 Vue2(与分支配套;路由、权限、字典按项目惯例) | | **知识库** | HTTP 调用知识库后台管理服务;鉴权、URL、报文见《知识库接口对接说明》;本模块仅涉及**添加/更新/删除(幂等)**类变更,**不涉及**发布/下架可见性接口 | **分层**:`Controller` → `Service`(状态校验、事务、知识库编排)→ `Mapper`/XML → `domain`(小驼峰 JSON 与 Jackson 一致)。 **一致性(摘要)** - **删除**:本地删除前须为 `kb_sync_status=0`;删除流程中按需求对知识库发**幂等删除**通知(无条目则对端忽略),失败策略(阻断本地删 vs 异步补偿)由与知识库约定二选一并在实现中固定。 - **移出**:前置 `kb_sync_status=1`;成功后 `kb_sync_status=0`,清空 `kb_doc_id`。 - **同步**:前置 `kb_sync_status=0`;成功后 `kb_sync_status=1`,写入 `kb_doc_id`(未对接 HTTP 时可占位 `LOCAL-{id}`,与项目其它标准模块占位策略一致)。 --- ## 2. 数据库设计 ### 2.1 表 `biz_withdrawal_period_standard` | 字段 | 类型 | 非空 | 默认值 | 说明 | | --- | --- | --- | --- | --- | | `id` | `bigint(20)` | Y | 自增 | 主键 | | `drug_name` | `varchar(64)` | Y | — | 药物名称(业务 1~20 字符;**全表唯一**,保存前 trim) | | `drug_type` | `tinyint(4)` | Y | — | `1`抗生素 `2`抗原虫 `3`抗病毒 `4`激素 | | `withdrawal_days` | `int(11)` | Y | — | 休药期天数,**1~999** | | `usage_guide` | `varchar(600)` | Y | — | 使用指南(需求 1~200 汉字,宽度留余量) | | `drug_effect` | `varchar(600)` | Y | — | 药物作用(同上) | | `kb_sync_status` | `tinyint(4)` | Y | `0` | `0` 未同步,`1` 已同步 | | `kb_doc_id` | `varchar(128)` | N | NULL | 知识库文档 ID | | `create_by` / `create_time` / `update_by` / `update_time` | 若依惯例 | — | — | — | | `remark` | `varchar(500)` | N | NULL | 备注 | **索引**:`PRIMARY KEY (id)`;`UNIQUE KEY uk_drug_name (drug_name)`;`KEY idx_create_time (create_time)`;`KEY idx_drug_type (drug_type)`;`KEY idx_kb (kb_sync_status)`。 **合法 `kb_sync_status`**:仅 `0`、`1`;应用层禁止写入其它值。 **DDL 示例** ```sql CREATE TABLE `biz_withdrawal_period_standard` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `drug_name` varchar(64) NOT NULL COMMENT '药物名称(1~20字)', `drug_type` tinyint(4) NOT NULL COMMENT '1抗生素2抗原虫3抗病毒4激素', `withdrawal_days` int(11) NOT NULL COMMENT '休药期天数1~999', `usage_guide` varchar(600) NOT NULL COMMENT '使用指南', `drug_effect` varchar(600) NOT NULL COMMENT '药物作用', `kb_sync_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0未同步1已同步', `kb_doc_id` varchar(128) DEFAULT NULL COMMENT '知识库文档ID', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `remark` varchar(500) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`), UNIQUE KEY `uk_drug_name` (`drug_name`), KEY `idx_create_time` (`create_time`), KEY `idx_drug_type` (`drug_type`), KEY `idx_kb` (`kb_sync_status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='休药期标准'; ``` ### 2.2 枚举(后端/字典建议) | 字段 | 值 | 含义 | | --- | --- | --- | | `drug_type` | `1`~`4` | 抗生素 / 抗原虫 / 抗病毒 / 激素(顺序与需求列举一致) | | `kb_sync_status` | `0` | 未同步 | | | `1` | 已同步 | --- ## 3. 接口设计 **统一响应**:`AjaxResult` / 分页 `TableDataInfo`(与 RuoYi 一致)。 **Base Path**:`/withdrawalPeriod/standard`(若项目有全局 `context-path` 或网关前缀,实际 URL 需拼接)。 **权限标识(建议)**:`withdrawalPeriod:standard:list|query|add|edit|remove|syncKb|removeKb`(**无** `publish` / `offline`) | # | 说明 | Method | URI | 权限 | 要点 | | --- | --- | --- | --- | --- | --- | | 3.1 | 分页列表 | GET | `/withdrawalPeriod/standard/list` | `withdrawalPeriod:standard:list` | Query:`pageNum`、`pageSize`(默认与项目列表一致,如 20)、`keyword`(**仅** `drug_name` 模糊)、`drugType`(精确,可空);排序建议 `create_time DESC, id DESC` | | 3.2 | 详情 | GET | `/withdrawalPeriod/standard/{id}` | `withdrawalPeriod:standard:query` | 返回全字段含 `kbSyncStatus`、`kbDocId` | | 3.3 | 新增 | POST | `/withdrawalPeriod/standard` | `withdrawalPeriod:standard:add` | Body:`drugName`、`drugType`、`withdrawalDays`、`usageGuide`、`drugEffect`;落库 `kb_sync_status=0`,`kb_doc_id` 空 | | 3.4 | 修改 | PUT | `/withdrawalPeriod/standard` | `withdrawalPeriod:standard:edit` | Body 含 `id`;**仅** `kb_sync_status=0`;校验字段同需求 **4.1**;**不**在 `kb_sync_status=1` 时自动推库(与需求「已同步不可改」一致,改内容须先移出) | | 3.5 | 删除 | DELETE | `/withdrawalPeriod/standard/{ids}` | `withdrawalPeriod:standard:remove` | **仅** `kb_sync_status=0`;`kb_sync_status=1` 须先 `removeKb`;删前/删后按约定调知识库**幂等删除**;再删本地记录 | | 3.6 | 同步知识库 | POST | `/withdrawalPeriod/standard/syncKb/{id}` | `withdrawalPeriod:standard:syncKb` | 前置 `kb_sync_status=0`;成功则 `kb_sync_status=1`,写入 `kb_doc_id` | | 3.7 | 移出知识库 | POST | `/withdrawalPeriod/standard/removeKb/{id}` | `withdrawalPeriod:standard:removeKb` | 前置 `kb_sync_status=1`;成功则 `kb_sync_status=0`,清空 `kb_doc_id` | **校验(摘要)**:`drugName` 1~20 且 **全表唯一**(`countByDrugNameExcludeId`,修改时传 `excludeId`;重复提示「药物名称已存在」);`drugType ∈ {1,2,3,4}`;`withdrawalDays` 整数 1~999;`usageGuide` / `drugEffect` 长度按需求汉字上限(`WithdrawalPeriodStandardValidation` + `BizWithdrawalPeriodStandardServiceImpl`)。 --- ## 4. 与功能需求的对应(便于验收) | 需求章节 | 技术落点 | | --- | --- | | 4.1 新增字段 | 表 **2.1** + POST **3.3** | | 4.2 列表 | GET **3.1**(`keyword`→`drug_name`,`drugType`) | | 4.3 修改 | PUT **3.4**(`kb_sync_status=0`) | | 4.4 删除 | DELETE **3.5** + 知识库幂等删除 | | 4.5 / 4.6 | POST **3.6** / **3.7** | | 无发布/下架 | 无对应接口与表字段 | --- ## 5. 交付清单(勾选) - [ ] DDL:`sql/biz_withdrawal_period_standard.sql`(与 **§2.1** 一致)及菜单按钮权限 SQL - [ ] Domain / Mapper / XML / Service / Controller(包路径与项目 `architecture` 模块惯例一致即可) - [ ] 单测:状态守卫、字段校验;接口测试:MockMvc 或集成环境 - [ ] 与知识库真实 HTTP 对接(或占位策略)按《知识库接口对接说明》排期