Commit 6c175d7e authored by shajiaiming's avatar shajiaiming

test

parent 87c7eb50
...@@ -30,11 +30,12 @@ class OrderController extends BaseController ...@@ -30,11 +30,12 @@ class OrderController extends BaseController
$data['market_name'] = strtoupper($post['market_name']); $data['market_name'] = strtoupper($post['market_name']);
$data['price'] = $post['price']; $data['price'] = $post['price'];
$data['amount'] = $post['amount']; $data['amount'] = $post['amount'];
$data['transfer_number'] = date('YmdHis') . self::getrandnums(); $data['transfer_number'] = date('YmdHis') . self::getrandnums();
$redis = Yii::$app->redis; $redis = Yii::$app->redis;
$key = 'C2C_' . $post['address'] . '_' . $data['is_sell'] . '_' . str_replace('/', '-', $post['token_name']) . '_' . str_replace('/', '-', $post['market_name']); $key = 'C2C_' . $post['address'] . '_' . $post['is_sell'] . '_' . $post['token_name'] . '-' . $post['market_name'];
if ($redis->exists($key)) { if ($redis->exists($key)) {
$msg = '尚存在一笔未完成的交易!'; $msg = '尚存在一笔未完成的交易!';
...@@ -47,6 +48,7 @@ class OrderController extends BaseController ...@@ -47,6 +48,7 @@ class OrderController extends BaseController
$data['txhex'] = $val['tx']; $data['txhex'] = $val['tx'];
$data['transfer_url'] = $val['url']; $data['transfer_url'] = $val['url'];
$data['step'] = $val['step']; $data['step'] = $val['step'];
$data['consensus'] = (false == $val['consensus']) ? 0 : 1;
$model->load($data, ''); $model->load($data, '');
$model->save(); $model->save();
} }
...@@ -204,7 +206,7 @@ class OrderController extends BaseController ...@@ -204,7 +206,7 @@ class OrderController extends BaseController
//交易成功,查询成功 //交易成功,查询成功
if (true == $val['send_result'] && 'success' == $val['query_result'] && 'success' == $val['msg']) { if (true == $val['send_result'] && 'success' == $val['query_result'] && 'success' == $val['msg']) {
if ((count($orders_info) - 1) == $key) { if ((count($orders_info) - 1) == $key) {
$step = ((count($orders_info) - 1) == $key) ? (count($orders_info) * 2) : ($key + 2); $step = ((count($orders_info) - 1) == $key) ? 99 : ($key + 2);
$code = 0; $code = 0;
$msg = $val['send_result']; $msg = $val['send_result'];
goto doEnd; goto doEnd;
......
...@@ -10,10 +10,16 @@ class CoinCTocTransfer extends BaseActiveRecord ...@@ -10,10 +10,16 @@ class CoinCTocTransfer extends BaseActiveRecord
const TYPE_SELL = 1; //卖单 const TYPE_SELL = 1; //卖单
const TYPE_BUY = 0; //买单 const TYPE_BUY = 0; //买单
const CONSENSUE_YES = 1; //需要
const CONSENSUE_NO = 0; //不需要
const TYPE_ORDER = 1; //挂单 const TYPE_ORDER = 1; //挂单
const TYPE_TRANSFER = 2; //交易 const TYPE_TRANSFER = 2; //交易
const TYPE_REVOKE = 3; //撤消 const TYPE_REVOKE = 3; //撤消
const C2C_ORDER_TRANSFERING = 'C2C_order_transfering';
const C2C_ORDER_FAIL = 'C2C_order_fail';
public static function getDb() public static function getDb()
{ {
return Yii::$app->get('p_sources'); return Yii::$app->get('p_sources');
...@@ -31,7 +37,7 @@ class CoinCTocTransfer extends BaseActiveRecord ...@@ -31,7 +37,7 @@ class CoinCTocTransfer extends BaseActiveRecord
public function rules() public function rules()
{ {
return [ return [
[['is_sell', 'type', 'address', 'token_name', 'market_name', 'price', 'amount', 'step', 'txhex', 'transfer_url', 'transfer_number'], 'required'], [['is_sell', 'type', 'address', 'token_name', 'market_name', 'price', 'amount', 'step', 'txhex', 'transfer_url', 'transfer_number', 'consensus'], 'required'],
[['send_result', 'query_result', 'msg'], 'safe'] [['send_result', 'query_result', 'msg'], 'safe']
]; ];
} }
...@@ -39,7 +45,7 @@ class CoinCTocTransfer extends BaseActiveRecord ...@@ -39,7 +45,7 @@ class CoinCTocTransfer extends BaseActiveRecord
public function scenarios() public function scenarios()
{ {
$scenarios = [ $scenarios = [
self:: SCENARIOS_CREATE => ['is_sell', 'type', 'address', 'token_name', 'market_name', 'price', 'amount', 'step', 'txhex', 'transfer_url', 'transfer_number'], self:: SCENARIOS_CREATE => ['is_sell', 'type', 'address', 'token_name', 'market_name', 'price', 'amount', 'step', 'txhex', 'transfer_url', 'transfer_number', 'consensus'],
]; ];
return array_merge(parent:: scenarios(), $scenarios); return array_merge(parent:: scenarios(), $scenarios);
} }
......
<?php
namespace console\controllers;
use common\models\psources\CoinCrossChain;
use common\models\psources\CoinCTocTransfer;
use Yii;
use yii\console\Controller;
use common\service\chain33\Chain33Service;
class OrderController extends Controller
{
/**
* 自动交易
*
* @return array
*/
public function actionAutoOrder($is_sell, $type)
{
$redis = Yii::$app->redis;
$model = CoinCTocTransfer::find()->where(['send_result' => "0", 'is_sell' => (int)$is_sell, 'type' => (int)$type, 'query_result' => '0'])->asArray()->all();
if (empty($model)) {
echo date('Y-m-d H:i:s') . '暂无交易计划' . PHP_EOL;
return 0;
}
$current_time = time();
foreach ($model as $val) {
if ($val['step'] > 1) {
$isExist = CoinCTocTransfer::find()
->where(['transfer_number' => $val['transfer_number']])
->andWhere(['<', 'id', (int)$val['id']])
->orderBy('id desc')
->asArray()
->one();
//上一步发送成功,未查询
if ('success' != $isExist['query_result'] && !empty($isExist)) {
continue;
}
}
$key = $val['address'] . '_' . $val['is_sell'] . '_' . $val['token_name'] . '_' . $val['market_name'];
$cache_transfering_time = $redis->hget(CoinCTocTransfer::C2C_ORDER_TRANSFERING, $key);
if (true == $cache_transfering_time) {
continue;
}
$redis->hmset(CoinCTocTransfer::C2C_ORDER_TRANSFERING, $key, $current_time);
go(function () use ($val, $redis, $key) {
\Co::sleep(0.5);
$transfer_url = $val['transfer_url'];
$transfer_url = explode(':', $transfer_url);
$node_params = [
'scheme' => $transfer_url[0],
'host' => str_replace('//', '', $transfer_url[1]),
'port' => isset($transfer_url[2]) ? $transfer_url[2] : '',
];
$service = new Chain33Service($node_params);
$sign_str = $val['txhex'];
$result = $service->sendTransaction($sign_str);
if (0 == $result['code']) {
$send_result = $result['result'];
$currentModel = CoinCTocTransfer::findOne($val['id']);
$currentModel->send_result = $send_result;
$currentModel->msg = 0;
$currentModel->save();
$redis->hdel(CoinCTocTransfer::C2C_ORDER_TRANSFERING, $key);
} else {
$currentModel = CoinCTocTransfer::findOne($val['id']);
$currentModel->msg = $result['msg'];
$currentModel->save();
}
});
}
echo date('Y-m-d H:i:s') . '交易成功' . PHP_EOL;
return 0;
}
public function actionOrderStatus()
{
$redis = Yii::$app->redis;
$model = CoinCTocTransfer::find()->where(['<>', 'send_result', '0'])->andWhere(['msg' => '0'])->asArray()->all();
if (empty($model)) {
echo date('Y-m-d H:i:s') . '暂无跨链交易计划' . PHP_EOL;
return 0;
}
//正式环境查询共识高度
//3步交易情况下需要做高度判断,2步交易无须判断
$node_params = [
'scheme' => 'https',
'host' => 'jiedian1.bityuan.com',
'port' => 8801
];
//测试环境查询共识高度
//2步交易情况下需要做高度判断
// $node_params = [
// 'scheme' => 'http',
// 'host' => '172.16.100.77',
// 'port' => 8801
// ];
$service = new Chain33Service($node_params);
$result = $service->getHeight();
$consensHeight = $result['result']['consensHeight'];
$current_time = time();
foreach ($model as $val) {
$key = $val['address'] . '_' . $val['is_sell'] . '_' . $val['token_name'] . '_' . $val['market_name'];
$node_params = $val['transfer_url'];
$node_params = explode(':', $node_params);
$node_params = [
'scheme' => $node_params[0],
'host' => str_replace('//', '', $node_params[1]),
'port' => isset($node_params[2]) ? $node_params[2] : ''
];
$send_result = $val['send_result'];
#$result = $service->QueryTransaction($send_result);
$switch = true;
$result = $this->queryTransaction($node_params, $send_result);
if (isset($result['result']['actionName']) && 'unknown' == $result['result']['actionName']) {
$redis->hdel(CoinCTocTransfer::C2C_ORDER_FAIL, $key);
$query_result = 'success';
$msg = 'success';
$height = isset($result['result']['height']) ? $result['result']['height'] : 0;
goto doEnd;
} else if (isset($result['result']['receipt']['ty']) && 2 == $result['result']['receipt']['ty']) {
$redis->hdel(CoinCTocTransfer::C2C_ORDER_FAIL, $key);
$query_result = 'success';
$msg = 'success';
$height = isset($result['result']['height']) ? $result['result']['height'] : 0;
goto doEnd;
} else {
$cache_error_time = $redis->hget(CoinCTocTransfer::C2C_ORDER_FAIL, $key);
if (false == $cache_error_time) {
$redis->hmset(CoinCTocTransfer::C2C_ORDER_FAIL, $key, $current_time);
continue;
}
if (($current_time - $cache_error_time) < 60) {
continue;
}
$redis->hdel(CoinCTocTransfer::C2C_ORDER_FAIL, $key);
if (-1 == $result['code']) {
$msg = $result['msg'];
$query_result = $result['code'];
$switch = false;
goto doEnd;
} else {
$query_result = 'fail';
foreach ($result['result']['receipt']['logs'] as $log) {
if (is_array($log['log'])) continue;
$msg = isset($log['log']) ? $log['log'] : '查询错误';
}
$switch = false;
goto doEnd;
}
}
doEnd :
//3步交易情况下需要做高度判断,2步交易注释IF判断
if (CoinCTocTransfer::CONSENSUE_YES == $val['consensus'] && true == $switch && isset($height) && ($consensHeight < $height)) {
continue;
}
$currentModel = CoinCTocTransfer::findOne($val['id']);
$currentModel->query_result = $query_result;
$currentModel->msg = $msg;
$currentModel->save();
$model_c2c = CoinCTocTransfer::find()->where(['transfer_number' => $val['transfer_number']])->asArray()->all();
$clear = true;
foreach ($model_c2c as $record) {
if ('success' != $record['query_result']) {
$clear = false;
}
}
if (true == $clear) {
$key = 'C2C_' . $val['address'] . '_' . $val['is_sell'] . '_' . $val['token_name'] . '-' . $val['market_name'];
$redis->del($key);
}
}
echo date('Y-m-d H:i:s') . '查询完毕' . PHP_EOL;
return 0;
}
protected function queryTransaction($node_params, $send_result)
{
static $result = [];
$service = new Chain33Service($node_params);
$result = $service->QueryTransaction($send_result);
if (isset($result['result']['receipt']) && is_array($result['result']['receipt']['logs'])) {
foreach ($result['result']['receipt']['logs'] as $log) {
if (isset($log['tyName']) && 'logerr' == strtolower($log['tyName'])) {
return $result;
}
}
}
if (isset($result['result']['tx']['next'])) {
$this->queryTransaction($node_params, $result['result']['tx']['next']);
}
return $result;
}
}
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