Secret.php 10.5 KB
<?php
namespace app\mobile\controller;

use think\Validate;
use think\Db;
use app\common\controller\Api;
use app\mobile\model\SecretSpec;
use app\mobile\model\SecretOrder;
use app\mobile\model\Company;
use app\mobile\model\CompanyUser;
use addons\epay\library\Service;
use app\mobile\model\Question;
use app\mobile\model\QuestionAnswer;

/**
 * 密卷接口
 * @ApiWeigh (94)
 */
class Secret extends Api
{
	protected $noNeedLogin = ['index','info'];
    protected $noNeedRight = ['*'];
    protected $model = null;

    public function _initialize()
    {
        parent::_initialize();
        $this->model = model('app\mobile\model\Secret');
    }

    /**
     * @ApiTitle    (首页)
     * @ApiSummary  (首页)
     * @ApiMethod   (POST)
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1599201246",
        "data": [{
            "id": 1, //密卷名称
            "title": "测试密卷", //密卷标题
            "do_num": 20, //做过人数
            "current_price": "10.00", //现价
            "original_price": "10000.00" //原价
        }]
    })
     */
    public function index()
    {
        $list = $this->model->order('createtime desc')->select();
        foreach ($list as $v) {
            $v->visible(['id','title','do_num','current_price','original_price']);
        }
        $this->success('成功',$list);
    }

    /**
     * @ApiTitle    (详情)
     * @ApiSummary  (详情)
     * @ApiMethod   (POST)
     *
     * @ApiParams (name="secret_id", type="int", required=true, description="密卷ID")
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1599803465",
        "data": {
            "id": 1, //密卷ID
            "title": "测试密卷", //密卷标题
            "current_price": "10.00", // 当前价格
            "original_price": "10000.00", //原价
            "description": "测试密卷", //密卷介绍
            "do_num": 20 //做过人数
        }
    })
     */
    public function info()
    {
        $secret_id = $this->request->param('secret_id');
        empty($secret_id) && $this->error('缺少必要参数');
        $info = $this->model->get($secret_id);
        empty($info) && $this->error('密卷信息不存在');
        $info = $info->visible(['id','title','current_price','original_price','do_num','description']);
        $this->success('成功',$info);
    }

    /**
     * @ApiTitle    (选择规格)
     * @ApiSummary  (选择规格)
     * @ApiMethod   (POST)
     *
     * @ApiParams (name="secret_id", type="int", required=true, description="密卷ID")
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1599739316",
        "data": [{
            "id": 1, //规格ID
            "secret_id": 1, //密卷ID
            "name": "基础版", //套餐名称
            "current_price": "500.00", //当前价格
            "original_price": "1000.00", //原价
            "people_num": 20, //限制人数
            "is_top": "0", //是否顶配:0=否,1=是
            "createtime": null,
            "updatetime": null,
            "is_pay": 1 //是否可以购买:0=否,1=是
        }]
    })
     */
    public function spec()
    {
        $company = Company::get(['user_id'=>$this->auth->id]);
        $secret_id = $this->request->param('secret_id');
        empty($secret_id) && $this->error('缺少必要参数');
        $info = $this->model->get($secret_id);
        empty($info) && $this->error('密卷信息不存在');
        $list = SecretSpec::where('secret_id',$secret_id)->select();
        foreach ($list as &$v) {
            // 是否可购买
            $order = SecretOrder::where('company_id',$company['id'])
                ->where('secret_id',$secret_id)
                ->where('pay_status','1')
                ->order(['is_top'=>'desc','people_num'=>'desc'])
                ->find();
            $people_num = CompanyUser::where('company_id',$company['id'])
                ->where('status','1')
                ->count();
            if(!empty($order)){
                // 已购买顶配套餐,直接跳出本次循环
                if($order['is_top'] == '1'){
                    $v['is_pay'] = 0;
                    continue;
                }
                if($order['people_num'] > $people_num){
                    $people_num = $order['people_num'];
                }
                $v['current_price'] = $v['current_price']-$order['secret_price'];
            }
            if($v['is_top'] == '1'){
                $v['is_pay'] = 1;
            }else{
                $v['is_pay'] = $v['people_num'] <= $people_num ? 0 : 1;
            }
        }
        $this->success('成功',$list);
    }

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

    /**
     * @ApiTitle    (购买预览)
     * @ApiSummary  (购买预览)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams (name="secret_id", type="int", required=true, description="密卷ID")
     * @ApiParams (name="spec_id", type="int", required=true, description="密卷规格ID")
     * @ApiParams (name="score_switch", type="int", description="积分开关:0=关,1=开")
     *
     * @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 payView()
    {
        $param = $this->request->param();
        if(!$order = $this->model->payView($this->auth->getUser(),$param)){
            $this->error($this->model->getError(),null,$this->model->getCode());
        }
        $this->success(__('成功'),$order);
    }

    /**
     * @ApiTitle    (购买)
     * @ApiSummary  (购买)
     * @ApiMethod   (POST)
     *
     * @ApiHeaders (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams (name="secret_id", type="int", required=true, description="密卷ID")
     * @ApiParams (name="spec_id", type="int", required=true, description="密卷规格ID")
     * @ApiParams (name="score_switch", type="int", description="积分开关:0=关,1=开")
     * @ApiParams (name="pay_type", type="string", required=true, description="支付方式:wechat=微信,alipay=支付宝")
     *
     * @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 pay()
    {
        $param = $this->request->param();
        if(!$order = $this->model->payView($this->auth->getUser(),$param)){
            $this->error($this->model->getError(),null,$this->model->getCode());
        }
        if (!$param['pay_type'] || !in_array($param['pay_type'], ['alipay', 'wechat'])) {
            $this->error("请选择支付方式");
        }
        // 创建订单
        $model = new SecretOrder;
        $model->add($this->auth->getUser(), $order, $param['pay_type']);
        //回调链接
        $notifyurl = $this->request->root(true) . '/mobile/notify/notifySecret/paytype/' . $param['pay_type'];
        $payment = Service::submitOrder($model['pay_price'], $model['order_sn'], $param['pay_type'], '密卷', $notifyurl, null, 'app');
        $this->success('成功',$payment);
    }

    /**
     * @ApiTitle    (通关密卷-题目详情)
     * @ApiSummary  (通关密卷-题目详情)
     * @ApiMethod   (POST)
     *
     * @ApiParams (name="secret_id", type="int", required=true, description="密卷ID")
     *
     * @ApiReturn({
        "code": 1,
        "msg": "成功",
        "time": "1599046220",
        "data": {
            "total": 1, //题目总数
            "list": [{ //题目列表
                "id": 1, //题目ID
                "title": "测定混凝土立方体抗压强度时,标准试件的尺寸是(      )㎜。", //题目
                "option": "[{\"name\":\"A\",\"gender\":\"100\\u00d7100\\u00d7100\"},{\"name\":\"B\",\"gender\":\"150\\u00d7150\\u00d7150\"},{\"name\":\"C\",\"gender\":\"200\\u00d7200\\u00d7200\"},{\"name\":\"D\",\"gender\":\"70.7\\u00d770.7\\u00d770.7\"}]", //题目选项
                "type": "1", //题目类型:1=单选题,2=多选题,3=判断题,4=简答题
                "answer": "A", //答案
                "note": "45678910", //笔记
                "is_collect": "1" //是否收藏:0=否,1=是
            }]
        }
    })
     */
    public function questionList()
    {
        $user_id = $this->auth->id;
        $secret_id = $this->request->param('secret_id');
        empty($secret_id) && $this->error('缺少必要参数');
        $info = $this->model->get($secret_id);
        empty($info) && $this->error('密卷信息不存在');
        $list = Question::alias('q')
            ->join('mobile_question_note qn','q.id = qn.question_id and qn.user_id='.$user_id,'left')
            ->join('mobile_question_collect qc','q.id = qc.question_id and qn.user_id='.$user_id,'left')
            ->where('q.target_id',$everyday_id)
            ->where('q.target_type','5')
            ->field('
                q.id,
                q.title,
                q.option,
                q.type,
                q.answer,
                qn.content note,
                if(qc.id > 0,1,0) is_collect
            ')->select();
        $total = count($list);
        // 删除原来的做题记录
        QuestionAnswer::where('question_id','in',array_column($list, 'id'))
            ->where('user_id',$user_id)
            ->delete();
        $this->success('成功',compact('total','list'));
    }
}