# 采购交易信息管理 - API接口文档 ## 文档信息 - **模块名称**: 采购交易信息管理 - **Controller**: `CcdiPurchaseTransactionController` - **Base Path**: `/ccdi/purchaseTransaction` - **Swagger**: http://localhost:8080/swagger-ui/index.html - **生成时间**: 2026-02-06 --- ## 目录 1. [接口列表](#接口列表) 2. [接口详情](#接口详情) 3. [数据模型](#数据模型) 4. [错误码说明](#错误码说明) 5. [接口示例](#接口示例) --- ## 接口列表 | 序号 | 接口名称 | HTTP方法 | 路径 | 权限标识 | 说明 | |----|----------|--------|--------------------------|---------------------------------|-------------| | 1 | 查询采购交易列表 | GET | /list | ccdi:purchaseTransaction:list | 分页查询采购交易信息 | | 2 | 获取采购交易详情 | GET | /{purchaseId} | ccdi:purchaseTransaction:query | 根据ID获取详细信息 | | 3 | 新增采购交易 | POST | / | ccdi:purchaseTransaction:add | 新增采购交易记录 | | 4 | 修改采购交易 | PUT | / | ccdi:purchaseTransaction:edit | 修改采购交易记录 | | 5 | 删除采购交易 | DELETE | /{purchaseIds} | ccdi:purchaseTransaction:remove | 删除采购交易记录 | | 6 | 导出采购交易 | POST | /export | ccdi:purchaseTransaction:export | 导出Excel文件 | | 7 | 下载导入模板 | POST | /importTemplate | 无 | 下载带下拉框的模板 | | 8 | 导入采购交易 | POST | /importData | ccdi:purchaseTransaction:import | 异步导入Excel数据 | | 9 | 查询导入状态 | GET | /importStatus/{taskId} | ccdi:purchaseTransaction:import | 查询异步导入进度 | | 10 | 查询导入失败记录 | GET | /importFailures/{taskId} | ccdi:purchaseTransaction:import | 查询导入失败详情 | --- ## 接口详情 ### 1. 查询采购交易列表 **接口描述**: 分页查询采购交易信息列表,支持多条件查询 **请求方式**: `GET` **请求路径**: `/ccdi/purchaseTransaction/list` **权限要求**: `ccdi:purchaseTransaction:list` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | 示例值 | |------------------------|---------|----|-------------|------------| | pageNum | Integer | 否 | 页码,默认1 | 1 | | pageSize | Integer | 否 | 每页条数,默认10 | 10 | | projectName | String | 否 | 项目名称(模糊查询) | 办公设备采购 | | subjectName | String | 否 | 标的物名称(模糊查询) | 电脑 | | applicantName | String | 否 | 申请人姓名(模糊查询) | 张三 | | params[beginApplyDate] | String | 否 | 申请日期起始 | 2025-01-01 | | params[endApplyDate] | String | 否 | 申请日期结束 | 2025-12-31 | **响应示例**: ```json { "code": 200, "msg": "查询成功", "rows": [ { "purchaseId": "PO20250206001", "purchaseCategory": "货物类", "projectName": "办公设备采购项目", "subjectName": "笔记本电脑", "subjectDesc": "高性能办公笔记本", "purchaseQty": 50.00, "budgetAmount": 500000.00, "bidAmount": 450000.00, "actualAmount": 455000.00, "contractAmount": 450000.00, "settlementAmount": 455000.00, "purchaseMethod": "公开招标", "supplierName": "某某科技有限公司", "contactPerson": "李四", "contactPhone": "13800138000", "supplierUscc": "91110000MA000000XX", "supplierBankAccount": "1234567890123456789", "applyDate": "2025-01-01", "planApproveDate": "2025-01-05", "announceDate": "2025-01-10", "bidOpenDate": "2025-01-15", "contractSignDate": "2025-01-20", "expectedDeliveryDate": "2025-02-01", "actualDeliveryDate": "2025-02-01", "acceptanceDate": "2025-02-05", "settlementDate": "2025-02-10", "applicantId": "E001001", "applicantName": "张三", "applyDepartment": "信息技术部", "purchaseLeaderId": "E002001", "purchaseLeaderName": "王五", "purchaseDepartment": "采购部", "createTime": "2025-02-06 10:00:00", "updateTime": "2025-02-06 10:00:00", "createdBy": "admin", "updatedBy": "admin" } ], "total": 100 } ``` --- ### 2. 获取采购交易详情 **接口描述**: 根据采购事项ID获取详细信息 **请求方式**: `GET` **请求路径**: `/ccdi/purchaseTransaction/{purchaseId}` **权限要求**: `ccdi:purchaseTransaction:query` **路径参数**: | 参数名 | 类型 | 必填 | 说明 | 示例值 | |------------|--------|----|--------|---------------| | purchaseId | String | 是 | 采购事项ID | PO20250206001 | **响应示例**: ```json { "code": 200, "msg": "操作成功", "data": { "purchaseId": "PO20250206001", "purchaseCategory": "货物类", "projectName": "办公设备采购项目", "subjectName": "笔记本电脑", "subjectDesc": "高性能办公笔记本", "purchaseQty": 50.00, "budgetAmount": 500000.00, "bidAmount": 450000.00, "actualAmount": 455000.00, "contractAmount": 450000.00, "settlementAmount": 455000.00, "purchaseMethod": "公开招标", "supplierName": "某某科技有限公司", "contactPerson": "李四", "contactPhone": "13800138000", "supplierUscc": "91110000MA000000XX", "supplierBankAccount": "1234567890123456789", "applyDate": "2025-01-01", "planApproveDate": "2025-01-05", "announceDate": "2025-01-10", "bidOpenDate": "2025-01-15", "contractSignDate": "2025-01-20", "expectedDeliveryDate": "2025-02-01", "actualDeliveryDate": "2025-02-01", "acceptanceDate": "2025-02-05", "settlementDate": "2025-02-10", "applicantId": "E001001", "applicantName": "张三", "applyDepartment": "信息技术部", "purchaseLeaderId": "E002001", "purchaseLeaderName": "王五", "purchaseDepartment": "采购部", "createTime": "2025-02-06 10:00:00", "updateTime": "2025-02-06 10:00:00", "createdBy": "admin", "updatedBy": "admin" } } ``` --- ### 3. 新增采购交易 **接口描述**: 新增采购交易记录 **请求方式**: `POST` **请求路径**: `/ccdi/purchaseTransaction` **权限要求**: `ccdi:purchaseTransaction:add` **请求头**: ``` Content-Type: application/json Authorization: Bearer {token} ``` **请求体** (`CcdiPurchaseTransactionAddDTO`): | 参数名 | 类型 | 必填 | 说明 | 示例值 | |----------------------|------------|----|----------------------|---------------------| | purchaseId | String | 是 | 采购事项ID(最大32字符) | PO20250206001 | | purchaseCategory | String | 否 | 采购类别(最大50字符) | 货物类 | | projectName | String | 否 | 项目名称(最大200字符) | 办公设备采购项目 | | subjectName | String | 否 | 标的物名称(最大200字符) | 笔记本电脑 | | subjectDesc | String | 否 | 标的物描述(最大500字符) | 高性能办公笔记本 | | purchaseQty | BigDecimal | 否 | 采购数量 | 50.00 | | budgetAmount | BigDecimal | 否 | 预算金额 | 500000.00 | | bidAmount | BigDecimal | 否 | 中标金额 | 450000.00 | | actualAmount | BigDecimal | 否 | 实际采购金额 | 455000.00 | | contractAmount | BigDecimal | 否 | 合同金额 | 450000.00 | | settlementAmount | BigDecimal | 否 | 结算金额 | 455000.00 | | purchaseMethod | String | 否 | 采购方式(最大50字符) | 公开招标 | | supplierName | String | 否 | 供应商名称(最大200字符) | 某某科技有限公司 | | supplierUscc | String | 否 | 供应商统一信用代码(最大18字符) | 91110000MA000000XX | | contactPerson | String | 否 | 供应商联系人(最大50字符) | 李四 | | contactPhone | String | 否 | 供应商联系电话(最大20字符) | 13800138000 | | supplierBankAccount | String | 否 | 供应商银行账户(最大50字符) | 1234567890123456789 | | applyDate | String | 否 | 采购申请日期(yyyy-MM-dd) | 2025-01-01 | | planApproveDate | String | 否 | 采购计划批准日期(yyyy-MM-dd) | 2025-01-05 | | announceDate | String | 否 | 采购公告发布日期(yyyy-MM-dd) | 2025-01-10 | | bidOpenDate | String | 否 | 开标日期(yyyy-MM-dd) | 2025-01-15 | | contractSignDate | String | 否 | 合同签订日期(yyyy-MM-dd) | 2025-01-20 | | expectedDeliveryDate | String | 否 | 预计交货日期(yyyy-MM-dd) | 2025-02-01 | | actualDeliveryDate | String | 否 | 实际交货日期(yyyy-MM-dd) | 2025-02-01 | | acceptanceDate | String | 否 | 验收日期(yyyy-MM-dd) | 2025-02-05 | | settlementDate | String | 否 | 结算日期(yyyy-MM-dd) | 2025-02-10 | | applicantId | String | 否 | 申请人工号(最大20字符) | E001001 | | applicantName | String | 否 | 申请人姓名(最大50字符) | 张三 | | applyDepartment | String | 否 | 申请部门(最大100字符) | 信息技术部 | | purchaseLeaderId | String | 否 | 采购负责人工号(最大20字符) | E002001 | | purchaseLeaderName | String | 否 | 采购负责人姓名(最大50字符) | 王五 | | purchaseDepartment | String | 否 | 采购部门(最大100字符) | 采购部 | **请求示例**: ```json { "purchaseId": "PO20250206001", "purchaseCategory": "货物类", "projectName": "办公设备采购项目", "subjectName": "笔记本电脑", "subjectDesc": "高性能办公笔记本", "purchaseQty": 50.00, "budgetAmount": 500000.00, "bidAmount": 450000.00, "actualAmount": 455000.00, "contractAmount": 450000.00, "settlementAmount": 455000.00, "purchaseMethod": "公开招标", "supplierName": "某某科技有限公司", "supplierUscc": "91110000MA000000XX", "contactPerson": "李四", "contactPhone": "13800138000", "supplierBankAccount": "1234567890123456789", "applyDate": "2025-01-01", "planApproveDate": "2025-01-05", "announceDate": "2025-01-10", "bidOpenDate": "2025-01-15", "contractSignDate": "2025-01-20", "expectedDeliveryDate": "2025-02-01", "actualDeliveryDate": "2025-02-01", "acceptanceDate": "2025-02-05", "settlementDate": "2025-02-10", "applicantId": "E001001", "applicantName": "张三", "applyDepartment": "信息技术部", "purchaseLeaderId": "E002001", "purchaseLeaderName": "王五", "purchaseDepartment": "采购部" } ``` **响应示例**: ```json { "code": 200, "msg": "操作成功" } ``` --- ### 4. 修改采购交易 **接口描述**: 修改采购交易记录 **请求方式**: `PUT` **请求路径**: `/ccdi/purchaseTransaction` **权限要求**: `ccdi:purchaseTransaction:edit` **请求头**: ``` Content-Type: application/json Authorization: Bearer {token} ``` **请求体** (`CcdiPurchaseTransactionEditDTO`): 参数同新增接口,但purchaseId为必填且不可修改。 **响应示例**: ```json { "code": 200, "msg": "操作成功" } ``` --- ### 5. 删除采购交易 **接口描述**: 删除采购交易记录(支持批量删除) **请求方式**: `DELETE` **请求路径**: `/ccdi/purchaseTransaction/{purchaseIds}` **权限要求**: `ccdi:purchaseTransaction:remove` **路径参数**: | 参数名 | 类型 | 必填 | 说明 | 示例值 | |-------------|----------|----|------------------|-----------------------------| | purchaseIds | String[] | 是 | 采购事项ID数组,多个用逗号分隔 | PO20250206001,PO20250206002 | **请求示例**: ``` DELETE /ccdi/purchaseTransaction/PO20250206001,PO20250206002 ``` **响应示例**: ```json { "code": 200, "msg": "操作成功" } ``` --- ### 6. 导出采购交易 **接口描述**: 导出采购交易信息到Excel文件 **请求方式**: `POST` **请求路径**: `/ccdi/purchaseTransaction/export` **权限要求**: `ccdi:purchaseTransaction:export` **请求参数**: 同查询接口,支持条件导出 **响应**: Excel文件流 **请求示例**: ```bash curl -X POST "http://localhost:8080/ccdi/purchaseTransaction/export" \ -H "Authorization: Bearer {token}" \ -d "projectName=办公设备&applicantName=张三" ``` --- ### 7. 下载导入模板 **接口描述**: 下载带字典下拉框的Excel导入模板 **请求方式**: `POST` **请求路径**: `/ccdi/purchaseTransaction/importTemplate` **权限要求**: 无 **响应**: Excel模板文件流(包含数据验证下拉框) **请求示例**: ```bash curl -X POST "http://localhost:8080/ccdi/purchaseTransaction/importTemplate" \ -H "Authorization: Bearer {token}" \ -o purchase_transaction_template.xlsx ``` --- ### 8. 导入采购交易 **接口描述**: 异步导入Excel数据 **请求方式**: `POST` **请求路径**: `/ccdi/purchaseTransaction/importData?updateSupport={updateSupport}` **权限要求**: `ccdi:purchaseTransaction:import` **请求头**: ``` Content-Type: multipart/form-data Authorization: Bearer {token} ``` **路径参数**: | 参数名 | 类型 | 必填 | 说明 | 示例值 | |---------------|---------|----|-----------|------------| | updateSupport | boolean | 是 | 是否更新已存在数据 | true/false | **表单参数**: | 参数名 | 类型 | 必填 | 说明 | |------|------|----|---------------------| | file | File | 是 | Excel文件(.xlsx或.xls) | **响应示例**: ```json { "code": 200, "msg": "导入任务已提交,任务ID:task-20250206-123456789" } ``` --- ### 9. 查询导入状态 **接口描述**: 查询异步导入任务的执行状态 **请求方式**: `GET` **请求路径**: `/ccdi/purchaseTransaction/importStatus/{taskId}` **权限要求**: `ccdi:purchaseTransaction:import` **路径参数**: | 参数名 | 类型 | 必填 | 说明 | 示例值 | |--------|--------|----|------|-------------------------| | taskId | String | 是 | 任务ID | task-20250206-123456789 | **响应示例**: ```json { "code": 200, "msg": "操作成功", "data": { "taskId": "task-20250206-123456789", "status": "completed", "total": 1000, "successCount": 980, "failureCount": 20, "errorMsg": null } } ``` **状态说明**: - `pending`: 等待执行 - `running`: 正在执行 - `completed`: 执行完成 - `failed`: 执行失败 --- ### 10. 查询导入失败记录 **接口描述**: 查询导入任务中失败的记录详情 **请求方式**: `GET` **请求路径**: `/ccdi/purchaseTransaction/importFailures/{taskId}` **权限要求**: `ccdi:purchaseTransaction:import` **路径参数**: | 参数名 | 类型 | 必填 | 说明 | 示例值 | |--------|--------|----|------|-------------------------| | taskId | String | 是 | 任务ID | task-20250206-123456789 | **响应示例**: ```json { "code": 200, "msg": "操作成功", "data": [ { "purchaseId": "PO20250206001", "rowNum": 5, "errorMessage": "采购事项ID已存在" }, { "purchaseId": "PO20250206002", "rowNum": 12, "errorMessage": "预算金额格式错误" } ] } ``` --- ## 数据模型 ### CcdiPurchaseTransactionVO (查询返回对象) 采购交易信息的视图对象,用于列表查询和详情展示。 ### CcdiPurchaseTransactionAddDTO (新增请求对象) 新增采购交易时的请求参数对象。 ### CcdiPurchaseTransactionEditDTO (修改请求对象) 修改采购交易时的请求参数对象。 ### CcdiPurchaseTransactionQueryDTO (查询请求对象) 查询条件参数对象。 ### CcdiPurchaseTransactionExcel (导入导出对象) Excel导入导出使用的数据对象,支持字典下拉框。 ### ImportStatusVO (导入状态对象) 异步导入任务的状态信息。 | 字段 | 类型 | 说明 | |--------------|---------|-------------------------------------| | taskId | String | 任务ID | | status | String | 状态:pending/running/completed/failed | | total | Integer | 总记录数 | | successCount | Integer | 成功数量 | | failureCount | Integer | 失败数量 | | errorMsg | String | 错误信息(失败时) | ### PurchaseTransactionImportFailureVO (导入失败记录对象) 导入失败的记录详情。 | 字段 | 类型 | 说明 | |--------------|---------|--------| | purchaseId | String | 采购事项ID | | rowNum | Integer | 行号 | | errorMessage | String | 错误信息 | --- ## 错误码说明 ### HTTP状态码 | 状态码 | 说明 | |-----|----------------| | 200 | 请求成功 | | 401 | 未授权,token无效或过期 | | 403 | 无权限访问 | | 404 | 资源不存在 | | 500 | 服务器内部错误 | ### 业务错误码 | code | msg | 说明 | |------|-------|-------------| | 200 | 操作成功 | 请求成功处理 | | 500 | 操作失败 | 服务器处理失败 | | 401 | 请先登录 | 未登录或token过期 | | 403 | 无权限访问 | 权限不足 | --- ## 接口示例 ### 1. 完整的CRUD流程 ```bash # 1. 登录获取token TOKEN=$(curl -s -X POST "http://localhost:8080/login/test" \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"admin123"}' \ | jq -r '.token') # 2. 查询列表 curl -X GET "http://localhost:8080/ccdi/purchaseTransaction/list?pageNum=1&pageSize=10" \ -H "Authorization: Bearer $TOKEN" # 3. 新增记录 curl -X POST "http://localhost:8080/ccdi/purchaseTransaction" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "purchaseId": "PO20250206001", "projectName": "办公设备采购项目", "subjectName": "笔记本电脑", "budgetAmount": 500000.00 }' # 4. 获取详情 curl -X GET "http://localhost:8080/ccdi/purchaseTransaction/PO20250206001" \ -H "Authorization: Bearer $TOKEN" # 5. 修改记录 curl -X PUT "http://localhost:8080/ccdi/purchaseTransaction" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "purchaseId": "PO20250206001", "projectName": "办公设备采购项目(修改)", "subjectName": "笔记本电脑", "budgetAmount": 550000.00 }' # 6. 删除记录 curl -X DELETE "http://localhost:8080/ccdi/purchaseTransaction/PO20250206001" \ -H "Authorization: Bearer $TOKEN" ``` ### 2. 导入导出流程 ```bash # 1. 下载模板 curl -X POST "http://localhost:8080/ccdi/purchaseTransaction/importTemplate" \ -H "Authorization: Bearer $TOKEN" \ -o template.xlsx # 2. 填写数据后导入 curl -X POST "http://localhost:8080/ccdi/purchaseTransaction/importData?updateSupport=false" \ -H "Authorization: Bearer $TOKEN" \ -F "file=@data.xlsx" # 响应: {"code":200,"msg":"导入任务已提交,任务ID:task-xxx"} # 3. 查询导入状态 curl -X GET "http://localhost:8080/ccdi/purchaseTransaction/importStatus/task-xxx" \ -H "Authorization: Bearer $TOKEN" # 4. 如果有失败,查询失败记录 curl -X GET "http://localhost:8080/ccdi/purchaseTransaction/importFailures/task-xxx" \ -H "Authorization: Bearer $TOKEN" # 5. 导出数据 curl -X POST "http://localhost:8080/ccdi/purchaseTransaction/export" \ -H "Authorization: Bearer $TOKEN" \ -d "projectName=办公设备" \ -o export_data.xlsx ``` ### 3. Postman测试步骤 1. **创建环境变量**: - `base_url`: http://localhost:8080 - `token`: (登录后获取) 2. **创建Pre-request Script**: ```javascript // 自动设置token if (!pm.environment.get("token")) { const loginRequest = { url: pm.environment.get("base_url") + "/login/test", method: "POST", header: {"Content-Type": "application/json"}, body: { mode: "raw", raw: JSON.stringify({username: "admin", password: "admin123"}) } }; pm.sendRequest(loginRequest, (err, res) => { pm.environment.set("token", res.json().token); }); } ``` 3. **设置Authorization**: - Type: Bearer Token - Token: `{{token}}` 4. **执行测试**: - 按接口顺序执行 - 查看响应结果 - 验证数据正确性 --- ## 附录 ### A. 数据库表结构 表名: `ccdi_purchase_transaction` | 字段名 | 类型 | 说明 | 备注 | |------------------------|---------------|-----------|------| | purchase_id | varchar(32) | 采购事项ID | 主键 | | purchase_category | varchar(50) | 采购类别 | | | project_name | varchar(200) | 项目名称 | | | subject_name | varchar(200) | 标的物名称 | | | subject_desc | varchar(500) | 标的物描述 | | | purchase_qty | decimal(10,2) | 采购数量 | | | budget_amount | decimal(15,2) | 预算金额 | | | bid_amount | decimal(15,2) | 中标金额 | | | actual_amount | decimal(15,2) | 实际采购金额 | | | contract_amount | decimal(15,2) | 合同金额 | | | settlement_amount | decimal(15,2) | 结算金额 | | | purchase_method | varchar(50) | 采购方式 | | | supplier_name | varchar(200) | 中标供应商名称 | | | contact_person | varchar(50) | 供应商联系人 | | | contact_phone | varchar(20) | 供应商联系电话 | | | supplier_uscc | varchar(18) | 供应商统一信用代码 | | | supplier_bank_account | varchar(50) | 供应商银行账户 | | | apply_date | date | 采购申请日期 | | | plan_approve_date | date | 采购计划批准日期 | | | announce_date | date | 采购公告发布日期 | | | bid_open_date | date | 开标日期 | | | contract_sign_date | date | 合同签订日期 | | | expected_delivery_date | date | 预计交货日期 | | | actual_delivery_date | date | 实际交货日期 | | | acceptance_date | date | 验收日期 | | | settlement_date | date | 结算日期 | | | applicant_id | varchar(20) | 申请人工号 | | | applicant_name | varchar(50) | 申请人姓名 | | | apply_department | varchar(100) | 申请部门 | | | purchase_leader_id | varchar(20) | 采购负责人工号 | | | purchase_leader_name | varchar(50) | 采购负责人姓名 | | | purchase_department | varchar(100) | 采购部门 | | | create_time | datetime | 创建时间 | 自动填充 | | update_time | datetime | 更新时间 | 自动填充 | | created_by | varchar(64) | 创建人 | 自动填充 | | updated_by | varchar(64) | 更新人 | 自动填充 | ### B. 菜单权限配置 执行以下SQL配置菜单权限: ```sql -- 文件路径: sql/ccdi_purchase_transaction_menu.sql -- 执行此文件以配置菜单和权限 source sql/ccdi_purchase_transaction_menu.sql; ``` ### C. 前端API文件 前端API定义文件: `ruoyi-ui/src/api/ccdiPurchaseTransaction.js` --- ## 导入功能交互说明 ### 前端交互流程 1. **上传文件** - 用户点击"导入"按钮 - 选择Excel文件 - 点击"确定"上传 - **导入对话框立即关闭** 2. **后台处理** - 右上角显示通知:"导入任务已提交,正在后台处理中,处理完成后将通知您" - 系统每2秒轮询一次导入状态 3. **导入完成** - 全部成功:显示绿色通知"导入完成!全部成功!共导入N条数据" - 部分失败:显示橙色通知"导入完成!成功N条,失败M条" - 如果有失败记录,操作栏显示"查看导入失败记录"按钮 4. **查看失败记录** - 点击"查看导入失败记录"按钮 - 打开对话框显示分页的失败记录 - 包含字段:采购事项ID、项目名称、标的物名称、失败原因 - 支持清除历史记录 ### 状态持久化 - 导入状态保存在localStorage中 - 刷新页面后仍可查看上次导入结果 - 状态保留7天,过期自动清除 ### 与员工信息导入的对比 采购交易导入完全复用了员工信息导入的逻辑,两者的交互方式完全一致。 --- ## 版本历史 | 版本 | 日期 | 说明 | 作者 | |-------|------------|-----------------|-------| | 1.0.0 | 2026-02-06 | 初始版本,采购交易信息管理接口 | ruoyi | | 1.1.0 | 2026-02-08 | 添加导入功能交互说明 | ruoyi | --- ## 联系方式 如有问题,请联系开发团队。