feat(config): add finance rules, activity rules, and real expert application flow
这个提交包含在:
@@ -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();
|
||||
|
||||
在新工单中引用
屏蔽一个用户