add 交易记录
This commit is contained in:
parent
89442913f0
commit
2ae48abae2
@ -7,66 +7,3 @@ function now($timezone = null)
|
|||||||
{
|
{
|
||||||
return Carbon::now($timezone);
|
return Carbon::now($timezone);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDrops($user_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;
|
|
||||||
}
|
|
||||||
|
|
||||||
function reduceDrops($user_id, $amount = 0)
|
|
||||||
{
|
|
||||||
$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);
|
|
||||||
|
|
||||||
return $drops;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function addDrops($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;
|
|
||||||
}
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
use Alipay\EasySDK\Kernel\Util\ResponseChecker;
|
use Alipay\EasySDK\Kernel\Util\ResponseChecker;
|
||||||
use Alipay\EasySDK\Kernel\Factory as AlipayFactory;
|
use Alipay\EasySDK\Kernel\Factory as AlipayFactory;
|
||||||
|
use App\Models\Transaction;
|
||||||
|
|
||||||
class BalanceController extends Controller
|
class BalanceController extends Controller
|
||||||
{
|
{
|
||||||
@ -179,6 +180,13 @@ public function checkAndCharge($out_trade_no, Balance $balance)
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
public function transactions() {
|
||||||
|
$transactions = Transaction::thisUser()->simplePaginate(30);
|
||||||
|
|
||||||
|
return $this->success($transactions);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function drops()
|
public function drops()
|
||||||
{
|
{
|
||||||
@ -188,8 +196,10 @@ public function drops()
|
|||||||
|
|
||||||
$cache_key = 'user_' . $user_id . '_month_' . $month . '_drops';
|
$cache_key = 'user_' . $user_id . '_month_' . $month . '_drops';
|
||||||
|
|
||||||
|
$transactions = new Transaction();
|
||||||
|
|
||||||
$resp = [
|
$resp = [
|
||||||
'drops' => getDrops($user_id),
|
'drops' => $transactions->getDrops($user_id),
|
||||||
'monthly_usages' => (float) Cache::get($cache_key, 0),
|
'monthly_usages' => (float) Cache::get($cache_key, 0),
|
||||||
'rate' => config('drops.rate'),
|
'rate' => config('drops.rate'),
|
||||||
'decimal' => config('drops.decimal'),
|
'decimal' => config('drops.decimal'),
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Models\Transaction;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
|
|
||||||
@ -12,7 +13,9 @@ public function index(Request $request)
|
|||||||
{
|
{
|
||||||
$user = $request->user();
|
$user = $request->user();
|
||||||
|
|
||||||
$user['drops'] = getDrops($user['id']);
|
$transaction = new Transaction();
|
||||||
|
|
||||||
|
$user['drops'] = $transaction->getDrops($user['id']);
|
||||||
$user['drops_rate'] = config('drops.rate');
|
$user['drops_rate'] = config('drops.rate');
|
||||||
|
|
||||||
return $this->success($user);
|
return $this->success($user);
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Jobs;
|
|
||||||
|
|
||||||
class ExampleJob extends Job
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Create a new job instance.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute the job.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function handle()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
}
|
|
@ -2,10 +2,11 @@
|
|||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
|
use App\Models\Transaction;
|
||||||
use App\Models\Module\Module;
|
use App\Models\Module\Module;
|
||||||
use App\Models\WorkOrder\WorkOrder;
|
use App\Models\WorkOrder\WorkOrder;
|
||||||
use Illuminate\Support\Facades\Cache;
|
|
||||||
// use Illuminate\Database\Eloquent\SoftDeletes;
|
// use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
use Illuminate\Support\Facades\Cache;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use App\Exceptions\User\BalanceNotEnoughException;
|
use App\Exceptions\User\BalanceNotEnoughException;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
@ -89,7 +90,9 @@ public function cost($price = null)
|
|||||||
{
|
{
|
||||||
$this->load('user');
|
$this->load('user');
|
||||||
|
|
||||||
$drops = getDrops($this->user_id);
|
$transaction = new Transaction();
|
||||||
|
|
||||||
|
$drops = $transaction->getDrops($this->user_id);
|
||||||
|
|
||||||
if ($price !== null) {
|
if ($price !== null) {
|
||||||
$this->price = $price;
|
$this->price = $price;
|
||||||
@ -134,7 +137,9 @@ public function cost($price = null)
|
|||||||
|
|
||||||
Cache::put($month_cache_key, $hosts_drops, 604800);
|
Cache::put($month_cache_key, $hosts_drops, 604800);
|
||||||
|
|
||||||
reduceDrops($this->user_id, $this->price);
|
$description = $this->name . ' 扣费。';
|
||||||
|
|
||||||
|
$transaction->reduceDrops($this->user_id, $this->price, $description);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
use Jenssegers\Mongodb\Eloquent\Model;
|
use Jenssegers\Mongodb\Eloquent\Model;
|
||||||
|
use Illuminate\Support\Facades\Cache;
|
||||||
|
|
||||||
class Transaction extends Model
|
class Transaction extends Model
|
||||||
{
|
{
|
||||||
@ -12,14 +12,224 @@ class Transaction extends Model
|
|||||||
protected $connection = 'mongodb';
|
protected $connection = 'mongodb';
|
||||||
protected $collection = 'transactions';
|
protected $collection = 'transactions';
|
||||||
|
|
||||||
|
// 停用 updated_at
|
||||||
|
const UPDATED_AT = null;
|
||||||
|
|
||||||
protected $dates = [
|
protected $dates = [
|
||||||
'created_at',
|
'created_at',
|
||||||
'updated_at',
|
'updated_at',
|
||||||
'time',
|
'paid_at',
|
||||||
'created_at'
|
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'name'
|
// 交易类型
|
||||||
|
'type',
|
||||||
|
|
||||||
|
// 交易渠道
|
||||||
|
'payment',
|
||||||
|
|
||||||
|
// 描述
|
||||||
|
'description',
|
||||||
|
|
||||||
|
// 入账
|
||||||
|
'income',
|
||||||
|
|
||||||
|
// 入账 Drops
|
||||||
|
'income_drops',
|
||||||
|
|
||||||
|
// 出账
|
||||||
|
'outcome',
|
||||||
|
// 出账 Drops
|
||||||
|
'outcome_drops',
|
||||||
|
|
||||||
|
// 可用余额
|
||||||
|
'balance',
|
||||||
|
|
||||||
|
// 可用 Drops
|
||||||
|
'drops',
|
||||||
|
|
||||||
|
// 赠送金额
|
||||||
|
'gift',
|
||||||
|
|
||||||
|
// 赠送 Drops
|
||||||
|
'gift_drops',
|
||||||
|
|
||||||
|
'user_id',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
|
use App\Models\Transaction;
|
||||||
use App\Exceptions\CommonException;
|
use App\Exceptions\CommonException;
|
||||||
use Illuminate\Auth\Authenticatable;
|
use Illuminate\Auth\Authenticatable;
|
||||||
use Laravel\Lumen\Auth\Authorizable;
|
use Laravel\Lumen\Auth\Authorizable;
|
||||||
@ -51,7 +52,9 @@ public function toDrops($amount = 1)
|
|||||||
|
|
||||||
$cache_key = 'user_drops_' . $this->id;
|
$cache_key = 'user_drops_' . $this->id;
|
||||||
|
|
||||||
$drops = getDrops($this->id);
|
$transactions = new Transaction();
|
||||||
|
|
||||||
|
$drops = $transactions->getDrops($this->id);
|
||||||
|
|
||||||
$total = 0;
|
$total = 0;
|
||||||
|
|
||||||
@ -68,7 +71,11 @@ public function toDrops($amount = 1)
|
|||||||
$this->balance -= $amount;
|
$this->balance -= $amount;
|
||||||
$this->save();
|
$this->save();
|
||||||
|
|
||||||
addDrops($this->id, $total);
|
$transactions->increaseDrops($this->id, $total);
|
||||||
|
|
||||||
|
// $transactions
|
||||||
|
|
||||||
|
$transactions->addPayoutBalance($this->id, $amount, '自动转换为 Drops');
|
||||||
|
|
||||||
// if user balance <= 0
|
// if user balance <= 0
|
||||||
if ($this->balance < $amount) {
|
if ($this->balance < $amount) {
|
||||||
@ -83,6 +90,14 @@ public function toDrops($amount = 1)
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// when update
|
||||||
|
// protected static function boot()
|
||||||
|
// {
|
||||||
|
// parent::boot();
|
||||||
|
|
||||||
|
// // when update
|
||||||
|
// static::updating(function ($model) {
|
||||||
|
|
||||||
|
// });
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
"laravel/lumen-framework": "^9.0",
|
"laravel/lumen-framework": "^9.0",
|
||||||
"league/flysystem": "^3.2",
|
"league/flysystem": "^3.2",
|
||||||
"mmghv/lumen-route-binding": "^1.0",
|
"mmghv/lumen-route-binding": "^1.0",
|
||||||
|
"mongodb/mongodb": "^1.13",
|
||||||
"predis/predis": "^2.0"
|
"predis/predis": "^2.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
|
2
composer.lock
generated
2
composer.lock
generated
@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "f8052eee8b55fc09ba079f652a00ff9d",
|
"content-hash": "22a158b343410ac17bf6d2ee94827c2c",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "adbario/php-dot-notation",
|
"name": "adbario/php-dot-notation",
|
||||||
|
@ -13,10 +13,13 @@
|
|||||||
*/
|
*/
|
||||||
public function up()
|
public function up()
|
||||||
{
|
{
|
||||||
Schema::create('transactions', function (Blueprint $table) {
|
|
||||||
$table->id();
|
Schema::connection('mongodb')->create('transactions', function (Blueprint $collection) {
|
||||||
$table->timestamps();
|
$collection->unsignedBigInteger('user_id')->index();
|
||||||
|
$collection->expire('created_at', now()->addYear());
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -26,6 +29,6 @@ public function up()
|
|||||||
*/
|
*/
|
||||||
public function down()
|
public function down()
|
||||||
{
|
{
|
||||||
Schema::dropIfExists('transactions');
|
Schema::connection('mongodb')->dropIfExists('transactions');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -30,10 +30,16 @@
|
|||||||
$router->get('/', [
|
$router->get('/', [
|
||||||
'uses' => 'User\BalanceController@index'
|
'uses' => 'User\BalanceController@index'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$router->post('/', [
|
$router->post('/', [
|
||||||
'uses' => 'User\BalanceController@store'
|
'uses' => 'User\BalanceController@store'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
$router->get('/transactions', [
|
||||||
|
'uses' => 'User\BalanceController@transactions'
|
||||||
|
]);
|
||||||
|
|
||||||
$router->get('/drops', [
|
$router->get('/drops', [
|
||||||
'uses' => 'User\BalanceController@drops'
|
'uses' => 'User\BalanceController@drops'
|
||||||
]);
|
]);
|
||||||
|
Loading…
Reference in New Issue
Block a user