ActEffectStatistics.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. namespace app\api\model;
  3. use app\common\enum\order\OrderSource as OrderSourceEnum;
  4. use app\common\model\ActEffectStatistics as ActEffectStatisticsModel;
  5. use think\facade\Db;
  6. /**
  7. * @package app\api\model
  8. */
  9. class ActEffectStatistics extends ActEffectStatisticsModel
  10. {
  11. /**
  12. * @return mixed
  13. */
  14. public static function addInitData()
  15. {
  16. $begin_date = '2021-10-01'; // 生成初始数据开始时间,建议时间为:小程序上线时间
  17. $end_date = date('Y-m-d', strtotime('-1 days')); // 生成初始数据结束时间,建议时间为:昨天
  18. $date_arr = period_date(strtotime($begin_date), strtotime($end_date), 'Y-m-d');
  19. foreach ($date_arr as $date) {
  20. self::addData($date);
  21. echo $date . PHP_EOL;
  22. }
  23. return true;
  24. }
  25. public static function addData($date)
  26. {
  27. $startTime = strtotime("{$date} 00:00:00");
  28. $endTime = strtotime("{$date} 23:59:59");
  29. // 拼团活动
  30. $ptPvUv = self::getPvUv(1, $startTime, $endTime);
  31. // 新用户
  32. $ptUvNew = self::getUvNew(User::ACT_SOURCE_GROUP_BUY, $startTime, $endTime);
  33. //拼团裂变活动 //可能初使
  34. $ptlbPvUv = self::getPvUv(10, $startTime, $endTime);
  35. // 新用户
  36. $ptlbUvNew = self::getUvNew(User::ACT_SOURCE_GROUP_BUY_LB, $startTime, $endTime);
  37. // 支付订单
  38. $ptPayData = self::getPayData(1, $startTime, $endTime);
  39. self::formatData(self::ACT_TYPE_GROUP_BUY, $date, $ptPayData, $ptPvUv, $ptUvNew);
  40. // 砍价活动
  41. $kjPvUv = self::getPvUv(2, $startTime, $endTime);
  42. // 新用户
  43. $kjUvNew = self::getUvNew(User::ACT_SOURCE_KJ, $startTime, $endTime);
  44. // 支付订单
  45. $kjPayData = self::getPayData(2, $startTime, $endTime);
  46. self::formatData(self::ACT_TYPE_KJ, $date, $kjPayData, $kjPvUv, $kjUvNew);
  47. // N件X折活动
  48. // 支付订单
  49. $discountPayData = self::getPayData(3, $startTime, $endTime);
  50. self::formatData(self::ACT_TYPE_DISCOUNT, $date, $discountPayData);
  51. // 满件送活动
  52. // 支付订单
  53. $mjSendPayData = self::getPayData(4, $startTime, $endTime);
  54. self::formatData(self::ACT_TYPE_MJ_SEND, $date, $mjSendPayData);
  55. // 满就送活动
  56. // 支付订单
  57. $fullSendPayData = self::getPayData(5, $startTime, $endTime);
  58. self::formatData(self::ACT_TYPE_FULL_SEND, $date, $fullSendPayData);
  59. //秒杀活动
  60. $miaoshaPayData = self::getPayData(9,$startTime, $endTime);
  61. // var_dump($miaoshaPayData);
  62. // die();
  63. self::formatData(self::ACT_TYPE_MIAOSHA, $date, $miaoshaPayData);
  64. //拼团裂变活动
  65. $groupbuylbData = self::getPayData(self::ACT_TYPE_GROUP_BUY_LB,$startTime,$endTime);
  66. self::formatData(self::ACT_TYPE_GROUP_BUY_LB, $date, $groupbuylbData,$ptlbPvUv,$ptUvNew);
  67. }
  68. /**
  69. * @param $type
  70. * @param $date
  71. * @param $payData
  72. * @param array $pvUv
  73. * @param array $uvNew
  74. * @return mixed
  75. */
  76. private static function formatData($type, $date, $payData, $pvUv = [], $uvNew = [])
  77. {
  78. $actIdArr = array_unique(array_merge(array_column($pvUv, 'act_id'), array_keys($uvNew), array_keys($payData)));
  79. foreach ($actIdArr as $actId) {
  80. $pv = 0;
  81. $uv = 0;
  82. $uvNewV = 0;
  83. $payOrderCount = 0;
  84. $payUserCount = 0;
  85. $payAmount = 0;
  86. foreach ($pvUv as $pvUvV) {
  87. if ($pvUvV['act_id'] == $actId) {
  88. $pv = $pvUvV['pv'];
  89. $uv = $pvUvV['uv'];
  90. }
  91. }
  92. if (isset($uvNew[$actId])) {
  93. $uvNewV = $uvNew[$actId]['uv_new'];
  94. }
  95. if (isset($payData[$actId])) {
  96. $payOrderCount = $payData[$actId]['pay_order_count'];
  97. $payUserCount = $payData[$actId]['pay_user_count'];
  98. $payAmount = $payData[$actId]['pay_amount'];
  99. }
  100. $insert = [
  101. 'act_id' => $actId,
  102. 'act_type' => $type,
  103. 'ref_date' => date('Ymd', strtotime($date)),
  104. 'pv' => (int)$pv,
  105. 'uv' => (int)$uv,
  106. 'uv_new' => $uvNewV,
  107. 'pay_order_count' => $payOrderCount,
  108. 'pay_user_count' => $payUserCount,
  109. 'pay_amount' => $payAmount,
  110. ];
  111. $info = self::where('act_id', $actId)->where('act_type', $type)->where('ref_date', date('Ymd', strtotime($date)))->find();
  112. if (empty($info)) {
  113. (new self)->save($insert);
  114. } else {
  115. $info->where('id', $info['id'])->update($insert);
  116. }
  117. }
  118. }
  119. private static function getPvUv($type, $startTime, $endTime)
  120. {
  121. // 访问量
  122. $data = Db::name('visit_record')->where('visit_type', $type)
  123. ->whereBetween('create_time', [$startTime, $endTime])
  124. ->field('sum(IF(v_type=0, 1, 0)) as pv,sum(IF(v_type=1, 1, 0)) as uv,visit_type_id as act_id')
  125. ->group('act_id')
  126. ->select()->toArray();
  127. return $data;
  128. }
  129. private static function getUvNew($type, $startTime, $endTime)
  130. {
  131. $data = User::where('act_source', $type)
  132. ->whereBetween('create_time', [$startTime, $endTime])
  133. ->group('act_source_id')
  134. ->column('count(act_source_id) as uv_new,act_source_id', 'act_source_id');
  135. return $data;
  136. }
  137. private static function getPayData($type, $startTime, $endTime)
  138. {
  139. switch ($type) {
  140. case self::ACT_TYPE_GROUP_BUY_LB:
  141. $data = Db::name('order')->alias('order')->where('order.order_source', OrderSourceEnum::GROUPBUYLB)
  142. ->leftJoin('group_buy_lb_activity_help help', 'help.id=order.order_source_id')
  143. ->whereBetween('order.pay_time', [$startTime, $endTime])
  144. ->where('order.is_delete', '=', 0)
  145. ->group('help.group_buy_lb_activity_id')
  146. ->column('count(distinct(order.user_id)) as pay_user_count,sum(order.pay_price + order.rice_card_money) as pay_amount,count(order.order_id) as pay_order_count,help.group_buy_lb_activity_id', 'help.group_buy_lb_activity_id');
  147. break;
  148. case self::ACT_TYPE_GROUP_BUY:
  149. $data = Db::name('order')->alias('order')->where('order.order_source', OrderSourceEnum::GROUPBUY)
  150. ->leftJoin('group_buy_activity_help help', 'help.id=order.order_source_id')
  151. ->whereBetween('order.pay_time', [$startTime, $endTime])
  152. ->where('order.is_delete', '=', 0)
  153. ->group('help.group_buy_activity_id')
  154. ->column('count(distinct(order.user_id)) as pay_user_count,sum(order.pay_price + order.rice_card_money) as pay_amount,count(order.order_id) as pay_order_count,help.group_buy_activity_id', 'help.group_buy_activity_id');
  155. break;
  156. case self::ACT_TYPE_MIAOSHA:
  157. $data = Db::name('order')->alias('order')->where('order.order_source', OrderSourceEnum::MIAOSHA)
  158. ->leftJoin('ms_activity_goods goods', 'goods.id=order.order_source_id')
  159. ->whereBetween('order.pay_time', [$startTime, $endTime])
  160. ->where('order.is_delete', '=', 0)
  161. ->group('goods.ms_activity_id')
  162. ->column('count(distinct(order.user_id)) as pay_user_count,sum(order.pay_price + order.rice_card_money) as pay_amount,count(order.order_id) as pay_order_count,goods.ms_activity_id', 'goods.ms_activity_id');
  163. break;
  164. case self::ACT_TYPE_KJ:
  165. $data = Db::name('order')->alias('order')->where('order.order_source', OrderSourceEnum::BARGAIN)
  166. ->leftJoin('kj_activity_join join', 'join.id=order.order_source_id')
  167. ->whereBetween('order.pay_time', [$startTime, $endTime])
  168. ->where('order.is_delete', '=', 0)
  169. ->group('join.activity_id')
  170. ->column('count(distinct(order.user_id)) as pay_user_count,sum(order.pay_price + order.rice_card_money) as pay_amount,count(order.order_id) as pay_order_count,join.activity_id', 'join.activity_id');
  171. break;
  172. case self::ACT_TYPE_DISCOUNT:
  173. $data = Db::name('order_goods')->alias('og')->where('og.is_activity_discount', 1)
  174. ->leftJoin('order', 'order.order_id=og.order_id')
  175. ->whereBetween('order.pay_time', [$startTime, $endTime])
  176. ->where('order.is_delete', '=', 0)
  177. ->group('og.activity_discount_id')
  178. ->column('count(distinct(order.user_id)) as pay_user_count,sum(og.total_pay_price + og.rice_card_money) as pay_amount,count(distinct(order.order_id)) as pay_order_count,og.activity_discount_id', 'og.activity_discount_id');
  179. break;
  180. case self::ACT_TYPE_MJ_SEND:
  181. $data = Db::name('order_goods')->alias('og')->where('og.is_mj_send', 1)
  182. ->leftJoin('order', 'order.order_id=og.order_id')
  183. ->whereBetween('order.pay_time', [$startTime, $endTime])
  184. ->where('order.is_delete', '=', 0)
  185. ->group('og.mj_send_activity_id')
  186. ->column('count(distinct(order.user_id)) as pay_user_count,sum(og.total_pay_price + og.rice_card_money) as pay_amount,count(distinct(order.order_id)) as pay_order_count,og.mj_send_activity_id', 'og.mj_send_activity_id');
  187. break;
  188. case self::ACT_TYPE_FULL_SEND:
  189. $data = Db::name('order_goods')->alias('og')->where('og.is_full_send', 1)
  190. ->leftJoin('order', 'order.order_id=og.order_id')
  191. ->whereBetween('order.pay_time', [$startTime, $endTime])
  192. ->where('order.is_delete', '=', 0)
  193. ->group('og.full_send_activity_id')
  194. ->column('count(distinct(order.user_id)) as pay_user_count,sum(og.total_pay_price + og.rice_card_money) as pay_amount,count(distinct(order.order_id)) as pay_order_count,og.full_send_activity_id', 'og.full_send_activity_id');
  195. break;
  196. default:
  197. $data = [];
  198. break;
  199. }
  200. return $data;
  201. }
  202. }