You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

329 lines
12 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="backward1-container">
<el-card class="query-card" shadow="never">
<el-form :model="queryParams" :inline="true" label-width="80px">
<el-form-item label="条码类型">
<el-select v-model="queryParams.barcodeType" placeholder="请选择" style="width: 150px" @change="handleBarcodeTypeChange">
<el-option label="架子号" value="1" />
<el-option label="半制品卡号" value="2" />
<el-option label="成型号" value="3" />
<el-option label="硫化号" value="4" />
</el-select>
</el-form-item>
<el-form-item label="条码号">
<el-input v-model="queryParams.barcodeNo" placeholder="请输入条码号" clearable style="width: 220px" />
</el-form-item>
<el-form-item label="开始时间">
<el-date-picker
v-model="queryParams.startTime"
type="datetime"
placeholder="开始时间"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 200px"
/>
</el-form-item>
<el-form-item label="结束时间">
<el-date-picker
v-model="queryParams.endTime"
type="datetime"
placeholder="结束时间"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 200px"
/>
</el-form-item>
<el-form-item label="班次">
<el-select v-model="queryParams.shift" placeholder="全部" clearable style="width: 120px">
<el-option label="早" value="早" />
<el-option label="中" value="中" />
<el-option label="夜" value="夜" />
</el-select>
</el-form-item>
<el-form-item label="班组">
<el-select v-model="queryParams.team" placeholder="全部" clearable style="width: 120px">
<el-option label="甲班" value="甲班" />
<el-option label="乙班" value="乙班" />
<el-option label="丙班" value="丙班" />
</el-select>
</el-form-item>
<el-form-item label="机台">
<el-input v-model="queryParams.machine" placeholder="请输入机台" clearable style="width: 150px" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="table-card" shadow="never">
<div class="table-scroll">
<el-table
:data="tableData"
border
stripe
:fit="false"
:scrollbar-always-on="true"
height="520"
@row-click="handleRowClick"
:row-style="{ cursor: 'pointer' }"
>
<el-table-column type="index" label="序号" width="60" align="center" />
<template v-if="queryParams.barcodeType === '1'">
<el-table-column prop="vulcanizationNo" label="硫化号" min-width="150" align="center" show-overflow-tooltip />
<el-table-column prop="planDate" label="计划日期" min-width="120" align="center" show-overflow-tooltip />
<el-table-column prop="shift" label="班次" min-width="80" align="center" />
<el-table-column prop="team" label="班组" min-width="90" align="center" />
<el-table-column prop="machineNo" label="机台号" min-width="110" align="center" show-overflow-tooltip />
<el-table-column prop="materialSpec" label="物料规格" min-width="260" align="center" show-overflow-tooltip />
</template>
<template v-else-if="queryParams.barcodeType === '2'">
<el-table-column prop="cardNo" label="流转卡号" min-width="180" align="center" show-overflow-tooltip />
<el-table-column prop="toolingNo" label="工装号" min-width="180" align="center" show-overflow-tooltip />
<el-table-column prop="shift" label="班次" min-width="80" align="center" />
<el-table-column prop="team" label="班组" min-width="90" align="center" />
<el-table-column prop="recorder" label="记录人" min-width="90" align="center" />
<el-table-column prop="startTime" label="开始时间" min-width="180" align="center" show-overflow-tooltip />
<el-table-column prop="endTime" label="结束时间" min-width="180" align="center" show-overflow-tooltip />
<el-table-column prop="machineNo" label="机台号" min-width="120" align="center" show-overflow-tooltip />
<el-table-column prop="qty" label="数量" min-width="90" align="right" />
<el-table-column prop="leftQty" label="剩余数量" min-width="100" align="right" />
</template>
<template v-else-if="queryParams.barcodeType === '3'">
<el-table-column prop="greenTyreNo" label="成型号" min-width="170" align="center" show-overflow-tooltip />
<el-table-column prop="materialSpec" label="物料规格" min-width="260" align="center" show-overflow-tooltip />
<el-table-column prop="shift" label="班次" min-width="80" align="center" />
<el-table-column prop="team" label="班组" min-width="90" align="center" />
<el-table-column prop="recorder" label="记录人" min-width="90" align="center" />
<el-table-column prop="startTime" label="开始时间" min-width="180" align="center" show-overflow-tooltip />
<el-table-column prop="endTime" label="结束时间" min-width="180" align="center" show-overflow-tooltip />
<el-table-column prop="machineNo" label="机台号" min-width="120" align="center" show-overflow-tooltip />
</template>
<template v-else>
<el-table-column prop="vulcanizationNo" label="硫化号" min-width="150" align="center" show-overflow-tooltip />
<el-table-column prop="moldingNo" label="成型号" min-width="150" align="center" show-overflow-tooltip />
<el-table-column prop="materialSpec" label="物料规格" min-width="260" align="center" show-overflow-tooltip />
<el-table-column prop="shift" label="班次" min-width="80" align="center" />
<el-table-column prop="team" label="班组" min-width="90" align="center" />
<el-table-column prop="startTime" label="开始时间" min-width="180" align="center" show-overflow-tooltip />
<el-table-column prop="endTime" label="结束时间" min-width="180" align="center" show-overflow-tooltip />
<el-table-column prop="machineNo" label="机台号" min-width="120" align="center" show-overflow-tooltip />
<el-table-column prop="moldPosition" label="左右模" min-width="90" align="center" />
</template>
</el-table>
</div>
<el-pagination
v-model:current-page="queryParams.pageNum"
v-model:page-size="queryParams.pageSize"
:total="total"
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
style="margin-top: 16px; text-align: right"
/>
</el-card>
</div>
</template>
<script setup lang="ts" name="MixTraceBackward1">
import { onMounted, reactive, ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { ElMessage } from 'element-plus';
import backwardData from './data/backward1.json';
import backwardDetailData from './data/backward2.json';
type BarcodeType = '1' | '2' | '3' | '4';
interface BackwardRow {
id: string;
detailId?: string;
barcodeType: BarcodeType;
vulcanizationNo?: string;
cardNo?: string;
greenTyreNo?: string;
planDate?: string;
startTime?: string;
endTime?: string;
shift?: string;
team?: string;
machineNo?: string;
}
const router = useRouter();
const route = useRoute();
const detailMap = (backwardDetailData as any).detailMap || {};
const queryParams = reactive({
startTime: '',
endTime: '',
shift: '',
barcodeType: '4' as BarcodeType,
barcodeNo: '',
team: '',
machine: '',
pageNum: 1,
pageSize: 10
});
const initFromRoute = () => {
// 默认反向追溯条码类型为硫化号(4)
const typeFromRoute = String(route.query.barcodeType || '').trim();
const noFromRoute = String(route.query.barcodeNo || '').trim();
queryParams.barcodeType = (typeFromRoute || '4') as BarcodeType;
if (noFromRoute) {
queryParams.barcodeNo = noFromRoute;
}
};
const tableData = ref<BackwardRow[]>([]);
const total = ref(0);
const getDataByType = (type: BarcodeType): BackwardRow[] => {
const data = backwardData as any;
if (type === '1') return data.shelfData || [];
if (type === '2') return data.semiCardData || [];
if (type === '3') return data.moldingData || [];
return data.curingData || [];
};
const getRowBarcode = (row: BackwardRow): string => {
return String(row.vulcanizationNo || row.cardNo || row.greenTyreNo || '');
};
const toTimestamp = (timeStr?: string): number | null => {
if (!timeStr) return null;
const ms = Date.parse(timeStr.replace(/\//g, '-'));
return Number.isNaN(ms) ? null : ms;
};
const getRowTime = (row: BackwardRow): number | null => {
if (row.startTime) return toTimestamp(row.startTime);
if (row.planDate) return toTimestamp(`${row.planDate} 00:00:00`);
return null;
};
const refreshTable = () => {
const all = getDataByType(queryParams.barcodeType);
const barcodeKeyword = queryParams.barcodeNo.trim().toLowerCase();
const machineKeyword = queryParams.machine.trim().toLowerCase();
const startTs = toTimestamp(queryParams.startTime);
const endTs = toTimestamp(queryParams.endTime);
const filtered = all.filter((row) => {
const rowBarcode = getRowBarcode(row).toLowerCase();
const machine = String(row.machineNo || '').toLowerCase();
const rowTs = getRowTime(row);
if (barcodeKeyword && !rowBarcode.includes(barcodeKeyword)) return false;
if (queryParams.shift && row.shift !== queryParams.shift) return false;
if (queryParams.team && row.team !== queryParams.team) return false;
if (machineKeyword && !machine.includes(machineKeyword)) return false;
if (startTs !== null && rowTs !== null && rowTs < startTs) return false;
if (endTs !== null && rowTs !== null && rowTs > endTs) return false;
return true;
});
total.value = filtered.length;
const start = (queryParams.pageNum - 1) * queryParams.pageSize;
tableData.value = filtered.slice(start, start + queryParams.pageSize);
};
const handleQuery = () => {
queryParams.pageNum = 1;
refreshTable();
};
const handleBarcodeTypeChange = () => {
handleQuery();
};
const resetQuery = () => {
queryParams.startTime = '';
queryParams.endTime = '';
queryParams.shift = '';
queryParams.barcodeType = '4';
queryParams.barcodeNo = '';
queryParams.team = '';
queryParams.machine = '';
queryParams.pageNum = 1;
queryParams.pageSize = 10;
refreshTable();
};
const handleSizeChange = () => {
queryParams.pageNum = 1;
refreshTable();
};
const handleCurrentChange = () => {
refreshTable();
};
const handleRowClick = (row: BackwardRow) => {
const detailId = String(row.detailId || row.id || '');
if (!detailId) {
ElMessage.error('当前行缺少 detailId无法跳转详情');
return;
}
const detail = detailMap[detailId];
if (!detail) {
ElMessage.error(`未找到详情数据: ${detailId}`);
return;
}
const rowType = String(row.barcodeType || queryParams.barcodeType || '4');
const detailType = String(detail.barcodeType || rowType || '4');
if (rowType !== detailType) {
ElMessage.warning(`条码类型已按详情修正: ${rowType} -> ${detailType}`);
}
router.push({
path: '/mes/mixTrace/show/backward2',
query: {
id: detailId,
barcodeType: detailType
}
});
};
onMounted(() => {
initFromRoute();
refreshTable();
});
</script>
<style scoped lang="scss">
.backward1-container {
padding: 20px;
.query-card {
margin-bottom: 16px;
:deep(.el-card__body) {
padding: 16px;
}
}
.table-card {
:deep(.el-card__body) {
padding: 16px;
}
}
.table-scroll {
width: 100%;
min-width: 0;
}
:deep(.el-table__body td) {
padding: 8px 0;
}
}
</style>