* @version : HUOSDK 8.0 */ namespace huo\controller\sign; use huo\controller\common\Base; use huo\controller\integral\MemIntegral; use huo\controller\member\MemCache; use huo\model\sign\MemSignModel; use huo\model\sign\SignRewordModel; use huolib\constant\IaConst; use huolib\constant\MemItgConst; use huolib\status\SignStatus; use huolib\tool\Time; use think\Cache; class Sign extends Base { /** * 玩家签到 * * @param int $mem_id 玩家ID * @param int $app_id 应用ID * * @return array */ public function sign($mem_id, $app_id = 0) { /* 判断是否已经签到 */ $_mc_class = MemCache::ins(); $_me_data = $_mc_class->getMeInfoById($mem_id); $_last_sign_time = $_me_data['last_sign_time']; $_rs = self::isSignToday($_last_sign_time); if (true == $_rs) { /* 玩家已签到 */ $_code = SignStatus::SIGN_HAS_SIGN; return $this->huoError($_code, SignStatus::getMsg($_code)); } list($_sign_days, $_last_sign_time) = self::getSignDaysAndTime( $_me_data['sign_days'], $_me_data['last_sign_time'] ); $_me_data['sign_days'] = $_sign_days + 1; $_me_data['last_sign_time'] = time(); $_rs = $_mc_class->updateMeCache($mem_id, $_me_data); if (false == $_rs) { $_code = SignStatus::UNKNOWN_ERROR; return $this->huoError($_code, SignStatus::getMsg($_code)); } /* 签到完后 更新签到表 */ $_sign_days = $_me_data['sign_days']; $_integral = $this->getReword($_sign_days); $_sign_id = $this->insertSignLog($mem_id, $_sign_days, $_integral); if (false == $_sign_id) { $_code = SignStatus::INNER_ERROR; return $this->huoError($_code, SignStatus::getMsg($_code)); } $_rs = (new MemIntegral())->addMemItg( $mem_id, $_integral, IaConst::IA_SIGN, $app_id, 'mem_sign', $_sign_id, '', $app_id ); if (SignStatus::NO_ERROR != $_rs) { $_code = $_rs; return $this->huoError($_code, SignStatus::getMsg($_rs)); } /* 更新签到时间 */ $_code = SignStatus::NO_ERROR; $_rdata['my_integral'] = $_me_data['my_integral'] + $_integral; $_rdata['gain_integral'] = $_integral; $_rdata['sign_days'] = $_sign_days; return $this->huoSuccess($_code, SignStatus::getMsg($_code), $_rdata); } /** * * @param int $mem_id * @param int $sign_days * @param float $integral * * @return bool|int|string */ public function insertSignLog($mem_id, $sign_days, $integral) { $_sign_log['mem_id'] = $mem_id; $_sign_log['sign_days'] = $sign_days; $_sign_log['integral'] = $integral; return (new MemSignModel())->insertLog($_sign_log, true); } /** * 获取积分数量 * * @param int $sign_days * * @return int */ public function getReword($sign_days = 0) { $_sc_data = $this->getSignConf(); if (empty($sign_days)) { return 0; } return $_sc_data[$sign_days]['integral']; } /** * 获取签到周期开始时间与结束时间 */ public static function getStartEnd() { return Time::week(); } /** * 获取签到天数与签到时间 * * @param $sign_days * @param $last_sign_time * * @return array sign_day last_sign_time */ public static function getSignDaysAndTime($sign_days, $last_sign_time) { $_sign_days = $sign_days; $_last_sign_time = $last_sign_time; $_rs = self::isSignToday($last_sign_time); if (false == $_rs) { /* 今日未签到 */ list($_start_time, $_end_time) = self::getStartEnd(); if ($last_sign_time < $_start_time) { $_sign_days = 0; $_last_sign_time = 0; } elseif ($last_sign_time > $_start_time && $last_sign_time < $_end_time) { /* 周期内 */ if ($_sign_days > MemItgConst::SIGN_DAY_CIRCLE) { $_sign_days %= MemItgConst::SIGN_DAY_CIRCLE; } } } return [$_sign_days, $_last_sign_time]; } /** * 今日是否已经签到 * * @param int $last_sign_time 判断今日是否已经签到 * * @return bool */ public static function isSignToday($last_sign_time = 0) { list($_start_time, $_end_time) = Time::today(); if ($last_sign_time >= $_start_time && $last_sign_time < $_end_time) { return true; } return false; } /** *获取签到配置KEY * * @return string */ public function getSignConfKey() { return 'sign_conf'; } /** * @return array|bool */ public function getSignConf() { $_key = $this->getSignConfKey(); $_sc_data_json = Cache::get($_key); $_sc_data = json_decode($_sc_data_json, true); if (!is_array($_sc_data)) { $_sc_data = $_sc_data_json; } if (!is_array($_sc_data) || empty($_sc_data)) { $_sc_data = (new SignRewordModel())->getConf(); if (empty($_sc_data)) { return false; } $this->saveSignConf($_sc_data); } return $_sc_data; } /** * 保存玩家cache 数据 * * @param $sc_data * @param int $ttl */ public function saveSignConf($sc_data, $ttl = 3600) { $_key = $this->getSignConfKey(); Cache::set($_key, json_encode($sc_data), $ttl); } /** * 更新帐号信息 * * @param $sc_id * @param $sc_data * * @return bool */ public function updateSignConf($sc_id, $sc_data) { $_key = $this->getSignConfKey(); Cache::rm($_key); return (new SignRewordModel())->updateConf($sc_data, $sc_id); } }