feat(@vben/web-antd): add finance settlement page module
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
import type {
|
||||
FinanceSettlementFilterState,
|
||||
FinanceSettlementListQueryPayload,
|
||||
FinanceSettlementQueryPayload,
|
||||
} from '../../types';
|
||||
|
||||
/**
|
||||
* 文件职责:到账查询页面纯函数与数据转换工具。
|
||||
*/
|
||||
import type {
|
||||
FinanceSettlementChannelFilter,
|
||||
FinanceSettlementListItemDto,
|
||||
} from '#/api/finance';
|
||||
|
||||
function formatDate(date: Date) {
|
||||
const year = date.getFullYear();
|
||||
const month = `${date.getMonth() + 1}`.padStart(2, '0');
|
||||
const day = `${date.getDate()}`.padStart(2, '0');
|
||||
return `${year}-${month}-${day}`;
|
||||
}
|
||||
|
||||
function normalizeChannel(value: FinanceSettlementChannelFilter) {
|
||||
return value === 'all' ? undefined : value;
|
||||
}
|
||||
|
||||
function decodeBase64ToBlob(base64: string) {
|
||||
const binary = atob(base64);
|
||||
const bytes = new Uint8Array(binary.length);
|
||||
for (let index = 0; index < binary.length; index += 1) {
|
||||
bytes[index] = binary.codePointAt(index) ?? 0;
|
||||
}
|
||||
return new Blob([bytes], { type: 'text/csv;charset=utf-8;' });
|
||||
}
|
||||
|
||||
/** 获取今天日期字符串(yyyy-MM-dd)。 */
|
||||
export function getTodayDateString() {
|
||||
return formatDate(new Date());
|
||||
}
|
||||
|
||||
/** 构建到账筛选请求。 */
|
||||
export function buildFilterQueryPayload(
|
||||
storeId: string,
|
||||
filters: FinanceSettlementFilterState,
|
||||
): FinanceSettlementQueryPayload {
|
||||
return {
|
||||
storeId,
|
||||
startDate: filters.startDate || undefined,
|
||||
endDate: filters.endDate || undefined,
|
||||
channel: normalizeChannel(filters.channel),
|
||||
};
|
||||
}
|
||||
|
||||
/** 构建到账列表请求。 */
|
||||
export function buildListQueryPayload(
|
||||
storeId: string,
|
||||
filters: FinanceSettlementFilterState,
|
||||
page: number,
|
||||
pageSize: number,
|
||||
): FinanceSettlementListQueryPayload {
|
||||
return {
|
||||
...buildFilterQueryPayload(storeId, filters),
|
||||
page,
|
||||
pageSize,
|
||||
};
|
||||
}
|
||||
|
||||
/** 判断日期范围是否合法。 */
|
||||
export function isDateRangeInvalid(filters: FinanceSettlementFilterState) {
|
||||
if (!filters.startDate || !filters.endDate) {
|
||||
return false;
|
||||
}
|
||||
return filters.startDate > filters.endDate;
|
||||
}
|
||||
|
||||
/** 货币格式化(人民币)。 */
|
||||
export function formatCurrency(value: number) {
|
||||
return new Intl.NumberFormat('zh-CN', {
|
||||
style: 'currency',
|
||||
currency: 'CNY',
|
||||
minimumFractionDigits: 2,
|
||||
maximumFractionDigits: 2,
|
||||
}).format(Number.isFinite(value) ? value : 0);
|
||||
}
|
||||
|
||||
/** 数值格式化(千分位整数)。 */
|
||||
export function formatCount(value: number) {
|
||||
return new Intl.NumberFormat('zh-CN', {
|
||||
maximumFractionDigits: 0,
|
||||
}).format(Number.isFinite(value) ? value : 0);
|
||||
}
|
||||
|
||||
/** 表格行唯一键。 */
|
||||
export function getSettlementRowKey(row: FinanceSettlementListItemDto) {
|
||||
return `${row.arrivedDate}_${row.channel}`;
|
||||
}
|
||||
|
||||
/** 到账渠道圆点类名。 */
|
||||
export function resolveChannelDotClass(channel: string) {
|
||||
return channel === 'wechat' ? 'is-wechat' : 'is-alipay';
|
||||
}
|
||||
|
||||
/** 明细支付时间格式化(HH:mm)。 */
|
||||
export function formatPaidTime(value: string) {
|
||||
const normalized = String(value || '').trim();
|
||||
if (!normalized) {
|
||||
return '--';
|
||||
}
|
||||
|
||||
const separatorIndex = normalized.indexOf(' ');
|
||||
if (separatorIndex !== -1 && normalized.length >= separatorIndex + 6) {
|
||||
return normalized.slice(separatorIndex + 1, separatorIndex + 6);
|
||||
}
|
||||
|
||||
const timePrefix = normalized.match(/^\d{2}:\d{2}/);
|
||||
if (timePrefix?.[0]) {
|
||||
return timePrefix[0];
|
||||
}
|
||||
|
||||
return normalized;
|
||||
}
|
||||
|
||||
/** 下载 Base64 编码文件。 */
|
||||
export function downloadBase64File(
|
||||
fileName: string,
|
||||
fileContentBase64: string,
|
||||
) {
|
||||
const blob = decodeBase64ToBlob(fileContentBase64);
|
||||
const url = URL.createObjectURL(blob);
|
||||
const anchor = document.createElement('a');
|
||||
anchor.href = url;
|
||||
anchor.download = fileName;
|
||||
anchor.click();
|
||||
URL.revokeObjectURL(url);
|
||||
}
|
||||
Reference in New Issue
Block a user