package com.qmth.teachcloud.report.business.service;

import com.qmth.teachcloud.report.business.enums.PublishStatusEnum;

/**
 * @Description: 对个人看板的分析
 * @Author: CaoZixuan
 * @Date: 2021-06-06
 */
public interface AnalyzeForReportService {

    /**
     * 构建考试课程分析表 't_a_exam_course'
     *
     * @param examId     考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzeExamCourse(Long examId, String courseCode);

    /**
     * 构建考试记录分析表数据 't_a_exam_course_record'
     *
     * @param examId     考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzeExamCourseRecord(Long examId, String courseCode);

    /**
     * 构建以考试课程-考查学院维度的分析表 't_a_exam_course_college_inspect'
     *
     * @param examId     考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzeExamCourseCollegeInspect(Long examId, String courseCode);
    

    /**
     * 构建考试课程-班级维度的分析表 ’t_a_exam_course_clazz‘
     *
     * @param examId     考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzeExamCourseClazz(Long examId, String courseCode);

    /**
     * 分析计算某科目考试的所有考查点得分率并将计算结果插入't_a_exam_course_dio'和't_a_exam_course_record_dio'和‘t_a_exam_course_record_mod’表中
     * <p>计算公式
     * 个人得分率 = 该学生在该考查点的得分/该考查点在此次考试所占分数
     * 平均得分率 = 参考学生在该考查点的得分平均值/该考查点在此次考试所占分数
     * </p>
     *
     * <p>计算过程
     * 1.获取该科目考试所有参考学生的数据源
     * 2.获取该科目考试的试卷结构的数据信息
     * 3.获取该科目考试所有考查点的数据源
     * 4.获取该科目考试考生每题答题记录详情数据源
     * <p>
     * 5.计算每个考查点所对应的题目集合
     * 6.计算每个考查点在此次考试所占分数
     * 7.计算每个考生各个知识点得分率并更新't_a_exam_course_record_dio'表
     * 8.计算此次考试各个考查点得分率并插入't_a_exam_course_dio'表
     * </p>
     *
     * @param examId     考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzePointScoreRate(Long examId, String courseCode) throws Exception;

    /**
     * 构建考试课程考查学院维度分析表
     *
     * @param examId     考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzeExamCourseCollegeInspectDio(Long examId, String courseCode);

    /**
     * 构建考试课程教师维度分析表
     *
     * @param examId     考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzeExamCourseTeacherDio(Long examId, String courseCode);

    /**
     * 构建表't_a_exam_course_teacher_college_dio'表来记录教师在每个授课学院各个考察点的得分率
     * @param examId 考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzeExamCourseTeacherCollegeDio(Long examId,String courseCode);

    /**
     * 构建分析试卷结构表 't_a_paper_struct'表
     *
     * @param examId     考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzePaperStruct(Long examId, String courseCode);

    /**
     * 构建't_a_exam_course_college_paper_struct'表记录各个考察学院下学生的各个题目的难度情况
     * @param examId 考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzeCollegePaperStruct(Long examId,String courseCode);

    /**
     * 构建't_a_exam_course_teacher_paper_struct'表记录该教师下所教学生的各个题目的难度情况
     * @param examId 考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzeTeacherPaperStruct(Long examId,String courseCode);

    /**
     * 构建't_a_exam_course_teacher_college_paper_struct'表记录该教师在某学院下所教学生的各个题目的难度情况
     * @param examId 考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzeTeacherCollegePaperStruct(Long examId,String courseCode);

    /**
     * 构建科目题目难度分类得分率表 - 学院与学校
     *
     * @param examId     考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildExamPaperDifficult(Long examId, String courseCode);

    /**
     * 构建科目题目难度分类得分率表 - 教师与学校
     *
     * @param examId     考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildExamPaperTeacherDifficult(Long examId, String courseCode);

    /**
     * 构建't_a_exam_course_teacher_college_difficult'表记录该教师在某学院的各难度题作答分析
     * @param examId 考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzeExamCourseTeacherCollegeDifficult(Long examId,String courseCode);

    /**
     * 构建表 ‘t_a_exam_total’
     *
     * @param examId 考试id
     * @return 结果
     */
    String buildAnalyzeExamTotal(Long examId,String courseCode);

    /**
     * 构建表 't_a_exam_course_college_teacher'
     *
     * @param examId     考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzeExamCourseCollegeTeacher(Long examId, String courseCode);

    /**
     * 构建表 't_a_exam_course_teacher'
     *
     * @param examId     考试id
     * @param courseCode 课程编号
     * @return 结果
     */
    String buildAnalyzeExamCourseTeacher(Long examId, String courseCode);

    /**
     * 更新表 't_b_exam_course'表 状态
     *
     * @param examId            考试id
     * @param courseCode        课程编号
     * @param publishStatusEnum 发布状态
     * @return 结果
     */
    String updateCoursePublishStatus(Long examId, String courseCode, PublishStatusEnum publishStatusEnum);

    /**
     * 数据计算总控
     *
     * @param examId     考试id
     * @param courseCode 课程代码
     */
    void dataCalculate(Long examId, String courseCode) throws Exception;

    /**
     * 计算前的准备工作 1.计算中状态报错 2.把其他状态改为计算中
     *
     * @param examId 考试id
     * @param courseCode 科目编号
     */
    void realityForCalculate(Long examId, String courseCode);

    /**
     * 发布/撤回、报告
     *
     * @param examId            考试id
     * @param courseCode        课程编号
     * @param publishStatusEnum 发布状态
     */
    void publishReport(Long examId, String courseCode, PublishStatusEnum publishStatusEnum);

    /**
     * 公式赋分方法
     *
     * @param examId     考试id
     * @param schoolId   学校id
     * @param courseCode 课程代码
     */
    void normalAssignScore(Long examId, Long schoolId, String courseCode);
}
