You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1969 lines
78 KiB
1969 lines
78 KiB
<?php
|
|
|
|
namespace app\home\service;
|
|
|
|
use app\admin\service\AdminBaseService;
|
|
use app\home\validate\BankValidate;
|
|
use app\home\validate\WalletValidate;
|
|
use app\model\AccountFrozenModel;
|
|
use app\model\DrawalSettingModel;
|
|
use app\model\FeeSettingModel;
|
|
use app\model\RechargeApplyModel;
|
|
use app\model\StockMarketModel;
|
|
use app\model\UserArrearsModel;
|
|
use app\model\UserBankModel;
|
|
use app\model\UserContractModel;
|
|
use app\model\UserContractSecLogModel;
|
|
use app\model\UserContractSecModel;
|
|
use app\model\UserDigitalModel;
|
|
use app\model\UserForexLogModel;
|
|
use app\model\UserForexModel;
|
|
use app\model\UserHkdPreStockOrderModel;
|
|
use app\model\UserIdnPreStockOrderModel;
|
|
use app\model\UserInPreStockOrderModel;
|
|
use app\model\UserModel;
|
|
use app\model\UserMoneyLogModel;
|
|
use app\model\UserMoneyModel;
|
|
use app\model\UserMysPreStockOrderModel;
|
|
use app\model\UserSgdPreStockOrderModel;
|
|
use app\model\UserStockBrlLogModel;
|
|
use app\model\UserStockBrlModel;
|
|
use app\model\UserStockEurLogModel;
|
|
use app\model\UserStockEurModel;
|
|
use app\model\UserStockFundLogModel;
|
|
use app\model\UserStockFundModel;
|
|
use app\model\UserStockFurLogModel;
|
|
use app\model\UserStockFurModel;
|
|
use app\model\UserStockGBXModel;
|
|
use app\model\UserStockGBXLogModel;
|
|
use app\model\UserStockHkdLogModel;
|
|
use app\model\UserStockHkdModel;
|
|
use app\model\UserStockIdnLogModel;
|
|
use app\model\UserStockIdnModel;
|
|
use app\model\UserStockInLogModel;
|
|
use app\model\UserStockInModel;
|
|
use app\model\UserStockJpLogModel;
|
|
use app\model\UserStockJpModel;
|
|
use app\model\UserStockLogModel;
|
|
use app\model\UserContractLogModel;
|
|
use app\model\UserDigitalLogModel;
|
|
use app\model\UserStockModel;
|
|
use app\model\UserStockMysLogModel;
|
|
use app\model\UserStockMysModel;
|
|
use app\model\UserStockOptionInrLogModel;
|
|
use app\model\UserStockOptionInrModel;
|
|
use app\model\UserStockSgdLogModel;
|
|
use app\model\UserStockSgdModel;
|
|
use app\model\UserStockThaLogModel;
|
|
use app\model\UserStockThaModel;
|
|
use app\model\UserThaPreStockOrderModel;
|
|
use app\model\UserTransferModel;
|
|
use app\model\UserUsPreStockOrderModel;
|
|
use app\model\UserWalletaddressModel;
|
|
use app\model\UserWithdrawalModel;
|
|
use app\model\WalletListModel;
|
|
use app\utility\UnqId;
|
|
use think\facade\Cache;
|
|
use think\facade\Db;
|
|
|
|
class WalletService extends BaseHomeService
|
|
{
|
|
|
|
/**
|
|
* 获取用户资产数据列表
|
|
* @param $user_id
|
|
* @param $account_type
|
|
* 0表示全部,1表示现货,2表示合约,3表示美股
|
|
* @return array
|
|
*/
|
|
public function getUserAssets(int $user_id, int $account_type): array
|
|
{
|
|
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
|
|
$result=UserMoneyModel::getUserMoney($user_id);
|
|
}else{
|
|
$result=$this->getOldUserAssets($user_id,$account_type);
|
|
}
|
|
|
|
return $this->toData(0, 'Request successful.', $result);
|
|
}
|
|
protected function getOldUserAssets(int $user_id, int $account_type){
|
|
switch ($account_type) {
|
|
case 1:
|
|
$result = [
|
|
'digital' => $this->getUserDigital([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
case 2:
|
|
$result = [
|
|
'contract' => $this->getUserContract([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
// 美股
|
|
case 3:
|
|
$result = [
|
|
'contract' => $this->getUserUsStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
// 印尼股票
|
|
case 4:
|
|
$result = [
|
|
'contract' => $this->getUserIdnStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
// 马来西亚股票
|
|
case 5:
|
|
$result = [
|
|
'contract' => $this->getUserMysStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
// 泰股股票
|
|
case 6:
|
|
$result = [
|
|
'contract' => $this->getUserThaStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
|
|
case 7:
|
|
$result = [
|
|
'contract' => $this->getUserInStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
// 秒合约
|
|
case 8:
|
|
$result = [
|
|
'contract' => $this->getUserContractSec([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
//新加坡
|
|
case 9:
|
|
$result = [
|
|
'contract' => $this->getUserSgdStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
//基金
|
|
case 10:
|
|
$result = [
|
|
'contract' => $this->getUserFundStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
//印度期权
|
|
case 11:
|
|
$result = [
|
|
'contract' => $this->getUserInOption([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
//港股
|
|
case 12:
|
|
$result = [
|
|
'contract' => $this->getUserHkStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
case 14:
|
|
$result = [
|
|
'contract' => $this->getUserUkStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
case 15:
|
|
$result = [
|
|
'contract' => $this->getUserFurStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
case 16:
|
|
$result = [
|
|
'contract' => $this->getUserEurStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
case 17:
|
|
$result = [
|
|
'contract' => $this->getUserBrlStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
case 18:
|
|
$result = [
|
|
'contract' => $this->getUserJpStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
case 19:
|
|
$result = [
|
|
'contract' => $this->getUserForex([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
])
|
|
];
|
|
break;
|
|
default:
|
|
$result = [
|
|
'digital' => $this->getUserDigital([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'contract' => $this->getUserContract([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'forex' => $this->getUserForex([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'contract_sec' => $this->getUserContractSec([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'us_stock' => $this->getUserUsStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'idn_stock' => $this->getUserIdnStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'mys_stock' => $this->getUserMysStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'tha_stock' => $this->getUserThaStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'in_stock' => $this->getUserInStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'sgd_stock' => $this->getUserSgdStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'fund_stock' => $this->getUserFundStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'option_in_stock' => $this->getUserInOption([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'hk_stock' => $this->getUserHkStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'uk_stock' => $this->getUserUkStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'fur_stock' => $this->getUserFurStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'eur_stock' => $this->getUserEurStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'brl_stock' => $this->getUserBrlStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
'jp_stock' => $this->getUserJpStock([
|
|
'user_id' => $user_id,
|
|
'account_type' => $account_type
|
|
]),
|
|
];
|
|
break;
|
|
}
|
|
return $result;
|
|
}
|
|
protected function getNewUserAssets(int $user_id){
|
|
$res=UserMoneyModel::where('user_id',$user_id)->field('usable_num,frozen_num,stock_id as name')->select();
|
|
$result=[];
|
|
if(!empty($res)){
|
|
$result=$res->toArray();
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* 获取用户现货资产
|
|
* @param $user_id
|
|
* @param int $type 0全部资产,1只获取usdt资产
|
|
* @return array
|
|
*/
|
|
private function getUserDigital(array $data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserDigitalModel::getUserDigitalList($data['user_id']);
|
|
} else {
|
|
return UserDigitalModel::getUserDigitalByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取用户合约资产
|
|
* @param $data
|
|
* @return array
|
|
*/
|
|
private function getUserContract($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserContractModel::getUserContractList($data['user_id']);
|
|
} else {
|
|
return UserContractModel::getUserContractByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
/**
|
|
* 获取用户外汇资产
|
|
* @param $data
|
|
* @return array
|
|
*/
|
|
private function getUserForex($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserForexModel::getUserForexList($data['user_id']);
|
|
} else {
|
|
return UserForexModel::getUserForexByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取用户秒合约资产
|
|
* @param $data
|
|
* @return array
|
|
*/
|
|
private function getUserContractSec($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserContractSecModel::getUserContractList($data['user_id']);
|
|
} else {
|
|
return UserContractSecModel::getUserContractByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取用户美股资产
|
|
* @param $user_id
|
|
* @return array
|
|
*/
|
|
private function getUserStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取用户美股资产
|
|
* @param $user_id
|
|
* @return array
|
|
*/
|
|
private function getUserUsStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取用户印尼股票 资产
|
|
* @param $user_id
|
|
* @return array
|
|
*/
|
|
private function getUserIdnStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockIdnModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockIdnModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
private function getUserSgdStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockSgdModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockSgdModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
private function getUserFundStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockFundModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockFundModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取用户马来西亚股票 资产
|
|
* @param $user_id
|
|
* @return array
|
|
*/
|
|
private function getUserMysStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockMysModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockMysModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取用户马股股票 资产
|
|
* @param $user_id
|
|
* @return array
|
|
*/
|
|
private function getUserThaStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockThaModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockThaModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取用户印度股票 资产
|
|
* @param $user_id
|
|
* @return array
|
|
*/
|
|
private function getUserInStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockInModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockInModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取用户印度股票 资产
|
|
* @param $user_id
|
|
* @return array
|
|
*/
|
|
private function getUserHkStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockHkdModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockHkdModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
/**
|
|
* 获取用户印度股票 资产
|
|
* @param $user_id
|
|
* @return array
|
|
*/
|
|
private function getUserUkStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockGBXModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockGBXModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
private function getUserFurStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockFurModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockFurModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
private function getUserEurStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockEurModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockEurModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
private function getUserBrlStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockBrlModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockBrlModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
private function getUserJpStock($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockJpModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockJpModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取用户印度期权资产
|
|
* @param $user_id
|
|
* @return array
|
|
*/
|
|
private function getUserInOption($data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getUserBalance')->check($data);
|
|
if ($type == 0) {
|
|
return UserStockOptionInrModel::getUserStockList($data['user_id']);
|
|
} else {
|
|
return UserStockOptionInrModel::getUserStockByUserId($data);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取用户充值列表
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function getUserRechargeList(array $data): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getDrawalList')->check($data);
|
|
$list = RechargeApplyModel::getUserRecharge($data);
|
|
return $this->toData(0, 'Request successful.', $list);
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
public function getUserRechargeWallet(array $data): array
|
|
{
|
|
$list = WalletListModel::getUserWalletList([
|
|
'wallet_type' => $data['wallet_type']
|
|
]);
|
|
return $this->toData(0, 'Request successful.', $list);
|
|
}
|
|
|
|
/**
|
|
* 用户添加钱包地址
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function insertWalletAdress(array $data): array
|
|
{
|
|
try {
|
|
validate(BankValidate::class)->scene('setWalletAddress')->check($data);
|
|
UserWalletaddressModel::InsertUserWallet($data);
|
|
return $this->toData(0, 'Request successful.');
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取用户钱包地址列表
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function getUserWalletAddress(array $data): array
|
|
{
|
|
try {
|
|
validate(BankValidate::class)->scene('getWalletAddressList')->check($data);
|
|
$address_list = UserWalletaddressModel::getUserWalletList($data);
|
|
return $this->toData(0, 'Request successful.', $address_list);
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取用户钱包地址详情
|
|
* @param array $data
|
|
* @param int $type
|
|
* @return array
|
|
*
|
|
*/
|
|
public function getUserWalletAddressInfo(array $data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(BankValidate::class)->scene('getWalletAddressInfo')->check($data);
|
|
$address_info = UserWalletaddressModel::getUserWalletInfoById($data);
|
|
if ($type) {
|
|
return $address_info;
|
|
} else {
|
|
return $this->toData(0, 'Request successful.', $address_info);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 删除用户钱包地址
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function delUserWalletAddress(array $data): array
|
|
{
|
|
try {
|
|
validate(BankValidate::class)->scene('getWalletAddressInfo')->check($data);
|
|
UserWalletaddressModel::delUserWalletById($data);
|
|
return $this->toData(0, 'Request successful.');
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* 添加编辑银行卡
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function insertUserBank(array $data): array
|
|
{
|
|
try {
|
|
validate(BankValidate::class)->scene('setBank')->check($data);
|
|
UserBankModel::InsertUserBank($data);
|
|
return $this->toData(0, 'Request successful.');
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取银行卡列表
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function getUserBank(array $data): array
|
|
{
|
|
try {
|
|
validate(BankValidate::class)->scene('getBankList')->check($data);
|
|
$bank_list = UserBankModel::getUserBankList($data);
|
|
return $this->toData(0, 'Request successful.', $bank_list);
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取银行卡详情
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function getUserBankInfo(array $data, int $type = 0): array
|
|
{
|
|
try {
|
|
validate(BankValidate::class)->scene('getBankInfo')->check($data);
|
|
$bank_info = UserBankModel::getUserBankInfoById($data);
|
|
if ($type) {
|
|
return $bank_info;
|
|
} else {
|
|
return $this->toData(0, 'Request successful.', $bank_info);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 删除银行卡
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function delUserBank(array $data): array
|
|
{
|
|
try {
|
|
validate(BankValidate::class)->scene('getBankInfo')->check($data);
|
|
UserBankModel::delUserBankById($data);
|
|
return $this->toData(0, 'Request successful.');
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* 获取用户账户可用余额
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function getUserBalance(array $data): array
|
|
{
|
|
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
|
|
$usdt_info = UserMoneyModel::getUserUSDByUserId($data);
|
|
}else{
|
|
//账户类型:1现货,2合约,3美股 4 印尼股票 5 马来西呀 6 泰股 7印度股 8秒合约 9新加坡股 10基金 11印度期权 12港股
|
|
switch ($data['account_type']) {
|
|
case 2:
|
|
$usdt_info = $this->getUserContract($data, 1);
|
|
break;
|
|
case 3:
|
|
$usdt_info = $this->getUserUsStock($data, 1);
|
|
break;
|
|
case 4:
|
|
$usdt_info = $this->getUserIdnStock($data, 1);
|
|
break;
|
|
case 5:
|
|
$usdt_info = $this->getUserMysStock($data, 1);
|
|
break;
|
|
case 6:
|
|
$usdt_info = $this->getUserThaStock($data, 1);
|
|
break;
|
|
case 7:
|
|
$usdt_info = $this->getUserInStock($data, 1);
|
|
break;
|
|
case 8:
|
|
$usdt_info = $this->getUserContractSec($data, 1);
|
|
break;
|
|
case 9:
|
|
$usdt_info = $this->getUserSgdStock($data, 1);
|
|
break;
|
|
case 10:
|
|
$usdt_info = $this->getUserFundStock($data, 1);
|
|
break;
|
|
case 11:
|
|
$usdt_info = $this->getUserInOption($data, 1);
|
|
break;
|
|
case 12:
|
|
$usdt_info = $this->getUserHkStock($data, 1);
|
|
break;
|
|
case 14:
|
|
$usdt_info = $this->getUserUkStock($data, 1);
|
|
break;
|
|
case 15:
|
|
$usdt_info = $this->getUserFurStock($data, 1);
|
|
break;
|
|
case 16:
|
|
$usdt_info = $this->getUserEurStock($data, 1);
|
|
break;
|
|
case 17:
|
|
$usdt_info = $this->getUserBrlStock($data, 1);
|
|
break;
|
|
case 18:
|
|
$usdt_info = $this->getUserJpStock($data, 1);
|
|
break;
|
|
case 19:
|
|
$usdt_info = $this->getUserForex($data, 1);
|
|
break;
|
|
default:
|
|
$usdt_info = $this->getUserDigital($data, 1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return $this->toData(0, "ok", $usdt_info);
|
|
}
|
|
|
|
/**
|
|
* 获取手续费用
|
|
* @return array
|
|
*/
|
|
public function getDrawalFee(int $account_type = 0): array
|
|
{
|
|
$fee_info = DrawalSettingModel::getDrawalFee();
|
|
$info = FeeSettingModel::where('market_type', $account_type)->field('min_withdrawal_num,min_recharge_num')->find();
|
|
if(!empty($info)){
|
|
$info =$info->toArray();
|
|
$fee_info['min_drawal']=$info['min_withdrawal_num']>0 ? $info['min_withdrawal_num']: $fee_info['min_drawal'];
|
|
$fee_info['min_recharge']=$info['min_recharge_num']>0 ? $info['min_recharge_num']: $fee_info['min_recharge'];
|
|
}
|
|
return $this->toData(0, "ok",$fee_info);
|
|
}
|
|
|
|
/**
|
|
* 处理提款;处理流程: 1.提交提款申请 ->检查余额->将可用余额扣除提款金额及手续费,转入冻结余额
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function dealDrawalApply(array $data): array
|
|
{
|
|
//判断账号是否冻结
|
|
$isFrozen = AccountFrozenModel::where('user_id', $data['user_id'])->find();
|
|
if (!empty($isFrozen) && $isFrozen->frozen_withdraw == 1) {
|
|
return $this->toData('100110', 'The current account has been frozen', []);
|
|
}
|
|
//校验交易密码
|
|
$salt = env('ENCRYPT.SALT');
|
|
$name = env('WALLET.NAME');
|
|
$user_info = UserModel::getFieldsByUserId('trade_password,is_real', $data['user_id']);
|
|
if (empty($user_info['trade_password'])) {
|
|
return $this->toData(3, "Please set a transaction password first.");
|
|
}
|
|
if ($user_info['is_real'] == 0 && $name == 'STOCK') {
|
|
return $this->toData('20150', 'Please authenticate with real name first', []);
|
|
}
|
|
$check_pwd = (new UnqId())->checkPassword($data['trade_pwd'], $user_info['trade_password'], $salt);
|
|
if (!$check_pwd) {
|
|
return $this->toData(2, "Transaction password is incorrect.");
|
|
}
|
|
$flag = $this->checkOnlyOneNotEmpty($data['bank_id'], $data['address_id'], $data['wallet_address']);
|
|
if ($flag) {
|
|
//手续费
|
|
$fee = $this->getUserDrawalFee($data['apply_num'], $data['drawal_type']);
|
|
$pay_info = [];
|
|
if ($data['bank_id'] > 0) {
|
|
$pay_info = $this->getUserBankInfo(['user_id' => $data['user_id'], 'id' => $data['bank_id']], 1);
|
|
}
|
|
if ($data['address_id'] > 0) {
|
|
$pay_info = $this->getUserWalletAddressInfo(['user_id' => $data['user_id'], 'adr_id' => $data['address_id']], 1);
|
|
}
|
|
if (!empty($data['wallet_address'])) {
|
|
$pay_info['wallet_address'] = $data['wallet_address'];
|
|
}
|
|
if (empty($pay_info)) {
|
|
return $this->toData(1, 'The withdrawal information is incorrect.');
|
|
}
|
|
if ($data['account_type'] > 2 && ($data['account_type'] != 8)) {
|
|
$market_rate = (new StockMarketModel())->getRate($data['account_type']);
|
|
} else {
|
|
$market_rate = 1;
|
|
}
|
|
//提现金额
|
|
$apply_num = ($data['apply_num'] - $fee);
|
|
|
|
$apply_usd_num = round($apply_num / $market_rate, 4);
|
|
|
|
//印尼通道
|
|
$currency_rate = (new StockMarketModel())->getRate(4);
|
|
|
|
//扣手续费
|
|
$total_amount = round($apply_usd_num * $currency_rate, 4);
|
|
|
|
//事务开启, 查询用户资金
|
|
Db::startTrans();
|
|
try {
|
|
//查询提现资金账户信息
|
|
$from_account = $this->lockUserBalance($data['account_type'], $data['user_id']);
|
|
if (empty($from_account)) Db::rollback();
|
|
//换算汇率
|
|
//$change_num=$apply_num*$market_rate;
|
|
$change_num = $apply_num;
|
|
$cha_num = bcsub($from_account['usable_num'], $data['apply_num'], 18); //$from_account['usable_num']-$data['apply_num'];
|
|
if ($cha_num < 0) {
|
|
Db::rollback();
|
|
return $this->toData(1, 'Insufficient balance.');
|
|
}
|
|
|
|
//插入提款记录表
|
|
$drawal_data['user_id'] = $data['user_id'];
|
|
$drawal_data['order_no'] = $this->generateOrderNumber(20);
|
|
$drawal_data['account_type'] = $data['account_type'];
|
|
$drawal_data['apply_type'] = $data['apply_type'];
|
|
$drawal_data['apply_num'] = $apply_usd_num;
|
|
$drawal_data['service_fee'] = $fee;
|
|
$drawal_data['currency_rate'] = $currency_rate;
|
|
$drawal_data['pay_info'] = json_encode($pay_info);
|
|
$drawal_data['status'] = 0;
|
|
$drawal_data['country'] = $data['country'];
|
|
$drawal_data['drawal_type'] = $data['drawal_type'];
|
|
$drawal_data['market_amount'] = $data['apply_num'];
|
|
$drawal_data['total_amount'] = $apply_num;
|
|
UserWithdrawalModel::InsertUserDrawalLog($drawal_data);
|
|
|
|
//扣除用户资金
|
|
$from_update['usable_num'] = $cha_num;//round($cha_num,4);
|
|
$from_update['frozen_num'] = bcadd($from_account['frozen_num'], $data['apply_num'], 18);// round(($from_account['frozen_num']+$data['apply_num']),4);
|
|
$res = $this->updateUserBalance($data['account_type'], $from_update, $data['user_id']);
|
|
if (empty($res)) Db::rollback();
|
|
|
|
$log_data['user_id'] = $data['user_id'];
|
|
$log_data['change_type'] = 5; //冻结
|
|
$log_data['change_num'] = -$data['apply_num'];
|
|
$log_data['before_num'] = $from_account['usable_num'];
|
|
$log_data['order_id'] = $drawal_data['order_no'];
|
|
$res = $this->addUserBalanceLog($data['account_type'], $log_data);
|
|
if (empty($res)) Db::rollback();
|
|
Db::commit();
|
|
return $this->toData(0, 'Request successful.');
|
|
} catch (\Exception $exception) {
|
|
// 回滚事务
|
|
Db::rollback();
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
|
|
} else {
|
|
return $this->toData(1, "Please fill in the parameters according to the requirements.");
|
|
}
|
|
|
|
}
|
|
public function canncelDrawalApply(array $data): array
|
|
{
|
|
$order_info = UserWithdrawalModel::getUserDrawalInfo($data);
|
|
if ($order_info['status'] == 0) {
|
|
$obj = new AdminBaseService();
|
|
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
|
|
$updateStatus = $obj->updateUserAssetNew($order_info['user_id'], 6, $order_info['market_amount'], -$order_info['market_amount'], $order_info['order_no']);
|
|
}else{
|
|
$updateStatus = $obj->updateUserAsset($order_info['user_id'], $order_info['account_type'], 6, $order_info['market_amount'], -$order_info['market_amount'], $order_info['order_no']);
|
|
}
|
|
|
|
if (!empty($updateStatus) && $updateStatus['status'] == 200) {
|
|
UserWithdrawalModel::where($data)->update([
|
|
'status' => 5,
|
|
'update_time' => date('Y-m-d H:i:s')
|
|
]);
|
|
return $this->toData(0, 'Request successful.');
|
|
}else{
|
|
return $this->toData(500, "System error.");
|
|
}
|
|
} else {
|
|
return $this->toData(300, "Withdrawal orders cannot be cancelled.");
|
|
}
|
|
}
|
|
private function checkOnlyOneNotEmpty($value1, $value2, $value3): bool
|
|
{
|
|
$count = 0; // 用于计数非空值的个数
|
|
if (!empty($value1)) {
|
|
$count++;
|
|
}
|
|
if (!empty($value2)) {
|
|
$count++;
|
|
}
|
|
if (!empty($value3)) {
|
|
$count++;
|
|
}
|
|
// 如果非空值的个数等于1,则返回 true,否则返回 false
|
|
return $count == 1;
|
|
}
|
|
|
|
public function getDrawalList(array $data): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getDrawalList')->check($data);
|
|
$list = UserWithdrawalModel::getUserDrawalList($data);
|
|
return $this->toData(0, 'Request successful.', $list);
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 计算用户提现手续费用
|
|
* @param $money
|
|
* @param $type 1数字币,2银行卡
|
|
* @return float|int|mixed
|
|
*/
|
|
private function getUserDrawalFee($money, $type = 0)
|
|
{
|
|
$fee_info = DrawalSettingModel::getDrawalFee();
|
|
if ($type == 2) {
|
|
return $fee_info['bank_drawal_fee'] * $money;
|
|
} else {
|
|
return $fee_info['digital_drawal_fee'];
|
|
}
|
|
}
|
|
|
|
public function getUserBalanceRecord(array $data): array
|
|
{
|
|
$record_list = [];
|
|
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
|
|
$record_list=UserMoneyLogModel::getUserBalanceLog($data);
|
|
}else{
|
|
//账户类型:1现货,2合约,3美股
|
|
switch ($data['account_type']) {
|
|
case 1:
|
|
$record_list = UserDigitalLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 2:
|
|
$record_list = UserContractLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 3:
|
|
$record_list = UserStockLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 4:
|
|
// 印尼股票
|
|
$record_list = UserStockIdnLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 5:
|
|
// 马来股票
|
|
$record_list = UserStockMysLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 6:
|
|
// 泰国股票
|
|
$record_list = UserStockThaLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 7:
|
|
// 印度股票
|
|
$record_list = UserStockInLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 8:
|
|
// 秒合约
|
|
$record_list = UserContractSecLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 9:
|
|
// 新加坡
|
|
$record_list = UserStockSgdLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 10:
|
|
// 基金
|
|
$record_list = UserStockFundLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 11:
|
|
// 印度期权
|
|
$record_list = UserStockOptionInrLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 12:
|
|
// 香港
|
|
$record_list = UserStockHkdLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 14:
|
|
// 德国
|
|
$record_list = UserStockGBXLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 15:
|
|
// 法国
|
|
$record_list = UserStockFurLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 16:
|
|
// 英国
|
|
$record_list = UserStockEurLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 17:
|
|
// 巴西
|
|
$record_list = UserStockBrlLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 18:
|
|
// 巴西
|
|
$record_list = UserStockJpLogModel::getUserBalanceLog($data);
|
|
break;
|
|
case 19:
|
|
// 巴西
|
|
$record_list =UserForexLogModel::getUserBalanceLog($data);
|
|
break;
|
|
default:
|
|
return $this->toData(1, "Please fill in the parameters according to the requirements.");
|
|
break;
|
|
}
|
|
}
|
|
return $this->toData(0, "ok", $record_list);
|
|
}
|
|
|
|
/**
|
|
* 处理用户各资金账户相互划转
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function doUserTransfer(array $data): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('transfer')->check($data);
|
|
if ($data['from_account'] == $data['to_account']) {
|
|
return $this->toData('2', 'The transfer out and transfer in accounts cannot be the same account.');
|
|
}
|
|
//事务开启, 查询用户资金
|
|
Db::startTrans();
|
|
try {
|
|
//查询划转资金账户信息
|
|
$from_account = $this->lockUserBalance($data['from_account'], $data['user_id']);
|
|
if (empty($from_account)) {
|
|
Db::rollback();
|
|
return $this->toData('2', 'error');
|
|
}
|
|
|
|
//print_r($from_account);
|
|
|
|
$cha_num = $from_account['usable_num'] - $data['change_num'];
|
|
if ($cha_num < 0) {
|
|
Db::rollback();
|
|
return $this->toData(1, 'Insufficient balance.');
|
|
}
|
|
|
|
$to_num = $this->getRateToTransfer([
|
|
'from_account' => $data['from_account'],
|
|
'to_account' => $data['to_account'],
|
|
'change_num' => $data['change_num']
|
|
]);
|
|
|
|
$to_num_data = $to_num['data'];
|
|
if (!isset($to_num_data['to_change_num']) || !is_numeric($to_num_data['to_change_num']) || $to_num_data['to_change_num'] <= 0) {
|
|
return $to_num;
|
|
}
|
|
|
|
//查询转入资金账户信息
|
|
$to_account = $this->lockUserBalance($data['to_account'], $data['user_id']);
|
|
if (empty($to_account)) {
|
|
Db::rollback();
|
|
return $this->toData('2', 'error to_account ');
|
|
}
|
|
|
|
|
|
//插入账户资金划转表
|
|
$transfer_data['user_id'] = $data['user_id'];
|
|
$transfer_data['from_account'] = $data['from_account'];
|
|
$transfer_data['to_account'] = $data['to_account'];
|
|
$transfer_data['from_num'] = $data['change_num']; // 转出数量
|
|
$transfer_data['to_num'] = $to_num_data['to_change_num']; // 转入数量
|
|
$transfer_data['from_account_rate'] = $to_num_data['from_usd']; // 转出费率
|
|
$transfer_data['to_account_rate'] = $to_num_data['usd_to']; // 转入费率
|
|
$transfer_data['status'] = 1;
|
|
$transfer_data['order_sn'] = $this->generateOrderNumber(20);
|
|
UserTransferModel::InsertUserStock($transfer_data);
|
|
|
|
//更新划转资金账户余额
|
|
$from_update['usable_num'] = $cha_num;
|
|
$res = $this->updateUserBalance($data['from_account'], $from_update, $data['user_id']);
|
|
if (empty($res)) {
|
|
Db::rollback();
|
|
return $this->toData('2', 'error from_account transfer');
|
|
}
|
|
|
|
// 新增转入
|
|
$to_update['usable_num'] = $to_account['usable_num'] + $to_num_data['to_change_num'];
|
|
$res = $this->updateUserBalance($data['to_account'], $to_update, $data['user_id']);
|
|
if (empty($res)) {
|
|
Db::rollback();
|
|
return $this->toData('2', 'error to_account transfer ');
|
|
}
|
|
|
|
//变动类型:1-充值,2-提现,3-买入,4-卖出,5-冻结,6-解冻,7账户转出,8账户转入
|
|
//插入资金变动日志
|
|
|
|
$from_log['user_id'] = $data['user_id'];
|
|
$from_log['change_type'] = 7;
|
|
$from_log['change_num'] = -$data['change_num'];
|
|
$from_log['before_num'] = $from_account['usable_num'];
|
|
$from_log['order_id'] = $transfer_data['order_sn'];
|
|
$res = $this->addUserBalanceLog($data['from_account'], $from_log);
|
|
if (empty($res)) {
|
|
Db::rollback();
|
|
return $this->toData('2', 'error from_log transfer');
|
|
}
|
|
|
|
|
|
$to_log['user_id'] = $data['user_id'];
|
|
$to_log['change_type'] = 8;
|
|
$to_log['change_num'] = $to_num_data['to_change_num'];
|
|
$to_log['before_num'] = $to_account['usable_num'];
|
|
$to_log['order_id'] = $transfer_data['order_sn'];
|
|
$res = $this->addUserBalanceLog($data['to_account'], $to_log);
|
|
if (empty($res)) {
|
|
Db::rollback();
|
|
return $this->toData('2', 'error to_log transfer');
|
|
}
|
|
|
|
Db::commit();
|
|
|
|
return $this->toData(0, 'Request successful.');
|
|
} catch (\Exception $exception) {
|
|
// 回滚事务
|
|
Db::rollback();
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
|
|
}
|
|
|
|
public function lockUserBalance(int $account_type, int $user_id): array
|
|
{
|
|
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
|
|
return UserMoneyModel::getUserUSDLock($user_id);
|
|
}else{
|
|
switch ($account_type) {
|
|
case 1:
|
|
return UserDigitalModel::getUserDigitalLock($user_id);
|
|
break;
|
|
case 2:
|
|
return UserContractModel::getUserContractLock($user_id);
|
|
break;
|
|
case 3:
|
|
// 美股
|
|
return UserStockModel::getUserStockLock($user_id);
|
|
break;
|
|
case 4:
|
|
// 印尼 股
|
|
return UserStockIdnModel::getUserStockLock($user_id);
|
|
break;
|
|
case 5:
|
|
// 马来西亚 股
|
|
return UserStockMysModel::getUserStockLock($user_id);
|
|
break;
|
|
case 6:
|
|
// 泰 股
|
|
return UserStockThaModel::getUserStockLock($user_id);
|
|
break;
|
|
case 7:
|
|
// 印度 股
|
|
return UserStockInModel::getUserStockLock($user_id);
|
|
break;
|
|
case 8:
|
|
// 秒合约
|
|
return UserContractSecModel::getUserContractLock($user_id);
|
|
break;
|
|
case 9:
|
|
// 新加坡
|
|
return UserStockSgdModel::getUserStockLock($user_id);
|
|
break;
|
|
case 10:
|
|
// 基金
|
|
return UserStockFundModel::getUserStockLock($user_id);
|
|
break;
|
|
case 11:
|
|
// 印度期权
|
|
return UserStockOptionInrModel::getUserStockLock($user_id);
|
|
break;
|
|
case 12:
|
|
// 香港
|
|
return UserStockHkdModel::getUserStockLock($user_id);
|
|
break;
|
|
case 14:
|
|
// 英国
|
|
return UserStockGBXModel::getUserStockLock($user_id);
|
|
break;
|
|
case 15:
|
|
// 英国
|
|
return UserStockFurModel::getUserStockLock($user_id);
|
|
break;
|
|
case 16:
|
|
// 英国
|
|
return UserStockEurModel::getUserStockLock($user_id);
|
|
break;
|
|
case 17:
|
|
// 巴西
|
|
return UserStockBrlModel::getUserStockLock($user_id);
|
|
break;
|
|
case 18:
|
|
// 巴西
|
|
return UserStockJpModel::getUserStockLock($user_id);
|
|
break;
|
|
case 19:
|
|
// 巴西
|
|
return UserForexModel::getUserForexLock($user_id);
|
|
break;
|
|
default:
|
|
return [];
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public function updateUserBalance(int $account_type, array $update_data, int $user_id): bool
|
|
{
|
|
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
|
|
return UserMoneyModel::updateUserUSD($update_data,[
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'USD'
|
|
]);
|
|
}else{
|
|
switch ($account_type) {
|
|
case 1:
|
|
return UserDigitalModel::updateUserDigital($update_data, [
|
|
'user_id' => $user_id,
|
|
'digital_id' => 'USDT'
|
|
]);
|
|
break;
|
|
case 2:
|
|
return UserContractModel::updateUserContract($update_data, [
|
|
'user_id' => $user_id,
|
|
'contract_id' => 'USDT'
|
|
]);
|
|
break;
|
|
case 3:
|
|
return UserStockModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'USD'
|
|
]);
|
|
break;
|
|
case 4:
|
|
return UserStockIdnModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'IDR'
|
|
]);
|
|
break;
|
|
case 5:
|
|
return UserStockMysModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'MYR'
|
|
]);
|
|
break;
|
|
case 6:
|
|
return UserStockThaModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'THB'
|
|
]);
|
|
break;
|
|
case 7:
|
|
return UserStockInModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'INR'
|
|
]);
|
|
break;
|
|
case 8:
|
|
return UserContractSecModel::updateUserContract($update_data, [
|
|
'user_id' => $user_id,
|
|
'contract_id' => 'USDT'
|
|
]);
|
|
break;
|
|
case 9:
|
|
return UserStockSgdModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'SGD'
|
|
]);
|
|
break;
|
|
case 10:
|
|
return UserStockFundModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'USD'
|
|
]);
|
|
break;
|
|
case 11:
|
|
return UserStockOptionInrModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'INR'
|
|
]);
|
|
break;
|
|
case 12:
|
|
return UserStockHkdModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'HKD'
|
|
]);
|
|
break;
|
|
case 14:
|
|
return UserStockGBXModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'GBX'
|
|
]);
|
|
break;
|
|
case 15:
|
|
return UserStockFurModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'EUR'
|
|
]);
|
|
break;
|
|
case 16:
|
|
return UserStockEurModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'EUR'
|
|
]);
|
|
break;
|
|
case 17:
|
|
return UserStockBrlModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'BRL'
|
|
]);
|
|
break;
|
|
case 18:
|
|
return UserStockJpModel::updateUserStock($update_data, [
|
|
'user_id' => $user_id,
|
|
'stock_id' => 'JPY'
|
|
]);
|
|
break;
|
|
case 19:
|
|
return UserForexModel::updateUserForex($update_data, [
|
|
'user_id' => $user_id,
|
|
'contract_id' => 'USD'
|
|
]);
|
|
break;
|
|
default:
|
|
return false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public function addUserBalanceLog(int $account_type, array $log_data): bool
|
|
{
|
|
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
|
|
$log_data['stock_id'] = 'USD';
|
|
return UserMoneyLogModel::InsertUserBalanceLog($log_data);
|
|
}else{
|
|
switch ($account_type) {
|
|
case 1:
|
|
$log_data['digital_id'] = 'USDT';
|
|
return UserDigitalLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 2:
|
|
$log_data['contract_id'] = 'USDT';
|
|
return UserContractLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 3:
|
|
$log_data['stock_id'] = 'USD';
|
|
return UserStockLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 4:
|
|
$log_data['stock_id'] = 'IDR';
|
|
return UserStockIdnLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 5:
|
|
$log_data['stock_id'] = 'MYR';
|
|
return UserStockMysLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 6:
|
|
$log_data['stock_id'] = 'THB';
|
|
return UserStockThaLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 7:
|
|
$log_data['stock_id'] = 'INR';
|
|
return UserStockInLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 8:
|
|
$log_data['contract_id'] = 'USDT';
|
|
return UserContractSecLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 9:
|
|
$log_data['stock_id'] = 'SGD';
|
|
return UserStockSgdLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 10:
|
|
$log_data['stock_id'] = 'USD';
|
|
return UserStockFundLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 11:
|
|
$log_data['stock_id'] = 'INR';
|
|
return UserStockOptionInrLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 12:
|
|
$log_data['stock_id'] = 'HKD';
|
|
return UserStockHkdLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 14:
|
|
$log_data['stock_id'] = 'GBX';
|
|
return UserStockGBXLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 15:
|
|
$log_data['stock_id'] = 'EUR';
|
|
return UserStockFurLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 16:
|
|
$log_data['stock_id'] = 'EUR';
|
|
return UserStockEurLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 17:
|
|
$log_data['stock_id'] = 'BRL';
|
|
return UserStockBrlLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 18:
|
|
$log_data['stock_id'] = 'JPY';
|
|
return UserStockJpLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
case 19:
|
|
$log_data['contract_id'] = 'USD';
|
|
return UserForexLogModel::InsertUserBalanceLog($log_data);
|
|
break;
|
|
default:
|
|
return false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* 获取用户资金划转明细
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function getUserTransfer(array $data): array
|
|
{
|
|
try {
|
|
validate(WalletValidate::class)->scene('getRechargeList')->check($data);
|
|
$list = UserTransferModel::getUserTransferList($data);
|
|
return $this->toData(0, 'Request successful.', $list);
|
|
} catch (ValidateException $validateException) {
|
|
$message = $validateException->getMessage();
|
|
return $this->toData('1', $message, []);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
}
|
|
public function userHasNotPay(array $data):array
|
|
{
|
|
if (!empty($data['market_type'])) {
|
|
$table_obj = (new \app\admin\service\setting\IPOService())->getStockModel($data['market_type']);
|
|
if (empty($table_obj)) {
|
|
return $this->toData(1, 'system error.');
|
|
}
|
|
$list = UserArrearsModel::where('user_id', $data['user_id'])->where('status', 0)->where('account_type', $data['market_type'])->select();
|
|
} else {
|
|
$list = UserArrearsModel::where('user_id', $data['user_id'])->where('status', 0)->select();
|
|
}
|
|
if (empty($list)) {
|
|
$list = [];
|
|
} else {
|
|
$list = $list->toArray();
|
|
foreach ($list as $key => $val) {
|
|
$table_obj = (new \app\admin\service\setting\IPOService())->getStockModel($val['account_type']);
|
|
$order = Db::table($table_obj['order_table'])->where('order_no', $val['order_no'])->find();
|
|
if ($order) {
|
|
$list[$key]['get_num'] = $order['get_num'];
|
|
$list[$key]['get_amount'] = $order['get_amount'];
|
|
$list[$key]['get_fee'] = $order['get_fee'];
|
|
$list[$key]['stock_code'] = Db::table($table_obj['stock_table'])->where('id', $order['pre_stock_id'])->value('stock_code');
|
|
}
|
|
|
|
}
|
|
}
|
|
return $this->toData(0, 'Request successful.', $list);
|
|
}
|
|
|
|
|
|
public function dealUnPayIPO(array $data):array
|
|
{
|
|
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
|
|
$this->dealUnPayIPOByNew($data);
|
|
}else{
|
|
$this->dealUnPayIPOByOld($data);
|
|
}
|
|
|
|
return $this->toData(0, 'Request successful.',[]);
|
|
}
|
|
public function dealUnPayIPOByOld($data){
|
|
$total=UserArrearsModel::where('user_id',$data['user_id'])->where('account_type',$data['market_type'])->where('status',0)->sum('num');
|
|
$table_obj=(new \app\admin\service\setting\IPOService())->getStockModel($data['market_type']);
|
|
$res=Db::table($table_obj['user_table'])->where('user_id',$data['user_id'])->where('stock_id',$table_obj['stock_id'])
|
|
->where('usable_num','>=',$total)->find();
|
|
if(empty($res)){
|
|
return $this->toData(1, 'The balance is not enough.');
|
|
}
|
|
|
|
$order_list=UserArrearsModel::where('user_id',$data['user_id'])->where('account_type',$data['market_type'])->select();
|
|
$nowDate=date('Y-m-d H:i:s');
|
|
Db::startTrans();
|
|
//扣钱
|
|
$update_bool = Db::table($table_obj['user_table'])->where('stock_id', $table_obj['stock_id'])->where('user_id', $data['user_id'])
|
|
->dec('usable_num', $total)
|
|
->update(['update_time' => $nowDate]);
|
|
if(!$update_bool){
|
|
Db::rollback();
|
|
return $this->toData('1', 'system error0', []);
|
|
}
|
|
|
|
|
|
foreach ($order_list as $order){
|
|
//生成支付流水
|
|
$insertStockLogArr = [
|
|
'user_id' => $order['user_id'],
|
|
'change_type' => 15, // 新股申购扣减费用
|
|
'stock_id' => $table_obj['stock_id'],
|
|
'before_num' => 0,
|
|
'change_num' => '-' . Db::table($table_obj['order_table'])->where('order_no',$order['order_no'])->value('get_amount'),
|
|
'order_id' => $order['order_no'],
|
|
'create_time' => $nowDate,
|
|
'update_time' => $nowDate
|
|
];
|
|
$log_bool = Db::table($table_obj['log_table'])->insert($insertStockLogArr);
|
|
if(!$log_bool){
|
|
Db::rollback();
|
|
return $this->toData('1', 'system error1', []);
|
|
}
|
|
// 生成扣手续流水
|
|
$insertStockLogArrFee = [
|
|
'user_id' => $order['user_id'],
|
|
'change_type' => 16, // 新股申购扣减费用
|
|
'stock_id' => $table_obj['stock_id'],
|
|
'before_num' => 0,
|
|
'change_num' => '-' . Db::table($table_obj['order_table'])->where('order_no',$order['order_no'])->value('get_fee'),
|
|
'order_id' => $order['order_no'],
|
|
'create_time' => $nowDate,
|
|
'update_time' => $nowDate
|
|
];
|
|
$fee_bool = Db::table($table_obj['log_table'])->insert($insertStockLogArrFee);
|
|
if (!$fee_bool) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'system error2', []);
|
|
}
|
|
//更新状态
|
|
$status_bool=UserArrearsModel::where('user_id',$order['user_id'])->where('order_no',$order['order_no'])->update([
|
|
'status'=>1,
|
|
'update_time'=>$nowDate
|
|
]);
|
|
if (!$status_bool) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'system error2', []);
|
|
}
|
|
//更新订单状态
|
|
if(env('USER_ARREARS.HAS_USER_ARREARS')==3){
|
|
$sign_status=Db::table($table_obj['stock_table'])->where('id',$order['pre_stock_id'])->value('sign_status');
|
|
$order_bool=Db::table($table_obj['order_table'])->where('order_no',$order['order_no'])->where('user_id',$order['user_id'])
|
|
->update([
|
|
'status'=> $sign_status==1 ? 2:3,
|
|
'update_time'=>$nowDate
|
|
]);
|
|
if (!$order_bool) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'system error3'.Db::table($table_obj['order_table'])->getLastSql(), []);
|
|
}
|
|
}
|
|
|
|
//删除缓存订单
|
|
$key="USER:ARREAR:ORDER:".$order['order_no'];
|
|
Cache::store('redis')->delete($key);
|
|
}
|
|
|
|
Db::commit();
|
|
|
|
}
|
|
public function dealUnPayIPOByNew($data){
|
|
$total=UserArrearsModel::where('user_id',$data['user_id'])->where('account_type',$data['market_type'])->where('status',0)->sum('num');
|
|
$table_obj=(new \app\admin\service\setting\IPOService())->getStockModel($data['market_type']);
|
|
$usd_total=0;
|
|
$rate = (new StockMarketModel())->getRate($data['market_type']);
|
|
$usd_total=$total/$rate;
|
|
$res=UserMoneyModel::where('user_id',$data['user_id'])->where('stock_id','USD')
|
|
->where('usable_num','>=',$usd_total)->find();
|
|
if(empty($res)){
|
|
return $this->toData(1, 'The balance is not enough.');
|
|
}
|
|
|
|
$order_list=UserArrearsModel::where('user_id',$data['user_id'])->where('account_type',$data['market_type'])->select();
|
|
$nowDate=date('Y-m-d H:i:s');
|
|
Db::startTrans();
|
|
//扣钱
|
|
$update_bool = UserMoneyModel::where('stock_id', 'USD')->where('user_id', $data['user_id'])
|
|
->dec('usable_num', $usd_total)
|
|
->update(['update_time' => $nowDate]);
|
|
if(!$update_bool){
|
|
Db::rollback();
|
|
return $this->toData('1', 'system error0', []);
|
|
}
|
|
|
|
|
|
foreach ($order_list as $order){
|
|
//生成支付流水
|
|
$amount= Db::table($table_obj['order_table'])->where('order_no',$order['order_no'])->value('get_amount');
|
|
$usd_amount=$amount/$rate;
|
|
$insertStockLogArr = [
|
|
'user_id' => $order['user_id'],
|
|
'change_type' => 15, // 新股申购扣减费用
|
|
'stock_id' => $table_obj['stock_id'],
|
|
'before_num' => 0,
|
|
'change_num' => '-' .$usd_amount,
|
|
'order_id' => $order['order_no'],
|
|
'create_time' => $nowDate,
|
|
'update_time' => $nowDate,
|
|
'market_type' => $data['market_type']
|
|
];
|
|
$log_bool = UserMoneyLogModel::InsertUserBalanceLog($insertStockLogArr);
|
|
if(!$log_bool){
|
|
Db::rollback();
|
|
return $this->toData('1', 'system error1', []);
|
|
}
|
|
// 生成扣手续流水
|
|
$fee=Db::table($table_obj['order_table'])->where('order_no',$order['order_no'])->value('get_fee');
|
|
$usd_fee= $fee/$rate;
|
|
$insertStockLogArrFee = [
|
|
'user_id' => $order['user_id'],
|
|
'change_type' => 16, // 新股申购扣减费用
|
|
'stock_id' => $table_obj['stock_id'],
|
|
'before_num' => 0,
|
|
'change_num' => '-' . $usd_fee,
|
|
'order_id' => $order['order_no'],
|
|
'create_time' => $nowDate,
|
|
'update_time' => $nowDate,
|
|
'market_type' => $data['market_type']
|
|
];
|
|
$fee_bool =UserMoneyLogModel::InsertUserBalanceLog($insertStockLogArrFee);
|
|
if (!$fee_bool) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'system error2', []);
|
|
}
|
|
|
|
//更新状态
|
|
$status_bool=UserArrearsModel::where('user_id',$order['user_id'])->where('order_no',$order['order_no'])->update([
|
|
'status'=>1,
|
|
'update_time'=>$nowDate
|
|
]);
|
|
if (!$status_bool) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'system error2', []);
|
|
}
|
|
//更新订单状态
|
|
if(env('USER_ARREARS.HAS_USER_ARREARS')==3){
|
|
$sign_status=Db::table($table_obj['stock_table'])->where('id',$order['pre_stock_id'])->value('sign_status');
|
|
$order_bool=Db::table($table_obj['order_table'])->where('order_no',$order['order_no'])->where('user_id',$order['user_id'])
|
|
->update([
|
|
'status'=> $sign_status==1 ? 2:3,
|
|
'update_time'=>$nowDate
|
|
]);
|
|
if (!$order_bool) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'system error3'.Db::table($table_obj['order_table'])->getLastSql(), []);
|
|
}
|
|
}
|
|
|
|
//删除缓存订单
|
|
$key="USER:ARREAR:ORDER:".$order['order_no'];
|
|
Cache::store('redis')->delete($key);
|
|
}
|
|
|
|
Db::commit();
|
|
}
|
|
// 获取账户之间划转手续费
|
|
public function getRateToTransfer($data)
|
|
{
|
|
try {
|
|
// 1 现货 2 合约 3 美股 4 印尼股 5 马股 6 泰股 7 印度
|
|
$fromAccount = $data['from_account'];
|
|
$toAccount = $data['to_account'];
|
|
|
|
if($fromAccount <1 || $fromAccount > 20){
|
|
return $this->toData('2', 'Transfer out account type is incorrect.');
|
|
}
|
|
if($toAccount <1 || $toAccount > 20){
|
|
return $this->toData('2', 'Transfer out account type is incorrect.');
|
|
}
|
|
|
|
if ($fromAccount == $toAccount) {
|
|
return $this->toData('2', 'The transfer out and transfer in accounts cannot be the same account.');
|
|
}
|
|
|
|
// 转出地址对美元的汇率
|
|
$fromRate = (new StockMarketModel())->getRate($fromAccount);
|
|
$toRate = (new StockMarketModel())->getRate($toAccount);
|
|
|
|
if ($fromRate <= 0) {
|
|
return $this->toData('2', 'Transfer out account type is incorrect.');
|
|
}
|
|
|
|
if ($toRate <= 0) {
|
|
return $this->toData('2', 'Transfer in account type is incorrect.');
|
|
}
|
|
|
|
// 是否传递转账数量
|
|
$toChangeNum = '-';
|
|
if (!empty($data['change_num']) && is_numeric($data['change_num']) && $data['change_num'] > 0) {
|
|
// 转出数量计算 change_num / from_rate * to_rate
|
|
$toChangeNum = bcmul(bcdiv($data['change_num'], $fromRate, 6), $toRate, 6);
|
|
}
|
|
return $this->toData('0', 'SUCCESS', [
|
|
'from_usd' => $fromRate,
|
|
'usd_to' => $toRate,
|
|
'to_change_num' => $toChangeNum
|
|
]);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('100500', 'The system is busy. Please try again later.', [$exception->getMessage(), $exception->getTrace()]);
|
|
}
|
|
|
|
}
|
|
}
|