From ada2de76afaa9c884a860786ea97992f97dadff0 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期四, 11 六月 2026 09:22:54 +0800
Subject: [PATCH] Merge branch 'dev_河南_鹤壁天沐玻璃厂' of http://114.132.189.42:9002/r/product-inventory-management into dev_河南_鹤壁天沐玻璃厂

---
 src/views/salesManagement/salesLedger/components/ProcessFlowConfigSelectDialog.vue |   92 +++++++++++++++++++++++++++++-
 src/views/salesManagement/salesLedger/index.vue                                    |   44 ++++++++------
 vite.config.js                                                                     |    2 
 3 files changed, 112 insertions(+), 26 deletions(-)

diff --git a/src/views/salesManagement/salesLedger/components/ProcessFlowConfigSelectDialog.vue b/src/views/salesManagement/salesLedger/components/ProcessFlowConfigSelectDialog.vue
index f3c33b5..f400877 100644
--- a/src/views/salesManagement/salesLedger/components/ProcessFlowConfigSelectDialog.vue
+++ b/src/views/salesManagement/salesLedger/components/ProcessFlowConfigSelectDialog.vue
@@ -8,10 +8,28 @@
   >
     <el-row :gutter="20">
       <el-col :span="24">
-        <div style="font-weight: 600; margin-bottom: 8px;">閰嶇疆</div>
-        <div style="font-size: 12px; margin-bottom: 8px;">
-          <span v-if="boundRouteName" style="color: #67c23a;">宸茬粦瀹氾細{{ boundRouteName }}</span>
-          <span v-else style="color: #e6a23c;">鏈粦瀹�</span>
+        <div class="dialog-topbar">
+          <div>
+            <div style="font-weight: 600; margin-bottom: 8px;">閰嶇疆</div>
+            <div style="font-size: 12px; margin-bottom: 8px;">
+              <span v-if="boundRouteName" style="color: #67c23a;">宸茬粦瀹氾細{{ boundRouteName }}</span>
+              <span v-else style="color: #e6a23c;">鏈粦瀹�</span>
+            </div>
+          </div>
+          <div class="export-toolbar">
+            <el-date-picker
+              v-model="exportDateRange"
+              type="daterange"
+              value-format="YYYY-MM-DD"
+              format="YYYY-MM-DD"
+              range-separator="鑷�"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+              clearable
+              style="width: 280px;"
+            />
+            <el-button type="success" plain @click="exportSelectedSteps">瀵煎嚭宸插嬀閫�</el-button>
+          </div>
         </div>
         <el-select
           v-model="selectedRouteId"
@@ -46,6 +64,11 @@
             class="process-diagram-segment"
           >
             <div class="process-diagram-node">
+              <el-checkbox
+                v-model="step.checked"
+                class="process-diagram-checkbox"
+                @change="() => handleStepCheckedChange(step)"
+              />
               <div class="process-diagram-index">{{ idx + 1 }}</div>
               <div class="process-diagram-name">{{ step.processName }}</div>
             </div>
@@ -97,6 +120,7 @@
 const routeList = ref([]);
 const selectedRouteId = ref(null);
 const steps = ref([]);
+const exportDateRange = ref([]);
 const saving = ref(false);
 
 const normalizeStepsFromApi = (list) => {
@@ -106,6 +130,8 @@
     processId: s.processId ?? s.process_id ?? s.id ?? null,
     processName: s.processName ?? s.process_name ?? s.name ?? "",
     sortNo: s.sortNo ?? idx + 1,
+    isCompleted: Number(s.isCompleted ?? s.completed ?? 0),
+    checked: Boolean(s.checked ?? false),
   }));
 };
 
@@ -163,6 +189,10 @@
   await fetchRouteSteps(selectedRouteId.value);
 };
 
+const handleStepCheckedChange = step => {
+  step.checked = Boolean(step.checked);
+};
+
 const handleClose = () => {
   emit("update:visible", false);
   saving.value = false;
@@ -182,6 +212,38 @@
   } finally {
     saving.value = false;
   }
+};
+
+const exportSelectedSteps = () => {
+  const selectedSteps = steps.value.filter(step => step.checked);
+  if (selectedSteps.length === 0) {
+    proxy?.$modal?.msgWarning?.("璇峰厛鍕鹃�夎瀵煎嚭鐨勫伐搴�");
+    return;
+  }
+  const payload = {
+    exportDateRange: Array.isArray(exportDateRange.value) ? exportDateRange.value : [],
+    routeId: selectedRouteId.value,
+    routeName: routeList.value.find(item => String(item.routeId) === String(selectedRouteId.value))?.processRouteName || "",
+    steps: selectedSteps.map(step => ({
+      processId: step.processId,
+      processName: step.processName,
+      sortNo: step.sortNo,
+      isCompleted: Number(step.isCompleted ?? 0),
+    })),
+  };
+  const blob = new Blob([JSON.stringify(payload, null, 2)], {
+    type: "application/json;charset=utf-8",
+  });
+  const url = URL.createObjectURL(blob);
+  const a = document.createElement("a");
+  const dateText =
+    Array.isArray(exportDateRange.value) && exportDateRange.value.length === 2
+      ? `${exportDateRange.value[0]}_${exportDateRange.value[1]}`
+      : "all";
+  a.href = url;
+  a.download = `宸ヨ壓璺嚎瀵煎嚭_${dateText}.json`;
+  a.click();
+  URL.revokeObjectURL(url);
 };
 </script>
 
@@ -213,6 +275,13 @@
   padding: 10px 12px;
   margin-right: 10px;
   box-sizing: border-box;
+  position: relative;
+}
+
+.process-diagram-checkbox {
+  position: absolute;
+  top: 8px;
+  right: 8px;
 }
 
 .process-diagram-index {
@@ -251,5 +320,18 @@
   justify-content: flex-end;
   gap: 10px;
 }
-</style>
 
+.dialog-topbar {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+  gap: 16px;
+}
+
+.export-toolbar {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+  flex-wrap: wrap;
+}
+</style>
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index a843502..cd38615 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -5263,30 +5263,34 @@
     proxy.$refs["importUploadRef"].submit();
   };
 
-  // 瀵煎嚭
+  // 瀵煎嚭锛堟寜褰撳墠鏌ヨ鏉′欢瀵煎嚭锛�
   const handleOut = () => {
-    if (selectedRows.value.length === 0) {
-      proxy.$modal.msgWarning("璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹繘琛屽鍑�");
-      return;
+    // 鏋勫缓鏌ヨ鍙傛暟锛堜笌 getList 淇濇寔涓�鑷达級
+    const { entryDate, ...rest } = searchForm;
+    const params = { ...rest };
+
+    // 澶勭悊褰曞叆鏃ユ湡鑼冨洿
+    if (entryDate && entryDate.length === 2) {
+      params.entryDateStart = entryDate[0];
+      params.entryDateEnd = entryDate[1];
     }
-    const hasUnapproved = selectedRows.value.some(
-      row => Number(row.reviewStatus) !== 1
+
+    // 澶勭悊瀹㈡埛鍚嶇О鏌ヨ
+    const selectedCustomer = (customerOption.value || []).find(
+      item => String(item?.id ?? "") === String(params.customerId ?? "")
     );
-    if (hasUnapproved) {
-      proxy.$modal.msgWarning("閫変腑鐨勬暟鎹腑鍖呭惈鏈鏍搁」锛屾棤娉曞鍑�");
-      return;
+    if (selectedCustomer?.customerName) {
+      params.customerName = String(selectedCustomer.customerName).trim();
     }
-    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
-    })
-      .then(() => {
-        proxy.download("/sales/ledger/export", {}, "閿�鍞彴璐�.xlsx");
-      })
-      .catch(() => {
-        proxy.$modal.msg("宸插彇娑�");
-      });
+    delete params.customerId;
+
+    // 澶勭悊浜у搧瀹介珮鏌ヨ鍙傛暟
+    const widthValue = params.width != null ? String(params.width).trim() : "";
+    const heightValue = params.height != null ? String(params.height).trim() : "";
+    if (!widthValue) delete params.width;
+    if (!heightValue) delete params.height;
+
+    proxy.download("/sales/ledger/exportWithProducts", params, "閿�鍞彴璐�.xlsx");
   };
   /** 鍒ゆ柇鍗曚釜浜у搧鏄惁宸插彂璐э紙鏍规嵁shippingStatus鍒ゆ柇锛屽凡鍙戣揣鎴栧鏍搁�氳繃涓嶅彲缂栬緫鍜屽垹闄わ級 */
   const isProductShipped = product => {
diff --git a/vite.config.js b/vite.config.js
index dc687a8..1b7527e 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -8,7 +8,7 @@
   const { VITE_APP_ENV } = env;
   const baseUrl =
       env.VITE_APP_ENV === "development"
-          ? "http://1.15.17.182:9003"
+          ? "http://192.168.0.15:9009"
           : env.VITE_BASE_API;
   const javaUrl =
       env.VITE_APP_ENV === "development"

--
Gitblit v1.9.3