375 lines
13 KiB
PHP
375 lines
13 KiB
PHP
<?php
|
|
|
|
/**
|
|
* create by vscode
|
|
* @author lion
|
|
*/
|
|
namespace App;
|
|
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use App\Utils\RPC;
|
|
|
|
class TransactionIn extends Model
|
|
{
|
|
protected $table = 'transaction_in';
|
|
public $timestamps = false;
|
|
protected $appends = ['account_number', 'currency_name', 'legal_name'];
|
|
|
|
public function getAccountNumberAttribute()
|
|
{
|
|
return $this->hasOne('App\Users', 'id', 'user_id')->value('account_number');
|
|
}
|
|
|
|
public function getCreateTimeAttribute()
|
|
{
|
|
$value = $this->attributes['create_time'];
|
|
return $value ? date("Y-m-d H:i:s", $value) : '';
|
|
}
|
|
|
|
/**
|
|
* 匹配交易
|
|
*
|
|
* @param App\TransactionOut $out 卖出委托模型实例
|
|
* @param float $num 匹配数量
|
|
* @param App\Users $user 买入用户模型实例
|
|
* @param integer $legal_id 法币币种id
|
|
* @param integer $currency_id 交易币种id
|
|
* @return void
|
|
*/
|
|
public static function transaction($out, $num, $user, $legal_id, $currency_id)
|
|
{
|
|
if (empty($out) || empty($num) || empty($user)) {
|
|
return false;
|
|
}
|
|
//买方法币
|
|
$to_legal = UsersWallet::where("user_id", $user->id)
|
|
->where("currency", $legal_id)
|
|
->first();
|
|
//卖方法币
|
|
$out_legal = UsersWallet::where("user_id", $out->user_id)
|
|
->where("currency", $legal_id)
|
|
->first();
|
|
//买方币
|
|
$to_currency = UsersWallet::where("user_id", $user->id)
|
|
->where("currency", $currency_id)
|
|
->first();
|
|
//卖方币
|
|
$out_currency = UsersWallet::where("user_id", $out->user_id)
|
|
->where("currency", $currency_id)
|
|
->first();
|
|
$out_user = Users::find($out->user_id);
|
|
|
|
if (empty($to_currency) || empty($out_currency) || empty($out_user) || empty($to_legal) || empty($out_legal)) {
|
|
return false;
|
|
}
|
|
|
|
if (bc_comp($num, $out->number) > 0) {
|
|
$num = $out->number;
|
|
}
|
|
|
|
$cny = bc_mul($num, $out->price, 5);
|
|
$data_wallet1 = [
|
|
'balance_type' => 1,
|
|
'wallet_id' => $to_legal->id,
|
|
'lock_type' => 0,
|
|
'create_time' => time(),
|
|
'before' => $to_legal->legal_balance,
|
|
'change' => -$cny,
|
|
'after' => bc_sub($to_legal->legal_balance, $cny, 5),
|
|
];
|
|
//扣除买方的法币
|
|
|
|
// $to_legal->legal_balance = bc_sub($to_legal->legal_balance, $cny, 5);
|
|
// $to_legal->save();
|
|
// AccountLog::insertLog([
|
|
// 'user_id' => $user->id,
|
|
// 'value' => -$cny,
|
|
// 'info' => "买入扣除法币",
|
|
// 'type' => AccountLog::TRANSACTIONIN_REDUCE,
|
|
// 'currency_id' => $legal_id
|
|
// ],$data_wallet1);
|
|
|
|
|
|
$data_wallet2 = [
|
|
'balance_type' => 1,
|
|
'wallet_id' => $out_legal->id,
|
|
'lock_type' => 0,
|
|
'create_time' => time(),
|
|
'before' => $out_legal->legal_balance,
|
|
'change' => $cny,
|
|
'after' => bc_add($out_legal->legal_balance, $cny, 5),
|
|
];
|
|
//增加卖方法币
|
|
// $out_legal->legal_balance = bc_add($out_legal->legal_balance, $cny, 5);
|
|
// $out_legal->save();
|
|
// AccountLog::insertLog([
|
|
// 'user_id' => $out->user_id,
|
|
// 'value' => $cny,
|
|
// 'info' => "卖方增加法币",
|
|
// 'type' => AccountLog::TRANSACTIONIN_SELLER_ADD,
|
|
// 'currency' => $legal_id
|
|
// ],$data_wallet2);
|
|
|
|
$data_wallet3 = [
|
|
'balance_type' => 2,
|
|
'wallet_id' => $out_currency->id,
|
|
'lock_type' => 1,
|
|
'create_time' => time(),
|
|
'before' => $out_currency->lock_change_balance,
|
|
'change' => -$num,
|
|
'after' => bc_sub($out_currency->lock_change_balance, $num, 5),
|
|
];
|
|
//扣除卖方的币
|
|
// if (bc_comp($out_currency->lock_change_balance, $num) < 0) {
|
|
// // abort(403, '匹配到的卖方委托存在异常,委托编号:' . $out->id);
|
|
// // return false;
|
|
// }
|
|
// $out_currency->lock_change_balance = bc_sub($out_currency->lock_change_balance, $num, 5);
|
|
// $out_currency->save();
|
|
// AccountLog::insertLog([
|
|
// 'user_id' => $out->user_id,
|
|
// 'value' => -$num,
|
|
// 'info' => "扣除卖方",
|
|
// 'type' => AccountLog::TRANSACTIONIN_SELLER,
|
|
// 'currency' => $currency_id
|
|
// ],$data_wallet3);
|
|
|
|
|
|
$data_wallet4 = [
|
|
'balance_type' => 2,
|
|
'wallet_id' => $to_currency->id,
|
|
'lock_type' => 0,
|
|
'create_time' => time(),
|
|
'before' => $to_currency->change_balance,
|
|
'change' => $num,
|
|
'after' => bc_add($to_currency->change_balance, $num, 5),
|
|
];
|
|
//增加买方的币
|
|
// $to_currency->change_balance = bc_add($to_currency->change_balance, $num, 5);
|
|
// $to_currency->save();
|
|
|
|
// AccountLog::insertLog([
|
|
// 'user_id' => $user->id,
|
|
// 'value' => $num,
|
|
// 'info' => "买方增加",
|
|
// 'type' => AccountLog::TRANSACTIONIN_REDUCE_ADD,
|
|
// 'currency' => $currency_id
|
|
// ],$data_wallet4);
|
|
|
|
if ($num >= $out->number) {
|
|
$out->delete();
|
|
} else {
|
|
$out->number = bc_sub($out->number, $num, 5);
|
|
$out->save();
|
|
}
|
|
|
|
//插入完成记录
|
|
$complete = new TransactionComplete();
|
|
$complete->way = 2;
|
|
$complete->user_id = $user->id;
|
|
$complete->from_user_id = $out->user_id;
|
|
$complete->price = $out->price;
|
|
$complete->number = $num;
|
|
$complete->currency = $currency_id;
|
|
$complete->legal = $legal_id;
|
|
$complete->create_time = time();
|
|
$complete->save();
|
|
MarketHour::batchWriteMarketData($currency_id, $legal_id, $num, $out->price, 1);
|
|
}
|
|
|
|
public static function pushNews()
|
|
{
|
|
$data = self::orderBy('price', 'asc')->take(5)->get();
|
|
$send = array("type" => "in", "data" => $data, "content" => "");
|
|
return UserChat::sendChat($send);
|
|
}
|
|
|
|
/**
|
|
* 币种
|
|
*
|
|
* @return void
|
|
*/
|
|
public function currencycoin()
|
|
{
|
|
return $this->belongsTo('App\Currency', 'currency', 'id');
|
|
}
|
|
|
|
/**
|
|
* 法币币种
|
|
*
|
|
* @return void
|
|
*/
|
|
public function legalcoin()
|
|
{
|
|
return $this->belongsTo('App\Currency', 'legal', 'id');
|
|
}
|
|
|
|
public function getCurrencyNameAttribute()
|
|
{
|
|
return $this->currencycoin()->value('name');
|
|
}
|
|
|
|
public function getLegalNameAttribute()
|
|
{
|
|
return $this->legalcoin()->value('name');
|
|
}
|
|
|
|
//钱包的撮合交易 买入
|
|
public static function walletTransaction($out, $num, $user, $legal_id, $currency_id)
|
|
{
|
|
if (empty($out) || empty($num) || empty($user)) {
|
|
return false;
|
|
}
|
|
//买方法币
|
|
$to_legal = UsersWallet::where("user_id", $user->id)
|
|
->where("currency", $legal_id)
|
|
->first();
|
|
//卖方法币
|
|
$out_legal = UsersWallet::where("user_id", $out->user_id)
|
|
->where("currency", $legal_id)
|
|
->first();
|
|
//买方币
|
|
$to_currency = UsersWallet::where("user_id", $user->id)
|
|
->where("currency", $currency_id)
|
|
->first();
|
|
//卖方币
|
|
$out_currency = UsersWallet::where("user_id", $out->user_id)
|
|
->where("currency", $currency_id)
|
|
->first();
|
|
$out_user = Users::find($out->user_id);
|
|
|
|
if (empty($to_currency) || empty($out_currency) || empty($out_user) || empty($to_legal) || empty($out_legal)) {
|
|
return false;
|
|
}
|
|
|
|
if (bc_comp($num, $out->number) > 0) {
|
|
$num = $out->number;
|
|
}
|
|
|
|
$cny = bc_mul($num, $out->price, 5);
|
|
$data_wallet1 = [
|
|
'balance_type' => 1,
|
|
'wallet_id' => $to_legal->id,
|
|
'lock_type' => 0,
|
|
'create_time' => time(),
|
|
'before' => $to_legal->change_balance,
|
|
'change' => -$cny,
|
|
'after' => bc_sub($to_legal->change_balance, $cny, 5),
|
|
];
|
|
//扣除买方的交易币
|
|
|
|
$to_legal->change_balance = bc_sub($to_legal->change_balance, $cny, 5);
|
|
$to_legal->save();
|
|
AccountLog::insertLog([
|
|
'user_id' => $user->id,
|
|
'value' => -$cny,
|
|
'info' => "买入扣除法币",
|
|
'type' => AccountLog::TRANSACTIONIN_REDUCE,
|
|
'currency' => $legal_id
|
|
],$data_wallet1);
|
|
//扣除买方的法币的同事。扣除手续费
|
|
|
|
// Transaction::changeRate($user->id,$cny,$legal_id,'in');
|
|
|
|
$data_wallet2 = [
|
|
'balance_type' => 1,
|
|
'wallet_id' => $out_legal->id,
|
|
'lock_type' => 0,
|
|
'create_time' => time(),
|
|
'before' => $out_legal->change_balance,
|
|
'change' => $cny,
|
|
'after' => bc_add($out_legal->change_balance, $cny, 5),
|
|
];
|
|
//增加卖方法币
|
|
$out_legal->change_balance = bc_add($out_legal->change_balance, $cny, 5);
|
|
$out_legal->save();
|
|
AccountLog::insertLog([
|
|
'user_id' => $out->user_id,
|
|
'value' => $cny,
|
|
'info' => "卖方增加法币",
|
|
'type' => AccountLog::TRANSACTIONIN_SELLER_ADD,
|
|
'currency' => $legal_id
|
|
],$data_wallet2);
|
|
//卖出的同事,扣除手续费
|
|
// Transaction::changeRate($out->user_id,$cny,$legal_id,'out');
|
|
$data_wallet3 = [
|
|
'balance_type' => 2,
|
|
'wallet_id' => $out_currency->id,
|
|
'lock_type' => 1,
|
|
'create_time' => time(),
|
|
'before' => $out_currency->lock_change_balance,
|
|
'change' => -$num,
|
|
'after' => bc_sub($out_currency->lock_change_balance, $num, 5),
|
|
];
|
|
//扣除卖方的币
|
|
if (bc_comp($out_currency->lock_change_balance, $num) < 0) {
|
|
abort(403, '匹配到的卖方委托存在异常,委托编号:' . $out->id);
|
|
return false;
|
|
}
|
|
$out_currency->lock_change_balance = bc_sub($out_currency->lock_change_balance, $num, 5);
|
|
$out_currency->save();
|
|
AccountLog::insertLog([
|
|
'user_id' => $out->user_id,
|
|
'value' => -$num,
|
|
'info' => "扣除卖方",
|
|
'type' => AccountLog::TRANSACTIONIN_SELLER,
|
|
'currency' => $currency_id
|
|
],$data_wallet3);
|
|
|
|
|
|
$data_wallet4 = [
|
|
'balance_type' => 2,
|
|
'wallet_id' => $to_currency->id,
|
|
'lock_type' => 0,
|
|
'create_time' => time(),
|
|
'before' => $to_currency->change_balance,
|
|
'change' => $num,
|
|
'after' => bc_add($to_currency->change_balance, $num, 5),
|
|
];
|
|
//增加买方的币
|
|
$to_currency->change_balance = bc_add($to_currency->change_balance, $num, 5);
|
|
$to_currency->save();
|
|
|
|
AccountLog::insertLog([
|
|
'user_id' => $user->id,
|
|
'value' => $num,
|
|
'info' => "买方增加",
|
|
'type' => AccountLog::TRANSACTIONIN_REDUCE_ADD,
|
|
'currency' => $currency_id
|
|
],$data_wallet4);
|
|
|
|
if ($num >= $out->number) {
|
|
$out->delete();
|
|
} else {
|
|
$out->number = bc_sub($out->number, $num, 5);
|
|
$out->save();
|
|
}
|
|
|
|
//插入完成记录
|
|
$complete = new TransactionComplete();
|
|
$complete->way = 2;
|
|
$complete->user_id = $user->id;
|
|
$complete->from_user_id = $out->user_id;
|
|
$complete->price = $out->price;
|
|
$complete->number = $num;
|
|
$complete->currency = $currency_id;
|
|
$complete->legal = $legal_id;
|
|
$complete->create_time = time();
|
|
$complete->save();
|
|
//插入交易行情数据表
|
|
$total = TransactionComplete::where('currency', $currency_id)
|
|
->where('legal', $legal_id)
|
|
->where('create_time', '>=', strtotime(date('Y-m-d')))
|
|
->sum('number');
|
|
$data = [
|
|
'legal_id' => $legal_id,
|
|
'currency_id' => $currency_id,
|
|
'volume' => $total,
|
|
'now_price' => $out->price
|
|
];
|
|
CurrencyQuotation::updateTodayPriceTable($data);//
|
|
MarketHour::batchWriteMarketData($currency_id, $legal_id, $num, $out->price, 1);
|
|
}
|
|
}
|