From 9f5780cecfa5009eda3b3babd864ef29057da80d Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 21 八月 2025 10:47:15 +0800
Subject: [PATCH] 1.回款流水开发联调 2.客户往来开发联调

---
 src/pages/index.vue                             |   10 
 src/pages.json                                  |   21 +
 src/pages/sales/receiptPaymentLedger/detail.vue |  297 +++++++++++++++++
 src/pages/sales/receiptPaymentHistory/index.vue |  378 ++++++++++++++++++++++
 src/pages/sales/receiptPaymentLedger/index.vue  |  307 ++++++++++++++++++
 5 files changed, 1,013 insertions(+), 0 deletions(-)

diff --git a/src/pages.json b/src/pages.json
index 361e6d9..e6f1d82 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -120,6 +120,27 @@
       }
     },
     {
+      "path": "pages/sales/receiptPaymentHistory/index",
+      "style": {
+        "navigationBarTitleText": "鍥炴娴佹按",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/sales/receiptPaymentLedger/index",
+      "style": {
+        "navigationBarTitleText": "瀹㈡埛寰�鏉�",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/sales/receiptPaymentLedger/detail",
+      "style": {
+        "navigationBarTitleText": "瀹㈡埛寰�鏉ヨ鎯�",
+        "navigationStyle": "custom"
+      }
+    },
+    {
       "path": "pages/common/webview/index",
       "style": {
         "navigationBarTitleText": "娴忚缃戦〉"
diff --git a/src/pages/index.vue b/src/pages/index.vue
index c9f1609..f435335 100644
--- a/src/pages/index.vue
+++ b/src/pages/index.vue
@@ -308,6 +308,16 @@
 				url: '/pages/sales/receiptPayment/index'
 			});
 			break;
+		case '鍥炴娴佹按':
+			uni.navigateTo({
+				url: '/pages/sales/receiptPaymentHistory/index'
+			});
+			break;
+		case '瀹㈡埛寰�鏉�':
+			uni.navigateTo({
+				url: '/pages/sales/receiptPaymentLedger/index'
+			});
+			break;
 		case '鍗忓悓瀹℃壒':
 			uni.navigateTo({
 				url: '/pages/cooperativeOffice/collaborativeApproval/index'
diff --git a/src/pages/sales/receiptPaymentHistory/index.vue b/src/pages/sales/receiptPaymentHistory/index.vue
new file mode 100644
index 0000000..e2be722
--- /dev/null
+++ b/src/pages/sales/receiptPaymentHistory/index.vue
@@ -0,0 +1,378 @@
+<template>
+	<view class="receipt-payment-history">
+		<!-- 椤甸潰澶撮儴 -->
+		<van-nav-bar
+			title="鍥炴鍘嗗彶"
+			left-text="杩斿洖"
+			left-arrow
+			@click-left="goBack"
+			fixed
+			placeholder
+		/>
+		
+		<!-- 鎼滅储鍖哄煙 -->
+		<view class="search-section">
+			<view class="search-bar">
+				<view class="search-input">
+					<input
+						class="search-text"
+						placeholder="璇疯緭鍏ュ鎴峰悕绉�/瀹㈡埛鍚堝悓鍙�"
+						v-model="searchForm.searchText"
+						@input="getList"
+					/>
+				</view>
+				<view class="search-button" @click="getList">
+					<up-icon name="search" size="24" color="#999"></up-icon>
+				</view>
+			</view>
+		</view>
+		<!-- 缁熻淇℃伅 -->
+		<view class="summary-info" v-if="tableData.length > 0">
+			<view class="summary-item">
+				<text class="summary-label">鎬昏褰曟暟</text>
+				<text class="summary-value">{{ tableData.length }}</text>
+			</view>
+			<view class="summary-item">
+				<text class="summary-label">鎬婚噾棰�</text>
+				<text class="summary-value highlight">{{ formatAmount(totalAmount) }}</text>
+			</view>
+		</view>
+		<!-- 鍥炴鍘嗗彶鍒楄〃 -->
+		<view class="history-list" v-if="tableData.length > 0">
+			<view v-for="(item, index) in tableData" :key="index">
+				<view class="history-item">
+					<view class="item-header">
+						<view class="item-left">
+							<view class="document-icon">
+								<up-icon name="file-text" size="16" color="#ffffff"></up-icon>
+							</view>
+							<text class="item-id">{{ item.salesContractNo }}</text>
+						</view>
+						<view class="item-tag" :class="getTagClass(item.receiptPaymentType)">
+							<text class="tag-text">{{ formatReceiptType(item.receiptPaymentType) }}</text>
+						</view>
+					</view>
+					<up-divider></up-divider>
+					<view class="item-details">
+						<view class="detail-row">
+							<text class="detail-label">瀹㈡埛鍚堝悓鍙�</text>
+							<text class="detail-value">{{ item.customerContractNo }}</text>
+						</view>
+						<view class="detail-row">
+							<text class="detail-label">瀹㈡埛鍚嶇О</text>
+							<text class="detail-value">{{ item.customerName }}</text>
+						</view>
+						<view class="detail-row">
+							<text class="detail-label">椤圭洰鍚嶇О</text>
+							<text class="detail-value">{{ item.projectName }}</text>
+						</view>
+						<view class="detail-row">
+							<text class="detail-label">鍥炴鏃ユ湡</text>
+							<text class="detail-value">{{ item.receiptPaymentDate }}</text>
+						</view>
+						<view class="detail-row">
+							<text class="detail-label">鍥炴閲戦(鍏�)</text>
+							<text class="detail-value highlight">{{ formatAmount(item.receiptPaymentAmount) }}</text>
+						</view>
+						<up-divider></up-divider>
+						<view class="detail-info">
+							<view class="detail-row">
+								<text class="detail-label">鐧昏浜�</text>
+								<text class="detail-value">{{ item.registrant }}</text>
+							</view>
+							<view class="detail-row">
+								<text class="detail-label">鐧昏鏃ユ湡</text>
+								<text class="detail-value">{{ item.createTime }}</text>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view v-else class="no-data">
+			<text>鏆傛棤鍥炴鍘嗗彶鏁版嵁</text>
+		</view>
+	</view>
+</template>
+
+<script setup>
+import { ref, computed } from 'vue';
+import { onShow } from '@dcloudio/uni-app';
+import { receiptPaymentHistoryListPage } from "@/api/salesManagement/receiptPayment.js";
+
+// 鎼滅储琛ㄥ崟
+const searchForm = ref({
+	searchText: '',
+});
+
+// 琛ㄦ牸鏁版嵁
+const tableData = ref([]);
+
+// 鍒嗛〉鍙傛暟
+const page = ref({
+	current: -1,
+	size: -1,
+});
+
+const totalAmount = computed(() => {
+	return tableData.value.reduce((sum, item) => {
+		return sum + (parseFloat(item.receiptPaymentAmount) || 0);
+	}, 0);
+});
+
+// 杩斿洖涓婁竴椤�
+const goBack = () => {
+	uni.navigateBack();
+};
+
+// 鏌ヨ鍒楄〃
+const getList = () => {
+	const params = {
+		...searchForm.value,
+		...page.value
+	};
+	receiptPaymentHistoryListPage(params).then((res) => {
+		tableData.value = res.records;
+	}).catch(() => {
+		uni.showToast({
+			title: '鏌ヨ澶辫触',
+			icon: 'error'
+		});
+	});
+};
+
+// 鏍煎紡鍖栧洖娆炬柟寮�
+const formatReceiptType = (type) => {
+	if (type == 0) {
+		return "鐢垫眹";
+	} else if (type == 1) {
+		return "鎵垮厬";
+	} else {
+		return "鏈煡";
+	}
+};
+
+// 鑾峰彇鏍囩鏍峰紡绫�
+const getTagClass = (type) => {
+	if (type == 0) {
+		return "tag-electric";
+	} else if (type == 1) {
+		return "tag-acceptance";
+	} else {
+		return "tag-unknown";
+	}
+};
+
+// 鏍煎紡鍖栭噾棰�
+const formatAmount = (amount) => {
+	return amount ? parseFloat(amount).toFixed(2) : '0.00';
+};
+onShow(() => {
+	// 椤甸潰鏄剧ず鏃跺埛鏂板垪琛�
+	getList();
+});
+</script>
+
+<style scoped lang="scss">
+.u-divider {
+	margin: 0 !important;
+}
+
+.receipt-payment-history {
+	min-height: 100vh;
+	background: #f8f9fa;
+	position: relative;
+}
+
+
+
+.search-section {
+	padding: 10px 20px;
+	background: #ffffff;
+}
+
+.search-bar {
+	display: flex;
+	align-items: center;
+	gap: 12px;
+}
+
+.search-input {
+	flex: 1;
+	background: #f5f5f5;
+	border-radius: 24px;
+	padding: 10px 16px;
+	display: flex;
+	align-items: center;
+	gap: 8px;
+}
+
+.search-text {
+	flex: 1;
+	font-size: 14px;
+	color: #333;
+	background: transparent;
+	border: none;
+	outline: none;
+}
+
+.search-text::placeholder {
+	color: #999;
+}
+
+.search-button {
+	width: 40px;
+	height: 40px;
+	border-radius: 8px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.history-list {
+	padding: 20px;
+}
+
+.history-item {
+	background: #ffffff;
+	border-radius: 12px;
+	margin-bottom: 16px;
+	overflow: hidden;
+	box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+	padding: 0 16px;
+}
+
+.item-header {
+	padding: 16px 0;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+}
+
+.item-left {
+	display: flex;
+	align-items: center;
+	gap: 8px;
+}
+
+.document-icon {
+	width: 24px;
+	height: 24px;
+	background: #2979ff;
+	border-radius: 4px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.item-id {
+	font-size: 14px;
+	color: #333;
+	font-weight: 500;
+}
+
+.item-tag {
+	border-radius: 4px;
+	padding: 2px 8px;
+}
+
+.tag-electric {
+	background: #4caf50;
+}
+
+.tag-acceptance {
+	background: #ff9800;
+}
+
+.tag-unknown {
+	background: #9e9e9e;
+}
+
+.tag-text {
+	font-size: 11px;
+	color: #ffffff;
+	font-weight: 500;
+}
+
+.item-details {
+	padding: 16px 0;
+}
+
+.detail-row {
+	display: flex;
+	align-items: flex-end;
+	justify-content: space-between;
+	margin-bottom: 8px;
+	
+	&:last-child {
+		margin-bottom: 0;
+	}
+}
+
+.detail-info {
+	margin-top: 10px;
+	display: flex;
+	align-items: flex-start;
+	justify-content: space-between;
+}
+
+.detail-label {
+	font-size: 12px;
+	color: #777777;
+	min-width: 60px;
+}
+
+.detail-value {
+	font-size: 12px;
+	color: #000000;
+	text-align: right;
+	flex: 1;
+	margin-left: 16px;
+}
+
+.detail-value.highlight {
+	color: #2979ff;
+	font-weight: 500;
+}
+
+.no-data {
+	padding: 40px 0;
+	text-align: center;
+	color: #999;
+}
+
+.summary-info {
+	background: #ffffff;
+	margin: 20px 20px 0 20px;
+	border-radius: 12px;
+	padding: 16px;
+	box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+}
+
+.summary-item {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 8px;
+	
+	&:last-child {
+		margin-bottom: 0;
+	}
+}
+
+.summary-label {
+	font-size: 14px;
+	color: #666;
+}
+
+.summary-value {
+	font-size: 14px;
+	color: #333;
+	font-weight: 500;
+}
+
+.summary-value.highlight {
+	color: #2979ff;
+	font-weight: 600;
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/sales/receiptPaymentLedger/detail.vue b/src/pages/sales/receiptPaymentLedger/detail.vue
new file mode 100644
index 0000000..abc84ef
--- /dev/null
+++ b/src/pages/sales/receiptPaymentLedger/detail.vue
@@ -0,0 +1,297 @@
+<template>
+	<view class="receipt-payment-detail">
+		<!-- 椤甸潰澶撮儴 -->
+		<van-nav-bar
+			title="瀹㈡埛寰�鏉ヨ鎯�"
+			left-text="杩斿洖"
+			left-arrow
+			@click-left="goBack"
+			fixed
+			placeholder
+		/>
+		
+		<!-- 缁熻淇℃伅 -->
+		<view class="summary-info" v-if="tableData.length > 0">
+			<view class="summary-item">
+				<text class="summary-label">鎬昏褰曟暟</text>
+				<text class="summary-value">{{ tableData.length }}</text>
+			</view>
+			<view class="summary-item">
+				<text class="summary-label">寮�绁ㄦ�婚噾棰�</text>
+				<text class="summary-value">{{ formatAmount(invoiceTotal) }}</text>
+			</view>
+			<view class="summary-item">
+				<text class="summary-label">鍥炴鎬婚噾棰�</text>
+				<text class="summary-value highlight">{{ formatAmount(receiptTotal) }}</text>
+			</view>
+			<view class="summary-item">
+				<text class="summary-label">搴旀敹鎬婚噾棰�</text>
+				<text class="summary-value danger">{{ formatAmount(unReceiptTotal) }}</text>
+			</view>
+		</view>
+		
+		<!-- 鍥炴璁板綍鏄庣粏鍒楄〃 -->
+		<view class="detail-list" v-if="tableData.length > 0">
+			<view v-for="(item, index) in tableData" :key="index" class="detail-item">
+				<view class="item-header">
+					<view class="item-left">
+						<view class="record-icon">
+							<up-icon name="file-text" size="16" color="#ffffff"></up-icon>
+						</view>
+						<text class="item-index">{{ index + 1 }}</text>
+					</view>
+					<view class="item-date">{{ item.happenTime }}</view>
+				</view>
+				<up-divider></up-divider>
+				<view class="item-details">
+					<view class="detail-row">
+						<text class="detail-label">寮�绁ㄩ噾棰�(鍏�)</text>
+						<text class="detail-value">{{ formatAmount(item.invoiceAmount) }}</text>
+					</view>
+					<view class="detail-row">
+						<text class="detail-label">鍥炴閲戦(鍏�)</text>
+						<text class="detail-value highlight">{{ formatAmount(item.receiptAmount) }}</text>
+					</view>
+					<view class="detail-row">
+						<text class="detail-label">搴旀敹閲戦(鍏�)</text>
+						<text class="detail-value danger">{{ formatAmount(item.unReceiptAmount) }}</text>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view v-else class="no-data">
+			<text>鏆傛棤鍥炴璁板綍</text>
+		</view>
+	</view>
+</template>
+
+<script setup>
+import { ref, computed, onMounted } from 'vue';
+import { onShow } from '@dcloudio/uni-app';
+import { customerInteractions } from "@/api/salesManagement/receiptPayment.js";
+
+// 瀹㈡埛淇℃伅
+const customerId = ref('');
+
+// 琛ㄦ牸鏁版嵁
+const tableData = ref([]);
+
+const invoiceTotal = computed(() => {
+	return tableData.value.reduce((sum, item) => {
+		return sum + (parseFloat(item.invoiceAmount) || 0);
+	}, 0);
+});
+
+const receiptTotal = computed(() => {
+	return tableData.value.reduce((sum, item) => {
+		return sum + (parseFloat(item.receiptAmount) || 0);
+	}, 0);
+});
+
+const unReceiptTotal = computed(() => {
+	return tableData.value.reduce((sum, item) => {
+		return sum + (parseFloat(item.unReceiptAmount) || 0);
+	}, 0);
+});
+
+// 杩斿洖涓婁竴椤�
+const goBack = () => {
+	uni.navigateBack();
+};
+
+// 鑾峰彇椤甸潰鍙傛暟
+const getPageParams = () => {
+	const pages = getCurrentPages();
+	const currentPage = pages[pages.length - 1];
+	const options = currentPage.options;
+	
+	if (options.customerId) {
+		customerId.value = options.customerId;
+	}
+};
+
+// 鏌ヨ鍒楄〃
+const getList = () => {
+	if (!customerId.value) {
+		uni.showToast({
+			title: '瀹㈡埛淇℃伅缂哄け',
+			icon: 'error'
+		});
+		return;
+	}
+	
+	const param = {
+		customerId: customerId.value,
+	};
+	
+	customerInteractions(param).then((res) => {
+		tableData.value = res.data;
+	}).catch(() => {
+		uni.showToast({
+			title: '鏌ヨ澶辫触',
+			icon: 'error'
+		});
+	});
+};
+
+// 鏍煎紡鍖栭噾棰�
+const formatAmount = (amount) => {
+	return amount ? parseFloat(amount).toFixed(2) : '0.00';
+};
+
+onShow(() => {
+	// 椤甸潰鏄剧ず鏃惰幏鍙栧弬鏁板苟鍒锋柊鍒楄〃
+	getPageParams();
+	getList();
+});
+
+onMounted(() => {
+	// 椤甸潰鍔犺浇鏃惰幏鍙栧弬鏁板苟鍒锋柊鍒楄〃
+	getPageParams();
+	getList();
+});
+</script>
+
+<style scoped lang="scss">
+.receipt-payment-detail {
+	min-height: 100vh;
+	background: #f8f9fa;
+	position: relative;
+}
+
+.u-divider {
+	margin: 0 !important;
+}
+
+.summary-info {
+	background: #ffffff;
+	margin: 20px 20px 0 20px;
+	border-radius: 12px;
+	padding: 16px;
+	box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+}
+
+.summary-item {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 8px;
+	
+	&:last-child {
+		margin-bottom: 0;
+	}
+}
+
+.summary-label {
+	font-size: 14px;
+	color: #666;
+}
+
+.summary-value {
+	font-size: 14px;
+	color: #333;
+	font-weight: 500;
+}
+
+.summary-value.highlight {
+	color: #2979ff;
+	font-weight: 600;
+}
+
+.summary-value.danger {
+	color: #ff4757;
+	font-weight: 600;
+}
+
+.detail-list {
+	padding: 20px;
+}
+
+.detail-item {
+	background: #ffffff;
+	border-radius: 12px;
+	margin-bottom: 16px;
+	overflow: hidden;
+	box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+	padding: 0 16px;
+}
+
+.item-header {
+	padding: 10px 0;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+}
+
+.item-left {
+	display: flex;
+	align-items: center;
+	gap: 8px;
+}
+
+.record-icon {
+	width: 24px;
+	height: 24px;
+	background: #2979ff;
+	border-radius: 4px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.item-index {
+	font-size: 14px;
+	color: #333;
+	font-weight: 500;
+}
+
+.item-date {
+	font-size: 12px;
+	color: #666;
+}
+
+.item-details {
+	padding: 16px 0;
+}
+
+.detail-row {
+	display: flex;
+	align-items: flex-end;
+	justify-content: space-between;
+	margin-bottom: 8px;
+	
+	&:last-child {
+		margin-bottom: 0;
+	}
+}
+
+.detail-label {
+	font-size: 12px;
+	color: #777777;
+	min-width: 60px;
+}
+
+.detail-value {
+	font-size: 12px;
+	color: #000000;
+	text-align: right;
+	flex: 1;
+	margin-left: 16px;
+}
+
+.detail-value.highlight {
+	color: #2979ff;
+	font-weight: 500;
+}
+
+.detail-value.danger {
+	color: #ff4757;
+	font-weight: 500;
+}
+
+.no-data {
+	padding: 40px 0;
+	text-align: center;
+	color: #999;
+}
+</style>
diff --git a/src/pages/sales/receiptPaymentLedger/index.vue b/src/pages/sales/receiptPaymentLedger/index.vue
new file mode 100644
index 0000000..11a16c1
--- /dev/null
+++ b/src/pages/sales/receiptPaymentLedger/index.vue
@@ -0,0 +1,307 @@
+<template>
+  <view class="receipt-payment-ledger">
+    <!-- 椤甸潰澶撮儴 -->
+    <van-nav-bar
+      title="瀹㈡埛寰�鏉�"
+      left-text="杩斿洖"
+      left-arrow
+      @click-left="goBack"
+      fixed
+      placeholder
+    />
+    
+    <!-- 鎼滅储鍖哄煙 -->
+    <view class="search-section">
+      <view class="search-bar">
+        <view class="search-input">
+          <input
+            class="search-text"
+            placeholder="璇疯緭鍏ュ鎴峰悕绉�"
+            v-model="searchForm.searchText"
+            @input="handleQuery"
+          />
+        </view>
+        <view class="search-button" @click="handleQuery">
+          <up-icon name="search" size="24" color="#999"></up-icon>
+        </view>
+      </view>
+    </view>
+
+    <!-- 瀹㈡埛鍒楄〃 -->
+    <view class="customer-list-container">
+      <view class="customer-list" v-if="tableData.length > 0">
+        <view 
+          v-for="(item, index) in tableData" 
+          :key="item.id"
+          class="customer-item"
+          @click="rowClickMethod(item)"
+        >
+          <view class="item-header">
+            <view class="item-left">
+              <view class="customer-icon">
+								<up-icon name="file-text" size="16" color="#ffffff"></up-icon>
+              </view>
+              <text class="customer-name">{{ item.customerName }}</text>
+            </view>
+            <view class="item-right">
+              <up-icon name="arrow-right" size="16" color="#999"></up-icon>
+            </view>
+          </view>
+          <up-divider></up-divider>
+          <view class="item-details">
+            <view class="detail-row">
+              <text class="detail-label">寮�绁ㄩ噾棰�(鍏�)</text>
+              <text class="detail-value">{{ formattedNumber(item.invoiceTotal) }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">鍥炴閲戦(鍏�)</text>
+              <text class="detail-value">{{ formattedNumber(item.receiptPaymentAmount) }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">搴旀敹閲戦(鍏�)</text>
+              <text class="detail-value highlight danger">{{ formattedNumber(item.unReceiptPaymentAmount) }}</text>
+            </view>
+          </view>
+        </view>
+      </view>
+      <view v-else class="no-data">
+        <text>鏆傛棤瀹㈡埛鏁版嵁</text>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { onMounted, ref, reactive, toRefs } from "vue";
+import { onShow } from '@dcloudio/uni-app';
+import { invoiceLedgerSalesAccount } from "@/api/salesManagement/invoiceLedger";
+
+
+const tableData = ref([]);
+
+const page = reactive({
+  current: -1,
+  size: -1,
+});
+
+
+
+const data = reactive({
+  searchForm: {
+    searchText: "",
+    invoiceDate: "",
+  },
+});
+
+const { searchForm } = toRefs(data);
+
+// 杩斿洖涓婁竴椤�
+const goBack = () => {
+  uni.navigateBack();
+};
+
+// 鏌ヨ鍒楄〃
+const handleQuery = () => {
+  getList();
+};
+
+const getList = () => {
+  invoiceLedgerSalesAccount({ ...searchForm.value, ...page }).then((res) => {
+    tableData.value = res.data.records;
+  }).catch(() => {
+    uni.showToast({
+      title: '鏌ヨ澶辫触',
+      icon: 'error'
+    });
+  });
+};
+
+const formattedNumber = (value) => {
+  return parseFloat(value || 0).toFixed(2);
+};
+
+
+
+const rowClickMethod = (row) => {
+  // 璺宠浆鍒板洖娆捐褰曟槑缁嗛〉闈�
+  uni.navigateTo({
+    url: `/pages/sales/receiptPaymentLedger/detail?customerId=${row.id}`
+  });
+};
+
+onShow(() => {
+  // 椤甸潰鏄剧ず鏃跺埛鏂板垪琛�
+  getList();
+});
+
+onMounted(() => {
+  getList();
+});
+</script>
+
+<style scoped lang="scss">
+.u-divider {
+  margin: 0 !important;
+}
+
+.receipt-payment-ledger {
+  min-height: 100vh;
+  background: #f8f9fa;
+  position: relative;
+}
+
+.search-section {
+  padding: 10px 20px;
+  background: #ffffff;
+}
+
+.search-bar {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+}
+
+.search-input {
+  flex: 1;
+  background: #f5f5f5;
+  border-radius: 24px;
+  padding: 10px 16px;
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.search-text {
+  flex: 1;
+  font-size: 14px;
+  color: #333;
+  background: transparent;
+  border: none;
+  outline: none;
+}
+
+.search-text::placeholder {
+  color: #999;
+}
+
+.search-button {
+  width: 40px;
+  height: 40px;
+  border-radius: 8px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.customer-list-container {
+  padding: 20px;
+}
+
+.customer-list {
+  display: flex;
+  flex-direction: column;
+  gap: 16px;
+}
+
+.customer-item {
+  background: #ffffff;
+  border-radius: 12px;
+  overflow: hidden;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+  padding: 0 16px;
+  transition: all 0.3s ease;
+  
+  &:active {
+    transform: scale(0.98);
+    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
+  }
+}
+
+.item-header {
+  padding: 16px 0;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.item-left {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.item-right {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.customer-icon {
+  width: 24px;
+  height: 24px;
+  background: #2979ff;
+  border-radius: 4px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.customer-name {
+  font-size: 14px;
+  color: #333;
+  font-weight: 500;
+}
+
+.item-index {
+  font-size: 12px;
+  color: #999;
+  background: #f5f5f5;
+  padding: 2px 8px;
+  border-radius: 12px;
+}
+
+.item-details {
+  padding: 16px 0;
+}
+
+.detail-row {
+  display: flex;
+  align-items: flex-end;
+  justify-content: space-between;
+  margin-bottom: 8px;
+  
+  &:last-child {
+    margin-bottom: 0;
+  }
+}
+
+.detail-label {
+  font-size: 12px;
+  color: #777777;
+  min-width: 60px;
+}
+
+.detail-value {
+  font-size: 12px;
+  color: #000000;
+  text-align: right;
+  flex: 1;
+  margin-left: 16px;
+}
+
+.detail-value.highlight {
+  color: #2979ff;
+  font-weight: 500;
+}
+
+.detail-value.danger {
+  color: #ff4757;
+  font-weight: 500;
+}
+
+.no-data {
+  padding: 40px 0;
+  text-align: center;
+  color: #999;
+}
+</style>
\ No newline at end of file

--
Gitblit v1.9.3