$order_id) { //判断order_id 是否在集合内 if (!\Yii::$app->redis->sadd(self::ORDER_ENQUEUE_SET, $order_id)) { unset($order_ids[$key]); } } if (empty($order_ids)) return false; $queue = $this->getQueueName($activity['id'], $goods_id); \Yii::$app->redis->lpush($queue, ...$order_ids); $this->trigger_order_paid_job($mall_id, $activity, $goods_id); return true; } /** * 获取队列名称 * @param $activity_id * @param $goods_id * @return string */ public function getQueueName($activity_id, $goods_id) { return 'lucky_group_order_activity:' . $activity_id . '_goods:' . $goods_id; } public function trigger_order_paid_job($mall_id, $activity, $goods_id) { $activity_id = $activity['id']; $queue = $this->getQueueName($activity_id, $goods_id); //查询活动 $group_require_num = $activity['group_num']; //开团需要人数 $virtual_num = $activity['virtual_num']; //活动设置的虚拟人数 //真实开团需要人数 $real_group_require_num = $group_require_num - $virtual_num; $num = $real_group_require_num < 0 ? $group_require_num : $real_group_require_num; //获取队列长度 $queue_len = \Yii::$app->redis->llen($queue); if ($queue_len < $num) return; //取出 $num 个订单id $lock_key = $queue . '_lock'; $lock_key = RedisKeyEnum::suffix($lock_key); $identification = uniqid(); if (LockHelper::lock($lock_key, $identification, 30, 60)) { $deal_order_ids = \Yii::$app->redis->lrange($queue, -$num, -1); if (!empty($deal_order_ids)) { var_dump('幸运拼团订单开奖,开奖订单id:' . implode(',', $deal_order_ids)); \Yii::$app->redis->ltrim($queue, 0, -($num + 1)); LockHelper::uLock($lock_key, $identification); //添加队列,由消费者去执行对应的逻辑 $data = [ 'mall_id' => $mall_id, 'activity_id' => $activity_id, 'goods_id' => $goods_id, 'order_ids' => $deal_order_ids ]; \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK_LUCKY_GROUP, RabbitMqEnum::LUCKY_GROUP_QUEUE, $data, OpenRewardLogic::class, 'handleSync'); } else { LockHelper::uLock($lock_key, $identification); } } else { var_dump('一直抢不到锁'); //todo 重新触发 // $this->trigger_order_paid_job($mall_id, $activity_id, $goods_id); } return; } /** * 移除订单id入队标记 * @param array $order_ids * @return mixed */ public function delOrderEnqueueFlag($order_ids) { foreach ($order_ids as $order_id) { \Yii::$app->redis->srem(self::ORDER_ENQUEUE_SET, $order_id); } return true; } //禁用活动 public function trigger_disable_activity($mall_id, $activity_id) { $activity = LuckyGroupActivity::findOne(['id' => $activity_id]); $lucky_group_goods_list = LuckyGroupGoods::lists(['where' => [['activity_id' => $activity_id]]]); foreach ($lucky_group_goods_list as $item) { $queue = $this->getQueueName($activity_id, $item['goods_id']); //查询活动 $group_require_num = $activity['group_num']; //开团需要人数 $virtual_num = $activity['virtual_num']; //活动设置的虚拟人数 //真实开团需要人数 $real_group_require_num = $group_require_num - $virtual_num; $num = $real_group_require_num < 0 ? $group_require_num : $real_group_require_num; //获取队列长度 $queue_len = \Yii::$app->redis->llen($queue); if ($queue_len > $num) continue; //取出 $num 个订单id $lock_key = $queue . '_lock'; $lock_key = RedisKeyEnum::suffix($lock_key); $identification = uniqid(); if (LockHelper::lock($lock_key, $identification, 30, 60)) { $deal_order_ids = \Yii::$app->redis->lrange($queue, -$queue_len, -1); if (!empty($deal_order_ids)) { \Yii::error('幸运拼团活动禁用,id:' . $activity['id']); \Yii::$app->redis->ltrim($queue, 0, -($queue_len + 1)); LockHelper::uLock($lock_key, $identification); //添加队列,由消费者去执行对应的逻辑 $data = [ 'mall_id' => $mall_id, 'activity_id' => $activity_id, 'goods_id' => $item['goods_id'], 'order_ids' => $deal_order_ids ]; \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $data, OpenRewardLogic::class, 'disableActivity'); } else { LockHelper::uLock($lock_key, $identification); } } else { \Yii::error('一直抢不到锁'); //todo 重新触发 $this->trigger_disable_activity($mall_id, $activity_id); } } } public function delActivity($activity_id){ $lucky_group_goods_list = LuckyGroupGoods::lists(['where' => [['activity_id' => $activity_id],['status'=>StatusEnum::ENABLED]]]); foreach ($lucky_group_goods_list as $item) { $queue = $this->getQueueName($activity_id, $item['goods_id']); $queue_len = \Yii::$app->redis->llen($queue); if($queue_len) return false; } return true; } }