refactor: 统一术语BOM为物料清单并补充工位扩展能力

主要变更:
1.  后端:重构工位管理逻辑,新增工位自定义扩展能力,将工位号上限调整为999并支持14+虚拟工位
2.  前后端:全量替换"BOM"术语为"物料清单",包括提示语、注释和文档
3.  WMS模块:新增AGV任务取消接口与前端页面,对接海康RCS取消任务逻辑
4.  权限与种子数据:新增工位新增权限并更新权限配置
5.  修复错误校验逻辑,优化AGV客户端签名与请求处理
This commit is contained in:
SunYF
2026-09-17 19:41:00 +08:00
parent e31b85e87a
commit bf3a408839
20 changed files with 276 additions and 52 deletions
+36 -1
View File
@@ -127,7 +127,34 @@ async function refreshTasks() {
function onSelectionChange(sel) { selected.value = sel }
function rowKey(row) { return row.requestNo + '-' + row.materialCode + '-' + row.planDate }
onMounted(() => { loadDocks(); loadTasks() })
/* ===================== 取消任务 / 对接模式 ===================== */
const agvMode = reactive({ mock: false, tip: '' })
function canCancel(status) {
return status === 'PENDING' || status === 'DISPATCHED' || status === 'DELIVERING'
}
async function cancelTask(row) {
const { value: reason } = await ElMessageBox.prompt(
`确认取消 AGV 任务 ${row.taskNo}${row.sourceDock}${row.targetDock})?\n取消后关联的备料单行将退回待发料。`,
'取消 AGV 任务',
{ type: 'warning', confirmButtonText: '确认取消', cancelButtonText: '返回', inputPlaceholder: '取消原因(选填)', inputValue: '' }
).catch(() => ({ value: null }))
if (reason === null) return
await request.post('/agv/cancel', { taskNo: row.taskNo, reason: reason || '' })
ElMessage.success('已取消')
loadTasks(); loadDocks()
}
async function loadMode() {
try {
const m = await request.get('/agv/mode')
agvMode.mock = !!m?.mock
agvMode.tip = m?.tip || ''
} catch { /* 忽略 */ }
}
onMounted(() => { loadDocks(); loadTasks(); loadMode() })
</script>
<template>
@@ -154,6 +181,8 @@ onMounted(() => { loadDocks(); loadTasks() })
<!-- AGV 任务列表 -->
<el-tab-pane label="AGV任务" name="tasks" lazy>
<el-alert v-if="agvMode.mock" type="warning" :closable="false" show-icon style="margin-bottom:10px"
title="当前为模拟模式(未接真实海康 RCS)" :description="agvMode.tip" />
<div class="toolbar">
<el-select v-model="taskQuery.status" clearable placeholder="任务状态" style="width: 140px" @change="taskPage.current = 1; loadTasks()">
<el-option v-for="s in statusOptions" :key="s.v" :label="s.l" :value="s.v" />
@@ -193,6 +222,12 @@ onMounted(() => { loadDocks(); loadTasks() })
<el-table-column prop="operator" label="下发人" width="100" />
<el-table-column prop="hikTaskCode" label="RCS任务码" width="150" show-overflow-tooltip />
<el-table-column prop="remark" label="备注" min-width="140" show-overflow-tooltip />
<el-table-column label="操作" width="90" align="center" fixed="right">
<template #default="{ row }">
<el-button v-if="canCancel(row.status)" size="small" type="danger" plain @click="cancelTask(row)">取消</el-button>
<span v-else>-</span>
</template>
</el-table-column>
</el-table>
<el-pagination background layout="total, sizes, prev, pager, next" :total="taskTotal"
:current-page="taskPage.current" :page-size="taskPage.size" :page-sizes="[10, 20, 50, 100]"