Commit 98775249 authored by twj's avatar twj

Merge branch 'dev' of http://rungit.jxdsy.cn:10000/sugar/stock_new into dev

parents a3b91047 6e986590
......@@ -2160,8 +2160,8 @@ if(!function_exists('get_between')) {
}
/*
* 通过API接口获取行情
*/
* 通过API接口获取行情
*/
if(!function_exists('getApiStock')) {
/**
* @param $code
......@@ -2209,4 +2209,38 @@ if(!function_exists('get_between')) {
}
}
}
\ No newline at end of file
}
/*
* 计算佣金
*/
if (!function_exists('commission')) {
function commission($money,$scale,$min){
$commission = round(($money * $scale) / 10000, 2);//佣金
$commission = $commission < $min ? $min : $commission;
return $commission;
}
}
/*
* 计算印花税
*/
if(!function_exists('stamps')) {
function stamps($money){
$stamps = round($money * config('stamp_duty') / 1000, 2);
return $stamps ?? 0;
}
}
/*
* 计算过户费
*/
if(!function_exists('transfer')) {
function transfer($money){
if(!config('transfer_fee') || config('transfer_fee') == 0){ //当该值未设置或值为0时表示关闭,则返回0
return 0;
}elseif(config('transfer_fee') > 1){ //当值大于1时表示具体数值,则返回该数值
return config('transfer_fee');
}else{
$transfer = round(($money / 1000) * config('transfer_fee'), 2) ?? 0;
}
return $transfer;
}
}
This diff is collapsed.
......@@ -391,5 +391,27 @@ class Position extends Model{
return $result;
}
public static function calculate($sub_id,$code,$variable)
{
if(!$sub_id || !$code || !$variable) return 0;
switch ($variable) {
case 'price':
$order = Db::name('stock_delivery_order')->where(['sub_id' => $sub_id, 'gupiao_code' => $code,'status' => 1,'business_name' => '证券买入']);
$amount = $order->sum('liquidation_amount');
$volume = $order->sum('volume');
$result = bcdiv(strval($amount),strval($volume),3);
break;
case 'average':
$order = Db::name('stock_delivery_order')->where(['sub_id' => $sub_id, 'gupiao_code' => $code,'status' => 1,'business_name' => '证券买入']);
$amount = $order->sum('residual_quantity');
$volume = $order->sum('volume');
$result = bcdiv(strval($amount),strval($volume),3);
break;
default:
$result = 0;
break;
}
return $result;
}
}
\ No newline at end of file
......@@ -15,6 +15,7 @@ class Trust extends Model{
protected $table = '__STOCK_TRUST__';
// 自动写入时间戳
protected $autoWriteTimestamp = true;
/*
* 存储委托记录
* $data 持仓数据
......@@ -224,11 +225,11 @@ class Trust extends Model{
* 返回子账号当日委托
* $sub_id 子账号
*/
public function get_trust_day($sub_id){
$time=strtotime(date('y-m-d',time()));
$res=Db::name('stock_trust')->where(['sub_id'=>$sub_id,'trust_date'=>$time])->select();
return $res;
}
public function get_trust_day($sub_id){
$time=strtotime(date('y-m-d',time()));
$res=Db::name('stock_trust')->where(['sub_id'=>$sub_id,'trust_date'=>$time])->select();
return $res;
}
/*
* 返回子账号委托
* $sub_id 子账号
......@@ -291,4 +292,180 @@ class Trust extends Model{
return $result;
}
// 买入时检查
public function executeData($data, $trustModel)
{
//检测是否为禁买股票
$res = self::checkStatus($data['code']);
if ($res) return ['status'=>0, 'message'=>'该股票禁止交易'];
//判断购买数量书否正确
if (($data['count'] % 100) != 0) return ['status'=>0, 'message'=>'交易数量必须是100的整数倍'];
$bs_res = Db::name('stock_borrow')->where(array('stock_subaccount_id' => $data['subid']))->find();
if (empty($bs_res)) {
return ['status'=>0, 'message'=>'没有对应的配资'];
}
if ($bs_res['end_time'] <= time()){
return ['status'=>0, 'message'=>'该账户已逾期,请先续期'];
}
if($trustModel == 'buy'){
return self::trustBuy($data,$bs_res);
}
if($trustModel == 'sell'){
return self::trustSell($data);
}
}
public function trustBuy($data,$bs_res)
{
//查询股票最新行情
$Qdata = z_market($data['code']);
$price = $data['price'] <= 0 ? $Qdata['Price'] : $data['price'];
//判断股票价格是否符号购买条件
if (config('stock_buy_price') > 0) {
if ($price < config('stock_buy_price')) {
return ['status'=>0, 'message'=>'系统设定低于'.config('stock_buy_price').'元一股的股票不能购买'];
}
}
//检查卖量是否正常
$trade_money = self::checkTranMoney($Qdata, $data['count'], $price);
if ($trade_money <= 0) return ['status'=>0, 'message'=>'卖量不足或网络错误'];
//判断卖量和股票限额
$res = self::checkPositionSum($Qdata,$data['sub_id'],$data['code'],$trade_money);
if (isset($res['status'])) {
return ['status'=>0, 'message'=>'该股票超过了单支股票最大购买限额'];
}
//检查子账户余额
$moneymodel = new SubAccountMoney();
$moneyinfo = $moneymodel->get_account_money($data['sub_id']);
if ($moneyinfo['avail'] < $trade_money){
return ['status'=>0, 'message'=>'购买资金不足'];
}
// 免息配资结束当天不能买入
if ($bs_res['type'] == 5) {
if($bs_res['end_time'] < time() + 23 * 3600) {
return ['status'=>0, 'message'=>'免息配资结束当天不能买入'];
}
}
// 设置试用配资第二天不能再买入
if ($bs_res['type'] == 4) {
if($bs_res['end_time'] < time() + 23 * 3600) {
return ['status'=>0, 'message'=>'试用配资结束当天不能买入'];
}
}
$risk = new StockSubAccountRisk;
$risk_res = $risk->get_risk($data['sub_id']);
if ($risk_res['prohibit_open'] == 0){
return ['status'=>0, 'message'=>'您被禁止开新仓,请联系管理员咨询原因'];
}
$retData['trade_money'] = $trade_money;
$retData['moneyinfo'] = $moneyinfo;
$retData['price'] = $price;
return $retData;
}
//卖出时检查
public function trustSell($data)
{
//查询股票最新行情
$Qdata = z_market($data['code']);
$price = $data['price'] <= 0 ? $Qdata['Price'] : $data['price'];
if(config('site_trade_sell') == 0) {
return array('status' => 0, 'message' => '系统设置不允许卖出股票');
}
//检测股票可卖数量
$poscount = Position::get_canbuy_count($data['sub_id'], $data['code']);
if ($poscount < $data['count']) {
return ['status'=>0, 'message'=>'可卖股票不足'];
}
//当股票跌停时买一至买五价格为空
if(intval($Qdata["Bp1"]) <= 0 || intval($Qdata['Bv1']*100) < $data['count']){
return ['status'=>0, 'message'=>'当前买盘不足,无法即时成交!'];
}
//检查子账户余额
$moneymodel = new SubAccountMoney();
$moneyinfo = $moneymodel->get_account_money($data['sub_id']);
$trade_money = 0;
if($data['price'] > 0 && $data['model'] == 1){ //model = 1 是委托状态
$trade_money = intval($data['count']) * intval($data['price']);
}else{
$price = $Qdata['Price'];
//如果没有委托价格使用下面的公式
$trade_money = intval($data['count']) * intval($price);
}
$retData['trade_money'] = $trade_money;
$retData['moneyinfo'] = $moneyinfo;
$retData['price'] = $price;
return $retData;
}
/*查询禁买股票列表*/
public function checkStatus($code)
{
$res = Db::name('stock_list')->where(['code' => $code, 'status' => 0])->find();
return $res;
}
/*
* 验证卖量是否正常
*/
public function checkTranMoney($Qdata, $count, $price)
{
$trade_money = 0;
if (!(empty($price))) {
$trade_money = $count * $price;
}else{
$price = 0;
$v_arr[1] = $Qdata['Sv1'] * 100;
$v_arr[2] = $Qdata['Sv2'] * 100;
$v_arr[3] = $Qdata['Sv3'] * 100;
$v_arr[4] = $Qdata['Sv4'] * 100;
$v_arr[5] = $Qdata['Sv5'] * 100;
$p_arr[1] = $Qdata['Sp1'];
$p_arr[2] = $Qdata['Sp2'];
$p_arr[3] = $Qdata['Sp3'];
$p_arr[4] = $Qdata['Sp4'];
$p_arr[5] = $Qdata['Sp5'];
$tmd = 0;
foreach ($v_arr as $key => $v ){
$tmd = $tmd + $v;
if ($count <= $tmd){
$sum_money = 0;
$sum_count = $count;
for ($i = 1; $i < $key; $i++){
$sum_money += $v_arr[$i] * $p_arr[$i];
$sum_count -= $v_arr[$i];
}
$trade_money = $sum_money + ($sum_count * $p_arr[$key]);
$price = round($trade_money / $count, 2);
$trade_money = $count * $price;
break;
}
}
}
return $trade_money ?? 0;
}
/*
* 返回子账号单只股票持仓数量
* $subid 子账号 $code 股票代码
*/
public function checkPositionSum($Qdata,$subid,$code,$trade_money)
{
$res = Db::name('stock_list')->where(['code' => $code, 'status' => 1])->find();
//判断是否超过该只股票限额
$pos = Db::name('stock_position')->where(['sub_id' => $subid,'gupiao_code' => $code,'buying' => 0])->sum('stock_count');
if (isset($res['quota']) && ($res['quota'] < (($pos * $Qdata['Price']) + $trade_money))) {
return ['status'=>0, 'message'=>'该股票超过了单支股票最大购买限额'];
}
return;
}
}
\ No newline at end of file
<?php
namespace app\apicom\validate;
use think\Validate;
class Trade extends Validate
{
protected $rule = [
'id' => 'require|number',
'code' => 'require|number|length:6',
'market' => 'require|in:SH,SZ,BJ',
'count' => 'require|number|gt:0',
'price' => 'require',
];
protected $message = [
'id.require' => '参数格式错误',
'code.require' => '参数格式错误',
'code.number' => '参数格式错误',
'code.length' => '参数格式错误',
'count.require' => '请填写委托股数',
'count.number' => '委托股数格式错误',
'count.gt' => '委托股数格式错误',
'market.require' => '参数格式错误',
'market.in' => '参数格式错误',
];
protected $scene = [
'trade' => ['id', 'code', 'market', 'count', 'price'],
];
}
......@@ -117,7 +117,7 @@ class Subaccount extends Admin
$data = $this->request->post();
//获取证券账户信息
$commission = AccountModel::getAccountByID($data['account_id']);
if($commission['broker']== -1){//如果选择的券商类型为-1
if($commission['broker']<0){//如果选择的券商类型为-1
$data['relation_type']=0;//选择的账户模式为模拟账户
}else{
$data['relation_type']=1;//选择的账户模式为实盘账户
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment