1
0
Prechádzať zdrojové kódy

新增客观题分段统计计算脚本

yin 1 rok pred
rodič
commit
e4b5324010

+ 20 - 0
install/mysql/init/stmms_ft.sql

@@ -1149,6 +1149,26 @@ CREATE TABLE `s_basic_subject_teacher_class`
   DEFAULT CHARSET = utf8mb4 COMMENT ='任课老师班级统计表';
 
 
+# Dump of table s_basic_subject
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `s_basic_subject_range`;
+CREATE TABLE `s_basic_subject_range`
+(
+    `id`                   int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `exam_id`              int(11)     DEFAULT NULL COMMENT '考试ID',
+    `subject_code`         varchar(32) DEFAULT NULL COMMENT '科目代码',
+    `subject_name`         varchar(32) DEFAULT NULL COMMENT '科目名称',
+    `reality_count`        int(11)     DEFAULT NULL COMMENT '有效人数',
+    `objective_score`      double      DEFAULT NULL COMMENT '客观题分',
+    `total_count`          int(11)     DEFAULT NULL COMMENT '总人数',
+    `objective_score_range` text 	   DEFAULT NULL COMMENT '分数分布',
+    PRIMARY KEY (`id`),
+    KEY `index1` (`exam_id`, `subject_code`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='科目客观题分段统计表';
+
+
 # Dump of table eb_import_query
 # ------------------------------------------------------------
 

+ 16 - 0
install/mysql/upgrade/1.5.0.sql

@@ -9,3 +9,19 @@ ALTER TABLE m_arbitrate_history ADD COLUMN `question_index` text        DEFAULT
 
 update eb_mark_group set arbitrate_type='GROUP' where double_rate is not null and double_rate>0;
 ALTER TABLE  eb_exam_subject MODIFY COLUMN `inspect_round` 	INT (11) NOT NULL DEFAULT 1 COMMENT '复核轮数';
+
+DROP TABLE IF EXISTS `s_basic_subject_range`;
+CREATE TABLE `s_basic_subject_range`
+(
+    `id`                   int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `exam_id`              int(11)     DEFAULT NULL COMMENT '考试ID',
+    `subject_code`         varchar(32) DEFAULT NULL COMMENT '科目代码',
+    `subject_name`         varchar(32) DEFAULT NULL COMMENT '科目名称',
+    `reality_count`        int(11)     DEFAULT NULL COMMENT '有效人数',
+    `objective_score`      double      DEFAULT NULL COMMENT '客观题分',
+    `total_count`          int(11)     DEFAULT NULL COMMENT '总人数',
+    `objective_score_range` text 	   DEFAULT NULL COMMENT '分数分布',
+    PRIMARY KEY (`id`),
+    KEY `index1` (`exam_id`, `subject_code`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='科目客观题分段统计表';

+ 29 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportServiceImpl.java

@@ -260,7 +260,7 @@ public class ReportServiceImpl implements ReportService {
                 // 结束统计
                 context.saveObjective();
                 // 生成文件
-                // reoprtExcel(examId, subjectCode);
+                reoprtExcelObjective(examId, subjectCode);
             } catch (Exception e) {
                 log.error("report exception for examId=" + examId + ", subjectCode=" + subjectCode, e);
             } finally {
@@ -333,6 +333,10 @@ public class ReportServiceImpl implements ReportService {
         uploadGroup(examId, subjectCode, findExamSubject(examId, subjectCode).getName(), "分组统计分析");
     }
 
+    private void reoprtExcelObjective(int examId, String subjectCode) throws IOException, Exception {
+        uploadObjectiveRange(examId, subjectCode, findExamSubject(examId, subjectCode).getName(), "课程客观题分段统计");
+    }
+
     private void uploadGroup(int examId, String subjectCode, String subjectName, String name)
             throws IOException, Exception {
         ReportSubjectQuery query = new ReportSubjectQuery();
@@ -448,6 +452,30 @@ public class ReportServiceImpl implements ReportService {
                 FormatType.XLSX);
     }
 
+    private void uploadObjectiveRange(int examId, String subjectCode, String subjectName, String name)
+            throws IOException, Exception {
+        List<ReportSubjectRangeDTO> list = new ArrayList<ReportSubjectRangeDTO>();
+        ReportSubjectRange subject = reportSubjectRangeService.findOne(examId, subjectCode);
+        if (subject != null) {
+            JSONArray array = getScoreRange(subject.getObjectiveScoreRange(), subject.getObjectiveScore(), subject.getRealityCount(),
+                    10);
+            for (int i = 0; i < array.size(); i++) {
+                JSONObject jsonObject = array.getJSONObject(i);
+                Integer score = jsonObject.getInt("score");
+                Integer rangeCount = jsonObject.getInt("rangeCount");
+                Double rangeRate = jsonObject.getDouble("rangeRate");
+                list.add(new ReportSubjectRangeDTO(score + "<=X<" + (score + 10), rangeCount, rangeRate));
+            }
+        }
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        new ExportExcel(name, ReportSubjectRangeDTO.class).setDataList(list).write(os);
+        os.flush();
+        byte[] value = os.toByteArray();
+        String md5 = CodecUtils.toHexString(CodecUtils.md5(value));
+        fileService.uploadReport(new ByteArrayInputStream(value), md5, examId, subjectCode + "-" + subjectName, name,
+                FormatType.XLSX);
+    }
+
     private void uploadRange(int examId, String subjectCode, String subjectName, String name)
             throws IOException, Exception {
         List<ReportSubjectRangeDTO> list = new ArrayList<ReportSubjectRangeDTO>();

+ 11 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/ReportContext.java

@@ -76,7 +76,17 @@ public class ReportContext {
     }
 
     public void processObjective(ExamStudent student) {
-        putMap(student);
+        subjectMap.put(student.getSubjectCode(), student.getSubject());
+        for (ExamQuestion question : student.getObjectiveQuestionList()) {
+            String key = getQuestionKey(question);
+            if (questionMap.get(key) == null) {
+                questionMap.put(key, question);
+            }
+            String groupKey = getGroupKey(question);
+            if (groupMap.get(groupKey) == null) {
+                groupMap.put(groupKey, question);
+            }
+        }
         this.objectiveModule.process(student);
     }
 

+ 10 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectRangeController.java

@@ -113,7 +113,7 @@ public class ReportSubjectRangeController extends BaseExamController {
         int examId = getSessionExamId(request);
         List<ExamSubject> sList = getExamSubject(examId, wu);
         if (StringUtils.isNotBlank(query.getSubjectCode()) && query.getRange() != null) {
-            if (query.getObjective()) {
+            if (query.getObjective()!=null && query.getObjective()) {
                 ReportSubjectRange subjectRange = reportSubjectRangeService.findOne(examId, query.getSubjectCode());
                 if (subjectRange != null && subjectRange.getObjectiveScoreRange() != null
                         && subjectRange.getObjectiveScore() != null && subjectRange.getRealityCount() != null) {
@@ -130,6 +130,9 @@ public class ReportSubjectRangeController extends BaseExamController {
             }
             model.addAttribute("locked",
                     lockService.isLocked(LockType.SCORE_CALCULATE, examId, query.getSubjectCode()));
+            model.addAttribute("showObjective",subjectService.find(examId,query.getSubjectCode()).getObjectiveScore()>0);
+        }else if(!sList.isEmpty()){
+            model.addAttribute("showObjective",sList.get(0).getObjectiveScore()>0);
         }
         model.addAttribute("oldSubjectCode", query.getSubjectCode());
         model.addAttribute("subjectList", sList);
@@ -191,6 +194,10 @@ public class ReportSubjectRangeController extends BaseExamController {
             writer.write(new ByteArrayInputStream(subjective), subjectName, "主观题分析.xlsx");
             byte[] group = fileService.downloadReport(examId, subjectName, "分组统计分析", FormatType.XLSX);
             writer.write(new ByteArrayInputStream(group), subjectName, "分组统计分析.xlsx");
+            if(fileService.reportExist(examId, subjectName, "课程客观题分段统计", FormatType.XLSX)){
+                byte[] objectiveRange = fileService.downloadReport(examId, subjectName, "课程客观题分段统计", FormatType.XLSX);
+                writer.write(new ByteArrayInputStream(objectiveRange), subjectName, "课程客观题分段统计.xlsx");
+            }
         }
     }
 
@@ -208,10 +215,10 @@ public class ReportSubjectRangeController extends BaseExamController {
             Map<Integer, Set<String>> map = new HashMap<Integer, Set<String>>();
             map.put(examId, subjectSet);
             if (objective) {
-                ScoreReportThread thread = new ScoreReportThread(map, reportService, false);
+                ScoreReportObjectiveThread thread = new ScoreReportObjectiveThread(map, reportService, false);
                 taskExecutor.submit(thread);
             } else {
-                ScoreReportObjectiveThread thread = new ScoreReportObjectiveThread(map, reportService, false);
+                ScoreReportThread thread = new ScoreReportThread(map, reportService, false);
                 taskExecutor.submit(thread);
             }
         }

+ 15 - 3
stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectRange.jsp

@@ -34,7 +34,7 @@
         <label data-i18n-text="report.range.subject">科目</label>
         <select class="input-large" id="subjectCode" name="subjectCode">
             <c:forEach items="${subjectList }" var="subject">
-                <option value="${subject.code }"
+                <option data-score="${subject.objectiveScore}" value="${subject.code }"
                         <c:if test="${query.subjectCode eq subject.code }">selected</c:if>>${subject.code}-${subject.name}</option>
             </c:forEach>
         </select>
@@ -44,10 +44,15 @@
                 <option value="10" <c:if test="${query.range ==10 }">selected</c:if>>十分一段</option>
                  <option value="5" <c:if test="${query.range ==5 }">selected</c:if>>五分一段</option>
         </select>
-        &nbsp;
+
+        <span class="<c:if test="${!showObjective}">hide</c:if>" id="objectiveDiv">
+        <label>仅统计客观题</label>
+        <input type="checkbox" id="objective" name="objective" <c:if test="${query.objective}">checked</c:if>/>
+        </span>
+
         <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()" data-i18n-value="report.group.search"/>
 		<c:if test="${query.subjectCode!=null && oldSubjectCode!=null}">
-		<a id="refresh" href="<c:if test="${locked}">#</c:if><c:if test="${!locked}">${ctx}/admin/exam/reportSubjectRange/report?subjectCode=${query.subjectCode}</c:if>" class="btn" <c:if test="${locked}">disabled="disabled"</c:if>>刷新</a>
+		<a id="refresh" href="<c:if test="${locked}">#</c:if><c:if test="${!locked}">${ctx}/admin/exam/reportSubjectRange/report?subjectCode=${query.subjectCode}&objective=${query.objective}</c:if>" class="btn" <c:if test="${locked}">disabled="disabled"</c:if>>刷新</a>
 		</c:if>
 		&nbsp;
 		<div class="btn-group">
@@ -118,6 +123,13 @@ $('#subjectCode').change(function () {
     	$('#btnSubmit').attr("type","hidden");
     	$('#refresh').show();
     }
+
+    var objectiveScore =  $('#subjectCode').find("option:selected").attr("data-score");
+    if (objectiveScore >0) {
+        $('#objectiveDiv').show();
+    } else {
+        $('#objectiveDiv').hide();
+    }
 });
 
 $("#export-button").click(function(){