request->post(); $params['mall_id'] = $this->mall_id; if(empty($params['goods_id'])){ return $this->error('请选择商品'); } //活动开始时展示图标,其余状态不展示 $relationList = RandomRedPacketRelation::find() ->where(['mall_id'=>$params['mall_id'], 'goods_id'=>$params['goods_id']]) ->select('packet_id') ->all(); $packetIds = array_column($relationList, 'packet_id'); $time = time(); // $where = [ ['in', 'id', $packetIds], ['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED], ['<', 'start_at', $time], ['>', 'end_at', $time], ]; $packetArr = RandomRedPacket::getOne($where, true); if ($packetArr === false) return $this->error(RandomRedPacket::getStaticError()); if(empty($packetArr)){ return $this->error('红包活动不存在'); } $color = 1; //判断用户是否领取 if($this->user_id){ $find = RandomRedPacketRecord::find() ->where(['uid'=>$this->user_id, 'mall_id'=>$this->mall_id, 'packet_id'=>$packetArr['id']]) ->one(); if(!empty($find)){ $color = 2; } } $data = []; $data['detail_show'] = $packetArr['detail_show']; $data['color'] = $color;//1红色 2灰色 $data['packet_id'] = $packetArr['id'];//红包活动id return $this->success('成功', $data); } /** * 领取红包 * * @return string */ public function actionReceiveRedPacket() { $params = \Yii::$app->request->post(); if (empty($params['packet_id'])) { return $this->error('请选择红包'); } //查询活动 $time = time(); $where = [ ['id' => $params['packet_id']], ['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED], ['<', 'start_at', $time], ['>', 'end_at', $time], ]; $redPacket = RandomRedPacket::getOne($where, false); if (empty($redPacket)) { return $this->error('活动不存在'); } //是否有领取资格 $findRecord = RandomRedPacketRecord::find()->where(['packet_id' => $redPacket->id, 'uid' => $this->user_id])->one(); if (!empty($findRecord)) { return $this->error('您已领取红包,请勿重复操作'); } //判断剩余个数 if ($redPacket->sum_total < 1) { return $this->error('红包已经被抢完了'); } //获取随机值 $min = $redPacket->min_value; $max = $redPacket->max_value; $rand = $min + mt_rand() / mt_getrandmax() * ($max - $min); $rewardValue = floatval(sprintf('%.2f', $rand)); $trans = Yii::$app->db->beginTransaction(); try { //添加记录 $recordModel = new RandomRedPacketRecord(); $recordModel->mall_id = $this->mall_id; $recordModel->uid = $this->user_id; $recordModel->packet_id = $redPacket->id; $recordModel->reward_value = $rewardValue; if (!$recordModel->save()) { throw new Exception('领取失败'); } if($redPacket->reward_type == RandomRedPacket::INTEGRAL){//激活积分 // 插入用户积分表(激活积分) $wallet = ScoreExpansionWallet::setData([ 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_frozen' => false, 'integral' => $rewardValue, 'source_table' => RandomRedPacket::tableName(), 'source_table_id' => $redPacket->id, 'from_type' => ScoreExpansionEnum::FROM_RANDOM_RED_PACKET, 'desc' => '领取随机红包', ]); if ($wallet == false) throw new \yii\db\Exception(ScoreExpansionWallet::getStaticError()); } if($redPacket->reward_type == RandomRedPacket::CONTRIBUTION){//贡献值 //贡献值 $wallet_log = [ 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'change_type' => CapitalLog::CHANGE_TYPE_ADD, 'change_num' => $rewardValue, 'reward_type' => ContributionCurrencyLog::CASHIER_RANDOM_RED_PACKET, 'desc' => '领取随机红包', 'source_table' => RandomRedPacket::tableName(), 'source_table_id' => $redPacket->id, 'from_type' => AddonsEnum::ADDONS_NAME_RANDOM_RED_PACKET, 'wallet_type' => ContributionCurrencyEnum::CONTRIBUTION_VALUE, 'is_send' => false ]; $res = ContributionWallet::handleInQueue($wallet_log,true); if(!$res){ throw new \Exception('转换失败:'.WalletLogic::getStaticError()); } } if($redPacket->reward_type == RandomRedPacket::RED_PACKET || $redPacket->reward_type == RandomRedPacket::BALANCE){//红包 余额 if($redPacket->reward_type == RandomRedPacket::BALANCE){ $transfer_type = UserWalletService::WALLET_TYPE_BALANCE; }elseif($redPacket->reward_type == RandomRedPacket::RED_PACKET){ $transfer_type = UserWalletService::WALLET_TYPE_SCORE; } //当转账类型为余额和红包时 $insert_wallet [] = ['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_frozen' => false, 'wallet_type' => $transfer_type, 'money' => $rewardValue, 'desc' => '领取随机红包', 'source_table' => RandomRedPacket::tableName(), 'source_table_id' => $redPacket->id, 'from_type' => UserWalletEnum::FORM_RANDOM_RED_PACKET, 'capital_type' => UserWalletEnum::RANDOM_RED_PACKET_TRANSFER, ]; $res = UserWalletService::batchHandleByQueue($insert_wallet); if ($res == false) throw new \yii\db\Exception(UserWalletService::getStaticError()); } //红包个数-1 领取人数+1 $redPacket->surplus_num = $redPacket->surplus_num - 1; $redPacket->get_number = $redPacket->get_number + 1; // if($redPacket->reward_type == RandomRedPacket::BALANCE){//余额 // //个人奖励值增加 // $insert_wallet[] = [ // 'mall_id' => $this->mall_id, // 'user_id' => $this->user_id, // 'is_frozen' => false, // 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE, // 'money' => $rewardValue, // 'desc' => '随机红包', // 'source_table' => 'random_red_packet', // 'source_table_id' => $redPacket->id, // 'from_type' => RandomRedPacketEnum::ADDONS_NAME, // 'capital_type' => 'eight_out_two', // ]; // $res = UserWalletService::batchHandleByQueue($insert_wallet); // if (empty($res)) throw new \Exception(UserWalletService::getStaticError()); // //红包个数-1 领取人数+1 // $redPacket->surplus_num = $redPacket->surplus_num - 1; // $redPacket->get_number = $redPacket->get_number + 1; // } $redPacket->save(); if (!$redPacket->save()) { throw new Exception('领取失败'); } $text = RandomRedPacket::labelText($redPacket->reward_type); $data = []; $data['text'] = '恭喜您获得'; $data['value'] = $rewardValue . $text; $trans->commit(); return $this->success('成功', $data); } catch (Exception $e) { $trans->rollBack(); return $this->error('领取失败:' . $e->getMessage()); } } }