Browse Source

报告图表添加

zhangjie 6 years ago
parent
commit
50206ae29c

+ 154 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/report/pdf.jsp

@@ -14,7 +14,7 @@
   
 </head>
 <body>
- <!-- body-main -->
+  <!-- body-main -->
   <div class="body-main" id="body-main">
 
   </div>
@@ -65,6 +65,67 @@
     <h2 class="page-title-2"><#:=title#></h2>
     <div class="page-chart <#:=chartClassName#>" id="<#:=chartId#>" style="height: <#:=height#>;"></div>
   </script>
+  <!-- question-table -->
+  <script id="question-table" type="text/html">
+    <h2 class="page-title-2"><#:=title#></h2>
+    <div class="page-table <#:=pageTableClass#>">
+      <table class="table table-border">
+        <tr>
+          <th>题目名称</th>
+          <th>单题总分</th>
+          <th>单题平均分</th>
+          <th>单题标准差</th>
+          <th>得分率</th>
+          <th>满分率</th>
+        </tr>
+        <# for (var i = 0;i < dataList.length; i++) {#>
+        <# var question = dataList[i] #>
+        <tr>
+          <td class="td-ques-name"><p class="question-name"><span><#:=question.name#></span><span><#:=question.number#></span></p></td>
+          <td><#:=question.fullScore#></td>
+          <td><#:=question.avgScore#></td>
+          <td><#:=question.stdevScore#></td>
+          <td><#:=question.scoreRate#></td>
+          <td><#:=question.fullRate#></td>
+        </tr>
+        <# } #>
+      </table>
+    </div>
+  </script>
+  <!-- classes-table -->
+  <script id="classes-table" type="text/html">
+    <h2 class="page-title-2"><#:=title#></h2>
+    <div class="page-table <#:=pageTableClass#>">
+      <table class="table table-border">
+        <tr>
+          <th>班级</th>
+          <th>平均分</th>
+          <th>最高分</th>
+          <th>最低分</th>
+          <th>标准差</th>
+          <th>及格数</th>
+          <th>及格率</th>
+          <th>优秀数</th>
+          <th>优秀率</th>
+        </tr>
+        <# for (var i = 0;i < dataList.length; i++) {#>
+        <# var item = dataList[i] #>
+        <tr>
+          <td class="td-class-name"><p class="class-name"><#:=item.name#></p></td>
+          <td><#:=item.avgScore#></td>
+          <td><#:=item.maxScore#></td>
+          <td><#:=item.minScore#></td>
+          <td><#:=item.stdevScore#></td>
+          <td><#:=item.passCount#></td>
+          <td><#:=item.passRate#></td>
+          <td><#:=item.excellentCount#></td>
+          <td><#:=item.excellentRate#></td>
+        </tr>
+        <# } #>
+      </table>
+    </div>
+  </script>
+
   <!-- teacher-score -->
   <script id="teacher-score" type="text/html">
     <h2 class="page-title-2">任课老师成绩分析</h2>
@@ -105,7 +166,48 @@
       </table>
     </div>
   </script>
-
+  <!-- teacher-class-table -->
+  <script id="teacher-class-table" type="text/html">
+    <h2 class="page-title-2">任课老师成绩分析</h2>
+    <div class="page-table <#:=pageTableClass#>">
+      <table class="table table-border">
+        <tr>
+          <th>任课<br>老师</th>
+          <th>班级</th>
+          <th>实考<br>人数</th>
+          <th>最高分</th>
+          <th>最低分</th>
+          <th>及格<br>人数</th>
+          <th>及格率<br>(%)</th>
+          <th>优秀<br>人数</th>
+          <th>优秀率<br>(%)</th>
+          <th>平均分</th>
+          <th>相对<br>平均分</th>
+        </tr>
+        <# for (var i = 0;i < dataList.length; i++) {#>
+        <# var classes = dataList[i].classes; #>
+        <# for (var j = 0;j < classes.length; j++) {#>
+        <# var total = classes[j] #>
+        <tr>
+          <# if (j == 0) { #>
+          <td class="<#:=classes.length <= 2 ? 'td-group-name-' + classes.length : ''#>" rowspan="<#:=classes.length#>"><p><#:=dataList[i].name#></p></td>
+          <# } #>
+          <td class="td-class-name"><p class="class-name"><#:=total.name#></p></td>
+          <td><#:=total.totalCount#></td>
+          <td><#:=total.maxScore#></td>
+          <td><#:=total.minScore#></td>
+          <td><#:=total.passCount#></td>
+          <td><#:=total.passRate100#></td>
+          <td><#:=total.excellentCount#></td>
+          <td><#:=total.excellentRate100#></td>
+          <td><#:=total.avgScore#></td>
+          <td><#:=total.relativeAvgScore#></td>
+        </tr>
+        <# } #>
+        <# } #>
+      </table>
+    </div>
+  </script>
   <!-- teacher-grade -->
   <script id="teacher-grade" type="text/html">
     <# for (var i = 0; i < chartList.length; i++) { #>
@@ -122,6 +224,55 @@
       </ul>
     </div>
   </script>
+  <!-- college-table -->
+  <script id="college-table" type="text/html">
+    <h2 class="page-title-2">学院成绩分析</h2>
+    <div class="page-table <#:=pageTableClass#>">
+      <table class="table table-border">
+        <tr>
+          <th>学生院系</th>
+          <th>平均分</th>
+          <th>最高分</th>
+          <th>最低分</th>
+          <th>及格数</th>
+          <th>及格率(%)</th>
+          <th>优秀率(%)</th>
+        </tr>
+        <# for (var i = 0;i < dataList.length; i++) {#>
+        <# var item = dataList[i] #>
+        <tr>
+          <td><#:=item.name#></td>
+          <td><#:=item.avgScore#></td>
+          <td><#:=item.maxScore#></td>
+          <td><#:=item.minScore#></td>
+          <td><#:=item.passCount#></td>
+          <td><#:=item.passRate100#></td>
+          <td><#:=item.excellentRate100#></td>
+        </tr>
+        <# } #>
+      </table>
+    </div>
+  </script>
+  <!-- question-difficulty-table -->
+  <script id="question-difficulty-table" type="text/html">
+    <h2 class="page-title-2"><#:=title#></h2>
+    <div class="page-table <#:=pageTableClass#>">
+      <table class="table table-border">
+        <tr>
+          <th><#:=title.substr(0,2)#></th>
+          <th>难度</th>
+        </tr>
+        <# for (var i = 0;i < dataList.length; i++) {#>
+        <# var item = dataList[i] #>
+        <tr>
+          <td><#:=item.name#></td>
+          <td><#:=item.difficulty#></td>
+        </tr>
+        <# } #>
+      </table>
+    </div>
+  </script>
+
   <!-- discrimination-level-table -->
   <script id="discrimination-level-table" type="text/html">
     <h2 class="page-title-2">区分度等级分布</h2>
@@ -449,6 +600,7 @@
   </script>
 
 
+
   <!-- js -->
   <script src="${ctxStatic}/report-pdf/libs/jquery-2.1.4.min.js"></script>
   <script src="${ctxStatic}/report-pdf/libs/echarts.min.4.2.0-rc2.js"></script>

+ 69 - 28
stmms-web/src/main/webapp/static/report-pdf/css/teaching.css

@@ -127,10 +127,10 @@ img {
     .page-box .page-table.page-table-pad {
       padding-top: 100px; }
     .page-box .page-table.level-table {
-      padding-top: 100px;
-      font-size: 16px; }
+      padding-top: 100px; }
       .page-box .page-table.level-table th,
       .page-box .page-table.level-table td {
+        font-size: 16px;
         padding: 7px 3px; }
       .page-box .page-table.level-table td[rowspan] {
         padding: 7px 10px;
@@ -299,33 +299,74 @@ img {
 .chart-line {
   height: 580px; }
 
-.table-level {
+.question-table td.td-ques-name {
+  width: 310px; }
+
+.question-table .question-name {
+  white-space: nowrap;
+  overflow: hidden;
+  margin: 0 auto; }
+  .question-table .question-name span {
+    display: inline-block;
+    vertical-align: middle; }
+    .question-table .question-name span:first-child {
+      margin-right: 8px;
+      max-width: 240px;
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis; }
+
+.classes-table td.td-class-name {
+  width: 240px; }
+
+.classes-table .class-name {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  margin: 0 auto;
+  max-width: 230px; }
+
+.teacher-class-table td.td-class-name {
+  width: 200px; }
+
+.teacher-class-table .class-name {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  margin: 0 auto;
+  max-width: 190px; }
+
+.table-level th,
+.table-level td {
   font-size: 16px;
-  line-height: 16px; }
-  .table-level th,
-  .table-level td {
-    padding: 7px 2px; }
-
-.table-ave-5 {
-  font-size: 18px; }
-  .table-ave-5 th,
-  .table-ave-5 td {
-    width: 20%;
-    padding: 6px 3px; }
-
-.table-ave-6 {
-  font-size: 18px; }
-  .table-ave-6 th,
-  .table-ave-6 td {
-    width: 177px;
-    padding: 6px 3px; }
-  .table-ave-6 td[rowspan] {
-    padding: 13px;
-    background: #fafafa;
-    width: auto !important;
-    word-break: break-all; }
-  .table-ave-6 .th-empty {
-    width: auto; }
+  line-height: 16px;
+  padding: 7px 2px; }
+
+.table-ave-5 th,
+.table-ave-5 td {
+  font-size: 18px;
+  width: 20%;
+  padding: 6px 3px; }
+
+.table-range-long th,
+.table-range-long td {
+  font-size: 18px;
+  padding: 4px 3px; }
+
+.table-ave-6 th,
+.table-ave-6 td {
+  font-size: 18px;
+  width: 177px;
+  padding: 6px 3px; }
+
+.table-ave-6 td[rowspan] {
+  padding: 13px;
+  background: #fafafa;
+  width: auto !important;
+  word-break: break-all; }
+
+.table-ave-6 .th-empty {
+  width: auto; }
 
 .table-tips {
   margin: 30px 39px 0;

+ 1 - 1
stmms-web/src/main/webapp/static/report-pdf/js/chart-render.js

@@ -1056,7 +1056,7 @@
         axisLabel: {
           fontSize: 19,
           margin: 20,
-          interval: 0,
+          interval: xAxisData.length <= 16 ? 0 : "auto",
           formatter: function(value) {
             return value + "-";
           }

+ 26 - 19
stmms-web/src/main/webapp/static/report-pdf/js/data-parse.js

@@ -8,7 +8,7 @@ function tofixed(num, precision) {
 }
 // paser functions
 function parseBaseQuestion(datas) {
-  return datas.map(function (item) {
+  return datas.map(function(item) {
     item.name = item.name;
     item.avgScore = tofixed(item.avgScore, 2);
     item.stdevScore = tofixed(item.stdevScore, 2);
@@ -21,16 +21,18 @@ function parseBaseQuestion(datas) {
   });
 }
 function parseBaseClass(datas) {
-  return datas.map(function (item) {
+  return datas.map(function(item) {
     item.avgScore = tofixed(item.avgScore, 2);
     item.stdevScore = tofixed(item.stdevScore, 2);
     item.excellentRate = tofixed(item.excellentRate, 2);
+    item.excellentRate100 = tofixed(item.excellentRate * 100, 2);
     item.passRate = tofixed(item.passRate, 2);
+    item.passRate100 = tofixed(item.passRate * 100, 2);
     return item;
   });
 }
 function parseBaseTeacher(datas) {
-  return datas.map(function (item) {
+  return datas.map(function(item) {
     item.avgScore = tofixed(item.avgScore, 2);
     item.excellentRate = tofixed(item.excellentRate, 2);
     item.excellentRate100 = tofixed(item.excellentRate * 100, 2);
@@ -44,7 +46,7 @@ function parseBaseTeacher(datas) {
   });
 }
 function parseBaseMainQuestion(datas) {
-  return datas.map(function (item) {
+  return datas.map(function(item) {
     item.avgScore = tofixed(item.avgScore, 2);
     item.stdevScore = tofixed(item.stdevScore, 2);
     item.coefficient = tofixed(item.coefficient, 2);
@@ -54,7 +56,7 @@ function parseBaseMainQuestion(datas) {
   });
 }
 function parseBaseQuestionOption(datas) {
-  datas.questions = datas.questions.map(function (item) {
+  datas.questions = datas.questions.map(function(item) {
     item.optionsRate = {};
     for (key in item.options) {
       item.optionsRate[key] = (
@@ -70,8 +72,8 @@ function parseBaseQuestionOption(datas) {
 }
 
 function parseDiscriminationLevel(datas) {
-  return datas.map(function (item) {
-    item.groups = item.groups.map(function (elem) {
+  return datas.map(function(item) {
+    item.groups = item.groups.map(function(elem) {
       elem.levels.excellent.questionRate = (
         (100 * elem.levels.excellent.questionCount) /
         elem.questionCount
@@ -97,8 +99,8 @@ function parseDiscriminationLevel(datas) {
   });
 }
 function parseDifficultyLevel(datas) {
-  return datas.map(function (item) {
-    item.groups = item.groups.map(function (elem) {
+  return datas.map(function(item) {
+    item.groups = item.groups.map(function(elem) {
       elem.levels.high.questionRate = (
         (100 * elem.levels.high.questionCount) /
         elem.questionCount
@@ -120,7 +122,7 @@ function parseDifficultyLevel(datas) {
   });
 }
 function parseRangeScoreLevel(datas) {
-  return datas.map(function (item) {
+  return datas.map(function(item) {
     item.rangeRate = tofixed(item.rangeRate, 2);
     item.sumRate = tofixed(item.sumRate, 2);
     return item;
@@ -129,7 +131,7 @@ function parseRangeScoreLevel(datas) {
 function parseRangeTotalScore(datas) {
   return {
     total: parseRangeScoreLevel(datas.total),
-    classes: datas.classes.map(function (item) {
+    classes: datas.classes.map(function(item) {
       return {
         name: item.name,
         ranges: parseRangeScoreLevel(item.ranges)
@@ -138,10 +140,10 @@ function parseRangeTotalScore(datas) {
   };
 }
 function parseRangeSegment(datas) {
-  return datas.map(function (item) {
+  return datas.map(function(item) {
     return {
       name: item.name,
-      groups: item.groups.map(function (elem) {
+      groups: item.groups.map(function(elem) {
         return {
           name: elem.name,
           segments: parseRangeScoreLevel(elem.segments)
@@ -153,7 +155,6 @@ function parseRangeSegment(datas) {
 
 // data-parse
 function dataParse(dataStatic) {
-
   var cover = {
     examName: dataStatic.examName,
     schoolName: dataStatic.schoolName,
@@ -168,8 +169,12 @@ function dataParse(dataStatic) {
   var basic_class = parseBaseClass(dataStatic.basic_class);
   var basic_teacher = parseBaseTeacher(dataStatic.basic_teacher);
   var basic_college = parseBaseClass(dataStatic.basic_college);
-  var basic_main_question = parseBaseMainQuestion(dataStatic.basic_main_question);
-  var basic_question = basic_question_objective.concat(basic_question_subjective);
+  var basic_main_question = parseBaseMainQuestion(
+    dataStatic.basic_main_question
+  );
+  var basic_question = basic_question_objective.concat(
+    basic_question_subjective
+  );
 
   var discrimination_level = parseDiscriminationLevel(
     dataStatic.discrimination_level
@@ -179,7 +184,9 @@ function dataParse(dataStatic) {
     dataStatic.basic_question_option
   );
   var range_level = dataStatic.range_level;
-  var range_10_totalScore = parseRangeTotalScore(dataStatic.range_10_totalScore);
+  var range_10_totalScore = parseRangeTotalScore(
+    dataStatic.range_10_totalScore
+  );
   var range_1_totalScore = parseRangeTotalScore(dataStatic.range_1_totalScore);
   var range_segment_6 = parseRangeSegment(dataStatic.range_segment_6);
 
@@ -198,6 +205,6 @@ function dataParse(dataStatic) {
     range_level: range_level,
     range_10_totalScore: range_10_totalScore,
     range_1_totalScore: range_1_totalScore,
-    range_segment_6: range_segment_6,
-  }
+    range_segment_6: range_segment_6
+  };
 }

+ 97 - 14
stmms-web/src/main/webapp/static/report-pdf/js/teaching.js

@@ -9,42 +9,90 @@ publishReady();
 function build() {
   if (dataStatic.code && dataStatic.code === "500") {
     var hTmpl = $("#page-error").html();
-    var $dom = tmpl(hTmpl, { message: dataStatic.message });
+    var $dom = tmpl(hTmpl, {
+      message: dataStatic.message
+    });
     $bodyMain.append(createNewBox($dom));
     return;
   }
   var datas = dataParse(dataStatic);
 
   createCover(datas.cover);
+
+  // 客观题成绩分析
+  createTableList(
+    datas.basic_question_objective,
+    32,
+    "客观题成绩分析",
+    "question-table"
+  );
   createBarPointChart(
     datas.basic_question_objective,
     26,
     "客观题成绩分析",
     "barPointTopic"
   );
+
+  // 主观题成绩分析
+  createTableList(
+    datas.basic_question_subjective,
+    32,
+    "主观题成绩分析",
+    "question-table"
+  );
   createBarPointChart(
     datas.basic_question_subjective,
     26,
     "主观题成绩分析",
     "barPointTopic"
   );
+
+  // 班级成绩分析
+  createTableList(datas.basic_class, 32, "班级成绩分析", "classes-table");
   createBarPointChart(datas.basic_class, 22, "班级成绩分析", "barPointGrade");
+
+  // 任课老师成绩分析
   createTeacherScore(datas.basic_teacher);
   createTeacherGrade(datas.basic_teacher);
+
+  // 学院成绩分析;
+  createTableList(datas.basic_college, 32, "学院成绩分析", "college-table");
   createBarPointChart(datas.basic_college, 22, "学院成绩分析", "barPointGrade");
+
+  // 大题难度分析
   createLineChart(datas.basic_main_question);
+
+  // 小题难度分析
   createLineReverseChart(datas.basic_question); // basic_sub_question
+
+  // 区分度分析
   createDiscriminationDifficultyLevel(
     datas.discrimination_level,
     "discrimination"
   );
+
+  // 大题难度等级构成分析
   createDiscriminationDifficultyLevel(datas.difficulty_level, "difficulty");
-  createBasicQuestion(datas.basic_question);
+
+  // 大题结构特征
   createBasicMainQuestion(datas.basic_main_question);
+
+  // 题目统计特征
+  createBasicQuestion(datas.basic_question);
+
+  // 选项分析
   createBasicQuestionOption(datas.basic_question_option);
+
+  // 考生分段比例;
   createRangeLevel(datas.range_level);
+
+  // 频率分布分析
   createRange10TotalScore(datas.range_10_totalScore);
+
+  // 一分一段分析
   createRangeTotalScore(datas.range_1_totalScore);
+
+  // 六段频率
   createRangeSegment(datas.range_segment_6);
   createEchart();
   fillCatalogNum();
@@ -65,6 +113,20 @@ function createCover(cover) {
   var $dom = $(tmpl(hTmpl, cover));
   $bodyMain.append($dom);
 }
+
+// 题型成绩分析,班级成绩分析,学院成绩分析, 题目难度
+function createTableList(dataList, splitRange, title, tableType) {
+  var hTmpl = $("#" + tableType).html();
+  sectionArr(dataList, splitRange).forEach(function(item) {
+    var $dom = tmpl(hTmpl, {
+      title: title,
+      pageTableClass: tableType + " level-table",
+      dataList: item
+    });
+    $bodyMain.append(createNewBox($dom));
+  });
+}
+
 // 题型成绩分析,班级成绩分析,学院成绩分析
 function createBarPointChart(dataList, splitRange, title, chartType) {
   var hTmpl = $("#page-chart").html();
@@ -131,7 +193,17 @@ function createTeacherGrade(dataList) {
       });
     }
   });
+  // class-table
+  var classHTmpl = $("#teacher-class-table").html();
+  groupSectionArrDynamic(dataList, 32, "classes").forEach(function(item) {
+    var $dom = tmpl(classHTmpl, {
+      dataList: item,
+      pageTableClass: "teacher-class-table level-table"
+    });
+    $bodyMain.append(createNewBox($dom));
+  });
 
+  // class-chart
   sectionArr(sectionDataList, 3).forEach(function(item) {
     var chartList = item.map(function(elem) {
       var chartId = getEchartId();
@@ -152,6 +224,9 @@ function createTeacherGrade(dataList) {
 // 大题难度分析
 function createLineChart(dataList) {
   if (!dataList.length) return;
+  // table-parse
+  createTableList(dataList, 32, "大题难度分析", "question-difficulty-table");
+
   if (dataList.length > 6) {
     createLineReverseChart(dataList, "大题难度分析");
     return;
@@ -173,6 +248,9 @@ function createLineChart(dataList) {
 }
 // 小题难度分析
 function createLineReverseChart(dataList, tableName) {
+  // table-parse
+  createTableList(dataList, 32, "小题难度分析", "question-difficulty-table");
+
   var hTmpl = $("#page-chart").html();
   sectionArr(dataList, 46).forEach(function(item) {
     var chartId = getEchartId();
@@ -192,7 +270,7 @@ function createLineReverseChart(dataList, tableName) {
 // 区分度等级分布,难度等级分布
 function createDiscriminationDifficultyLevel(dataList, type) {
   var hTmpl = $("#" + type + "-level-table").html();
-  groupSectionArrDynamic(dataList, 30).forEach(function(item) {
+  groupSectionArrDynamic(dataList, 30, "groups").forEach(function(item) {
     var $dom = tmpl(hTmpl, {
       dataList: item
     });
@@ -273,14 +351,19 @@ function createRange10TotalScore(datas) {
         dataList: item.dataList
       }
     });
-    var $dom = tmpl(hTmpl, {
-      title: item.title,
-      isOneStep: false,
-      pageTableClass: "table-ave-5",
-      dataList: item.dataList,
-      chartId: chartId
+    sectionArrFirstPage(item.dataList, 32, 22).map(function(elem, index) {
+      var pageTableClass =
+        elem.length > 16 ? "table-ave-5 table-range-long" : "table-ave-5";
+      if (index > 0) pageTableClass += " page-table-pad";
+      var $dom = tmpl(hTmpl, {
+        title: item.title,
+        isOneStep: false,
+        pageTableClass: pageTableClass,
+        dataList: elem,
+        chartId: index === 0 ? chartId : ""
+      });
+      $bodyMain.append(createNewBox($dom));
     });
-    $bodyMain.append(createNewBox($dom));
   });
 }
 // 总分一分一段表
@@ -450,21 +533,21 @@ function sectionArrDynamic(arrayList, sectionMaxItemLength, childrenName) {
  * @param {*} sectionMaxItemLength
  * @param {*} childrenName
  */
-function groupSectionArrDynamic(arrayList, sectionMaxItemLength) {
+function groupSectionArrDynamic(arrayList, sectionMaxItemLength, childrenName) {
   var splitArr = [];
   var splitSectionItemLen = 0;
   var splitSectionArr = [];
 
   arrayList.map(function(item) {
     var groupsList = [];
-    item.groups.map(function(elem) {
+    item[childrenName].map(function(elem) {
       splitSectionItemLen++;
       groupsList.push(elem);
 
       if (splitSectionItemLen >= sectionMaxItemLength) {
         splitSectionArr.push({
           name: item.name,
-          groups: groupsList
+          [childrenName]: groupsList
         });
         splitArr.push(splitSectionArr);
         splitSectionItemLen = 0;
@@ -476,7 +559,7 @@ function groupSectionArrDynamic(arrayList, sectionMaxItemLength) {
     if (groupsList.length)
       splitSectionArr.push({
         name: item.name,
-        groups: groupsList
+        [childrenName]: groupsList
       });
   });
   if (splitSectionArr.length) splitArr.push(splitSectionArr);