where([ // 'user_id' => $userId // ])->find(); if (empty($userInfo['qd_code'])) { return; } $sysUser = DatabaseRoute::getMasterDb('sys_user')->where([ 'qd_code' => $userInfo['qd_code'] ])->find(); if (!$sysUser) { return; } $order['sys_user_id'] = $sysUser['user_id']; } /** * 加入短剧到我的列表 * @param $order array 订单 */ public static function insertOrders($order) { // 短剧订单 if ($order['orders_type'] == 1) { // 单集购买 if (!empty($order['course_details_ids'])) { $insertDataIst = []; $courseDetailList = json_decode($order['course_details_ids'], true); foreach ($courseDetailList as $courseDetailId) { $insertDataIst[] = [ 'course_id' => $order['course_id'], 'course_details_id' => $courseDetailId, 'classify' => 2, 'user_id' => $order['user_id'], 'order_id' => $order['orders_id'], 'create_time' => getNormalDate() ]; } DatabaseRoute::getDb('course_user', $order['user_id'], true)->insertAll()($insertDataIst); Log::info("添加短剧到我的列表成功: " . json_encode($insertDataIst)); }else{ DatabaseRoute::getDb('course_user', $order['user_id'], true)->insert([ 'course_id' => $order['course_id'], 'course_details_id' => $order['course_details_id'], 'classify' => $order['course_details_id'] ? 2 : 1, 'user_id' => $order['user_id'], 'order_id' => $order['orders_id'], 'create_time' => getNormalDate() ]); } // 会员订单 }else{ $dateFormat = 'Y-m-d H:i:s'; // 查询用户是否是会员 $userVip = DatabaseRoute::getDb('user_vip', $order['user_id'])->where([ 'user_id' => $order['user_id'] ])->find(); $cal = new DateTime(); if ($userVip) { //未到期 // 判断会员是否未到期(isVip == 2) if ($userVip['isVip'] == 2) { // 设置会员到期时间 $endTime = new DateTime($userVip['endTime']); $cal->setTimestamp($endTime->getTimestamp()); // 当前时间 self::setDateByType($cal, $order['vip_name_type']); } else { // 到期会员续费 $cal->setTimestamp(time()); // 当前时间 self::setDateByType($cal, $order['vip_name_type']); } $userVip['is_vip'] = 2; $userVip['create_time'] = getNormalDate(); $userVip['end_time'] = $cal->format($dateFormat); $userVip['vip_type'] = 2; DatabaseRoute::getDb('user_vip', $order['user_id'], true)->where([ 'user_id' => $order['user_id'] ])->update($userVip); Log::info("会员续费成功: " . json_encode($userVip)); }else{ $cal->setTimestamp(time()); // 当前时间 self::setDateByType($cal, $order['vip_name_type']); // 开通会员 DatabaseRoute::getDb('user_vip', $order['user_id'], true)->insert([ 'user_id' => $order['user_id'], 'create_time' => getNormalDate(), 'is_vip' => 2, 'end_time' => $cal->format($dateFormat) ]); Log::info("会员续费成功: " . json_encode($userVip)); } } } private static function setDateByType(DateTime $cal, $type) { switch ($type) { case 0: $cal->modify('+1 month'); break; case 1: $cal->modify('+3 months'); break; case 2: $cal->modify('+1 year'); break; } } public static function updateOrderStatus($payDetail, $order, $userId) { if ($payDetail['state'] == 1) { return; } $userInfo = DatabaseRoute::getDb('tb_user', $userId, true)->find(); self::fillSysUserId($order, $userInfo); DatabaseRoute::getDb('pay_details', $userId, true)->where([ 'id' => $payDetail['id'] ])->update([ 'state' => 1, 'pay_time' => getNormalDate(), 'trade_no' => $payDetail['trade_no'], 'third_order_no' => $payDetail['third_order_no'], ]); DatabaseRoute::getDb('orders', $userId, true)->where([ 'orders_id' => $order['orders_id'] ])->update([ 'pay_way' => 9, 'status' => 1, 'pay_time' => getNormalDate(), 'sys_user_id' => $order['sys_user_id'] ]); // 短剧插入 self::insertOrders($order); // 用户信息及上级信息 $userInfo = DatabaseRoute::getDb('tb_user', $order['user_id'])->where([ 'user_id' => $order['user_id'] ])->find(); $byUser = TbUser::getByUserIdOrInviterCode($userInfo['inviter_user_id'], $userInfo['inviter_code']); // 记录上级用户奖励信息 Log::info("上级用户: ".json_encode($byUser)); if ($byUser) { $inviteAchievement = DatabaseRoute::getAllDbData('invite_achievement', function ($query) use ($byUser, $userInfo) { return $query->where([ 'target_user_id' => $userInfo['user_id'] ]); })->find(); if ($inviteAchievement) { Log::info("修改邀请统计"); DatabaseRoute::getDb('invite_achievement', $byUser['user_id'], true)->where([ 'user_id' => $inviteAchievement['user_id'], 'id' => $inviteAchievement['id'] ])->update([ 'count' => $inviteAchievement['count'] + 1, 'update_time' => getNormalDate() ]); }else{ Log::info("新增邀请统计"); DatabaseRoute::getDb('invite_achievement', $byUser['user_id'], true)->insert([ 'state' => 0, 'count' => 1, 'create_time' => getNormalDate(), 'target_user_id' => $userInfo['user_id'], 'user_id' => $byUser['user_id'] ]); } pushQueue(ActivitiesQueue::class, [ 'userInfo' => $userInfo, 'sourceUser' => $byUser ], 1); // DatabaseRoute::transactionXa(function () use ($userInfo, $byUser, $userId) { // self::activities($userInfo, $byUser); // }); } // 推广奖励发放 if ($userInfo['inviter_code'] || !$byUser || $byUser['user_id'] == 1) { $sysUser = SysUser::GetByQrcode($userInfo['qd_code']); if ($sysUser) { $rateMoney = $sysUser['qd_rate']; SysUser::updateSysMoney($sysUser['user_id'], $rateMoney, 1); DatabaseRoute::getDb('sys_user_money_details', $sysUser['user_id'], true)->insert([ 'sys_user_id' => $sysUser['user_id'], 'user_id' => $sysUser['user_id'], 'type' => 1, 'money' => $rateMoney, 'create_time' => getNormalDate(), 'state' => 2, 'classify' => 10, 'title' => "[渠道用户]用户名称:{$userInfo['user_name']}", 'money_type' => 1, 'content' => '总佣金'.$rateMoney.',到账佣金'.$rateMoney ]); } } // 增加剧集支付次数 self::incrWeekPayCount($order['course_id']); } public static function incrWeekPayCount($courseId) { RedisUtils::incrWeekCounter("setWeekPayCount:", $courseId); $count = RedisUtils::getWeekCounter("setWeekPayCount:", $courseId); DatabaseRoute::getMasterDb('course', true)->where([ 'course_id' => $courseId ])->update([ 'week_pay' => $count ]); } /** * 推广奖励 一级二级佣金 废弃 */ public static function updateInvite($userInfo, $userId, $price) { if ($userInfo['user_id'] == 1) { return []; } if ($userInfo && $userId && $price) { $invite = DatabaseRoute::getMasterDb('invite')->where([ 'user_id' => $userInfo['user_id'], 'invitee_user_id' => $userId ])->where(function ($query) { $query->where([ 'user_type' => 1 ])->whereOrNotNull('user_type'); })->find(); if (!$invite) { $invite = [ 'state' => 0, 'money' => 0, 'user_id' => $userInfo['user_id'], 'invitee_user_id' => $userId, 'create_time' => getNormalDate(), 'user_type' => 1, ]; DatabaseRoute::getMasterDb('invite', true)->insert($invite); } $sourceUser = TbUser::selectUserById($userId); // if (bccomp($userInfo['rate'], "0", 2) > 0) { // $rateMoney = $userInfo['rate']; // Db::name('invite')->where([ // 'id' => $invite['id'] // ])->update([ // 'user_type' => 1, // 'state' => 1, // 'money' => $invite['money'] + $rateMoney // ]); // // Invite::updateInviteMoneySum($userInfo['user_id'], $rateMoney); // // } } } public static function activities($user, $sourceUser) { Log::info("活动领取开始: 用户{$user['user_name']}, 上级{$sourceUser['user_name']}"); // 查询上级用户 $inviteAchievement = DatabaseRoute::getAllDbData('invite_achievement', function ($query) use ($user) { return $query->where([ 'target_user_id' => $user['user_id'] ]); })->find(); // 首次达标 $commonModel = (new CommonInfo()); $signCount = $commonModel->getByCodeToInt(913); Log::info("活动领取: 用户{$user['user_name']}, 上级{$sourceUser['user_name']}, 达标次数{$inviteAchievement['count']}"); // 首次达标发放奖励 if ($inviteAchievement['state'] == 0 && $inviteAchievement['count'] >= $signCount) { // if (true) { Log::info('开始领取达标奖励'); $amount = $commonModel->getByCode(912)['value']; // 记录资金明细 DatabaseRoute::getDb('user_money_details', $sourceUser['user_id'], true)->insert([ 'classify' => 6, 'money' => $amount, 'user_id' => $sourceUser['user_id'], 'create_time' => getNormalDate(), 'content' => "分享达标{$amount}元", 'title' => '分享达标奖励', 'state' => 2, 'type' => 1, 'money_type' => 1, ]); Invite::updateInviteMoneySum($sourceUser['user_id'], $amount); // 增加上级用户钱 if(DatabaseRoute::getDb('user_money', $sourceUser['user_id'])->count() == 0) { DatabaseRoute::getDb('user_money', $sourceUser['user_id'], true)->insert([ 'user_id' => $sourceUser['user_id'], 'money' => $amount, 'amount' => $amount ]); }else{ DatabaseRoute::getDb('user_money', $sourceUser['user_id'], true, true)->inc('amount', $amount)->inc('invite_income_money', $amount)->update(); } DatabaseRoute::getDb('invite_achievement', $inviteAchievement['user_id'], true, true)->update([ 'state' => 1 ]); // 代理发放佣金 if ($user['qd_code'] && $user['qd_code'] != "666666") { $sysUser = DatabaseRoute::getAllDbData('sys_user', function ($query) use ($user) { return $query->whereNull('sys_user_id')->where([ 'qd_code' => $user['qd_code'] ]); })->find(); if ($sysUser) { // 查询代理奖励金额 $qdAward = $commonModel->getByCode(915)['value']; if (bccomp($qdAward, "0", 2) > 0) { DatabaseRoute::getDb('sys_user_money_details', $sysUser['user_id'], true)->insert([ 'user_id' => $sysUser['user_id'], 'sys_user_id' => $sysUser['sys_user_id'], 'title' => '[分享达标额外奖励]', 'classify' => 6, 'type' =>1, 'state' => 2, 'money' => $qdAward, 'content' => '推广人员首次达标,额外奖励现金红包'.$qdAward, 'money_type' => 1, 'create_time' => getNormalDate() ]); DatabaseRoute::getMasterDb('sys_user_money', true)->where([ 'user_id' => $sysUser['user_id'] ])->inc('money', $qdAward)->inc('invite_income_money', $qdAward)->update(); } } } }else{ Log::info('未达标或已领取跳过领取'.json_encode($inviteAchievement)); } // 拉人奖励 self::calcUserInviteAmount($user, $sourceUser, $signCount); self::calcInviteStandardAward($user, $sourceUser); } /** * 计算用户邀请奖励金额 */ private static function calcUserInviteAmount($user, $sourceUser, $signCount) { // 检查实名 $user = DatabaseRoute::getDb('user_info', $sourceUser['user_id'])->find(); if (!$user || empty($user['cert_no'])) { Log::info("邀请用户{$sourceUser['user_name']}未实名认证, 不发放奖励"); return; } // 查询用户当天完成订单 $orderCount = DatabaseRoute::getDb('orders', $user['user_id'])->where([ 'status' => 1, 'pay_way' => 9, ['create_time', '>=', date('Y-m-d 00:00:00')], ])->count(); if ($orderCount < $signCount) { Log::info("用户{$sourceUser['user_name']}未完成{$signCount}个订单, 不发放奖励"); return; } // 查询当天是否已经给过上级奖励 $count = DatabaseRoute::getDb('user_money_details', $sourceUser['user_id'])->where([ 'classify' => 6, 'by_user_id' => $user['id'], ['create_time', '>=', date('Y-m-d 00:00:00')] ])->count(); if ($count > 0) { Log::info("上级用户奖励已发放,{$sourceUser['user_id']}"); return; } // 给上级用户达标奖励 if (empty($sourceUser['invite_amount'])) { DatabaseRoute::getDb('user_money', $sourceUser['user_id'], true, true)->update([ 'invite_amount' => '0.1' ]); } DatabaseRoute::getDb('user_money_details', $sourceUser['user_id'], true)->insert([ 'classify' => 6, 'money' => '0.1', 'user_id' => $sourceUser['user_id'], 'by_user_id' => $user['id'], 'create_time' => getNormalDate(), 'content' => '下级签到奖励0.1元', 'title' => '签到奖励', 'state' => 2, 'type' => 1, 'money_type' => 1, ]); // 发放奖励 DatabaseRoute::getDb('user_money', $sourceUser['user_id'], true, true)->inc('amount', 0.1)->update(); Log::info("用户: {$user['user_id']}, 上级: {$sourceUser['user_id']}, 签到奖励0.1元"); } /** * 计算分享达标奖励 */ private static function calcInviteStandardAward($userInfo, $sourceUser) { runWithLock("userAward".$sourceUser['user_id'], 500, function () use ($sourceUser, $userInfo) { // 查询邀请用户人数 $byUserIdList = DatabaseRoute::getDb('invite_achievement', $sourceUser['user_id'])->where([ 'state' => 1, ])->column('target_user_id'); // 去重(替代 array_unique) $uniqueMap = []; foreach ($byUserIdList as $id) { $uniqueMap[$id] = true; } $byUserIdList = array_keys($uniqueMap); if (empty($byUserIdList)) { return; } // 查询邀请用户的 cert_no,并排除自己,去重 $targetCertNo = $userInfo['cert_no'] ?? null; $collect = []; $chunkSize = 2000; // 每批处理1000条,视数据库配置可调高 foreach (array_chunk($byUserIdList, $chunkSize) as $chunk) { $partial = DatabaseRoute::getAllDbData('user_info', function ($builder) use ($chunk, $targetCertNo) { $builder = $builder->whereIn('user_id', $chunk)->whereNotNull('account_no'); if (!empty($targetCertNo)) { $builder = $builder->where('cert_no', '<>', $targetCertNo); } return $builder; })->column('cert_no'); // 合并本批结果 if (!empty($partial)) { $collect = array_merge($collect, $partial); } } // 去重(用更快方式) $collect = array_keys(array_flip($collect ?? [])); $inviteCount = count($collect); // 查询所有已开启的奖励 $completAward = DatabaseRoute::getMasterDb('complet_award', true)->where([ 'id' => 1 ])->find(); if (!$completAward) { Log::info("分享达标未配置"); return; } if ($inviteCount < $completAward['invite_count']) { return; } // 查询是否开启分享循环奖励 $isLoop = (new CommonInfo())->getByCodeToInt(932); $inviteAchievement = DatabaseRoute::getDb('invite_achievement', $sourceUser['inviter_user_id'])->where([ 'target_user_id' => $userInfo['user_id'] ])->find(); if (!$inviteAchievement) { $inviteAchievement = [ 'user_id' => $sourceUser['inviter_user_id'], 'target_user_id' => $sourceUser['user_id'], 'give_award_count' => 0 ]; $inviteAchievement['id'] = DatabaseRoute::getDb('invite_achievement', $sourceUser['user_id'], true)->insert($inviteAchievement); } $awardCount = $inviteAchievement['give_award_count']; // 如果未开启循环奖励,并且已经发放过奖励,则跳过 if ($isLoop != 1 && $awardCount > 0) { return; } // 计算获取奖励次数 邀请达标人员 / 邀请人数 $awardNum = intval($inviteCount / $completAward['invite_count']); if ($isLoop != 1) { $awardNum = 1; } if ($awardNum - $awardCount <= 0 ) { return; } for ($i = 0; $i < $awardNum - $awardCount; $i++) { switch ($completAward['type']) { case 1: DatabaseRoute::getDb('user_money_details', $sourceUser['user_id'], true)->insert([ 'user_id' => $sourceUser['user_id'], 'title' => '[分享达标额外奖励]', 'classify' => 6, 'type' => 1, 'state' => 2, 'money' => $completAward['award_number'], 'content' => "邀请人员已有{$completAward['invite_count']}人达标,额外奖励金币{$completAward['award_number']}", 'money_type' => 2, 'source_id' => $completAward['id'] ]); DatabaseRoute::getDb('user_money', $sourceUser['user_id'], true, true)->inc('money', $completAward['award_number'])->update(); break; case 2: DatabaseRoute::getDb('user_money_details', $sourceUser['user_id'], true)->insert([ 'user_id' => $sourceUser['user_id'], 'title' => '[分享达标额外奖励]', 'classify' => 6, 'type' => 1, 'state' => 2, 'money' => $completAward['award_number'], 'content' => "邀请人员已有{$completAward['invite_count']}人达标,额外奖励现金红包{$completAward['award_number']}", 'money_type' => 1, 'source_id' => $completAward['id'] ]); DatabaseRoute::getDb('user_money', $sourceUser['user_id'], true, true)->inc('amount', $completAward['award_number'])->update(); } //更新邀请达标奖励次数 DatabaseRoute::getDb('invite_achievement', $inviteAchievement['user_id'], true, true)->where([ 'id' => $inviteAchievement['id'], ])->update([ 'user_id' => $inviteAchievement['user_id'], 'give_award_count' => $inviteAchievement['give_award_count'] + ($awardNum - $awardCount) ]); } }); } public static function selectOrdersByDay(int $userId) { return DatabaseRoute::getDb('orders', $userId, false, false, false)->alias('o') ->leftJoin('disc_spinning_record r', 'o.orders_id = r.source_id') ->where('o.user_id', $userId) ->where('o.status', 1) ->where('o.pay_way', 9) ->whereraw('o.create_time > DATE_FORMAT(NOW(), "%Y-%m-%d 00:00:00")') ->whereNull('r.source_id') ->order('o.create_time') ->find(); // LIMIT 1 } }