15 changed files with 371 additions and 125 deletions
@ -0,0 +1,23 @@ |
|||||
|
<?php |
||||
|
namespace app\admin\controller\setting; |
||||
|
use app\admin\controller\AdminBaseController; |
||||
|
use app\admin\service\setting\GoldFuturesService; |
||||
|
|
||||
|
class GoldFutures extends AdminBaseController |
||||
|
{ |
||||
|
// 印度股指名称列表 |
||||
|
public function getTradeNameList() |
||||
|
{ |
||||
|
$result = (new GoldFuturesService())->getTradeNameList(); |
||||
|
return json($result); |
||||
|
} |
||||
|
|
||||
|
// 黄金期货列表 |
||||
|
public function goldFuturesList() |
||||
|
{ |
||||
|
$result = (new GoldFuturesService())->inrStockIndexList($this->request->param()); |
||||
|
return json($result); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,53 @@ |
|||||
|
<?php |
||||
|
namespace app\admin\service\setting; |
||||
|
|
||||
|
use app\admin\service\AdminBaseService; |
||||
|
use app\model\GoldFuturesListModel; |
||||
|
|
||||
|
class GoldFuturesService extends AdminBaseService |
||||
|
{ |
||||
|
// 获取黄金期货交易对列表 |
||||
|
public function getTradeNameList() |
||||
|
{ |
||||
|
try { |
||||
|
$list = GoldFuturesListModel::where('status', 1)->order('id', 'desc')->column('name', 'id'); |
||||
|
return $this->toData('0', 'SUCCESS', ['list' => $list]); |
||||
|
} catch (\Exception $e) { |
||||
|
return $this->toData('1', '系统繁忙', [$e->getMessage(), $e->getTrace()]); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 黄金期货列表 |
||||
|
public function inrStockIndexList($param): array |
||||
|
{ |
||||
|
try { |
||||
|
if (empty($param['page']) || empty($param['limit'])) { |
||||
|
return $this->toData('400', '缺少必要参数'); |
||||
|
} |
||||
|
|
||||
|
$where = []; |
||||
|
if (!empty($param['trade_name'])) { |
||||
|
$where[] = ['trade_name', 'like', '%' . $param['trade_name'] . '%']; |
||||
|
} |
||||
|
$list = GoldFuturesListModel::where($where)->order('id', 'desc')->paginate([ |
||||
|
'page' => $param['page'], |
||||
|
'list_rows' => $param['limit'], |
||||
|
]); |
||||
|
|
||||
|
$tapeList = (new IPOService())->getStockTape(20); |
||||
|
|
||||
|
return $this->toData('0', 'SUCCESS', [ |
||||
|
'list' => $list->items(), |
||||
|
'total' => $list->total(), |
||||
|
'page' => $list->currentPage(), |
||||
|
'last_page' => $list->lastPage(), |
||||
|
'extend' => [ |
||||
|
'tape_list' => $tapeList['tape'], |
||||
|
'source_list' => $tapeList['source'] ?? [], |
||||
|
] |
||||
|
]); |
||||
|
} catch (\Exception $e) { |
||||
|
return $this->toData('500', '系统繁忙', [$e->getMessage(), $e->getTrace()]); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -1,79 +0,0 @@ |
|||||
<?php |
|
||||
|
|
||||
namespace app\model; |
|
||||
|
|
||||
/** |
|
||||
* @property int id |
|
||||
* @property string trade_name |
|
||||
* @property string status |
|
||||
* @property string is_owner |
|
||||
* @property string logo_link |
|
||||
* @property string face_value |
|
||||
* @property string info |
|
||||
* @property string sort |
|
||||
* @property string min_pry |
|
||||
* @property string max_pry |
|
||||
* @property string compel_num |
|
||||
* @property string keep_decimal |
|
||||
* @property string create_time |
|
||||
* @property string update_time |
|
||||
*/ |
|
||||
class ForexListMode extends BaseModel |
|
||||
{ |
|
||||
|
|
||||
protected $name = 'forex_list'; |
|
||||
protected $pk = 'id'; |
|
||||
|
|
||||
public static function getMarketList($data): array |
|
||||
{ |
|
||||
$where=[ |
|
||||
['status','=',1] |
|
||||
]; |
|
||||
if(!empty($data['trade_name'])){ |
|
||||
$where[]=[ |
|
||||
'trade_name','like',strtoupper($data['trade_name']).'%' |
|
||||
]; |
|
||||
} |
|
||||
if($data['page']<1){ |
|
||||
$data['page']=1; |
|
||||
} |
|
||||
if($data['page_size']<1){ |
|
||||
$data['page_size']=10; |
|
||||
} |
|
||||
|
|
||||
$count=self::where($where)->count(); |
|
||||
$list = self::where($where)->field('trade_name as name,trade_name as code')->page($data['page'],$data['page_size'])->select(); |
|
||||
if(empty($list)){ |
|
||||
return []; |
|
||||
} |
|
||||
return [ |
|
||||
'total'=>$count, |
|
||||
'list'=>$list->toArray(), |
|
||||
]; |
|
||||
} |
|
||||
public static function existMarket($trade_name):bool |
|
||||
{ |
|
||||
$id=self::where('trade_name',$trade_name)->value('id'); |
|
||||
return $id >0; |
|
||||
} |
|
||||
public static function getMarketFaceList($type=0) |
|
||||
{ |
|
||||
$list=self::where('status',1)->field('face_value,trade_name as name,trade_name as code,sort,max_pry,min_pry')->select(); |
|
||||
if(empty($list)){ |
|
||||
return []; |
|
||||
} |
|
||||
$list=$list->toArray(); |
|
||||
if($type==1){ |
|
||||
foreach ($list as $val){ |
|
||||
$face_list[$val['name']]=$val['face_value']; |
|
||||
} |
|
||||
}else{ |
|
||||
$face_list=$list; |
|
||||
} |
|
||||
|
|
||||
return $face_list; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
|
|
||||
} |
|
@ -0,0 +1,7 @@ |
|||||
|
<?php |
||||
|
namespace app\model; |
||||
|
|
||||
|
class GoldFuturesListModel extends BaseModel |
||||
|
{ |
||||
|
protected $name = 'gold_futures_list'; |
||||
|
} |
@ -0,0 +1,71 @@ |
|||||
|
<?php |
||||
|
namespace app\model; |
||||
|
|
||||
|
class GoldFuturesTradeModel extends BaseModel |
||||
|
{ |
||||
|
protected $name = 'gold_futures_trade'; |
||||
|
protected $pk = 'trade_id'; |
||||
|
|
||||
|
// 获取持仓成本 |
||||
|
public static function getTradeOrderBuyNum(int $user_id,string $contract_id,int $trade_type) |
||||
|
{ |
||||
|
$num=0; |
||||
|
$money=0; |
||||
|
//查询持仓订单总成本 |
||||
|
$list=self::where([ |
||||
|
'user_id'=>$user_id, |
||||
|
'status'=>1, |
||||
|
'contract_id'=>$contract_id, |
||||
|
'trade_type'=>$trade_type |
||||
|
])->field('order_number,deal_price,service_cost')->select(); |
||||
|
if(!empty($list)) { |
||||
|
$list_arr=$list->toArray(); |
||||
|
foreach ($list_arr as $val){ |
||||
|
$order_num=$val['order_number']*$val['deal_price'] ;//+ $val['service_cost']; |
||||
|
$money+=$order_num; |
||||
|
$num+=$val['order_number']; |
||||
|
} |
||||
|
} |
||||
|
return [ |
||||
|
'buy_num'=>$num, |
||||
|
'buy_money'=>$money |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// 获取累计盈亏 |
||||
|
public static function getTradeOrderDailyNum(int $user_id) |
||||
|
{ |
||||
|
$num=0; |
||||
|
//查询持仓订单总成本 |
||||
|
$list=self::where([ |
||||
|
'user_id'=>$user_id, |
||||
|
'status'=>3 |
||||
|
])->field('order_number,closing_price,deal_price,closing_cost,service_cost,trade_type')->select(); |
||||
|
if(!empty($list)) { |
||||
|
$list_arr=$list->toArray(); |
||||
|
foreach ($list_arr as $val){ |
||||
|
if($val['trade_type']==1){ |
||||
|
$order_num=$val['order_number']*($val['closing_price']-$val['deal_price']); |
||||
|
}else{ |
||||
|
$order_num=$val['order_number']*($val['deal_price']-$val['closing_price']); |
||||
|
} |
||||
|
$num+=$order_num; |
||||
|
} |
||||
|
} |
||||
|
return $num; |
||||
|
} |
||||
|
|
||||
|
public static function getTradeOrderFee(int $user_id) |
||||
|
{ |
||||
|
$info=self::where([ |
||||
|
['user_id','=',$user_id], |
||||
|
['status','in',[1,3]] |
||||
|
])->field('sum(service_cost+closing_cost) as fee')->find(); |
||||
|
if(empty($info)){ |
||||
|
return 0; |
||||
|
}else{ |
||||
|
$info=$info->toArray(); |
||||
|
return empty($info['fee']) ? 0 : $info['fee']; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,105 @@ |
|||||
|
<?php |
||||
|
namespace app\model; |
||||
|
|
||||
|
class UserGoldFuturesModel extends BaseModel |
||||
|
{ |
||||
|
protected $name = 'user_gold_futures'; |
||||
|
|
||||
|
public static function getUserGoldFuturesLock(int $user_id,string $contract_id ='GC'):array |
||||
|
{ |
||||
|
$info = self::where([ |
||||
|
'user_id'=>$user_id, |
||||
|
'contract_id'=>$contract_id |
||||
|
])->lock(true)->find(); |
||||
|
if(empty($info)){ |
||||
|
// 如果没有则创建 |
||||
|
$info = new self; |
||||
|
$info->user_id = $user_id; |
||||
|
$info->contract_id = $contract_id; |
||||
|
$info->usable_num = 0; |
||||
|
$info->frozen_num = 0; |
||||
|
$info->create_time = date('Y-m-d H:i:s'); |
||||
|
$info->update_time = date('Y-m-d H:i:s'); |
||||
|
$info->save(); |
||||
|
} |
||||
|
return $info->toArray(); |
||||
|
} |
||||
|
|
||||
|
public static function getUserGoldFutureByUserId(array $data):array |
||||
|
{ |
||||
|
if(!empty($data['trade_name'])){ |
||||
|
$contract_id = $data['trade_name']; |
||||
|
}else{ |
||||
|
$contract_id = 'GC'; |
||||
|
} |
||||
|
$info = self::where([ |
||||
|
'user_id' => $data['user_id'], |
||||
|
'contract_id' => $contract_id |
||||
|
])->field('usable_num,frozen_num,contract_id as name')->find(); |
||||
|
if(empty($info)){ |
||||
|
$info = new self; |
||||
|
$info->user_id = $data['user_id']; |
||||
|
$info->contract_id = $contract_id; |
||||
|
$info->usable_num = 0; |
||||
|
$info->frozen_num = 0; |
||||
|
$info->create_time = date('Y-m-d H:i:s'); |
||||
|
$info->update_time = date('Y-m-d H:i:s'); |
||||
|
$info->save(); |
||||
|
} |
||||
|
return $info->toArray(); |
||||
|
} |
||||
|
|
||||
|
public static function getUserGoldFuturesList(int $user_id):array |
||||
|
{ |
||||
|
$list = self::where([ |
||||
|
'user_id' => $user_id, |
||||
|
])->field('usable_num,frozen_num,contract_id as name')->select(); |
||||
|
if($list->isEmpty()){ |
||||
|
$self = new self; |
||||
|
$self->user_id = $user_id; |
||||
|
$self->contract_id = 'GC'; |
||||
|
$self->usable_num = '0'; |
||||
|
$self->frozen_num = '0'; |
||||
|
$self->create_time = date('Y-m-d H:i:s'); |
||||
|
$self->update_time = date('Y-m-d H:i:s'); |
||||
|
$self->save(); |
||||
|
|
||||
|
$list = self::where([ |
||||
|
'user_id'=>$user_id, |
||||
|
])->field('usable_num,frozen_num,contract_id as name')->select(); |
||||
|
} |
||||
|
foreach ($list as $key=>$val){ |
||||
|
if($val['name']=='GC'){ |
||||
|
$list[$key]['buy_up']=[ |
||||
|
'buy_num'=>0, |
||||
|
'buy_money'=>0 |
||||
|
]; |
||||
|
$list[$key]['buy_down']=[ |
||||
|
'buy_num'=>0, |
||||
|
'buy_money'=>0 |
||||
|
]; |
||||
|
}else{ |
||||
|
//获取持仓成本 |
||||
|
$list[$key]['buy_up']=GoldFuturesTradeModel::getTradeOrderBuyNum($user_id,$val['name'],1); |
||||
|
$list[$key]['buy_down']=GoldFuturesTradeModel::getTradeOrderBuyNum($user_id,$val['name'],2); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
//获取平仓累计盈亏 |
||||
|
$daily_num=GoldFuturesTradeModel::getTradeOrderDailyNum($user_id); |
||||
|
$earnest_money=0; |
||||
|
$fee_num=GoldFuturesTradeModel::getTradeOrderFee($user_id); |
||||
|
return [ |
||||
|
'earnest_money'=>(float)$earnest_money,//保证金 |
||||
|
'daily_num'=>$daily_num,//累计盈亏 |
||||
|
'fee_num'=>$fee_num,//累计盈亏 |
||||
|
'list'=>$list->toArray() |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
public static function updateUserGoldFutures(array $update_data,array $where) |
||||
|
{ |
||||
|
$update_data['update_time']=date('Y-m-d H:i:s'); |
||||
|
return self::where($where)->save($update_data); |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue