// +---------------------------------------------------------------------- declare(strict_types=1); namespace addon\appmall\controller\backend; use think\facade\Db; use think\facade\View; use Exception; use ywxapp\controller\BackendBase; /** * 收益与结算管理(运营后台,中心站) * * - 收益账本:每笔已支付订单按平台抽成记账,归属对应开发者; * - 提现单:开发者发起(或运营代发)后在此审核打款/驳回。 */ class Revenue extends BackendBase { /** * 收益账本列表 */ public function index() { if ($this->request->isAjax()) { $devId = $this->request->param('developer_id', ''); $query = Db::name('appmall_addon_revenues')->order('id', 'desc'); if ($devId !== '') { $query->where('developer_id', (int) $devId); } $list = $query->paginate([ 'page' => (int) $this->request->param('page', 1), 'list_rows' => (int) $this->request->param('limit', 10), ]); // 汇总:总销售额 / 总抽成 / 总开发者收益 $summary = Db::name('appmall_addon_revenues') ->field('SUM(amount) as total_amount, SUM(commission) as total_commission, SUM(income) as total_income') ->find(); $this->result->setCount($list->total())->success([ 'list' => $list->items(), 'summary' => [ 'total_amount' => $summary['total_amount'] ?? 0, 'total_commission' => $summary['total_commission'] ?? 0, 'total_income' => $summary['total_income'] ?? 0, ], ], '获取成功'); } return View::fetch('revenue/index'); } /** * 提现单列表 */ public function withdrawals() { if ($this->request->isAjax()) { $status = $this->request->param('status', ''); $query = Db::name('appmall_addon_withdrawals')->order('id', 'desc'); if ($status !== '') { $query->where('status', (int) $status); } $list = $query->paginate([ 'page' => (int) $this->request->param('page', 1), 'list_rows' => (int) $this->request->param('limit', 10), ]); $this->result->setCount($list->total())->success($list->items(), '获取成功'); } return View::fetch('revenue/withdrawal'); } /** * 审核通过:标记已打款,释放冻结金额,并将对应收益置为已结算 */ public function settle() { try { $id = (int) input('id'); $w = Db::name('appmall_addon_withdrawals')->where('id', $id)->find(); if (empty($w)) { return $this->result->error('提现单不存在'); } if ((int) $w['status'] !== 0) { return $this->result->error('该单已处理'); } Db::transaction(function () use ($w) { // 释放冻结(实际打款为线下/对接支付,此处仅结算记账) Db::name('appmall_developers')->where('id', $w['developer_id']) ->dec('frozen_balance', $w['amount'])->update(); Db::name('appmall_addon_withdrawals')->where('id', $w['id']) ->update(['status' => 1, 'update_at' => time()]); // 同步将该开发者待结算收益置为已结算 Db::name('appmall_addon_revenues')->where('developer_id', $w['developer_id']) ->where('status', 0) ->update(['status' => 1, 'settle_at' => time()]); }); return $this->result->success([], '已结算打款'); } catch (Exception $e) { return $this->result->error($e->getMessage()); } } /** * 驳回提现:冻结金额退回开发者可提现余额 */ public function rejectWithdrawal() { try { $id = (int) input('id'); $reason = input('reason', ''); $w = Db::name('appmall_addon_withdrawals')->where('id', $id)->find(); if (empty($w)) { return $this->result->error('提现单不存在'); } if ((int) $w['status'] !== 0) { return $this->result->error('该单已处理'); } Db::transaction(function () use ($w, $reason) { Db::name('appmall_developers')->where('id', $w['developer_id']) ->dec('frozen_balance', $w['amount']) ->inc('balance', $w['amount'])->update(); Db::name('appmall_addon_withdrawals')->where('id', $w['id']) ->update(['status' => -1, 'remark' => $reason, 'update_at' => time()]); }); return $this->result->success([], '已驳回,金额已退回'); } catch (Exception $e) { return $this->result->error($e->getMessage()); } } }