From f07e539896420f2827c714c92b157654c90b71c2 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 24 六月 2026 13:09:50 +0800
Subject: [PATCH] 中兴实强 1.供应商往来、客户网来展示字段修改
---
src/api/salesManagement/indicatorStats.js | 27 +
src/views/salesManagement/receiptPaymentLedger/detail.vue | 387 ++++++++++++++++
src/views/salesManagement/receiptPaymentLedger/index.vue | 256 ++++++---
src/views/salesManagement/salesLedger/index.vue | 4
src/views/salesManagement/receiptPaymentLedger/components/ShipmentTable.vue | 197 ++++++++
src/router/index.js | 13
src/api/procurementManagement/invoiceEntry.js | 69 ++
src/views/salesManagement/receiptPaymentLedger/components/ProductTable.vue | 229 +++++++++
src/views/procurementManagement/paymentLedger/index.vue | 222 ++++----
9 files changed, 1,204 insertions(+), 200 deletions(-)
diff --git a/src/api/procurementManagement/invoiceEntry.js b/src/api/procurementManagement/invoiceEntry.js
new file mode 100644
index 0000000..8325aa7
--- /dev/null
+++ b/src/api/procurementManagement/invoiceEntry.js
@@ -0,0 +1,69 @@
+// 閲囪喘-鏉ョエ鐧昏鎺ュ彛
+import request from "@/utils/request";
+
+// 鏌ヨ閲囪喘鍚堝悓鍙�
+export function getProduct(query) {
+ return request({
+ url: "/purchase/ledger/getProduct",
+ method: "get",
+ params: query,
+ });
+}
+
+// 鏌ヨid閲囪喘鍚堝悓鍙�
+export function getPurchaseNoById(query) {
+ return request({
+ url: "/purchase/ledger/getPurchaseNoById",
+ method: "get",
+ params: query,
+ });
+}
+// 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇㈣缁嗕俊鎭�
+export function getInfo(query) {
+ return request({
+ url: "/purchase/ledger/getInfo",
+ method: "get",
+ params: query,
+ });
+}
+// 涓诲垪琛ㄦ煡璇�
+export function gePurchaseList(query) {
+ return request({
+ url: "/purchase/ledger/list",
+ method: "get",
+ params: query,
+ });
+}
+// 涓诲垪琛ㄦ煡璇�
+export function getRegistrationById(query) {
+ return request({
+ url: "/purchase/registration/getRegistrationById",
+ method: "get",
+ params: query,
+ });
+}
+// 鏂板缂栬緫鏉ョエ鐧昏
+export function addOrUpdateRegistration(query) {
+ return request({
+ url: "/purchase/registration/addOrUpdateRegistration",
+ method: "post",
+ data: query,
+ });
+}
+// 鍒犻櫎鏉ョエ鐧昏
+export function delRegistration(query) {
+ return request({
+ url: "/purchase/registration/delRegistration",
+ method: "delete",
+ data: query,
+ });
+}
+
+// 涓诲垪琛ㄦ煡璇�
+export function gePurchaseListPage(query) {
+ return request({
+ url: "/purchase/ledger/listPage",
+ method: "get",
+ params: query,
+ });
+}
diff --git a/src/api/salesManagement/indicatorStats.js b/src/api/salesManagement/indicatorStats.js
index c29eac3..5d66e86 100644
--- a/src/api/salesManagement/indicatorStats.js
+++ b/src/api/salesManagement/indicatorStats.js
@@ -36,3 +36,30 @@
params: query,
});
}
+
+// 瀹㈡埛寰�鏉ョ粺璁℃眹鎬�
+export function customerTransactionsSummary(query) {
+ return request({
+ url: "/metricStatistics/customerTransactionsSummary",
+ method: "get",
+ params: query,
+ });
+}
+
+// 瀹㈡埛寰�鏉ヤ骇鍝佹槑缁�
+export function customerTransactionsProducts(query) {
+ return request({
+ url: "/metricStatistics/customerTransactionsProducts",
+ method: "get",
+ params: query,
+ });
+}
+
+// 瀹㈡埛寰�鏉ュ彂璐ф槑缁�
+export function customerTransactionsShipments(query) {
+ return request({
+ url: "/metricStatistics/customerTransactionsShipments",
+ method: "get",
+ params: query,
+ });
+}
diff --git a/src/router/index.js b/src/router/index.js
index 7be3668..e05a1af 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -131,6 +131,19 @@
},
],
},
+ {
+ path: "/customer-transactions-detail",
+ component: Layout,
+ hidden: true,
+ children: [
+ {
+ path: "",
+ component: () => import("@/views/salesManagement/receiptPaymentLedger/detail.vue"),
+ name: "CustomerTransactionsDetail",
+ meta: { title: "瀹㈡埛寰�鏉ヨ鎯�", activeMenu: "/salesManagement/receiptPaymentLedger" },
+ },
+ ],
+ },
// 璐㈠姟绠$悊妯″潡璺敱
// {
// path: "/financial",
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index 99b4b39..b3ef111 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -17,7 +17,7 @@
<div></div>
</div>
<el-row :gutter="20">
- <el-col :span="14">
+ <el-col :span="8">
<div class="table_list">
<el-table ref="multipleTable"
border
@@ -42,19 +42,15 @@
prop="contractAmounts"
show-overflow-tooltip
:formatter="formattedNumber" />
- <el-table-column label="浠樻閲戦(鍏�)"
- prop="paymentAmount"
- show-overflow-tooltip
- :formatter="formattedNumber" />
- <el-table-column label="搴斾粯閲戦(鍏�)"
- prop="payableAmount"
- show-overflow-tooltip>
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.payableAmount) }}
- </el-text>
- </template>
- </el-table-column>
+<!-- <el-table-column label="搴斾粯閲戦(鍏�)"-->
+<!-- prop="payableAmount"-->
+<!-- show-overflow-tooltip>-->
+<!-- <template #default="{ row, column }">-->
+<!-- <el-text type="danger">-->
+<!-- {{ formattedNumber(row, column, row.payableAmount) }}-->
+<!-- </el-text>-->
+<!-- </template>-->
+<!-- </el-table-column>-->
</el-table>
<pagination v-show="total > 0"
@pagination="paginationSearch"
@@ -64,25 +60,54 @@
:limit="page.size" />
</div>
</el-col>
- <el-col :span="10">
+ <el-col :span="16">
<div class="table_list">
- <PIMTable rowKey="id"
- :column="tableColumnSon"
- :tableData="originalTableDataSon"
- :isSelection="false"
- :isShowPagination="true"
- :page="sonPage"
- :tableLoading="tableLoadingSon"
- :isShowSummary="isShowSummarySon"
- :summaryMethod="summarizeMainTable1"
- height="calc(100vh - 18.5em)"
- @pagination="sonPaginationSearch">
- <template #payableAmountSlot="{ row }">
- <el-text type="danger">
- {{ parseFloat(row.payableAmount).toFixed(2) }}
- </el-text>
- </template>
- </PIMTable>
+ <div class="table-header" v-if="selectedSupplierName">
+ <span class="supplier-title">渚涘簲鍟嗭細{{ selectedSupplierName }}</span>
+ </div>
+ <el-table border
+ v-loading="tableLoadingSon"
+ :data="originalTableDataSon"
+ :header-cell-style="{ background: '#F0F1F5', color: '#333333' }"
+ height="calc(100vh - 20em)"
+ style="width: 100%"
+ tooltip-effect="dark"
+ :show-summary="isShowSummarySon"
+ :summary-method="summarizeMainTable1">
+ <el-table-column align="center"
+ label="搴忓彿"
+ type="index"
+ width="60" />
+ <el-table-column label="鍚堝悓绛捐鏃ユ湡"
+ prop="executionDate"
+ show-overflow-tooltip/>
+ <el-table-column label="閲囪喘鍚堝悓鍙�"
+ prop="purchaseContractNumber"
+ show-overflow-tooltip/>
+ <el-table-column label="椤圭洰鍚嶇О"
+ prop="projectName"
+ show-overflow-tooltip/>
+ <el-table-column label="鍚堝悓閲戦(鍏�)"
+ prop="contractAmount"
+ show-overflow-tooltip
+ :formatter="formattedNumber" />
+<!-- <el-table-column label="鏀惰揣鐘舵��"-->
+<!-- prop="status"-->
+<!-- show-overflow-tooltip-->
+<!-- width="100">-->
+<!-- <template #default="{ row }">-->
+<!-- <el-tag :type="getReceiptStatusType(row.status)" size="small">-->
+<!-- {{ receiptStatusText[row.status] || '鏈煡鐘舵��' }}-->
+<!-- </el-tag>-->
+<!-- </template>-->
+<!-- </el-table-column>-->
+ </el-table>
+ <pagination v-show="sonPage.total > 0"
+ @pagination="sonPaginationSearch"
+ :total="sonPage.total"
+ :layout="sonPage.layout"
+ :page="sonPage.current"
+ :limit="sonPage.size" />
</div>
</el-col>
</el-row>
@@ -90,12 +115,12 @@
</template>
<script setup>
- import { ref, toRefs } from "vue";
+ import { ref, toRefs, reactive, getCurrentInstance } from "vue";
import { Search } from "@element-plus/icons-vue";
import {
paymentLedgerList,
- paymentRecordList,
} from "@/api/procurementManagement/paymentLedger.js";
+ import { gePurchaseListPage } from "@/api/procurementManagement/invoiceEntry.js";
import Pagination from "../../../components/PIMTable/Pagination.vue";
const tableData = ref([]);
@@ -119,48 +144,13 @@
const isShowSummary = ref(true);
const { searchForm } = toRefs(data);
const currentSupplierId = ref("");
+ const selectedSupplierName = ref("");
const rowClick = row => {
currentSupplierId.value = row.supplierId;
+ selectedSupplierName.value = row.supplierName;
sonPage.current = 1;
- getPaymenRecordtList(row.supplierId);
+ getPurchaseList(row.supplierName);
};
- // 瀛愭ā鍧�
- const tableColumnSon = ref([
- {
- label: "鍚堝悓绛捐鏃ユ湡",
- prop: "executionDate",
- width: 110,
- },
- {
- label: "閲囪喘鍚堝悓鍙�",
- prop: "purchaseContractNumber",
- width: 150,
- },
- {
- label: "鍚堝悓閲戦(鍏�)",
- prop: "contractAmount",
- width: 200,
- formatData: params => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "浠樻閲戦(鍏�)",
- prop: "paymentAmount",
- width: 200,
- formatData: params => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "搴斾粯閲戦(鍏�)",
- dataType: "slot",
- width: 200,
- prop: "payableAmount",
- slot: "payableAmountSlot",
- },
- ]);
- const tableDataSon = ref([]);
const originalTableDataSon = ref([]);
const tableLoadingSon = ref(false);
const isShowSummarySon = ref(true);
@@ -170,32 +160,23 @@
const summarizeMainTable = param => {
return proxy.summarizeTable(
param,
- ["contractAmounts", "paymentAmount", "payableAmount"],
+ ["contractAmounts", "payableAmount"],
{
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+ ticketsNum: { noDecimal: true },
+ futureTickets: { noDecimal: true },
}
);
};
// 瀛愯〃鍚堣鏂规硶
const summarizeMainTable1 = param => {
- let summarizeTable = proxy.summarizeTable(
+ return proxy.summarizeTable(
param,
- ["contractAmount", "invoiceAmount", "paymentAmount"],
+ ["contractAmount"],
{
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+ ticketsNum: { noDecimal: true },
+ futureTickets: { noDecimal: true },
}
);
- if (originalTableDataSon.value.length > 0) {
- summarizeTable[summarizeTable.length - 1] =
- originalTableDataSon.value[
- originalTableDataSon.value.length - 1
- ].payableAmount.toFixed(2);
- } else {
- summarizeTable[summarizeTable.length - 1] = 0.0;
- }
- return summarizeTable;
};
/** 鎼滅储鎸夐挳鎿嶄綔 */
const handleQuery = () => {
@@ -219,16 +200,20 @@
total.value = result.total || 0;
if (tableData.value.length > 0) {
currentSupplierId.value = tableData.value[0].supplierId;
+ selectedSupplierName.value = tableData.value[0].supplierName;
sonPage.current = 1;
- getPaymenRecordtList(tableData.value[0].supplierId);
+ getPurchaseList(tableData.value[0].supplierName);
+ } else {
+ originalTableDataSon.value = [];
+ selectedSupplierName.value = "";
}
});
};
- const getPaymenRecordtList = supplierId => {
+ const getPurchaseList = supplierName => {
tableLoadingSon.value = true;
- paymentRecordList({
- supplierId: supplierId,
+ gePurchaseListPage({
+ supplierName: supplierName,
current: sonPage.current,
size: sonPage.size,
})
@@ -236,9 +221,8 @@
tableLoadingSon.value = false;
let result = res.data;
if (Array.isArray(result)) {
- tableDataSon.value = result;
+ originalTableDataSon.value = result;
sonPage.total = result.length;
- handlePagination({ page: sonPage.current, limit: sonPage.size });
} else {
originalTableDataSon.value = result.records || [];
sonPage.total = result.total || 0;
@@ -248,30 +232,37 @@
tableLoadingSon.value = false;
});
};
- const handlePagination = ({ page, limit }) => {
- console.log(page, limit);
- sonPage.current = page;
- sonPage.size = limit;
-
- const start = (page - 1) * limit;
- const end = start + limit;
-
- originalTableDataSon.value = tableDataSon.value.slice(start, end);
- };
const sonPaginationSearch = pagination => {
- // 鎺ユ敹鍒嗛〉鍣ㄥ弬鏁� { page, limit }
sonPage.current = pagination.page;
sonPage.size = pagination.limit;
- getPaymenRecordtList(currentSupplierId.value);
+ getPurchaseList(selectedSupplierName.value);
};
+
const formattedNumber = (row, column, cellValue) => {
- if (column.property !== "supplierName") {
+ if (cellValue !== undefined && cellValue !== null && !isNaN(cellValue)) {
return parseFloat(cellValue).toFixed(2);
- } else {
- return cellValue;
}
+ return "0.00";
};
+
+ // 鏀惰揣鐘舵�佹枃鏈槧灏�
+ const receiptStatusText = {
+ 1: '寰呮敹璐�',
+ 2: '鏀惰揣涓�',
+ 3: '宸叉敹璐�'
+ };
+
+ // 鏀惰揣鐘舵�佹爣绛剧被鍨�
+ const getReceiptStatusType = (status) => {
+ const typeMap = {
+ 1: 'info',
+ 2: 'warning',
+ 3: 'success'
+ };
+ return typeMap[status] || 'info';
+ };
+
getList();
</script>
@@ -291,4 +282,17 @@
.pagination-container {
margin-top: 0;
}
+
+ .table-header {
+ margin-bottom: 10px;
+ padding: 10px;
+ background-color: #f5f7fa;
+ border-radius: 4px;
+
+ .supplier-title {
+ font-weight: bold;
+ font-size: 14px;
+ color: #303133;
+ }
+ }
</style>
diff --git a/src/views/salesManagement/receiptPaymentLedger/components/ProductTable.vue b/src/views/salesManagement/receiptPaymentLedger/components/ProductTable.vue
new file mode 100644
index 0000000..999918d
--- /dev/null
+++ b/src/views/salesManagement/receiptPaymentLedger/components/ProductTable.vue
@@ -0,0 +1,229 @@
+<template>
+ <div class="product-table-container">
+ <el-table
+ :data="list"
+ v-loading="loading"
+ size="small"
+ border
+ class="custom-table"
+ :height="tableHeight"
+ >
+ <el-table-column label="鍚堝悓鍙�" prop="salesContractNo" width="160" show-overflow-tooltip>
+ <template #default="{ row }">
+ <span class="contract-no">{{ row.salesContractNo || '--' }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="浜у搧鍚嶇О" prop="productName" min-width="180" show-overflow-tooltip />
+ <el-table-column label="瑙勬牸鍨嬪彿" prop="model" width="140" show-overflow-tooltip>
+ <template #default="{ row }">
+ <span class="model-text">{{ row.model || '--' }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍗曚綅" prop="unit" width="80" align="center" />
+ <el-table-column label="鍚堝悓鏁伴噺" prop="contractQuantity" align="right" width="100">
+ <template #default="{ row }">
+ <span class="quantity">{{ formatNumber(row.contractQuantity) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍚堝悓鍗曚环" prop="taxInclusiveUnitPrice" align="right" width="110">
+ <template #default="{ row }">
+ <span class="price">楼{{ formatMoney(row.taxInclusiveUnitPrice) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍚堝悓閲戦" prop="contractAmount" align="right" width="130">
+ <template #default="{ row }">
+ <span class="amount">楼{{ formatMoney(row.contractAmount) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="宸插彂璐ф暟閲�" prop="shippedQuantity" align="right" width="100">
+ <template #default="{ row }">
+ <span class="shipped-qty">{{ formatNumber(row.shippedQuantity) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="宸插彂璐ч噾棰�" prop="shippedAmount" align="right" width="130">
+ <template #default="{ row }">
+ <span class="shipped-amt">楼{{ formatMoney(row.shippedAmount) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍙戣揣杩涘害" width="180" align="center">
+ <template #default="{ row }">
+ <div class="progress-cell">
+ <el-progress
+ :percentage="calcPercent(row.shippedQuantity, row.contractQuantity)"
+ :stroke-width="8"
+ :show-text="false"
+ :color="getProgressColor(calcPercent(row.shippedQuantity, row.contractQuantity))"
+ />
+ <span class="progress-text">{{ calcPercent(row.shippedQuantity, row.contractQuantity) }}%</span>
+ </div>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <div class="pagination-wrapper">
+ <pagination
+ v-show="total > 0"
+ :total="total"
+ :page="queryParams.pageNum"
+ :limit="queryParams.pageSize"
+ @pagination="handlePagination"
+ />
+ </div>
+ </div>
+</template>
+
+<script setup>
+import { ref, watch, computed } from 'vue'
+import { customerTransactionsProducts } from '@/api/salesManagement/indicatorStats.js'
+import Pagination from '@/components/PIMTable/Pagination.vue'
+
+const props = defineProps({
+ customerId: {
+ type: [Number, String],
+ required: true
+ }
+})
+
+const loading = ref(false)
+const list = ref([])
+const total = ref(0)
+const queryParams = ref({
+ pageNum: 1,
+ pageSize: 10,
+ customerId: null
+})
+
+const tableHeight = computed(() => `calc(100vh - 32em)`)
+
+const getList = () => {
+ loading.value = true
+ queryParams.value.customerId = props.customerId
+ customerTransactionsProducts(queryParams.value)
+ .then(res => {
+ if (res.code === 200) {
+ list.value = res.data?.records || []
+ total.value = res.data?.total || 0
+ }
+ })
+ .finally(() => {
+ loading.value = false
+ })
+}
+
+const handlePagination = ({ page, limit }) => {
+ queryParams.value.pageNum = page
+ queryParams.value.pageSize = limit
+ getList()
+}
+
+const formatMoney = (value) => {
+ if (!value) return '0.00'
+ return Number(value).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })
+}
+
+const formatNumber = (value) => {
+ if (!value) return '0'
+ return Number(value).toLocaleString('zh-CN')
+}
+
+const calcPercent = (shipped, total) => {
+ if (!total || total === 0) return 0
+ return Math.min(100, Math.round((shipped / total) * 100))
+}
+
+const getProgressColor = (percent) => {
+ if (percent < 30) return '#f56c6c'
+ if (percent < 60) return '#e6a23c'
+ if (percent < 80) return '#409eff'
+ return '#67c23a'
+}
+
+watch(() => props.customerId, (val) => {
+ if (val) {
+ queryParams.value.pageNum = 1
+ getList()
+ }
+}, { immediate: true })
+</script>
+
+<style scoped lang="scss">
+.product-table-container {
+ .custom-table {
+ border-radius: 8px;
+ overflow: hidden;
+
+ :deep(.el-table__header-wrapper) {
+ th {
+ background: #f8f9fb !important;
+ font-weight: 600;
+ color: #303133;
+ }
+ }
+
+ :deep(.el-table__row) {
+ transition: all 0.2s;
+
+ &:hover > td {
+ background: #f5f7fa !important;
+ }
+ }
+
+ .contract-no {
+ color: #409eff;
+ font-weight: 500;
+ }
+
+ .model-text {
+ color: #606266;
+ }
+
+ .quantity {
+ font-weight: 500;
+ color: #303133;
+ }
+
+ .price {
+ color: #606266;
+ }
+
+ .amount {
+ font-weight: 600;
+ color: #303133;
+ }
+
+ .shipped-qty {
+ color: #67c23a;
+ font-weight: 500;
+ }
+
+ .shipped-amt {
+ color: #67c23a;
+ font-weight: 500;
+ }
+
+ .progress-cell {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 0 10px;
+
+ .el-progress {
+ flex: 1;
+ }
+
+ .progress-text {
+ font-size: 12px;
+ color: #606266;
+ min-width: 32px;
+ text-align: right;
+ }
+ }
+ }
+}
+
+.pagination-wrapper {
+ padding: 16px 0 0;
+ display: flex;
+ justify-content: flex-end;
+}
+</style>
diff --git a/src/views/salesManagement/receiptPaymentLedger/components/ShipmentTable.vue b/src/views/salesManagement/receiptPaymentLedger/components/ShipmentTable.vue
new file mode 100644
index 0000000..68e88a6
--- /dev/null
+++ b/src/views/salesManagement/receiptPaymentLedger/components/ShipmentTable.vue
@@ -0,0 +1,197 @@
+<template>
+ <div class="shipment-table-container">
+ <el-table
+ :data="list"
+ v-loading="loading"
+ size="small"
+ border
+ class="custom-table"
+ :height="tableHeight"
+ >
+ <el-table-column label="鍚堝悓鍙�" prop="salesContractNo" width="160" show-overflow-tooltip>
+ <template #default="{ row }">
+ <span class="contract-no">{{ row.salesContractNo || '--' }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍙戣揣鍗曞彿" prop="shippingNo" width="160" show-overflow-tooltip>
+ <template #default="{ row }">
+ <span class="shipping-no">{{ row.shippingNo || '--' }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="浜у搧鍚嶇О" prop="productName" min-width="160" show-overflow-tooltip />
+ <el-table-column label="瑙勬牸鍨嬪彿" prop="model" width="140" show-overflow-tooltip>
+ <template #default="{ row }">
+ <span class="model-text">{{ row.model || '--' }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍙戣揣鏁伴噺" prop="shippingQuantity" align="right" width="100">
+ <template #default="{ row }">
+ <span class="quantity">{{ formatNumber(row.shippingQuantity) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍙戣揣閲戦" prop="shippingAmount" align="right" width="130">
+ <template #default="{ row }">
+ <span class="amount">楼{{ formatMoney(row.shippingAmount) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍑哄簱鎵瑰彿" prop="batchNo" width="160" show-overflow-tooltip>
+ <template #default="{ row }">
+ <span class="batch-no">{{ row.batchNo || '--' }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍙戣揣鏃ユ湡" prop="shippingDate" width="120" align="center">
+ <template #default="{ row }">
+ <span class="date-text">{{ row.shippingDate || '--' }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="瀹℃壒鐘舵��" prop="approvalStatus" width="100" align="center">
+ <template #default="{ row }">
+ <el-tag
+ :type="row.approvalStatus === 1 ? 'success' : 'warning'"
+ size="small"
+ effect="light"
+ round
+ >
+ {{ row.approvalStatus === 1 ? '宸插' : '寰呭' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <div class="pagination-wrapper">
+ <pagination
+ v-show="total > 0"
+ :total="total"
+ :page="queryParams.pageNum"
+ :limit="queryParams.pageSize"
+ @pagination="handlePagination"
+ />
+ </div>
+ </div>
+</template>
+
+<script setup>
+import { ref, watch, computed } from 'vue'
+import { customerTransactionsShipments } from '@/api/salesManagement/indicatorStats.js'
+import Pagination from '@/components/PIMTable/Pagination.vue'
+
+const props = defineProps({
+ customerId: {
+ type: [Number, String],
+ required: true
+ }
+})
+
+const loading = ref(false)
+const list = ref([])
+const total = ref(0)
+const queryParams = ref({
+ pageNum: 1,
+ pageSize: 10,
+ customerId: null
+})
+
+const tableHeight = computed(() => `calc(100vh - 32em)`)
+
+const getList = () => {
+ loading.value = true
+ queryParams.value.customerId = props.customerId
+ customerTransactionsShipments(queryParams.value)
+ .then(res => {
+ if (res.code === 200) {
+ list.value = res.data?.records || []
+ total.value = res.data?.total || 0
+ }
+ })
+ .finally(() => {
+ loading.value = false
+ })
+}
+
+const handlePagination = ({ page, limit }) => {
+ queryParams.value.pageNum = page
+ queryParams.value.pageSize = limit
+ getList()
+}
+
+const formatMoney = (value) => {
+ if (!value) return '0.00'
+ return Number(value).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })
+}
+
+const formatNumber = (value) => {
+ if (!value) return '0'
+ return Number(value).toLocaleString('zh-CN')
+}
+
+watch(() => props.customerId, (val) => {
+ if (val) {
+ queryParams.value.pageNum = 1
+ getList()
+ }
+}, { immediate: true })
+</script>
+
+<style scoped lang="scss">
+.shipment-table-container {
+ .custom-table {
+ border-radius: 8px;
+ overflow: hidden;
+
+ :deep(.el-table__header-wrapper) {
+ th {
+ background: #f8f9fb !important;
+ font-weight: 600;
+ color: #303133;
+ }
+ }
+
+ :deep(.el-table__row) {
+ transition: all 0.2s;
+
+ &:hover > td {
+ background: #f5f7fa !important;
+ }
+ }
+
+ .contract-no {
+ color: #409eff;
+ font-weight: 500;
+ }
+
+ .shipping-no {
+ color: #909399;
+ font-size: 12px;
+ }
+
+ .model-text {
+ color: #606266;
+ }
+
+ .quantity {
+ font-weight: 500;
+ color: #303133;
+ }
+
+ .amount {
+ font-weight: 600;
+ color: #67c23a;
+ }
+
+ .batch-no {
+ color: #606266;
+ font-size: 12px;
+ }
+
+ .date-text {
+ color: #606266;
+ }
+ }
+}
+
+.pagination-wrapper {
+ padding: 16px 0 0;
+ display: flex;
+ justify-content: flex-end;
+}
+</style>
diff --git a/src/views/salesManagement/receiptPaymentLedger/detail.vue b/src/views/salesManagement/receiptPaymentLedger/detail.vue
new file mode 100644
index 0000000..4d8ae4e
--- /dev/null
+++ b/src/views/salesManagement/receiptPaymentLedger/detail.vue
@@ -0,0 +1,387 @@
+<template>
+ <div class="customer-detail-page">
+ <!-- 椤堕儴瀵艰埅鏍� -->
+ <div class="page-header">
+ <div class="header-left">
+ <el-button @click="goBack" :icon="ArrowLeft" circle />
+ <div class="customer-info">
+ <span class="customer-name">{{ summary.customerName || '瀹㈡埛寰�鏉ヨ鎯�' }}</span>
+ <span class="customer-tag">瀹㈡埛寰�鏉ョ粺璁�</span>
+ </div>
+ </div>
+ </div>
+
+ <!-- 缁熻鍗$墖鍖� -->
+ <div class="stats-section" v-loading="summaryLoading">
+ <div class="stats-grid">
+ <div class="stat-card primary">
+ <div class="stat-icon">
+ <el-icon><Document /></el-icon>
+ </div>
+ <div class="stat-content">
+ <div class="stat-label">鍚堝悓鎬婚噾棰�</div>
+ <div class="stat-value">
+ <span class="currency">楼</span>
+ <span class="number">{{ formatMoney(summary.contractAmounts) }}</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="stat-card success">
+ <div class="stat-icon">
+ <el-icon><Tickets /></el-icon>
+ </div>
+ <div class="stat-content">
+ <div class="stat-label">鍚堝悓鏁伴噺</div>
+ <div class="stat-value">
+ <span class="number">{{ summary.contractCount || 0 }}</span>
+ <span class="unit">浠�</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="stat-card info">
+ <div class="stat-icon">
+ <el-icon><Van /></el-icon>
+ </div>
+ <div class="stat-content">
+ <div class="stat-label">鍙戣揣閲戦</div>
+ <div class="stat-value">
+ <span class="currency">楼</span>
+ <span class="number">{{ formatMoney(summary.shippedAmounts) }}</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="stat-card danger">
+ <div class="stat-icon">
+ <el-icon><Clock /></el-icon>
+ </div>
+ <div class="stat-content">
+ <div class="stat-label">鏈彂璐ч噾棰�</div>
+ <div class="stat-value">
+ <span class="currency">楼</span>
+ <span class="number">{{ formatMoney(summary.unshippedAmounts) }}</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="stat-card progress-card">
+ <div class="stat-content-full">
+ <div class="progress-header">
+ <span class="stat-label">鍙戣揣杩涘害</span>
+ <span class="progress-value">{{ summary.shippedRate || 0 }}%</span>
+ </div>
+ <el-progress
+ :percentage="summary.shippedRate || 0"
+ :stroke-width="12"
+ :show-text="false"
+ :color="getProgressColor(summary.shippedRate)"
+ />
+ <div class="progress-footer">
+ <span>宸插彂璐�: 楼{{ formatMoney(summary.shippedAmounts) }}</span>
+ <span>鎬婚: 楼{{ formatMoney(summary.contractAmounts) }}</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <!-- Tab 鍒囨崲 -->
+ <div class="table-section">
+ <el-tabs v-model="activeTab" class="custom-tabs">
+ <el-tab-pane label="浜у搧鏄庣粏" name="products">
+ <ProductTable :customerId="customerId" v-if="customerId && activeTab === 'products'" />
+ </el-tab-pane>
+ <!-- <el-tab-pane label="鍙戣揣鏄庣粏" name="shipments">
+ <ShipmentTable :customerId="customerId" v-if="customerId && activeTab === 'shipments'" />
+ </el-tab-pane> -->
+ </el-tabs>
+ </div>
+ </div>
+</template>
+
+<script setup>
+import { ref, onMounted } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import { ArrowLeft, Document, Tickets, Van, Clock } from '@element-plus/icons-vue'
+import { customerTransactionsSummary } from '@/api/salesManagement/indicatorStats.js'
+import ProductTable from './components/ProductTable.vue'
+// import ShipmentTable from './components/ShipmentTable.vue'
+
+const route = useRoute()
+const router = useRouter()
+
+const customerId = ref(null)
+const summary = ref({})
+const summaryLoading = ref(false)
+const activeTab = ref('products')
+
+const getSummary = () => {
+ if (!customerId.value) return
+ summaryLoading.value = true
+ customerTransactionsSummary({ customerId: customerId.value })
+ .then(res => {
+ if (res.code === 200) {
+ summary.value = res.data || {}
+ }
+ })
+ .finally(() => {
+ summaryLoading.value = false
+ })
+}
+
+const formatMoney = (value) => {
+ if (!value) return '0.00'
+ return Number(value).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })
+}
+
+const getProgressColor = (rate) => {
+ if (!rate || rate < 30) return '#f56c6c'
+ if (rate < 60) return '#e6a23c'
+ if (rate < 80) return '#409eff'
+ return '#67c23a'
+}
+
+const goBack = () => {
+ router.push('/salesManagement/receiptPaymentLedger')
+}
+
+onMounted(() => {
+ customerId.value = route.query.customerId
+ if (customerId.value) {
+ getSummary()
+ }
+})
+</script>
+
+<style scoped lang="scss">
+.customer-detail-page {
+ background: #f5f7fa;
+ min-height: calc(100vh - 84px);
+ padding: 20px;
+}
+
+.page-header {
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ border-radius: 12px;
+ padding: 20px 24px;
+ margin-bottom: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
+
+ .header-left {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+
+ .el-button {
+ background: rgba(255, 255, 255, 0.2);
+ border: none;
+ color: white;
+
+ &:hover {
+ background: rgba(255, 255, 255, 0.3);
+ }
+ }
+
+ .customer-info {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+
+ .customer-name {
+ font-size: 20px;
+ font-weight: 600;
+ color: white;
+ }
+
+ .customer-tag {
+ font-size: 12px;
+ color: rgba(255, 255, 255, 0.8);
+ background: rgba(255, 255, 255, 0.2);
+ padding: 2px 10px;
+ border-radius: 10px;
+ width: fit-content;
+ }
+ }
+ }
+}
+
+.stats-section {
+ margin-bottom: 20px;
+}
+
+.stats-grid {
+ display: grid;
+ grid-template-columns: repeat(5, 1fr);
+ gap: 16px;
+
+ @media (max-width: 1400px) {
+ grid-template-columns: repeat(3, 1fr);
+ }
+
+ @media (max-width: 1000px) {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+.stat-card {
+ background: white;
+ border-radius: 12px;
+ padding: 20px;
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
+ transition: all 0.3s ease;
+ position: relative;
+ overflow: hidden;
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 4px;
+ height: 100%;
+ }
+
+ &:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
+ }
+
+ &.primary::before { background: linear-gradient(180deg, #667eea, #764ba2); }
+ &.success::before { background: linear-gradient(180deg, #67c23a, #4a9c2d); }
+ &.warning::before { background: linear-gradient(180deg, #e6a23c, #c78a2f); }
+ &.info::before { background: linear-gradient(180deg, #409eff, #2d7dd2); }
+ &.danger::before { background: linear-gradient(180deg, #f56c6c, #c45656); }
+ &.progress-card::before { background: linear-gradient(180deg, #909399, #606266); }
+
+ .stat-icon {
+ width: 52px;
+ height: 52px;
+ border-radius: 12px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 24px;
+ flex-shrink: 0;
+ }
+
+ &.primary .stat-icon { background: linear-gradient(135deg, rgba(102, 126, 234, 0.15), rgba(118, 75, 162, 0.15)); color: #667eea; }
+ &.success .stat-icon { background: linear-gradient(135deg, rgba(103, 194, 58, 0.15), rgba(74, 156, 45, 0.15)); color: #67c23a; }
+ &.warning .stat-icon { background: linear-gradient(135deg, rgba(230, 162, 60, 0.15), rgba(199, 138, 47, 0.15)); color: #e6a23c; }
+ &.info .stat-icon { background: linear-gradient(135deg, rgba(64, 158, 255, 0.15), rgba(45, 125, 210, 0.15)); color: #409eff; }
+ &.danger .stat-icon { background: linear-gradient(135deg, rgba(245, 108, 108, 0.15), rgba(196, 86, 86, 0.15)); color: #f56c6c; }
+ &.progress-card .stat-icon { display: none; }
+
+ .stat-content {
+ flex: 1;
+ min-width: 0;
+ }
+
+ .stat-label {
+ font-size: 13px;
+ color: #909399;
+ margin-bottom: 6px;
+ }
+
+ .stat-value {
+ .currency {
+ font-size: 14px;
+ color: #606266;
+ margin-right: 2px;
+ }
+
+ .number {
+ font-size: 22px;
+ font-weight: 600;
+ color: #303133;
+ }
+
+ .unit {
+ font-size: 14px;
+ color: #909399;
+ margin-left: 4px;
+ }
+ }
+
+ &.progress-card {
+ grid-column: span 1;
+
+ @media (max-width: 1600px) {
+ grid-column: span 1;
+ }
+
+ .stat-content-full {
+ width: 100%;
+ }
+
+ .progress-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+
+ .stat-label {
+ margin-bottom: 0;
+ }
+
+ .progress-value {
+ font-size: 18px;
+ font-weight: 600;
+ color: #303133;
+ }
+ }
+
+ .progress-footer {
+ display: flex;
+ justify-content: space-between;
+ margin-top: 10px;
+ font-size: 12px;
+ color: #909399;
+ }
+ }
+}
+
+.table-section {
+ background: white;
+ border-radius: 12px;
+ padding: 20px;
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
+
+ .custom-tabs {
+ :deep(.el-tabs__header) {
+ margin-bottom: 0;
+
+ .el-tabs__nav-wrap::after {
+ height: 1px;
+ }
+
+ .el-tabs__item {
+ font-size: 15px;
+ padding: 0 24px;
+ height: 44px;
+ line-height: 44px;
+
+ &.is-active {
+ font-weight: 600;
+ }
+ }
+
+ .el-tabs__active-bar {
+ height: 3px;
+ border-radius: 2px;
+ }
+ }
+
+ :deep(.el-tabs__content) {
+ padding-top: 20px;
+ }
+ }
+}
+</style>
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index f5a9d8f..ec81d9a 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -16,7 +16,8 @@
</div>
</div>
<el-row :gutter="20">
- <el-col :span="12">
+ <!-- 宸︿晶瀹㈡埛鍒楄〃 -->
+ <el-col :span="8">
<div class="table_list"
style="width: 100%">
<el-table :data="tableData"
@@ -40,22 +41,37 @@
prop="contractAmounts"
show-overflow-tooltip
:formatter="formattedNumber"
- width="200" />
- <el-table-column label="鍥炴閲戦(鍏�)"
+ width="150" />
+ <el-table-column label="鏀舵閲戦(鍏�)"
prop="receiptPaymentAmount"
show-overflow-tooltip
:formatter="formattedNumber"
- width="200" />
+ width="150" />
<el-table-column label="搴旀敹閲戦(鍏�)"
prop="receiptableAmount"
show-overflow-tooltip
- width="200">
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.receiptableAmount) }}
- </el-text>
+ width="150">
+ <template #default="{ row }">
+ <span :style="{ color: row.receiptableAmount > 0 ? '#f56c6c' : '#606266' }">
+ {{ formattedNumber(null, null, row.receiptableAmount) }}
+ </span>
</template>
</el-table-column>
+ <el-table-column label="鎿嶄綔" width="100" align="center" fixed="right">
+ <template #default="{ row }">
+ <el-button type="primary" link size="small" @click="viewDetail(row)">鏌ョ湅鏄庣粏</el-button>
+ </template>
+ </el-table-column>
+<!-- <el-table-column label="搴旀敹閲戦(鍏�)"-->
+<!-- prop="receiptableAmount"-->
+<!-- show-overflow-tooltip-->
+<!-- width="150">-->
+<!-- <template #default="{ row, column }">-->
+<!-- <el-text type="danger">-->
+<!-- {{ formattedNumber(row, column, row.receiptableAmount) }}-->
+<!-- </el-text>-->
+<!-- </template>-->
+<!-- </el-table-column>-->
</el-table>
<pagination v-show="total > 0"
:total="total"
@@ -65,81 +81,113 @@
@pagination="paginationChange" />
</div>
</el-col>
- <el-col :span="12">
+ <!-- 鍙充晶璁㈠崟淇℃伅 -->
+ <el-col :span="16">
<div class="table_list"
style="width: 100%">
- <el-table :data="receiptRecord"
+
+ <el-table :data="orderRecord"
border
:row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable1"
- height="calc(100vh - 18.5em)">
+ v-loading="orderLoading"
+ height="calc(100vh - 20em)">
<el-table-column align="center"
label="搴忓彿"
type="index"
width="60" />
- <el-table-column label="鍚堝悓绛捐鏃ユ湡"
- prop="executionDate"
- show-overflow-tooltip
- width="110" />
- <el-table-column label="閿�鍞悎鍚屽彿"
+ <el-table-column label="閿�鍞鍗�"
prop="salesContractNo"
show-overflow-tooltip
- width="200" />
- <el-table-column label="鍚堝悓閲戦(鍏�)"
- prop="contractAmount"
+ width="150" />
+ <!-- <el-table-column label="鍙戣揣璁㈠崟鍙�"
+ prop="shippingNo"
show-overflow-tooltip
- :formatter="formattedNumber"
- width="200" />
- <el-table-column label="鍥炴閲戦(鍏�)"
- prop="receiptPaymentAmount"
+ width="150" /> -->
+ <el-table-column label="瀹㈡埛鍚嶇О"
+ prop="customerName"
show-overflow-tooltip
- :formatter="formattedNumber"
- width="200" />
- <el-table-column label="搴旀敹閲戦(鍏�)"
- prop="receiptableAmount"
+ width="150" />
+ <el-table-column label="浜у搧鍚嶇О"
+ prop="productName"
show-overflow-tooltip
- width="200">
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.receiptableAmount) }}
- </el-text>
+ width="150" />
+ <el-table-column label="瑙勬牸鍨嬪彿"
+ prop="specificationModel"
+ show-overflow-tooltip
+ width="120" />
+ <el-table-column label="鍙戣揣鏃堕棿"
+ prop="shippingDate"
+ show-overflow-tooltip
+ width="110" />
+ <el-table-column label="鍙戣揣鏁伴噺"
+ prop="totalQuantity"
+ show-overflow-tooltip
+ width="100" />
+ <!-- <el-table-column label="鍙戣揣杞︾墝鍙�"
+ prop="shippingCarNumber"
+ show-overflow-tooltip
+ width="120" />
+ <el-table-column label="蹇�掑叕鍙�"
+ prop="expressCompany"
+ show-overflow-tooltip
+ width="120" />
+ <el-table-column label="蹇�掑崟鍙�"
+ prop="expressNumber"
+ show-overflow-tooltip
+ width="150" /> -->
+ <el-table-column label="鍙戣揣鐘舵��"
+ prop="status"
+ align="center"
+ width="100">
+ <template #default="{ row }">
+ <el-tag :type="getApprovalStatusType(row.status)">
+ {{ getApprovalStatusText(row.status) }}
+ </el-tag>
</template>
</el-table-column>
+ <el-table-column label="鍑哄簱鍗曞彿"
+ prop="outboundBatches"
+ show-overflow-tooltip
+ width="130" />
</el-table>
- <pagination v-show="recordTotal > 0"
- :total="recordTotal"
+ <pagination v-show="orderTotal > 0"
+ :total="orderTotal"
layout="total, sizes, prev, pager, next, jumper"
- :page="recordPage.current"
- :limit="recordPage.size"
- @pagination="recordPaginationChange" />
+ :page="orderPage.current"
+ :limit="orderPage.size"
+ @pagination="orderPaginationChange" />
</div>
</el-col>
</el-row>
+
</div>
</template>
<script setup>
import { onMounted, ref, reactive, toRefs, getCurrentInstance } from "vue";
+ import { useRouter } from "vue-router";
import {
customewTransactions,
- customewTransactionsDetails,
} from "@/api/salesManagement/indicatorStats.js";
+ import { deliveryLedgerListPage } from "@/api/salesManagement/deliveryLedger.js";
import Pagination from "../../../components/PIMTable/Pagination.vue";
+
const { proxy } = getCurrentInstance();
+ const router = useRouter();
const tableData = ref([]);
- const receiptRecord = ref([]);
+ const orderRecord = ref([]);
const tableLoading = ref(false);
+ const orderLoading = ref(false);
const page = reactive({
current: 1,
size: 100,
});
- const recordPage = reactive({
+ const orderPage = reactive({
current: 1,
size: 100,
});
const total = ref(0);
- const recordTotal = ref(0);
+ const orderTotal = ref(0);
const data = reactive({
searchForm: {
searchText: "",
@@ -148,7 +196,7 @@
});
const customerId = ref("");
const { searchForm } = toRefs(data);
- const originReceiptRecord = ref([]);
+
// 鏌ヨ鍒楄〃
/** 鎼滅储鎸夐挳鎿嶄綔 */
const handleQuery = () => {
@@ -167,9 +215,12 @@
tableData.value = res.data.records;
total.value = res.data.total;
if (tableData.value.length > 0) {
- recordPage.current = 1;
+ orderPage.current = 1;
customerId.value = tableData.value[0].customerId;
- receiptPaymentList(customerId.value);
+ getOrderList(customerId.value);
+ } else {
+ orderRecord.value = [];
+ customerId.value = "";
}
});
};
@@ -180,64 +231,90 @@
const summarizeMainTable = param => {
return proxy.summarizeTable(
param,
- ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"],
+ ["contractAmounts", "receiptableAmount"],
{
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+ ticketsNum: { noDecimal: true },
+ futureTickets: { noDecimal: true },
}
);
};
- // 瀛愯〃鍚堣鏂规硶
- const summarizeMainTable1 = param => {
- var summarizeTable = proxy.summarizeTable(
- param,
- ["contractAmount", "receiptPaymentAmount", "receiptableAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+
+ // 鑾峰彇璁㈠崟鍒楄〃锛堟牴鎹鎴稩D鏌ヨ鍙戣揣鍙拌处锛�
+ const getOrderList = async (id) => {
+ orderLoading.value = true;
+ try {
+ // 浣跨敤 deliveryLedgerListPage 鎺ュ彛鏍规嵁 customerId 鏌ヨ
+ const res = await deliveryLedgerListPage({
+ customerId: id,
+ current: 1,
+ size: 1000,
+ });
+ let orders = [];
+ if (res.data) {
+ if (Array.isArray(res.data)) {
+ orders = res.data;
+ } else if (res.data.records && Array.isArray(res.data.records)) {
+ orders = res.data.records;
+ }
}
- );
- return summarizeTable;
+
+ orderTotal.value = orders.length;
+ handleOrderPagination({ page: orderPage.current, limit: orderPage.size }, orders);
+ } catch (error) {
+ console.error('鑾峰彇璁㈠崟鍒楄〃澶辫触:', error);
+ orderRecord.value = [];
+ } finally {
+ orderLoading.value = false;
+ }
};
- const receiptPaymentList = id => {
- const param = {
- customerId: id,
- current: recordPage.current,
- size: recordPage.size,
- };
- customewTransactionsDetails(param).then(res => {
- if (Array.isArray(res.data)) {
- originReceiptRecord.value = res.data;
- recordTotal.value = res.data.length;
- handlePagination({ page: 1, limit: recordPage.size });
- } else {
- receiptRecord.value = res.data.records;
- recordTotal.value = res.data.total;
- }
- });
+ // 璁㈠崟鍒楄〃鍒嗛〉
+ const orderPaginationChange = pagination => {
+ orderPage.current = pagination.page;
+ orderPage.size = pagination.limit;
+ getOrderList(customerId.value);
};
- // 姹囨璁板綍鍒楄〃鍒嗛〉
- const recordPaginationChange = pagination => {
- recordPage.current = pagination.page;
- recordPage.size = pagination.limit;
- receiptPaymentList(customerId.value);
+ const handleOrderPagination = ({ page, limit }, allOrders) => {
+ const start = (page - 1) * limit;
+ const end = start + limit;
+ orderRecord.value = allOrders.slice(start, end);
};
const rowClickMethod = row => {
customerId.value = row.customerId;
- receiptPaymentList(customerId.value);
+ orderPage.current = 1;
+ getOrderList(customerId.value);
};
- const handlePagination = ({ page, limit }) => {
- recordPage.current = page;
- recordPage.size = limit;
+ // 鏌ョ湅鏄庣粏
+ const viewDetail = (row) => {
+ router.push({
+ path: '/customer-transactions-detail',
+ query: { customerId: row.customerId }
+ });
+ };
- const start = (page - 1) * limit;
- const end = start + limit;
+ // 瀹℃牳鐘舵�佹爣绛剧被鍨�
+ const getApprovalStatusType = (status) => {
+ const statusMap = {
+ '宸插彂璐�': 'success',
+ '瀹℃牳閫氳繃': 'success',
+ '瀹℃牳涓�': 'warning',
+ '瀹℃牳涓嶉�氳繃': 'danger',
+ };
+ return statusMap[status] || 'info';
+ };
- receiptRecord.value = originReceiptRecord.value.slice(start, end);
+ // 瀹℃牳鐘舵�佹枃鏈�
+ const getApprovalStatusText = (status) => {
+ const statusMap = {
+ '宸插彂璐�': '宸插彂璐�',
+ '瀹℃牳閫氳繃': '瀹℃牳閫氳繃',
+ '瀹℃牳涓�': '瀹℃牳涓�',
+ '瀹℃牳涓嶉�氳繃': '瀹℃牳涓嶉�氳繃',
+ };
+ return statusMap[status] || status || '--';
};
onMounted(() => {
@@ -247,6 +324,7 @@
<style scoped lang="scss">
.table_list {
- width: 50%;
+ width: 100%;
}
+
</style>
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 2e58391..1602083 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -2720,9 +2720,9 @@
);
deliveryForm.value = {
shippingCarNumber: "",
- expressCompany: "",
+ expressCompany: "椤轰赴蹇��",
expressNumber: "",
- type: "璐ц溅",
+ type: "蹇��",
batchNo: [],
batchNoList,
};
--
Gitblit v1.9.3