bourse stock
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.

425 lines
16 KiB

<?php
namespace app\admin\service\setting;
use app\admin\service\AdminBaseService;
use app\model\ForexListModel;
use app\model\ForexMarketModel;
use app\admin\validate\setting\HqValidate;
class ForexService extends AdminBaseService
{
public function index()
{
try {
$list = ForexListModel::order('id', 'desc')->select();
$rows = [];
if(!$list->isEmpty()){
$rows =$list->toArray();
}
return $this->toData('0', 'SUCCESS', ['list' => $rows, 'total' => count($rows)]);
}catch (\Exception $exception){
return $this->toData('1', '系统繁忙', []);
}
}
// 新增
public function add($param)
{
try {
// 交易对名称
if(empty($param['trade_name']) || !is_string($param['trade_name']) || strlen($param['trade_name']) > 100){
return $this->toData('1', '交易对名称无效', []);
}
// 状态
if(!isset($param['status']) || !in_array($param['status'], ['0', '1'])){
return $this->toData('1', '状态无效', []);
}
// 是否自发
if(!isset($param['is_owner']) || !in_array($param['is_owner'], ['0', '1'])){
return $this->toData('1', '是否自发无效', []);
}
// 简介
$info = '';
if(isset($param['info']) && is_string($param['info'])){
$info = $param['info'];
}
// 面值
if(!isset($param['face_value']) || !is_numeric($param['face_value']) || $param['face_value'] != ceil($param['face_value']) || $param['face_value'] <= 0){
return $this->toData('1', '面值无效', []);
}
// 排序
if(!isset($param['sort']) || !is_numeric($param['sort']) || $param['sort'] != ceil($param['sort']) || $param['sort'] < 0){
return $this->toData('1', '排序值无效', []);
}
// 最小杠杆
if(empty($param['min_pry']) || !is_numeric($param['min_pry']) || $param['min_pry'] != ceil($param['min_pry']) || $param['min_pry'] <= 0){
return $this->toData('1', '最小杠杆值无效', []);
}
// 最大杠杆
if(empty($param['max_pry']) || !is_numeric($param['max_pry']) || $param['max_pry'] != ceil($param['max_pry']) || $param['max_pry'] <= 0){
return $this->toData('1', '最大杠杆值无效', []);
}
// 强制平仓比例值
if(empty($param['compel_num']) || !is_numeric($param['compel_num']) || $param['compel_num'] <= 0){
return $this->toData('1', '强制平仓比例值无效', []);
}
// 小数位数
if(!isset($param['keep_decimal']) || !is_numeric($param['keep_decimal']) || $param['keep_decimal'] != ceil($param['keep_decimal']) || $param['keep_decimal'] < 0){
return $this->toData('1', '小数位数值无效', []);
}
// 判断名称是否已被添加
$count = ForexListModel::where('trade_name', $param['trade_name'])->count();
if($count > 0){
return $this->toData('1', '合约交易对名称已存在', []);
}
$contract = new ForexListModel;
$contract->trade_name = $param['trade_name'];
$contract->status = $param['status'];
$contract->is_owner = $param['is_owner'];
$contract->info = $info;
$contract->logo_link = '';
$contract->face_value = $param['face_value'];
$contract->sort = $param['sort'];
$contract->min_pry = $param['min_pry'];
$contract->max_pry = $param['max_pry'];
$contract->compel_num = $param['compel_num'];
$contract->keep_decimal = $param['keep_decimal'];
$contract->create_time = date('Y-m-d H:i:s');
$contract->update_time = date('Y-m-d H:i:s');
$contract->save();
$list_key="FOREX:LIST:".strtoupper($param['trade_name']);
$redis = $this->getRedis();
$redis->del($list_key);
$redis->hMset($list_key, [
'name'=>strtoupper($param['trade_name']),
'code'=>strtoupper($param['trade_name']),
'sort'=>$param['sort'],
'face_value'=>$param['face_value'],
'min_pry'=>$param['min_pry'],
'max_pry'=>$param['max_pry'],
'compel_num'=>$param['compel_num'],
'keep_decimal'=>$param['keep_decimal'],
'is_owner'=>$param['is_owner'],
'status'=>$param['status']
]);
return $this->toData('0', '操作成功', []);
}catch (\Exception $exception){
return $this->toData('1', '系统繁忙', [$exception->getMessage()]);
}
}
public function edit($param)
{
try {
if(empty($param['id']) || !is_numeric($param['id'])){
return $this->toData('1', '目标不存在', []);
}
$contract = ForexListModel::where('id', $param['id'])->find();
$beforeStatus = $contract['status'];
if(empty($contract)){
return $this->toData('1', '目标不存在', []);
}
// 交易对名称
if(empty($param['trade_name']) || !is_string($param['trade_name']) || strlen($param['trade_name']) > 100){
return $this->toData('1', '交易对名称无效', []);
}
// 状态
if(!isset($param['status']) || !in_array($param['status'], ['0', '1'])){
return $this->toData('1', '状态无效', []);
}
// 是否自发
if(!isset($param['is_owner']) || !in_array($param['is_owner'], ['0', '1'])){
return $this->toData('1', '是否自发无效', []);
}
// 简介
$info = '';
if(isset($param['info']) && is_string($param['info'])){
$info = $param['info'];
}
// 面值
if(!isset($param['face_value']) || !is_numeric($param['face_value']) || $param['face_value'] != ceil($param['face_value']) || $param['face_value'] <= 0){
return $this->toData('1', '面值无效', []);
}
// 排序
if(!isset($param['sort']) || !is_numeric($param['sort']) || $param['sort'] != ceil($param['sort']) || $param['sort'] < 0){
return $this->toData('1', '排序值无效', []);
}
// 最小杠杆
if(empty($param['min_pry']) || !is_numeric($param['min_pry']) || $param['min_pry'] != ceil($param['min_pry']) || $param['min_pry'] <= 0){
return $this->toData('1', '最小杠杆值无效', []);
}
// 最大杠杆
if(empty($param['max_pry']) || !is_numeric($param['max_pry']) || $param['max_pry'] != ceil($param['max_pry']) || $param['max_pry'] <= 0){
return $this->toData('1', '最大杠杆值无效', []);
}
// 强制平仓比例值
if(empty($param['compel_num']) || !is_numeric($param['compel_num']) || $param['compel_num'] <= 0){
return $this->toData('1', '强制平仓比例值无效', []);
}
// 小数位数
if(!isset($param['keep_decimal']) || !is_numeric($param['keep_decimal']) || $param['keep_decimal'] != ceil($param['keep_decimal']) || $param['keep_decimal'] < 0){
return $this->toData('1', '小数位数值无效', []);
}
// 判断名称是否已被添加
$count = ForexListModel::where('trade_name', $param['trade_name'])->where('id', '<>', $param['id'])->count();
if($count > 0){
return $this->toData('1', '合约交易对名称已存在', []);
}
// 如果状态设置成关闭 则判断是否有正在交易的合约
if($beforeStatus == 1 && $param['status'] == 0){
$num=(new ForexListModel())->where([
'contract_id'=>strtoupper($contract['trade_name']),
'status'=>1
])->count();
if ($num != 0) {
return $this->toData('1', '交易对还存在交易,不能关闭', []);
}
}
// 写入数据
$contract->trade_name = $param['trade_name'];
$contract->status = $param['status'];
$contract->is_owner = $param['is_owner'];
$contract->info = $info;
$contract->logo_link = '';
$contract->face_value = $param['face_value'];
$contract->sort = $param['sort'];
$contract->min_pry = $param['min_pry'];
$contract->max_pry = $param['max_pry'];
$contract->compel_num = $param['compel_num'];
$contract->keep_decimal = $param['keep_decimal'];
$contract->create_time = date('Y-m-d H:i:s');
$contract->update_time = date('Y-m-d H:i:s');
$contract->save();
$list_key="FOREX:LIST:".strtoupper($param['trade_name']);
$redis = $this->getRedis();
$redis->del($list_key);
$redis->hMset($list_key, [
'name'=>strtoupper($param['trade_name']),
'code'=>strtoupper($param['trade_name']),
'sort'=>$param['sort'],
'face_value'=>$param['face_value'],
'min_pry'=>$param['min_pry'],
'max_pry'=>$param['max_pry'],
'compel_num'=>$param['compel_num'],
'keep_decimal'=>$param['keep_decimal'],
'status'=>$param['status']
]);
return $this->toData('0', 'SUCCESS', []);
}catch (\Exception $exception){
return $this->toData('1', '系统繁忙', []);
}
}
// 获取合约交易对
public function getTradeNameList($param)
{
try {
$list = ForexListModel::where('status', 1)->order('id', 'desc')
->column('trade_name', 'id');
return $this->toData('0', 'SUCCESS', ['list' => $list]);
}catch (\Exception $exception){
return $this->toData('1', '系统繁忙', []);
}
}
public function hq_index()
{
try {
$list = ForexMarketModel::where('type', 0)->order('id', 'desc')->select();
$rows = [];
if(!$list->isEmpty()){
$rows = $list->toArray();
}
return $this->toData('0','SUCCSS',['list' => $rows, 'total' => count($rows)]);
}catch (\Exception $exception){
return $this->toData('1', '系统繁忙', [$exception->getMessage()]);
}
}
// 新增
public function hq_add($param)
{
try {
// 参数校验
validate(HqValidate::class)->scene('add')->check($param);
// 已存在未执行的 不能再插入
$count = ForexMarketModel::where('trade_name', $param['trade_name'])
->where('is_get',1)
->where('type', 0)
->count();
if($count > 0){
return $this->toData('1','已存在未执行');
}
//判断
$diff = strtotime($param['end_time']) - strtotime($param['begin_time']);
if($diff > 600 || $diff <=0){
return $this->toData('1','时间无效-结束时间必须在开始时间十分钟以内');
}
// 不能有交叉时间
$map1 = [
['trade_name', '=',$param['trade_name']],
['begin_time','between', [$param['begin_time'], $param['end_time']]]
];
$map2 = [
['trade_name', '=',$param['trade_name']],
['end_time','between', [$param['begin_time'], $param['end_time']]]
];
$count = ForexMarketModel::whereOr([$map1,$map2])
->count();
if($count > 0){
return $this->toData('1','时间无效-时间不能有交叉');
}
$market = new ForexMarketModel;
$market->trade_name = $param['trade_name'];
$market->begin_time = $param['begin_time'];
$market->end_time = $param['end_time'];
$market->max_price = $param['max_price'];
$market->step = $param['step'];
$market->type = 0;
$market->save();
// 写入redis
$this->initForexHqData();
return $this->toData('0','SUCCESS');
}catch (ValidateException $validateException){
return $this->toData('1', $validateException->getMessage(), []);
}catch (\Exception $exception){
return $this->toData('1', '系统繁忙', [$exception->getMessage()]);
}
}
// 编辑
public function hq_edit($param)
{
try {
// 参数校验
validate(HqValidate::class)->scene('edit')->check($param);
// 已存在未执行的 不能再插入
$count = ForexMarketModel::where('trade_name', $param['trade_name'])
->where('id', '<>', $param['id'])
->where('is_get',1)
->where('type', 0)
->count();
if($count > 0){
return $this->toData('1','已存在未执行');
}
// 目标
$market = ForexMarketModel::where('id', $param['id'])->where('type', 0)->find();
if(empty($market)){
return $this->toData('1','目标不存在');
}
//判断
$diff = strtotime($param['end_time']) - strtotime($param['begin_time']);
if($diff > 600 || $diff <=0){
return $this->toData('1','时间无效');
}
// 不能有交叉时间
$map1 = [
['trade_name', '=',$param['trade_name']],
['id', '<>',$param['id']],
['begin_time','between', [$param['begin_time'], $param['end_time']]]
];
$map2 = [
['trade_name', '=',$param['trade_name']],
['id', '<>',$param['id']],
['end_time','between', [$param['begin_time'], $param['end_time']]]
];
$count = ForexMarketModel::whereOr([$map1,$map2])
->count();
if($count > 0){
return $this->toData('1','时间无效');
}
$market->trade_name = $param['trade_name'];
$market->begin_time = $param['begin_time'];
$market->end_time = $param['end_time'];
$market->max_price = $param['max_price'];
$market->is_get = 1;
$market->step = $param['step'];
$market->save();
// redis
$this->initForexHqData();
return $this->toData('0','SUCCESS');
}catch (ValidateException $validateException){
return $this->toData('1', $validateException->getMessage(), []);
}catch (\Exception $exception){
return $this->toData('1', '系统繁忙', [$exception->getMessage(),$exception->getTrace()]);
}
}
// 删除
public function hq_del($param)
{
try {
// 参数校验
validate(HqValidate::class)->scene('del')->check($param);
// 目标
$market = ForexMarketModel::where('id', $param['id'])->find();
if(empty($market)){
return $this->toData('1','目标不存在');
}
$market->delete();
$this->initForexHqData();
return $this->toData('0','SUCCESS');
}catch (ValidateException $validateException){
return $this->toData('12', $validateException->getMessage(), []);
}catch (\Exception $exception){
return $this->toData('11', '系统繁忙', [$exception->getMessage()]);
}
}
}