Prechádzať zdrojové kódy

Merge branch 'beta'

SanHQin 1 týždeň pred
rodič
commit
9e35b52734
30 zmenil súbory, kde vykonal 967 pridanie a 276 odobranie
  1. 1 1
      dist/index.html
  2. 0 0
      dist/static/css/app.04513a0f1af3cdc2c2e2f0cc5f4bb029.css
  3. 0 0
      dist/static/css/app.429741cd50165bbe7834c5144f9168b2.css
  4. 0 0
      dist/static/css/app.429741cd50165bbe7834c5144f9168b2.css.map
  5. 0 0
      dist/static/js/app.83a25253e3953402dae6.js
  6. 0 0
      dist/static/js/app.83a25253e3953402dae6.js.map
  7. 0 0
      dist/static/js/manifest.161e82026ac2ae03ab6f.js.map
  8. 9 2
      src/components/pages/classroomObservation/components/analysisSpecialItem.vue
  9. 4 2
      src/components/pages/classroomObservation/index.vue
  10. 4 2
      src/components/pages/classroomObservation/tools/mixin.js
  11. 36 1
      src/components/pages/data.vue
  12. 10 3
      src/components/pages/liyuan/aiOffice.vue
  13. 10 4
      src/components/pages/liyuan/components/backPage.vue
  14. 7 2
      src/components/pages/liyuan/components/card.vue
  15. 24 31
      src/components/pages/liyuan/page/examine/index.vue
  16. 12 57
      src/components/pages/liyuan/page/teadTest.vue
  17. 9 2
      src/components/pages/liyuan/teacherDevelop.vue
  18. 18 4
      src/components/pages/sassPlatform/index.vue
  19. 16 2
      src/components/pages/test/add/setInfo/index.vue
  20. 362 43
      src/components/pages/test/check/index.vue
  21. 167 19
      src/components/pages/test/examine/conpoments/personPage.vue
  22. 5 4
      src/components/pages/test/examine/conpoments/targetPage.vue
  23. 5 3
      src/components/pages/test/examine/index.vue
  24. 15 1
      src/components/pages/test/index.vue
  25. 10 18
      src/components/pages/testPerson/examine/index.vue
  26. 103 29
      src/components/pages/testPerson/info/infoDialognew/index.vue
  27. 18 3
      src/components/pages/testPerson/test/index.vue
  28. 40 2
      src/components/pages/testPerson/test/test.vue
  29. 45 16
      src/components/pages/testStudent/view/preview.vue
  30. 37 25
      src/components/pages/workPage/index.vue

+ 1 - 1
dist/index.html

@@ -32,7 +32,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.04513a0f1af3cdc2c2e2f0cc5f4bb029.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.161e82026ac2ae03ab6f.js></script><script type=text/javascript src=./static/js/vendor.b7212920b6e58d14a873.js></script><script type=text/javascript src=./static/js/app.ad72a320e1a0678e305d.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.429741cd50165bbe7834c5144f9168b2.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.161e82026ac2ae03ab6f.js></script><script type=text/javascript src=./static/js/vendor.b7212920b6e58d14a873.js></script><script type=text/javascript src=./static/js/app.83a25253e3953402dae6.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
dist/static/css/app.04513a0f1af3cdc2c2e2f0cc5f4bb029.css


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
dist/static/css/app.429741cd50165bbe7834c5144f9168b2.css


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
dist/static/css/app.429741cd50165bbe7834c5144f9168b2.css.map


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
dist/static/js/app.83a25253e3953402dae6.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
dist/static/js/app.83a25253e3953402dae6.js.map


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
dist/static/js/manifest.161e82026ac2ae03ab6f.js.map


+ 9 - 2
src/components/pages/classroomObservation/components/analysisSpecialItem.vue

@@ -722,6 +722,7 @@ ${JSON.stringify(_dataList)}
     },
     // 教学模式分析
     getTeachingModeData(_dataList, type = 0) {
+    console.log("_dataList",_dataList)
       this.openItem = false;
       this.loading = true;
       let _continuousTime = 0;
@@ -774,11 +775,17 @@ ${JSON.stringify(_dataList)}
 
         if (item.role == "老师") {
           _teacherTime += this.convertToSeconds(item.time);
-        }
 
-        _totalTime += this.convertToSeconds(item.time);
+        }
+        console.log("time",_totalTime,'==>',this.convertToSeconds(item.time))
+        if(item.time){
+          _totalTime += this.convertToSeconds(item.time);
+        }
       });
 
+      console.log("_teacherTime",_teacherTime)
+      console.log("_totalTime",_totalTime)
+      console.log("_continuousTime",_continuousTime)
       let _RT = (_teacherTime / _totalTime).toFixed(2);
       let _CH = (_continuousTime / _totalTime).toFixed(2);
 

+ 4 - 2
src/components/pages/classroomObservation/index.vue

@@ -544,10 +544,10 @@ export default {
           }
           i.dataList.sort((a, b) => a.tIndex - b.tIndex);
           tagHtml += `<h1 style="font-size:16pt;margin-bottom:-1in">${
-            this.tag[i.value]
+            this.tag[c]
           }、${i.name}</h1>`;
           dire += `<p style="font-size:14pt;margin-bottom:-0.8in">${
-            this.tag[i.value]
+            this.tag[c]
           }、${i.name}</p>`;
 
           for (let d = 0; d < i.dataList.length; d++) {
@@ -636,6 +636,8 @@ export default {
 			</div>
 			${directoryHtml}
 
+      <p><br style="page-break-before:always;"></p>
+
 			<div>
 				${analysisHtml}
 			</div>

+ 4 - 2
src/components/pages/classroomObservation/tools/mixin.js

@@ -2006,6 +2006,7 @@ CH:${_CH}
 
           let analysisHtml = ``;
 
+
           // console.log("开始处理文件")
           for (let c = 0; c < tagList.length; c++) {
             // console.log(tagList[c],"tagList[c]")
@@ -2016,9 +2017,9 @@ CH:${_CH}
               i.dataList = i.dataList.filter(i2 => i2.tIndex != 2);
             }
             i.dataList.sort((a, b) => a.tIndex - b.tIndex);
-            tagHtml += `<h1 style="font-size:16pt;margin-bottom:-1in">${this.tag[i.value]
+            tagHtml += `<h1 style="font-size:16pt;margin-bottom:-1in">${this.tag[c]
               }、${i.name}</h1>`;
-            dire += `<p style="font-size:14pt;margin-bottom:-0.8in">${this.tag[i.value]
+            dire += `<p style="font-size:14pt;margin-bottom:-0.8in">${this.tag[c]
               }、${i.name}</p>`;
 
             for (let d = 0; d < i.dataList.length; d++) {
@@ -2099,6 +2100,7 @@ CH:${_CH}
 			      	</div>
 			      </div>
 			      ${directoryHtml}
+            <p><br style="page-break-before:always;"></p>
 
 			      <div>
 			      	${analysisHtml}

+ 36 - 1
src/components/pages/data.vue

@@ -509,7 +509,7 @@ export default {
           }, 0);
         }, 0);
     },
-    setOpenId(openid) {
+    addOpenid(openid) {
       this.ajax.post(this.$store.state.api + "UpdateOpenId", [
         { userid: this.userid, openid: openid },
       ]).then((res) => {
@@ -519,7 +519,42 @@ export default {
       }).catch((err) => {
         this.$message.error("绑定失败请重新扫码");
         console.error(err);
+        	setTimeout(() => {
+						this.wechatDialogVisible = true;
+						this.wechatLogin();
+					}, 1000);
       })
+		},
+    setOpenId(openid) {
+      this.ajax
+      .post(this.$store.state.api + "selectliyuanOpenid", [
+        { pid: openid },
+      ])
+      .then((res) => {
+					if (!res.data[0].length) {
+						this.addOpenid(openid);
+					} else {
+						let uname = res.data[0].map(item => item.username).join(',');
+						console.log('uname',uname);
+						
+						this.$message.error("该微信已绑定" + uname + "账号");
+						this.wechatDialogVisible = false;
+					}
+				})
+				.catch((err) => {
+					console.log("err", err);
+				});
+
+      // this.ajax.post(this.$store.state.api + "UpdateOpenId", [
+      //   { userid: this.userid, openid: openid },
+      // ]).then((res) => {
+      //   this.$message.success("绑定成功");
+      //   this.wechatDialogVisible = false;
+      //   this.getDetail();
+      // }).catch((err) => {
+      //   this.$message.error("绑定失败请重新扫码");
+      //   console.error(err);
+      // })
     }
   },
   mounted() {

+ 10 - 3
src/components/pages/liyuan/aiOffice.vue

@@ -2,7 +2,13 @@
   <div class="teacherDevelop">
     <topBar title="智能教务" detail="日常资料收集 · AI智能分析 · 会议智能转录 · 平台账号管理"></topBar>
     <div class="cardBox">
-      <card v-for="item in cardData(cardArray)" :key="item.title" :title="item.title" :icon="item.icon" :to="item.to" :type="item.type"></card>
+      <card v-for="item in cardData(cardArray)" 
+      :key="item.title" 
+      :title="item.title" 
+      :icon="item.icon" 
+      :to="item.to" 
+      :sortId="item.sortId"
+      :type="item.type"></card>
     </div>
   </div>
 </template>
@@ -19,12 +25,13 @@ export default {
     return {
       role: this.$route.query.role,
       cardArray: [
-        { title: '资料收集', icon: require('../../../assets/icon/liyuan/zlsj.svg'), type: 1, to: "/teadTest",role:0 },
+        { title: '资料收集', icon: require('../../../assets/icon/liyuan/zlsj.svg'), type: 1, to: "/teadTest",role:0,sortId:'e18d88b3-e828-11ef-b508-005056924926'},
         { title: '会议妙记', icon: require('../../../assets/icon/liyuan/hymj.svg'), type: 2, to: `/aigpt/#/cocoFlowConferenceTrick?userid=${this.$route.query.userid}&oid=${this.$route.query.oid}&role=${this.$route.query.role}&tType=${this.$route.query.tType}&org=${this.$route.query.org}&gotype=1`,role:0 },
         { title: '教师管理', icon: require('../../../assets/icon/liyuan/teamange.svg'), type: 1, to: "/teacher",role:1 },
         { title: '学生管理', icon: require('../../../assets/icon/liyuan/stumange.svg'), type: 1, to: "/Listudent",role:0 },
         { title: '办公表单', icon: require('../../../assets/icon/liyuan/workTest.svg'), type: 1, to: "/test",role:1 },
         { title: '教研室管理', icon: require('../../../assets/icon/liyuan/workTest.svg'), type: 1, to: "/teacherOffice",role:1 },
+        { title: '数据看板', icon: require('../../../assets/icon/liyuan/workTest.svg'), type: 3, to: `https://liyuan.cocorobo.cn/#/dataBoardNew?userid=${this.$route.query.userid}&oid=${this.$route.query.oid}&org=${this.$route.query.org}`,role:1 },
       ]
     }
   },
@@ -51,7 +58,7 @@ export default {
 
 .cardBox{
   display: grid;
-  grid-template-columns: repeat(6, 1fr);
+  grid-template-columns: repeat(7, 1fr);
   gap: 20px;
   width: 100%;
   margin-top: 20px;

+ 10 - 4
src/components/pages/liyuan/components/backPage.vue

@@ -1,7 +1,9 @@
 <template>
-    <div class="pgb" @click="backO">
-        <img src="../../../../assets/icon/liyuan/backPage.svg" alt="">
-        <div>{{ tit }}</div>
+    <div class="pgb">
+        <div @click="backO" class="pgbL">
+            <img src="../../../../assets/icon/liyuan/backPage.svg" alt="">
+            <div>{{ tit }}</div>
+        </div>
     </div>
 </template>
 
@@ -38,9 +40,13 @@
     font-size: 20px;
     display: flex;align-items: center;
     gap: 10px;
-    cursor: pointer;
     padding:40px 90px 0;
     /* height: 23.8px; */
     margin-bottom: 15px;
 }
+.pgbL{
+    display: flex;align-items: center;
+    gap: 10px;
+    cursor: pointer;
+}
 </style>

+ 7 - 2
src/components/pages/liyuan/components/card.vue

@@ -22,6 +22,9 @@ export default {
         type: {
             type: Number,
         },
+        sortId: {
+            type: String,
+        },
     },
     data() {
         return {
@@ -37,13 +40,15 @@ export default {
         goTo() {
             sessionStorage.setItem('gotype', this.$route.path);
 
-            if (this.type == 1) {
-                this.$router.push({ path: this.to, query: { userid: this.userid, oid: this.oid, org: this.org, role: this.role,tType: this.tType, gotype: 1 } })
+            if (this.type == 1) {    
+                this.$router.push({ path: this.to, query: { userid: this.userid, oid: this.oid, org: this.org, role: this.role,tType: this.tType, gotype: 1,sortId:this.sortId } })
             }else if (this.type == 2) {
                 let con = this.betaL =='beta'? 'https://beta.cloud.cocorobo.cn' : 'https://cloud.cocorobo.cn'
                 console.log( `${con}${this.to}`);
                 window.location.href = `${con}${this.to}`;
                 
+            }else if (this.type == 3) {
+                window.location.href = this.to;
             }else if (this.type == 4) {
                 let con = this.betaL =='beta'? 'https://beta.pbl.cocorobo.cn' : 'https://pbl.cocorobo.cn'
                 console.log( `${con}${this.to}`);

+ 24 - 31
src/components/pages/liyuan/page/examine/index.vue

@@ -181,7 +181,12 @@
           </div>
         </div>
       </div>
+      <div class="brief" v-if="brief">
+      <span v-html="brief" style="white-space: pre-wrap;word-break: break-all;"></span>
     </div>
+    </div>
+
+
 
     <!-- 点击数据来源 -->
     <el-dialog
@@ -270,10 +275,9 @@ export default {
   //   this.getPageBase2(2)
   // },
   mounted() {
-    this.getPageBase();
+    // this.getPageBase();
     this.getPageBase2(1)
     this.getPageBase2(2)
-    console.log('2222');
 
     // console.log(JSON.stringify(this.TeaTabJson));
   },
@@ -402,8 +406,6 @@ export default {
         .post(this.$store.state.api + "addTestExamineWorks2", params)
         .then(res => {
           console.log("addTestExamineWorks2", res);
-          // this.getData();
-          // this.handleData();
         })
         .catch(error => {
           console.log(error);
@@ -424,10 +426,12 @@ export default {
       this.ajax
         .get(this.$store.state.api + "getTestExamineByUserId2", params)
         .then(res => {
-          console.log("getTestExamineByUserId", res);
+          // console.log("getTestExamineByUserId", res);
 
           if (res.data[0].length > 0) {
+
             this.allData = res.data[0][0];
+
             let val = JSON.parse(res.data[0][0].json);
 
             this.PageBaseData.forEach(e => {
@@ -446,22 +450,15 @@ export default {
                 }
               });
             });
-            // console.log('this.PageBaseData2222222',this.PageBaseData);
+
             this.handleData();
             return (this.tabLoad = false);
           } else {
             this.allData.type = 1;
             this.allData.rjson = "";
             this.handleData();
-            // console.log('this.PageBaseData3333',this.PageBaseData);
             this.tabLoad = false;
           }
-          // this.$forceUpdate();
-          //  else {
-          //   this.allData.type = 1;
-          //   this.getPageBase();
-          //   this.tabLoad = false;
-          // }
         })
         .catch(error => {
           console.log(error);
@@ -481,21 +478,19 @@ export default {
           // console.log("resresresres", res.data[0]);
           // this.allData = res.data[0][0];
           let testExamineBaseList = res.data[0];
-          // console.log("res.data[0][0]", res.data[0][0]);
+          console.log("res.data[0][0]", res.data[0][0]);
+          this.brief = res.data[0][0].brief;
           this.testExamineBaseList = testExamineBaseList;
-          // console.log("selectTestExamineBase", res.data[0][0]);
+          console.log("selectTestExamineBase", res.data[0][0]);
           this.PageBaseData = JSON.parse(res.data[0][0].json);
-          // console.log('this.PageBaseData1111111111111111',this.PageBaseData);
           // 先获取基础模板,然后再获取用户又没有填写过,填写过就开始循环赋值给基础模板,最后提交基础模板
           this.getData();
-
-          // this.handleData();
         })
         .catch(error => {
           console.log(error);
         });
     },
-    // 获取页面基础ui信息,年度筛选框数据和展示哪个页面
+    // 获取页面基础ui信息
     getPageBase2(type) {
       let params = {
         typ: type,
@@ -512,10 +507,10 @@ export default {
             if(this.timeListA.length>0)this.timeA = this.timeListA[0].value;
           }else {
             this.bArray = res.data[0];
-            this.timeListB = this.bArray.map(i=>{return {value:i.time,label:i.timeLabel}}) //获取年度筛选框数据
-            if(this.timeListB.length>0)this.timeB = this.timeListB[0].value; //默认选择最新年度
-            if(!this.bArray.length){    
-              this.pType = 1    //显示专任教室页面
+            this.timeListB = this.bArray.map(i=>{return {value:i.time,label:i.timeLabel}})
+            if(this.timeListB.length>0)this.timeB = this.timeListB[0].value;
+            if(!this.bArray.length){
+              this.pType = 1
             }
           }
         })
@@ -523,7 +518,7 @@ export default {
           console.log(error);
         });
     },
-    async handleData() {  //获取数据来源数据
+    async handleData() {
       for (const e of this.PageBaseData) {
         for (const k of e.children) {
           if (k.testid.test.length > 0) {
@@ -533,8 +528,6 @@ export default {
       }
     },
     computedTest(val) {
-      // console.log('val',val);
-      
       let params = [
         {
           uid: this.userid,
@@ -555,7 +548,7 @@ export default {
     // 查看数据来源
     lookPrize(val) {
       // return;
-      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=${this.userid}&tType=${this.pType}&examineId=${this.testExamineBaseList[0].id}`;
+      this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?userid=${this.userid}&cid=${val}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${this.userid}&tType=${this.pType}&examineId=${this.testExamineBaseList[0].id}`;
       // 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;
     },
@@ -572,7 +565,7 @@ export default {
 .testPersonExamine {
   width: 100%;
   min-width: calc(100px * 10);
-  height: 100%;
+  height: calc(100%);
   /* overflow-x: scroll; */
   /* overflow: auto; */
   display: flex;
@@ -581,7 +574,7 @@ export default {
   box-sizing: border-box;
   background-color: #fff;
 	/* margin: 10px 0; */
-	border-radius: 5px;
+	/* border-radius: 5px; */
 }
 /* .tArea { */
   /* box-sizing: border-box; */
@@ -689,9 +682,9 @@ export default {
   width: 100%;
   min-width: 1300px;
   margin: 0 auto;
-  height: 100%;
+  height: auto;
   box-sizing: border-box;
-  padding-bottom: 60px;
+  padding-bottom: 10px;
   font-size: 14px;
 }
 

+ 12 - 57
src/components/pages/liyuan/page/teadTest.vue

@@ -2,19 +2,14 @@
     <div class="i_body_box">
         <backPage tit="资料搜集"></backPage>
         <div class="check_nav">
-            <!-- <div class="nav all" v-show="this.ExamineBase.length > 0" :class="{ active: type == '1' }" @click="checkType('1')">
-                年度考核
-            </div> -->
             <div class="nav all" :class="{ active: checkTypeValue == typeListStr }" 
             @click="changeShowType(typeListStr)">
                 全部
             </div>
             <div class="nav" v-for="item in typeList" :key="item.id" :class="{ active: checkTypeValue == item.id,all:['8bfa67ce-e82a-11ef-b508-005056924926','9d3289d2-e82a-11ef-b508-005056924926','a824c728-e82a-11ef-b508-005056924926','8085418b-e82a-11ef-b508-005056924926'].includes(item.id)}" 
             @click="changeShowType(item.id,item)">{{ item.name }}</div>
-           
         </div>
         <div class="check_box" v-loading="loading">
-            <!-- <examine v-if="type==1"></examine> -->
             <div class="noneData"  v-if="!worksArray.length && type!=1" style="text-align: center; margin-top: 20px;">
                 暂无数据
             </div>
@@ -55,8 +50,6 @@
                                 <div class="time">
                                     <span>提交记录{{item.array.length - index}}</span>
                                 </div>
-                                <!-- <img @click="deleteTest(test.id)" class="delete"
-                                    src="../../../../assets/icon/test/delete.png" alt="" /> -->
                                 <div class="utime">
                                     <span>{{ test.utime }}</span>
                                 </div>
@@ -67,23 +60,11 @@
                                     <div @click="deleteTest(test.id)" class="delete">
                                         <span>删除</span>
                                     </div>
-                                    <!-- <div @click="checkTest(test.courseid, test.id)">
-                                        <span></span><span>查看</span>
-                                    </div>
-                                    <div @click="copyTest(test.id)">
-                                        <span></span><span>复制</span>
-                                    </div> -->
                                 </div>
                             </div>
                         </div>
                         <div class="test_add_box"
                             v-else-if="item.carray" v-loading="!item.carray.length">
-                            <!-- <div class="courseLength" v-for="(course, index) in item.carray" :key="index" @click="doTest3(item, course)">
-                                <span class="finish" :class="{is: course.array.length}"></span>
-                                <span>{{ index+1 }}、</span>
-                                <span>{{ course.title }}</span>
-                                <span>{{ course.username }}</span>
-                            </div> -->
                             <div class="test courseLength" v-for="(course, index) in item.carray" :key="index">
                                 <div class="time">
                                     <el-tooltip :content="course.title+'-'+course.username" placement="top" effect="dark">
@@ -125,8 +106,8 @@ export default {
         return {
             userid: this.$route.query.userid,
             oid: this.$route.query.oid,
+            sortId: this.$route.query.sortId,
             type: "",
-            typeId:'e18d88b3-e828-11ef-b508-005056924926',
             typeList:[],
             ExamineBase: [],
             typeArray: [],
@@ -269,37 +250,33 @@ export default {
 
           if(this.typeList.length){
             _result = this.typeList.map(i=>i.id)
-            _result.push(this.typeId);
+            _result.push(this.sortId);
             _result = _result.join(',')
           }
 
           return _result;
         }
     },
-    watch:{
-      typeId(newValue){
-        this.changeShowType(newValue)
-      }
-    },
     methods: {
         getNavType() {
+            let _this = this
             let params = {
                 oid: "",//this.oid
             };
+            let inte = (this.sortId == 'eefb7195-8ee7-11f0-9c7b-005056924926') ? 'selectTestType_liYuan' : 'selectTestType'
             this.ajax
-                .get(this.$store.state.api + "selectTestType", params)
+                .get(this.$store.state.api + inte, params)
                 .then(res => {
                     let _data = res.data[0];
                     console.log('_data',_data);
-                    // _data.fliter(e=>{
-
-                    // })
+                    console.log('_this.sortId',_this.sortId);
+                    
                     this.typeList = _data.filter(function(item, index) {
-                        return item.pid == 'e18d88b3-e828-11ef-b508-005056924926';
+                        return item.pid == _this.sortId;
                     });
+
                     this.changeShowType(this.typeListStr)
 
-                    //  = _data.fliter(e =>{ return e.pid == 'e18d88b3-e828-11ef-b508-005056924926'})
                     console.log('this.typeList',this.typeList);
 
                     
@@ -321,7 +298,6 @@ export default {
                 if(type == 1 && !res.data[0].length){
                     this.getPageBase(2)
                 }
-                // console.log("selectTestExamineBase", res.data);
                 })
                 .catch(error => {
                 console.log(error);
@@ -346,11 +322,6 @@ export default {
                     this.typeArray = res.data[0];
                     if(type == 1){
                         this.type = ''
-                        // if (this.typeArray.length) {
-                        //     this.type = this.typeArray[0].id;
-                        // } else {
-                        //     this.type = '0';
-                        // }
                     }
                     this.getWorks()
                 })
@@ -678,31 +649,15 @@ export default {
             return res.data[0]
         },
         changeShowType(value){
-            console.log('value',value);
+            console.log('changeShowType',value);
             
-          this.checkTypeValue = value;
-          this.getWorks();
+            this.checkTypeValue = value;
+            this.getWorks();
         }
     },
     mounted() {
-        // this.selectTestType(1);
-        // this.getPageBase()
         this.getNavType()
-        
-        console.log('this.typeListStr',this.typeListStr);
-        
-        // if(this.typeListStr){
-        //   this.changeShowType(this.typeListStr)
-          // this.checkTypeValue = this.typeId
-        // }
     },
-    // activated(){
-    //     // this.selectTestType(2);
-    //     if(this.typeListStr){
-    //       this.changeShowType(this.typeListStr)
-    //       // this.checkTypeValue = this.typeId
-    //     }
-    // },
 };
 </script>
 

+ 9 - 2
src/components/pages/liyuan/teacherDevelop.vue

@@ -2,7 +2,14 @@
   <div class="teacherDevelop">
     <topBar title="教师发展" detail="教师年度考核 · 教师成长画像 · AI课堂观察"></topBar>
     <div class="cardBox">
-      <card v-for="item in cardData(cardArray)" :key="item.title" :title="item.title" :icon="item.icon" :to="item.to" :type="item.type"></card>
+      <card v-for="item in cardData(cardArray)" 
+      :key="item.title" 
+      :title="item.title" 
+      :icon="item.icon" 
+      :to="item.to" 
+      :type="item.type"
+      :sortId="item.sortId"
+      ></card>
     </div>
   </div>
 </template>
@@ -27,13 +34,13 @@ export default {
   data() {
     return {
       role: this.$route.query.role,
-
       cardArray: [
         { title: '年度考核', icon: require('../../../assets/icon/liyuan/niandukaohe.svg'), type: 1, to: "/examineL",role:0 },
         { title: '个人档案', icon: require('../../../assets/icon/liyuan/gerendangan.svg'), type: 1, to: "/userInfoL",role:0 },
         { title: '教师画像', icon: require('../../../assets/icon/liyuan/jiaoshihuaxiang.svg'), type: 1, to: "/portraitL",role:0 },
         { title: '课堂观察', icon: require('../../../assets/icon/liyuan/ketangguancha.svg'), type: 1, to: "/classroomObservation",role:0 },
         { title: '智能表单', icon: require('../../../assets/icon/liyuan/zhinengbiaodan.svg'), type: 1, to: "/test",role:1 },
+        { title: '考核资料', icon: require('../../../assets/icon/liyuan/zlsj.svg'), type: 1, to: "/teadTest",role:0,sortId:'eefb7195-8ee7-11f0-9c7b-005056924926' },
       ]
     }
   },

+ 18 - 4
src/components/pages/sassPlatform/index.vue

@@ -47,7 +47,16 @@ export default {
       oid: this.$route.query.oid,
       org: this.$route.query.org,
       role:this.$route.query.role,
-      userData:null
+      userData:null,
+      liYuanOrgList:["3823a6a5-1b6e-11f0-a66a-005056924926",
+				"292e34dc-1b6e-11f0-a66a-005056924926",
+				"21d6b367-1b6e-11f0-a66a-005056924926",
+				"1a1a172d-1b6e-11f0-a66a-005056924926",
+				"1197f86b-1b6e-11f0-a66a-005056924926",
+				"f235659b-1b6d-11f0-a66a-005056924926",
+				"d87b62d3-1b6d-11f0-a66a-005056924926",
+				"c25ea59b-1b6d-11f0-a66a-005056924926",
+      ]
     }
   },
   computed:{
@@ -73,11 +82,16 @@ export default {
         let params = {
         oid: "",//this.oid
       };
+      let _url = "selectTestType"
+            if(this.liYuanOrgList.includes(this.org)){
+              _url = "selectTestType_liYuan"
+            }
+
       this.ajax
-        .get(this.$store.state.api + "selectTestType", params)
+        .get(this.$store.state.api + _url, params)
         .then(res => {
           let _data = res.data[0];
-          let _type1 = _data.filter(i => i.pid == "");
+          let _type1 = _data.filter(i => !i.pid);
           _type1.forEach((i,index) => {
             let _typeList = [];
             _typeList = _data.filter(i2 => i2.pid == i.id);
@@ -85,7 +99,7 @@ export default {
             let _children = [{name:"表单管理",type:"formManage",typeId:i.id,navIndex:`${index}-0`}]
             i.open = false;
 
-            if(i.id=='e18d88b3-e828-11ef-b508-005056924926'){
+            if(i.id=='e18d88b3-e828-11ef-b508-005056924926' || i.id=="4cdce114-8a00-11f0-9c7b-005056924926"){
 
 
               if(this.userData && this.userData.type === 1 && this.userData.role == 1){

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

@@ -245,6 +245,15 @@ export default {
             type2List:[],
             type1Value:"",
             type2Value:"",
+            liYuanOrgList:["3823a6a5-1b6e-11f0-a66a-005056924926",
+						"292e34dc-1b6e-11f0-a66a-005056924926",
+						"21d6b367-1b6e-11f0-a66a-005056924926",
+						"1a1a172d-1b6e-11f0-a66a-005056924926",
+						"1197f86b-1b6e-11f0-a66a-005056924926",
+						"f235659b-1b6d-11f0-a66a-005056924926",
+						"d87b62d3-1b6d-11f0-a66a-005056924926",
+						"c25ea59b-1b6d-11f0-a66a-005056924926",
+          ]
         }
     },
     computed: {
@@ -441,12 +450,17 @@ export default {
             let params = {
                 oid: this.oid,
             };
+            let _url = "selectTestType"
+            if(this.liYuanOrgList.includes(this.org)){
+              _url = "selectTestType_liYuan"
+            }
+
             this.ajax
-                .get(this.$store.state.api + "selectTestType", params)
+                .get(this.$store.state.api + _url, params)
                 .then((res) => {
                     this.typeArray = res.data[0];
                     let _data = res.data[0];
-                    let _type1 = _data.filter(i=>i.pid == '');
+                    let _type1 = _data.filter(i=>!i.pid);
                     _type1.forEach(i=>{
                       let _children = [];
                       _children = _data.filter(i2=>i2.pid == i.id);

+ 362 - 43
src/components/pages/test/check/index.vue

@@ -108,7 +108,7 @@
                   </div>
                 </div>
               </div>
-              <div class="right" v-if="peopleId">
+              <div class="right" v-if="review==='1'">
                 <div class="score_box">总分:<span>{{ scoList2.reduce((acc, curr) => acc + curr.sco, 0) }}</span></div>
               </div>
             </div>
@@ -229,7 +229,7 @@
 
 
                  <el-popover
-                 v-if="stype == 2"
+                 v-if="stype == 2 && ((peopleId && review==1) || (!peopleId && !review))"
                   placement="top-start"
                   width="320"
                   ref="popover1"
@@ -242,7 +242,7 @@
                           小可努力生成中,请稍等片刻<img style="width: 50px;" src="../../../../assets/KekeLoading.gif" alt="">
                         </div>
                         <div style="display: flex;justify-content: space-between;align-items: center;">
-                          <div class="TopTit">智能分析列</div>
+                          <div class="TopTit">智能分</div>
                           <el-popover
                             placement="bottom"
                             @click.native.stop
@@ -364,6 +364,7 @@
                         </div> -->
                         <div style="margin-top: 10px;display: flex;justify-content: flex-end;">
                           <el-button @click="opQvisible0 = false">取消</el-button>
+                          <el-button style="background: #1456F0;" @click="markScoAuto()" type="primary">自动评分</el-button>
                           <el-button style="background: #1456F0;" @click="markSco()" type="primary">运行</el-button>
                         </div>
                     </div>
@@ -373,7 +374,7 @@
                       slot="reference"
                       class="btnA"
                     >
-                      智能分析列
+                      智能
                     </div>
                 </el-popover>
 
@@ -1401,7 +1402,7 @@
                     <div class="tableDatePicker">
                       <el-date-picker
                         v-model="tableDatePicker[index]"
-                        @change="tableDataPickerChange"
+                        @blur="tableDataPickerChange"
                         type="daterange"
                         range-separator="▼"
                         :picker-options="pickerOptions(item.json.timeSort)"
@@ -1562,7 +1563,7 @@
               </el-table-column>
               <el-table-column
                 label="操作"
-                width="250px"
+                :width="review=='1'?'150px':'250px'"
                 fixed="right"
                 v-if="isN != 1"
               >
@@ -1578,28 +1579,52 @@
                   <el-button
                     @click="editTest(scope.row)"
                     type="primary"
-                    v-if="(examineData && examineData.type == 1) || !examineData"
+                    v-if="((examineData && examineData.type == 1) || !examineData) && review !='1'"
                     size="small"
                     >编辑</el-button
                   >
 
+                  <el-button
+                    @click="returnTest(scope.row)"
+                    type="primary"
+                    size="small"
+                    v-if="((examineData && examineData.type == 1) || !examineData) && review == '1'"
+                    >退回</el-button
+                  >
+                  <!-- v-if="((examineData && examineData.type == 1) || !examineData) && review == '1'" -->
+
+
                   <!-- <el-button @click="setWordHtml(scope.row)" type="primary" size="small">导出答题信息</el-button>
 									<el-button @click="setWordTemplate(scope.row)" type="primary" size="small">word导出</el-button> -->
                   <el-button
                     @click="deleteTest(scope.row.id)"
                     type="primary"
                     size="small"
-                     v-if="(examineData && examineData.type == 1) || !examineData"
+                    v-if="((examineData && examineData.type == 1) || !examineData) && review !='1'"
                     >删除</el-button
                   >
                 </template>
               </el-table-column>
 
+
+              <el-table-column
+                label="状态"
+                width="100px"
+                fixed="right"
+                align="center"
+                v-if="!review && peopleId"
+              >
+              <template slot-scope="scope">
+                <!-- v-if="review==='1'" -->
+               <span :class="`typeStatus typeStatus_${scope.row.type}`">{{ typeStatusList[scope.row.type] }}</span>
+              </template>
+              </el-table-column>
+
               <el-table-column
                 label="审核状态"
                 width="120px"
                 fixed="right"
-                v-if="peopleId"
+                v-if="review==='1'"
               >
               <template slot-scope="scope">
                 <el-checkbox @change="reviewChange(scope.row)" true-label="1" false-label="0" v-model="scope.row.isReview">审核通过</el-checkbox>
@@ -2131,7 +2156,7 @@ export default {
         fieldList:[]
       },
       scoList:[],
-      scoListCopy:[],
+      scoListCopy:[], //没有什么别的用处只是为了展示用,让表单在评分的过程中不清零
       quoteV:false,
       openCeVal:false,
       opQvisible:false,
@@ -2208,6 +2233,9 @@ export default {
       disableBack: this.$route.query.disableBack === 'true',
       timeLimit:this.$route.query.timeLimit,
       sortTime:[],
+      review:this.$route.query.review,
+      defaultTimeLimit:[],
+      typeStatusList:["","未提交","已提交","","已退回"]
     };
   },
   watch: {},
@@ -2439,7 +2467,7 @@ export default {
         });
         this.opQvisible = false
     },
- // 点击开始评分
+    // 点击开始评分(全部进行评分)
     async markSco(){
       if (!this.cueWord.openCeTit.trim()) return this.$message.error('请输入标题')
       if (!this.cueWord.openCeCon.trim()) return this.$message.error('请输入指令')
@@ -2618,6 +2646,190 @@ ${JSON.stringify(forAllList)}
               console.log(error);
             });
     },
+    // 点击开始自动评分(未评分得数据进行评分)
+    async markScoAuto(){
+      let scoid =  this.scoList.map(e=> e.id);
+      console.log('scoid',scoid);
+      let TabArr = this.tableWorksArray.filter(e=> scoid.indexOf(e.id) == -1)
+      
+      console.log('this.TabArr',TabArr);
+      if (!TabArr.length) return this.$message.error('已全部评分')
+
+      if (!this.cueWord.openCeTit.trim()) return this.$message.error('请输入标题')
+      if (!this.cueWord.openCeCon.trim()) return this.$message.error('请输入指令')
+      if (this.cueWord.fieldList.length == 0) return this.$message.error('请选择引用字段')
+      this.aiscoLoading = true
+
+      let forAllList = [];
+      this.scoList = []
+
+      // 进行整理数据,将用户回答都存在一个数组里
+        for (let kin = 0; kin < TabArr.length; kin++) {
+          let userWork = []
+          let _fileid = []
+
+          let kpl = TabArr[kin].array
+          // console.log('kpl',this.TabArr[kin]);
+
+          for (let index = 0; index < kpl.length; index++) {
+              if (kpl[index].type == 3 && this.cueWord.fieldList.includes(kpl[index].json.title)) {
+                userWork.push(kpl[index].json.title +':'+ kpl[index].json.answer2)
+              }
+              if (kpl[index].type == 5 && this.cueWord.fieldList.includes(kpl[index].json.title)) {
+                if (kpl[index].json.file && kpl[index].json.file[0].url) {
+                  _fileid.push(kpl[index].json.file[0].url)
+                }
+                userWork.push(kpl[index].json.title+':' + _fileid.join('、'))
+              }
+              if (kpl[index].type == 7 && this.cueWord.fieldList.includes(kpl[index].json.title)) {
+                userWork.push(kpl[index].json.title+':'+kpl[index].json.answer2)
+              }
+              if (kpl[index].type == 1 && this.cueWord.fieldList.includes(kpl[index].json.title)) {
+                let kk = []
+                kpl[index].json.answer2.forEach((e)=>{
+                  kk.push(kpl[index].json.array[e].option)
+                })
+                userWork.push(kpl[index].json.title+':' +kk.join(','))
+              }
+          }
+let info = [
+  this.cueWord.fieldList.includes('序号') ? '序号' + (kin + 1) : '',
+  this.cueWord.fieldList.includes('提交人') ? '提交人:' + TabArr[kin].name : '',
+  this.cueWord.fieldList.includes('学段') ? '学段:' + this.getTType(this.teaType[0].id, TabArr[kin].cclassid) : '',
+  this.cueWord.fieldList.includes('年级') ? '年级:' + this.getTType(this.teaType[1].id, TabArr[kin].cclassid) : '',
+  this.cueWord.fieldList.includes('学科') ? '学科:' + this.getTType(this.teaType[2].id, TabArr[kin].cclassid) : '',
+  this.cueWord.fieldList.includes('职务') ? '职务:' + this.getTType(this.teaType[3].id, TabArr[kin].cclassid) : '',
+  this.cueWord.fieldList.includes('教龄') ? '教龄:' + this.getTType(this.teaType[4].id, TabArr[kin].cclassid) : '',
+  this.cueWord.fieldList.includes('提交时间') ? '提交时间:' + TabArr[kin].time : '',
+  userWork.filter(Boolean).join('\n')
+].filter(Boolean).join('\n');
+          forAllList.push({id:TabArr[kin].id,data:info})
+          // console.log('info',info);
+
+        }
+
+        // console.log('forAllList',forAllList);
+
+
+
+        let messages = `
+NOTICE
+Role: 你是一个高级数据处理师。
+- 深入理解各种数据处理标准,确保处理流程的准确性。
+- 熟练掌握数据结构知识,能快速解析“字段名称:具体内容”结构的文本。
+- 具备强大的逻辑分析能力,以便制定合理的数据处理流程。
+- 有丰富的数据处理经验,能应对多种类型的数据操作。
+- 拥有精准的数据分析能力,准确得出处理结果。
+- 擅长根据不同评价标准进行数据评价,保证结果符合要求。
+- 能够高效地处理大量数据,保证工作的时效性。
+Language: ${this.getLang()}
+
+## 上下文
+在数据处理任务缺乏合适工具或人力时,如数据分析项目、数据审核任务场景下,存在多组特定结构的文本数据,需数据处理大师理解标准和内容,制定流程并处理数据,按要求输出结果。
+
+## 数据处理标准
+${this.cueWord.openCeCon}
+
+## 数据内容
+${JSON.stringify(forAllList)}
+
+
+## 任务
+1. 数据标准理解:详细了解{数据处理标准}(如准确性、完整性、一致性等要求)
+2. 数据内容理解: 阅读并理解{数据内容}包括多组“字段名称:具体内容”结构的文本数据。
+3. 处理流程制定:根据所理解的{数据处理标准},制定详细的数据处理流程,包括数据分析(如统计分析、关联分析等)、数据评价(根据标准打分或分类等)等步骤。
+4. 数据处理操作:按照制定的流程对数据进行分析、处理和评价等操作。
+5. 结果输出:仅输出按照用户要求处理后的结果,确保结果清晰、准确且易于理解。
+
+### 理论框架
+### 数据生命周期管理理论
+1. 基本原理:
+- 数据生命周期涵盖数据的创建、存储、使用、共享、归档和销毁等阶段,每个阶段有不同的管理要求。
+- 明确各阶段的数据特征与管理重点有助于确保数据质量和合规性。
+2. 具体应用:
+- 确定处理阶段:根据数据处理任务确定数据处于生命周期的哪个阶段进行针对性处理。
+- 遵循管理规范:按照各阶段的管理要求,如存储安全规范,在处理中保障数据。
+- 规划流程:基于数据生命周期各阶段顺序规划合理的数据处理流程。
+
+### ETL(Extract,Transform,Load)理论
+1. 基本原理:
+- ETL是数据仓库中的一种数据处理过程,包括抽取、转换和加载三个主要步骤。
+- 用于将不同来源的数据整合到数据仓库中,保证数据的一致性和准确性。
+2. 具体应用:
+- 数据抽取:从多组文本数据中提取所需的字段和内容。
+- 数据转换:对抽取的数据按照标准进行格式转换、清洗等操作。
+- 数据加载:将处理好的数据加载到合适的存储或输出结构中。
+
+### 数据质量评估理论
+1. 基本原理:
+- 从准确性、完整性、一致性等多方面评估数据质量,以确保数据可靠。
+- 不同的数据用途有不同的质量要求,需建立相应评估指标。
+2. 具体应用:
+- 质量指标确定:根据处理标准确定数据质量评估指标。
+- 数据检查:按照指标对处理过程中的数据进行检查。
+- 结果验证:依据评估结果验证最终输出的数据是否符合要求。
+
+##响应
+严格按照用户的需求进行输出,不要输出多余的内容
+
+## 要求
+- 以清晰的逻辑构建处理流程,步骤分明。
+- 对数据内容进行全面分析,不遗漏任何关键信息。
+- 根据评价标准严格进行评价操作,保证结果的公正性。
+- 处理结果输出简洁明了,仅包含符合要求的内容。
+- 考虑到可能存在的多种数据结构,保持处理方法的通用性。
+- 针对数据处理过程中的特殊情况提供应对措施。
+- 以专业的态度对待数据,确保数据的安全性与完整性。
+- 输出格式[{id:数据id,sco:评分}]。
+- 不输出分析过程,直接输出最后计算结果。
+
+
+
+## 限制
+- 不应包含未经定义的数据处理术语,以免造成混淆。
+- 避免输出与数据处理标准无关的内容。
+- 不应包含模糊不清的处理步骤或操作。
+- 避免提及无法获取的外部工具或资源,除非有替代方案。
+- 不应包含未经证实的数据处理假设。
+- 不要回复你不知道的内容
+- 不要直接回复<demo>的内容
+- 所输出的内容必须按照给定的格式进行组织,不能偏离框架要求。
+- 请使用准确可靠的信息来源,确保规划的可行性和实用性。
+- 如果查询信息不是真实信息,如 xxx 等占位字符,不要采纳或使用。
+- 不要给用户提供任何虚假信息!不要给用户提供任何虚假信息!不要给用户提供任何虚假信息`;
+
+          // console.log('messages',messages);
+
+
+          let params = {
+            assistant_id: "6063369f-289a-11ef-8bf4-12e77c4cb76b",
+            message: [
+              {
+                type: "text",
+                text: messages.replaceAll("\n", " ").replaceAll("*", "")
+              }
+            ],
+            session_name: uuidv4(),
+            userId: this.userid,
+            file_ids: '',
+            model: "gpt-4o-2024-11-20"
+          };
+          this.ajax
+            .post("https://gpt4.cocorobo.cn/ai_agent_park_chat", params)
+            .then(response => {
+                 let data = response.data.FunctionResponse;
+                  this.scoList = JSON.parse(data.message)
+                  this.aiscoLoading = false
+
+                  this.uploadSCo(1)
+            })
+            .catch(error => {
+              this.aiscoLoading = false
+              this.$message.error('评分失败')
+              reject(error)
+              console.log(error);
+            });
+    },
     // 获取评分
     async getAiSco(){
       return new Promise((resolve, reject) => {
@@ -2663,13 +2875,21 @@ ${JSON.stringify(forAllList)}
 
     },
     // 上传评分
-    uploadSCo(){
+    uploadSCo(val){
       this.aiscoLoading = true
 
+      // val有数据就是自动评分把将新老数据结合在一起
+      let scoArr = []
+      if (val) {
+        scoArr = [...this.scoList,...this.scoListCopy]
+      }else{
+        scoArr = this.scoList
+      }
+
       let params = [{
         tid:this.cid,
-        uid:'6063369f-289a-11ef-8bf4-12e77c4cb76b',
-        json:JSON.stringify(this.scoList),
+        uid:this.userid,
+        json:JSON.stringify(scoArr),
         cw: JSON.stringify(this.cueWord)
       }]
       // console.log('params',params);
@@ -2996,34 +3216,56 @@ ${JSON.stringify(forAllList)}
 
           let _worksData = res.data[1];
 
-          if(this.timeLimit){
-            console.log("timeLimit", this.timeLimit)
-            // 2024-12-31T16:00:00.000Z,2025-12-31T16:00:00.000Z
-            // 根据 timeLimit 筛选 _worksData
-            let [startStr, endStr] = this.timeLimit.split(',');
-            let startDate = startStr ? new Date(startStr) : null;
-            let endDate = endStr ? new Date(endStr) : null;
-            _worksData = _worksData.filter(i => {
-              if (!i.time) return false;
-              // i.time 例子:2025年02月25日 10:17:46
-              let match = i.time.match(/^(\d{4})年(\d{2})月(\d{2})日/);
-              if (!match) return false;
-              let year = parseInt(match[1]);
-              let month = parseInt(match[2]);
-              let day = parseInt(match[3]);
-              // 构造当前数据的日期对象
-              let curDate = new Date(year, month - 1, day, 0, 0, 0);
-              // 判断是否在区间内(包含等于)
-              if (startDate && endDate) {
-                return curDate >= startDate && curDate <= endDate;
-              } else if (startDate) {
-                return curDate >= startDate;
-              } else if (endDate) {
-                return curDate <= endDate;
-              }
-              return true;
-            });
-          }
+          // if(this.timeLimit){
+          //   console.log("timeLimit", this.timeLimit)
+          //   // 2024-12-31T16:00:00.000Z,2025-12-31T16:00:00.000Z
+          //   // 根据 timeLimit 筛选 _worksData
+          //   let [startStr, endStr] = this.timeLimit.split(',');
+          //   let startDate = startStr ? new Date(startStr) : null;
+          //   let endDate = endStr ? new Date(endStr) : null;
+          //   _worksData = _worksData.filter(i => {
+          //     if (!i.time) return false;
+          //     // i.time 例子:2025年02月25日 10:17:46
+          //     let match = i.time.match(/^(\d{4})年(\d{2})月(\d{2})日/);
+          //     if (!match) return false;
+          //     let year = parseInt(match[1]);
+          //     let month = parseInt(match[2]);
+          //     let day = parseInt(match[3]);
+          //     // 构造当前数据的日期对象
+          //     let curDate = new Date(year, month - 1, day, 0, 0, 0);
+          //     // 判断是否在区间内(包含等于)
+          //     if (startDate && endDate) {
+          //       return curDate >= startDate && curDate <= endDate;
+          //     } else if (startDate) {
+          //       return curDate >= startDate;
+          //     } else if (endDate) {
+          //       return curDate <= endDate;
+          //     }
+          //     return true;
+          //   });
+          // }
+
+
+          // if(this.timeLimit){
+          //   if(_worksData[0]){
+          //     let _data = JSON.parse(_worksData[0].courseJson)
+          //     let _flag = false;
+          //     _data.forEach((item,index)=>{
+          //       if(item.type == 8 && item.json.title == "获奖时间"){
+          //         _flag = true
+          //         let time = this.timeLimit.split(",");
+          //         this.tableDatePicker[index] = [new Date(time[0]),new Date(time[1])]
+          //       }
+          //     })
+
+          //     if(!_flag){
+          //       let time = this.timeLimit.split(",");
+          //       this.submissionTimePicker =  [new Date(time[0]),new Date(time[1])];
+          //     }
+          //     this.tableDataPickerChange();
+          //     this.submissionTimePickerChange()
+          //   }
+          // }
 
           this.works = _worksData;
           this.iscount = res.data[2][0].count;
@@ -3155,6 +3397,7 @@ ${JSON.stringify(forAllList)}
                 cut: 0,
                 uteaName: this.works[i].uteaName,
                 courseJson: JSON.parse(this.works[i].courseJson),
+                type:this.works[i].type
               });
             // }
           }
@@ -3402,6 +3645,31 @@ ${JSON.stringify(forAllList)}
             });
           });
           console.log(this.teaType, "teaType");
+
+
+          if(this.timeLimit){
+            if(this.works[0]){
+              let _data = JSON.parse(this.works[0].courseJson)
+              let _flag = false;
+              _data.forEach((item,index)=>{
+                if(item.type == 8 && item.json.title == "获奖时间"){
+                  _flag = true
+                  let time = this.timeLimit.split(",");
+                  this.tableDatePicker[index] = [new Date(time[0]),new Date(time[1])]
+                }
+              })
+
+              if(!_flag){
+                let time = this.timeLimit.split(",");
+                this.submissionTimePicker =  [new Date(time[0]),new Date(time[1])];
+                this.submissionTimePickerChange()
+              }else{
+                this.tableDataPickerChange();
+              }
+              this.$forceUpdate();
+            }
+          }
+
         })
         .catch((err) => {
           console.error(err);
@@ -4419,6 +4687,7 @@ ${JSON.stringify(forAllList)}
       this.selectWorkList = value;
     },
     tableDataPickerChange() {
+      console.log(this.tableDatePicker)
       let _copyData = JSON.parse(JSON.stringify(this.worksArray));
       this.tableDatePicker.forEach((i, index) => {
         /*[null,["2024-12-05T00:00:00.000","2025-01-12T00:00:00.000"],["2024-12-04T00:00:00.000","2025-01-24T00:00:00.000"]] */
@@ -4435,6 +4704,7 @@ ${JSON.stringify(forAllList)}
         }
       });
       this.tableWorksArray = _copyData;
+      this.$forceUpdate()
     },
     submissionTimePickerChange(){
       let _copyData = JSON.parse(JSON.stringify(this.worksArray));
@@ -4450,6 +4720,7 @@ ${JSON.stringify(forAllList)}
       })
 
       this.tableWorksArray = _copyData;
+      this.$forceUpdate();
       // this.submissionTimePicker.forEach((i, index) => {
       //   /*[null,["2024-12-05T00:00:00.000","2025-01-12T00:00:00.000"],["2024-12-04T00:00:00.000","2025-01-24T00:00:00.000"]] */
       //   if (i && i.length > 0) {
@@ -4610,7 +4881,26 @@ ${JSON.stringify(item.array)}
       // console.log(row);
       // this.tableWorksArray.find(i=>i.id===row.id).isReview = "1";
       // this.$forceUpdate()
-    }
+    },
+    //退回表单
+    returnTest(row){
+      if(row.type=='1')return this.$message.info("该表单未提交")
+      if(row.type=='4')return this.$message.info("该表单已退回")
+      let params = [{
+        id:row.id,
+        type:"4"
+      }];
+
+      this.ajax.post(this.$store.state.api+"update_testCourseWorks_typeById",params).then(res=>{
+        if(res.data==1){
+          this.tableWorksArray.find(i=>i.id==row.id).type = "4";
+          this.$message.success("表单退回成功");
+        }
+      }).catch(e=>{
+        console.log(e);
+      })
+
+    },
   },
 
   beforeDestroy() {
@@ -5770,4 +6060,33 @@ ${JSON.stringify(item.array)}
   margin-right: 20px;
   font-weight:bold;
 }
+
+.typeStatus{
+  padding: 4px 8px;
+  border-radius: 4px;
+  border: solid 1px gray;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 12px;
+}
+
+.typeStatus_2{
+  background:#F0F9F2;
+  border-color: #B5E3BF;
+  color:#5FC875;
+}
+
+.typeStatus_4{
+  background:#FEF5EC;
+  border-color: #FAD0A1;
+  color:#F7933B;
+}
+
+.typeStatus_1{
+  background:#EEF3FC;
+  border-color: #0F40F5;
+  color:#0F40F5;
+}
+
 </style>

+ 167 - 19
src/components/pages/test/examine/conpoments/personPage.vue

@@ -20,7 +20,7 @@
         </div> -->
       </div>
       <el-table
-        :data="tableData"
+        :data="copyTableData"
         class="scoTab"
         v-loading="tabLoading"
         style="width: 100%"
@@ -81,6 +81,23 @@
           label="考核总分"
         >
         </el-table-column>
+
+
+        <el-table-column
+          align="center"
+          label="状态"
+        >
+        <template slot-scope="scope">
+          <div class="taskArea" v-if="[0,1].includes(scope.row.isReview)">
+            <span :class="`task_${scope.row.isReview}`">{{ typeStatusList[scope.row.isReview] }}</span>
+
+          </div>
+          <span v-else>/</span>
+          <!-- <div v-if="scope.row.state == '已完成'">已完成</div>
+          <div v-else>未完成</div> -->
+        </template>
+        </el-table-column>
+
         <el-table-column align="center" label="操作">
           <template slot-scope="scope">
             <div style="display: flex;justify-content: center;">
@@ -211,7 +228,7 @@
                             :key="item2.courseId"
                             class="orgData"
                           >
-                            <div @click="lookUserPrize(item2.courseId)">
+                            <div :style="item2.status==2?`color:red`:''" @click="lookUserPrize(item2.courseId)">
                               {{ item2.title }}:{{ item2.num }}份
                             </div>
                           </div>
@@ -372,6 +389,14 @@ export default {
     teacherName: {
       type: String,
       default: ""
+    },
+    timeA: {
+      type:String,
+      default:""
+    },
+    timeB: {
+      type: String,
+      default:""
     }
   },
   components: {
@@ -403,9 +428,12 @@ export default {
       oid: this.$route.query.oid, //学校id
       org: this.$route.query.org, //组织id
       tableData: [],
+      copyTableData:[],
       TeachingOptions: [],
       PageBaseDataTwo: [],
-      remDig: false
+      remDig: false,
+      timeSortList:[],
+      typeStatusList:["待办","已完成",'/']
     };
   },
   watch: {
@@ -414,6 +442,16 @@ export default {
     },
     digType(newVal, oldVal) {
       this.getDataDig();
+    },
+    timeA(newVal){
+      if(newVal){
+        this.timeSortFn()
+      }
+    },
+    timeB(newVal){
+      if(newVal){
+        this.timeSortFn()
+      }
     }
   },
   computed: {
@@ -494,9 +532,10 @@ export default {
       };
       // console.log(params);
       this.ajax
-        .get(this.$store.state.api + "selectTestExaminePersonData", params)
-        .then(res => {
+        .get(this.$store.state.api + "selectTestExaminePersonData_filterTime", params)
+        .then(async res => {
           let data = res.data[0];
+          console.log(data)
 
           data.forEach(e => {
             e.json = JSON.parse(e.json);
@@ -532,8 +571,49 @@ export default {
             e.evaSca = e.evaSca.toFixed(2);
             e.cogSco = e.cogSco.toFixed(2);
           });
+
+          for(let i = 0;i<data.length;i++){
+            let testList = [];
+            data[i].json.forEach(i2=>{
+              if(i2.children.length>0){
+                i2.children.forEach(i3=>{
+                  if(i3.testid.test.length>0){
+                    testList.push(...i3.testid.test)
+                  }
+                })
+              }
+            })
+
+
+            if(testList.length>0){
+              let _time = data[i].timeValue?JSON.parse(data[i].timeValue):{};
+              let testData = await this.computedTest(testList,data[i].userid,_time)
+              let _isReviewNum = 0;
+              let _num = 0;
+              testData.forEach(i=>{
+                _isReviewNum+=i.isReviewNum;
+                _num+=i.num;
+
+              })
+              if(_num>0){
+                if(_num==_isReviewNum){
+                  data[i].isReview = 1;
+                }else{
+                  data[i].isReview = 0;
+                }
+              }else{
+                data[i].isReview = 2;
+              }
+
+
+            }
+          }
+
+
           this.tableData = data;
+          this.copyTableData = data;
           this.tabLoading = false;
+          this.timeSortFn()
         })
         .catch(error => {
           this.tabLoading = false;
@@ -554,6 +634,9 @@ export default {
       this.diaSco = true;
       this.digUserid = val.userid;
       this.disTeaClass = val.tea;
+      if(val.timeValue){
+        this.timeSortList = JSON.parse(val.timeValue)
+      }
       this.cutPerson();
       this.getPageBase();
     },
@@ -784,7 +867,13 @@ export default {
         return this.$message.error("暂无人员提交");
       // 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=${this.userid}`;
 
-      this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${cid}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${this.digUserid}`;
+      if(this.timeSortList){
+        let timeValue = this.timeSortList.time
+        this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${cid}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${this.digUserid}&timeLimit=${timeValue}&review=1`;
+      }else{
+      this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${cid}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${this.digUserid}&review=1`;
+
+      }
       // 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;
     },
@@ -838,25 +927,25 @@ export default {
       this.digLoading = true;
 
       this.cutTeaNum--;
-      this.digUsername = this.tableData[this.cutTeaNum].username;
-      this.disTeaClass = this.tableData[this.cutTeaNum].tea;
-      this.digUserid = this.tableData[this.cutTeaNum].userid;
-      this.digTid = this.tableData[this.cutTeaNum].id;
+      this.digUsername = this.copyTableData[this.cutTeaNum].username;
+      this.disTeaClass = this.copyTableData[this.cutTeaNum].tea;
+      this.digUserid = this.copyTableData[this.cutTeaNum].userid;
+      this.digTid = this.copyTableData[this.cutTeaNum].id;
 
       this.getPageBase();
     },
     // 弹框切换下一个教师
     nextTea() {
       // console.log("this.tableData", this.tableData);
-      if (this.cutTeaNum + 1 >= this.tableData.length)
+      if (this.cutTeaNum + 1 >= this.copyTableData.length)
         return this.$message.error("已经是最后一个了");
       this.digLoading = true;
 
       this.cutTeaNum++;
-      this.digUsername = this.tableData[this.cutTeaNum].username;
-      this.disTeaClass = this.tableData[this.cutTeaNum].tea;
-      this.digUserid = this.tableData[this.cutTeaNum].userid;
-      this.digTid = this.tableData[this.cutTeaNum].id;
+      this.digUsername = this.copyTableData[this.cutTeaNum].username;
+      this.disTeaClass = this.copyTableData[this.cutTeaNum].tea;
+      this.digUserid = this.copyTableData[this.cutTeaNum].userid;
+      this.digTid = this.copyTableData[this.cutTeaNum].id;
 
       this.getPageBase();
     },
@@ -980,6 +1069,7 @@ export default {
     },
     // 评分关闭弹框
     handleClose(done) {
+      this.timeSortList = [];
       this.getData();
       done();
     },
@@ -1003,23 +1093,59 @@ export default {
       }
     },
     // 处理数据来源
-    computedTest(val) {
+    computedTest(val,uid='',timeSortList=this.timeSortList) {
       let params = [
         {
-          uid: this.digUserid,
+          uid: uid?uid:this.digUserid,
           testId: val.join(",")
         }
       ];
+
+
+      let _fnStr = `selectExamineTestName`
+      console.log("this.timeSortList",timeSortList)
+      if(timeSortList && timeSortList.time && timeSortList.time.length>0){
+        const timeValue = timeSortList.time;
+        params[0].startTime = timeValue[0];
+        params[0].endTime = timeValue[1];
+        _fnStr = `selectExamineTestNameFilterTime`
+      }
+
       return new Promise(resolve => {
         this.ajax
-          .post(this.$store.state.api + "selectExamineTestName", params)
+          .post(this.$store.state.api + _fnStr, params)
           .then(res => {
-            resolve(res.data[0]);
+
+            let _data = res.data[0];
+
+            _data.forEach(i=>{
+              if(i.num>0){
+                if(i.num==i.isReviewNum){
+                  i.status = 1;
+                }else{
+                  i.status = 2;
+                }
+              }else{
+                i.status = 0;
+              }
+            })
+            console.log("_data",_data)
+
+            resolve(_data);
           })
           .catch(error => {
             console.log(error);
           });
       });
+    },
+    //时间筛选
+    timeSortFn(){
+      console.log("timeSortFn",this.timeA,this.timeB)
+      if(this.pType == 1 && this.timeA){
+        this.copyTableData = this.tableData.filter(i=>i.time == this.timeA)
+      }else if(this.pType == 2 && this.timeB){
+        this.copyTableData = this.tableData.filter(i=>i.time == this.timeB)
+      }
     }
   }
 };
@@ -1298,6 +1424,7 @@ input[type="number"] {
 }
 .twoCon > div:nth-child(2) {
   width: 160px !important;
+  line-height: 20px;
 }
 .twoCon > div:nth-child(3) {
   width: 110px !important;
@@ -1340,4 +1467,25 @@ input[type="number"] {
   margin-left: 10px;
 }
 
+
+.taskArea{
+  display: flex;
+  justify-content: center;
+}
+
+.task_0{
+  padding: 6px 20px;
+  background: #FEF5EC;
+  border: solid 1px #FAD0A1;
+  color: #F7933B;
+  border-radius: 4px;
+}
+
+.task_1{
+  padding: 6px 20px;
+  background: #E6F9EA;
+  border: solid 1px #A6E9B6;
+  color: #21ba45;
+  border-radius: 4px;
+}
 </style>

+ 5 - 4
src/components/pages/test/examine/conpoments/targetPage.vue

@@ -1714,7 +1714,7 @@ export default {
               let _scoreJson = [];
               if(i.scoreJson){
                 _scoreJson = JSON.parse(i.scoreJson)
-                _scoreJson = _scoreJson.filter(i2=>i.testId.indexOf(i2.id)!=-1);
+                _scoreJson = _scoreJson.filter(i2=>i.testId && i.testId.indexOf(i2.id)!=-1);
                 i.scoreJson = _scoreJson;
                 _num += _scoreJson.length;
                 _total += _scoreJson.reduce((sum, i2) => sum + i2.sco, 0);
@@ -1723,7 +1723,8 @@ export default {
             })
 
             if(_total>0&&_num>0){
-              _data[0].average = (_total / _num).toFixed(0);
+              _data[0].average = _total.toFixed(0)
+              // _data[0].average = (_total / _num).toFixed(0);
             }
 
 
@@ -1743,9 +1744,9 @@ export default {
 
       if(this.testExamineBaseList[0].value){
         const timeValue = JSON.parse(this.testExamineBaseList[0].value).time;
-        this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${cid}&oid=${val.organizeid}&userid=${this.userid}&org=${val.org}&type=2&role=0&peopleId=${val.userid}&disableBack=true&timeLimit=${timeValue}`;
+        this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${cid}&oid=${val.organizeid}&userid=${this.userid}&org=${val.org}&type=2&role=0&peopleId=${val.userid}&disableBack=true&timeLimit=${timeValue}&review=1`;
       }else{
-        this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${cid}&oid=${val.organizeid}&userid=${this.userid}&org=${val.org}&type=2&role=0&peopleId=${val.userid}&disableBack=true`;
+        this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${cid}&oid=${val.organizeid}&userid=${this.userid}&org=${val.org}&type=2&role=0&peopleId=${val.userid}&disableBack=true&review=1`;
       }
       // this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${cid}&oid=${val.organizeid}&userid=${this.userid}&org=${val.org}&type=2&role=0&peopleId=${val.userid}&disableBack=true`;
       // this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/test?userid=${this.userid}&oid=45facc0a-1211-11ec-80ad-005056b86db5&org=&role=0`;

+ 5 - 3
src/components/pages/test/examine/index.vue

@@ -26,7 +26,7 @@
           @change="selectTeaName"
           placeholder="请输入教师姓名"
         ></el-input>
-        <div style="margin: 0 20px;" v-if="timeListA.length>1 && pType == 1 && cutTable!=1">
+        <div style="margin: 0 20px;" v-if="timeListA.length>1 && pType == 1">
           <el-select v-model="timeA" placeholder="请选择">
             <el-option
               v-for="item in timeListA"
@@ -38,7 +38,7 @@
           </el-select>
         </div>
 
-        <div style="margin: 0 20px;" v-if="timeListB.length>0 && pType == 2 && cutTable!=1">
+        <div style="margin: 0 20px;" v-if="timeListB.length>0 && pType == 2">
           <el-select v-model="timeB" placeholder="请选择">
             <el-option
               v-for="item in timeListB"
@@ -79,6 +79,8 @@
         ref="child"
         :pType="pType"
         :teacherName="teacherName"
+        :timeA="timeA"
+        :timeB="timeB"
         v-if="cutTable == 1"
       ></personPage>
     </div>
@@ -105,7 +107,7 @@ export default {
       oid: this.$route.query.oid,
       org: this.$route.query.org,
       pType: 2,
-      cutTable: 0,
+      cutTable: 1,
       teacherName: "",
       cutTabOpts: [
         {

+ 15 - 1
src/components/pages/test/index.vue

@@ -505,6 +505,15 @@ export default {
             typeJArray: [],
             zscore: 0,
 						checkList:[],
+            liYuanOrgList:["3823a6a5-1b6e-11f0-a66a-005056924926",
+						"292e34dc-1b6e-11f0-a66a-005056924926",
+						"21d6b367-1b6e-11f0-a66a-005056924926",
+						"1a1a172d-1b6e-11f0-a66a-005056924926",
+						"1197f86b-1b6e-11f0-a66a-005056924926",
+						"f235659b-1b6d-11f0-a66a-005056924926",
+						"d87b62d3-1b6d-11f0-a66a-005056924926",
+						"c25ea59b-1b6d-11f0-a66a-005056924926",
+          ]
         };
     },
     computed: {
@@ -1199,8 +1208,13 @@ export default {
             let params = {
                 oid: this.oid,
             };
+            let _url = "selectTestType"
+            if(this.liYuanOrgList.includes(this.org)){
+              _url = "selectTestType_liYuan"
+            }
+
             this.ajax
-                .get(this.$store.state.api + "selectTestType", params)
+                .get(this.$store.state.api + _url, params)
                 .then((res) => {
                     this.typeArray = res.data[0];
                     this.getData()

+ 10 - 18
src/components/pages/testPerson/examine/index.vue

@@ -262,16 +262,18 @@ export default {
     }
   },
   computed: {},
-  activated() {
-    // 当组件被激活时调用
-    this.getPageBase();
-    this.getPageBase2(1)
-    this.getPageBase2(2)
-  },
+  // activated() {
+  //   // 当组件被激活时调用
+  //   this.getPageBase();
+  //   this.getPageBase2(1)
+  //   this.getPageBase2(2)
+  // },
   mounted() {
-    this.getPageBase();
+    // this.getPageBase();
     this.getPageBase2(1)
     this.getPageBase2(2)
+    console.log('666');
+    
     // console.log(JSON.stringify(this.TeaTabJson));
   },
   methods: {
@@ -399,8 +401,6 @@ export default {
         .post(this.$store.state.api + "addTestExamineWorks2", params)
         .then(res => {
           console.log("addTestExamineWorks2", res);
-          // this.getData();
-          // this.handleData();
         })
         .catch(error => {
           console.log(error);
@@ -421,7 +421,7 @@ export default {
       this.ajax
         .get(this.$store.state.api + "getTestExamineByUserId2", params)
         .then(res => {
-          console.log("getTestExamineByUserId", res);
+          // console.log("getTestExamineByUserId", res);
 
           if (res.data[0].length > 0) {
 
@@ -454,12 +454,6 @@ export default {
             this.handleData();
             this.tabLoad = false;
           }
-          // this.$forceUpdate();
-          //  else {
-          //   this.allData.type = 1;
-          //   this.getPageBase();
-          //   this.tabLoad = false;
-          // }
         })
         .catch(error => {
           console.log(error);
@@ -486,8 +480,6 @@ export default {
           this.PageBaseData = JSON.parse(res.data[0][0].json);
           // 先获取基础模板,然后再获取用户又没有填写过,填写过就开始循环赋值给基础模板,最后提交基础模板
           this.getData();
-
-          // this.handleData();
         })
         .catch(error => {
           console.log(error);

+ 103 - 29
src/components/pages/testPerson/info/infoDialognew/index.vue

@@ -192,11 +192,27 @@ import avator from '../../../../../assets/icon/test/teacher.jpg'
 import "@/common/wxLogin.js";
 
 export default {
-	props: ["dialogVisibleInfo", "userid", "oid"],
+	props: {
+    dialogVisibleInfo: {
+		type: Boolean,
+			default: false
+		},
+		userid: {
+			type: String
+		},
+		oid: {
+			type: String
+		}
+	},
 	watch: {
 		dialogVisibleInfo(newVal) {
 			if (newVal) {
 				this.getTypeInfo();
+				this.monitorWechat()
+			}else{
+				if (this.messageHandler) {
+					window.removeEventListener("message", this.messageHandler);	
+				}
 			}
 		},
 	},
@@ -217,6 +233,7 @@ export default {
 	},
 	data() {
 		return {
+			messageHandler:'',
 			avator: avator,
 			info: {},
 			imgLoading: false,
@@ -242,9 +259,6 @@ export default {
             eye: require("../../../../../assets/icon/eye.png"),
 		};
 	},
-	// mounted() {
-	// 	this.getTypeInfo();
-	// },
 	methods: {
 		cha() {
 			this.$forceUpdate();
@@ -592,10 +606,35 @@ export default {
 				}, 0);
 			}, 0);
 		},
-		setOpenId(openid) {
-			 this.ajax.post(this.$store.state.api + "UpdateOpenId", [
-                    { userid: this.userid, openid: openid },
-                ]).then((res) => {
+		monitorWechat(){
+			let _this = this;
+			this.messageHandler = function (e) {
+				// 监听 message 事件
+				console.log("userinfoA", e);
+				if (e.data && e.data.method == "getOpenId") {
+					console.log(e);
+					console.log(e.data.code);
+					console.log(_this.loginType);
+
+					if (e.data.code == 200) {
+						_this.setOpenId(e.data.data.openid);
+					} else {
+						_this.$message.error("扫码登录失败请重新扫码");
+						_this.wechatDialogVisible = false;
+						setTimeout(() => {
+							_this.wechatDialogVisible = true;
+							_this.wechatLogin();
+						}, 1000);
+					}
+				}
+			};
+
+			window.addEventListener("message", this.messageHandler);
+		},
+		addOpenid(openid) {
+			this.ajax.post(this.$store.state.api + "UpdateOpenId", [
+					{ userid: this.userid, openid: openid },
+				]).then((res) => {
 					this.$message.success("绑定成功");
 					this.wechatDialogVisible = false;
 					this.getData();
@@ -605,32 +644,67 @@ export default {
 					console.error(err);
 				});
 		},
+		setOpenId(openid) {
+			this.ajax
+			.post(this.$store.state.api + "selectliyuanOpenid", [
+				{ pid: openid },
+			])
+			.then((res) => {
+				if (!res.data[0].length) {
+					this.addOpenid(openid);
+				} else {
+					let uname = res.data[0].map(item => item.username).join(',');
+					console.log('uname',uname);
+					
+					this.$message.error("该微信已绑定" + uname + "账号");
+					this.wechatDialogVisible = false;
+				}
+			})
+			.catch((err) => {
+				console.log("err", err);
+			});
+
+		// this.ajax.post(this.$store.state.api + "UpdateOpenId", [
+		//   { userid: this.userid, openid: openid },
+		// ]).then((res) => {
+		//   this.$message.success("绑定成功");
+		//   this.wechatDialogVisible = false;
+		//   this.getDetail();
+		// }).catch((err) => {
+		//   this.$message.error("绑定失败请重新扫码");
+		//   console.error(err);
+		// })
+		},
 		Ochange() {
 			this.$forceUpdate();
 		},
 	},
+	
 	mounted() {
-		let _this = this;
-		window.addEventListener("message", function (e) {
-			// 监听 message 事件
-			console.log(e);
-			if (e.data && e.data.method == "getOpenId") {
-				console.log(e);
-				console.log(e.data.code);
-				console.log(_this.loginType);
-
-				if (e.data.code == 200) {
-					_this.setOpenId(e.data.data.openid);
-				} else {
-					_this.$message.error("扫码登录失败请重新扫码");
-					_this.wechatDialogVisible = false;
-					setTimeout(() => {
-						_this.wechatDialogVisible = true;
-						_this.wechatLogin();
-					}, 1000);
-				}
-			}
-		});
+		this.$nextTick();
+		this.getTypeInfo();
+
+		// let _this = this;
+		// window.addEventListener("message", function (e) {
+		// 	// 监听 message 事件
+		// 	console.log(e);
+		// 	if (e.data && e.data.method == "getOpenId") {
+		// 		console.log(e);
+		// 		console.log(e.data.code);
+		// 		console.log(_this.loginType);
+
+		// 		if (e.data.code == 200) {
+		// 			_this.setOpenId(e.data.data.openid);
+		// 		} else {
+		// 			_this.$message.error("扫码登录失败请重新扫码");
+		// 			_this.wechatDialogVisible = false;
+		// 			setTimeout(() => {
+		// 				_this.wechatDialogVisible = true;
+		// 				_this.wechatLogin();
+		// 			}, 1000);
+		// 		}
+		// 	}
+		// });
 	},
 };
 </script>

+ 18 - 3
src/components/pages/testPerson/test/index.vue

@@ -274,6 +274,15 @@ export default {
       navIndex:'0-5',
       showCard:'portraitOfTeacher',
       showFormId:"",
+      liYuanOrgList:["3823a6a5-1b6e-11f0-a66a-005056924926",
+				"292e34dc-1b6e-11f0-a66a-005056924926",
+				"21d6b367-1b6e-11f0-a66a-005056924926",
+				"1a1a172d-1b6e-11f0-a66a-005056924926",
+				"1197f86b-1b6e-11f0-a66a-005056924926",
+				"f235659b-1b6d-11f0-a66a-005056924926",
+				"d87b62d3-1b6d-11f0-a66a-005056924926",
+				"c25ea59b-1b6d-11f0-a66a-005056924926",
+      ]
     };
   },
   computed: {
@@ -611,11 +620,17 @@ export default {
       let params = {
         oid: "",//this.oid
       };
+
+      let _url = "selectTestType"
+      if(this.liYuanOrgList.includes(this.org)){
+        _url = "selectTestType_liYuan"
+      }
+
       this.ajax
-        .get(this.$store.state.api + "selectTestType", params)
+        .get(this.$store.state.api + _url, params)
         .then(res => {
           let _data = res.data[0];
-          let _type1 = _data.filter(i => i.pid == "");
+          let _type1 = _data.filter(i => !i.pid);
           _type1.forEach((i,index) => {
             let _typeList = [];
             _typeList = _data.filter(i2 => i2.pid == i.id);
@@ -623,7 +638,7 @@ export default {
             let _children = [{name:"资料提交",type:"formSubmit",typeId:i.id,navIndex:`${index}-0`}]
             i.open = false;
 
-            if(i.id=='e18d88b3-e828-11ef-b508-005056924926'){
+            if(i.id=='e18d88b3-e828-11ef-b508-005056924926' || i.id == "4cdce114-8a00-11f0-9c7b-005056924926"){
               _children.push(...[
                 {name:"年度考核",type:"annualAssessment",navIndex:`${index}-1`},
                 {name:"培训活动",type:"trainingActivity",navIndex:`${index}-2`},

+ 40 - 2
src/components/pages/testPerson/test/test.vue

@@ -65,6 +65,9 @@
                                 <span v-if="!test.editName && test.name">{{test.name}}</span>
                                 <el-input :ref="`changeName_${test.id}`" v-if="test.editName" v-model="test.name"  @blur="changeNameUpdate(test.courseid,test.id)" @keyup.enter.native="changeNameUpdate(test.courseid,test.id)"></el-input>
                             </div>
+                            <div class="testType">
+                              <span :class="`typeStatus_${test.type}`">{{ typeStatusList[test.type] }}</span>
+                            </div>
                             <!-- <img @click="deleteTest(test.id)" class="delete"
                                 src="../../../../assets/icon/test/delete.png" alt="" /> -->
                             <div class="utime">
@@ -158,7 +161,8 @@ export default {
             org: this.$route.query.org,
             role: this.$route.query.role,
             loading: false,
-            checkTypeValue:""
+            checkTypeValue:"",
+            typeStatusList:["","未提交","已提交","","已退回"]
         };
     },
     computed: {
@@ -1129,7 +1133,7 @@ export default {
     font-size: 14px;
     width: 160px;
     min-width: 160px;
-    margin: 0 30px 0 auto;
+    margin: 0 30px 0 0;
 }
 .test_add_box>.test>.mask {
     display: flex;
@@ -1226,4 +1230,38 @@ export default {
 .isDead{
     color:#EE3E3E;
 }
+
+.testType{
+  width: 60px;
+  margin: 0 45px 0 auto;
+}
+
+.testType>span{
+  padding: 6px 10px;
+  border-radius: 4px;
+  border: solid 1px gray;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 12px;
+}
+
+
+.testType>.typeStatus_2{
+  background:#F0F9F2;
+  border-color: #B5E3BF;
+  color:#5FC875;
+}
+
+.testType>.typeStatus_4{
+  background:#FEF5EC;
+  border-color: #FAD0A1;
+  color:#F7933B;
+}
+
+.testType>.typeStatus_1{
+  background:#EEF3FC;
+  border-color: #0F40F5;
+  color:#0F40F5;
+}
 </style>

+ 45 - 16
src/components/pages/testStudent/view/preview.vue

@@ -49,7 +49,7 @@
 							<!-- <el-button type="primary" :style=" isN==1? 'padding: 5px 10px;' : ''" size="small" @click="autoFill" v-if="(showAutoFillBtn && isN!=1)">智能填写</el-button> -->
               <el-button type="primary" :style=" isN==1? 'padding: 5px 10px;' : ''" size="small" @click="refresh" v-if="isReset">刷新</el-button>
               <el-button :type="isN!=1?'primary':'info'" :style=" isN==1? 'padding: 5px 10px;' : ''" size="small" @click="reset">重置</el-button>
-              <el-button type="primary" :style=" isN==1? 'padding: 5px 10px;' : ''" size="small" @click="save" v-if="(type != 3 && isN!=1)">保存</el-button>
+              <el-button type="primary" :style=" isN==1? 'padding: 5px 10px;' : ''" size="small" @click="save" v-if="isN!=1 && workType!=4">保存</el-button>
               <el-button type="primary" :style=" isN==1? 'padding: 5px 10px;' : ''" size="small" @click="publish">提交</el-button>
             </div>
           </div>
@@ -93,7 +93,8 @@ export default {
       isloading: false,
       courseid: '',
       gcourseid: this.$route.query.courseid,
-      back:this.$route.query.back
+      back:this.$route.query.back,
+      workType:''
     }
   },
 	computed:{
@@ -247,6 +248,7 @@ export default {
         .then((res) => {
           // this.cJson = JSON.parse(res.data[0][0].chapters);
           if (res.data[2].length) {
+            this.workType = res.data[2][0].type;
             this.cJson = JSON.parse(res.data[2][0].courseJson)
 
             this.$forceUpdate()
@@ -523,20 +525,47 @@ export default {
         .post(this.$store.state.api + "addTestWorks", params)
         .then((res) => {
           this.$message.success('保存成功')
-          this.goTo(
-            "/testStudent?userid=" +
-            this.userid +
-            "&oid=" +
-            this.oid +
-            "&org=" +
-            this.org +
-            "&role=" +
-            this.role +
-            "&isN=" +
-            this.isN +
-            "&tcid=" +
-            this.tcid
-          );
+          // this.goTo(
+          //   "/testStudent?userid=" +
+          //   this.userid +
+          //   "&oid=" +
+          //   this.oid +
+          //   "&org=" +
+          //   this.org +
+          //   "&role=" +
+          //   this.role +
+          //   "&isN=" +
+          //   this.isN +
+          //   "&tcid=" +
+          //   this.tcid
+          // );
+          if (this.type == 3) {
+            this.goTo(
+              "/testPerson?userid=" +
+              this.userid +
+              "&oid=" +
+              this.oid +
+              "&org=" +
+              this.org +
+              "&role=" +
+              this.role
+            );
+          } else {
+            this.goTo(
+              "/testStudent?userid=" +
+              this.userid +
+              "&oid=" +
+              this.oid +
+              "&org=" +
+              this.org +
+              "&role=" +
+              this.role +
+              "&isN=" +
+              this.isN +
+              "&tcid=" +
+              this.tcid
+            );
+          }
         })
         .catch((err) => {
           this.$message.error("网络不佳");

+ 37 - 25
src/components/pages/workPage/index.vue

@@ -79,7 +79,7 @@
     </div>
 
     <div class="wp_tool wp_tool45" v-if="workData && workData.type == 45">
-      <div class="wp_t45_title">题目内容</div>
+      <div class="wp_t45_title">练一练</div>
       <div
         class="s_b_m_toolItem"
         v-for="(item, index) in workData.json.testJson"
@@ -101,7 +101,15 @@
           </svg>
 
           <span
-            ><span v-html="renderedFormula(`<span style='color: #3681FC;''>${item.type == 1 ? '(单选题):' : '(多选题):'}</span>${item.teststitle}`)"></span>
+            ><span
+              v-html="
+                renderedFormula(
+                  `<span style='color: #3681FC;''>${
+                    item.type == 1 ? '(单选题):' : '(多选题):'
+                  }</span>${item.teststitle}`
+                )
+              "
+            ></span>
           </span>
         </div>
         <div
@@ -163,8 +171,8 @@ export default {
       cid: this.$route.query.cid,
       workData: {},
       loadingUploadFile: false,
-      studentWork:null,
-      loading:false,
+      studentWork: null,
+      loading: false
     };
   },
   watch: {
@@ -376,7 +384,11 @@ export default {
             type: "8"
           });
         }
-        if (["3", "8"].includes(params[0].type) && params[0].uid && params[0].cid) {
+        if (
+          ["3", "8"].includes(params[0].type) &&
+          params[0].uid &&
+          params[0].cid
+        ) {
           this.loading = true;
           this.ajax
             .post(this.$store.state.api + "addCourseWorks_workPage", params)
@@ -389,7 +401,6 @@ export default {
               } else {
                 resolve("");
               }
-
             })
             .catch(err => {
               console.log(err);
@@ -430,7 +441,7 @@ export default {
           task: this.task,
           tool: this.tool
         };
-				this.loading = true;
+        this.loading = true;
         this.ajax
           .get(
             this.$store.state.api + "select_courseWorks_workPageData",
@@ -441,11 +452,14 @@ export default {
             this.loading = false;
             if (_data.length) {
               _data = _data[0];
-              let _work = JSON.parse(decodeURIComponent(_data.content));
-              this.studentWork = _work;
-              this.studentWorkToWorkData();
+              if (["15", "45"].includes(_data.atool)) {
+                let _work = JSON.parse(decodeURIComponent(_data.content));
+                this.studentWork = _work;
+                this.studentWorkToWorkData();
+              }else{
+                console.log("工具不一致")
+              }
             }
-
           })
           .catch(err => {
             this.loading = false;
@@ -453,17 +467,16 @@ export default {
           });
       }
     },
-    studentWorkToWorkData(){
-      if(this.studentWork && this.workData){
-        console.log("studentWork",this.studentWork)
-        console.log("workData",this.workData)
-
+    studentWorkToWorkData() {
+      if (this.studentWork && this.workData) {
+        console.log("studentWork", this.studentWork);
+        console.log("workData", this.workData);
 
         let _work = JSON.parse(JSON.stringify(this.studentWork));
-        if ( this.workData.type == "15") {
+        if (this.workData.type == "15") {
           this.workData.json.answer = _work.answer;
           this.workData.json.fileList = _work.fileList;
-        } else if ( this.workData.type == "45") {
+        } else if (this.workData.type == "45") {
           this.workData.json.testJson.forEach((item, index) => {
             if (
               item.type == _work.testJson[index].type &&
@@ -471,13 +484,14 @@ export default {
               JSON.stringify(item.checkList) ==
                 JSON.stringify(_work.testJson[index].checkList)
             ) {
-              this.workData.json.testJson[index].userAnswer = _work.testJson[index].userAnswer;
+              this.workData.json.testJson[index].userAnswer =
+                _work.testJson[index].userAnswer;
             }
           });
         }
         this.$forceUpdate();
       }
-    },
+    }
   },
   mounted() {
     this.getWorkData();
@@ -510,12 +524,12 @@ export default {
 }
 
 .wp_t15_title {
-  font-size: 3em;
+  font-size: 40px;
   font-weight: 300;
   margin: 20px 0;
-  width: 50%;
+  max-width: 50%;
   min-width: 300px;
-  text-align: center;
+  text-align: left;
 }
 
 .wp_type {
@@ -752,8 +766,6 @@ export default {
   min-height: 30px;
   line-height: 30px;
   color: #1f1f1f;
-
-
 }
 
 .s_b_m_ti_title > div {

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov