WechatMinprogramUserService.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. /**
  3. *
  4. * @file:WechatMinprogramUserService.php
  5. * @Date: 2023/5/19
  6. * @Time: 11:07
  7. */
  8. namespace Modules\Channel\Services\WechatMinprogram;
  9. use Carbon\Carbon;
  10. use Illuminate\Pagination\LengthAwarePaginator;
  11. use Illuminate\Support\Facades\DB;
  12. use Illuminate\Support\Facades\Redis;
  13. use Illuminate\Support\Str;
  14. use Modules\Channel\Models\MiniprogramUserVip;
  15. use Modules\Channel\Models\Order;
  16. use Modules\Channel\Models\UidLogs;
  17. use Modules\Channel\Models\Videos;
  18. use Modules\Channel\Models\VideoSeries;
  19. use Modules\Manage\Models\Miniprogram;
  20. class WechatMinprogramUserService
  21. {
  22. public const WATCH_RECORD_REDIS_KEY = 'watchrecord:uid:%s';
  23. public const WATCH_RECORD_REDIS_FIELD_PREFIX = 'video_id:';
  24. /**
  25. * 获取微信小程序用户信息
  26. * name: userInfoDetail
  27. * @param $uid
  28. * date 2023/05/19 11:08
  29. */
  30. public static function userInfoDetail($uid)
  31. {
  32. $userInfo = DB::table(getMiniProgramTableName(1, 'users'))->where('id', $uid)->first();
  33. if (!$userInfo) {
  34. return $userInfo;
  35. }
  36. $ju_chang = Miniprogram::where('id', $userInfo->miniprogram_id)->value('play_name');
  37. $result = [
  38. 'uid' => $userInfo->id,
  39. 'openid' => $userInfo->openid,
  40. 'yu_chang' => $ju_chang,
  41. 'ranse_start_at' => $userInfo->ranse_start_at ?: "",
  42. 'charge_coin' => $userInfo->charge_coin,
  43. 'reward_coin' => $userInfo->reward_coin,
  44. ];
  45. return array_merge($result, self::getLevelText($uid));
  46. }
  47. private static function getLevelText($uid)
  48. {
  49. $record = self::userVipRecord($uid);
  50. if ($record && Carbon::now()->lt(Carbon::createFromTimestamp(strtotime($record->end_time)))) {
  51. return ['is_vip' => 1, 'vip_text' => "vip会员", 'vip_end' => $record->end_time];
  52. }
  53. return ['is_vip' => 0, 'vip_text' => "-", 'vip_end' => ""];
  54. }
  55. public static function isVipUser(int $uid)
  56. {
  57. $record = self::userVipRecord($uid);
  58. if (!$record) {
  59. return false;
  60. }
  61. return Carbon::now()->lt(Carbon::createFromTimestamp(strtotime($record->end_time)));
  62. }
  63. private static function userVipRecord(int $uid)
  64. {
  65. return MiniprogramUserVip::where('uid', $uid)->first();
  66. }
  67. /**
  68. * 根据用户查充值记录
  69. * name: getUserOrderList
  70. * @param int $uid
  71. * date 2023/05/19 14:57
  72. */
  73. public static function getUserOrderList(int $uid, $param)
  74. {
  75. $pool = [
  76. 'MONTH' => '包月',
  77. 'QUARTER' => '包季度',
  78. 'YEAR' => '包年',
  79. ];
  80. $list = Order::join('pay_products', 'pay_products.id', '=', 'orders.pay_product_id')
  81. ->select('orders.price', 'orders.trade_no', "orders.video_id", 'orders.pay_end_at', 'pay_products.type', 'pay_products.price as product_price', 'pay_products.given')
  82. ->where('orders.status', 'PAID')
  83. ->where('orders.uid', $uid);
  84. if (getProp($param, 'puser_id', 0) > 0) {
  85. $list->where('orders.puser_id', $param['puser_id']);
  86. }
  87. if (getProp($param, 'user_id', 0) > 0) {
  88. $list->where('orders.user_id', $param['user_id']);
  89. }
  90. $list->orderBy('orders.id', 'desc')
  91. ->paginate(15);
  92. foreach ($list as $item) {
  93. $item->pay_name = '微信支付';
  94. $item->status = '已完成';
  95. if ($item->type == 'COIN') {
  96. $item->rechare_coin = $item->product_price * 100;
  97. $item->pay_result = $item->product_price * 100 + $item->given;
  98. } elseif (isset($pool[$item->type])) {
  99. $item->rechare_coin = "-";
  100. $item->pay_result = $pool[$item->type];
  101. } else {
  102. $item->rechare_coin = "-";
  103. $item->pay_result = '充值';
  104. }
  105. $item->from_page = $item->video_id > 0 ? "播放页" : "充值页";
  106. }
  107. return $list;
  108. }
  109. /**
  110. * 观看记录
  111. * name: getUserWatchRecord
  112. * @param mixed $uid 用户id
  113. * @return array
  114. * date 2023/05/19 15:57
  115. */
  116. public static function getUserWatchRecord($uid)
  117. {
  118. $key = sprintf(self::WATCH_RECORD_REDIS_KEY, $uid);
  119. $record = Redis::hgetall($key);
  120. $result = [];
  121. foreach ($record as $video_field => $watch_info) {
  122. if (!Str::startsWith($video_field, self::WATCH_RECORD_REDIS_FIELD_PREFIX)) {
  123. continue;
  124. }
  125. $video_id = Str::replace(self::WATCH_RECORD_REDIS_FIELD_PREFIX, '', $video_field);
  126. $info = explode('_', $watch_info);
  127. $result[] = [
  128. 'video_id' => $video_id,
  129. 'video_series_sequence' => $info[0],
  130. 'watch_at' => get_date($info[1]),
  131. 'watch_time' => $info[1]
  132. ];
  133. }
  134. usort($result, function ($item1, $item2) {
  135. return $item1['watch_time'] > $item2['watch_time'];
  136. });
  137. return $result;
  138. }
  139. public static function getUserConsumeRecord(mixed $uid)
  140. {
  141. $tableName = 'coin_cost_record_' . ($uid % 8);
  142. $result = DB::table($tableName)->where('uid', $uid)->orderBy('id', 'desc')->paginate();
  143. foreach ($result as $item) {
  144. $item->series_name = VideoSeries::where('video_id', $item->video_id)->where('series_sequence', $item->sequence)->select('series_name')->first()->series_name;
  145. $item->video_name = Videos::where('id', $item->video_id)->value('name');
  146. $item->coin_cost = $item->charge_coin_cost + $item->reward_coin_cost;
  147. }
  148. return $result;
  149. }
  150. }