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

<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>