企微短剧业务系统

PopularizService.php 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. <?php
  2. namespace App\Service;
  3. use App\Log;
  4. use App\Models\AdqAccountBindPidConf;
  5. use App\Models\DjOrder;
  6. use App\Models\MassPopularizData;
  7. use App\Models\DjUser;
  8. use App\Models\MassMsg;
  9. use App\Models\MassMsgRecord;
  10. use App\Models\MomentTask;
  11. use App\Models\MomentRecord;
  12. use App\Models\MomentFansInteract;
  13. use App\Models\Report\DjPromotionDataStat;
  14. use App\Models\System\Users;
  15. use App\Models\TencentAdDailyReport;
  16. use App\Models\View\CustomerDetail;
  17. class PopularizService
  18. {
  19. /**
  20. * 获取群发列表
  21. * */
  22. public static function ruleList($creatorId, $sendTimeStart, $sendTimeEnd,$sortColumn, $page, $pageSize, $is_system_admin,
  23. $group_admin_id, &$errno, $sys_group_id)
  24. {
  25. // $corpids = null;
  26. // if($is_system_admin==0){
  27. // $corpids = StatisticsService::getAuthCorpids($group_admin_id);
  28. // }
  29. $corpids = StatisticsService::getAuthCorpids($sys_group_id);
  30. if(empty($corpids)) {
  31. return [[], 0];
  32. }
  33. try {
  34. list($list, $count) = MassMsg::getDataRuleLists($corpids, $creatorId, $sendTimeStart, $sendTimeEnd, $sortColumn, $page, $pageSize);
  35. # 获取创建人信息
  36. $adminIds = $list->pluck('admin_id');
  37. $adminData = Users::select(['id','name'])->whereIn('id', $adminIds)->get();
  38. # 统计发送信息
  39. $ruleIds = $list->pluck('rule_id');
  40. $sendStatData = MassMsgRecord::selectRaw("rule_id, sum(send_success) as send_success, sum(send_fail) as send_fail, sum(send_total) as send_total")
  41. ->where('type', 1)
  42. ->whereIn('rule_id', $ruleIds)->groupBy(['rule_id'])->get();
  43. #统计回收信息
  44. $pids = [];
  45. $pidVals = $list->pluck('pids')->all();
  46. foreach ($pidVals as $pidVal) {
  47. if (empty($pidVal)) continue;
  48. $itemPids = json_decode($pidVal, true);
  49. $pids = array_merge($pids, $itemPids);
  50. }
  51. if( !empty($pids) ){
  52. $popu_data = MassPopularizData::select('viewPv', 'viewUv', 'payPv', 'payUv', 'payMoney', 'pid', 'playletActivityId')
  53. ->whereIn('pid', $pids)
  54. ->get();
  55. $playletActivityIdList = $popu_data->pluck('playletActivityId')->all();
  56. $playletActivityIdList = array_filter($playletActivityIdList);
  57. if(!empty($playletActivityIdList)) {
  58. # 统计新老客户数据
  59. $orderData = DjOrder::query()
  60. ->select(['pid'])
  61. ->selectRaw("COUNT(DISTINCT IF(p_customer_type = 1, unionid, NULL)) AS newPayUv")
  62. ->selectRaw("COUNT(IF(p_customer_type = 1, unionid, NULL)) AS newPayPv")
  63. ->selectRaw("SUM(IF(p_customer_type = 1, pay_money, 0)) AS newPayAmount")
  64. ->selectRaw("SUM(IF(p_customer_type = 2, pay_money, 0)) AS oldPayAmount")
  65. ->whereIn('pid', $playletActivityIdList)
  66. ->where('is_ad_user', 1)
  67. ->where('pay_status', 1)
  68. ->groupBy('pid')
  69. ->get()
  70. ->keyBy('pid')
  71. ->toArray();
  72. // 非投放回收金额
  73. $otherOrderData = DjOrder::query()
  74. ->select(['pid'])
  75. ->selectRaw('sum(pay_money) as otherPayAmount')
  76. ->whereIn('pid', $playletActivityIdList)
  77. ->where('is_ad_user', 0)
  78. ->where('pay_status', 1)
  79. ->groupBy('pid')
  80. ->get()
  81. ->keyBy('pid')
  82. ->toArray();
  83. }
  84. }
  85. # 处理数据
  86. foreach($list as $datum) {
  87. # 消息条数
  88. $contentCount = empty($datum->content) ? 0 : 1;
  89. $attachmentCount = empty($datum->attachments) ? 0 : count(json_decode($datum->attachments, true));
  90. $datum->msg_count = $contentCount + $attachmentCount;
  91. # 创建人信息
  92. $adminInfo = $adminData->where('id', $datum->admin_id)->first();
  93. $datum->creator = isset($adminInfo->name) ? $adminInfo->name : '';
  94. # 统计发送情况
  95. $sendStatInfo = $sendStatData->where('rule_id', $datum->rule_id)->first();
  96. $datum->send_success = isset($sendStatInfo->send_success) ? $sendStatInfo->send_success : 0;
  97. $datum->send_fail = isset($sendStatInfo->send_fail) ? $sendStatInfo->send_fail : 0;
  98. $datum->send_total = isset($sendStatInfo->send_total) ? $sendStatInfo->send_total : 0;
  99. unset($datum->admin_id);
  100. $datumPids = json_decode($datum->pids, true);
  101. #统计 总播放人数(:总uv) 充值人数 充值次数(今日) 充值金额(今日) 付费率 点击率
  102. if($datumPids){
  103. $datum->payAvg = $datum->payUv>0 ? round($datum->payPv/$datum->payUv, 2) : null;
  104. $datum->payRate = $datum->viewUv>0 ? round($datum->payUv/$datum->viewUv*100, 2) .'%' : null;
  105. $datum->clickRate = $datum->send_success>0 ? round($datum->viewUv/$datum->send_success*100, 2) .'%' : null;
  106. $popu_list = MassPopularizData::select('viewPv', 'viewUv', 'payPv', 'payUv', 'payMoney', 'pid', 'playletActivityId')
  107. ->whereIn('pid', $datumPids)
  108. ->get();
  109. if ($popu_list->isNotEmpty()) {
  110. $datum->viewUv = 0;
  111. $datum->payUv = 0;
  112. $datum->payPv = 0;
  113. $datum->payMoney = 0;
  114. $datum->newPayUv = 0;
  115. $datum->newPayPv = 0;
  116. $datum->newPayAmount = 0;
  117. $datum->oldPayAmount = 0;
  118. $datum->otherPayAmount = 0;
  119. foreach ($popu_list as $popu_info) {
  120. $datum->viewUv += ($popu_info->viewUv ?? 0);
  121. $datum->payUv += ($popu_info->payUv ?? 0);
  122. $datum->payPv += ($popu_info->payPv ?? 0);
  123. $datum->payMoney += ($popu_info->payMoney ?? 0);
  124. if(isset($popu_info->playletActivityId)) {
  125. $datum->newPayUv += ($orderData[$popu_info->playletActivityId]['newPayUv'] ?? 0);
  126. $datum->newPayPv += ($orderData[$popu_info->playletActivityId]['newPayPv'] ?? 0);
  127. $datum->newPayAmount += ($orderData[$popu_info->playletActivityId]['newPayAmount'] ?? 0);
  128. $datum->oldPayAmount += ($orderData[$popu_info->playletActivityId]['oldPayAmount'] ?? 0);
  129. $datum->otherPayAmount += ($otherOrderData[$popu_info->playletActivityId]['otherPayAmount'] ?? 0);
  130. }
  131. }
  132. $datum->newPayAmount = round($datum->newPayAmount/10000, 2);
  133. $datum->oldPayAmount = round($datum->oldPayAmount/10000, 2);
  134. $datum->otherPayAmount = round($datum->otherPayAmount/10000, 2);
  135. $datum->newPayAvg = $datum->newPayUv>0 ? round($datum->newPayPv/$datum->newPayUv, 2) : null;
  136. } else {
  137. $datum->viewUv = null;
  138. $datum->payUv = null;
  139. $datum->payPv = null;
  140. $datum->payMoney = null;
  141. $datum->newPayUv = null;
  142. $datum->newPayPv = null;
  143. $datum->newPayAmount = null;
  144. $datum->oldPayAmount = null;
  145. $datum->otherPayAmount = null;
  146. $datum->newPayAvg = null;
  147. }
  148. } else {
  149. $datum->viewUv = null;
  150. $datum->payUv = null;
  151. $datum->payPv = null;
  152. $datum->payMoney = null;
  153. $datum->payAvg = null;
  154. $datum->payRate = null;
  155. $datum->clickRate = null;
  156. $datum->newPayUv = null;
  157. $datum->newPayPv = null;
  158. $datum->newPayAvg = null;
  159. $datum->newPayAmount = null;
  160. $datum->oldPayAmount = null;
  161. $datum->otherPayAmount = null;
  162. }
  163. }
  164. } catch (\Exception $e) {
  165. Log::logError('获取推广群发列表过程发生异常', [
  166. 'line' => $e->getLine(),
  167. 'msg' => $e->getMessage(),
  168. ], 'PopularizService');
  169. $errno = 2105;
  170. return [[], 0];
  171. }
  172. return [$list, $count];
  173. }
  174. public static function getRuleTotal($creatorId, $sendTimeStart, $sendTimeEnd, $is_system_admin, $group_admin_id, $sys_group_id)
  175. {
  176. // $corpids = null;
  177. // if($is_system_admin==0){
  178. // $corpids = StatisticsService::getAuthCorpids($group_admin_id);
  179. // }
  180. $corpids = StatisticsService::getAuthCorpids($sys_group_id);
  181. if(empty($corpids)) {
  182. return [];
  183. }
  184. $sendStatData= MassMsg::getDataRuleTotal($corpids, $creatorId, $sendTimeStart, $sendTimeEnd);
  185. return $sendStatData;
  186. }
  187. /**
  188. * 朋友圈任务列表
  189. * */
  190. public static function taskList($creatorId, $sendTimeStart, $sendTimeEnd, $sortColumn, $page, $pageSize, $is_system_admin,
  191. $group_admin_id, &$errno, $sys_group_id)
  192. {
  193. // $corpids = null;
  194. // if($is_system_admin==0){
  195. // $corpids = StatisticsService::getAuthCorpids($group_admin_id);
  196. // }
  197. $corpids = StatisticsService::getAuthCorpids($sys_group_id);
  198. if(empty($corpids)) {
  199. return [[], 0];
  200. }
  201. try {
  202. list($list, $count) = MomentTask::getPopuTaskLists($corpids, $creatorId, $sendTimeStart, $sendTimeEnd, $sortColumn, $page, $pageSize);
  203. # 获取创建人信息
  204. $adminIds = $list->pluck('admin_id');
  205. $adminData = Users::select(['id','name'])->whereIn('id', $adminIds)->get();
  206. # 统计发送信息
  207. $ruleIds = $list->pluck('rule_id');
  208. $publishedStatData = MomentRecord::selectRaw("sum(case when publish_status=1 then 1 else 0 end) as published_count,
  209. sum(case when publish_status=0 then 1 else 0 end) as unpublished_count, count(1) as published_total, rule_id")
  210. ->whereIn('rule_id', $ruleIds)->groupBy(['rule_id'])->get();
  211. #统计回收信息
  212. $pids = [];
  213. $pidVals = $list->pluck('pids')->all();
  214. foreach ($pidVals as $pidVal) {
  215. if (empty($pidVal)) continue;
  216. $itemPids = json_decode($pidVal, true);
  217. $pids = array_merge($pids, $itemPids);
  218. }
  219. if( !empty($pids) ){
  220. $popu_data = MassPopularizData::select('viewPv', 'viewUv', 'payPv', 'payUv', 'payMoney', 'pid', 'playletActivityId')
  221. ->whereIn('pid', $pids)
  222. ->get();
  223. $playletActivityIdList = $popu_data->pluck('playletActivityId')->all();
  224. $playletActivityIdList = array_filter($playletActivityIdList);
  225. if(!empty($playletActivityIdList)) {
  226. # 统计新老客户数据
  227. $orderData = DjOrder::query()
  228. ->select(['pid'])
  229. ->selectRaw("COUNT(DISTINCT IF(p_customer_type = 1, unionid, NULL)) AS newPayUv")
  230. ->selectRaw("COUNT(IF(p_customer_type = 1, unionid, NULL)) AS newPayPv")
  231. ->selectRaw("SUM(IF(p_customer_type = 1, pay_money, 0)) AS newPayAmount")
  232. ->selectRaw("SUM(IF(p_customer_type = 2, pay_money, 0)) AS oldPayAmount")
  233. ->whereIn('pid', $playletActivityIdList)
  234. ->where('is_ad_user', 1)
  235. ->where('pay_status', 1)
  236. ->groupBy('pid')
  237. ->get()
  238. ->keyBy('pid')
  239. ->toArray();
  240. // 非投放回收金额
  241. $otherOrderData = DjOrder::query()
  242. ->select(['pid'])
  243. ->selectRaw('sum(pay_money) as otherPayAmount')
  244. ->whereIn('pid', $playletActivityIdList)
  245. ->where('is_ad_user', 0)
  246. ->where('pay_status', 1)
  247. ->groupBy('pid')
  248. ->get()
  249. ->keyBy('pid')
  250. ->toArray();
  251. }
  252. }
  253. # 处理数据
  254. foreach($list as $datum) {
  255. # 创建人信息
  256. $adminInfo = $adminData->where('id', $datum->admin_id)->first();
  257. $datum->creator = isset($adminInfo->name) ? $adminInfo->name : '';
  258. # 统计发送情况
  259. $sendStatInfo = $publishedStatData->where('rule_id', $datum->rule_id)->first();
  260. $datum->published_count = isset($sendStatInfo->published_count) ? $sendStatInfo->published_count : 0;
  261. $datum->unpublished_count = isset($sendStatInfo->unpublished_count) ? $sendStatInfo->unpublished_count : 0;
  262. $datum->published_total = isset($sendStatInfo->published_total) ? $sendStatInfo->published_total : 0;
  263. unset($datum->admin_id);
  264. $datumPids = json_decode($datum->pids, true);
  265. #统计 总播放人数(:总uv) 充值人数 充值次数(今日) 充值金额(今日) 付费率 点击率
  266. if($datumPids){
  267. $datum->payAvg = $datum->payUv>0 ? round($datum->payPv/$datum->payUv, 2) : null;
  268. $datum->payRate = $datum->viewUv>0 ? round($datum->payUv/$datum->viewUv*100, 2) .'%' : null;
  269. $datum->clickRate = $datum->published_count>0 ? round($datum->viewUv/$datum->published_count*100, 2) .'%' : null;
  270. $popu_list = MassPopularizData::select('viewPv', 'viewUv', 'payPv', 'payUv', 'payMoney', 'pid', 'playletActivityId')
  271. ->whereIn('pid', $datumPids)
  272. ->get();
  273. if ($popu_list->isNotEmpty()) {
  274. $datum->viewUv = 0;
  275. $datum->payUv = 0;
  276. $datum->payPv = 0;
  277. $datum->payMoney = 0;
  278. $datum->newPayUv = 0;
  279. $datum->newPayPv = 0;
  280. $datum->newPayAmount = 0;
  281. $datum->oldPayAmount = 0;
  282. $datum->otherPayAmount = 0;
  283. foreach ($popu_list as $popu_info) {
  284. $datum->viewUv += ($popu_info->viewUv ?? 0);
  285. $datum->payUv += ($popu_info->payUv ?? 0);
  286. $datum->payPv += ($popu_info->payPv ?? 0);
  287. $datum->payMoney += ($popu_info->payMoney ?? 0);
  288. if(isset($popu_info->playletActivityId)) {
  289. $datum->newPayUv += ($orderData[$popu_info->playletActivityId]['newPayUv'] ?? 0);
  290. $datum->newPayPv += ($orderData[$popu_info->playletActivityId]['newPayPv'] ?? 0);
  291. $datum->newPayAmount += ($orderData[$popu_info->playletActivityId]['newPayAmount'] ?? 0);
  292. $datum->oldPayAmount += ($orderData[$popu_info->playletActivityId]['oldPayAmount'] ?? 0);
  293. $datum->otherPayAmount += ($otherOrderData[$popu_info->playletActivityId]['otherPayAmount'] ?? 0);
  294. }
  295. }
  296. $datum->newPayAmount = round($datum->newPayAmount/10000, 2);
  297. $datum->oldPayAmount = round($datum->oldPayAmount/10000, 2);
  298. $datum->otherPayAmount = round($datum->otherPayAmount/10000, 2);
  299. $datum->newPayAvg = $datum->newPayUv>0 ? round($datum->newPayPv/$datum->newPayUv, 2) : null;
  300. } else {
  301. $datum->viewUv = 0;
  302. $datum->payUv = 0;
  303. $datum->payPv = 0;
  304. $datum->payMoney = 0;
  305. $datum->newPayUv = 0;
  306. $datum->newPayPv = 0;
  307. $datum->newPayAmount = 0;
  308. $datum->oldPayAmount = 0;
  309. $datum->otherPayAmount = 0;
  310. $datum->newPayAvg = 0;
  311. }
  312. } else {
  313. $datum->viewUv = null;
  314. $datum->payUv = null;
  315. $datum->payPv = null;
  316. $datum->payMoney = null;
  317. $datum->payAvg = null;
  318. $datum->payRate = null;
  319. $datum->clickRate = null;
  320. $datum->newPayUv = null;
  321. $datum->newPayPv = null;
  322. $datum->newPayAvg = null;
  323. $datum->newPayAmount = null;
  324. $datum->oldPayAmount = null;
  325. $datum->otherPayAmount = null;
  326. }
  327. }
  328. } catch(\Exception $e) {
  329. Log::logError('获取朋友圈任务列表发生异常', [
  330. 'line' => $e->getLine(),
  331. 'msg' => $e->getMessage(),
  332. ], 'PopularizService');
  333. $errno = 2505;
  334. return [[], 0];
  335. }
  336. return [$list, $count];
  337. }
  338. public static function getMomentTotal($creatorId, $sendTimeStart, $sendTimeEnd, $is_system_admin, $group_admin_id, $sys_group_id)
  339. {
  340. // $corpids = null;
  341. // if($is_system_admin==0){
  342. // $corpids = StatisticsService::getAuthCorpids($group_admin_id);
  343. // }
  344. $corpids = StatisticsService::getAuthCorpids($sys_group_id);
  345. if(empty($corpids)) {
  346. return [];
  347. }
  348. $sendStatData= MomentTask::getPopuDataTotal($corpids, $creatorId, $sendTimeStart, $sendTimeEnd);
  349. return $sendStatData;
  350. }
  351. public static function getPlayletTitleByPid($pid, $mpAppId)
  352. {
  353. $playletTitle = MassPopularizData::query()
  354. ->where('pid', strval($pid))
  355. ->where('enable', 1)
  356. ->where(function($query) use ($mpAppId){
  357. if($mpAppId) $query->where('mpAppId', $mpAppId);
  358. })
  359. ->orderBy('create_time', 'desc')
  360. ->first();
  361. return $playletTitle;
  362. }
  363. public static function promotionData($platType, $sendTimeStart, $sendTimeEnd, $keyword, $page, $pageSize) {
  364. try {
  365. if(empty($platType)) {
  366. $platTypeList = [8, 10];
  367. } else {
  368. $platTypeList = [$platType];
  369. }
  370. $total = DjPromotionDataStat::promotionDataTotal($platTypeList, $sendTimeStart, $sendTimeEnd, $keyword);
  371. $totalStat['cost'] = $total->cost ?? 0;
  372. $totalStat['first_day_charge'] = $total->first_day_charge ?? 0;
  373. $totalStat['first_roi'] = $totalStat['cost'] > 0 ? round($totalStat['first_day_charge'] / $totalStat['cost'] * 100, 2) . '%' : '0%';
  374. list($data, $count) = DjPromotionDataStat::promotionList($platTypeList, $sendTimeStart, $sendTimeEnd, $keyword, $page, $pageSize);
  375. # 数据格式化
  376. foreach($data as $item) {
  377. $item->first_roi = ($item->first_roi * 100).'%';
  378. }
  379. return [$data, $count, $totalStat];
  380. }catch(\Exception $exception) {
  381. Log::logError('番茄推广数据接口异常', ['keyword' => $keyword,
  382. 'send_time_start' => $sendTimeStart, 'send_time_end' => $sendTimeEnd, 'page' => $page, 'page_size' => $pageSize,
  383. 'file' => $exception->getFile(), 'line' => $exception->getLine(), 'message' => $exception->getMessage(),
  384. 'trace' => $exception->getTraceAsString()
  385. ], 'interface');
  386. return [[], 0];
  387. }
  388. }
  389. }