This commit is contained in:
2025-08-14 17:19:26 +08:00
parent 30abda5ba7
commit 281248fd04
245 changed files with 21051 additions and 61 deletions

602
app/api/model/Orders.php Normal file
View File

@@ -0,0 +1,602 @@
<?php
namespace app\api\model;
use app\common\library\DatabaseRoute;
use app\common\model\BaseModel;
use app\common\model\SysUser;
use app\queue\ActivitiesQueue;
use app\utils\RedisUtils;
use DateTime;
use think\facade\Db;
use support\Log;
class Orders extends BaseModel
{
public static function fillSysUserId(array &$order, $userInfo)
{
if (!empty($order['sys_user_id'])) {
return;
}
$order['sys_user_id'] = 1;
// $userInfo = DatabaseRoute::getDb('tb_user', $userId)->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) {
// TODO 测试
// 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']
]);
}
// TODO 异步领取奖励
// 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['id'],
'give_award_count' => 0
];
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
}
}