308 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			308 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
<?php
 | 
						|
 | 
						|
namespace app\controller\manager;
 | 
						|
 | 
						|
use app\exception\RepositoryException;
 | 
						|
use app\model\Account;
 | 
						|
use app\model\AccountDataLog;
 | 
						|
use app\model\AccountWithdrawalCommission;
 | 
						|
use app\repository\AccountRepository;
 | 
						|
use app\service\Math;
 | 
						|
use Exception;
 | 
						|
use think\facade\Db;
 | 
						|
use think\response\Json;
 | 
						|
use think\response\View;
 | 
						|
 | 
						|
/**
 | 
						|
 * 佣金
 | 
						|
 *
 | 
						|
 * Class Commission
 | 
						|
 * @package app\controller\manager
 | 
						|
 */
 | 
						|
class Commission extends Base
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * 操作用户佣金
 | 
						|
     * */
 | 
						|
    public function operation()
 | 
						|
    {
 | 
						|
        $accountId = input('account_id/d');
 | 
						|
        $type      = input('type/s', 'commission');
 | 
						|
        if ($this->request->isPost()) {
 | 
						|
 | 
						|
            $num    = input("num/f", 1);
 | 
						|
            $remark = input("remark/s", "");
 | 
						|
 | 
						|
            $account = AccountRepository::getInstance()->getModel()->findOne(["id" => $accountId], [], function ($q) {
 | 
						|
                return $q->lock(true);
 | 
						|
            });
 | 
						|
            if (empty($account)) {
 | 
						|
                return $this->json(4001, "用户不存在");
 | 
						|
            }
 | 
						|
            Db::startTrans();
 | 
						|
            try {
 | 
						|
 | 
						|
                $saveData = [$type => ($account[$type] + $num)];
 | 
						|
 | 
						|
                //写入用户记录
 | 
						|
                AccountDataLog::log($accountId,
 | 
						|
                    "后台操作",
 | 
						|
                    $num,
 | 
						|
                    $type,
 | 
						|
                    AccountDataLog::ACTION_ADMIN_OPERATION,
 | 
						|
                    ($account[$type] + $num),
 | 
						|
                    $this->auth['nickname'] ?? "",
 | 
						|
                    $this->auth['user_id'] ?? 0,
 | 
						|
                    $remark
 | 
						|
                );
 | 
						|
 | 
						|
                //保存用户
 | 
						|
                $account->save($saveData);
 | 
						|
 | 
						|
                Db::commit();
 | 
						|
                return $this->json();
 | 
						|
            } catch (RepositoryException $e) {
 | 
						|
                Db::rollback();
 | 
						|
                return $this->json("4000", "佣金操作失败:".$e->getMessage());
 | 
						|
            } catch (Exception $e) {
 | 
						|
                Db::rollback();
 | 
						|
                \think\facade\Log::error('佣金操作失败'.$e->getMessage().' file:'.$e->getFile().' line:'.$e->getLine());
 | 
						|
                return $this->json("5003", "佣金操作失败");
 | 
						|
            }
 | 
						|
 | 
						|
        }
 | 
						|
        $this->data["accountId"] = $accountId;
 | 
						|
        $this->data["type"]      = $type;
 | 
						|
        return $this->view();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 处理搜索条件
 | 
						|
     *
 | 
						|
     * @param  array  $searchParams
 | 
						|
     * @return array[]
 | 
						|
     */
 | 
						|
    protected function handleSearch(array $searchParams): array
 | 
						|
    {
 | 
						|
        $search       = [];
 | 
						|
        $accountWhere = [];
 | 
						|
        if (!empty($searchParams)) {
 | 
						|
            foreach ($searchParams as $key => $param) {
 | 
						|
                if (!empty($param)) {
 | 
						|
                    if (in_array($key, ['created_at', 'change_type', 'action'])) {
 | 
						|
                        switch ($key) {
 | 
						|
                            case 'created_at':
 | 
						|
                            case 'action':
 | 
						|
                                $search[] = ['self.'.$key, 'like', '%'.$param.'%'];
 | 
						|
                                break;
 | 
						|
                            case 'change_type':
 | 
						|
                                $search[] = $param == 'in' ? ['num', '>', 0] : ['num', '<', 0];
 | 
						|
                                break;
 | 
						|
                        }
 | 
						|
                    } else {
 | 
						|
                        $accountWhere[] = [$key, 'like', '%'.$param.'%'];
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return ['search' => $search, 'accountWhere' => $accountWhere];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 用户佣金排行 按降序排列
 | 
						|
     *
 | 
						|
     * @return Json|View
 | 
						|
     * @throws Exception
 | 
						|
     */
 | 
						|
    public function index()
 | 
						|
    {
 | 
						|
        if ($this->request->isPost()) {
 | 
						|
            $page    = input('page/d', 1);
 | 
						|
            $limit   = input('size/d', 10);
 | 
						|
            $params  = input('searchParams');
 | 
						|
            $keyword = $params['keyword'] ?? '';
 | 
						|
 | 
						|
            $where[] = ['phone_active', '=', Account::COMMON_ON];
 | 
						|
            $items   = AccountRepository::getInstance()->findList($where, [], $page, $limit, function ($q) use ($keyword) {
 | 
						|
                return $q->when(!empty($keyword), function ($qa) use ($keyword) {
 | 
						|
                    $qa->where('real_name|mobile|nickname', 'like', '%'.$keyword.'%');
 | 
						|
                });
 | 
						|
            }, ["commission" => "desc", "id" => "desc"]);
 | 
						|
 | 
						|
            return $this->json(0, '操作成功', $items);
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->view();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 查看单个用户的佣金记录
 | 
						|
     *
 | 
						|
     * @throws Exception
 | 
						|
     */
 | 
						|
    public function personal()
 | 
						|
    {
 | 
						|
        $accountId = input("account_id/d", 0);
 | 
						|
        if ($this->request->isPost()) {
 | 
						|
            $page          = input('page/d', 1);
 | 
						|
            $limit         = input('size/d', 10);
 | 
						|
            $search        = [];
 | 
						|
            $search[]      = ["account_id", '=', $accountId];
 | 
						|
            $search[]      = ["type", '=', AccountDataLog::TYPE_COMMISSION];
 | 
						|
            $items         = AccountDataLog::findList($search, [], $page, $limit,
 | 
						|
                function ($q) {
 | 
						|
                    return $q->with(["account"]);
 | 
						|
                }, ["id" => "desc"]);
 | 
						|
            $items['list'] = $items['list']->each(function ($item) {
 | 
						|
                $item->nickname  = $item->account->nickname ?? '';
 | 
						|
                $item->real_name = $item->account->real_name ?? '';
 | 
						|
                $item->mobile    = $item->account->mobile ?? '';
 | 
						|
            });
 | 
						|
            return $this->json(0, '操作成功', $items);
 | 
						|
        }
 | 
						|
 | 
						|
        $this->data["accountId"] = $accountId;
 | 
						|
        return $this->view();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 查看所有用户的佣金记录
 | 
						|
     **/
 | 
						|
    public function log()
 | 
						|
    {
 | 
						|
        $accountId = input('account_id', 0);
 | 
						|
        if ($this->request->isPost()) {
 | 
						|
            $page  = input('page/d', 1);
 | 
						|
            $limit = input('size/d', 10);
 | 
						|
 | 
						|
            $searchParams = input('searchParams', []);
 | 
						|
 | 
						|
            $accountWhere = [];
 | 
						|
            $search       = [];
 | 
						|
            $search[]     = ["type", '=', AccountDataLog::TYPE_COMMISSION];
 | 
						|
            if ($accountId > 0) {
 | 
						|
                $search[] = ["self.account_id", '=', $accountId];
 | 
						|
            }
 | 
						|
 | 
						|
            $searchArr    = $this->handleSearch($searchParams);
 | 
						|
            $search       = !empty($searchArr['search']) ? array_merge($search, $searchArr['search']) : $search;
 | 
						|
            $accountWhere = !empty($searchArr['accountWhere']) ? array_merge($accountWhere, $searchArr['accountWhere']) : $accountWhere;
 | 
						|
 | 
						|
            $field = ['self.*', 'a.nickname', 'a.real_name', 'a.mobile'];
 | 
						|
            $items = AccountDataLog::findList($search, $field, $page, $limit,
 | 
						|
                function ($q) use ($accountWhere) {
 | 
						|
                    return $q->alias('self')
 | 
						|
                        ->join('account a', 'a.id = self.account_id')
 | 
						|
                        ->where($accountWhere);
 | 
						|
                }, ["id" => "desc"]);
 | 
						|
            return $this->json(0, '操作成功', $items);
 | 
						|
        }
 | 
						|
 | 
						|
        $this->data['accountId']    = $accountId;
 | 
						|
        $this->data["changeAction"] = AccountDataLog::commissionAction();
 | 
						|
 | 
						|
        return $this->view();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 提现列表
 | 
						|
     * */
 | 
						|
    public function withdrawalList()
 | 
						|
    {
 | 
						|
        if ($this->request->isPost()) {
 | 
						|
            $page  = input('page/d', 1);
 | 
						|
            $limit = input('size/d', 10);
 | 
						|
            $items = AccountWithdrawalCommission::findList([], [], $page, $limit,
 | 
						|
                function ($q) {
 | 
						|
                    return $q->with(["account"]);
 | 
						|
                }, ["id" => "desc"]);
 | 
						|
            return $this->json(0, '操作成功', $items);
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->view();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 审核提现
 | 
						|
     * */
 | 
						|
    public function check(): Json
 | 
						|
    {
 | 
						|
        $id     = input("id/d");
 | 
						|
        $status = input("status/d", null);
 | 
						|
        if (empty($status)) {
 | 
						|
            return $this->json(4001, "错误的状态");
 | 
						|
        }
 | 
						|
 | 
						|
        if (!$accountCoinWithdrawal = AccountWithdrawalCommission::findById($id, [])) {
 | 
						|
            return $this->json(4001, "该提现信息不存在");
 | 
						|
        }
 | 
						|
        if ($accountCoinWithdrawal['status'] != AccountWithdrawalCommission::$status_default) {
 | 
						|
            return $this->json(4001, "该提现不需要审核");
 | 
						|
        }
 | 
						|
 | 
						|
        $account = AccountRepository::getInstance()->getModel()->findOne(["id" => $accountCoinWithdrawal['account_id']], [], function ($q) {
 | 
						|
            return $q->lock(true);
 | 
						|
        });
 | 
						|
        if (empty($account)) {
 | 
						|
            return $this->json(4001, "提现用户信息不存在");
 | 
						|
        }
 | 
						|
        Db::startTrans();
 | 
						|
        try {
 | 
						|
            //如果状态是审核失败  退回佣金  写入记录
 | 
						|
            if ($status == AccountWithdrawalCommission::$status_fail) {
 | 
						|
                //写入--积分佣金日志
 | 
						|
                AccountDataLog::log($accountCoinWithdrawal['account']['id'],
 | 
						|
                    '提现佣金审核失败,退回',
 | 
						|
                    $accountCoinWithdrawal['number'],
 | 
						|
                    AccountDataLog::TYPE_COMMISSION,
 | 
						|
                    AccountDataLog::ACTION_WITHDRAWAL_RETURN,
 | 
						|
                    Math::add($accountCoinWithdrawal['account']['commission'], $accountCoinWithdrawal['number'])
 | 
						|
                );
 | 
						|
                //退回到账户
 | 
						|
                $account->save([
 | 
						|
                    'commission' => Math::add($accountCoinWithdrawal['account']['commission'], $accountCoinWithdrawal['number'])
 | 
						|
                ]);
 | 
						|
            }
 | 
						|
 | 
						|
            //保存状态
 | 
						|
            $accountCoinWithdrawal->save([
 | 
						|
                "status"   => $status,
 | 
						|
                "operator" => $this->auth["nickname"],
 | 
						|
                "audit_at" => date("Y-m-d H:i:s")
 | 
						|
            ]);
 | 
						|
 | 
						|
            Db::commit();
 | 
						|
            return $this->json();
 | 
						|
        } catch (RepositoryException $e) {
 | 
						|
            Db::rollback();
 | 
						|
            return $this->json(4000, $e->getMessage());
 | 
						|
        } catch (Exception $e) {
 | 
						|
            Db::rollback();
 | 
						|
            \think\facade\Log::error('佣金提现审核失败'.$e->getMessage().' file:'.$e->getFile().' line:'.$e->getLine());
 | 
						|
            return $this->json(5003, "审核失败");
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 提现配置
 | 
						|
     * */
 | 
						|
    public function withdrawalConfig()
 | 
						|
    {
 | 
						|
        if ($this->request->isPost()) {
 | 
						|
            try {
 | 
						|
                $data = input("post.");
 | 
						|
                $php  = var_export($data, true);
 | 
						|
                file_put_contents(config_path().'extra/commission_withdrawal'.'.php', '<?php'.PHP_EOL.'return '.$php.';');
 | 
						|
                return $this->json();
 | 
						|
            } catch (Exception $e) {
 | 
						|
                return $this->json(4001, $e->getMessage());
 | 
						|
            }
 | 
						|
        }
 | 
						|
        \think\facade\Config::load('extra/commission_withdrawal', 'commission_withdrawal');
 | 
						|
        $coinWithdrawal     = config('commission_withdrawal');
 | 
						|
        $this->data["item"] = $coinWithdrawal;
 | 
						|
        return $this->view("/manager/config/commission_withdrawal");
 | 
						|
 | 
						|
    }
 | 
						|
}
 |