From b2fe8c6141c425c65e4ec80a2ae95e483c16a14b Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 25 八月 2025 17:00:13 +0800
Subject: [PATCH] 1.供应商往来开发联调

---
 src/pages/index.vue                                      |    5 
 src/pages.json                                           |   14 +
 src/pages/procurementManagement/paymentLedger/index.vue  |  295 +++++++++++++++++++++++++++++
 src/pages/procurementManagement/paymentLedger/detail.vue |  282 ++++++++++++++++++++++++++++
 4 files changed, 596 insertions(+), 0 deletions(-)

diff --git a/src/pages.json b/src/pages.json
index 08b1cde..fcbdd4f 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -226,6 +226,20 @@
       }
     },
     {
+      "path": "pages/procurementManagement/paymentLedger/index",
+      "style": {
+        "navigationBarTitleText": "渚涘簲鍟嗗線鏉�",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/procurementManagement/paymentLedger/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 d64c6b5..4f04f91 100644
--- a/src/pages/index.vue
+++ b/src/pages/index.vue
@@ -345,6 +345,11 @@
 				url: '/pages/procurementManagement/receiptPaymentHistory/index'
 			});
 			break;
+		case '渚涘簲鍟嗗線鏉�':
+			uni.navigateTo({
+				url: '/pages/procurementManagement/paymentLedger/index'
+			});
+			break;
 		case '鍗忓悓瀹℃壒':
 			uni.navigateTo({
 				url: '/pages/cooperativeOffice/collaborativeApproval/index'
diff --git a/src/pages/procurementManagement/paymentLedger/detail.vue b/src/pages/procurementManagement/paymentLedger/detail.vue
new file mode 100644
index 0000000..13fd49e
--- /dev/null
+++ b/src/pages/procurementManagement/paymentLedger/detail.vue
@@ -0,0 +1,282 @@
+<template>
+	<view class="receipt-payment-detail">
+		<!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 -->
+		<PageHeader title="瀹㈡埛寰�鏉ヨ鎯�" @back="goBack" />
+		
+		<!-- 缁熻淇℃伅 -->
+		<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.currentPaymentAmount) }}</text>
+					</view>
+					<view class="detail-row">
+						<text class="detail-label">搴斾粯閲戦(鍏�)</text>
+						<text class="detail-value danger">{{ formatAmount(item.payableAmount) }}</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 {paymentLedgerList} from "@/api/procurementManagement/paymentLedger";
+
+// 瀹㈡埛淇℃伅
+const supplierId = 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.supplierId) {
+		supplierId.value = options.supplierId;
+	}
+};
+
+// 鏌ヨ鍒楄〃
+const getList = () => {
+	if (!supplierId.value) {
+		uni.showToast({
+			title: '瀹㈡埛淇℃伅缂哄け',
+			icon: 'error'
+		});
+		return;
+	}
+	const param = {
+		supplierId: supplierId.value,
+	};
+	paymentLedgerList(param).then((res) => {
+		tableData.value = res.data;
+	}).catch(() => {
+		uni.showToast({
+			title: '鏌ヨ澶辫触',
+			icon: 'error'
+		});
+	});
+};
+
+// 鏍煎紡鍖栭噾棰�
+const formatAmount = (amount) => {
+	return amount ? parseFloat(amount).toFixed(2) : '0.00';
+};
+
+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/procurementManagement/paymentLedger/index.vue b/src/pages/procurementManagement/paymentLedger/index.vue
new file mode 100644
index 0000000..cdeab16
--- /dev/null
+++ b/src/pages/procurementManagement/paymentLedger/index.vue
@@ -0,0 +1,295 @@
+<template>
+  <view class="receipt-payment-ledger">
+    <!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 -->
+    <PageHeader title="渚涘簲鍟嗗線鏉�" @back="goBack" />
+    
+    <!-- 鎼滅储鍖哄煙 -->
+    <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.supplierName }}</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.invoiceAmount) }}</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.payableAmount) }}</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 {paymentLedgerList} from "@/api/procurementManagement/paymentLedger";
+
+
+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 = () => {
+	paymentLedgerList({ ...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/procurementManagement/paymentLedger/detail?supplierId=${row.supplierId}`
+  });
+};
+
+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