SignController.class.php 3.88 KB
<?php
/**
 * Created by PhpStorm.
 * User: tangxingguo
 * Date: 2017/7/24
 * Time: 11:51
 */

namespace Api\Controller\Dailytask;

use Common\Common\Constant;
use Common\Common\DailytaskConfig;
use Common\Common\DataCenter;
use Common\Common\Integral;
use Common\Service\UserSignRecordService;
use Common\Service\UserSignService;
use Think\Log;

class SignController extends \Api\Controller\AbstractController
{
    /**
     * Sign
     * @author
     * @desc 签到接口
     * @return array
    array(
     * 'integral' => 10, // 签到获得的积分值
     * );
     */

    public function Index_post()
    {

        // 签到规则
        $taskConfig = &DailytaskConfig::instance();
        $res = $taskConfig->getCacheData(Constant::APP_SIGN);
        if (empty($res) || $res['is_open'] == Constant::DAILYTASK_IS_OPEN_FALSE) {
            // 没有签到规则或者签到关闭
            E('_ERR_DAILYTASK_SIGN_RULENAME_ERROR');
        }

        $user = $this->_login->user;

        // 今天签到可以获取的积分
        $signServ = new UserSignService();
        $integral = $signServ->signIntegral($user['memUid']);

        // 今天是否已签
        $todaySign = false;
        $signInfo = $signServ->get_by_conds(['uid' => $user['memUid']]);

        if (!empty($signInfo) && rgmdate(MILLI_TIME, 'Y-m-d') == rgmdate($signInfo['update_time'], 'Y-m-d')) {
            // 今天已签到
            $todaySign = true;
        }
        Log::write('查询出来的积分'.print_r($integral,true));
        Log::write('查询出来的数据详情'.print_r($signInfo,true));
        // 数据入库
        if ($integral > 0 && !$todaySign) {
            // 推送积分
            $this->updateIntegral($user['memUid'], $integral);

            // 更新数据
            $data = [
                'uid' => $user['memUid'],
                'username' => $user['memUsername'],
                'update_time' => MILLI_TIME,
                'integral' => $integral,
            ];
            if (empty($signInfo)) {
                // 添加
                $data['sign_total'] = 1;
                $signServ->insert($data);
            } else {
                // 更新
                $spaceDays = $signServ->signCrackDays($signInfo['update_time']);
                if ($spaceDays > 1) {
                    // 上次签到时间与今天时间间隔超过一天(断签)
                    $data['sign_total'] = 1;
                } else {
                    $data['sign_total'] = $signInfo['sign_total'] + 1;
                }
                $signServ->update_by_conds(['uid' => $this->uid], $data);
            }

            // 添加签到记录
            $recordServ = new UserSignRecordService();
            $recordServ->insert(['uid' => $user['memUid']]);

            // 数据中心签到埋点
            $dataCenter = &DataCenter::instance();
            $dataCenter->addSign($user);
            // 数据中心签到埋点
        }

        $this->_result = ['integral' => $integral];
    }

    /**
     * 推送积分
     * @author tangxingguo
     *
     * @param string $uid 用户UID
     * @param int $integral 积分值
     */
    private function updateIntegral($uid, $integral)
    {
        $integralUtil = &Integral::instance();
        $integralUtil->asynUpdateIntegral([
            // 用户id
            'memUid' => $uid,
            // 积分类型 (默认mi_type0)
            'miType' => 'mi_type0',
            // 积分策略key,integral不为空时,传业务自己的积分规则key
            'irKey' => 'dt_task',
            // 积分变更说明
            'remark' => "【员圈任务】" . '-' . '签到',
            // 变更的积分值
            'integral' => $integral,
            // 应用标识(消息推送必要)
            'msgIdentifier' => APP_IDENTIFIER,
            'businessKey' => 'task_center',
            'businessAct' => 'daliy_sign',
        ]);
    }
}