123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- <?php
- /**
- * Sign.php UTF-8
- * 签到
- *
- * @date : 2018/5/4 19:33
- *
- * @license 这不是一个自由软件,未经授权不许任何使用和传播。
- * @author : wuyonghong <wyh@huosdk.com>
- * @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);
- }
- }
|