# 供应商管理 — 前端技术方案

> 依据：`供应商管理功能需求.md`、`供应商管理技术方案.md`（后端 v1.3）；布局对齐 `tradeMarket/distributor/index.vue`（双 `el-card`）；字段 **小驼峰**。

---

## 1. 页面与路由

| 项 | 说明 |
| --- | --- |
| **Vue 路径** | `ruoyi-ui/src/views/tradeMarket/supplier/index.vue` |
| **组件名** | `TradeMarketSupplier` |
| **菜单配置** | 组件路径：`tradeMarket/supplier/index`（「交易市场平台」目录下，手工配置） |
| **权限前缀** | `tradeMarket:supplier:list\|query\|add\|edit\|remove\|assignAccount` |

---

## 2. API 模块

| 项 | 说明 |
| --- | --- |
| **文件** | `ruoyi-ui/src/api/tradeMarket/supplier.js` |
| **Base** | `/tradeMarket/supplier` |

| 方法 | HTTP | 说明 |
| --- | --- | --- |
| `listSupplier` | GET | `/list`，Query：`pageNum`、`pageSize`、`supplierCode`、`supplierName` |
| `getSupplier` | GET | `/{id}` |
| `addSupplier` | POST | `/`，Body 不含 `supplierCode` |
| `updateSupplier` | PUT | `/`，Body 含 `id`，不含 `supplierCode` |
| `delSupplier` | DELETE | `/{ids}`，单条传一个 id |
| `assignAccountSupplier` | POST | `/assignAccount/{id}`，无 Body |

---

## 3. 页面结构

1. **筛选区**：供应商编号、供应商名称（均**精确**匹配）；搜索、重置、新增。  
2. **列表区**：编号、名称、类型、身份识别号、联系方式、经营地点、车辆号码、收费方式、**账号分配**、操作（查看 / 编辑 / **分配账号** / 删除）。  
3. **新增/编辑弹窗**（550px）：编号只读（新增占位「保存后自动生成」）；类型切换身份字段；收费方式联动收费标准或两档费率；车辆号牌动态行（最多 10 条）；备注 ≤500 字。  
4. **查看弹窗**（720px）：只读全字段；按收费方式展示费率/标准；**账号分配状态**、**已分配登录名**、审计信息；底部：**分配账号**（未分配时）、编辑、删除、关闭。

---

## 4. 业务规则（前端）

| 规则 | 实现 |
| --- | --- |
| 供应商编号 | 新增 `buildPayload` **不传** `supplierCode`；编辑弹窗只读展示 |
| 供应商类型 | `1` 个体户 → 身份证、`ID_CARD_REG`；`2` 企业 → USCC、`USCC_REG` |
| 收费联动 | `feeMethod=1` 隐藏费率；`=2` 显示 `feeStandard`；`=3` 显示两费率 0～100% |
| 提交清洗 | `buildPayload` 按收费方式置不适用字段为 `null` |
| 车辆号牌 | `vehiclePlateList` 编辑；提交为 `vehiclePlates` 数组；`PLATE_REG`；最多 10 条 |
| 名称/手机 | 名称 trim 1～20 字；`PHONE_REG`；身份号 `trim().toUpperCase()` |
| 列表筛选 | `supplierCode`、`supplierName` **精确**（与承销商模糊不同） |
| 列表展示 | 优先 `supplierTypeName`/`feeMethodName`；车牌 `、` 拼接 |
| 删除 | 确认框展示编号、名称；后端存在未结算结算单时 msg「存在未结算的结算单，无法删除」，由 `request` 拦截器 toast |
| 分配账号 | `canAssignAccount(row)`：`Number(row.accountAssigned) === 0` 且有 `assignAccount` 权限；确认 `confirmAssign`；调 `assignAccountSupplier`；成功 toast `msgAssignOk` 并刷新列表；详情弹窗打开时重新 `getSupplier` |
| 账号列 | `accountAssigned === 1` 显示「是」+ `assignedLoginName`；否则「否」 |
| 后端角色 | 分配账号绑定角色 **103**（承销商为 104） |

**枚举常量（页面内）**

| 常量 | 值 |
| --- | --- |
| 个体户 | `supplierType = 1` |
| 企业 | `supplierType = 2` |
| 按户计费 | `feeMethod = 1` |
| 按头计费 | `feeMethod = 2` |
| 按额计费 | `feeMethod = 3` |

**正则（页面内）**

| 名称 | 用途 |
| --- | --- |
| `ID_CARD_REG` | 18 位居民身份证 |
| `USCC_REG` | 18 位统一社会信用代码 |
| `PHONE_REG` | 大陆手机号 |
| `PLATE_REG` | 车牌号 |

**提交字段（`buildPayload`）**

| 字段 | 新增 | 修改 | 说明 |
| --- | --- | --- | --- |
| `supplierName` | Y | Y | trim |
| `supplierType` | Y | Y | |
| `identityNo` | Y | Y | 大写 |
| `contactPhone` | Y | Y | |
| `businessLocation` | N | N | |
| `vehiclePlates` | N | N | 字符串数组，≤10 |
| `feeMethod` | Y | Y | |
| `feeStandard` | 条件 | 条件 | `feeMethod=2` |
| `transactionFeeRate` | 条件 | 条件 | `feeMethod=3` |
| `managementFeeRate` | 条件 | 条件 | `feeMethod=3` |
| `remark` | N | N | |
| `id` | — | Y | |
| `supplierCode` | **禁止** | **禁止** | |

---

## 5. 国际化

| 项 | 说明 |
| --- | --- |
| **语言包** | `tradeMarket.supplier`（`lang/zh/tradeMarket.js`、`lang/bo/tradeMarket.js`） |
| **Mixin** | `tradeMarketLocaleMixin`，`tmNs = 'supplier'`，方法 `tmT` / `tmCommon` |
| **公共文案** | `tradeMarket.common.*`（含 `assignAccount`、`msgAssignOk`） |
| **状态文案** | `tradeMarket.status.yes` / `no` / `dash` |

**`supplier` 节点扩展键（v1.3）**

| 键 | 用途 |
| --- | --- |
| `colAccount` | 账号分配列 |
| `viewAssignedLogin` | 详情已分配登录名 |
| `confirmAssign` | 分配账号确认 |

---

## 6. 联调说明

1. 部署 `BizSupplierController` 及 `biz_supplier` 表；已分配账号字段见 `alter_biz_supplier_distributor_assign_account.sql`。  
2. 菜单组件 `tradeMarket/supplier/index`，权限与后端 §4 一致（含 `assignAccount`）。  
3. 验证项：  
   - 编号/名称**精确**筛选  
   - 三种收费方式新增/修改与字段联动  
   - 个体户/企业证件切换  
   - 车辆多条与车牌校验  
   - 修改时编号不可变  
   - **分配账号仅一次**；列表与详情展示登录名  
   - 存在未结算结算单时删除失败提示  
   - 逻辑删除后列表不可见  
   - 汉藏双语切换

---

## 7. 文件清单

| 类型 | 路径 |
| --- | --- |
| 页面 | `ruoyi-ui/src/views/tradeMarket/supplier/index.vue` |
| API | `ruoyi-ui/src/api/tradeMarket/supplier.js` |
| Mixin | `ruoyi-ui/src/mixins/tradeMarketLocaleMixin.js` |
| i18n | `ruoyi-ui/src/lang/zh/tradeMarket.js`、`lang/bo/tradeMarket.js`（`supplier` 节点及 `common`/`status`） |

---

## 8. 与承销商前端对照

| 项 | 供应商 | 承销商 |
| --- | --- | --- |
| 页面 | `tradeMarket/supplier/index.vue` | `tradeMarket/distributor/index.vue` |
| 筛选 | 编号/名称**精确** | **模糊** |
| 特色字段 | 车辆号牌、收费方式/费率 | **销售去向** |
| 分配账号 API | `assignAccountSupplier` | `assignAccountDistributor` |
| 后端角色 | **103** | **104** |
| 编辑弹窗宽度 | 550px | 720px |

---

## 9. 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：双卡片 CRUD；收费三档联动；车辆动态行；汉藏 i18n |
| 1.1 | 分配账号 API/列表列/操作按钮；权限 `assignAccount`（方案稿） |
| 1.3 | **与实现对齐**：落地 `assignAccountSupplier`、账号列/详情/列表操作、`canAssignAccount`/`handleAssignAccount`；删除未结算结算单联调说明；`buildPayload` 字段表；i18n 扩展键；与承销商对照表；同步后端 v1.3 |
