# 供应商管理模块开发总结 ## 📋 需求来源 根据 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