From b3abd460d8f68b9f501b48aeecaa344ff18c033a Mon Sep 17 00:00:00 2001
From: hsy <1029150275@qq.com>
Date: 星期三, 26 八月 2026 17:05:29 +0800
Subject: [PATCH] feat(mes): 生产任务报工人下拉源调整为工作站人力配置

---
 src/views/mes/pro/task/data.ts               |   27 +++++++++++--
 src/views/mes/pd/archive/modules/detail.vue  |   32 ++++++++++-----
 src/views/mes/pro/workorder/data.ts          |   28 +++++++-------
 src/api/mes/md/workstation/worker/index.ts   |   12 ++++++
 src/views/mes/pro/task/modules/task-form.vue |   15 +------
 5 files changed, 72 insertions(+), 42 deletions(-)

diff --git a/src/api/mes/md/workstation/worker/index.ts b/src/api/mes/md/workstation/worker/index.ts
index 3bd4ab9..ce60cb5 100644
--- a/src/api/mes/md/workstation/worker/index.ts
+++ b/src/api/mes/md/workstation/worker/index.ts
@@ -1,4 +1,5 @@
 import { requestClient } from '#/api/request';
+import type { SystemUserApi } from '#/api/system/user';
 
 export namespace MesMdWorkstationWorkerApi {
   /** MES 宸ヤ綔绔欎汉鍔涜祫婧� */
@@ -21,6 +22,17 @@
   );
 }
 
+/** 鑾峰緱宸ヤ綔绔欏搴斿矖浣嶇殑鍛樺伐鍒楄〃 */
+export function getUserListByWorkstationId(params: { workstationId: number }) {
+  if (!params || !params.workstationId) {
+    return Promise.resolve([]);
+  }
+  return requestClient.get<SystemUserApi.UserSimple[]>(
+    '/mes/md-workstation-worker/list-user-by-workstation',
+    { params },
+  );
+}
+
 /** 鏂板宸ヤ綔绔欎汉鍔涜祫婧� */
 export function createWorkstationWorker(
   data: MesMdWorkstationWorkerApi.WorkstationWorker,
diff --git a/src/views/mes/pd/archive/modules/detail.vue b/src/views/mes/pd/archive/modules/detail.vue
index e13a306..d11f471 100644
--- a/src/views/mes/pd/archive/modules/detail.vue
+++ b/src/views/mes/pd/archive/modules/detail.vue
@@ -54,23 +54,33 @@
 
 watch(() => props.visible, async (newVal) => {
   if (newVal && props.productCode) {
-    open.value = true;
-    loading.value = true;
-    detailList.value = [];
-    activeProject.value = '0';
-    try {
-      detailList.value = await getPdArchiveDetailByProduct(props.productCode);
-    } catch {
-      message.error('鑾峰彇褰掓。璇︽儏澶辫触');
-    } finally {
-      loading.value = false;
-    }
+    loadData(props.productCode);
   } else if (!newVal) {
     open.value = false;
     detailList.value = [];
   }
 });
 
+async function loadData(code: string) {
+  open.value = true;
+  loading.value = true;
+  detailList.value = [];
+  activeProject.value = '0';
+  try {
+    detailList.value = await getPdArchiveDetailByProduct(code);
+  } catch {
+    message.error('鑾峰彇褰掓。璇︽儏澶辫触');
+  } finally {
+    loading.value = false;
+  }
+}
+
+function openModal(code: string) {
+  loadData(code);
+}
+
+defineExpose({ open: openModal });
+
 function handleClose() {
   emit('update:visible', false);
 }
diff --git a/src/views/mes/pro/task/data.ts b/src/views/mes/pro/task/data.ts
index 12cfcb1..0098d65 100644
--- a/src/views/mes/pro/task/data.ts
+++ b/src/views/mes/pro/task/data.ts
@@ -1,7 +1,7 @@
 import type { VbenFormApi, VbenFormSchema } from '#/adapter/form';
 import type { VxeTableGridOptions } from '#/adapter/vxe-table';
 import { z } from '#/adapter/form';
-import { getSimpleUserListByRoleCode } from '#/api/system/user';
+import { getUserListByWorkstationId } from '#/api/mes/md/workstation/worker';
 import type { MesProTaskApi } from '#/api/mes/pro/task';
 import type { MesProWorkOrderApi } from '#/api/mes/pro/workorder';
 
@@ -393,7 +393,7 @@
 }
 
 /** 鐢熶骇浠诲姟鏂板/淇敼鐨勮〃鍗� */
-export function useTaskFormSchema(formApi?: VbenFormApi, workOrderQuantity?: Ref<number | undefined>, feedbackRole?: Ref<string | undefined>): VbenFormSchema[] {
+export function useTaskFormSchema(formApi?: VbenFormApi, workOrderQuantity?: Ref<number | undefined>): VbenFormSchema[] {
   return [
     {
       fieldName: 'workstationId',
@@ -475,11 +475,18 @@
       component: 'ApiSelect',
       componentProps: {
         placeholder: '璇烽�夋嫨鎶ュ伐浜�',
-        api: getSimpleUserListByRoleCode,
-        params: { code: feedbackRole?.value || 'production_submit_work' },
+        api: getUserListByWorkstationId,
         labelField: 'nickname',
         valueField: 'id',
         mode: 'multiple',
+      },
+      dependencies: {
+        triggerFields: ['workstationId'],
+        componentProps: (values) => ({
+          params: { workstationId: values.workstationId },
+          disabled: !values.workstationId,
+          placeholder: values.workstationId ? '璇烽�夋嫨鎶ュ伐浜�' : '璇峰厛閫夋嫨宸ヤ綔绔�',
+        }),
       },
       rules: z.array(z.number()).min(1, '璇烽�夋嫨鎶ュ伐浜�').default([]),
     },
@@ -500,6 +507,18 @@
 async function recalcDuration(formApi?: VbenFormApi) {
   if (!formApi) return;
   const values = await formApi.getValues();
+  
+  if (values.workstationId) {
+    try {
+      const users = await getUserListByWorkstationId({ workstationId: values.workstationId });
+      if (!users || users.length === 0) {
+        message.warning('褰撳墠宸ヤ綔绔欐病鏈夐厤缃汉鍔涜祫婧�');
+      }
+    } catch {
+      // ignore
+    }
+  }
+
   if (!values.workstationId || !values.quantity) return;
   try {
     const res = await calculateTaskDuration(values.workstationId, values.quantity);
diff --git a/src/views/mes/pro/task/modules/task-form.vue b/src/views/mes/pro/task/modules/task-form.vue
index 5b64e26..d1c5802 100644
--- a/src/views/mes/pro/task/modules/task-form.vue
+++ b/src/views/mes/pro/task/modules/task-form.vue
@@ -1,4 +1,4 @@
-锘�<script lang="ts" setup>
+<script lang="ts" setup>
 import type { MesProTaskApi } from '#/api/mes/pro/task';
 
 import { computed, ref } from 'vue';
@@ -9,7 +9,6 @@
 
 import { useVbenForm } from '#/adapter/form';
 import { createTask, getTask, updateTask } from '#/api/mes/pro/task';
-import { getWorkOrder } from '#/api/mes/pro/workorder';
 import { $t } from '#/locales';
 
 import { useTaskFormSchema } from '../data';
@@ -24,7 +23,6 @@
   routeId?: number;
   workOrderId?: number;
 }>({}); // 鏂板浠诲姟鏃剁殑璁㈠崟 / 宸ュ簭涓婁笅鏂�
-const feedbackRole = ref<string>();
 
 const getTitle = computed(() => {
   return formData.value?.id
@@ -113,16 +111,7 @@
       });
     }
 
-    if (wid) {
-      try {
-        const wo = await getWorkOrder(wid);
-        feedbackRole.value = wo.feedbackRole;
-      } catch {
-        // ignore
-      }
-    }
-
-    formApi.setState({ schema: useTaskFormSchema(formApi, workOrderQuantity, feedbackRole) });
+    formApi.setState({ schema: useTaskFormSchema(formApi, workOrderQuantity) });
   },
 });
 </script>
diff --git a/src/views/mes/pro/workorder/data.ts b/src/views/mes/pro/workorder/data.ts
index 85e98cf..cf8cdd4 100644
--- a/src/views/mes/pro/workorder/data.ts
+++ b/src/views/mes/pro/workorder/data.ts
@@ -237,20 +237,20 @@
       },
       rules: 'required',
     },
-    {
-      fieldName: 'feedbackRole',
-      label: '鎶ュ伐瑙掕壊',
-      component: 'ApiSelect',
-      componentProps: {
-        api: getSimpleRoleList,
-        disabled: headerReadonly,
-        labelField: 'name',
-        valueField: 'code',
-        mode: 'multiple',
-        placeholder: '璇烽�夋嫨鎶ュ伐瑙掕壊',
-      },
-      rules: 'selectRequired',
-    },
+    // {
+    //   fieldName: 'feedbackRole',
+    //   label: '鎶ュ伐瑙掕壊',
+    //   component: 'ApiSelect',
+    //   componentProps: {
+    //     api: getSimpleRoleList,
+    //     disabled: headerReadonly,
+    //     labelField: 'name',
+    //     valueField: 'code',
+    //     mode: 'multiple',
+    //     placeholder: '璇烽�夋嫨鎶ュ伐瑙掕壊',
+    //   },
+    //   rules: 'selectRequired',
+    // },
     {
       fieldName: 'feedbackApprove',
       label: '鏄惁鎶ュ伐瀹℃壒',

--
Gitblit v1.9.3