feat(config): add finance rules, activity rules, and real expert application flow

这个提交包含在:
xcbyy
2026-10-10 14:06:29 +08:00
父节点 d7f5c31762
当前提交 872af22c20
共有 8 个文件被更改,包括 649 次插入 和 33 次删除

查看文件

@@ -549,6 +549,44 @@ export class MysqlRepository {
return this.getCompanionById(id);
}
async applyCompanion(data: {
userId: number;
name: string;
idCard: string;
track: string;
hourlyRate?: number;
tags?: string[];
avatar?: string;
gender?: string;
}): Promise<any> {
const name = data.name.trim();
const track = data.track || '同城陪吃';
const hourlyRate = Number(data.hourlyRate) || 88;
const tagsJson = JSON.stringify(data.tags || []);
const avatar = data.avatar || 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=300';
const gender = data.gender || '女';
const maskedIdCard = data.idCard.length >= 8
? data.idCard.substring(0, 6) + '********' + data.idCard.substring(data.idCard.length - 4)
: '110101********0000';
const [existing]: any = await pool.query('SELECT * FROM companions WHERE name = ?', [name]);
if (existing && existing.length > 0) {
await pool.query(`
UPDATE companions
SET track = ?, hourly_rate = ?, tags = ?, avatar = ?, gender = ?, audit_status = '待审核', status = '待审核', id_card_masked = ?
WHERE id = ?
`, [track, hourlyRate, tagsJson, avatar, gender, maskedIdCard, existing[0].id]);
return this.getCompanionById(existing[0].id);
}
const [res]: any = await pool.query(`
INSERT INTO companions (name, avatar, gender, age, track, rank_name, hourly_rate, voice_duration, voice_title, rating, order_count, status, audit_status, id_card_masked, tags, apply_time)
VALUES (?, ?, ?, 23, ?, '申请中陪伴师', ?, 15, '热情语音介绍', 5.0, 0, '待审核', '待审核', ?, ?, NOW())
`, [name, avatar, gender, track, hourlyRate, maskedIdCard, tagsJson]);
return this.getCompanionById(res.insertId);
}
async auditCompanion(id: number, action: 'approve' | 'reject', reason?: string): Promise<any> {
const auditStatus = action === 'approve' ? '已通过' : '已驳回';
const status = action === 'approve' ? '接单中' : '已驳回';
@@ -1824,6 +1862,20 @@ export class MysqlRepository {
if (isNaN(amount) || amount <= 0) {
throw new Error('提现金额必须大于0');
}
// 动态读取财务提现配置限制门槛
let minWithdraw = 50;
try {
const fConfig = await this.getPlatformConfigByKey('finance_rules');
if (fConfig?.valueJson?.minWithdrawAmount) {
minWithdraw = Number(fConfig.valueJson.minWithdrawAmount);
}
} catch (_) {}
if (amount < minWithdraw) {
throw new Error(`提现金额不能低于平台最低门槛 ¥${minWithdraw}`);
}
const conn = await pool.getConnection();
try {
await conn.beginTransaction();