| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | <?phpnamespace App\Modules\Activity\Services;use App\Consts\SysConsts;use App\Modules\Activity\Models\ActivityNationalDay;use App\Modules\User\Services\UserService;use Redis;use DB;use Exception;/** * 个人微信号——用户国庆活动 * @property int $uid * @property int $sign_day 累计签到天数 * @property bool $is_sign 今天是否已签到 * @property int $bonus 今天签到获取奖金币 */class UserNationalDay{    use NationalDay {        __construct as private baseConfig;    }    private $uid;    public $is_sign;    public $sign_day;    public $bonus;    public function __construct(int $uid)    {        $this->baseConfig();        $this->uid = $uid;        $this->sign_day = $this->getUserSignDays();        $this->is_sign = $this->judgeIsSign();    }    /**     * 签到     */    public function sign()    {        if ($this->is_begin && !$this->is_sign) {            $this->sign_day++;            $this->bonus = $this->getSignBonusMoney($this->sign_day);            $this->saveRedisSign();            $this->saveSign();        }    }    /**     * 获取用户签到配置项     */    public function getSignConfigs()    {        return collect($this->sign_config)->map(function ($item) {            $item['is_get'] = $item['day'] <= $this->sign_day;            return $item;        })->all();    }    /**     * 判断今天用户是否签到     * @return bool     */    private function judgeIsSign()    {        $result = Redis::sismember($this->redis_key, $this->uid);        if (!$result) {            $result = ActivityNationalDay::where('uid', $this->uid)->where('created_at', '>=', date('Y-m-d'))->exists();            if ($result) {                $this->saveRedisSign();            }        }        return $result;    }    /**      * 获取用户累计签到天数     */    private function getUserSignDays()    {        return ActivityNationalDay::where('uid', $this->uid)->count();    }    /**     * redis签到     */    private function saveRedisSign()    {        Redis::sAdd($this->redis_key, $this->uid);        Redis::expire($this->redis_key, SysConsts::ONE_DAY_SECONDS);    }    /**     * 保存签到信息     */    private function saveSign()    {        try {            DB::beginTransaction();            $day = new  ActivityNationalDay;            $day->uid = $this->uid;            $day->bonus = $this->bonus;            $day->save();            UserService::addBalance($this->uid, $this->bonus, 0, $this->bonus);            DB::commit();        } catch (Exception $e) {            Log::error('national_day: ' . $e->getMessage());            DB::rollback();        }    }}
 |