From cca940a6460bc4ec4266df4e413b05921d1f2e1d Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 16 四月 2026 09:55:16 +0800
Subject: [PATCH] 中兴实强 1.新增生产订单时候查询工序接口传参修改

---
 src/views/productionManagement/productionOrder/index.vue |  954 +++++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 594 insertions(+), 360 deletions(-)

diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
index 3af5008..686d397 100644
--- a/src/views/productionManagement/productionOrder/index.vue
+++ b/src/views/productionManagement/productionOrder/index.vue
@@ -1,58 +1,70 @@
 <template>
   <div class="app-container">
     <div class="search_form">
-      <el-form :model="searchForm"
-               :inline="true">
-        <el-form-item label="瀹㈡埛鍚嶇О:">
-          <el-input v-model="searchForm.customerName"
-                    placeholder="璇疯緭鍏�"
-                    clearable
-                    prefix-icon="Search"
-                    style="width: 160px;"
-                    @change="handleQuery" />
+      <el-form :model="searchForm" :inline="true">
+        <el-form-item label="瀹㈡埛鍚嶇О">
+          <el-input
+            v-model="searchForm.customerName"
+            placeholder="璇疯緭鍏�"
+            clearable
+            :prefix-icon="Search"
+            style="width: 160px;"
+            @change="handleQuery"
+          />
         </el-form-item>
-        <el-form-item label="鍚堝悓鍙�:">
-          <el-input v-model="searchForm.salesContractNo"
-                    placeholder="璇疯緭鍏�"
-                    clearable
-                    prefix-icon="Search"
-                    style="width: 160px;"
-                    @change="handleQuery" />
+        <el-form-item label="閿�鍞悎鍚屽彿">
+          <el-input
+            v-model="searchForm.salesContractNo"
+            placeholder="璇疯緭鍏�"
+            clearable
+            :prefix-icon="Search"
+            style="width: 160px;"
+            @change="handleQuery"
+          />
         </el-form-item>
-        <el-form-item label="浜у搧鍚嶇О:">
-          <el-input v-model="searchForm.productCategory"
-                    placeholder="璇疯緭鍏�"
-                    clearable
-                    prefix-icon="Search"
-                    style="width: 160px;"
-                    @change="handleQuery" />
+        <el-form-item label="浜у搧鍚嶇О">
+          <el-input
+            v-model="searchForm.productCategory"
+            placeholder="璇疯緭鍏�"
+            clearable
+            :prefix-icon="Search"
+            style="width: 160px;"
+            @change="handleQuery"
+          />
         </el-form-item>
-        <el-form-item label="瑙勬牸:">
-          <el-input v-model="searchForm.specificationModel"
-                    placeholder="璇疯緭鍏�"
-                    clearable
-                    prefix-icon="Search"
-                    style="width: 160px;"
-                    @change="handleQuery" />
+        <el-form-item label="瑙勬牸鍨嬪彿">
+          <el-input
+            v-model="searchForm.specificationModel"
+            placeholder="璇疯緭鍏�"
+            clearable
+            :prefix-icon="Search"
+            style="width: 160px;"
+            @change="handleQuery"
+          />
         </el-form-item>
         <el-form-item>
-          <el-button type="primary"
-                     @click="handleQuery">鎼滅储</el-button>
+          <el-button type="primary" @click="handleQuery">鏌ヨ</el-button>
         </el-form-item>
       </el-form>
       <div>
         <el-button type="primary" @click="isShowNewModal = true">鏂板</el-button>
+        <el-button type="danger" @click="handleDelete">鍒犻櫎</el-button>
         <el-button @click="handleOut">瀵煎嚭</el-button>
       </div>
     </div>
+
     <div class="table_list">
-      <PIMTable rowKey="id"
-                :column="tableColumn"
-                :tableData="tableData"
-                :page="page"
-                :tableLoading="tableLoading"
-                :row-class-name="tableRowClassName"
-                @pagination="pagination">
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :tableLoading="tableLoading"
+        :row-class-name="tableRowClassName"
+        :isSelection="true"
+        @selection-change="handleSelectionChange"
+        @pagination="pagination"
+      >
         <template #completionStatus="{ row }">
           <el-progress
             :percentage="toProgressPercentage(row?.completionStatus)"
@@ -62,378 +74,600 @@
         </template>
       </PIMTable>
     </div>
-    <el-dialog v-model="bindRouteDialogVisible"
-               title="缁戝畾宸ヨ壓璺嚎"
-               width="500px">
+
+    <el-dialog
+      v-model="bindRouteDialogVisible"
+      title="缁戝畾宸ヨ壓璺嚎"
+      width="700px"
+    >
       <el-form label-width="90px">
         <el-form-item label="宸ヨ壓璺嚎">
-          <el-select v-model="bindForm.routeId"
-                     placeholder="璇烽�夋嫨宸ヨ壓璺嚎"
-                     style="width: 100%;"
-                     :loading="bindRouteLoading">
-            <el-option v-for="item in routeOptions"
-                       :key="item.id"
-                       :label="`${item.processRouteCode || ''}`"
-                       :value="item.id" />
+          <el-select
+            v-model="bindForm.routeId"
+            placeholder="璇烽�夋嫨宸ヨ壓璺嚎"
+            style="width: 100%;"
+            :loading="bindRouteLoading"
+            @change="handleBindRouteChange"
+          >
+            <el-option
+              v-for="item in routeOptions"
+              :key="item.id"
+              :label="item.processRouteCode || ''"
+              :value="item.id"
+            />
           </el-select>
+        </el-form-item>
+        <el-form-item v-if="bindProcessList.length" label="鎶ュ伐浜哄憳">
+          <div class="process-user-list">
+            <div
+              v-for="(item, index) in bindProcessList"
+              :key="item.id || `${item.processId}-${index}`"
+              class="process-user-item"
+            >
+              <div class="process-user-header">
+                <div class="process-user-name">
+                  {{ item.name || item.processName || item.no || `宸ュ簭${index + 1}` }}
+                </div>
+                <el-button
+                  type="danger"
+                  link
+                  class="process-user-remove"
+                  @click="removeBindProcessItem(index)"
+                >
+                  鍒犻櫎
+                </el-button>
+              </div>
+              <el-select
+                v-model="bindForm.processUserList[index].userIds"
+                class="process-user-select"
+                placeholder="璇烽�夋嫨鎶ュ伐浜哄憳"
+                filterable
+                clearable
+                multiple
+                collapse-tags
+                collapse-tags-tooltip
+                :max-collapse-tags="3"
+                @change="handleBindProcessUserChange(index, $event)"
+              >
+                <el-option
+                  v-for="user in userOptions"
+                  :key="user.userId"
+                  :label="user.nickName"
+                  :value="user.userId"
+                />
+              </el-select>
+            </div>
+          </div>
         </el-form-item>
       </el-form>
       <template #footer>
         <span class="dialog-footer">
-          <el-button @click="bindRouteDialogVisible = false">鍙� 娑�</el-button>
-          <el-button type="primary"
-                     :loading="bindRouteSaving"
-                     @click="handleBindRouteConfirm">纭� 璁�</el-button>
+          <el-button
+            type="primary"
+            :loading="bindRouteSaving"
+            @click="handleBindRouteConfirm"
+          >
+            纭
+          </el-button>
+          <el-button @click="bindRouteDialogVisible = false">鍙栨秷</el-button>
         </span>
       </template>
     </el-dialog>
 
-    <new-product-order v-if="isShowNewModal"
-                         v-model:visible="isShowNewModal"
-                         @completed="handleQuery" />
+    <new-product-order
+      v-if="isShowNewModal"
+      v-model:visible="isShowNewModal"
+      @completed="handleQuery"
+    />
   </div>
 </template>
 
 <script setup>
-  import { onMounted, ref } from "vue";
-  import { ElMessageBox } from "element-plus";
-  import dayjs from "dayjs";
-  import { useRouter } from "vue-router";
-  import {
-    productOrderListPage,
-    listProcessRoute,
-    bindingRoute,
-    listProcessBom,
-  } from "@/api/productionManagement/productionOrder.js";
-  import { listMain as getOrderProcessRouteMain } from "@/api/productionManagement/productProcessRoute.js";
-  const NewProductOrder = defineAsyncComponent(() => import("@/views/productionManagement/productionOrder/New.vue"));
+import { defineAsyncComponent, getCurrentInstance, onMounted, reactive, ref, toRefs } from "vue";
+import { ElMessageBox } from "element-plus";
+import { Search } from "@element-plus/icons-vue";
+import dayjs from "dayjs";
+import { useRouter } from "vue-router";
+import {
+  bindingRoute,
+  delProductOrder,
+  listProcessRoute,
+  productOrderListPage,
+} from "@/api/productionManagement/productionOrder.js";
+import { listMain as getOrderProcessRouteMain } from "@/api/productionManagement/productProcessRoute.js";
+import { processList } from "@/api/productionManagement/productionProcess.js";
+import { userListNoPageByTenantId } from "@/api/system/user.js";
+import PIMTable from "@/components/PIMTable/PIMTable.vue";
+import {findProcessRouteItemList} from "@/api/productionManagement/processRouteItem.js";
 
-  const { proxy } = getCurrentInstance();
+const NewProductOrder = defineAsyncComponent(() => import("@/views/productionManagement/productionOrder/New.vue"));
 
-  const router = useRouter();
-  const isShowNewModal = ref(false);
+const { proxy } = getCurrentInstance();
+const router = useRouter();
+const isShowNewModal = ref(false);
 
-  const tableColumn = ref([
-    {
-      label: "鐢熶骇璁㈠崟鍙�",
-      prop: "npsNo",
-      width: '120px',
-    },
-    {
-      label: "閿�鍞悎鍚屽彿",
-      prop: "salesContractNo",
-      width: '150px',
-    },
-    {
-      label: "瀹㈡埛鍚嶇О",
-      prop: "customerName",
-      width: '200px',
-    },
-    {
-      label: "浜у搧鍚嶇О",
-      prop: "productCategory",
-      width: '120px',
-    },
-    {
-      label: "瑙勬牸",
-      prop: "specificationModel",
-      width: '120px',
-    },
-    {
-      label: "宸ヨ壓璺嚎缂栧彿",
-      prop: "processRouteCode",
-      width: '200px',
-    },
-    {
-      label: "闇�姹傛暟閲�",
-      prop: "quantity",
-    },
-    {
-      label: "瀹屾垚鏁伴噺",
-      prop: "completeQuantity",
-    },
-    {
-      dataType: "slot",
-      label: "瀹屾垚杩涘害",
-      prop: "completionStatus",
-      slot: "completionStatus",
-      width: 180,
-    },
-    {
-      label: "寮�濮嬫棩鏈�",
-      prop: "startTime",
-      formatData: val => (val ? dayjs(val).format("YYYY-MM-DD") : ""),
-      width: 120,
-    },
-    {
-      label: "缁撴潫鏃ユ湡",
-      prop: "endTime",
-      formatData: val => (val ? dayjs(val).format("YYYY-MM-DD") : ""),
-      width: 120,
-    },
-    {
-      label: "浜や粯鏃ユ湡",
-      prop: "deliveryDate",
-      formatData: val => (val ? dayjs(val).format("YYYY-MM-DD") : ""),
-      width: 120,
-    },
-    {
-      dataType: "action",
-      label: "鎿嶄綔",
-      align: "center",
-      fixed: "right",
-      width: 200,
-      operation: [
-        {
-          name: "宸ヨ壓璺嚎",
-          type: "text",
-          clickFun: row => {
-            showRouteItemModal(row);
-          },
+const tableColumn = ref([
+  {
+    label: "鐢熶骇璁㈠崟鍙�",
+    prop: "npsNo",
+    width: "120px",
+  },
+  {
+    label: "閿�鍞悎鍚屽彿",
+    prop: "salesContractNo",
+    width: "150px",
+  },
+  {
+    label: "瀹㈡埛鍚嶇О",
+    prop: "customerName",
+    width: "200px",
+  },
+  {
+    label: "浜у搧鍚嶇О",
+    prop: "productCategory",
+    width: "120px",
+  },
+  {
+    label: "瑙勬牸鍨嬪彿",
+    prop: "specificationModel",
+    width: "120px",
+  },
+  {
+    label: "宸ヨ壓璺嚎缂栧彿",
+    prop: "processRouteCode",
+    width: "200px",
+  },
+  {
+    label: "闇�姹傛暟閲�",
+    prop: "quantity",
+  },
+  {
+    label: "瀹屾垚鏁伴噺",
+    prop: "completeQuantity",
+  },
+  {
+    dataType: "slot",
+    label: "瀹屾垚杩涘害",
+    prop: "completionStatus",
+    slot: "completionStatus",
+    width: 180,
+  },
+  {
+    label: "寮�濮嬫棩鏈�",
+    prop: "startTime",
+    formatData: val => (val ? dayjs(val).format("YYYY-MM-DD") : ""),
+    width: 120,
+  },
+  {
+    label: "缁撴潫鏃ユ湡",
+    prop: "endTime",
+    formatData: val => (val ? dayjs(val).format("YYYY-MM-DD") : ""),
+    width: 120,
+  },
+  {
+    label: "浜や粯鏃ユ湡",
+    prop: "deliveryDate",
+    formatData: val => (val ? dayjs(val).format("YYYY-MM-DD") : ""),
+    width: 120,
+  },
+  {
+    dataType: "action",
+    label: "鎿嶄綔",
+    align: "center",
+    fixed: "right",
+    width: 200,
+    operation: [
+      {
+        name: "宸ヨ壓璺嚎",
+        type: "text",
+        clickFun: row => {
+          showRouteItemModal(row);
         },
-        {
-          name: "缁戝畾宸ヨ壓璺嚎",
-          type: "text",
-          showHide: row => !row.processRouteCode,
-          clickFun: row => {
-            openBindRouteDialog(row);
-          },
+      },
+      {
+        name: "缁戝畾宸ヨ壓璺嚎",
+        type: "text",
+        showHide: row => !row.processRouteCode,
+        clickFun: row => {
+          openBindRouteDialog(row);
         },
-        {
-          name: "浜у搧缁撴瀯",
-          type: "text",
-          clickFun: row => {
-            showProductStructure(row);
-          },
+      },
+      {
+        name: "浜у搧缁撴瀯",
+        type: "text",
+        clickFun: row => {
+          showProductStructure(row);
         },
-      ],
-    },
-  ]);
-  const tableData = ref([]);
-  const tableLoading = ref(false);
-  const page = reactive({
-    current: 1,
-    size: 100,
-    total: 0,
+      },
+    ],
+  },
+]);
+
+const tableData = ref([]);
+const tableLoading = ref(false);
+const page = reactive({
+  current: 1,
+  size: 100,
+  total: 0,
+});
+const selectedRows = ref([]);
+
+const data = reactive({
+  searchForm: {
+    customerName: "",
+    salesContractNo: "",
+    projectName: "",
+    productCategory: "",
+    specificationModel: "",
+  },
+});
+const { searchForm } = toRefs(data);
+
+const toProgressPercentage = val => {
+  const n = Number(val);
+  if (!Number.isFinite(n) || n <= 0) return 0;
+  if (n >= 100) return 100;
+  return Math.round(n);
+};
+
+const progressColor = percentage => {
+  const p = toProgressPercentage(percentage);
+  if (p < 30) return "#f56c6c";
+  if (p < 50) return "#e6a23c";
+  if (p < 80) return "#409eff";
+  return "#67c23a";
+};
+
+const tableRowClassName = ({ row }) => {
+  if (!row.deliveryDate || row.isFh) return "";
+
+  const diff = row.deliveryDaysDiff;
+  if (diff === 15) return "yellow";
+  if (diff === 10) return "pink";
+  if (diff === 2) return "purple";
+  if (diff < 2) return "red";
+  return "";
+};
+
+const bindRouteDialogVisible = ref(false);
+const bindRouteLoading = ref(false);
+const bindRouteSaving = ref(false);
+const routeOptions = ref([]);
+const bindProcessList = ref([]);
+const userOptions = ref([]);
+const userLoading = ref(false);
+const bindForm = reactive({
+  orderId: null,
+  productId: null,
+  productModelId: null,
+  routeId: null,
+  processUserList: [],
+});
+
+const resetBindProcessUsers = () => {
+  bindProcessList.value = [];
+  bindForm.processUserList = [];
+};
+
+const ensureUserOptions = () => {
+  if (userOptions.value.length || userLoading.value) return;
+
+  userLoading.value = true;
+  userListNoPageByTenantId()
+    .then(res => {
+      userOptions.value = res.data || [];
+    })
+    .finally(() => {
+      userLoading.value = false;
+    });
+};
+
+const createBindProcessUserList = list =>
+  list.map(item => ({
+    processId: item.id,
+    processName: item.name || item.processName || item.no || "",
+    userIds: [],
+    userNames: "",
+  }));
+
+const buildBindProcessRouteItems = () =>
+  bindProcessList.value.map((item, index) => {
+    const processUser = bindForm.processUserList[index] || {};
+    return {
+      productOrderId: bindForm.orderId,
+      productRouteId: bindForm.routeId,
+      processId: item.id,
+      productModelId: bindForm.productModelId,
+      dragSort: item.dragSort ?? index + 1,
+      isQuality: item.isQuality ?? false,
+      reportUserIds: Array.isArray(processUser.userIds) ? processUser.userIds.join(",") : "",
+    };
   });
 
-  const data = reactive({
-    searchForm: {
-      customerName: "",
-      salesContractNo: "",
-      projectName: "",
-      productCategory: "",
-      specificationModel: "",
-    },
-  });
-  const { searchForm } = toRefs(data);
+const fetchBindProcessList = async routeId => {
+  if (!routeId) {
+    resetBindProcessUsers();
+    return;
+  }
 
-  const toProgressPercentage = val => {
-    const n = Number(val);
-    if (!Number.isFinite(n)) return 0;
-    if (n <= 0) return 0;
-    if (n >= 100) return 100;
-    return Math.round(n);
-  };
+  try {
+    const res = await findProcessRouteItemList({
+      routeId,
+			productModelId: bindForm.productModelId,
+    });
+    bindProcessList.value = res.data || [];
+    bindForm.processUserList = createBindProcessUserList(bindProcessList.value);
+    ensureUserOptions();
+  } catch (error) {
+    console.error("鑾峰彇宸ュ簭鍒楄〃澶辫触", error);
+    proxy.$modal.msgError("鑾峰彇宸ュ簭鍒楄〃澶辫触");
+    resetBindProcessUsers();
+  }
+};
 
-  // 30/50/80/100 鍒嗘棰滆壊锛氱孩/姗�/钃�/缁�
-  const progressColor = percentage => {
-    const p = toProgressPercentage(percentage);
-    if (p < 30) return "#f56c6c";
-    if (p < 50) return "#e6a23c";
-    if (p < 80) return "#409eff";
-    return "#67c23a";
-  };
+const handleBindRouteChange = routeId => {
+  fetchBindProcessList(routeId);
+};
 
-  // 娣诲姞琛ㄨ绫诲悕鏂规硶
-  const tableRowClassName = ({ row }) => {
-    if (row.isFh) return '';
+const handleBindProcessUserChange = (index, userIds) => {
+  const selectedUsers = userOptions.value.filter(user => Array.isArray(userIds) && userIds.includes(user.userId));
+  bindForm.processUserList[index].userNames = selectedUsers.map(user => user.nickName).join(",");
+};
 
-    const diff = row.deliveryDaysDiff;
-    if (diff === 15) {
-      return 'yellow';
-    } else if (diff === 10) {
-      return 'pink';
-    } else if (diff === 2) {
-      return 'purple';
-    } else if (diff < 2) {
-      return 'red';
-    }
-  };
+const removeBindProcessItem = index => {
+  bindProcessList.value.splice(index, 1);
+  bindForm.processUserList.splice(index, 1);
+};
 
-  // 缁戝畾宸ヨ壓璺嚎寮规
-  const bindRouteDialogVisible = ref(false);
-  const bindRouteLoading = ref(false);
-  const bindRouteSaving = ref(false);
-  const routeOptions = ref([]);
-  const bindForm = reactive({
-    orderId: null,
-    routeId: null,
-  });
+const openBindRouteDialog = async row => {
+  bindForm.orderId = row.id;
+  bindForm.productId = row.id ?? null;
+  bindForm.productModelId = row.productModelId ?? null;
+  bindForm.routeId = null;
+  bindForm.processUserList = [];
+  bindRouteDialogVisible.value = true;
+  routeOptions.value = [];
+  resetBindProcessUsers();
 
-  const openBindRouteDialog = async row => {
-    bindForm.orderId = row.id;
-    bindForm.routeId = null;
-    bindRouteDialogVisible.value = true;
-    routeOptions.value = [];
-    if (!row.productModelId) {
-      proxy.$modal.msgWarning("褰撳墠璁㈠崟缂哄皯浜у搧鍨嬪彿锛屾棤娉曟煡璇㈠伐鑹鸿矾绾�");
-      bindRouteDialogVisible.value = false;
+  if (!row.productModelId) {
+    proxy.$modal.msgWarning("褰撳墠璁㈠崟缂哄皯浜у搧鍨嬪彿锛屾棤娉曟煡璇㈠伐鑹鸿矾绾�");
+    bindRouteDialogVisible.value = false;
+    return;
+  }
+
+  bindRouteLoading.value = true;
+  try {
+    const res = await listProcessRoute({
+      productId: bindForm.productId,
+      productModelId: row.productModelId,
+    });
+    routeOptions.value = res.data || [];
+  } catch (error) {
+    console.error("鑾峰彇宸ヨ壓璺嚎鍒楄〃澶辫触", error);
+    proxy.$modal.msgError("鑾峰彇宸ヨ壓璺嚎鍒楄〃澶辫触");
+  } finally {
+    bindRouteLoading.value = false;
+  }
+};
+
+const handleBindRouteConfirm = async () => {
+  if (!bindForm.routeId) {
+    proxy.$modal.msgWarning("璇烽�夋嫨宸ヨ壓璺嚎");
+    return;
+  }
+  if (!bindForm.processUserList.length) {
+    proxy.$modal.msgWarning("褰撳墠宸ヨ壓璺嚎涓嬫病鏈夊伐搴�");
+    return;
+  }
+  if (bindForm.processUserList.some(item => !Array.isArray(item.userIds) || item.userIds.length === 0)) {
+    proxy.$modal.msgWarning("璇蜂负姣忛亾宸ュ簭閫夋嫨鎶ュ伐浜哄憳");
+    return;
+  }
+
+  bindRouteSaving.value = true;
+  try {
+    await bindingRoute({
+      id: bindForm.orderId,
+      routeId: bindForm.routeId,
+      processRouteItems: buildBindProcessRouteItems(),
+      processUserList: bindForm.processUserList.map(item => ({
+        ...item,
+        userIds: item.userIds.join(","),
+      })),
+    });
+    proxy.$modal.msgSuccess("缁戝畾鎴愬姛");
+    bindRouteDialogVisible.value = false;
+    getList();
+  } catch (error) {
+    console.error("缁戝畾宸ヨ壓璺嚎澶辫触", error);
+    proxy.$modal.msgError("缁戝畾宸ヨ壓璺嚎澶辫触");
+  } finally {
+    bindRouteSaving.value = false;
+  }
+};
+
+const handleQuery = () => {
+  page.current = 1;
+  getList();
+};
+
+const pagination = obj => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getList();
+};
+
+const getList = () => {
+  tableLoading.value = true;
+  const params = { ...searchForm.value, ...page };
+  params.entryDate = undefined;
+
+  productOrderListPage(params)
+    .then(res => {
+      tableData.value = res.data.records;
+      page.total = res.data.total;
+    })
+    .finally(() => {
+      tableLoading.value = false;
+    });
+};
+
+const showRouteItemModal = async row => {
+  const orderId = row.id;
+  try {
+    const res = await getOrderProcessRouteMain(orderId);
+    const detail = res.data || {};
+    if (!detail.id) {
+      proxy.$modal.msgWarning("鏈壘鍒板叧鑱旂殑宸ヨ壓璺嚎");
       return;
     }
-    bindRouteLoading.value = true;
-    try {
-      const res = await listProcessRoute({ productModelId: row.productModelId });
-      routeOptions.value = res.data || [];
-    } catch (e) {
-      console.error("鑾峰彇宸ヨ壓璺嚎鍒楄〃澶辫触锛�", e);
-      proxy.$modal.msgError("鑾峰彇宸ヨ壓璺嚎鍒楄〃澶辫触");
-    } finally {
-      bindRouteLoading.value = false;
-    }
-  };
 
-  const handleBindRouteConfirm = async () => {
-    if (!bindForm.routeId) {
-      proxy.$modal.msgWarning("璇烽�夋嫨宸ヨ壓璺嚎");
-      return;
-    }
-    bindRouteSaving.value = true;
-    try {
-      await bindingRoute({
-        id: bindForm.orderId,
-        routeId: bindForm.routeId,
-      });
-      proxy.$modal.msgSuccess("缁戝畾鎴愬姛");
-      bindRouteDialogVisible.value = false;
-      getList();
-    } catch (e) {
-      console.error("缁戝畾宸ヨ壓璺嚎澶辫触锛�", e);
-      proxy.$modal.msgError("缁戝畾宸ヨ壓璺嚎澶辫触");
-    } finally {
-      bindRouteSaving.value = false;
-    }
-  };
-
-  // 鏌ヨ鍒楄〃
-  /** 鎼滅储鎸夐挳鎿嶄綔 */
-  const handleQuery = () => {
-    page.current = 1;
-    getList();
-  };
-  const pagination = obj => {
-    page.current = obj.page;
-    page.size = obj.limit;
-    getList();
-  };
-  const changeDaterange = value => {
-    if (value) {
-      searchForm.value.entryDateStart = value[0];
-      searchForm.value.entryDateEnd = value[1];
-    } else {
-      searchForm.value.entryDateStart = undefined;
-      searchForm.value.entryDateEnd = undefined;
-    }
-    handleQuery();
-  };
-  const getList = () => {
-    tableLoading.value = true;
-    // 鏋勯�犱竴涓柊鐨勫璞★紝涓嶅寘鍚玡ntryDate瀛楁
-    const params = { ...searchForm.value, ...page };
-    params.entryDate = undefined;
-    productOrderListPage(params)
-      .then(res => {
-        tableLoading.value = false;
-        tableData.value = res.data.records;
-        page.total = res.data.total;
-      })
-      .catch(() => {
-        tableLoading.value = false;
-      });
-  };
-
-  const showRouteItemModal = async row => {
-    const orderId = row.id;
-    try {
-      const res = await getOrderProcessRouteMain(orderId);
-      const data = res.data || {};
-      if (!data || !data.id) {
-        proxy.$modal.msgWarning("鏈壘鍒板叧鑱旂殑宸ヨ壓璺嚎");
-        return;
-      }
-      router.push({
-        path: "/productionManagement/processRouteItem",
-        query: {
-          id: data.id,
-          processRouteCode: data.processRouteCode || "",
-          productName: data.productName || "",
-          model: data.model || "",
-          bomNo: data.bomNo || "",
-          description: data.description || "",
-          orderId,
-          type: "order",
-        },
-      });
-    } catch (e) {
-      console.error("鑾峰彇宸ヨ壓璺嚎涓讳俊鎭け璐ワ細", e);
-      proxy.$modal.msgError("鑾峰彇宸ヨ壓璺嚎淇℃伅澶辫触");
-    }
-  };
-
-  const showProductStructure = row => {
     router.push({
-      path: "/productionManagement/productStructureDetail",
+      path: "/productionManagement/processRouteItem",
       query: {
-        id: row.id,
-        bomNo: row.bomNo || "",
-        productName: row.productCategory || "",
-        productModelName: row.specificationModel || "",
-        orderId: row.id,
+        id: detail.id,
+        processRouteCode: detail.processRouteCode || "",
+        productName: detail.productName || "",
+        model: detail.model || "",
+        bomNo: detail.bomNo || "",
+        description: detail.description || "",
+        orderId,
         type: "order",
       },
     });
-  };
+  } catch (error) {
+    console.error("鑾峰彇宸ヨ壓璺嚎淇℃伅澶辫触", error);
+    proxy.$modal.msgError("鑾峰彇宸ヨ壓璺嚎淇℃伅澶辫触");
+  }
+};
 
-  // 瀵煎嚭
-  const handleOut = () => {
-    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
-    })
-      .then(() => {
-        proxy.download("/productOrder/export", {...searchForm.value}, "鐢熶骇璁㈠崟.xlsx");
-      })
-      .catch(() => {
-        proxy.$modal.msg("宸插彇娑�");
-      });
-  };
-
-  const handleConfirmRoute = () => {};
-
-  onMounted(() => {
-    getList();
+const showProductStructure = row => {
+  router.push({
+    path: "/productionManagement/productStructureDetail",
+    query: {
+      id: row.id,
+      bomNo: row.bomNo || "",
+      productName: row.productCategory || "",
+      productModelName: row.specificationModel || "",
+      orderId: row.id,
+      type: "order",
+    },
   });
+};
+
+const handleSelectionChange = selection => {
+  selectedRows.value = selection;
+};
+
+const handleDelete = () => {
+  if (!selectedRows.value.length) {
+    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+    return;
+  }
+
+  const ids = selectedRows.value.map(item => item.id);
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鎻愮ず", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+    .then(() => delProductOrder(ids))
+    .then(() => {
+      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      getList();
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑堝垹闄�");
+    });
+};
+
+const handleOut = () => {
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "鎻愮ず", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+    .then(() => {
+      proxy.download("/productOrder/export", { ...searchForm.value }, "鐢熶骇璁㈠崟.xlsx");
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑堝鍑�");
+    });
+};
+
+onMounted(() => {
+  getList();
+});
 </script>
 
 <style scoped lang="scss">
-.search_form{
+.search_form {
   align-items: start;
 }
 
-::v-deep .yellow {
-  background-color: #FAF0DE;
+:deep(.yellow) {
+  background-color: #faf0de;
 }
 
-::v-deep .pink {
-  background-color: #FAE1DE;
+:deep(.pink) {
+  background-color: #fae1de;
 }
 
-::v-deep .red {
+:deep(.red) {
   background-color: #f80202;
 }
 
-::v-deep .purple{
-  background-color: #F4DEFA;
+:deep(.purple) {
+  background-color: #f4defa;
+}
+
+.process-user-list {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  gap: 14px;
+  padding: 14px;
+  border-radius: 12px;
+  background: #f7f9fc;
+  border: 1px solid #e8eef5;
+}
+
+.process-user-item {
+  display: grid;
+  grid-template-columns: minmax(0, 1fr);
+  gap: 16px;
+  padding: 12px 14px;
+  border-radius: 10px;
+  background: #fff;
+  border: 1px solid #edf2f7;
+}
+
+.process-user-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+
+.process-user-name {
+  color: #1f2d3d;
+  font-weight: 500;
+  line-height: 1.4;
+}
+
+.process-user-remove {
+  flex-shrink: 0;
+  padding: 0;
+}
+
+.process-user-select {
+  width: 100%;
+}
+
+@media (max-width: 768px) {
+  .process-user-item {
+    grid-template-columns: 1fr;
+    gap: 10px;
+  }
 }
 </style>

--
Gitblit v1.9.3