Mt4Users.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. <?php
  2. namespace backend\models;
  3. use Yii;
  4. use yii\db\ActiveQuery;
  5. /**
  6. * This is the model class for table "mt4_users".
  7. *
  8. * @property integer $LOGIN
  9. * @property string $GROUP
  10. * @property integer $ENABLE
  11. * @property integer $ENABLE_CHANGE_PASS
  12. * @property integer $ENABLE_READONLY
  13. * @property integer $ENABLE_OTP
  14. * @property string $PASSWORD_PHONE
  15. * @property string $NAME
  16. * @property string $COUNTRY
  17. * @property string $CITY
  18. * @property string $STATE
  19. * @property string $ZIPCODE
  20. * @property string $ADDRESS
  21. * @property string $LEAD_SOURCE
  22. * @property string $PHONE
  23. * @property string $EMAIL
  24. * @property string $COMMENT
  25. * @property string $ID
  26. * @property string $STATUS
  27. * @property string $REGDATE
  28. * @property string $LASTDATE
  29. * @property integer $LEVERAGE
  30. * @property integer $AGENT_ACCOUNT
  31. * @property integer $TIMESTAMP
  32. * @property double $BALANCE
  33. * @property double $PREVMONTHBALANCE
  34. * @property double $PREVBALANCE
  35. * @property double $CREDIT
  36. * @property double $INTERESTRATE
  37. * @property double $TAXES
  38. * @property integer $SEND_REPORTS
  39. * @property integer $MQID
  40. * @property integer $USER_COLOR
  41. * @property double $EQUITY
  42. * @property double $MARGIN
  43. * @property double $MARGIN_LEVEL
  44. * @property double $MARGIN_FREE
  45. * @property string $CURRENCY
  46. * @property resource $API_DATA
  47. * @property string $MODIFY_TIME
  48. */
  49. class Mt4Users extends \yii\db\ActiveRecord
  50. {
  51. /**
  52. * @inheritdoc
  53. */
  54. public static function tableName()
  55. {
  56. return 'mt4_users';
  57. }
  58. /**
  59. * @return \yii\db\Connection the database connection used by this AR class.
  60. */
  61. public static function getDb()
  62. {
  63. return Yii::$app->get('dbXcrm');
  64. }
  65. /**
  66. * @inheritdoc
  67. */
  68. public function rules()
  69. {
  70. return [
  71. [['LOGIN', 'GROUP', 'ENABLE', 'ENABLE_CHANGE_PASS', 'ENABLE_READONLY', 'PASSWORD_PHONE', 'NAME', 'COUNTRY', 'CITY', 'STATE', 'ZIPCODE', 'ADDRESS', 'PHONE', 'EMAIL', 'COMMENT', 'ID', 'STATUS', 'REGDATE', 'LASTDATE', 'LEVERAGE', 'AGENT_ACCOUNT', 'TIMESTAMP', 'BALANCE', 'PREVMONTHBALANCE', 'PREVBALANCE', 'CREDIT', 'INTERESTRATE', 'TAXES', 'SEND_REPORTS', 'USER_COLOR', 'MODIFY_TIME'], 'required'],
  72. [['LOGIN', 'ENABLE', 'ENABLE_CHANGE_PASS', 'ENABLE_READONLY', 'ENABLE_OTP', 'LEVERAGE', 'AGENT_ACCOUNT', 'TIMESTAMP', 'SEND_REPORTS', 'MQID', 'USER_COLOR'], 'integer'],
  73. [['REGDATE', 'LASTDATE', 'MODIFY_TIME'], 'safe'],
  74. [['BALANCE', 'PREVMONTHBALANCE', 'PREVBALANCE', 'CREDIT', 'INTERESTRATE', 'TAXES', 'EQUITY', 'MARGIN', 'MARGIN_LEVEL', 'MARGIN_FREE'], 'number'],
  75. [['API_DATA'], 'string'],
  76. [['GROUP', 'ZIPCODE', 'STATUS', 'CURRENCY'], 'string', 'max' => 16],
  77. [['PASSWORD_PHONE', 'COUNTRY', 'CITY', 'STATE', 'LEAD_SOURCE', 'PHONE', 'ID'], 'string', 'max' => 32],
  78. [['NAME', 'ADDRESS'], 'string', 'max' => 128],
  79. [['EMAIL'], 'string', 'max' => 48],
  80. [['COMMENT'], 'string', 'max' => 64],
  81. ];
  82. }
  83. /**
  84. * @inheritdoc
  85. */
  86. public function attributeLabels()
  87. {
  88. return [
  89. 'LOGIN' => 'Login',
  90. 'GROUP' => 'Group',
  91. 'ENABLE' => 'Enable',
  92. 'ENABLE_CHANGE_PASS' => 'Enable Change Pass',
  93. 'ENABLE_READONLY' => 'Enable Readonly',
  94. 'ENABLE_OTP' => 'Enable Otp',
  95. 'PASSWORD_PHONE' => 'Password Phone',
  96. 'NAME' => 'Name',
  97. 'COUNTRY' => 'Country',
  98. 'CITY' => 'City',
  99. 'STATE' => 'State',
  100. 'ZIPCODE' => 'Zipcode',
  101. 'ADDRESS' => 'Address',
  102. 'LEAD_SOURCE' => 'Lead Source',
  103. 'PHONE' => 'Phone',
  104. 'EMAIL' => 'Email',
  105. 'COMMENT' => 'Comment',
  106. 'ID' => 'ID',
  107. 'STATUS' => 'Status',
  108. 'REGDATE' => 'Regdate',
  109. 'LASTDATE' => 'Lastdate',
  110. 'LEVERAGE' => 'Leverage',
  111. 'AGENT_ACCOUNT' => 'Agent Account',
  112. 'TIMESTAMP' => 'Timestamp',
  113. 'BALANCE' => 'Balance',
  114. 'PREVMONTHBALANCE' => 'Prevmonthbalance',
  115. 'PREVBALANCE' => 'Prevbalance',
  116. 'CREDIT' => 'Credit',
  117. 'INTERESTRATE' => 'Interestrate',
  118. 'TAXES' => 'Taxes',
  119. 'SEND_REPORTS' => 'Send Reports',
  120. 'MQID' => 'Mqid',
  121. 'USER_COLOR' => 'User Color',
  122. 'EQUITY' => 'Equity',
  123. 'MARGIN' => 'Margin',
  124. 'MARGIN_LEVEL' => 'Margin Level',
  125. 'MARGIN_FREE' => 'Margin Free',
  126. 'CURRENCY' => 'Currency',
  127. 'API_DATA' => 'Api Data',
  128. 'MODIFY_TIME' => 'Modify Time',
  129. ];
  130. }
  131. public function findByLogin($login, $asArray = false)
  132. {
  133. $query = self::find()->where(['login' => $login])->limit(1);
  134. if ($asArray) {
  135. $query->asArray();
  136. }
  137. $user = $query->one();
  138. if ($user) {
  139. $user['MARGIN'] = doubleval(round($user['MARGIN'] * 100) / 100.0);
  140. $user['MARGIN_FREE'] = doubleval(round($user['MARGIN_FREE'] * 100) / 100.0);
  141. $user['MARGIN_LEVEL'] = doubleval(round($user['MARGIN_LEVEL'] * 100) / 100.0);
  142. $user['EQUITY'] = doubleval(round($user['EQUITY'] * 100) / 100.0);
  143. }
  144. return $user;
  145. }
  146. /**
  147. * 名下用户
  148. * @param array $post
  149. * @param bool $addTotalToList 是否把总数加到列表的最后一行
  150. * @return array
  151. */
  152. public function getList($post, $addTotalToList = true)
  153. {
  154. $result = ['code' => 0, 'data' => [], 'message' => ''];
  155. $member_id = $post['member_id'];
  156. $order = isset($post['order']) ? $post['order'] : '';
  157. $orderBy = isset($post['orderBy']) ? strtolower($post['orderBy']) : 'desc';
  158. $search = isset($post['search']) ? $post['search'] : '';
  159. $start = isset($post['start']) ? (int) $post['start'] : 0;
  160. $length = isset($post['length']) ? (int) $post['length'] : 20;
  161. $ibId = isset($post['ibId']) ? $post['ibId'] : 0;
  162. $draw = isset($post['draw']) ? $post['draw'] : 1;
  163. $where = ['and'];
  164. // 代理商,没有搜索条件就查当前用户
  165. $member = new Member();
  166. $ibs = $member->findChildrenIncludeSelf($member_id);
  167. $id_arr = array_column($ibs, 'id');
  168. if ($ibId && in_array($ibId, $id_arr)) {
  169. $ibs = $member->findChildrenIncludeSelf($ibId);
  170. $id_arr = array_column($ibs, 'id');
  171. }
  172. if ($id_arr) {
  173. $where[] = ['in', 'cum.member_id', $id_arr];
  174. }
  175. // 账户或姓名
  176. if ($search) {
  177. $where[] = [
  178. 'or',
  179. ['like', 'mu.LOGIN', $search],
  180. ['like', 'mu.NAME', $search],
  181. ];
  182. }
  183. // 排序
  184. $allowOrderColumn = ['name', 'LOGIN', 'NAME', 'LEVERAGE', 'BALANCE', 'MARGIN', 'MARGIN_FREE', 'MARGIN_LEVEL', 'EQUITY', 'MODIFY_TIME', 'GROUP'];
  185. if (in_array($order, $allowOrderColumn) && in_array($orderBy, ['asc', 'desc'])) {
  186. if ($order === 'name') {
  187. $order = 'cum.' . $order;
  188. } elseif ($order === 'NAME') {
  189. $order = 'mu.' . $order;
  190. }
  191. if ($order === 'LOGIN') {
  192. $order = 'mu.LOGIN';
  193. }
  194. if ($orderBy == 'asc') {
  195. $orderCondition = [$order => SORT_ASC];
  196. } else {
  197. $orderCondition = [$order => SORT_DESC];
  198. }
  199. } else {
  200. $orderCondition = ['mu.LOGIN' => SORT_DESC];
  201. }
  202. $query = UserMember::find();
  203. $query->alias('cum')
  204. ->select('cum.*, mu.*')
  205. ->innerJoin('mt4_users mu', 'cum.login = mu.LOGIN')
  206. ->where($where)
  207. ->orderBy($orderCondition);
  208. $count = $query->count();
  209. $query->offset($start)->limit($length);
  210. $list = $query->asArray()->all();
  211. if ($count) {
  212. foreach ($list as $k => $v) {
  213. $list[$k]['in_time'] = (int) $v['in_time'];
  214. $list[$k]['MODIFY_TIME'] = date('m-d H:i', strtotime($v['MODIFY_TIME']));
  215. $list[$k]['MARGIN'] = round($v['MARGIN'], 2);
  216. $list[$k]['MARGIN_FREE'] = round($v['MARGIN_FREE'], 2);
  217. $list[$k]['MARGIN_LEVEL'] = round($v['MARGIN_LEVEL'], 2);
  218. $list[$k]['EQUITY'] = round($v['EQUITY'], 2);
  219. }
  220. // 计算总数,放到最后一行
  221. if ($addTotalToList) {
  222. $query = UserMember::find();
  223. $sum = $query->alias('cum')
  224. ->select(['SUM(mu.BALANCE) AS balance', 'SUM(mu.MARGIN) AS margin', 'SUM(mu.MARGIN_FREE) AS margin_free', 'SUM(mu.EQUITY) AS equity'])
  225. ->innerJoin('mt4_users mu', 'cum.login = mu.LOGIN')
  226. ->where($where)
  227. ->asArray()
  228. ->limit(1)
  229. ->one();
  230. $lastRow = [
  231. 'BALANCE' => round($sum['balance'], 2),
  232. 'EQUITY' => round($sum['equity'], 2),
  233. 'LEVERAGE' => '',
  234. 'LOGIN' => '',
  235. 'MARGIN' => round($sum['margin'], 2),
  236. 'MARGIN_FREE' => round($sum['margin_free'], 2),
  237. 'MARGIN_LEVEL' => '',
  238. 'MODIFY_TIME' => '',
  239. 'NAME' => '',
  240. 'name' => '',
  241. ];
  242. array_push($list, $lastRow);
  243. }
  244. } else {
  245. // 没有数据则输出默认值
  246. if ($addTotalToList) {
  247. $list = [
  248. [
  249. 'BALANCE' => 0,
  250. 'EQUITY' => 0,
  251. 'LEVERAGE' => '',
  252. 'LOGIN' => '',
  253. 'MARGIN' => 0,
  254. 'MARGIN_FREE' => 0,
  255. 'MARGIN_LEVEL' => '',
  256. 'MODIFY_TIME' => '',
  257. 'NAME' => '',
  258. 'name' => '',
  259. ],
  260. ];
  261. }
  262. }
  263. $data['data'] = $list;
  264. $data['draw'] = $draw;
  265. $data['recordsFiltered'] = $count;
  266. $data['recordsTotal'] = $count;
  267. $result['data'] = $data;
  268. $result['code'] = 1;
  269. return $result;
  270. }
  271. /**
  272. * 名下所有账户
  273. * @param int $member_id 当前登录用户的id
  274. * @param array|string $select
  275. * @return array
  276. */
  277. public function getAllUsers($member_id, $select = 'cum.*, mu.*')
  278. {
  279. // 代理商,没有搜索条件就查当前用户
  280. $member = new Member();
  281. $ibs = $member->findChildrenIncludeSelf($member_id);
  282. $id_arr = array_column($ibs, 'id');
  283. if (!$id_arr) {
  284. return [];
  285. }
  286. $query = UserMember::find();
  287. $list = $query->alias('cum')
  288. ->select($select)
  289. ->innerJoin('mt4_users mu', 'cum.login = mu.LOGIN')
  290. ->where(['in', 'cum.member_id', $id_arr])
  291. ->asArray()
  292. ->all();
  293. return $list;
  294. }
  295. /**
  296. * MT4用户数
  297. */
  298. public static function mt4UsersCount()
  299. {
  300. return static::find()->where(['!=', 'GROUP', 'demoforex-usd'])->count();
  301. }
  302. /**
  303. * 获取代理商用户信息
  304. * @return ActiveQuery
  305. */
  306. public function getIbMember()
  307. {
  308. return $this->hasOne(Member::className(), ['id' => 'member_id'])->viaTable(UserMember::tableName(), ['login' => 'LOGIN']);
  309. }
  310. /**
  311. * 获取代理商名下代理商的名下MT4用户
  312. * @param array|int member_ids
  313. * @return array
  314. */
  315. public static function findChildLogins($member_ids)
  316. {
  317. if (is_numeric($member_ids)) {
  318. $member_ids = [$member_ids];
  319. }
  320. $list = UserMember::find()->alias('cum')
  321. ->select('cum.*, mu.*')
  322. ->innerJoin('mt4_users mu', 'cum.login = mu.LOGIN')
  323. ->where(['in', 'cum.member_id', $member_ids])
  324. ->orderBy(['mu.LOGIN' => SORT_DESC])
  325. ->asArray()
  326. ->all();
  327. return $list;
  328. }
  329. }