<?php /** * Created by PhpStorm. * User: rlgyzhcn * Date: 18-5-31 * Time: 下午1:02 */ namespace api\controllers; use api\base\BaseController; use common\base\Exception; use common\business\BrowerBusiness; use common\business\Chain33Business; use common\business\CoinBusiness; use common\business\ExchangeBusiness; use common\models\psources\Coin; use common\models\psources\CoinCurrency; use common\models\psources\CoinPlatformWithHold; use common\models\psources\CoinRecommend; use common\models\psources\MinerFee; use Yii; use yii\data\Pagination; /** * 币种信息管理控制器 * Class CoinController * * @package api\controllers */ class CoinController extends BaseController { /** * 单币种按照id查询 * * @return array|null|\yii\db\ActiveRecord */ public function actionGetCoinById() { $request = Yii::$app->request; $id = $request->post('id', 0); if ($id) { $ret = CoinBusiness::getCoinAllById($id); if ($ret) { $data = $ret[0]; $nickname = json_decode($data['nickname'], true); $introduce = json_decode($data['introduce'], true); $data['nickname'] = isset($nickname[$this->lang]) ? $nickname[$this->lang] : ''; $data['introduce'] = isset($introduce[$this->lang]) ? $introduce[$this->lang] : ''; return $data; } } return []; } /** * 获取推介币种列表 */ public function actionGetRecList() { $request = Yii::$app->request; $page = $request->post('page', 1); $limit = $request->post('limit', 999); $platform_id = $request->post('platform_id', 2);//默认币钱包 if ($platform_id == 1) { $platform_id = 3; } elseif ($platform_id == 2) { $platform_id = 1; } elseif ($platform_id == 3) { $platform_id = 2; } $recommend = $request->post('recommend', ''); $condition = ['platform_id' => $platform_id, 'type' => 1]; if ($recommend) { $condition['recommend'] = $recommend; } $select = ['id', 'sid', 'icon', 'name', 'nickname', 'platform', 'chain']; $datas = CoinRecommend::getList($page, $limit, $condition, [], $select); //获取详细信息 $coin_recommends = &$datas['data']; if (!empty($coin_recommends)) { $coin_ids = array_column($coin_recommends, 'cid'); //获取币种信息 $coin_infos = Coin::getCoinInfoByIds($coin_ids, $select, 'id'); //获取行情信息 $coin_names = array_column($coin_infos, 'name'); $coin_names = array_merge($coin_names, array_column($coin_infos, 'chain')); $coin_quotations = ExchangeBusiness::getQuatationByNames($coin_names); if ($coin_infos) { array_shift($select); foreach ($coin_recommends as $key => &$value) { $temp_key = $coin_infos[$value['cid']]['name']; foreach ($select as $item) { $value[$item] = $coin_infos[$value['cid']][$item]; if ($value['platform_id'] != 2) { //国盾币不需要行情 $value['low'] = $coin_quotations[$temp_key]['low']; $value['high'] = $coin_quotations[$temp_key]['high']; $value['last'] = $coin_quotations[$temp_key]['last']; $value['rmb'] = $coin_quotations[$temp_key]['rmb']; } else { $value['low'] = 0; $value['high'] = 0; $value['last'] = 0; $value['rmb'] = 0; } } $value['id'] = $value['cid']; $value['sid'] = ucfirst($value['sid']); $value['chain_quotation'] = $coin_quotations[$coin_infos[$value['cid']]['chain']]; unset($value['create_time'], $value['update_time'], $value['cid']); } unset($key, $value); } } return $datas; } /** * 获取推介币种列表(新) */ public function actionGetNewRecList() { $request = Yii::$app->request; $page = $request->post('page', 1); $limit = $request->post('limit', 999); $platform_id = $request->post('platform_id', 1);//默认币钱包 $recommend = $request->post('recommend', ''); $type = $request->post('type', 1); $chain = $request->post('chain', ''); $condition = ['platform_id' => $platform_id, 'type' => $type]; if ($recommend) { $condition['recommend'] = $recommend; } if ($chain) { $condition['chain'] = $chain; } $select = ['id', 'sid', 'icon', 'name', 'introduce', 'optional_name', 'nickname', 'platform', 'chain', 'treaty']; $order_by = ['sort' => SORT_ASC]; $datas = CoinRecommend::getList($page, $limit, $condition, $order_by, $select); //获取详细信息 $coin_recommends = &$datas['data']; if (!empty($coin_recommends)) { $coin_ids = array_column($coin_recommends, 'cid'); //获取币种信息 $coin_infos = Coin::getCoinInfoByIds($coin_ids, $select, 'id'); foreach ($coin_infos as $key => &$val) { $nickname = json_decode($val['nickname'], true); $val['nickname'] = isset($nickname[$this->lang]) ? $nickname[$this->lang] : ''; $introduce = json_decode($val['introduce'], true); $val['introduce'] = isset($introduce[$this->lang]) ? $introduce[$this->lang] : ''; } //获取行情信息 $coin_names = array_column($coin_infos, 'name'); $coin_names = array_merge($coin_names, array_column($coin_infos, 'chain')); $coin_quotations = ExchangeBusiness::getQuatationByNames($coin_names); if ($coin_infos) { array_shift($select); foreach ($coin_recommends as $key => &$value) { $temp_key = $coin_infos[$value['cid']]['name']; foreach ($select as $item) { $value[$item] = $coin_infos[$value['cid']][$item]; if ($value['platform_id'] != 2) { //国盾币不需要行情 $value['low'] = $coin_quotations[$temp_key]['low']; $value['high'] = $coin_quotations[$temp_key]['high']; $value['last'] = $coin_quotations[$temp_key]['last']; $value['rmb'] = $coin_quotations[$temp_key]['rmb']; $value['usd'] = $coin_quotations[$temp_key]['usd'] ?? 0; } else { $value['low'] = 0; $value['high'] = 0; $value['last'] = 0; $value['rmb'] = 0; $value['usd'] = 0; } } $value['id'] = $value['cid']; $value['sid'] = ucfirst($value['sid']); $value['chain_quotation'] = $coin_quotations[$coin_infos[$value['cid']]['chain']]; $value['chain_rmb'] = isset($coin_quotations[$coin_infos[$value['cid']]['chain']]['rmb']) ? $coin_quotations[$coin_infos[$value['cid']]['chain']]['rmb'] : 0; $value['chain_usd'] = isset($coin_quotations[$coin_infos[$value['cid']]['chain']]['usd']) ? $coin_quotations[$coin_infos[$value['cid']]['chain']]['usd'] : 0; unset($value['create_time'], $value['update_time'], $value['cid']); } unset($key, $value); } } if (!$datas['data']) { $datas['data'] = null; } return $datas; } /** * 矿工费获取 * * 根据name获取 * * @throws Exception */ public function actionGetMinerFeeByName() { $names = Yii::$app->request->post('name'); $coin = Coin::findOne(['name' => $names]); if ($coin) { $chain = $coin->chain; $miner_fee = MinerFee::find()->where(['platform' => $chain, 'type' => 1])->one(); if (!$miner_fee) { throw new Exception('8', '旷工费未设置'); } } else { //如果coin为null,$coin->minerFee会抛出Trying to get property 'minerFee' of non-object",code=>8 throw new Exception('8', '币种不存在'); } $result = (array)$miner_fee->getAttributes(); $result['min'] = number_format($result['min'], 6); $result['max'] = number_format($result['max'], 6); return $result; } /** * app首页接口V2 */ public function actionCoinIndex() { $names = Yii::$app->request->post('names'); if (!$names) { return ['code' => 0, 'data' => []]; } foreach ($names as $key => $val) { if (strpos($val, ',') !== false) { $val_array = explode(',', $val); if ('USDT' == strtoupper($val_array[0]) && 'BTC' == strtoupper($val_array[1])) { $condition[] = [$val_array[0], 'omni']; continue; } $condition[] = [$val_array[0], $val_array[1]]; } else { $condition[] = $val; } } $result = ExchangeBusiness::getApiListForIndex(1, 999, $condition); if ($result) { $chains = array_unique(array_column($result['data'], 'chain')); $chain_quotation = []; foreach ($chains as $key => $value) { $chain_quotation[$value] = ExchangeBusiness::getquatation($value); } $last[] = 1; $currency = CoinCurrency::find()->where(['pj_id' => $this->currency_id])->one(); if (false != $currency) { if (1111 == $this->currency_id) { $last[] = 1; } else if (1316 == $this->currency_id) { if (Yii::$app->redis->hkeys('quotation_go_CNY_USD')) { $last[0] = 1 / Yii::$app->redis->hmget('quotation_go_CNY_USD', 'last')[0]; } else { $last = Yii::$app->redis_currency->hmget('quotation_boc_' . 'CNY_' . $currency->symbol, 'last'); } } else { $last = Yii::$app->redis_currency->hmget('quotation_boc_' . 'CNY_' . $currency->symbol, 'last'); } } foreach ($result['data'] as $key => &$value) { if (!isset($value['nickname']) || empty($value['nickname'])) continue; $nickname = json_decode($value['nickname'], true); $introduce = json_decode($value['introduce'], true); $value['nickname'] = isset($nickname[$this->lang]) ? $nickname[$this->lang] : ''; $value['introduce'] = isset($introduce[$this->lang]) ? $introduce[$this->lang] : ''; $value['chain_quotation'] = $chain_quotation[$value['chain']] ?: null; $value['chain_rmb'] = isset($value['chain_quotation']['rmb']) ? $value['chain_quotation']['rmb'] : 0; $value['chain_usd'] = isset($value['chain_quotation']['usd']) ? $value['chain_quotation']['usd'] : 0; $value['chain_country_rate'] = (float)sprintf("%0.4f", $last[0] * $value['chain_rmb']); $value['country_rate'] = (false == $currency) ? $value['rmb'] : (float)sprintf("%0.4f", $last[0] * $value['rmb']); } return $result; } } public function actionSearch() { $count = 0; $params = Yii::$app->request->post(); $chain = isset($params['chain']) ? $params['chain'] : ''; $keyword = isset($params['keyword']) ? $params['keyword'] : ''; $platform_id = isset($params['platform_id']) ? $params['platform_id'] : ''; $page = empty($params['page']) ? 1 : $params['page']; $limit = empty($params['limit']) ? 10 : $params['limit']; if (false == $platform_id) { $code = -1; $data = null; goto doEnd; } $query = Coin::find() ->select('id, sid, icon, name, optional_name, nickname, platform, chain, address as contract_address, treaty') ->where("JSON_CONTAINS(platform_id,'$platform_id')") ->orderBy('id'); if (false != $chain) { $query->andWhere(['chain' => $chain]); } if (false != $keyword) { $query->andWhere(['or', ['like', 'address', $keyword], ['like', 'name', $keyword]]); } $data = $query->offset(($page - 1) * $limit)->limit($limit)->asArray()->all(); $count = $query->count(); if (false != $data) { $chains = array_unique(array_column($data, 'chain')); $chain_quotation = []; foreach ($chains as $key => $value) { $chain_quotation[$value] = ExchangeBusiness::getquatation($value); } foreach ($data as $key => $value) { $data[$key]['chain_quotation'] = $chain_quotation[$value['chain']] ?: null; } foreach ($data as $key => &$value) { $nickname = json_decode($value['nickname'], true); $value['nickname'] = isset($nickname[$this->lang]) ? $nickname[$this->lang] : ''; $value['chain_rmb'] = isset($value['chain_quotation']['rmb']) ? $value['chain_quotation']['rmb'] : 0; $value['chain_usd'] = isset($value['chain_quotation']['usd']) ? $value['chain_quotation']['usd'] : 0; } } $code = 0; doEnd : return ['code' => $code, 'data' => $data, 'count' => $count]; } /** * 按照名称搜索币种 * * @return array */ public function actionSearchCoinByName() { $request = Yii::$app->request; $name = $request->post('name', ''); $page = $request->post('page', 1); $limit = $request->post('limit', 10); $platform_ids = $request->post('platform_id', null); $condition = [['in', 'chain', ['ETH', 'DCR', 'BTC', 'BTY']]]; if (!empty($name)) { $condition[] = ['or', ['address' => $name], ['or', ['like', 'name', $name], ['like', 'nickname', $name]]]; } if ($platform_ids) { $condition[] = ("JSON_CONTAINS(platform_id,'$platform_ids')"); } $result = ExchangeBusiness::SearchByName($page, $limit, $condition); if (empty($result)) { return ['code' => 0, 'count' => 0, 'data' => []]; } $total = $result['total']; $result = $result['data']; if ($result) { $chains = array_unique(array_column($result, 'chain')); $chain_quotation = []; foreach ($chains as $key => $value) { $chain_quotation[$value] = ExchangeBusiness::getquatation($value); } foreach ($result as $key => $value) { $result[$key]['chain_quotation'] = $chain_quotation[$value['chain']] ?: null; } foreach ($result as $key => &$value) { $nickname = json_decode($value['nickname'], true); $value['nickname'] = isset($nickname[$this->lang]) ? $nickname[$this->lang] : ''; $value['chain_rmb'] = isset($value['chain_quotation']['rmb']) ? $value['chain_quotation']['rmb'] : 0; $value['chain_usd'] = isset($value['chain_quotation']['usd']) ? $value['chain_quotation']['usd'] : 0; } return ['code' => 0, 'count' => $total, 'data' => $result]; } } /** * 返回交易状态 * * @return mixed */ public function actionTransaction() { $request = Yii::$app->request; $name = $request->post('name', ''); $txhash = $request->post('txhash', ''); if ($name && $txhash) { return BrowerBusiness::getTransStatus($name, $txhash); } return false; } /** * @return array * 获取平台币图标、区块链地址 */ public function actionGetBrowerByPlatform() { $request = Yii::$app->request; $platform = $request->post('platform', ''); if ($platform) { $brower_url = Yii::$app->redis->hget('platform_brower_info', strtolower($platform)); return ['code' => 0, 'data' => $brower_url]; } else { return ['code' => 1, 'data' => [], 'msg' => '平台参数不能为空']; } } /** *获取代扣信息 */ public function actionGetWithHold() { $request = Yii::$app->request; $platform = $request->get('platform', ''); $coin_name = $request->get('coinname', ''); $platform_with_hold = CoinPlatformWithHold::getRecord($platform); $coin_info = Coin::find()->select('treaty')->where(['name' => strtoupper($coin_name), 'platform' => $platform])->asArray()->one(); $des = Yii::$app->des; $platform_with_hold['private_key'] = isset($platform_with_hold['private_key']) ? $des->encrypt($platform_with_hold['private_key']) : ''; if (1 == $coin_info['treaty']) { $platform_with_hold['exer'] = 'user.p.' . $platform . '.token'; if ('BTY' !== strtoupper($platform)) { $platform_with_hold['tokensymbol'] = $platform . '.' . $coin_name; } else { $platform_with_hold['tokensymbol'] = $coin_name; } } else { $platform_with_hold['exer'] = 'user.p.' . $platform . '.coins'; $platform_with_hold['tokensymbol'] = $platform . '.coins'; } $platform_with_hold['fee'] = isset($platform_with_hold['fee']) ? (float)sprintf("%0.4f", (double)$platform_with_hold['fee']) : 0; $coins_model = Coin::find()->select('name')->where(['platform' => $platform, 'treaty' => 2])->asArray()->one(); $platform_with_hold['coins_name'] = empty($coins_model) ? '' : $coins_model['name']; $service = new Chain33Business(); $result = $service->getProperFee(); if (0 === $result['code']) { $platform_with_hold['bty_fee'] = (float)sprintf("%0.4f", $result['result']['properFee'] / 1e8) > 0.01 ? 0.01 : (float)sprintf("%0.4f", $result['result']['properFee'] / 1e8); } else { $platform_with_hold['bty_fee'] = (float)sprintf("%0.4f", Yii::$app->params['bty_fee']); } return ['code' => 0, 'data' => $platform_with_hold]; } }