编辑 | blame | 历史 | 原始文档

产品设计

涉及页面

  • 设计项目列表页(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. 设计项目列表页

<!-- 状态标签 -->
<el-tag :type="getStatusTagType(row.status)">
  {{ getStatusLabel(row.status) }}
</el-tag>

<!-- 状态流转按钮 -->
<el-button v-if="row.status === 0" @click="handlePublish(row.id)" type="primary">发布</el-button>
<el-button v-if="row.status === 1" @click="handleUpload(row.id)" type="warning">上传资料</el-button>
<el-button v-if="row.status === 2" @click="handleAudit(row.id)" type="success">审核</el-button>
<el-button v-if="row.status === 3" @click="handleArchive(row.id)" type="danger">归档</el-button>

2. data 数据

data() {
  return {
    // 状态流转API映射
    statusFlowApi: {
      0: publishProject,
      1: uploadProject,
      2: auditProject,
      3: archiveProject,
    },
  }
}

3. 方法

// 状态流转
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 定义

// 设计项目
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. 资料子表 - 文件上传组件

<!-- 设计资料新增/编辑弹窗中添加文件上传 -->
<el-form-item label="文件" prop="fileUrl">
  <UploadFile v-model="formData.fileUrl" :limit="1" />
</el-form-item>

<!-- 资料列表中显示文件链接 -->
<el-table-column label="文件" prop="fileUrl">
  <template #default="{ row }">
    <el-link v-if="row.fileUrl" :href="row.fileUrl" target="_blank" type="primary">
      {{ row.fileName || '查看文件' }}
    </el-link>
    <span v-else>-</span>
  </template>
</el-table-column>
// 文件上传回调
handleFileUploadSuccess(url) {
  this.formData.fileUrl = url
},

6. 字典数据更新 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
  • 上传资料和归档操作是事务性的,状态更新和子表创建在同一个事务中,要么全部成功要么全部回滚