webman_duanju/app/admin/controller/Order.php

498 lines
19 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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