TeamService.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <?php
  2. namespace backend\modules\mall\services;
  3. use common\components\export\CsvTool;
  4. use common\enums\DownloadEnum;
  5. use common\enums\OrderStatusEnum;
  6. use common\enums\StatusEnum;
  7. use common\models\common\Download;
  8. use common\models\common\MallSetting;
  9. use common\models\order\Order;
  10. use common\models\user\User;
  11. use common\models\user\UserLevel;
  12. use common\models\user\UserPartitionRelationship;
  13. use common\models\user\UserTeamAchievementOrder;
  14. use common\models\user\UserTeamStatistics;
  15. use Exception;
  16. use yii\caching\DbDependency;
  17. /**
  18. * 团队数据
  19. * @package backend\modules\mall\services
  20. */
  21. class TeamService extends BaseService
  22. {
  23. /**
  24. * 获取团队分页数据
  25. *
  26. * @param array $params
  27. * @return array
  28. */
  29. public function getTeamSizePageList(array $params = [])
  30. {
  31. $data = User::getPaginationList($this->getLimit($params), function ($query) use ($params) {
  32. $query->select('id, nickname, avatar_url, mobile, level');
  33. $query->andWhere(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]);
  34. // 等级查询
  35. if (isset($params['level'])) {
  36. $query->andWhere(['level' => $params['level']]);
  37. }
  38. // 用户ID查询
  39. if (isset($params['user_id']) && !empty($params['user_id'])) {
  40. $query->andWhere(['id' => $params['user_id']]);
  41. }
  42. // 关键词查询
  43. if (isset($params['keyword']) && !empty($params['keyword'])) {
  44. $query->andWhere([
  45. 'or',
  46. ['like', 'nickname', $params['keyword']],
  47. ['like', 'mobile', $params['keyword']],
  48. ]);
  49. }
  50. // 会员等级
  51. $query->with(['userLevel' => function ($query) {
  52. $query->select('id, mall_id, level, name, status');
  53. }]);
  54. });
  55. $levels = UserLevel::getListIndexByLevelColumn($this->mall_id, [StatusEnum::ENABLED, StatusEnum::DISABLED]);
  56. $user_id_arr = array_column($data['list'], 'id');
  57. $user_id_arr && $user_team_statistics_list = UserTeamStatistics::lists([
  58. 'where' => [['user_id' => $user_id_arr]],
  59. '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',
  60. 'index' => 'user_id',
  61. ]);
  62. foreach ($data['list'] as &$user) {
  63. $user['level_name'] = isset($levels[$user['level']]) ? $levels[$user['level']] : MallSetting::getDefaultLevelName($this->mall_id);
  64. $user['user_team_total'] = $user['user_direct_total'] = $user['user_indirect_total'] = 0;
  65. if (isset($user_team_statistics_list[$user['id']])) {
  66. $user['user_team_total'] = $user_team_statistics_list[$user['id']]['user_team_total'];
  67. $user['user_direct_total'] = $user_team_statistics_list[$user['id']]['user_direct_total'];
  68. $user['user_indirect_total'] = $user_team_statistics_list[$user['id']]['user_indirect_total'];
  69. $user['team_finish_order_total'] = $user_team_statistics_list[$user['id']]['team_finish_order_total'];
  70. $user['team_finish_order_price_total'] = $user_team_statistics_list[$user['id']]['team_finish_order_price_total'];
  71. $user['user_team_order_price_total'] = $user_team_statistics_list[$user['id']]['user_team_order_price_total'];
  72. }
  73. }
  74. return $data;
  75. }
  76. /**
  77. * 个人团队下面的业绩
  78. *
  79. * @param integer $uid
  80. * @param array $params
  81. * @return array
  82. */
  83. public function getTeamAchievementPageList(int $uid, array $params = [])
  84. {
  85. $total_order_num = 0;
  86. $total_pay_money = 0;
  87. $total_pay_achievement = 0;
  88. $list = UserTeamAchievementOrder::getPaginationListByUid($uid, $this->getLimit($params), function($query) use (
  89. $params, &$total_order_num, &$total_pay_money, &$total_pay_achievement, $uid
  90. ) {
  91. $query->where(['superior_user_id' => $uid, 'status' => 2]);
  92. $query->with(['order' => function($query) {
  93. $query->select([
  94. 'id', 'user_id', 'order_no', 'goods_price', 'pay_money',
  95. 'IFNULL(shipping_money, 0) as shipping_money',
  96. '(pay_money - IFNULL(shipping_money, 0)) as achievement', 'pay_time', 'created_at'
  97. ]);
  98. }, 'user' => function($query) {
  99. $query->select('id, nickname, mobile, avatar_url');
  100. }]);
  101. // 时间查询
  102. if (isset($params['date']) && !empty($params['date'])) {
  103. $query->andWhere([
  104. 'between',
  105. 'created_at',
  106. strtotime($params['date'][0]), (strtotime($params['date'][1]) + 86399)
  107. ]);
  108. }
  109. // 时间查询
  110. if (isset($params['keyword']) && $params['keyword'] !== '') {
  111. $keywordOrWhere = ['or', ['like', 'nickname', $params['keyword']]];
  112. if (is_numeric($params['keyword'])) {
  113. $keywordOrWhere[] = ['like', 'mobile', $params['keyword']];
  114. $keywordOrWhere[] = ['=', 'id', $params['keyword']];
  115. }
  116. $query->andWhere([
  117. 'user_id' => User::find()
  118. ->where([
  119. 'mall_id' => $this->mall_id,
  120. 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]
  121. ])
  122. ->andWhere($keywordOrWhere)
  123. ->select('id')
  124. ->column()
  125. ]);
  126. }
  127. // 统计
  128. $query2 = clone $query;
  129. $total_pay_money = Order::find()->where(['id' => $query2->select('order_id')])->sum('pay_money');
  130. $total_pay_achievement = Order::find()->where(['id' => $query2->select('order_id')])->sum('(pay_money - IFNULL(shipping_money, 0))');
  131. $total_order_num = $query->count();
  132. }, 'id desc');
  133. // 统计 总金额,订单数
  134. $list['total_pay_money'] = $total_pay_money;
  135. $list['total_order_num'] = $total_order_num;
  136. $list['total_pay_achievement'] = $total_pay_achievement;
  137. return $list;
  138. }
  139. /**
  140. * 团队业绩导出
  141. * @return bool
  142. */
  143. public function achievementExport(array $data)
  144. {
  145. $download_id = $data['download_id'] ?? 0;
  146. $download = Download::findOne(['id' => $download_id]);
  147. if (!$download) {
  148. return false;
  149. }
  150. try {
  151. $params = json_decode($download->params, true);
  152. if (empty($params)) {
  153. \Yii::$app->custom->logs('团队业绩导出参数为空');
  154. return false;
  155. }
  156. $filename = $download->name;
  157. $type = $download->type;
  158. $where = ['AND'];
  159. $where[] = ['status' => 2, 'superior_user_id' => $params['uid'], 'mall_id' => $params['mall_id']];
  160. if (!empty($params['date'])) {
  161. $where[] = ['between', 'created_at', strtotime(reset($params['date'])), strtotime(end($params['date'])) + 86400];
  162. }
  163. $userTeam = UserTeamAchievementOrder::getTeamAchievementList($params['uid'], $where)
  164. ->with(['order'=> function ($query) {
  165. $query->select([
  166. 'id', 'user_id', 'order_no', 'goods_price', 'pay_money',
  167. 'IFNULL(shipping_money, 0) as shipping_money',
  168. '(pay_money - IFNULL(shipping_money, 0)) as achievement', 'pay_time', 'created_at'
  169. ])->with(['detail' => function ($query) {
  170. $query->select(['order_id', 'goods_name', 'goods_attr_name', 'goods_price', 'price', 'num']);
  171. }]);
  172. }, 'user' => function ($query) {
  173. $query->select('id, nickname, mobile, avatar_url');
  174. }])->orderBy('id desc');
  175. $exportList = [];
  176. foreach ($userTeam->asArray()->batch() as $user) {
  177. foreach ($user as $item) {
  178. foreach ($item['order']['detail'] as $k => $detail) {
  179. if ($k == 0) {
  180. $achievement = $item['order']['achievement'] ?? '';
  181. } else {
  182. $achievement = '';
  183. }
  184. $exportList[] = [
  185. $item['user_id'],
  186. $item['user']['nickname'] ?? '',
  187. $item['user']['mobile'] ?? '',
  188. $item['order']['order_no'] ?? '',
  189. $detail['goods_name'] ?? '',
  190. $detail['goods_attr_name'] ?? '',
  191. $detail['num'] ?? '',
  192. $detail['goods_price'] ?? '',
  193. $item['order']['shipping_money'] ?? '',
  194. $achievement,
  195. !empty($item['order']['pay_time']) ? date('Y-m-d H:i:s', $item['order']['pay_time']) : '',
  196. !empty($item['order']['created_at']) ? date('Y-m-d H:i:s', $item['order']['created_at']) : '',
  197. ];
  198. }
  199. }
  200. }
  201. if (!empty($exportList)) {
  202. $csv = new CsvTool();
  203. $csv->filename = $filename;
  204. $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
  205. $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
  206. $csv->header = ['会员ID', '会员昵称', '会员手机号', '订单号', '商品名称', '规格', '购买数量', '支付金额', '运费', '业绩', '支付时间', '下单时间'];
  207. $csv->data = $exportList;
  208. $csv->export();
  209. $csv->updateDown($download, $params['mall_id']);
  210. }
  211. } catch (Exception $e) {
  212. $download->status = 3;
  213. $download->save();
  214. $this->setError($e->getMessage());
  215. return false;
  216. }
  217. return true;
  218. }
  219. }