refactor: 重构工艺工序相关命名与数据模型

1.  全局替换"工序"为"工艺"统一术语,包括页面文案、枚举、注释
2.  重构工单与工件工艺数据模型:
    - 新增工艺组合表flow_material作为备料/齐套唯一源头
    - 新增工位状态表station_state支持自主停单/恢复接单
    - 移除station_process派工表,改用工单工艺组合作为路线唯一源头
    - 替换processCode为flowId作为工艺关联标识
    - 重构工件当前进度字段为currentStationNo
3.  删除冗余的静态备份资源文件
4.  调整物料选择组件默认启用仅显示激活物料
5.  优化工单创建/编辑逻辑,新增工艺组合校验与保存
This commit is contained in:
SunYF
2026-09-22 11:32:29 +08:00
parent 932700ca65
commit d609ff8a9e
185 changed files with 8623 additions and 4501 deletions
@@ -27,6 +27,13 @@
<el-button size="large" type="danger" plain @click="logout">退出</el-button>
</header>
<!-- 停单横幅(醒目置顶:已停止接单 + 原因,恢复接单即关闭) -->
<transition name="fade">
<div v-if="paused" class="pause-banner">
⛔ 已停止接单{{ pauseReason ? ':' + pauseReason : '' }}(本工位暂停新的报工提交,作业信息不受影响)
</div>
</transition>
<!-- 不合格告警横幅 -->
<transition name="fade">
<div v-if="hasNg" class="alert-banner">⚠ 存在不合格,请复检!</div>
@@ -40,7 +47,7 @@
<OfflinePanel />
</el-tab-pane>
<el-tab-pane v-if="!isVirtual" label="作业" name="work">
<WorkPanel ref="workRef" />
<WorkPanel ref="workRef" @call-material="tab = 'material'" />
</el-tab-pane>
<el-tab-pane label="物料 / 叫料" name="material">
<MaterialPanel />
@@ -93,10 +100,13 @@ import {
loadMoves,
loadPoints,
loadStats,
loadStationState,
loadTight,
loadTask,
loadWip,
orderNo,
paused,
pauseReason,
pendingTotal,
refreshAll,
sn,
@@ -172,6 +182,7 @@ onMounted(async () => {
loadPoints() // 点位台账 10 秒
loadMoves()
loadWip() // 在制品 10 秒
loadStationState() // 停单状态 10 秒
}, 10000)
})
@@ -233,6 +244,15 @@ onBeforeUnmount(() => {
font-size: 18px;
font-weight: 700;
}
.pause-banner {
background: #f56c6c;
color: #fff;
text-align: center;
padding: 12px;
font-size: 20px;
font-weight: 700;
letter-spacing: 1px;
}
.main-tabs {
margin: 12px;
min-height: calc(100vh - 140px);
@@ -114,8 +114,8 @@
<el-table :data="pending" border size="large" class="call-table" v-loading="pendingLoading">
<el-table-column label="图号" prop="materialCode" min-width="130" />
<el-table-column label="物料名称" prop="materialName" min-width="150" show-overflow-tooltip />
<el-table-column label="工序" width="80" align="center">
<template #default="{ row }">{{ row.processCode || '-' }}</template>
<el-table-column label="工艺" width="80" align="center">
<template #default="{ row }">{{ row.flowId || row.processCode || '-' }}</template>
</el-table-column>
<el-table-column label="接驳台" prop="targetDock" width="110" align="center" />
<el-table-column label="需求" width="100" align="center">
@@ -148,6 +148,7 @@ import { ElMessage } from 'element-plus'
import { bindRecord, bindRemove, callLineMaterial, getMaterialRequests, receiveMaterialRequest } from '../../api'
import {
bindInputs,
flowId,
loadBind,
myDocks,
operatorName,
@@ -257,7 +258,7 @@ async function doBind(r) {
await bindRecord({
sn: sn.value,
orderNo: orderNo.value || '',
processCode: Number(stationNo.value),
flowId: flowId.value,
stationNo: stationNo.value,
items: [{ materialCode: r.materialCode, bindValue: v }]
})
@@ -272,7 +273,7 @@ async function removeBind(r, b) {
try {
await bindRemove({
sn: sn.value,
processCode: Number(stationNo.value),
flowId: flowId.value,
materialCode: r.materialCode,
bindValue: b
})
@@ -29,7 +29,7 @@
<b>{{ workpiece.orderNo || '-' }}</b>
</div>
<div class="stat">
<span class="k">已完成工序</span>
<span class="k">已完成工艺</span>
<b>{{ doneProcessCount }} 道</b>
</div>
<div class="stat">
@@ -53,10 +53,10 @@
title="存在不合格项,请确认已完成返修/复检后再入库。" style="margin:10px 0"
/>
<div class="sub-title">工序时间线</div>
<div class="sub-title">工艺时间线</div>
<el-table :data="processTimeline" border size="large" max-height="260">
<el-table-column label="工序" min-width="120">
<template #default="{ row }">{{ row.processName || ('工序' + row.processCode) }}</template>
<el-table-column label="工艺" min-width="120">
<template #default="{ row }">{{ row.processName || ('工艺' + (row.flowId || row.processCode || '')) }}</template>
</el-table-column>
<el-table-column label="结果" width="100" align="center">
<template #default="{ row }">
@@ -2,7 +2,7 @@
<div class="pdf-panel">
<section class="card">
<div class="card-title">
工艺文件(按工序步骤)
工艺文件(按工艺步骤)
<el-tag v-if="flowName && flowName !== '-'" type="success" size="large" effect="dark">{{ flowName }}</el-tag>
<span class="tip">点击左侧步骤查看本步骤图纸,当前步骤高亮</span>
</div>
@@ -1,5 +1,21 @@
<template>
<div class="work-panel">
<!-- ⓪ 头部操作区:停止接单/恢复接单(停单仅阻止新报工,不隐藏作业信息) + 叫料 -->
<header class="ops-bar">
<span class="ops-lab">接单状态</span>
<el-tag :type="paused ? 'danger' : 'success'" effect="dark" size="large">
{{ paused ? '已停止接单' : '接单中' }}
</el-tag>
<el-button
size="large"
:type="paused ? 'success' : 'danger'"
:loading="pauseBusy"
@click="onTogglePause"
>{{ paused ? '恢复接单' : '停止接单' }}</el-button>
<el-button size="large" type="primary" plain @click="emit('call-material')">叫料</el-button>
<span v-if="paused && state.pauseReason" class="ops-reason">原因:{{ state.pauseReason }}</span>
</header>
<!-- ① 工件区:扫码上料 / 取料 -->
<section class="card sn-card">
<div class="card-title">当前工件</div>
@@ -196,6 +212,7 @@ import {
canReport,
criterionOk,
flowActive,
flowId,
flowName,
hasNg,
loadBind,
@@ -215,7 +232,9 @@ import {
operatorName,
orderNos,
orderNo,
paused,
setCurrentSn,
setPaused,
sn,
startedAt,
state,
@@ -232,9 +251,56 @@ import {
wip
} from '../../store/station'
const emit = defineEmits(['call-material'])
const scanRef = ref()
const scanInput = ref('')
const taking = ref(false)
const pauseBusy = ref(false)
// 停止接单/恢复接单:停单时可填原因(可空),恢复不需要原因
async function onTogglePause() {
if (!paused.value) {
let reason = ''
try {
const { value } = await ElMessageBox.prompt(
'停止接单后本工位暂停新的报工提交,可随时恢复;作业信息不受影响。',
'停止接单',
{
confirmButtonText: '停止接单',
cancelButtonText: '取消',
inputPlaceholder: '停止原因(可空)',
type: 'warning'
}
)
reason = (value || '').trim()
} catch {
return
}
pauseBusy.value = true
try {
await setPaused(true, reason)
ElMessage.warning('已停止接单' + (reason ? ':' + reason : ''))
} catch { /* 统一错误提示 */ }
pauseBusy.value = false
} else {
try {
await ElMessageBox.confirm('确认恢复本工位接单?', '恢复接单', {
confirmButtonText: '恢复接单',
cancelButtonText: '取消',
type: 'success'
})
} catch {
return
}
pauseBusy.value = true
try {
await setPaused(false, '')
ElMessage.success('已恢复接单')
} catch { /* 统一错误提示 */ }
pauseBusy.value = false
}
}
const myPointLabel = computed(() => (myPoint.value ? myPoint.value.label || myPoint.value.pointNo : '工位' + stationNo.value))
@@ -246,8 +312,10 @@ const stepSummaryText = computed(() => {
const stepSummaryType = computed(() => (missingSteps.value.length ? 'warning' : 'success'))
const blockTip = computed(() => {
if (paused.value) return '已停止接单' + (state.pauseReason ? ':' + state.pauseReason : '') + ',恢复接单后才能报工'
if (!sn.value) return '请先扫描工件 SN'
if (!orderNo.value) return '请选择工单号'
if (!flowId.value) return '本工位未绑定工艺流程,无法报工'
if (bindBlocking.value) return '装配物料未绑齐:' + (state.bindPanel?.missing || '缺料')
if (missingSteps.value.length) return '还有步骤未录入:' + (missingSteps.value[0].name || '未命名步骤')
if (missingChecks.value.length) return '还有步骤未做检测确认:' + (missingChecks.value[0].name || '未命名步骤')
@@ -459,7 +527,7 @@ async function onProcessDone() {
const data = await reportProcessDone({
sn: sn.value,
orderNo: orderNo.value,
processCode: Number(stationNo.value),
flowId: flowId.value,
stationNo: stationNo.value,
steps: buildStepsPayload(),
operator: operatorName(),
@@ -494,7 +562,7 @@ async function onTempStore() {
sn: sn.value,
orderNo: orderNo.value || '',
stationNo: stationNo.value,
processCode: Number(stationNo.value),
flowId: flowId.value,
operator: operatorName()
})
ElMessage.success(data?.queued ? 'MES 暂不可达,已离线缓存' : '暂存退库已上报')
@@ -560,6 +628,28 @@ defineExpose({ focusScan })
padding: 14px 16px;
box-shadow: 0 1px 6px rgba(0, 21, 41, 0.08);
}
.ops-bar {
grid-column: 1 / -1;
display: flex;
align-items: center;
gap: 12px;
background: #fff;
border-radius: 10px;
padding: 10px 16px;
box-shadow: 0 1px 6px rgba(0, 21, 41, 0.08);
}
.ops-bar .ops-lab {
color: #909399;
font-size: 15px;
}
.ops-bar .ops-reason {
color: #f56c6c;
font-size: 15px;
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.card-title {
font-size: 18px;
font-weight: 600;
@@ -28,7 +28,7 @@
<el-table :data="rows" border size="large" height="420">
<el-table-column prop="date" label="日期" width="130" />
<el-table-column prop="stationNo" label="工位" width="90" />
<el-table-column prop="processName" label="工序" min-width="160" />
<el-table-column prop="processName" label="工艺" min-width="160" />
<el-table-column prop="operator" label="操作人" width="120" />
<el-table-column prop="doneCount" label="完成" width="90" />
<el-table-column prop="okCount" label="合格" width="90" />