Преглед изворни кода

初始脚本、考试、问题卷类型、打回卷类型

xiatian пре 3 дана
родитељ
комит
501f7c9cd8

+ 258 - 138
install/mysql/init/stmms_ft.sql

@@ -1330,141 +1330,261 @@ CREATE TABLE `b_role_privilege`
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4 COMMENT ='角色权限关联表';
 
-LOCK TABLES `b_privilege` WRITE;
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,                           `i18n`)
-VALUES ('overview', '主页导览', 'root_code', 'MENU', '/admin/basic/overview', 5, 1, 'icon-bookmark', 'index.overview');
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,                           `i18n`)
-VALUES ('user_list', '用户管理', 'root_code', 'MENU', '/admin/user/list', 10, 1, 'icon-user', 'index.user');
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('user_list-help_video', '帮助视频', 'user_list', 'BUTTON', 2, 1);   
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,                           `i18n`)                        
-VALUES ('exam_list', '考试管理', 'root_code', 'MENU', '/admin/exam/list', 20, 1, 'icon-th-list', 'index.exam');
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,                           `i18n`)
-VALUES ('exam_student', '考生管理', 'root_code', 'MENU', '/admin/exam/student', 30, 1, 'icon-user', 'index.student');
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,                           `i18n`)
-VALUES ('exam_scan', '扫描进度', 'root_code', 'MENU', '/admin/exam/scan', 40, 1, 'icon-print', 'index.scan');
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,                           `i18n`)
-VALUES ('exam_paper', '科目管理', 'root_code', 'MENU', '/admin/exam/paper', 50, 1, 'icon-book', 'index.paper');
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,                           `i18n`)
-VALUES ('exam_mark', '评卷管理', 'root_code', 'MENU', '/admin/basic/role/info/sub/page', 60, 1, 'icon-pencil',
-        'index.mark');
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `level`, `seq`)
-VALUES ('exam_mark-mark', '评卷进度', 'exam_mark', 'PAGE', '/admin/exam/mark', 2, 1);
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `level`, `seq`)
-VALUES ('exam_mark-group', '分组管理', 'exam_mark', 'PAGE', '/admin/exam/group', 2, 2);
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_mark-group-add', '新增', 'exam_mark-group', 'BUTTON', 3, 1);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_mark-group-edit', '修改', 'exam_mark-group', 'BUTTON', 3, 2);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_mark-group-reset_edit', '重置修改', 'exam_mark-group', 'BUTTON', 3, 3);
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_mark-group-delete', '删除', 'exam_mark-group', 'BUTTON', 3, 4);
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_mark-group-help_video', '帮助视频', 'exam_mark-group', 'BUTTON', 3, 5);
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `level`, `seq`)
-VALUES ('exam_mark-marker', '评卷员管理', 'exam_mark', 'PAGE', '/admin/exam/marker', 2, 3);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_mark-marker-reset', '重置', 'exam_mark-marker', 'BUTTON', 3, 1);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `level`, `seq`)
-VALUES ('exam_mark-trial', '试评管理', 'exam_mark', 'PAGE', '/admin/exam/trial', 2, 4);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `level`, `seq`)
-VALUES ('exam_mark-library', '任务管理', 'exam_mark', 'PAGE', '/admin/exam/library', 2, 5);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_mark-library-inspect', '复核', 'exam_mark-library', 'BUTTON', 3, 1);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_mark-library-reject', '打回', 'exam_mark-library', 'BUTTON', 3, 2);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `level`, `seq`)
-VALUES ('exam_mark-arbitrate', '仲裁管理', 'exam_mark', 'PAGE', '/admin/exam/arbitrate', 2, 6);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `level`, `seq`)
-VALUES ('exam_mark-quality', '质量监控', 'exam_mark', 'PAGE', '/admin/exam/quality', 2, 7);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,
-                           `i18n`)
-VALUES ('exam_reject_list', '打回试卷', 'root_code', 'MENU', '/admin/basic/role/info/sub/page', 70, 1, 'icon-bookmark',
-        'index.reject');
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `level`, `seq`)
-VALUES ('exam_reject_list-paper', '打回卷', 'exam_reject_list', 'PAGE', '/admin/exam/reject/list', 2, 1);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `level`, `seq`)
-VALUES ('exam_reject_list-history', '打回记录', 'exam_reject_list', 'PAGE', '/admin/exam/reject/history', 2, 2);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,
-                           `i18n`)
-VALUES ('exam_problem_history', '问题试卷', 'root_code', 'MENU', '/admin/exam/problem/history', 80, 1, 'icon-tag',
-        'index.problem');
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_problem_history-reset', '重置', 'exam_problem_history', 'BUTTON', 2, 1);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_problem_history-batch_reset', '批量重置', 'exam_problem_history', 'BUTTON', 2, 2);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,
-                           `i18n`)
-VALUES ('exam_inspected_info', '成绩复核', 'root_code', 'MENU', '/admin/basic/role/info/sub/page', 90, 1, 'icon-flag',
-        'index.inspected');
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `level`, `seq`)
-VALUES ('exam_inspected_info-info', '成绩复核进度', 'exam_inspected_info', 'PAGE', '/admin/exam/inspected/info', 2, 1);
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `level`, `seq`)
-VALUES ('exam_inspected_info-list', '全卷复核', 'exam_inspected_info', 'PAGE', '/admin/exam/inspected/list', 2, 2);
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_inspected_info-next_round', '再次复核', 'exam_inspected_info-list', 'BUTTON', 3, 1);
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_inspected_info-list-help_video', '帮助视频', 'exam_inspected_info-list', 'BUTTON', 3, 2);   
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `level`, `seq`)
-VALUES ('exam_inspected_info-score_verify', '成绩校验', 'exam_inspected_info', 'PAGE', '/admin/exam/score/verify/init', 2,
-        3);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,
-                           `i18n`)
-VALUES ('exam_score', '成绩查询', 'root_code', 'MENU', '/admin/exam/score', 100, 1, 'icon-search', 'index.score');
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_score-export', '导出', 'exam_score', 'BUTTON', 2, 1);
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,
-                           `i18n`)
-VALUES ('exam_report_subject', '科目分析', 'root_code', 'MENU', '/admin/basic/role/info/sub/page', 110, 1, 'icon-asterisk',
-        'index.report.subject');
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`)
-VALUES ('exam_report_subject-total', '总量分析', 'exam_report_subject', 'PAGE', '/admin/exam/reportSubject', 10, 2);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`)
-VALUES ('exam_report_subject-range', '分段统计', 'exam_report_subject', 'PAGE', '/admin/exam/reportSubjectRange', 20, 2);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`)
-VALUES ('exam_report_subject-college', '学院分析', 'exam_report_subject', 'PAGE', '/admin/exam/reportSubjectCollege', 30,
-        2);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`)
-VALUES ('exam_report_subject-teacher', '任课老师分析', 'exam_report_subject', 'PAGE', '/admin/exam/reportSubjectTeacher', 40,
-        2);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`)
-VALUES ('exam_report_subject-class', '班级分析', 'exam_report_subject', 'PAGE', '/admin/exam/reportSubjectClass', 50, 2);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`)
-VALUES ('exam_report_subject-objective_question', '客观题分析', 'exam_report_subject', 'PAGE',
-        '/admin/exam/reportSubjectQuestion', 60, 2);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`)
-VALUES ('exam_report_subject-subjective_question', '主观题分析', 'exam_report_subject', 'PAGE',
-        '/admin/exam/reportSubjectQuestion', 70, 2);
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`)
-VALUES ('exam_report_subject-group', '大题分析', 'exam_report_subject', 'PAGE', '/admin/exam/reportSubjectGroup', 80, 2);
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,
-                           `i18n`)
-VALUES ('exam_check_answer', '数据检查', 'root_code', 'MENU', '/admin/exam/check/answer', 130, 1, 'icon-check',
-        'index.check');
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`,
-                           `i18n`)
-VALUES ('operation_log', '操作日志', 'root_code', 'MENU', '/admin/operation/log', 140, 1, 'icon-tasks', 'index.log');
-
-INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `level`, `seq`)
-VALUES ('exam_problem_history-export', '导出', 'exam_problem_history', 'BUTTON', 2, 3);
-UNLOCK TABLES;
+-- 菜单权限  
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('overview', '主页导览', 'root_code', 'MENU', 'HomeGuide', 10, 1, 'icon-bookmark', 'index.overview');
+
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('user_list', '用户管理', 'root_code', 'MENU', 'UserManage', 20, 1, 'icon-user', 'index.user');
+
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('user_list_help_video', '帮助视频', 'user_list', 'BUTTON', NULL, 10, 2, NULL, NULL);
+
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('exam_list', '考试管理', 'root_code', 'MENU', 'ExamManage', 30, 1, 'icon-th-list', 'index.exam');
+
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('exam_student', '考生管理', 'root_code', 'MENU', 'StudentManage', 40, 1, 'icon-user', 'index.student');
+
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('exam_scan', '扫描进度', 'root_code', 'MENU', 'ScanManage', 50, 1, 'icon-print', 'index.scan');
+
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('exam_paper', '科目管理', 'root_code', 'MENU', 'SubjectManage', 60, 1, 'icon-book', 'index.paper');
+
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('exam_mark', '评卷管理', 'root_code', 'MENU', 'mark', 70, 1, 'icon-pencil', 'index.mark');
+
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('mark_progress', '评卷进度', 'exam_mark', 'MENU', 'MarkProgress', 10, 2, NULL, NULL);
+	
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('subject_mark_manage', '科目评卷管理', 'exam_mark', 'MENU', 'SubjectMarkManage', 20, 2, NULL, NULL);
+
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('mark_group', '分组管理', 'subject_mark_manage', 'PAGE', NULL, 10, 3, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('group_query', '查询', 'mark_group', 'BUTTON', NULL, 10, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('group_add', '新增', 'mark_group', 'BUTTON', NULL, 20, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('group_close', '关闭评卷', 'mark_group', 'BUTTON', NULL, 30, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('group_count', '设置试评数量', 'mark_group', 'BUTTON', NULL, 40, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('group_paperview', '全卷预览', 'mark_group', 'BUTTON', NULL, 50, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('group_view', '分组预览', 'mark_group', 'BUTTON', NULL, 60, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('group_edit', '修改', 'mark_group', 'BUTTON', NULL, 70, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('group_reset_edit', '重置修改', 'mark_group', 'BUTTON', NULL, 80, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('group_delete', '删除', 'mark_group', 'BUTTON', NULL, 90, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('mark_group_help_video', '帮助视频', 'mark_group', 'BUTTON', NULL, 100, 4, NULL, NULL);
+
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('marker', '评卷员管理', 'subject_mark_manage', 'PAGE', NULL, 20, 3, NULL, NULL);
+		
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('marker_query', '查询', 'marker', 'BUTTON', NULL, 10, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('marker_enable', '启用', 'marker', 'BUTTON', NULL, 20, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('marker_disable', '禁用', 'marker', 'BUTTON', NULL, 30, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('marker_reset_pass', '重置密码', 'marker', 'BUTTON', NULL, 40, 4, NULL, NULL);
+		
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('marker_reset', '重置', 'marker', 'BUTTON', NULL, 50, 4, NULL, NULL);
+			
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('mark_trial', '试评管理', 'subject_mark_manage', 'PAGE', NULL, 30, 3, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('mark_trial_query', '查询', 'mark_trial', 'BUTTON', NULL, 10, 4, NULL, NULL);
+		
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('mark_library', '任务管理', 'subject_mark_manage', 'PAGE', NULL, 40, 3, NULL, NULL);
+		
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('mark_library_query', '查询', 'mark_library', 'BUTTON', NULL, 10, 4, NULL, NULL);
+		
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('mark_library_inspect', '复核', 'mark_library', 'BUTTON', NULL, 20, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('mark_library_view', '查看试卷', 'mark_library', 'BUTTON', NULL, 30, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('mark_library_reject', '打回', 'mark_library', 'BUTTON', NULL, 40, 4, NULL, NULL);
+			
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('mark_arbitrate', '仲裁管理', 'subject_mark_manage', 'PAGE', NULL, 50, 3, NULL, NULL);
+		
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('mark_arbitrate_query', '查询', 'mark_arbitrate', 'BUTTON', NULL, 10, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('mark_arbitrate_batch_dis', '批量处理', 'mark_arbitrate', 'BUTTON', NULL, 20, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('mark_arbitrate_dis', '处理', 'mark_arbitrate', 'BUTTON', NULL, 30, 4, NULL, NULL);
+		
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('mark_quality', '质量监控', 'subject_mark_manage', 'PAGE', NULL,60, 3, NULL, NULL);
+		
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('subject_arbitrate_report', '科目仲裁统计', 'mark_quality', 'BUTTON', NULL, 10, 4, NULL, NULL);
+			
+			INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+			VALUES ('marker_arbitrate_report', '评卷员仲裁统计', 'mark_quality', 'BUTTON', NULL, 20, 4, NULL, NULL);
+		
+		
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('reject_manage', '打回卷管理', 'root_code', 'MENU', 'back', 80, 1, 'icon-bookmark', 'index.reject');
+
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('reject_list', '打回卷', 'reject_manage', 'MENU', 'RejectManage', 10, 2, NULL, NULL);
+	
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('reject_list_query', '查询', 'reject_list', 'BUTTON', NULL, 10, 3, NULL, NULL);
+		
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('reject_list_info', '试卷详情', 'reject_list', 'BUTTON', NULL, 20, 3, NULL, NULL);
+		
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('reject_list_assigned', '任务指定', 'reject_list', 'BUTTON', NULL, 30, 3, NULL, NULL);
+		
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('reject_report', '打回统计', 'reject_manage', 'MENU', 'RejectStatistics', 20, 2, NULL, NULL);
+	
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('subject_reject_report', '科目打回统计', 'reject_report', 'BUTTON', NULL, 10, 3, NULL, NULL);
+		
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('marker_reject_report', '评卷员打回统计', 'reject_report', 'BUTTON', NULL, 20, 3, NULL, NULL);
+	
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('problem_history', '问题卷管理', 'root_code', 'MENU', 'IssuePaper', 90, 1, 'icon-tag', 'index.problem');
+
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('problem_query', '查询', 'problem_history', 'BUTTON', NULL, 10, 2, NULL, NULL);
+		
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('problem_batch_reset', '批量重置', 'problem_history', 'BUTTON', NULL, 20, 2, NULL, NULL);
+		
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('problem_export', '导出', 'problem_history', 'BUTTON', NULL, 30, 2, NULL, NULL);
+
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('problem_reset', '重置', 'problem_history', 'BUTTON', NULL, 40, 2, NULL, NULL);
+
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('inspected', '成绩复核', 'root_code', 'MENU', 'ScoreReview', 100, 1, 'icon-flag', 'index.inspected');
+
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('inspected_report', '复核进度统计', 'inspected', 'MENU', 'ScoreReviewStatistics', 10, 2, NULL, NULL);
+	
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('inspected_report_query', '查询', 'inspected_report', 'BUTTON', NULL, 10, 3, NULL, NULL);
+	
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('paper_inspected', '全卷复核', 'inspected', 'MENU', 'AllReview', 20, 2, NULL, NULL);
+	
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('paper_inspected_query', '查询', 'paper_inspected', 'BUTTON', NULL, 10, 3, NULL, NULL);
+		
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('paper_inspected_batch', '批量复核', 'paper_inspected', 'BUTTON', NULL, 20, 3, NULL, NULL);
+		
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('paper_inspected_cancel', '取消复核', 'paper_inspected', 'BUTTON', NULL, 30, 3, NULL, NULL);
+		
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('paper_inspected_track', '轨迹图', 'paper_inspected', 'BUTTON', NULL, 40, 3, NULL, NULL);
+		
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('paper_inspected_dispose', '进入复核', 'paper_inspected', 'BUTTON', NULL, 50, 3, NULL, NULL);
+	
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('paper_inspected_round', '再次复核', 'paper_inspected', 'BUTTON', NULL, 60, 3, NULL, NULL);
+		
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('paper_inspected_help_video', '帮助视频', 'paper_inspected', 'BUTTON', NULL, 70, 3, NULL, NULL);
+		
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('score_verify', '成绩校验', 'inspected', 'MENU', 'ScoreCheck', 30, 2, NULL, NULL);
+
+
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('exam_score', '成绩查询', 'root_code', 'MENU', 'ScoreQuery', 110, 1, 'icon-search', 'index.score');
+
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('exam_score_query', '查询', 'exam_score', 'BUTTON', NULL, 10, 2, NULL, NULL);
+
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('exam_score_export', '导出', 'exam_score', 'BUTTON', NULL, 20, 2, NULL, NULL);
+	
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('exam_report_subject', '科目分析', 'root_code', 'MENU', 'AnalysisManage', 120, 1, 'icon-asterisk', 'index.report.subject');
+
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('report_subject_total', '总量分析', 'exam_report_subject', 'PAGE', NULL, 10, 2, NULL, NULL);
+	
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('report_subject_total_eport', '导出总表', 'report_subject_total', 'BUTTON', NULL, 20, 2, NULL, NULL);
+		
+		INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+		VALUES ('report_subject_total_refresh', '刷新', 'report_subject_total', 'BUTTON', NULL, 20, 2, NULL, NULL);
+	
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('report_subject_range', '分段统计', 'exam_report_subject', 'PAGE', NULL, 20, 2, NULL, NULL);
+	
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('report_subject_college', '学院分析', 'exam_report_subject', 'PAGE', NULL, 30, 2, NULL, NULL);
+	
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('report_subject_teacher', '任课老师分析', 'exam_report_subject', 'PAGE', NULL, 40, 2, NULL, NULL);
+	
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('report_subject_class', '班级分析', 'exam_report_subject', 'PAGE', NULL, 50, 2, NULL, NULL);
+	
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('report_subject_objective_question', '客观题分析', 'exam_report_subject', 'PAGE', NULL, 60, 2, NULL, NULL);
+	
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('report_subject_subjective_question', '主观题分析', 'exam_report_subject', 'PAGE', NULL, 70, 2, NULL, NULL);
+	
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('report_subject_group', '大题分析', 'exam_report_subject', 'PAGE', NULL, 80, 2, NULL, NULL);
+	
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('exam_check_answer', '数据检查', 'root_code', 'MENU', 'DataCheck', 130, 1, 'icon-check', 'index.check');
+
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('manual_confirm', '人工确认', 'exam_check_answer', 'MENU', 'ManualConfirm', 10, 2, NULL, NULL);
+	
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('result_check', '识别结果检查', 'exam_check_answer', 'MENU', 'ResultCheck', 20, 2, NULL, NULL);
+	
+	INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+	VALUES ('image_check', '图片检查', 'exam_check_answer', 'MENU', 'ImageCheck', 30, 2, NULL, NULL);
+
+INSERT INTO `b_privilege` (`code`, `name`, `parent_code`, `privilege_type`, `privilege_uri`, `seq`, `level`, `icon`, `i18n`) 
+VALUES ('operation_log', '操作日志', 'root_code', 'MENU', 'LogManage', 140, 1, 'icon-tasks', 'index.log');
+

+ 19 - 0
install/mysql/upgrade/2.0.0.sql

@@ -2,6 +2,25 @@
 
 USE `stmms_ft`;
 
+DROP TABLE IF EXISTS `m_reject_type`;
+CREATE TABLE `m_reject_type`
+(
+    `id`        int(11)    NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `exam_id`   int(11)    NOT NULL COMMENT '考试ID',
+    `name`      varchar(64) DEFAULT NULL COMMENT '名称',
+    `is_custom` tinyint(1) NOT NULL COMMENT '是否自定义',
+    PRIMARY KEY (`id`),
+    KEY `index1` (`exam_id`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='打回类型表';
+
+
+
+
+
+
+
+-- 菜单权限  
 TRUNCATE TABLE  b_privilege;
 TRUNCATE TABLE  b_role_privilege;
 

+ 105 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/ExamReport.java

@@ -0,0 +1,105 @@
+package cn.com.qmth.stmms.biz.exam.bean;
+
+public class ExamReport {
+
+    private String schoolName;
+
+    private Integer year;
+
+    private Long studentCount;
+
+    private Long subjectCount;
+
+    private Long subjectiveStudentCount;
+
+    private Long objectiveStudentCount;
+
+    private Long subjectivePaperCount;
+
+    private Long objectivePaperCount;
+
+    private Long allUploadStudentCount;
+
+    private Long totalPaperCount;
+
+    public String getSchoolName() {
+        return schoolName;
+    }
+
+    public void setSchoolName(String schoolName) {
+        this.schoolName = schoolName;
+    }
+
+    public Integer getYear() {
+        return year;
+    }
+
+    public void setYear(Integer year) {
+        this.year = year;
+    }
+
+    public Long getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(Long studentCount) {
+        this.studentCount = studentCount;
+    }
+
+    public Long getSubjectCount() {
+        return subjectCount;
+    }
+
+    public void setSubjectCount(Long subjectCount) {
+        this.subjectCount = subjectCount;
+    }
+
+    public Long getSubjectiveStudentCount() {
+        return subjectiveStudentCount;
+    }
+
+    public void setSubjectiveStudentCount(Long subjectiveStudentCount) {
+        this.subjectiveStudentCount = subjectiveStudentCount;
+    }
+
+    public Long getObjectiveStudentCount() {
+        return objectiveStudentCount;
+    }
+
+    public void setObjectiveStudentCount(Long objectiveStudentCount) {
+        this.objectiveStudentCount = objectiveStudentCount;
+    }
+
+    public Long getSubjectivePaperCount() {
+        return subjectivePaperCount;
+    }
+
+    public void setSubjectivePaperCount(Long subjectivePaperCount) {
+        this.subjectivePaperCount = subjectivePaperCount;
+    }
+
+    public Long getObjectivePaperCount() {
+        return objectivePaperCount;
+    }
+
+    public void setObjectivePaperCount(Long objectivePaperCount) {
+        this.objectivePaperCount = objectivePaperCount;
+    }
+
+    public Long getAllUploadStudentCount() {
+        return allUploadStudentCount;
+    }
+
+    public void setAllUploadStudentCount(Long allUploadStudentCount) {
+        this.allUploadStudentCount = allUploadStudentCount;
+    }
+
+    public Long getTotalPaperCount() {
+        return totalPaperCount;
+    }
+
+    public void setTotalPaperCount(Long totalPaperCount) {
+        this.totalPaperCount = totalPaperCount;
+    }
+
+}

+ 55 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/ExamView.java

@@ -0,0 +1,55 @@
+package cn.com.qmth.stmms.biz.exam.bean;
+
+public class ExamView {
+
+    private Long studentCount;
+
+    private Long subjectCount;
+
+    private Long scanCount;
+
+    private Long paperCount;
+
+    private Long markedCount;
+
+    public Long getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(Long studentCount) {
+        this.studentCount = studentCount;
+    }
+
+    public Long getSubjectCount() {
+        return subjectCount;
+    }
+
+    public void setSubjectCount(Long subjectCount) {
+        this.subjectCount = subjectCount;
+    }
+
+    public Long getScanCount() {
+        return scanCount;
+    }
+
+    public void setScanCount(Long scanCount) {
+        this.scanCount = scanCount;
+    }
+
+    public Long getPaperCount() {
+        return paperCount;
+    }
+
+    public void setPaperCount(Long paperCount) {
+        this.paperCount = paperCount;
+    }
+
+    public Long getMarkedCount() {
+        return markedCount;
+    }
+
+    public void setMarkedCount(Long markedCount) {
+        this.markedCount = markedCount;
+    }
+
+}

+ 15 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/RejectTypeDao.java

@@ -0,0 +1,15 @@
+package cn.com.qmth.stmms.biz.mark.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.mark.model.RejectType;
+
+public interface RejectTypeDao
+        extends PagingAndSortingRepository<RejectType, Integer>, JpaSpecificationExecutor<RejectType> {
+
+    List<RejectType> findByExamId(Integer examId);
+
+}

+ 71 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/RejectType.java

@@ -0,0 +1,71 @@
+package cn.com.qmth.stmms.biz.mark.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "m_reject_type")
+public class RejectType implements Serializable {
+
+    private static final long serialVersionUID = 97815264735540151L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    private String name;
+
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    @Column(name = "is_custom")
+    private boolean custom;
+
+    public RejectType(Integer examId, String name, boolean custom) {
+        this.examId = examId;
+        this.name = name;
+        this.custom = custom;
+    }
+
+    public RejectType() {
+
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public boolean isCustom() {
+        return custom;
+    }
+
+    public void setCustom(boolean custom) {
+        this.custom = custom;
+    }
+
+}

+ 46 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/RejectTypeServiceImpl.java

@@ -0,0 +1,46 @@
+package cn.com.qmth.stmms.biz.mark.service.Impl;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.mark.dao.RejectTypeDao;
+import cn.com.qmth.stmms.biz.mark.model.RejectType;
+import cn.com.qmth.stmms.biz.mark.service.RejectTypeService;
+
+@Service
+public class RejectTypeServiceImpl extends BaseQueryService<RejectType> implements RejectTypeService {
+
+    @Autowired
+    private RejectTypeDao rejectTypeDao;
+
+    @Override
+    public RejectType save(RejectType p) {
+        return rejectTypeDao.save(p);
+    }
+
+    @Override
+    public RejectType findById(Integer id) {
+        return rejectTypeDao.findOne(id);
+    }
+
+    @Transactional
+    @Override
+    public void deleteById(Integer id) {
+        rejectTypeDao.delete(id);
+    }
+
+    @Override
+    public void delete(RejectType p) {
+        rejectTypeDao.delete(p);
+    }
+
+    @Override
+    public List<RejectType> findByExamId(Integer examId) {
+        return rejectTypeDao.findByExamId(examId);
+    }
+
+}

+ 19 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/RejectTypeService.java

@@ -0,0 +1,19 @@
+package cn.com.qmth.stmms.biz.mark.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.mark.model.RejectType;
+
+public interface RejectTypeService {
+
+    RejectType save(RejectType p);
+
+    RejectType findById(Integer id);
+
+    void deleteById(Integer id);
+
+    void delete(RejectType p);
+
+    List<RejectType> findByExamId(Integer examId);
+
+}

+ 4 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/BaseApiController.java

@@ -146,4 +146,8 @@ public class BaseApiController extends BaseController {
     public ApiUser getApiUser() {
         return RequestUtils.getApiUser();
     }
+
+    protected Integer getSessionExamId() {
+        return SessionExamUtils.getExamId(RequestUtils.getRequest());
+    }
 }

+ 72 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/admin/ExamController.java

@@ -1,6 +1,8 @@
 package cn.com.qmth.stmms.api.controller.admin;
 
+import java.math.BigDecimal;
 import java.util.Arrays;
+import java.util.Calendar;
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
@@ -17,11 +19,17 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import com.qmth.boot.core.collection.PageResult;
 
 import cn.com.qmth.stmms.api.controller.BaseApiController;
+import cn.com.qmth.stmms.biz.exam.bean.ExamReport;
+import cn.com.qmth.stmms.biz.exam.bean.ExamView;
 import cn.com.qmth.stmms.biz.exam.bean.ExamVo;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.biz.school.model.School;
+import cn.com.qmth.stmms.biz.school.service.SchoolService;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.utils.PageUtil;
 import cn.com.qmth.stmms.common.annotation.Logging;
@@ -41,6 +49,21 @@ public class ExamController extends BaseApiController {
 
     protected static final Logger log = LoggerFactory.getLogger(ExamController.class);
 
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Autowired
+    private SchoolService schoolService;
+
+    @Autowired
+    private ExamSubjectService examSubjectService;
+
+    @Autowired
+    private ExamStudentService examStudentService;
+
     @Autowired
     private ExamService examService;
 
@@ -156,4 +179,53 @@ public class ExamController extends BaseApiController {
             examService.save(oldExam);
         }
     }
+
+    @ResponseBody
+    @Logging(menu = "考试详情", type = LogType.QUERY)
+    @RequestMapping(value = "detail", method = RequestMethod.POST)
+    public ExamView view(@RequestParam Integer examId) {
+        ExamView ret = new ExamView();
+        Exam exam = examService.findById(examId);
+        long studentCount = examStudentService.countByExamId(exam.getId());
+        long subjectCount = examSubjectService.count(examId);
+        // long markerCount = markerService.countByExam(exam.getId());
+        long scanCount = examStudentService.countByExamIdAndUpload(examId, true);
+        long markedCount = examStudentService.countByExamIdAndSubjectiveScoreListIsNotNull(examId);
+        long sheetCount = studentCount == 0 ? 0 : examStudentService.countSheetCountByExamId(examId);
+
+        ret.setStudentCount(studentCount);
+
+        ret.setSubjectCount(subjectCount);
+        ret.setScanCount(scanCount);
+
+        long sheetCount2 = new BigDecimal(sheetCount).divide(new BigDecimal(2), 0, BigDecimal.ROUND_HALF_UP)
+                .longValue();
+
+        ret.setPaperCount(sheetCount2);
+
+        ret.setMarkedCount(markedCount);
+
+        return ret;
+    }
+
+    @ResponseBody
+    @RequestMapping(value = "report", method = RequestMethod.POST)
+    public ExamReport report(@RequestParam Integer examId) {
+        ExamReport ret = new ExamReport();
+        Exam exam = examService.findById(examId);
+        School school = schoolService.findById(exam.getSchoolId());
+        ret.setSchoolName(school.getName());
+        ret.setYear(Calendar.getInstance().get(Calendar.YEAR));
+        ret.setSubjectCount(subjectService.count(examId));
+        ret.setStudentCount(studentService.countByExamId(examId));
+        ret.setSubjectiveStudentCount(studentService.countSubjectiveByExamId(examId));
+        long totalPaperCount = studentService.countSheetCountByExamId(examId) / 2;
+        ret.setObjectiveStudentCount(studentService.countObjectiveByExamId(examId));
+        long objectivePaperCount = studentService.countObjectivePageCountByExamId(examId) / 2;
+        ret.setSubjectivePaperCount(totalPaperCount - objectivePaperCount);
+        ret.setObjectivePaperCount(objectivePaperCount);
+        ret.setAllUploadStudentCount(studentService.countAllUploadByExamId(examId));
+        ret.setTotalPaperCount(totalPaperCount);
+        return ret;
+    }
 }

+ 93 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/admin/ProblemTypeController.java

@@ -0,0 +1,93 @@
+package cn.com.qmth.stmms.api.controller.admin;
+
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import cn.com.qmth.stmms.api.controller.BaseApiController;
+import cn.com.qmth.stmms.biz.exception.StatusException;
+import cn.com.qmth.stmms.biz.mark.model.ProblemType;
+import cn.com.qmth.stmms.biz.mark.service.ProblemHistoryService;
+import cn.com.qmth.stmms.biz.mark.service.ProblemTypeService;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.domain.ApiUser;
+import cn.com.qmth.stmms.common.enums.LogType;
+
+@Controller("adminProblemTypeController")
+@RequestMapping("/api/admin/exam/problem/type")
+public class ProblemTypeController extends BaseApiController {
+
+    protected static Logger log = LoggerFactory.getLogger(ProblemTypeController.class);
+
+    @Autowired
+    private ProblemTypeService problemService;
+
+    @Autowired
+    private ProblemHistoryService historyService;
+
+    @Logging(menu = "查询问题卷分类", type = LogType.QUERY)
+    @RequestMapping(value = "list", method = RequestMethod.POST)
+    @ResponseBody
+    public List<ProblemType> list(@RequestParam Integer examId) {
+        return problemService.findByExamId(examId);
+    }
+
+    @Logging(menu = "新增问题卷分类", type = LogType.ADD)
+    @RequestMapping(value = "save", method = RequestMethod.POST)
+    @ResponseBody
+    public void save(ProblemType problem) {
+        if (problem.getExamId() == null) {
+            throw new StatusException("examId不能为空");
+        }
+        if (!StringUtils.isNotBlank(problem.getName())) {
+            throw new StatusException("名称不能为空");
+        }
+        Integer examId = problem.getExamId();
+        List<ProblemType> list = problemService.findByExamId(examId);
+        if (list.size() >= 10) {
+            throw new StatusException("问题卷类型不能超过10个");
+        }
+        problem.setCustom(true);
+        problem = problemService.save(problem);
+    }
+
+    @RequestMapping(value = "find", method = RequestMethod.POST)
+    @ResponseBody
+    public ProblemType find(@PathVariable Integer id) {
+        return problemService.findById(id);
+    }
+
+    @Logging(menu = "编辑问题卷分类", type = LogType.UPDATE)
+    @RequestMapping(value = "update", method = RequestMethod.POST)
+    @ResponseBody
+    public void update(ProblemType problem) {
+        ApiUser user = getApiUser();
+        ProblemType old = problemService.findById(problem.getId());
+        if (user.isSchoolAdmin() && StringUtils.isNotBlank(problem.getName())) {
+            old.setName(problem.getName());
+            problemService.save(old);
+        }
+    }
+
+    @Logging(menu = "删除问题卷分类", type = LogType.DELETE)
+    @RequestMapping(value = "delete", method = RequestMethod.POST)
+    @ResponseBody
+    public void delete(@RequestParam Integer id) {
+        int examId = getSessionExamId();
+        long historyCount = historyService.countByExamIdAndProblemId(examId, id);
+        if (historyCount > 0) {
+            throw new StatusException("该问题卷类型已被使用,不可删除");
+        } else {
+            problemService.deleteById(id);
+        }
+    }
+}

+ 94 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/admin/RejectTypeController.java

@@ -0,0 +1,94 @@
+package cn.com.qmth.stmms.api.controller.admin;
+
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import cn.com.qmth.stmms.api.controller.BaseApiController;
+import cn.com.qmth.stmms.biz.exception.StatusException;
+import cn.com.qmth.stmms.biz.mark.model.RejectType;
+import cn.com.qmth.stmms.biz.mark.service.ProblemHistoryService;
+import cn.com.qmth.stmms.biz.mark.service.RejectTypeService;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.domain.ApiUser;
+import cn.com.qmth.stmms.common.enums.LogType;
+
+@Controller("adminRejectTypeController")
+@RequestMapping("/api/admin/exam/reject/type")
+public class RejectTypeController extends BaseApiController {
+
+    protected static Logger log = LoggerFactory.getLogger(RejectTypeController.class);
+
+    @Autowired
+    private RejectTypeService rejectTypeService;
+
+    @Autowired
+    private ProblemHistoryService historyService;
+
+    @Logging(menu = "查询打回卷分类", type = LogType.QUERY)
+    @RequestMapping(value = "list", method = RequestMethod.POST)
+    @ResponseBody
+    public List<RejectType> list(@RequestParam Integer examId) {
+        return rejectTypeService.findByExamId(examId);
+    }
+
+    @Logging(menu = "新增打回卷分类", type = LogType.ADD)
+    @RequestMapping(value = "save", method = RequestMethod.POST)
+    @ResponseBody
+    public void save(RejectType problem) {
+        if (problem.getExamId() == null) {
+            throw new StatusException("examId不能为空");
+        }
+        if (!StringUtils.isNotBlank(problem.getName())) {
+            throw new StatusException("名称不能为空");
+        }
+        Integer examId = problem.getExamId();
+        List<RejectType> list = rejectTypeService.findByExamId(examId);
+        if (list.size() >= 10) {
+            throw new StatusException("打回卷类型不能超过10个");
+        }
+        problem.setCustom(true);
+        problem = rejectTypeService.save(problem);
+    }
+
+    @RequestMapping(value = "find", method = RequestMethod.POST)
+    @ResponseBody
+    public RejectType find(@PathVariable Integer id) {
+        return rejectTypeService.findById(id);
+    }
+
+    @Logging(menu = "编辑打回卷分类", type = LogType.UPDATE)
+    @RequestMapping(value = "update", method = RequestMethod.POST)
+    @ResponseBody
+    public void update(RejectType problem) {
+        ApiUser user = getApiUser();
+        RejectType old = rejectTypeService.findById(problem.getId());
+        if (user.isSchoolAdmin() && StringUtils.isNotBlank(problem.getName())) {
+            old.setName(problem.getName());
+            rejectTypeService.save(old);
+        }
+    }
+
+    @Logging(menu = "删除打回卷分类", type = LogType.DELETE)
+    @RequestMapping(value = "delete", method = RequestMethod.POST)
+    @ResponseBody
+    public void delete(@RequestParam Integer id) {
+        int examId = getSessionExamId();
+        long historyCount = historyService.countByExamIdAndProblemId(examId, id);// TODO
+                                                                                 // 修改校验
+        if (historyCount > 0) {
+            throw new StatusException("该打回卷类型已被使用,不可删除");
+        } else {
+            rejectTypeService.deleteById(id);
+        }
+    }
+}