WithdrawController.php 15 KB

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