Przeglądaj źródła

优化:UI 走查

lishanshan 3 miesięcy temu
rodzic
commit
9e24c6b468

+ 1 - 1
src/api/income.ts

@@ -37,7 +37,7 @@ export interface PageMapResponse {
 
 // 获取账户明细分页数据(Map格式)
 export function getCouponIssuerAccountByPageMap(couponIssuerAccountByPageMapForm: CouponIssuerAccountByPageMapForm) {
-    return http.Post<PageMapResponse>('/couponCenter/APP/couponIssuerAccountDetail/pageMap', couponIssuerAccountByPageMapForm)
+    return http.Post<PageMapResponse>('/couponCenter/salesman/payout/income/pageMap', couponIssuerAccountByPageMapForm)
 }
 
 /**

+ 27 - 6
src/api/pay.ts

@@ -16,12 +16,20 @@ import { http } from '@/http/alova'
 
 // 获取银行卡列表
 export function getBankcardList() {
-    return http.Get<bankcardListResponse>('/app/bank-card/list')
+    return http.Get<bankcardListResponse>('/coupon/bankCard/list', {
+        meta: {
+            returnResponse: true
+        }
+    })
 }
 
 // 发起提现
 export function netWithdraw(params: netWithdrawResponse) {
-    return http.Post('/couponCenter/APP/couponIssuerAccount/withdraw', params)
+    return http.Post('/couponCenter/salesman/payout/withdraw/apply', params, {
+        meta: {
+            returnResponse: true
+        }
+    })
 }
 
 /**
@@ -31,7 +39,7 @@ export function netWithdraw(params: netWithdrawResponse) {
 
 // 银行卡-重新提交
 export function netBankcardUpdate(params: netBankcardUpdateParams) {
-    return http.Post<netBankcardUpdateResponse>('/identity/authentication/application', params, {
+    return http.Post<netBankcardUpdateResponse>('/coupon/bankCard/bankCardSubmit', params, {
         meta: {
             returnResponse: true
         }
@@ -49,7 +57,7 @@ export function getBankList() {
 
 // 查询普通用户是否有会员进件记录
 export function getBankSignRecord() {
-  return http.Get<bankSignRecordResponse>('/localBankAccountInformationRecord/localBankAccountInformationRecord/getByUserId', {
+  return http.Get<bankSignRecordResponse>('/coupon/bankCard/getBankByUserId', {
     meta: {
       returnResponse: true
     }
@@ -58,7 +66,7 @@ export function getBankSignRecord() {
 
 // 获取银行账户信息详情
 export function getBankCardInfo(accountInformationId: string) {
-  return http.Get<bankAccountDetailResponse>(`/identity/authentication/queryByAccountInformationRecordId?accountInformationId=${accountInformationId}`, {
+  return http.Get<bankAccountDetailResponse>(`/coupon/bankCard/queryByAccountInformationRecordId?accountInformationId=${accountInformationId}`, {
     meta: {
       returnResponse: true
     }
@@ -67,5 +75,18 @@ export function getBankCardInfo(accountInformationId: string) {
 
 // 更新绑卡状态
 export function updateBankCardState(data: { meberId: string }) {
-  return http.Post('/identity/authentication/updateBankCardState', data)
+  return http.Post('/identity/authentication/updateBankCardState', data, {
+    meta: {
+      returnResponse: true
+    }
+  })
+}
+
+// 银行卡-提现记录详情
+export function getWithdrawDetail(data: { id: string }) {
+  return http.Get(`/app/bank-card/withdrawNew/${data.id}`, {
+    meta: {
+      returnResponse: true
+    }
+  })
 }

+ 1 - 0
src/api/types/coupon.ts

@@ -9,6 +9,7 @@ export interface AccountCount {
     withdrawableAmount: number
     unsettledAmount: number
     totalCommission: number
+    bankNumber: number
 }
 
 export interface CouponSituation {

+ 3 - 3
src/api/types/pay.ts

@@ -7,9 +7,9 @@ export interface bankcardListResponse {
 }
 
 export interface netWithdrawResponse {
-    amount: string
-    bankId: string
-    callBackUrl: string
+    applyAmount: string | number
+    bankCardId: string | number
+    callBackUrl?: string
 }
 
 // 银行卡信息

+ 3 - 3
src/components/FilterTime.vue

@@ -103,7 +103,7 @@ function closeDatePicker() {
 // 选择日期确认
 function confirmDate() {
     // 将时间戳转换为 YYYY-MM-DD 格式
-    const selectedDate = dayjs(datePickerConfig.value).format('YYYY-MM-DD')
+    const selectedDate = dayjs(datePickerConfig.value).format('YYYY/MM/DD')
 
     if (state.currentDateType === 'start') {
         state.startTime = selectedDate
@@ -187,7 +187,7 @@ defineExpose({
         <!-- 时间选择器弹窗(顶部弹出) -->
         <up-popup
             v-model:show="state.popupVisible"
-            mode="top"
+            mode="bottom"
             @close="closePopup"
         >
             <view class="time-picker-container">
@@ -279,7 +279,7 @@ defineExpose({
 .time-picker-header {
   display: flex;
   align-items: center;
-  justify-content: space-between;
+  justify-content: center;
   padding: 30rpx;
   border-bottom: 1rpx solid #eeeeee;
 }

+ 3 - 4
src/components/IncomeItem.vue

@@ -24,9 +24,8 @@
                             <text class="text-red ml-10rpx">(退款)</text>
                         </template>
                     </view>
-                    <view>
-                    <!-- <view v-if="[7].includes(data.commissionType)"> -->
-                        {{ data.bankName }}招商银行
+                    <view v-if="[7].includes(data.commissionType)">
+                        {{ data.bankName }}
                     </view>
                 </view>
             </view>
@@ -78,7 +77,7 @@ const iconImages = [
 const emit = defineEmits(['itemClick'])
 
 const handleItemClick = () => {
-    if ([5, 6].includes(props.data.commissionType)) {
+    if ([5, 6, 7].includes(props.data.commissionType)) {
         emit('itemClick', props.data)
     }
 }

+ 49 - 36
src/pages-B/payment/bankCard-edit.vue

@@ -178,11 +178,11 @@ const statusIcon = computed(() => {
     case '00':
     case '03':
     case '04':
-      return 'clock'
+      return 'clock-fill'
     case '02':
-      return 'close-circle'
+      return 'error-circle-fill'
     default:
-      return 'clock'
+      return 'clock-fill'
   }
 })
 
@@ -525,25 +525,9 @@ function extractDomain(url: string): string {
     <view class="audit-status" v-if="auditStatus && auditStatus != '01'">
       <view class="status-content">
         <view class="status-info">
-          <u-icon :name="statusIcon" size="42rpx" class="status-icon"></u-icon>
+          <u-icon :name="statusIcon" size="42rpx" :color="auditStatus == '02' ? '#FD1216' : '#FFB30E'" class="status-icon"></u-icon>
           <text class="status-text">{{ statusText }}</text>
         </view>
-        <view class="status-btn">
-          <u-button
-            v-if="auditStatus == '02' && !isReSubmit"
-            type="primary"
-            @click="onReSubmit"
-            :customStyle="{
-              height: '59rpx',
-              fontSize: '29rpx',
-              color: '#FE171B',
-              backgroundColor: 'rgba(254, 23, 27, 0.05)',
-              border: '1rpx solid #FE171B',
-              padding: '3rpx 31rpx 8rpx',
-            }"
-            >重新提交</u-button
-          >
-        </view>
       </view>
       <!-- 审核失败错误信息 -->
       <view class="error-message" v-if="auditStatus != '01' && auditMessage">
@@ -557,11 +541,12 @@ function extractDomain(url: string): string {
         :model="form"
         :rules="rules"
         labelPosition="left"
-        labelWidth="180rpx"
+        labelWidth="200rpx"
         :labelStyle="{
           fontWeight: '500',
           fontSize: '28rpx',
           color: '#333333',
+          paddingLeft: '15rpx'
         }"
       >
         <view class="form-section">
@@ -609,47 +594,47 @@ function extractDomain(url: string): string {
         </view>
 
         <view class="form-section">
-          <u-form-item label="姓名" prop="name" :border-bottom="true">
+          <u-form-item label="姓名" prop="name" required :border-bottom="true">
             <u--input v-model="form.name" border="none" placeholder="请输入姓名" :disabled="isFormDisabled"></u--input>
           </u-form-item>
-          <u-form-item label="证件号码" prop="idCard" :border-bottom="true">
+          <u-form-item label="证件号码" prop="idCard" required :border-bottom="true">
             <u--input v-model="form.idCard" border="none" placeholder="请输入证件号码" :disabled="isFormDisabled"></u--input>
           </u-form-item>
-          <u-form-item label="证件有效期始" prop="startDate" :border-bottom="true" @click="onShowDate('startDate')" :disabled="isFormDisabled">
+          <u-form-item label="证件有效期始" prop="startDate" required :border-bottom="true" @click="onShowDate('startDate')" :disabled="isFormDisabled">
             <u--input v-model="form.startDate" border="none" placeholder="请选择" :disabled="isFormDisabled"></u--input>
             <template #right>
                 <u-icon name="arrow-right"></u-icon>
             </template>
           </u-form-item>
-          <u-form-item label="证件有效期止" prop="endDate" :border-bottom="true" @click="onShowDate('endDate')" :disabled="isFormDisabled">
+          <u-form-item label="证件有效期止" prop="endDate" required :border-bottom="true" @click="onShowDate('endDate')" :disabled="isFormDisabled">
             <u--input v-model="form.endDate" border="none" placeholder="请选择" :disabled="isFormDisabled"></u--input>
             <template #right>
                 <u-icon name="arrow-right"></u-icon>
             </template>
             <!-- <u-icon slot="right" name="arrow-right"></u-icon> -->
           </u-form-item>
-          <u-form-item label="证件地址" prop="idAddress" :border-bottom="true">
+          <u-form-item label="证件地址" prop="idAddress" required :border-bottom="true">
             <u--input v-model="form.idAddress" border="none" placeholder="请输入证件地址" :disabled="isFormDisabled"></u--input>
           </u-form-item>
         </view>
 
         <view class="form-section">
-          <u-form-item label="银行" prop="bankName" :border-bottom="true" @click="onShowBank" :disabled="isFormDisabled">
+          <u-form-item label="银行" prop="bankName" required :border-bottom="true" @click="onShowBank" :disabled="isFormDisabled">
             <u--input v-model="form.bankName" border="none" placeholder="请选择" :disabled="isFormDisabled"></u--input>
             <template #right>
                 <u-icon name="arrow-right"></u-icon>
             </template>
           </u-form-item>
-          <u-form-item label="银行卡号" prop="bankCardNumber" :border-bottom="true">
+          <u-form-item label="银行卡号" prop="bankCardNumber" required :border-bottom="true">
             <u--input v-model="form.bankCardNumber" type="number" border="none" placeholder="请输入银行卡号" :disabled="isFormDisabled"></u--input>
           </u-form-item>
-          <u-form-item label="开卡人姓名" prop="name" :border-bottom="true">
+          <u-form-item label="开卡人姓名" prop="name" required :border-bottom="true">
             <u--input v-model="form.name" border="none" placeholder="请输入姓名" :disabled="isFormDisabled"></u--input>
           </u-form-item>
-          <u-form-item label="签约手机号" prop="contractedPhone" :border-bottom="true">
+          <u-form-item label="签约手机号" prop="contractedPhone" required :border-bottom="true">
             <u--input v-model="form.contractedPhone" border="none" type="number" placeholder="请输入手机号" :disabled="isFormDisabled"></u--input>
           </u-form-item>
-          <u-form-item label="预留手机号" prop="phone" :border-bottom="true">
+          <u-form-item label="预留手机号" prop="phone" required :border-bottom="true">
             <u--input v-model="form.phone" border="none" type="number" placeholder="请输入手机号" :disabled="isFormDisabled"></u--input>
           </u-form-item>
         </view>
@@ -662,7 +647,27 @@ function extractDomain(url: string): string {
       </view>
 
       <view class="footer-bar">
-        <u-button type="primary" @click="onSubmit" v-if="(auditStatus == '02' && isReSubmit) || !auditStatus || auditStatus == '01'">保 存</u-button>
+        <u-button
+            v-if="(auditStatus == '02' && isReSubmit) || !auditStatus || auditStatus == '01'"
+            :customStyle="{
+                color: '#fff',
+                background: 'linear-gradient( 90deg, #FF8F83 0%, #FF3F51 100%)',
+                borderRadius: '8rpx',
+            }"
+            @click="onSubmit"
+        >保 存
+        </u-button>
+        <u-button
+            v-if="auditStatus == '02' && !isReSubmit"
+            type="error" 
+            :plain="true" 
+            :hairline="true"
+            @click="onReSubmit"
+            :customStyle="{
+              backgroundColor: 'rgba(254, 23, 27, 0.05)',
+            }"
+            >重新提交
+        </u-button>
       </view>
     </view>
 
@@ -746,6 +751,7 @@ function extractDomain(url: string): string {
 .audit-status {
   padding: 20rpx 33rpx;
   background-color: #fff;
+  border-top: 1rpx solid #EEEEEE;
   box-shadow: 0 2rpx 8rpx 0 rgba(214, 225, 237, 0.1);
 
   .status-content {
@@ -768,10 +774,6 @@ function extractDomain(url: string): string {
         font-weight: 500;
       }
     }
-
-    .status-btn {
-      width: 200rpx;
-    }
   }
 
   .error-message {
@@ -782,4 +784,15 @@ function extractDomain(url: string): string {
     margin-top: 16rpx;
   }
 }
+
+::v-deep {
+    .u-form-item__body__left__content__required {
+        position: absolute;
+        left: 0px !important;
+        line-height: 20px;
+        font-weight: 400;
+        font-size: 29rpx !important;
+        top: 0px !important;
+    }
+}
 </style>

+ 36 - 14
src/pages-B/payment/bankCard-list.vue

@@ -29,9 +29,9 @@ onShow(() => {
 
 // 获取数据
 function getData() {
-	getBankcardList().then((res: any) => {
-		if (res.code === 200) {
-			cardList.value = res.result
+    getBankcardList().then((res: any) => {
+		if (res.data.code === 200) {
+			cardList.value = res.data.result
 		}
 	})
 }
@@ -90,7 +90,7 @@ function onActionSelect(action: { name: string }) {
 
 <template>
 	<view class="page-container new-content">
-		<u-navbar title="银行卡" :autoBack="true" :placeholder="true" :border-bottom="false"></u-navbar>
+		<u-navbar title="银行卡" :autoBack="true" :placeholder="true" :border-bottom="false" :title-style="{ fontWeight: 'bold' }"></u-navbar>
 
 		<view class="card-list">
 			<view class="card-item" v-for="card in cardList" :key="card.id" :style="{ background: getCardBackground(card) }">
@@ -106,20 +106,42 @@ function onActionSelect(action: { name: string }) {
 					<text>●●●●</text>
 					<text>●●●●</text>
 					<text>●●●●</text>
-					<text class="n">{{ card.bankCardNumber.substring(12) }}</text>
+					<text class="n">{{ card.bankCardNumber ? card.bankCardNumber.substring(12) : '' }}</text>
 				</view>
 			</view>
-			<u-empty 
-				text="没有可用的银行卡" 
-				textColor="#333" 
-				v-if="cardList.length === 0"
-				:icon="`${staticUrl}/static/common/empty15.png`"
-			>
-			</u-empty>
+            <view v-if="cardList && cardList.length === 0">
+                <u-empty 
+			    	text="没有可用的银行卡" 
+			    	textColor="#000"
+                    fontWeight="700"
+			    	icon="/static/common/empty-card.png"
+			    >
+			    </u-empty>
+                <u-button      
+                    type="error"
+                    :plain="true"
+                    :customStyle="{
+                        width: '251rpx',
+                        height: '79rpx',
+                        background: '#f8f8fa',
+                        marginTop: '40rpx',
+                    }" 
+                    @click="addBankCard"
+                >去添加
+                </u-button>
+            </view>
 		</view>
 
-		<view class="footer-bar">
-			<u-button type="primary" @click="addBankCard">{{ btnText }}银行卡</u-button>
+		<view v-if="cardList && cardList.length > 0" class="footer-bar" >
+			<u-button               
+                :customStyle="{
+                    color: '#fff',
+                    background: 'linear-gradient( 90deg, #FF8F83 0%, #FF3F51 100%)',
+                    borderRadius: '8rpx',
+                }" 
+                @click="addBankCard"
+            >{{ btnText }}银行卡
+            </u-button>
 		</view>
 
 		<!-- 操作菜单 -->

+ 9 - 8
src/pages-B/payment/bankCard-select.vue

@@ -1,5 +1,6 @@
 <script setup lang="ts">
 import { ref, watch } from 'vue'
+import { getImageUrl } from '@/utils/imageUtil'
 
 // 定义props
 const props = withDefaults(defineProps<{
@@ -72,12 +73,12 @@ defineExpose({
 </script>
 
 <template>
-	<u-popup mode="bottom" bgColor="#F7F8FC" 
+	<up-popup mode="bottom" bgColor="#F7F8FC" 
 		:show="show" :round="20"
-        :safeAreaInsetBottom="true"
+		:safe-area-inset-bottom="true"
 		@open="open"
-        @close="close"
-    >
+		@close="close"
+	>
 		<view class="popup-container">
 			<view class="popup-header">
 				<view class="title">{{ title }}</view>
@@ -95,19 +96,19 @@ defineExpose({
 					>
 						<image class="bank-icon" :src="card.logo" mode="aspectFit"></image>
 						<text class="card-name">{{ card.bankName }} <text v-if="card.last4">({{ card.last4 }})</text></text>
-						<u-icon v-if="selectedCardId === card.id" name="checkbox-mark" color="#2979ff" size="40rpx"></u-icon>
+						<up-icon v-if="selectedCardId === card.id" name="checkbox-mark" color="#2979ff" size="40rpx"></up-icon>
 					</view>
 
 					<!-- 绑定银行卡 -->
 					<view v-if="showChangeCard" class="card-item add-card" @click="addCard">
-						<image class="bank-icon" :src="`${staticUrl}/static/mine/icon-bankadd.png`" mode="aspectFit"></image>
+						<image class="bank-icon" :src="getImageUrl('@local/mine/icon-bankadd.png')" mode="aspectFit"></image>
 						<text class="card-name">更换银行卡</text>
-						<u-icon name="arrow-right" color="#C7C6CA" size="32rpx"></u-icon>
+						<up-icon name="arrow-right" color="#C7C6CA" size="32rpx"></up-icon>
 					</view>
 				</scroll-view>
 			</view>
 		</view>
-	</u-popup>
+	</up-popup>
 </template>
 
 <style lang="scss" scoped>

+ 1 - 1
src/pages-B/payment/certification-status.vue

@@ -1,6 +1,6 @@
 <script setup lang="ts">
 import { ref } from 'vue'
-import uw from '@/utils/uni.webview.1.5.6.js'
+// import uw from '@/utils/uni.webview.1.5.6.js'
 import { getImageUrl } from '@/utils/imageUtil'
 
 // 响应式状态

+ 234 - 0
src/pages-B/payment/detail-withdraw.vue

@@ -0,0 +1,234 @@
+<script setup lang="ts">
+import { ref, computed } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { getWithdrawDetail } from '@/api/pay'
+
+definePage({
+	style: {
+		navigationBarTitleText: '提现详情',
+	}
+})
+
+// 数据
+const query = ref({})
+const detailData = ref({
+	status: 1, // 1 处理中 2 成功 3 失败
+	withdrawMoney: '0.00',
+	createTime: '',
+	withdrawalTime: '',
+	handlingFee: '',
+	failReason: '',
+	bankName: '',
+	bankImage: '',
+})
+
+// 根据状态返回不同的 UI 配置
+const statusConfig = computed(() => {
+	const configs: Record<number, { text: string; desc: string; icon: string; color: string }> = {
+		1: {
+			text: '提现审核中',
+			desc: '您的提现申请已提交,请耐心等待',
+			icon: 'clock-fill',
+			color: '#1890FF'
+		},
+		2: {
+			text: '提现成功',
+			desc: '',
+			icon: 'checkmark-circle-fill',
+			color: '#52C41A'
+		},
+		3: {
+			text: '提现失败',
+			desc: '很抱歉,您的提现申请未通过',
+			icon: 'close-circle-fill',
+			color: '#FF4D4F'
+		}
+	}
+	return configs[detailData.value.status] || configs[1]
+})
+
+const currentStep = computed(() => {
+	return detailData.value.status == 1 ? 1 : 2
+})
+
+function getData() {
+	getWithdrawDetail({ id: query.value.id }).then((res: any) => {
+		if (res.data.code === 200) {
+			detailData.value = res.data.result
+		}
+	})
+}
+
+function goBack() {
+	uni.navigateBack()
+}
+
+onLoad((options: any) => {
+	query.value = options
+	getData()
+})
+</script>
+
+<template>
+	<view class="page-container">
+		<view class="content-wrapper">
+			<!-- 状态图标区域 -->
+			<view class="status-header">
+				<view class="icon-box">
+					<up-icon :name="statusConfig.icon" :color="statusConfig.color" size="120rpx"></up-icon>
+				</view>
+				<view class="status-text">{{ statusConfig.text }}</view>
+				<!-- 仅成功状态显示大金额 -->
+				<view v-if="detailData.status === 2" class="amount-box">
+					<!-- <text class="symbol">¥</text> -->
+					<text class="amount">{{ detailData.withdrawMoney || '0.00' }}</text>
+				</view>
+				<!-- 失败或审核中显示的副标题描述 -->
+				<view v-else class="status-desc">{{ statusConfig.desc }}</view>
+			</view>
+
+			<!-- 详情列表区域 -->
+			<view class="info-card">
+				<view class="bank-info" v-if="detailData.bankName">
+					<up-image :src="detailData.bankImage" width="48rpx" height="48rpx"></up-image>
+					<text class="bank-name">{{ detailData.bankName }}</text>
+				</view>
+				
+				<view class="detail-list">
+					<view class="detail-item">
+						<text class="label">申请时间</text>
+						<text class="value">{{ detailData.createTime }}</text>
+					</view>
+					<view class="detail-item" v-if="detailData.withdrawalTime">
+						<text class="label">到账时间</text>
+						<text class="value">{{ detailData.withdrawalTime }}</text>
+					</view>
+					<view class="detail-item">
+						<text class="label">提现金额</text>
+						<text class="value"><text class="u-font-22">¥</text>{{ detailData.withdrawMoney }}</text>
+					</view>
+					<view class="detail-item" v-if="detailData.handlingFee">
+						<text class="label">服务费</text>
+						<text class="value"><text class="u-font-22">¥</text>{{ detailData.handlingFee }}</text>
+					</view>
+					<view class="detail-item" v-if="detailData.status === 3 && detailData.failReason">
+						<text class="label">失败原因</text>
+						<text class="value error-text">{{ detailData.failReason }}</text>
+					</view>
+					<view class="detail-item">
+						<text class="label">处理进度</text>
+						<view class="value">
+							<up-steps :current="currentStep" activeColor="#13C15A" direction="column" size="mini">
+								<up-steps-item title="发起提现申请" :desc="detailData.withdrawalTime"></up-steps-item>
+								<up-steps-item title="系统处理中" desc="预计24小时内到账"></up-steps-item>
+								<up-steps-item 
+									:title="detailData.status === 3 ? '提现失败' : '提现成功'" 
+									:desc="detailData.withdrawalTime || (detailData.status === 3 ? '提现失败,请重试' : '')"
+									:error="detailData.status === 3"
+								></up-steps-item>
+							</up-steps>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<style lang="scss" scoped>
+.page-container {
+	min-height: 100vh;
+	background-color: #F7F8FA;
+}
+
+.content-wrapper {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	padding: 40rpx 30rpx;
+}
+
+.status-header {
+	width: 100%;
+	padding: 60rpx 0;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+
+	.icon-box {
+		margin-bottom: 20rpx;
+	}
+
+	.status-text {
+		font-size: 36rpx;
+	}
+
+	.status-desc {
+		font-size: 28rpx;
+		color: #999;
+		text-align: center;
+	}
+
+	.amount-box {
+		color: #333;
+		display: flex;
+		align-items: baseline;
+		
+		.symbol {
+			font-size: 44rpx;
+			font-weight: 500;
+		}
+		.amount {
+			font-size: 80rpx;
+			font-weight: 500;
+		}
+	}
+}
+
+.info-card {
+	width: 100%;
+	background-color: #fff;
+	border-radius: 20rpx;
+	padding: 30rpx;
+	box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.03);
+
+	.bank-info {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		padding-bottom: 30rpx;
+		border-bottom: 1rpx solid #F0F0F0;
+		margin-bottom: 20rpx;
+
+		.bank-name {
+			font-size: 32rpx;
+			color: #333;
+			margin-left: 16rpx;
+		}
+	}
+
+	.detail-list {
+		.detail-item {
+			font-size: 28rpx;
+			padding: 18rpx 0;
+			display: flex;
+			align-items: baseline;
+
+			.label {
+				width: 112rpx;
+				color: #666;
+				margin-right: 32rpx;
+			}
+
+			.value {
+				color: #333;
+				font-weight: 400;
+			}
+
+			.error-text {
+				color: #FF4D4F;
+			}
+		}
+	}
+}
+</style>

+ 57 - 42
src/pages-B/payment/withdrawal.vue

@@ -1,18 +1,18 @@
 <script setup lang="ts">
-import { ref, onMounted } from 'vue'
-import { useRequest } from 'alova/client'
-import { getBankcardList, netWithdraw, type BankCard, type WithdrawParams } from '@/api/pay'
+import { ref } from 'vue'
+import { getBankcardList, netWithdraw } from '@/api/pay'
+import type { bankcardListResponse, netWithdrawResponse } from '@/api/types/pay'
 import { getImageUrl } from '@/utils/imageUtil'
 import BankCardSelector from './bankCard-select.vue';
 
 // 当前选择的银行卡
-const bankCard = ref<BankCard>({ id: '', bankName: '', bankCardNumber: '', bankImage: '' })
+const bankCard = ref<bankcardListResponse>({ id: '', bankName: '', bankCardNumber: '', bankImage: '' })
 // 当前可提现余额
 const availableBalance = ref('0')
 // 提现金额输入框的值
 const withdrawalAmount = ref('')
 // 银行卡数据
-const bankCards = ref<BankCard[]>([])
+const bankCards = ref<bankcardListResponse[]>([])
 // 银行卡数量
 const bankCardNumber = ref(0)
 // 默认选中的卡ID
@@ -22,20 +22,6 @@ const focus = ref(false)
 // 域名
 const domain = ref('')
 
-// 获取银行卡列表
-const { send: fetchBankCards } = useRequest(getBankcardList, {
-    immediate: false,
-    onSuccess: (data: BankCard[]) => {
-        bankCards.value = data
-        if (data.length > 0) {
-            bankCard.value = data[0]
-        }
-    },
-    onError: (error: any) => {
-        console.error('获取银行卡列表失败:', error)
-    }
-})
-
 // 页面加载时
 onLoad((query?: Record<string, string>) => {
     if (query?.m?.length) availableBalance.value = query.m
@@ -54,6 +40,26 @@ onReady(() => {
     focus.value = true
 })
 
+// 获取银行卡列表
+function fetchBankCards() {
+    getBankcardList().then((res: any) => {  
+        if (res.data.code === 200) {
+            bankCards.value = res.data.result.map((item: bankcardListResponse) => ({
+                ...item,
+                logo: item.bankImage,
+                last4: item.bankCardNumber?.slice(-4) || ''
+            }))
+
+            // 默认选中第一张卡
+            if (res.data.result && res.data.result.length > 0) {
+                bankCard.value = res.data.result[0]
+            }
+        }
+    }).catch((error: any) => {
+        console.error('获取银行卡列表失败:', error)
+    })
+}
+
 // 选择/修改银行卡
 const bcSelector = ref()
 function selectBankCard() {
@@ -65,7 +71,7 @@ function selectBankCard() {
 }
 
 // 选择事件回调
-function handleCardSelect(card: BankCard) {
+function handleCardSelect(card: bankcardListResponse) {
     console.log('您选择了:', card)
     bankCard.value = card
     uni.showToast({
@@ -101,30 +107,32 @@ async function applyWithdrawal() {
         return
     }
     
-    const params: WithdrawParams = {
-        amount: withdrawalAmount.value,
-        bankId: bankCard.value.id,
-        callBackUrl: `${domain.value}pages-B/payment/withdrawal?m=${availableBalance.value}`
+    const params: netWithdrawResponse = {
+        applyAmount: withdrawalAmount.value,
+        bankCardId: bankCard.value.id,
+        // callBackUrl: `${domain.value}/pages-B/payment/withdrawal?m=${availableBalance.value}`
     }
     console.log('提交提现申请:', params)
 
     // 提现
     uni.showLoading({ title: '提交中' })
-    try {
-        const res = await netWithdraw(params)
-        console.log('提现结果:', res)
-        uni.hideLoading()
-        uni.showToast({ title: '提现申请成功', icon: 'success' })
-        // 成功后可跳转到提现记录页
-    } catch (error: any) {
-        uni.hideLoading()
-        if (error?.message) {
-            uni.showToast({
-                title: error.message,
-                icon: 'none'
-            })
+	netWithdraw(params).then((res: any) => {
+		if (res.data.code === 200) {
+			setTimeout(() => {
+				uni.hideLoading();
+				uni.showToast({ title: '提现申请成功', icon: 'success' });
+				uni.navigateBack({ delta: 1 })
+			}, 1500);
+		} else {
+		  uni.$u.toast(res.data.message);
         }
-    }
+        // else if (res.data.code === 99 && res.data.message) {
+		// 	// 白名单接口请求失败-跳转三方链接
+		// 	toThirdPartyLink(res.data.message);
+		// }
+	}).finally(() => {
+		uni.hideLoading();
+	});
 }
 
 // 跳转三方链接
@@ -149,7 +157,7 @@ function extractDomain(url: string): string {
 
 <template>
 	<view class="page-container new-content">
-		<u-navbar title="提现" :auto-back="true" bgColor="#ffffff" :placeholder="true" :title-style="{ fontWeight: 'bold' }"></u-navbar>
+		<up-navbar title="提现" :auto-back="true" bgColor="#ffffff" :placeholder="true" :title-style="{ fontWeight: 'bold' }"></up-navbar>
 
 		<view class="form-card">
 			<view class="section-item" @click="selectBankCard">
@@ -178,7 +186,7 @@ function extractDomain(url: string): string {
 						placeholder="请输入提现金额" 
 						:focus="focus"
 						:customStyle="{ 
-							padding: '0 10rpx' 
+							padding: '0 10rpx'
 						}"
 						v-model="withdrawalAmount" 
 					></u--input>
@@ -203,7 +211,11 @@ function extractDomain(url: string): string {
 
 		<view class="footer-bar">
             <u-button 
-				type="primary" 
+                :customStyle="{
+                    color: '#fff',
+                    background: 'linear-gradient( 90deg, #FF8F83 0%, #FF3F51 100%)',
+                    borderRadius: '8rpx',
+                }"
 				:disabled="!withdrawalAmount || parseFloat(withdrawalAmount) <= 1" 
 				@click="applyWithdrawal"
 			>申请提现</u-button>
@@ -212,7 +224,7 @@ function extractDomain(url: string): string {
 		<BankCardSelector 
 			ref="bcSelector" 
 			subtitle="请留意各银行到账时间"
-			:data-list="bankCards"
+			:dataList="bankCards"
 			v-model="selectedCardId"
 			@select="handleCardSelect"
 		/>
@@ -298,6 +310,9 @@ function extractDomain(url: string): string {
 			padding-right: 10rpx;
 		}
 
+        ::v-deep .u-input__content__field-wrapper__field {
+			height: 60rpx;
+		}
 		// .withdrawal-input {
 		// 	font-size: 52rpx;
 		// 	padding: 0 10rpx;

+ 83 - 24
src/pages/income/income.vue

@@ -3,11 +3,13 @@ import { onReachBottom } from '@dcloudio/uni-app'
 import { usePagination, useRequest } from 'alova/client'
 import { storeToRefs } from 'pinia'
 import { computed, ref, watch } from 'vue'
+import dayjs from 'dayjs'
 import { getAccountCount } from '@/api/home'
 import { getBankSignRecord } from '@/api/pay'
 import { getCouponIssuerAccountByPageMap } from '@/api/income'
 import IncomeItem from '@/components/IncomeItem.vue'
 import MescrollBody from '@/custom-components/custom-mescroll/mescroll-body.vue'
+import FilterTime from '@/components/FilterTime.vue'
 import { useShare } from '@/hooks/useShare'
 import { useUserStore } from '@/store'
 import { useTokenStore } from '@/store/token'
@@ -43,6 +45,15 @@ const pickerShow = ref(false)
 const totalAmount = ref(0)
 const mescrollHeight = ref(0)
 const incomeShareInfoRef = ref(null)
+const filterTimeRef = ref()
+// 默认日期范围:本月第一天到今天
+const getDefaultDateRange = (): [string, string] => {
+    const now = dayjs()
+    const startOfMonth = now.startOf('month').format('YYYY/MM/DD')
+    const today = now.format('YYYY/MM/DD')
+    return [startOfMonth, today]
+}
+const dateRangeValue = ref<[string, string]>(getDefaultDateRange())
 let mescroll = null
 
 // 新增:滚动距离和透明度
@@ -60,14 +71,27 @@ onPageScroll((e) => {
     scrollTop.value = e.scrollTop
 })
 
-const { send: getIncomeData, data: incomeData, pageCount, loading, page, pageSize, isLastPage, refresh, reload, onSuccess, onError } = usePagination((page, pageSize) => getCouponIssuerAccountByPageMap({
-    pageNo: page,
-    pageSize,
-    type: 1,
-    status: activeIndex.value,
-    year: changtime(pickerDate.value, 'YYYY'),
-    month: changtime(pickerDate.value, 'MM'),
-}), {
+const { send: getIncomeData, data: incomeData, pageCount, loading, page, pageSize, isLastPage, refresh, reload, onSuccess, onError } = usePagination((page, pageSize) => {
+    const params: Record<string, any> = {
+        pageNo: page,
+        pageSize,
+        type: 1,
+        status: activeIndex.value,
+    }
+    // 根据tab类型选择日期参数
+    if (activeIndex.value === 2) {
+        // 已提现:使用日期范围
+        if (dateRangeValue.value[0] && dateRangeValue.value[1]) {
+            params.startDate = dateRangeValue.value[0]
+            params.endDate = dateRangeValue.value[1]
+        }
+    } else {
+        // 待结算/已结算:使用年月
+        params.year = changtime(pickerDate.value, 'YYYY')
+        params.month = changtime(pickerDate.value, 'MM')
+    }
+    return getCouponIssuerAccountByPageMap(params)
+}, {
     initialPage: 1,
     initialPageSize: 10,
     append: true,
@@ -228,6 +252,22 @@ async function pickerConfirm() {
     showLoading.value = false
 }
 
+async function handleDateRangeChange(value: [string, string]) {
+    dateRangeValue.value = value
+    mescroll.scrollTo(0, 0)
+    mescroll.hideUpScroll()
+    showLoading.value = true
+    await reload()
+    showLoading.value = false
+}
+
+function formatDateRangeDisplay() {
+    if (!dateRangeValue.value[0] || !dateRangeValue.value[1]) {
+        return '选择日期范围'
+    }
+    return `${dateRangeValue.value[0]} - ${dateRangeValue.value[1]}`
+}
+
 onShow(async () => {
     // 登录后查询收益数据
     if (hasLogin) {
@@ -276,18 +316,26 @@ function goPage(page: string) {
 
 function goToWithdrawal() {
     // 获取可提现余额
-    const withdrawableAmount = 100
-    // const withdrawableAmount = accountCountData.value?.withdrawableAmount || 0
+    const money = accountCountData.value?.withdrawableAmount || 0
+    const bankNumber = accountCountData.value?.bankNumber || 0
     uni.navigateTo({
-        url: `/pages-B/payment/withdrawal?m=${withdrawableAmount}`,
+        url: `/pages-B/payment/withdrawal?m=${money}&bankNumber=${bankNumber}`,
     })
 }
 
-function handleItemClick(item) {
-    uni.navigateTo({
-        url: `/pages-A/incomeShareInfo/index?batchId=${item.batchId}&commissionType=${item.commissionType}&type=${activeIndex.value}`,
-    })
-    // incomeShareInfoRef.value.show(item)
+function handleItemClick(item: any) {
+    if (activeIndex.value == 2) {
+        // 跳转提现详情页
+        uni.navigateTo({
+            url: `/pages-B/payment/detail-withdraw?id=${item.payoutNo}`,
+        })
+    } else {
+        uni.navigateTo({
+            url: `/pages-A/incomeShareInfo/index?batchId=${item.batchId}&commissionType=${item.commissionType}&type=${activeIndex.value}`,
+        })
+        // incomeShareInfoRef.value.show(item)
+    }
+
 }
 
 function onAClick() {
@@ -376,7 +424,7 @@ function onAClick() {
                     </view>
                     <view class="income-header-tips-item" @click="onAClick">
                         <view class="income-header-tips-item-num">
-                            {{ accountCountData?.unsettledAmount || 0 }}
+                            {{ accountCountData?.bankNumber || 0 }}
                         </view>
                         <view class="income-header-tips-item-des">
                             银行卡
@@ -411,12 +459,22 @@ function onAClick() {
             </view>
             <!-- 时间筛选 -->
             <view class="income-menu-time-filter" :style="{ top: `calc(${menuButtonInfo.bottom + 4}px + 90rpx)` }">
-                <view class="income-menu-time-filter-text" @click="pickerShow = true">
-                    <text>{{ changtime(pickerDate) }}</text>
-                    <up-icon name="arrow-down" color="#666666" size="14" />
-                    <up-datetime-picker v-model="pickerDate" :show="pickerShow" mode="year-month" close-on-click-overlay
-                        @confirm="pickerConfirm" @cancel="pickerShow = false" />
-                </view>
+                <!-- 已提现使用日期范围选择 -->
+                <template v-if="activeIndex === 2">
+                    <view class="income-menu-time-filter-text" @click="filterTimeRef?.openPopup()">
+                        <text>{{ formatDateRangeDisplay() }}</text>
+                        <up-icon name="arrow-down" color="#666666" size="14" />
+                    </view>
+                </template>
+                <!-- 待结算/已结算使用年月选择 -->
+                <template v-else>
+                    <view class="income-menu-time-filter-text" @click="pickerShow = true">
+                        <text>{{ changtime(pickerDate) }}</text>
+                        <up-icon name="arrow-down" color="#666666" size="14" />
+                        <up-datetime-picker v-model="pickerDate" :show="pickerShow" mode="year-month" close-on-click-overlay
+                            @confirm="pickerConfirm" @cancel="pickerShow = false" />
+                    </view>
+                </template>
                 <view>
                     合计:¥{{ totalAmount }}
                 </view>
@@ -432,6 +490,7 @@ function onAClick() {
             </view>
         </mescroll-body>
     </view>
+    <FilterTime ref="filterTimeRef" v-model="dateRangeValue" @confirm="handleDateRangeChange" />
     <!-- <IncomeShareInfo ref="incomeShareInfoRef" :type="activeIndex" /> -->
 </template>
 
@@ -714,4 +773,4 @@ function onAClick() {
         border-bottom-right-radius: 10rpx;
     }
 }
-</style>
+</style>

BIN
src/static/common/empty-card.png


+ 1 - 1
src/style/index.scss

@@ -38,7 +38,7 @@ page {
 	left: 0;
 	right: 0;
 	bottom: 0;
-	z-index: 1;
+	z-index: 3;
 	background-color: #fff;
 	padding: 20rpx 24rpx;
 	box-shadow: 0 -4rpx 12rpx rgba(0, 0, 0, 0.05);