| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | <?phpnamespace addons\exam\controller;use addons\exam\model\BaseModel;use addons\exam\model\GradeModel;use think\Db;/** * 试卷考试成绩接口 */class Grade extends Base{    protected $noNeedLogin = ['*'];    protected $noNeedRight = ['*'];    /**     * 获取成绩列表     */    public function index()    {        $list = GradeModel::with(            [                // 'user'  => BaseModel::withSimpleUser(),                'cate'  => BaseModel::withSimpleCate(),                'paper' => BaseModel::withSimplePaper(),            ]        )            ->where('user_id', $this->auth->id)            ->order('id desc')            ->paginate(15, true);        $this->success('', compact('list'));    }    /**     * 排行榜     */    public function rank()    {        if (!$paper_id = input('paper_id/d', '0')) {            $this->error('缺少试卷信息');        }        $result = cache_data("rank:paper-{$paper_id}", function () use ($paper_id) {            $grade_count = GradeModel::where('paper_id', $paper_id)->group('user_id')->count();            $pass_count  = GradeModel::where('paper_id', $paper_id)->where('is_pass', 1)->group('user_id')->count();            $pass_rate   = round(($pass_count / $grade_count) * 100, 2) . '%';            // $pass_rate   = bcmul(bcdiv($pass_count, $grade_count, 4), 100, 2) . '%';            if ($grade_count) {                // 子查询,先取出最新的成绩                $subQuery = Db::name('exam_grade')                    ->field('id,user_id,cate_id,paper_id,mode,MAX(score) AS score,is_pass,grade_time')                    ->where('paper_id', $paper_id)                    ->group('user_id')                    ->order('id desc')                    ->buildSql();                // 再根据成绩、考试时间排序,取出前10名                $list = GradeModel::with(                    [                        'user' => BaseModel::withSimpleUser(),                    ]                )->table($subQuery . ' exam_grade')                    // ->where('paper_id', $paper_id)                    // ->group('user_id')                    ->order('score desc, grade_time asc')                    ->limit(10)                    ->select();            } else {                $list = [];            }            return [                'summary' => [                    'grade_count' => $grade_count,                    'pass_count'  => $pass_count,                    'pass_rate'   => $pass_rate,                    'cache_time'  => datetime(time()),                ],                'list'    => $list,            ];        }, 3600, true);        $this->success('', json_decode($result, true));    }}
 |