ChannelHomeService.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. <?php
  2. namespace App\Services\Channel;
  3. use App\Facade\Site;
  4. use App\Libs\Utils;
  5. use App\Consts\ErrorConst;
  6. use App\Exceptions\ApiException;
  7. use Illuminate\Support\Facades\DB;
  8. class ChannelHomeService
  9. {
  10. public function __construct(
  11. )
  12. {
  13. }
  14. /**
  15. * 获取当前站点信息
  16. * @return array
  17. */
  18. public function getChannelInfo() {
  19. $distribution_channel_id = Site::getCurrentChannelId();
  20. $uid = Site::getUid();
  21. $sub_channel_ids = DB::table('channel_user_mappings')->where('master_uid', $uid)->select('sub_channel_id')->get()->pluck('sub_channel_id')->toArray();
  22. $result = DB::table('distribution_channels')->where('id', $distribution_channel_id)->select('channel_type', 'book_charge_type', 'book_coin', 'chapter_coin',
  23. 'book_calculate_price_type', 'chapter_calculate_price_type')->first();
  24. if ($result) {
  25. $result = (array)$result;
  26. if ($result['book_charge_type'] != 'HYBRID') $result['book_charge_type'] = 'MERGE';
  27. $result['is_master'] = $sub_channel_ids ? 1 : 0;
  28. }else {
  29. $result = [];
  30. }
  31. return $result;
  32. }
  33. /**
  34. *
  35. * @param $data
  36. * @return int
  37. * @throws ApiException
  38. */
  39. public function setChannelBookChargeType($data) {
  40. $distribution_channel_id = Site::getCurrentChannelId();
  41. $book_charge_type = getProp($data, 'book_charge_type');
  42. $book_calculate_price_type = getProp($data, 'book_calculate_price_type');
  43. $book_coin = (int)getProp($data, 'book_coin');
  44. $chapter_calculate_price_type = getProp($data, 'chapter_calculate_price_type');
  45. $chapter_coin = (int)getProp($data, 'chapter_coin');
  46. // 如果是合并站点则看书籍收费方式是按本还是按章
  47. if ($book_charge_type == 'MERGE') {
  48. if ($book_calculate_price_type == 'all') {
  49. $book_charge_type = 'BOOK';
  50. }else {
  51. $book_charge_type = 'CHAPTER';
  52. }
  53. $chapter_calculate_price_type = $book_calculate_price_type;
  54. $chapter_coin = $book_coin;
  55. }
  56. $update_data = [
  57. 'book_charge_type' => $book_charge_type,
  58. 'book_calculate_price_type' => $book_calculate_price_type,
  59. 'book_coin' => $book_coin,
  60. 'chapter_calculate_price_type' => $chapter_calculate_price_type,
  61. 'chapter_coin' => $chapter_coin,
  62. 'updated_at' => date('Y-m-d H:i:s')
  63. ];
  64. return DB::table('distribution_channels')->where('id', $distribution_channel_id)->update($update_data);
  65. }
  66. // 获取子账号
  67. public function getSubUser() {
  68. $uid = Site::getUid();
  69. return DB::table('channel_user_mappings')->leftJoin('channel_users', 'channel_users.id', 'channel_user_mappings.sub_uid')
  70. ->where('channel_user_mappings.master_uid', $uid)->select('channel_users.nickname')->get()->map(function ($value) {
  71. return (array)$value;
  72. })->toArray();
  73. }
  74. // 站点统计汇总
  75. public function statisticsByTotal($data) {
  76. $data_source = getProp($data, 'data_source', 'current_channel');
  77. $distribution_channel_id = Site::getCurrentChannelId();
  78. $uid = Site::getUid();
  79. $sub_channel_ids = DB::table('channel_user_mappings')->where('master_uid', $uid)->select('sub_channel_id')->get()->pluck('sub_channel_id')->toArray();
  80. $date_range = getProp($data, 'date_range');
  81. if ($data_source == 'all_channel') { // 获取全站数据(主账号权限)
  82. $distribution_channel_ids = array_merge([$distribution_channel_id], $sub_channel_ids);
  83. }else if ($data_source == 'current_channel') { // 获取本站点数据(所有账号共有)
  84. $distribution_channel_ids = [$distribution_channel_id];
  85. }else { // 获取推广员数据(主账号权限)
  86. $distribution_channel_ids = array_merge([$distribution_channel_id], $sub_channel_ids);
  87. // 如果推广员符合子账号条件则取对应子站点数据
  88. $distribution_channel_id = DB::table('channel_users')->leftJoin('distribution_channels', 'distribution_channels.channel_user_id', 'channel_users.id')
  89. ->where('channel_users.nickname', $data_source)->value('distribution_channels.id');
  90. if (in_array($distribution_channel_id, $distribution_channel_ids)) $distribution_channel_ids = [$distribution_channel_id];
  91. else $distribution_channel_ids = [];
  92. }
  93. $query = DB::table('channel_day_statistics')->whereIn('distribution_channel_id', $distribution_channel_ids)
  94. ->selectRaw("sum(total_order_num) as total_order_num, sum(paid_order_num) as paid_order_num,
  95. sum(register_num) as register_num, sum(register_pay_num) as register_pay_num, sum(register_pay_amount) as register_pay_amount,
  96. sum(total_pay_num) as total_pay_num, sum(total_pay_amount) as total_pay_amount");
  97. // 获取今日数据
  98. $day_start = date('Y-m-d 00:00:00');
  99. $total_order_num = DB::table('orders')->whereIn('distribution_channel_id', $distribution_channel_ids)->where('created_at', '>', $day_start)->count('id');
  100. $paid_order = DB::table('orders')->whereIn('distribution_channel_id', $distribution_channel_ids)->where('created_at', '>', $day_start)->where('status', 'PAID')
  101. ->selectRaw("count(id) as paid_order_num, count(distinct uid) as total_pay_num, sum(price) as total_pay_amount")->first();
  102. $paid_order_num = getProp($paid_order, 'paid_order_num', 0);
  103. $total_pay_num = getProp($paid_order, 'total_pay_num', 0);
  104. $total_pay_amount = getProp($paid_order, 'total_pay_amount', 0);
  105. $register_uids = DB::table('users')->whereIn('distribution_channel_id', $distribution_channel_ids)->where('created_at', '>', $day_start)->select('id')->get()->pluck('id')->toArray();
  106. $register_orders = DB::table('orders')->whereIn('distribution_channel_id', $distribution_channel_ids)->where('created_at', '>', $day_start)
  107. ->whereIn('uid', $register_uids)->where('status', 'PAID')
  108. ->selectRaw('count(distinct uid) as register_pay_num, sum(price) as register_pay_amount')->first();
  109. $register_num = count($register_uids);
  110. $register_pay_num = getProp($register_orders, 'register_pay_num', 0);
  111. $register_pay_amount = getProp($register_orders, 'register_pay_amount', 0);
  112. $include_today = true; // 是否包含今天统计
  113. // 周期筛选
  114. if ($date_range) {
  115. $date_range = explode(',', $date_range);
  116. if (count($date_range) == 2) {
  117. if ($date_range[0]) {
  118. $start = date('Y-m-d', strtotime($date_range[0]));
  119. $query->where('day', '>=', $start);
  120. }
  121. if ($date_range[1]) {
  122. $end = date('Y-m-d', strtotime($date_range[1]));
  123. if (strtotime($end) < strtotime(date('Y-m-d'))) { // 如果获取的是今日之前的数据则不增加今日统计
  124. $include_today = false;
  125. }
  126. $query->where('day', '<=', $end);
  127. }
  128. }
  129. $total = $query->first();
  130. $total_order_num = $include_today ? getProp($total, 'total_order_num', 0) + $total_order_num : getProp($total, 'total_order_num', 0);
  131. $paid_order_num = $include_today ? getProp($total, 'paid_order_num', 0) + $paid_order_num : getProp($total, 'paid_order_num', 0);
  132. $register_num = $include_today ? getProp($total, 'register_num', 0) + $register_num : getProp($total, 'register_num', 0);
  133. $register_pay_num = $include_today ? getProp($total, 'register_pay_num', 0) + $register_pay_num : getProp($total, 'register_pay_num', 0);
  134. $register_pay_amount = $include_today ? getProp($total, 'register_pay_amount', 0) + $register_pay_amount : getProp($total, 'register_pay_amount', 0);
  135. $total_pay_num = $include_today ? getProp($total, 'total_pay_num', 0) + $total_pay_num : getProp($total, 'total_pay_num', 0);
  136. $total_pay_amount = $include_today ? getProp($total, 'total_pay_amount', 0) + $total_pay_amount : getProp($total, 'total_pay_amount', 0);
  137. }
  138. return [
  139. 'total_order_num' => (int)$total_order_num,
  140. 'paid_order_num' => (int)$paid_order_num,
  141. 'register_num' => (int)$register_num,
  142. 'register_pay_num' => (int)$register_pay_num,
  143. 'register_pay_amount' => (float)sprintf('%.2f', $register_pay_amount),
  144. 'register_pay_percent' => $register_num ? (float)sprintf('%.2f', $register_pay_num / $register_num * 100) : 0,
  145. 'total_pay_num' => (int)$total_pay_num,
  146. 'total_pay_amount' => (float)sprintf('%.2f', $total_pay_amount),
  147. 'distribution_channel' => $distribution_channel_ids,
  148. 'is_master' => $sub_channel_ids ? 1 : 0,
  149. ];
  150. }
  151. // 站点统计日数据
  152. public function statisticsByDay($data, $all=false)
  153. {
  154. $data_source = getProp($data, 'data_source', 'current_channel');
  155. $distribution_channel_id = Site::getCurrentChannelId();
  156. $date_range = getProp($data, 'date_range');
  157. $uid = Site::getUid();
  158. $sub_channel_ids = DB::table('channel_user_mappings')->where('master_uid', $uid)->select('sub_channel_id')->get()->pluck('sub_channel_id')->toArray();
  159. if ($data_source == 'all_channel' && $sub_channel_ids) { // 获取全站数据(主账号权限)
  160. $distribution_channel_ids = array_merge([$distribution_channel_id], $sub_channel_ids);
  161. }else { // 获取本站点数据(所有账号共有)
  162. $distribution_channel_ids = [$distribution_channel_id];
  163. }
  164. $query = DB::table('channel_day_statistics')->whereIn('distribution_channel_id', $distribution_channel_ids)->selectRaw("day,
  165. sum(total_order_num) as total_order_num,
  166. sum(paid_order_num) as paid_order_num,
  167. sum(register_num) as register_num,
  168. sum(register_pay_num) as register_pay_num,
  169. sum(register_pay_amount) as register_pay_amount,
  170. sum(total_pay_num) as total_pay_num,
  171. sum(total_pay_amount) as total_pay_amount")->groupBy('day');
  172. // 周期筛选
  173. if ($date_range) {
  174. $date_range = explode(',', $date_range);
  175. if (count($date_range) == 2) {
  176. if ($date_range[0]) {
  177. $start = date('Y-m-d', strtotime($date_range[0]));
  178. $query->where('day', '>=', $start);
  179. }
  180. if ($date_range[1]) {
  181. $end = date('Y-m-d', strtotime($date_range[1]));
  182. $query->where('day', '<=', $end);
  183. }
  184. }
  185. }
  186. if ($all) return $query->orderBy('day', 'desc')->get();
  187. return $query->orderBy('day', 'desc')->paginate();
  188. }
  189. /**
  190. * 导出站点统计日明细
  191. * @param $data
  192. * @throws ApiException
  193. */
  194. public function exportStatisticsByDay($data) {
  195. $list = $this->statisticsByDay($data, true);
  196. if (empty($list)) {
  197. Utils::throwError(ErrorConst::RECORD_NOT_EXIST);
  198. }
  199. $result = [];
  200. foreach ($list as $item) {
  201. $result[] = [
  202. 'date' => getProp($item, 'day'),
  203. 'total_order_num' => (int)getProp($item, 'total_order_num'),
  204. 'paid_order_num' => (int)getProp($item, 'paid_order_num'),
  205. 'register_num' => (int)getProp($item, 'register_num'),
  206. 'register_pay_num' => (int)getProp($item, 'register_pay_num'),
  207. 'register_pay_amount' => (float)getProp($item, 'register_pay_amount'),
  208. 'register_pay_percent' => getProp($item, 'register_num') ? (float)sprintf('%.2f', getProp($item, 'register_pay_num') / getProp($item, 'register_num') * 100) : 0,
  209. 'total_pay_num' => (int)getProp($item, 'total_pay_num'),
  210. 'total_pay_amount' => (float)getProp($item, 'total_pay_amount'),
  211. ];
  212. }
  213. $headers = ['日期', '订单总数', '成功订单数', '新增注册用户', '新增注册充值人数', '新增注册充值金额(元)', '注册用户付费率(%)', '累计充值人数', '累计充值金额(元)'];
  214. exportFileCsv($headers, $result, '站点统计日数据-' . date('YmdHis'));
  215. }
  216. // 站点统计推广员日数据
  217. public function statisticsByDayForMaster($data, $all=false)
  218. {
  219. $distribution_channel_id = Site::getCurrentChannelId();
  220. $date_range = getProp($data, 'date_range');
  221. $uid = Site::getUid();
  222. $sub_channel_ids = DB::table('channel_user_mappings')->where('master_uid', $uid)->select('sub_channel_id')->get()->pluck('sub_channel_id')->toArray();
  223. if ($sub_channel_ids) { // 主账号权限
  224. // 未筛选推广员则取全站数据
  225. $distribution_channel_ids = array_merge([$distribution_channel_id], $sub_channel_ids);
  226. $promote_user = getProp($data, 'promote_user'); // 推广员
  227. if ($promote_user) { // 推广员筛选
  228. // 如果推广员符合子账号条件则取对应子站点数据
  229. $distribution_channel_id = DB::table('channel_users')->leftJoin('distribution_channels', 'distribution_channels.channel_user_id', 'channel_users.id')
  230. ->where('channel_users.nickname', 'like', '%'.$promote_user.'%')->value('distribution_channels.id');
  231. if (in_array($distribution_channel_id, $distribution_channel_ids)) $distribution_channel_ids = [$distribution_channel_id];
  232. else $distribution_channel_ids = [];
  233. }
  234. }else {
  235. Utils::throwError('1002:你的账号暂无获取推广员数据权限');
  236. }
  237. $query = DB::table('channel_day_statistics')->leftJoin('distribution_channels', 'distribution_channels.id', 'channel_day_statistics.distribution_channel_id')
  238. ->leftJoin('channel_users', 'channel_users.id', 'distribution_channels.channel_user_id')
  239. ->whereIn('channel_day_statistics.distribution_channel_id', $distribution_channel_ids)->selectRaw("channel_day_statistics.day,
  240. channel_day_statistics.distribution_channel_id,
  241. channel_users.nickname,
  242. sum(channel_day_statistics.total_order_num) as total_order_num,
  243. sum(channel_day_statistics.paid_order_num) as paid_order_num,
  244. sum(channel_day_statistics.register_num) as register_num,
  245. sum(channel_day_statistics.register_pay_num) as register_pay_num,
  246. sum(channel_day_statistics.register_pay_amount) as register_pay_amount,
  247. sum(channel_day_statistics.total_pay_num) as total_pay_num,
  248. sum(channel_day_statistics.total_pay_amount) as total_pay_amount")->groupBy('channel_day_statistics.day', 'channel_users.nickname');
  249. // 周期筛选
  250. if ($date_range) {
  251. $date_range = explode(',', $date_range);
  252. if (count($date_range) == 2) {
  253. if ($date_range[0]) {
  254. $start = date('Y-m-d', strtotime($date_range[0]));
  255. $query->where('channel_day_statistics.day', '>=', $start);
  256. }
  257. if ($date_range[1]) {
  258. $end = date('Y-m-d', strtotime($date_range[1]));
  259. $query->where('channel_day_statistics.day', '<=', $end);
  260. }
  261. }
  262. }
  263. if ($all) return $query->orderBy('channel_day_statistics.day', 'desc')->orderBy('register_pay_amount', 'desc')->get();
  264. return $query->orderBy('channel_day_statistics.day', 'desc')->orderBy('register_pay_amount', 'desc')->paginate();
  265. }
  266. /**
  267. * 导出站点统计推广员日明细
  268. * @param $data
  269. * @throws ApiException
  270. */
  271. public function exportStatisticsByDayForMaster($data) {
  272. $list = $this->statisticsByDay($data, true);
  273. if (empty($list)) {
  274. Utils::throwError(ErrorConst::RECORD_NOT_EXIST);
  275. }
  276. $result = [];
  277. foreach ($list as $item) {
  278. $result[] = [
  279. 'date' => getProp($item, 'day'),
  280. 'promote_user' => getProp($item, 'nickname'),
  281. 'total_order_num' => (int)getProp($item, 'total_order_num'),
  282. 'paid_order_num' => (int)getProp($item, 'paid_order_num'),
  283. 'register_num' => (int)getProp($item, 'register_num'),
  284. 'register_pay_num' => (int)getProp($item, 'register_pay_num'),
  285. 'register_pay_amount' => (float)getProp($item, 'register_pay_amount'),
  286. 'register_pay_percent' => getProp($item, 'register_num') ? (float)sprintf('%.2f', getProp($item, 'register_pay_num') / getProp($item, 'register_num') * 100) : 0,
  287. 'total_pay_num' => (int)getProp($item, 'total_pay_num'),
  288. 'total_pay_amount' => (float)getProp($item, 'total_pay_amount'),
  289. ];
  290. }
  291. $headers = ['日期', '推广员', '订单总数', '成功订单数', '新增注册用户', '新增注册充值人数', '新增注册充值金额(元)', '注册用户付费率(%)', '累计充值人数', '累计充值金额(元)'];
  292. exportFileCsv($headers, $result, '站点统计推广员日数据-' . date('YmdHis'));
  293. }
  294. // 站点统计阅数据
  295. public function statisticsByMonth($data, $all=false)
  296. {
  297. $data_source = getProp($data, 'data_source', 'current_channel');
  298. $distribution_channel_id = Site::getCurrentChannelId();
  299. $date_range = getProp($data, 'date_range');
  300. $uid = Site::getUid();
  301. $sub_channel_ids = DB::table('channel_user_mappings')->where('master_uid', $uid)->select('sub_channel_id')->get()->pluck('sub_channel_id')->toArray();
  302. if ($data_source == 'all_channel' && $sub_channel_ids) { // 获取全站数据(主账号权限)
  303. $distribution_channel_ids = array_merge([$distribution_channel_id], $sub_channel_ids);
  304. }else{ // 获取本站点数据(所有账号共有)
  305. $distribution_channel_ids = [$distribution_channel_id];
  306. }
  307. $query = DB::table('channel_day_statistics')->whereIn('distribution_channel_id', $distribution_channel_ids)->selectRaw("month,
  308. sum(total_order_num) as total_order_num,
  309. sum(paid_order_num) as paid_order_num,
  310. sum(register_num) as register_num,
  311. sum(register_pay_num) as register_pay_num,
  312. sum(register_pay_amount) as register_pay_amount,
  313. sum(total_pay_num) as total_pay_num,
  314. sum(total_pay_amount) as total_pay_amount")->groupBy('month');
  315. // 周期筛选
  316. if ($date_range) {
  317. $date_range = explode(',', $date_range);
  318. if (count($date_range) == 2) {
  319. if ($date_range[0]) {
  320. $start = date('Ym', strtotime($date_range[0]));
  321. $query->where('month', '>=', $start);
  322. }
  323. if ($date_range[1]) {
  324. $end = date('Ym', strtotime($date_range[1]));
  325. $query->where('month', '<=', $end);
  326. }
  327. }
  328. }
  329. if ($all) return $query->orderBy('month', 'desc')->get();
  330. return $query->orderBy('month', 'desc')->paginate();
  331. }
  332. /**
  333. * 导出站点统计月明细
  334. * @param $data
  335. * @throws ApiException
  336. */
  337. public function exportStatisticsByMonth($data) {
  338. $list = $this->statisticsByMonth($data, true);
  339. if (empty($list)) {
  340. Utils::throwError(ErrorConst::RECORD_NOT_EXIST);
  341. }
  342. $result = [];
  343. foreach ($list as $item) {
  344. $result[] = [
  345. 'date' => getProp($item, 'month'),
  346. 'total_order_num' => (int)getProp($item, 'total_order_num'),
  347. 'paid_order_num' => (int)getProp($item, 'paid_order_num'),
  348. 'register_num' => (int)getProp($item, 'register_num'),
  349. 'register_pay_num' => (int)getProp($item, 'register_pay_num'),
  350. 'register_pay_amount' => (float)getProp($item, 'register_pay_amount'),
  351. 'register_pay_percent' => getProp($item, 'register_num') ? (float)sprintf('%.2f', getProp($item, 'register_pay_num') / getProp($item, 'register_num') * 100) : 0,
  352. 'total_pay_num' => (int)getProp($item, 'total_pay_num'),
  353. 'total_pay_amount' => (float)getProp($item, 'total_pay_amount'),
  354. ];
  355. }
  356. $headers = ['日期', '订单总数', '成功订单数', '新增注册用户', '新增注册充值人数', '新增注册充值金额(元)', '注册用户付费率(%)', '累计充值人数', '累计充值金额(元)'];
  357. exportFileCsv($headers, $result, '站点统计月数据-' . date('YmdHis'));
  358. }
  359. // 站点统计推广员月数据
  360. public function statisticsByMonthForMaster($data, $all=false)
  361. {
  362. $distribution_channel_id = Site::getCurrentChannelId();
  363. $date_range = getProp($data, 'date_range');
  364. $uid = Site::getUid();
  365. $sub_channel_ids = DB::table('channel_user_mappings')->where('master_uid', $uid)->select('sub_channel_id')->get()->pluck('sub_channel_id')->toArray();
  366. if ($sub_channel_ids) { // 主账号权限
  367. // 未筛选推广员则取全站数据
  368. $distribution_channel_ids = array_merge([$distribution_channel_id], $sub_channel_ids);
  369. $promote_user = getProp($data, 'promote_user'); // 推广员
  370. if ($promote_user) { // 推广员筛选
  371. // 如果推广员符合子账号条件则取对应子站点数据
  372. $distribution_channel_id = DB::table('channel_users')->leftJoin('distribution_channels', 'distribution_channels.channel_user_id', 'channel_users.id')
  373. ->where('channel_users.nickname', 'like', '%'.$promote_user.'%')->value('distribution_channels.id');
  374. if (in_array($distribution_channel_id, $distribution_channel_ids)) $distribution_channel_ids = [$distribution_channel_id];
  375. else $distribution_channel_ids = [];
  376. }
  377. }else {
  378. Utils::throwError('1002:你的账号暂无获取推广员数据权限');
  379. }
  380. $query = DB::table('channel_day_statistics')->leftJoin('distribution_channels', 'distribution_channels.id', 'channel_day_statistics.distribution_channel_id')
  381. ->leftJoin('channel_users', 'channel_users.id', 'distribution_channels.channel_user_id')
  382. ->whereIn('channel_day_statistics.distribution_channel_id', $distribution_channel_ids)->selectRaw("channel_day_statistics.month,
  383. channel_day_statistics.distribution_channel_id,
  384. channel_users.nickname,
  385. sum(channel_day_statistics.total_order_num) as total_order_num,
  386. sum(channel_day_statistics.paid_order_num) as paid_order_num,
  387. sum(channel_day_statistics.register_num) as register_num,
  388. sum(channel_day_statistics.register_pay_num) as register_pay_num,
  389. sum(channel_day_statistics.register_pay_amount) as register_pay_amount,
  390. sum(channel_day_statistics.total_pay_num) as total_pay_num,
  391. sum(channel_day_statistics.total_pay_amount) as total_pay_amount")->groupBy('channel_day_statistics.month', 'channel_users.nickname');
  392. // 周期筛选
  393. if ($date_range) {
  394. $date_range = explode(',', $date_range);
  395. if (count($date_range) == 2) {
  396. if ($date_range[0]) {
  397. $start = date('Ym', strtotime($date_range[0]));
  398. $query->where('channel_day_statistics.month', '>=', $start);
  399. }
  400. if ($date_range[1]) {
  401. $end = date('Ym', strtotime($date_range[1]));
  402. $query->where('channel_day_statistics.month', '<=', $end);
  403. }
  404. }
  405. }
  406. if ($all) return $query->orderBy('channel_day_statistics.month', 'desc')->orderBy('register_pay_amount', 'desc')->get();
  407. return $query->orderBy('channel_day_statistics.month', 'desc')->orderBy('register_pay_amount', 'desc')->paginate();
  408. }
  409. /**
  410. * 导出站点统计推广员月明细
  411. * @param $data
  412. * @throws ApiException
  413. */
  414. public function exportStatisticsByMonthForMaster($data) {
  415. $list = $this->statisticsByMonth($data, true);
  416. if (empty($list)) {
  417. Utils::throwError(ErrorConst::RECORD_NOT_EXIST);
  418. }
  419. $result = [];
  420. foreach ($list as $item) {
  421. $result[] = [
  422. 'date' => getProp($item, 'month'),
  423. 'promote_user' => getProp($item, 'nickname'),
  424. 'total_order_num' => (int)getProp($item, 'total_order_num'),
  425. 'paid_order_num' => (int)getProp($item, 'paid_order_num'),
  426. 'register_num' => (int)getProp($item, 'register_num'),
  427. 'register_pay_num' => (int)getProp($item, 'register_pay_num'),
  428. 'register_pay_amount' => (float)getProp($item, 'register_pay_amount'),
  429. 'register_pay_percent' => getProp($item, 'register_num') ? (float)sprintf('%.2f', getProp($item, 'register_pay_num') / getProp($item, 'register_num') * 100) : 0,
  430. 'total_pay_num' => (int)getProp($item, 'total_pay_num'),
  431. 'total_pay_amount' => (float)getProp($item, 'total_pay_amount'),
  432. ];
  433. }
  434. $headers = ['日期', '推广员', '订单总数', '成功订单数', '新增注册用户', '新增注册充值人数', '新增注册充值金额(元)', '注册用户付费率(%)', '累计充值人数', '累计充值金额(元)'];
  435. exportFileCsv($headers, $result, '站点统计推广员月数据-' . date('YmdHis'));
  436. }
  437. }