|
@@ -6531,6 +6531,7 @@
|
|
>
|
|
>
|
|
<div
|
|
<div
|
|
class="zuoyeYulan"
|
|
class="zuoyeYulan"
|
|
|
|
+ style="display: flex;justify-content: space-between;align-items: center;"
|
|
v-if="
|
|
v-if="
|
|
worksStudent.length &&
|
|
worksStudent.length &&
|
|
worksStudent[toolIndex].length > 0
|
|
worksStudent[toolIndex].length > 0
|
|
@@ -6556,6 +6557,17 @@
|
|
展开
|
|
展开
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
+ <div v-if="chapInfoList[courseType].chapterInfo[0].taskJson[taskCount].eList && courseDetail.state == 5">
|
|
|
|
+ <div class="ScoreBtn" v-if="!loopLoading[toolIndex].loading" @click="loopEva(worksStudent[toolIndex],chapInfoList[courseType].chapterInfo[0].taskJson[taskCount].eList,courseType,taskCount,toolIndex,tool.toolDetail)" >
|
|
|
|
+ <img src="../../assets/icon/newIcons/rootImg.png" alt="">
|
|
|
|
+ AI评分
|
|
|
|
+ </div>
|
|
|
|
+ <div class="ScoreBtn" v-else >
|
|
|
|
+ <img src="../../assets/icon/newIcons/rootImg.png" alt="">
|
|
|
|
+ 正在评分
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ </div>
|
|
<!-- <el-button type="text" @click="jump()" v-if="tType == 2" class="buttonA">我的评价</el-button> -->
|
|
<!-- <el-button type="text" @click="jump()" v-if="tType == 2" class="buttonA">我的评价</el-button> -->
|
|
</div>
|
|
</div>
|
|
<div
|
|
<div
|
|
@@ -6603,7 +6615,7 @@
|
|
<div
|
|
<div
|
|
class="answerScore"
|
|
class="answerScore"
|
|
@click.stop="openScore(w)"
|
|
@click.stop="openScore(w)"
|
|
- v-else-if="courseDetail.userid == userid"
|
|
|
|
|
|
+ v-else-if="courseDetail.userid == userid && courseDetail.state != 5 && !chapInfoList[courseType].chapterInfo[0].taskJson[taskCount].eList"
|
|
:class="{
|
|
:class="{
|
|
rightW:
|
|
rightW:
|
|
w.userid == userid ||
|
|
w.userid == userid ||
|
|
@@ -6614,6 +6626,50 @@
|
|
>
|
|
>
|
|
评分
|
|
评分
|
|
</div>
|
|
</div>
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ <div v-else-if="courseDetail.userid == userid && courseDetail.state == 5">
|
|
|
|
+ <el-popover
|
|
|
|
+ placement="top"
|
|
|
|
+ width="300"
|
|
|
|
+ :disabled="AIloading[toolIndex][wIndex].loading"
|
|
|
|
+ trigger="click"
|
|
|
|
+ >
|
|
|
|
+ <markScore
|
|
|
|
+ :loading="AIloading[toolIndex][wIndex].loading"
|
|
|
|
+ ref="markSco"
|
|
|
|
+ @updateLoading=updateLoading
|
|
|
|
+ @updateDocSco=updateDocSco
|
|
|
|
+ :wIndex=wIndex
|
|
|
|
+ :scoCon="w"
|
|
|
|
+ :TotalScore="AIloading[toolIndex][wIndex].sco"
|
|
|
|
+ :toolIndex="toolIndex"
|
|
|
|
+ :key="refreshKey"
|
|
|
|
+ :toolDetail=tool.toolDetail
|
|
|
|
+ :stage="courseType"
|
|
|
|
+ :task="taskCount"
|
|
|
|
+ :scoTit=chapInfoList[courseType].chapterInfo[0].taskJson[taskCount].eList>
|
|
|
|
+ </markScore>
|
|
|
|
+ <div
|
|
|
|
+ class="answerScore"
|
|
|
|
+ slot="reference"
|
|
|
|
+ @click="refreshAssembly(wIndex)"
|
|
|
|
+ :class="{
|
|
|
|
+ rightW:
|
|
|
|
+ w.userid == userid ||
|
|
|
|
+ tType == 1 ||
|
|
|
|
+ tType == 4 ||
|
|
|
|
+ w.ateacher == userid,
|
|
|
|
+ }"
|
|
|
|
+ >
|
|
|
|
+ <span v-if="AIloading[toolIndex][wIndex].sco">{{ AIloading[toolIndex][wIndex].loading? '评分中' : AIloading[toolIndex][wIndex].sco + "分" }}</span>
|
|
|
|
+ <span v-else>
|
|
|
|
+ {{AIloading[toolIndex][wIndex].loading? '评分中' :'评分'}}{{w.Total}}
|
|
|
|
+ </span>
|
|
|
|
+ </div>
|
|
|
|
+ </el-popover>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
<img
|
|
<img
|
|
class="deleteImg"
|
|
class="deleteImg"
|
|
src="../../assets/deleteworks.png"
|
|
src="../../assets/deleteworks.png"
|
|
@@ -6624,7 +6680,6 @@
|
|
alt
|
|
alt
|
|
/>
|
|
/>
|
|
</div>
|
|
</div>
|
|
-
|
|
|
|
<div class="comment" style="min-width: 200px">
|
|
<div class="comment" style="min-width: 200px">
|
|
<div class="worksName">
|
|
<div class="worksName">
|
|
<div>{{ w.sName }}</div>
|
|
<div>{{ w.sName }}</div>
|
|
@@ -11944,6 +11999,7 @@ import correctText from '../components/correctText.vue'
|
|
import scoreItem from '../scoreList/scoreItem.vue'
|
|
import scoreItem from '../scoreList/scoreItem.vue'
|
|
import scoreZong from '../scoreZong/index.vue'
|
|
import scoreZong from '../scoreZong/index.vue'
|
|
import classRoomHelper from '../classRoomHelper/index.vue'
|
|
import classRoomHelper from '../classRoomHelper/index.vue'
|
|
|
|
+import markScore from "./commpont/markScore";
|
|
|
|
|
|
const getFile = (url) => {
|
|
const getFile = (url) => {
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
@@ -12019,7 +12075,8 @@ export default {
|
|
correctText,
|
|
correctText,
|
|
scoreItem,
|
|
scoreItem,
|
|
classRoomHelper,
|
|
classRoomHelper,
|
|
- scoreZong
|
|
|
|
|
|
+ scoreZong,
|
|
|
|
+ markScore
|
|
},
|
|
},
|
|
data() {
|
|
data() {
|
|
return {
|
|
return {
|
|
@@ -12390,6 +12447,123 @@ export default {
|
|
};
|
|
};
|
|
},
|
|
},
|
|
methods: {
|
|
methods: {
|
|
|
|
+ // 获取单个分数
|
|
|
|
+ // getTotal( ) {
|
|
|
|
+ // let params = {
|
|
|
|
+ // uid: this.scoCon.userid,
|
|
|
|
+ // cid: this.id
|
|
|
|
+ // };
|
|
|
|
+
|
|
|
|
+ // return new Promise(resolve => { this.ajax
|
|
|
|
+ // .get(this.$store.state.api + "selectWorksEvaScore", params)
|
|
|
|
+ // .then(res => {
|
|
|
|
+ // if (res.data[0].length > 0) {
|
|
|
|
+ // let data = JSON.parse(res.data[0][this.task].rate);
|
|
|
|
+ // console.log(data);
|
|
|
|
+ // resolve(data)
|
|
|
|
+ // // this.scoTitList.forEach((e, index) => {
|
|
|
|
+ // // e.cog = 0;
|
|
|
|
+ // // for (const key in data) {
|
|
|
|
+ // // if (e.value == key) {
|
|
|
|
+ // // e.cog = data[key] * 1;
|
|
|
|
+ // // }
|
|
|
|
+ // // }
|
|
|
|
+ // // });
|
|
|
|
+ // }
|
|
|
|
+ // })
|
|
|
|
+ // .catch(err => {
|
|
|
|
+ // console.error(err);
|
|
|
|
+ // });
|
|
|
|
+ // })
|
|
|
|
+ // .catch(error => {
|
|
|
|
+ // console.log(error);
|
|
|
|
+ // });
|
|
|
|
+ // },
|
|
|
|
+
|
|
|
|
+ async loopEva(con,tit,stage,task,toolIndex,toolDetail){
|
|
|
|
+ console.log(con,tit,stage,task,toolIndex,toolDetail);
|
|
|
|
+
|
|
|
|
+ let jude = false
|
|
|
|
+ this.AIloading.forEach((e,index)=>{
|
|
|
|
+ if(index == toolIndex){
|
|
|
|
+ e.forEach(k=>{
|
|
|
|
+ if(k.loading == true)
|
|
|
|
+ jude=true
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ if(jude) return this.$message.info('请勿同时间进行AI评分')
|
|
|
|
+
|
|
|
|
+ this.AIloading.forEach((e,index)=>{
|
|
|
|
+ if(index == toolIndex){
|
|
|
|
+ e.forEach(k=>{
|
|
|
|
+ k.loading=true
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ this.loopLoading[toolIndex].loading=true
|
|
|
|
+ // return console.log(this.loopLoading,this.AIloading);
|
|
|
|
+
|
|
|
|
+ let _text = ''
|
|
|
|
+ for (let i = 0; i < tit.length; i++) {
|
|
|
|
+ _text += `维度名称:${tit[i].value} 维度描述:${tit[i].detail} \n`
|
|
|
|
+ }
|
|
|
|
+ for (let i = 0; i < con.length; i++) {
|
|
|
|
+ let msg = `NOTICE
|
|
|
|
+ Role: 你是一个专业的项目式学习导师,你要对学生的评价高度负责。你要根据“五级评价细则”给学生作品评分。
|
|
|
|
+ Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
|
|
|
|
+ ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
|
|
|
|
+ Instruction: Based on the context, follow "Format example", write content.
|
|
|
|
+
|
|
|
|
+ #Context
|
|
|
|
+ ## 评价细则
|
|
|
|
+ ${_text}
|
|
|
|
+
|
|
|
|
+ ## 作业题目
|
|
|
|
+ ${toolDetail}
|
|
|
|
+
|
|
|
|
+ ## 作业内容
|
|
|
|
+ ${JSON.parse(con[i].works).text}
|
|
|
|
+
|
|
|
|
+ ## 要求
|
|
|
|
+ 根据评价细则和作业内容与作业题目的相关性评价作业,判断该作业属于五级中的哪个等级。
|
|
|
|
+ 具体的评价标准分为5级——1级,2级,3级,4级,5级。输出格式参考===输出范例===。
|
|
|
|
+ ===
|
|
|
|
+ 1 级,没有识别问题和需求;
|
|
|
|
+ 2 级,问题或需求没有被清晰理解或准确识别;
|
|
|
|
+ 3 级,问题或需求的一部分被识别;
|
|
|
|
+ 4 级,问题或需求的大部分被识别;
|
|
|
|
+ 5 级,问题或需求都被识别。
|
|
|
|
+ ===
|
|
|
|
+
|
|
|
|
+ ## Format example
|
|
|
|
+ 输出格式:[{'评价细则维度':'1'}],
|
|
|
|
+ 属性名为每个评价细则的维度名称
|
|
|
|
+ 不能不做评价,必须每个都有分数,分数只用数字来评分
|
|
|
|
+ `
|
|
|
|
+ await this.$refs.markSco[0].aiupdetaSco(msg,con[i].userid,stage,task)
|
|
|
|
+ this.refreshKey++
|
|
|
|
+ this.AIloading[toolIndex][i].loading=false
|
|
|
|
+ }
|
|
|
|
+ this.loopLoading[toolIndex].loading = false;
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ // 组件刷新
|
|
|
|
+ refreshAssembly(val){
|
|
|
|
+ this.refreshKey++
|
|
|
|
+ // console.log(this.refreshKey)
|
|
|
|
+ },
|
|
|
|
+ updateLoading(payload){
|
|
|
|
+ // console.log('payloadpayloadpayloadpayload',payload);
|
|
|
|
+ this.AIloading[payload.val][payload.val2].loading=payload.val3
|
|
|
|
+ },
|
|
|
|
+ updateDocSco(payload){
|
|
|
|
+ // console.log('payloadpayloadpayloadpayload',payload);
|
|
|
|
+
|
|
|
|
+ this.AIloading[payload.val][payload.val2].sco=payload.val3*1
|
|
|
|
+ },
|
|
gx(){
|
|
gx(){
|
|
this.$forceUpdate();
|
|
this.$forceUpdate();
|
|
},
|
|
},
|
|
@@ -12641,6 +12815,7 @@ export default {
|
|
}
|
|
}
|
|
},
|
|
},
|
|
jumpGj(i, j, k, l) {
|
|
jumpGj(i, j, k, l) {
|
|
|
|
+ this.refreshAssembly()
|
|
for (var z = 0; z < this.navList.length; z++) {
|
|
for (var z = 0; z < this.navList.length; z++) {
|
|
for (var q = 0; q < this.navList[z].task.length; q++) {
|
|
for (var q = 0; q < this.navList[z].task.length; q++) {
|
|
for (var w = 0; w < this.navList[z].task[q].tool.length; w++) {
|
|
for (var w = 0; w < this.navList[z].task[q].tool.length; w++) {
|
|
@@ -15378,6 +15553,19 @@ export default {
|
|
this.joinGroup(gindex);
|
|
this.joinGroup(gindex);
|
|
}
|
|
}
|
|
this.worksStudent = _worksStudent;
|
|
this.worksStudent = _worksStudent;
|
|
|
|
+ if( JSON.stringify(this.worksStudentCopy) != JSON.stringify(this.worksStudent)){
|
|
|
|
+ this.worksStudentCopy=this.worksStudent
|
|
|
|
+ this.AIloading=[]
|
|
|
|
+ this.loopLoading=[]
|
|
|
|
+
|
|
|
|
+ this.worksStudent.forEach((e,index)=>{
|
|
|
|
+ this.loopLoading.push({loading:false})
|
|
|
|
+ this.AIloading.push([])
|
|
|
|
+ e.forEach(k=>{
|
|
|
|
+ this.AIloading[index].push({loading:false,sco:0})
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+ }
|
|
this.selectWorksStudent();
|
|
this.selectWorksStudent();
|
|
for (let ci = 0; ci < this.isCloseList.length; ci++) {
|
|
for (let ci = 0; ci < this.isCloseList.length; ci++) {
|
|
this.$nextTick(()=>{
|
|
this.$nextTick(()=>{
|
|
@@ -16145,6 +16333,7 @@ export default {
|
|
this.$forceUpdate();
|
|
this.$forceUpdate();
|
|
},
|
|
},
|
|
openTask(s, n, i) {
|
|
openTask(s, n, i) {
|
|
|
|
+ this.refreshAssembly()
|
|
if (this.IsFollow && this.tType == 2) {
|
|
if (this.IsFollow && this.tType == 2) {
|
|
this.$message.error("已经开启跟随模式,请认真跟堂听讲");
|
|
this.$message.error("已经开启跟随模式,请认真跟堂听讲");
|
|
return;
|
|
return;
|
|
@@ -19944,6 +20133,7 @@ export default {
|
|
unbind(el) {
|
|
unbind(el) {
|
|
clearInterval(el.__vueSetInterval__);
|
|
clearInterval(el.__vueSetInterval__);
|
|
},
|
|
},
|
|
|
|
+
|
|
},
|
|
},
|
|
autoHeight: {
|
|
autoHeight: {
|
|
update(el, binding) {
|
|
update(el, binding) {
|
|
@@ -19957,7 +20147,7 @@ export default {
|
|
componentUpdated(el) {
|
|
componentUpdated(el) {
|
|
el.style.height = `${el.scrollHeight + 5}px`
|
|
el.style.height = `${el.scrollHeight + 5}px`
|
|
},
|
|
},
|
|
- },
|
|
|
|
|
|
+ }
|
|
},
|
|
},
|
|
beforeDestroy() {
|
|
beforeDestroy() {
|
|
window.onresize = null;
|
|
window.onresize = null;
|
|
@@ -19967,6 +20157,12 @@ export default {
|
|
this.opertimer = null;
|
|
this.opertimer = null;
|
|
},
|
|
},
|
|
computed: {
|
|
computed: {
|
|
|
|
+ // getdocumentSco(){
|
|
|
|
+ // return function (w,task,tooindex) {
|
|
|
|
+ // console.log(w);
|
|
|
|
+ // return task;
|
|
|
|
+ // };
|
|
|
|
+ // },
|
|
getHeight(){
|
|
getHeight(){
|
|
return document.querySelectorAll(".engUpTop")[0].offsetHeight;
|
|
return document.querySelectorAll(".engUpTop")[0].offsetHeight;
|
|
},
|
|
},
|
|
@@ -21995,7 +22191,9 @@ export default {
|
|
.elist_input {
|
|
.elist_input {
|
|
/* width: 40%; */
|
|
/* width: 40%; */
|
|
width: 45%;
|
|
width: 45%;
|
|
- margin: 20px;
|
|
|
|
|
|
+ padding: 20px;
|
|
|
|
+ /* margin: 20px; */
|
|
|
|
+ box-sizing: border-box;
|
|
}
|
|
}
|
|
|
|
|
|
.elist_input .elist_input_box input {
|
|
.elist_input .elist_input_box input {
|
|
@@ -24544,4 +24742,20 @@ ol {
|
|
background: #409eff;
|
|
background: #409eff;
|
|
color: #fff;
|
|
color: #fff;
|
|
}
|
|
}
|
|
|
|
+.ScoreBtn{
|
|
|
|
+ background: rgba(87, 159, 248, 1);
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: center;
|
|
|
|
+ align-items: center;
|
|
|
|
+ color: #fff;
|
|
|
|
+ font-size: 14px;
|
|
|
|
+ padding:8px 12px;
|
|
|
|
+ border-radius: 5px;
|
|
|
|
+ cursor: pointer;
|
|
|
|
+}
|
|
|
|
+.max-height-popover .el-popover {
|
|
|
|
+ min-height: 200px;
|
|
|
|
+ max-height: 400px; /* 设置最大高度 */
|
|
|
|
+ overflow: auto; /* 超出部分显示滚动条 */
|
|
|
|
+}
|
|
</style>
|
|
</style>
|