StatisticsService.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <?php
  2. namespace addons\CloudStock\common\services;
  3. use addons\CloudStock\common\enums\CloudStockEnum;
  4. use addons\CloudStock\common\models\CloudStockAgent;
  5. use addons\CloudStock\common\models\CloudStockLossAmount;
  6. use addons\CloudStock\common\models\CloudStockPriceDifferenceProfit;
  7. use common\components\export\CsvTool;
  8. use common\enums\DownloadEnum;
  9. use common\enums\StatusEnum;
  10. use common\models\common\CapitalLog;
  11. use common\models\common\Download;
  12. use common\models\user\User;
  13. class StatisticsService extends BaseService
  14. {
  15. public $agent_price_arr;
  16. public function index($params)
  17. {
  18. $where = [];
  19. list($cloud_stock_loss_amount_list,
  20. $cloud_stock_price_difference_profit_list,
  21. $commission_list,
  22. $commission_frozen_list) = $this->getWhere($params, $where);
  23. $params['where'] = $where;
  24. $params['order'] = 'id desc';
  25. $page_data = CloudStockAgent::listPage($params, false, true);
  26. if (!empty($page_data['list'])) {
  27. $user_ids = array_column($page_data['list'], 'user_id');
  28. $user_list = User::lists(['where' => [
  29. ['id' => $user_ids],
  30. ['mall_id' => $this->mall_id]
  31. ],
  32. 'index' => 'id',
  33. ]);
  34. foreach ($page_data['list'] as &$item) {
  35. $item['user'] = [];
  36. if (isset($user_list[$item['user_id']])) {
  37. $item['user'] = [
  38. 'id' => $user_list[$item['user_id']]['id'],
  39. 'nickname' => $user_list[$item['user_id']]['nickname'],
  40. 'mobile' => $user_list[$item['user_id']]['mobile'],
  41. 'avatar_url' => $user_list[$item['user_id']]['avatar_url'],
  42. ];
  43. }
  44. if (isset($cloud_stock_loss_amount_list)) {
  45. if (isset($cloud_stock_loss_amount_list[$item['user_id']])) {
  46. $item['loss_amount'] = $cloud_stock_loss_amount_list[$item['user_id']]['money'];
  47. } else {
  48. $item['loss_amount'] = 0;
  49. }
  50. }
  51. if (isset($cloud_stock_price_difference_profit_list)) {
  52. if (isset($cloud_stock_price_difference_profit_list[$item['user_id']])) {
  53. $item['difference_profit'] = $cloud_stock_price_difference_profit_list[$item['user_id']]['money'];
  54. } else {
  55. $item['difference_profit'] = 0;
  56. }
  57. }
  58. if (isset($commission_list)) {
  59. if (isset($commission_list[$item['user_id']])) {
  60. $item['equal_award_price'] = $commission_list[$item['user_id']]['money'];
  61. } else {
  62. $item['equal_award_price'] = 0;
  63. }
  64. }
  65. if (isset($commission_frozen_list)) {
  66. if (isset($commission_frozen_list[$item['user_id']])) {
  67. $item['equal_award_frozen_price'] = $commission_frozen_list[$item['user_id']]['money'];
  68. } else {
  69. $item['equal_award_frozen_price'] = 0;
  70. }
  71. }
  72. }
  73. }
  74. return $page_data;
  75. }
  76. protected function getWhere($params, &$where)
  77. {
  78. $where[] = ['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED];
  79. $user_ids = null;
  80. if (!empty($params['keyword'])) {
  81. $user_list = User::lists(['where' => [
  82. ['mall_id' => $this->mall_id],
  83. ['or',
  84. ['like', 'nickname', $params['keyword']],
  85. ['like', 'mobile', $params['keyword']]]],
  86. 'select' => 'id']);
  87. if (!empty($user_list)) {
  88. $user_ids = array_column($user_list, 'id');
  89. $where[] = ['user_id' => $user_ids];
  90. } else {
  91. $user_ids = [];
  92. $where[] = ['user_id' => []];
  93. }
  94. }
  95. if (!empty($params['date'][0]) && !empty($params['date'][1])) {
  96. $condition = [
  97. ['mall_id' => $this->mall_id],
  98. ['>=', 'created_at', strtotime($params['date'][0] . ' 00:00:00')],
  99. ['<=', 'created_at', strtotime($params['date'][1] . ' 23:59:59')]
  100. ];
  101. if (isset($user_ids)) {
  102. $condition[] = ['user_id' => $user_ids];
  103. }
  104. $cloud_stock_loss_amount_list = CloudStockLossAmount::lists([
  105. 'where' => $condition,
  106. 'select' => 'sum(money) as money ,user_id',
  107. 'group' => 'user_id',
  108. ]);
  109. $uids = array_column($cloud_stock_loss_amount_list, 'user_id');
  110. $cloud_stock_loss_amount_list = array_column($cloud_stock_loss_amount_list, null, 'user_id');
  111. $cloud_stock_price_difference_profit_list = CloudStockPriceDifferenceProfit::lists([
  112. 'where' => $condition,
  113. 'select' => 'sum(money) as money,user_id',
  114. 'group' => 'user_id',
  115. ]);
  116. $uids = array_merge($uids, array_column($cloud_stock_price_difference_profit_list, 'user_id'));
  117. $cloud_stock_price_difference_profit_list = array_column($cloud_stock_price_difference_profit_list, null, 'user_id');
  118. $class = CapitalLog::class;
  119. $class::$capitalType = 'commission';
  120. $condition[] = ['from_type' => CloudStockEnum::ADDONS_NAME];
  121. $condition[] = ['capital_type' => ['equal', 'price_difference_equal']];
  122. $commission_list = $class::lists([
  123. 'where' => $condition,
  124. 'select' => 'sum(change_num) as money,user_id',
  125. 'group' => 'user_id',
  126. ]);
  127. $uids = array_merge($uids, array_column($commission_list, 'user_id'));
  128. $commission_list = array_column($commission_list, null, 'user_id');
  129. $class::$capitalType = 'commission_frozen';
  130. $condition[] = ['status' => 0];
  131. $commission_frozen_list = $class::lists([
  132. 'where' => $condition,
  133. 'select' => 'sum(change_num) as money,user_id',
  134. 'group' => 'user_id',
  135. ]);
  136. $uids = array_merge($uids, array_column($commission_frozen_list, 'user_id'));
  137. $where[] = ['user_id' => $uids];
  138. $commission_frozen_list = array_column($commission_frozen_list, null, 'user_id');
  139. }
  140. return [
  141. $cloud_stock_loss_amount_list ?? null,
  142. $cloud_stock_price_difference_profit_list ?? null,
  143. $commission_list ?? null,
  144. $commission_frozen_list ?? null
  145. ];
  146. }
  147. public function getListExportFieldList()
  148. {
  149. return $this->exportFieldsList();
  150. }
  151. public function exportFieldsList()
  152. {
  153. return [
  154. 'user_id' => '用户ID',
  155. 'nickname' => '用户昵称',
  156. 'mobile' => '手机号',
  157. 'equal_award_price' => '已结算平级奖',
  158. 'equal_award_frozen_price' => '待结算平级奖',
  159. 'difference_profit' => '差价利润',
  160. 'loss_amount' => '流失金额',
  161. ];
  162. }
  163. public static function exportData($params)
  164. {
  165. (new StatisticsService(['mall_id' => $params['mall_id']]))->export($params);
  166. }
  167. public function export($data)
  168. {
  169. ini_set('memory_limit', '512M');
  170. $download_id = $data['download_id'] ?? 0;
  171. $download = Download::findOne(['id' => $download_id]);
  172. if ($download) {
  173. try {
  174. $params = json_decode($download->params, true);
  175. $filename = $download->name;
  176. $type = $download->type;
  177. $where = [];
  178. list($cloud_stock_loss_amount_list,
  179. $cloud_stock_price_difference_profit_list,
  180. $commission_list,
  181. $commission_frozen_list) = $this->getWhere($params, $where);
  182. $params['where'] = $where;
  183. $params['order'] = 'id desc';
  184. $list = CloudStockAgent::lists($params);
  185. $fields = $params['fields'];
  186. $fields_arr = $this->exportFieldsList();
  187. $have_select_field_arr = [];
  188. foreach ($fields as $value) {
  189. $have_select_field_arr[] = $fields_arr[$value];
  190. }
  191. $csv = new CsvTool();
  192. $csv->filename = $filename;
  193. $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
  194. $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
  195. $csv->header = $have_select_field_arr;
  196. $user_id_arr = array_column($list, 'user_id');
  197. $user_arr = User::lists([
  198. 'where' => [
  199. ['id' => $user_id_arr]
  200. ],
  201. 'index' => 'id',
  202. ]);
  203. $csv->data = array_map(function ($item) use (
  204. $fields, $user_arr, $cloud_stock_loss_amount_list,
  205. $cloud_stock_price_difference_profit_list,
  206. $commission_list,
  207. $commission_frozen_list
  208. ) {
  209. $row = [];
  210. foreach ($fields as $field) {
  211. switch (true) {
  212. case $field == 'equal_award_price':
  213. if (isset($commission_list)) {
  214. if (isset($commission_list[$item['user_id']])) {
  215. $equal_award_price = $commission_list[$item['user_id']]['money'];
  216. } else {
  217. $equal_award_price = 0;
  218. }
  219. } else {
  220. $equal_award_price = $item['equal_award_price'];
  221. }
  222. $row[] = $equal_award_price;
  223. break;
  224. case $field == 'equal_award_frozen_price':
  225. if (isset($commission_frozen_list)) {
  226. if (isset($commission_frozen_list[$item['user_id']])) {
  227. $equal_award_frozen_price = $commission_frozen_list[$item['user_id']]['money'];
  228. } else {
  229. $equal_award_frozen_price = 0;
  230. }
  231. } else {
  232. $equal_award_frozen_price = $item['equal_award_frozen_price'];
  233. }
  234. $row[] = $equal_award_frozen_price;
  235. break;
  236. case $field == 'difference_profit':
  237. if (isset($cloud_stock_price_difference_profit_list)) {
  238. if (isset($cloud_stock_price_difference_profit_list[$item['user_id']])) {
  239. $difference_profit = $cloud_stock_price_difference_profit_list[$item['user_id']]['money'];
  240. } else {
  241. $difference_profit = 0;
  242. }
  243. } else {
  244. $difference_profit = $item['difference_profit'];
  245. }
  246. $row[] = $difference_profit;
  247. break;
  248. case $field == 'loss_amount':
  249. if (isset($cloud_stock_loss_amount_list)) {
  250. if (isset($cloud_stock_loss_amount_list[$item['user_id']])) {
  251. $loss_amount = $cloud_stock_loss_amount_list[$item['user_id']]['money'];
  252. } else {
  253. $loss_amount = 0;
  254. }
  255. } else {
  256. $loss_amount = $item['loss_amount'];
  257. }
  258. $row[] = $loss_amount;
  259. break;
  260. case $field == 'mobile':
  261. $row[] = $user_arr[$item['user_id']]['mobile'] ?? '';
  262. break;
  263. case $field == 'nickname':
  264. $row[] = $user_arr[$item['user_id']]['nickname'] ?? '';
  265. break;
  266. default:
  267. $row[] = !empty($item[$field]) ? $item[$field] : '';
  268. }
  269. }
  270. return $row;
  271. }, $list);
  272. $csv->export();
  273. $csv->updateDown($download, $params['mall_id']);
  274. return true;
  275. } catch (\Exception $e) {
  276. $download->status = 3;
  277. $res = $download->save();
  278. return $e->getMessage();
  279. }
  280. }
  281. }
  282. }