webman_duanju/app/api/model/Orders.php

600 lines
23 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\api\model;
use app\common\library\DatabaseRoute;
use app\common\model\BaseModel;
use app\common\model\SysUser;
use app\queue\redis\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) {
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
}
}