# 产品设计 ## 涉及页面 - 设计项目列表页(`mes/pd/project/index`) - 设计项目详情/新增/编辑弹窗 - 资料子表管理弹窗 - 资料审核弹窗 - 归档台账列表页(`mes/pd/archive/index`) - 归档台账详情/新增/编辑弹窗 ## 状态流转 **待发布(0) → 待上传(1) → 待审核(2) → 待归档(3) → 已归档(4)** | 状态值 | 状态名 | 允许操作 | |--------|--------|----------| | 0 | 待发布 | 修改、删除、发布 | | 1 | 待上传 | 上传资料 | | 2 | 待审核 | 审核 | | 3 | 待归档 | 归档 | | 4 | 已归档 | 无 | ## API ### 设计项目 | 方法 | 路径 | 说明 | |------|------|------| | POST | /mes/pd/project/create | 创建设计项目 | | PUT | /mes/pd/project/update | 更新设计项目 | | DELETE | /mes/pd/project/delete | 删除设计项目 | | GET | /mes/pd/project/get | 获取设计项目详情 | | GET | /mes/pd/project/page | 获取设计项目分页 | | GET | /mes/pd/project/export-excel | 导出设计项目Excel | | PUT | /mes/pd/project/publish | 发布(待发布→待上传) | | PUT | /mes/pd/project/upload | 上传资料(待上传→待审核),**自动创建资料审核记录** | | PUT | /mes/pd/project/audit | 审核(待审核→待归档) | | PUT | /mes/pd/project/archive | 归档(待归档→已归档),**自动创建归档台账记录** | **创建/更新请求参数:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | id | Long | 否(更新时必填) | 编号 | | taskCode | String | 是 | 任务编码 | | taskName | String | 是 | 任务名称 | | productCode | String | 否 | 产品编码 | | productName | String | 否 | 产品名称 | | version | String | 否 | 版本号 | | chiefDesigner | Long | 否 | 主设计师(用户ID) | | reviewer | Long | 否 | 审核人(用户ID) | | planFinishTime | LocalDateTime | 否 | 计划完成时间 | | remark | String | 否 | 备注 | **分页请求参数:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | taskCode | String | 否 | 任务编码(模糊) | | taskName | String | 否 | 任务名称(模糊) | | productCode | String | 否 | 产品编码(模糊) | | productName | String | 否 | 产品名称(模糊) | | status | Integer | 否 | 状态 | | planFinishTime | LocalDateTime[] | 否 | 计划完成时间范围 | **响应:** 在基础字段上额外包含 `chiefDesignerNickname`(主设计师名称)、`reviewerNickname`(审核人名称) ### 设计资料 | 方法 | 路径 | 说明 | |------|------|------| | POST | /mes/pd/document/create | 创建设计资料 | | PUT | /mes/pd/document/update | 更新设计资料 | | DELETE | /mes/pd/document/delete | 删除设计资料 | | GET | /mes/pd/document/get | 获取设计资料详情 | | GET | /mes/pd/document/page | 获取设计资料分页 | | GET | /mes/pd/document/export-excel | 导出设计资料Excel | **创建/更新请求参数:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | id | Long | 否(更新时必填) | 编号 | | projectId | Long | 是 | 设计项目ID | | documentType | String | 否 | 资料类型(字典 mes_pd_document_type) | | documentName | String | 是 | 资料名称 | | documentVersion | String | 否 | 版本 | | fileName | String | 否 | 文件名 | | uploadUserId | Long | 否 | 上传人(用户ID) | | uploadTime | LocalDateTime | 否 | 上传时间 | | fileUrl | String | 否 | 文件URL(通过 `/infra/file/upload` 上传后获取) | | remark | String | 否 | 备注 | **响应:** 在基础字段上额外包含 `uploadUserNickname`(上传人名称)、`fileUrl`(文件URL) ### 资料审核 | 方法 | 路径 | 说明 | |------|------|------| | POST | /mes/pd/document-audit/create | 创建资料审核(**上传资料时后端自动调用,前端无需单独调用**) | | PUT | /mes/pd/document-audit/update | 更新资料审核 | | DELETE | /mes/pd/document-audit/delete | 删除资料审核 | | GET | /mes/pd/document-audit/get | 获取资料审核详情 | | GET | /mes/pd/document-audit/page | 获取资料审核分页 | | GET | /mes/pd/document-audit/export-excel | 导出资料审核Excel | **创建/更新请求参数:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | id | Long | 否(更新时必填) | 编号 | | auditNo | String | 是 | 审核单号(编码规则 PD_DOCUMENT_AUDIT_CODE 自动生成) | | documentId | Long | 是 | 资料ID | | documentName | String | 否 | 资料名称(冗余) | | documentVersion | String | 否 | 资料版本(冗余) | | reviewer | Long | 否 | 审核人(用户ID,自动取项目的审核人) | | auditStatus | Integer | 否 | 审核状态(字典 mes_pd_document_audit_status) | | auditTime | LocalDateTime | 否 | 审核时间 | | remark | String | 否 | 备注 | **响应:** 在基础字段上额外包含 `reviewerNickname`(审核人名称) ### 归档台账 | 方法 | 路径 | 说明 | |------|------|------| | POST | /mes/pd/archive/create | 创建归档台账(**归档时后端自动调用,前端无需单独调用**) | | PUT | /mes/pd/archive/update | 更新归档台账 | | DELETE | /mes/pd/archive/delete | 删除归档台账 | | GET | /mes/pd/archive/get | 获取归档台账详情 | | GET | /mes/pd/archive/page | 获取归档台账分页 | | GET | /mes/pd/archive/export-excel | 导出归档台账Excel | **创建/更新请求参数:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | id | Long | 否(更新时必填) | 编号 | | archiveCode | String | 是 | 归档编号(编码规则 PD_ARCHIVE_CODE 自动生成) | | projectId | Long | 是 | 设计项目ID | | archiver | Long | 否 | 归档人(用户ID,自动取当前登录用户) | | archiveStatus | Integer | 否 | 归档状态(字典 mes_pd_archive_status) | | archiveTime | LocalDateTime | 否 | 归档时间(自动取当前时间) | | remark | String | 否 | 备注 | **响应:** 在基础字段上额外包含 `archiverNickname`(归档人名称)、`taskCode`(任务编码)、`taskName`(任务名称) ## 前端修改点 ### 1. 设计项目列表页 ```html {{ getStatusLabel(row.status) }} 发布 上传资料 审核 归档 ``` ### 2. data 数据 ```js data() { return { // 状态流转API映射 statusFlowApi: { 0: publishProject, 1: uploadProject, 2: auditProject, 3: archiveProject, }, } } ``` ### 3. 方法 ```js // 状态流转 handlePublish(id) { publishProject(id).then(() => { this.getList() }) }, handleUpload(id) { uploadProject(id).then(() => { this.getList() }) }, handleAudit(id) { auditProject(id).then(() => { this.getList() }) }, handleArchive(id) { archiveProject(id).then(() => { this.getList() }) }, // 资料子表 - 打开弹窗 handleDocument(projectId) { this.documentOpen = true this.documentProjectId = projectId this.getDocumentList() }, ``` ### 4. API 定义 ```js // 设计项目 export function createProject(data) { return request({ url: '/mes/pd/project/create', method: 'post', data }) } export function updateProject(data) { return request({ url: '/mes/pd/project/update', method: 'put', data }) } export function deleteProject(id) { return request({ url: '/mes/pd/project/delete', method: 'delete', params: { id } }) } export function getProject(id) { return request({ url: '/mes/pd/project/get', method: 'get', params: { id } }) } export function getProjectPage(params) { return request({ url: '/mes/pd/project/page', method: 'get', params }) } export function exportProjectExcel(params) { return request({ url: '/mes/pd/project/export-excel', method: 'get', params, responseType: 'blob' }) } export function publishProject(id) { return request({ url: '/mes/pd/project/publish', method: 'put', params: { id } }) } export function uploadProject(id) { return request({ url: '/mes/pd/project/upload', method: 'put', params: { id } }) } export function auditProject(id) { return request({ url: '/mes/pd/project/audit', method: 'put', params: { id } }) } export function archiveProject(id) { return request({ url: '/mes/pd/project/archive', method: 'put', params: { id } }) } // 设计资料 export function createDocument(data) { return request({ url: '/mes/pd/document/create', method: 'post', data }) } export function updateDocument(data) { return request({ url: '/mes/pd/document/update', method: 'put', data }) } export function deleteDocument(id) { return request({ url: '/mes/pd/document/delete', method: 'delete', params: { id } }) } export function getDocument(id) { return request({ url: '/mes/pd/document/get', method: 'get', params: { id } }) } export function getDocumentPage(params) { return request({ url: '/mes/pd/document/page', method: 'get', params }) } // 文件上传(通用接口,上传后返回URL,存入资料表 fileUrl 字段) export function uploadFile(file, directory) { return request({ url: '/infra/file/upload', method: 'post', data: { file, directory }, headers: { 'Content-Type': 'multipart/form-data' } }) } // 资料审核(前端无需调用 create,上传资料时后端自动创建) export function updateDocumentAudit(data) { return request({ url: '/mes/pd/document-audit/update', method: 'put', data }) } export function deleteDocumentAudit(id) { return request({ url: '/mes/pd/document-audit/delete', method: 'delete', params: { id } }) } export function getDocumentAuditPage(params) { return request({ url: '/mes/pd/document-audit/page', method: 'get', params }) } // 归档台账(前端无需调用 create,归档时后端自动创建) export function updateArchive(data) { return request({ url: '/mes/pd/archive/update', method: 'put', data }) } export function deleteArchive(id) { return request({ url: '/mes/pd/archive/delete', method: 'delete', params: { id } }) } export function getArchive(id) { return request({ url: '/mes/pd/archive/get', method: 'get', params: { id } }) } export function getArchivePage(params) { return request({ url: '/mes/pd/archive/page', method: 'get', params }) } export function exportArchiveExcel(params) { return request({ url: '/mes/pd/archive/export-excel', method: 'get', params, responseType: 'blob' }) } ``` ### 5. 资料子表 - 文件上传组件 ```html ``` ```js // 文件上传回调 handleFileUploadSuccess(url) { this.formData.fileUrl = url }, ``` ### 6. 字典数据更新 SQL ```sql UPDATE system_dict_data SET label = '待发布' WHERE dict_type = 'mes_pd_project_status' AND value = '0'; UPDATE system_dict_data SET label = '待上传' WHERE dict_type = 'mes_pd_project_status' AND value = '1'; UPDATE system_dict_data SET label = '待审核' WHERE dict_type = 'mes_pd_project_status' AND value = '2'; UPDATE system_dict_data SET label = '待归档' WHERE dict_type = 'mes_pd_project_status' AND value = '3'; UPDATE system_dict_data SET label = '已归档' WHERE dict_type = 'mes_pd_project_status' AND value = '4'; ``` ## 编码规则配置 需要在编码规则管理中新增以下两条规则: | 规则代码 | 规则名称 | 说明 | |----------|----------|------| | PD_DOCUMENT_AUDIT_CODE | 资料审核单编码 | 上传资料时自动生成审核单号 | | PD_ARCHIVE_CODE | 归档台账编码 | 归档时自动生成归档编号 | ## 注意事项 - 设计项目状态流转为线性5状态(0→1→2→3→4),不支持回退或取消 - 只有待发布(0)状态才允许修改和删除设计项目 - 删除设计项目会级联删除其下的所有资料记录 - 资料子表的 `fileUrl` 字段存储文件URL,前端通过 `/infra/file/upload` 通用接口上传文件后获取URL - 资料审核表与资料子表为一对多关系,一条资料可以有多条审核记录 - 字典类型需要在系统管理中配置:`mes_pd_project_status`、`mes_pd_document_type`、`mes_pd_document_audit_status`、`mes_pd_archive_status` - `mes_pd_document_type`(资料类型)的字典数据需要根据实际业务补充 - **上传资料**时后端自动为项目下所有资料创建审核记录(审核人=项目 reviewer,审核状态=待审核),前端无需单独调用 `POST /mes/pd/document-audit/create` - **归档**时后端自动创建归档台账记录(归档人=当前登录用户,归档时间=当前时间),前端无需单独调用 `POST /mes/pd/archive/create` - 上传资料和归档操作是事务性的,状态更新和子表创建在同一个事务中,要么全部成功要么全部回滚