<?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; use app\mobile\model\User; /** * 密卷接口 * @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", //原价 "is_buy": 0 //是否已购买:0=否,1=是 }] }) */ public function index() { // 我加入的企业购买的密卷 $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,a.is_top') ->select(); // 查询我是否可以享受企业密卷(按企业审核时间排队,没在队伍里就无法享受企业密卷) $secret_id_arr = []; foreach ($company_secret_list as $v) { if($v['is_top'] == '1'){ $secret_id_arr[] = $v['id']; continue; } $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']; } } // 查找所有我购买的和企业购买的密卷 $secret_order = SecretOrder::where(function($query)use($secret_id_arr){ $query->where('user_id', $this->auth->id)->whereor('id', 'in', $secret_id_arr); }) ->where('pay_status','1') ->limit(1) ->buildSql(); $list = $this->model ->alias('s') ->join([$secret_order => 'so'],'so.secret_id = s.id','left') ->field(" s.*, if(so.id > 0,1,0) is_buy ") ->order('createtime desc') ->select(); foreach ($list as $v) { $v->visible([ 'id', 'title', 'do_num', 'current_price', 'original_price' ])->append([ 'is_buy' ]); } $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) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1599739316", "data": { "group_id": 1, //0=普通用户,1=企业用户 } }) */ public function getUserIdentity() { $group_id = User::where('id',$this->auth->id)->value('group_id'); $this->success('成功',compact('group_id')); } /** * @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']); // 零元直接支付成功 if($model['pay_price'] <= 0){ (new Notify)->notifySecretZero($model['order_sn'],$model['pay_price'],$param['pay_type']); $this->success('成功',[]); } //回调链接 $notifyurl = $this->request->root(true) . '/mobile/notify/notifySecret/paytype/' . $param['pay_type']; $model['pay_price'] = 0.01; //测试金额 $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") * @ApiParams (name="answer_type", type="string", required=false, description="作答类型:0=全部,1=已答题,2=未答题,3=错题") * * @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'); $answer_type = $this->request->param('answer_type'); empty($secret_id) && $this->error('缺少必要参数'); $info = $this->model->get($secret_id); empty($info) && $this->error('密卷信息不存在'); $where['q.target_id'] = $secret_id; $where['q.target_type'] = '5'; switch ($answer_type) { case '1': $question_id_arr = QuestionAnswer::where('user_id',$user_id)->column('question_id'); $where['q.id'] = !empty($question_id_arr) ? ['in',$question_id_arr] : 0; break; case '2': $question_id_arr = QuestionAnswer::where('user_id',$user_id)->column('question_id'); if(!empty($question_id_arr)){ $where['q.id'] = ['notin',$question_id_arr]; } break; case '3': $question_id_arr = QuestionAnswer::where('user_id',$user_id)->where('is_wrong','1')->column('question_id'); $where['q.id'] = !empty($question_id_arr) ? ['in',$question_id_arr] : 0; break; } $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($where) ->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')); } }