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