233 万行上做 distinct 扫描要几秒;新增 JstOrderLabelOptions(按公司缓存 24 小时),页面读取缓存,导入命令结束时失效并预热,避免每次打开页面都等待。
73 lines
1.8 KiB
PHP
73 lines
1.8 KiB
PHP
<?php
|
||
|
||
namespace App\Business;
|
||
|
||
use App\Models\Business\JstOrderLabel;
|
||
use Illuminate\Support\Facades\Cache;
|
||
|
||
/**
|
||
* 聚水潭订单标签明细的筛选下拉选项。
|
||
*
|
||
* 表里有 200 万行以上,distinct 扫描一次要几秒;这里按公司缓存 24 小时,
|
||
* 导入命令结束时会主动预热,避免每次打开页面都慢。
|
||
*/
|
||
class JstOrderLabelOptions
|
||
{
|
||
private const TTL_HOURS = 24;
|
||
|
||
private const LIMIT = 500;
|
||
|
||
/** @return list<string> */
|
||
public function labels(int $companyId): array
|
||
{
|
||
return $this->remember($companyId, 'label');
|
||
}
|
||
|
||
/** @return list<string> */
|
||
public function shops(int $companyId): array
|
||
{
|
||
return $this->remember($companyId, 'shop_name');
|
||
}
|
||
|
||
public function warm(int $companyId): void
|
||
{
|
||
$this->labels($companyId);
|
||
$this->shops($companyId);
|
||
}
|
||
|
||
public function forget(int $companyId): void
|
||
{
|
||
Cache::forget($this->key($companyId, 'label'));
|
||
Cache::forget($this->key($companyId, 'shop_name'));
|
||
}
|
||
|
||
/** @return list<string> */
|
||
private function remember(int $companyId, string $column): array
|
||
{
|
||
$key = $this->key($companyId, $column);
|
||
$cached = Cache::get($key);
|
||
if (is_array($cached)) {
|
||
return $cached;
|
||
}
|
||
|
||
$values = JstOrderLabel::query()
|
||
->where('company_id', $companyId)
|
||
->whereNotNull($column)
|
||
->where($column, '<>', '')
|
||
->distinct()
|
||
->orderBy($column)
|
||
->limit(self::LIMIT)
|
||
->pluck($column)
|
||
->all();
|
||
|
||
Cache::put($key, $values, now()->addHours(self::TTL_HOURS));
|
||
|
||
return $values;
|
||
}
|
||
|
||
private function key(int $companyId, string $column): string
|
||
{
|
||
return "jst-order-labels:options:v1:{$companyId}:{$column}";
|
||
}
|
||
}
|