289 lines
10 KiB
PHP
289 lines
10 KiB
PHP
<?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;
|
|
|
|
|
|
//金币支出类型数组
|
|
public $coin_consumption_type_array = [
|
|
self::OPERATION_CONSUME,
|
|
self::OPERATION_DECORATION,
|
|
self::OPERATION_GIFT,
|
|
self::GUILD_EXIT,
|
|
self::HEADLINE_REWARD,
|
|
self::TRANSFER_COIN
|
|
];
|
|
//钻石支出类型数组
|
|
public $diamond_consumption_type_array = [
|
|
self::OPERATION_WITHDRAW,
|
|
self::MONEY_CONVERSION
|
|
];
|
|
|
|
|
|
|
|
|
|
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 => '新人充值好礼'
|
|
];
|
|
return $status[$type] ?? '';
|
|
}
|
|
|
|
/**
|
|
* 修改用户资金
|
|
* @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)
|
|
{
|
|
if (in_array($change_type, $this->coin_consumption_type_array) && $money_type==self::MONEYTYPECOIN) {//金币支出
|
|
$change_value = $change_value * -1;
|
|
}
|
|
if (in_array($change_type, $this->diamond_consumption_type_array) && $money_type==self::MONEYTYPEARNINGS){//钻石支出
|
|
$change_value = $change_value * -1;
|
|
}
|
|
$user_info = db::name('user')->find($user_id);
|
|
if (empty($user_info['id'])) {
|
|
return ['code' => 0, 'msg' => "用户信息错误", 'data' => null];
|
|
}
|
|
$user_wallet = db::name('user_wallet')->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];
|
|
}
|
|
$after_coin = $user_wallet['coin'];
|
|
$after_earnings = $user_wallet['earnings'];
|
|
if ($money_type == 1) {
|
|
$change_field = "coin";
|
|
$after_coin += $change_value;
|
|
if($after_coin > 99999999){
|
|
return ['code' => 0, 'msg' => "当前用户金币已达上限", 'data' => null];
|
|
}
|
|
} elseif ($money_type == 2) {
|
|
$change_field = "earnings";
|
|
$after_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 (!is_numeric($change_value)) {
|
|
return ['code' => 0, 'msg' => "变动的数值必须为数字", 'data' => null];
|
|
}
|
|
|
|
$data = [];
|
|
$data['user_id'] = $user_id;
|
|
$data['room_id'] = $room_id;
|
|
$data['change_type'] = $change_type;
|
|
$data['money_type'] = $money_type;
|
|
$data['change_value'] = abs($change_value);
|
|
$data['after_coin'] = $after_coin;
|
|
$data['after_earnings'] = $after_earnings;
|
|
$data['from_id'] = $from_id;
|
|
$data['from_uid'] = $from_uid;
|
|
$data['remarks'] = $remarks;
|
|
$data['createtime'] = time();
|
|
$data['updatetime'] = time();
|
|
Db::startTrans();
|
|
try {
|
|
if($change_value < 0){
|
|
$change_value_abs = abs($change_value);
|
|
$change_value_up = $user_wallet[$change_field] - $change_value_abs;
|
|
if($change_value_up<0){
|
|
Db::rollback();
|
|
return ['code' => 0, 'msg' => $money_type_str . "不足", 'data' => null];
|
|
}
|
|
}
|
|
Db::name('user_wallet')->where('user_id', $user_id)->inc($change_field, $change_value)->update(['updatetime' => time()]);
|
|
$reslut = Db::name('vs_user_money_log')->insert($data);
|
|
if (!$reslut) {
|
|
Db::rollback();
|
|
return ['code' => 0, 'msg' => "请重试", 'data' => null];
|
|
}
|
|
// 提交事务
|
|
Db::commit();
|
|
return ['code' => 1, 'msg' => "操作成功", 'data' => null];
|
|
} catch (\Exception $e) {
|
|
// 回滚事务
|
|
Db::rollback();
|
|
return ['code' => 0, 'msg' => "请重试", 'data' => null];
|
|
}
|
|
}
|
|
|
|
/*
|
|
* 用户资金变动日志
|
|
*/
|
|
public function money_change_log($user_id, $money_type=0, $page=0,$page_limit=30){
|
|
if($money_type){
|
|
$where['money_type'] =$money_type;
|
|
}
|
|
$log['count'] = Db::name('vs_user_money_log')->where($where)->where('user_id',$user_id)->count();
|
|
$log_select = Db::name('vs_user_money_log')
|
|
->where($where)
|
|
->where('user_id',$user_id)
|
|
->order('log_id 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($value['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==1 ){
|
|
if(in_array($change_type,$this->coin_consumption_type_array)){
|
|
$value['change_in_out'] = "支出";
|
|
$value['change_value'] = $value['change_value']*-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['change_value']*-1;
|
|
}else{
|
|
$value['change_in_out'] = "收入";
|
|
}
|
|
}
|
|
|
|
}
|
|
return $log;
|
|
}
|
|
} |