belongsTo(UserGroup::class, 'group_id'); } /** * 重置用户密码 * @param int|string $uid 用户ID * @param string $newPassword 新密码 * @return int|User */ public function resetPassword(int|string $uid, string $newPassword): int|User { return $this->where(['id' => $uid])->update(['password' => hash_password($newPassword), 'salt' => '']); } public static function queryCourseOrder($page, $limit, $type, $date, $sysUserId):array { // 1. 处理时间范围 $timestamp = strtotime($date); if ($type == 2) { // 按月统计 $startTime = date('Y-m-01 00:00:00', $timestamp); $endTime = date('Y-m-t 23:59:59', $timestamp); } elseif ($type == 3) { // 按年统计 $startTime = date('Y-01-01 00:00:00', $timestamp); $endTime = date('Y-12-31 23:59:59', $timestamp); } else { // 按日统计 $startTime = date('Y-m-d 00:00:00', $timestamp); $endTime = date('Y-m-d 23:59:59', $timestamp); } // 2. 查询课程订单统计数据(带分页) $courseList = self::selectGroupCourseId($startTime, $endTime, $page, $limit); // 3. 提取课程ID集合 $courseIds = array_column($courseList['list'], 'orders_id'); // 4. 批量查询课程信息并构建映射 if (!empty($courseIds)) { $courseMap = []; $db = Db::connect(get_slave_connect_name()); $courses = $db->name('course') ->whereIn('course_id', $courseIds) ->field('course_id, title') ->select() ->toArray(); // 构建ID到课程的映射 foreach ($courses as $course) { $courseMap[$course['course_id']] = $course; } // 5. 关联课程名称到订单统计数据 foreach ($courseList['list'] as &$item) { if (isset($courseMap[$item['orders_id']])) { $item['coursename'] = $courseMap[$item['orders_id']]['title']; } } unset($item); // 释放引用 $courseList['list'] = convertToCamelCase($courseList['list']); } return $courseList; } public static function selectGroupCourseId($startTime, $endTime, $page, $limit) { return DatabaseRoute::paginateAllDb('orders', function($query) use($startTime, $endTime) { return $query->alias('o') ->field([ 'sum(o.pay_money) as coursemoney', 'count(*) as coursenum', 'o.course_id as courseId' ]) ->where('o.status', 1) ->where('o.orders_type', 1) ->whereBetween('o.create_time', [$startTime, $endTime]) ->group('o.course_id'); }, $page, $limit, 'coursenum'); } public static function queryUserCount($type, $date, $platform, $qdCode) { // 检查日期是否为空 if (empty($date)) { // 格式化当前时间(注意:PHP时间格式符与Java略有不同) $date = date('Y-m-d H:i:s'); } return DatabaseRoute::getAllDbData('tb_user', function($query) use($type, $date, $platform, $qdCode) { // 处理时间条件 $dateTime = strtotime($date); if ($dateTime === false) { throw new \InvalidArgumentException("无效的日期格式:{$date}"); } switch ($type) { case 1: // 按日统计(精确到天) $startDate = date('Y-m-d 00:00:00', $dateTime); $endDate = date('Y-m-d 23:59:59', $dateTime); $query->whereBetweenTime('create_time', $startDate, $endDate); break; case 2: // 按月统计 $startDate = date('Y-m-01 00:00:00', $dateTime); $endDate = date('Y-m-t 23:59:59', $dateTime); $query->whereBetweenTime('create_time', $startDate, $endDate); break; case 3: // 按年统计 $startDate = date('Y-01-01 00:00:00', $dateTime); $endDate = date('Y-12-31 23:59:59', $dateTime); $query->whereBetweenTime('create_time', $startDate, $endDate); break; default: // 无效类型,不添加时间条件 break; } // 处理平台条件 if (!is_null($platform)) { $query->where('platform', $platform); } // 处理渠道码条件 if (!is_null($qdCode)) { $query->where('qd_code', $qdCode); } return $query; })->count(); } public static function queryPayMoney($type, $qdCode) { $date = date('Y-m-d H:i:s'); $result = DatabaseRoute::getAllDbData('pay_details', function($query) use($type, $date, $qdCode) { $query->alias('p') ->leftJoin('tb_user u', 'u.user_id = p.user_id') ->where('p.state', 1) // 支付状态为1(成功) ->field('sum(p.money) as total_money'); // 聚合计算总金额 // 根据类型添加时间条件(匹配date_format的逻辑) switch ($type) { case 1: // 按日:日期部分完全匹配 $query->whereRaw("date_format(p.create_time, '%Y-%m-%d') = date_format(?, '%Y-%m-%d')", [$date]); break; case 2: // 按月:年月部分匹配 $query->whereRaw("date_format(p.create_time, '%Y-%m') = date_format(?, '%Y-%m')", [$date]); break; case 3: // 按年:年份部分匹配 $query->whereRaw("date_format(p.create_time, '%Y') = date_format(?, '%Y')", [$date]); break; default: // 默认为空,可根据业务补充默认条件 break; } // 可选条件:渠道码 if (!empty($qdCode)) { $query->where('u.qd_code', $qdCode); } return $query; })->find(); return $result['total_money'] ?? 0.0; } public static function userMessage($date, $type, $qdCode, $vipType) { // 1. 处理时间条件 $timestamp = strtotime($date); if ($timestamp === false) { throw new \InvalidArgumentException("无效的日期格式:{$date}"); } if ($type == 1) { // 按日开始(00:00:00) $startTime = date('Y-m-d 00:00:00', $timestamp); } elseif ($type == 2) { // 按月开始(当月1日 00:00:00) $startTime = date('Y-m-01 00:00:00', $timestamp); } else { // 按年开始(当年1月1日 00:00:00) $startTime = date('Y-01-01 00:00:00', $timestamp); } $cachestr = 'userMessageUserIdList'; $userIds = Cache::get($cachestr); if(!$userIds) { if (!empty($qdCode)) { $userIds = DatabaseRoute::getAllDbData('tb_user', function($query) use($qdCode, $startTime) { $query->where('qd_code', $qdCode); // 2. 查询符合条件的用户ID集合 $query->where('create_time', '>=', $startTime) ->field('user_id'); return $query; })->column('user_id'); } // 3. 若用户ID集合为空,直接返回0 if (empty($userIds)) { return 0; } Cache::set($cachestr, json_encode($userIds)); }else { $userIds = json_decode($userIds, true); } $db = Db::connect(get_slave_connect_name()); // 4. 查询符合条件的VIP用户数量 $query = $db->name('user_vip'); if($userIds) { $query = $query->whereIn('user_id', $userIds); } $query = $query->where('is_vip', 2); if (!is_null($vipType)) { $query = $query->where('vip_type', $vipType); } return $query->count(); } /** * 查询今日支付和提现统计信息 * @return array 包含支付金额、支付次数、提现金额、提现次数的关联数组 */ public static function queryPayAndExtractInfo() { // 1. 计算今日开始和结束时间 $beginOfDay = date('Y-m-d 00:00:00'); // 今日0点 $endOfDay = date('Y-m-d 23:59:59'); // 今日23点59分59秒 // 2. 查询今日支付信息 $payInfo = self::queryPayInfo($beginOfDay, $endOfDay); // 3. 查询今日提现信息 $extractInfo = self::queryExtractInfo($beginOfDay, $endOfDay); // 4. 合并结果 return [ 'payAmount' => $payInfo['totalMoney'] ?? null, 'payCount' => $payInfo['totalCount'] ?? null, 'extractAmount' => $extractInfo['totalMoney'] ?? null, 'extractCount' => $extractInfo['totalCount'] ?? null ]; } /** * 查询指定时间范围内的支付信息 * @param string $begin 开始时间(格式:Y-m-d H:i:s) * @param string $end 结束时间(格式:Y-m-d H:i:s) * @return array 支付统计数据 */ private static function queryPayInfo($begin, $end) { return DatabaseRoute::getAllDbData('orders', function($query) use($begin, $end) { return $query->where('create_time', 'between', [$begin, $end]) ->where('status', 1) // 假设1表示支付成功 ->where('pay_way', 9) // 假设1表示支付成功 ->field([ 'SUM(pay_money) as totalMoney', // 总支付金额 'COUNT(1) as totalCount' // 支付次数 ]); })->find() ?: []; } /** * 查询指定时间范围内的提现信息 * @param string $begin 开始时间(格式:Y-m-d H:i:s) * @param string $end 结束时间(格式:Y-m-d H:i:s) * @return array 提现统计数据 */ private static function queryExtractInfo($begin, $end) { return DatabaseRoute::getAllDbData('cash_out', function($query) use($begin, $end) { return $query->where('create_at', 'between', [$begin, $end]) ->where('state', 1) ->field([ 'SUM(money) as totalMoney', // 总提现金额 'COUNT(1) as totalCount' // 提现次数 ]); })->find() ?: []; } public static function selectUserPage($page, $limit, $phone, $sex, $platform, $sysPhone, $status, $member, $inviterCode, $userName, $invitationCode, $startTime, $endTime, $qdCode, $sysUserName, $vipType, $delegate) { $result = DatabaseRoute::paginateAllDb('tb_user', function ($query) use($page, $limit, $phone, $sex, $platform, $sysPhone, $status, $member, $inviterCode, $userName, $invitationCode, $startTime, $endTime, $qdCode, $sysUserName, $vipType, $delegate) { // 初始化查询 $query->alias('u') // 左连接sys_user表(别名s) ->leftJoin('sys_user s', 's.qd_code = u.qd_code') // 左连接user_money表(别名m) ->leftJoin('user_money m', 'm.user_id = u.user_id') // 固定条件:s.sys_user_id is null ->where('s.sys_user_id', null) // 字段选择(与原SQL一致) ->field([ 'u.*', '1 as member', 's.username as sysUserName', 'm.cash_count as cashCount', 'm.cash_amount as cashAmount', 'm.amount as balance' ]); // 搜索条件(user_id/phone/user_name匹配) if (!is_null($phone) && $phone !== '') { $query->where(function ($query) use ($phone) { $query->where('u.user_id', $phone) ->whereOr('u.phone', $phone) ->whereOr('u.user_name', $phone); }); } // 系统用户名模糊查询 if (!is_null($sysUserName) && $sysUserName !== '') { $query->where('s.username', 'like', "%{$sysUserName}%"); } // 用户名模糊查询 if (!is_null($userName) && $userName !== '') { $query->where('u.user_name', 'like', "%{$userName}%"); } // 性别筛选(非0值) if (!is_null($sex) && $sex != 0) { $query->where('u.sex', $sex); } // 平台筛选 if (!is_null($platform) && $platform !== '') { $query->where('u.platform', $platform); } // 系统手机号筛选 if (!is_null($sysPhone) && $sysPhone !== '') { $query->where('u.sys_phone', $sysPhone); } // 邀请人编码模糊查询 if (!is_null($inviterCode) && $inviterCode !== '') { $query->where('u.inviter_code', 'like', "%{$inviterCode}%"); } // 邀请码模糊查询 if (!is_null($invitationCode) && $invitationCode !== '') { $query->where('u.invitation_code', 'like', "%{$invitationCode}%"); } // 渠道码精确匹配 if (!is_null($qdCode) && $qdCode !== '') { $query->where('u.qd_code', $qdCode); } // 时间范围筛选 if (!is_null($startTime) && $startTime !== '' && !is_null($endTime) && $endTime !== '') { // 开始时间和结束时间都存在 $query->whereBetween('u.create_time', [$startTime, $endTime]); } elseif (!is_null($startTime) && $startTime !== '') { // 仅开始时间 $query->where('u.create_time', '>=', $startTime); } elseif (!is_null($endTime) && $endTime !== '') { // 仅结束时间 $query->where('u.create_time', '<=', $endTime); } // 邀请人数筛选(delegate) if (!is_null($delegate)) { if ($delegate == 0) { // 邀请人数=0 $query->where('u.invite_count', 0); } elseif ($delegate == 1) { // 邀请人数>0 $query->where('u.invite_count', '>', 0); } } return $query; }, $page, $limit, 'u.create_time'); return $result; } public static function upUserBlack($user, $status, $db) { $userId = $user['user_id']; // 获取用户ID if ($status == 0) { // 拉黑操作:设置状态为0并更新 $db->name('tb_user')->where(['user_id' => $userId])->update(['status' => 0]); return true; } // 解除拉黑操作:设置状态为1,平台为h5并更新 $db->name('tb_user')->where(['user_id' => $userId])->update(['status' => 1, 'platform' => 'h5']); // 查询用户信息(身份证号) $userInfo = $db->name('user_info')->where('user_id', $userId)->find(); // 若存在身份证号,则删除黑名单记录 if (!is_null($userInfo) && !empty($userInfo['cert_no'])) { Db::connect(get_master_connect_name())->name('tb_user_blacklist') ->where('id_card_no', $userInfo['cert_no']) ->delete(); } return true; } public static function selectInviteMoneyByUserId($user_id, $db) { return $db->name('invite_money')->where(['user_id' => $user_id])->find(); } public static function instantselectSumPay($date, $userId, $db) { $startTime = date('Y-m-01 00:00:00', strtotime($date)); $endTime = date('Y-m-t 23:59:59', strtotime($date)); $sumMoney = $db->name('pay_details') ->where('create_time', '>', $startTime) // 创建时间大于开始时间 ->where('create_time', '<', $endTime) // 创建时间小于结束时间 ->where('state', 1) // 支付状态为1(成功) ->where('user_id', $userId) // 指定用户ID ->sum('money'); // 计算金额总和 return $sumMoney !== null ? (float)$sumMoney : 0.00; } public static function monthIncome($date, $userId, $db) { // 构建查询 $sumMoney = $db->name('user_money_details') ->where('user_id', $userId) // 固定条件:用户ID匹配 ->where('classify', 4) // 固定条件:分类为4 ->where('type', 2) // 固定条件:类型为2 ->where('state', 2) // 固定条件:状态为2 // 时间条件:当月匹配(与原SQL的date_format逻辑一致) ->whereRaw("date_format(create_time, '%Y-%m') = date_format(?, '%Y-%m')", [$date]) ->sum('money'); // 计算金额总和 // 处理空值并保留两位小数 return $sumMoney !== null ? number_format($sumMoney, 2) : '0.00'; } public static function queryInviterCount($inviterCode) { return DatabaseRoute::getAllDbData('tb_user', function($query) use($inviterCode) { return $query->where('inviter_code', $inviterCode); })->count(); } public static function selectUserVipByUserId($userId) { return Db::connect(get_slave_connect_name())->name('user_vip')->where(['user_id' => $userId])->find(); } public static function selectUserMoneyByUserId($userId) { $db_name = DatabaseRoute::getConnection('user_money', ['user_id' => $userId]); $db = Db::connect($db_name); // 查询用户钱包信息 $userMoney = $db->name('user_money')->where('user_id', $userId)->find(); // 若不存在,则创建新记录 if (is_null($userMoney)) { $db_name = DatabaseRoute::getConnection('user_money', ['user_id' => $userId], true); $userMoney = [ 'user_id' => $userId, 'money' => 0.00, 'amount' => 0.00, ]; Db::connect($db_name)->name('user_money')->insert($userMoney); } return $userMoney; } public static function userListExcel($startTime, $endTime, $page = 1, $limit = 20, $userEntity = []) { $list = DatabaseRoute::getAllDbData('tb_user', function ($query) use ($startTime, $endTime, $page, $limit, $userEntity) { $query->alias('u'); // 处理 phone 条件 if (!empty($userEntity['phone'])) { $query->where('u.phone', 'like', "%{$userEntity['phone']}%"); } // 处理 userName 条件 if (!empty($userEntity['userName'])) { $query->where('u.user_name', 'like', "%{$userEntity['userName']}%"); } // 处理 invitationCode 条件 if (!empty($userEntity['invitationCode'])) { $query->where('u.invitation_code', 'like', "%{$userEntity['invitationCode']}%"); } // 处理 inviterCode 条件 if (!empty($userEntity['inviterCode'])) { $query->where('u.inviter_code', 'like', "%{$userEntity['inviterCode']}%"); } // 处理 platform 条件 if (!empty($userEntity['platform'])) { $query->where('u.platform', $userEntity['platform']); } // 处理时间范围条件 if (!empty($startTime) && !empty($endTime)) { $query->whereTime('u.create_time', 'between', [$startTime, $endTime]); } elseif (!empty($startTime)) { $query->whereTime('u.create_time', '>=', $startTime); } elseif (!empty($endTime)) { $query->whereTime('u.create_time', '<=', $endTime); } if (!empty($page) && !empty($limit)) { $query->limit(page($page, $limit), $limit); } return $query; })->select()->toArray(); $export = new \alei\Export('用户列表'); $export->setColumn([ ['field' => 'user_id', 'title' => '用户ID'], ['field' => 'user_name', 'title' => '用户名'], //格式化时间,时间戳格式化为时间日期格式,默认格式: “Y-m-d H:i:s” ['field' => 'phone', 'title' => '手机号'], ['field' => 'sys_phone', 'title' => '手机类型 1安卓 2ios'], ['field' => 'jifen', 'title' => '积分'], ['field' => 'invitation_code', 'title' => '邀请码'], ['field' => 'inviter_code', 'title' => '邀请人邀请码'], ['field' => 'zhi_fu_bao_name', 'title' => '支付宝名称'], ['field' => 'zhi_fu_bao', 'title' => '支付宝账号'], ['field' => 'cert_name', 'title' => '姓名'], ['field' => 'cert_no', 'title' => '身份证号码'], ['field' => 'create_time', 'title' => '创建时间'], ]); //设置数据 $export->setData($list); //生成表格,返回url $url = $export->build(); //'export/文章.xlsx' return ['data' => config('buildadmin.run_api_url') . $url]; } }