From f49f2bf23bb7404772b39f99ad58429b2f489401 Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期二, 03 十一月 2026 09:29:33 +0800
Subject: [PATCH] Revert "feat(mes): 生产计划页新增「从销售订单生成」入口"

---
 /dev/null                       |  205 -----------------------------------------
 src/api/erp/sale/order/index.ts |   32 ------
 src/views/mes/pro/mps/index.vue |   19 ---
 3 files changed, 0 insertions(+), 256 deletions(-)

diff --git a/src/api/erp/sale/order/index.ts b/src/api/erp/sale/order/index.ts
index 31c5076..069fc90 100644
--- a/src/api/erp/sale/order/index.ts
+++ b/src/api/erp/sale/order/index.ts
@@ -156,35 +156,3 @@
 export function importSaleOrder(file: File) {
   return requestClient.upload<ImportResult>('/erp/sale-order/import', { file });
 }
-
-/** 寰呭畨鎺掔敓浜х殑閿�鍞鍗曟槑缁嗭紙鍚彲鐢ㄥ簱瀛樹笌寤鸿鐢熶骇鏁伴噺锛� */
-export interface PendingProductionItem {
-  saleOrderId?: number;
-  saleOrderNo?: string;
-  saleOrderItemId?: number;
-  customerId?: number;
-  customerName?: string;
-  productId?: number;
-  productCode?: string;
-  productName?: string;
-  productSpecification?: string;
-  productUnitName?: string;
-  orderCount?: number;
-  orderTime?: string;
-  stockQuantity?: number;
-  suggestQuantity?: number;
-}
-
-/** 鏌ヨ寰呭畨鎺掔敓浜х殑閿�鍞鍗曟槑缁� */
-export function getPendingProductionList() {
-  return requestClient.get<PendingProductionItem[]>(
-    '/erp/sale-order/pending-production-list',
-  );
-}
-
-/** 浠庨攢鍞鍗曟壒閲忕敓鎴愮敓浜ц鍒� */
-export function generateMpsFromSaleOrder(
-  items: Array<{ quantity: number; saleOrderItemId: number }>,
-) {
-  return requestClient.post<number>('/erp/sale-order/generate-mps', { items });
-}
diff --git a/src/views/mes/pro/mps/index.vue b/src/views/mes/pro/mps/index.vue
index a417236..f481b13 100644
--- a/src/views/mes/pro/mps/index.vue
+++ b/src/views/mes/pro/mps/index.vue
@@ -23,7 +23,6 @@
 
 import { MpsStatusEnum, useGridColumns, useGridFormSchema } from './data';
 import Form from './modules/form.vue';
-import FromSaleOrder from './modules/from-sale-order.vue';
 
 /** MPS 鐢熶骇涓昏鍒掑垪琛� */
 defineOptions({ name: 'MesProMps' });
@@ -34,16 +33,6 @@
   connectedComponent: Form,
   destroyOnClose: true,
 });
-
-/** 浠庨攢鍞鍗曠敓鎴愮敓浜ц鍒掞紙鐢熶骇杞﹂棿瑙嗚锛氱粨鍚堝簱瀛樺垽鏂槸鍚﹂渶瑕佺敓浜э級 */
-const [FromSaleOrderModal, fromSaleOrderModalApi] = useVbenModal({
-  connectedComponent: FromSaleOrder,
-  destroyOnClose: true,
-});
-
-function handleCreateFromSaleOrder() {
-  fromSaleOrderModalApi.open();
-}
 
 const checkedIds = ref<number[]>([]);
 const checkedRows = ref<MesProMpsApi.Mps[]>([]);
@@ -214,7 +203,6 @@
 <template>
   <Page auto-content-height>
     <FormModal @success="handleRefresh" />
-    <FromSaleOrderModal @success="handleRefresh" />
     <Grid table-title="鐢熶骇涓昏鍒�(MPS)鍒楄〃">
       <template #toolbar-tools>
         <TableAction
@@ -225,13 +213,6 @@
               icon: ACTION_ICON.ADD,
               auth: ['mes:pro-mps:create'],
               onClick: handleCreate,
-            },
-            {
-              label: '浠庨攢鍞鍗曠敓鎴�',
-              type: 'primary',
-              icon: ACTION_ICON.ADD,
-              auth: ['mes:pro-mps:create'],
-              onClick: handleCreateFromSaleOrder,
             },
             {
               label: $t('ui.actionTitle.export'),
diff --git a/src/views/mes/pro/mps/modules/from-sale-order.vue b/src/views/mes/pro/mps/modules/from-sale-order.vue
deleted file mode 100644
index 5452622..0000000
--- a/src/views/mes/pro/mps/modules/from-sale-order.vue
+++ /dev/null
@@ -1,205 +0,0 @@
-<script lang="ts" setup>
-import type { TableColumnsType } from 'ant-design-vue';
-
-import type { PendingProductionItem } from '#/api/erp/sale/order';
-
-import { computed, ref } from 'vue';
-
-import { useVbenModal } from '@vben/common-ui';
-
-import { Alert, InputNumber, message, Spin, Table, Tag } from 'ant-design-vue';
-
-import {
-  generateMpsFromSaleOrder,
-  getPendingProductionList,
-} from '#/api/erp/sale/order';
-
-const emit = defineEmits(['success']);
-
-interface RowItem extends PendingProductionItem {
-  /** 璁″垝鐢熶骇鏁伴噺锛堝彲缂栬緫锛� */
-  planQuantity?: number;
-  /** 鏄惁鍕鹃�� */
-  selected?: boolean;
-}
-
-const loading = ref(false);
-const submitting = ref(false);
-const list = ref<RowItem[]>([]);
-
-const columns: TableColumnsType = [
-  { title: '閿�鍞鍗曞彿', dataIndex: 'saleOrderNo', width: 150, fixed: 'left' },
-  { title: '瀹㈡埛', dataIndex: 'customerName', width: 130, ellipsis: true },
-  { title: '浜у搧缂栫爜', dataIndex: 'productCode', width: 120 },
-  { title: '浜у搧鍚嶇О', dataIndex: 'productName', width: 140, ellipsis: true },
-  { title: '瑙勬牸', dataIndex: 'productSpecification', width: 100 },
-  { title: '璁㈣喘鏁伴噺', dataIndex: 'orderCount', width: 100, align: 'right' },
-  { title: '璁㈠崟鏃ユ湡', dataIndex: 'orderTime', width: 160 },
-  {
-    title: '鍙敤搴撳瓨',
-    dataIndex: 'stockQuantity',
-    width: 100,
-    align: 'right',
-  },
-  {
-    title: '寤鸿鐢熶骇',
-    dataIndex: 'suggestQuantity',
-    width: 110,
-    align: 'right',
-  },
-  { title: '璁″垝鏁伴噺', dataIndex: 'planQuantity', width: 130, key: 'plan' },
-];
-
-/** 宸插嬀閫夌殑琛� */
-const selectedRows = computed(() => list.value.filter((r) => r.selected));
-
-/** 鍚堣璁″垝鏁伴噺 */
-const totalPlanQuantity = computed(() =>
-  selectedRows.value.reduce((sum, r) => sum + (r.planQuantity ?? 0), 0),
-);
-
-/** 搴撳瓨鍏呰冻锛堟棤闇�鐢熶骇锛夌殑琛屾暟 */
-const enoughStockCount = computed(
-  () => list.value.filter((r) => (r.suggestQuantity ?? 0) <= 0).length,
-);
-
-function handleSelectAll(checked: boolean) {
-  list.value.forEach((row) => {
-    // 搴撳瓨澶熺殑榛樿涓嶅嬀閫夛紝浣嗗厑璁告墜宸ュ嬀閫夛紙瀹㈡埛鍙兘瑕佹眰澶囪揣锛�
-    row.selected = checked;
-  });
-}
-
-async function loadList() {
-  loading.value = true;
-  try {
-    const data = await getPendingProductionList();
-    list.value = (data ?? []).map((item) => {
-      const suggest = item.suggestQuantity ?? 0;
-      return {
-        ...item,
-        // 榛樿鍕鹃�夐渶瑕佺敓浜х殑锛堝缓璁敓浜� > 0锛�
-        selected: suggest > 0,
-        planQuantity: suggest > 0 ? suggest : undefined,
-      };
-    });
-  } finally {
-    loading.value = false;
-  }
-}
-
-const [Modal, modalApi] = useVbenModal({
-  async onConfirm() {
-    const items = selectedRows.value
-      .filter((r) => (r.planQuantity ?? 0) > 0)
-      .map((r) => ({
-        saleOrderItemId: r.saleOrderItemId!,
-        quantity: r.planQuantity!,
-      }));
-    if (items.length === 0) {
-      message.warning('璇疯嚦灏戝嬀閫変竴鏉″苟濉啓澶т簬 0 鐨勮鍒掓暟閲�');
-      return;
-    }
-    submitting.value = true;
-    try {
-      const count = await generateMpsFromSaleOrder(items);
-      emit('success');
-      message.success(`宸茬敓鎴� ${count} 鏉$敓浜ц鍒抈);
-      await modalApi.close();
-    } finally {
-      submitting.value = false;
-    }
-  },
-  async onOpenChange(isOpen: boolean) {
-    if (!isOpen) {
-      list.value = [];
-      return;
-    }
-    await loadList();
-  },
-});
-</script>
-
-<template>
-  <Modal title="浠庨攢鍞鍗曠敓鎴愮敓浜ц鍒�" class="w-4/5">
-    <Spin :spinning="loading || submitting">
-      <div class="mx-4 flex flex-col gap-3">
-        <Alert
-          type="info"
-          show-icon
-          message="鎸夈�屽彲鐢ㄥ簱瀛樸�嶅垽鏂槸鍚﹂渶瑕佺敓浜э細搴撳瓨鍏呰冻鐨勫彲涓嶅畨鎺掞紝寤鸿鐢熶骇鏁伴噺 = 璁㈣喘鏁伴噺 鈭� 鍙敤搴撳瓨銆傚嬀閫夊悗鍙洿鎺ヤ慨鏀硅鍒掓暟閲忋��"
-        />
-
-        <div class="flex items-center gap-4 text-gray-600">
-          <span>鍏� <b>{{ list.length }}</b> 鏉″緟瀹夋帓鏄庣粏</span>
-          <span v-if="enoughStockCount > 0" class="text-green-600">
-            鍏朵腑 {{ enoughStockCount }} 鏉″簱瀛樺厖瓒�
-          </span>
-          <span>
-            宸查�� <b>{{ selectedRows.length }}</b> 鏉★紝鍚堣璁″垝鏁伴噺
-            <b>{{ totalPlanQuantity }}</b>
-          </span>
-        </div>
-
-        <Table
-          :data-source="list"
-          :columns="columns"
-          :pagination="false"
-          :row-selection="{
-            selectedRowKeys: selectedRows.map((r) => r.saleOrderItemId),
-            onSelect: (record: RowItem, checked: boolean) => {
-              record.selected = checked;
-              if (checked && !record.planQuantity) {
-                record.planQuantity =
-                  (record.suggestQuantity ?? 0) > 0
-                    ? record.suggestQuantity
-                    : undefined;
-              }
-            },
-            onSelectAll: (checked: boolean) => handleSelectAll(checked),
-          }"
-          :scroll="{ y: 420, x: 1400 }"
-          row-key="saleOrderItemId"
-          size="small"
-        >
-          <template #bodyCell="{ column, record }">
-            <template v-if="column.dataIndex === 'stockQuantity'">
-              <span
-                :class="
-                  (record.stockQuantity ?? 0) > 0
-                    ? 'font-semibold text-green-600'
-                    : 'text-red-500'
-                "
-              >
-                {{ record.stockQuantity ?? 0 }}
-              </span>
-            </template>
-            <template v-else-if="column.dataIndex === 'suggestQuantity'">
-              <Tag
-                v-if="(record.suggestQuantity ?? 0) > 0"
-                color="warning"
-              >
-                {{ record.suggestQuantity }}
-              </Tag>
-              <Tag v-else color="success">搴撳瓨澶�</Tag>
-            </template>
-            <template v-else-if="column.key === 'plan'">
-              <InputNumber
-                v-model:value="record.planQuantity"
-                :min="0"
-                :precision="3"
-                class="w-full"
-                placeholder="濉啓璁″垝鏁伴噺"
-                @change="
-                  (val: any) => {
-                    record.selected = (val ?? 0) > 0;
-                  }
-                "
-              />
-            </template>
-          </template>
-        </Table>
-      </div>
-    </Spin>
-  </Modal>
-</template>

--
Gitblit v1.9.3