| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- <?php
- namespace addons\LuckyGroup\common\queue;
- use addons\LuckyGroup\common\logic\order\OpenRewardLogic;
- use addons\LuckyGroup\common\models\LuckyGroupActivity;
- use addons\LuckyGroup\common\models\LuckyGroupGoods;
- use common\enums\RabbitMqEnum;
- use common\enums\RedisKeyEnum;
- use common\enums\StatusEnum;
- use common\helpers\LockHelper;
- class OrderPaidQueueLogic
- {
- const ORDER_ENQUEUE_SET = 'lucky_group_order_enqueue_set'; //正在队列中的订单id
- /**
- * 付款订单入队 : lucky_group_order_activity:1_goods:2
- * @param $mall_id
- * @param $activity
- * @param $goods_id
- * @param array $order_ids
- * @param array $order_ids
- * @return bool
- */
- public function enqueue($mall_id, $activity, $goods_id, $order_ids)
- {
- var_dump('幸运拼团订单入队,order_id:' . implode(',', $order_ids));
- foreach ($order_ids as $key => $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;
- }
- }
|