| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- <?php
- namespace addons\SignIn\common\logic;
- use addons\SignIn\common\login\SignInReward;
- use addons\SignIn\common\models\SignInUserPropertyAward;
- use common\enums\StatusEnum;
- use Exception;
- /**
- * 重复签到奖励
- */
- class RepeatedRewardsLogic
- {
- /**
- * 奖励分发
- * @param array $data
- * @param string $type
- * @return array|false|null
- * @throws Exception
- */
- public static function reward(array $data = [], string $type = 'score')
- {
- if (empty($data)) {
- throw new Exception("参数不能为空");
- }
- switch ($type) {
- case 'score':// 积分奖励
- return self::pointsReward($data);
- case 'coupon':// 优惠券奖励
- return self::couponReward($data);
- default:
- return null;
- }
- }
- /**
- * 积分奖励
- * @param array $data
- * @return array|false|null
- * @throws Exception
- */
- protected static function pointsReward(array $data)
- {
- try {
- $totalSignIn = (int)$data['total_sign_in']; // 获取连续签到天数
- $reward_score = $data['reward_score'] ?? []; // 获取连续签到积分奖励配置
- $mall_id = $data['mall_id']; // 商城id
- $user_id = $data['user_id']; // 用户id
- $sign_id = $data['sign_id']; // 签到id
- $sign_time = $data['sign_time']; // 签到时间
- $time = time();
- // 检查配置是否为空
- if (empty($reward_score)) {
- return false;
- }
- $reward_score = array_column($reward_score, null, 'day');// 将天数配置为键值对
- $sign_system_max = max(array_keys($reward_score)) ?? 0;// 获取系统配置连续签到最大天数
- if ($sign_system_max >= $totalSignIn) { // 只有当连续签到天数大于配置的连续签到天数时才进行奖励
- return false;
- }
- $rate = bcmod($totalSignIn, $sign_system_max);
- if ($rate == 0) {
- $rate = $sign_system_max;
- }
- $reward_score_list = $reward_score[$rate] ?? []; // 获取对应奖励配置
- if (empty($reward_score_list)) {// 如果当天奖励为空,则不进行奖励
- return false;
- }
- // 设置奖励类型
- $reward_type = !empty($reward_score_list['give_type']) ? $reward_score_list['give_type'] : 'score';
- $signInReward = new SignInReward();
- $result = $signInReward->giveReward($mall_id, $user_id, $reward_type, $reward_score_list['num'],
- $sign_id, $sign_time, $time, 2, $totalSignIn);
- $userPropertyAward = SignInUserPropertyAward::findOne([
- 'mall_id' => $mall_id,
- 'give_type' => $reward_type,
- 'user_id' => $user_id,
- 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
- if (empty($userPropertyAward)) {
- $userPropertyAward = $signInReward->getUserPropertyAward($mall_id, $user_id, $reward_type);
- }
- $userPropertyAward->total_num += $reward_score_list['num'];
- $userPropertyAward->save();
- return $result;
- } catch (Exception $e) {
- throw new Exception("重复签到积分奖励失败");
- }
- }
- /**
- * 优惠券奖励
- * array $data
- */
- protected static function couponReward($data)
- {
- try {
- $totalSignIn = (int)$data['total_sign_in']; // 获取连续签到天数
- $reward_coupon = $data['reward_coupon'] ?? []; // 获取配置优惠券
- $couponList = $data['coupon_list']; // 优惠券列表
- $mall_id = $data['mall_id']; // 商城id
- $user_id = $data['user_id']; // 用户id
- $sign_id = $data['sign_id']; // 签到id
- $sign_time = $data['sign_time']; // 签到时间
- $describe = $data['describe']; // 备注信息
- $time = time();
- if (empty($reward_coupon)) {
- return false;
- }
- $reward_coupon = array_column($reward_coupon, null, 'day');// 将天数配置为键值对
- $sign_system_max = max(array_keys($reward_coupon)) ?? 0;// 获取系统配置连续签到最大天数
- if ($sign_system_max >= $totalSignIn) { // 只有当连续签到天数大于配置的连续签到天数时才进行奖励
- return false;
- }
- $reward_coupon_count = count($reward_coupon);
- $couponNum = 0;
- $rate = bcmod($totalSignIn, $reward_coupon_count);
- if ($rate == 0) {
- $rate = $reward_coupon_count;
- }
- $reward_coupon_list = $reward_coupon[$rate];
- if (!isset($couponList[$reward_coupon_list['coupon_id']])) return false;
- $couponNum += $reward_coupon_list['num'];
- $couponData[] = [
- 'mall_id' => $mall_id,
- 'user_id' => $user_id,
- 'sign_id' => $sign_id,
- 'num' => $reward_coupon_list['num'],
- 'coupon_id' => $reward_coupon_list['coupon_id'],
- 'type' => 2,
- 'describe' => $describe . '[' . $couponList[$reward_coupon_list['coupon_id']]['name'] . ']',
- 'sign_at' => $sign_time,
- 'created_at' => $time,
- 'updated_at' => $time
- ];
- $insertCoupon[$reward_coupon_list['coupon_id']] = $reward_coupon_list['num'];
- if ($couponList[$reward_coupon_list['coupon_id']]['total_count'] != -1) $subCoupon[$reward_coupon_list['coupon_id']] = $reward_coupon_list['num'];
- return compact("couponNum", "couponData", "insertCoupon", "subCoupon");
- } catch (Exception $e) {
- throw new Exception("重复签到优惠券奖励失败");
- }
- }
- }
|