2026-03-18 19:12:38 +08:00
|
|
|
import { logger } from '../utils/logger';
|
2026-03-18 12:35:52 +08:00
|
|
|
|
|
|
|
|
export interface MerchantSettlement {
|
|
|
|
|
id: string;
|
|
|
|
|
merchantId: string;
|
|
|
|
|
tenantId: string;
|
|
|
|
|
shopId: string;
|
|
|
|
|
periodStart: Date;
|
|
|
|
|
periodEnd: Date;
|
|
|
|
|
totalOrders: number;
|
|
|
|
|
totalSales: number;
|
|
|
|
|
platformFee: number;
|
|
|
|
|
commission: number;
|
|
|
|
|
netAmount: number;
|
|
|
|
|
status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED';
|
|
|
|
|
paymentStatus: 'PENDING' | 'COMPLETED' | 'FAILED';
|
|
|
|
|
traceId: string;
|
|
|
|
|
taskId: string;
|
|
|
|
|
businessType: 'TOC' | 'TOB';
|
|
|
|
|
createdAt: Date;
|
|
|
|
|
updatedAt: Date;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface SettlementItem {
|
|
|
|
|
id: string;
|
|
|
|
|
settlementId: string;
|
|
|
|
|
orderId: string;
|
|
|
|
|
amount: number;
|
|
|
|
|
commissionRate: number;
|
|
|
|
|
commissionAmount: number;
|
|
|
|
|
platformFee: number;
|
|
|
|
|
netAmount: number;
|
|
|
|
|
status: 'INCLUDED' | 'EXCLUDED';
|
|
|
|
|
createdAt: Date;
|
|
|
|
|
updatedAt: Date;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface CreateSettlementParams {
|
|
|
|
|
merchantId: string;
|
|
|
|
|
tenantId: string;
|
|
|
|
|
shopId: string;
|
|
|
|
|
periodStart: Date;
|
|
|
|
|
periodEnd: Date;
|
|
|
|
|
traceId: string;
|
|
|
|
|
taskId: string;
|
|
|
|
|
businessType: 'TOC' | 'TOB';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface SettlementResult {
|
|
|
|
|
success: boolean;
|
|
|
|
|
settlement: MerchantSettlement;
|
|
|
|
|
items: SettlementItem[];
|
|
|
|
|
message: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export class MerchantSettlementService {
|
|
|
|
|
/**
|
|
|
|
|
* 初始化数据库表
|
|
|
|
|
*/
|
|
|
|
|
static async initTable() {
|
|
|
|
|
logger.info('🚀 MerchantSettlementService table initialized');
|
|
|
|
|
// 这里可以添加数据库表初始化逻辑
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建结算单
|
|
|
|
|
*/
|
|
|
|
|
static async createSettlement(params: CreateSettlementParams): Promise<SettlementResult> {
|
|
|
|
|
logger.info(`[MerchantSettlementService] Creating settlement for merchant: ${params.merchantId}`, { traceId: params.traceId });
|
|
|
|
|
|
|
|
|
|
// 这里可以添加创建结算单的逻辑
|
|
|
|
|
|
|
|
|
|
const settlement: MerchantSettlement = {
|
|
|
|
|
id: 'settlement_' + Date.now(),
|
|
|
|
|
merchantId: params.merchantId,
|
|
|
|
|
tenantId: params.tenantId,
|
|
|
|
|
shopId: params.shopId,
|
|
|
|
|
periodStart: params.periodStart,
|
|
|
|
|
periodEnd: params.periodEnd,
|
|
|
|
|
totalOrders: 10,
|
|
|
|
|
totalSales: 1000,
|
|
|
|
|
platformFee: 50,
|
|
|
|
|
commission: 100,
|
|
|
|
|
netAmount: 850,
|
|
|
|
|
status: 'PENDING',
|
|
|
|
|
paymentStatus: 'PENDING',
|
|
|
|
|
traceId: params.traceId,
|
|
|
|
|
taskId: params.taskId,
|
|
|
|
|
businessType: params.businessType,
|
|
|
|
|
createdAt: new Date(),
|
|
|
|
|
updatedAt: new Date()
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const items: SettlementItem[] = [
|
|
|
|
|
{
|
|
|
|
|
id: 'item_1',
|
|
|
|
|
settlementId: settlement.id,
|
|
|
|
|
orderId: 'order_1',
|
|
|
|
|
amount: 100,
|
|
|
|
|
commissionRate: 0.1,
|
|
|
|
|
commissionAmount: 10,
|
|
|
|
|
platformFee: 5,
|
|
|
|
|
netAmount: 85,
|
|
|
|
|
status: 'INCLUDED',
|
|
|
|
|
createdAt: new Date(),
|
|
|
|
|
updatedAt: new Date()
|
|
|
|
|
}
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
success: true,
|
|
|
|
|
settlement,
|
|
|
|
|
items,
|
|
|
|
|
message: 'Settlement created successfully'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理结算
|
|
|
|
|
*/
|
|
|
|
|
static async processSettlement(settlementId: string, traceId: string): Promise<MerchantSettlement> {
|
|
|
|
|
logger.info(`[MerchantSettlementService] Processing settlement: ${settlementId}`, { traceId });
|
|
|
|
|
// 这里可以添加处理结算的逻辑
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
id: settlementId,
|
|
|
|
|
merchantId: 'merchant_1',
|
|
|
|
|
tenantId: 'tenant_1',
|
|
|
|
|
shopId: 'shop_1',
|
|
|
|
|
periodStart: new Date(),
|
|
|
|
|
periodEnd: new Date(),
|
|
|
|
|
totalOrders: 10,
|
|
|
|
|
totalSales: 1000,
|
|
|
|
|
platformFee: 50,
|
|
|
|
|
commission: 100,
|
|
|
|
|
netAmount: 850,
|
|
|
|
|
status: 'COMPLETED',
|
|
|
|
|
paymentStatus: 'COMPLETED',
|
|
|
|
|
traceId,
|
|
|
|
|
taskId: 'task_1',
|
|
|
|
|
businessType: 'TOC',
|
|
|
|
|
createdAt: new Date(),
|
|
|
|
|
updatedAt: new Date()
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取结算单
|
|
|
|
|
*/
|
|
|
|
|
static async getSettlement(settlementId: string, traceId: string): Promise<MerchantSettlement | null> {
|
|
|
|
|
logger.info(`[MerchantSettlementService] Getting settlement: ${settlementId}`, { traceId });
|
|
|
|
|
// 这里可以添加获取结算单的逻辑
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取商户结算历史
|
|
|
|
|
*/
|
|
|
|
|
static async getMerchantSettlements(merchantId: string, tenantId: string, shopId: string, traceId: string): Promise<MerchantSettlement[]> {
|
|
|
|
|
logger.info(`[MerchantSettlementService] Getting settlements for merchant: ${merchantId}`, { traceId });
|
|
|
|
|
// 这里可以添加获取商户结算历史的逻辑
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 取消结算
|
|
|
|
|
*/
|
|
|
|
|
static async cancelSettlement(settlementId: string, traceId: string): Promise<MerchantSettlement> {
|
|
|
|
|
logger.info(`[MerchantSettlementService] Cancelling settlement: ${settlementId}`, { traceId });
|
|
|
|
|
// 这里可以添加取消结算的逻辑
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
id: settlementId,
|
|
|
|
|
merchantId: 'merchant_1',
|
|
|
|
|
tenantId: 'tenant_1',
|
|
|
|
|
shopId: 'shop_1',
|
|
|
|
|
periodStart: new Date(),
|
|
|
|
|
periodEnd: new Date(),
|
|
|
|
|
totalOrders: 10,
|
|
|
|
|
totalSales: 1000,
|
|
|
|
|
platformFee: 50,
|
|
|
|
|
commission: 100,
|
|
|
|
|
netAmount: 850,
|
|
|
|
|
status: 'FAILED',
|
|
|
|
|
paymentStatus: 'FAILED',
|
|
|
|
|
traceId,
|
|
|
|
|
taskId: 'task_1',
|
|
|
|
|
businessType: 'TOC',
|
|
|
|
|
createdAt: new Date(),
|
|
|
|
|
updatedAt: new Date()
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成结算报表
|
|
|
|
|
*/
|
|
|
|
|
static async generateSettlementReport(merchantId: string, startDate: Date, endDate: Date, traceId: string): Promise<any> {
|
|
|
|
|
logger.info(`[MerchantSettlementService] Generating settlement report for merchant: ${merchantId}`, { traceId });
|
|
|
|
|
// 这里可以添加生成结算报表的逻辑
|
|
|
|
|
return {
|
|
|
|
|
merchantId,
|
|
|
|
|
startDate,
|
|
|
|
|
endDate,
|
|
|
|
|
totalSettlements: 5,
|
|
|
|
|
totalAmount: 5000,
|
|
|
|
|
averageAmount: 1000,
|
|
|
|
|
reportDate: new Date()
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|