getWhere($params, $where); $params['where'] = $where; $params['order'] = 'id desc'; $page_data = CloudStockAgent::listPage($params, false, true); if (!empty($page_data['list'])) { $user_ids = array_column($page_data['list'], 'user_id'); $user_list = User::lists(['where' => [ ['id' => $user_ids], ['mall_id' => $this->mall_id] ], 'index' => 'id', ]); foreach ($page_data['list'] as &$item) { $item['user'] = []; if (isset($user_list[$item['user_id']])) { $item['user'] = [ 'id' => $user_list[$item['user_id']]['id'], 'nickname' => $user_list[$item['user_id']]['nickname'], 'mobile' => $user_list[$item['user_id']]['mobile'], 'avatar_url' => $user_list[$item['user_id']]['avatar_url'], ]; } if (isset($cloud_stock_loss_amount_list)) { if (isset($cloud_stock_loss_amount_list[$item['user_id']])) { $item['loss_amount'] = $cloud_stock_loss_amount_list[$item['user_id']]['money']; } else { $item['loss_amount'] = 0; } } if (isset($cloud_stock_price_difference_profit_list)) { if (isset($cloud_stock_price_difference_profit_list[$item['user_id']])) { $item['difference_profit'] = $cloud_stock_price_difference_profit_list[$item['user_id']]['money']; } else { $item['difference_profit'] = 0; } } if (isset($commission_list)) { if (isset($commission_list[$item['user_id']])) { $item['equal_award_price'] = $commission_list[$item['user_id']]['money']; } else { $item['equal_award_price'] = 0; } } if (isset($commission_frozen_list)) { if (isset($commission_frozen_list[$item['user_id']])) { $item['equal_award_frozen_price'] = $commission_frozen_list[$item['user_id']]['money']; } else { $item['equal_award_frozen_price'] = 0; } } } } return $page_data; } protected function getWhere($params, &$where) { $where[] = ['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]; $user_ids = null; if (!empty($params['keyword'])) { $user_list = User::lists(['where' => [ ['mall_id' => $this->mall_id], ['or', ['like', 'nickname', $params['keyword']], ['like', 'mobile', $params['keyword']]]], 'select' => 'id']); if (!empty($user_list)) { $user_ids = array_column($user_list, 'id'); $where[] = ['user_id' => $user_ids]; } else { $user_ids = []; $where[] = ['user_id' => []]; } } if (!empty($params['date'][0]) && !empty($params['date'][1])) { $condition = [ ['mall_id' => $this->mall_id], ['>=', 'created_at', strtotime($params['date'][0] . ' 00:00:00')], ['<=', 'created_at', strtotime($params['date'][1] . ' 23:59:59')] ]; if (isset($user_ids)) { $condition[] = ['user_id' => $user_ids]; } $cloud_stock_loss_amount_list = CloudStockLossAmount::lists([ 'where' => $condition, 'select' => 'sum(money) as money ,user_id', 'group' => 'user_id', ]); $uids = array_column($cloud_stock_loss_amount_list, 'user_id'); $cloud_stock_loss_amount_list = array_column($cloud_stock_loss_amount_list, null, 'user_id'); $cloud_stock_price_difference_profit_list = CloudStockPriceDifferenceProfit::lists([ 'where' => $condition, 'select' => 'sum(money) as money,user_id', 'group' => 'user_id', ]); $uids = array_merge($uids, array_column($cloud_stock_price_difference_profit_list, 'user_id')); $cloud_stock_price_difference_profit_list = array_column($cloud_stock_price_difference_profit_list, null, 'user_id'); $class = CapitalLog::class; $class::$capitalType = 'commission'; $condition[] = ['from_type' => CloudStockEnum::ADDONS_NAME]; $condition[] = ['capital_type' => ['equal', 'price_difference_equal']]; $commission_list = $class::lists([ 'where' => $condition, 'select' => 'sum(change_num) as money,user_id', 'group' => 'user_id', ]); $uids = array_merge($uids, array_column($commission_list, 'user_id')); $commission_list = array_column($commission_list, null, 'user_id'); $class::$capitalType = 'commission_frozen'; $condition[] = ['status' => 0]; $commission_frozen_list = $class::lists([ 'where' => $condition, 'select' => 'sum(change_num) as money,user_id', 'group' => 'user_id', ]); $uids = array_merge($uids, array_column($commission_frozen_list, 'user_id')); $where[] = ['user_id' => $uids]; $commission_frozen_list = array_column($commission_frozen_list, null, 'user_id'); } return [ $cloud_stock_loss_amount_list ?? null, $cloud_stock_price_difference_profit_list ?? null, $commission_list ?? null, $commission_frozen_list ?? null ]; } public function getListExportFieldList() { return $this->exportFieldsList(); } public function exportFieldsList() { return [ 'user_id' => '用户ID', 'nickname' => '用户昵称', 'mobile' => '手机号', 'equal_award_price' => '已结算平级奖', 'equal_award_frozen_price' => '待结算平级奖', 'difference_profit' => '差价利润', 'loss_amount' => '流失金额', ]; } public static function exportData($params) { (new StatisticsService(['mall_id' => $params['mall_id']]))->export($params); } public function export($data) { ini_set('memory_limit', '512M'); $download_id = $data['download_id'] ?? 0; $download = Download::findOne(['id' => $download_id]); if ($download) { try { $params = json_decode($download->params, true); $filename = $download->name; $type = $download->type; $where = []; list($cloud_stock_loss_amount_list, $cloud_stock_price_difference_profit_list, $commission_list, $commission_frozen_list) = $this->getWhere($params, $where); $params['where'] = $where; $params['order'] = 'id desc'; $list = CloudStockAgent::lists($params); $fields = $params['fields']; $fields_arr = $this->exportFieldsList(); $have_select_field_arr = []; foreach ($fields as $value) { $have_select_field_arr[] = $fields_arr[$value]; } $csv = new CsvTool(); $csv->filename = $filename; $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type); $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC; $csv->header = $have_select_field_arr; $user_id_arr = array_column($list, 'user_id'); $user_arr = User::lists([ 'where' => [ ['id' => $user_id_arr] ], 'index' => 'id', ]); $csv->data = array_map(function ($item) use ( $fields, $user_arr, $cloud_stock_loss_amount_list, $cloud_stock_price_difference_profit_list, $commission_list, $commission_frozen_list ) { $row = []; foreach ($fields as $field) { switch (true) { case $field == 'equal_award_price': if (isset($commission_list)) { if (isset($commission_list[$item['user_id']])) { $equal_award_price = $commission_list[$item['user_id']]['money']; } else { $equal_award_price = 0; } } else { $equal_award_price = $item['equal_award_price']; } $row[] = $equal_award_price; break; case $field == 'equal_award_frozen_price': if (isset($commission_frozen_list)) { if (isset($commission_frozen_list[$item['user_id']])) { $equal_award_frozen_price = $commission_frozen_list[$item['user_id']]['money']; } else { $equal_award_frozen_price = 0; } } else { $equal_award_frozen_price = $item['equal_award_frozen_price']; } $row[] = $equal_award_frozen_price; break; case $field == 'difference_profit': if (isset($cloud_stock_price_difference_profit_list)) { if (isset($cloud_stock_price_difference_profit_list[$item['user_id']])) { $difference_profit = $cloud_stock_price_difference_profit_list[$item['user_id']]['money']; } else { $difference_profit = 0; } } else { $difference_profit = $item['difference_profit']; } $row[] = $difference_profit; break; case $field == 'loss_amount': if (isset($cloud_stock_loss_amount_list)) { if (isset($cloud_stock_loss_amount_list[$item['user_id']])) { $loss_amount = $cloud_stock_loss_amount_list[$item['user_id']]['money']; } else { $loss_amount = 0; } } else { $loss_amount = $item['loss_amount']; } $row[] = $loss_amount; break; case $field == 'mobile': $row[] = $user_arr[$item['user_id']]['mobile'] ?? ''; break; case $field == 'nickname': $row[] = $user_arr[$item['user_id']]['nickname'] ?? ''; break; default: $row[] = !empty($item[$field]) ? $item[$field] : ''; } } return $row; }, $list); $csv->export(); $csv->updateDown($download, $params['mall_id']); return true; } catch (\Exception $e) { $download->status = 3; $res = $download->save(); return $e->getMessage(); } } } }