'上级配货', 2 => '下级补货', 3 => '会员买货' ]; } public function dispenseOrderManagement($params) { $where = []; $cloud_stock_dispense_order_list = $this->getWhere($params, $where); $params['where'] = $where; $page_data = CloudStockAgent::listPage($params, false, true); if (!empty($page_data['list'])) { $user_ids = array_column($page_data['list'], 'user_id'); if (!isset($cloud_stock_dispense_order_list)) { $cloud_stock_dispense_order_list = $this->getCloudStockDispenseOrderList($user_ids, '', ''); } $cloud_stock_dispense_order_arr = array_column($cloud_stock_dispense_order_list, null, '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'] = []; $item['counts'] = $item['num'] = $item['money'] = 0; 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_dispense_order_arr[$item['user_id']])) { $item['counts'] = $cloud_stock_dispense_order_arr[$item['user_id']]['counts']; $item['num'] = $cloud_stock_dispense_order_arr[$item['user_id']]['num']; $item['money'] = $cloud_stock_dispense_order_arr[$item['user_id']]['money']; } } } return $page_data; } protected function getWhere($params, &$where) { $where[] = ['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]; $is_search_user_keyword = 0; $user_ids = []; if (!empty($params['keyword'])) { $user_list = User::lists(['where' => [ ['mall_id' => $this->mall_id], ['or', ['like', 'nickname', $params['keyword']], ['like', 'mobile', $params['keyword']], ['=', 'id', $params['keyword']]]], 'select' => 'id']); $user_ids = array_column($user_list, 'id'); $where[] = ['user_id' => $user_ids]; $is_search_user_keyword = 1; } $cloud_stock_dispense_order_list = null; if (!empty($params['date'][0]) && !empty($params['date'][1])) { if ($is_search_user_keyword) { $cloud_stock_dispense_order_list = $this->getCloudStockDispenseOrderList($user_ids, $params['date'][0], $params['date'][1]); } else { $cloud_stock_dispense_order_list = $this->getCloudStockDispenseOrderList([], $params['date'][0], $params['date'][1]); } $user_ids = array_column($cloud_stock_dispense_order_list, 'user_id'); $where[] = ['user_id' => $user_ids]; } return $cloud_stock_dispense_order_list; } public function getDetail($params) { $condition[] = ['type' => 1]; $condition[] = ['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]; $condition[] = ['user_id' => $params['user_id']]; if (!empty($start)) { $condition[] = ['>=', 'created_at', strtotime($start . ' 00:00:00')]; } if (!empty($end)) { $condition[] = ['<=', 'created_at', strtotime($end . ' 23:59:59')]; } $cloud_stock_dispense_order_list = CloudStockDispenseOrder::lists([ 'where' => $condition, 'select' => 'goods_id,sum(num) num', 'group' => 'goods_id' ]); $goods_ids = array_column($cloud_stock_dispense_order_list, 'goods_id'); $goods_list = Goods::lists([ 'where' => [ ['id' => $goods_ids], ['mall_id' => $this->mall_id] ], 'select' => 'id,goods_name,cover_pic', 'index' => 'id' ]); foreach ($cloud_stock_dispense_order_list as &$item) { $item['goods'] = $goods_list[$item['goods_id']] ?? []; } return $cloud_stock_dispense_order_list; } protected function getCloudStockDispenseOrderList($user_ids, $start, $end) { $condition[] = ['type' => 1]; $condition[] = ['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]; if (!empty($user_ids)) { $condition[] = ['user_id' => $user_ids]; } if (!empty($start)) { $condition[] = ['>=', 'created_at', strtotime($start . ' 00:00:00')]; } if (!empty($end)) { $condition[] = ['<=', 'created_at', strtotime($end . ' 23:59:59')]; } $cloud_stock_dispense_order_list = CloudStockDispenseOrder::lists([ 'where' => $condition, 'select' => 'user_id,count(*) as counts,sum(money) as money,sum(num) num', 'group' => 'user_id' ]); return $cloud_stock_dispense_order_list; } public function getExportFieldList() { return $this->exportFieldsList(); } public function exportFieldsList() { return [ 'user_id' => '代理商id', 'nickname' => '代理商昵称', 'counts' => '配货总次数', 'num' => '配货商品数量', 'money' => '配货商品总金额', ]; } public static function exportData($params) { (new AgentService(['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 = []; $cloud_stock_dispense_order_list = $this->getWhere($params, $where); $params['where'] = $where; $params['order'] = 'id desc'; $list = CloudStockAgent::lists($params); $cloud_stock_dispense_order_arr = []; if (!empty($list)) { $user_ids = array_column($list, 'user_id'); if (!isset($cloud_stock_dispense_order_list)) { $cloud_stock_dispense_order_list = $this->getCloudStockDispenseOrderList($user_ids, '', ''); } $cloud_stock_dispense_order_arr = array_column($cloud_stock_dispense_order_list, null, 'user_id'); } $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_dispense_order_arr) { $row = []; foreach ($fields as $field) { switch (true) { case in_array($field, ['counts', 'num', 'money']): $row[] = $cloud_stock_dispense_order_arr[$item['user_id']][$field] ?? 0; 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(); } } } public function fix($capitalType) { CapitalLog::$capitalType = $capitalType; $where = [ 'mall_id' => $this->mall_id, 'from_type' => 'CloudStock', 'capital_type' => ['equal', 'price_difference_equal'] ]; if ($capitalType == 'commission_frozen') { $where['status'] = 0; } $list = CapitalLog::find()->where($where)->select('capital_type,sum(change_num) as change_num,user_id') ->groupBy('capital_type,user_id')->all(); foreach ($list as $item) { $change_num = $item['change_num']; $mall_id = $this->mall_id; $user_id = $item['user_id']; if ($capitalType == 'commission_frozen') { $sql = "update qimall_addons_cloud_stock_agent set equal_award_frozen_price = {$change_num} where mall_id = {$mall_id} and user_id = {$user_id} and status = 1"; } else { $sql = "update qimall_addons_cloud_stock_agent set equal_award_price = {$change_num} where mall_id = {$mall_id} and user_id = {$user_id} and status = 1"; } \Yii::$app->db->createCommand($sql)->execute(); } } public function setData($params) { $obj = CloudStockAgent::findOne([ 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => [StatusEnum::DISABLED, StatusEnum::ENABLED] ]); if ($obj) { if (empty($params['settlement_status'])) { $obj->equal_award_frozen_price += $params['money']; } else { $obj->equal_award_price += $params['money']; } $obj->save(); } return $obj; } /** * 修改代理设置 * * @param int $userId * @param array $data * * @return void */ public function modifyInfo(int $userId, array $data) { $allowedFields = [ 'is_stock_deducted_by_subordinate' ]; foreach ($data as $k => $_) { if (!in_array($k, $allowedFields)) { unset($data[$k]); } } if (empty($allowedFields)) { return; } CloudStockAgent::updateAll($data, ['user_id' => $userId, 'mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]); } /** * 根据等级获取渠道用户id * * @param array $levels * * @return array */ public function getAgentListByLevels(array $levels): array { return CloudStockAgent::find() ->where([ 'mall_id' => $this->mall_id, 'level' => $levels, 'status' => StatusEnum::ENABLED ]) ->select('user_id') ->column(); } }