# 市场栏位管理 — 技术方案

> 依据：同目录 `市场栏位管理功能需求.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`（`MarketStallValidation`、**编号生成**）→ `Mapper`/XML → `domain`。

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

**业务摘要**

| 场景 | 行为 |
| --- | --- |
| 新增 | 校验通过后 `StallCodeGenerator` 分配 `stall_code`（`01`～`99`）；`del_flag=0` |
| 修改 | **不可改** `stall_code`；仅更新 `remark` |
| 列表/详情 | 仅 `del_flag=0`；排序 `stall_code ASC, id ASC` |
| 列表筛选 | `stall_code` **模糊** `LIKE %keyword%` |
| 删除 | `del_flag=2`；下游引用时 `ServiceException` |

> **与隔离圈位**：`biz_market_stall` 与 `biz_isolation_pen` **独立表、独立编号序列**；`01`～`99` 在两模块内各自维护，互不影响。

---

## 2. 数据库设计

### 2.1 表 `biz_market_stall`（市场栏位）

| 字段 | 类型 | 非空 | 默认值 | 说明 |
| --- | --- | --- | --- | --- |
| `id` | `bigint(20)` | Y | 自增 | 主键 |
| `stall_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_stall_code (stall_code)`；`KEY idx_del_flag (del_flag)`。

### 2.2 DDL（MySQL 5.7）

```sql
CREATE TABLE `biz_market_stall` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `stall_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_stall_code` (`stall_code`),
  KEY `idx_del_flag` (`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='市场栏位';
```

### 2.3 枚举

**删除标记 `del_flag`**

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

### 2.4 编号生成（`StallCodeGenerator`）

在 `biz_market_stall` 且 `del_flag=0` 范围内取 `MAX(stall_code)` + 1，格式 `%02d`；上限 `99`；与插入**同一事务**，避免并发重复。

---

## 3. 接口设计

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

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

**Base Path**：`/tradeMarket/marketStall`

| # | 说明 | Method | URI | 权限 |
| --- | --- | --- | --- | --- |
| 3.1 | 分页列表 | GET | `/tradeMarket/marketStall/list` | `list` |
| 3.2 | 详情 | GET | `/tradeMarket/marketStall/{id}` | `query` |
| 3.3 | 新增 | POST | `/tradeMarket/marketStall` | `add` |
| 3.4 | 修改 | PUT | `/tradeMarket/marketStall` | `edit` |
| 3.5 | 删除 | DELETE | `/tradeMarket/marketStall/{ids}` | `remove` |

#### 3.1.1 列表 Query

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

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

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

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

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

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

#### 3.4 服务端校验（`MarketStallValidation`）

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

#### 3.5 删除

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

#### 3.6 Mapper 约定

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

---

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

| 类型 | 名称 | 权限标识 |
| --- | --- | --- |
| 菜单 | 市场栏位管理 | `tradeMarket:marketStall:list` |
| 按钮 | 查询 | `tradeMarket:marketStall:query` |
| 按钮 | 新增 | `tradeMarket:marketStall:add` |
| 按钮 | 修改 | `tradeMarket:marketStall:edit` |
| 按钮 | 删除 | `tradeMarket:marketStall:remove` |

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

---

## 5. 与隔离圈位模块对照

| 项 | 隔离圈位 `biz_isolation_pen` | 市场栏位 `biz_market_stall` |
| --- | --- | --- |
| 编号字段 | `pen_code` | `stall_code` |
| 扩展表 | `biz_isolation_setting` | **无** |
| 配置接口 | `/isolationPen/setting` | **无** |
| Base Path | `/tradeMarket/isolationPen` | `/tradeMarket/marketStall` |
| 权限 | 含 `config` | 仅 list/query/add/edit/remove |

---

## 6. 交付清单

- [ ] `sql/biz_market_stall.sql`、菜单权限 SQL  
- [ ] `BizMarketStall`、Mapper/XML、Service、Controller  
- [ ] `StallCodeGenerator`、`MarketStallValidation`  
- [ ] 单元测试（编号、备注长度、模糊 SQL）  
- [ ] MockMvc（list 模糊、CRUD）

---

## 7. 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初稿：`biz_market_stall`；CRUD+逻辑删除；2 位 `stall_code`；`/tradeMarket/marketStall`；与隔离圈位分表分序列 |
