Feature/0723/zr #9

Merged
chenzhen merged 27 commits from feature/0723/ZR into release/0.01 2026-08-08 14:23:42 +08:00
3 changed files with 37 additions and 79 deletions
Showing only changes of commit 9d615c8500 - Show all commits
+4 -6
View File
@@ -99,14 +99,8 @@ export interface ApiResult<T> {
/** 退款记录 */
export interface InnerRefundInfo {
/** 已退金额;0.00格式 */
refundedAmount: string;
/** 总退款次数(接口实际返回 string) */
totalRefundCount: string;
/** 退款金额;0.00格式 */
refundAmount: string;
/** 是否全部退款;0=否,1=是(接口实际返回 string) */
isFullRefund: string;
/** 退款方式 */
refundMethod: string;
/** 退款申请时间 */
@@ -115,6 +109,10 @@ export interface InnerRefundInfo {
refundOutTradeNo: string;
/** 退款完成时间 */
refundTime: string;
/** 退款状态;1=退款中,2=退款成功,3=退款失败 */
refundStatus: string;
/** 退款选手名称合集文字 */
refundSignupNames: string;
}
/** 订单详情 */
@@ -79,11 +79,6 @@
margin-bottom: 12px;
}
.tableWrap {
max-height: 200px;
overflow-y: auto;
}
.paginationRow {
display: flex;
justify-content: flex-end;
@@ -160,12 +155,6 @@
font-weight: 500;
}
.partialMark {
margin-left: 4px;
color: #fa8c16;
font-size: 12px;
}
.refundEmpty {
padding: 32px 0;
text-align: center;
@@ -176,10 +165,8 @@
border: 1px dashed #e0e0e0;
}
.refundPagination {
display: flex;
justify-content: flex-end;
margin-top: 12px;
.refundPlayers {
margin-left: 0;
}
.modalFooter {
@@ -44,7 +44,13 @@ const PLAYER_COLUMNS = [
customRender: ({ text }: { text: string }) => formatGender(text),
},
{ title: '手机号', dataIndex: 'phone', key: 'phone', width: 130 },
{ title: '证件号', dataIndex: 'idCard', key: 'idCard', width: 180 },
{
title: '证件号',
dataIndex: 'idCard',
key: 'idCard',
width: 180,
customRender: ({ text }: { text: string }) => text || '--',
},
{
title: '证件图片',
key: 'idCardImg',
@@ -108,8 +114,9 @@ const PLAYER_COLUMNS = [
];
const REFUND_STATUS_MAP: Record<string, { label: string; tone: StatusTagTone }> = {
success: { label: '退款成功', tone: 'success' },
failed: { label: '退款失败', tone: 'danger' },
'1': { label: '退款', tone: 'orange' },
'2': { label: '退款成功', tone: 'success' },
'3': { label: '退款失败', tone: 'danger' },
};
export default defineComponent({
@@ -129,8 +136,6 @@ export default defineComponent({
const [playersLoading, setPlayersLoading] = useState(true);
const [playerPage, setPlayerPage] = useState(1);
const [playerTotal, setPlayerTotal] = useState(0);
const [refundPage, setRefundPage] = useState(1);
const [refundPageSize] = useState(2);
const playerPageSize = 5;
/** 获取选手列表(分页) */
@@ -158,25 +163,21 @@ export default defineComponent({
const hasRefundFailed = computed(() => {
const records = refundRecords.value;
if (!records || !records.length) return false;
return records.some((r) => {
if (!r) return false;
const hasRefundAmount = parseFloat(r.refundAmount || '0') > 0;
const hasRefundTime = r.refundTime && r.refundTime !== '--';
return hasRefundAmount && !hasRefundTime;
});
return records.some((r) => r?.refundStatus === '3');
});
const pagedRefunds = computed(() => {
const start = (refundPage.value - 1) * refundPageSize.value;
return refundRecords.value.slice(start, start + refundPageSize.value);
});
const refundSuccessList = computed(() =>
refundRecords.value.filter((r) => r.refundStatus === '2'),
);
const totalRefunded = computed(() => {
const records = refundRecords.value;
if (!records.length) return 0;
return records.reduce((sum, r) => sum + parseFloat(r.refundAmount || '0'), 0);
const list = refundSuccessList.value;
if (!list.length) return 0;
return list.reduce((sum, r) => sum + parseFloat(r.refundAmount || '0'), 0);
});
const refundSuccessCount = computed(() => refundSuccessList.value.length);
const fetchData = async () => {
const params = { orderNo: props.orderNo, uniqueId: props.uniqueId };
const [detailRes] = await Promise.all([getOrderDetail(params), fetchPlayers(1)]);
@@ -194,10 +195,6 @@ export default defineComponent({
fetchPlayers(page);
};
const handleRefundPageChange = (page: number) => {
setRefundPage(page);
};
return () => (
<Modal
visible={props.visible}
@@ -260,7 +257,7 @@ export default defineComponent({
<div class={styles.section}>
<div class={styles.sectionTitle}></div>
<div class={styles.tableWrap}>
<div>
<Table
columns={PLAYER_COLUMNS}
dataSource={players.value}
@@ -268,7 +265,7 @@ export default defineComponent({
size="small"
bordered
pagination={false}
scroll={{ x: 'max-content' }}
scroll={{ x: 'max-content', y: 200 }}
/>
</div>
<div class={styles.paginationRow}>
@@ -291,28 +288,18 @@ export default defineComponent({
<>
<div class={styles.refundSummary}>
<span>退{totalRefunded.value.toFixed(2)}</span>
<span>退{refundRecords.value.length}</span>
<span>退{refundSuccessCount.value}</span>
</div>
<div class={styles.refundList}>
{pagedRefunds.value.map((r, idx) => {
const realIdx = (refundPage.value - 1) * refundPageSize.value + idx + 1;
const isSuccess = parseFloat(r.refundTime || '') > 0 || !!r.refundTime;
const statusInfo = {
label: isSuccess
? '退款成功'
: r.isFullRefund === '1'
? '退款待处理'
: '退款中',
tone: (isSuccess
? 'success'
: r.isFullRefund === '1'
? 'warning'
: 'orange') as StatusTagTone,
{refundRecords.value.map((r, idx) => {
const statusInfo = REFUND_STATUS_MAP[r.refundStatus] || {
label: '未知',
tone: 'default' as StatusTagTone,
};
return (
<div key={r.refundOutTradeNo || idx} class={styles.refundCard}>
<div class={styles.refundCardHeader}>
<span class={styles.refundIndex}>{realIdx}退</span>
<span class={styles.refundIndex}>{idx + 1}退</span>
<StatusTag label={statusInfo.label} tone={statusInfo.tone} />
</div>
<div class={styles.refundCardBody}>
@@ -321,37 +308,23 @@ export default defineComponent({
退
<span class={styles.refundAmount}>
¥{formatMoney(r.refundAmount)}
{r.isFullRefund === '1' && (
<span class={styles.partialMark}>退</span>
)}
{r.isFullRefund === '0' && (
<span class={styles.partialMark}>退</span>
)}
</span>
<span
class={styles.refundPlayers}
>{`${r.refundSignupNames}`}</span>
</div>
<div>{r.refundApplyTime}</div>
<div>{r.refundTime || '--'}</div>
<div>{r.refundTime || '--'}</div>
</div>
<div class={styles.refundCol}>
<div>退{r.refundMethod}</div>
<div>退{r.refundOutTradeNo || '--'}</div>
<div>退¥{formatMoney(r.refundedAmount)}</div>
</div>
</div>
</div>
);
})}
</div>
<div class={styles.refundPagination}>
<Pagination
current={refundPage.value}
pageSize={refundPageSize.value}
total={refundRecords.value.length}
showSizeChanger={false}
size="small"
onChange={handleRefundPageChange}
/>
</div>
</>
) : (
<div class={styles.refundEmpty}>退</div>