From 3c4d241b9ef0d14a0cea5cd69b7919dfba1d14c5 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期五, 24 七月 2026 16:17:15 +0800
Subject: [PATCH] 银川 1.销售订单生产状态不匹配, 2.采购订单中没有退货状态字段,筛选项有退货状态 3.采购申请添加查看订单、查看审批功能 4.物料管理与mes产品管理的联动逻辑修改

---
 src/views/erp/purchase/order/index.vue               |   12 ++
 src/views/mes/pro/task/data.ts                       |    7 +
 src/components/file-preview/file-preview-modal.vue   |    3 
 src/views/mes/qc/iqc/index.vue                       |   14 +++
 src/api/mes/pro/task/index.ts                        |    1 
 src/views/wls/arrivalnotice/modules/line-list.vue    |    2 
 src/views/erp/sale/order/data.ts                     |   15 ---
 src/views/mes/pro/task/modules/task-list.vue         |    2 
 src/views/mes/workbench/components/TaskListPanel.vue |    9 ++
 src/views/mes/pro/workorder-center/index.vue         |    4 
 src/views/erp/purchase/order/data.ts                 |   14 ---
 src/views/erp/purchase/request/index.vue             |   25 ++++++
 src/views/erp/sale/order/index.vue                   |   11 ++
 src/views/mes/pro/task/index.vue                     |    7 -
 src/views/mes/pro/workorder/modules/form.vue         |    4 
 src/views/mes/pro/task/modules/schedule-form.vue     |    1 
 src/views/basicData/mdm/data.ts                      |   50 ++++++------
 src/views/basicData/mdm/index.vue                    |    4 +
 src/api/erp/purchase/request/index.ts                |    1 
 src/views/mes/pro/task/modules/task-form.vue         |    7 +
 src/api/mdm/item/index.ts                            |    1 
 21 files changed, 121 insertions(+), 73 deletions(-)

diff --git a/src/api/erp/purchase/request/index.ts b/src/api/erp/purchase/request/index.ts
index f2c50e7..c446da4 100644
--- a/src/api/erp/purchase/request/index.ts
+++ b/src/api/erp/purchase/request/index.ts
@@ -25,6 +25,7 @@
     productNames?: string; // 浜у搧鍚嶇О鍒楄〃
     orderId?: number; // 鐢熸垚鐨勯噰璐鍗曠紪鍙�
     orderNo?: string; // 鐢熸垚鐨勯噰璐鍗曞彿
+    processInstanceId?: number; // 瀹℃壒娴佺▼瀹炰緥缂栧彿
     items?: PurchaseRequestItem[]; // 鐢宠鏄庣粏
     createTime?: string; // 鍒涘缓鏃堕棿
   }
diff --git a/src/api/mdm/item/index.ts b/src/api/mdm/item/index.ts
index 564287f..2f40e36 100644
--- a/src/api/mdm/item/index.ts
+++ b/src/api/mdm/item/index.ts
@@ -39,6 +39,7 @@
     createTime?: string;
     // 鍚屾鐩稿叧瀛楁
     syncMes?: boolean;
+    syncedMes?: boolean; // 鏄惁宸插悓姝ュ埌 MES
     // 鎵规灞炴�ч厤缃瓧娈�
     produceDateFlag?: boolean;
     expireDateFlag?: boolean;
diff --git a/src/api/mes/pro/task/index.ts b/src/api/mes/pro/task/index.ts
index f710da5..2e36c40 100644
--- a/src/api/mes/pro/task/index.ts
+++ b/src/api/mes/pro/task/index.ts
@@ -39,6 +39,7 @@
     colorCode?: string; // 鐢樼壒鍥炬樉绀洪鑹�
     status?: number; // 浠诲姟鐘舵��
     checkFlag?: boolean; // 鏄惁璐ㄦ锛堟淳鐢熻嚜宸ヨ壓璺嚎宸ュ簭锛�
+    backflushFlag?: boolean; // 鏄惁鍊掑啿锛堟淳鐢熻嚜宸ヨ壓璺嚎宸ュ簭锛�
     remark?: string; // 澶囨敞
   }
 
diff --git a/src/components/file-preview/file-preview-modal.vue b/src/components/file-preview/file-preview-modal.vue
index 118d4d9..8ede19c 100644
--- a/src/components/file-preview/file-preview-modal.vue
+++ b/src/components/file-preview/file-preview-modal.vue
@@ -14,8 +14,7 @@
 const VueOfficeExcel = defineAsyncComponent(() => import('@vue-office/excel'));
 const VueOfficePptx = defineAsyncComponent(() => import('@vue-office/pptx'));
 
-// @vue-office/excel 闇�瑕侀澶栧鍏� CSS
-import '@vue-office/excel/lib/v3/style.css';
+// @vue-office/excel CSS 閫氳繃 vite.config.ts 鐨� css.preprocessorOptions 娉ㄥ叆
 
 const props = withDefaults(
   defineProps<{
diff --git a/src/views/basicData/mdm/data.ts b/src/views/basicData/mdm/data.ts
index 29076e7..953b9f2 100644
--- a/src/views/basicData/mdm/data.ts
+++ b/src/views/basicData/mdm/data.ts
@@ -282,17 +282,6 @@
       rules: z.boolean().default(false),
     },
     {
-      component: "Switch",
-      fieldName: "syncMes",
-      label: "鍚屾鍒� MES",
-      componentProps: {
-        class: "w-auto",
-        checkedChildren: "鏄�",
-        unCheckedChildren: "鍚�",
-      },
-      rules: z.boolean().default(false),
-    },
-    {
       component: "InputNumber",
       fieldName: "expiryDay",
       label: "鏈夋晥鏈�(澶�)",
@@ -552,27 +541,36 @@
       },
     },
     {
-      field: "isBatchManaged",
-      title: "鎵规绠$悊",
-      minWidth: 80,
-      slots: { default: "isBatchManaged" },
-    },
-    {
-      field: "status",
-      title: "鐘舵��",
-      minWidth: 80,
-      cellRender: {
-        name: "CellDict",
-        props: { type: DICT_TYPE.COMMON_STATUS },
-      },
-    },
-    {
       field: "createTime",
       title: "鍒涘缓鏃堕棿",
       minWidth: 180,
       formatter: "formatDateTime",
     },
     {
+      field: "isBatchManaged",
+      title: "鎵规绠$悊",
+      width: 80,
+      fixed: "right",
+      slots: { default: "isBatchManaged" },
+    },
+    {
+      field: "syncedMes",
+      title: "鍚屾鐘舵��",
+      width: 90,
+      fixed: "right",
+      slots: { default: "syncedMes" },
+    },
+    {
+      field: "status",
+      title: "鐘舵��",
+      width: 80,
+      fixed: "right",
+      cellRender: {
+        name: "CellDict",
+        props: { type: DICT_TYPE.COMMON_STATUS },
+      },
+    },
+    {
       title: "鎿嶄綔",
       width: 180,
       fixed: "right",
diff --git a/src/views/basicData/mdm/index.vue b/src/views/basicData/mdm/index.vue
index 4cc1c42..e59b39f 100644
--- a/src/views/basicData/mdm/index.vue
+++ b/src/views/basicData/mdm/index.vue
@@ -231,6 +231,10 @@
         <Tag v-if="row.isBatchManaged" color="success">鏄�</Tag>
         <Tag v-else>鍚�</Tag>
       </template>
+      <template #syncedMes="{ row }">
+        <Tag v-if="row.syncedMes" color="success">宸插悓姝�</Tag>
+        <Tag v-else color="default">鏈悓姝�</Tag>
+      </template>
       <template #actions="{ row }">
         <TableAction
           :actions="[
diff --git a/src/views/erp/purchase/order/data.ts b/src/views/erp/purchase/order/data.ts
index 9ff3b0d..0aa5868 100644
--- a/src/views/erp/purchase/order/data.ts
+++ b/src/views/erp/purchase/order/data.ts
@@ -330,20 +330,6 @@
         allowClear: true,
       },
     },
-    {
-      fieldName: 'returnStatus',
-      label: '閫�璐х姸鎬�',
-      component: 'Select',
-      componentProps: {
-        options: [
-          { label: '鏈��璐�', value: 0 },
-          { label: '閮ㄥ垎閫�璐�', value: 1 },
-          { label: '鍏ㄩ儴閫�璐�', value: 2 },
-        ],
-        placeholder: '璇烽�夋嫨閫�璐х姸鎬�',
-        allowClear: true,
-      },
-    },
   ];
 }
 
diff --git a/src/views/erp/purchase/order/index.vue b/src/views/erp/purchase/order/index.vue
index cc275a3..c56c84d 100644
--- a/src/views/erp/purchase/order/index.vue
+++ b/src/views/erp/purchase/order/index.vue
@@ -2,7 +2,8 @@
 import type { VxeTableGridOptions } from '#/adapter/vxe-table';
 import type { ErpPurchaseOrderApi } from '#/api/erp/purchase/order';
 
-import { ref } from 'vue';
+import { onMounted, ref } from 'vue';
+import { useRoute } from 'vue-router';
 
 import { Page, useVbenModal } from '@vben/common-ui';
 import { downloadFileFromBlobPart, isEmpty } from '@vben/utils';
@@ -24,6 +25,8 @@
 
 /** ERP 閲囪喘璁㈠崟鍒楄〃 */
 defineOptions({ name: 'ErpPurchaseOrder' });
+
+const route = useRoute();
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
@@ -146,6 +149,13 @@
     checkboxChange: handleRowCheckboxChange,
   },
 });
+
+onMounted(() => {
+  const id = route.query.id;
+  if (id) {
+    formModalApi.setData({ formType: 'detail', id: Number(id) }).open();
+  }
+});
 </script>
 
 <template>
diff --git a/src/views/erp/purchase/request/index.vue b/src/views/erp/purchase/request/index.vue
index fb964be..27336e9 100644
--- a/src/views/erp/purchase/request/index.vue
+++ b/src/views/erp/purchase/request/index.vue
@@ -3,6 +3,7 @@
 import type { ErpPurchaseRequestApi } from '#/api/erp/purchase/request';
 
 import { ref } from 'vue';
+import { useRouter } from 'vue-router';
 
 import { confirm, Page, useVbenModal } from '@vben/common-ui';
 import { downloadFileFromBlobPart, isEmpty } from '@vben/utils';
@@ -26,6 +27,8 @@
 
 /** ERP 閲囪喘鐢宠鍒楄〃 */
 defineOptions({ name: 'ErpPurchaseRequest' });
+
+const router = useRouter();
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
@@ -115,6 +118,16 @@
 /** 鏌ョ湅璇︽儏 */
 function handleDetail(row: ErpPurchaseRequestApi.PurchaseRequest) {
   formModalApi.setData({ formType: 'detail', id: row.id }).open();
+}
+
+/** 鏌ョ湅瀹℃壒璇︽儏 */
+function handleViewProcess(row: ErpPurchaseRequestApi.PurchaseRequest) {
+  router.push({ name: 'BpmProcessInstanceDetail', query: { id: row.processInstanceId } });
+}
+
+/** 鏌ョ湅閲囪喘璁㈠崟 */
+function handleViewOrder(row: ErpPurchaseRequestApi.PurchaseRequest) {
+  router.push({ name: 'ErpPurchaseOrder', query: { id: row.orderId } });
 }
 
 const [Grid, gridApi] = useVbenVxeGrid({
@@ -234,6 +247,18 @@
               onClick: handleGenerateOrder.bind(null, row),
             },
             {
+              label: '鏌ョ湅瀹℃壒',
+              type: 'link',
+              ifShow: () => row.status !== 0,
+              onClick: handleViewProcess.bind(null, row),
+            },
+            {
+              label: '鏌ョ湅璁㈠崟',
+              type: 'link',
+              ifShow: () => !!row.orderId,
+              onClick: handleViewOrder.bind(null, row),
+            },
+            {
               label: $t('common.delete'),
               type: 'link',
               danger: true,
diff --git a/src/views/erp/sale/order/data.ts b/src/views/erp/sale/order/data.ts
index 75bb9de..254f22a 100644
--- a/src/views/erp/sale/order/data.ts
+++ b/src/views/erp/sale/order/data.ts
@@ -399,24 +399,11 @@
       component: 'Select',
       componentProps: {
         options: [
+          { label: '鏃犻渶鐢熶骇', value: -1 },
           { label: '鏈畬鎴�', value: 0 },
           { label: '宸插畬鎴�', value: 1 },
         ],
         placeholder: '璇烽�夋嫨鐢熶骇鐘舵��',
-        allowClear: true,
-      },
-    },
-    {
-      fieldName: 'returnStatus',
-      label: '閫�璐х姸鎬�',
-      component: 'Select',
-      componentProps: {
-        options: [
-          { label: '鏈��璐�', value: 0 },
-          { label: '閮ㄥ垎閫�璐�', value: 1 },
-          { label: '鍏ㄩ儴閫�璐�', value: 2 },
-        ],
-        placeholder: '璇烽�夋嫨閫�璐х姸鎬�',
         allowClear: true,
       },
     },
diff --git a/src/views/erp/sale/order/index.vue b/src/views/erp/sale/order/index.vue
index 2df5b89..0b3c24f 100644
--- a/src/views/erp/sale/order/index.vue
+++ b/src/views/erp/sale/order/index.vue
@@ -174,10 +174,19 @@
     proxyConfig: {
       ajax: {
         query: async ({ page }, formValues) => {
+          // 鐢熶骇鐘舵�佹悳绱㈠弬鏁拌浆鎹細-1(鏃犻渶鐢熶骇) 鈫� needProduction=0
+          const { productionStatus, ...rest } = formValues;
+          const params: Record<string, any> = { ...rest };
+          if (productionStatus === -1) {
+            params.needProduction = 0;
+          } else if (productionStatus != null) {
+            params.productionStatus = productionStatus;
+            params.needProduction = 1;
+          }
           return await getSaleOrderPage({
             pageNo: page.currentPage,
             pageSize: page.pageSize,
-            ...formValues,
+            ...params,
           });
         },
       },
diff --git a/src/views/mes/pro/task/data.ts b/src/views/mes/pro/task/data.ts
index 605cd9c..30470f0 100644
--- a/src/views/mes/pro/task/data.ts
+++ b/src/views/mes/pro/task/data.ts
@@ -3,6 +3,8 @@
 import type { MesProTaskApi } from '#/api/mes/pro/task';
 import type { MesProWorkOrderApi } from '#/api/mes/pro/workorder';
 
+import type { Ref } from 'vue';
+
 import { markRaw } from 'vue';
 
 import { DICT_TYPE } from '@vben/constants';
@@ -166,7 +168,7 @@
     },
     {
       title: '鎿嶄綔',
-      width: 100,
+      width: 160,
       fixed: 'right',
       slots: { default: 'actions' },
     },
@@ -376,7 +378,7 @@
 }
 
 /** 鐢熶骇浠诲姟鏂板/淇敼鐨勮〃鍗� */
-export function useTaskFormSchema(formApi?: VbenFormApi): VbenFormSchema[] {
+export function useTaskFormSchema(formApi?: VbenFormApi, workOrderQuantity?: Ref<number | undefined>): VbenFormSchema[] {
   return [
     {
       fieldName: 'workstationId',
@@ -391,6 +393,7 @@
       fieldName: 'quantity',
       label: '鎺掍骇鏁伴噺',
       component: 'InputNumber',
+      description: () => workOrderQuantity?.value != null ? `璁㈠崟鏁伴噺锛�${workOrderQuantity.value}` : '',
       componentProps: {
         class: '!w-full',
         min: 0.01,
diff --git a/src/views/mes/pro/task/index.vue b/src/views/mes/pro/task/index.vue
index cb0bb3a..f062c80 100644
--- a/src/views/mes/pro/task/index.vue
+++ b/src/views/mes/pro/task/index.vue
@@ -166,13 +166,6 @@
               ifShow: row.status === MesProWorkOrderStatusEnum.CONFIRMED,
               onClick: handleSchedule.bind(null, row),
             },
-            {
-              label: '涓�閿帓浜�',
-              type: 'link',
-              auth: ['mes:pro-task:create'],
-              ifShow: row.status === MesProWorkOrderStatusEnum.CONFIRMED,
-              onClick: handleAutoSchedulePreview.bind(null, row),
-            },
           ]"
         />
       </template>
diff --git a/src/views/mes/pro/task/modules/schedule-form.vue b/src/views/mes/pro/task/modules/schedule-form.vue
index e51d7b7..8f67bd3 100644
--- a/src/views/mes/pro/task/modules/schedule-form.vue
+++ b/src/views/mes/pro/task/modules/schedule-form.vue
@@ -144,6 +144,7 @@
           :process-id="rp.processId!"
           :route-id="currentRouteId"
           :work-order-id="workOrder.id!"
+          :work-order-quantity="workOrder.quantity"
         />
       </Card>
     </template>
diff --git a/src/views/mes/pro/task/modules/task-form.vue b/src/views/mes/pro/task/modules/task-form.vue
index d2cab18..fd83dcd 100644
--- a/src/views/mes/pro/task/modules/task-form.vue
+++ b/src/views/mes/pro/task/modules/task-form.vue
@@ -15,6 +15,7 @@
 
 const emit = defineEmits(['success']);
 const formData = ref<MesProTaskApi.Task>();
+const workOrderQuantity = ref<number>(); // 璁㈠崟鏁伴噺锛堢敤浜庢彁绀猴級
 const context = ref<{
   colorCode?: string;
   itemId?: number;
@@ -67,16 +68,18 @@
   async onOpenChange(isOpen: boolean) {
     if (!isOpen) {
       formData.value = undefined;
+      workOrderQuantity.value = undefined;
       context.value = {};
       return;
     }
-    formApi.setState({ schema: useTaskFormSchema(formApi) });
+    formApi.setState({ schema: useTaskFormSchema(formApi, workOrderQuantity) });
     // 鍔犺浇鏁版嵁
     const data = modalApi.getData<{
       colorCode?: string;
       id?: number;
       itemId?: number;
       processId?: number;
+      quantity?: number;
       routeId?: number;
       workOrderId?: number;
     }>();
@@ -98,9 +101,11 @@
       routeId: data.routeId,
       workOrderId: data.workOrderId,
     };
+    workOrderQuantity.value = data.quantity;
     await formApi.setValues({
       colorCode: data.colorCode || '#00AEF3',
       duration: 1,
+      quantity: data.quantity,
     });
   },
 });
diff --git a/src/views/mes/pro/task/modules/task-list.vue b/src/views/mes/pro/task/modules/task-list.vue
index 0cd3b46..d126366 100644
--- a/src/views/mes/pro/task/modules/task-list.vue
+++ b/src/views/mes/pro/task/modules/task-list.vue
@@ -22,6 +22,7 @@
   processId: number;
   routeId: number;
   workOrderId: number;
+  workOrderQuantity?: number;
 }>();
 
 const editable = computed(() => !props.disabled); // 鏄惁鍙淮鎶や换鍔�
@@ -43,6 +44,7 @@
       colorCode: props.colorCode,
       itemId: props.itemId,
       processId: props.processId,
+      quantity: props.workOrderQuantity,
       routeId: props.routeId,
       workOrderId: props.workOrderId,
     })
diff --git a/src/views/mes/pro/workorder-center/index.vue b/src/views/mes/pro/workorder-center/index.vue
index b90ebb8..74b05b7 100644
--- a/src/views/mes/pro/workorder-center/index.vue
+++ b/src/views/mes/pro/workorder-center/index.vue
@@ -35,7 +35,7 @@
   destroyOnClose: true,
 });
 
-const [SchedulePreviewModal, schedulePreviewModalApi] = useVbenModal({
+const [SchedulePreviewModalWrap, schedulePreviewModalApi] = useVbenModal({
   connectedComponent: SchedulePreviewModal,
   destroyOnClose: true,
 });
@@ -164,7 +164,7 @@
 <template>
   <Page auto-content-height>
     <QuickFeedbackModal @success="handleFeedbackSuccess" />
-    <SchedulePreviewModal @success="handleRefresh" />
+    <SchedulePreviewModalWrap @success="handleRefresh" />
 
     <Grid table-title="宸ュ崟涓績">
       <template #toolbar-tools>
diff --git a/src/views/mes/pro/workorder/modules/form.vue b/src/views/mes/pro/workorder/modules/form.vue
index 891a31e..5bedf66 100644
--- a/src/views/mes/pro/workorder/modules/form.vue
+++ b/src/views/mes/pro/workorder/modules/form.vue
@@ -110,7 +110,9 @@
         ? '纭'
         : isFinish.value
           ? '瀹屾垚'
-          : undefined,
+          : isCreateMode.value
+            ? '鏂板'
+            : undefined,
     });
   }
 
diff --git a/src/views/mes/qc/iqc/index.vue b/src/views/mes/qc/iqc/index.vue
index 9f766ca..44e0901 100644
--- a/src/views/mes/qc/iqc/index.vue
+++ b/src/views/mes/qc/iqc/index.vue
@@ -2,6 +2,9 @@
 import type { VxeTableGridOptions } from '#/adapter/vxe-table';
 import type { MesQcIqcApi } from '#/api/mes/qc/iqc';
 
+import { onMounted } from 'vue';
+import { useRoute } from 'vue-router';
+
 import { Page, useVbenModal } from '@vben/common-ui';
 import { MesQcStatusEnum } from '@vben/constants';
 import { downloadFileFromBlobPart } from '@vben/utils';
@@ -14,6 +17,10 @@
 
 import { useGridColumns, useGridFormSchema } from './data';
 import Form from './modules/form.vue';
+
+defineOptions({ name: 'MesQcIqc' });
+
+const route = useRoute();
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
@@ -90,6 +97,13 @@
     },
   } as VxeTableGridOptions<MesQcIqcApi.Iqc>,
 });
+
+onMounted(() => {
+  const id = route.query.id;
+  if (id) {
+    formModalApi.setData({ formType: 'detail', id: Number(id) }).open();
+  }
+});
 </script>
 
 <template>
diff --git a/src/views/mes/workbench/components/TaskListPanel.vue b/src/views/mes/workbench/components/TaskListPanel.vue
index 908292a..6530d39 100644
--- a/src/views/mes/workbench/components/TaskListPanel.vue
+++ b/src/views/mes/workbench/components/TaskListPanel.vue
@@ -19,13 +19,13 @@
 
 const searchKeyword = ref('');
 
-/** 鍏堟寜宸ヤ綔绔欏伐搴忚繃婊わ紝鍐嶆寜鎼滅储鍏抽敭瀛楀尮閰� */
 const filteredList = computed(() => {
   const kw = searchKeyword.value.trim().toLowerCase();
   if (!kw) return props.list;
   return props.list.filter((row) => {
     const fields = [
       row.code,
+      row.name,
       row.workOrderCode,
       row.workOrderName,
       row.itemCode,
@@ -86,6 +86,13 @@
             >
               璐ㄦ
             </Tag>
+            <Tag
+              v-if="item.backflushFlag"
+              color="purple"
+              class="task-card__check-tag"
+            >
+              鍊掑啿
+            </Tag>
             <span
               class="task-card__rate"
               :style="{ color: getProgressColor(item.feedbackRate) }"
diff --git a/src/views/wls/arrivalnotice/modules/line-list.vue b/src/views/wls/arrivalnotice/modules/line-list.vue
index 78617a6..be40c57 100644
--- a/src/views/wls/arrivalnotice/modules/line-list.vue
+++ b/src/views/wls/arrivalnotice/modules/line-list.vue
@@ -72,7 +72,7 @@
 /** 璺宠浆 IQC 妫�楠屽崟璇︽儏 */
 function handleOpenIqc(row: MesWmArrivalNoticeLineApi.ArrivalNoticeLine) {
   if (row.iqcId) {
-    router.push({ path: '/mes/qc/iqc', query: { id: row.iqcId } });
+    router.push({ name: 'MesQcIqc', query: { id: row.iqcId } });
   }
 }
 

--
Gitblit v1.9.3