From 3972a27ebe534def8c231491913c1036af09ae31 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 16 七月 2026 16:16:10 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_pro2.0' into dev_pro2.0
---
src/views/mes/workbench/components/tabs/ProductIssueTab.vue | 214 ++++++++++++++++++++++++++++++++++++-----------------
1 files changed, 146 insertions(+), 68 deletions(-)
diff --git a/src/views/mes/workbench/components/tabs/ProductIssueTab.vue b/src/views/mes/workbench/components/tabs/ProductIssueTab.vue
index e59ad60..9731a1b 100644
--- a/src/views/mes/workbench/components/tabs/ProductIssueTab.vue
+++ b/src/views/mes/workbench/components/tabs/ProductIssueTab.vue
@@ -3,7 +3,7 @@
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MesWmProductIssueApi } from '#/api/mes/wm/productissue';
-import { h, markRaw, onBeforeUnmount, onMounted, ref, watch, nextTick } from 'vue';
+import { computed, h, markRaw, onBeforeUnmount, onMounted, ref, watch, nextTick } from 'vue';
import {
DICT_TYPE,
@@ -12,11 +12,11 @@
MesWmProductIssueStatusEnum,
} from '@vben/constants';
import { IconifyIcon } from '@vben/icons';
-import { getDictOptions } from '@vben/hooks';
-import { Button, Divider, message, Popconfirm, Tag } from 'ant-design-vue';
+import { Button, Divider, Empty, message, Popconfirm, Tag } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form';
+import { useVbenModal } from '@vben/common-ui';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { generateAutoCode } from '#/api/mes/md/autocode/record';
import {
@@ -29,7 +29,8 @@
} from '#/api/mes/wm/productissue';
import { MdWorkstationSelect } from '#/views/mes/md/workstation/components';
import { ProWorkOrderSelect } from '#/views/mes/pro/workorder/components';
-import { $t } from '#/locales';
+
+import ProductIssueFormModal from './ProductIssueFormModal.vue';
defineOptions({ name: 'WorkbenchProductIssueTab' });
@@ -38,6 +39,14 @@
workstationId?: number;
/** 褰撳墠宸ヤ綔绔欏悕绉� */
workstationName?: string;
+ /** 褰撳墠閫変腑鐨勪换鍔� ID */
+ taskId?: number;
+ /** 褰撳墠閫変腑鐨勪换鍔$紪鐮� */
+ taskCode?: string;
+ /** 褰撳墠閫変腑鐨勪换鍔″悕绉� */
+ taskName?: string;
+ /** 褰撳墠閫変腑鐨勪换鍔″叧鑱斿伐鍗� ID */
+ workOrderId?: number;
}>();
// --- 琛ㄥ崟鐘舵�� ---
@@ -77,19 +86,29 @@
rules: 'required',
},
{
+ fieldName: 'taskId',
+ label: '鐢熶骇浠诲姟',
+ component: 'Input',
+ componentProps: {
+ placeholder: '浠庨�変腑浠诲姟鑷姩甯﹀叆',
+ disabled: true,
+ },
+ rules: 'required',
+ },
+ {
fieldName: 'workOrderId',
label: '鐢熶骇璁㈠崟',
component: markRaw(ProWorkOrderSelect),
componentProps: {
status: MesProWorkOrderStatusEnum.CONFIRMED,
+ disabled: true,
},
- rules: 'selectRequired',
},
{
fieldName: 'workstationId',
label: '宸ヤ綔绔�',
component: markRaw(MdWorkstationSelect),
- componentProps: { placeholder: '璇烽�夋嫨宸ヤ綔绔�' },
+ componentProps: { placeholder: '浠庨�変腑浠诲姟鑷姩甯﹀叆', disabled: true },
},
{
fieldName: 'requiredTime',
@@ -129,7 +148,13 @@
isCreating.value = true;
editingId.value = undefined;
await formApi.resetForm();
- // 棰勫~宸ヤ綔绔�
+ // 棰勫~浠诲姟淇℃伅
+ if (props.taskId) {
+ await formApi.setFieldValue('taskId', props.taskId);
+ }
+ if (props.workOrderId) {
+ await formApi.setFieldValue('workOrderId', props.workOrderId);
+ }
if (props.workstationId) {
await formApi.setFieldValue('workstationId', props.workstationId);
}
@@ -165,6 +190,11 @@
formApi.resetForm();
}
+/** 缂栬緫棰嗘枡鍗曪細鎵撳紑缂栬緫寮圭獥锛堜粎鑽夌鐘舵�佸彲缂栬緫锛� */
+function handleEditRow(row: MesWmProductIssueApi.ProductIssue) {
+ editFormModalApi.setData({ id: row.id }).open();
+}
+
/** 鎻愪氦 */
async function handleSubmitRow(row: MesWmProductIssueApi.ProductIssue) {
await submitProductIssue(row.id!);
@@ -190,6 +220,12 @@
const gridColumns: VxeTableGridOptions<MesWmProductIssueApi.ProductIssue>['columns'] = [
{ field: 'code', title: '棰嗘枡鍗曠紪鍙�', minWidth: 150 },
{ field: 'name', title: '棰嗘枡鍗曞悕绉�', minWidth: 130 },
+ {
+ field: 'taskCode',
+ title: '鐢熶骇浠诲姟',
+ minWidth: 130,
+ formatter: ({ row }) => row.taskCode || props.taskCode || '',
+ },
{ field: 'workOrderCode', title: '鐢熶骇璁㈠崟', minWidth: 130 },
{
field: 'requiredTime',
@@ -206,7 +242,7 @@
props: { type: DICT_TYPE.MES_WM_PRODUCT_ISSUE_STATUS },
},
},
- { title: '鎿嶄綔', width: 200, fixed: 'right', slots: { default: 'actions' } },
+ { title: '鎿嶄綔', width: 260, fixed: 'right', slots: { default: 'actions' } },
];
const gridHeight = ref(300);
@@ -224,7 +260,7 @@
return await getProductIssuePage({
pageNo: page.currentPage,
pageSize: page.pageSize,
- workstationId: props.workstationId,
+ taskId: props.taskId,
...formValues,
});
},
@@ -261,77 +297,112 @@
resizeObserver = null;
});
-// 宸ヤ綔绔欏彉鍖栨椂鍒锋柊鍒楄〃
+// 浠诲姟鎴栧伐浣滅珯鍙樺寲鏃跺埛鏂板垪琛�
watch(
- () => props.workstationId,
+ () => [props.taskId, props.workstationId],
() => gridApi.query(),
);
+
+/** 鏄惁宸查�変腑宸ヤ綔绔欏拰浠诲姟锛屾湭閫変腑鏃朵笉灞曠ず琛ㄦ牸 */
+const isReady = computed(() => !!props.taskId && !!props.workstationId);
+
+/** 缂栬緫寮圭獥 */
+const [EditFormModal, editFormModalApi] = useVbenModal({
+ connectedComponent: ProductIssueFormModal,
+ destroyOnClose: true,
+});
+
+/** 缂栬緫寮圭獥鎿嶄綔鎴愬姛鍚庡埛鏂板垪琛� */
+function onEditSuccess() {
+ gridApi.query();
+}
</script>
<template>
<div class="issue-tab">
- <!-- 椤堕儴锛氳〃鍗� / 鏂板缓鎸夐挳 -->
- <div class="issue-tab__header">
- <div class="issue-tab__header-left">
- <IconifyIcon icon="lucide:clipboard-list" class="issue-tab__icon" />
- <span class="issue-tab__title">棰嗘枡鍗�</span>
- <Tag v-if="isCreating" color="blue">鏂板缓涓�</Tag>
+ <!-- 鏈�変腑宸ヤ綔绔欐垨浠诲姟鏃舵樉绀烘彁绀� -->
+ <div v-if="!isReady" class="issue-tab__empty">
+ <Empty
+ :image="Empty.PRESENTED_IMAGE_SIMPLE"
+ description="璇峰厛鍦ㄥ乏渚ч�夋嫨宸ヤ綔绔欏拰浠诲姟"
+ />
+ </div>
+ <template v-else>
+ <!-- 椤堕儴锛氳〃鍗� / 鏂板缓鎸夐挳 -->
+ <div class="issue-tab__header">
+ <div class="issue-tab__header-left">
+ <IconifyIcon icon="lucide:clipboard-list" class="issue-tab__icon" />
+ <span class="issue-tab__title">棰嗘枡鍗�</span>
+ <Tag v-if="isCreating" color="blue">鏂板缓涓�</Tag>
+ </div>
+ <div class="issue-tab__header-actions">
+ <template v-if="!isCreating">
+ <Button type="primary" size="small" @click="handleCreate">
+ <template #icon><IconifyIcon icon="lucide:plus" /></template>
+ 鏂板缓棰嗘枡鍗�
+ </Button>
+ </template>
+ <template v-else>
+ <Button type="primary" size="small" @click="handleSave">
+ <template #icon><IconifyIcon icon="lucide:save" /></template>
+ 淇濆瓨
+ </Button>
+ <Button size="small" @click="handleCancelEdit">鍙栨秷</Button>
+ </template>
+ </div>
</div>
- <div class="issue-tab__header-actions">
- <template v-if="!isCreating">
- <Button type="primary" size="small" @click="handleCreate">
- <template #icon><IconifyIcon icon="lucide:plus" /></template>
- 鏂板缓棰嗘枡鍗�
- </Button>
- </template>
- <template v-else>
- <Button type="primary" size="small" @click="handleSave">
- <template #icon><IconifyIcon icon="lucide:save" /></template>
- 淇濆瓨
- </Button>
- <Button size="small" @click="handleCancelEdit">鍙栨秷</Button>
- </template>
+
+ <!-- 琛ㄥ崟鍖哄煙锛堜粎鏂板缓鏃跺睍绀猴級 -->
+ <div v-if="isCreating" class="issue-tab__form">
+ <Form />
</div>
- </div>
- <!-- 琛ㄥ崟鍖哄煙锛堜粎鏂板缓鏃跺睍绀猴級 -->
- <div v-if="isCreating" class="issue-tab__form">
- <Form />
- </div>
+ <Divider style="margin: 12px 0" />
- <Divider style="margin: 12px 0" />
+ <!-- 搴曢儴锛氶鏂欒褰曞垪琛� -->
+ <div ref="listRef" class="issue-tab__list">
+ <Grid table-title="棰嗘枡璁板綍">
+ <template #actions="{ row }">
+ <Button
+ v-if="row.status === MesWmProductIssueStatusEnum.PREPARE"
+ type="link"
+ size="small"
+ @click="handleEditRow(row)"
+ >
+ 缂栬緫
+ </Button>
+ <Popconfirm
+ v-if="row.status === MesWmProductIssueStatusEnum.PREPARE"
+ title="纭鎻愪氦锛熸彁浜ゅ悗涓嶈兘淇敼"
+ @confirm="handleSubmitRow(row)"
+ >
+ <Button type="link" size="small">鎻愪氦</Button>
+ </Popconfirm>
+ <Popconfirm
+ v-if="row.status === MesWmProductIssueStatusEnum.PREPARE"
+ :title="`纭鍒犻櫎 ${row.code}锛焋"
+ @confirm="handleDeleteRow(row)"
+ >
+ <Button type="link" size="small" danger>鍒犻櫎</Button>
+ </Popconfirm>
+ <Popconfirm
+ v-if="
+ row.status === MesWmProductIssueStatusEnum.APPROVING ||
+ row.status === MesWmProductIssueStatusEnum.APPROVED
+ "
+ title="纭鍙栨秷锛熷彇娑堝悗涓嶅彲鎭㈠"
+ @confirm="handleCancelRow(row)"
+ >
+ <Button type="link" size="small" danger>鍙栨秷</Button>
+ </Popconfirm>
+ </template>
+ </Grid>
+ </div>
- <!-- 搴曢儴锛氶鏂欒褰曞垪琛� -->
- <div ref="listRef" class="issue-tab__list">
- <Grid table-title="棰嗘枡璁板綍">
- <template #actions="{ row }">
- <Popconfirm
- v-if="row.status === MesWmProductIssueStatusEnum.PREPARE"
- title="纭鎻愪氦锛熸彁浜ゅ悗涓嶈兘淇敼"
- @confirm="handleSubmitRow(row)"
- >
- <Button type="link" size="small">鎻愪氦</Button>
- </Popconfirm>
- <Popconfirm
- v-if="row.status === MesWmProductIssueStatusEnum.PREPARE"
- :title="`纭鍒犻櫎 ${row.code}锛焋"
- @confirm="handleDeleteRow(row)"
- >
- <Button type="link" size="small" danger>鍒犻櫎</Button>
- </Popconfirm>
- <Popconfirm
- v-if="
- row.status === MesWmProductIssueStatusEnum.APPROVING ||
- row.status === MesWmProductIssueStatusEnum.APPROVED
- "
- title="纭鍙栨秷锛熷彇娑堝悗涓嶅彲鎭㈠"
- @confirm="handleCancelRow(row)"
- >
- <Button type="link" size="small" danger>鍙栨秷</Button>
- </Popconfirm>
- </template>
- </Grid>
- </div>
+ </template>
+
+ <!-- 缂栬緫寮圭獥 -->
+ <EditFormModal @success="onEditSuccess" />
</div>
</template>
@@ -386,4 +457,11 @@
min-height: 0;
overflow: hidden;
}
+
+.issue-tab__empty {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
</style>
--
Gitblit v1.9.3