DashboardController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <?php
  2. namespace backend\controllers;
  3. use backend\models\UserMember;
  4. use backend\models\Withdraw;
  5. use Yii;
  6. use backend\models\Config;
  7. use backend\models\Member;
  8. use backend\models\Mt4Users;
  9. use backend\models\Mt4Trades;
  10. use backend\models\Open;
  11. use backend\models\ModifyLever;
  12. use backend\models\Transfer;
  13. class DashboardController extends BaseController
  14. {
  15. /**
  16. * ib首页
  17. */
  18. public function actionIbData()
  19. {
  20. $member_id = Yii::$app->request->post('member_id');
  21. $member = Member::find()->where(['id' => $member_id])->limit(1)->one();
  22. $main_login = $this->getMainLogin($member);
  23. $mt4User = new Mt4Users();
  24. $allUsers = $mt4User->getAllUsers($member_id, ['mu.LOGIN']);
  25. $logins = array_column($allUsers, 'LOGIN');
  26. // 配置,一定会有
  27. $config = Config::find()->asArray()->limit(1)->one();
  28. // 外汇,贵金属,CFD
  29. $mt4Trades = new Mt4Trades();
  30. $fvSum = $mt4Trades->getSumVolume($logins, explode(',', $config['forex_symbols']));
  31. $mvSum = $mt4Trades->getSumVolume($logins, explode(',', $config['metal_symbols']));
  32. $cvSum = $mt4Trades->getSumVolume($logins, explode(',', $config['cfd_symbols']));
  33. $tvSum = $fvSum + $mvSum + $cvSum;
  34. $depositSumByDay = $mt4Trades->getDepositSumByDayByLogins($main_login);
  35. // 直客数
  36. $directlyUserCount = UserMember::directlyUserCount($member_id);
  37. return $this->outJson(1, [
  38. 'fvSum' => $fvSum,
  39. 'mvSum' => $mvSum,
  40. 'cvSum' => $cvSum,
  41. 'tvSum' => $tvSum,
  42. 'endDate' => $config['end_his_trade_time'],
  43. 'directlyUserCount' => $directlyUserCount,
  44. 'depositSumByDay' => $depositSumByDay,
  45. ]);
  46. }
  47. /**
  48. * 后台首页统计信息
  49. */
  50. public function actionAdminData()
  51. {
  52. return $this->outJson(1, [
  53. 'xTraderCount' => Member::xTraderCount(),
  54. 'xBrokerCount' => Member::xBokerCount(),
  55. 'mt4UsersCount' => Mt4Users::mt4UsersCount(),
  56. 'openCount' => Open::countByType(0),
  57. 'modifyLeverCount' => ModifyLever::countByType(0),
  58. 'transferCount' => Transfer::countByType(0),
  59. ]);
  60. }
  61. /**
  62. * 名下代理和客户工单申请进度情况,申请出金,修改杠杆,申请转账,申请开户
  63. * @see \backend\models\Mt4Users::getList()
  64. */
  65. public function actionApplyList()
  66. {
  67. $post = Yii::$app->request->post();
  68. $member_id = isset($post['member_id']) ? (int) $post['member_id'] : 0;
  69. $order = isset($post['order']) ? $post['order'] : '';
  70. $orderBy = isset($post['orderBy']) ? strtolower($post['orderBy']) : 'desc';
  71. $search = isset($post['search']) ? trim($post['search']) : '';
  72. $start = isset($post['start']) ? (int) $post['start'] : 0;
  73. $length = isset($post['length']) ? (int) $post['length'] : 20;
  74. $draw = isset($post['draw']) ? $post['draw'] : 1;
  75. $result = ['code' => 0, 'data' => ['data' => [], 'draw' => $draw, 'recordsFiltered' => 0, 'recordsTotal' => 0], 'message' => ''];
  76. if (!$member_id) {
  77. $result['message'] = '参数错误';
  78. return json_encode($result);
  79. }
  80. // 先去查代理商名下代理商,再找他们的名下MT4用户的login,再通过login找到客户的member_id
  81. $where = " WHERE 1 ";
  82. $member = new Member();
  83. $ibList = $member->findChildrenIncludeSelf($member_id);
  84. if (!$ibList) {
  85. $result['message'] = '没有名下代理';
  86. return json_encode($result);
  87. }
  88. $ibIdArr = array_column($ibList, 'id');
  89. $userMemberList = UserMember::find()->alias('cum')
  90. ->select('cum.login, cum.member_id')
  91. ->innerJoin('mt4_users mu', 'cum.login = mu.LOGIN')
  92. ->where(['cum.member_id' => $ibIdArr])
  93. ->asArray()
  94. ->all();
  95. if (!$userMemberList) {
  96. $result['message'] = '没有数据.';
  97. return json_encode($result);
  98. }
  99. $loginArr = array_unique(array_column($userMemberList, 'login'));
  100. // find_in_set
  101. $customerWhere = '';
  102. foreach ($loginArr as $k => $v) {
  103. $customerWhere .= " FIND_IN_SET('{$v}', logins) OR ";
  104. }
  105. $customerWhere = trim($customerWhere);
  106. $customerWhere = substr($customerWhere, 0, -2);
  107. $customerList = Member::find()->select(['id', 'name', 'logins'])->where($customerWhere)->asArray()->all();
  108. $customerIdArr = array_column($customerList, 'id');
  109. // 代理和客户都要
  110. $memberIdArr = array_unique(array_merge($ibIdArr, $customerIdArr));
  111. // 如果是搜某个客户的话
  112. if ($search) {
  113. $searchMemberList = Member::find()->select(['id', 'logins'])->where(['or', ['=', 'name', $search], "FIND_IN_SET('{$search}', logins)"])->asArray()->all();
  114. if (!$searchMemberList) {
  115. $result['message'] = '没有该客户';
  116. return json_encode($result);
  117. }
  118. $searchMemberIdArr = array_unique(array_column($searchMemberList, 'id'));
  119. foreach ($searchMemberIdArr as $k => $v) {
  120. if (!in_array($v, $memberIdArr)) {
  121. unset($searchMemberIdArr[$k]);
  122. }
  123. }
  124. $memberIdStr = implode(',', $searchMemberIdArr);
  125. // 处理logins字段
  126. $searchMemberLoginsArr = array_unique(array_column($searchMemberList, 'logins'));
  127. $searchLoginArr = [];
  128. foreach ($searchMemberLoginsArr as $k => $v) {
  129. $temp = preg_split('/\s*,\s*/', trim($v), -1, PREG_SPLIT_NO_EMPTY);
  130. $searchLoginArr = array_merge($searchLoginArr, $temp);
  131. }
  132. if (!$searchMemberLoginsArr) {
  133. $result['message'] = '没有该客户.';
  134. return json_encode($result);
  135. }
  136. $searchLoginArr = array_unique($searchLoginArr);
  137. $searchLoginStr = '';
  138. $searchIsLogin = false; // 搜索的值是不是login,因为可以通过login和姓名搜索
  139. foreach ($searchLoginArr as $k => $v) {
  140. $searchLoginStr .= "'" . $v . "',";
  141. if ($v == $search) {
  142. $searchIsLogin = true;
  143. }
  144. }
  145. $searchLoginStr = rtrim($searchLoginStr, ',');
  146. $where .= " AND member_id IN ({$memberIdStr}) ";
  147. $where1 = $where2 = $where3 = $where;
  148. // 开户比较特殊,用户申请后member_id和mt4_login都为null
  149. $ibIdStr = implode(',', $ibIdArr);
  150. $where4 = " WHERE 1 AND (member_id IN ({$memberIdStr}) OR rid IN ({$ibIdStr})) ";
  151. if ($searchLoginStr) {
  152. if ($searchIsLogin) {
  153. $where1 .= " AND login = '{$search}' ";
  154. $where2 .= " AND login = '{$search}' ";
  155. $where3 .= " AND from_login = '{$search}' ";
  156. $where4 .= " AND mt4_login = '{$search}' ";
  157. } else {
  158. $where1 .= " AND login IN ($searchLoginStr) ";
  159. $where2 .= " AND login IN ($searchLoginStr) ";
  160. $where3 .= " AND from_login IN ($searchLoginStr) ";
  161. $where4 .= " AND mt4_login IN ($searchLoginStr) ";
  162. }
  163. }
  164. } else {
  165. $memberIdStr = implode(',', $memberIdArr);
  166. $where .= " AND member_id IN ({$memberIdStr}) ";
  167. $where1 = $where2 = $where3 = $where;
  168. // 开户比较特殊,用户申请后member_id和mt4_login都为null
  169. $ibIdStr = implode(',', $ibIdArr);
  170. $where4 = " WHERE 1 AND (member_id IN ({$memberIdStr}) OR rid IN ({$ibIdStr})) ";
  171. }
  172. // 排序
  173. $allowOrderColumn = ['business', 'in_time', 'type', 'complete_time'];
  174. if (in_array($order, $allowOrderColumn) && in_array($orderBy, ['asc', 'desc'])) {
  175. $orderCondition = " ORDER BY {$order} $orderBy ";
  176. } else {
  177. $orderCondition = " ORDER BY in_time $orderBy ";
  178. }
  179. // 条数限制
  180. $limitCondition = " LIMIT {$start}, {$length} ";
  181. $unionSql = "SELECT '申请出金' AS business, member_id, login, in_time, `type`, out_time AS complete_time, memo FROM " . Withdraw::tableName() . " {$where1}
  182. UNION ALL
  183. SELECT '修改杠杆' AS business, member_id, login, in_time, `type`, '-' AS complete_time, memo FROM " . ModifyLever::tableName() . " {$where2}
  184. UNION ALL
  185. SELECT '申请转账' AS business, member_id, from_login AS login, in_time, `type`, '-' AS complete_time, memo FROM " . Transfer::tableName() . " {$where3}
  186. UNION ALL
  187. SELECT '申请开户' AS business, member_id, mt4_login AS login, in_time, `type`, '-' AS complete_time, '-' AS memo FROM " . Open::tableName() . " {$where4} ";
  188. $countSql = "SELECT COUNT(*) FROM ({$unionSql}) AS temp_table";
  189. $count = Withdraw::getDb()->createCommand($countSql)->queryScalar();
  190. $list = [];
  191. if ($count) {
  192. $listSql = $unionSql . $orderCondition . $limitCondition;
  193. $list = Withdraw::getDb()->createCommand($listSql)->queryAll();
  194. foreach ($list as $k => $v) {
  195. $list[$k]['name'] = '-';
  196. $list[$k]['logins'] = '-';
  197. $list[$k]['login'] = $v['login'] ? $v['login'] : '-';
  198. $list[$k]['memo'] = $v['memo'] ? $v['memo'] : '-';
  199. foreach ($ibList as $k2 => $v2) {
  200. if ($v['member_id'] == $v2['id']) {
  201. $list[$k]['name'] = $v2['name'];
  202. $list[$k]['logins'] = $v2['logins'];
  203. break;
  204. }
  205. }
  206. // 不是代理的话则在客户里找
  207. if ($list[$k]['name'] == '-') {
  208. foreach ($customerList as $k3 => $v3) {
  209. if ($v['member_id'] == $v3['id']) {
  210. $list[$k]['name'] = $v3['name'];
  211. $list[$k]['logins'] = $v3['logins'];
  212. break;
  213. }
  214. }
  215. }
  216. $list[$k]['in_time'] = $v['in_time'] ? date('Y-m-d H:i:s', $v['in_time'] / 1000) : '-';
  217. $list[$k]['complete_time'] = $v['complete_time'] && $v['complete_time'] != '-' ? date('Y-m-d H:i:s', $v['complete_time'] / 1000) : '-';
  218. if ($v['business'] == '申请出金') {
  219. $list[$k]['type'] = isset(Withdraw::$typeTextMap[$v['type']]) ? Withdraw::$typeTextMap[$v['type']] : $v['type'];
  220. } elseif ($v['business'] == '修改杠杆') {
  221. $list[$k]['type'] = isset(ModifyLever::$typeTextMap[$v['type']]) ? ModifyLever::$typeTextMap[$v['type']] : $v['type'];
  222. }elseif ($v['business'] == '申请转账') {
  223. $list[$k]['type'] = isset(Transfer::$typeTextMap[$v['type']]) ? Transfer::$typeTextMap[$v['type']] : $v['type'];
  224. }elseif ($v['business'] == '申请开户') {
  225. $list[$k]['type'] = isset(Open::$typeTextMap[$v['type']]) ? Open::$typeTextMap[$v['type']] : $v['type'];
  226. }
  227. }
  228. }
  229. $data['data'] = $list;
  230. $data['draw'] = $draw;
  231. $data['recordsFiltered'] = $count;
  232. $data['recordsTotal'] = $count;
  233. $result['data'] = $data;
  234. $result['code'] = 1;
  235. return json_encode($result);
  236. }
  237. }