Files
yusheng-php/application/common/model/UserWallet.php

376 lines
13 KiB
PHP
Raw Normal View History

2025-08-07 20:21:47 +08:00
<?php
namespace app\common\model;
2025-08-07 20:21:47 +08:00
use think\Db;
use think\Model;
/**
* 会员钱包模型
*/
class UserWallet extends Model
{
protected $table = 'user_wallet';
protected $autoWriteTimestamp = true;
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
//常量
//钱包类型
const MONEYTYPECOIN = 1; //金币
const MONEYTYPEARNINGS = 2; //钻石
//资金操作
//系统调节
const OPERATION_SYSTEM = 1;
//会员充值
const OPERATION_RECHARGE = 2;
//会员提现
const OPERATION_WITHDRAW = 3;
//金币转增(送出)
const OPERATION_CONSUME = 4;
//每日任务奖励
const DAILY_TASKS_REWARD = 5;
2025-08-07 20:21:47 +08:00
//推广用户充值返利
const OPERATION_INVITE_REBATE = 6;
//购买装扮
const OPERATION_DECORATION = 7;
//礼盒奖励
const GIFT_BOX_REWARD = 8;
//房间补贴
const ROOM_SUBSIDY = 9;
//购买礼物
const OPERATION_GIFT = 10;
//收礼增加收益
const GIVE_GIFT_EARNING = 11;
//工会补贴
const GUILD_SUBSIDY = 12;
//会员转赠(接收)
const USER_RECEIVE = 13;
//收益兑换
const MONEY_CONVERSION = 14;
//首充
const FIRST_CHARGE = 15;
//天降好礼充值
const DROP_GIFT_REWARD = 16;
//退出工会扣款
const GUILD_EXIT = 17;
//房主收益
const ROOM_OWNER_EARNINGS = 18;
//主持人收益
const HOST_EARNINGS = 19;
//抢头条
const HEADLINE_REWARD = 20;
//公会长收益
const GUILD_EARNINGS = 21;
//提现驳回或提现失败返还
const WITHDRAW_FAILURE = 22;
//财富等级奖励金币领取
const FINANCE_LEVEL_REWARD = 23;
//删除关系扣金币
const DELETE_RELATION_COIN = 24;
//赠送好友金币
const TRANSFER_COIN = 25;
//好友转赠所得金币
const RECEIVE_COIN = 26;
2025-10-20 09:59:39 +08:00
//小时榜获得金币
const HOUR_RANK_COIN = 27;
//新人充值好礼
const NEW_USER_CHARGE_GIFT = 28;
2025-08-07 20:21:47 +08:00
2025-10-20 09:59:39 +08:00
//发红包(金币)
const RED_PACKET_COIN = 32;
//发红包(钻石)
const RED_PACKET_DIAMOND = 29;
//抢红包(金币)
const RED_PACKET_COIN_RECEIVE = 30;
//抢红包(钻石)
const RED_PACKET_DIAMOND_RECEIVE = 31;
//红包剩余退回金币34-红包剩余退回(钻石)
const RED_PACKET_LEFT_COIN = 33;
//红包剩余退回(钻石)
const RED_PACKET_LEFT_DIAMOND = 34;
//爵位购买赠送金币(金币)
const NOBILITY_PURCHASE_COIN = 35;
2025-11-26 11:36:08 +08:00
//签约支出
const SIGN = 50;
//签约失败退回
const SIGN_FAILURE = 51;
//首次被签约收入
const FIRST_SIGN_INCOME = 52;
//签约师傅每日返还
const SIGN_MASTER_DAILY_RETURN = 53;
2025-11-26 17:34:14 +08:00
//叛徒补偿
const BELIEVER_COMPENSATION = 54;
2025-11-27 11:48:53 +08:00
//被签约者收礼返佣给上级
const SIGN_BE_SIGNED_INCOME = 55;
//续约
const RENEWAL = 56;
//每日签到
const DAILY_SIGN = 57;
2025-12-21 18:06:39 +08:00
//爆币
const BOMB_COIN = 58;
//红包手续费
const RED_PACKET_FEE = 59;
//后台充值金币
const BACKGROUND_RECHARGE_COIN = 40;
//后台充值钻石
const BACKGROUND_RECHARGE_DIAMOND = 41;
//后台扣除金币
const BACKGROUND_DEDUCTION_COIN = 42;
//后台扣除钻石
const BACKGROUND_DEDUCTION_DIAMOND = 43;
2025-11-26 11:36:08 +08:00
2025-08-07 20:21:47 +08:00
//金币支出类型数组
public $coin_consumption_type_array = [
2025-08-07 20:21:47 +08:00
self::OPERATION_CONSUME,
self::OPERATION_DECORATION,
self::OPERATION_GIFT,
self::GUILD_EXIT,
self::HEADLINE_REWARD,
2025-10-20 09:59:39 +08:00
self::TRANSFER_COIN,
self::RED_PACKET_COIN,
2025-11-26 11:36:08 +08:00
self::SIGN,
2025-11-27 11:48:53 +08:00
self::RENEWAL,
self::RED_PACKET_FEE,
2025-08-07 20:21:47 +08:00
];
//钻石支出类型数组
public $diamond_consumption_type_array = [
2025-08-07 20:21:47 +08:00
self::OPERATION_WITHDRAW,
2025-10-20 09:59:39 +08:00
self::MONEY_CONVERSION,
self::RED_PACKET_DIAMOND
2025-08-07 20:21:47 +08:00
];
public function user()
{
return $this->hasOne('User', 'id', 'user_id');
}
2025-08-07 20:21:47 +08:00
//钱包类型
public static function getMoneyType($value)
{
$status = [
self::MONEYTYPECOIN => '金币',
self::MONEYTYPEARNINGS => '钻石'
];
return isset($status[$value]) ? $status[$value] : '';
}
public static function ChangeTypeLable($type = "")
2025-08-07 20:21:47 +08:00
{
$status = [
self::OPERATION_SYSTEM => '系统调节',
self::OPERATION_RECHARGE => '会员充值',
self::OPERATION_WITHDRAW => '会员提现',
self::OPERATION_CONSUME => '金币转增(送出)',
self::DAILY_TASKS_REWARD => '任务奖励',
self::OPERATION_INVITE_REBATE => '邀请用户充值返利',
self::OPERATION_DECORATION => '购买装扮',
self::GIFT_BOX_REWARD => '礼盒奖励',
self::ROOM_SUBSIDY => '房间补贴',
self::OPERATION_GIFT => '购买礼物',
self::GIVE_GIFT_EARNING => '送礼增加收益',
self::GUILD_SUBSIDY => '工会补贴',
self::USER_RECEIVE => '会员转赠(接收)',
self::MONEY_CONVERSION => '钻石兑换金币',
self::FIRST_CHARGE => '首充',
self::DROP_GIFT_REWARD => '天降好礼充值',
self::GUILD_EXIT => '退出工会扣款',
self::ROOM_OWNER_EARNINGS => '房主收益',
self::HOST_EARNINGS => '主持人收益',
self::HEADLINE_REWARD => '抢头条',
self::GUILD_EARNINGS => '公会长收益',
self::WITHDRAW_FAILURE => '提现驳回或提现失败返还',
self::FINANCE_LEVEL_REWARD => '财富等级奖励金币领取',
self::DELETE_RELATION_COIN => '删除关系扣金币',
self::TRANSFER_COIN => '赠送好友金币',
self::RECEIVE_COIN => '好友转赠所得金币',
self::HOUR_RANK_COIN => '小时榜获得金币',
self::NEW_USER_CHARGE_GIFT => '新人充值好礼',
self::RED_PACKET_COIN => '发红包(金币)',
self::RED_PACKET_DIAMOND => '发红包(钻石)',
self::RED_PACKET_COIN_RECEIVE => '抢红包(金币)',
2025-10-20 09:59:39 +08:00
self::RED_PACKET_DIAMOND_RECEIVE => '抢红包(钻石)',
self::RED_PACKET_LEFT_COIN => '红包剩余退回(金币)',
self::RED_PACKET_LEFT_DIAMOND => '红包剩余退回(钻石)',
self::NOBILITY_PURCHASE_COIN => '爵位购买赠送(金币)',
self::SIGN => '签约支出',
self::SIGN_FAILURE => '签约失败退回',
self::FIRST_SIGN_INCOME => '首次被签约收入',
self::SIGN_MASTER_DAILY_RETURN => '签约师傅每日返还',
self::BELIEVER_COMPENSATION => '解约补偿',
self::SIGN_BE_SIGNED_INCOME => '被签约者收礼返佣给上级',
self::RENEWAL => '续约',
self::DAILY_SIGN => '每日签到',
self::BOMB_COIN => '参与幸运币活动获得',
self::RED_PACKET_FEE => '发红包手续费',
self::BACKGROUND_RECHARGE_COIN => '后台充值金币',
self::BACKGROUND_RECHARGE_DIAMOND => '后台充值钻石',
self::BACKGROUND_DEDUCTION_COIN => '后台扣除金币',
self::BACKGROUND_DEDUCTION_DIAMOND => '后台扣除钻石'
2025-11-27 11:48:53 +08:00
2025-08-07 20:21:47 +08:00
];
if ($type) {
return $status[$type] ?? '';
} else {
return $status;
}
2025-08-07 20:21:47 +08:00
}
/**
* 修改用户资金
* @param $user_id 用户ID
* @param $change_value
* @param $money_type
* @param $change_type
* @param $remarks
* @param $from_uid
* @param $from_id
* @param $rid
* @param $is_uid_search
* @return array|void
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function change_user_money($user_id, $change_value, $money_type, $change_type, $remarks = "", $room_id = 0, $from_uid = 0, $from_id = 0)
2025-08-07 20:21:47 +08:00
{
// 确定操作的表
$table_name = $money_type == self::MONEYTYPECOIN ? 'user_wallet_coin' : 'user_wallet_earnings';
// 如果是后台操作change_type == 1则根据金额正负自动设置具体的变更类型
if ($change_type == 1) {
if ($money_type == self::MONEYTYPECOIN) {
$change_type = $change_value > 0 ? self::BACKGROUND_RECHARGE_COIN : self::BACKGROUND_DEDUCTION_COIN;
} else {
$change_type = $change_value > 0 ? self::BACKGROUND_RECHARGE_DIAMOND : self::BACKGROUND_DEDUCTION_DIAMOND;
}
2025-08-07 20:21:47 +08:00
}
$change_value = abs($change_value);
// 验证用户信息
2025-08-07 20:21:47 +08:00
$user_info = db::name('user')->find($user_id);
if (empty($user_info['id'])) {
return ['code' => 0, 'msg' => "用户信息错误", 'data' => null];
}
// 获取用户钱包信息
$user_wallet = db::name($table_name)->where(['user_id' => $user_id])->find();
2025-08-07 20:21:47 +08:00
if (empty($user_wallet['id'])) {
return ['code' => 0, 'msg' => "用户钱包信息错误", 'data' => null];
2025-08-07 20:21:47 +08:00
}
// 验证资金类型
2025-08-07 20:21:47 +08:00
$money_type_str = $this->getMoneyType($money_type);
if (empty($money_type_str)) {
return ['code' => 0, 'msg' => "非法资金类型", 'data' => null];
}
// 检查金额是否为数字
if (!is_numeric($change_value)) {
return ['code' => 0, 'msg' => "变动的数值必须为数字", 'data' => null];
}
// 验证并检查余额上限
if ($money_type == self::MONEYTYPECOIN) {
$after_coin = $user_wallet['coin'] + $change_value;
if ($after_coin > 99999999) {
2025-08-07 20:21:47 +08:00
return ['code' => 0, 'msg' => "当前用户金币已达上限", 'data' => null];
}
} elseif ($money_type == self::MONEYTYPEARNINGS) {
$after_earnings = $user_wallet['earnings'] + $change_value;
if ($after_earnings > 99999999) {
2025-08-07 20:21:47 +08:00
return ['code' => 0, 'msg' => "当前用户钻石已达上限", 'data' => null];
}
} else {
return ['code' => 0, 'msg' => "非法资金类型", 'data' => null];
}
// 验证变更类型
2025-08-07 20:21:47 +08:00
$change_name = $this->ChangeTypeLable($change_type);
if (empty($change_name)) {
2025-08-07 20:21:47 +08:00
return ['code' => 0, 'msg' => "非法资金变动类型", 'data' => null];
}
// 记录资金变动日志
if ($money_type == self::MONEYTYPECOIN) {
$return = model('api/UserWallet')->change_user_cion_log($user_id, $change_value, $room_id, $change_type, $remarks);
} else {
$return = model('api/UserWallet')->change_user_earnings_log($user_id, $change_value, $room_id, $change_type, $remarks);
}
// 修正返回值逻辑:如果日志记录成功,返回成功;如果日志记录失败,返回失败
if (!$return) {
2025-08-07 20:21:47 +08:00
return ['code' => 0, 'msg' => "请重试", 'data' => null];
} else {
return ['code' => 1, 'msg' => "操作成功", 'data' => null];
2025-08-07 20:21:47 +08:00
}
}
/*
* 用户资金变动日志
*/
public function money_change_log($user_id, $seach, $money_type = 0, $page = 0, $page_limit = 30)
{
if ($money_type == self::MONEYTYPECOIN) {
$table_name_log = 'user_coin_log';
} else {
$table_name_log = 'user_earnings_log';
2025-08-07 20:21:47 +08:00
}
if ($seach['stime']) {
$where['createtime'] = ['>=', strtotime($seach['stime'])];
}
if ($seach['etime']) {
$where['createtime'] = ['<=', strtotime($seach['etime'])];
}
if ($seach['change_type']) {
$where['change_type'] = $seach['change_type'];
}
$log['count'] = Db::name($table_name_log)->where($where)->where('user_id', $user_id)->count('id');
$log_select = Db::name($table_name_log)
2025-08-07 20:21:47 +08:00
->where($where)
->where('user_id', $user_id)
2025-08-07 20:21:47 +08:00
->order('log_id desc');
if ($page) {
$log_select->page($page, $page_limit);
2025-08-07 20:21:47 +08:00
}
$log['list'] = $log_select->select();
foreach ($log['list'] as $key => &$value) {
$value['money_type'] = $this->getMoneyType($money_type);
2025-08-07 20:21:47 +08:00
$change_type = $value['change_type'];
$value['change_type'] = $this->ChangeTypeLable($value['change_type']);
$value['createtime'] = date('Y-m-d H:i:s', $value['createtime']);
if ($money_type == self::MONEYTYPECOIN) {
if (in_array($change_type, $this->coin_consumption_type_array)) {
2025-08-07 20:21:47 +08:00
$value['change_in_out'] = "支出";
$value['change_value'] = $value['change_value'] * -1;
} else {
2025-08-07 20:21:47 +08:00
$value['change_in_out'] = "收入";
}
} else {
if (in_array($change_type, $this->diamond_consumption_type_array)) {
2025-08-07 20:21:47 +08:00
$value['change_in_out'] = "支出";
$value['change_value'] = $value['change_value'] * -1;
} else {
2025-08-07 20:21:47 +08:00
$value['change_in_out'] = "收入";
}
}
}
return $log;
}
/*
* 获取用户资金类型
*/
public function getChangeTypeLableList()
{
return $this->ChangeTypeLable();
}
2025-08-07 20:21:47 +08:00
}