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