docs(test): 更新电表箱装配业务回归测试文档

- 将文档从代码审计任务转换为端到端业务回归测试链路
- 重新组织文档结构为链路总览、示例数据基线和详细步骤
- 添加完整的业务场景清单涵盖WMS/MES/工位终端三大系统
- 定义统一的测试数据包括产品型号、物料清单、工位派工等
- 提供详细的步骤断言和数量等式验证方法
- 建立贯穿全链路的数据流向和状态变更追踪体系
This commit is contained in:
SunYF
2026-09-21 10:48:53 +08:00
parent 0d34bcd6a3
commit 132c3ed6bd
63 changed files with 3309 additions and 5784 deletions
+15
View File
@@ -237,6 +237,21 @@ export const helpStation = {
]
}
export const helpDock = {
title: '接驳台维护(只读主数据)',
overview:
'接驳台是产线与库房之间供 AGV 取送货的物理停靠位,真源在 MES2026-09-21 自 WMS 迁入)。共 21 个固定编码:DOCK01~DOCK20(产线,DOCKn↔工位n+ DOCK21(库房收货)。\n\n接驳台为系统预置只读主数据,由种子初始化,本页不提供新增/修改/删除,仅供查看;工位维护、排产推荐、AGV 通讯均以本表为真源查询接驳台。\n\n「占用状态/托盘关联」反映该接驳台当前是否有托盘及托盘对应的出库/备料单,供现场调度参考。',
fields: [
{ name: '接驳台编码', source: '系统预置(种子)。', purpose: '接驳台唯一标识 DOCK01..21', fill: '只读' },
{ name: '接驳台名称', source: '系统预置。', purpose: '接驳台显示名称', fill: '只读' },
{ name: '类型', source: '系统预置。line=产线 / store=库房 / other=其他。', purpose: '区分接驳台所在位置', fill: '只读' },
{ name: '绑定工位', source: '系统预置(产线接驳台与工位 1:1)。', purpose: '该接驳台服务的产线工位号', fill: '只读;库房/其他接驳台不绑工位' },
{ name: '占用状态', source: 'PLC 托盘传感器 / AGV 到位卸货自动维护。', purpose: '当前是否有托盘', fill: '只读' },
{ name: '托盘关联', source: '有托盘时记录对应出库单号/备料单号。', purpose: '查这个托盘是哪批料、要送到哪', fill: '只读' },
{ name: '启用状态', source: '系统预置 ENABLED/DISABLED。', purpose: '停用后不在下拉出现', fill: '只读' }
]
}
export const helpTrace = {
title: '工件追溯',
overview:
@@ -70,7 +70,7 @@ import { useRouter } from 'vue-router'
import {
Document, Calendar, Box, Goods, ShoppingCart, Monitor, Tools,
Operation, Link, DataLine, EditPen, Search, CircleCheck, Clock, User,
Key, Fold, Expand, Warning, Paperclip, Tickets, Bell
Key, Fold, Expand, Warning, Paperclip, Tickets, Bell, Aim
} from '@element-plus/icons-vue'
import { ElNotification } from 'element-plus'
import { getUser, logout } from '../utils/auth'
@@ -152,6 +152,7 @@ const menuGroups = [
title: '基础配置', icon: Box, children: [
{ code: 'produce.processflow', name: '工艺流程', path: '/process-flow', icon: Operation },
{ code: 'produce.station', name: '关联工位', path: '/station', icon: Link },
{ code: 'produce.dock', name: '接驳台维护', path: '/dock', icon: Aim },
{ code: 'produce.product', name: '物料档案', path: '/product-type', icon: Box }
]
},
+126
View File
@@ -0,0 +1,126 @@
<template>
<div class="dock-page">
<el-card shadow="never">
<el-alert type="info" :closable="false" show-icon style="margin-bottom:12px"
title="接驳台是产线与库房之间供 AGV 取送货的物理停靠位,为系统预置的只读主数据(真源在 MES),本页仅供查看。" />
<!-- 列表页禁止关键字混搜编码精确名称模糊类型/状态各自独立下拉 -->
<el-form inline :model="filter">
<el-form-item label="接驳台编码">
<el-input v-model="filter.dockCode" clearable style="width:160px" placeholder="精确匹配,如 DOCK01" @keyup.enter="search" />
</el-form-item>
<el-form-item label="接驳台名称">
<el-input v-model="filter.name" clearable style="width:180px" placeholder="名称模糊匹配" @keyup.enter="search" />
</el-form-item>
<el-form-item label="类型">
<el-select v-model="filter.dockType" clearable style="width:120px" placeholder="全部">
<el-option label="产线" value="line" />
<el-option label="库房" value="store" />
<el-option label="其他" value="other" />
</el-select>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="filter.status" style="width:110px" placeholder="全部">
<el-option label="全部" value="" />
<el-option label="启用" value="ENABLED" />
<el-option label="停用" value="DISABLED" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="search">查询</el-button>
<el-button @click="reset">重置</el-button>
</el-form-item>
</el-form>
<el-table :data="list" border size="small" v-loading="loading">
<el-table-column prop="dockCode" label="接驳台编码" width="140" />
<el-table-column prop="name" label="接驳台名称" min-width="200" show-overflow-tooltip />
<el-table-column label="类型" width="100" align="center">
<template #default="{ row }">
<el-tag size="small" :type="tagType(row.dockType)">{{ typeLabel(row.dockType) }}</el-tag>
</template>
</el-table-column>
<el-table-column label="绑定工位" width="110" align="center">
<template #default="{ row }">{{ row.stationNo > 0 ? '工位' + row.stationNo : '—' }}</template>
</el-table-column>
<!-- 占用状态现场调度参考空闲 / 有托盘 -->
<el-table-column label="占用状态" width="110" align="center">
<template #default="{ row }">
<el-tag size="small" :type="row.hasPallet ? 'warning' : 'info'">{{ row.hasPallet ? '有托盘' : '空闲' }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="palletRef" label="托盘关联" min-width="160" show-overflow-tooltip>
<template #default="{ row }">{{ row.palletRef || '—' }}</template>
</el-table-column>
<el-table-column label="启用状态" width="90" align="center">
<template #default="{ row }">
<el-tag size="small" :type="row.status === 'ENABLED' ? 'success' : 'info'">
{{ row.status === 'ENABLED' ? '启用' : '停用' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="创建时间" width="170">
<template #default="{ row }">{{ fmtTime(row.createdAt) }}</template>
</el-table-column>
<template #empty>
<el-empty description="暂无接驳台数据" />
</template>
</el-table>
<el-pagination v-model:current-page="page.current" v-model:page-size="page.size" :page-sizes="[20, 50, 100]"
:total="total" background layout="total, sizes, prev, pager, next, jumper" style="margin-top:12px"
@size-change="search" @current-change="load" />
</el-card>
</div>
<PageHelp :data="helpDock" page="Dock" />
</template>
<script setup>
defineOptions({ name: 'Dock' })
import { reactive, ref, onMounted } from 'vue'
import request from '../utils/request'
import { fmtTime } from '../utils/format'
import PageHelp from '../components/PageHelp.vue'
import { helpDock } from '../help'
const list = ref([])
const total = ref(0)
const loading = ref(false)
const page = reactive({ current: 1, size: 20 })
// 默认只看启用;停用需主动选择
const filter = reactive({ dockCode: '', name: '', dockType: '', status: 'ENABLED' })
const TYPE_LABEL = { line: '产线', store: '库房', other: '其他' }
function typeLabel(t) { return TYPE_LABEL[t] || '其他' }
function tagType(t) { return t === 'line' ? 'success' : (t === 'store' ? 'warning' : 'info') }
async function load() {
loading.value = true
try {
const params = { page: page.current, pageSize: page.size }
if (filter.dockCode.trim()) params.dockCode = filter.dockCode.trim()
if (filter.name.trim()) params.name = filter.name.trim()
if (filter.dockType) params.dockType = filter.dockType
if (filter.status) params.status = filter.status
const data = await request.get('/docks/maint', { params })
list.value = data?.list || []
total.value = data?.total || 0
} finally {
loading.value = false
}
}
function search() {
page.current = 1
load()
}
function reset() {
filter.dockCode = ''
filter.name = ''
filter.dockType = ''
filter.status = 'ENABLED'
search()
}
onMounted(load)
</script>
@@ -17,6 +17,7 @@ const routes = [
{ path: 'torque', name: 'Torque', component: () => import('../pages/Torque.vue'), meta: { title: '拧紧查询' } },
{ path: 'process-flow', name: 'ProcessFlow', component: () => import('../pages/ProcessFlow.vue'), meta: { title: '工艺流程' } },
{ path: 'station', name: 'Station', component: () => import('../pages/Station.vue'), meta: { title: '关联工位' } },
{ path: 'dock', name: 'Dock', component: () => import('../pages/Dock.vue'), meta: { title: '接驳台维护' } },
{ path: 'performance', name: 'Performance', component: () => import('../pages/Performance.vue'), meta: { title: '绩效报表' } },
{ path: 'inspect', name: 'Inspect', component: () => import('../pages/Inspect.vue'), meta: { title: '巡检终端' } },
{ path: 'quality', name: 'QualityInspection', component: () => import('../pages/QualityInspection.vue'), meta: { title: '质量检验' } },