'ID', 'mall_id' => '商城ID', 'video_id' => '视频ID', 'user_id' => '会员ID', 'source_user_id' => '来源会员ID', 'user_type' => '会员类型', 'award_type' => '奖励类型', 'award_integral' => '奖励积分', 'award_money' => '奖励金额', 'status' => '状态[-1:删除;0:禁用;1启用]', 'created_at' => 'Created At', 'updated_at' => 'Updated At', ]; } /** * @name: * @msg: 发放观看视频奖励和分享视频奖励(分享的只发一级) * @param {int} $mall_id * @param {array} $data video_id:视频id;user_id:当前会员id;share_user_id:分享视频的会员id * @return {*} */ public static function grantReward(int $mall_id, array $data) { $video = ShortVideo::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'id' => $data['video_id'], 'check_status' => AddonsShortVideoEnum::VIDEO_AUDIT_STATUS1, 'is_blacklist' => 0]); if (empty($video)) { self::$static_error = '视频不存在'; return false; } $transaction = \Yii::$app->db->beginTransaction(); $time = time(); // 奖励记录数据 $browse_reward_log_datas = []; // 钱包数据 $wallet_datas = []; // 当前会员id $user_id_0 = $data['user_id']; // 上一级分享会员id $user_id_1 = 0; $browse = ShortVideoBrowse::find() ->where(['mall_id' => $mall_id, 'user_id' => $data['user_id'], 'video_id' => $data['video_id']]) ->orderBy('created_at desc') ->limit(1) ->one(); if (empty($browse)) { self::$static_error = '视频浏览记录不存在'; return false; } // 更新当前会员浏览记录 $browse->is_complete_look = 1; $browse->complete_time = $time; $res_browse = $browse->save(); if (false === $res_browse) { $transaction->rollBack(); self::$static_error = '完整观看视频回调发放观看奖励出错--更新会员浏览记录出错:' . $browse->getErrors(); return false; } $reward_info = ShortVideoBrowseAward::find() ->select('video_id,user_id') ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'video_id' => $data['video_id'], 'user_id' => $data['user_id'], 'user_type' => 0]) ->asArray() ->one(); // 如果已经发过观看奖励则不再发 if (!empty($reward_info)) return ['reward_score' => 0, 'reward_balance' => 0]; if (!empty($data['share_user_id']) && $user_id_0 != $data['share_user_id']) { // 当前视频是分享观看,而且不是自己看自己分享的 $wheres = [ 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'video_id' => $data['video_id'], 'user_id' => $data['share_user_id'], 'share_to_user_id' => $data['user_id'], ]; $share_log = ShortVideoShare::findOne($wheres); if (!empty($share_log)) { $user_id_1 = $share_log->user_id; $user = User::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'id' => $user_id_1]); if (empty($user)) $user_id_1 = 0; } } // 当前视频可以用于奖励的剩余积分 $score_reward_surplus = $video->surplus_integral; // 当前视频可以用于奖励的剩余金额 $money_reward_surplus = $video->surplus_money; // 当前会员获得的积分奖励 $score_user_reward_0 = 0; // 当前会员获得的余额奖励 $money_user_reward_0 = 0; if (1 == $video->open_integral_award) { // 开启积分奖励 // 当前视频可以用于奖励的基准积分 $score_reward_base = $video->watch_integral_sum; $score_user_reward_0 = bcmul($score_reward_base, $video->watch_integral / 100, 2); if ($score_user_reward_0 > $score_reward_surplus) { $score_user_reward_0 = $score_reward_surplus; $score_reward_surplus = 0; } else { $score_reward_surplus -= $score_user_reward_0; } // 分享上级获得的积分奖励 if (!empty($user_id_1)) { // 如果有分享上级才计算上级的奖励 $score_user_reward_1 = bcmul($score_reward_base, $video->watch_integral_one / 100, 2); if ($score_user_reward_1 > $score_reward_surplus) { $score_user_reward_1 = $score_reward_surplus; $score_reward_surplus = 0; } else { $score_reward_surplus -= $score_user_reward_1; } } if ($score_user_reward_0 > 0) { $browse_reward_log_datas[] = [$mall_id, $data['video_id'], $user_id_0, 0, 0, 0, $score_user_reward_0, 0, 1, $time, $time]; $wallet_datas[] = [ 'mall_id' => $mall_id, 'user_id' => $user_id_0, 'is_frozen' => false, 'wallet_type' => UserWalletService::WALLET_TYPE_SCORE, 'money' => $score_user_reward_0, 'desc' => '观看短视频获得积分奖励', 'source_table' => $browse->tableSchema->name, 'source_table_id' => $browse->id, 'from_type' => UserWalletEnum::REWARD, 'capital_type' => UserWalletEnum::SHORT_VIDEO_REWARD, ]; } if (!empty($user_id_1) && $score_user_reward_1 > 0) { $browse_reward_log_datas[] = [$mall_id, $data['video_id'], $user_id_1, 0, 1, 0, $score_user_reward_1, 0, 1, $time, $time]; $wallet_datas[] = [ 'mall_id' => $mall_id, 'user_id' => $user_id_1, 'is_frozen' => false, 'wallet_type' => UserWalletService::WALLET_TYPE_SCORE, 'money' => $score_user_reward_1, 'desc' => '分享短视频获得积分奖励', 'source_table' => $browse->tableSchema->name, 'source_table_id' => $browse->id, 'from_type' => UserWalletEnum::REWARD, 'capital_type' => UserWalletEnum::SHORT_VIDEO_REWARD, ]; } } if (1 == $video->open_money_award) { // 开启现金奖励 // 当前视频可以用于奖励的基准现金 $money_reward_base = $video->watch_money_sum; $money_user_reward_0 = bcmul($money_reward_base, $video->watch_money / 100, 2); if ($money_user_reward_0 > $money_reward_surplus) { $money_user_reward_0 = $money_reward_surplus; $money_reward_surplus = 0; } else { $money_reward_surplus -= $money_user_reward_0; } // 分享上级获得的积分奖励 if (!empty($user_id_1)) { // 如果有分享上级才计算上级的奖励 $money_user_reward_1 = bcmul($money_reward_base, $video->watch_money_one / 100, 2); if ($money_user_reward_1 > $money_reward_surplus) { $money_user_reward_1 = $money_reward_surplus; $money_reward_surplus = 0; } else { $money_reward_surplus -= $money_user_reward_1; } } if ($money_user_reward_0 > 0) { $browse_reward_log_datas[] = [$mall_id, $data['video_id'], $user_id_0, 0, 0, 1, 0, $money_user_reward_0, 1, $time, $time]; $wallet_datas[] = [ 'mall_id' => $mall_id, 'user_id' => $user_id_0, 'is_frozen' => false, 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE, 'money' => $money_user_reward_0, 'desc' => '观看短视频获余额奖励', 'source_table' => $browse->tableSchema->name, 'source_table_id' => $browse->id, 'from_type' => UserWalletEnum::REWARD, 'capital_type' => UserWalletEnum::SHORT_VIDEO_REWARD, ]; } if (!empty($user_id_1) && $money_user_reward_1 > 0) { $browse_reward_log_datas[] = [$mall_id, $data['video_id'], $user_id_1, 0, 1, 1, 0, $money_user_reward_1, 1, $time, $time]; $wallet_datas[] = [ 'mall_id' => $mall_id, 'user_id' => $user_id_1, 'is_frozen' => false, 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE, 'money' => $money_user_reward_1, 'desc' => '分享短视频获得余额奖励', 'source_table' => $browse->tableSchema->name, 'source_table_id' => $browse->id, 'from_type' => UserWalletEnum::REWARD, 'capital_type' => UserWalletEnum::SHORT_VIDEO_REWARD, ]; } } // 更新视频剩余奖励、完整观看人数 $params_video = [ 'id' => $video->id, 'surplus_money' => $money_reward_surplus, 'surplus_integral' => $score_reward_surplus, 'look_complete_num' => $video->look_complete_num + 1, ]; $res_video = ShortVideo::setData($mall_id, $params_video); if (false === $res_video) { $transaction->rollBack(); self::$static_error = ShortVideo::getStaticError(); return false; } // 添加观看奖励记录 if (!empty($browse_reward_log_datas)) { $field = ['mall_id', 'video_id', 'user_id', 'source_user_id', 'user_type', 'award_type', 'award_integral', 'award_money', 'status', 'created_at', 'updated_at']; $res_reward = Yii::$app->db->createCommand()->batchInsert(self::tableName(), $field, $browse_reward_log_datas)->execute(); if (false === $res_reward) { $transaction->rollBack(); self::$static_error = '完整观看视频回调发放观看奖励出错--插入奖励记录出错'; return false; } } if (!empty($wallet_datas)) { $res = UserWalletService::batchHandleByQueue($wallet_datas); if ($res === false) { $transaction->rollBack(); self::$static_error = '完整观看视频回调发放观看奖励出错--奖励奖励发放到会员账号出错:' . UserWalletService::getStaticError(); return false; } } $transaction->commit(); return ['reward_score' => $score_user_reward_0, 'reward_balance' => $money_user_reward_0]; } }