AgentHierarchyPolicy.php 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. <?php
  2. declare(strict_types=1);
  3. namespace plugin\saiadmin\app\service\agent;
  4. use plugin\saiadmin\exception\ApiException;
  5. /** Explicit hierarchy; missing historical relationships are unknown, never inferred from regions. */
  6. final class AgentHierarchyPolicy
  7. {
  8. public function levels(array $agents): array {
  9. $map=array_column($agents,null,'id'); $levels=[];
  10. foreach ($map as $id=>$agent) {
  11. $seen=[]; $cursor=$id; $level=0;
  12. while (isset($map[$cursor])) {
  13. if (isset($seen[$cursor])) throw new ApiException('代理上下级关系存在循环');
  14. $seen[$cursor]=true; $level++;
  15. $parent=$map[$cursor]['parent_id'];
  16. if ($parent===null) { $level=null; break; }
  17. if ((int)$parent===0) break;
  18. $cursor=(int)$parent;
  19. if (!isset($map[$cursor])) throw new ApiException('上级代理不存在');
  20. }
  21. if ($level!==null && $level>3) throw new ApiException('代理团队最多支持三级');
  22. $levels[$id]=$level;
  23. }
  24. return $levels;
  25. }
  26. public function validate(array $agents,int $id,?int $parent): void {
  27. $map=array_column($agents,null,'id');
  28. if ($parent!==null && $parent!==0) {
  29. if (!isset($map[$parent])) throw new ApiException('上级代理不存在');
  30. if ((int)$map[$parent]['status']!==1 && ($map[$id]['parent_id']??null)!=$parent) throw new ApiException('不能归属已停用代理');
  31. if (($this->levels($agents)[$parent]??null)===null) throw new ApiException('请先设置上级代理的等级');
  32. }
  33. $map[$id]=array_replace($map[$id]??['id'=>$id,'status'=>1],['parent_id'=>$parent]);
  34. if ($parent===null) foreach ($map as $row) if ((int)($row['parent_id']??0)===$id) throw new ApiException('存在下级代理,不能清空等级');
  35. $this->levels(array_values($map));
  36. }
  37. }