WechatMinprogramUserService.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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)
  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. ->orderBy('orders.id', 'desc')
  85. ->paginate(15);
  86. foreach ($list as $item) {
  87. $item->pay_name = '微信支付';
  88. $item->status = '已完成';
  89. if ($item->type == 'COIN') {
  90. $item->rechare_coin = $item->product_price * 100;
  91. $item->pay_result = $item->product_price * 100 + $item->given;
  92. } elseif (isset($pool[$item->type])) {
  93. $item->rechare_coin = "-";
  94. $item->pay_result = $pool[$item->type];
  95. } else {
  96. $item->rechare_coin = "-";
  97. $item->pay_result = '充值';
  98. }
  99. $item->from_page = $item->video_id > 0 ? "播放页" : "充值页";
  100. }
  101. return $list;
  102. }
  103. /**
  104. * 观看记录
  105. * name: getUserWatchRecord
  106. * @param mixed $uid 用户id
  107. * @return array
  108. * date 2023/05/19 15:57
  109. */
  110. public static function getUserWatchRecord($uid)
  111. {
  112. $key = sprintf(self::WATCH_RECORD_REDIS_KEY, $uid);
  113. $record = Redis::hgetall($key);
  114. $result = [];
  115. foreach ($record as $video_field => $watch_info) {
  116. if (!Str::startsWith($video_field, self::WATCH_RECORD_REDIS_FIELD_PREFIX)) {
  117. continue;
  118. }
  119. $video_id = Str::replace(self::WATCH_RECORD_REDIS_FIELD_PREFIX, '', $video_field);
  120. $info = explode('_', $watch_info);
  121. $result[] = [
  122. 'video_id' => $video_id,
  123. 'video_series_sequence' => $info[0],
  124. 'watch_at' => get_date($info[1]),
  125. 'watch_time' => $info[1]
  126. ];
  127. }
  128. usort($result, function ($item1, $item2) {
  129. return $item1['watch_time'] > $item2['watch_time'];
  130. });
  131. return $result;
  132. }
  133. public static function getUserConsumeRecord(mixed $uid)
  134. {
  135. $tableName = 'coin_cost_record_' . ($uid % 8);
  136. $result = DB::table($tableName)->where('uid', $uid)->orderBy('id', 'desc')->paginate();
  137. foreach ($result as $item) {
  138. $item->series_name = VideoSeries::where('video_id', $item->video_id)->where('series_sequence', $item->sequence)->select('series_name')->first()->series_name;
  139. $item->video_name = Videos::where('id', $item->video_id)->value('name');
  140. $item->coin_cost = $item->charge_coin_cost + $item->reward_coin_cost;
  141. }
  142. return $result;
  143. }
  144. }