498 lines
19 KiB
PHP
498 lines
19 KiB
PHP
<?php
|
||
|
||
namespace app\admin\controller;
|
||
|
||
use app\api\model\TbUser;
|
||
use app\common\controller\Backend;
|
||
use app\common\library\DatabaseRoute;
|
||
use ba\Exception;
|
||
|
||
class Order extends Backend
|
||
{
|
||
protected array $noNeedLogin = ['*'];
|
||
|
||
public function deleteOrders($ids)
|
||
{
|
||
$idS = explode(",", $ids);
|
||
foreach ($idS as $id) {
|
||
DatabaseRoute::deleteAllDbDirect('orders', function ($query) use ($id) {
|
||
return $query->where([
|
||
'orders_id' => $id
|
||
]);
|
||
});
|
||
}
|
||
$this->success();
|
||
}
|
||
|
||
public function selectOrders()
|
||
{
|
||
$params = $this->request->param();
|
||
$this->successWithData(DatabaseRoute::paginateAllDb('orders', function ($query) use ($params) {
|
||
// 动态拼接查询条件
|
||
if (!empty($params['userName'])) {
|
||
$query->whereLike('u.user_name', '%' . $params['userName'] . '%');
|
||
}
|
||
|
||
if (!empty($params['qdCode'])) {
|
||
$query->where('s.qd_code', $params['qdCode']);
|
||
}
|
||
|
||
if (!empty($params['sysUserName'])) {
|
||
$query->whereLike('s.username', '%' . $params['sysUserName'] . '%');
|
||
}
|
||
|
||
if (!empty($params['ordersNo'])) {
|
||
$query->whereLike('o.orders_no', '%' . $params['ordersNo'] . '%');
|
||
}
|
||
|
||
if (isset($params['status']) && $params['status'] !== -1) {
|
||
$query->where('o.status', $params['status']);
|
||
}
|
||
|
||
if (!empty($params['userId'])) {
|
||
$query->where('o.user_id', $params['userId']);
|
||
}
|
||
|
||
if (!empty($params['ordersType'])) {
|
||
$query->where('o.orders_type', $params['ordersType']);
|
||
}
|
||
|
||
if (!empty($params['courseId'])) {
|
||
$query->where('o.course_id', $params['courseId']);
|
||
}
|
||
|
||
if (!empty($params['sysUserId'])) {
|
||
$query->where('o.sys_user_id', $params['sysUserId']);
|
||
}
|
||
|
||
// 时间范围
|
||
if (!empty($params['startTime']) && !empty($params['endTime'])) {
|
||
$query->whereBetween('o.create_time', [$params['startTime'], $params['endTime']]);
|
||
} elseif (!empty($params['startTime'])) {
|
||
$query->where('o.create_time', '>=', $params['startTime']);
|
||
} elseif (!empty($params['endTime'])) {
|
||
$query->where('o.create_time', '<=', $params['endTime']);
|
||
}
|
||
|
||
// 排序
|
||
$query->order('o.create_time', 'desc');
|
||
return $query->alias('o')
|
||
->field('o.*, u.user_name as userName, s.username as sysUserName, s.qd_code as qdCode')
|
||
->leftJoin('tb_user u', 'o.user_id = u.user_id')
|
||
->leftJoin('sys_user s', 's.user_id = o.sys_user_id');
|
||
}, $params['page'], $params['limit']));
|
||
}
|
||
|
||
private function sumOrder($params)
|
||
{
|
||
// 总收益
|
||
return DatabaseRoute::getAllDbData('orders', function ($query) use ($params) {
|
||
// 条件拼接
|
||
if (!empty($params['sysUserId']) && $params['sysUserId'] != 1) {
|
||
$query->where('sys_user_id', $params['sysUserId']);
|
||
}
|
||
|
||
if (isset($params['status'])) {
|
||
$query->where('status', $params['status']);
|
||
}
|
||
|
||
if (isset($params['courseId'])) {
|
||
$query->where('course_id', $params['courseId']);
|
||
}
|
||
|
||
if (isset($params['ordersType'])) {
|
||
$query->where('orders_type', $params['ordersType']);
|
||
}
|
||
|
||
if (isset($params['flag']) && !empty($params['time'])) {
|
||
switch ((int)$params['flag']) {
|
||
case 1:
|
||
// 按日
|
||
$query->whereRaw("DATE_FORMAT(create_time, '%Y-%m-%d') = DATE_FORMAT(:time, '%Y-%m-%d')", ['time' => $params['time']]);
|
||
break;
|
||
case 2:
|
||
// 按月
|
||
$query->whereRaw("DATE_FORMAT(create_time, '%Y-%m') = DATE_FORMAT(:time, '%Y-%m')", ['time' => $params['time']]);
|
||
break;
|
||
case 3:
|
||
// 按年
|
||
$query->whereRaw("DATE_FORMAT(create_time, '%Y') = DATE_FORMAT(:time, '%Y')", ['time' => $params['time']]);
|
||
break;
|
||
}
|
||
}
|
||
|
||
$query->where('pay_way', 9)
|
||
->where('status', 1); // 强制条件
|
||
return $query;
|
||
})->sum('pay_money');
|
||
}
|
||
|
||
|
||
public function selectCourseOrdersMoneyCount()
|
||
{
|
||
$params = $this->request->param();
|
||
|
||
$params['ordersType'] = 1;
|
||
$params['time'] = date('Y-m-d 00:00:00');
|
||
// 总收益
|
||
$sumMoney = $this->sumOrder($params);
|
||
$params['flag'] = 3;
|
||
$yearMoney = $this->sumOrder($params);
|
||
$params['flag'] = 2;
|
||
$monthMoney = $this->sumOrder($params);
|
||
$params['flag'] = 1;
|
||
$dayMoney = $this->sumOrder($params);
|
||
$this->successWithData([
|
||
'sumMoney' => $sumMoney ?? 0,
|
||
'yearMoney' => $yearMoney ?? 0,
|
||
'monthMoney' => $monthMoney ?? 0,
|
||
'dayMoney' => $dayMoney ?? 0
|
||
]);
|
||
}
|
||
|
||
|
||
// 订单数量统计
|
||
public function selectOrdersCountStatisticsByYear()
|
||
{
|
||
$get = $this->request->get();
|
||
$startTime = $get['startTime'];
|
||
$endTime = $get['endTime'];
|
||
|
||
// 初始化结果数组
|
||
$ordersCountList = [];
|
||
$ordersDaiFuKuanCountList = [];
|
||
$ordersYiZhiFuCountList = [];
|
||
$ordersYiTuiKuanLunCountList = [];
|
||
$dateList = [];
|
||
|
||
// 日期处理
|
||
$currentDate = strtotime($startTime);
|
||
$endDate = strtotime($endTime);
|
||
|
||
// 循环遍历日期范围
|
||
while ($currentDate <= $endDate) {
|
||
$date = date('Y-m-d', $currentDate);
|
||
|
||
// 总订单数
|
||
$ordersCount = \app\admin\model\Order::selectOrdersCountStatisticsByYear(1, $date, null);
|
||
$ordersCountList[] = $ordersCount;
|
||
|
||
// 0待支付
|
||
$ordersDaiFuKuanCount = \app\admin\model\Order::selectOrdersCountStatisticsByYear(1, $date, 0);
|
||
$ordersDaiFuKuanCountList[] = $ordersDaiFuKuanCount;
|
||
|
||
// 1已支付
|
||
$ordersJinXinCount = \app\admin\model\Order::selectOrdersCountStatisticsByYear(1, $date, 1);
|
||
$ordersYiZhiFuCountList[] = $ordersJinXinCount;
|
||
|
||
// 2已退款
|
||
$ordersQuXiaoCount = \app\admin\model\Order::selectOrdersCountStatisticsByYear(1, $date, 2);
|
||
$ordersYiTuiKuanLunCountList[] = $ordersQuXiaoCount;
|
||
|
||
// 记录日期
|
||
$dateList[] = $date;
|
||
|
||
// 日期加1天
|
||
$currentDate = strtotime('+1 day', $currentDate);
|
||
}
|
||
$result = [
|
||
'ordersCountList' => $ordersCountList,
|
||
'ordersDaiFuKuanCountList' => $ordersDaiFuKuanCountList,
|
||
'ordersYiZhiFuCountList' => $ordersYiZhiFuCountList,
|
||
'ordersYiTuiKuanLunCountList' => $ordersYiTuiKuanLunCountList,
|
||
'year' => $dateList
|
||
];
|
||
$this->n_success(['data' => $result]);
|
||
}
|
||
|
||
// 统计分销金币
|
||
public function selectFenXiaoMoney()
|
||
{
|
||
$get = $this->request->get();
|
||
$admin = $this->auth->getAdmin();
|
||
$sysUserId = $admin['user_id'];
|
||
$flag = $get['flag'];
|
||
$time = $get['time'];
|
||
|
||
// 1. 分别查询一级、二级和渠道分销金额
|
||
$oneMoney = \app\admin\model\Order::selectFenXiaoMoney(1, $sysUserId, $flag, $time);
|
||
$twoMoney = \app\admin\model\Order::selectFenXiaoMoney(2, $sysUserId, $flag, $time);
|
||
$qdMoney = \app\admin\model\Order::selectFenXiaoMoney(3, $sysUserId, $flag, $time);
|
||
|
||
// 2. 计算总分销金额(使用BCMath确保精度)
|
||
$sumMoney = bcadd(
|
||
bcadd($oneMoney, $twoMoney, 2), // 一级 + 二级
|
||
$qdMoney, // + 渠道
|
||
2 // 精度保留两位小数
|
||
);
|
||
|
||
$result = [
|
||
'oneMoney' => $oneMoney,
|
||
'twoMoney' => $twoMoney,
|
||
'qdMoney' => $qdMoney,
|
||
'sumMoney' => $sumMoney
|
||
];
|
||
$this->n_success(['data' => $result]);
|
||
}
|
||
|
||
// 订单统计
|
||
public function selectOrdersCount()
|
||
{
|
||
$get = $this->request->get();
|
||
$admin = $this->auth->getAdmin();
|
||
$sysUserId = $admin['user_id'];
|
||
$flag = $get['flag'];
|
||
$time = $get['time'];
|
||
|
||
// 1. 短剧订单统计(数量)
|
||
$sumCourseOrdersCount = \app\admin\model\Order::selectOrdersCount(null, 1, $flag, $time, $sysUserId);
|
||
$daiCourseKeOrdersCount = \app\admin\model\Order::selectOrdersCount(0, 1, $flag, $time, $sysUserId);
|
||
$wanCourseKeOrdersCount = \app\admin\model\Order::selectOrdersCount(1, 1, $flag, $time, $sysUserId);
|
||
$tuiCourseOrdersCount = \app\admin\model\Order::selectOrdersCount(2, 1, $flag, $time, $sysUserId);
|
||
|
||
// 2. 短剧订单统计(金额)
|
||
$sumCourseOrdersMoney = \app\admin\model\Order::selectOrdersMoney(null, 1, $flag, $time, null, $sysUserId);
|
||
$daiCourseOrdersMoney = \app\admin\model\Order::selectOrdersMoney(0, 1, $flag, $time, null, $sysUserId);
|
||
$wanCourseOrdersMoney = \app\admin\model\Order::selectOrdersMoney(1, 1, $flag, $time, null, $sysUserId);
|
||
$tuiCourseOrdersMoney = \app\admin\model\Order::selectOrdersMoney(2, 1, $flag, $time, null, $sysUserId);
|
||
|
||
// 3. 会员订单统计(数量)
|
||
$sumMemberOrdersCount = \app\admin\model\Order::selectOrdersCount(null, 2, $flag, $time, $sysUserId);
|
||
$daiMemberKeOrdersCount = \app\admin\model\Order::selectOrdersCount(0, 2, $flag, $time, $sysUserId);
|
||
$wanMemberKeOrdersCount = \app\admin\model\Order::selectOrdersCount(1, 2, $flag, $time, $sysUserId);
|
||
$tuiMemberOrdersCount = \app\admin\model\Order::selectOrdersCount(2, 2, $flag, $time, $sysUserId);
|
||
|
||
// 4. 会员订单统计(金额)
|
||
$sumMemberOrdersMoney = \app\admin\model\Order::selectOrdersMoney(null, 2, $flag, $time, null, $sysUserId);
|
||
$daiMemberOrdersMoney = \app\admin\model\Order::selectOrdersMoney(0, 2, $flag, $time, null, $sysUserId);
|
||
$wanMemberOrdersMoney = \app\admin\model\Order::selectOrdersMoney(1, 2, $flag, $time, null, $sysUserId);
|
||
$tuiMemberOrdersMoney = \app\admin\model\Order::selectOrdersMoney(2, 2, $flag, $time, null, $sysUserId);
|
||
|
||
// 5. 提现统计
|
||
$timestamp = strtotime($time); // 将日期字符串转为时间戳
|
||
$beginOfDay = date('Y-m-d 00:00:00', $timestamp); // 当天开始时间
|
||
$endOfDay = date('Y-m-d 23:59:59', $timestamp); // 当天结束时间
|
||
|
||
$cashCount = DatabaseRoute::getAllDbData('cash_out', function ($query) use($sysUserId, $beginOfDay) {
|
||
if (!is_null($sysUserId)) {
|
||
$query->where(['sys_user_id' => $sysUserId]);
|
||
}
|
||
$query->where('state', 1)->where('create_at', '>', $beginOfDay);
|
||
return $query;
|
||
})->count();
|
||
|
||
|
||
$cashSum = DatabaseRoute::getAllDbData('cash_out', function ($query) use($sysUserId, $beginOfDay, $endOfDay) {
|
||
if (!is_null($sysUserId)) {
|
||
$query->where(['sys_user_id' => $sysUserId]);
|
||
}
|
||
$query->whereBetween('create_at', [$beginOfDay, $endOfDay]);
|
||
return $query;
|
||
})->sum('money') ?? 0;
|
||
|
||
|
||
|
||
$cashSum = number_format($cashSum, 2, '.', ''); // 保留两位小数
|
||
|
||
// 6. 奖励金额统计
|
||
$signInAwardMoney = \app\admin\model\Order::selectSignInAwardMoney($flag, $time, $sysUserId);
|
||
$shareAwardMoney = \app\admin\model\Order::selectShareAwardMoney($flag, $time, $sysUserId);
|
||
$newUserTaskDoneAwardMoney = \app\admin\model\Order::selectNewUserTaskDoneAwardMoney($flag, $time, $sysUserId);
|
||
$inviteTaskDoneAwardMoney = \app\admin\model\Order::selectInviteTaskDoneAwardMoney($flag, $time, $sysUserId);
|
||
|
||
// 7. 组装结果
|
||
$result = [
|
||
// 短剧订单数量
|
||
'sumCourseOrdersCount' => $sumCourseOrdersCount ?? 0,
|
||
'daiCourseKeOrdersCount' => $daiCourseKeOrdersCount ?? 0,
|
||
'wanCourseKeOrdersCount' => $wanCourseKeOrdersCount ?? 0,
|
||
'tuiCourseOrdersCount' => $tuiCourseOrdersCount ?? 0,
|
||
// 短剧订单金额
|
||
'sumCourseOrdersMoney' => $sumCourseOrdersMoney ?? 0.00,
|
||
'daiCourseOrdersMoney' => $daiCourseOrdersMoney ?? 0.00,
|
||
'wanCourseOrdersMoney' => $wanCourseOrdersMoney ?? 0.00,
|
||
'tuiCourseOrdersMoney' => $tuiCourseOrdersMoney ?? 0.00,
|
||
// 会员订单数量
|
||
'sumMemberOrdersCount' => $sumMemberOrdersCount ?? 0,
|
||
'daiMemberKeOrdersCount' => $daiMemberKeOrdersCount ?? 0,
|
||
'wanMemberKeOrdersCount' => $wanMemberKeOrdersCount ?? 0,
|
||
'tuiMemberOrdersCount' => $tuiMemberOrdersCount ?? 0,
|
||
// 会员订单金额
|
||
'sumMemberOrdersMoney' => $sumMemberOrdersMoney ?? 0.00,
|
||
'daiMemberOrdersMoney' => $daiMemberOrdersMoney ?? 0.00,
|
||
'wanMemberOrdersMoney' => $wanMemberOrdersMoney ?? 0.00,
|
||
'tuiMemberOrdersMoney' => $tuiMemberOrdersMoney ?? 0.00,
|
||
// 提现数据
|
||
'cashCount' => $cashCount ?? 0,
|
||
'cashSum' => $cashSum,
|
||
// 奖励金额
|
||
'signInAwardMoney' => $signInAwardMoney ?? 0.00,
|
||
'shareAwardMoney' => $shareAwardMoney ?? 0.00,
|
||
'newUserTaskDoneAwardMoney' => $newUserTaskDoneAwardMoney ?? 0.00,
|
||
'inviteTaskDoneAwardMoney' => $inviteTaskDoneAwardMoney ?? 0.00,
|
||
];
|
||
|
||
$this->n_success(['data' => $result]);
|
||
}
|
||
|
||
public function queryByTradeNo()
|
||
{
|
||
$get = $this->request->get();
|
||
if (empty($get['outTradeNo'])) {
|
||
$this->error('参数不能为空');
|
||
}
|
||
$outTradeNo = $get['outTradeNo'];
|
||
$tradeNo = null;
|
||
$userId = null;
|
||
try {
|
||
// 解析外部交易号(提现回调格式:xxx-xxx:xxx)
|
||
if (strpos($outTradeNo, '-') !== false && strpos($outTradeNo, ':') !== false) {
|
||
$parts = explode('-', $outTradeNo);
|
||
$tradeNo = $parts[0];
|
||
$userIdPart = explode(':', $parts[1])[0];
|
||
$userId = (int)$userIdPart;
|
||
}
|
||
// 解析支付回调格式(xxx-xxx)
|
||
elseif (strpos($outTradeNo, '-') !== false) {
|
||
$parts = explode('-', $outTradeNo);
|
||
$tradeNo = $parts[0];
|
||
$userId = (int)$parts[1];
|
||
}
|
||
} catch (\Exception $e) {
|
||
$this->error("交易订单号不合法");
|
||
}
|
||
|
||
// 验证解析结果
|
||
if (empty($tradeNo) || $userId === null) {
|
||
$this->error("交易订单号不合法");
|
||
}
|
||
|
||
// 初始化汇总数据
|
||
$data = [];
|
||
|
||
// 查询用户基本信息
|
||
$user = TbUser::selectUserById($userId);
|
||
$data['user_info'] = $user ?: [];
|
||
|
||
// 查询用户实名认证信息
|
||
$realNameAuth = \app\api\model\UserInfo::getByUserIdOrSave($userId);
|
||
$data['auth_info'] = $realNameAuth ?: [];
|
||
|
||
// 初始化提现统计(success:成功, fail:失败, auditing:审核中, other:其他)
|
||
$withdrawTotal = [
|
||
'success' => ['total' => 0.00, 'count' => 0],
|
||
'fail' => ['total' => 0.00, 'count' => 0],
|
||
'auditing' => ['total' => 0.00, 'count' => 0],
|
||
'other' => ['total' => 0.00, 'count' => 0],
|
||
];
|
||
|
||
// 初始化支付统计(success:成功, fail:失败, unpaid:未支付)
|
||
$payTotal = [
|
||
'success' => ['total' => 0.00, 'count' => 0],
|
||
'fail' => ['total' => 0.00, 'count' => 0],
|
||
'unpaid' => ['total' => 0.00, 'count' => 0],
|
||
];
|
||
|
||
|
||
// 查询提现记录并统计
|
||
$cashOutList = DatabaseRoute::getDb('cash_out', $userId)->select()->toArray();
|
||
if (!empty($cashOutList)) {
|
||
// 按状态分组统计总金额和数量
|
||
$cashOutSum = []; // 金额统计:[状态 => 总金额]
|
||
$cashOutCount = []; // 数量统计:[状态 => 总条数]
|
||
|
||
foreach ($cashOutList as $cash) {
|
||
$state = $cash['state'];
|
||
$money = (float)$cash['money'];
|
||
|
||
// 累加金额
|
||
if (!isset($cashOutSum[$state])) {
|
||
$cashOutSum[$state] = 0.00;
|
||
}
|
||
$cashOutSum[$state] += $money;
|
||
|
||
// 累加数量
|
||
if (!isset($cashOutCount[$state])) {
|
||
$cashOutCount[$state] = 0;
|
||
}
|
||
$cashOutCount[$state]++;
|
||
}
|
||
|
||
// 更新成功/失败/审核中状态的统计
|
||
$withdrawTotal['success'] = [
|
||
'total' => $cashOutSum[1] ?? 0.00,
|
||
'count' => $cashOutCount[1] ?? 0
|
||
];
|
||
$withdrawTotal['fail'] = [
|
||
'total' => $cashOutSum[2] ?? 0.00,
|
||
'count' => $cashOutCount[2] ?? 0
|
||
];
|
||
$withdrawTotal['auditing'] = [
|
||
'total' => $cashOutSum[3] ?? 0.00,
|
||
'count' => $cashOutCount[3] ?? 0
|
||
];
|
||
|
||
// 统计其他状态(排除1/2/3)
|
||
$otherStates = [1, 2, 3];
|
||
$otherMoney = 0.00;
|
||
$otherCount = 0;
|
||
foreach ($cashOutList as $cash) {
|
||
if (!in_array($cash['state'], $otherStates)) {
|
||
$otherMoney += (float)$cash['money'];
|
||
$otherCount++;
|
||
}
|
||
}
|
||
$withdrawTotal['other'] = [
|
||
'total' => $otherMoney,
|
||
'count' => $otherCount
|
||
];
|
||
}
|
||
$data['withdraw_total'] = $withdrawTotal;
|
||
|
||
// 查询支付记录并统计
|
||
$payDetailsList = DatabaseRoute::getDb('pay_details', $userId)->select()->toArray();
|
||
if (!empty($payDetailsList)) {
|
||
// 按状态分组统计总金额和数量
|
||
$paySum = []; // 金额统计:[状态 => 总金额]
|
||
$payCount = []; // 数量统计:[状态 => 总条数]
|
||
|
||
foreach ($payDetailsList as $pay) {
|
||
$state = $pay['state'];
|
||
$money = (float)$pay['money'];
|
||
|
||
// 累加金额
|
||
if (!isset($paySum[$state])) {
|
||
$paySum[$state] = 0.00;
|
||
}
|
||
$paySum[$state] += $money;
|
||
|
||
// 累加数量
|
||
if (!isset($payCount[$state])) {
|
||
$payCount[$state] = 0;
|
||
}
|
||
$payCount[$state]++;
|
||
}
|
||
|
||
// 更新支付统计(1:成功, 2:失败, 0:未支付)
|
||
$payTotal['success'] = [
|
||
'total' => $paySum[1] ?? 0.00,
|
||
'count' => $payCount[1] ?? 0
|
||
];
|
||
$payTotal['fail'] = [
|
||
'total' => $paySum[2] ?? 0.00,
|
||
'count' => $payCount[2] ?? 0
|
||
];
|
||
$payTotal['unpaid'] = [
|
||
'total' => $paySum[0] ?? 0.00,
|
||
'count' => $payCount[0] ?? 0
|
||
];
|
||
}
|
||
$data['pay_total'] = $payTotal;
|
||
$this->n_success(['data' => $data]);
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
} |