Browse Source

对接部分页面功能接口好字段

v2.0
DU 3 months ago
parent
commit
e05547602e
  1. 2
      src/api/recharge.ts
  2. 6
      src/pagesOrder/accountBalance/components/RechargeRecordList.scss
  3. 117
      src/pagesOrder/accountBalance/components/RechargeRecordList.tsx
  4. 22
      src/pagesOrder/accountBalance/index.tsx
  5. 6
      src/pagesOrder/rechargeDetail/index.scss
  6. 129
      src/pagesOrder/rechargeDetail/index.tsx
  7. 3
      src/types/recharge.ts
  8. 111
      src/utils/rechargeRecords.ts

2
src/api/recharge.ts

@ -127,6 +127,8 @@ export const getRechargeRecords = async (params: RechargeRecordQueryParams) => {
instName: String(pickField(item, 'instName', 'instname') ?? ''), instName: String(pickField(item, 'instName', 'instname') ?? ''),
logTime: String(pickField(item, 'logTime', 'logtime') ?? ''), logTime: String(pickField(item, 'logTime', 'logtime') ?? ''),
updateTime: String(pickField(item, 'updateTime', 'updatetime') ?? ''), updateTime: String(pickField(item, 'updateTime', 'updatetime') ?? ''),
status: toNumber(pickField(item, 'status')),
outTradeNo: String(pickField(item, 'outTradeNo', 'outtradeno') ?? ''),
})), })),
totalCount: toNumber(pickField(src as Record<string, unknown>, 'totalCount', 'totalcount')), totalCount: toNumber(pickField(src as Record<string, unknown>, 'totalCount', 'totalcount')),
pageIndex: toNumber(pickField(src as Record<string, unknown>, 'pageIndex', 'pageindex'), 1), pageIndex: toNumber(pickField(src as Record<string, unknown>, 'pageIndex', 'pageindex'), 1),

6
src/pagesOrder/accountBalance/components/RechargeRecordList.scss

@ -2,6 +2,12 @@
padding: 30px; padding: 30px;
// 空数据展示 // 空数据展示
.empty-wrap {
.empty-month-card {
margin-bottom: 0;
}
}
.empty-data { .empty-data {
display: flex; display: flex;
justify-content: center; justify-content: center;

117
src/pagesOrder/accountBalance/components/RechargeRecordList.tsx

@ -1,76 +1,57 @@
/** /**
* 充值记录列表组件 * 充值记录列表组件(账户余额页 Tab)
*/ */
import { View, Text, Image } from '@tarojs/components' import { View, Text, Image } from '@tarojs/components'
import { FC, useState } from 'react' import { FC, useEffect, useState } from 'react'
import { ArrowDown } from '@taroify/icons' import { ArrowDown } from '@taroify/icons'
import { Popup, DatetimePicker } from '@taroify/core' import { Popup, DatetimePicker } from '@taroify/core'
import Taro from '@tarojs/taro' import Taro from '@tarojs/taro'
import {
fetchRechargeRecordsByMonth,
getCurrentYearMonth,
RechargeRecordViewItem,
} from '../../../utils/rechargeRecords'
import './RechargeRecordList.scss' import './RechargeRecordList.scss'
import { getBigImage } from '@/utils/imageHelper' import { getBigImage } from '@/utils/imageHelper'
interface RechargeRecordItem {
id: string
storeName: string
rechargeTime: string
rechargeType: string
amount: number
status: string
}
interface RechargeRecordListProps { interface RechargeRecordListProps {
recordList: RechargeRecordItem[] /** 兼容旧 props,实际数据改由接口拉取 */
recordList?: RechargeRecordViewItem[]
} }
const RechargeRecordList: FC<RechargeRecordListProps> = ({ recordList }) => { const RechargeRecordList: FC<RechargeRecordListProps> = () => {
const [selectedMonth, setSelectedMonth] = useState('2025-03') const [selectedMonth, setSelectedMonth] = useState(getCurrentYearMonth())
const [datePickerOpen, setDatePickerOpen] = useState(false) const [datePickerOpen, setDatePickerOpen] = useState(false)
const [pickerValue, setPickerValue] = useState(new Date()) const [pickerValue, setPickerValue] = useState(new Date())
const [dataList, setDataList] = useState<RechargeRecordItem[]>(recordList) const [dataList, setDataList] = useState<RechargeRecordViewItem[]>([])
// 模拟接口请求充值记录数据 const loadRecords = async (yearMonth: string) => {
const fetchRechargeRecords = async (yearMonth: string) => { Taro.showLoading({ title: '加载中...', mask: true })
Taro.showLoading({ try {
title: '加载中...', const list = await fetchRechargeRecordsByMonth(yearMonth)
mask: true setDataList(list)
}) } catch (error: any) {
setDataList([])
// 模拟接口请求 if (error?.message === 'NO_CUSTOMER_SN') {
return new Promise<RechargeRecordItem[]>((resolve) => { Taro.showToast({ title: '请先登录', icon: 'none', duration: 2000 })
setTimeout(() => {
// 模拟返回数据
const mockData: RechargeRecordItem[] = [
{
id: `${yearMonth}-1`,
storeName: '来力.山岩',
rechargeTime: `${yearMonth}-15 14:30:00`,
rechargeType: '账户充值',
amount: 100,
status: '充值完成'
},
{
id: `${yearMonth}-2`,
storeName: '来力.山岩',
rechargeTime: `${yearMonth}-10 10:20:00`,
rechargeType: '账户充值',
amount: 200,
status: '充值完成'
} }
] } finally {
setDataList(mockData)
Taro.hideLoading() Taro.hideLoading()
resolve(mockData) }
}, 1000) // 模拟 1 秒的网络延迟
})
} }
// 按月份分组记录 useEffect(() => {
const groupByMonth = (records: RechargeRecordItem[]) => { loadRecords(selectedMonth)
const groups: Record<string, RechargeRecordItem[]> = {} // 仅挂载时拉当前月
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
const groupByMonth = (records: RechargeRecordViewItem[]) => {
const groups: Record<string, RechargeRecordViewItem[]> = {}
records.forEach(record => { records.forEach(record => {
const month = record.rechargeTime.substring(0, 7) // 提取 YYYY-MM const month = (record.rechargeTime || '').substring(0, 7)
if (!month || month.length < 7) return
if (!groups[month]) { if (!groups[month]) {
groups[month] = [] groups[month] = []
} }
@ -81,17 +62,14 @@ const RechargeRecordList: FC<RechargeRecordListProps> = ({ recordList }) => {
const groupedRecords = groupByMonth(dataList) const groupedRecords = groupByMonth(dataList)
// 计算当月总充值金额 const calculateMonthTotal = (records: RechargeRecordViewItem[]) => {
const calculateMonthTotal = (records: RechargeRecordItem[]) => { return records.reduce((sum, record) => sum + (record.amount || 0), 0)
return records.reduce((sum, record) => sum + record.amount, 0)
} }
// 打开月份选择器
const handleSelectMonth = () => { const handleSelectMonth = () => {
setDatePickerOpen(true) setDatePickerOpen(true)
} }
// 确认选择月份
const handleDateConfirm = async (value: Date) => { const handleDateConfirm = async (value: Date) => {
const year = value.getFullYear() const year = value.getFullYear()
const month = String(value.getMonth() + 1).padStart(2, '0') const month = String(value.getMonth() + 1).padStart(2, '0')
@ -101,11 +79,9 @@ const RechargeRecordList: FC<RechargeRecordListProps> = ({ recordList }) => {
setPickerValue(value) setPickerValue(value)
setDatePickerOpen(false) setDatePickerOpen(false)
// 调用接口请求该月份的数据 await loadRecords(formattedMonth)
await fetchRechargeRecords(formattedMonth)
} }
// 取消选择
const handleDateCancel = () => { const handleDateCancel = () => {
setDatePickerOpen(false) setDatePickerOpen(false)
} }
@ -113,9 +89,19 @@ const RechargeRecordList: FC<RechargeRecordListProps> = ({ recordList }) => {
return ( return (
<View className="recharge-record-list"> <View className="recharge-record-list">
{dataList.length === 0 ? ( {dataList.length === 0 ? (
<View className="empty-wrap">
<View className="month-card empty-month-card">
<View className="month-header">
<View className="month-left" onClick={handleSelectMonth}>
<Text className="month-text">{selectedMonth}</Text>
<ArrowDown className="month-arrow" size="20px" color="#FFFEFE" />
</View>
</View>
</View>
<View className="empty-data"> <View className="empty-data">
<Image className="empty-image" src={getBigImage('NO_DATA')} mode="aspectFit" /> <Image className="empty-image" src={getBigImage('NO_DATA')} mode="aspectFit" />
</View> </View>
</View>
) : ( ) : (
<> <>
{Object.keys(groupedRecords).map(month => { {Object.keys(groupedRecords).map(month => {
@ -124,7 +110,6 @@ const RechargeRecordList: FC<RechargeRecordListProps> = ({ recordList }) => {
return ( return (
<View key={month} className="month-card"> <View key={month} className="month-card">
{/* 月份标题和充值统计 */}
<View className="month-header"> <View className="month-header">
<View className="month-left" onClick={handleSelectMonth}> <View className="month-left" onClick={handleSelectMonth}>
<Text className="month-text">{month}</Text> <Text className="month-text">{month}</Text>
@ -137,26 +122,21 @@ const RechargeRecordList: FC<RechargeRecordListProps> = ({ recordList }) => {
</View> </View>
</View> </View>
{/* 分割线 */}
<View className="divider" /> <View className="divider" />
{/* 记录列表 */}
<View className="record-list"> <View className="record-list">
{monthRecords.map((item, index) => ( {monthRecords.map((item, index) => (
<View key={item.id}> <View key={item.id}>
<View className="record-item"> <View className="record-item">
{/* 第一行:店铺名称 + 状态 */}
<View className="item-row"> <View className="item-row">
<Text className="store-name">{item.storeName}</Text> <Text className="store-name">{item.storeName}</Text>
<Text className="status">{item.status}</Text> <Text className="status">{item.status}</Text>
</View> </View>
{/* 第二行:充值类型 */}
<View className="item-row"> <View className="item-row">
<Text className="recharge-type">{item.rechargeType}</Text> <Text className="recharge-type">{item.rechargeType}</Text>
</View> </View>
{/* 第三行:充值时间 + 实付金额 */}
<View className="item-row"> <View className="item-row">
<Text className="recharge-time">充值时间:{item.rechargeTime}</Text> <Text className="recharge-time">充值时间:{item.rechargeTime}</Text>
<View className="actual-pay"> <View className="actual-pay">
@ -166,7 +146,6 @@ const RechargeRecordList: FC<RechargeRecordListProps> = ({ recordList }) => {
</View> </View>
</View> </View>
{/* item 之间的分割线 */}
{index < monthRecords.length - 1 && ( {index < monthRecords.length - 1 && (
<View className="item-divider" /> <View className="item-divider" />
)} )}
@ -177,14 +156,12 @@ const RechargeRecordList: FC<RechargeRecordListProps> = ({ recordList }) => {
) )
})} })}
{/* 到底了提示 */}
<View className="list-end"> <View className="list-end">
<Text className="end-text">到底了~</Text> <Text className="end-text">到底了~</Text>
</View> </View>
</> </>
)} )}
{/* 年月选择器 */}
<Popup <Popup
open={datePickerOpen} open={datePickerOpen}
placement="bottom" placement="bottom"

22
src/pagesOrder/accountBalance/index.tsx

@ -73,26 +73,6 @@ const AccountBalance = () => {
} }
]) ])
// 充值记录模拟数据
const [rechargeRecordList] = useState([
{
id: '1',
storeName: '北京XXXXXXXXXXXXX店',
rechargeTime: '2025-03-09 00:00:00',
rechargeType: '账户充值',
amount: 100.00,
status: '充值完成'
},
{
id: '2',
storeName: '北京XXX店',
rechargeTime: '2025-03-09 00:00:00',
rechargeType: '账户充值',
amount: 100.00,
status: '充值完成'
}
])
useLoad(() => { useLoad(() => {
console.log('账户余额页面加载') console.log('账户余额页面加载')
}) })
@ -139,7 +119,7 @@ const AccountBalance = () => {
)} )}
{activeTab === 2 && ( {activeTab === 2 && (
<RechargeRecordList recordList={rechargeRecordList} /> <RechargeRecordList />
)} )}
</ScrollView> </ScrollView>
</View> </View>

6
src/pagesOrder/rechargeDetail/index.scss

@ -4,6 +4,12 @@
min-height: 100vh; min-height: 100vh;
// 空数据展示 // 空数据展示
.empty-wrap {
.empty-month-card {
margin-bottom: 0;
}
}
.empty-data { .empty-data {
display: flex; display: flex;
justify-content: center; justify-content: center;

129
src/pagesOrder/rechargeDetail/index.tsx

@ -6,90 +6,46 @@ import { useState } from 'react'
import { ArrowDown } from '@taroify/icons' import { ArrowDown } from '@taroify/icons'
import { Popup, DatetimePicker } from '@taroify/core' import { Popup, DatetimePicker } from '@taroify/core'
import Taro, { useLoad } from '@tarojs/taro' import Taro, { useLoad } from '@tarojs/taro'
import {
fetchRechargeRecordsByMonth,
getCurrentYearMonth,
RechargeRecordViewItem,
} from '../../utils/rechargeRecords'
import './index.scss' import './index.scss'
import { getBigImage } from '@/utils/imageHelper' import { getBigImage } from '@/utils/imageHelper'
interface RechargeRecordItem {
id: string
storeName: string
rechargeTime: string
rechargeType: string
amount: number
status: string
}
const RechargeDetail = () => { const RechargeDetail = () => {
const [selectedMonth, setSelectedMonth] = useState('2025-03') const [selectedMonth, setSelectedMonth] = useState(getCurrentYearMonth())
const [datePickerOpen, setDatePickerOpen] = useState(false) const [datePickerOpen, setDatePickerOpen] = useState(false)
const [pickerValue, setPickerValue] = useState(new Date()) const [pickerValue, setPickerValue] = useState(new Date())
const [dataList, setDataList] = useState<RechargeRecordViewItem[]>([])
// 模拟充值记录数据
const [dataList, setDataList] = useState<RechargeRecordItem[]>([ const loadRecords = async (yearMonth: string) => {
{ Taro.showLoading({ title: '加载中...', mask: true })
id: '2025-03-1', try {
storeName: '北京球场风云店', const list = await fetchRechargeRecordsByMonth(yearMonth)
rechargeTime: '2025-03-09 00:00:00', setDataList(list)
rechargeType: '账户充值', } catch (error: any) {
amount: 100.00, setDataList([])
status: '充值完成' if (error?.message === 'NO_CUSTOMER_SN') {
}, Taro.showToast({ title: '请先登录', icon: 'none', duration: 2000 })
{ }
id: '2025-03-2', // 其它错误由 request 拦截器提示
storeName: '北京球场风云店', } finally {
rechargeTime: '2025-03-06 00:00:00', Taro.hideLoading()
rechargeType: '账户充值',
amount: 100.00,
status: '充值完成'
} }
])
useLoad(() => {
console.log('充值明细页面加载')
})
// 模拟接口请求充值记录数据
const fetchRechargeRecords = async (yearMonth: string) => {
Taro.showLoading({
title: '加载中...',
mask: true
})
// 模拟接口请求
return new Promise<RechargeRecordItem[]>((resolve) => {
setTimeout(() => {
// 模拟返回数据
const mockData: RechargeRecordItem[] = [
{
id: `${yearMonth}-1`,
storeName: '北京球场风云店',
rechargeTime: `${yearMonth}-15 14:30:00`,
rechargeType: '账户充值',
amount: 100,
status: '充值完成'
},
{
id: `${yearMonth}-2`,
storeName: '北京球场风云店',
rechargeTime: `${yearMonth}-10 10:20:00`,
rechargeType: '账户充值',
amount: 200,
status: '充值完成'
} }
]
setDataList(mockData) useLoad(() => {
Taro.hideLoading() loadRecords(selectedMonth)
resolve(mockData)
}, 1000) // 模拟 1 秒的网络延迟
}) })
}
// 按月份分组记录 const groupByMonth = (records: RechargeRecordViewItem[]) => {
const groupByMonth = (records: RechargeRecordItem[]) => { const groups: Record<string, RechargeRecordViewItem[]> = {}
const groups: Record<string, RechargeRecordItem[]> = {}
records.forEach(record => { records.forEach(record => {
const month = record.rechargeTime.substring(0, 7) // 提取 YYYY-MM const month = (record.rechargeTime || '').substring(0, 7)
if (!month || month.length < 7) return
if (!groups[month]) { if (!groups[month]) {
groups[month] = [] groups[month] = []
} }
@ -100,17 +56,14 @@ const RechargeDetail = () => {
const groupedRecords = groupByMonth(dataList) const groupedRecords = groupByMonth(dataList)
// 计算当月总充值金额 const calculateMonthTotal = (records: RechargeRecordViewItem[]) => {
const calculateMonthTotal = (records: RechargeRecordItem[]) => { return records.reduce((sum, record) => sum + (record.amount || 0), 0)
return records.reduce((sum, record) => sum + record.amount, 0)
} }
// 打开月份选择器
const handleSelectMonth = () => { const handleSelectMonth = () => {
setDatePickerOpen(true) setDatePickerOpen(true)
} }
// 确认选择月份
const handleDateConfirm = async (value: Date) => { const handleDateConfirm = async (value: Date) => {
const year = value.getFullYear() const year = value.getFullYear()
const month = String(value.getMonth() + 1).padStart(2, '0') const month = String(value.getMonth() + 1).padStart(2, '0')
@ -120,21 +73,30 @@ const RechargeDetail = () => {
setPickerValue(value) setPickerValue(value)
setDatePickerOpen(false) setDatePickerOpen(false)
// 调用接口请求该月份的数据 await loadRecords(formattedMonth)
await fetchRechargeRecords(formattedMonth)
} }
// 取消选择
const handleDateCancel = () => { const handleDateCancel = () => {
setDatePickerOpen(false) setDatePickerOpen(false)
} }
return ( return (
<View className="recharge-detail-page"> <View className="recharge-detail-page">
{/* 无数据时仍可切换月份 */}
{dataList.length === 0 ? ( {dataList.length === 0 ? (
<View className="empty-wrap">
<View className="month-card empty-month-card">
<View className="month-header">
<View className="month-left" onClick={handleSelectMonth}>
<Text className="month-text">{selectedMonth}</Text>
<ArrowDown className="month-arrow" size="20px" color="#000000" />
</View>
</View>
</View>
<View className="empty-data"> <View className="empty-data">
<Image className="empty-image" src={getBigImage('NO_DATA')} mode="aspectFit" /> <Image className="empty-image" src={getBigImage('NO_DATA')} mode="aspectFit" />
</View> </View>
</View>
) : ( ) : (
<> <>
{Object.keys(groupedRecords).map(month => { {Object.keys(groupedRecords).map(month => {
@ -143,7 +105,6 @@ const RechargeDetail = () => {
return ( return (
<View key={month} className="month-card"> <View key={month} className="month-card">
{/* 月份标题和充值统计 */}
<View className="month-header"> <View className="month-header">
<View className="month-left" onClick={handleSelectMonth}> <View className="month-left" onClick={handleSelectMonth}>
<Text className="month-text">{month}</Text> <Text className="month-text">{month}</Text>
@ -156,26 +117,21 @@ const RechargeDetail = () => {
</View> </View>
</View> </View>
{/* 分割线 */}
<View className="divider" /> <View className="divider" />
{/* 记录列表 */}
<View className="record-list"> <View className="record-list">
{monthRecords.map((item, index) => ( {monthRecords.map((item, index) => (
<View key={item.id}> <View key={item.id}>
<View className="record-item"> <View className="record-item">
{/* 第一行:店铺名称 + 状态 */}
<View className="item-row"> <View className="item-row">
<Text className="store-name">{item.storeName}</Text> <Text className="store-name">{item.storeName}</Text>
<Text className="status">{item.status}</Text> <Text className="status">{item.status}</Text>
</View> </View>
{/* 第二行:充值类型 */}
<View className="item-row"> <View className="item-row">
<Text className="recharge-type">{item.rechargeType}</Text> <Text className="recharge-type">{item.rechargeType}</Text>
</View> </View>
{/* 第三行:充值时间 + 实付金额 */}
<View className="item-row"> <View className="item-row">
<Text className="recharge-time">充值时间:{item.rechargeTime}</Text> <Text className="recharge-time">充值时间:{item.rechargeTime}</Text>
<View className="actual-pay"> <View className="actual-pay">
@ -185,7 +141,6 @@ const RechargeDetail = () => {
</View> </View>
</View> </View>
{/* item 之间的分割线 */}
{index < monthRecords.length - 1 && ( {index < monthRecords.length - 1 && (
<View className="item-divider" /> <View className="item-divider" />
)} )}
@ -196,14 +151,12 @@ const RechargeDetail = () => {
) )
})} })}
{/* 到底了提示 */}
<View className="list-end"> <View className="list-end">
<Text className="end-text">到底了~</Text> <Text className="end-text">到底了~</Text>
</View> </View>
</> </>
)} )}
{/* 年月选择器 */}
<Popup <Popup
open={datePickerOpen} open={datePickerOpen}
placement="bottom" placement="bottom"

3
src/types/recharge.ts

@ -73,6 +73,9 @@ export interface RechargeRecordItem {
instName: string instName: string
logTime: string logTime: string
updateTime: string updateTime: string
/** 状态(文档未给枚举,前端做兜底文案) */
status: number
outTradeNo: string
} }
export interface RechargeRecordPagedResult { export interface RechargeRecordPagedResult {

111
src/utils/rechargeRecords.ts

@ -0,0 +1,111 @@
/**
* 充值记录:月份区间、状态文案、列表展示映射
*/
import { getRechargeRecords } from '../api/recharge'
import { RechargeRecordItem } from '../types/recharge'
import { userStore } from '../store'
/** 列表项(页面展示结构) */
export interface RechargeRecordViewItem {
id: string
storeName: string
rechargeTime: string
rechargeType: string
amount: number
status: string
}
/** 当前年月 YYYY-MM */
export const getCurrentYearMonth = (): string => {
const now = new Date()
const year = now.getFullYear()
const month = String(now.getMonth() + 1).padStart(2, '0')
return `${year}-${month}`
}
/** 某月起止时间(供 records 接口过滤) */
export const getMonthDateRange = (yearMonth: string): { startDate: string; endDate: string } => {
const [yStr, mStr] = yearMonth.split('-')
const year = Number(yStr)
const month = Number(mStr)
const lastDay = new Date(year, month, 0).getDate()
const day = String(lastDay).padStart(2, '0')
return {
startDate: `${yearMonth}-01 00:00:00`,
endDate: `${yearMonth}-${day} 23:59:59`,
}
}
/**
* 支付状态(后端枚举,适用于 recharge/records.status 等)
* 来源:后端「支付状态定义」
*/
export enum RechargePaymentStatus {
Invalid = 0,
Pending = 1,
Initialized = 2,
Paying = 3,
Success = 4,
Failed = 5,
Cancelled = 6,
Refunding = 7,
Refunded = 8,
RefundFailed = 9,
Closed = 10,
}
export const RECHARGE_PAYMENT_STATUS_LABEL: Record<number, string> = {
[RechargePaymentStatus.Invalid]: '无效',
[RechargePaymentStatus.Pending]: '待支付',
[RechargePaymentStatus.Initialized]: '已初始化',
[RechargePaymentStatus.Paying]: '支付中',
[RechargePaymentStatus.Success]: '支付成功',
[RechargePaymentStatus.Failed]: '支付失败',
[RechargePaymentStatus.Cancelled]: '已取消',
[RechargePaymentStatus.Refunding]: '退款中',
[RechargePaymentStatus.Refunded]: '已退款',
[RechargePaymentStatus.RefundFailed]: '退款失败',
[RechargePaymentStatus.Closed]: '已关闭',
}
/**
* 充值状态文案(后端支付状态定义)
*/
export const formatRechargeStatus = (status: number): string => {
if (RECHARGE_PAYMENT_STATUS_LABEL[status] !== undefined) {
return RECHARGE_PAYMENT_STATUS_LABEL[status]
}
return '未知状态'
}
export const mapRechargeRecordToView = (item: RechargeRecordItem): RechargeRecordViewItem => ({
id: String(item.id || item.outTradeNo || item.logTime),
storeName: item.bpName || '--',
rechargeTime: item.logTime || '--',
rechargeType: item.rcgTypeName || '账户充值',
amount: item.amount,
status: formatRechargeStatus(item.status),
})
/**
* 拉取指定月份充值记录(需已登录且有客户 sn)
*/
export const fetchRechargeRecordsByMonth = async (
yearMonth: string
): Promise<RechargeRecordViewItem[]> => {
const customerSn = userStore.userInfo?.sn
if (!customerSn) {
throw new Error('NO_CUSTOMER_SN')
}
const { startDate, endDate } = getMonthDateRange(yearMonth)
const res = await getRechargeRecords({
customerSn,
startDate,
endDate,
pageIndex: 1,
pageSize: 100,
})
return (res.data?.data || []).map(mapRechargeRecordToView)
}
Loading…
Cancel
Save