| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- <?php
- namespace addons\RandomRedPacket\api\modules\v1\controllers;
- use addons\ContributionCurrency\common\enums\ContributionCurrencyEnum;
- use addons\ContributionCurrency\common\models\ContributionCurrencyLog;
- use addons\ContributionCurrency\common\models\ContributionWallet;
- use addons\HiGo\common\logic\WalletLogic;
- use addons\RandomRedPacket\common\enums\RandomRedPacketEnum;
- use addons\RandomRedPacket\common\models\RandomRedPacket;
- use addons\RandomRedPacket\common\models\RandomRedPacketRecord;
- use addons\RandomRedPacket\common\models\RandomRedPacketRelation;
- use addons\ScoreExpansion\common\enums\ScoreExpansionEnum;
- use addons\ScoreExpansion\common\models\ScoreExpansion;
- use addons\ScoreExpansion\common\models\ScoreExpansionWallet;
- use common\enums\AddonsEnum;
- use common\enums\StatusEnum;
- use common\enums\UserWalletEnum;
- use common\helpers\FormatHelper;
- use common\models\common\CapitalLog;
- use common\models\order\Order;
- use services\common\UserWalletService;
- use Yii;
- use api\controllers\OnAuthController;
- use Exception;
- /**
- * 默认控制器
- *
- * Class DefaultController
- * @package addons\RandomRedPacket\api\modules\v1\controllers
- */
- class DefaultController extends OnAuthController
- {
- public $modelClass = '';
- /**
- * 不用进行登录验证的方法
- *
- * 例如: ['index', 'update', 'create', 'view', 'delete']
- * 默认全部需要验证
- *
- * @var array
- */
- protected $authOptional = ['index','detail-red-packet'];
- /**
- * 首页
- *
- * @return string
- */
- public function actionIndex()
- {
- return 'Hello world';
- }
- /**
- * 商品详情页是否展示红包浮层
- *
- * @return string
- */
- public function actionDetailRedPacket()
- {
- $params = \Yii::$app->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());
- }
- }
- }
|