From 9360d4618e0f873eabb4e4a739d6b477b7461ce1 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期三, 10 六月 2026 17:19:52 +0800
Subject: [PATCH] 台账数据展示页面调整是按照订单状态区分。并且可以参考一下企业目前使用的系统的操作界面按钮布局(不能和企业现在使用的软件界面做的一模一样)。

---
 src/views/salesManagement/reverseAuditHistory/index.vue |   72 +++++++++
 src/views/salesManagement/salesLedger/index.vue         |  317 +++++++++++++++++++++++++++++++++++---------
 2 files changed, 319 insertions(+), 70 deletions(-)

diff --git a/src/views/salesManagement/reverseAuditHistory/index.vue b/src/views/salesManagement/reverseAuditHistory/index.vue
index 127576d..2a62e14 100644
--- a/src/views/salesManagement/reverseAuditHistory/index.vue
+++ b/src/views/salesManagement/reverseAuditHistory/index.vue
@@ -49,7 +49,9 @@
     <div class="table_list">
       <el-table :data="tableData"
                 border
-                v-loading="loading">
+                v-loading="loading"
+                show-summary
+                :summary-method="summarizeListTable">
         <el-table-column label="搴忓彿"
                          type="index"
                          width="60"
@@ -72,11 +74,25 @@
         <el-table-column label="椤圭洰鍚嶇О"
                          prop="projectName"
                          show-overflow-tooltip />
-        <el-table-column label="鍚堝悓閲戦(鍏�)"
+        <el-table-column label="鍚◣鎬讳环(鍏�)"
                          prop="contractAmount"
                          align="right">
           <template #default="scope">
             {{ formattedNumber(null, null, scope.row.contractAmount) }}
+          </template>
+        </el-table-column>
+        <el-table-column label="鏁伴噺"
+                         prop="productTotalQuantity"
+                         align="right">
+          <template #default="scope">
+            {{ scope.row.productTotalQuantity ?? "-" }}
+          </template>
+        </el-table-column>
+        <el-table-column label="鎬婚潰绉�(m虏)"
+                         prop="productTotalArea"
+                         align="right">
+          <template #default="scope">
+            {{ scope.row.productTotalArea != null && scope.row.productTotalArea !== "" ? Number(scope.row.productTotalArea).toFixed(4) : "-" }}
           </template>
         </el-table-column>
         <el-table-column label="鍙嶅鏍哥被鍨�"
@@ -394,6 +410,57 @@
     return dayjs(time).format("YYYY-MM-DD HH:mm:ss");
   };
 
+  const summarizeListTable = param => {
+    const { columns, data } = param;
+    const sums = [];
+    columns.forEach((column, index) => {
+      if (index === 0) {
+        sums[index] = "鍚堣";
+        return;
+      }
+      const prop = column.property;
+      if (prop === "productTotalQuantity") {
+        const values = data.map(item => Number(item.productTotalQuantity));
+        sums[index] = values.every(value => isNaN(value))
+          ? ""
+          : values.reduce((prev, curr) => {
+              const value = Number(curr);
+              return isNaN(value) ? prev : prev + value;
+            }, 0);
+        return;
+      }
+      if (prop === "productTotalArea") {
+        const values = data.map(item => Number(item.productTotalArea));
+        sums[index] = values.every(value => isNaN(value))
+          ? ""
+          : values
+              .reduce((prev, curr) => {
+                const value = Number(curr);
+                return isNaN(value) ? prev : prev + value;
+              }, 0)
+              .toFixed(4);
+        return;
+      }
+      if (prop === "contractAmount") {
+        const values = data.map(item => Number(item.contractAmount));
+        sums[index] = values.every(value => isNaN(value))
+          ? ""
+          : values
+              .reduce((prev, curr) => {
+                const value = Number(curr);
+                return isNaN(value) ? prev : prev + value;
+              }, 0)
+              .toLocaleString("zh-CN", {
+                minimumFractionDigits: 2,
+                maximumFractionDigits: 2,
+              });
+        return;
+      }
+      sums[index] = "";
+    });
+    return sums;
+  };
+
   const summarizeMainTable = param => {
     const { columns, data } = param;
     const sums = [];
@@ -408,7 +475,6 @@
           "quantity",
           "actualTotalArea",
           "taxInclusiveTotalPrice",
-          "taxExclusiveTotalPrice",
         ].includes(prop)
       ) {
         const values = data.map(item => Number(item[prop]));
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 3d566d9..a843502 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -243,7 +243,7 @@
                              min-width="85">
               <template #default="scope">
                 <el-input-number v-if="scope.row.__editing"
-                                 controls-position="right"
+                                 :controls="false"
                                  :step="0.01"
                                  :min="0"
                                  :precision="2"
@@ -261,7 +261,7 @@
                              min-width="85">
               <template #default="scope">
                 <el-input-number v-if="scope.row.__editing"
-                                 controls-position="right"
+                                 :controls="false"
                                  v-model="scope.row.width"
                                  :min="0"
                                  :step="1"
@@ -280,7 +280,7 @@
                              min-width="85">
               <template #default="scope">
                 <el-input-number v-if="scope.row.__editing"
-                                 controls-position="right"
+                                 :controls="false"
                                  v-model="scope.row.height"
                                  :min="0"
                                  :step="1"
@@ -708,6 +708,18 @@
       </div>
     </template>
     <template v-else>
+    <div class="sales-ledger-status-bar">
+      <button v-for="tab in salesLedgerStatusTabs"
+              :key="tab.key"
+              type="button"
+              class="sales-ledger-status-tab"
+              :class="{ 'is-active': activeStatusTab === tab.key }"
+              @click="handleStatusTabChange(tab.key)">
+        {{ tab.label }}
+      </button>
+    </div>
+    <ReverseAuditHistory v-if="activeStatusTab === 'reverseReviewed'" />
+    <div v-else>
     <div class="search_form">
       <el-form :model="searchForm"
                :inline="true">
@@ -813,8 +825,8 @@
       </el-form>
     </div>
     <div class="table_list">
-      <div class="actions">
-        <div>
+      <div class="actions sales-ledger-toolbar">
+        <div class="sales-ledger-toolbar-group">
           <OtherAmountMaintenanceButton />
           <ProcessFlowMaintenanceButton />
         </div>
@@ -822,68 +834,115 @@
                                        :default-route-id="processFlowSelectDefaultRouteId"
                                        :bound-route-name="processFlowSelectBoundRouteName"
                                        @confirm="handleProcessFlowSelectConfirm" />
-        <el-space wrap>
-          <el-button type="primary"
-                     @click="handleAudit"
-                     :disabled="isBatchButtonDisabled('audit')">瀹℃牳</el-button>
-          <el-button type="primary"
-                     @click="handleReverseAudit"
-                     :disabled="isBatchButtonDisabled('reverseAudit')">鍙嶅</el-button>
-          <el-button type="warning"
-                     @click="handleMarkCompleted"
-                     :disabled="isBatchButtonDisabled('markCompleted')">鏍囪瀹屾垚</el-button>
-          <el-button type="primary"
-                     @click="handleSalesStock"
-                     :disabled="isBatchButtonDisabled('stock')">鍏ュ簱</el-button>
-          <el-button type="primary"
-                     @click="openForm('add')">鏂板鍙拌处</el-button>
-          <el-button type="primary"
-                     @click="handleBulkDelivery"
-                     :disabled="isBatchButtonDisabled('delivery')">鍙戣揣</el-button>
-          <el-button type="primary"
-                     plain
-                     @click="handleImport">瀵煎叆</el-button>
-          <el-dropdown @command="handleHistoryImportCommand">
+        <div class="sales-ledger-toolbar-actions">
+          <el-space v-if="activeStatusTab === 'pendingReview'"
+                    wrap
+                    class="sales-ledger-toolbar-group">
             <el-button type="primary"
-                       plain>
-              鍘嗗彶杩佺Щ<el-icon class="el-icon--right">
-                <ArrowDown />
-              </el-icon>
-            </el-button>
-            <template #dropdown>
-              <el-dropdown-menu>
-                <el-dropdown-item command="notShipped">鏈嚭搴�</el-dropdown-item>
-                <el-dropdown-item command="shipped">宸插嚭搴�</el-dropdown-item>
-              </el-dropdown-menu>
-            </template>
-          </el-dropdown>
-          <el-button @click="handleOut"
-                     :disabled="isBatchButtonDisabled('export')">瀵煎嚭</el-button>
-          <el-button type="danger"
-                     plain
-                     @click="handleDelete"
-                     :disabled="isBatchButtonDisabled('delete')">鍒犻櫎</el-button>
-          <el-dropdown @command="handlePrintCommand">
+                       @click="handleAudit"
+                       :disabled="isBatchButtonDisabled('audit')">瀹℃牳</el-button>
+            <el-button type="danger"
+                       plain
+                       @click="handleDelete"
+                       :disabled="isBatchButtonDisabled('delete')">鍒犻櫎</el-button>
+            <el-button type="primary"
+                       @click="openForm('add')">鏂板鍙拌处</el-button>
             <el-button type="primary"
                        plain
-                       :disabled="isBatchButtonDisabled('print')">
-              鎵撳嵃鍗曟嵁<el-icon class="el-icon--right">
-                <ArrowDown />
-              </el-icon>
-            </el-button>
-            <template #dropdown>
-              <el-dropdown-menu>
-                <el-dropdown-item command="finishedProcessCard">鐢熶骇娴佺▼鍗★紙鎴愬搧锛�</el-dropdown-item>
-                <el-dropdown-item command="salesOrder">閿�鍞鍗�</el-dropdown-item>
-                <el-dropdown-item command="salesDeliveryNote">閿�鍞彂璐у崟</el-dropdown-item>
-              </el-dropdown-menu>
-            </template>
-          </el-dropdown>
-          <el-button type="primary"
-                     plain
-                     @click="handlePrintLabel"
-                     :disabled="isBatchButtonDisabled('print')">鎵撳嵃鏍囩</el-button>
-        </el-space>
+                       @click="handleImport">瀵煎叆</el-button>
+          </el-space>
+          <el-space v-else-if="activeStatusTab === 'reviewed'"
+                    wrap
+                    class="sales-ledger-toolbar-group">
+            <el-button type="primary"
+                       @click="handleReverseAudit"
+                       :disabled="isBatchButtonDisabled('reverseAudit')">鍙嶅</el-button>
+            <el-button type="warning"
+                       @click="handleMarkCompleted"
+                       :disabled="isBatchButtonDisabled('markCompleted')">鏍囪瀹屾垚</el-button>
+            <el-button type="primary"
+                       @click="handleSalesStock"
+                       :disabled="isBatchButtonDisabled('stock')">鍏ュ簱</el-button>
+            <el-button type="primary"
+                       @click="handleBulkDelivery"
+                       :disabled="isBatchButtonDisabled('delivery')">鍙戣揣</el-button>
+          </el-space>
+          <el-space v-else-if="activeStatusTab === 'stocked'"
+                    wrap
+                    class="sales-ledger-toolbar-group">
+            <el-button type="primary"
+                       @click="handleReverseAudit"
+                       :disabled="isBatchButtonDisabled('reverseAudit')">鍙嶅</el-button>
+            <el-button type="warning"
+                       @click="handleMarkCompleted"
+                       :disabled="isBatchButtonDisabled('markCompleted')">鏍囪瀹屾垚</el-button>
+            <el-button type="primary"
+                       @click="handleBulkDelivery"
+                       :disabled="isBatchButtonDisabled('delivery')">鍙戣揣</el-button>
+          </el-space>
+          <el-space v-else-if="activeStatusTab === 'delivered'"
+                    wrap
+                    class="sales-ledger-toolbar-group">
+            <el-button type="warning"
+                       @click="handleMarkCompleted"
+                       :disabled="isBatchButtonDisabled('markCompleted')">鏍囪瀹屾垚</el-button>
+            <el-button type="primary"
+                       @click="handleReverseAudit"
+                       :disabled="isBatchButtonDisabled('reverseAudit')">鍙嶅</el-button>
+          </el-space>
+          <el-space v-else-if="activeStatusTab === 'completed'"
+                    wrap
+                    class="sales-ledger-toolbar-group">
+            <el-button @click="handleOut"
+                       :disabled="isBatchButtonDisabled('export')">瀵煎嚭</el-button>
+            <el-button type="primary"
+                       plain
+                       @click="handlePrintCommand('salesOrder')"
+                       :disabled="isBatchButtonDisabled('print')">鎵撳嵃鍗曟嵁</el-button>
+            <el-button type="primary"
+                       plain
+                       @click="handlePrintLabel"
+                       :disabled="isBatchButtonDisabled('print')">鎵撳嵃鏍囩</el-button>
+          </el-space>
+          <el-space wrap class="sales-ledger-toolbar-group sales-ledger-toolbar-group--muted">
+            <el-dropdown @command="handleHistoryImportCommand">
+              <el-button type="primary"
+                         plain>
+                鍘嗗彶杩佺Щ<el-icon class="el-icon--right">
+                  <ArrowDown />
+                </el-icon>
+              </el-button>
+              <template #dropdown>
+                <el-dropdown-menu>
+                  <el-dropdown-item command="notShipped">鏈嚭搴�</el-dropdown-item>
+                  <el-dropdown-item command="shipped">宸插嚭搴�</el-dropdown-item>
+                </el-dropdown-menu>
+              </template>
+            </el-dropdown>
+          </el-space>
+          <el-space wrap class="sales-ledger-toolbar-group sales-ledger-toolbar-group--muted">
+            <el-dropdown @command="handlePrintCommand">
+              <el-button type="primary"
+                         plain
+                         :disabled="isBatchButtonDisabled('print')">
+                鎵撳嵃鍗曟嵁<el-icon class="el-icon--right">
+                  <ArrowDown />
+                </el-icon>
+              </el-button>
+              <template #dropdown>
+                <el-dropdown-menu>
+                  <el-dropdown-item command="finishedProcessCard">鐢熶骇娴佺▼鍗★紙鎴愬搧锛�</el-dropdown-item>
+                  <el-dropdown-item command="salesOrder">閿�鍞鍗�</el-dropdown-item>
+                  <el-dropdown-item command="salesDeliveryNote">閿�鍞彂璐у崟</el-dropdown-item>
+                </el-dropdown-menu>
+              </template>
+            </el-dropdown>
+            <el-button type="primary"
+                       plain
+                       @click="handlePrintLabel"
+                       :disabled="isBatchButtonDisabled('print')">鎵撳嵃鏍囩</el-button>
+          </el-space>
+        </div>
       </div>
       <el-table :data="tableData"
                 border
@@ -1055,6 +1114,7 @@
                   :page="page.current"
                   :limit="page.size"
                   @pagination="paginationChange" />
+    </div>
     </div>
     </template>
     <FormDialog v-if="!isFormPageMode"
@@ -2491,6 +2551,7 @@
   import OtherAmountMaintenanceButton from "./components/OtherAmountMaintenanceButton.vue";
   import ProcessFlowMaintenanceButton from "./components/ProcessFlowMaintenanceButton.vue";
   import ProcessFlowConfigSelectDialog from "./components/ProcessFlowConfigSelectDialog.vue";
+  import ReverseAuditHistory from "../reverseAuditHistory/index.vue";
   import { getQuotationList } from "@/api/salesManagement/salesQuotation.js";
   import {
     ledgerListPage,
@@ -3773,6 +3834,50 @@
     shipped: "閿�鍞彂璐у巻鍙叉暟鎹鍏ユā鏉�-宸插彂璐�.xlsx",
   };
   const currentImportCommand = ref("default");
+  const activeStatusTab = ref("pendingReview");
+  const salesLedgerStatusTabs = [
+    { key: "pendingReview", label: "鏈鏍�" },
+    { key: "reviewed", label: "宸插鏍�" },
+    { key: "reverseReviewed", label: "鍙嶅鏍�" },
+    { key: "stocked", label: "宸插叆搴�" },
+    { key: "delivered", label: "宸插彂璐�" },
+    { key: "completed", label: "宸插畬鎴�" },
+  ];
+
+  const resetStatusFilters = () => {
+    searchForm.reviewStatus = undefined;
+    searchForm.stockStatus = undefined;
+    searchForm.deliveryStatus = undefined;
+    searchForm.orderStatus = undefined;
+  };
+
+  const handleStatusTabChange = tabKey => {
+    activeStatusTab.value = tabKey;
+    resetStatusFilters();
+    switch (tabKey) {
+      case "pendingReview":
+        searchForm.reviewStatus = 0;
+        break;
+      case "reviewed":
+        searchForm.reviewStatus = 1;
+        break;
+      case "reverseReviewed":
+        searchForm.reviewStatus = 2;
+        break;
+      case "stocked":
+        searchForm.stockStatus = 2;
+        break;
+      case "delivered":
+        searchForm.deliveryStatus = 5;
+        break;
+      case "completed":
+        searchForm.orderStatus = 1;
+        break;
+      default:
+        break;
+    }
+    handleQuery();
+  };
   const changeDaterange = value => {
     if (value) {
       searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
@@ -4003,7 +4108,7 @@
     tableLoading.value = true;
     const { entryDate, ...rest } = searchForm;
     // 灏嗚寖鍥存棩鏈熷瓧娈典紶閫掔粰鍚庣
-    const params = { ...rest, ...page, reviewStatusList: [0, 1] };
+    const params = { ...rest, ...page, reviewStatusList: [0, 1, 2] };
     // 绉婚櫎褰曞叆鏃ユ湡鐨勯粯璁ゅ�艰缃紝鍙繚鐣欒寖鍥存棩鏈熷瓧娈�
     delete params.entryDate;
     // 鏌ヨ瀹㈡埛鍚嶇О涓庢柊澧炰繚鎸佷竴鑷达細鍏堥�� customerId锛屽啀鏄犲皠涓� customerName 鏌ヨ
@@ -6130,7 +6235,7 @@
     currentFactoryName.value = res.user.currentFactoryName;
   };
   onMounted(() => {
-    getList();
+    handleStatusTabChange(activeStatusTab.value);
     customerList().then(res => {
       customerOption.value = res;
     });
@@ -6180,10 +6285,77 @@
     margin-top: unset;
   }
 
+  .sales-ledger-status-bar {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 8px;
+    padding: 12px 14px;
+    margin-bottom: 14px;
+    background: linear-gradient(180deg, #f9fbff 0%, #f2f6ff 100%);
+    border: 1px solid #dbe6ff;
+    border-radius: 12px;
+  }
+
+  .sales-ledger-status-tab {
+    min-width: 88px;
+    height: 34px;
+    padding: 0 14px;
+    border: 1px solid #d7def0;
+    border-radius: 9px;
+    background: #fff;
+    color: #4b5567;
+    font-size: 13px;
+    cursor: pointer;
+    transition: all 0.18s ease;
+  }
+
+  .sales-ledger-status-tab:hover {
+    border-color: #8fb3ff;
+    color: #1d4ed8;
+  }
+
+  .sales-ledger-status-tab.is-active {
+    border-color: #1d4ed8;
+    background: linear-gradient(135deg, #2f67f6 0%, #1d4ed8 100%);
+    color: #fff;
+    box-shadow: 0 8px 18px rgba(29, 78, 216, 0.16);
+  }
+
   .actions {
     display: flex;
     justify-content: space-between;
     margin-bottom: 10px;
+  }
+
+  .sales-ledger-toolbar {
+    align-items: flex-start;
+    gap: 14px;
+    padding: 10px 12px;
+    background: #fff;
+    border: 1px solid #e7edf7;
+    border-radius: 12px;
+  }
+
+  .sales-ledger-toolbar-actions {
+    display: flex;
+    flex: 1;
+    flex-wrap: wrap;
+    justify-content: flex-end;
+    gap: 10px;
+  }
+
+  .sales-ledger-toolbar-group {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 8px;
+    padding: 4px;
+    background: #f7f9fc;
+    border: 1px solid #edf1f7;
+    border-radius: 10px;
+  }
+
+  .sales-ledger-toolbar-group--muted {
+    background: #fbfcfe;
   }
 
   .sales-ledger-page-header {
@@ -6333,9 +6505,20 @@
   }
 
   @media (max-width: 768px) {
+    .sales-ledger-status-tab {
+      min-width: unset;
+      flex: 1 1 calc(50% - 8px);
+    }
+
+    .sales-ledger-toolbar,
     .sales-ledger-page-header {
       flex-direction: column;
       align-items: stretch;
+    }
+
+    .sales-ledger-toolbar-actions {
+      width: 100%;
+      justify-content: flex-start;
     }
 
     .approver-node-item {
@@ -6363,4 +6546,4 @@
     margin-right: 0;
     margin-bottom: 8px;
   }
-</style>
\ No newline at end of file
+</style>

--
Gitblit v1.9.3