feat: 高考志愿与定价分销链路更新(管理端/API/小程序)
- 新增高考志愿核心服务、模型、控制器与迁移脚本 - 同步管理端定价/分销/设置与小程序入口、历史、测试选择和支付逻辑 - 补充相关开发文档 Made-with: Cursor
This commit is contained in:
@@ -377,6 +377,8 @@ class AppUser extends BaseController
|
||||
$testTypes = [];
|
||||
$payStats = [];
|
||||
$enterpriseNames = [];
|
||||
$gaokaoMap = [];
|
||||
$gaokaoReportMap = [];
|
||||
if (!empty($ids)) {
|
||||
$trBase = Db::name('test_results')->where('userId', 'in', $ids);
|
||||
$trAggRows = (clone $trBase)
|
||||
@@ -466,6 +468,45 @@ class AppUser extends BaseController
|
||||
} catch (\Throwable $e) {
|
||||
$payStats = [];
|
||||
}
|
||||
|
||||
try {
|
||||
$gqRows = Db::name('gaokao_user_profile')
|
||||
->whereIn('userId', $ids)
|
||||
->field('id,userId,tenantId,entryStatus,mbtiStatus,pdpStatus,discStatus,formStatus,analyzeStatus,lastAnalyzeAt,latestReportId')
|
||||
->select()
|
||||
->toArray();
|
||||
$reportIds = [];
|
||||
foreach ($gqRows as $gr) {
|
||||
$uid = (int) ($gr['userId'] ?? 0);
|
||||
if ($uid > 0) {
|
||||
$gaokaoMap[$uid] = $gr;
|
||||
if (!empty($gr['latestReportId'])) {
|
||||
$reportIds[] = (int) $gr['latestReportId'];
|
||||
}
|
||||
}
|
||||
}
|
||||
$reportIds = array_values(array_unique(array_filter($reportIds)));
|
||||
if ($reportIds) {
|
||||
$rRows = Db::name('test_results')
|
||||
->whereIn('id', $reportIds)
|
||||
->where('testType', 'gaokao')
|
||||
->field('id,resultData')
|
||||
->select()
|
||||
->toArray();
|
||||
foreach ($rRows as $rr) {
|
||||
$raw = $rr['resultData'] ?? '';
|
||||
$rd = is_string($raw) ? (json_decode($raw, true) ?: []) : (is_array($raw) ? $raw : []);
|
||||
$ov = (string) ($rd['overview'] ?? '');
|
||||
if ($ov === '' && isset($rd['report']['overview'])) {
|
||||
$ov = (string) $rd['report']['overview'];
|
||||
}
|
||||
$gaokaoReportMap[(int) $rr['id']] = $ov;
|
||||
}
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
$gaokaoMap = [];
|
||||
$gaokaoReportMap = [];
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($list as &$row) {
|
||||
@@ -493,6 +534,15 @@ class AppUser extends BaseController
|
||||
$row['paidOrders'] = $pay ? (int) ($pay['paidOrders'] ?? 0) : 0;
|
||||
$row['totalPaidAmount'] = $totalPaidFen;
|
||||
$row['totalPaidAmountYuan'] = $totalPaidFen > 0 ? round($totalPaidFen / 100, 2) : 0;
|
||||
|
||||
$gq = $gaokaoMap[$id] ?? null;
|
||||
$row['gaokaoEntryStatus'] = $gq ? (int) ($gq['entryStatus'] ?? 0) : 0;
|
||||
$row['gaokaoAnalyzeStatus'] = $gq ? (int) ($gq['analyzeStatus'] ?? 0) : 0;
|
||||
$row['gaokaoFormStatus'] = $gq ? (int) ($gq['formStatus'] ?? 0) : 0;
|
||||
$row['gaokaoTenantId'] = $gq ? (int) ($gq['tenantId'] ?? 0) : 0;
|
||||
$row['gaokaoLastAnalyzeAt'] = $gq ? (int) ($gq['lastAnalyzeAt'] ?? 0) : 0;
|
||||
$rid = $gq ? (int) ($gq['latestReportId'] ?? 0) : 0;
|
||||
$row['gaokaoOverview'] = $rid > 0 ? (string) ($gaokaoReportMap[$rid] ?? '') : '';
|
||||
}
|
||||
|
||||
return paginate_response($list, $total, $page, $pageSize);
|
||||
@@ -564,6 +614,33 @@ class AppUser extends BaseController
|
||||
|
||||
$data['resumeUploads'] = ResumeUploadsAdminService::listForWechatUser((int) $id, null);
|
||||
|
||||
try {
|
||||
$gq = Db::name('gaokao_user_profile')->where('userId', (int) $id)->find();
|
||||
if ($gq) {
|
||||
$data['gaokaoProfile'] = $gq;
|
||||
$rid = (int) ($gq['latestReportId'] ?? 0);
|
||||
if ($rid > 0) {
|
||||
$data['gaokaoLatestReport'] = Db::name('test_results')
|
||||
->where('id', $rid)
|
||||
->where('testType', 'gaokao')
|
||||
->find();
|
||||
}
|
||||
$data['gaokaoOrders'] = Db::name('orders')
|
||||
->where('userId', (int) $id)
|
||||
->where('productType', 'gaokao')
|
||||
->order('id', 'desc')
|
||||
->limit(20)
|
||||
->select()
|
||||
->toArray();
|
||||
} else {
|
||||
$data['gaokaoProfile'] = null;
|
||||
$data['gaokaoOrders'] = [];
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
$data['gaokaoProfile'] = null;
|
||||
$data['gaokaoOrders'] = [];
|
||||
}
|
||||
|
||||
return success($data);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user