OrderTransformer.php 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. <?php
  2. namespace App\Transformer\Order;
  3. use App\Cache\StatisticCache;
  4. use App\Consts\BaseConst;
  5. use Illuminate\Support\Facades\DB;
  6. use Illuminate\Support\Facades\Redis;
  7. use Vinkla\Hashids\Facades\Hashids;
  8. class OrderTransformer
  9. {
  10. public function newBuildOrderData($data): array
  11. {
  12. return [
  13. 'count' => count($data),
  14. 'list' => $this->newEachOrderData($data),
  15. ];
  16. }
  17. private function newEachOrderData($list): array
  18. {
  19. $result = [];
  20. if (empty($list)) return $result;
  21. foreach ($list as $item) {
  22. $result[] = [
  23. 'uid' => getProp($item, 'uid'),
  24. 'price' => getProp($item, 'price'),
  25. 'distribution_channel_id' => getProp($item, 'distribution_channel_id'),
  26. 'trade_no' => getProp($item, 'trade_no'),
  27. 'transaction_id' => getProp($item, 'transaction_id'),
  28. 'send_order_id' => getProp($item, 'send_order_id'),
  29. 'order_type' => getProp($item, 'order_type'),
  30. 'created_at' => transDate(getProp($item, 'created_at')),
  31. ];
  32. }
  33. return $result;
  34. }
  35. public function newBuildUserData($data): array
  36. {
  37. return [
  38. 'count' => count($data),
  39. 'list' => $this->newEachUserData($data),
  40. ];
  41. }
  42. private function newEachUserData($list): array
  43. {
  44. $result = [];
  45. if (empty($list)) return $result;
  46. foreach ($list as $item) {
  47. $result[] = [
  48. 'uid' => getProp($item, 'id'),
  49. 'nickname' => getProp($item, 'nickname'),
  50. 'distribution_channel_id' => getProp($item, 'distribution_channel_id'),
  51. 'send_order_id' => getProp($item, 'send_order_id'),
  52. 'from_uid' => getProp($item, 'from_uid'),
  53. 'balance' => getProp($item, 'balance'),
  54. 'charge_balance' => getProp($item, 'charge_balance'),
  55. 'reward_balance' => getProp($item, 'reward_balance'),
  56. 'vip_limit_date' => transDate(getProp($item, 'vip_limit_date')),
  57. 'token' => getProp($item, 'token'),
  58. 'created_at' => transDate(getProp($item, 'created_at')),
  59. ];
  60. }
  61. return $result;
  62. }
  63. public function newBuildReportData($data): array
  64. {
  65. return [
  66. 'meta' => getMeta($data),
  67. 'list' => $this->newEachReportData($data->items()),
  68. 'header' => $data->header,
  69. ];
  70. }
  71. private function newEachReportData($list): array
  72. {
  73. $result = [];
  74. if (empty($list)) return $result;
  75. foreach ($list as $item) {
  76. $callback_result = getProp($item, 'callback_result');
  77. $remark = getProp($item, 'remark');
  78. $remark = getProp($item, 'id') && $remark == '' ? '比例回传' : $remark;
  79. if (!getProp($item, 'id') && $remark == '') $remark = '回传类型过滤';
  80. $is_enable_report = 0;
  81. if ($callback_result == '失败' && $remark == '比例过滤') $is_enable_report = 1;
  82. $result[] = [
  83. 'report_id' => getProp($item, 'id'),
  84. 'trade_no' => getProp($item, 'trade_no'),
  85. 'send_order_id' => getProp($item, 'send_order_id'),
  86. 'advertiser_id' => getProp($item, 'advertiserid'),
  87. 'promotion_id' => getProp($item, 'promotionid'),
  88. 'callback_result' => $callback_result ? $callback_result : '失败',
  89. 'remark' => $remark,
  90. 'is_enable_report' => $is_enable_report,
  91. 'uid' => getProp($item, 'uid'),
  92. 'register_ip' => getProp($item, 'register_ip'),
  93. 'register_time' => transDate(getProp($item, 'register_time')),
  94. 'pay_time' => transDate(getProp($item, 'pay_time')),
  95. 'price' => getProp($item, 'price'),
  96. 'current_percent' => getProp($item, 'report_receive_num') ? round(getProp($item, 'report_post_num')/getProp($item, 'report_receive_num')*100, 2) : 0,
  97. 'report_percent' => (float)getProp($item, 'report_percent'),
  98. ];
  99. }
  100. return $result;
  101. }
  102. public function newBuildSendOrderData($data): array
  103. {
  104. return [
  105. 'meta' => getMeta($data),
  106. 'list' => $this->newEachSendOrderData($data->items()),
  107. 'header' => 'https://'.env('DOUYIN_DOMAIN').'/api/listenData?dycallback=1&channel_id='.$data->channel_id.'&adid=__AID__&creativeid=__CID__&creativetype=__CTYPE__&clickid=__CLICKID__&ip=__IP__&ua=__UA__',
  108. ];
  109. }
  110. private function newEachSendOrderData($list): array
  111. {
  112. $result = [];
  113. if (empty($list)) return $result;
  114. $start = date('Y-m-d 00:00:00');
  115. foreach ($list as $item) {
  116. $send_order_id = getProp($item, 'id');
  117. // 获取今日注册人数
  118. $today_register_num = DB::table('users')->where('send_order_id', $send_order_id)->where('created_at', '>', $start)->count('id');
  119. // 今日订单信息
  120. $today_order = DB::table('orders')->leftJoin('users', 'orders.uid', 'users.id')->where('users.send_order_id', $send_order_id)
  121. ->where('orders.send_order_id', $send_order_id)->where('users.created_at', '>', $start)
  122. ->where('orders.status', 'PAID')->where('orders.created_at', '>', $start)->selectRaw("count(orders.pay_num = 1) as register_pay_num, sum(orders.price) as register_pay_amount")->get();
  123. $today_register_pay_num = getProp($today_order[0], 'register_pay_num');
  124. $today_register_pay_amount = getProp($today_order[0], 'register_pay_amount') ? getProp($today_order[0], 'register_pay_amount') : 0;
  125. // // 获取今日注册充值人数(只计算首充)
  126. // $today_register_pay_num = DB::table('orders')->leftJoin('users', 'orders.uid', 'users.id')->where('users.send_order_id', $send_order_id)
  127. // ->where('orders.send_order_id', $send_order_id)->where('users.created_at', '>', $start)
  128. // ->where('orders.status', 'PAID')->where('orders.created_at', '>', $start)->where('orders.pay_num', 1)->count('orders.id');
  129. // // 获取今日注册用户充值金额(包含多充)
  130. // $today_register_pay_amount = DB::table('users')->leftJoin('orders', 'orders.uid', 'users.id')->where('users.send_order_id', $send_order_id)
  131. // ->where('orders.send_order_id', $send_order_id)->where('users.created_at', '>', $start)
  132. // ->where('orders.status', 'PAID')->where('orders.created_at', '>', $start)->sum('orders.price');
  133. // 派单uv
  134. $uv = Redis::scard('send_order_uv_'.$send_order_id);
  135. $uv = $uv ? $uv : 0;
  136. // 累计订单信息
  137. $total_order = DB::table('orders')->where('orders.send_order_id', $send_order_id)->where('orders.status', 'PAID')
  138. ->selectRaw("count(distinct orders.uid) as pay_num, sum(orders.price) as pay_amount")->get();
  139. $total_pay_num = getProp($total_order[0], 'pay_num');
  140. $total_pay_amount = getProp($total_order[0], 'pay_amount') ? getProp($total_order[0], 'pay_amount') : 0;
  141. // // 累计充值人数
  142. // $a = DB::table('orders')->where('send_order_id', $send_order_id)->where('status', 'PAID')->select('uid')->groupBy('uid')->get();
  143. // $total_pay_num = count($a);
  144. // // 累计充值金额
  145. // $total_pay_amount = DB::table('orders')->where('send_order_id', $send_order_id)->where('status', 'PAID')->sum('price');
  146. $result[] = [
  147. 'send_order_id' => $send_order_id,
  148. 'distribution_channel_id' => getProp($item, 'distribution_channel_id'),
  149. 'channel_type' => getProp($item, 'channel_type'),
  150. 'send_order_name' => getProp($item, 'name'),
  151. 'promote_user' => getProp($item, 'nickname'),
  152. 'send_order_url' => getProp($item, 'send_order_url'),
  153. 'url_params' => $this->setUrlParams(getProp($item, 'id'), getProp($item, 'distribution_channel_id'), getProp($item, 'book_id'), getProp($item, 'chapter_id')),
  154. 'bid' => getProp($item, 'book_id'),
  155. 'book_name' => getProp($item, 'book_name'),
  156. 'category_name' => getProp($item, 'category_name'),
  157. 'cid' => getProp($item, 'chapter_id'),
  158. 'chapter_name' => getProp($item, 'chapter_name'),
  159. 'cover' => addPrefix(getProp($item, 'cover')),
  160. 'intro' => filterIntro(getProp($item, 'intro')),
  161. 'report_percent' => (float)sprintf('%.2f', getProp($item, 'report_percent')),
  162. 'report_receive_num' => (int)getProp($item, 'report_receive_num'),
  163. 'report_post_num' => (int)getProp($item, 'report_post_num'),
  164. 'created_at' => transDate(getProp($item, 'created_at')),
  165. 'template_id' => (int)getProp($item, 'template_id'),
  166. 'template_name' => getProp($item, 'template_name'),
  167. 'today_register_num' => (int)$today_register_num,
  168. 'today_register_pay_num' => (int)$today_register_pay_num,
  169. 'today_register_pay_amount' => (float)sprintf('%.2f', $today_register_pay_amount),
  170. 'total_register_num' => (int)(getProp($item, 'total_register_num') + $today_register_num),
  171. 'total_register_pay_num' => (int)(getProp($item, 'total_register_pay_num') + $today_register_pay_num),
  172. 'total_register_pay_amount' => (float)sprintf('%.2f', (getProp($item, 'total_register_pay_amount') + $today_register_pay_amount)),
  173. 'uv' => $uv,
  174. 'total_pay_num' => (int)$total_pay_num,
  175. 'total_pay_amount' => (float)sprintf('%.2f', $total_pay_amount),
  176. 'total_cost' => (float)sprintf('%.2f', getProp($item, 'cost')),
  177. 'total_profit' => (float)sprintf('%.2f', getProp($item, 'total_profit')),
  178. 'total_profit_percent' => (float)getProp($item, 'cost') ? (float)sprintf('%.2f', ($total_pay_amount / getProp($item, 'cost') * 100)) : 0
  179. ];
  180. }
  181. return $result;
  182. }
  183. public function newBuildSendOrderDayData($data): array
  184. {
  185. return [
  186. 'meta' => getMeta($data),
  187. 'list' => $this->newEachSendOrderDayData($data->items(), $data->start_date, $data->send_order_id),
  188. 'send_order_name' => $data->send_order_name,
  189. 'send_order_id' => $data->send_order_id,
  190. ];
  191. }
  192. private function newEachSendOrderDayData($list, $start_date, $send_order_id): array
  193. {
  194. $result = [];
  195. if (empty($list)) return $result;
  196. $start = $start_date;
  197. $end = date('Y-m-d', strtotime($start.' +60 day'));
  198. // 获取最近2个月的数据
  199. $data = DB::table('send_order_recharge_day_stats')->where('send_order_id', $send_order_id)->whereBetween('register_date', [$start, $end])
  200. ->orderBy('pay_date')->get()->map(function ($value) {
  201. return (array)$value;
  202. })->toArray();
  203. $day_stats = [];
  204. // 注册用户派单日数据初始化
  205. foreach ($list as $item) {
  206. $day_stats[getProp($item, 'day')] = [];
  207. }
  208. // 将已有数据填充
  209. foreach ($data as $item) {
  210. $day = $item['register_date'];
  211. $day_stats[$day]['t'.$item['day_num']] = [
  212. 'register_pay_amount' => $item['pay_amount'],
  213. 'total_register_pay_amount' => $item['day_num'] == 0 ? $item['pay_amount'] : 0, // t0日有金额,其他日在下个循环累加
  214. ];
  215. }
  216. // 将当日无数据的日期占位并计算累计值
  217. foreach ($day_stats as $day=>$value) {
  218. $today_start = date('Y-m-d 00:00:00');
  219. $today_end = date('Y-m-d 23:59:59');
  220. // 获取当日注册用户
  221. if (Redis::exists('register_uids_'.$send_order_id.'_'.$day)) { //获取缓存
  222. $day_register_uids = json_decode(Redis::get('register_uids_'.$send_order_id.'_'.$day), true);
  223. }else {
  224. $day_register_uids = DB::table('users')->where('send_order_id', $send_order_id)
  225. ->whereBetween('created_at', [date('Y-m-d 00:00:00', strtotime($day)), date('Y-m-d 23:59:59', strtotime($day))])
  226. ->select('id')->get()->pluck('id')->toArray();
  227. // 写入缓存
  228. Redis::set('register_uids_'.$send_order_id.'_'.$day, json_encode($day_register_uids));
  229. Redis::expire('register_uids_'.$send_order_id.'_'.$day, strtotime($today_end)-time());
  230. }
  231. // 获取注册用户今日数据
  232. $day_stats[$day]['today']['register_pay_amount'] = DB::table('orders')->where('send_order_id', $send_order_id)->where('status', 'PAID')
  233. ->whereIn('uid', $day_register_uids)->whereBetween('created_at', [$today_start, $today_end])->sum('price');
  234. $day_stats[$day]['today']['total_register_pay_amount'] = DB::table('orders')->where('send_order_id', $send_order_id)->where('status', 'PAID')
  235. ->whereIn('uid', $day_register_uids)->where('created_at', '<=', $today_end)->sum('price');
  236. // 获取注册用户总数据
  237. $total_data = DB::table('orders')->where('send_order_id', $send_order_id)->where('status', 'PAID')
  238. ->whereIn('uid', $day_register_uids)->selectRaw("count(distinct uid) as pay_num, sum(price) as total_pay_amount")->get();
  239. $day_stats[$day]['total']['pay_num'] = getProp($total_data[0], 'pay_num');
  240. $day_stats[$day]['total']['total_pay_amount'] = getProp($total_data[0], 'total_pay_amount') ? getProp($total_data[0], 'total_pay_amount') : 0;
  241. // $day_stats[$day]['total']['pay_num'] = count(DB::table('orders')->where('send_order_id', $send_order_id)->where('orders.status', 'PAID')
  242. // ->whereIn('uid', $day_register_uids)->select('uid')->groupBy('uid')->get());
  243. // $day_stats[$day]['total']['total_pay_amount'] = DB::table('orders')->where('send_order_id', $send_order_id)->where('orders.status', 'PAID')
  244. // ->whereIn('uid', $day_register_uids)->sum('price');
  245. for ($i=0;$i<=29;$i++) {
  246. $diff_day = (strtotime(date('Y-m-d'))-strtotime($day))/86400;
  247. if (isset($day_stats[$day]['t'.$i])) {
  248. if ($i != 0) $day_stats[$day]['t'.$i]['total_register_pay_amount'] = round($day_stats[$day]['t'.($i-1)]['total_register_pay_amount'] + $day_stats[$day]['t'.$i]['register_pay_amount'], 2);
  249. }else {
  250. if ($i == $diff_day) { // 如果是当日则取当日数据
  251. $day_stats[$day]['t'.$i] = [
  252. 'register_pay_amount' => $day_stats[$day]['today']['register_pay_amount'],
  253. 'total_register_pay_amount' => 0,
  254. ];
  255. }else {
  256. $day_stats[$day]['t'.$i] = [
  257. 'register_pay_amount' => 0,
  258. 'total_register_pay_amount' => 0,
  259. ];
  260. }
  261. if ($i != 0) $day_stats[$day]['t'.$i]['total_register_pay_amount'] = round($day_stats[$day]['t'.($i-1)]['total_register_pay_amount'] + $day_stats[$day]['t'.$i]['register_pay_amount'], 2);
  262. }
  263. }
  264. }
  265. foreach ($list as $item) {
  266. $send_order_id = getProp($item, 'send_order_id');
  267. $day = getProp($item, 'day');
  268. $cost = (float)getProp($item, 'cost');
  269. // 获取日统计数据
  270. $stats = $day_stats[$day];
  271. $result[] = [
  272. 'id' => getProp($item, 'id'),
  273. 'send_order_id' => $send_order_id,
  274. 'date' => $day,
  275. 'cost' => $cost,
  276. 'register_num' => getProp($item, 'register_num'), // 注册用户
  277. 'register_cost' => getProp($item, 'register_num') ? round($cost/getProp($item, 'register_num'), 2) : 0, // 注册成本
  278. 'register_pay_num' => getProp($item, 'register_pay_num'), // 当日注册充值人数
  279. 'register_pay_percent' => getProp($item, 'register_num') ? round(getProp($item, 'register_pay_num')/getProp($item, 'register_num')*100, 2) : 0, // 当日注册付费率
  280. 'register_pay_cost' => getProp($item, 'register_pay_num') ? round($cost/getProp($item, 'register_pay_num'), 2) : 0, // 当日转化成本
  281. 'total_register_pay_amount' => (float)sprintf('%.2f', getProp($stats, 'total')['total_pay_amount']), // 累计充值
  282. 'total_profit_percent' => (float)$cost ? round(getProp($stats, 'total')['total_pay_amount']/$cost*100, 2) : 0, //累计回本率
  283. 'total_profit_cost' => getProp($stats, 'total')['pay_num'] ? round($cost / getProp($stats, 'total')['pay_num'], 2) : 0,
  284. 't0' => [
  285. 'register_pay_amount' => (float)$stats['t0']['register_pay_amount'],
  286. 'total_register_pay_amount' => (float)$stats['t0']['total_register_pay_amount'],
  287. 'profit_percent' => (float)$cost ? round($stats['t0']['register_pay_amount']/$cost*100, 2) : 0, //当日回本率
  288. 'total_profit_percent' => (float)$cost ? round($stats['t0']['total_register_pay_amount']/$cost*100, 2) : 0, //累计回本率
  289. ],
  290. 't1' => [
  291. 'register_pay_amount' => (float)$stats['t1']['register_pay_amount'],
  292. 'total_register_pay_amount' => (float)$stats['t1']['total_register_pay_amount'],
  293. 'profit_percent' => (float)$cost ? round($stats['t1']['register_pay_amount']/$cost*100, 2) : 0, //当日回本率
  294. 'total_profit_percent' => (float)$cost ? round($stats['t1']['total_register_pay_amount']/$cost*100, 2) : 0, //累计回本率
  295. ],
  296. 't2' => [
  297. 'register_pay_amount' => (float)$stats['t2']['register_pay_amount'],
  298. 'total_register_pay_amount' => (float)$stats['t2']['total_register_pay_amount'],
  299. 'profit_percent' => (float)$cost ? round($stats['t2']['register_pay_amount']/$cost*100, 2) : 0, //当日回本率
  300. 'total_profit_percent' => (float)$cost ? round($stats['t2']['total_register_pay_amount']/$cost*100, 2) : 0, //累计回本率
  301. ],
  302. 't3' => [
  303. 'register_pay_amount' => (float)$stats['t3']['register_pay_amount'],
  304. 'total_register_pay_amount' => (float)$stats['t3']['total_register_pay_amount'],
  305. 'profit_percent' => (float)$cost ? round($stats['t3']['register_pay_amount']/$cost*100, 2) : 0, //当日回本率
  306. 'total_profit_percent' => (float)$cost ? round($stats['t3']['total_register_pay_amount']/$cost*100, 2) : 0, //累计回本率
  307. ],
  308. 't4' => [
  309. 'register_pay_amount' => (float)$stats['t4']['register_pay_amount'],
  310. 'total_register_pay_amount' => (float)$stats['t4']['total_register_pay_amount'],
  311. 'profit_percent' => (float)$cost ? round($stats['t4']['register_pay_amount']/$cost*100, 2) : 0, //当日回本率
  312. 'total_profit_percent' => (float)$cost ? round($stats['t4']['total_register_pay_amount']/$cost*100, 2) : 0, //累计回本率
  313. ],
  314. 't5' => [
  315. 'register_pay_amount' => (float)$stats['t5']['register_pay_amount'],
  316. 'total_register_pay_amount' => (float)$stats['t5']['total_register_pay_amount'],
  317. 'profit_percent' => (float)$cost ? round($stats['t5']['register_pay_amount']/$cost*100, 2) : 0, //当日回本率
  318. 'total_profit_percent' => (float)$cost ? round($stats['t5']['total_register_pay_amount']/$cost*100, 2) : 0, //累计回本率
  319. ],
  320. 't6' => [
  321. 'register_pay_amount' => (float)$stats['t6']['register_pay_amount'],
  322. 'total_register_pay_amount' => (float)$stats['t6']['total_register_pay_amount'],
  323. 'profit_percent' => (float)$cost ? round($stats['t6']['register_pay_amount']/$cost*100, 2) : 0, //当日回本率
  324. 'total_profit_percent' => (float)$cost ? round($stats['t6']['total_register_pay_amount']/$cost*100, 2) : 0, //累计回本率
  325. ],
  326. 't14' => [
  327. 'register_pay_amount' => (float)$stats['t14']['register_pay_amount'],
  328. 'total_register_pay_amount' => (float)$stats['t14']['total_register_pay_amount'],
  329. 'profit_percent' => (float)$cost ? round($stats['t14']['register_pay_amount']/$cost*100, 2) : 0, //当日回本率
  330. 'total_profit_percent' => (float)$cost ? round($stats['t14']['total_register_pay_amount']/$cost*100, 2) : 0, //累计回本率
  331. ],
  332. 't29' => [
  333. 'register_pay_amount' => (float)$stats['t29']['register_pay_amount'],
  334. 'total_register_pay_amount' => (float)$stats['t29']['total_register_pay_amount'],
  335. 'profit_percent' => (float)$cost ? round($stats['t29']['register_pay_amount']/$cost*100, 2) : 0, //当日回本率
  336. 'total_profit_percent' => (float)$cost ? round($stats['t29']['total_register_pay_amount']/$cost*100, 2) : 0, //累计回本率
  337. ],
  338. ];
  339. }
  340. return $result;
  341. }
  342. /**
  343. * @param $send_order_id // 派单id
  344. * @param $distribution_channel_id // 站点id
  345. * @param $bid // 书籍id
  346. * @param $cid // 章节id
  347. * @return string
  348. */
  349. private function setUrlParams($send_order_id, $distribution_channel_id, $bid, $cid)
  350. {
  351. $arr = [
  352. 'bid' => $bid ? Hashids::encode($bid) : '',
  353. 'cid' => $cid ? Hashids::encode($cid) : '',
  354. 'send_order_id' => $send_order_id,
  355. 'distribution_channel_id' => $distribution_channel_id,
  356. 'jump' => 'no',
  357. ];
  358. $path = 'pages/reader/index';
  359. return '/' . $path . '?' . http_build_query($arr);
  360. }
  361. /**
  362. * 订单列表
  363. *
  364. * @param $data
  365. * @return array
  366. */
  367. public function orderList($data): array
  368. {
  369. return [
  370. 'meta' => getMeta($data),
  371. 'list' => $this->eachOrderList($data->items()),
  372. ];
  373. }
  374. private function eachOrderList($list): array
  375. {
  376. if (empty($list)) {
  377. return [];
  378. }
  379. $result = [];
  380. foreach ($list as $item) {
  381. $result[] = [
  382. 'trade_no' => getProp($item, 'trade_no'),
  383. 'promote_user' => getProp($item, 'nickname'),
  384. 'uid' => getProp($item, 'uid'),
  385. 'distribution_channel_id' => getProp($item, 'distribution_channel_id'),
  386. 'register_ip' => getProp($item, 'register_ip'),
  387. 'register_at' => getProp($item, 'register_time'),
  388. 'bind_send_order_time' => getProp($item, 'bind_send_order_time') ? transDate(getProp($item, 'bind_send_order_time')) : transDate(getProp($item, 'register_time')),
  389. 'book_name' => getProp($item, 'book_name'),
  390. 'send_order_id' => getProp($item, 'send_order_id'),
  391. 'send_order_name' => getProp($item, 'send_order_name'),
  392. 'price' => (float)getProp($item, 'price'),
  393. 'status' => getProp($item, 'status'),
  394. 'order_type' => getProp($item, 'order_type'),
  395. 'created_at' => $item->created_at->format('Y-m-d H:i:s'),
  396. 'updated_at' => $item->updated_at->format('Y-m-d H:i:s'),
  397. ];
  398. }
  399. return $result;
  400. }
  401. public function newBuildTemplateList($data): array
  402. {
  403. return [
  404. 'meta' => getMeta($data),
  405. 'list' => $this->newEachTemplateData($data),
  406. ];
  407. }
  408. private function newEachTemplateData($list): array
  409. {
  410. $result = [];
  411. if (empty($list)) return $result;
  412. $user_scope_arr = BaseConst::USER_SCOPE;
  413. foreach ($list as $item) {
  414. $template_id = getProp($item, 'id');
  415. $uv = StatisticCache::getTemplateUV($template_id); // 获取uv
  416. // 获取充值产品
  417. $product_origin = DB::table('products')->where('template_id', $template_id)->where('is_enabled', 1)
  418. ->get();
  419. $product_ids = [];
  420. $products = [];
  421. foreach ($product_origin as $v) {
  422. $product_ids[] = getProp($v, 'id');
  423. $coin = $v->given ? (int)round($v->price*100).'+'.$v->given : (int)round($v->price*100);
  424. $products[] = [
  425. 'price' => (float)sprintf('%.2f', $v->price),
  426. 'coin' => (int)$coin,
  427. 'price_desc' => $v->price_desc,
  428. 'name_desc' => $v->name_desc,
  429. 'given' => (int)$v->given,
  430. 'is_default' => (int)$v->is_default,
  431. 'angle_sign_text' => $v->angle_sign_text,
  432. 'type' => $v->type,
  433. 'product_id' => (int)$v->id,
  434. ];
  435. }
  436. $distribution_channel_id = getProp($item, 'distribution_channel_id');
  437. $order_data = DB::table('orders')->where('status', 'PAID')->where('distribution_channel_id', $distribution_channel_id)
  438. ->whereIn('product_id', $product_ids)->selectRaw("count(distinct uid) as pay_num, sum(price) as total_pay_amount")->get();
  439. $pay_num = (int)getProp($order_data[0], 'pay_num'); // 充值人数
  440. $total_pay_amount = (float)sprintf('%.2f', getProp($order_data[0], 'total_pay_amount')); // 充值总额
  441. $pay_percent = $uv ? (float)sprintf('%.2f', ($pay_num / $uv * 100)) : 0; // 充值转化
  442. $result[] = [
  443. 'template_id' => getProp($item, 'id'),
  444. 'template_name' => getProp($item, 'template_name'),
  445. 'distribution_channel_id' => $distribution_channel_id,
  446. 'send_order_id' => getProp($item, 'send_order_id'),
  447. 'template_type' => getProp($item, 'template_type') == 1 ? '默认模板' : '补充模板',
  448. 'user_scope' => isset($user_scope_arr[getProp($item, 'user_scope')]) ? $user_scope_arr[getProp($item, 'user_scope')] : '未知',
  449. 'orders' => (int)getProp($item, 'orders') === 0 ? '--' : getProp($item, 'orders'),
  450. 'is_enable' => getProp($item, 'is_enable'),
  451. 'UV' => (int)$uv,
  452. 'pay_num' => $pay_num,
  453. 'pay_percent' => $pay_percent,
  454. 'total_pay_amount' => $total_pay_amount,
  455. 'products' => $products,
  456. 'created_at' => transDate(getProp($item, 'created_at')),
  457. ];
  458. }
  459. return $result;
  460. }
  461. }