ActivityGroupon.php 6.5 KB
<?php

namespace app\api\controller;

/**
 * 拼团开的团
 */

class ActivityGroupon extends Base
{
    protected $noNeedLogin = ['index'];
    protected $noNeedRight = ['*'];


    /**
     * @ApiWeigh    (99)
     * @ApiTitle    (根据商品 id 获取正在拼的团)
     * @ApiSummary  (根据商品 id 获取正在拼的团)
     * @ApiMethod   (GET)
     *
     * @ApiParams  (name=goods_id, type=inter, required=false, description="商品ID")
     * @ApiParams  (name=activity_id, type=inter, required=false, description="活动ID")
     *
     * @ApiReturn({
        "code": 1,
        "msg": "团列表",
        "time": "1609384029",
        "data": [{
            "id": 2, //团ID
            "user_id": 1, //用户ID
            "goods_id": 7, //商品iD
            "activity_id": 15, //活动ID
            "num": 2, //成团人数
            "current_num": 1, //当前人数
            "status": "ing", //状态:invalid=已过期,ing=进行中,finish=已成团,finish-fictitious=虚拟成团
            "expiretime": 0, //过期时间
            "finishtime": null, //成团时间
            "createtime": 1609383878,
            "updatetime": 1609383878,
            "leader": { //开团人
                "id": 2,
                "user_id": 1, //用户ID
                "user_nickname": "wn", //昵称
                "user_avatar": "https://thirdwx.qlogo.cn/mmopen/vi_32/C8dW9GFDHAy3wwnZwoqibeNciaN6jUZXp6QCrtjehdF3GyHickt9oiaDSibMBhATtF7f19w4AgpcQIR1Mibwu1pjYKEA/132", //头像
                "groupon_id": 2, //团ID
                "goods_id": 7, //商品ID
                "goods_sku_price_id": 10, //商品skuID
                "activity_id": 15, //活动ID
                "is_leader": 1, //是否团长:0=否,1=是
                "is_fictitious": 0, //是否虚拟用户:0=否,1=是
                "order_id": 39, //订单ID
                "is_refund": 0 //是否退款:0=否,1=是
            },
            "groupon_log": [{ //拼团用户列表
                "id": 2,
                "user_id": 1, //用户ID
                "user_nickname": "wn", //用户昵称
                "user_avatar": "https://thirdwx.qlogo.cn/mmopen/vi_32/C8dW9GFDHAy3wwnZwoqibeNciaN6jUZXp6QCrtjehdF3GyHickt9oiaDSibMBhATtF7f19w4AgpcQIR1Mibwu1pjYKEA/132", //用户头像
                "groupon_id": 2,
                "goods_id": 7,
                "goods_sku_price_id": 10,
                "activity_id": 15,
                "is_leader": 1,
                "is_fictitious": 0,
                "order_id": 39,
                "is_refund": 0
            }]
        }]
    })
     */
    public function index() {
        $params = $this->request->get();

        $this->success('团列表', \addons\shopro\model\ActivityGroupon::getActivityGroupon($params));
    }

    /**
     * @ApiWeigh    (97)
     * @ApiTitle    (团详情)
     * @ApiSummary  (团详情)
     * @ApiMethod   (GET)
     *
     * @ApiParams  (name=id, type=inter, required=false, description="团ID")
     *
     * @ApiReturn()
     */
    public function detail () {
        $id = $this->request->get('id');

        $this->success('团详情', \addons\shopro\model\ActivityGroupon::getActivityGrouponDetail($id));
    }

    /**
     * @ApiWeigh    (95)
     * @ApiTitle    (我的拼团)
     * @ApiSummary  (我的拼团)
     * @ApiMethod   (GET)
     *
     * @ApiHeaders (name=token, type=string, required=false, description="请求的Token")
     * @ApiParams  (name=type, type=string, required=true, description="类型:all=全部,invalid=已过期,ing=进行中,finish=已成团")
     *
     * @ApiReturn()
     */
    public function myGroupon () {
        $type = $this->request->get('type', 'all');
        $user = $this->auth->getUserInfo();

        $logs = \addons\shopro\model\ActivityGrouponLog::with(['groupon', 'order.firstItem', 'goods' => function ($query) {
            $query->removeOption('soft_delete');        // 商品查询包括被软删除的
        }]);
        
        if ($type != 'all') {
            $type = $type == 'finish' ? ['finish', 'finish-fictitious'] : [$type];
            $logs = $logs->whereExists(function ($query) use ($type) {
                $log_name = (new \addons\shopro\model\ActivityGrouponLog())->getQuery()->getTable();
                $groupon_name = (new \addons\shopro\model\ActivityGroupon())->getQuery()->getTable();
                $query->table($groupon_name)->where('id=' . $log_name . '.groupon_id')
                    ->where('status', 'in', $type);
            });
        }

        $logs = $logs->where('user_id', $user['id'])
                    ->order('id', 'desc')
                    ->paginate(10);

        // 将列表的显示价格,都查当时购买的价格,和当时对应的活动的 真实销量
        if ($grouponLogs = $logs->items()) {
            // 拿到所有活动 ids
            $activity_ids = array_column($grouponLogs, 'activity_id');

            // 一次获取所有活动,包括被软删除的活动,并关联规格
            $activities = \addons\shopro\model\Activity::withTrashed()
                                    ->with('activityGoodsSkuPrice')
                                    ->where('id', 'in', $activity_ids)->select();
            $activities = array_column($activities, null, 'id');

            foreach ($grouponLogs as $key => $grouponLog) {
                if (isset($grouponLog['goods']) && $grouponLog['goods'] && isset($activities[$grouponLog['activity_id']])) {
                    $activity = $activities[$grouponLog['activity_id']];
    
                    // 拿到当前商品对应的活动规格
                    $currentGoodsActivitySkuPrices = [];
                    foreach ($activity['activityGoodsSkuPrice'] as $k => $skuPrice) {
                        if ($skuPrice['status'] == 'up' && $skuPrice['goods_id'] == $grouponLog['goods_id']) {
                            $currentGoodsActivitySkuPrices[] = $skuPrice;
                        }
                    }

                    // 当时参加活动真实销量
                    if ($currentGoodsActivitySkuPrices) {
                        $grouponLogs[$key]['goods']['sales'] = array_sum(array_column($currentGoodsActivitySkuPrices, 'sales'));
                    }
                    // 这个是购买时候的活动单价
                    if (isset($grouponLog['order']['first_item'])) {
                        $grouponLogs[$key]['goods']['price'] = $grouponLog['order']['first_item']['goods_price'];
                    }
                }
            }

            $logs->data = $grouponLogs;
        }

        $this->success('我的拼团', $logs);
    }
}