# 产品设计
## 涉及页面
- 设计项目列表页(`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
{{ row.fileName || '查看文件' }}
-
```
```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`
- 上传资料和归档操作是事务性的,状态更新和子表创建在同一个事务中,要么全部成功要么全部回滚