refactor: 重构工艺工序相关命名与数据模型
1. 全局替换"工序"为"工艺"统一术语,包括页面文案、枚举、注释
2. 重构工单与工件工艺数据模型:
- 新增工艺组合表flow_material作为备料/齐套唯一源头
- 新增工位状态表station_state支持自主停单/恢复接单
- 移除station_process派工表,改用工单工艺组合作为路线唯一源头
- 替换processCode为flowId作为工艺关联标识
- 重构工件当前进度字段为currentStationNo
3. 删除冗余的静态备份资源文件
4. 调整物料选择组件默认启用仅显示激活物料
5. 优化工单创建/编辑逻辑,新增工艺组合校验与保存
This commit is contained in:
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user