WithdrawController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. <?php
  2. namespace backend\controllers;
  3. use backend\helpers\PaginationHelper;
  4. use backend\helpers\ValidatorHelper;
  5. use backend\models\Member;
  6. use backend\models\Mt4Trades;
  7. use backend\models\Mt4Users;
  8. use backend\models\UserMember;
  9. use backend\models\Withdraw;
  10. use common\helpers\RateHelper;
  11. use common\helpers\Utils;
  12. use common\lib\Mt4ManagerApi;
  13. use Yii;
  14. use backend\models\MemberBankInfo;
  15. use common\lib\Mt4Deposit;
  16. class WithdrawController extends BaseController
  17. {
  18. /**
  19. * 出金记录
  20. * @return mixed
  21. */
  22. public function actionIndex()
  23. {
  24. $data = Yii::$app->getRequest()->get();
  25. $data['type'] = isset($data['type']) ? trim($data['type']) : '';
  26. $data['from'] = isset($data['from']) ? trim($data['from']) : '';
  27. $data['memberId'] = isset($data['memberId']) ? trim($data['memberId']) : '';
  28. $data['inTimeStart'] = isset($data['inTimeStart']) ? trim($data['inTimeStart']) : '';
  29. $data['inTimeEnd'] = isset($data['inTimeEnd']) ? trim($data['inTimeEnd']) : '';
  30. $data['search'] = isset($data['search']) ? trim($data['search']) : '';
  31. $data['page'] = isset($data['page']) ? max(intval($data['page']), 1) : 1;
  32. $data['pageSize'] = isset($data['pageSize']) ? intval($data['pageSize']) : 20;
  33. $data['orderBy'] = isset($data['orderBy']) ? trim($data['orderBy']) : 'id desc';
  34. $data = ValidatorHelper::validateData($data, [
  35. ['type', 'integer'],
  36. ['from', 'string'],
  37. ['memberId', 'integer'],
  38. ['inTimeStart', 'integer'],
  39. ['inTimeEnd', 'integer'],
  40. ['search', 'string'],
  41. ['page', 'integer', 'min' => 1],
  42. ['pageSize', 'integer', 'min' => 1],
  43. ['orderBy', 'string'],
  44. ], $errors);
  45. if ($data == false) {
  46. return $this->outJson(0, '', $errors);
  47. }
  48. $query = Withdraw::find()->orderBy($data['orderBy']);
  49. $query->andFilterWhere(['type' => $data['type']]);
  50. if ($data['from'] == 'admin') {
  51. $query->andFilterWhere(['member_id' => $data['memberId']]);
  52. } else {
  53. $query->andWhere(['member_id' => $data['memberId']]);
  54. }
  55. $query->andFilterWhere(['>=', 'in_time', $data['inTimeStart']]);
  56. $query->andFilterWhere(['<', 'in_time', $data['inTimeEnd']]);
  57. $query->andFilterWhere(['or', ['like', 'true_name', $data['search']], ['like', 'login', $data['search']]]);
  58. $result = PaginationHelper::queryPage($query, $data['page'], $data['pageSize']);
  59. if ($data['from'] == 'admin') {
  60. $memberTypeCache = []; // 用户类型缓存
  61. $memberNameCache = []; // 用户名字缓存
  62. $ibNameCache = []; // 代理商名字缓存
  63. foreach ($result['dataList'] as &$row) {
  64. $row['rmb'] = Utils::formatFloatOrInt($row['amount'] * $row['rate']);
  65. $row['sk'] = Utils::formatFloatOrInt($row['amount'] + $row['fee']);
  66. if (!array_key_exists($row['member_id'], $memberTypeCache)) {
  67. $member = Member::findById($row['member_id']);
  68. if ($member == null) {
  69. $memberTypeCache[$row['member_id']] = '';
  70. $memberNameCache[$row['member_id']] = '';
  71. } else {
  72. $memberTypeCache[$row['member_id']] = $member['type'];
  73. $memberNameCache[$row['member_id']] = $member['name'];
  74. }
  75. }
  76. $row['memberType'] = $memberTypeCache[$row['member_id']];
  77. if (!array_key_exists($row['login'], $ibNameCache)) {
  78. $userMember = UserMember::findByLogin($row['login']);
  79. if ($userMember == null) {
  80. $ibNameCache[$row['login']] = '';
  81. } else {
  82. if (!array_key_exists($userMember['member_id'], $memberNameCache)) {
  83. $member = Member::findById($userMember['member_id']);
  84. if ($member == null) {
  85. $memberTypeCache[$userMember['member_id']] = '';
  86. $memberNameCache[$userMember['member_id']] = '';
  87. } else {
  88. $memberTypeCache[$userMember['member_id']] = $member['type'];
  89. $memberNameCache[$userMember['member_id']] = $member['name'];
  90. }
  91. }
  92. $ibNameCache[$row['login']] = $memberNameCache[$userMember['member_id']];
  93. }
  94. }
  95. $row['IBNAME'] = $ibNameCache[$row['login']];
  96. }
  97. }
  98. return $this->outJson(1, $result);
  99. }
  100. /**
  101. * 出金申请
  102. * @return \yii\web\Response
  103. */
  104. public function actionCreate()
  105. {
  106. $data = Yii::$app->getRequest()->post();
  107. $model = new Withdraw();
  108. foreach (['fee', 'in_time', 'out_time', 'rate', 'type'] as $field) {
  109. unset($data[$field]);
  110. }
  111. $rate = RateHelper::getRate();
  112. if (empty($rate['buyRate'])) {
  113. return $this->outJson(0, [], '汇率获取失败');
  114. }
  115. $data['rate'] = $rate['buyRate'];
  116. if (empty($data['member_id'])) {
  117. return $this->outJson(0, [], '用户ID不能为空');
  118. }
  119. if (empty($data['login'])) {
  120. return $this->outJson(0, [], 'mt4账户不能为空');
  121. }
  122. if (empty($data['amount']) || !is_numeric($data['amount']) || bccomp($data['amount'], '0.00', 2) <= 0) {
  123. return $this->outJson(0, [], '金额非法');
  124. }
  125. $member = Member::find()->where(['id' => $data['member_id']])->asArray()->limit(1)->one();
  126. if ($member == null) {
  127. return $this->outJson(0, [], '用户不存在');
  128. }
  129. $unDealList = Withdraw::getUnDealList($data['member_id']);
  130. if ($unDealList) {
  131. return $this->outJson(0, [], '您还有未处理的申请记录,请等待审核');
  132. }
  133. // 手续费
  134. $data['fee'] = Withdraw::getFee($data['amount'], $member);
  135. $mt4User = Mt4Users::find()->where(['LOGIN' => $data['login']])->asArray()->limit(1)->one();
  136. if ($mt4User == null) {
  137. return $this->outJson(0, [], 'mt4账户不存在');
  138. }
  139. if ($mt4User['BALANCE'] < $data['amount']) {
  140. return $this->outJson(0, [], '余额不足');
  141. }
  142. if ($mt4User['ENABLE_READONLY'] == 1) {
  143. return $this->outJson(0, [], '只读账号不能申请出金');
  144. }
  145. $query = Mt4Trades::find();
  146. $query->where(['LOGIN' => $data['login'], 'CLOSE_TIME' => '1970-01-01 00:00:00']);
  147. $query->andWhere(['<', 'CMD', 2]);
  148. $tcount = $query->count();
  149. if ($tcount > 0) {
  150. return $this->outJson(0, [], '有持仓订单不能出金,请平仓后再试');
  151. }
  152. if ($data['amount'] < 100) {
  153. return $this->outJson(0, [], '出金最小金额100美金');
  154. }
  155. if ($data['amount'] < $data['fee']) {
  156. return $this->outJson(0, [], '出金金额不足扣除手续费');
  157. }
  158. if ($data['amount'] > 7000) {
  159. return $this->outJson(0, [], '单笔出金金额最大7000美金');
  160. }
  161. $data['amount'] = $data['amount'] - $data['fee'];
  162. $data['type'] = 6;
  163. $data['in_time'] = intval(microtime(true) * 1000);
  164. //如果在后台设置了银行卡信息,则不允许用户修改该信息,取表里的数据
  165. $bank_info = MemberBankInfo::getBankInfoByMemberId($data['member_id']);
  166. if ($bank_info) {
  167. $data['bank_name'] = $bank_info['bank_name'];
  168. $data['bank_branch'] = $bank_info['bank_branch'];
  169. $data['bank_swift_code'] = $bank_info['bank_swift_code'];
  170. $data['bank_card_no'] = $bank_info['bank_card_no'];
  171. $data['bank_province'] = $bank_info['bank_province'];
  172. $data['bank_city'] = $bank_info['bank_city'];
  173. $data['name'] = $bank_info['name'];
  174. $data['mobile'] = $bank_info['mobile'];
  175. }
  176. $model->setAttributes($data);
  177. if ($model->save()) {
  178. $api = new Mt4ManagerApi();
  179. $api->userUpdate($data['login'], ['enable_read_only' => 1]);
  180. return $this->outJson(1, $model->getAttributes(), '操作成功');
  181. } else {
  182. return $this->outJson(0, [], $model->getErrors());
  183. }
  184. }
  185. /**
  186. * 获取当月出金记录
  187. * @return \yii\web\Response
  188. */
  189. public function actionGetMonthWithdraw()
  190. {
  191. $memberId = Yii::$app->getRequest()->get('memberId');
  192. if ($memberId == null || trim($memberId) === '') {
  193. return $this->outJson(0, [], '用户ID不能为空');
  194. }
  195. $result = Withdraw::getMonthWithdraw($memberId);
  196. return $this->outJson(1, $result, 'OK');
  197. }
  198. /**
  199. * 统计出金金额 amount+fee
  200. * @return \yii\web\Response
  201. */
  202. public function actionSumWithdraw()
  203. {
  204. $type = trim(Yii::$app->getRequest()->get('type'));
  205. $amount = Withdraw::sumWithdrawByType($type);
  206. return $this->outJson(1, Utils::formatFloatOrInt($amount));
  207. }
  208. /**
  209. * 统计出金金额 amount
  210. * @return \yii\web\Response
  211. */
  212. public function actionSumNotFee()
  213. {
  214. $type = trim(Yii::$app->getRequest()->get('type'));
  215. $amount = Withdraw::sumNotFeeByType($type);
  216. return $this->outJson(1, Utils::formatFloatOrInt($amount));
  217. }
  218. /**
  219. * 统计出金金额 人民币 amount*rate
  220. * @return \yii\web\Response
  221. */
  222. public function actionSumRmb()
  223. {
  224. $type = trim(Yii::$app->getRequest()->get('type'));
  225. $amount = Withdraw::sumRmbByType($type);
  226. return $this->outJson(1, Utils::formatFloatOrInt($amount));
  227. }
  228. /**
  229. * 出金详情
  230. * @return \yii\web\Response
  231. */
  232. public function actionDetail()
  233. {
  234. $id = intval(Yii::$app->getRequest()->get('id'));
  235. if ($id <= 0) {
  236. return $this->outJson(0, [], '参数非法');
  237. }
  238. /** @var Withdraw $withdraw */
  239. $withdraw = Withdraw::find()->where(['id' => $id])->limit(1)->one();
  240. if ($withdraw == null) {
  241. return $this->outJson(0, [], '数据不存在');
  242. }
  243. return $this->outJson(1, $withdraw->getAttributes());
  244. }
  245. /**
  246. * 修改出金记录
  247. * @return \yii\web\Response
  248. */
  249. public function actionUpdate()
  250. {
  251. $id = Yii::$app->getRequest()->post('id');
  252. if (!$id) {
  253. return $this->outJson(0, [], '参数非法');
  254. }
  255. /** @var Withdraw $withdraw */
  256. /*
  257. $withdraw = Withdraw::find()->where(['id' => $id])->limit(1)->one();
  258. if ($withdraw == null) {
  259. return $this->outJson(0, [], '数据不存在');
  260. }
  261. */
  262. $memo = trim(Yii::$app->getRequest()->post('memo'));
  263. $type = trim(Yii::$app->getRequest()->post('type'));
  264. $admin_name = trim(Yii::$app->getRequest()->post('admin_name'));
  265. //$memo != '' && $withdraw->memo = $memo;
  266. foreach ($id as $val) {
  267. $withdraw = Withdraw::find()->where(['id' => $val])->limit(1)->one();
  268. if ($withdraw == null) {
  269. return $this->outJson(0, [], '数据不存在');
  270. }
  271. if ($type != '' && in_array($type, [1, 2, 3, 5, 6])) {
  272. // 1审核不通过
  273. // 2已出金
  274. // 3管理员撤销
  275. if ($withdraw->type == 0 || $withdraw->type == 5 || $withdraw->type == 6) {
  276. $withdraw->type = $type;
  277. $admin_name != '' && $withdraw->admin_name = $admin_name;
  278. if ($type == 2) {
  279. $withdraw->out_time = intval(microtime(true) * 1000);
  280. }
  281. } else {
  282. return $this->outJson(0, [], "只有‘等待审核’和‘暂不处理’状态的出金申请才可操作");
  283. }
  284. }
  285. if ($type == 2 ) {
  286. $mt4Deposit = new Mt4Deposit();
  287. $result = $mt4Deposit->withdraw($withdraw->login, $withdraw->amount + $withdraw->fee, 'Withdraw');
  288. if ($result['errCode'] == 0 ) {
  289. //更改MT4状态
  290. $res = Withdraw::updateAll(['mt4_status' => 1], "id = $withdraw->id");
  291. if (!$res) {
  292. return $this->outJson(0, [], $result['errMsg']);
  293. }
  294. } else {
  295. return $this->outJson(0, [], $result['errMsg']);
  296. }
  297. }
  298. if ($withdraw->save()) {
  299. $api = new Mt4ManagerApi();
  300. $api->userUpdate($withdraw->login, ['enable_read_only' => 0]);
  301. }else {
  302. return $this->outJson(0, [], $withdraw->getErrors());
  303. }
  304. }
  305. return $this->outJson(1, [], '操作成功');
  306. }
  307. /**
  308. * 调用出金接口
  309. */
  310. public function actionWithdraw()
  311. {
  312. $mt4Id = (int) Yii::$app->request->post('mt4Id');
  313. $usdMoney = (float) Yii::$app->request->post('usdMoney');
  314. $comment = trim(Yii::$app->request->post('comment'));
  315. if (empty($mt4Id) || empty($usdMoney) || empty($comment)) {
  316. return $this->outJson(0, [], '缺少参数');
  317. }
  318. $mt4Deposit = new Mt4Deposit();
  319. $result = $mt4Deposit->withdraw($mt4Id, $usdMoney, $comment);
  320. return $this->outJson($result['errCode'] == 0 ? 1 : 0, $result['data'], $result['errMsg']);
  321. }
  322. }