# 项目文档:配送点合同附件管理 v1.0 ## 1. 项目概述 配送点管理端将配送合同的“附件地址”文本字段升级为受控 PDF 附件流程。数据库继续使用 `gasorder_contract.file_uri` 保存服务端受控路径,但浏览器只接收附件状态、签名收据和文件 Blob,不读取或提交内部路径。 技术栈:Go、Gin、GORM、Vue 3、TypeScript、Arco Design。运行时依赖现有合同附件目录及服务端签名密钥。 ## 2. 目录结构 ```text backend/api/internal/ ├── logic/delivery/order.go # 配送点范围包装、列表脱敏 ├── logic/platform/gasorder/ # 复用 PDF 校验、收据和文件服务 └── routers/delivery.go # 上传、清理、读取路由 frontend/delivery_admin/src/ ├── api/contract-attachment.ts # 附件 HTTP 客户端 ├── views/resource/ContractAttachmentField.vue ├── views/resource/use-contract-attachment.ts ├── views/resource/ResourceRecordPage.vue # 详情、表单和保存编排 └── views/shared/ResourceListPage.vue # 脱敏附件状态入口 ``` ## 3. 核心流程 1. 新建或草稿编辑页选择单个 PDF,前端预检扩展名、MIME 和 10 MiB 上限。 2. 点击保存后上传至临时目录,服务端校验真实 MIME、`%PDF-` 文件头和 `%%EOF`,并签发绑定当前操作人的 30 分钟收据。 3. 合同创建或更新提交 `attachment_receipt`;替换或移除同时提交 `attachment_version`,避免并发覆盖。 4. 保存失败时调用清理接口;取消编辑不会改变原附件。 5. 预览和下载只接受合同 identity,经当前气站、配送点和 JWT 范围校验后返回 `private, no-store` 的 PDF。 ## 4. 安全与业务规则 - 合同列表响应删除 `file_uri`,只返回 `has_attachment`。 - 详情响应使用 `attachment` 元数据,旧路径异常时显示“需重新上传”。 - 只有草稿合同可上传、替换或移除;启用前必须存在有效 PDF。 - 跨配送点读取统一不可访问,不返回文件路径或磁盘信息。 - 新版配送点管理端始终删除载荷中的 `file_uri`;后端旧字段仅为兼容历史调用保留。 ## 5. 接口 - `POST /gasorder_contract/attachment/upload`:上传临时 PDF。 - `POST /gasorder_contract/attachment/cleanup`:按签名清理凭证删除临时文件。 - `GET /gasorder_contract/:identity/attachment`:鉴权预览或下载正式附件。 ## 6. 维护与验证 修改附件流程后应运行配送逻辑、平台附件服务和路由测试,以及配送前端 `type:check`、`resource-pages:check`、`contract:check` 和生产构建。不得恢复普通 URI 输入框或 `` 直链。 ## 7. 变更记录 - v1.0(2026-08-22):新增配送域附件接口、列表脱敏、详情预览下载及草稿上传替换移除。 - 修正《项目文档_配送点独立资源页面_v1.0》中 2026-08-22 新增的“文本 URI”边界,使其重新符合 2026-07-30 原始敏感数据保护基线。