# 附件上传模块改造 - 前端联调方案 ## 概述 本次改造统一所有模块的文件上传: 1. **后端**:删除业务表中的 `file_url` 列,全部改用 `system_storage_attachment` 中间表关联 2. **前端**:FileUpload 组件统一使用 `/system/storage-blob/upload`,附件通过 attachment API 关联 ## 后端变更 ### 已删除 file_url 列的表 | 表名 | 模块 | |------|------| | `erp_purchase_order` | ERP 采购订单 | | `erp_purchase_request` | ERP 采购申请 | | `erp_sale_order` | ERP 销售订单 | | `hrm_leave_application` | HRM 请假 | | `hrm_resignation_application` | HRM 离职 | | `hrm_transfer_application` | HRM 调动 | ### 已从 Java 类中删除 fileUrl 字段 - 6 个 DO 类(ErpPurchaseOrderDO、ErpPurchaseRequestDO、ErpSaleOrderDO、HrmLeaveApplicationDO、HrmResignationApplicationDO、HrmTransferApplicationDO) - 6 个 SaveReqVO 类 - 6 个 RespVO 类 ### 文件关联方式 文件只能通过 `system_storage_attachment` 中间表关联: | API | 说明 | |-----|------| | `POST /system/storage-blob/upload` | 上传文件(`files` 参数,multipart) | | `POST /system/storage-attachment/bind` | 绑定附件到业务记录 | | `GET /system/storage-attachment/list` | 查询附件(按 recordType + recordId) | | `DELETE /system/storage-attachment/delete` | 批量删除附件 | ## 涉及页面 ### 一、核心上传组件改动 **文件**:`src/components/upload/use-upload.ts` | 改动项 | 旧值 | 新值 | |--------|------|------| | 上传接口 | `POST /infra/file/upload` / S3 直传 | `POST /system/storage-blob/upload` | | 请求方式 | 自定义 `createFile0()` / PUT S3 | `FormData` + `requestClient.post()` | | uploadUrl | `${apiURL}/infra/file/upload` | `${apiURL}/system/storage-blob/upload` | ### 二、上传限制放开 以下模块的 `FileUpload` / `ImageUpload` 组件已移除 `maxNumber`、`maxSize`、`accept` 限制: #### ERP 模块(13 个文件) | 文件 | 字段 | |------|------| | `src/views/erp/purchase/order/data.ts` | `fileUrl` | | `src/views/erp/purchase/request/data.ts` | `fileUrl` | | `src/views/erp/purchase/return/data.ts` | `fileUrl` | | `src/views/erp/purchase/in/data.ts` | `fileUrl` | | `src/views/erp/sale/order/data.ts` | `fileUrl` | | `src/views/erp/sale/return/data.ts` | `fileUrl` | | `src/views/erp/sale/out/data.ts` | `fileUrl` | | `src/views/erp/stock/in/data.ts` | `fileUrl` | | `src/views/erp/stock/out/data.ts` | `fileUrl` | | `src/views/erp/stock/move/data.ts` | `fileUrl` | | `src/views/erp/stock/check/data.ts` | `fileUrl` | | `src/views/erp/finance/receipt/data.ts` | `fileUrl` | | `src/views/erp/finance/payment/data.ts` | `fileUrl` | #### ImageUpload 限制放开(5 处) | 文件 | 字段 | |------|------| | `src/views/im/manager/face/pack/data.ts` | `icon` | | `src/views/im/manager/face/pack/data.ts` | `url` | | `src/views/im/manager/channel/material/data.ts` | `coverUrl` | | `src/views/im/manager/channel/list/data.ts` | `avatar` | | `src/views/mes/md/item/modules/product-media-list.vue` | `url` | #### MES 文档限制放开 | 文件 | 字段 | |------|------| | `src/views/mes/pd/project/modules/document-form.vue` | `fileUrl` | ### 三、HRM 附件上传修复 3 个 HRM 模块的"附件"字段从 `Input` 改为 `FileUpload`: | 文件 | 字段 | 改动 | |------|------|------| | `src/views/hrm/leave/data.ts` | `fileUrl` | `component: 'Input'` → `component: 'FileUpload'` | | `src/views/hrm/resignation/data.ts` | `fileUrl` | `component: 'Input'` → `component: 'FileUpload'` | | `src/views/hrm/transfer/data.ts` | `fileUrl` | `component: 'Input'` → `component: 'FileUpload'` | ## API | 方法 | 路径 | 说明 | |------|------|------| | POST | `/system/storage-blob/upload` | 上传文件,`files`(multipart 数组) | | POST | `/system/storage-attachment/bind` | 绑定附件到业务记录 | | GET | `/system/storage-attachment/list` | 查询业务记录的附件列表 | | DELETE | `/system/storage-attachment/delete` | 批量删除附件 | **上传响应**: ```json [ { "id": 123, "url": "https://xxx.com/u_abc123.pdf", "previewURL": "https://xxx.com/preview/u_abc123.pdf", "name": "合同.pdf", "downloadURL": "https://xxx.com/download/u_abc123.pdf" } ] ``` **绑定请求**: ```json { "application": "file", "recordType": "mes_purchase_order", "recordId": 1, "blobItems": [{ "blobId": 123 }] } ``` ## 标准上传流程 1. 用户选择文件 → `POST /system/storage-blob/upload` 返回 `[{ id, url, name }]` 2. 业务记录保存时 → `POST /system/storage-attachment/bind` 关联 blobId 3. 详情/编辑页 → `GET /system/storage-attachment/list` 加载已有附件 4. 用户删除附件 → `DELETE /system/storage-attachment/delete` ## 前端 API 封装 新 API 模块位于 `src/api/system/storage/index.ts`: ```typescript import { uploadFile, listAttachments, bindAttachments, deleteAttachments } from '#/api/system/storage'; ``` ## recordType 命名规范 格式:`{模块前缀}_{业务表名}` | 模块 | recordType | 说明 | |------|------------|------| | MES 采购订单 | `mes_purchase_order` | 采购订单附件 | | MES 工单 | `mes_pro_work_order` | 生产工单附件 | | MES 设备 | `mes_dv_machinery` | 设备档案附件 | | MES 文档 | `mes_pd_document` | 项目文档附件 | | CRM 客户 | `crm_customer` | 客户附件 | | ERP 采购订单 | `erp_purchase_order` | ERP 采购订单附件 | ## 注意事项 - FileUpload 组件使用 `POST /system/storage-blob/upload` 上传文件,FormData 字段名为 `files` - 文件上传后仅暂存,必须调用 bind 接口关联到业务记录 - 文件预览使用响应中的 `previewURL` 或 `url` 字段 - 禁止使用旧版 `/infra/file/*` 接口 - HRM 请假/离职/调动页面的附件字段现在可以使用 FileUpload 组件上传附件