<?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; } }