gaoluyang
3 天以前 ee42bf1badae06026efa79dc17d2a541297ab49b
src/pages/sales/receiptPaymentLedger/index.vue
@@ -1,74 +1,68 @@
<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">
   <view class="sales-account">
      <!-- 使用通用页面头部组件 -->
      <PageHeader title="客户往来" @back="goBack" />
      <!-- 搜索区域 -->
      <view class="search-section">
         <view class="search-bar">
            <view class="search-input">
               <up-input
                  class="search-text"
                  placeholder="请输入客户名称"
                  v-model="searchForm.customerName"
                  @change="handleQuery"
                  clearable
               />
            </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>
                     </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>
@@ -80,228 +74,87 @@
const tableData = ref([]);
const page = reactive({
  current: -1,
  size: -1,
   current: -1,
   size: -1,
});
const data = reactive({
  searchForm: {
    searchText: "",
    invoiceDate: "",
  },
   searchForm: {
      customerName: "",
      invoiceDate: "",
   },
});
const { searchForm } = toRefs(data);
// 返回上一页
const goBack = () => {
  uni.navigateBack();
   uni.navigateBack();
};
// 查询列表
const handleQuery = () => {
  getList();
   getList();
};
const getList = () => {
  invoiceLedgerSalesAccount({ ...searchForm.value, ...page }).then((res) => {
    tableData.value = res.data.records;
  }).catch(() => {
    uni.showToast({
      title: '查询失败',
      icon: 'error'
    });
  });
   showLoadingToast('加载中...')
   invoiceLedgerSalesAccount({ ...searchForm.value, ...page }).then((res) => {
      tableData.value = res.data.records;
      closeToast()
   }).catch(() => {
      closeToast()
      uni.showToast({
         title: '查询失败',
         icon: 'error'
      });
   });
};
const formattedNumber = (value) => {
  return parseFloat(value || 0).toFixed(2);
   return parseFloat(value || 0).toFixed(2);
};
// 显示加载提示
const showLoadingToast = (message) => {
   uni.showLoading({
      title: message,
      mask: true
   });
};
// 关闭提示
const closeToast = () => {
   uni.hideLoading();
};
const rowClickMethod = (row) => {
  // 跳转到回款记录明细页面
  uni.navigateTo({
    url: `/pages/sales/receiptPaymentLedger/detail?customerId=${row.id}`
  });
   // 使用 uni.setStorageSync 存储客户信息
   uni.setStorageSync('customerId', row.id);
   // 跳转到回款记录明细页面
   uni.navigateTo({
      url: '/pages/sales/receiptPaymentLedger/detail'
   });
};
onShow(() => {
  // 页面显示时刷新列表
  getList();
   // 页面显示时刷新列表
   getList();
});
onMounted(() => {
  getList();
   getList();
});
</script>
<style scoped lang="scss">
.u-divider {
  margin: 0 !important;
}
@import '@/styles/sales-common.scss';
.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;
   color: #ff4757; // 与公共样式中的 #ee0a24 不同
   font-weight: 500;
}
</style>