瀏覽代碼

Merge branch 'beta'

lsc 9 月之前
父節點
當前提交
83108461ae
共有 37 個文件被更改,包括 24176 次插入3833 次删除
  1. 2 0
      README.md
  2. 1 0
      build/webpack.dev.conf.js
  3. 63 0
      dist/index.html
  4. 0 0
      dist/static/css/app.604213879920505ca78246f1ecf44972.css
  5. 0 0
      dist/static/css/app.604213879920505ca78246f1ecf44972.css.map
  6. 0 0
      dist/static/js/app.9f7af5b9fedc1c5ecf4b.js
  7. 0 0
      dist/static/js/app.9f7af5b9fedc1c5ecf4b.js.map
  8. 0 0
      dist/static/js/manifest.571c38d63f24b1ae9e16.js.map
  9. 0 0
      dist/static/js/vendor.2485ee65a402fb60e5a9.js
  10. 0 0
      dist/static/js/vendor.2485ee65a402fb60e5a9.js.map
  11. 18848 1
      package-lock.json
  12. 2 1
      package.json
  13. 560 196
      src/components/pages/aiAddCourse/addCourse.vue
  14. 19 6
      src/components/pages/aiAddCourse/tipsDialog.vue
  15. 1 1
      src/components/pages/classroomObservation/components/analysis.vue
  16. 47 3
      src/components/pages/classroomObservation/components/analysisSpecialItem.vue
  17. 2 2
      src/components/pages/classroomObservation/components/analysisTemplateDialog.vue
  18. 711 699
      src/components/pages/classroomObservation/components/chatArea.vue
  19. 1 1
      src/components/pages/classroomObservation/components/mdView.vue
  20. 2045 2074
      src/components/pages/classroomObservation/components/messageArea.vue
  21. 1 1
      src/components/pages/classroomObservation/components/pieChart.vue
  22. 665 697
      src/components/pages/classroomObservation/index.vue
  23. 2 2
      src/components/pages/library/fileBox.vue
  24. 1 1
      src/components/pages/test/add/edit/check/file.vue
  25. 5 0
      src/components/pages/test/add/edit/check/uploadFile.vue
  26. 7 2
      src/components/pages/test/add/setInfo/index.vue
  27. 216 24
      src/components/pages/test/aggregate/index.vue
  28. 150 11
      src/components/pages/test/check/index.vue
  29. 194 65
      src/components/pages/test/examine/conpoments/personPage.vue
  30. 427 0
      src/components/pages/test/examine/conpoments/shareBox/index.vue
  31. 87 22
      src/components/pages/test/examine/conpoments/targetPage.vue
  32. 61 11
      src/components/pages/test/examine/index.vue
  33. 1 1
      src/components/pages/test/file/wPdf.vue
  34. 49 6
      src/components/pages/testPerson/examine/index.vue
  35. 3 2
      src/components/pages/testPerson/info/index.vue
  36. 3 2
      src/components/pages/testPerson/info/infoDialog/index.vue
  37. 2 2
      src/components/pages/testStudent/view/component/file.vue

+ 2 - 0
README.md

@@ -1,2 +1,4 @@
 # pbl-teacher
 
+node ^12
+

+ 1 - 0
build/webpack.dev.conf.js

@@ -32,6 +32,7 @@ const devWebpackConfig = merge(baseWebpackConfig, {
     contentBase: false, // since we use CopyWebpackPlugin.
     compress: true,
     host: HOST || config.dev.host,
+    disableHostCheck: true,
     port: PORT || config.dev.port,
     open: config.dev.autoOpenBrowser,
     overlay: config.dev.errorOverlay

+ 63 - 0
dist/index.html

@@ -0,0 +1,63 @@
+<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>PBL教师端</title><link rel="shortcut icon" type=image/x-icon href=static/logo.ico><style>@charset "utf-8";
+    /* @font-face {
+        font-family: 'Source Han Sans SC';
+        src: url('./static/SourceHanSans-Regular.otf') format('truetype');
+        font-weight: normal;
+        font-style: normal;
+      } */
+
+    div::-webkit-scrollbar {
+      /*滚动条整体样式*/
+      width: 6px;
+      /*高宽分别对应横竖滚动条的尺寸*/
+      height: 6px;
+    }
+
+    /*定义滚动条轨道 内阴影+圆角*/
+    div::-webkit-scrollbar-track {
+      border-radius: 10px;
+      background-color: rgba(0, 0, 0, 0.1);
+    }
+
+    /*定义滑块 内阴影+圆角*/
+    div::-webkit-scrollbar-thumb {
+      border-radius: 10px;
+      -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3);
+      background-color: rgba(0, 0, 0, 0.1);
+    }
+
+    html,
+    body {
+      height: 100%;
+      width: 100%;
+      background: #e6eaf0;
+      font-family: '黑体';
+    }</style><link href=./static/css/app.604213879920505ca78246f1ecf44972.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.571c38d63f24b1ae9e16.js></script><script type=text/javascript src=./static/js/vendor.2485ee65a402fb60e5a9.js></script><script type=text/javascript src=./static/js/app.9f7af5b9fedc1c5ecf4b.js></script></body></html><script>function stopSafari() {
+    //阻止safari浏览器双击放大功能
+    let lastTouchEnd = 0  //更新手指弹起的时间
+    document.documentElement.addEventListener("touchstart", function (event) {
+      //多根手指同时按下屏幕,禁止默认行为
+      if (event.touches.length > 1) {
+        event.preventDefault();
+      }
+    });
+    document.documentElement.addEventListener("touchend", function (event) {
+      let now = (new Date()).getTime();
+      if (now - lastTouchEnd <= 300) {
+        //当两次手指弹起的时间小于300毫秒,认为双击屏幕行为
+        event.preventDefault();
+      } else { // 否则重新手指弹起的时间
+        lastTouchEnd = now;
+      }
+    }, false);
+    //阻止双指放大页面
+    document.documentElement.addEventListener("gesturestart", function (event) {
+      event.preventDefault();
+    });
+  }
+
+  window.onload = () => {
+    stopSafari();
+  }
+  
+  document.domain = document.domain.split(".").slice(-2).join(".");</script>

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/app.604213879920505ca78246f1ecf44972.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/app.604213879920505ca78246f1ecf44972.css.map


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.9f7af5b9fedc1c5ecf4b.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.9f7af5b9fedc1c5ecf4b.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/manifest.571c38d63f24b1ae9e16.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/vendor.2485ee65a402fb60e5a9.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/vendor.2485ee65a402fb60e5a9.js.map


File diff suppressed because it is too large
+ 18848 - 1
package-lock.json


+ 2 - 1
package.json

@@ -35,7 +35,8 @@
     "jszip": "^3.10.1",
     "lamejs": "^1.2.1",
     "language-hk-loader": "^1.0.1",
-    "markdown-it": "^14.1.0",
+    "lodash": "^4.17.21",
+    "markdown-it": "^13.0.2",
     "opencc-js": "^1.0.5",
     "pdfjs-dist": "^2.5.207",
     "pptxgenjs": "^3.12.0",

File diff suppressed because it is too large
+ 560 - 196
src/components/pages/aiAddCourse/addCourse.vue


+ 19 - 6
src/components/pages/aiAddCourse/tipsDialog.vue

@@ -19,6 +19,13 @@
                     <el-radio :label="2">所有人</el-radio>
                 </el-radio-group>
             </div>
+            <div class="t_box">
+                <span>是否公开提示词:</span>
+                <el-radio-group v-model="isT">
+                    <el-radio :label="1">不公开</el-radio>
+                    <el-radio :label="2">公开</el-radio>
+                </el-radio-group>
+            </div>
         </div>
         <span slot="footer" class="dialog-footer">
             <el-button @click="selectT(2)" type="primary">确定并保存课程</el-button>
@@ -57,7 +64,8 @@ export default {
         return {
             title: "",
             detail: "",
-            radio: 0
+            radio: 0,
+            isT: 1
         }
     },
     watch: {
@@ -66,11 +74,13 @@ export default {
                 this.title = this.tipsJson.name ? this.tipsJson.name : ''
                 this.detail = this.tipsJson.detail ? this.tipsJson.detail : ''
                 this.radio = this.tipsJson.open ? parseInt(this.tipsJson.open) : 0
+                this.isT = this.tipsJson.istips ? parseInt(this.tipsJson.istips) : 0
             } else {
                 this.$emit('update:tipsJson', {
                     name: this.title,
                     detail: this.detail,
                     open: this.radio,
+                    istips: this.istips
                 })
             }
         },
@@ -145,10 +155,11 @@ export default {
                 d: this.detail,
                 json: JSON.stringify(this.aiJson),
                 o: this.radio,
-                uid: this.userid
+                uid: this.userid,
+                isT: this.isT
             }]
             this.ajax
-                .post(this.$store.state.api + "addTipsTemplate", params)
+                .post(this.$store.state.api + "addTipsTemplate2", params)
                 .then((res) => {
                     this.$message.success("保存成功");
                     console.log(res.data);
@@ -172,10 +183,11 @@ export default {
                 d: this.detail,
                 json: JSON.stringify(this.aiJson),
                 o: this.radio,
-                uid: this.templateid
+                uid: this.templateid,
+                isT: this.isT
             }]
             this.ajax
-                .post(this.$store.state.api + "addTipsTemplate", params)
+                .post(this.$store.state.api + "addTipsTemplate2", params)
                 .then((res) => {
                     this.$message.success("修改成功");
                     if(type == 2){
@@ -275,8 +287,9 @@ export default {
 }
 
 .t_box>span:nth-child(1) {
-    min-width: 80px;
+    min-width: 135px;
     font-size: 16px;
     color: #000;
+    text-align: right;
 }
 </style>

+ 1 - 1
src/components/pages/classroomObservation/components/analysis.vue

@@ -120,7 +120,7 @@ export default {
 	},
 	methods: {
 		addTemplate() {
-			if(!this.tid)return this.$message.error("请选择课堂")
+			if(!this.tid)return this.$message.error("请新建课堂,或选择历史课堂")
 			this.$emit("updateMessage", this.type);
 		},
 		changeShowItem(newValue) {

+ 47 - 3
src/components/pages/classroomObservation/components/analysisSpecialItem.vue

@@ -115,9 +115,15 @@
 			</div>
 			<!-- 图 -->
 			<eChartTemplate
-				style="width: 100%; height: 400px"
+				style="max-height: 600px;max-width: 600px;width: 100%;height: 600px;margin: auto;"
 				:data="data.jsonData.eChartData"
-				v-if="data.jsonData.eChartData"
+				v-if="data.jsonData.eChartData && converter(data.jsonData.name) == converter('S-T分析:师生互动分析')"
+			/>
+
+			<eChartTemplate
+				style="width: 100%;height: 400px;"
+				:data="data.jsonData.eChartData"
+				v-if="data.jsonData.eChartData  && converter(data.jsonData.name) != converter('S-T分析:师生互动分析')"
 			/>
 			<div class="rtCh" v-if="data.jsonData.RT && data.jsonData.CH">
 				<img :src="require('../../../../assets/icon/classroomObservation/rt-ch.png')">
@@ -132,9 +138,14 @@
 </template>
 
 <script>
+var OpenCC = require("opencc-js");
+let converter2 = OpenCC.Converter({
+		from:'hk',
+		to:'cn'
+})
 import mdView from "./mdView.vue";
 import eChartTemplate from "./eChartTemplate";
-import { v4 as uuidv4 } from "uuid";
+
 export default {
 	emits: ["delItem", "editItem", "saveItem"],
 	components: {
@@ -206,6 +217,11 @@ export default {
 				return url.split(".").pop();
 			};
 		},
+		converter() {
+			return function (word) {
+				return converter2(word);
+			};
+		},
 	},
 	watch: {
 		// showIndex(){
@@ -376,6 +392,7 @@ export default {
 			const _option = {
 				tooltip: {
 					trigger: "item",
+					formatter: "{a} <br/>{b}: {d}%"  // {a}为系列名,{b}为数据名,{d}为百分比
 				},
 				legend: {
 					top: "5%",
@@ -396,6 +413,7 @@ export default {
 								show: true,
 								fontSize: 40,
 								fontWeight: "bold",
+								// formatter: "{b}: {d}%"  // 显示百分比
 							},
 						},
 						labelLine: {
@@ -430,20 +448,46 @@ export default {
 				}
 				return _result.push(JSON.parse(JSON.stringify(_pushData)))
 			})
+			let _flatArray = _result.flat();
+			const _max = Math.max(..._flatArray)
+			const _maxValue =Math.ceil(_max / 100) * 100;
 			const _option = {
 				xAxis: {
 					name: "老师", // X轴标题
 					nameLocation: "end", // 标题位置
+					scale: true,
+        	min: 0,
+					max:_maxValue
 				},
 				yAxis: {
 					name: "学生", // Y轴标题
 					nameLocation: "end", // 标题位置
+					scale: true,
+        	min: 0,
+					max:_maxValue
 				},
+				grid: {
+        	containLabel: true
+    		},
 				series: [
 					{
+						name: "数据",
+            step: "start",
 						data: _result,
 						type: "line",
+						
 					},
+					{
+            name: "对角线",
+            type: "line",
+            data: [[0, 0], [_maxValue, _maxValue]],
+            lineStyle: {
+                type: "dashed"
+            },
+            markLine: {
+                "symbol": ["none", "none"]
+            }
+        }
 				],
 			};
 

+ 2 - 2
src/components/pages/classroomObservation/components/analysisTemplateDialog.vue

@@ -395,7 +395,7 @@ export default {
 	methods: {
 		open() {
 			this.text = "";
-			this.tagIndex = 1;
+			this.tagIndex = 0;
 			this.tagSubject = 0;
 			this.tagBox = 0;
 			this.getData();
@@ -407,7 +407,7 @@ export default {
 			// if (this.loading) return;
 			this.dialogVisible = false;
 			this.text = "";
-			this.tagIndex = 1;
+			this.tagIndex = 0;
 			this.tagSubject = 0;
 			this.defaultData = null;
 			this.tagBox = 0;

File diff suppressed because it is too large
+ 711 - 699
src/components/pages/classroomObservation/components/chatArea.vue


+ 1 - 1
src/components/pages/classroomObservation/components/mdView.vue

@@ -31,7 +31,7 @@ const getFile = (url) => {
 		}
 		var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
 		let name = decodeURIComponent(
-			_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+			_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' ')
 		);
 		var params = {
 			Bucket: "ccrb",

File diff suppressed because it is too large
+ 2045 - 2074
src/components/pages/classroomObservation/components/messageArea.vue


+ 1 - 1
src/components/pages/classroomObservation/components/pieChart.vue

@@ -26,7 +26,7 @@ const getFile = (url) => {
 		}
 		var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
 		let name = decodeURIComponent(
-			_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+			_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' ')
 		);
 		var params = {
 			Bucket: "ccrb",

File diff suppressed because it is too large
+ 665 - 697
src/components/pages/classroomObservation/index.vue


+ 2 - 2
src/components/pages/library/fileBox.vue

@@ -188,7 +188,7 @@ const getFile = (url) => {
             _url2 = url2;
         }
         var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
-        let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
+        let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' '))
         var params = {
             Bucket: "ccrb",
             Key: name
@@ -610,7 +610,7 @@ export default {
             let _this = this;
 
             var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
-            let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
+            let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' '))
             var params = {
                 Bucket: "ccrb",
                 Key: name

+ 1 - 1
src/components/pages/test/add/edit/check/file.vue

@@ -715,7 +715,7 @@ export default {
       _this.downLoading = _url2;
       var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
       let name = decodeURIComponent(
-        _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+        _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' ')
       );
       var params = {
         Bucket: "ccrb",

+ 5 - 0
src/components/pages/test/add/edit/check/uploadFile.vue

@@ -54,6 +54,7 @@ export default {
 		// },
 		// 初始化上传入口
 		async initMultipartUpload(key, file) {
+			console.log(file)
 			const params = {
 				Bucket: this.bucketname,
 				Key: key,
@@ -208,6 +209,7 @@ export default {
 
 		//上传的接口
 		async awsupload({ file = this.file, keyName, folderName }) {
+			console.log('successsuccesssuccesssuccesssuccesssuccesssuccesssuccesssuccesssuccesssuccess')
 			if (!file) return this.$message.error("请上传文件");
 			this.init(); //初始化桶
 			// const key = (folderid || uuidv4()) + "/" + file.name; //需要上传的文件名
@@ -224,6 +226,9 @@ export default {
 							file.name.split(".")[file.name.split(".").length - 1]}`;
 				}
 			}
+			console.log(key);
+			// key = key.replace(/\s/g, "");
+			// key = encodeURIComponent(key);
 			this.filestate = {
 				percent: 0,
 				status: "start",

+ 7 - 2
src/components/pages/test/add/setInfo/index.vue

@@ -74,7 +74,12 @@
                 </div>
             </div>
         </div>
-        <div class="whiteBg" style="background:#fff;margin: 10px 0;min-height: 300px;">
+        <div class="e_btn" style="display: flex;justify-content: center;margin-top: 10px;" v-show="oid == 'd67940a5-510c-40ea-9c9a-2631ab03013a'">
+            <el-button type="primary" size="mini" @click="nextSteps()"
+            >下一步</el-button
+            >
+        </div>
+        <div class="whiteBg" style="background:#fff;margin: 10px 0;min-height: 300px;" v-show="oid != 'd67940a5-510c-40ea-9c9a-2631ab03013a'">
             <div class="whiteBg" style="border-radius: 0">
                 <div class="c_info_title">创建表单内容</div>
                 <div class="c_info_box">
@@ -84,7 +89,7 @@
                         <!-- <span :class="{ active: type == 3 }" @click="type = 3">题库导入</span> -->
                         <div class="skip_btn">
                             <!-- <el-button type="primary" size="mini" @click="openAiCreate">智能创建</el-button> -->
-                            <el-button type="primary" size="mini" @click="nextSteps">跳过</el-button>
+                            <!-- <el-button type="primary" size="mini" @click="nextSteps">跳过</el-button> -->
                         </div>
 
                     </div>

+ 216 - 24
src/components/pages/test/aggregate/index.vue

@@ -1,12 +1,38 @@
 <template>
   <div class="aggregate">
-    <el-table :data="tableData" border style="width: 100%" v-loading="tabLoading" @header-click="handleHeaderClick">
-      <el-table-column fixed align="center" type="index" width="50">
+    <el-table
+      :data="tableData"
+      border
+      max-height="750px"
+      v-loading="tabLoading"
+      @header-click="handleHeaderClick"
+    >
+      <el-table-column
+        fixed
+        align="center"
+        label="序号"
+        type="index"
+        width="50"
+      >
       </el-table-column>
 
-      <el-table-column fixed align="center" prop="username" label="教师姓名" width="150">
+      <el-table-column
+        align="center"
+        prop="username"
+        label="教师姓名"
+        fixed
+        width="150"
+      >
       </el-table-column>
-      <el-table-column fixed align="center" label="教研室" width="130">
+      <el-table-column
+        :filters="TeachingOptions"
+        :filter-method="filterTea"
+        align="center"
+        prop="tea"
+        fixed
+        label="教研室"
+        width="130"
+      >
         <template slot-scope="scope">
           <div class="TabBtn" v-if="!scope.row.tea">/</div>
           <div class="TabBtn" v-else>{{ scope.row.tea }}</div>
@@ -16,13 +42,44 @@
       <div v-for="item in titList" :key="item.id">
         <el-table-column align="center" :label="item.name">
           <div v-for="e in allFrom" :key="e.courseId">
-            <el-table-column v-if="e.typeid == item.id" align="center" :prop="e.courseId" :label="e.title"
-              :cell-style="{ color: '#000' }" width="130">
+            
+            <el-table-column
+              v-if="e.typeid == item.id"
+              align="center"
+              :prop="e.courseId"
+              :label="e.title"
+              show-overflow-tooltip
+              width="130"
+              :resizable="false"
+            >
               <template slot-scope="scope">
-                <div v-if="e.juri2 && arrayToArray(scope.row.teaId ? scope.row.teaId.split(',') : [],e.juri2 ? e.juri2.split(',') : []).length && scope.row.works.indexOf(e.courseId) !== -1"
-                  class="yuan blacky"></div>
-                <div v-else-if="scope.row.works.indexOf(e.courseId) !== -1" class="yuan blacky"></div>
-                <div v-else-if="e.juri2 && arrayToArray(scope.row.teaId ? scope.row.teaId.split(',') : [],e.juri2 ? e.juri2.split(',') : []).length == 0" class="yuan greyy"></div>
+                <div
+                  v-if="
+                    e.juri2 &&
+                      arrayToArray(
+                        scope.row.teaId ? scope.row.teaId.split(',') : [],
+                        e.juri2 ? e.juri2.split(',') : []
+                      ).length &&
+                      scope.row.works.indexOf(e.courseId) !== -1
+                  "
+                  class="yuan blacky"
+                  @click="gotoFrom(e.courseId, scope.row.userid)"
+                ></div>
+                <div
+                  v-else-if="scope.row.works.indexOf(e.courseId) !== -1"
+                  class="yuan blacky"
+                  @click="gotoFrom(e.courseId, scope.row.userid)"
+                ></div>
+                <div
+                  v-else-if="
+                    e.juri2 &&
+                      arrayToArray(
+                        scope.row.teaId ? scope.row.teaId.split(',') : [],
+                        e.juri2 ? e.juri2.split(',') : []
+                      ).length == 0
+                  "
+                  class="yuan greyy"
+                ></div>
                 <div v-else class="yuan"></div>
               </template>
             </el-table-column>
@@ -30,6 +87,24 @@
         </el-table-column>
       </div>
     </el-table>
+
+    <!-- 查看数据来源 -->
+    <el-dialog
+      title=""
+      :visible.sync="diaIframe"
+      :append-to-body="true"
+      width="95%"
+      :before-close="handleClose2"
+      class="dialog_diy"
+    >
+      <div style="height: 100%;">
+        <iframe
+          ref="viframe"
+          style="width: 100%; height: 99%; border: none"
+          :src="ifmUrl"
+        ></iframe>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -43,15 +118,20 @@ export default {
       tableData: [],
       titList: [],
       allFrom: [],
-      tabLoading: false
+      tabLoading: false,
+      TeachingOptions: [],
+      diaIframe: false,
+      ifmUrl: ""
     };
   },
 
   mounted() {
     this.getData();
+    this.getTeaList();
   },
 
   methods: {
+    // 处理数据
     arrayToArray(arrayo, arrayt) {
       let array1 = arrayo;
       let array2 = arrayt;
@@ -67,6 +147,44 @@ export default {
       }
       return commonElements;
     },
+    gotoFrom(val, uid) {
+      // return console.log(val, uid);
+      this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${val}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${uid}`;
+      // this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/test?userid=${this.userid}&oid=45facc0a-1211-11ec-80ad-005056b86db5&org=&role=0`;
+      this.diaIframe = true;
+    },
+    // 教研室筛选
+    filterTea(value, row, column) {
+      // console.log(value, row, column);
+      const property = column["property"];
+      return row[property].includes(value);
+    },
+    // 获取教研室
+    getTeaList() {
+      let params = {
+        oid: this.oid
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectTeacherOfficeBySchool", params)
+        .then(res => {
+          // return console.log("this.TeachingOptions", res.data[0]);
+          let data = res.data[0];
+          let dataCopy = [];
+
+          data.forEach(e => {
+            let a = {};
+            a.value = e.name;
+            a.text = e.name;
+            dataCopy.push(a);
+          });
+
+          this.TeachingOptions = dataCopy;
+          // console.log("this.TeachingOptions", this.TeachingOptions);
+        })
+        .catch(err => {
+          console.error(err);
+        });
+    },
     getData() {
       this.tabLoading = true;
 
@@ -89,6 +207,11 @@ export default {
               }
             });
           });
+          data.forEach(e => {
+            if (!e.tea) {
+              e.tea = "";
+            }
+          });
           this.tableData = data;
           this.tabLoading = false;
         })
@@ -96,20 +219,39 @@ export default {
           console.log(error);
         });
     },
+    // 数据来源关闭弹框
+    handleClose2(done) {
+      done();
+    },
+    // 点击表头跳转
     handleHeaderClick(column, event) {
-      // console.log("表头被点击", column, event);
-      this.$router.push(
-        "/checkToTest?cid=" +
-        column.property +
-        "&oid=" +
-        this.oid +
-        "&org=" +
-        this.org +
-        "&type=" +
-        2 +
-        "&role=" +
-        this.role
-      );
+      console.log("表头被点击", column, event);
+
+      let titData = this.titList.map(e => {
+        return e.name;
+      });
+
+      if (
+        column.label == "教研室" ||
+        column.label == "教师姓名" ||
+        column.label == "序号" ||
+        titData.includes(column.label)
+      ) {
+      } else {
+        this.$router.push(
+          "/checkToTest?cid=" +
+            column.property +
+            "&oid=" +
+            this.oid +
+            "&org=" +
+            this.org +
+            "&type=" +
+            2 +
+            "&role=" +
+            this.role
+        );
+      }
+
       // 在这里处理点击事件
     }
   }
@@ -128,10 +270,60 @@ export default {
 
 .blacky {
   background-color: #000;
+  cursor: pointer;
 }
 
 .greyy {
   background-color: #eee;
   border: 1px solid #eee;
 }
+.dialog_diy >>> .el-dialog {
+  height: 95%;
+  margin: 0 auto !important;
+  margin-top: 20px !important;
+  overflow: hidden;
+  min-width: 800px !important;
+}
+
+.dialog_diy >>> .el-dialog__header {
+  background: #454545 !important;
+  padding: 25px 20px;
+}
+
+.dialog_diy >>> .el-dialog__body {
+  height: calc(100% - 50px);
+  box-sizing: border-box;
+  padding: 0px;
+}
+
+.dialog_diy >>> .el-dialog__title {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn {
+  top: 19px;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__body,
+.dialog_diy >>> .el-dialog__footer {
+  background: #fafafa;
+}
+
+.aggregate >>> .el-table th > .cell {
+  /* -webkit-line-clamp: 2;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  height: 50px !important; */
+}
+
 </style>

+ 150 - 11
src/components/pages/test/check/index.vue

@@ -63,6 +63,8 @@
               </div>
             </div>
           </div>
+
+          <!-- pc端 查看切换 isDesktop-->
           <div class="search_nav" v-if="isDesktop">
             <div class="right">
               <span :class="{ active: stype == 1 }" @click="checkDataType(1)" v-if="!peopleId">按题目查看</span>
@@ -70,7 +72,8 @@
               <span :class="{ active: stype == 3 }" @click="checkDataType(3)" v-show="false">按数量查看</span>
             </div>
             <div class="left"  v-if="isDesktop">
-              <div style="margin-right: 10px;position: relative;" v-if="stype == 2 || stype == 3">
+              <!-- <div style="margin-right: 10px;position: relative;" v-if="stype == 2 || stype == 3"> -->
+              <div style="margin-right: 10px;position: relative;">
                 <el-select v-model="TeachingValue" @change="searchCourse" placeholder="按教研室">
                   <el-option
                     label="全部"
@@ -109,6 +112,7 @@
                 <el-input v-model="courseName" class="student_input" :disabled="!(!peopleId)" placeholder="请输入需要搜索的姓名"></el-input>
                 <span class="serach_icon" @click="searchCourse" ></span>
               </div>
+              
               <div class="btnA" v-if="stype == 1 && !pdfLoading" @click="exportPDF">导出PDF</div>
               <div class="btnA" v-if="stype == 2" @mouseenter="btnDisplay = true" @mouseleave="btnDisplay = false">
                 导出数据
@@ -120,6 +124,8 @@
               <div class="btnA" v-if="stype == 3" @click="exportAllWord2">导出人员数据</div>
             </div>
           </div>
+
+          <!-- 手机端 查看切换 isDesktop-->
           <div class="search_nav" style="display:flex;justify-content:space-evenly;border: none;" v-if="!isDesktop">
             <div class="right">
               <span :class="{ active2: stype == 1 }" @click="checkDataType(1)">按题目查看</span>
@@ -128,6 +134,7 @@
             </div>
           </div>
 
+          <!-- 按题目pc端 isDesktop-->
           <div class="title_content" v-if="stype == 1 && isDesktop" v-loading="isLoading">
             <div class="title_box" v-if="!testArray.length"
               style="display: flex;align-items: center;justify-content: center;height: 500px;">
@@ -140,7 +147,7 @@
                     :class="{ test_icon_check: item.type == 1 && item.atype == 2, test_icon_checkO: item.type == 1 && item.atype == 1, test_icon_gap: item.type == 3, test_icon_file: item.type == 5, test_course_file: item.type == 6, test_eva_file: item.type == 7,test_icon_time: item.type == 8 }"></span>
                 </el-tooltip>
                 <span>{{ item.title }}</span>
-								<el-button v-if="item.type == 5 && item.array.length>0" class="title_downBtn" type="primary" size="small" @click.stop="downloadFileType5(item.array,item.title)">批量下载附件</el-button>
+								<el-button v-if="item.type == 5 && item.array.length>0" class="title_downBtn" type="primary" size="small" @click.stop="downloadFileType5(item.array,item.title,index)">批量下载附件</el-button>
 								<div v-if="item.type==7" style="right:0;position: absolute;">平均分:{{ getAverageScore(index) }}</div>
               </div>
               <div class="detail" v-if="item.detail">{{ item.detail }}</div>
@@ -191,7 +198,7 @@
                   </wordcloud>
                 </div>
               </div>
-              <div class="content3" v-if="item.type == 5">
+              <div class="content3" :style="{'position': 'relative','overflow': (fileLoading[index].bool ? 'hidden':'auto')}" v-if="item.type == 5">
                 <div class="file" v-for="(file, index2) in item.array" :key="index + '-' + index2"
                   @click.stop="checkFile(file)">
                   <img class="download" src="../../../../assets/icon/fileIcon/download.png"
@@ -207,6 +214,28 @@
                     </el-tooltip>
                   </div>
                 </div>
+                <div v-if="
+                    fileLoading[index].bool
+                  " class="mask">
+                    <div class="progressBox">
+                      <div class="lbox">
+                        <img src="../../../../assets/loading.gif" />打包中,请稍后
+                      </div>
+                      <div style="margin-bottom: 10px">
+                        <span>{{
+                           fileLoading[index].load
+                          }}</span>
+                        /
+                        <span>{{
+                           fileLoading[index].count
+                          }}</span>
+                      </div>
+                      <el-progress :text-inside="true" :stroke-width="20" :percentage=" fileLoading[index].progress
+                        ?  fileLoading[index].progress
+                        : 0
+                        " style="width: 80%"></el-progress>
+                    </div>
+                </div>
               </div>
               <div class="content4" v-if="item.type == 6">
                 <div class="out_box" v-for="(item, index) in item.courseArray" :key="index + '-' + index2">
@@ -286,6 +315,7 @@
               </div>
             </div>
           </div>
+          <!-- 按题目手机端 !isDesktop-->
           <div class="title_content" v-if="stype == 1 && !isDesktop" v-loading="isLoading">
             <div class="title_box" v-if="!testArray.length"
               style="display: flex;align-items: center;justify-content: center;height: 500px;">
@@ -469,6 +499,8 @@
               </div>
             </div>
           </div>
+
+          <!-- 按人员pc端 isDesktop-->
           <div class="table_content" v-if="stype == 2 && isDesktop">
             <el-table class="el-table" ref="table" :data="worksArray" border :fit="true" :key="2" v-loading="isLoading"
               style="width: 100%" :header-cell-style="{ background: '#f1f1f1', fontSize: '17px' }"
@@ -534,6 +566,7 @@
               </el-table-column>
             </el-table>
           </div>
+          <!-- 按人员手机端 !isDesktop-->
           <div class="table_content" v-if="stype == 2 && !isDesktop">
 
             <div v-for="(i,index) in worksArray"  :key="i.id" class="isDesktopTable_content">
@@ -549,7 +582,7 @@
                 <div class="isDBri">
                   <div>序号:{{ i.time }}</div>
                   <div>提交时间:{{ i.time }}</div>
-                  <div>评课人:</div>
+                  <div>评课人:{{ i.uteaName }}</div>
                 </div>
                 <div style="height: 1px;background-color: #717C8D;width: 100%;margin-bottom: 10px;"></div>
                 <div>
@@ -610,7 +643,7 @@
                             <img class="IsDImg" :src="file.url" alt="" v-if="file.type == 3" />
                             <img class="IsDImg" :src="wordIcon" alt="" v-if="file.type == 4" />
                             <img class="IsDImg" :src="fileIcon" alt="" v-if="file.type == 5" />
-                            <div class="name" style="height: 30px;background-color: #ccc;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">
+                            <div class="name" style="height: 30px;background-color: #f9f9f9;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">
                               <!-- <el-tooltip :content="file.name" placement="top" effect="dark"> -->
                                 {{ file.name }}
                               <!-- </el-tooltip> -->
@@ -766,6 +799,8 @@
         </div>
       </div>
     </div>
+
+   
     <share-box :testJson="testJson" :TeachingValue="TeachingValue" :TeachName="TeachNameCpt"   :dialogVisibleShare.sync="dialogVisibleShare"></share-box>
     <wpdf :dialogVisiblePdf.sync="dialogVisiblePdf" :url="wurl"></wpdf>
     <wVideo :dialogVisibleVideo.sync="dialogVisibleVideo" :url="wurl"></wVideo>
@@ -812,7 +847,7 @@ const getFile = (url) => {
             _url2 = url2;
         }
         var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
-        let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
+        let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' '))
         var params = {
             Bucket: "ccrb",
             Key: name
@@ -893,7 +928,13 @@ export default {
       chapters: [],
       filterPlacement: 'bottom-end',
       pdfLoading: false,
-      btnDisplay: false
+      btnDisplay: false,
+
+      fileLoading: [],
+      // fileLoadCount: [],
+      // fileLoadNum: [],
+      // infoprogress: [],
+
     };
   },
   watch: {},
@@ -981,6 +1022,9 @@ export default {
 		}
   },
   methods: {
+    fileClose(done){
+      done()
+    },
     //获取教研室列表
     getClass2() {
       let params = {
@@ -1082,6 +1126,7 @@ export default {
       );
     },
     checkDataType(type) {
+      this.TeachingValue = ''
       if (this.stype != type) {
         this.stype = type
         this.courseName = ''
@@ -1155,6 +1200,7 @@ export default {
                 time: this.works[i].time,
                 array: _json,
                 cut:0,
+                uteaName: this.works[i].uteaName,
                 courseJson: JSON.parse(this.works[i].courseJson),
               })
             }
@@ -1264,6 +1310,7 @@ export default {
             }
             console.log('topictopictopictopic',topic)
             testArray.push(topic)
+            this.fileLoading.push({bool:false,count:0,load:0,progress:0})
           }
           this.testArray = testArray
           this.worksArray = array
@@ -1440,7 +1487,7 @@ export default {
 
       _this.downLoading = _url2
       var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
-      let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
+      let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' '))
       var params = {
         Bucket: "ccrb",
         Key: name
@@ -1955,7 +2002,13 @@ export default {
       this.screenWidth = window.innerWidth;
       this.isDesktop = this.screenWidth > 750; // 你可以根据需要调整这个阈值
     },
-		downloadFileType5(fileData,title="附件"){
+		downloadFileType5(fileData,title="附件",index){
+      this.fileLoading[index].bool = true
+      this.fileLoading[index].count = 0
+      this.fileLoading[index].load = 0
+      this.fileLoading[index].progress = 0
+
+
 			let data = fileData;
 			const zip = new JSZip();
 			let downFileArray = [];
@@ -1964,6 +2017,11 @@ export default {
 				downFileArray.push({userid:i.userid,username:i.username ? i.username : '匿名',urlList:data.filter(d=>d.userid==i.userid).map(m=>m)});
 			})
 			let promises = [];
+      console.log('downFileArray',downFileArray);
+      downFileArray.forEach(e=>{
+        this.fileLoading[index].count += e.urlList.length
+      })
+
 			if(downFileArray.length==1){//只有一位老师的情况
 				if(downFileArray[0].urlList.length>1){//多个文件的情况
 					const folder = zip.folder(`${downFileArray[0].username}`);
@@ -1974,7 +2032,13 @@ export default {
         	          const file_name = i.name; // 获取文件名
 									  folder.file(file_name, data.data, { binary: true }); // 逐个添加文件
         	      }
+                this.fileLoading[index].load+=1
+                this.fileLoading[index].progress = parseInt((this.fileLoading[index].load / this.fileLoading[index].count) * 100);
+                if (this.fileLoading[index].load == this.fileLoading[index].count) {
+                  this.fileLoading[index].bool=false
+                }
         	  });
+           
 						promises.push(promise)
 					})
 					
@@ -1984,7 +2048,12 @@ export default {
         	      // 下载文件, 并存成ArrayBuffer对象
         	      const file_name = `${downFileArray[0].username}-${downFileArray[0].urlList[0].name}`; // 获取文件名
 								zip.file(file_name, data.data, { binary: true }); // 逐个添加文件
-        	    }
+            }
+            this.fileLoading[index].load+=1
+            this.fileLoading[index].progress = parseInt((this.fileLoading[index].load / this.fileLoading[index].count) * 100);
+            if (this.fileLoading[index].load == this.fileLoading[index].count) {
+              this.fileLoading[index].bool=false
+            }
 					}))
 				}
 			}else if(downFileArray.length>1){//有多位老师的情况
@@ -1995,7 +2064,12 @@ export default {
         	      // 下载文件, 并存成ArrayBuffer对象
         	      const file_name = `${i.username ? i.username : '匿名'}-${i.urlList[0].name}`; // 获取文件名
 								zip.file(file_name, data.data, { binary: true }); // 逐个添加文件
-        	    }
+              }
+              this.fileLoading[index].load+=1
+              this.fileLoading[index].progress = parseInt((this.fileLoading[index].load / this.fileLoading[index].count) * 100);
+              if (this.fileLoading[index].load == this.fileLoading[index].count) {
+                this.fileLoading[index].bool=false
+              }
 						}))
 					}else if(i.urlList.length>1){//有多个文件的
 						const folder = zip.folder(`${i.username ? i.username : '匿名'}`);
@@ -2006,6 +2080,11 @@ export default {
         	          const file_name = ui.name; // 获取文件名
 									  folder.file(file_name, data.data, { binary: true }); // 逐个添加文件
         	      }
+                this.fileLoading[index].load+=1
+                this.fileLoading[index].progress = parseInt((this.fileLoading[index].load / this.fileLoading[index].count) * 100);
+                if (this.fileLoading[index].load == this.fileLoading[index].count) {
+                  this.fileLoading[index].bool=false
+                }
 						  })
 							promises.push(promise)
 						})
@@ -2381,6 +2460,7 @@ export default {
 .title_content>.title_box>.title {
   font-size: 18px;
   display: flex;
+  min-height: 35px;
   white-space: pre-line;
 	position: relative;
 }
@@ -2895,4 +2975,63 @@ export default {
 	right: 10px;
 	top: 0;
 }
+.fileLoadDiv >>> .el-dialog__header{
+  display: none;
+}
+.fileLoadDiv >>> .el-dialog__body{
+  display: flex;
+  justify-content: center;
+}
+.fileLoadDiv >>> .el-dialog{
+  margin-top: 60vh !important;
+  width: 200px !important;
+  height: 80px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  border-radius: 15px;
+}
+.mask {
+  background-color: rgb(0 0 0 / 30%);
+  /* position: fixed; */
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 90;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.progressBox {
+  width: 300px;
+  height: 150px;
+  background: #fff;
+  border-radius: 10px;
+  box-shadow: 0 0 6px 1px #bfbfbf;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-direction: column;
+  position: relative;
+  color: #6c6c6c;
+}
+
+.progressBox>>>.el-progress-bar__outer {
+  background-color: #d1dfff !important;
+}
+
+.progressBox .lbox {
+  height: 50px;
+  font-size: 19px;
+  display: flex;
+  align-items: center;
+  color: #747474;
+}
+
+.progressBox .lbox img {
+  width: 40px;
+  margin-right: 20px;
+}
 </style>

+ 194 - 65
src/components/pages/test/examine/conpoments/personPage.vue

@@ -1,10 +1,10 @@
 <template>
   <div>
     <div class="personPage">
-      <!-- <div
+      <div
         style="width: 100%;display: flex;justify-content: flex-end;align-items: center;"
       >
-        <el-select v-model="teas" multiple placeholder="请选择">
+        <!-- <el-select v-model="teas" multiple placeholder="请选择">
           <el-option
             v-for="item in TeaList"
             :key="item.id"
@@ -12,13 +12,13 @@
             :value="item.id"
           >
           </el-option>
-        </el-select>
-        <div style="margin-left: 10px;">
+        </el-select> -->
+        <!-- <div style="margin-left: 10px;">
           <el-button type="primary" @click="remindExamine" size="mini"
             >提醒</el-button
           >
-        </div>
-      </div> -->
+        </div> -->
+      </div>
       <el-table
         :data="tableData"
         class="scoTab"
@@ -76,6 +76,7 @@
             <div style="display: flex;justify-content: center;">
               <div class="TabBtn" @click="lookScore(scope.row)">评分</div>
               <div class="TabBtn" @click="withdraw(scope.row.id)">退回</div>
+              <div class="TabBtn" @click="recordBtn(scope.row.id)">记录</div>
             </div>
           </template>
         </el-table-column>
@@ -153,7 +154,7 @@
             <div>考核分数:{{ computedSco }}</div>
           </div>
         </div>
-        <div style="height:100%;overflow: hidden;padding-bottom: 80px;">
+        <div style="height:100%;overflow: auto;padding-bottom: 80px;">
           <div class="sBox_table">
             <div class="table_title">
               <div style="width: 150px;">一级指标</div>
@@ -208,26 +209,29 @@
                       </div>
                       <div style="display: flex;justify-content: center;">
                         <div v-if="tableData.length > 0" class="ScoreStep">
-                          <input
+                          <el-input
                             :style="{
                               color: k.sco1 == k.sco2 ? '#000' : 'red'
                             }"
-                            :readonly="txtLoading"
                             @blur="
                               saveTab(
-                                k.sco2 > k.score ? (k.sco2 = k.score) : ''
+                                k.id,
+                                k.sco2 > k.score
+                                  ? (k.sco2 = k.score)
+                                  : '' || k.sco2 < 0
+                                  ? (k.sco2 = '')
+                                  : ''
                               )
                             "
-                            type="number"
-                            v-model="k.sco2"
-                          />
+                            v-model.number="k.sco2"
+                            v-stopMousewheel
+                          ></el-input>
                         </div>
                       </div>
                       <div style="display: flex;justify-content: center;">
                         <textarea
-                          :readonly="txtLoading"
                           v-if="tableData.length > 0"
-                          @blur="saveTab()"
+                          @blur="saveTab(k.id)"
                           v-model.trim="k.cogSum"
                         />
                       </div>
@@ -260,7 +264,36 @@
     </el-dialog>
 
     <!-- 提醒弹框 -->
+    <shareBox
+      :remDig.sync="remDig"
+      :pType="pType"
+      :TeaList="TeaList"
+    ></shareBox>
+
     <el-dialog
+      title="评分记录"
+      :visible.sync="recordVisible"
+      class="recordDig"
+      :before-close="recordHandleClose"
+    >
+      <div>
+        <el-table border height="500px" :data="RecordList" style="width: 100%">
+          <el-table-column align="center" type="index" label="序号" width="80">
+          </el-table-column>
+          <el-table-column
+            align="center"
+            show-overflow-tooltip
+            prop="username"
+            label="教师姓名"
+          >
+          </el-table-column>
+          <el-table-column align="center" prop="dateTime" label="评分时间">
+          </el-table-column>
+        </el-table>
+      </div>
+    </el-dialog>
+
+    <!-- <el-dialog
       title="提醒"
       :visible.sync="remDig"
       :append-to-body="true"
@@ -271,12 +304,13 @@
       <div v-loading="digLoading" style="height: 100%;padding: 15px;">
         <div class="remFlex" style="align-items: center;">
           <div class="remFlexTit">填写范围:</div>
-          <el-select disabled v-model="teas" multiple placeholder="请选择">
+          <el-select v-model="teas" multiple placeholder="请选择">
             <el-option
               v-for="item in TeaList"
               :key="item.id"
               :label="item.name"
               :value="item.id"
+              @change="remindExamine"
             >
             </el-option>
           </el-select>
@@ -302,25 +336,44 @@
           </div>
         </div>
       </div>
-    </el-dialog>
+    </el-dialog> -->
   </div>
 </template>
 
 <script>
+import shareBox from "./shareBox/index";
 export default {
+  directives: {
+    stopMousewheel: {
+      inserted: function(el) {
+        const ele = el.tagName === 'INPUT' ? el : el.querySelector('input');
+        ele.addEventListener("mousewheel", () => {
+          ele.blur();
+        });
+      }
+    }
+  },
   props: {
     pType: {
       //2专任教师 1班主任
       type: Number,
       default: 0
+    },
+    teacherName: {
+      type: String,
+      default: ""
     }
   },
-
+  components: {
+    shareBox
+  },
   data() {
     return {
       digType: 2,
       diaSco: false,
       diaIframe: false,
+      recordVisible: false,
+      RecordList: [],
       ifmUrl: false,
       PageBaseData: [],
       digUserid: "", //用户id
@@ -340,11 +393,8 @@ export default {
       oid: this.$route.query.oid, //学校id
       org: this.$route.query.org, //组织id
       tableData: [],
-      teas: [],
       TeachingOptions: [],
-      txtLoading: false,
-      remindNum: 0,
-      remindList: [],
+      PageBaseDataTwo: [],
       remDig: false
     };
   },
@@ -407,17 +457,22 @@ export default {
     this.getTeaList();
   },
   methods: {
+    // 禁用滚轮事件
+    handleWheel(event) {
+      event.preventDefault();
+    },
     // 获取页面数据
     getData() {
       this.tabLoading = true;
       let params = {
         oid: this.oid,
         org: this.org,
-        type: this.pType
+        type: this.pType,
+        tname: this.teacherName
       };
       // console.log(params);
       this.ajax
-        .get(this.$store.state.api + "selectTestExamineSecondData", params)
+        .get(this.$store.state.api + "selectTestExaminePersonData", params)
         .then(res => {
           let data = res.data[0];
 
@@ -536,43 +591,81 @@ export default {
             });
         })
         .catch(() => {
-          this.$message({
-            type: "info",
-            message: "已取消退回"
-          });
+          // this.$message({
+          //   type: "info",
+          //   message: "已取消退回"
+          // });
         });
     },
-    // 提醒
-    remindExamine() {
-      this.remindList = [];
-      this.remindNum = 0;
-      this.remDig = true;
-      this.digLoading = true;
-
+    recordBtn(val) {
+      this.RecordList = [];
+      this.recordVisible = true;
+      this.getRecordData(val);
+    },
+    // 查看记录
+    getRecordData(val) {
       let params = {
-        oid: this.oid,
-        org: this.org,
-        tea: this.teas.join(","),
-        ptype: this.pType
+        tid: val,
+        type: this.pType
       };
-      // return console.log(params);
-
       this.ajax
-        .get(this.$store.state.api + "selectExamineTeaRemind", params)
+        .get(this.$store.state.api + "selectExamineOperateRecord", params)
         .then(res => {
-          let data = res.data[0];
-          this.remindNum = data.length > 0 ? data[0].num : 0;
-          data.forEach(e => {
-            this.remindList.push(e.username);
-          });
-          this.digLoading = false;
-
-          console.log(this.remindList);
+          // console.log(res.data[0]);
+          this.RecordList = res.data[0];
         })
         .catch(err => {
           console.error(err);
         });
     },
+    recordHandleClose(done) {
+      done();
+    },
+    // 提醒
+    remindExamine() {
+      this.remDig = true;
+    },
+    // 下载excel
+    getExcel() {
+      var res = this.tableData;
+      // console.log('导出数据',res);
+      //如果value的json字段的key值和想要的headers值不一致时,可做如下更改
+      //将和下面的Object.fromEntries结合,将json字段的key值改变为要求的excel的header值
+      var array = [];
+      for (var i = 0; i < res.length; i++) {
+        var _json = {};
+        _json["教师姓名"] = res[i].username;
+        _json["教师账号"] = res[i].eName;
+        _json["所属教研室"] = res[i].tea;
+        _json["考核进度"] = `${res[i].step}/${res[i].allStep}`;
+        _json["自评分数"] = res[i].evaSca;
+        _json["考核分数"] = res[i].cogSco;
+        array.push(_json);
+      }
+
+      var XLSX = require("xlsx");
+      const workbook = XLSX.utils.book_new(); //创建一个新的工作簿对象
+      let ws = XLSX.utils.json_to_sheet(array); //将json对象数组转化成工作表
+      ws["!cols"] = [
+        //设置每一列的宽度
+        { wch: 20 },
+        { wch: 30 },
+        { wch: 30 },
+        { wch: 30 },
+        { wch: 30 },
+        { wch: 30 }
+      ];
+
+      XLSX.utils.book_append_sheet(workbook, ws, "sheet1"); //把sheet添加到workbook里,第三个参数是sheet名
+      XLSX.writeFile(workbook, "教师发展.xlsx");
+      // const wopts = { bookType: "xlsx", bookSST: false, type: "array" };//写入的样式bookType:输出的文件类型,type:输出的数据类型,bookSST: 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
+      // const wbout = XLSX.write(workbook, wopts);// 浏览器端和node共有的API,实际上node可以直接使用xlsx.writeFile来写入文件,但是浏览器没有该API
+      // FileSaver.saveAs(new Blob([wbout], { type: "application/octet-stream" }), `${title} demo.xlsx`);//保存文件
+      this.$message({
+        message: "导出成功",
+        type: "success"
+      });
+    },
     // 按照数字大小排序 方法-
     sortCogMethod(before, after) {
       return Number(before.cogSco) - Number(after.cogSco);
@@ -595,8 +688,33 @@ export default {
     // ----------------
 
     // 保存修改
-    saveTab() {
-      this.txtLoading = true;
+    saveTab(id) {
+      let a = { sco2: 0, cogSum: "" };
+      let b = { sco2: 0, cogSum: "" };
+      this.PageBaseData.forEach(e => {
+        e.children.forEach(i => {
+          if (i.id == id) {
+            a.sco2 = i.sco2;
+            a.cogSum = i.cogSum;
+          }
+        });
+      });
+
+      this.PageBaseDataTwo.forEach(e => {
+        e.children.forEach(i => {
+          if (i.id == id) {
+            b.sco2 = i.sco2;
+            b.cogSum = i.cogSum;
+          }
+        });
+      });
+
+      console.log(a, b, id);
+      if (
+        a.sco2 == b.sco2 &&
+        JSON.stringify(a.cogSum) === JSON.stringify(b.cogSum)
+      )
+        return;
 
       let PageBaseDataCopy = JSON.parse(JSON.stringify(this.PageBaseData));
 
@@ -610,16 +728,22 @@ export default {
 
       let params = [
         {
-          uid: this.digUserid,
+          uid: this.userid,
           tid: this.digTid,
-          json: JSON.stringify(PageBaseDataCopy)
+          typ: this.pType,
+          // json: JSON.stringify(PageBaseDataCopy)
+          json: JSON.stringify(PageBaseDataCopy),
+          rjson: JSON.stringify({
+            rjson: PageBaseDataCopy,
+            text: `按人员,进行修改`
+          })
         }
       ];
       // return console.log(params);
       this.ajax
-        .post(this.$store.state.api + "updateExamineCogData", params)
+        .post(this.$store.state.api + "updateExamineCogDataCopy", params)
         .then(res => {
-          // console.log("updateExamineCogData", res);
+          // console.log("updateExamineCogDataCopy", res);
           // this.CopDigSco();
           this.getDigData();
         })
@@ -750,6 +874,7 @@ export default {
           // console.log("selectTestExamineBase", res.data[0][0]);
 
           this.PageBaseData = JSON.parse(res.data[0][0].json);
+          this.PageBaseDataTwo = JSON.parse(res.data[0][0].json);
           // 处理数据来源
           this.handleData();
           // 先获取基础模板,然后再获取用户又没有填写过,填写过就开始循环赋值给基础模板,最后提交基础模板
@@ -789,7 +914,7 @@ export default {
                 }
               });
             });
-
+            this.PageBaseDataTwo = val;
             // 弹框计算自评分数,与二级指标个数
             this.getTwoRigData();
           } else {
@@ -797,7 +922,6 @@ export default {
             this.DigSelfSco = 0;
             this.twoTarget = 0;
           }
-          this.txtLoading = false;
           this.digLoading = false;
         })
         .catch(error => {
@@ -839,9 +963,9 @@ export default {
       this.getPageBase();
       done();
     },
-    handleClose3(done) {
-      done();
-    },
+    // handleClose3(done) {
+    //   done();
+    // },
     // 处理数据来源
     async handleData() {
       for (const e of this.PageBaseData) {
@@ -884,7 +1008,11 @@ export default {
   white-space: nowrap;
   text-overflow: ellipsis;
 }
-/* .remFlex {
+.recordDig >>> .el-dialog {
+  height: 600px;
+  width: 500px !important;
+}
+.remFlex {
   display: flex;
   justify-content: flex-start;
   margin-bottom: 20px;
@@ -892,7 +1020,7 @@ export default {
 .remFlexTit {
   width: 80px;
   flex-shrink: 0;
-} */
+}
 .digTop {
   display: flex;
   justify-content: space-between;
@@ -904,7 +1032,7 @@ export default {
   color: #528df6;
   margin: 0 10px;
 }
-/* .dialog_remDig >>> .el-dialog {
+.dialog_remDig >>> .el-dialog {
   height: 700px;
   margin: 0 auto !important;
   margin-top: 20px !important;
@@ -915,7 +1043,7 @@ export default {
 .dialog_remDig >>> .el-dialog__header {
   background: #454545 !important;
   padding: 15px 20px;
-} */
+}
 .dialog_diy >>> .el-dialog {
   height: 95%;
   margin: 0 auto !important;
@@ -980,6 +1108,7 @@ export default {
 .ScoreStep >>> .el-input__inner {
   height: 100%;
   padding-left: 15px;
+  border: none;
   padding-right: 15px;
 }
 .testPersonExamine {

+ 427 - 0
src/components/pages/test/examine/conpoments/shareBox/index.vue

@@ -0,0 +1,427 @@
+<template>
+  <el-dialog
+    title="提醒"
+    :visible.sync="remDig"
+    :append-to-body="true"
+    width="560px"
+    :before-close="handleClose"
+    class="dialog_diy"
+  >
+    <div class="share_box">
+      <div class="info_box" ref="info">
+        <!-- <div class="info">
+          <span>表单范围:</span>
+          <span>{{ reversedMessage }}</span>
+        </div> -->
+        <div class="info">
+          <span>填写范围:</span>
+          <el-select
+            v-model="teas"
+            @change="getData"
+            multiple
+            placeholder="请选择"
+          >
+            <el-option
+              v-for="item in TeaList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+        </div>
+        <!-- <div class="info" v-if="testJson && testJson.overtime">
+          <span>截止时间:</span>
+          <span>{{ testJson.overtime }}</span>
+        </div> -->
+        <div class="info">
+          <span>需提交人数:</span>
+          <span>{{ remindNum }}</span>
+        </div>
+        <div class="info">
+          <span>未完成人数:</span>
+          <span v-html="remindList.length"></span>
+        </div>
+        <div class="info">
+          <span>未完成名单:</span>
+          <span>{{
+            remindList.length > 20
+              ? isSuo
+                ? remindList.slice(0, 20).join(",") + "..."
+                : remindList.join(",")
+              : remindList.join(",")
+          }}</span>
+          <span
+            class="more"
+            v-if="remindList.length > 20"
+            @click="isSuo = !isSuo"
+            >{{ isSuo ? "查看更多" : "收起" }}</span
+          >
+        </div>
+      </div>
+
+      <div class="btn_box">
+        <button class="c_pub_button_confirm tag-read2" @click="getExcelTab">
+          导出
+        </button>
+        <button
+          class="c_pub_button_confirm tag-read2"
+          @click="copy2"
+          :data-clipboard-text="copyText2"
+        >
+          复制信息
+        </button>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import Clipboard from "clipboard";
+export default {
+  props: {
+    remDig: {
+      type: Boolean,
+      default: false
+    },
+    pType: {
+      type: Number
+    },
+    TeaList: {
+      type: Array
+    },
+    testJson: {
+      type: Object
+    },
+    TeachingValue: {
+      type: String
+    },
+    TeachName: {
+      type: Array
+    }
+  },
+  data() {
+    return {
+      origin: "",
+      copyText: "",
+      copyText2: "",
+      noCount: 0,
+      pname: [],
+      isSuo: true,
+      excelData: [],
+      remindNum: 0,
+      remindList: [],
+      remindName: [],
+      oid: this.$route.query.oid, //学校id
+      org: this.$route.query.org, //组织id
+      teas: []
+    };
+  },
+  computed: {
+    reversedMessage() {
+      if (this.TeachingValue == "") {
+        return this.testJson.juriP ? this.testJson.juriP : "所有人";
+      } else {
+        return this.TeachName ? this.TeachName[0].name : "所有人";
+      }
+    }
+  },
+  methods: {
+    handleClose(done) {
+      this.close();
+      done();
+    },
+    close() {
+      this.teas = [];
+      this.$emit("update:remDig", false);
+    },
+
+    copy2() {
+      this.copyText2 = `填写范围:${
+        this.teas ? this.remindName.join(",") : "所有人"
+      }\n${"需提交人数:" +
+        this.remindNum +
+        "\n"}${"未完成人数:" + this.remindList.length + "\n"}${
+        this.remindList.length
+          ? "未完成名单:" + this.remindList.join(",") + "\n"
+          : ""
+      }`;
+      var clipboard = new Clipboard(".tag-read2");
+      clipboard.on("success", e => {
+        this.$message.success("复制成功");
+        console.log("复制成功");
+        clipboard.destroy(); // 释放内存
+      });
+      clipboard.on("error", e => {
+        console.log("不支持复制,该浏览器不支持自动复制");
+        clipboard.destroy(); // 释放内存
+      });
+    },
+    getData() {
+      this.remindList = [];
+      this.remindName = [];
+
+      this.remindNum = 0;
+      let params = {
+        oid: this.oid,
+        org: this.org,
+        tea: this.teas.join(","),
+        ptype: this.pType
+      };
+
+      this.ajax
+        .get(this.$store.state.api + "selectExamineTeaRemind", params)
+        .then(res => {
+          let data = res.data[0];
+          this.excelData = JSON.parse(JSON.stringify(data));
+          this.remindNum = data.length > 0 ? data[0].num : 0;
+          data.forEach(e => {
+            this.remindList.push(e.username);
+          });
+          //   this.digLoading = false;
+
+          if (this.teas.length > 0) {
+            this.teas.forEach(e => {
+              this.TeaList.forEach(k => {
+                if (e == k.id) {
+                  this.remindName.push(k.name);
+                }
+              });
+            });
+          }
+
+          console.log("selectExamineTeaRemind", this.remindName);
+        })
+        .catch(err => {
+          console.error(err);
+        });
+
+      //     let params = {
+      //         id: this.testJson.courseId,
+      //         tea: this.TeachingValue
+      //     };
+      //     this.ajax
+      //         .get(this.$store.state.api + "getTestWorkShareCopy", params)
+      //         .then((res) => {
+      //             console.log('res.datares.datares.datares.datares.datares.data',res.data);
+      //             let parray = res.data[0]
+      //             let is = res.data[1]
+      //             this.noCount = parray.length - is.length
+      //             let isA = []
+      //             for(var i=0;i<is.length;i++){
+      //                 isA.push(is[i].userid)
+      //             }
+      //             let pname = []
+      //             for(var i=0;i<parray.length;i++){
+      //                 if(isA.indexOf(parray[i].userid) == -1){
+      //                     pname.push(parray[i].username)
+      //                 }
+      //             }
+      //             this.pname = pname
+      //         })
+      //         .catch((err) => {
+      //             console.error(err);
+      //         });
+    },
+    getExcelTab() {
+      var res = this.excelData;
+      // console.log('导出数据',res);
+      //如果value的json字段的key值和想要的headers值不一致时,可做如下更改
+      //将和下面的Object.fromEntries结合,将json字段的key值改变为要求的excel的header值
+      var array = [];
+      for (var i = 0; i < res.length; i++) {
+        var _json = {};
+        _json["教师姓名"] = res[i].username;
+        _json["教师账号"] = res[i].eName;
+        _json["所属教研室"] = res[i].tea;
+        array.push(_json);
+      }
+
+      var XLSX = require("xlsx");
+      const workbook = XLSX.utils.book_new(); //创建一个新的工作簿对象
+      let ws = XLSX.utils.json_to_sheet(array); //将json对象数组转化成工作表
+      ws["!cols"] = [
+        //设置每一列的宽度
+        { wch: 30 },
+        { wch: 30 },
+        { wch: 30 }
+      ];
+
+      XLSX.utils.book_append_sheet(workbook, ws, "sheet1"); //把sheet添加到workbook里,第三个参数是sheet名
+      XLSX.writeFile(workbook, "未完成名单.xlsx");
+      // const wopts = { bookType: "xlsx", bookSST: false, type: "array" };//写入的样式bookType:输出的文件类型,type:输出的数据类型,bookSST: 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
+      // const wbout = XLSX.write(workbook, wopts);// 浏览器端和node共有的API,实际上node可以直接使用xlsx.writeFile来写入文件,但是浏览器没有该API
+      // FileSaver.saveAs(new Blob([wbout], { type: "application/octet-stream" }), `${title} demo.xlsx`);//保存文件
+      this.$message({
+        message: "导出成功",
+        type: "success"
+      });
+    }
+  },
+  watch: {
+    remDig(newValue, oldValue) {
+      if (newValue) {
+        this.isSuo = true;
+        this.getData();
+      }
+    }
+  }
+  // mounted(){
+  //     console.log(top.origin);
+  // },
+};
+</script>
+
+<style scoped>
+.dialog_diy >>> .el-dialog {
+  height: 70% !important;
+  min-width: 650px !important;
+  margin-top: 10% !important;
+  /* height: 100%; */
+  /* margin: 0 auto !important; */
+}
+
+/* .dialog_diy >>> .el-dialog__header {
+  background: #454545 !important;
+  padding: 25px 20px;
+} */
+.dialog_diy >>> .el-dialog__header {
+  background: #fff !important;
+  padding: 15px 20px;
+}
+
+.dialog_diy >>> .el-dialog__body {
+  height: calc(100% - 124px);
+  box-sizing: border-box;
+  padding: 0px;
+}
+
+.dialog_diy >>> .el-dialog__title {
+  color: #000;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn {
+  top: 19px;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
+  color: #000;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
+  color: #000;
+}
+
+.dialog_diy >>> .el-dialog__body,
+.dialog_diy >>> .el-dialog__footer {
+  background: #fff;
+}
+
+.share_box {
+  width: 100%;
+  height: 100%;
+  padding: 20px 15px;
+  box-sizing: border-box;
+}
+
+.info_box {
+  margin: 0 0 20px;
+}
+
+.info_box > .info {
+  line-height: 18px;
+}
+
+.info_box > .info > span:nth-child(1) {
+  color: #00000099;
+}
+
+.info_box > .info > span:nth-child(2) {
+  color: #000000;
+}
+
+.info_box > .info + .info {
+  margin-top: 10px;
+}
+
+.url_box {
+  margin-bottom: 20px;
+}
+
+.qrcode_box {
+  margin-bottom: 20px;
+}
+
+.url_box > .url {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  border: 1px solid #e7e7e7;
+  border-radius: 4px;
+  height: 35px;
+  padding: 0 7px;
+  box-sizing: border-box;
+}
+
+.url_box > .url > span {
+  font-size: 16px;
+  color: #000000;
+}
+
+.url_box > .url > span:nth-child(1) {
+  width: 100%;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.url_box > .url > span:nth-child(2) {
+  margin-left: auto;
+  border-left: 1px solid #e7e7e7;
+  padding-left: 7px;
+  cursor: pointer;
+  min-width: fit-content;
+}
+
+.url_box > .title,
+.qrcode_box > .title {
+  font-size: 16px;
+  font-weight: 700;
+  margin-bottom: 10px;
+}
+
+.qrcode_box > .qrcode {
+  padding: 7px;
+  border: 1px solid #e7e7e7;
+  width: fit-content;
+  border-radius: 4px;
+  display: flex;
+  align-items: flex-end;
+}
+
+.qrcode_box > .qrcode > span:nth-child(1) {
+  width: 100px;
+  display: block;
+  height: 100px;
+}
+
+.qrcode_box > .qrcode > span:nth-child(2) {
+  background: #f0f2f5;
+  padding: 7px 15px;
+  font-size: 16px;
+  border-radius: 4px;
+  cursor: pointer;
+  color: #000;
+  margin-left: 7px;
+}
+
+.btn_box {
+  display: flex;
+  justify-content: flex-end;
+}
+
+.more {
+  cursor: pointer;
+  color: #0061ff;
+}
+</style>

+ 87 - 22
src/components/pages/test/examine/conpoments/targetPage.vue

@@ -236,23 +236,23 @@
           >
             <template slot-scope="scope">
               <div class="ScoreStep">
-                <input
-                  type="number"
-                  :readonly="TxtDig"
+                <el-input
                   v-if="scope.row.judge == 1"
-                  style=" color :#A7AAB2;"
+                  style=" color
+                :#A7AAB2;"
                   @blur="Submit(scope.row)"
-                  v-model="scope.row.cogSco"
-                />
-                <input
-                  type="number"
+                  v-model.number="scope.row.cogSco"
+                  v-stopMousewheel
+                ></el-input>
+                <el-input
                   v-else
                   :style="{
                     color: scope.row.cogSco == scope.row.evaSca ? '#000' : 'red'
                   }"
                   @blur="Submit(scope.row)"
-                  v-model="scope.row.cogSco"
-                />
+                  v-model.number="scope.row.cogSco"
+                  v-stopMousewheel
+                ></el-input>
               </div>
             </template>
           </el-table-column>
@@ -266,7 +266,6 @@
               <textarea
                 @blur="Submit2(scope.row)"
                 class="tArea"
-                :readonly="TxtDig"
                 v-model.trim="scope.row.cogSummary"
               />
             </template>
@@ -278,7 +277,18 @@
 </template>
 
 <script>
+// import Vue from 'vue';
 export default {
+  directives: {
+    stopMousewheel: {
+      inserted: function(el) {
+        const ele = el.tagName === "INPUT" ? el : el.querySelector("input");
+        ele.addEventListener("mousewheel", () => {
+          ele.blur();
+        });
+      }
+    }
+  },
   props: {
     pType: {
       //2专任教师 1班主任
@@ -292,7 +302,6 @@ export default {
       evaScoDigSvg: 0,
       evaScoDigCog: 0,
       evaScoDigPerC: 0,
-      TxtDig: false,
 
       diaIframe: false, //数据来源弹框
       diaScore: false, //查看分数弹框
@@ -1346,6 +1355,10 @@ export default {
   },
 
   methods: {
+    // 禁用滚轮事件
+    handleWheel(event) {
+      event.preventDefault();
+    },
     // 获取教研室
     getTeaList() {
       let params = {
@@ -1419,7 +1432,7 @@ export default {
           data.forEach(e => {
             e.json = JSON.parse(e.json);
           });
-          // console.log("data", data);
+          console.log("data", data);
 
           this.tableJsonCon.forEach(a => {
             data.forEach(b => {
@@ -1570,7 +1583,6 @@ export default {
           // 获取数据来源
           this.handleScoData();
           this.evaScoDig = false;
-          this.TxtDig = false;
         })
         .catch(error => {
           console.log(error);
@@ -1640,6 +1652,7 @@ export default {
 
     // 分数提交
     Submit(val) {
+      console.log("valvalvalvla", val);
       //#region
       // 修改了将页面上的分数也改变颜色,(方式改变,无用了)
       // this.tableData.forEach(e => {
@@ -1648,15 +1661,35 @@ export default {
       //   }
       // });
       //#endregion
-      this.TxtDig = true;
 
       if (val.cogSco > val.score) {
         val.cogSco = val.score;
+      } else if (val.cogSco < 0) {
+        val.cogSco = "";
+        this.$message.error("评分不能为负数");
       }
 
+      // 用来判断修改分数是否等于原先分数,如果相等就不提交
+      let judgeSubmit = 0;
+
+      val.json.forEach(e => {
+        if (judgeSubmit == 1) return;
+        e.children.forEach(i => {
+          if (i.id == this.secondId) {
+            if (i.sco2 == val.cogSco) {
+              judgeSubmit = 1;
+            }
+          }
+        });
+      });
+
+      if (judgeSubmit == 1) return;
+
+      let recordTit = "";
       val.json.forEach(e => {
         e.children.forEach(i => {
           if (i.id == this.secondId) {
+            recordTit = i.name;
             i.sco2 = val.cogSco;
             i.cogSum = val.cogSummary;
           }
@@ -1667,12 +1700,17 @@ export default {
         {
           uid: this.userid,
           tid: val.id,
-          json: JSON.stringify(val.json)
+          typ: this.pType,
+          json: JSON.stringify(val.json),
+          rjson: JSON.stringify({
+            rjson: val.json,
+            text: `按指标,修改了${recordTit}分数`
+          })
         }
       ];
       // return console.log(params);
       this.ajax
-        .post(this.$store.state.api + "updateExamineCogData", params)
+        .post(this.$store.state.api + "updateExamineCogDataCopy", params)
         .then(res => {
           this.getSecondData();
         })
@@ -1683,11 +1721,28 @@ export default {
 
     // 概述提交
     Submit2(val) {
-      this.TxtDig = true;
+      // 用来判断修改分数是否等于原先分数,如果相等就不提交
+      let judgeSubmit = 0;
+
+      val.json.forEach(e => {
+        if (judgeSubmit == 1) return;
+        e.children.forEach(i => {
+          if (i.id == this.secondId) {
+            if (i.cogSum == val.cogSummary) {
+              judgeSubmit = 1;
+            }
+          }
+        });
+      });
+
+      if (judgeSubmit == 1) return;
+
+      let recordTit = "";
 
       val.json.forEach(e => {
         e.children.forEach(i => {
           if (i.id == this.secondId) {
+            recordTit = i.name;
             i.cogSum = val.cogSummary;
           }
         });
@@ -1697,12 +1752,17 @@ export default {
         {
           uid: this.userid, //修改人id
           tid: val.id,
-          json: JSON.stringify(val.json)
+          typ: this.pType,
+          json: JSON.stringify(val.json),
+          rjson: JSON.stringify({
+            rjson: val.json,
+            text: `按指标,修改了${recordTit}概述`
+          })
         }
       ];
       // return console.log(params);
       this.ajax
-        .post(this.$store.state.api + "updateExamineCogData", params)
+        .post(this.$store.state.api + "updateExamineCogDataCopy", params)
         .then(res => {
           this.getSecondData();
         })
@@ -1759,14 +1819,19 @@ export default {
         {
           uid: this.userid,
           tid: val.id,
-          json: JSON.stringify(val.json)
+          typ: this.pType,
+          json: JSON.stringify(val.json),
+          rjson: JSON.stringify({
+            rjson: val.json,
+            text: `按指标,进行了一键保存`
+          })
         }
       ];
       // return console.log(params);
 
       return new Promise(resolve => {
         this.ajax
-          .post(this.$store.state.api + "updateExamineCogData", params)
+          .post(this.$store.state.api + "updateExamineCogDataCopy", params)
           .then(res => {
             resolve(res);
           })

+ 61 - 11
src/components/pages/test/examine/index.vue

@@ -17,21 +17,45 @@
           班主任
         </div>
       </div>
-      <div>
-        <el-select v-model="cutTable" placeholder="请选择">
-          <el-option
-            v-for="item in cutTabOpts"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          >
-          </el-option>
-        </el-select>
+      <div class="operate">
+        <el-input
+          v-if="cutTable == 1"
+          v-model="teacherName"
+          @change="selectTeaName"
+          placeholder="请输入教师姓名"
+        ></el-input>
+        <div style="margin: 0 20px;">
+          <el-select v-model="cutTable" placeholder="请选择">
+            <el-option
+              v-for="item in cutTabOpts"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </div>
+        <div
+          v-if="cutTable == 1"
+          class="remindBtn"
+          style="margin-right: 20px;"
+          @click="excelBtn"
+        >
+          导出
+        </div>
+        <div v-if="cutTable == 1" class="remindBtn" @click="personBtn">
+          提醒
+        </div>
       </div>
     </div>
     <div class="testCon">
       <targetPage :pType="pType" v-if="cutTable == 0"></targetPage>
-      <personPage :pType="pType" v-if="cutTable == 1"></personPage>
+      <personPage
+        ref="child"
+        :pType="pType"
+        :teacherName="teacherName"
+        v-if="cutTable == 1"
+      ></personPage>
     </div>
   </div>
 </template>
@@ -49,6 +73,7 @@ export default {
     return {
       pType: 2,
       cutTable: 0,
+      teacherName: "",
       cutTabOpts: [
         {
           value: 0,
@@ -64,6 +89,15 @@ export default {
   methods: {
     cutPage(e) {
       this.pType = e;
+    },
+    selectTeaName() {
+      this.$refs.child.getData();
+    },
+    excelBtn() {
+      this.$refs.child.getExcel();
+    },
+    personBtn() {
+      this.$refs.child.remindExamine();
     }
   }
 };
@@ -102,4 +136,20 @@ export default {
   box-sizing: border-box;
   padding: 20px;
 }
+.operate {
+  display: flex;
+}
+.operate >>> .el-input {
+  width: 200px !important;
+}
+.operate > .remindBtn {
+  background: #409eff;
+  padding: 10px 15px;
+  box-sizing: border-box;
+  width: 90px;
+  text-align: center;
+  border-radius: 4px;
+  cursor: pointer;
+  color: #fff;
+}
 </style>

+ 1 - 1
src/components/pages/test/file/wPdf.vue

@@ -6,7 +6,7 @@
                 :src="'https://cloud.cocorobo.cn/pdf.js/web/viewer.html?file=' + encodeURIComponent(url)"></iframe>
         </div>
         <span slot="footer" class="dialog-footer">
-            <el-button @click="dialogVisiblePdf = false;">关 闭</el-button>
+            <el-button @click="close">关 闭</el-button>
         </span>
     </el-dialog>
 </template>

+ 49 - 6
src/components/pages/testPerson/examine/index.vue

@@ -68,14 +68,20 @@
                   <div>{{ k.score }}</div>
                   <div>
                     <div v-if="k.type == 1" class="ScoreStep">
-                      <input
+                      <el-input
                         v-if="allData.type * 1 != 2"
-                        type="number"
                         @blur="
-                          saveTab(k.sco1 > k.score ? (k.sco1 = k.score) : '')
+                          saveTab(
+                            k.sco1 > k.score
+                              ? (k.sco1 = k.score)
+                              : '' || k.sco1 < 0
+                              ? (k.sco1 = '')
+                              : ''
+                          )
                         "
-                        v-model="k.sco1"
-                      />
+                        v-model.number="k.sco1"
+                        v-stopMousewheel
+                      ></el-input>
                       <div v-else>{{ k.sco1 }}</div>
                     </div>
                     <div v-else class="ScoreStep">/</div>
@@ -172,6 +178,16 @@
 
 <script>
 export default {
+  directives: {
+    stopMousewheel: {
+      inserted: function(el) {
+        const ele = el.tagName === "INPUT" ? el : el.querySelector("input");
+        ele.addEventListener("mousewheel", () => {
+          ele.blur();
+        });
+      }
+    }
+  },
   data() {
     return {
       pType: 2,
@@ -207,6 +223,10 @@ export default {
     // console.log(JSON.stringify(this.TeaTabJson));
   },
   methods: {
+    // 禁用滚轮事件
+    handleWheel(event) {
+      event.preventDefault();
+    },
     goFillIn(val) {
       this.$router.push(
         `/doTest?cid=${val}&org=${this.org}&type=3&role=${this.role}&isN=&oid=${this.oid}&userid=${this.userid}`
@@ -226,23 +246,34 @@ export default {
       // }
       let judgeNum = 0;
 
+      // i.type == 1 这个用来判断 科组评价的因为最后两个教师不能打分所以type设为2,下面的循环将他们两个排除出去
       this.PageBaseData.forEach(e => {
         e.children.forEach(i => {
           if (i.type == 1) {
             if (!i.sco1) {
               judgeNum = 1;
             }
+            if (i.sco1 * 1 < 0) {
+              judgeNum = 2;
+            }
           }
         });
       });
 
-      if (judgeNum != 0) {
+      if (judgeNum == 1) {
         this.$message({
           message: "请将【自评】分数列填写完整后再提交。",
           type: "warning"
         });
         return;
       }
+      if (judgeNum == 2) {
+        this.$message({
+          message: "自评分数不可低于0,请检查后重新输入。",
+          type: "warning"
+        });
+        return;
+      }
 
       for (const e of this.PageBaseData) {
         for (const k of e.children) {
@@ -726,6 +757,18 @@ input[type="number"] {
 /* .twoCon > div >>> .el-input {
   height: 100% !important;
 } */
+.ScoreStep >>> .el-input-number {
+  height: 100% !important;
+}
+.ScoreStep >>> .el-input {
+  height: 100% !important;
+}
+.ScoreStep >>> .el-input__inner {
+  height: 100%;
+  padding-left: 15px;
+  border: none;
+  padding-right: 15px;
+}
 .twoCon > div > input {
   border: none;
   width: 100%;

+ 3 - 2
src/components/pages/testPerson/info/index.vue

@@ -20,13 +20,13 @@
             <span>{{info.classname ? info.classname : '暂无'}}</span>
           </el-tooltip>
         </div>
-        <div class="i_bottom_span">
+        <div v-if="!oidArray.includes(oid)" class="i_bottom_span">
           <span>学科</span>
           <el-tooltip :content="info.subject ? info.subject : '暂无'" placement="top" effect="dark">
             <span>{{info.subject ? info.subject : '暂无'}}</span>
           </el-tooltip>
         </div>
-        <div class="i_bottom_span">
+        <div v-if="!oidArray.includes(oid)" class="i_bottom_span">
           <span>职务</span>
           <el-tooltip :content="info.job ? info.job : '暂无'" placement="top" effect="dark">
             <span>{{info.job ? info.job : '暂无'}}</span>
@@ -61,6 +61,7 @@ export default {
       avator: avator,
       info: {},
       dialogVisibleInfo:false,
+      oidArray: ["d67940a5-510c-40ea-9c9a-2631ab03013a"]
     }
   },
   watch: {

+ 3 - 2
src/components/pages/testPerson/info/infoDialog/index.vue

@@ -27,13 +27,13 @@
                         </el-select>
                     </div>
                 </div>
-                <div class="info_span">
+                <div v-if="!oidArray.includes(oid)" class="info_span">
                     <span>学科:</span>
                     <div>
                         <el-input v-model="info.subject" placeholder="请输入学科"></el-input>
                     </div>
                 </div>
-                <div class="info_span">
+                <div v-if="!oidArray.includes(oid)" class="info_span">
                     <span>职务:</span>
                     <div>
                         <el-input v-model="info.job" placeholder="请输入职务"></el-input>
@@ -100,6 +100,7 @@ export default {
             info: {},
             imgLoading: false,
             classJuri: [],
+            oidArray: ["d67940a5-510c-40ea-9c9a-2631ab03013a"]
         };
     },
     methods: {

+ 2 - 2
src/components/pages/testStudent/view/component/file.vue

@@ -242,7 +242,7 @@ const getFile = url => {
     }
     var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
     let name = decodeURIComponent(
-      _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+      _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' ')
     );
     var params = {
       Bucket: "ccrb",
@@ -785,7 +785,7 @@ export default {
       _this.downLoading = _url2;
       var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
       let name = decodeURIComponent(
-        _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+        _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' ')
       );
       var params = {
         Bucket: "ccrb",

Some files were not shown because too many files changed in this diff