Volume.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. <?php
  2. namespace backend\models;
  3. use Yii;
  4. use common\helpers\Utils;
  5. use common\helpers\DateHelper;
  6. class Volume extends \yii\db\ActiveRecord
  7. {
  8. /**
  9. * @return \yii\db\Connection the database connection used by this AR class.
  10. */
  11. public static function getDb()
  12. {
  13. return Yii::$app->get('dbXcrm');
  14. }
  15. /**
  16. * @param array $post
  17. * @return array
  18. */
  19. public function getList($post)
  20. {
  21. $result = ['code' => 0, 'data' => [], 'message' => ''];
  22. $member_id = $post['member_id'];
  23. $order = isset($post['order']) ? $post['order'] : '';
  24. $orderBy = isset($post['orderBy']) ? strtolower($post['orderBy']) : 'desc';
  25. $search = isset($post['search']) ? $post['search'] : '';
  26. $start = isset($post['start']) ? (int) $post['start'] : 0;
  27. $length = isset($post['length']) ? (int) $post['length'] : 20;
  28. $sTime = isset($post['sTime']) ? DateHelper::convertDateToGmt($post['sTime']) : $this->defaultStartTime();
  29. $eTime = isset($post['eTime']) ? DateHelper::convertDateToGmt($post['eTime']. ' 23:59:59') : $this->defaultEndTime() . ' 23:59:59';
  30. $ibId = isset($post['ibId']) ? $post['ibId'] : 0;
  31. $draw = isset($post['draw']) ? $post['draw'] : 1;
  32. $where = ['and'];
  33. // 代理商,没有搜索条件就查所有
  34. $member = new Member();
  35. $ibs = $member->findChildrenIncludeSelf($member_id);
  36. $id_arr = array_column($ibs, 'id');
  37. if ($ibId && in_array($ibId, $id_arr)) {
  38. $id_arr = [$ibId];
  39. }
  40. if ($id_arr) {
  41. $where[] = ['in', 'cum.member_id', $id_arr];
  42. }
  43. // 账户或姓名
  44. if ($search) {
  45. $where[] = [
  46. 'or',
  47. ['like', 'mu.LOGIN', $search],
  48. ['like', 'mu.NAME', $search],
  49. ];
  50. }
  51. // 排序
  52. $allowOrderColumn = ['name', 'LOGIN', 'NAME'];
  53. if (in_array($order, $allowOrderColumn) && in_array($orderBy, ['asc', 'desc'])) {
  54. if ($order === 'name') {
  55. $order = 'cum.' . $order;
  56. } elseif ($order === 'NAME') {
  57. $order = 'mu.' . $order;
  58. }
  59. if ($order === 'LOGIN') {
  60. $order = 'mu.LOGIN';
  61. }
  62. if ($orderBy == 'asc') {
  63. $orderCondition = [$order => SORT_ASC];
  64. } else {
  65. $orderCondition = [$order => SORT_DESC];
  66. }
  67. } else {
  68. $orderCondition = ['mu.LOGIN' => SORT_DESC];
  69. }
  70. $query = UserMember::find();
  71. $query->alias('cum')
  72. ->select('cum.*, mu.*')
  73. ->innerJoin('mt4_users mu', 'cum.login = mu.LOGIN')
  74. ->where($where)
  75. ->orderBy($orderCondition);
  76. $count = $query->count();
  77. $query->offset($start)->limit($length);
  78. $list = $query->asArray()->all();
  79. if ($count) {
  80. $logins = array_column($list, 'login');
  81. // 配置,一定会有
  82. $config = Config::find()->asArray()->limit(1)->one();
  83. // forex
  84. $forexSymbols = preg_split('/\s*,\s*/', trim($config['forex_symbols']), -1, PREG_SPLIT_NO_EMPTY);
  85. // gold
  86. $xauSymbols = preg_split('/\s*,\s*/', trim($config['xau_symbols']), -1, PREG_SPLIT_NO_EMPTY);
  87. // silver
  88. $xagSymbols = preg_split('/\s*,\s*/', trim($config['xag_symbols']), -1, PREG_SPLIT_NO_EMPTY);
  89. // cfd
  90. $cfdSymbols = preg_split('/\s*,\s*/', trim($config['cfd_symbols']), -1, PREG_SPLIT_NO_EMPTY);
  91. // stock
  92. $stockSymbols = preg_split('/\s*,\s*/', trim($config['stock_symbols']), -1, PREG_SPLIT_NO_EMPTY);
  93. // btc
  94. $btcSymbols = preg_split('/\s*,\s*/', trim($config['btc_symbols']), -1, PREG_SPLIT_NO_EMPTY);
  95. $mt4Trades = new Mt4Trades();
  96. // 外汇,黄金,白银,CFD,股指,btc的交易量列表
  97. $fvList = $mt4Trades->getSumVolumeEachLogin($logins, $forexSymbols, $sTime, $eTime);
  98. $mvGoldList = $mt4Trades->getSumVolumeEachLogin($logins, $xauSymbols, $sTime, $eTime);
  99. $mvSilverList = $mt4Trades->getSumVolumeEachLogin($logins, $xagSymbols, $sTime, $eTime);
  100. $cvList = $mt4Trades->getSumVolumeEachLogin($logins, $cfdSymbols, $sTime, $eTime);
  101. $stvList = $mt4Trades->getSumVolumeEachLogin($logins, $stockSymbols, $sTime, $eTime);
  102. $btvList = $mt4Trades->getSumVolumeEachLogin($logins, $btcSymbols, $sTime, $eTime);
  103. // 外汇,黄金,白银,CFD,股指,btc的内佣列表,trade_type 外汇0,CFD1,黄金2,白银3,股指4,BTC5
  104. $fvCommissionList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 0, $sTime, $eTime);
  105. $mvGoldCommissionList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 2, $sTime, $eTime);
  106. $mvSilveCommissionList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 3, $sTime, $eTime);
  107. $cvCommissionList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 1, $sTime, $eTime);
  108. $stvCommissionList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 4, $sTime, $eTime);
  109. $btvCommissionList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 5, $sTime, $eTime);
  110. // 外汇,黄金,白银的外佣列表,CFD,股指,BTC没有外佣
  111. $fvCommissionWyList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 0, $sTime, $eTime, true);
  112. $mvGoldCommissionWyList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 2, $sTime, $eTime, true);
  113. $mvSilveCommissionWyList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 3, $sTime, $eTime, true);
  114. // 处理数据
  115. foreach ($list as $k => $v) {
  116. $list[$k]['MARGIN'] = Utils::formatFloatOrInt($v['MARGIN']);
  117. $list[$k]['MARGIN_FREE'] = Utils::formatFloatOrInt($v['MARGIN_FREE']);
  118. $list[$k]['MARGIN_LEVEL'] = Utils::formatFloatOrInt($v['MARGIN_LEVEL']);
  119. $list[$k]['EQUITY'] = Utils::formatFloatOrInt($v['EQUITY']);
  120. $list[$k]['MODIFY_TIME'] = date('m-d H:i', strtotime($v['MODIFY_TIME']));
  121. // 外汇,黄金,白银,CFD,股指,BTC交易量
  122. $list[$k]['fv'] = !empty($fvList[$v['login']]['total_volume']) ? (float) $fvList[$v['login']]['total_volume'] : 0;
  123. $list[$k]['mvGold'] = !empty($mvGoldList[$v['login']]['total_volume']) ? (float) $mvGoldList[$v['login']]['total_volume'] : 0;
  124. $list[$k]['mvSilver'] = !empty($mvSilverList[$v['login']]['total_volume']) ? (float) $mvSilverList[$v['login']]['total_volume'] : 0;
  125. $list[$k]['cv'] = !empty($cvList[$v['login']]['total_volume']) ? (float) $cvList[$v['login']]['total_volume'] : 0;
  126. $list[$k]['stv'] = !empty($stvList[$v['login']]['total_volume']) ? (float) $stvList[$v['login']]['total_volume'] : 0;
  127. $list[$k]['btv'] = !empty($btvList[$v['login']]['total_volume']) ? (float) $btvList[$v['login']]['total_volume'] : 0;
  128. // 外汇佣金
  129. $list[$k]['fvc'] = !empty($fvCommissionList[$v['login']]['total_commission']) ? (float) $fvCommissionList[$v['login']]['total_commission'] : 0;
  130. // 黄金佣金
  131. $list[$k]['gvc'] = !empty($mvGoldCommissionList[$v['login']]['total_commission']) ? (float) $mvGoldCommissionList[$v['login']]['total_commission'] : 0;
  132. // 白银佣金
  133. $list[$k]['svc'] = !empty($mvSilveCommissionList[$v['login']]['total_commission']) ? (float) $mvSilveCommissionList[$v['login']]['total_commission'] : 0;
  134. // CFD佣金
  135. $list[$k]['cvc'] = !empty($cvCommissionList[$v['login']]['total_commission']) ? (float) $cvCommissionList[$v['login']]['total_commission'] : 0;
  136. // 股指佣金
  137. $list[$k]['stvc'] = !empty($stvCommissionList[$v['login']]['total_commission']) ? (float) $stvCommissionList[$v['login']]['total_commission'] : 0;
  138. // BTC佣金
  139. $list[$k]['btvc'] = !empty($btvCommissionList[$v['login']]['total_commission']) ? (float) $btvCommissionList[$v['login']]['total_commission'] : 0;
  140. // 总外佣,CFD,股指,BTC没有外佣
  141. $list[$k]['wvc'] = 0;
  142. if (!empty($fvCommissionWyList[$v['login']]['total_commission'])) {
  143. $list[$k]['wvc'] += (float) $fvCommissionWyList[$v['login']]['total_commission'];
  144. }
  145. if (!empty($mvGoldCommissionWyList[$v['login']]['total_commission'])) {
  146. $list[$k]['wvc'] += (float) $mvGoldCommissionWyList[$v['login']]['total_commission'];
  147. }
  148. if (!empty($mvSilveCommissionWyList[$v['login']]['total_commission'])) {
  149. $list[$k]['wvc'] += (float) $mvSilveCommissionWyList[$v['login']]['total_commission'];
  150. }
  151. // 总佣金
  152. $list[$k]['tvc'] = $list[$k]['fvc'] + $list[$k]['gvc'] + $list[$k]['svc'] + $list[$k]['cvc'] + $list[$k]['stvc'] + $list[$k]['btvc'] + $list[$k]['wvc'];
  153. }
  154. }
  155. $data['data'] = $list;
  156. $data['draw'] = $draw;
  157. $data['recordsFiltered'] = $count;
  158. $data['recordsTotal'] = $count;
  159. $result['data'] = $data;
  160. $result['code'] = 1;
  161. return $result;
  162. }
  163. /**
  164. * @param array $post
  165. * @return array
  166. */
  167. public function cal($post)
  168. {
  169. $result = ['code' => 0, 'data' => [], 'message' => ''];
  170. $member_id = $post['member_id'];
  171. $sTime = isset($post['sTime']) ? DateHelper::convertDateToGmt($post['sTime']) : $this->defaultStartTime();
  172. $eTime = isset($post['eTime']) ? DateHelper::convertDateToGmt($post['eTime']. ' 23:59:59') : $this->defaultEndTime() . ' 23:59:59';
  173. $ibId = isset($post['ibId']) ? $post['ibId'] : 0;
  174. $where = ['and'];
  175. // 代理商,没有搜索条件就查所有
  176. $member = new Member();
  177. $ibs = $member->findChildrenIncludeSelf($member_id);
  178. $id_arr = array_column($ibs, 'id');
  179. if ($ibId && in_array($ibId, $id_arr)) {
  180. $id_arr = [$ibId];
  181. }
  182. if ($id_arr) {
  183. $where[] = ['in', 'cum.member_id', $id_arr];
  184. }
  185. $query = UserMember::find();
  186. $query->alias('cum')
  187. ->select('cum.login')
  188. ->innerJoin('mt4_users mu', 'cum.login = mu.LOGIN')
  189. ->where($where);
  190. $count = $query->count();
  191. $list = $query->asArray()->all();
  192. $fvSum = 0;
  193. $mvGoldSum = 0;
  194. $mvSilverSum = 0;
  195. $cvSum = 0;
  196. $stvSum = 0;
  197. $btvSum = 0;
  198. $fvcSum = 0;
  199. $gvcSum = 0;
  200. $svcSum = 0;
  201. $cvcSum = 0;
  202. $stvcSum = 0;
  203. $btvcSum = 0;
  204. $wvcSum = 0;
  205. $tvcSum = 0;
  206. if ($count) {
  207. $logins = array_column($list, 'login');
  208. // 配置,一定会有
  209. $config = Config::find()->asArray()->limit(1)->one();
  210. // forex
  211. $forexSymbols = preg_split('/\s*,\s*/', trim($config['forex_symbols']), -1, PREG_SPLIT_NO_EMPTY);
  212. // gold
  213. $xauSymbols = preg_split('/\s*,\s*/', trim($config['xau_symbols']), -1, PREG_SPLIT_NO_EMPTY);
  214. // silver
  215. $xagSymbols = preg_split('/\s*,\s*/', trim($config['xag_symbols']), -1, PREG_SPLIT_NO_EMPTY);
  216. // cfd
  217. $cfdSymbols = preg_split('/\s*,\s*/', trim($config['cfd_symbols']), -1, PREG_SPLIT_NO_EMPTY);
  218. // 股指
  219. $stockSymbols = preg_split('/\s*,\s*/', trim($config['stock_symbols']), -1, PREG_SPLIT_NO_EMPTY);
  220. // btc
  221. $btcSymbols = preg_split('/\s*,\s*/', trim($config['btc_symbols']), -1, PREG_SPLIT_NO_EMPTY);
  222. $mt4Trades = new Mt4Trades();
  223. // 外汇,黄金,白银,CFD,股指,BTC的总交易量
  224. $fvSum = $mt4Trades->getSumVolume($logins, $forexSymbols, $sTime, $eTime);
  225. $mvGoldSum = $mt4Trades->getSumVolume($logins, $xauSymbols, $sTime, $eTime);
  226. $mvSilverSum = $mt4Trades->getSumVolume($logins, $xagSymbols, $sTime, $eTime);
  227. $cvSum = $mt4Trades->getSumVolume($logins, $cfdSymbols, $sTime, $eTime);
  228. $stvSum = $mt4Trades->getSumVolume($logins, $stockSymbols, $sTime, $eTime);
  229. $btvSum = $mt4Trades->getSumVolume($logins, $btcSymbols, $sTime, $eTime);
  230. // 外汇,黄金,白银,CFD,股指,BTC的交易量列表
  231. $fvList = $mt4Trades->getSumVolumeEachLogin($logins, $forexSymbols, $sTime, $eTime);
  232. $mvGoldList = $mt4Trades->getSumVolumeEachLogin($logins, $xauSymbols, $sTime, $eTime);
  233. $mvSilverList = $mt4Trades->getSumVolumeEachLogin($logins, $xagSymbols, $sTime, $eTime);
  234. $cvList = $mt4Trades->getSumVolumeEachLogin($logins, $cfdSymbols, $sTime, $eTime);
  235. $stvList = $mt4Trades->getSumVolumeEachLogin($logins, $stockSymbols, $sTime, $eTime);
  236. $btvList = $mt4Trades->getSumVolumeEachLogin($logins, $btcSymbols, $sTime, $eTime);
  237. // 外汇,黄金,白银,CFD,股指,BTC的内佣列表,trade_type 外汇0,CFD1,黄金2,白银3,股指4,BTC5
  238. $fvCommissionList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 0, $sTime, $eTime);
  239. $mvGoldCommissionList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 2, $sTime, $eTime);
  240. $mvSilveCommissionList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 3, $sTime, $eTime);
  241. $cvCommissionList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 1, $sTime, $eTime);
  242. $stvCommissionList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 4, $sTime, $eTime);
  243. $btvCommissionList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 5, $sTime, $eTime);
  244. // 外汇,黄金,白银的外佣列表,CFD,股指,BTC没有外佣
  245. $fvCommissionWyList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 0, $sTime, $eTime, true);
  246. $mvGoldCommissionWyList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 2, $sTime, $eTime, true);
  247. $mvSilveCommissionWyList = $mt4Trades->getSumCommissionEachLogin($member_id, $logins, 3, $sTime, $eTime, true);
  248. // 计算佣金
  249. foreach ($list as $k => $v) {
  250. // 外汇,黄金,白银,CFD,股指,BTC交易量
  251. $list[$k]['fv'] = !empty($fvList[$v['login']]['total_volume']) ? (float) $fvList[$v['login']]['total_volume'] : 0;
  252. $list[$k]['mvGold'] = !empty($mvGoldList[$v['login']]['total_volume']) ? (float) $mvGoldList[$v['login']]['total_volume'] : 0;
  253. $list[$k]['mvSilver'] = !empty($mvSilverList[$v['login']]['total_volume']) ? (float) $mvSilverList[$v['login']]['total_volume'] : 0;
  254. $list[$k]['cv'] = !empty($cvList[$v['login']]['total_volume']) ? (float) $cvList[$v['login']]['total_volume'] : 0;
  255. $list[$k]['stv'] = !empty($stvList[$v['login']]['total_volume']) ? (float) $stvList[$v['login']]['total_volume'] : 0;
  256. $list[$k]['btv'] = !empty($btvList[$v['login']]['total_volume']) ? (float) $btvList[$v['login']]['total_volume'] : 0;
  257. // 外汇佣金
  258. if (!empty($fvCommissionList[$v['login']]['total_commission'])) {
  259. $fvcSum += (float) $fvCommissionList[$v['login']]['total_commission'];
  260. }
  261. // 黄金佣金
  262. if (!empty($mvGoldCommissionList[$v['login']]['total_commission'])) {
  263. $gvcSum += (float) $mvGoldCommissionList[$v['login']]['total_commission'];
  264. }
  265. // 白银佣金
  266. if (!empty($mvSilveCommissionList[$v['login']]['total_commission'])) {
  267. $svcSum += (float) $mvSilveCommissionList[$v['login']]['total_commission'];
  268. }
  269. // CFD佣金
  270. if (!empty($cvCommissionList[$v['login']]['total_commission'])) {
  271. $cvcSum += (float) $cvCommissionList[$v['login']]['total_commission'];
  272. }
  273. // 股指佣金
  274. if (!empty($stvCommissionList[$v['login']]['total_commission'])) {
  275. $stvcSum += (float) $stvCommissionList[$v['login']]['total_commission'];
  276. }
  277. // BTC佣金
  278. if (!empty($btvCommissionList[$v['login']]['total_commission'])) {
  279. $btvcSum += (float) $btvCommissionList[$v['login']]['total_commission'];
  280. }
  281. // 总外佣,CFD,股指,BTC没有外佣
  282. if (!empty($fvCommissionWyList[$v['login']]['total_commission'])) {
  283. $wvcSum += (float) $fvCommissionWyList[$v['login']]['total_commission'];
  284. }
  285. if (!empty($mvGoldCommissionWyList[$v['login']]['total_commission'])) {
  286. $wvcSum += (float) $mvGoldCommissionWyList[$v['login']]['total_commission'];
  287. }
  288. if (!empty($mvSilveCommissionWyList[$v['login']]['total_commission'])) {
  289. $wvcSum += (float) $mvSilveCommissionWyList[$v['login']]['total_commission'];
  290. }
  291. }
  292. // 总佣金
  293. $tvcSum += $fvcSum + $gvcSum + $svcSum + $cvcSum + $stvcSum + $wvcSum;
  294. }
  295. $result['data'] = [
  296. 'fvSum' => $fvSum,
  297. 'mvGoldSum' => $mvGoldSum,
  298. 'mvSilverSum' => $mvSilverSum,
  299. 'cvSum' => $cvSum,
  300. 'stvSum' => $stvSum,
  301. 'btvSum' => $btvSum,
  302. 'fvcSum' => $fvcSum,
  303. 'gvcSum' => $gvcSum,
  304. 'svcSum' => $svcSum,
  305. 'cvcSum' => $cvcSum,
  306. 'stvcSum' => $stvcSum,
  307. 'btvcSum' => $btvcSum,
  308. 'wvcSum' => $wvcSum,
  309. 'tvcSum' => $tvcSum,
  310. ];
  311. $result['code'] = 1;
  312. return $result;
  313. }
  314. /**
  315. * 默认开始时间,默认从上个星期天开始
  316. * @return string
  317. */
  318. protected function defaultStartTime()
  319. {
  320. return date('Y-m-d', strtotime('last sunday'));
  321. }
  322. /**
  323. * 默认结束时间,默认今天
  324. * @return string
  325. */
  326. protected function defaultEndTime()
  327. {
  328. return date('Y-m-d');
  329. }
  330. }