From 08bb5d242135e2c1f0fc17d2b5f7ae548275a3a2 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 28 八月 2026 17:15:33 +0800
Subject: [PATCH] feat(mes): 实现临时码预生成和补录功能
---
src/views/mes/pro/pallet/index.vue | 102 +++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 94 insertions(+), 8 deletions(-)
diff --git a/src/views/mes/pro/pallet/index.vue b/src/views/mes/pro/pallet/index.vue
index 403a339..a34a272 100644
--- a/src/views/mes/pro/pallet/index.vue
+++ b/src/views/mes/pro/pallet/index.vue
@@ -5,18 +5,20 @@
import { Page, useVbenModal } from "@vben/common-ui";
import { downloadFileFromBlobPart } from "@vben/utils";
- import { message } from "ant-design-vue";
+ import { message, Modal, Tag } from "ant-design-vue";
import { ACTION_ICON, TableAction, useVbenVxeGrid } from "#/adapter/vxe-table";
import {
deletePallet,
exportPalletExcel,
exportPalletQr,
+ exportPalletQrByIds,
getPalletPage,
} from "#/api/mes/pro/pallet";
import { $t } from "#/locales";
import { useGridColumns, useGridFormSchema } from "./data";
+ import BindBatchModal from "./modules/bind-batch.vue";
import GenerateModal from "./modules/generate-form.vue";
import QrTraceModal from "../components/qr-trace-modal.vue";
@@ -24,6 +26,11 @@
const [GenerateFormModal, generateFormModalApi] = useVbenModal({
connectedComponent: GenerateModal,
+ destroyOnClose: true,
+ });
+
+ const [BindBatchFormModal, bindBatchFormModalApi] = useVbenModal({
+ connectedComponent: BindBatchModal,
destroyOnClose: true,
});
@@ -37,9 +44,18 @@
gridApi.query();
}
- /** 鎵归噺鐢熸垚鎵樼洏鐮� */
+ /** 鎵归噺棰勭敓鎴愭墭鐩樼爜 */
function handleCreate() {
generateFormModalApi.open();
+ }
+
+ /** 棰勭敓鎴愭垚鍔燂細灞曠ず鐢熸垚鐨勪复鏃舵墭鐩樼爜 */
+ function handlePreGenerateSuccess(result: { id: number; tempCode: string }[]) {
+ Modal.success({
+ title: "棰勭敓鎴愪复鏃舵墭鐩樼爜鎴愬姛",
+ content: result.map((item) => item.tempCode).join("\n"),
+ centered: true,
+ });
}
/** 鎵爜杩芥函 */
@@ -47,9 +63,44 @@
qrTraceQueryModalApi.open();
}
- /** 鏌ョ湅浜岀淮鐮侊紙琛屽唴棰勫~鐮佸�硷級 */
+ /** 鑾峰彇鎵樼洏鏄剧ず鐢ㄧ殑鐮佸�硷紙姝e紡鎵樼洏鐮佷紭鍏堬紝鍏舵涓存椂鎵樼洏鐮侊級 */
+ function getDisplayCode(row: MesProPalletApi.Pallet) {
+ return row.code || row.tempCode || "";
+ }
+
+ /** 鏌ョ湅浜岀淮鐮侊紙琛屽唴棰勫~鐮佸�硷紝涓存椂鎵樼洏鐢ㄤ复鏃舵墭鐩樼爜锛� */
function handleViewQr(row: MesProPalletApi.Pallet) {
- qrTraceQueryModalApi.setData({ code: row.code }).open();
+ qrTraceQueryModalApi.setData({ code: getDisplayCode(row) }).open();
+ }
+
+ /** 鑾峰彇鍕鹃�夌殑涓存椂鎵樼洏璁板綍 */
+ function getSelectedTempPallets(): MesProPalletApi.Pallet[] | undefined {
+ const records = [
+ ...(gridApi.grid.getCheckboxReserveRecords?.() ?? []),
+ ...(gridApi.grid.getCheckboxRecords?.() ?? []),
+ ] as MesProPalletApi.Pallet[];
+ const uniqueRecords = [
+ ...new Map(records.map((record) => [record.id, record])).values(),
+ ];
+ const tempRecords = uniqueRecords.filter((record) => !record.batchId);
+ if (uniqueRecords.length === 0) {
+ message.warning("璇疯嚦灏戝嬀閫変竴鏉℃墭鐩樼爜璁板綍");
+ return undefined;
+ }
+ if (tempRecords.length === 0) {
+ message.warning("鍕鹃�夌殑璁板綍鍧囧凡缁戝畾鎵规锛屾棤闇�缁戝畾");
+ return undefined;
+ }
+ return tempRecords;
+ }
+
+ /** 缁戝畾鎵规 */
+ function handleBindBatch() {
+ const records = getSelectedTempPallets();
+ if (!records) return;
+ bindBatchFormModalApi
+ .setData({ ids: records.map((record) => record.id!) })
+ .open();
}
/** 瀵煎嚭浜岀淮鐮� ZIP锛堟寜褰撳墠鏌ヨ鏉′欢鐨勬壒娆★級 */
@@ -63,10 +114,19 @@
downloadFileFromBlobPart({ fileName: "鎵樼洏鐮佷簩缁寸爜.zip", source: data });
}
+ /** 瀵煎嚭鍗曚釜鎵樼洏鐮佷簩缁寸爜 ZIP锛堟敮鎸佹湭缁戝畾鎵规鐨勪复鏃舵墭鐩橈級 */
+ async function handleExportQrById(row: MesProPalletApi.Pallet) {
+ const data = await exportPalletQrByIds([row.id!]);
+ downloadFileFromBlobPart({
+ fileName: `鎵樼洏鐮佷簩缁寸爜-${getDisplayCode(row)}.zip`,
+ source: data,
+ });
+ }
+
/** 鍒犻櫎鎵樼洏鐮� */
async function handleDelete(row: MesProPalletApi.Pallet) {
await deletePallet(row.id!);
- message.success($t("ui.actionMessage.deleteSuccess", [row.code]));
+ message.success($t("ui.actionMessage.deleteSuccess", [getDisplayCode(row)]));
handleRefresh();
}
@@ -81,6 +141,10 @@
schema: useGridFormSchema(),
},
gridOptions: {
+ checkboxConfig: {
+ highlight: true,
+ reserve: true,
+ },
columns: useGridColumns(),
height: "auto",
keepSource: true,
@@ -109,17 +173,24 @@
<template>
<Page auto-content-height>
- <GenerateFormModal @success="handleRefresh" />
+ <GenerateFormModal @success="handlePreGenerateSuccess" />
+ <BindBatchFormModal @success="handleRefresh" />
<QrTraceQueryModal />
<Grid table-title="鎵樼洏鐮佸垪琛�">
<template #toolbar-tools>
<TableAction :actions="[
{
- label: '鎵归噺鐢熸垚',
+ label: '棰勭敓鎴愪簩缁寸爜',
type: 'primary',
icon: ACTION_ICON.ADD,
auth: ['mes:pro-pallet:create'],
onClick: handleCreate,
+ },
+ {
+ label: '缁戝畾鎵规',
+ icon: ACTION_ICON.EDIT,
+ auth: ['mes:pro-pallet:update'],
+ onClick: handleBindBatch,
},
{
label: '鎵爜杩芥函',
@@ -142,6 +213,14 @@
},
]" />
</template>
+ <template #code="{ row }">
+ <span>{{ getDisplayCode(row) }}</span>
+ <Tag v-if="!row.code" color="warning">鏈粦瀹氭壒娆�</Tag>
+ </template>
+ <template #batchCode="{ row }">
+ <span v-if="row.batchCode">{{ row.batchCode }}</span>
+ <Tag v-else color="warning">鏈粦瀹氭壒娆�</Tag>
+ </template>
<template #actions="{ row }">
<TableAction :actions="[
{
@@ -151,6 +230,13 @@
onClick: handleViewQr.bind(null, row),
},
{
+ label: '瀵煎嚭浜岀淮鐮�',
+ type: 'link',
+ icon: ACTION_ICON.DOWNLOAD,
+ auth: ['mes:pro-pallet:export'],
+ onClick: handleExportQrById.bind(null, row),
+ },
+ {
label: $t('common.delete'),
type: 'link',
danger: true,
@@ -158,7 +244,7 @@
auth: ['mes:pro-pallet:delete'],
ifShow: !row.bagCount,
popConfirm: {
- title: $t('ui.actionMessage.deleteConfirm', [row.code]),
+ title: $t('ui.actionMessage.deleteConfirm', [getDisplayCode(row)]),
confirm: handleDelete.bind(null, row),
},
},
--
Gitblit v1.9.3