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