fix(stability): 支付并发事务内加锁、组合支付流水记录、省市区树形缓存与地址安全防越权 (TDD)
这个提交包含在:
@@ -24,16 +24,47 @@ class Address extends Base
|
||||
|
||||
public function area()
|
||||
{
|
||||
$data['provinceData'] = Area::where('level', 1)->order('id asc')->field('id as value, name as label, pid, level')->select();
|
||||
foreach ($data['provinceData'] as $k => $p) {
|
||||
$data['cityData'][$k] = Area::where(['level' => 2, 'pid' => $p->value])->order('id asc')->field('id as value, name as label, pid, level')->select();
|
||||
foreach ($data['cityData'][$k] as $i => $c) {
|
||||
$data['areaData'][$k][$i] = Area::where(['level' => 3, 'pid' => $c->value])->order('id asc')->field('id as value, name as label, pid, level')->select();
|
||||
$cacheKey = 'shopro_area_tree_data';
|
||||
$data = cache($cacheKey);
|
||||
if (!$data) {
|
||||
// 一次性查出全部省市区数据(仅 1 次查询),并在内存中按 pid 构建树形,消除 350+ 次嵌套 SQL 击穿
|
||||
$allAreas = Area::where('level', 'in', [1, 2, 3])
|
||||
->field('id as value, name as label, pid, level')
|
||||
->order('id asc')
|
||||
->select();
|
||||
|
||||
$provinceData = [];
|
||||
$cityMap = [];
|
||||
$areaMap = [];
|
||||
foreach ($allAreas as $item) {
|
||||
if ($item['level'] == 1) {
|
||||
$provinceData[] = $item;
|
||||
} elseif ($item['level'] == 2) {
|
||||
$cityMap[$item['pid']][] = $item;
|
||||
} elseif ($item['level'] == 3) {
|
||||
$areaMap[$item['pid']][] = $item;
|
||||
}
|
||||
}
|
||||
|
||||
$cityData = [];
|
||||
$areaData = [];
|
||||
foreach ($provinceData as $k => $p) {
|
||||
$cities = $cityMap[$p['value']] ?? [];
|
||||
$cityData[$k] = $cities;
|
||||
foreach ($cities as $i => $c) {
|
||||
$areaData[$k][$i] = $areaMap[$c['value']] ?? [];
|
||||
}
|
||||
}
|
||||
|
||||
$data = [
|
||||
'provinceData' => $provinceData,
|
||||
'cityData' => $cityData,
|
||||
'areaData' => $areaData
|
||||
];
|
||||
cache($cacheKey, $data, 604800);
|
||||
}
|
||||
|
||||
$this->success('省市区', $data);
|
||||
|
||||
}
|
||||
|
||||
public function edit()
|
||||
|
||||
在新工单中引用
屏蔽一个用户