Files
lotteryLaravel/app/Models/AgentNode.php
kang a44679665d feat: 增强代理和玩家管理功能
- 在多个控制器中更新权限检查逻辑,确保管理员能够更灵活地管理代理和玩家。
- 在 AdminPlayerStoreController 中引入对玩家创建能力的验证,确保只有具备相应权限的管理员能够创建玩家。
- 更新请求验证逻辑,新增 credit_limit、rebate_rate 和 extra_rebate_rate 字段,以支持更细粒度的玩家管理。
- 在 AgentNodeProfileController 中添加对父代理能力授予的验证,确保子代理的权限在父代理范围内。
- 引入 AgentProfileFieldRules 以简化代理资料更新请求的规则定义,提升代码复用性。
2026-06-04 18:00:50 +08:00

85 lines
2.0 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
final class AgentNode extends Model
{
protected $table = 'agent_nodes';
protected $fillable = [
'admin_site_id',
'parent_id',
'path',
'depth',
'code',
'name',
'status',
'risk_tags',
'created_by',
'extra_json',
];
protected function casts(): array
{
return [
'admin_site_id' => 'integer',
'parent_id' => 'integer',
'depth' => 'integer',
'status' => 'integer',
'extra_json' => 'array',
'risk_tags' => 'array',
];
}
public function isEnabled(): bool
{
return (int) $this->status === 1;
}
public function isRoot(): bool
{
return $this->parent_id === null || (int) $this->depth === 0;
}
/** @return BelongsTo<AdminSite, AgentNode> */
public function adminSite(): BelongsTo
{
return $this->belongsTo(AdminSite::class, 'admin_site_id');
}
/** @return BelongsTo<AgentNode, AgentNode> */
public function parent(): BelongsTo
{
return $this->belongsTo(self::class, 'parent_id');
}
/** @return HasMany<AgentNode, AgentNode> */
public function children(): HasMany
{
return $this->hasMany(self::class, 'parent_id')->orderBy('code');
}
public function isDescendantOf(self $ancestor): bool
{
if ((int) $this->admin_site_id !== (int) $ancestor->admin_site_id) {
return false;
}
$ancestorPath = (string) $ancestor->path;
if ($ancestorPath === '') {
return false;
}
return str_starts_with((string) $this->path, $ancestorPath);
}
public function isSameOrDescendantOf(self $ancestor): bool
{
return (int) $this->id === (int) $ancestor->id || $this->isDescendantOf($ancestor);
}
}