Files
oneos-backend/yudao-module-asset/SUPPLIER_MANAGEMENT_SUMMARY.md
kkfluous 43f2f054e9 feat: 实现供应商管理模块
- 新增供应商管理功能
  - 数据库表:asset_supplier(27个字段)
  - 基本信息:供应商编码、名称、类型、合作状态等
  - 开票信息:税号、开票地址、账号、开户行等
  - 完整的 CRUD 接口

- 后端代码
  - Controller/Service/Mapper/VO/DO 完整实现
  - 支持多条件分页查询
  - 字段验证(手机号、邮箱格式)
  - 供应商编码唯一性约束

- API 接口
  - POST /asset/supplier/create - 创建供应商
  - PUT /asset/supplier/update - 更新供应商
  - DELETE /asset/supplier/delete - 删除供应商
  - GET /asset/supplier/get - 获取供应商详情
  - GET /asset/supplier/page - 分页查询供应商

- 查询功能
  - 供应商编码精确查询
  - 合作状态多选筛选
  - 供应商名称模糊查询
  - 供应商类型多选筛选
  - 区域多选筛选
  - 城市精确查询
  - 创建者筛选

- 菜单和权限
  - 供应商管理菜单
  - 5个按钮权限(查询、创建、更新、删除、导出)

- 文档
  - 供应商管理模块开发总结
  - 数据库初始化脚本
2026-03-12 21:09:06 +08:00

354 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 供应商管理模块开发总结
## 📋 需求来源
根据 ONE-OS 前端原型 `/Users/kkfluous/Projects/ai-coding/ln-oneos/ONE-OS/web端/业务管理/供应商管理*.jsx` 进行后端设计开发。
## 🎯 功能概述
供应商管理模块用于管理企业的各类供应商信息,包括加氢站、充电站、维修站、保险公司、备件供应商等。
### 核心功能
- ✅ 供应商列表查询(支持多条件筛选)
- ✅ 供应商新增
- ✅ 供应商编辑
- ✅ 供应商查看
- ✅ 供应商删除
- 🔲 供应商导入(待实现)
- 🔲 供应商导出(待实现)
## 📊 数据模型
### 供应商信息表 (asset_supplier)
#### 基本信息
| 字段 | 类型 | 说明 | 必填 |
|------|------|------|------|
| id | BIGINT | 主键ID | ✓ |
| supplier_code | VARCHAR(50) | 供应商编码 | ✓ |
| coop_status | VARCHAR(20) | 合作状态 | ✓ |
| supplier_name | VARCHAR(100) | 供应商名称 | ✓ |
| type | VARCHAR(50) | 供应商类型 | ✓ |
| province | VARCHAR(50) | 省份 | |
| city | VARCHAR(50) | 城市 | |
| address | VARCHAR(255) | 详细地址 | |
| region | VARCHAR(20) | 区域 | |
| contact | VARCHAR(50) | 联系人 | |
| contact_mobile | VARCHAR(20) | 联系手机 | |
| contact_phone | VARCHAR(50) | 联系电话 | |
| email | VARCHAR(100) | 邮箱 | |
| credit_code_or_id | VARCHAR(100) | 统一社会信用代码/身份证号 | |
| remark | VARCHAR(500) | 备注 | |
#### 开票信息
| 字段 | 类型 | 说明 |
|------|------|------|
| tax_id | VARCHAR(100) | 税号 |
| invoice_address | VARCHAR(255) | 开票地址 |
| invoice_phone | VARCHAR(50) | 开票电话 |
| account | VARCHAR(100) | 账号 |
| opening_bank | VARCHAR(200) | 开户行 |
| mailing_address | VARCHAR(255) | 邮寄地址 |
#### 审计字段
| 字段 | 类型 | 说明 |
|------|------|------|
| creator | VARCHAR(64) | 创建者 |
| create_time | DATETIME | 创建时间 |
| updater | VARCHAR(64) | 更新者 |
| update_time | DATETIME | 更新时间 |
| deleted | BIT(1) | 是否删除 |
| tenant_id | BIGINT | 租户编号 |
### 索引设计
- PRIMARY KEY: `id`
- UNIQUE KEY: `uk_supplier_code` (supplier_code, deleted)
- INDEX: `idx_supplier_name` (supplier_name)
- INDEX: `idx_coop_status` (coop_status)
- INDEX: `idx_type` (type)
- INDEX: `idx_region` (region)
- INDEX: `idx_city` (city)
- INDEX: `idx_create_time` (create_time)
- INDEX: `idx_tenant_id` (tenant_id)
## 🏗️ 代码结构
### 后端文件清单
```
yudao-module-asset/yudao-module-asset-server/
├── src/main/java/cn/iocoder/yudao/module/asset/
│ ├── controller/admin/supplier/
│ │ ├── SupplierController.java # 控制器
│ │ └── vo/
│ │ ├── SupplierBaseVO.java # 基础 VO
│ │ ├── SupplierSaveReqVO.java # 创建/更新 Request VO
│ │ ├── SupplierRespVO.java # 响应 VO
│ │ └── SupplierPageReqVO.java # 分页查询 Request VO
│ ├── service/supplier/
│ │ ├── SupplierService.java # Service 接口
│ │ └── SupplierServiceImpl.java # Service 实现
│ ├── convert/supplier/
│ │ └── SupplierConvert.java # 对象转换
│ ├── dal/
│ │ ├── dataobject/supplier/
│ │ │ └── SupplierDO.java # 数据对象
│ │ └── mysql/supplier/
│ │ └── SupplierMapper.java # Mapper
│ └── enums/
│ └── ErrorCodeConstants.java # 错误码(已更新)
└── sql/mysql/
└── supplier.sql # 数据库脚本
```
## 🔌 API 接口
### 基础路径
```
/asset/supplier
```
### 接口列表
#### 1. 创建供应商
```
POST /asset/supplier/create
权限: asset:supplier:create
```
**Request Body**
```json
{
"supplierCode": "GYS-2025-001",
"coopStatus": "已合作",
"supplierName": "嘉兴某某加氢站",
"type": "加氢站",
"province": "浙江省",
"city": "嘉兴市",
"address": "浙江省嘉兴市南湖区科技大道1号",
"region": "华东",
"contact": "张三",
"contactMobile": "13800138001",
"contactPhone": "0571-88888888",
"email": "zhangsan@example.com",
"creditCodeOrId": "91330400MA2XXXXX1",
"remark": "",
"taxId": "91330400MA2XXXXX1",
"invoiceAddress": "浙江省嘉兴市南湖区科技大道1号",
"invoicePhone": "0571-88888888",
"account": "6222021234567890123",
"openingBank": "中国工商银行嘉兴分行",
"mailingAddress": "浙江省嘉兴市南湖区科技大道1号"
}
```
**Response**
```json
{
"code": 0,
"data": 1,
"msg": "操作成功"
}
```
#### 2. 更新供应商
```
PUT /asset/supplier/update
权限: asset:supplier:update
```
**Request Body**
```json
{
"id": 1,
"supplierCode": "GYS-2025-001",
"coopStatus": "已合作",
"supplierName": "嘉兴某某加氢站",
...
}
```
#### 3. 删除供应商
```
DELETE /asset/supplier/delete?id=1
权限: asset:supplier:delete
```
#### 4. 获取供应商详情
```
GET /asset/supplier/get?id=1
权限: asset:supplier:query
```
**Response**
```json
{
"code": 0,
"data": {
"id": 1,
"supplierCode": "GYS-2025-001",
"coopStatus": "已合作",
"supplierName": "嘉兴某某加氢站",
"type": "加氢站",
"province": "浙江省",
"city": "嘉兴市",
"address": "浙江省嘉兴市南湖区科技大道1号",
"region": "华东",
"contact": "张三",
"contactMobile": "13800138001",
"contactPhone": "0571-88888888",
"email": "zhangsan@example.com",
"creditCodeOrId": "91330400MA2XXXXX1",
"remark": "",
"taxId": "91330400MA2XXXXX1",
"invoiceAddress": "浙江省嘉兴市南湖区科技大道1号",
"invoicePhone": "0571-88888888",
"account": "6222021234567890123",
"openingBank": "中国工商银行嘉兴分行",
"mailingAddress": "浙江省嘉兴市南湖区科技大道1号",
"creator": "admin",
"createTime": "2025-01-10T09:30:00",
"updater": "admin",
"updateTime": "2025-01-10T09:30:00"
},
"msg": "操作成功"
}
```
#### 5. 分页查询供应商
```
GET /asset/supplier/page
权限: asset:supplier:query
```
**Query Parameters**
- `pageNo`: 页码(默认 1
- `pageSize`: 每页数量(默认 10
- `supplierCode`: 供应商编码(精确匹配)
- `coopStatus`: 合作状态列表(多选)
- `supplierName`: 供应商名称(模糊查询)
- `type`: 供应商类型列表(多选)
- `region`: 区域列表(多选)
- `city`: 城市(精确匹配)
- `creator`: 创建者(精确匹配)
**Response**
```json
{
"code": 0,
"data": {
"list": [...],
"total": 100
},
"msg": "操作成功"
}
```
## 📚 字典数据
### 合作状态 (coop_status)
- 已合作
- 终止合作
- 洽谈中
- 合约过期
### 供应商类型 (type)
- 备件供应商
- 保险公司
- 加氢站
- 充电站
- 维修站
- 救援车队
- 整车厂
- 其他
### 区域 (region)
- 华北
- 华东
- 华南
- 华中
- 东北
- 西南
- 西北
## ✅ 已完成工作
### 1. 数据库设计
- ✅ 创建 `asset_supplier`
- ✅ 设计合理的索引
- ✅ 添加菜单和权限配置
### 2. 后端代码
- ✅ DO (Data Object)
- ✅ Mapper
- ✅ VO (View Object)
- ✅ Convert (对象转换)
- ✅ Service 接口和实现
- ✅ Controller
- ✅ 错误码常量
### 3. 编译验证
- ✅ Maven 编译通过
- ✅ 无语法错误
### 4. 数据库初始化
- ✅ 供应商表创建成功27 个字段)
- ✅ 菜单创建成功ID: 5062
- ✅ 5 个按钮权限创建成功
## 🔲 待完成工作
### 1. 导入导出功能
- 🔲 Excel 导入模板设计
- 🔲 Excel 导入功能实现
- 🔲 Excel 导出功能实现
### 2. 数据字典配置
- 🔲 在系统字典中配置合作状态
- 🔲 在系统字典中配置供应商类型
### 3. 前端开发
- 🔲 供应商列表页面
- 🔲 供应商新增页面
- 🔲 供应商编辑页面
- 🔲 供应商查看页面
### 4. 测试
- 🔲 单元测试
- 🔲 集成测试
- 🔲 API 接口测试
## 🎯 使用说明
### 启动服务
1. 确保数据库已初始化
2. 启动 `yudao-server` 应用
3. 访问 Swagger 文档: `http://localhost:48080/doc.html`
### API 测试
使用 Postman 或 Swagger UI 测试接口:
1. 先登录获取 token
2. 在请求头中添加 `Authorization: Bearer {token}`
3. 调用供应商管理接口
## 📝 注意事项
1. **供应商编码唯一性**: `supplier_code` 字段有唯一索引,不能重复
2. **手机号格式验证**: 使用正则表达式验证手机号格式
3. **邮箱格式验证**: 使用 `@Email` 注解验证邮箱格式
4. **软删除**: 使用 `deleted` 字段实现软删除,不会物理删除数据
5. **多租户**: 支持多租户隔离,通过 `tenant_id` 字段区分
## 🔗 相关模块
- 客户管理模块 (Customer)
- 车辆管理模块 (Vehicle)
- 停车场管理模块 (Parking)
- 车型参数管理模块 (VehicleModel)
---
**开发日期**: 2026-03-12
**开发人员**: AI Assistant
**版本**: v1.0.0