From 35280c7f8c9aad04507edcb65c058c5724f7c078 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期六, 29 八月 2026 01:46:19 +0800
Subject: [PATCH] feat(mes): 报工表单只填写报工数量并展示可报工数量,工作台报工支持工艺参数填写

---
 src/views/mes/workbench/components/tabs/FeedbackTab.vue       |  124 ++++++++++++++--
 src/api/mes/pro/task/index.ts                                 |    1 
 src/views/mes/pro/feedback/data.ts                            |  153 ---------------------
 src/views/mes/pro/feedback/modules/batch-feedback.vue         |   24 ---
 src/views/mes/pro/workorder-center/modules/quick-feedback.vue |   60 +++++---
 src/api/mes/pro/feedback/index.ts                             |    6 
 src/views/mes/pro/feedback/modules/form.vue                   |   22 +--
 src/views/mes/workbench/components/tabs/TaskDetailTab.vue     |    2 
 8 files changed, 157 insertions(+), 235 deletions(-)

diff --git a/src/api/mes/pro/feedback/index.ts b/src/api/mes/pro/feedback/index.ts
index 1ce18a2..0580b85 100644
--- a/src/api/mes/pro/feedback/index.ts
+++ b/src/api/mes/pro/feedback/index.ts
@@ -178,8 +178,6 @@
   taskId: number;
   paramValues?: MesProFeedbackApi.ParamValue[];
   feedbackQuantity: number;
-  qualifiedQuantity?: number;
-  unqualifiedQuantity?: number;
   remark?: string;
 }
 
@@ -188,14 +186,14 @@
   feedbackId?: number;
   taskStatus?: number;
   workOrderStatus?: number;
+  /** 鎶ュ伐鍚庡墿浣欏彲鎶ュ伐鏁伴噺 */
+  reportableQuantity?: number;
 }
 
 /** 鎵归噺鎶ュ伐璇锋眰 */
 export interface BatchCreateReq {
   taskIds: number[];
   feedbackQuantity: number;
-  qualifiedQuantity?: number;
-  unqualifiedQuantity?: number;
   remark?: string;
 }
 
diff --git a/src/api/mes/pro/task/index.ts b/src/api/mes/pro/task/index.ts
index c45f7b6..13fb333 100644
--- a/src/api/mes/pro/task/index.ts
+++ b/src/api/mes/pro/task/index.ts
@@ -58,6 +58,7 @@
     pauseRecords?: PauseRecord[]; // 鍋滃伐璁板綍
     reportableQuantity?: number; // 鍙姤宸ユ暟閲�
     assigneeUserIds?: number[]; // 鎶ュ伐浜�
+    feedbackApprove?: boolean; // 鏄惁鎶ュ伐瀹℃壒锛堟淳鐢熻嚜宸ュ崟锛�
   }
 
   /** MES 鐢熶骇浠诲姟鍒嗛〉鏌ヨ鍙傛暟 */
diff --git a/src/views/mes/pro/feedback/data.ts b/src/views/mes/pro/feedback/data.ts
index 573f29c..32056e7 100644
--- a/src/views/mes/pro/feedback/data.ts
+++ b/src/views/mes/pro/feedback/data.ts
@@ -174,9 +174,8 @@
  * - create / update锛氬綍鍏ユ姤宸ヤ富浣撲俊鎭拰鏁伴噺
  * - submit / approve / detail锛氫富浣撳瓧娈靛彧璇�
  *
- * 鏁伴噺鍖哄煙鏍规嵁 `checkFlag` 鍜� `unqualifiedQuantity` 鍔ㄦ�佹樉绀猴細
- * - 闈炶川妫�宸ュ簭锛氭姤宸ユ暟閲� = 鍚堟牸 + 涓嶈壇锛涗笉鑹� > 0 鏃跺啀灞曞紑宸ュ簾/鏂欏簾/鍏朵粬搴熷搧
- * - 璐ㄦ宸ュ簭锛氬彧濉姤宸ユ暟閲忥紙瑙嗕负寰呮鏁伴噺锛�
+ * 鎶ュ伐鍙~鍐�"鎶ュ伐鏁伴噺"锛涘悎鏍煎搧/涓嶈壇鍝佹暟閲忕敱璐ㄦ纭畾锛屾姤宸ョ幆鑺備笉閲囬泦銆�
+ * 璐ㄦ宸ュ簭鎶ュ伐鍚庤繘鍏ュ緟妫�楠岋紙uncheckQuantity = 鎶ュ伐鏁伴噺锛夛紝闈炶川妫�宸ュ簭鐩存帴瀹岀粨銆�
  */
 export function useFormSchema(
   formType: FormType,
@@ -404,151 +403,9 @@
         class: 'w-full',
         min: 0,
         precision: 2,
-      },
-      dependencies: {
-        triggerFields: ['checkFlag'],
-        // 闈炶川妫�宸ュ簭鏃讹紝鎶ュ伐鏁伴噺 = 鍚堟牸 + 涓嶈壇锛岀鐢ㄧ洿鎺ョ紪杈�
-        componentProps: (values) => ({
-          class: 'w-full',
-          disabled: !values.checkFlag,
-          min: 0,
-          placeholder: '璇疯緭鍏ユ姤宸ユ暟閲�',
-          precision: 2,
-        }),
+        placeholder: '璇疯緭鍏ユ姤宸ユ暟閲�',
       },
       rules: 'required',
-    },
-    {
-      fieldName: 'qualifiedQuantity',
-      label: '鍚堟牸鍝佹暟閲�',
-      component: 'InputNumber',
-      componentProps: {
-        class: 'w-full',
-        min: 0,
-        precision: 2,
-        // 鍚堟牸/涓嶈壇鍙樻洿锛岃嚜鍔ㄧ疮璁′负鎶ュ伐鏁伴噺
-        onChange: async () => {
-          const values = await formApi?.getValues();
-          await formApi?.setFieldValue(
-            'feedbackQuantity',
-            (values?.qualifiedQuantity || 0) +
-              (values?.unqualifiedQuantity || 0),
-          );
-        },
-      },
-      defaultValue: 0,
-      dependencies: {
-        triggerFields: ['checkFlag'],
-        show: (values) => !values.checkFlag,
-      },
-    },
-    {
-      fieldName: 'unqualifiedQuantity',
-      label: '涓嶈壇鍝佹暟閲�',
-      component: 'InputNumber',
-      componentProps: {
-        class: 'w-full',
-        min: 0,
-        precision: 2,
-        // 鍚堟牸/涓嶈壇鍙樻洿锛岃嚜鍔ㄧ疮璁′负鎶ュ伐鏁伴噺
-        onChange: async () => {
-          const values = await formApi?.getValues();
-          await formApi?.setFieldValue(
-            'feedbackQuantity',
-            (values?.qualifiedQuantity || 0) +
-              (values?.unqualifiedQuantity || 0),
-          );
-        },
-      },
-      defaultValue: 0,
-      dependencies: {
-        triggerFields: ['checkFlag'],
-        show: (values) => !values.checkFlag,
-      },
-    },
-    {
-      fieldName: 'laborScrapQuantity',
-      label: '宸ュ簾鏁伴噺',
-      component: 'InputNumber',
-      componentProps: {
-        class: 'w-full',
-        min: 0,
-        precision: 2,
-        // 搴熷搧鍒嗙被鍙樻洿锛岃嚜鍔ㄧ疮璁′负涓嶈壇鍝佹暟閲忓強鎶ュ伐鏁伴噺
-        onChange: async () => {
-          const values = await formApi?.getValues();
-          const unqualified =
-            (values?.laborScrapQuantity || 0) +
-            (values?.materialScrapQuantity || 0) +
-            (values?.otherScrapQuantity || 0);
-          await formApi?.setValues({
-            feedbackQuantity: (values?.qualifiedQuantity || 0) + unqualified,
-            unqualifiedQuantity: unqualified,
-          });
-        },
-      },
-      defaultValue: 0,
-      dependencies: {
-        triggerFields: ['checkFlag', 'unqualifiedQuantity'],
-        show: (values) =>
-          !values.checkFlag && (values.unqualifiedQuantity || 0) > 0,
-      },
-    },
-    {
-      fieldName: 'materialScrapQuantity',
-      label: '鏂欏簾鏁伴噺',
-      component: 'InputNumber',
-      componentProps: {
-        class: 'w-full',
-        min: 0,
-        precision: 2,
-        // 搴熷搧鍒嗙被鍙樻洿锛岃嚜鍔ㄧ疮璁′负涓嶈壇鍝佹暟閲忓強鎶ュ伐鏁伴噺
-        onChange: async () => {
-          const values = await formApi?.getValues();
-          const unqualified =
-            (values?.laborScrapQuantity || 0) +
-            (values?.materialScrapQuantity || 0) +
-            (values?.otherScrapQuantity || 0);
-          await formApi?.setValues({
-            feedbackQuantity: (values?.qualifiedQuantity || 0) + unqualified,
-            unqualifiedQuantity: unqualified,
-          });
-        },
-      },
-      defaultValue: 0,
-      dependencies: {
-        triggerFields: ['checkFlag', 'unqualifiedQuantity'],
-        show: (values) =>
-          !values.checkFlag && (values.unqualifiedQuantity || 0) > 0,
-      },
-    },
-    {
-      fieldName: 'otherScrapQuantity',
-      label: '鍏朵粬搴熷搧',
-      component: 'InputNumber',
-      componentProps: {
-        class: 'w-full',
-        min: 0,
-        precision: 2,
-        // 搴熷搧鍒嗙被鍙樻洿锛岃嚜鍔ㄧ疮璁′负涓嶈壇鍝佹暟閲忓強鎶ュ伐鏁伴噺
-        onChange: async () => {
-          const values = await formApi?.getValues();
-          const unqualified =
-            (values?.laborScrapQuantity || 0) +
-            (values?.materialScrapQuantity || 0) +
-            (values?.otherScrapQuantity || 0);
-          await formApi?.setValues({
-            feedbackQuantity: (values?.qualifiedQuantity || 0) + unqualified,
-            unqualifiedQuantity: unqualified,
-          });
-        },
-      },
-      defaultValue: 0,
-      dependencies: {
-        triggerFields: ['checkFlag', 'unqualifiedQuantity'],
-        show: (values) =>
-          !values.checkFlag && (values.unqualifiedQuantity || 0) > 0,
-      },
     },
     {
       fieldName: 'feedbackUserId',
@@ -616,8 +473,8 @@
       render: (val) =>
         h(DictTag, { type: DICT_TYPE.MES_PRO_FEEDBACK_TYPE, value: val }),
     },
-    { field: 'workOrderId', label: '鐢熶骇璁㈠崟', render: (_val, data) => data.workOrderCode },
-    { field: 'taskId', label: '鐢熶骇浠诲姟', render: (_val, data) => data.taskCode },
+    { field: 'workOrderId', label: '鐢熶骇璁㈠崟', render: (_val, data) => data?.workOrderCode },
+    { field: 'taskId', label: '鐢熶骇浠诲姟', render: (_val, data) => data?.taskCode },
     { field: 'workstationName', label: '宸ヤ綔绔�' },
     { field: 'itemCode', label: '浜у搧缂栫爜' },
     { field: 'itemName', label: '浜у搧鍚嶇О' },
diff --git a/src/views/mes/pro/feedback/modules/batch-feedback.vue b/src/views/mes/pro/feedback/modules/batch-feedback.vue
index e8e08b2..7458c64 100644
--- a/src/views/mes/pro/feedback/modules/batch-feedback.vue
+++ b/src/views/mes/pro/feedback/modules/batch-feedback.vue
@@ -24,8 +24,6 @@
       selectedTasks.value = [];
       formData.value = {
         feedbackQuantity: undefined,
-        qualifiedQuantity: undefined,
-        unqualifiedQuantity: undefined,
         remark: '',
       };
     }
@@ -36,8 +34,6 @@
 const selectedTasks = ref<MesProTaskApi.Task[]>([]);
 const formData = ref({
   feedbackQuantity: undefined as number | undefined,
-  qualifiedQuantity: undefined as number | undefined,
-  unqualifiedQuantity: undefined as number | undefined,
   remark: '',
 });
 const submitting = ref(false);
@@ -68,8 +64,6 @@
     const result = await batchCreateFeedback({
       taskIds: selectedTasks.value.map((t) => t.id!),
       feedbackQuantity: formData.value.feedbackQuantity,
-      qualifiedQuantity: formData.value.qualifiedQuantity,
-      unqualifiedQuantity: formData.value.unqualifiedQuantity,
       remark: formData.value.remark || undefined,
     });
     if (result.failCount) {
@@ -113,24 +107,6 @@
           :min="0.01"
           :precision="2"
           placeholder="璇疯緭鍏ユ姤宸ユ暟閲忥紙搴旂敤鍒版墍鏈夐�変腑浠诲姟锛�"
-          class="!w-full"
-        />
-      </a-form-item>
-      <a-form-item label="鍚堟牸鍝佹暟閲�">
-        <a-input-number
-          v-model:value="formData.qualifiedQuantity"
-          :min="0"
-          :precision="2"
-          placeholder="璇疯緭鍏ュ悎鏍煎搧鏁伴噺"
-          class="!w-full"
-        />
-      </a-form-item>
-      <a-form-item label="涓嶈壇鍝佹暟閲�">
-        <a-input-number
-          v-model:value="formData.unqualifiedQuantity"
-          :min="0"
-          :precision="2"
-          placeholder="璇疯緭鍏ヤ笉鑹搧鏁伴噺"
           class="!w-full"
         />
       </a-form-item>
diff --git a/src/views/mes/pro/feedback/modules/form.vue b/src/views/mes/pro/feedback/modules/form.vue
index a295a40..9e5a9a3 100644
--- a/src/views/mes/pro/feedback/modules/form.vue
+++ b/src/views/mes/pro/feedback/modules/form.vue
@@ -87,20 +87,14 @@
   wrapperClass: 'grid-cols-3',
 });
 
-/** 鎻愪氦鍓嶅榻愭暟閲忥細鏍规嵁 checkFlag 鍐冲畾 uncheck/鍚堟牸/涓嶈壇褰掗浂绛栫暐 */
+/** 鎻愪氦鍓嶅榻愭暟閲忥細鎶ュ伐鍙~鍐欐姤宸ユ暟閲忥紝鍚堟牸/涓嶈壇/搴熷搧鏁伴噺鐢辫川妫�纭畾锛屾姤宸ョ幆鑺備笉閲囬泦 */
 function alignQuantity(data: MesProFeedbackApi.Feedback) {
-  if (data.checkFlag) {
-    data.uncheckQuantity = data.feedbackQuantity;
-    data.qualifiedQuantity = 0;
-    data.unqualifiedQuantity = 0;
-    data.laborScrapQuantity = 0;
-    data.materialScrapQuantity = 0;
-    data.otherScrapQuantity = 0;
-  } else {
-    data.feedbackQuantity =
-      (data.qualifiedQuantity || 0) + (data.unqualifiedQuantity || 0);
-    data.uncheckQuantity = 0;
-  }
+  data.uncheckQuantity = data.checkFlag ? data.feedbackQuantity : 0;
+  delete data.qualifiedQuantity;
+  delete data.unqualifiedQuantity;
+  delete data.laborScrapQuantity;
+  delete data.materialScrapQuantity;
+  delete data.otherScrapQuantity;
 }
 
 /** 璇诲彇骞舵寜鎻愪氦瑙勫垯瀵归綈鍚庣殑琛ㄥ崟鏁版嵁锛岀敤浜庡揩鐓у拰淇濆瓨 */
@@ -149,7 +143,7 @@
 }
 
 const batchDialogRef = ref<InstanceType<typeof BatchInputDialog>>();
-const batchActionType = ref<'submit' | 'approve'>('');
+const batchActionType = ref<'' | 'submit' | 'approve'>('');
 
 function syncParamValues(data: MesProFeedbackApi.Feedback) {
   data.paramValues = paramDetails.value.map((detail) => ({
diff --git a/src/views/mes/pro/workorder-center/modules/quick-feedback.vue b/src/views/mes/pro/workorder-center/modules/quick-feedback.vue
index b249fdf..9df47ce 100644
--- a/src/views/mes/pro/workorder-center/modules/quick-feedback.vue
+++ b/src/views/mes/pro/workorder-center/modules/quick-feedback.vue
@@ -9,6 +9,10 @@
 import { message } from 'ant-design-vue';
 
 import { quickCreateFeedback } from '#/api/mes/pro/feedback';
+import {
+  loadParamDetails,
+  paramDetails,
+} from '#/views/mes/pro/feedback/param-state';
 import ProTaskSelect from '#/views/mes/pro/task/components/select.vue';
 
 defineOptions({ name: 'QuickFeedbackForm' });
@@ -35,10 +39,14 @@
       selectedTask.value = undefined;
       formData.value = {
         feedbackQuantity: undefined,
-        qualifiedQuantity: undefined,
-        unqualifiedQuantity: undefined,
         remark: '',
       };
+      // 棰勮浠诲姟鏃跺姞杞藉叾宸ヨ壓鍙傛暟锛涘惁鍒欑瓑寰呴�夋嫨浠诲姟鍚庡啀鍔犺浇
+      if (props.taskId) {
+        loadParamDetails(props.taskId);
+      } else {
+        paramDetails.value = [];
+      }
     }
   },
 });
@@ -48,8 +56,6 @@
 const selectedTask = ref<MesProTaskApi.Task>();
 const formData = ref({
   feedbackQuantity: undefined as number | undefined,
-  qualifiedQuantity: undefined as number | undefined,
-  unqualifiedQuantity: undefined as number | undefined,
   remark: '',
 });
 const submitting = ref(false);
@@ -70,6 +76,7 @@
 function handleTaskChange(task: MesProTaskApi.Task | undefined) {
   selectedTask.value = task;
   selectedTaskId.value = task?.id;
+  loadParamDetails(task?.id);
 }
 
 async function handleSubmit() {
@@ -87,8 +94,10 @@
     await quickCreateFeedback({
       taskId,
       feedbackQuantity: formData.value.feedbackQuantity,
-      qualifiedQuantity: formData.value.qualifiedQuantity,
-      unqualifiedQuantity: formData.value.unqualifiedQuantity,
+      paramValues: paramDetails.value.map((detail) => ({
+        detailId: detail.id,
+        value: detail.paramValue,
+      })),
       remark: formData.value.remark || undefined,
     });
     message.success('鎶ュ伐鎴愬姛');
@@ -128,24 +137,27 @@
           class="!w-full"
         />
       </a-form-item>
-      <a-form-item label="鍚堟牸鍝佹暟閲�">
-        <a-input-number
-          v-model:value="formData.qualifiedQuantity"
-          :min="0"
-          :precision="2"
-          placeholder="璇疯緭鍏ュ悎鏍煎搧鏁伴噺"
-          class="!w-full"
-        />
-      </a-form-item>
-      <a-form-item label="涓嶈壇鍝佹暟閲�">
-        <a-input-number
-          v-model:value="formData.unqualifiedQuantity"
-          :min="0"
-          :precision="2"
-          placeholder="璇疯緭鍏ヤ笉鑹搧鏁伴噺"
-          class="!w-full"
-        />
-      </a-form-item>
+      <div v-if="paramDetails.length" class="mb-4">
+        <div class="mb-1 font-medium">宸ヨ壓鍙傛暟</div>
+        <div
+          v-for="detail in paramDetails"
+          :key="detail.id"
+          class="mb-2 flex items-center gap-2"
+        >
+          <span class="w-40 flex-shrink-0 text-right text-sm text-gray-600">
+            <span v-if="detail.required" class="text-red-500">*&nbsp;</span>
+            {{ detail.paramName || detail.paramCode
+            }}{{
+              detail.unitMeasureName ? `锛�${detail.unitMeasureName}锛塦 : ''
+            }}
+          </span>
+          <a-input
+            v-model:value="detail.paramValue"
+            placeholder="璇疯緭鍏ュ弬鏁板��"
+            class="!w-full"
+          />
+        </div>
+      </div>
       <a-form-item label="澶囨敞">
         <a-textarea
           v-model:value="formData.remark"
diff --git a/src/views/mes/workbench/components/tabs/FeedbackTab.vue b/src/views/mes/workbench/components/tabs/FeedbackTab.vue
index f867d68..86b6e25 100644
--- a/src/views/mes/workbench/components/tabs/FeedbackTab.vue
+++ b/src/views/mes/workbench/components/tabs/FeedbackTab.vue
@@ -1,5 +1,5 @@
 <script lang="ts" setup>
-import type { PendingTask } from '../../../types';
+import type { PendingTask } from '../../types';
 import type { FormType } from '../../../pro/feedback/data';
 
 import { computed, ref, watch } from 'vue';
@@ -12,7 +12,7 @@
 } from '@vben/constants';
 import { useUserStore } from '@vben/stores';
 
-import { Button, message, Modal, Popconfirm } from 'ant-design-vue';
+import { Button, Input, message, Modal, Popconfirm } from 'ant-design-vue';
 
 import { useVbenForm } from '#/adapter/form';
 import { generateAutoCode } from '#/api/mes/md/autocode/record';
@@ -29,9 +29,13 @@
 import { $t } from '#/locales';
 
 import { useFormSchema } from '../../../pro/feedback/data';
+import {
+  loadParamDetails,
+  paramDetails,
+} from '../../../pro/feedback/param-state';
 import BatchInputDialog from '../../../pro/feedback/modules/batch-input-dialog.vue';
 const batchDialogRef = ref<InstanceType<typeof BatchInputDialog>>();
-const batchActionType = ref<'submit' | 'approve'>('');
+const batchActionType = ref<'' | 'submit' | 'approve'>('');
 const pendingSubmitMode = ref<'saveAndSubmit' | 'submit'>('submit');
 defineOptions({ name: 'WorkbenchFeedbackTab' });
 
@@ -73,26 +77,29 @@
   wrapperClass: 'grid-cols-3',
 });
 
-/** 鏍规嵁 checkFlag 瀵归綈鏁伴噺 */
+/** 鎻愪氦鍓嶅榻愭暟閲忥細鎶ュ伐鍙~鍐欐姤宸ユ暟閲忥紝鍚堟牸/涓嶈壇/搴熷搧鏁伴噺鐢辫川妫�纭畾锛屾姤宸ョ幆鑺備笉閲囬泦 */
 function alignQuantity(data: any) {
-  if (data.checkFlag) {
-    data.uncheckQuantity = data.feedbackQuantity;
-    data.qualifiedQuantity = 0;
-    data.unqualifiedQuantity = 0;
-    data.laborScrapQuantity = 0;
-    data.materialScrapQuantity = 0;
-    data.otherScrapQuantity = 0;
-  } else {
-    data.feedbackQuantity =
-      (data.qualifiedQuantity || 0) + (data.unqualifiedQuantity || 0);
-    data.uncheckQuantity = 0;
-  }
+  data.uncheckQuantity = data.checkFlag ? data.feedbackQuantity : 0;
+  delete data.qualifiedQuantity;
+  delete data.unqualifiedQuantity;
+  delete data.laborScrapQuantity;
+  delete data.materialScrapQuantity;
+  delete data.otherScrapQuantity;
 }
 
 async function getAlignedData() {
   const data = (await formApi.getValues()) as any;
+  syncParamValues(data);
   alignQuantity(data);
   return data;
+}
+
+/** 鍚屾宸ヨ壓鍙傛暟鍊煎埌鎶ュ伐鏁版嵁锛堜笌鎻愪氦鏁版嵁涓�鍚屽彂閫佺粰鍚庣锛� */
+function syncParamValues(data: any) {
+  data.paramValues = paramDetails.value.map((detail) => ({
+    detailId: detail.id,
+    value: detail.paramValue,
+  }));
 }
 
 /** 鍔犺浇 checkFlag */
@@ -117,6 +124,8 @@
 
   const code = await generateAutoCode(MesAutoCodeRuleCode.PRO_FEEDBACK_CODE);
   const checkFlag = await resolveCheckFlag(task.routeId, task.processId);
+  // 鍔犺浇浠诲姟缁戝畾鐨勫伐鑹哄弬鏁帮紙蹇呭~鍙傛暟鏍¢獙 + 鍙傛暟鍊煎洖鏄撅級
+  await loadParamDetails(task.id);
 
   await formApi.setValues({
     code,
@@ -133,6 +142,7 @@
     itemName: task.itemName,
     itemSpecification: task.itemSpecification,
     unitMeasureName: task.unitMeasureName,
+    reportableQuantity: task.reportableQuantity,
     scheduledQuantity: task.quantity,
     feedbackApprove: task.feedbackApprove,
     checkFlag,
@@ -210,7 +220,7 @@
   pendingSubmitMode.value = 'saveAndSubmit';
 
   // 4. 璋冪敤鎻愪氦鎺ュ彛
-  const isDone = await handleOnSubmit(feedbackId.value!,props.task.feedbackApprove);
+  const isDone = await handleOnSubmit(feedbackId.value!,props.task?.feedbackApprove);
   if (!isDone) return;
 
   feedbackId.value = record.id;
@@ -242,7 +252,7 @@
   }
 
   pendingSubmitMode.value = 'submit';
-  const isDone = await handleOnSubmit(feedbackId.value!,props.task.feedbackApprove);
+  const isDone = await handleOnSubmit(feedbackId.value!,props.task?.feedbackApprove);
   if (!isDone) return;
 
   message.success('鎶ュ伐鍗曞凡鎻愪氦');
@@ -328,13 +338,15 @@
   formType.value = 'update';
   formApi.setState({ schema: useFormSchema(formType.value, formApi) });
   const checkFlag = await resolveCheckFlag(data.routeId, data.processId);
+  await loadParamDetails(data.taskId);
   await formApi.setValues({ ...data, checkFlag });
   originalSnapshot.value = JSON.stringify(await getAlignedData());
 }
 
-// 鐩戝惉浠诲姟鍙樻洿锛堜粎褰撲换鍔� ID 鐪熸鍙樺寲鏃舵墠閲嶇疆琛ㄥ崟锛�
+// 鐩戝惉浠诲姟鍙樻洿锛氫换鍔″璞″彉鍖栵紙閫夋嫨浠诲姟 / 鍒楄〃鍒锋柊鍚庡悓姝ョ殑鏈�鏂版暟鎹級鏃堕噸缃〃鍗曪紝
+// 纭繚"鍙姤宸ユ暟閲�"绛変换鍔℃淳鐢熷瓧娈靛缁堝睍绀烘渶鏂板��
 watch(
-  () => props.task?.id,
+  () => props.task,
   () => {
     if (props.task) {
       resetForTask(props.task);
@@ -364,6 +376,34 @@
       </div>
 
       <Form class="feedback-tab__form" />
+
+      <!-- 宸ヨ壓鍙傛暟锛堜换鍔$粦瀹氬弬鏁版椂灞曠ず锛屽繀濉弬鏁版湭濉細琚悗绔嫤鎴級 -->
+      <div v-if="paramDetails.length" class="feedback-tab__params">
+        <div class="feedback-tab__params-title">宸ヨ壓鍙傛暟</div>
+        <div class="feedback-tab__params-grid">
+          <div
+            v-for="detail in paramDetails"
+            :key="detail.id"
+            class="feedback-tab__params-item"
+          >
+            <span class="feedback-tab__params-label">
+              <span v-if="detail.required" class="feedback-tab__params-required"
+                >*&nbsp;</span
+              >
+              {{ detail.paramName || detail.paramCode
+              }}{{
+                detail.unitMeasureName ? `锛�${detail.unitMeasureName}锛塦 : ''
+              }}
+            </span>
+            <Input
+              v-model:value="detail.paramValue"
+              :disabled="!isEditable"
+              placeholder="璇疯緭鍏ュ弬鏁板��"
+              class="feedback-tab__params-input"
+            />
+          </div>
+        </div>
+      </div>
 
       <div class="feedback-tab__actions">
         <Button
@@ -456,4 +496,48 @@
   border-top: 1px solid #f0f0f0;
   margin-top: 16px;
 }
+
+.feedback-tab__params {
+  margin-top: 16px;
+  padding: 14px 16px;
+  border: 1px solid #f0f0f0;
+  border-radius: 8px;
+  background: #fafbfc;
+}
+
+.feedback-tab__params-title {
+  margin-bottom: 12px;
+  font-size: 15px;
+  font-weight: 600;
+  color: #1a1a1a;
+}
+
+.feedback-tab__params-grid {
+  display: grid;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  gap: 12px 20px;
+}
+
+.feedback-tab__params-item {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+}
+
+.feedback-tab__params-label {
+  flex-shrink: 0;
+  width: 176px;
+  text-align: right;
+  font-size: 14px;
+  color: #595959;
+}
+
+.feedback-tab__params-required {
+  color: #ff4d4f;
+}
+
+.feedback-tab__params-input {
+  flex: 1;
+  min-width: 0;
+}
 </style>
diff --git a/src/views/mes/workbench/components/tabs/TaskDetailTab.vue b/src/views/mes/workbench/components/tabs/TaskDetailTab.vue
index 9b0dcc7..fb2069d 100644
--- a/src/views/mes/workbench/components/tabs/TaskDetailTab.vue
+++ b/src/views/mes/workbench/components/tabs/TaskDetailTab.vue
@@ -1,5 +1,5 @@
 <script lang="ts" setup>
-import type { PendingTask } from '../../../types';
+import type { PendingTask } from '../../types';
 
 import { Descriptions, Progress, Tag, Timeline, TimelineItem } from 'ant-design-vue';
 

--
Gitblit v1.9.3