diff --git a/src/pagesOrder/accountBalance/components/BalanceList.scss b/src/pagesOrder/accountBalance/components/BalanceList.scss index c2fa052..a54145c 100644 --- a/src/pagesOrder/accountBalance/components/BalanceList.scss +++ b/src/pagesOrder/accountBalance/components/BalanceList.scss @@ -57,6 +57,7 @@ // 余额和存柜信息卡片 .info-cards { display: flex; + align-items: center; gap: 26px; margin-bottom: 26px; diff --git a/src/pagesOrder/accountBalance/components/OpenRecordList.scss b/src/pagesOrder/accountBalance/components/OpenRecordList.scss index 0d01089..851e134 100644 --- a/src/pagesOrder/accountBalance/components/OpenRecordList.scss +++ b/src/pagesOrder/accountBalance/components/OpenRecordList.scss @@ -82,7 +82,7 @@ .item-row { display: flex; - align-items: center; + align-items: baseline; justify-content: space-between; .store-name { @@ -92,13 +92,13 @@ } .status { - font-size: 25px; + font-size: 32px; color: #F5C8A6; } .vip-type { font-size: 25px; - color: #B8B8B8; + color: #FFFFFF; } .price { @@ -107,13 +107,22 @@ } .pay-time { - font-size: 25px; - color: #8B8B8B; + font-size: 22px; + color: #999999; } .actual-pay { - font-size: 25px; + display: flex; + align-items: baseline; color: #FFFFFF; + + .pay-label { + font-size: 22px; + } + + .pay-amount { + font-size: 33px; + } } } diff --git a/src/pagesOrder/accountBalance/components/OpenRecordList.tsx b/src/pagesOrder/accountBalance/components/OpenRecordList.tsx index 202b9e2..0b55ba4 100644 --- a/src/pagesOrder/accountBalance/components/OpenRecordList.tsx +++ b/src/pagesOrder/accountBalance/components/OpenRecordList.tsx @@ -4,6 +4,7 @@ import { View, Text, Image } from '@tarojs/components' import { FC, useState } from 'react' import { ArrowDown } from '@taroify/icons' +import { Popup, DatetimePicker } from '@taroify/core' import Taro from '@tarojs/taro' import './OpenRecordList.scss' @@ -25,6 +26,48 @@ interface OpenRecordListProps { const OpenRecordList: FC = ({ recordList }) => { const [selectedMonth, setSelectedMonth] = useState('2025-02') + const [datePickerOpen, setDatePickerOpen] = useState(false) + const [pickerValue, setPickerValue] = useState(new Date()) + const [dataList, setDataList] = useState(recordList) + + // 模拟接口请求开通记录数据 + const fetchOpenRecords = async (yearMonth: string) => { + Taro.showLoading({ + title: '加载中...', + mask: true + }) + + // 模拟接口请求 + return new Promise((resolve) => { + setTimeout(() => { + // 模拟返回数据 + const mockData: OpenRecordItem[] = [ + { + id: `${yearMonth}-1`, + storeName: '来力.山岩', + payTime: `${yearMonth}-20 16:30:00`, + vipType: 'VIP年卡', + amount: 299, + status: '已生效', + canRefund: true + }, + { + id: `${yearMonth}-2`, + storeName: '来力.山岩', + payTime: `${yearMonth}-05 09:15:00`, + vipType: 'VIP月卡', + amount: 99, + status: '已生效', + canRefund: false + } + ] + + setDataList(mockData) + Taro.hideLoading() + resolve(mockData) + }, 1000) // 模拟 1 秒的网络延迟 + }) + } // 按月份分组记录 const groupByMonth = (records: OpenRecordItem[]) => { @@ -39,21 +82,35 @@ const OpenRecordList: FC = ({ recordList }) => { return groups } - const groupedRecords = groupByMonth(recordList) + const groupedRecords = groupByMonth(dataList) // 计算当月总金额 const calculateMonthTotal = (records: OpenRecordItem[]) => { return records.reduce((sum, record) => sum + record.amount, 0) } - // 选择月份 + // 打开月份选择器 const handleSelectMonth = () => { - console.log('选择月份') - // TODO: 打开月份选择器 - Taro.showToast({ - title: '月份选择功能开发中', - icon: 'none' - }) + setDatePickerOpen(true) + } + + // 确认选择月份 + const handleDateConfirm = async (value: Date) => { + const year = value.getFullYear() + const month = String(value.getMonth() + 1).padStart(2, '0') + const formattedMonth = `${year}-${month}` + + setSelectedMonth(formattedMonth) + setPickerValue(value) + setDatePickerOpen(false) + + // 调用接口请求该月份的数据 + await fetchOpenRecords(formattedMonth) + } + + // 取消选择 + const handleDateCancel = () => { + setDatePickerOpen(false) } // 退款 @@ -76,7 +133,7 @@ const OpenRecordList: FC = ({ recordList }) => { return ( - {recordList.length === 0 ? ( + {dataList.length === 0 ? ( @@ -124,7 +181,10 @@ const OpenRecordList: FC = ({ recordList }) => { {/* 第三行:支付时间 + 实付金额 */} 支付时间:{item.payTime} - 实付 ¥{item.amount.toFixed(2)} + + 实付 ¥ + {item.amount.toFixed(2)} + {/* 退款按钮(7天内可退款) */} @@ -154,6 +214,21 @@ const OpenRecordList: FC = ({ recordList }) => { )} + + {/* 年月选择器 */} + setDatePickerOpen(false)} + > + + ) } diff --git a/src/pagesOrder/accountBalance/components/RechargeRecordList.scss b/src/pagesOrder/accountBalance/components/RechargeRecordList.scss index 7e62355..ecbcb03 100644 --- a/src/pagesOrder/accountBalance/components/RechargeRecordList.scss +++ b/src/pagesOrder/accountBalance/components/RechargeRecordList.scss @@ -14,42 +14,119 @@ } } - .record-card { + // 月份卡片 + .month-card { background-color: #202029; border-radius: 12px; - padding: 33px 30px; margin-bottom: 30px; - &:last-child { - margin-bottom: 0; - } - - .record-header { + // 月份标题行 + .month-header { display: flex; align-items: center; justify-content: space-between; - margin-bottom: 25px; + padding: 36px 30px; + + .month-left { + display: flex; + align-items: center; + gap: 10px; - .store-name { - font-size: 33px; - color: #FFFEFE; - flex: 1; + .month-text { + font-size: 33px; + color: #FFFEFE; + } + + .month-arrow { + flex-shrink: 0; + } } - .amount { - font-size: 33px; - color: #01CA68; + .month-right { + display: flex; + align-items: baseline; + gap: 4px; + + .amount-label { + font-size: 25px; + color: #999999; + margin-right: 8px; + } + + .amount-symbol { + font-size: 25px; + color: #FFFFFF; + } + + .amount-value { + font-size: 30px; + color: #FFFFFF; + } } } - .record-info { - display: flex; - flex-direction: column; - gap: 15px; + // 分割线 + .divider { + height: 1px; + background-color: #45454C; + } + + // 记录列表 + .record-list { + padding: 20px; + + .record-item { + display: flex; + flex-direction: column; + gap: 20px; + + .item-row { + display: flex; + align-items: baseline; + justify-content: space-between; + + .store-name { + font-size: 33px; + color: #FFFEFE; + flex: 1; + } + + .status { + font-size: 32px; + color: #F5C8A6; + } + + .recharge-type { + font-size: 25px; + color: #FFFFFF; + } + + .recharge-time { + font-size: 22px; + color: #999999; + } + + .actual-pay { + display: flex; + align-items: baseline; + color: #FFFFFF; + + .pay-label { + font-size: 22px; + } + + .pay-amount { + font-size: 33px; + } + } + } + } - .info-text { - font-size: 25px; - color: #B8B8B8; + // item 之间的分割线 + .item-divider { + height: 1px; + background-color: #45454C; + margin: 20px 0; } } } diff --git a/src/pagesOrder/accountBalance/components/RechargeRecordList.tsx b/src/pagesOrder/accountBalance/components/RechargeRecordList.tsx index 104a933..59e8ca6 100644 --- a/src/pagesOrder/accountBalance/components/RechargeRecordList.tsx +++ b/src/pagesOrder/accountBalance/components/RechargeRecordList.tsx @@ -2,7 +2,10 @@ * 充值记录列表组件 */ import { View, Text, Image } from '@tarojs/components' -import { FC } from 'react' +import { FC, useState } from 'react' +import { ArrowDown } from '@taroify/icons' +import { Popup, DatetimePicker } from '@taroify/core' +import Taro from '@tarojs/taro' import './RechargeRecordList.scss' const noDataImg = require('../../../assets/big/noData.png') @@ -21,27 +24,158 @@ interface RechargeRecordListProps { } const RechargeRecordList: FC = ({ recordList }) => { + const [selectedMonth, setSelectedMonth] = useState('2025-03') + const [datePickerOpen, setDatePickerOpen] = useState(false) + const [pickerValue, setPickerValue] = useState(new Date()) + const [dataList, setDataList] = useState(recordList) + + // 模拟接口请求充值记录数据 + const fetchRechargeRecords = async (yearMonth: string) => { + Taro.showLoading({ + title: '加载中...', + mask: true + }) + + // 模拟接口请求 + return new Promise((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) + Taro.hideLoading() + resolve(mockData) + }, 1000) // 模拟 1 秒的网络延迟 + }) + } + + // 按月份分组记录 + const groupByMonth = (records: RechargeRecordItem[]) => { + const groups: Record = {} + records.forEach(record => { + const month = record.rechargeTime.substring(0, 7) // 提取 YYYY-MM + if (!groups[month]) { + groups[month] = [] + } + groups[month].push(record) + }) + return groups + } + + const groupedRecords = groupByMonth(dataList) + + // 计算当月总充值金额 + const calculateMonthTotal = (records: RechargeRecordItem[]) => { + return records.reduce((sum, record) => sum + record.amount, 0) + } + + // 打开月份选择器 + const handleSelectMonth = () => { + setDatePickerOpen(true) + } + + // 确认选择月份 + const handleDateConfirm = async (value: Date) => { + const year = value.getFullYear() + const month = String(value.getMonth() + 1).padStart(2, '0') + const formattedMonth = `${year}-${month}` + + setSelectedMonth(formattedMonth) + setPickerValue(value) + setDatePickerOpen(false) + + // 调用接口请求该月份的数据 + await fetchRechargeRecords(formattedMonth) + } + + // 取消选择 + const handleDateCancel = () => { + setDatePickerOpen(false) + } + return ( - {recordList.length === 0 ? ( + {dataList.length === 0 ? ( ) : ( <> - {recordList.map(item => ( - - - {item.storeName} - +¥{item.amount.toFixed(2)} - - - 充值方式:{item.rechargeType} - 充值时间:{item.rechargeTime} - 状态:{item.status} + {Object.keys(groupedRecords).map(month => { + const monthRecords = groupedRecords[month] + const monthTotal = calculateMonthTotal(monthRecords) + + return ( + + {/* 月份标题和充值统计 */} + + + {month} + + + + 充值 + + {monthTotal.toFixed(2)} + + + + {/* 分割线 */} + + + {/* 记录列表 */} + + {monthRecords.map((item, index) => ( + + + {/* 第一行:店铺名称 + 状态 */} + + {item.storeName} + {item.status} + + + {/* 第二行:充值类型 */} + + {item.rechargeType} + + + {/* 第三行:充值时间 + 实付金额 */} + + 充值时间:{item.rechargeTime} + + 实付 ¥ + {item.amount.toFixed(2)} + + + + + {/* item 之间的分割线 */} + {index < monthRecords.length - 1 && ( + + )} + + ))} + - - ))} + ) + })} {/* 到底了提示 */} @@ -49,6 +183,21 @@ const RechargeRecordList: FC = ({ recordList }) => { )} + + {/* 年月选择器 */} + setDatePickerOpen(false)} + > + + ) } diff --git a/src/pagesOrder/accountBalance/index.tsx b/src/pagesOrder/accountBalance/index.tsx index 1ce5852..c896ef5 100644 --- a/src/pagesOrder/accountBalance/index.tsx +++ b/src/pagesOrder/accountBalance/index.tsx @@ -77,19 +77,19 @@ const AccountBalance = () => { const [rechargeRecordList] = useState([ { id: '1', - storeName: '北京XXXXXX店', - rechargeTime: '2026-01-15 10:20:30', - rechargeType: '微信支付', - amount: 500.00, - status: '充值成功' + storeName: '北京XXXXXXXXXXXXX店', + rechargeTime: '2025-03-09 00:00:00', + rechargeType: '账户充值', + amount: 100.00, + status: '充值完成' }, { id: '2', - storeName: '北京XXXXXXXXXXXXX店', - rechargeTime: '2026-01-10 14:15:20', - rechargeType: '支付宝', + storeName: '北京XXX店', + rechargeTime: '2025-03-09 00:00:00', + rechargeType: '账户充值', amount: 100.00, - status: '充值成功' + status: '充值完成' } ])