# 隔离圈位管理 — 技术方案

> 依据：同目录 `隔离圈位管理功能需求.md`。圈位台账 **CRUD** + **逻辑删除** + **编号自动生成（2 位）** + **全局默认隔离天数（单条配置）**；列表圈位编号 **模糊**筛选。

---

## 1. 技术架构

| 项 | 说明 |
| --- | --- |
| **后端** | RuoYi **v3.9.2**（**springboot2** 分支）：JDK 8、Spring Boot 2.x、Spring MVC、MyBatis、Druid |
| **数据库** | MySQL **5.7.39**，InnoDB，`utf8mb4` |
| **前端** | 若依 Vue2；字段 **小驼峰**（本方案不展开页面） |

**分层**：`Controller` → `Service`（`IsolationPenValidation`、`IsolationSettingValidation`、**编号生成**）→ `Mapper`/XML → `domain`。

**代码包（建议）**：`com.ruoyi.web.modules.trademarket`

**业务摘要**

| 场景 | 行为 |
| --- | --- |
| 新增圈位 | 校验通过后 `PenCodeGenerator` 分配 `pen_code`（`01`～`99`）；`del_flag=0` |
| 修改圈位 | **不可改** `pen_code`；仅更新 `remark` |
| 列表/详情 | 仅 `del_flag=0`；排序 `pen_code ASC, id ASC` |
| 列表筛选 | `pen_code` **模糊** `LIKE %keyword%` |
| 删除圈位 | `del_flag=2`；下游引用时 `ServiceException` |
| 隔离天数配置 | 表 `biz_isolation_setting` **仅保留一行**；无记录则 `INSERT`，有则 `UPDATE` |

---

## 2. 数据库设计

### 2.1 表 `biz_isolation_pen`（隔离圈位台账）

| 字段 | 类型 | 非空 | 默认值 | 说明 |
| --- | --- | --- | --- | --- |
| `id` | `bigint(20)` | Y | 自增 | 主键 |
| `pen_code` | `char(2)` | Y | — | 圈位编号 `01`～`99`，**全局唯一** |
| `remark` | `varchar(50)` | N | NULL | 圈位备注（≤50 字） |
| `del_flag` | `char(1)` | Y | `'0'` | `0` 存在 `2` 删除 |
| `create_by` / `create_time` / `update_by` / `update_time` | 若依惯例 | — | — | 审计 |

**索引**：`PRIMARY KEY (id)`；`UNIQUE KEY uk_pen_code (pen_code)`；`KEY idx_del_flag (del_flag)`。

### 2.2 表 `biz_isolation_setting`（默认隔离天数，单行）

| 字段 | 类型 | 非空 | 默认值 | 说明 |
| --- | --- | --- | --- | --- |
| `id` | `bigint(20)` | Y | `1` | 主键；**固定为 1**，全表仅一行 |
| `default_days` | `int(11)` | Y | — | 默认隔离天数，**1～3650** |
| `remark` | `varchar(50)` | N | NULL | 配置备注（≤50 字） |
| `create_by` / `create_time` / `update_by` / `update_time` | 若依惯例 | — | — | 审计 |

**索引**：`PRIMARY KEY (id)`。

> **实现约定**：`IsolationSettingService.save` 对 `id=1` 执行 `INSERT … ON DUPLICATE KEY UPDATE` 或先 `selectById(1)` 再分支插入/更新，禁止出现 `id>1` 的生效配置。

### 2.3 DDL（MySQL 5.7）

```sql
CREATE TABLE `biz_isolation_pen` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `pen_code` char(2) NOT NULL COMMENT '圈位编号01-99',
  `remark` varchar(50) DEFAULT NULL COMMENT '圈位备注',
  `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '0存在 2删除',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_pen_code` (`pen_code`),
  KEY `idx_del_flag` (`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='隔离圈位';

CREATE TABLE `biz_isolation_setting` (
  `id` bigint(20) NOT NULL DEFAULT 1 COMMENT '固定主键1',
  `default_days` int(11) NOT NULL COMMENT '默认隔离天数',
  `remark` varchar(50) DEFAULT NULL COMMENT '配置备注',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='默认隔离天数配置';
```

### 2.4 枚举

**删除标记 `del_flag`（圈位表）**

| 值 | 含义 |
| --- | --- |
| 0 | 正常 |
| 2 | 已逻辑删除 |

### 2.5 编号生成（`PenCodeGenerator`）

与承销商模块一致：在 `del_flag=0` 范围内取 `MAX(pen_code)` + 1，格式 `%02d`；上限 `99`；与插入**同一事务**，避免并发重复。

---

## 3. 接口设计

**统一响应**：`AjaxResult` / `TableDataInfo`（`code`、`msg`、`data` / `rows`、`total`）。

**权限标识**：`tradeMarket:isolationPen:list|query|add|edit|remove|config`

**Base Path**：`/tradeMarket/isolationPen`

### 3.1 圈位接口

| # | 说明 | Method | URI | 权限 |
| --- | --- | --- | --- | --- |
| 3.1.1 | 分页列表 | GET | `/tradeMarket/isolationPen/list` | `list` |
| 3.1.2 | 详情 | GET | `/tradeMarket/isolationPen/{id}` | `query` |
| 3.1.3 | 新增 | POST | `/tradeMarket/isolationPen` | `add` |
| 3.1.4 | 修改 | PUT | `/tradeMarket/isolationPen` | `edit` |
| 3.1.5 | 删除 | DELETE | `/tradeMarket/isolationPen/{ids}` | `remove` |

#### 列表 Query

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `pageNum` / `pageSize` | int | N | 默认 `1` / `20` |
| `penCode` | string | N | 圈位编号**模糊**：`pen_code LIKE %value%` |

**排序**：`pen_code ASC, id ASC`。

#### 详情 `data`（驼峰）

`id`、`penCode`、`remark`、审计字段。

#### 新增 / 修改 Body（驼峰）

| 字段 | 新增 | 修改 | 说明 |
| --- | --- | --- | --- |
| `id` | — | Y | 主键 |
| `penCode` | — | — | **禁止传入**；仅响应带回 |
| `remark` | N | N | ≤50 字，trim；空串存 `NULL` |

#### 圈位校验（`IsolationPenValidation`）

| 项 | 规则 |
| --- | --- |
| 备注 | 有内容时 1～50 字 |
| 修改 | 禁止改 `pen_code`；记录存在且 `del_flag=0` |
| 删除 | 未删；`IsolationPenReferenceChecker.hasReference(id)` 为 false（本期可占位 `false`） |

#### 删除

- 单条：`DELETE /tradeMarket/isolationPen/{ids}`，传一个 id。  
- `UPDATE … SET del_flag='2' WHERE id=? AND del_flag='0'`。

### 3.2 默认隔离天数接口

| # | 说明 | Method | URI | 权限 |
| --- | --- | --- | --- | --- |
| 3.2.1 | 查询当前配置 | GET | `/tradeMarket/isolationPen/setting` | `config` |
| 3.2.2 | 保存配置 | PUT | `/tradeMarket/isolationPen/setting` | `config` |

#### 查询 `data`（驼峰）

| 字段 | 说明 |
| --- | --- |
| `defaultDays` | 默认隔离天数；**无记录时** `data` 为 `null` 或各字段为空（前端按未配置处理） |
| `remark` | 配置备注 |
| `updateBy` / `updateTime` | 最近修改审计（有记录时返回） |

#### 保存 Body（驼峰）

| 字段 | 必填 | 说明 |
| --- | --- | --- |
| `defaultDays` | Y | 整数，`1～3650` |
| `remark` | N | ≤50 字 |

#### 配置校验（`IsolationSettingValidation`）

| 项 | 规则 |
| --- | --- |
| `defaultDays` | 非空、整数、∈ [1, 3650] |
| `remark` | 有内容时 ≤50 字 |

> **说明**：不提供删除配置接口；仅覆盖更新。

### 3.3 Mapper 约定（圈位）

- 查询条件均带 `del_flag='0'`。  
- 模糊：`AND pen_code LIKE CONCAT('%', #{penCode}, '%')`。

---

## 4. 菜单与权限（示例）

| 类型 | 名称 | 权限标识 |
| --- | --- | --- |
| 菜单 | 隔离圈位管理 | `tradeMarket:isolationPen:list` |
| 按钮 | 查询 | `tradeMarket:isolationPen:query` |
| 按钮 | 新增 | `tradeMarket:isolationPen:add` |
| 按钮 | 修改 | `tradeMarket:isolationPen:edit` |
| 按钮 | 删除 | `tradeMarket:isolationPen:remove` |
| 按钮 | 设置隔离天数 | `tradeMarket:isolationPen:config` |

组件路径：`tradeMarket/isolationPen/index`（「交易市场平台」目录下）。

---

## 5. 与承销商模块对照

| 项 | 承销商 | 隔离圈位 |
| --- | --- | --- |
| 主表 | `biz_distributor` | `biz_isolation_pen` |
| 扩展 | — | `biz_isolation_setting`（单行） |
| 列表筛选 | 编号、名称模糊 | 仅**编号模糊** |
| 特色能力 | 销售去向 | **默认隔离天数** 独立接口 |
| Base Path | `/tradeMarket/distributor` | `/tradeMarket/isolationPen` |

---

## 6. 交付清单

- [ ] `sql/biz_isolation_pen.sql`、`sql/biz_isolation_setting.sql`、菜单权限 SQL  
- [ ] `BizIsolationPen`、`BizIsolationSetting`、Mapper/XML、Service、Controller  
- [ ] `PenCodeGenerator`、`IsolationPenValidation`、`IsolationSettingValidation`  
- [ ] 单元测试（编号生成、天数范围、模糊 SQL）  
- [ ] MockMvc（圈位 CRUD、setting 读写）

---

## 7. 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初稿：`biz_isolation_pen` + `biz_isolation_setting`；CRUD + 逻辑删除；2 位编号；`/tradeMarket/isolationPen` 及 `/setting` |
