feat: route material tag scans to reports

This commit is contained in:
wushumin
2026-05-25 16:37:11 +08:00
parent fa8c9015d9
commit 91be380751
10 changed files with 99 additions and 111 deletions

View File

@@ -15,7 +15,7 @@ class MaterialTagRedirectController
}
try {
$url = (new MaterialTagService())->buildMaterialTagDetailUrl($token);
$url = (new MaterialTagService())->buildMaterialTagScanEntryUrl($token);
} catch (\Throwable $e) {
return response($e->getMessage(), 500);
}

View File

@@ -922,11 +922,61 @@ class MaterialTagService
return $this->buildMaterialTagH5Url($token, $baseUrl);
}
public function buildMaterialTagScanEntryUrl(string $token): string
{
$baseUrl = $this->normalizeH5BaseUrl($this->getSystemConfigValue('h5', 'page_base_url'));
if ($baseUrl === '') {
throw new \RuntimeException('H5 页面根地址未配置');
}
$reportNo = $this->findPublishedReportNoByToken($token);
if ($reportNo !== '') {
return $this->buildReportDetailH5Url($reportNo, $baseUrl, $token);
}
return $this->buildMaterialTagH5Url($token, $baseUrl);
}
private function buildMaterialTagH5Url(string $token, string $baseUrl): string
{
return rtrim($baseUrl, '/') . '/#/pages/material-tag/detail?token=' . rawurlencode($token);
}
private function buildReportDetailH5Url(string $reportNo, string $baseUrl, string $token = ''): string
{
$params = ['report_no' => $reportNo];
if ($token !== '') {
$params['material_tag_token'] = $token;
}
return rtrim($baseUrl, '/') . '/#/pages/report/detail?' . http_build_query($params, '', '&', PHP_QUERY_RFC3986);
}
private function findPublishedReportNoByToken(string $token): string
{
$tag = Db::name('material_tag_codes')->where('qr_token', $token)->find();
if (
!$tag
|| (int)($tag['report_id'] ?? 0) <= 0
|| ($tag['bind_status'] ?? '') !== 'bound'
|| ($tag['status'] ?? 'active') === 'invalid'
) {
return '';
}
$batch = Db::name('material_batches')->where('id', (int)$tag['batch_id'])->find();
if ($batch && ($batch['status'] ?? 'active') === 'invalid') {
return '';
}
$report = Db::name('reports')
->where('id', (int)$tag['report_id'])
->where('report_status', 'published')
->find();
return $report ? (string)$report['report_no'] : '';
}
private function generateUniqueBatchNo(): string
{
for ($i = 0; $i < 20; $i++) {