Files
bj_power/bj_power_mes/frontend/src/pages/Trace.vue
T

84 lines
3.8 KiB
Vue
Raw Normal View History

2026-08-28 15:06:01 +08:00
<template>
<el-card>
<el-form inline>
<el-form-item label="工件SN">
<el-input v-model="sn" style="width:220px" placeholder="输入SN查询追溯" @keyup.enter="search" />
</el-form-item>
<el-form-item><el-button type="primary" @click="search">追溯查询</el-button></el-form-item>
</el-form>
<el-alert v-if="error" :title="error" type="error" show-icon closable style="margin-bottom:10px" />
<template v-if="data">
<el-descriptions :column="4" border style="margin-bottom:12px">
<el-descriptions-item label="SN">{{ data.workpiece?.sn }}</el-descriptions-item>
<el-descriptions-item label="工单号">{{ data.workpiece?.orderNo }}</el-descriptions-item>
<el-descriptions-item label="状态">{{ data.workpiece?.status }}</el-descriptions-item>
<el-descriptions-item label="当前工序">{{ data.workpiece?.currentProcess }}</el-descriptions-item>
<el-descriptions-item label="进线时间">{{ fmt(data.workpiece?.onlineAt) }}</el-descriptions-item>
<el-descriptions-item label="完工时间">{{ fmt(data.workpiece?.doneAt) }}</el-descriptions-item>
</el-descriptions>
<el-tabs>
<el-tab-pane label="工序时间线">
<el-timeline>
<el-timeline-item v-for="p in (data.processTimeline||[])" :key="p.id"
:timestamp="p.operator ? (p.operator+' · '+fmt(p.endedAt)) : fmt(p.endedAt)"
:type="p.result==='NG'?'danger':'success'">
{{ p.processName }}工序 {{ p.processCode }}工位 {{ p.stationNo }})— {{ p.result }}
</el-timeline-item>
</el-timeline>
</el-tab-pane>
<el-tab-pane label="步骤考核数据">
<el-table :data="data.stepData||[]" border size="small">
<el-table-column prop="stepName" label="步骤" min-width="110" />
<el-table-column prop="criterionName" label="考核项" min-width="110" />
<el-table-column prop="value" label="数值" width="100" />
<el-table-column prop="isOK" label="合格" width="80">
<template #default="{row}"><el-tag :type="row.isOK?'success':'danger'">{{ row.isOK?'OK':'NG' }}</el-tag></template>
</el-table-column>
<el-table-column prop="operator" label="操作人" width="90" />
</el-table>
</el-tab-pane>
<el-tab-pane label="拧紧数据">
<el-table :data="data.torqueRecords||[]" border size="small">
<el-table-column prop="stationNo" label="工位" width="80" />
<el-table-column prop="torque" label="扭矩" width="100" />
<el-table-column prop="angle" label="角度" width="90" />
<el-table-column prop="result" label="结果" width="80" />
<el-table-column prop="operator" label="操作人" width="90" />
<el-table-column prop="time" label="时间" min-width="160" />
</el-table>
</el-tab-pane>
<el-tab-pane label="成品关联">
<p>批次号{{ (data.associationTrace?.batchItems||[]).join(', ') || '无' }}</p>
<p>精密件SN{{ (data.associationTrace?.serialItems||[]).join(', ') || '无' }}</p>
</el-tab-pane>
</el-tabs>
</template>
</el-card>
<PageHelp :data="helpTrace" />
2026-08-28 15:06:01 +08:00
</template>
<script setup>
import { ref } from 'vue'
import request from '../utils/request'
import PageHelp from '../components/PageHelp.vue'
import { helpTrace } from '../help'
2026-08-28 15:06:01 +08:00
const sn = ref('')
const data = ref(null)
const error = ref('')
async function search() {
if (!sn.value) return
error.value = ''
data.value = null
try {
data.value = await request.get('/trace', { params: { sn: sn.value } })
} catch (e) {
error.value = e.message || '查询失败'
}
}
function fmt(v) { return v ? String(v).replace('T', ' ').slice(0, 19) : '-' }
</script>