| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- <?php
- namespace backend\modules\mall\services;
- use common\components\export\CsvTool;
- use common\enums\DownloadEnum;
- use common\enums\OrderStatusEnum;
- use common\enums\StatusEnum;
- use common\models\common\Download;
- use common\models\common\MallSetting;
- use common\models\order\Order;
- use common\models\user\User;
- use common\models\user\UserLevel;
- use common\models\user\UserPartitionRelationship;
- use common\models\user\UserTeamAchievementOrder;
- use common\models\user\UserTeamStatistics;
- use Exception;
- use yii\caching\DbDependency;
- /**
- * 团队数据
- * @package backend\modules\mall\services
- */
- class TeamService extends BaseService
- {
- /**
- * 获取团队分页数据
- *
- * @param array $params
- * @return array
- */
- public function getTeamSizePageList(array $params = [])
- {
- $data = User::getPaginationList($this->getLimit($params), function ($query) use ($params) {
- $query->select('id, nickname, avatar_url, mobile, level');
- $query->andWhere(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]);
- // 等级查询
- if (isset($params['level'])) {
- $query->andWhere(['level' => $params['level']]);
- }
- // 用户ID查询
- if (isset($params['user_id']) && !empty($params['user_id'])) {
- $query->andWhere(['id' => $params['user_id']]);
- }
- // 关键词查询
- if (isset($params['keyword']) && !empty($params['keyword'])) {
- $query->andWhere([
- 'or',
- ['like', 'nickname', $params['keyword']],
- ['like', 'mobile', $params['keyword']],
- ]);
- }
- // 会员等级
- $query->with(['userLevel' => function ($query) {
- $query->select('id, mall_id, level, name, status');
- }]);
- });
- $levels = UserLevel::getListIndexByLevelColumn($this->mall_id, [StatusEnum::ENABLED, StatusEnum::DISABLED]);
- $user_id_arr = array_column($data['list'], 'id');
- $user_id_arr && $user_team_statistics_list = UserTeamStatistics::lists([
- 'where' => [['user_id' => $user_id_arr]],
- 'select' => 'user_id,user_team_total,user_direct_total,user_indirect_total,team_finish_order_total,team_finish_order_price_total,user_team_order_price_total',
- 'index' => 'user_id',
- ]);
- foreach ($data['list'] as &$user) {
- $user['level_name'] = isset($levels[$user['level']]) ? $levels[$user['level']] : MallSetting::getDefaultLevelName($this->mall_id);
- $user['user_team_total'] = $user['user_direct_total'] = $user['user_indirect_total'] = 0;
- if (isset($user_team_statistics_list[$user['id']])) {
- $user['user_team_total'] = $user_team_statistics_list[$user['id']]['user_team_total'];
- $user['user_direct_total'] = $user_team_statistics_list[$user['id']]['user_direct_total'];
- $user['user_indirect_total'] = $user_team_statistics_list[$user['id']]['user_indirect_total'];
- $user['team_finish_order_total'] = $user_team_statistics_list[$user['id']]['team_finish_order_total'];
- $user['team_finish_order_price_total'] = $user_team_statistics_list[$user['id']]['team_finish_order_price_total'];
- $user['user_team_order_price_total'] = $user_team_statistics_list[$user['id']]['user_team_order_price_total'];
- }
- }
- return $data;
- }
- /**
- * 个人团队下面的业绩
- *
- * @param integer $uid
- * @param array $params
- * @return array
- */
- public function getTeamAchievementPageList(int $uid, array $params = [])
- {
- $total_order_num = 0;
- $total_pay_money = 0;
- $total_pay_achievement = 0;
- $list = UserTeamAchievementOrder::getPaginationListByUid($uid, $this->getLimit($params), function($query) use (
- $params, &$total_order_num, &$total_pay_money, &$total_pay_achievement, $uid
- ) {
- $query->where(['superior_user_id' => $uid, 'status' => 2]);
- $query->with(['order' => function($query) {
- $query->select([
- 'id', 'user_id', 'order_no', 'goods_price', 'pay_money',
- 'IFNULL(shipping_money, 0) as shipping_money',
- '(pay_money - IFNULL(shipping_money, 0)) as achievement', 'pay_time', 'created_at'
- ]);
- }, 'user' => function($query) {
- $query->select('id, nickname, mobile, avatar_url');
- }]);
- // 时间查询
- if (isset($params['date']) && !empty($params['date'])) {
- $query->andWhere([
- 'between',
- 'created_at',
- strtotime($params['date'][0]), (strtotime($params['date'][1]) + 86399)
- ]);
- }
- // 时间查询
- if (isset($params['keyword']) && $params['keyword'] !== '') {
- $keywordOrWhere = ['or', ['like', 'nickname', $params['keyword']]];
- if (is_numeric($params['keyword'])) {
- $keywordOrWhere[] = ['like', 'mobile', $params['keyword']];
- $keywordOrWhere[] = ['=', 'id', $params['keyword']];
- }
- $query->andWhere([
- 'user_id' => User::find()
- ->where([
- 'mall_id' => $this->mall_id,
- 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]
- ])
- ->andWhere($keywordOrWhere)
- ->select('id')
- ->column()
- ]);
- }
- // 统计
- $query2 = clone $query;
- $total_pay_money = Order::find()->where(['id' => $query2->select('order_id')])->sum('pay_money');
- $total_pay_achievement = Order::find()->where(['id' => $query2->select('order_id')])->sum('(pay_money - IFNULL(shipping_money, 0))');
- $total_order_num = $query->count();
- }, 'id desc');
- // 统计 总金额,订单数
- $list['total_pay_money'] = $total_pay_money;
- $list['total_order_num'] = $total_order_num;
- $list['total_pay_achievement'] = $total_pay_achievement;
- return $list;
- }
- /**
- * 团队业绩导出
- * @return bool
- */
- public function achievementExport(array $data)
- {
- $download_id = $data['download_id'] ?? 0;
- $download = Download::findOne(['id' => $download_id]);
- if (!$download) {
- return false;
- }
- try {
- $params = json_decode($download->params, true);
- if (empty($params)) {
- \Yii::$app->custom->logs('团队业绩导出参数为空');
- return false;
- }
- $filename = $download->name;
- $type = $download->type;
- $where = ['AND'];
- $where[] = ['status' => 2, 'superior_user_id' => $params['uid'], 'mall_id' => $params['mall_id']];
- if (!empty($params['date'])) {
- $where[] = ['between', 'created_at', strtotime(reset($params['date'])), strtotime(end($params['date'])) + 86400];
- }
- $userTeam = UserTeamAchievementOrder::getTeamAchievementList($params['uid'], $where)
- ->with(['order'=> function ($query) {
- $query->select([
- 'id', 'user_id', 'order_no', 'goods_price', 'pay_money',
- 'IFNULL(shipping_money, 0) as shipping_money',
- '(pay_money - IFNULL(shipping_money, 0)) as achievement', 'pay_time', 'created_at'
- ])->with(['detail' => function ($query) {
- $query->select(['order_id', 'goods_name', 'goods_attr_name', 'goods_price', 'price', 'num']);
- }]);
- }, 'user' => function ($query) {
- $query->select('id, nickname, mobile, avatar_url');
- }])->orderBy('id desc');
- $exportList = [];
- foreach ($userTeam->asArray()->batch() as $user) {
- foreach ($user as $item) {
- foreach ($item['order']['detail'] as $k => $detail) {
- if ($k == 0) {
- $achievement = $item['order']['achievement'] ?? '';
- } else {
- $achievement = '';
- }
- $exportList[] = [
- $item['user_id'],
- $item['user']['nickname'] ?? '',
- $item['user']['mobile'] ?? '',
- $item['order']['order_no'] ?? '',
- $detail['goods_name'] ?? '',
- $detail['goods_attr_name'] ?? '',
- $detail['num'] ?? '',
- $detail['goods_price'] ?? '',
- $item['order']['shipping_money'] ?? '',
- $achievement,
- !empty($item['order']['pay_time']) ? date('Y-m-d H:i:s', $item['order']['pay_time']) : '',
- !empty($item['order']['created_at']) ? date('Y-m-d H:i:s', $item['order']['created_at']) : '',
- ];
- }
- }
- }
- if (!empty($exportList)) {
- $csv = new CsvTool();
- $csv->filename = $filename;
- $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
- $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
- $csv->header = ['会员ID', '会员昵称', '会员手机号', '订单号', '商品名称', '规格', '购买数量', '支付金额', '运费', '业绩', '支付时间', '下单时间'];
- $csv->data = $exportList;
- $csv->export();
- $csv->updateDown($download, $params['mall_id']);
- }
- } catch (Exception $e) {
- $download->status = 3;
- $download->save();
- $this->setError($e->getMessage());
- return false;
- }
- return true;
- }
- }
|