| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | <?phpnamespace app\common\model\commission;use app\common\model\User;use app\common\Enum\AgentType;use app\common\library\BcMath;use think\Model;class Agent  extends Model{    protected $pk = 'user_id';    protected $name = 'shop_commission_agent';    protected $type = [        'become_time' => 'timestamp',        'child_agent_level_1' => 'json',        'child_agent_level_all' => 'json',    ];    protected $append = [        'status_text',        'agent_type_text',        'pending_reward',        'commission_balance'    ];    // 分销商状态 AGENT_STATUS    const AGENT_STATUS_NORMAL = 'normal';       // 正常     const AGENT_STATUS_PENDING = 'pending';     // 审核中 不分佣、不打款、没有团队信息    const AGENT_STATUS_FREEZE = 'freeze';       // 冻结 正常记录分佣、不打款,记录业绩和团队信息 冻结解除后立即打款    const AGENT_STATUS_FORBIDDEN = 'forbidden'; // 禁用 不分佣、不记录业绩和团队信息    const AGENT_STATUS_NEEDINFO = 'needinfo';   // 需要完善表单资料 临时状态    const AGENT_STATUS_REJECT = 'reject';       // 审核驳回, 重新修改   临时状态    const AGENT_STATUS_NULL = NULL;             // 未满足成为分销商条件    // 分销商升级锁 UPGRADE_LOCK    const UPGRADE_LOCK_OPEN = 1;  // 禁止分销商升级    const UPGRADE_LOCK_CLOSE = 0;  // 允许分销商升级    public function statusList()    {        return [            self::AGENT_STATUS_NORMAL => '正常',            self::AGENT_STATUS_PENDING => '审核中',            self::AGENT_STATUS_FREEZE => '冻结',            self::AGENT_STATUS_FORBIDDEN => '禁用',            self::AGENT_STATUS_REJECT => '拒绝'        ];    }    /**     * 获取状态文本     */    public function getStatusTextAttr($value, $data)    {        $value = $value ? $value : (isset($data['status']) ? $data['status'] : '');        $statusList = $this->statusList();        return isset($statusList[$value]) ? $statusList[$value] : '正常';    }    /**     * 获取代理商类型文本     */    public function getAgentTypeTextAttr($value, $data)    {        $value = $value ? $value : (isset($data['agent_type']) ? $data['agent_type'] : 'normal');        return AgentType::getTypeText($value);    }    /**     * 可用分销商     */    public function scopeAvaliable($query)    {        return $query->where('status', 'in', [self::AGENT_STATUS_NORMAL, self::AGENT_STATUS_FREEZE]);    }    public function user()    {        return $this->belongsTo(User::class, 'user_id', 'id')->field('id, nickname, avatar, mobile, total_consume, parent_user_id');    }    public function levelInfo()    {        return $this->belongsTo(Level::class, 'level', 'level')->field(['level', 'name', 'image', 'commission_rules']);    }    public function getPendingRewardAttr($value, $data)    {        $amount = Reward::pending()->where('agent_id', $data['user_id'])->sum('commission');        // 使用BcMath工具类格式化金额,确保精度        return BcMath::format($amount);    }    /**     * 获取佣金余额(累计收益 - 已提现金额)     */    public function getCommissionBalanceAttr($value, $data)    {        $totalIncome = $data['total_income'] ?? '0.00';        $withdrawnAmount = $data['withdrawn_amount'] ?? '0.00';                // 使用BcMath工具类计算余额,并确保不为负数        $balance = BcMath::sub($totalIncome, $withdrawnAmount);        return BcMath::max($balance);    }    public function levelStatusInfo()    {        return $this->belongsTo(Level::class, 'level_status', 'level');    }    public function upgradeLevel()    {        return $this->belongsTo(Level::class, 'level_status', 'level');    }}
 |