WithdrawController.php 16 KB

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