Mt4tradeController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  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 common\helpers\StringHelper;
  10. use common\helpers\Utils;
  11. use Yii;
  12. use common\helpers\DateHelper;
  13. class Mt4tradeController extends BaseController
  14. {
  15. /*
  16. * 获取总平仓单数
  17. */
  18. public function actionGetHistoryTotalCount()
  19. {
  20. $login = Yii::$app->getRequest()->get('login');
  21. $count = Mt4Trades::countHistoryByLogin($login);
  22. return $this->outJson(1, $count, 'OK');
  23. }
  24. /*
  25. * 获取总平仓单数(赢钱)
  26. */
  27. public function actionGetHistoryWinCount()
  28. {
  29. $login = Yii::$app->getRequest()->get('login');
  30. $count = Mt4Trades::countWinHistoryByLogin($login);
  31. return $this->outJson(1, $count, 'OK');
  32. }
  33. /*
  34. * 获取总平仓单数(输钱)
  35. */
  36. public function actionGetHistoryLossCount()
  37. {
  38. $login = Yii::$app->getRequest()->get('login');
  39. $count = Mt4Trades::countLossHistoryByLogin($login);
  40. return $this->outJson(1, $count, 'OK');
  41. }
  42. /**
  43. * 每日收益图
  44. * @return \yii\web\Response
  45. */
  46. public function actionSumProfitByDay()
  47. {
  48. $login = Yii::$app->getRequest()->get('login');
  49. $mt4Trades = new Mt4Trades();
  50. $data = $mt4Trades->getProfitSumByDay($login);
  51. return $this->outJson(1, $data, 'OK');
  52. }
  53. /**
  54. * 交易手数
  55. * @return \yii\web\Response
  56. */
  57. public function actionVolumeSumByDay()
  58. {
  59. $login = Yii::$app->getRequest()->get('login');
  60. $mt4Trades = new Mt4Trades();
  61. $data = $mt4Trades->getVolumeSumByDay($login);
  62. return $this->outJson(1, $data, 'OK');
  63. }
  64. /**
  65. * 交易货币分布
  66. * @return \yii\web\Response
  67. */
  68. public function actionSymbolCount()
  69. {
  70. $login = Yii::$app->getRequest()->get('login');
  71. $mt4Trades = new Mt4Trades();
  72. $data = $mt4Trades->getSymbolCount($login);
  73. return $this->outJson(1, $data, 'OK');
  74. }
  75. /**
  76. * 交易来源分布
  77. * @return \yii\web\Response
  78. */
  79. public function actionReasonCount()
  80. {
  81. $login = Yii::$app->getRequest()->get('login');
  82. $mt4Trades = new Mt4Trades();
  83. $data = $mt4Trades->getReasonCount($login);
  84. return $this->outJson(1, $data, 'OK');
  85. }
  86. /**
  87. * 总入金 总出金
  88. * @return \yii\web\Response
  89. */
  90. public function actionSumProfit()
  91. {
  92. $data = Yii::$app->getRequest()->get();
  93. $data['type'] = isset($data['type']) ? trim($data['type']) : '';
  94. $data['login'] = isset($data['login']) ? trim($data['login']) : '';
  95. $data['closeTimeStart'] = isset($data['closeTimeStart']) ? trim($data['closeTimeStart']) : '';
  96. $data['closeTimeEnd'] = isset($data['closeTimeEnd']) ? trim($data['closeTimeEnd']) : '';
  97. $data = ValidatorHelper::validateData($data, [
  98. ['type', 'required'],
  99. ['login', 'integer'],
  100. ['closeTimeStart', 'string'],
  101. ['closeTimeEnd', 'string'],
  102. ], $errors);
  103. if ($data == false) {
  104. return $this->outJson(0, '', $errors);
  105. }
  106. $query = Mt4Trades::find();
  107. Mt4Trades::addTypeCondition($query, $data['type']);
  108. $query->andWhere(['LOGIN' => $data['login']]);
  109. $query->andFilterWhere(['>=', 'CLOSE_TIME', $data['closeTimeStart']]);
  110. $query->andFilterWhere(['<=', 'CLOSE_TIME', $data['closeTimeEnd']]);
  111. $profit = $query->sum('PROFIT');
  112. $profit = $profit ? $profit : 0;
  113. return $this->outJson(1, ['profit' => $profit]);
  114. }
  115. /**
  116. * 交易列表
  117. * @return \yii\web\Response
  118. */
  119. public function actionList()
  120. {
  121. $data = Yii::$app->getRequest()->get();
  122. $data['type'] = isset($data['type']) ? trim($data['type']) : '';
  123. $data['login'] = isset($data['login']) ? trim($data['login']) : '';
  124. $data['closeTimeStart'] = isset($data['closeTimeStart']) ? DateHelper::convertDateToGmt($data['closeTimeStart']) : '';
  125. $data['closeTimeEnd'] = isset($data['closeTimeEnd']) ? DateHelper::convertDateToGmt($data['closeTimeEnd']) : '';
  126. $data['search'] = isset($data['search']) ? trim($data['search']) : '';
  127. $data['page'] = isset($data['page']) ? max(intval($data['page']), 1) : 1;
  128. $data['pageSize'] = isset($data['pageSize']) ? intval($data['pageSize']) : 20;
  129. $data['orderBy'] = isset($data['orderBy']) ? trim($data['orderBy']) : 'TICKET desc';
  130. $data = ValidatorHelper::validateData($data, [
  131. ['type', 'required'],
  132. ['login', 'integer'],
  133. ['closeTimeStart', 'string'],
  134. ['closeTimeEnd', 'string'],
  135. ['search', 'string'],
  136. ['page', 'integer', 'min' => 1],
  137. ['pageSize', 'integer', 'min' => 1],
  138. ['orderBy', 'string'],
  139. ], $errors);
  140. if ($data == false) {
  141. return $this->outJson(0, '', $errors);
  142. }
  143. $select = ['TICKET', 'LOGIN', 'CMD', 'SYMBOL', 'SL', 'TP', 'VOLUME', 'OPEN_PRICE', 'OPEN_TIME', 'CLOSE_PRICE', 'CLOSE_TIME', 'SWAPS', 'COMMISSION', 'PROFIT', 'MODIFY_TIME'];
  144. $query = Mt4Trades::find()->select($select)->orderBy($data['orderBy']);
  145. Mt4Trades::addTypeCondition($query, $data['type']);
  146. $query->andWhere(['LOGIN' => $data['login']]);
  147. $query->andFilterWhere(['>=', 'CLOSE_TIME', $data['closeTimeStart']]);
  148. $query->andFilterWhere(['<=', 'CLOSE_TIME', $data['closeTimeEnd']]);
  149. $query->andFilterWhere(['or', ['like', 'LOGIN', $data['search']], ['like', 'TICKET', $data['search']]]);
  150. $result = PaginationHelper::queryPage($query, $data['page'], $data['pageSize']);
  151. // 合计数据
  152. $sumData = Mt4Trades::findSum($data['login'], $data['type'], $data['closeTimeStart'], $data['closeTimeEnd'], $data['search']);
  153. $sumData["IBNAME"] = "";
  154. $sumData["LOGIN"] = "";
  155. $sumData["NAME"] = "";
  156. $sumData["TICKET"] = "";
  157. $sumData["CMD"] = "99";
  158. $sumData["SYMBOL"] = "";
  159. $sumData["SL"] = "";
  160. $sumData["TP"] = "";
  161. $sumData["VOLUME"] = $sumData['sv'];
  162. $sumData["OPEN_PRICE"] = "";
  163. $sumData["OPEN_TIME"] = "";
  164. $sumData["CLOSE_PRICE"] = "";
  165. $sumData["CLOSE_TIME"] = "";
  166. $sumData["SWAPS"] = Utils::formatFloatOrInt($sumData['ss']);
  167. $sumData["COMMISSION"] = Utils::formatFloatOrInt($sumData['sc']);
  168. $sumData["MODIFY_TIME"] = "";
  169. $sumData["SPROFIT"] = Utils::formatFloatOrInt($sumData['sp']);
  170. $sumData["PROFIT"] = Utils::formatFloatOrInt($sumData['sp']);
  171. $result['dataList'][] = $sumData;
  172. return $this->outJson(1, $result);
  173. }
  174. /**
  175. * 代理商 交易列表
  176. * @return \yii\web\Response
  177. */
  178. public function actionIbList()
  179. {
  180. $data = Yii::$app->getRequest()->get();
  181. $data['type'] = isset($data['type']) ? trim($data['type']) : '';
  182. $data['memberId'] = isset($data['memberId']) ? trim($data['memberId']) : '';
  183. $data['ibId'] = isset($data['ibId']) ? trim($data['ibId']) : '';
  184. $data['name'] = isset($data['name']) ? trim($data['name']) : '';
  185. $data['closeTimeStart'] = isset($data['closeTimeStart']) ? DateHelper::convertDateToGmt($data['closeTimeStart']) : '';
  186. $data['closeTimeEnd'] = isset($data['closeTimeEnd']) ? DateHelper::convertDateToGmt($data['closeTimeEnd']) : '';
  187. $data['search'] = isset($data['search']) ? trim($data['search']) : '';
  188. $data['page'] = isset($data['page']) ? max(intval($data['page']), 1) : 1;
  189. $data['pageSize'] = isset($data['pageSize']) ? intval($data['pageSize']) : 20;
  190. $data['orderBy'] = isset($data['orderBy']) ? trim($data['orderBy']) : 'TICKET desc';
  191. $data = ValidatorHelper::validateData($data, [
  192. ['type', 'required'],
  193. ['memberId', 'required'],
  194. ['memberId', 'integer'],
  195. ['ibId', 'integer'],
  196. ['name', 'string'],
  197. ['closeTimeStart', 'string'],
  198. ['closeTimeEnd', 'string'],
  199. ['search', 'string'],
  200. ['page', 'integer', 'min' => 1],
  201. ['pageSize', 'integer', 'min' => 1],
  202. ['orderBy', 'string'],
  203. ], $errors);
  204. if ($data == false) {
  205. return $this->outJson(0, '', $errors);
  206. }
  207. /** @var Member $member */
  208. $member = Member::find()->where(['id' => $data['memberId']])->limit(1)->one();
  209. if ($member == null) {
  210. return $this->outJson(0, [], '用户不存在');
  211. }
  212. // 查询下级代理
  213. $children = $member->findChildrenIncludeSelf($member['id']);
  214. if ($data['ibId']) {
  215. $childrenTemp = [];
  216. foreach ($children as $child) {
  217. if ($child['id'] == $data['ibId']) {
  218. $childrenTemp = $member->findChildrenIncludeSelf($child['id']);
  219. break;
  220. }
  221. }
  222. $children = $childrenTemp;
  223. unset($childrenTemp);
  224. }
  225. $ids = [];
  226. foreach ($children as $child) {
  227. $ids[] = $child['id'];
  228. }
  229. $mt4Users = Mt4Users::find()->alias('u')->select('u.LOGIN,u.NAME,um.member_id')
  230. ->innerJoin(UserMember::tableName() . ' um', 'um.login=u.LOGIN')
  231. ->where(['um.member_id' => $ids])->andFilterWhere(['like', 'u.NAME', $data['name']])->asArray()->all();
  232. $userNames = [];
  233. $ibMemberIds = [];
  234. foreach ($mt4Users as $mt4User) {
  235. $userNames[$mt4User['LOGIN']] = $mt4User;
  236. $ibMemberIds[] = $mt4User['member_id'];
  237. }
  238. unset($mt4Users);
  239. $ibMembers = Member::find()->select('id,name')->where(['id' => $ibMemberIds])->asArray()->all();
  240. $ibMemberNames = [];
  241. foreach ($ibMembers as $key => $ibMember) {
  242. $ibMemberNames[$ibMember['id']] = $ibMember['name'];
  243. }
  244. unset($ibMembers);
  245. foreach ($userNames as $login => $mt4User) {
  246. $userNames[$login]['IBNAME'] = isset($ibMemberNames[$mt4User['member_id']]) ? $ibMemberNames[$mt4User['member_id']] : '';
  247. }
  248. $logins = array_keys($userNames);
  249. $select = ['TICKET', 'LOGIN', 'CMD', 'SYMBOL', 'SL', 'TP', 'VOLUME', 'OPEN_PRICE', 'OPEN_TIME', 'CLOSE_PRICE', 'CLOSE_TIME', 'SWAPS', 'COMMISSION', 'PROFIT', 'MODIFY_TIME', 'COMMENT'];
  250. if ($data['type'] == 'deposit' || $data['type'] == 'withdraw') {
  251. $select[] = 'SUM(PROFIT) as SPROFIT';
  252. $query = Mt4Trades::find()->select($select)->orderBy($data['orderBy'])->groupBy('LOGIN');
  253. } else {
  254. $query = Mt4Trades::find()->select($select)->orderBy($data['orderBy']);
  255. }
  256. Mt4Trades::addTypeCondition($query, $data['type']);
  257. $query->andWhere('LOGIN IN (' . StringHelper::buildInSql($logins) . ')');
  258. $query->andFilterWhere(['>=', 'CLOSE_TIME', $data['closeTimeStart']]);
  259. $query->andFilterWhere(['<=', 'CLOSE_TIME', $data['closeTimeEnd']]);
  260. $query->andFilterWhere(['or', ['like', 'LOGIN', $data['search']], ['like', 'TICKET', $data['search']]]);
  261. $result = PaginationHelper::queryPage($query, $data['page'], $data['pageSize']);
  262. foreach ($result['dataList'] as $key => &$row) {
  263. $row['SWAPS'] = Utils::formatFloatOrInt($row['SWAPS']);
  264. $row['PROFIT'] = Utils::formatFloatOrInt($row['PROFIT']);
  265. $row['COMMISSION'] = Utils::formatFloatOrInt($row['COMMISSION']);
  266. $row['SL'] = Utils::formatFloatOrInt($row['SL'], 5);
  267. $row['TP'] = Utils::formatFloatOrInt($row['TP'], 5);
  268. $row['OPEN_PRICE'] = Utils::formatFloatOrInt($row['OPEN_PRICE'], 5);
  269. $row['CLOSE_PRICE'] = Utils::formatFloatOrInt($row['CLOSE_PRICE'], 5);
  270. $row['CLOSE_PRICE'] = Utils::formatFloatOrInt($row['CLOSE_PRICE'], 5);
  271. if (array_key_exists('SPROFIT', $row)) {
  272. $row['SPROFIT'] = Utils::formatFloatOrInt($row['SPROFIT']);
  273. }
  274. $row['NAME'] = isset($userNames[$row['LOGIN']]['NAME']) ? $userNames[$row['LOGIN']]['NAME'] : '';
  275. $row['IBNAME'] = isset($userNames[$row['LOGIN']]['IBNAME']) ? $userNames[$row['LOGIN']]['IBNAME'] : '';
  276. $row['type'] = $row['COMMENT'] === 'deposit(ssac)' ? 'SSAC入金' : '银联入金';
  277. }
  278. $sumData = Mt4Trades::findSum($logins, $data['type'], $data['closeTimeStart'], $data['closeTimeEnd'], $data['search']);
  279. $sumData["IBNAME"] = "";
  280. $sumData["LOGIN"] = "";
  281. $sumData["NAME"] = "";
  282. $sumData["TICKET"] = "";
  283. $sumData["CMD"] = "99";
  284. $sumData["SYMBOL"] = "";
  285. $sumData["SL"] = "";
  286. $sumData["TP"] = "";
  287. $sumData["VOLUME"] = $sumData['sv'];
  288. $sumData["OPEN_PRICE"] = "";
  289. $sumData["OPEN_TIME"] = "";
  290. $sumData["CLOSE_PRICE"] = "";
  291. $sumData["CLOSE_TIME"] = "";
  292. $sumData["SWAPS"] = Utils::formatFloatOrInt($sumData['ss']);
  293. $sumData["COMMISSION"] = Utils::formatFloatOrInt($sumData['sc']);
  294. $sumData["MODIFY_TIME"] = "";
  295. $sumData["SPROFIT"] = Utils::formatFloatOrInt($sumData['sp']);
  296. $sumData["PROFIT"] = Utils::formatFloatOrInt($sumData['sp']);
  297. $sumData["type"] = "";
  298. $result['dataList'][] = $sumData;
  299. return $this->outJson(1, $result);
  300. }
  301. /**
  302. * 后台交易管理列表数据
  303. */
  304. public function actionAdminList()
  305. {
  306. $model = new Mt4Trades();
  307. $result = $model->getAdminList(Yii::$app->request->post());
  308. if ($result['code']) {
  309. return $this->outJson(1, $result['data']);
  310. } else {
  311. return $this->outJson(0, [], $result['message']);
  312. }
  313. }
  314. }