From b64a0deae5b5d33f9e20671a68936b27f0b9b00b Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 21 七月 2026 18:03:03 +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