红包超时退回

This commit is contained in:
2025-10-13 18:48:39 +08:00
parent aaa3bdb5dd
commit 43f9a619b4
3 changed files with 85 additions and 3 deletions

View File

@@ -2,6 +2,9 @@
namespace app\cron\controller;
use app\common\model\Redpacket;
use app\common\model\UserWallet;
use think\Cache;
use think\Db;
use Yzh\YunPay;
@@ -30,6 +33,9 @@ class PerformPerSecond
echo "pk发起10秒后无应答拒绝\n";
$this->pk_start_refuse();
echo "\n";
echo "房间红包清退:\n";
$this->processExpiredRedpackets();
echo "\n";
// echo "房间火热值更新:\n";
// $this->room_hot_update();
// echo "\n";
@@ -228,4 +234,74 @@ class PerformPerSecond
}
}
/**
* 处理过期红包退款
*/
public function processExpiredRedpackets()
{
$now = time();
$redpacketModel = new Redpacket();
// 查找已结束但未退款的红包
$expiredRedpackets = Db::name('redpacket')
->where('status', Redpacket::STATUS_ACTIVE)
->where('end_time', '<', $now)
->where('left_count', '>', 0)
->select();
foreach ($expiredRedpackets as $redpacket) {
Db::startTrans();
try {
// 退款给发红包用户
if ($redpacket['left_amount'] > 0) {
// 更新用户钱包
$coinField = $redpacket['coin_type'] == 1 ? 'coin' : 'earnings';
//增加余额
$addres = Db::name('user_wallet')
->where('user_id', $redpacket['user_id'])
->inc($coinField, $redpacket['left_amount'])
->update();
//记录用户金币日志
$data = [
'user_id' => $redpacket['user_id'],
'change_value' => $redpacket['left_amount'],
'room_id' => $redpacket['room_id'],
'money_type' => $redpacket['coin_type'],
//记录日志 32-发红包金币29-发红包钻石30-抢红包金币31-抢红包钻石33-红包剩余退回金币34-红包剩余退回(钻石)
'change_type' => $redpacket['coin_type'] == 1 ? 33 : 34,
'from_id' => $redpacket['room_id'],
'remarks' => '红包剩余退回',
'createtime' => time()
];
$res = Db::name('vs_user_money_log')->insert($data);
if(!$res || !$addres){
Db::rollback();
}
}
// 更新红包状态
Db::name('redpacket')
->where('id', $redpacket['id'])
->update([
'status' => Redpacket::STATUS_REFUNDED,
'updatetime' => $now
]);
// 清理Redis缓存
$redis = Cache::store('redis')->handler();
$redisKey = "redpacket:{$redpacket['id']}";
$redis->del($redisKey);
Db::commit();
} catch (\Exception $e) {
Db::rollback();
// 记录日志
\think\Log::error("红包退款失败: {$redpacket['id']}, 错误: " . $e->getMessage());
}
}
}
}