| 123456789101112131415161718192021222324252627282930313233343536373839 |
- <?php
- declare(strict_types=1);
- namespace plugin\saiadmin\app\service\agent;
- use plugin\saiadmin\exception\ApiException;
- /** Explicit hierarchy; missing historical relationships are unknown, never inferred from regions. */
- final class AgentHierarchyPolicy
- {
- public function levels(array $agents): array {
- $map=array_column($agents,null,'id'); $levels=[];
- foreach ($map as $id=>$agent) {
- $seen=[]; $cursor=$id; $level=0;
- while (isset($map[$cursor])) {
- if (isset($seen[$cursor])) throw new ApiException('代理上下级关系存在循环');
- $seen[$cursor]=true; $level++;
- $parent=$map[$cursor]['parent_id'];
- if ($parent===null) { $level=null; break; }
- if ((int)$parent===0) break;
- $cursor=(int)$parent;
- if (!isset($map[$cursor])) throw new ApiException('上级代理不存在');
- }
- if ($level!==null && $level>3) throw new ApiException('代理团队最多支持三级');
- $levels[$id]=$level;
- }
- return $levels;
- }
- public function validate(array $agents,int $id,?int $parent): void {
- $map=array_column($agents,null,'id');
- if ($parent!==null && $parent!==0) {
- if (!isset($map[$parent])) throw new ApiException('上级代理不存在');
- if ((int)$map[$parent]['status']!==1 && ($map[$id]['parent_id']??null)!=$parent) throw new ApiException('不能归属已停用代理');
- if (($this->levels($agents)[$parent]??null)===null) throw new ApiException('请先设置上级代理的等级');
- }
- $map[$id]=array_replace($map[$id]??['id'=>$id,'status'=>1],['parent_id'=>$parent]);
- if ($parent===null) foreach ($map as $row) if ((int)($row['parent_id']??0)===$id) throw new ApiException('存在下级代理,不能清空等级');
- $this->levels(array_values($map));
- }
- }
|