<?php
namespace app\mobile\controller;

use think\Validate;
use think\Db;
use think\Exception;
use think\exception\PDOException;
use app\common\controller\Api;
use app\common\library\Sms as Smslib;
use app\mobile\controller\Sms;
use app\mobile\model\Company;
use app\mobile\model\CompanyUser;
use app\mobile\model\Agreement;
use app\mobile\model\Exam;
use app\mobile\model\CourseOrder;
use app\mobile\model\CourseAppraise;
use app\mobile\model\SecretOrder;
use app\mobile\model\ScoreSpec;
use app\mobile\model\ScoreOrder;
use app\mobile\model\QuestionCollect;
use app\mobile\model\CourseCollect;
use app\mobile\model\QuestionNote;
use app\mobile\model\Message;
use app\mobile\model\Feedback;
use app\mobile\model\Problem;
use addons\epay\library\Service;

/**
 * 我的接口
 * @ApiWeigh (66)
 */
class User extends Api
{
	protected $noNeedLogin = ['registerUser','agreementUser','registerCompany','agreementCompany','login','resetpwd','exam','noLogin'];
    protected $noNeedRight = ['*'];

    public function _initialize()
    {
        parent::_initialize();
    }

    /**
     * @ApiWeigh (99)
     * @ApiTitle    (注册-个人)
     * @ApiSummary  (注册-个人)
     * @param string $mobile   手机号
     * @param string $code   验证码
     * @param string $password 密码
     */
    public function registerUser()
    {
        $mobile = $this->request->param('mobile');
        $code = $this->request->param('code');
        $password = $this->request->param('password');

        empty($mobile) && $this->error('请输入手机号');
        empty($code) && $this->error('请输入验证码');
        empty($password) && $this->error('请输入密码');
        !Validate::regex($mobile, "^1\d{10}$") && $this->error('手机号格式不正确');
        $ret = Sms::check($mobile, $code, 'register');
        !$ret && $this->error('验证码不正确');

        $ret = $this->auth->register($username=$mobile, $password, $email='', $mobile, []);
        if ($ret) {
            $data = ['userinfo' => $this->auth->getUserinfo()];
            $this->success('注册成功', $data);
        } else {
            $this->error($this->auth->getError());
        }
    }

    /**
     * @ApiWeigh (97)
     * @ApiTitle    (注册协议-个人)
     * @ApiSummary  (注册协议-个人)
     * @ApiMethod   (POST)
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1599017563",
		"data": "用户协议内容" //协议内容
	})
     */
    public function agreementUser()
    {
        $content = Db::name('mobile_config')->where('id',1)->value('user_agreement');
        $this->success('成功', $content);
    }

    /**
     * @ApiWeigh (95)
     * @ApiTitle    (注册-公司)
     * @ApiSummary  (注册-公司)
     * @param string $name   公司名称
     * @param string $address   公司地址
     * @param string $license   公司执照
     * @param string $legal_person   法人名称
     * @param string $mobile   手机号
     * @param string $code   验证码
     * @param string $password 密码
     */
    public function registerCompany()
    {
    	$name = $this->request->param('name');
        $address = $this->request->param('address');
        $license = $this->request->param('license');
        $legal_person = $this->request->param('legal_person');
        $mobile = $this->request->param('mobile');
        $code = $this->request->param('code');
        $password = $this->request->param('password');

        empty($name) && $this->error('请输入公司名称');
        empty($address) && $this->error('请输入地址');
        empty($license) && $this->error('请上传执照');
        empty($legal_person) && $this->error('请输入法人名称');
        empty($mobile) && $this->error('请输入手机号');
        empty($code) && $this->error('请输入验证码');
        empty($password) && $this->error('请输入密码');
        !Validate::regex($mobile, "^1\d{10}$") && $this->error('手机号格式不正确');
        $ret = Sms::check($mobile, $code, 'register');
        !$ret && $this->error('验证码不正确');

        Db::startTrans();
        try {
            $ret = $this->auth->register($username='', $password, $email='', $mobile, ['group_id'=>1]);
            if (!$ret) {
                $this->error($this->auth->getError());
            }
            $company = Company::create([
                'user_id' => $this->auth->id,
                'name' => $name,
                'address' => $address,
                'license' => $license,
                'legal_person' => $legal_person
            ]);
            // 添加企业邀请码
            $this->setInviteCode($company['id']);
            Db::commit();
        } catch (PDOException $e) {
            Db::rollback();
            $this->auth->logout();
            $this->error($e->getMessage());
        } catch (Exception $e) {
            Db::rollback();
            $this->auth->logout();
            $this->error($e->getMessage());
        }
        $this->success('注册成功', ['userinfo' => $this->auth->getUserinfo()]);
    }

    /**
     * @ApiWeigh (93)
     * @ApiTitle    (注册协议-公司)
     * @ApiSummary  (注册协议-公司)
     * @ApiMethod   (POST)
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1599017563",
		"data": "用户协议内容" //协议内容
	})
     */
    public function agreementCompany()
    {
        $content = Db::name('mobile_config')->where('id',1)->value('company_agreement');
        $this->success('成功', $content);
    }

    /**
     * @ApiWeigh (91)
     * @ApiTitle    (登录)
     * @ApiSummary  (登录)
     * @param string $mobile  手机号
     * @param string $password 密码
     */
    public function login()
    {
        $mobile = $this->request->param('mobile');
        $password = $this->request->param('password');

        empty($mobile) && $this->error('请输入手机号');
        empty($password) && $this->error('请输入密码');
        !Validate::regex($mobile, "^1\d{10}$") && $this->error('手机号格式不正确');

        $ret = $this->auth->login($mobile, $password);
        if ($ret) {
            $data = ['userinfo' => $this->auth->getUserinfo()];
            $this->success('登录成功', $data);
        } else {
            $this->error($this->auth->getError());
        }
    }

    /**
     * @ApiWeigh (89)
     * @ApiTitle    (忘记密码)
     * @ApiSummary  (忘记密码)
     *
     * @param string $mobile      手机号
     * @param string $newpassword 新密码
     * @param string $code     验证码
     */
    public function resetpwd()
    {
        $mobile = $this->request->request("mobile");
        $code = $this->request->request("code");
        $newpassword = $this->request->request("newpassword");

        empty($mobile) && $this->error('请输入手机号');
        empty($newpassword) && $this->error('请输入密码');
        !Validate::regex($mobile, "^1\d{10}$") && $this->error('手机号格式不正确');
        $user = \app\common\model\User::getByMobile($mobile);
        !$user && $this->error('用户不存在');
        $ret = Sms::check($mobile, $code, 'resetpwd');
        !$ret && $this->error('验证码不正确');

        Smslib::flush($mobile, 'resetpwd');
        //模拟一次登录
        $this->auth->direct($user->id);
        $ret = $this->auth->changepwd($newpassword, '', true);
        if ($ret) {
            $this->success('重置密码成功');
        } else {
            $this->error($this->auth->getError());
        }
    }

    /**
     * @ApiWeigh (87)
     * @ApiTitle    (选择参加的考试)
     * @ApiSummary  (选择参加的考试)
     * @ApiMethod   (POST)
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1599018234",
		"data": [{
			"id": 1, //一级ID
			"pid": 0,
			"name": "建筑工程", //一级名称
			"nickname": "", //一级昵称
			"children": [{ //二级
				"id": 3, //二级ID
				"pid": 1, //父ID
				"name": "一级建造师", //二级名称
				"nickname": "" //二级昵称
			}]
		}]
	})
     */
    public function exam()
    {
        $list = Exam::where('pid',0)->field('id,pid,name,nickname')->select();
        foreach($list as &$v){
        	$v['children'] = Exam::where('pid',$v['id'])->field('id,pid,name,nickname')->select();
        }
        $this->success('成功', $list);
    }

    /**
     * @ApiWeigh (85)
     * @ApiTitle    (暂不登录提示)
     * @ApiSummary  (暂不登录提示)
     * @ApiMethod   (POST)
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1599017563",
		"data": "暂不登录提示内容" //暂不登录提示内容
	})
     */
    public function noLogin()
    {
        $content = Db::name('mobile_config')->where('id',1)->value('no_login');
        $this->success('成功', $content);
    }

    /**
     * @ApiWeigh (83)
     * @ApiTitle    (我的-首页)
     * @ApiSummary  (我的-首页)
     * @ApiMethod   (POST)
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1599017563",
        "data": "暂不登录提示内容" //暂不登录提示内容
    })
     */
    public function index()
    {
        $user = $this->auth->getUser();
        $this->success('成功', $user);
    }

    /**
     * @ApiWeigh (81)
     * @ApiTitle    (我的-修改会员个人信息)
     * @ApiSummary  (我的-修改会员个人信息)
     *
     * @param string $image   头像地址
     * @param string $username 用户名
     * @param string $nickname 真实姓名
     */
    public function profile()
    {
        $user = $this->auth->getUser();
        $username = $this->request->param('username');
        $nickname = $this->request->param('nickname');
        $image = $this->request->param('image', '', 'trim,strip_tags,htmlspecialchars');
        if($username || $nickname || $image) {
            if ($username) {
                $user->username = $username;
            }
            if ($nickname) {
                $user->nickname = $nickname;
            }
            if ($image) {
                $user->image = $image;
            }
            $user->save();
        }
        $this->success();
    }

    /**
     * @ApiWeigh (79)
     * @ApiTitle    (修改手机号-第一步)
     * @ApiSummary  (修改手机号-第一步)
     * @param string $code 验证码
     */
    public function changemobile1()
    {
        $user = $this->auth->getUser();
        $code = $this->request->param('code');
        !$code && $this->error(__('请输入验证码'));
        $ret = Sms::check($user['mobile'], $code, 'changemobile1');
        !$ret && $this->error('验证码不正确');
        Smslib::flush($user['mobile'], 'changemobile1');
        $this->success();
    }

    /**
     * @ApiWeigh (77)
     * @ApiTitle    (修改手机号-第二步)
     * @ApiSummary  (修改手机号-第二步)
     *
     * @param string $mobile 新手机号
     * @param string $code 验证码
     */
    public function changemobile2()
    {
        $user = $this->auth->getUser();
        $mobile = $this->request->param('mobile');
        $code = $this->request->param('code');
        if (!$mobile || !$code) {
            $this->error(__('Invalid parameters'));
        }
        if (!Validate::regex($mobile, "^1\d{10}$")) {
            $this->error(__('Mobile is incorrect'));
        }
        if (\app\common\model\User::where('mobile', $mobile)->where('id', '<>', $user->id)->find()) {
            $this->error(__('Mobile already exists'));
        }
        $result = Sms::check($mobile, $code, 'changemobile2');
        if (!$result) {
            $this->error(__('Captcha is incorrect'));
        }
        $verification = $user->verification;
        $verification->mobile = 1;
        $user->verification = $verification;
        $user->mobile = $mobile;
        $user->save();

        Smslib::flush($mobile, 'changemobile2');
        $this->success();
    }

    /**
     * @ApiWeigh (75)
     * @ApiTitle    (加入企业)
     * @ApiSummary  (加入企业)
     *
     * @param string $company_id 企业ID
     * @param string $name 姓名
     * @param string $mobile 手机号
     * @param string $invite_code 验证码
     */
    public function joinCompany()
    {
        $company_id = $this->request->param('company_id');
        $name = $this->request->param('name');
        $mobile = $this->request->param('mobile');
        $invite_code = $this->request->param('invite_code');
        // 验证传参
        empty($company_id) && $this->error('缺少必需参数');
        empty($name) && $this->error('请填写姓名');
        empty($mobile) && $this->error('请填写联系方式');
        empty($invite_code) && $this->error('请填写邀请码');
        !Validate::regex($mobile, "^1\d{10}$") && $this->error(__('Mobile is incorrect'));
        // 验证邀请码
        $company = Company::where('invite_code',$invite_code)
            ->where('id',$company_id)
            ->field('id')
            ->find();
        empty($company) && $this->error('邀请码错误,请输入正确的邀请码');
        // 验证申请状态
        $company_user = CompanyUser::where('company_id',$company['id'])->field('status')->find();
        if($company_user){
            if($company_user['status'] == '0'){
                $this->error('正在申请中,请勿重复提交申请');
            }
            if($company_user['status'] == '1'){
                $this->error('加入企业成功,请勿重复提交申请');
            }
        }
        CompanyUser::create([
            'user_id' => $this->auth->id,
            'company_id' => $company_id,
            'name' => $name,
            'mobile' => $mobile
        ]);
        $this->success('已成功提交,请提醒企业管理员及时审核');
    }

    /**
     * 更新企业邀请码
     * @param string $company_id 企业ID
     */
    private function setInviteCode($company_id){
        $code = mt_rand(100000,999999);
        $find = Company::where('invite_code',$code)->field('id')->find();
        if(!$find){
            Company::where('id',$company_id)->setField('invite_code',$code);
            return true;
        }else{
            $this->setInviteCode($company_id);
        }
    }

    /**
     * @ApiWeigh (73)
     * @ApiTitle    (我的课程)
     * @ApiSummary  (我的课程)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1600081718",
        "data": [{
            "id": 9, //课程订单ID
            "pay_price": "50.00", //实际支付金额
            "course": { //课程信息
                "title": "测试课程", //课程标题
                "cover": "" //课程封面图
            },
            "is_have_qi": 0 //是否有企字:0=否,1=是
        }]
    })
     */
    public function myCourse(){
        // 我加入的企业购买的课程
        $company_course_list = CourseOrder::alias('co')
            ->join('mobile_company_user cu','cu.company_id = co.company_id')
            ->where('cu.user_id',$this->auth->id)
            ->where('cu.status','1')
            ->field('co.id,co.company_id,co.people_num')
            ->select();
        // 查询我是否可以享受企业课程(按企业审核时间排队,没在队伍里就无法享受企业课程)
        $course_id_arr = [];
        foreach ($company_course_list as $v) {
            $user_id_arr = CompanyUser::where('company_id',$v['company_id'])
                ->where('status','1')
                ->order('updatetime asc')
                ->limit($v['people_num'])
                ->column('user_id');
            if(in_array($this->auth->id,$user_id_arr)){
                $course_id_arr[] = $v['id'];
            }
        }
        // 查找所有课程
        $list = CourseOrder::with(['course'])
            ->where(function($query)use($course_id_arr){
                $query->where('user_id', $this->auth->id)->whereor('id', 'in', $course_id_arr);
            })
            ->where('pay_status','1')
            ->select();
        foreach ($list as $v) {
            $v['is_have_qi'] = in_array($v['id'], $course_id_arr) ? 1 : 0;
            $v->visible(['id','pay_price','course'])->append(['is_have_qi']);
            $v->getRelation('course')->visible(['cover','title']);
        }
        $this->success('成功',$list);
    }

    /**
     * @ApiWeigh (71)
     * @ApiTitle    (我的课程-评价页面)
     * @ApiSummary  (我的课程-评价页面)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams (name="course_order_id", type="int", required=true, description="课程订单ID")
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1600084253",
        "data": {
            "id": 10, //课程订单ID
            "pay_price": "50.00", //实际支付金额
            "course": { //课程信息
                "title": "测试课程", //课程标题
                "cover": "" //课程封面图
            },
            "is_have_qi": 0 //是否有企字:0=否,1=是
        }
    })
     */
    public function appraiseView(){
        $course_order_id = $this->request->param('course_order_id');
        empty($course_order_id) && $this->error('缺少必需参数');
        $info = CourseOrder::get($course_order_id,['course']);
        empty($info) && $this->error('课程订单不存在');
        $user_id_arr = CompanyUser::where('company_id',$info['company_id'])
            ->where('status','1')
            ->order('updatetime asc')
            ->limit($info['people_num'])
            ->column('user_id');
        $info['is_have_qi'] = in_array($this->auth->id,$user_id_arr) ? 1 : 0;
        $info->visible(['id','pay_price','course'])->append(['is_have_qi']);
        $info->getRelation('course')->visible(['cover','title']);
        $this->success('成功',$info);
    }

    /**
     * @ApiWeigh (69)
     * @ApiTitle    (我的课程-评价)
     * @ApiSummary  (我的课程-评价)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams (name="course_order_id", type="int", required=true, description="课程订单ID")
     * @ApiParams (name="star", type="int", required=true, description="评价星数")
     * @ApiParams (name="content", type="int", required=true, description="评价内容")
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1600084253",
        "data": null
    })
     */
    public function appraise(){
        $course_order_id = $this->request->param('course_order_id');
        $star = $this->request->param('star');
        $content = $this->request->param('content');
        empty($course_order_id) && $this->error('缺少必需参数');
        empty($star) && $this->error('请选择星数');
        empty($content) && $this->error('请填写评价内容');
        $info = CourseOrder::get($course_order_id,['course']);
        empty($info) && $this->error('课程订单不存在');
        CourseAppraise::create([
            'user_id' => $this->auth->id,
            'course_id' => $info['course_id'],
            'course_order_id' => $info['id'],
            'star' => $star,
            'content' => $content
        ]);
        $this->success('评价成功');
    }

    /**
     * @ApiWeigh (67)
     * @ApiTitle    (我的密卷)
     * @ApiSummary  (我的密卷)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1600081718",
        "data": [{
            "id": 9, //密卷订单ID
            "pay_price": "50.00", //实际支付金额
            "secret": { //密卷信息
                "title": "测试密卷", //密卷标题
                "do_num": "" //做过人数
            },
            "is_have_qi": 0 //是否有企字:0=否,1=是
        }]
    })
     */
    public function mySecret(){
        // 我加入的企业购买的密卷
        $company_secret_list = SecretOrder::alias('a')
            ->join('mobile_company_user b','b.company_id = a.company_id')
            ->where('b.user_id',$this->auth->id)
            ->where('b.status','1')
            ->field('a.id,a.company_id,a.people_num')
            ->select();
        // 查询我是否可以享受企业密卷(按企业审核时间排队,没在队伍里就无法享受企业密卷)
        $secret_id_arr = [];
        foreach ($company_secret_list as $v) {
            $user_id_arr = CompanyUser::where('company_id',$v['company_id'])
                ->where('status','1')
                ->order('updatetime asc')
                ->limit($v['people_num'])
                ->column('user_id');
            if(in_array($this->auth->id,$user_id_arr)){
                $secret_id_arr[] = $v['id'];
            }
        }
        // 查找所有密卷
        $list = SecretOrder::with(['secret'])
            ->where(function($query)use($secret_id_arr){
                $query->where('user_id', $this->auth->id)->whereor('id', 'in', $secret_id_arr);
            })
            ->where('pay_status','1')
            ->select();
        foreach ($list as $v) {
            $v['is_have_qi'] = in_array($v['id'], $secret_id_arr) ? 1 : 0;
            $v->visible(['id','pay_price','secret'])->append(['is_have_qi']);
            $v->getRelation('secret')->visible(['cover','title']);
        }
        $this->success('成功',$list);
    }

    /**
     * @ApiWeigh (65)
     * @ApiTitle    (我的积分)
     * @ApiSummary  (我的积分)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1600135095",
		"data": {
			"id": 16, //用户ID
			"score": 0, //当前积分
			"url": "/u/16",
			"max_score": 0 //累计积分
		}
	})
     */
    public function myScore(){
        $user = $this->auth->getUser();
        $user['max_score'] = db('user_score_log')->where('user_id',$user['id'])->max('after');
        $user = $user->visible(['id','score'])->append(['max_score'])->toArray();
        $this->success('成功',$user);
    }

    /**
     * @ApiWeigh (63)
     * @ApiTitle    (积分说明)
     * @ApiSummary  (积分说明)
     * @ApiMethod   (POST)
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1599017563",
        "data": "积分说明" //积分说明内容
    })
     */
    public function scoreIntro()
    {
        $content = Db::name('mobile_config')->where('id',1)->value('user_score_intro');
        $this->success('成功', $content);
    }

    /**
     * @ApiWeigh (61)
     * @ApiTitle    (积分记录)
     * @ApiSummary  (积分记录)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="page", type="inter", required=false, description="当前页(默认1)")
     * @ApiParams   (name="page_num", type="inter", required=false, description="每页显示数据个数(默认10)")
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1599017563",
        "data": "积分说明" //积分说明内容
    })
     */
    public function scoreLog()
    {
    	$page = $this->request->param('page', 1, 'intval');
        $page_num = $this->request->param('page_num', 10, 'intval');
        $list = \app\common\model\ScoreLog::where('user_id',$this->auth->id)
        	->order('createtime desc')
        	->paginate($page_num,false,['page'=>$page])
            ->each(function($v){
                $v['createtime'] = date('Y.m.d H:i',$v['createtime']);
            })->toArray();
        $this->success('成功', ['total'=>$data['total'],'list'=>$data['data']]);
    }

    /**
     * @ApiWeigh (59)
     * @ApiTitle    (海报分享)
     * @ApiSummary  (海报分享)
     * @ApiMethod   (POST)
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1599017563",
        "data": "积分说明" //积分说明内容
    })
     */
    public function share()
    {
        $content = Db::name('mobile_config')->where('id',1)->value('user_score_intro');
        $this->success('成功', $content);
    }

    /**
     * @ApiWeigh (57)
     * @ApiTitle    (充值积分-套餐)
     * @ApiSummary  (充值积分-套餐)
     * @ApiMethod   (POST)
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1599017563",
        "data": "积分说明" //积分说明内容
    })
     */
    public function scoreSpec()
    {
        $list = ScoreSpec::select();
        $score_recharge_price = Db::name('mobile_config')->where('id',1)->value('score_recharge_price');
        $this->success('成功', compact('list','score_recharge_price'));
    }

    /**
     * @ApiWeigh (55)
     * @ApiTitle    (积分充值预览)
     * @ApiSummary  (积分充值预览)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams (name="score_spec_id", type="int", required=false, description="套餐ID")
     * @ApiParams (name="score", type="int", required=false, description="自定义积分")
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1599046220",
        "data": {
            "id": 1, //试卷ID
            "title": "测试试卷", //试卷标题
            "year": 2015, //年费(单位:年)
            "time": 100, //答题时间(单位:分)
            "pass_score": 80, //合格分数
            "description": "这个还行", //试卷描述
            "do_num": 10, //回答人数
            "full_score": 100 //试卷分数(单位:分)
        }
    })
     */
    public function scoreRechargeView()
    {
        $param = $this->request->param();
        $model = new ScoreOrder;
        if(!$order = $model->payView($this->auth->getUser(),$param)){
            $this->error($model->getError(),null,$this->model->getCode());
        }
        $this->success(__('成功'),$order);
    }

    /**
     * @ApiWeigh (53)
     * @ApiTitle    (充值积分)
     * @ApiSummary  (充值积分)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams (name="score_spec_id", type="int", required=false, description="积分套餐ID")
     * @ApiParams (name="score", type="int", required=false, description="自定义积分")
     * @ApiParams (name="pay_type", type="string", required=true, description="支付方式:wechat=微信,alipay=支付宝")
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1599017563",
        "data": "积分说明" //积分说明内容
    })
     */
    public function scoreRecharge()
    {
    	$param = $this->request->param();
    	$model = new ScoreOrder;
        if(!$order = $model->payView($this->auth->getUser(),$param)){
            $this->error($model->getError(),null,$this->model->getCode());
        }
        if (!$param['pay_type'] || !in_array($param['pay_type'], ['alipay', 'wechat'])) {
            $this->error("请选择支付方式");
        }
        // 创建订单
        $model->add($this->auth->getUser(), $order, $param['pay_type']);
        //回调链接
        $notifyurl = $this->request->root(true) . '/mobile/notify/notifyScore/paytype/' . $param['pay_type'];
        $payment = Service::submitOrder($model['pay_price'], $model['order_sn'], $param['pay_type'], '积分', $notifyurl, null, 'app');
        $this->success('成功',$payment);
    }

    /**
     * @ApiWeigh (51)
     * @ApiTitle    (我的收藏-题目)
     * @ApiSummary  (我的收藏-题目)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="page", type="inter", required=false, description="当前页(默认1)")
     * @ApiParams   (name="page_num", type="inter", required=false, description="每页显示数据个数(默认10)")
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1600162242",
		"data": {
			"total": 1, // 题目总数
			"list": [{
				"id": 1, 
				"user_id": 16, //用户ID
				"question_id": 1, //题目ID
				"createtime": "2020.09.03 19:25", //收藏时间
				"question": { //题目信息
					"title": "测定混凝土立方体抗压强度时,标准试件的尺寸是(      )㎜。", //题目
					"type": "1" //题目类型:1=单选题,2=多选题,3=判断题,4=简答题
				}
			}]
		}
	})
     */
    public function collectQuestionList()
    {
        $page = $this->request->param('page', 1, 'intval');
        $page_num = $this->request->param('page_num', 10, 'intval');
        $data = QuestionCollect::with(['question'])
        	->where('user_id',$this->auth->id)
        	->order('createtime desc')
        	->paginate($page_num,false,['page'=>$page])
            ->each(function($v){
                $v['createtime'] = date('Y.m.d H:i',$v['createtime']);
                $v->getRelation('question')->visible(['title','type']);
            })->toArray();
        $this->success('成功', ['total'=>$data['total'],'list'=>$data['data']]);
    }

    /**
     * @ApiWeigh (49)
     * @ApiTitle    (我的收藏-课程)
     * @ApiSummary  (我的收藏-课程)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="page", type="inter", required=false, description="当前页(默认1)")
     * @ApiParams   (name="page_num", type="inter", required=false, description="每页显示数据个数(默认10)")
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1600164731",
		"data": {
			"total": 1, //数据总数
			"list": [{
				"id": 1,
				"user_id": 16, //用户ID
				"course_id": 1, //课程ID
				"createtime": "2020.09.03 19:25", //收藏时间
				"course": { //课程信息
					"title": "测试课程", //课程标题
					"cover": "", //课程封面图
					"current_price": "50.00", //现价
					"original_price": "100.00" //原价
				}
			}]
		}
	})
     */
    public function collectCourseList()
    {
        $page = $this->request->param('page', 1, 'intval');
        $page_num = $this->request->param('page_num', 10, 'intval');
        $data = CourseCollect::with(['course'])
        	->where('user_id',$this->auth->id)
        	->order('createtime desc')
        	->paginate($page_num,false,['page'=>$page])
            ->each(function($v){
                $v['createtime'] = date('Y.m.d H:i',$v['createtime']);
                $v->getRelation('course')->visible(['cover','title','current_price','original_price','study_num']);
            })->toArray();
        $this->success('成功', ['total'=>$data['total'],'list'=>$data['data']]);
    }

    /**
     * @ApiWeigh (47)
     * @ApiTitle    (我的收藏-笔记)
     * @ApiSummary  (我的收藏-笔记)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="page", type="inter", required=false, description="当前页(默认1)")
     * @ApiParams   (name="page_num", type="inter", required=false, description="每页显示数据个数(默认10)")
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1600165190",
		"data": {
			"total": 1, //数据总数
			"list": [{
				"id": 3, //笔记ID
				"user_id": 16, //用户ID
				"question_id": 5, //题目ID
				"content": "这就是街舞", //笔记内容
				"createtime": "2020.09.10 19:15", //收藏时间
				"updatetime": 1599736531,
				"question": { //题目信息
					"title": "测试多选", //题目标题
					"type": "2" //题目类型:1=单选题,2=多选题,3=判断题,4=简答题
				}
			}]
		}
	})
     */
    public function collectNoteList()
    {
        $page = $this->request->param('page', 1, 'intval');
        $page_num = $this->request->param('page_num', 10, 'intval');
        $data = QuestionNote::with(['question'])
        	->where('user_id',$this->auth->id)
        	->order('createtime desc')
        	->paginate($page_num,false,['page'=>$page])
            ->each(function($v){
                $v['createtime'] = date('Y.m.d H:i',$v['createtime']);
                $v->getRelation('question')->visible(['title','type']);
            })->toArray();
        $this->success('成功', ['total'=>$data['total'],'list'=>$data['data']]);
    }

    /**
     * @ApiWeigh (45)
     * @ApiTitle    (我的收藏-笔记-删除)
     * @ApiSummary  (我的收藏-笔记-删除)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="question_note_id", type="inter", required=false, description="当前页(默认1)")
     *
     * @ApiReturn({
		"code": 1,
		"msg": "删除成功",
		"time": "1600165190",
		"data": null
	})
     */
    public function noteDelete()
    {
        $question_note_id = $this->request->param('question_note_id');
        empty($question_note_id) && $this->error('缺少必需参数');
        $info = QuestionNote::get($question_note_id);
        empty($info) && $this->error('笔记信息不存在');
        $info->delete();
        $this->success('删除成功');
    }

    /**
     * @ApiWeigh (43)
     * @ApiTitle    (消息)
     * @ApiSummary  (消息)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="page", type="inter", required=false, description="当前页(默认1)")
     * @ApiParams   (name="page_num", type="inter", required=false, description="每页显示数据个数(默认10)")
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1600167138",
		"data": {
			"total": 1, //数据总数
			"list": [{
				"id": 7, //消息ID
				"title": "这是个消息", //消息标题
				"createtime": "2020.09.12 20:45" //发送时间
			}]
		}
	})
     */
    public function messageList()
    {
        $page = $this->request->param('page', 1, 'intval');
        $page_num = $this->request->param('page_num', 10, 'intval');
        $data = Message::where('user_id',$this->auth->id)
        	->order('createtime desc')
        	->paginate($page_num,false,['page'=>$page])
            ->each(function($v){
                $v['createtime'] = date('Y.m.d H:i',$v['createtime']);
                $v->visible(['id','title','createtime']);
            })->toArray();
        $this->success('成功', ['total'=>$data['total'],'list'=>$data['data']]);
    }

    /**
     * @ApiWeigh (43)
     * @ApiTitle    (消息-详情)
     * @ApiSummary  (消息-详情)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="message_id", type="inter", required=true, description="消息ID")
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1600167441",
		"data": {
			"id": 7, //消息ID
			"user_id": 16, //用户ID
			"title": "这是个消息", //消息标题
			"content": "这个消息还不错Q", //消息内容
			"is_read": "1", //是否已读:0=否,1=是
			"createtime": 1599914736,
			"updatetime": 1600167441
		}
	})
     */
    public function messageInfo()
    {
        $message_id = $this->request->param('message_id');
        empty($message_id) && $this->error('缺少必需参数');
        $info = Message::get($message_id);
        empty($info) && $this->error('消息不存在');
        $info->save(['is_read'=>'1']);
        $this->success('成功', $info);
    }

    /**
     * @ApiWeigh (41)
     * @ApiTitle    (意见反馈-错误类型)
     * @ApiSummary  (意见反馈-错误类型)
     * @ApiMethod   (POST)
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1600167441",
		"data": {
			"id": 7, //消息ID
			"user_id": 16, //用户ID
			"title": "这是个消息", //消息标题
			"content": "这个消息还不错Q", //消息内容
			"is_read": "1", //是否已读:0=否,1=是
			"createtime": 1599914736,
			"updatetime": 1600167441
		}
	})
     */
    public function feedbackWrong()
    {
        $list = Db::name('mobile_feedback_wrong')->field('id,name')->select();
        $this->success('成功', $list);
    }

    /**
     * @ApiWeigh (39)
     * @ApiTitle    (意见反馈)
     * @ApiSummary  (意见反馈)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="feedback_wrong_id", type="inter", required=true, description="错误类型ID")
     * @ApiParams   (name="content", type="string", required=true, description="反馈内容")
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1600167441",
		"data": {
			"id": 7, //消息ID
			"user_id": 16, //用户ID
			"title": "这是个消息", //消息标题
			"content": "这个消息还不错Q", //消息内容
			"is_read": "1", //是否已读:0=否,1=是
			"createtime": 1599914736,
			"updatetime": 1600167441
		}
	})
     */
    public function feedback()
    {
        $feedback_wrong_id = $this->request->param('feedback_wrong_id');
        $content = $this->request->param('content');
        empty($feedback_wrong_id) && $this->error('请选择错误类型');
        empty($content) && $this->error('请填写反馈内容');
        Feedback::create([
        	'user_id' => $this->auth->id,
        	'feedback_wrong_id' => $feedback_wrong_id,
        	'content' => $content
        ]);
        $this->success('反馈成功');
    }

    /**
     * @ApiWeigh (37)
     * @ApiTitle    (我的帖子)
     * @ApiSummary  (我的帖子)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="feedback_wrong_id", type="inter", required=true, description="错误类型ID")
     * @ApiParams   (name="content", type="string", required=true, description="反馈内容")
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1600167441",
		"data": {
			"id": 7, //消息ID
			"user_id": 16, //用户ID
			"title": "这是个消息", //消息标题
			"content": "这个消息还不错Q", //消息内容
			"is_read": "1", //是否已读:0=否,1=是
			"createtime": 1599914736,
			"updatetime": 1600167441
		}
	})
     */
    public function topicList()
    {
        $page = $this->request->param('page', 1, 'intval');
        $page_num = $this->request->param('page_num', 10, 'intval');
        $data = Topic::with(['user'])
        	->where('user_id',$this->auth->id)
        	->order('createtime desc')
        	->paginate($page_num,false,['page'=>$page])
            ->each(function($v){
                $v->visible(['id','title','content','createtime','agree_num','download_num','user']);
                $v->createtime = date('Y.m.d H:i',$v['createtime']);
                $v->getRelation('user')->visible(['user_id','avatar','nickname']);
            })->toArray();
        $this->success('成功', ['total'=>$data['total'],'list'=>$data['data']]);
    }

    /**
     * @ApiWeigh (35)
     * @ApiTitle    (我的帖子-@我的)
     * @ApiSummary  (我的帖子-@我的)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1600167441",
		"data": {
			"id": 7, //消息ID
			"user_id": 16, //用户ID
			"title": "这是个消息", //消息标题
			"content": "这个消息还不错Q", //消息内容
			"is_read": "1", //是否已读:0=否,1=是
			"createtime": 1599914736,
			"updatetime": 1600167441
		}
	})
     */
    public function topicCueMe()
    {
        $page = $this->request->param('page', 1, 'intval');
        $page_num = $this->request->param('page_num', 10, 'intval');
        $data = Topic::with(['user'])
        	->where('user_id',$this->auth->id)
        	->order('createtime desc')
        	->paginate($page_num,false,['page'=>$page])
            ->each(function($v){
                $v->visible(['id','title','content','createtime','agree_num','download_num','user']);
                $v->createtime = date('Y.m.d H:i',$v['createtime']);
                $v->getRelation('user')->visible(['user_id','avatar','nickname']);
            })->toArray();
        $this->success('成功', ['total'=>$data['total'],'list'=>$data['data']]);
    }

    /**
     * @ApiWeigh (10)
     * @ApiTitle    (常见问题)
     * @ApiSummary  (常见问题)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="page", type="inter", required=false, description="当前页(默认1)")
     * @ApiParams   (name="page_num", type="inter", required=false, description="每页显示数据个数(默认10)")
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1600167138",
		"data": {
			"total": 1, //数据总数
			"list": [{
				"id": 7, //消息ID
				"title": "这是个消息", //消息标题
				"createtime": "2020.09.12 20:45" //发送时间
			}]
		}
	})
     */
    public function problemList()
    {
        $page = $this->request->param('page', 1, 'intval');
        $page_num = $this->request->param('page_num', 10, 'intval');
        $data = Problem::where('user_id',$this->auth->id)
        	->order('createtime desc')
        	->paginate($page_num,false,['page'=>$page])
            ->each(function($v){
                $v['createtime'] = date('Y.m.d H:i',$v['createtime']);
                $v->visible(['id','title','createtime']);
            })->toArray();
        $this->success('成功', ['total'=>$data['total'],'list'=>$data['data']]);
    }

    /**
     * @ApiWeigh (9)
     * @ApiTitle    (常见问题-详情)
     * @ApiSummary  (常见问题-详情)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="problem_id", type="inter", required=true, description="问题ID")
     *
     * @ApiReturn({
		"code": 1,
		"msg": "成功",
		"time": "1600167441",
		"data": {
			"id": 7, //消息ID
			"user_id": 16, //用户ID
			"title": "这是个消息", //消息标题
			"content": "这个消息还不错Q", //消息内容
			"is_read": "1", //是否已读:0=否,1=是
			"createtime": 1599914736,
			"updatetime": 1600167441
		}
	})
     */
    public function problemInfo()
    {
        $problem_id = $this->request->param('problem_id');
        empty($problem_id) && $this->error('缺少必需参数');
        $info = Problem::get($problem_id);
        empty($info) && $this->error('问题不存在');
        $this->success('成功', $info);
    }
}