UserSignService.class.php 4.34 KB
<?php
/**
 * Created by PhpStorm.
 * User: zhonglei
 * Date: 17/7/26
 * Time: 16:36
 */

namespace Common\Service;

use Common\Common\Constant;
use Common\Common\DailytaskConfig;
use Common\Model\UserSignModel;

class UserSignService extends AbstractService
{
    // 构造方法
    public function __construct()
    {
        parent::__construct();
        $this->_d = new UserSignModel();
    }

    /**
     * 取
     * @author tangxingguo
     * @param $uid
     * @return int|mixed
     */
    public function signIntegral($uid)
    {
        // 签到规则
        $taskConfig = &DailytaskConfig::instance();
        $res = $taskConfig->getCacheData(Constant::APP_SIGN);
        if (empty($res) || $res['is_open'] == Constant::DAILYTASK_IS_OPEN_FALSE) {
            // 没有配置签到规则 或 签到关闭
            return 0;
        }
        $rules = $res['rules'];

        // 签到信息
        $signInfo = $this->get_by_conds(['uid' => $uid]);
        if (!empty($signInfo)) {
            if (rgmdate(MILLI_TIME, 'Y-m-d') == rgmdate($signInfo['update_time'], 'Y-m-d')) {
                // 今天已签到
                return $signInfo['integral'];
            }
            // 最后一个次签到时间与当前时间间隔超过一天,断签
            if ($this->signCrackDays($signInfo['update_time']) > 1) {
                $signInfo['sign_total'] = 0;
            }
        }

        // 从未签到,连续签到1天
        $signInfo['sign_total'] = empty($signInfo) ? 1 : $signInfo['sign_total'] + 1;

        // 签到规则计算
        switch ($rules['sign_type']) {
            case Constant::DAILYTASK_SIGN_TYPE_IS_FIXED:
                // 固定签到
                $integral = $this->signFixed($rules['sign_fixed'], $signInfo['sign_total']);
                break;
            case Constant::DAILYTASK_SIGN_TYPE_IS_CYCLE:

                $integral = $this->signCycle($rules['sign_cycle'], $signInfo['sign_total']);
                break;
        }

        return $integral;
    }

    /**
     * 上次签到与当前时间间隔天数
     * @author tangxingguo
     * @param $updateTime
     * @return int
     */
    public function signCrackDays($updateTime)
    {
        $lastSign = rstrtotime(rgmdate($updateTime, 'Y-m-d'), 1);
        $nowTime = rstrtotime(rgmdate(MILLI_TIME, 'Y-m-d'), 1);
        $spaceDays = intval(($nowTime - $lastSign) / 24 / 60 / 60 / 1000);
        return $spaceDays;
    }

    /**
     * 固定签到积分
     * @author tangxingguo
     * @param array $rules 固定签到规则
     * @param int $signTotal 连续签到天数
     * @return mixed
     */
    private function signFixed($rules, $signTotal)
    {
        if (!isset($rules['reward_rule']) || empty($rules['reward_rule'])) {
            // 没有固定规则
            return $rules['day_integral'];
        }

        // 连续签到
        $rewardRule = array_combine_by_key($rules['reward_rule'], 'cycle');
        $cycles = array_column($rewardRule, 'cycle');
        if ($signTotal > max($cycles)) {
            // 连续签到天数大于最大周期,求余
            $signTotal = $signTotal % max($cycles) == 0 ? max($cycles) : $signTotal % max($cycles);
        }
        if (in_array($signTotal, $cycles)) {
            // 匹配到周期
            $integral = $rewardRule[$signTotal]['integral'] + $rules['day_integral'];
        } else {
            // 未匹配周期
            $integral = $rules['day_integral'];
        }

        return $integral;
    }

    /**
     * 递增签到积分
     * @author tangxingguo
     * @param array $rules 递增签到规则
     * @param int $signTotal 连续签到天数
     * @return int
     */
    private function signCycle($rules, $signTotal)
    {
        if (!isset($rules['cycle'], $rules['integral'], $rules['first'])) {
            return 0;
        }

        // 连续签到,公式=(连续签到天数《大于周期取余》 - 1) * 多得积分 + 签到默认积分
        if ($signTotal > $rules['cycle']) {
            //$integral = (($signTotal % $rules['cycle']) - 1) * $rules['integral'] + $rules['first'];

            $integral = (($signTotal % $rules['cycle'] ? $signTotal % $rules['cycle'] : $rules['cycle']) - 1) * $rules['integral'] + $rules['first'];

        } else {
            $integral = ($signTotal - 1) * $rules['integral'] + $rules['first'];
        }

        return $integral;
    }
}