|
|
|
|
@@ -56,7 +56,9 @@
|
|
|
|
|
</tr>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody>
|
|
|
|
|
<tr v-for="row in tableData" :key="row.id">
|
|
|
|
|
<tr v-for="row in tableData" :key="row.id"
|
|
|
|
|
:class="{ 'row-selected': selectedRow && selectedRow.id === row.id }"
|
|
|
|
|
style="cursor:pointer;" @click="selectRow(row)">
|
|
|
|
|
<td class="td-num">{{ row.sub_coil_no || row.coil_no }}</td>
|
|
|
|
|
<td class="td-num">{{ row.hot_coil_no || '—' }}</td>
|
|
|
|
|
<td>{{ row.shift || '—' }}</td>
|
|
|
|
|
@@ -78,7 +80,7 @@
|
|
|
|
|
<td class="td-num">{{ fmt(row.length_per_ton) }}</td>
|
|
|
|
|
<td class="td-muted">{{ fmtTime(row.offline_time) }}</td>
|
|
|
|
|
<td><span :class="['badge', statusBadge(row.status)]">{{ statusLabel(row.status) }}</span></td>
|
|
|
|
|
<td>
|
|
|
|
|
<td @click.stop>
|
|
|
|
|
<span class="action-link" @click="openDialog(row)">编辑</span>
|
|
|
|
|
<span class="action-link" style="color:#1d8eff" @click="viewCert(row)">质保书</span>
|
|
|
|
|
</td>
|
|
|
|
|
@@ -91,6 +93,32 @@
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- 生产阶段数据 -->
|
|
|
|
|
<div class="card" v-if="selectedRow">
|
|
|
|
|
<div class="card-header">生产阶段数据 — {{ selectedRow.sub_coil_no || selectedRow.coil_no }}</div>
|
|
|
|
|
<div class="stage-grid">
|
|
|
|
|
<div class="sg-row"><span class="sg-k">班期</span><span class="sg-v">{{ fmtTime(selectedRow.shift_date) }}</span></div>
|
|
|
|
|
<div class="sg-row"><span class="sg-k">开始时间</span><span class="sg-v">{{ fmtTime(selectedRow.start_time) }}</span></div>
|
|
|
|
|
<div class="sg-row"><span class="sg-k">结束时间</span><span class="sg-v">{{ fmtTime(selectedRow.end_time) }}</span></div>
|
|
|
|
|
<div class="sg-row"><span class="sg-k">下线时间</span><span class="sg-v">{{ fmtTime(selectedRow.offline_time) }}</span></div>
|
|
|
|
|
|
|
|
|
|
<div class="sg-row"><span class="sg-k">过程长度</span><span class="sg-v">{{ fmt(selectedRow.process_length, 0) }} <i>m</i></span></div>
|
|
|
|
|
<div class="sg-row"><span class="sg-k">过程重量</span><span class="sg-v">{{ fmt(selectedRow.process_weight, 3) }} <i>t</i></span></div>
|
|
|
|
|
<div class="sg-row"><span class="sg-k">平均速度</span><span class="sg-v">{{ fmt(selectedRow.avg_speed, 0) }} <i>m/min</i></span></div>
|
|
|
|
|
<div class="sg-row"><span class="sg-k">最高速度</span><span class="sg-v">{{ fmt(selectedRow.max_speed, 0) }} <i>m/min</i></span></div>
|
|
|
|
|
|
|
|
|
|
<div class="sg-row"><span class="sg-k">入口厚度</span><span class="sg-v">{{ fmt(selectedRow.inlet_thickness) }} <i>mm</i></span></div>
|
|
|
|
|
<div class="sg-row"><span class="sg-k">入口宽度</span><span class="sg-v">{{ fmt(selectedRow.inlet_width, 0) }} <i>mm</i></span></div>
|
|
|
|
|
<div class="sg-row"><span class="sg-k">酸耗</span><span class="sg-v">{{ fmt(selectedRow.acid_consumption) }} <i>kg</i></span></div>
|
|
|
|
|
<div class="sg-row"><span class="sg-k">质量等级</span><span class="sg-v">{{ selectedRow.quality_grade || '—' }}</span></div>
|
|
|
|
|
|
|
|
|
|
<div class="sg-row"><span class="sg-k">成品长度</span><span class="sg-v">{{ fmt(selectedRow.product_length, 0) }} <i>m</i></span></div>
|
|
|
|
|
<div class="sg-row"><span class="sg-k">吨钢长度</span><span class="sg-v">{{ fmt(selectedRow.length_per_ton) }} <i>m/t</i></span></div>
|
|
|
|
|
<div class="sg-row"><span class="sg-k">成品质量</span><span class="sg-v">{{ fmt(selectedRow.product_quality) }} <i>%</i></span></div>
|
|
|
|
|
<div class="sg-row"><span class="sg-k">操作员</span><span class="sg-v">{{ selectedRow.operator || '—' }}</span></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- 新增/编辑弹窗 -->
|
|
|
|
|
<div v-if="dialogVisible" class="modal-mask" @click.self="dialogVisible=false">
|
|
|
|
|
<div class="modal-box" style="width:820px;">
|
|
|
|
|
@@ -258,6 +286,7 @@ export default {
|
|
|
|
|
query: { page: 1, page_size: 50, coil_no: '', shift: '', status: '', start_date: '', end_date: '' },
|
|
|
|
|
dialogVisible: false, editRow: null, form: { status: 'UNWEIGH' },
|
|
|
|
|
certVisible: false, certRow: {},
|
|
|
|
|
selectedRow: null,
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
computed: {
|
|
|
|
|
@@ -285,6 +314,7 @@ export default {
|
|
|
|
|
},
|
|
|
|
|
fmt(v, n = 2) { return v != null ? Number(v).toFixed(n) : '—' },
|
|
|
|
|
fmtTime(t) { return t ? t.slice(0, 16).replace('T', ' ') : '—' },
|
|
|
|
|
selectRow(row) { this.selectedRow = this.selectedRow && this.selectedRow.id === row.id ? null : row },
|
|
|
|
|
statusLabel(s) { return STATUS_MAP[s]?.label || s || '—' },
|
|
|
|
|
statusBadge(s) { return STATUS_MAP[s]?.badge || 'badge-gray' },
|
|
|
|
|
openDialog(row = null) {
|
|
|
|
|
@@ -319,6 +349,11 @@ export default {
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
|
@import '@/assets/styles/variables';
|
|
|
|
|
.action-link { color: $sms-highlight; cursor: pointer; font-size: 12px; margin-right: 10px; &:hover { text-decoration: underline; } }
|
|
|
|
|
.row-selected { background: rgba($sms-teal, .1) !important; }
|
|
|
|
|
.stage-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px 24px; padding: 14px 18px; }
|
|
|
|
|
.sg-row { display: flex; align-items: center; gap: 10px; font-size: 12px; min-height: 22px; }
|
|
|
|
|
.sg-k { color: $text-muted; min-width: 64px; }
|
|
|
|
|
.sg-v { color: $text-primary; font-family: $font-mono; font-weight: 600; i { color: $text-muted; font-style: normal; font-family: $font-main; font-weight: 400; font-size: 11px; margin-left: 2px; } }
|
|
|
|
|
.form-field { display: flex; flex-direction: column; gap: 5px; }
|
|
|
|
|
.grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; }
|
|
|
|
|
.data-table.compact th, .data-table.compact td { padding: 4px 6px; font-size: 11.5px; }
|
|
|
|
|
|