caipan_shop_admin/app/controller/manager/Commission.php

308 lines
10 KiB
PHP
Executable File

<?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");
}
}