Lae/app/Models/Transaction.php

236 lines
4.9 KiB
PHP
Raw Normal View History

2022-09-14 14:19:28 +00:00
<?php
namespace App\Models;
use Jenssegers\Mongodb\Eloquent\Model;
2022-09-15 04:13:37 +00:00
use Illuminate\Support\Facades\Cache;
2022-09-14 14:19:28 +00:00
class Transaction extends Model
{
// $t = (new App\Models\Transaction)->create(['name' => 1])
protected $connection = 'mongodb';
protected $collection = 'transactions';
2022-09-15 04:13:37 +00:00
// 停用 updated_at
const UPDATED_AT = null;
2022-09-14 14:19:28 +00:00
protected $dates = [
'created_at',
'updated_at',
2022-09-15 04:13:37 +00:00
'paid_at',
2022-09-14 14:19:28 +00:00
];
protected $fillable = [
2022-09-15 04:13:37 +00:00
// 交易类型
'type',
// 交易渠道
'payment',
// 描述
'description',
// 入账
'income',
// 入账 Drops
'income_drops',
// 出账
'outcome',
// 出账 Drops
'outcome_drops',
// 可用余额
'balance',
// 可用 Drops
'drops',
// 赠送金额
'gift',
// 赠送 Drops
'gift_drops',
'user_id',
2022-09-14 14:19:28 +00:00
];
2022-09-15 04:13:37 +00:00
// scope this user
public function scopeThisUser($query)
{
return $query->where('user_id', auth()->id());
}
public function getDrops($user_id = null)
{
//
if (!$user_id) {
$user_id = auth()->id();
}
$cache_key = 'user_drops_' . $user_id;
$decimal = config('drops.decimal');
// 计算需要乘以多少
$multiple = 1;
for ($i = 0; $i < $decimal; $i++) {
$multiple *= 10;
}
$drops = Cache::get($cache_key);
// 除以 $multiple
$drops = $drops / $multiple;
return $drops;
}
public function reduceCurrentUserDrops($amount = 0)
{
return $this->reduceDrops(auth()->id(), $amount);
}
public function increaseCurrentUserDrops($amount = 0)
{
return $this->increaseDrops(auth()->id(), $amount);
}
public function increaseDrops($user_id, $amount = 0)
{
$cache_key = 'user_drops_' . $user_id;
$decimal = config('drops.decimal');
// 计算需要乘以多少
$multiple = 1;
for ($i = 0; $i < $decimal; $i++) {
$multiple *= 10;
}
$amount = $amount * $multiple;
$drops = Cache::increment($cache_key, $amount);
return $drops;
}
public function reduceDrops($user_id, $amount = 0, $description = null)
{
$cache_key = 'user_drops_' . $user_id;
$decimal = config('drops.decimal');
// 计算需要乘以多少
$multiple = 1;
for ($i = 0; $i < $decimal; $i++) {
$multiple *= 10;
}
$month = now()->month;
Cache::increment('user_' . $user_id . '_month_' . $month . '_drops', $amount);
$amount = $amount * $multiple;
$drops = Cache::decrement($cache_key, $amount);
// (new App\Models\Transaction)->create(['name' => 1]);
$this->addPayoutDrops($user_id, $amount, $description);
return $drops;
}
public function addPayoutDrops($user_id, $amount, $description)
{
$data = [
'type' => 'payout',
'payment' => 'drops',
'description' => $description,
'income' => 0,
'income_drops' => 0,
'outcome' => 0,
'outcome_drops' => $amount,
];
return $this->addLog($user_id, $data);
}
public function addIncomeDrops($user_id, $amount, $description)
{
$data = [
'type' => 'income',
'payment' => 'balance',
'description' => $description,
'income' => 0,
'income_drops' => $amount,
'outcome' => 0,
'outcome_drops' => 0,
];
return $this->addLog($user_id, $data);
}
public function addIncomeBalance($user_id, $payment, $amount, $description)
{
$data = [
'type' => 'income',
'payment' => $payment,
'description' => $description,
'income' => $amount,
'income_drops' => 0,
'outcome' => 0,
'outcome_drops' => 0,
];
return $this->addLog($user_id, $data);
}
public function addPayoutBalance($user_id, $amount, $description)
{
$data = [
'type' => 'payout',
'payment' => 'balance',
'description' => $description,
'income' => 0,
'income_drops' => 0,
'outcome' => $amount,
'outcome_drops' => 0,
];
return $this->addLog($user_id, $data);
}
private function addLog($user_id, $data)
{
$user = User::find($user_id);
$current = [
'balance' => $user->balance,
'drops' => $this->getDrops($user_id),
'user_id' => $user_id,
];
// merge
$data = array_merge($data, $current);
// add expired at
$data['expired_at'] = now()->addSeconds(7);
return $this->create($data);
}
2022-09-14 14:19:28 +00:00
}