# SRM 资质附件上传 - 前端联调方案 ## 涉及页面 - 采购管理-SRM-供应商管理-资质证书列表页 - 采购管理-SRM-供应商管理-资质证书新增/编辑弹窗 - 采购管理-SRM-招标项目-新增/编辑弹窗(含发布中/投标中的部分更新) - 采购管理-SRM-招标项目-详情页 ## 业务流程与数据带入 1. 用户在表单中通过上传组件选择文件 2. 上传组件调用 `/system/storage-blob/upload` 获得 `blobId` 3. 保存业务记录(资质证书 / 招标项目)时,将文件 ID 列表 `blobIds` 随业务数据一并提交 4. 后端在业务记录保存后,通过 `recordType + recordId` 将文件绑定到 `system_storage_attachment` 中间表 5. 查询业务记录(详情、分页)时,后端返回 `attachmentList`(含文件 URL、名称),前端展示下载链接 ## API ### 1. 资质证书附件 | 方法 | 路径 | 说明 | |------|------|------| | POST | /system/storage-blob/upload | 上传文件,入参 multipart 的 `files`,返回 Blob 列表(含 `id`) | | POST | /srm/supplier-certificate/create | 创建资质证书,新增入参 `blobIds` | | PUT | /srm/supplier-certificate/update | 更新资质证书,新增入参 `blobIds`(增量更新附件) | | DELETE | /srm/supplier-certificate/delete | 删除资质证书,同步删除附件 | | GET | /srm/supplier-certificate/page | 分页查询,响应新增 `attachmentList` | | GET | /srm/supplier-certificate/get | 详情查询,响应新增 `attachmentList` | | GET | /srm/supplier-certificate/list-by-supplier | 按供应商查询,响应新增 `attachmentList` | **请求参数(create/update 新增字段):** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | blobIds | Array\ | 否 | 资质证书附件文件 ID 列表 | **响应字段新增(attachmentList 数组元素):** | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 文件 ID | | name | String | 原文件名 | | url | String | 文件访问地址 | | previewURL | String | 预览地址 | | downloadURL | String | 下载地址 | **响应示例:** ```json { "code": 0, "data": { "id": 1, "supplierId": 10, "certificateName": "ISO9001质量管理体系", "attachmentList": [ { "id": 1001, "name": "iso9001_cert.pdf", "url": "https://example.com/files/xxx.pdf" } ] } } ``` ### 2. 招标项目资质要求附件 | 方法 | 路径 | 说明 | |------|------|------| | POST | /system/storage-blob/upload | 上传文件,入参 multipart 的 `files`,返回 Blob 列表(含 `id`) | | POST | /srm/tender-project/create | 创建招标项目,新增入参 `blobIds` | | PUT | /srm/tender-project/update | 更新招标项目,新增入参 `blobIds`(草稿/发布中/投标中均增量更新附件) | | PUT | /srm/tender-project/update-info | 部分更新(发布中/投标中),新增入参 `blobIds` | | DELETE | /srm/tender-project/delete | 删除招标项目,同步删除附件 | | GET | /srm/tender-project/get | 详情查询,响应新增 `attachmentList` | | GET | /srm/tender-project/page | 分页查询,响应新增 `attachmentList` | **请求参数(create/update/update-info 新增字段):** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | blobIds | Array\ | 否 | 资质要求附件文件 ID 列表 | **响应字段新增:** 同资质证书,`attachmentList` 数组元素含 `id`、`name`、`url`、`previewURL`、`downloadURL`。 ## 字段展示规则 | 字段 | 展示位置 | 说明 | |------|----------|------| | 证书附件 | 资质证书列表 | 新增「附件」列,显示附件名称链接,点击新窗口打开;无附件显示 `--` | | 证书附件 | 资质证书新增/编辑弹窗 | 「证书附件」上传项,支持多文件,编辑时回显已上传文件 | | 资质要求附件 | 招标项目新增/编辑弹窗 | 「资质要求附件」上传项,支持多文件,编辑时回显已上传文件 | | 资质要求附件 | 招标项目详情页 | 「资质要求」折叠面板内展示附件名称链接,点击新窗口打开 | ## 业务规则说明 | 场景 | 规则 | |------|------| | 编辑回显 | 编辑时后端返回 `attachmentList`,前端将其映射为上传组件文件对象(`uid`、`name`、`url`、`status='done'`、`id`)并赋给 `blobIds`,提交时按 `valueKey='id'` 提取文件 ID 提交 | | 附件更新 | 后端按「增量更新」处理:以本次提交的 `blobIds` 为准,自动删除已移除的文件绑定、新增新上传的文件绑定 | | 删除业务记录 | 删除资质证书/招标项目时,后端同步删除其附件 | | 发布中/投标中编辑 | 招标项目在发布中/投标中阶段通过 `update-info` 接口仅能修改招标说明、资质要求及资质要求附件 | | 上传格式 | 支持 jpg、jpeg、png、pdf、doc、docx,单个文件不超过 2MB | ## 注意事项 - 上传必须走 `/system/storage-blob/upload`,禁止使用旧版 `/infra/file/*` 接口。 - 资质证书与招标项目使用不同的 `recordType`:资质证书为 `srm_supplier_certificate`,招标项目为 `srm_tender_project`,前端无需关心,由后端处理。 - 编辑回显时若用户未改动附件,提交的 `blobIds` 仍应包含原有文件 ID(由上传组件回显对象携带),避免附件被误删。 - 招标项目部分更新(`update-info`)请求体同样需携带 `blobIds`。 - 列表页附件链接建议 `target="_blank"` 新窗口打开,便于预览 PDF/图片。