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