11wqe1 2 meses atrás
pai
commit
56fad910ef

+ 206 - 109
src/components/pages/components/exportDataDialog.vue

@@ -255,8 +255,8 @@ export default {
 
       // 分数工具柱状图开始
       columnData: [
-        { name: "分组工具", data: [] },
-        { name: "其他", data: [] }
+        { name: "个人", data: [] },
+        { name: "合作", data: [] }
       ],
       // 分数工具柱状图结束
 
@@ -286,8 +286,8 @@ export default {
       xk: [28, 31, 39, 66, , 68, 69, 70],
       // 师生互动工具list
       TeaStuInt: [7, 1, 52, 3, 48, 15, 16, 50, 57],
-      // 处理过的分组
-      TeaStuInt2: [1, 3, 5, 4, 10, 13, 15],
+      // 处理过的分组,师生互动数据
+      TeaStuInt2: [1, 3, 5, 4, 10, 11, 13, 15],
 
       subject: [], //课程分类
       AiAnalysisCon: "", //ai数据分析
@@ -334,56 +334,114 @@ export default {
   methods: {
     // ai评价分析
     async getAiAnalysisCon() {
-      let messages = `NOTICE
-      Role:你是一个学生学习行为分析专家,你要根据线上学习平台的数据分析,在学习状态、学习效果、学习动力、学习积极性等方面评估学生,评估后生成学生学习画像和学习建议。你可以自行扩充评估的角度,实现相对全面的评估。
-      Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
-      ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
-      Instruction: Based on the context, follow "Format example", write content.
-
-      #Context
-      ##要求
-      学生进行了线上平台和线下授课相结合的混合式学习,线上平台会记录学生的学习行为,并对数据进行简单的分析
-      只输出分析结果不要输出无关内容
+
+
+      // 师生在线互动次数
+      let tea = 0;
+      this.interactWork.forEach(e=>{
+        tea += e.length
+      })
+
+      let cla = 0
+      this.classSco.forEach(e=>{
+        cla += e *1
+      })
+
+      let cla2 = ''
+      this.classSco.forEach((e,index)=>{
+        cla2 += `${this.cState == 1?'阶段':'任务'}${index + 1}:${e}分,`
+      })
+
+      let repeatWork = this.newArrFn(this.data3);
+      // let repeatWorkCopy = [];
+      // 学生使用工具次数
+      // let repeatWorkCopy2 = [];
+
+      // this.stageList.forEach((e, index) => {
+      //   repeatWorkCopy[index] = [];
+      //   repeatWorkCopy2[index] = 0;
+      // });
+      // // 将作业进行阶段分类
+      // repeatWork.forEach(e => {
+      //   repeatWorkCopy[e.stage].push(e);
+      // });
+
+      // repeatWorkCopy.forEach((e,index)=>{
+      //   repeatWorkCopy2[index] = e.length
+      // })
+
+      // console.log('this.repeatWorkCopy2',this.repeatWorkCopy2);
       
-      ##风格
-      专业的
 
-      ##语气
-      陈述
+      let toolSy= ''
+      this.stageListPer.forEach((e,index)=>{
+        toolSy += `${this.cState == 1?'阶段':'任务'}${index + 1}:${e},`
+      })
 
-      ##受众
-      教师和教育管理者
+      let toolSy2= ''
+      this.classStageListPer.forEach((e,index)=>{
+        toolSy2 += `${this.cState == 1?'阶段':'任务'}${index + 1}:${e},`
+      })
+
+
+      let xieZuo = 0
+      // 协作占比
+      if (repeatWork.filter(item => item.type === 11).length == 0 || repeatWork.length == 0) {
+          xieZuo = 0
+      }else{
+          xieZuo = repeatWork.filter(item => item.type === 11).length / repeatWork.length
+      }
+
+      let duLi = 1 - xieZuo
+      
 
-      ##分析数据
-      学习成绩满分为5分
 
-      登录时长:${this.loginTime}
-      课程学习时长:${this.studyTime}
-      课程学习成绩:${this.star}
+      let int = []
+      this.interactWork.forEach((e,index)=>{
+        int[index] = e.length
+      })
+      let intnum = 0
+      int.forEach(e=>{
+        intnum += e*1
+      })
 
-      学生作业提交率:${this.stageListPer}
-      班级作业平均提交率:${this.classStageListPer}
+      // 任务的分
+      let renwu = ''
+      this.scoFoldLineData.forEach((e,index)=>{
+        renwu += `${this.cState == 1?'阶段':'任务'}${index + 1}:${e}分,`
+      })
 
-      师生互动次数:${this.interactWork}
-      班级师生互动平均次数:${this.classSco}
 
-      学生主动互动次数:${this.stuInterAllLike}
-      班级学生主动互动平均次数:${this.classSco}
 
-      学生主动被动次数:${this.bdStuInterAllLike}
-      班级学生主动被动平均次数:${this.classSco}
+      let messages = `Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
 
-      个人成绩:${this.scoFoldLineData}
-      班级平均成绩:${this.classSco}
+        ##上下文##
+        学生进行了线上平台和线下授课相结合的混合式学习,线上平台会记录学生的学习行为,并对数据进行简单的分析。
 
-      #输出要求#
-      根据分析数据中的数据,对学生在本次课程中的每个${
-        this.cState == 1 ? "阶段" : "任务"
-      }进行学生与班级平均数据进行对比分析
+        ##目标##
+        你是一个学生学习行为分析专家,你要根据线上学习平台的数据分析,在学习状态、学习效果、学习动力、学习积极性等方面评估学生,评估后生成学生学习画像和学习建议。你可以自行扩充评估的角度,实现相对全面的评估。
 
+        ##风格##
+        专业的
 
-      # Format example
-      该课程学习过程中,学生登录时长共1天2小时(班级前25%),学习时长共6小时(班级前25%),使用平台工具22次(班级前25%)。学生进行了科学、数学、美术学科的学习与实践。学生课程得分为4.4/5.0,高于班级平均得分。在课程的每个阶段,学生使用工具次数大多数高于或等于班级平均值,大多数任务能准时提交,有1次未交和2次迟交,师生在线互动次数全部高于或等于班级平均值,生生在线互动次数全部高于或等于班级平均值,协作完成的任务占总任务数量的36.6%,独立完成的任务占63.3%,学生阶段任务得分大多数高于或等于班级平均值。
+        ##语气##
+        陈述
+
+        ##受众##
+        教师和教育管理者
+
+        下面是线上平台的<<数据分析>>
+
+        
+
+        <<该课程学习过程中,学生登录时长共${this.loginTime},学习时长共${this.studyTime},使用平台工具${this.data3.length}次。
+        学生进行了${this.subject.join(',')}的学习与实践。
+        学生课程得分为${this.star}/5.0。
+        在课程的每个阶段,学生作业提交率${toolSy},班级平均值 ${toolSy2},
+        师生在线互动次数${intnum},班级平均值 ${cla},
+        生生在线互动次数${this.bdStuInterAllLike.length + this.stuInterAllLike.length},班级平均值 ${cla},
+        协作完成的任务占总任务数量的${xieZuo},独立完成的任务占${duLi},
+        学生阶段任务得分${renwu},班级平均值${cla2}。>>
       `;
       // this.aiGet2(msg)
       let params = {
@@ -459,10 +517,12 @@ export default {
     async downPdf() {
       this.loading = true;
       this.tableData = this.multipleSelection;
+
       if (!this.tableData.length) {
         this.loading = false;
         return this.$message.info("请选择数据后,再进行导出");
       }
+
       if (this.tableData.length == 1) {
         this.uid2 = this.tableData[0].userid;
         this.worksDialogCon2 = this.tableData[0];
@@ -471,51 +531,52 @@ export default {
           // console.log('res.data[10]',res.data[10]);
           let Asd = this.data10[0].jsonTxt;
           this.AiAnalysisCon = JSON.parse(Asd).comprehensive;
+          this.loading = false;
         } else {
           await this.getAiAnalysisCon();
+          this.loading = false;
         }
         this.loading = false;
 
-        await this.getPdf();
+        setTimeout(() => {
+          this.getPdf();
+        }, 500);
       } else {
         this.circulatePdf();
       }
     },
     // 下载pdf文件
-    async getPdf() {
+    getPdf() {
       let domHeight = this.$refs.reportPdf.offsetHeight;
       // console.log('this.$refs.reportPdf',this.$refs.reportPdf.offsetHeight);
       let maxHeight = 64257;
-      return new Promise((resolve, reject) => {
-        html2canvas(this.$refs.reportPdf, {
-          useCORS: true, // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题
-          scale: maxHeight / domHeight > 1 ? 1 : maxHeight / domHeight
+      html2canvas(this.$refs.reportPdf, {
+        useCORS: true, // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题
+        scale: maxHeight / domHeight > 1 ? 1 : maxHeight / domHeight
+      })
+        .then(canvas => {
+          const contentWidth = canvas.width;
+          const contentHeight = canvas.height;
+
+          var pageData = canvas.toDataURL("image/jpeg", 1.0);
+
+          var pdf = new jspdf("", "pt", [contentWidth, contentHeight]);
+
+          //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
+          //当内容未超过pdf一页显示的范围,无需分页
+          // if (leftHeight < pageHeight) {
+          pdf.addImage(pageData, "JPEG", 0, 0, contentWidth, contentHeight);
+
+          pdf.save(
+            this.worksDialogCon2.course +
+              "-学生成长报告-" +
+              this.worksDialogCon2.sName +
+              ".pdf"
+          );
         })
-          .then(canvas => {
-            const contentWidth = canvas.width;
-            const contentHeight = canvas.height;
-
-            var pageData = canvas.toDataURL("image/jpeg", 1.0);
-
-            var pdf = new jspdf("", "pt", [contentWidth, contentHeight]);
-
-            //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
-            //当内容未超过pdf一页显示的范围,无需分页
-            // if (leftHeight < pageHeight) {
-            pdf.addImage(pageData, "JPEG", 0, 0, contentWidth, contentHeight);
-
-            pdf.save(
-              this.worksDialogCon2.course +
-                "-学生成长报告-" +
-                this.worksDialogCon2.sName +
-                ".pdf"
-            );
-            return resolve();
-          })
-          .catch(err => {
-            console.log(err);
-          });
-      });
+        .catch(err => {
+          console.log(err);
+        });
     },
     // 获取所有作业然后一键打包压缩包
     getWorks1() {
@@ -651,14 +712,17 @@ export default {
             });
 
             // 0 课程信息
-            // 1获取登录时长
-            // 3获取学习时长
-            //  4获取学生提交作业
-            //  5获取单个学生作业分数
-            //  6获取教师评价作业
-            //  7获取所有学生提交作业
-            //  8学生点赞评论次数
-            //  9学生被点赞评论次数
+            // 1获取登录时长】
+            // 2获取登录时长
+
+            //  3获取学生提交作业
+            //  4获取单个学生作业分数
+            //  5获取教师评价作业
+            //  6获取所有学生提交作业
+            //  7学生点赞评论次数
+            //  8学生被点赞评论次数
+            //  8学科
+            // 9是否上传过学情分析
             let oneTime = 0;
             res.data[1].forEach(e => {
               oneTime += e.text * 1;
@@ -1346,7 +1410,7 @@ export default {
 
       const option = {
         title: {
-          text: "分组工具占比",
+          text: "完成任务方式占比",
           left: "left",
           textStyle: {
             color: "rgba(140, 140, 140, 1)", // 标题颜色
@@ -1355,12 +1419,22 @@ export default {
           }
         },
         legend: {
-            data: this.columnData.map(item => item.name),  // 设置图例的数据为系列的名称
-            orient: "vertical", // 设置为垂直排列
-            right: 10
+          data: this.columnData.map(item => item.name), // 设置图例的数据为系列的名称
+          orient: "vertical", // 设置为垂直排列
+          right: 10
         },
         tooltip: {
-          trigger: "axis"
+          trigger: "axis",
+          formatter: function(params) {
+            var res = "";
+            for (var i = 0, l = params.length; i < l; i++) {
+              if (i == 0) {
+                res += params[i].name + "<br/>";
+              }
+              res += params[i].seriesName + ": " + params[i].value + "%<br/>";
+            }
+            return res;
+          }
           // axisPointer: {
           //   type: "shadow"
           // },
@@ -1372,9 +1446,10 @@ export default {
         },
         yAxis: {
           type: "value",
-          // axisLabel: {
-          //   formatter: "{value}%"
-          // },
+          axisLabel: {
+            formatter: "{value}%"
+          },
+          max: 100
         },
         series: this.columnData.map(item => ({
           name: item.name,
@@ -1383,7 +1458,7 @@ export default {
           barWidth: "60%",
           label: {
             show: true,
-            formatter: params => Math.round(params.value * 1000) / 10 + "%"
+            formatter: params => Math.round(params.value) + "%"
           },
           data: item.data
         }))
@@ -1623,7 +1698,17 @@ export default {
           }
         },
         tooltip: {
-          trigger: "axis"
+          trigger: "axis",
+          formatter: function(params) {
+            var res = "";
+            for (var i = 0, l = params.length; i < l; i++) {
+              if (i == 0) {
+                res += params[i].name + "<br/>";
+              }
+              res += params[i].seriesName + ": " + params[i].value + "%<br/>";
+            }
+            return res;
+          }
         },
         yAxis: {
           type: "value",
@@ -1664,31 +1749,43 @@ export default {
     },
     // 计算分组工具使用比例
     getColumnData() {
+      console.log("interactWork", this.data3);
+      let repeatWork = this.newArrFn(this.data3);
+
       let columnDataCopy = [];
       let columnDataCopyTwo = [];
-      this.toolPercentage.forEach((e, index) => {
-        columnDataCopy[index] = 0;
-        columnDataCopyTwo[index] = 0;
-        columnDataCopy[index] = e.filter(item => item === 49).length;
-        columnDataCopyTwo[index] = e.filter(item => item != 49).length;
-
-        if (columnDataCopy[index]) {
-          columnDataCopy[index] = (columnDataCopy[index] / e.length).toFixed(
-            2
-          );
+
+      // 作业分类
+      let repeatWorkCopy = [];
+
+      this.stageList.forEach((e, index) => {
+        repeatWorkCopy[index] = [];
+      });
+
+      // 将作业进行阶段分类
+      repeatWork.forEach(e => {
+        repeatWorkCopy[e.stage].push(e);
+      });
+
+      repeatWorkCopy.forEach((e, index) => {
+        if (e && e.length) {
+          columnDataCopy[index] =
+            e.filter(item => item.type === 11).length / e.length;
         } else {
           columnDataCopy[index] = 0;
         }
-        if (columnDataCopyTwo[index]) {
-          columnDataCopyTwo[index] = (columnDataCopyTwo[index] / e.length).toFixed(
-            2
-          );
-        } else {
-          columnDataCopyTwo[index] = 0;
-        }
+        columnDataCopyTwo[index] = 1 - columnDataCopy[index];
+      });
+
+      columnDataCopy = columnDataCopy.map(function(item, index, arr) {
+        return item * 100;
       });
-      this.columnData[0].data = columnDataCopy;
-      this.columnData[1].data = columnDataCopyTwo;
+      columnDataCopyTwo = columnDataCopyTwo.map(function(item, index, arr) {
+        return item * 100;
+      });
+
+      this.columnData[0].data = columnDataCopyTwo;
+      this.columnData[1].data = columnDataCopy;
     },
     // 计算时长
     secondsToDhms(seconds) {

+ 1 - 1
src/components/pages/works.vue

@@ -466,7 +466,7 @@
       :append-to-body="true"
     >
       <div slot="title" class="header-title">
-        <div style="color: #fff">导出作业集</div>
+        <div style="color: #fff">{{ this.digNum==2 ?'查看':'导出' }}报告</div>
       </div>
       <exportDataDialog  :key="exportW" :digNum="digNum" :oid="oid" :multipleSelection="multipleSelection" :worksDialogCon="worksDialogCon" :worksDialog.sync="worksDialog" :cid="checkCourse"></exportDataDialog>
     </el-dialog>