*/ namespace backend\controllers; use backend\jobs\QueryTransJob; use common\business\Chain33Business; use common\models\psources\CoinExtract; use common\models\psources\CoinPublish; use common\models\psources\CoinPublishRule; use common\models\psources\CoinReleaseCheck; use common\models\psources\CoinReleaseList; use common\models\psources\CoinReleaseMember; use Yii; class CoinReleaseCheckController extends BaseController { const STEP_CHECK_FIRST = 1; //初审 const STEP_CHECK_SECOND = 2; //复核 const STEP_CANCEL = 3; //撤提 public $enableCsrfValidation = false; public function actionIndex() { $admins = $this->getAccessAdmins(); //获取所有币种 $coins = CoinPublish::find()->select('coin_name_en')->asArray()->all(); $coins = array_unique(array_column($coins, 'coin_name_en')); return $this->render('index', [ 'coins' => $coins, 'check_firsts' => $admins, 'check_seconds' => $admins, ]); } public function actionCheckList() { Yii::$app->response->format = 'json'; $get = Yii::$app->request->get(); $model = new CoinReleaseCheck(); $model->scenario = CoinReleaseCheck::SCENARIOS_CHECK; if ($model->load($get) && $model->validate()) { $page = $get['page'] ?? 1; $limit = $page['limit'] ?? 10; $datas = CoinReleaseCheck::find() ->andFilterWhere(['status' => 0, 'coin' => $model->coin, 'mobile' => $model->mobile]); if ($model->start_time) { $datas = $datas->andFilterWhere(['>=', 'create_time', $model->start_time]); } if ($model->end_time) { $datas = $datas->andFilterWhere(['<=', 'create_time', $model->end_time]); } $count = $datas->count(); $datas = $datas->limit($limit) ->offset(($page - 1) * $limit) ->asArray() ->all(); //获取操作次数 //提出地址 $addresses = array_values(array_unique(array_column($datas, 'to_address'))); $address_datas = CoinExtract::getAllByAddress($addresses); foreach ($datas as $key => &$value) { $value['today'] = $address_datas[$value['to_address']]['today']; $value['total'] = $address_datas[$value['to_address']]['total']; } return ['code' => 0, 'count' => $count, 'data' => $datas]; } else { return ['code' => -1, 'msg' => current($model->firstErrors)]; } } public function actionSearchList() { Yii::$app->response->format = 'json'; $get = Yii::$app->request->get(); $model = new CoinReleaseCheck(); $model->scenario = CoinReleaseCheck::SCENARIOS_SEARCH; if ($model->load($get) && $model->validate()) { $page = $get['page'] ?? 1; $limit = $page['limit'] ?? 10; $query = CoinReleaseCheck::find()->andFilterWhere(['!=', 'status', 0])->andFilterWhere([ 'status' => $model->status, 'coin' => $model->coin, 'check_first_uid' => $model->check_first_uid, 'check_second_uid' => $model->check_second_uid, ]); if ($model->start_time) { $query = $query->andFilterWhere(['>=', 'create_time', $model->start_time]); } if ($model->end_time) { $query = $query->andFilterWhere(['<=', 'create_time', $model->end_time]); } $count = $query->count(); $datas = $query->limit($limit)->offset(($page - 1) * $limit)->asArray()->all(); //获取审核员id $check_ids = array_column($datas, 'check_first_uid'); $check_ids = array_unique(array_values(array_merge($check_ids, array_column($datas, 'check_second_uid')))); //获取所有管理员 $admins = $this->getAccessAdmins(); foreach ($datas as $key => &$value) { $value['check_first_uid'] = $admins[$value['check_first_uid']]; $value['check_second_uid'] = $admins[$value['check_second_uid']]; } return ['code' => 0, 'count' => $count, 'data' => $datas]; } else { return ['code' => -1, 'msg' => current($model->firstErrors)]; } } /** * @return array * @throws \yii\db\Exception */ public function actionCheck() { Yii::$app->response->format = 'json'; $id = Yii::$app->request->get('id', null); $status = Yii::$app->request->get('status', null); $step = Yii::$app->request->get('step', null); if (!empty($id) && !empty($status) && !empty($step)) { if (ctype_digit($id) && ctype_digit($status) && ctype_digit($step)) { if (($status == 2 || $status == 3) && ($step >= 1 || $step <= 3)) { $model = CoinReleaseCheck::findOne($id); if ($model) { if (CoinReleaseCheck::STATUS_NORMAL != $model->status) { return ['code' => -1, 'msg' => '不允许进行审核!']; } if (self::STEP_CHECK_FIRST == $step) { //初审 if ($model->check_second_status != CoinReleaseCheck::CHECK_SECOND_STATUS_NORMAL) { return ['code' => -1, 'msg' => '已经复核的申请不允许初审!']; } $model->check_first_uid = Yii::$app->user->id; $model->check_first_status = $status; if ($model->save()) { return ['code' => 0, 'msg' => '初审通过!']; } return ['code' => -1, 'msg' => '初审不通过!']; } elseif (self::STEP_CHECK_SECOND == $step) { //复审 if (CoinReleaseCheck::CHECK_FIRST_STATUS_SUCCEED == $model->check_first_status) { //开启事务 $trans = CoinReleaseMember::getDb()->beginTransaction(); $model->check_second_uid = Yii::$app->user->id; $model->check_second_status = $status; //改变status $model->status = CoinReleaseCheck::STATUS_PADDING; if ($model->save()) { // 提币 区块链转账接口 $from = ''; $member = CoinReleaseMember::findOne($model->mid); if ($member) { $coin_publish_rule = CoinPublishRule::findOne($member->rule_id); if ($coin_publish_rule) { $coin_publish = CoinPublish::findOne($coin_publish_rule->pid); if ($coin_publish) { $from = $coin_publish->address; } } } if (empty($from)) { $trans->rollBack(); return ['code' => -1, 'msg' => '提币失败']; } if (strtoupper($model->coin) == 'BTY') { $isToken = false; } else { $isToken = true; } //减少用户资产 $member->release -= $model->amount; $member->output += $model->amount; if ($member->save()) { //保存提币记录到数据库 $coin_release_list = new CoinReleaseList(); $coin_release_list->mid = $member->id; $coin_release_list->mobile = $member->mobile; $coin_release_list->amount = $model->amount; $coin_release_list->coin = $model->coin; $coin_release_list->type = 1;//提币 $coin_release_list->from = $from; $coin_release_list->to = $model->to_address; if ($coin_release_list->save()) { //转账 $result = Chain33Business::transToken( trim($from), trim($model->to_address), (int)$model->amount, "锁仓释放", $isToken, $model->coin ); if (is_array($result)) { $trans->rollBack(); return $result; } Yii::$app->queue->delay(15)->push(new QueryTransJob([ 'txhash' => $result, 'lid' => $coin_release_list->id, 'cid' => $model->id ])); $trans->commit(); return ['code' => 0, 'msg' => '审核通过']; } else { $trans->rollBack(); return ['code' => -1, 'msg' => '保存提币记录失败!']; } } else { $trans->rollBack(); return ['code' => -1, 'msg' => '减少资产失败!']; } } else { $trans->rollBack(); return ['code' => -1, 'msg' => '保存提币记录失败']; } } else { return ['code' => -1, 'msg' => '初审未通过']; } } elseif (self::STEP_CANCEL == $step) { $model->check_first_uid = Yii::$app->user->id; $model->check_second_uid = Yii::$app->user->id; $model->status = CoinReleaseCheck::STATUS_CANCEL; if ($model->save(false)) { //返还币 return ['code' => 0, 'msg' => '操作成功']; } else { return ['code' => -1, '操作失败']; } } } } } } return ['code' => -1, 'msg' => '操作失败']; } }