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