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

377 lines
13 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\common\model;
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;
//推广用户充值返利
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;
//小时榜获得金币
const HOUR_RANK_COIN = 27;
//新人充值好礼
const NEW_USER_CHARGE_GIFT = 28;
//发红包(金币)
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;
//签约支出
const SIGN = 50;
//签约失败退回
const SIGN_FAILURE = 51;
//首次被签约收入
const FIRST_SIGN_INCOME = 52;
//签约师傅每日返还
const SIGN_MASTER_DAILY_RETURN = 53;
//叛徒补偿
const BELIEVER_COMPENSATION = 54;
//被签约者收礼返佣给上级
const SIGN_BE_SIGNED_INCOME = 55;
//续约
const RENEWAL = 56;
//每日签到
const DAILY_SIGN = 57;
//爆币
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;
//金币支出类型数组
public $coin_consumption_type_array = [
self::OPERATION_CONSUME,
self::OPERATION_DECORATION,
self::OPERATION_GIFT,
self::GUILD_EXIT,
self::HEADLINE_REWARD,
self::TRANSFER_COIN,
self::RED_PACKET_COIN,
self::SIGN,
self::RENEWAL,
self::RED_PACKET_FEE,
];
//钻石支出类型数组
public $diamond_consumption_type_array = [
self::OPERATION_WITHDRAW,
self::MONEY_CONVERSION,
self::RED_PACKET_DIAMOND
];
public function user()
{
return $this->hasOne('User', 'id', 'user_id');
}
//钱包类型
public static function getMoneyType($value)
{
$status = [
self::MONEYTYPECOIN => '金币',
self::MONEYTYPEARNINGS => '钻石'
];
return isset($status[$value]) ? $status[$value] : '';
}
public static function ChangeTypeLable($type = "")
{
$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 => '抢红包(金币)',
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 => '后台扣除钻石'
];
if ($type) {
return $status[$type] ?? '';
} else {
return $status;
}
}
/**
* 修改用户资金
* @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)
{
// 确定操作的表
$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;
}
}
$change_value = abs($change_value);
// 验证用户信息
$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();
if (empty($user_wallet['id'])) {
return ['code' => 0, 'msg' => "用户钱包信息错误", 'data' => null];
}
// 验证资金类型
$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) {
return ['code' => 0, 'msg' => "当前用户金币已达上限", 'data' => null];
}
} elseif ($money_type == self::MONEYTYPEARNINGS) {
$after_earnings = $user_wallet['earnings'] + $change_value;
if ($after_earnings > 99999999) {
return ['code' => 0, 'msg' => "当前用户钻石已达上限", 'data' => null];
}
} else {
return ['code' => 0, 'msg' => "非法资金类型", 'data' => null];
}
// 验证变更类型
$change_name = $this->ChangeTypeLable($change_type);
if (empty($change_name)) {
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) {
return ['code' => 0, 'msg' => "请重试", 'data' => null];
} else {
return ['code' => 1, 'msg' => "操作成功", 'data' => null];
}
}
/*
* 用户资金变动日志
*/
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';
}
$where = [];
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)
->where($where)
->where('user_id', $user_id)
->order('createtime desc');
if ($page) {
$log_select->page($page, $page_limit);
}
$log['list'] = $log_select->select();
foreach ($log['list'] as $key => &$value) {
$value['money_type'] = $this->getMoneyType($money_type);
$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)) {
$value['change_in_out'] = "支出";
$value['change_value'] = $value['coin'] * -1;
} else {
$value['change_in_out'] = "收入";
}
} else {
if (in_array($change_type, $this->diamond_consumption_type_array)) {
$value['change_in_out'] = "支出";
$value['change_value'] = $value['earnings'] * -1;
} else {
$value['change_in_out'] = "收入";
}
}
}
return $log;
}
/*
* 获取用户资金类型
*/
public function getChangeTypeLableList()
{
return $this->ChangeTypeLable();
}
}