Groupon.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. namespace addons\shopro\controller\activity;
  3. use addons\shopro\controller\Common;
  4. use app\admin\model\shopro\activity\Groupon as GrouponModel;
  5. use app\admin\model\shopro\activity\GrouponLog as GrouponLogModel;
  6. use addons\shopro\service\goods\GoodsService;
  7. use addons\shopro\facade\Activity as ActivityFacade;
  8. class Groupon extends Common
  9. {
  10. protected $noNeedLogin = ['index', 'detail'];
  11. protected $noNeedRight = ['*'];
  12. // 商品详情,参团列表
  13. public function index()
  14. {
  15. $params = $this->request->param();
  16. $goods_id = $params['goods_id'] ?? 0;
  17. $activity_id = $params['activity_id'] ?? 0;
  18. $groupons = GrouponModel::with('grouponLogs')->ing()->expire()
  19. ->where('goods_id', $goods_id)
  20. ->where('activity_id', $activity_id)
  21. ->order('id', 'asc')
  22. // ->paginate($this->request->param('list_rows', 10));
  23. ->autopage()->select();
  24. $groupons = json_decode(json_encode($groupons),true);
  25. foreach($groupons as $key => $groupon){
  26. $groupon['expire_second'] = strtotime($groupon['expire_time']) - time();
  27. $groupons[$key] = $groupon;
  28. }
  29. $this->success('获取成功', $groupons);
  30. }
  31. //某个拼团详情
  32. public function detailnew(){
  33. $id = $this->request->param('id');
  34. $groupon = GrouponModel::with(['groupon_logs'])->where('id', $id)->find();
  35. if (!$groupon) {
  36. $this->error(__('No Results were found'));
  37. }
  38. $service = new GoodsService();
  39. // 查询所有状态的商品,并且包含被删除的商品
  40. $goods = $service->withTrashed()->where('id', $groupon->goods_id)->find();
  41. if (!$goods) {
  42. $this->error('活动商品不存在');
  43. }
  44. $groupon['goods'] = $goods;
  45. $this->success('获取成功', $groupon);
  46. }
  47. // 团详情
  48. public function detail()
  49. {
  50. $id = $this->request->param('id');
  51. $groupon = GrouponModel::with(['my', 'groupon_logs', 'activity' => function ($query) {
  52. $query->removeOption('soft_delete')->with(['activity_sku_prices']); // 关联团所属活动,并关联活动规格
  53. }])->where('id', $id)->find();
  54. if (!$groupon) {
  55. $this->error(__('No Results were found'));
  56. }
  57. session('goods-activity_id:' . $groupon->goods_id, $groupon->activity_id);
  58. $service = new GoodsService(function ($goods, $service) use ($groupon) {
  59. $goods->skus = $goods->skus;
  60. $goods->activity = $goods->activity;
  61. return $goods;
  62. });
  63. // 查询所有状态的商品,并且包含被删除的商品
  64. $goods = $service->activity($groupon->activity_id)->withTrashed()->where('id', $groupon->goods_id)->find();
  65. if (!$goods) {
  66. $this->error('活动商品不存在');
  67. }
  68. // 商品可能关联不出来活动,因为活动可能已经被删除,redis 也会被删除
  69. if (!$currentActivity = $goods->activity) {
  70. // 活动已经结束被删除
  71. if ($currentActivity = $groupon->activity) { // 尝试获取包含回收站在内的活动信息
  72. // 获取活动格式化之后的规格
  73. $skuPrices = ActivityFacade::recoverSkuPrices($goods, $currentActivity);
  74. $goods['new_sku_prices'] = $skuPrices;
  75. }
  76. }
  77. $goods = $goods->toArray();
  78. $goods['sku_prices'] = $goods['new_sku_prices'];
  79. unset($goods['new_sku_prices']);
  80. $groupon['goods'] = $goods;
  81. $groupon['activity_status'] = $currentActivity['status'];
  82. $this->success('获取成功', $groupon);
  83. }
  84. // 我的拼团
  85. public function myGroupons()
  86. {
  87. $user = auth_user();
  88. $params = $this->request->param();
  89. $type = $params['type'] ?? 'all';
  90. $grouponIds = GrouponLogModel::where('user_id', $user->id)->order('id', 'desc')->column('groupon_id');
  91. $groupons = GrouponModel::with(['my' => function ($query) {
  92. $query->with(['order', 'order_item']);
  93. }, 'groupon_logs', 'activity' => function ($query) {
  94. $query->removeOption('soft_delete')->with(['activity_sku_prices']); // 关联团所属活动,并关联活动规格
  95. }, 'goods' => function ($query) {
  96. $query->removeOption('soft_delete');
  97. }])->whereIn('id', $grouponIds);
  98. if ($type != 'all') {
  99. $type = $type == 'finish' ? ['finish', 'finish-fictitious'] : [$type];
  100. $groupons = $groupons->whereIn('status', $type);
  101. }
  102. if ($grouponIds) {
  103. $groupons = $groupons->orderRaw('field(id, ' . join(',', $grouponIds) . ')');
  104. }
  105. $groupons = $groupons->paginate(request()->param('list_rows', 10))->toArray();
  106. foreach ($groupons['data'] as &$groupon) {
  107. if ($groupon['goods'] && isset($groupon['my']['order_item'])) {
  108. $groupon['goods']['price'] = [$groupon['my']['order_item']['goods_price']];
  109. }
  110. if ($groupon['activity']) {
  111. $activity = $groupon['activity'];
  112. if ($activity['rules'] && isset($activity['rules']['sales_show_type']) && $activity['rules']['sales_show_type'] == 'real') {
  113. $sales = [];
  114. foreach ($activity['activity_sku_prices'] as $activitySkuPrice) {
  115. if ($activitySkuPrice['goods_id'] == $groupon['goods_id']) {
  116. $sales[] = $activitySkuPrice['sales'];
  117. }
  118. }
  119. if ($groupon['goods']) {
  120. $groupon['goods']['sales'] = array_sum($sales); // 这里计算的销量和 getSalesAttr 不一样,这里的没有排除下架的规格
  121. }
  122. }
  123. }
  124. }
  125. $this->success('获取成功', $groupons);
  126. }
  127. }