From 625f82880faea02b80eb2b5bbe60bd44564685eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E4=BA=86=E4=B8=AA=E7=99=BD?= <543593352@qq.com> Date: Wed, 6 Nov 2024 11:24:53 +0800 Subject: [PATCH 1/2] 1 --- src/renderer/src/views/tool/createHomework.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/renderer/src/views/tool/createHomework.js b/src/renderer/src/views/tool/createHomework.js index dc1a8cf..5f3cc75 100644 --- a/src/renderer/src/views/tool/createHomework.js +++ b/src/renderer/src/views/tool/createHomework.js @@ -43,6 +43,16 @@ export const createHomework = ({ uniquekey, evalid, data, entpcourseid }) => { let classWorkList = [] +// 将标签中的双引号增加转义 +const escapeHtmlQuotes = (str) => { + // 后端已replace双引号, 故前端不用在处理 + const regex1 = /\\+/g; // 匹配多个反斜杠 + let result = str.replace(regex1, '\\'); + result = str.replace(/(?'); //替换\n而不替换\\n 为 \\n + + return result; +} + /** * 获取班级作业 */ From 3c32f5d8237d3d91449c7685be047ad92fdb40ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E4=BA=86=E4=B8=AA=E7=99=BD?= <543593352@qq.com> Date: Thu, 7 Nov 2024 09:44:28 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E6=89=B9=E6=94=B9?= =?UTF-8?q?=EF=BC=9A=E9=80=BB=E8=BE=91=E4=B8=8E=E7=95=8C=E9=9D=A2=E6=9B=B4?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/src/utils/date.js | 61 ++ .../src/views/classTask/classTask.vue | 554 ++++++++---------- .../container/classTask/task-item.vue | 60 +- .../views/desktop/container/work-trend.vue | 17 +- src/renderer/src/views/tool/createHomework.js | 4 +- 5 files changed, 364 insertions(+), 332 deletions(-) diff --git a/src/renderer/src/utils/date.js b/src/renderer/src/utils/date.js index d967f24..5a757a6 100644 --- a/src/renderer/src/utils/date.js +++ b/src/renderer/src/utils/date.js @@ -167,3 +167,64 @@ export function getTomorrow() { return tomorrow; } + + +/** + * 当前日期的 前几天 + * @param {*} index 天数 + * @param {*} format true 返回中国标准时间:Wed Oct 02 2024 08:00:00 GMT+0800 (中国标准时间) 格式; false 返回标准时间格式 YYYY-MM-DD + * @returns + */ +export function getTheOtherDay(index, format=true) { + let date = new Date(); + var year = date.getFullYear() + var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 + var day = date.getDate()- index < 10 ? '0' + (date.getDate()- index) : date.getDate()- index + + // 前 index 天的时间 + if(format){ + let tomorrow = `${year}-${month}-${day}`; + return new Date(tomorrow); + }else{ + let tomorrow = `${year}-${month}-${day}`; + return tomorrow; + } +} +/** + * 当前日期的 后几天 + * @param {*} index 天数 + * @param {*} format true 返回中国标准时间:Wed Oct 02 2024 08:00:00 GMT+0800 (中国标准时间) 格式; false 返回标准时间格式 YYYY-MM-DD + * @returns + */ +export function getTheOtheNextDay(index, format=true) { + const date = new Date(); + var year = date.getFullYear() + var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 + var day = date.getDate()+ index < 10 ? '0' + (date.getDate()+ index) : date.getDate()+ index + + // 前 index 天的时间 + if(format){ + const tomorrow = `${year}-${month}-${day}`; + return new Date(tomorrow); + }else{ + const tomorrow = `${year}-${month}-${day}`; + return tomorrow; + } +} + + +/** + * Wed Oct 02 2024 08:00:00 GMT+0800 (中国标准时间) 转为日期格式: YYYY-MM-DD + * + * @param {*} format + * @returns + */ +export const getDateFormatDate = (newDate)=> { + const now = newDate; // new Date(); + const year = now.getFullYear(); + const month = (now.getMonth() + 1).toString().padStart(2, '0'); + const day = now.getDate().toString().padStart(2, '0'); + + return `${year}-${month}-${day}`; +} + diff --git a/src/renderer/src/views/classTask/classTask.vue b/src/renderer/src/views/classTask/classTask.vue index 055fa37..61107f9 100644 --- a/src/renderer/src/views/classTask/classTask.vue +++ b/src/renderer/src/views/classTask/classTask.vue @@ -4,20 +4,16 @@
-
+
-
- -
+
@@ -27,7 +23,7 @@
([ + getTheOtherDay(3), + getTheOtheNextDay(3), +]) + // 所有班级作业列表 const classWorkList = ref([]) @@ -91,23 +94,24 @@ const loading = ref(false) const activeDataList = computed(() => { return classWorkList.value }) +const doneDataList = computed(() => { + return classWorkList.value +}) const deleteReserv = (item) => { console.log('删除待开发', item) // dataList.value = dataList.value.filter((is) => { // return is.id !== item.id // }) } -const doneDataList = computed(() => { - return classWorkList.value -}) + // 当日之后的日期禁用 const disabledDate = (time) => { return time.getTime() > Date.now() } -// 截止日期改变 -const changeEndDate = (val) => { - console.log('截止日期改变', val) + +const changeStartEndDate = (val) => { + console.log('起止日期改变', val) getData() // 加载数据 } @@ -115,245 +119,202 @@ const changeEndDate = (val) => { const getData = async () => { classWorkList.value = [] loading.value = true - // 1、班级列表 - // getClassList() - // 2、班级作业 + // 1、班级作业 await getClassWorkList() - // 3、班级学生作业 包含多个班级 + // 2、班级学生作业 包含多个班级 getStudentClassWorkData() loading.value = false } + /** - * 1、获取班级列表数据 - * TODO 这里暂时取班级id的list,后续需要在修改 - */ -const getClassList = () => { - if(classTaskStore.classListIds.length==0){ - // 获取 班级列表ids 这里暂时取班级id的list,后续需要在修改 - classTaskStore.listClassmain({ classuserid: userStore.userId, pageSize: 100, status: 'open' }) - } -} -/** - * 2、获取班级作业 + * 1、获取班级作业 */ const getClassWorkList = async () => { - //if(classTaskStore.classListIds.length>0){ - { - // 班级作业数据,包含多个班级 homeworklist - const response = await listByDeadDate({ - edituserid: userStore.userId, // 老师的id - edustage: userStore.edustage, // 学段 - edusubject: userStore.edusubject,//学科 - // deaddate: tabActive.value === '进行中'? getTomorrow() : EndDate.value,// 进行中:明天,已结束:选择的日期 弃用 - deaddate: EndDate.value,// 进行中:明天,已结束:选择的日期 - status: '1', // 作业状态:1-已发布 - orderby: 'deaddate DESC', - pageSize: 100, - }) + // 班级作业数据,包含多个班级 homeworklist + const response = await listByDeadDate({ + edituserid: userStore.userId, // 老师的id + edustage: userStore.edustage, // 学段 + edusubject: userStore.edusubject,//学科 + startdate: tabActive.value === '待批改'? '' : getDateFormatDate(startEndDate.value[0]), + deaddate: tabActive.value === '待批改'? '' : getDateFormatDate(startEndDate.value[1]),// 待批改:明天,已批改:选择的日期 + status: tabActive.value === '待批改'? '1' : '2', // 作业状态:1-已发布 + orderby: 'deaddate DESC', + pageSize: 100, + }) - /** - * 2024-10-17 由于 后面截止时间加了 时分,特加判断 - * 1、进行中、以前是以明天判断。现改为传当天的日期,并根据当前日期的时分与截止日期进行判断, - * 2、已结束、以前默认是以明天判断。现依然以明天为判断,并根据当前日期时分大于截止日期时分判断。 - */ - let list = []; - if(tabActive.value === '进行中'){ - // 进行中 当前日期时间 小于 截止 日期时间 - list = response.rows&&response.rows.filter(item => item.deaddate && getCurrentTime('YYYY-MM-DD HH:mm') < item.deaddate); // 进行中 - }else{ - list = response.rows&&response.rows.filter(item => item.deaddate && getCurrentTime('YYYY-MM-DD HH:mm') > item.deaddate); // 已结束 + let list = response.rows || []; + for (var i = 0; i < list.length; i++) { + // 初始化部分新增字段值 + list[i].workdatalist = [] // 当前任务中有多少个学生的数据集合 + list[i].workdatalistVisible = false + list[i].feedtimelength = 0 // 已交的学生人中,汇总计算用时 + list[i].rightAnswerCount = 0 + list[i].scoingRate = 0 + '%' // 得分率 + list[i].averagetime = 0 // 平均用时 + + // ---------------------------------------------- + // 处理任务类型的UI + if (list[i].worktype == '学习目标定位') { + list[i].workclass = 'success' + list[i].workcodesList = JSON.parse(list[i].workcodes) + } else if (list[i].worktype == '教材研读') { + list[i].workclass = 'primary' + } else if (list[i].worktype == '框架梳理') { + list[i].workclass = 'warning' + } else if (list[i].worktype == '学科定位') { + list[i].workclass = 'info' + } else if (list[i].worktype == '习题训练') { + list[i].workclass = 'danger' + } else { + list[i].workclass = '' } - - - for (var i = 0; i < list.length; i++) { - // 初始化部分新增字段值 - list[i].workdatalist = [] - list[i].workdatacount = 0 // 人数 - list[i].workdatalistVisible = false - list[i].workdatafeedbackcount = 0 // 已交人数 - list[i].feedtimelength = 0 - list[i].rightAnswerCount = 0 - list[i].scoingRate = 0 + '%' // 得分率 - list[i].averagetime = 0 // 平均用时 - - // ---------------------------------------------- - // 处理任务类型的UI - if (list[i].worktype == '学习目标定位') { - list[i].workclass = 'success' - list[i].workcodesList = JSON.parse(list[i].workcodes) - } else if (list[i].worktype == '教材研读') { - list[i].workclass = 'primary' - } else if (list[i].worktype == '框架梳理') { - list[i].workclass = 'warning' - } else if (list[i].worktype == '学科定位') { - list[i].workclass = 'info' - } else if (list[i].worktype == '习题训练') { - list[i].workclass = 'danger' - } else { - list[i].workclass = '' - } - // 如果是习题训练任务,则检查一共有多少道 - if (list[i].entpcourseworklist != '') { - list[i].entpcourseworklistarray = JSON.parse( - '[' + list[i].entpcourseworklist + ']' - ) - } else { - list[i].entpcourseworklistarray = [] - } - // 根据 classworkdatastudentids 初始化判断分配的人数 - if ( - list[i].classworkdatastudentids != '' && - list[i].classworkdatastudentids != null && - list[i].classworkdatastudentids != 'null' - ) { - const stuList = JSON.parse('[' + list[i].classworkdatastudentids + ']') - list[i].workdatacount = stuList.length - } + // 如果是习题训练任务,则检查一共有多少道 + if (list[i].entpcourseworklist != '') { + list[i].entpcourseworklistarray = JSON.parse( + '[' + list[i].entpcourseworklist + ']' + ) + } else { + list[i].entpcourseworklistarray = [] } - // 显示分配人数(workdatacount)>0 的 - if (list && list.length > 0) { - classWorkList.value = list && list.filter((item) => item.workdatacount > 0) - //TODO: 这里没分页,貌似这个 total 不重要,后续看 - total.value = 0 - }else{ - classWorkList.value = [] - total.value = 0 - } - loading.value = false } + + // 显示分配人数(workdataresultsum)>0 的 + if (list && list.length > 0) { + classWorkList.value = list && list.filter((item) => item.workdataresultsum > 0) + //TODO: 这里没分页,貌似这个 total 不重要,后续看 + total.value = 0 + }else{ + classWorkList.value = [] + total.value = 0 + } + loading.value = false } /** - * 3、获取多个班级学生作业数据 + * 2、获取多个班级学生作业数据 + * 查询已交的列表 + * @param workList :需要更新的作业list + * @param Refresh :true 不用刷新,false 需要刷新 */ -const getStudentClassWorkData = async() => { - // const { chapterId } = await useGetHomework(props.bookobj.node) - // this.entpcourseid = chapterId - //if(classTaskStore.classListIds.length>0){ - // listClassworkdataByDeadDate({ - // edituserid: userStore.userId, // 老师的id - // classids: classTaskStore.classListIds.join(','), - // edusubject: userStore.edusubject,//学科 - // deaddate: tabActive.value === '进行中'? getTomorrow() : EndDate.value,// 进行中:明天,已结束:选择的日期 - // deaddate: EndDate.value,// 进行中:明天,已结束:选择的日期 - // //status: '1', // 作业状态:1-已发布 - // orderby: "deaddate DESC",// - // pageSize: 1000, - // }) +const getStudentClassWorkData = async(workList = [], Refresh = true) => { + // 获取 已交的 列表数据(workdataresultcount 已交的学生数) + let SubmitClWorkList = []; + if(Refresh){ + SubmitClWorkList = classWorkList.value.filter((item) => item.workdataresultcount > 0) ; + }else{ + SubmitClWorkList = workList; + } - // listClassworkdataNew({ - // classworkids: ids, // 作业id - // edituserid: userStore.userId, // 老师的id - // edusubject: userStore.edusubject,//学科 - // evalStatus: 1, - // pageSize: 1000, - // }) + console.log('有提交的作业', SubmitClWorkList) + const ids = SubmitClWorkList&&SubmitClWorkList.map((item) => item.id).join(','); + if (ids == '') { + return; + } + listClassworkdata({ + classworkids: ids, + pageSize: 1000, + }).then((res) => { + for (var t = 0; t < classWorkList.value.length; t++) { + for (var i = 0; i < res.rows.length; i++) { + // finishtimelength != '0' 已交 + if (res.rows[i].classworkid == classWorkList.value[t].id && res.rows[i].finishtimelength != '0') { + console.log('==================') + // 有几个学生完成/正在完成学习任务 + // 至少resultcount不是0 + //classWorkList.value[t].workdataresultcount++ - - { - const ids = classWorkList.value.map((item) => item.id).join(','); - if (ids == '') { - return; - } - listClassworkdata({ - classworkids: ids, - pageSize: 1000, - }).then((res) => { - for (var t = 0; t < classWorkList.value.length; t++) { - for (var i = 0; i < res.rows.length; i++) { - if (res.rows[i].classworkid == classWorkList.value[t].id && res.rows[i].finishtimelength != '0') { - console.log('==================') - // 有几个学生完成/正在完成学习任务 - // 至少resultcount不是0 - classWorkList.value[t].workdatafeedbackcount++ + // 已交的学生人中,汇总计算用时 + classWorkList.value[t].feedtimelength += parseInt(res.rows[i].finishtimelength) - // 在参与学习任务的人中,汇总计算用时 - classWorkList.value[t].feedtimelength += parseInt(res.rows[i].finishtimelength) + // 计算得分率 + if ( + res.rows[i].classworkevallist != '' && + res.rows[i].classworkevallist != null && + res.rows[i].classworkevallist != 'null' + ) { + let replacedString = res.rows[i].classworkevallist.replace(/""/g, '"') + // 将标签中双引号改为转义, 测试数据: "{\"id\":172907, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":358520, \"feedcontent\":\"④①⑤③②\", \"score\":4, \"rightanswer\":\"④①⑤③②\"},{\"id\":172908, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":358521, \"feedcontent\":\"气壮山威,鲲鹏展翅楚云飞\", \"score\":4, \"rightanswer\":\"志远天高,春风杨柳麓山青\"},{\"id\":172909, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363096, \"feedcontent\":\"《红烛》化用“蜡矩”这一古典意象,赋予它新的含义,赞美了红烛以“蜡炬成灰”来点亮世界的奉献精神。\", \"score\":4, \"rightanswer\":\"《立在地球边上放号》中,全诗采用间接抒情的方式,描绘了太平洋的浪潮,吟唱了一曲惊心动魄的力的颂歌,意在赞美摧毁旧世界、创造新生活的“五四”精神。\"},{\"id\":172910, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363098, \"feedcontent\":\"毛泽东重游橘子洲,面对如画的秋色和大好的革命形势,回忆过去战斗的岁月,不禁心潮起伏,浮想联翩。\", \"score\":4, \"rightanswer\":\"毛泽东重游橘子洲,面对如画的秋色和大好的革命形势,回忆过去战斗的岁月,不禁心潮起伏,浮想联翩。\"},{\"id\":172911, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363100, \"feedcontent\":\"毛泽东重游橘子洲,面对如画的秋色和大好的革命形势,回忆过去战斗的岁月,不禁心潮起伏,浮想联翩。\", \"score\":4, \"rightanswer\":\"毛泽东重游橘子洲,面对如画的秋色和大好的革命形势,回忆过去战斗的岁月,不禁心潮起伏,浮想联翩。\"}" + replacedString = escapeHtmlQuotes(res.rows[i].classworkevallist).replace( + /"(\[.*\])"/g, + '$1' + ) + replacedString = escapeHtmlQuotes(res.rows[i].classworkevallist) + var evalarray + try { + evalarray = JSON.parse('[' + res.rows[i].classworkevallist + ']') + } catch { + evalarray = JSON.parse('[' + replacedString + ']') + } - // 计算得分率 - if ( - res.rows[i].classworkevallist != '' && - res.rows[i].classworkevallist != null && - res.rows[i].classworkevallist != 'null' - ) { - let replacedString = res.rows[i].classworkevallist.replace(/""/g, '"') - // 将标签中双引号改为转义, 测试数据: "{\"id\":172907, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":358520, \"feedcontent\":\"④①⑤③②\", \"score\":4, \"rightanswer\":\"④①⑤③②\"},{\"id\":172908, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":358521, \"feedcontent\":\"气壮山威,鲲鹏展翅楚云飞\", \"score\":4, \"rightanswer\":\"志远天高,春风杨柳麓山青\"},{\"id\":172909, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363096, \"feedcontent\":\"《红烛》化用“蜡矩”这一古典意象,赋予它新的含义,赞美了红烛以“蜡炬成灰”来点亮世界的奉献精神。\", \"score\":4, \"rightanswer\":\"《立在地球边上放号》中,全诗采用间接抒情的方式,描绘了太平洋的浪潮,吟唱了一曲惊心动魄的力的颂歌,意在赞美摧毁旧世界、创造新生活的“五四”精神。\"},{\"id\":172910, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363098, \"feedcontent\":\"毛泽东重游橘子洲,面对如画的秋色和大好的革命形势,回忆过去战斗的岁月,不禁心潮起伏,浮想联翩。\", \"score\":4, \"rightanswer\":\"毛泽东重游橘子洲,面对如画的秋色和大好的革命形势,回忆过去战斗的岁月,不禁心潮起伏,浮想联翩。\"},{\"id\":172911, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363100, \"feedcontent\":\"毛泽东重游橘子洲,面对如画的秋色和大好的革命形势,回忆过去战斗的岁月,不禁心潮起伏,浮想联翩。\", \"score\":4, \"rightanswer\":\"毛泽东重游橘子洲,面对如画的秋色和大好的革命形势,回忆过去战斗的岁月,不禁心潮起伏,浮想联翩。\"}" - replacedString = escapeHtmlQuotes(res.rows[i].classworkevallist).replace( - /"(\[.*\])"/g, - '$1' - ) - replacedString = escapeHtmlQuotes(res.rows[i].classworkevallist) - var evalarray - try { - evalarray = JSON.parse('[' + res.rows[i].classworkevallist + ']') - } catch { - evalarray = JSON.parse('[' + replacedString + ']') + for (var e = 0; e < evalarray.length; e++) { + if (res.rows[i].worktype == '常规作业') { + evalarray[e].feedcontent = escapeHtmlQuotes(evalarray[e].feedcontent).replace( + /"(\[.*\])"/g, + '$1' + ) + evalarray[e].feedcontent = escapeHtmlQuotes(evalarray[e].feedcontent) } - - for (var e = 0; e < evalarray.length; e++) { - if (res.rows[i].worktype == '常规作业') { - evalarray[e].feedcontent = escapeHtmlQuotes(evalarray[e].feedcontent).replace( - /"(\[.*\])"/g, - '$1' - ) - evalarray[e].feedcontent = escapeHtmlQuotes(evalarray[e].feedcontent) - } - if (evalarray[e].feedcontent == evalarray[e].rightanswer) { - // 正确,得分 - classWorkList.value[t].rightAnswerCount++ - } + if (evalarray[e].feedcontent == evalarray[e].rightanswer) { + // 正确,得分 + classWorkList.value[t].rightAnswerCount++ } } } - // 当前这个学习任务,共推送给了几个学生,workdatacount - if (res.rows[i].classworkid == classWorkList.value[t].id) { - classWorkList.value[t].workdatalist.push(res.rows[i]) - } } - // 计算完成进度 workdatacount人数要大于0 - if ( - classWorkList.value[t].workdataresultcount > 0 && - classWorkList.value[t].workdatacount > 0 - ) { - classWorkList.value[t].finishpercent = parseInt( - (classWorkList.value[t].workdataresultcount / classWorkList.value[t].workdatacount) * 100 - ) - } else { - classWorkList.value[t].finishpercent = 0 + // 当前这个学习任务,共推送给了几个学生,workdataresultsum + if (res.rows[i].classworkid == classWorkList.value[t].id) { + classWorkList.value[t].workdatalist.push(res.rows[i]) } - - // 以下四个参数,都要计算 - // 2024-04-12,酉阳,by jackyshen - - // 计算参与学习任务的平均用时 - if (classWorkList.value[t].workdatafeedbackcount > 0) { - classWorkList.value[t].averagetime = Math.ceil(classWorkList.value[t].feedtimelength / classWorkList.value[t].workdatafeedbackcount / 60).toFixed(0) - } else { - classWorkList.value[t].averagetime = 0 - } - - // 计算批阅异常,需要获取每个题目的类型,找出主观题 - // 暂缓 - - // 计算平均得分率: 正确题数/(题目总数*学生人数)*100 - if ( - classWorkList.value[t].entpcourseworklistarray && - classWorkList.value[t].entpcourseworklistarray.length > 0 - ) { - var dd = - (classWorkList.value[t].rightAnswerCount / - (classWorkList.value[t].entpcourseworklistarray.length * - classWorkList.value[t].workdatacount)) * - 100 - classWorkList.value[t].scoingRate = dd.toFixed(0) + '%' - } else { - classWorkList.value[t].scoingRate = '0%' - } - // 设定典型作答,需要获取每个题目的类型,找出主观题 - // 暂缓 } - }) - } + + + // 计算完成进度: workdataresultcount 学生提交了的个数; workdataresultsum 人数要大于0; + if (classWorkList.value[t].workdataresultcount > 0 && classWorkList.value[t].workdataresultsum > 0 ) { + classWorkList.value[t].finishpercent = parseInt( + (classWorkList.value[t].workdataresultcount / classWorkList.value[t].workdataresultsum) * 100 + ) + } else { + classWorkList.value[t].finishpercent = 0 + } + + /** 计算 已批阅进度 */ + // workdataresultsum 人数 teacherrationgcount 已批阅人数 + // 已批阅百分比: (人数-已批阅数) / 人数 * 100 + if (classWorkList.value[t].workdataresultsum > 0) { + classWorkList.value[t].teacherCorrectionProgress = parseInt( + ((classWorkList.value[t].teacherrationgcount) / classWorkList.value[t].workdataresultsum) * 100 + ) + } else { + classWorkList.value[t].teacherCorrectionProgress = 0 + } + + // 以下四个参数,都要计算 + // 2024-04-12,酉阳,by jackyshen + + // 计算参与学习任务的平均用时:学生总用时/ 提交学生数 + if (classWorkList.value[t].workdataresultcount > 0) { + classWorkList.value[t].averagetime = Math.ceil(classWorkList.value[t].feedtimelength / classWorkList.value[t].workdataresultcount / 60).toFixed(0) + } else { + classWorkList.value[t].averagetime = 0 + } + + // 计算平均得分率: 正确题数/(题目总数*学生人数)*100 + if ( + classWorkList.value[t].entpcourseworklistarray && + classWorkList.value[t].entpcourseworklistarray.length > 0 + ) { + var dd = + (classWorkList.value[t].rightAnswerCount / + (classWorkList.value[t].entpcourseworklistarray.length * + classWorkList.value[t].workdataresultsum)) * + 100 + classWorkList.value[t].scoingRate = dd.toFixed(0) + '%' + } else { + classWorkList.value[t].scoingRate = '0%' + } + } + }) + } @@ -379,6 +340,7 @@ const getStudentClassWorkDataPolling = () => { getStudentVisible() // 在轮询 pollingST.value = setInterval(() => { + console.log('轮询查询学生作业进度') getStudentVisible() }, 1000 * 10) } @@ -413,75 +375,56 @@ onUnmounted(() => { // [作业反馈] - 实际查询逻辑 const getStudentVisible = async () => { - if (classTaskStore.classListIds.length <= 0) { - return + if(!classWorkList.value.length>0){ + return; } - // 班级作业数据,多个班级 const response = await listByDeadDate({ - classidarray: classTaskStore.classListIds.join(','), edituserid: userStore.userId, // 老师的id - edustage: userStore.edustage,// 学段 + edustage: userStore.edustage, // 学段 edusubject: userStore.edusubject,//学科 - // deaddate: tabActive.value === '进行中'? getTomorrow() : EndDate.value,// 进行中:明天,已结束:选择的日期 - deaddate: EndDate.value,// 进行中:明天,已结束:选择的日期 - status: '1', // 作业状态:1-已发布 - // orderby: 'concat(deaddate,uniquekey) DESC', + startdate: tabActive.value === '待批改'? '' : getDateFormatDate(startEndDate.value[0]), + deaddate: tabActive.value === '待批改'? '' : getDateFormatDate(startEndDate.value[1]),// 待批改:明天,已批改:选择的日期 + status: tabActive.value === '待批改'? '1' : '2', // 作业状态:1-已发布 orderby: 'deaddate DESC', - pageSize: 100 + pageSize: 100, }) - /** - * 2024-10-17 由于 后面截止时间加了 时分,特加判断 - * 1、进行中、以前是以明天判断。现改为传当天的日期,并根据当前日期的时分与截止日期进行判断, - * 2、已结束、以前默认是以明天判断。现依然以明天为判断,并根据当前日期时分大于截止日期时分判断。 - */ - let list = []; - if(tabActive.value === '进行中'){ - // 进行中 当前日期时间 小于 截止 日期时间 - list = response.rows&&response.rows.filter(item => item.deaddate && getCurrentTime('YYYY-MM-DD HH:mm') < item.deaddate); // 进行中 - }else{ - list = response.rows&&response.rows.filter(item => item.deaddate && getCurrentTime('YYYY-MM-DD HH:mm') > item.deaddate); // 已结束 - } + let list = response.rows || []; - const curWorkList = list - - /** - * warn: 这里仅更新了finishpercent(进度条), 且当前作业布置推送新任务时, curWorkList中会查到新的任务与当前页面中this.classWorkList长度不一致, - * 故这里需循环this.classWorkList且只更新当前页面中的存在的任务进度 - */ - for (let t = 0; t < classWorkList.value.length; t++) { - // 当前时间超过[作业任务]截止时间的跳过 - // if( getDateTime > classWorkList.value[t].deaddate ){ - // continue; - // } - // 确保当前拿到的任务与页面中存在的任务能一对一(避免因删除其他操作而删除作业任务导致两个数组的index不统一而越界) - let curWork = curWorkList.find((work) => work.id === classWorkList.value[t].id) - // workdataresultcount 完成人数 workdatacount人数要大于0 - if (curWork && curWork.workdataresultcount > 0 && classWorkList.value[t].workdatacount > 0) { - classWorkList.value[t].workdataresultcount = curWork.workdataresultcount - // 桌面端貌似不需要进度条了? - classWorkList.value[t].finishpercent = parseInt( - (classWorkList.value[t].workdataresultcount / classWorkList.value[t].workdatacount) * 100 - ) - // 计算参与学习任务的平均用时 - if (classWorkList.value[t].workdatafeedbackcount > 0) { - classWorkList.value[t].averagetime = Math.ceil(classWorkList.value[t].feedtimelength / classWorkList.value[t].workdatafeedbackcount / 60).toFixed(0) - } else { - classWorkList.value[t].averagetime = 0 + let newList = []; + for(let i = 0; i < classWorkList.value.length; i++){ + // 父list的id与子list的id相等,在进行对比;若是不等? 有可能是老师批阅完了这个list数据,变成了已批改状态中,则父list数据需要删除 + const isList = list.filter((item) => item.id === classWorkList.value[i].id); + if(isList.length === 0){ + // 父list的id与子list的id不相等,则删除父list数据 + classWorkList.value.splice(i,1); + } + for(let j = 0; j < list.length; j++){ + // workdataresultcount 学生提交了的个数; + if(classWorkList.value[i].id === list[j].id && classWorkList.value[i].workdataresultcount != list[j].workdataresultcount){ + // 学生提交数 != 学生提交数? + newList.push(list[j]); } - // 更新批阅数 - classWorkList.value[t].teacherrationgcount = curWork.teacherrationgcount - } else { - // 学生未完成,但是老师批改了? - if(curWork && curWork.workdataresultcount == 0){ - // 更新批改数 - classWorkList.value[t].teacherrationgcount = curWork.teacherrationgcount + // teacherrationgcount 已批阅人数 + if(classWorkList.value[i].id === list[j].id && classWorkList.value[i].teacherrationgcount != list[j].teacherrationgcount){ + // 更新批阅进度条 + if (classWorkList.value[i].workdataresultsum > 0) { + // 更新批阅数、 进度条 + classWorkList.value[i].teacherrationgcount = list[j].teacherrationgcount; + classWorkList.value[i].teacherCorrectionProgress = parseInt( + ((list[j].teacherrationgcount) / list[j].workdataresultsum) * 100 + ) + } else { + classWorkList.value[i].teacherCorrectionProgress = 0 + } } - classWorkList.value[t].finishpercent = 0 } } - - return 1 + if(newList.length>0){ + // 更新学生提交后的数据? 作业进度条、平均用时、得分率 + const list = newList&&newList.filter((item) => item.workdataresultcount > 0) ; + getStudentClassWorkData(list,false); + } } @@ -489,16 +432,27 @@ const getStudentVisible = async () => { watch( () => [dataList, toolState.isTaskWin], () => { - console.log('=监听到批改窗口打开了===', toolState.isTaskWin) + console.log('监听--批改窗口是否打开===', toolState.isTaskWin) if(!toolState.isTaskWin){ - - closeDialog();// 开启轮询 + if(tabActive.value === '待批改'){ + closeDialog();// 开启轮询 + } } } ) + watch(tabActive, (newVal,oldVal)=>{ console.log('newVal',newVal); getData() // 加载数据 + if(newVal === '待批改'){ + // 轮询查询 + console.log('监听---开启轮询') + closeDialog(); + }else{ + // 关闭轮询 + console.log('监听---关闭轮询') + clearInterval(pollingST.value); + } }) diff --git a/src/renderer/src/views/classTask/container/classTask/task-item.vue b/src/renderer/src/views/classTask/container/classTask/task-item.vue index 50fbf48..484a703 100644 --- a/src/renderer/src/views/classTask/container/classTask/task-item.vue +++ b/src/renderer/src/views/classTask/container/classTask/task-item.vue @@ -14,31 +14,40 @@  |  截止时间:{{ item.deaddate }}  | {{ tabactive }}
+ +
+ + + 已交( + + {{ item.workdataresultcount }} + {{ item.workdataresultcount }} + /{{ item.workdataresultsum }} + + ) + +
+ +
+ + + 已批阅({{ item.teacherrationgcount}}) + +
+ + +
+ {{ item.workdataresultsum }} + 练习次数 +
+ +
+ {{ item.teacherrationgcount?item.workdataresultsum - item.teacherrationgcount:item.workdataresultsum }} + 引用次数 +
+
- {{ item.workdataresultcount }} - {{ item.workdataresultcount }} - /{{ item.workdatacount }} - 已交 -
-
- - {{ item.teacherrationgcount?item.workdatacount - item.teacherrationgcount:item.workdatacount }} - 待批阅 -
-
- - - {{ item.averagetime }}分钟 平均用时 @@ -97,6 +106,11 @@ const props = defineProps({ } } } + .class-reserv-item-progress { + width: 200px; + padding: 0 10px; + font-size: 14px; + } .class-reserv-item-tool { margin-left: 10px; display: flex; diff --git a/src/renderer/src/views/desktop/container/work-trend.vue b/src/renderer/src/views/desktop/container/work-trend.vue index ab5f540..32f3f7e 100644 --- a/src/renderer/src/views/desktop/container/work-trend.vue +++ b/src/renderer/src/views/desktop/container/work-trend.vue @@ -14,9 +14,10 @@
{{ item.uniquekey }} - {{ - getCurrentTime('YYYY-MM-DD HH:mm') > item.deaddate ? '已结束' : '进行中' }} - {{ item.worktype }} + + 待批改 + {{ item.worktype }}
{{ item.classcaption }} | 截止时间:{{ item.deaddate }}
@@ -52,9 +53,10 @@ const getHomework = async () => { const { edustage, edusubject } = user try { const { rows } = await homeworklist({ edituserid: user.userId, edustage, edusubject, deaddate: getTomorrow(), status: '1', orderby: 'deaddate DESC', pageSize: 500 }) - // 只展示进行中的 - homeworkList.value = rows.filter(item => item.deaddate && item.uniquekey && getCurrentTime('YYYY-MM-DD HH:mm') < item.deaddate) // 当前日期的时分与截止日期进行判断 - // homeworkList.value = rows.filter(item => item.deaddate && item.uniquekey && getTomorrow() <= item.deaddate) //大于今天的才算进行中 弃用 + // 只展示待批改的 + //homeworkList.value = rows.filter(item => item.deaddate && item.uniquekey && getCurrentTime('YYYY-MM-DD HH:mm') < item.deaddate) // 当前日期的时分与截止日期进行判断 + // homeworkList.value = rows.filter(item => item.deaddate && item.uniquekey && getTomorrow() <= item.deaddate) //大于今天的才算待批改 弃用 + homeworkList.value = rows || []; homeworkList.value.forEach((item) => { // 处理任务类型的UI if (item.worktype == '学习目标定位') { @@ -102,7 +104,8 @@ const onClickItem = (item) => { } const tagType = (time) => { - return getCurrentTime('YYYY-MM-DD HH:mm') > time ? 'info' : 'warning' + return 'warning'; + // return getCurrentTime('YYYY-MM-DD HH:mm') > time ? 'info' : 'warning' } diff --git a/src/renderer/src/views/tool/createHomework.js b/src/renderer/src/views/tool/createHomework.js index 5f3cc75..5d64850 100644 --- a/src/renderer/src/views/tool/createHomework.js +++ b/src/renderer/src/views/tool/createHomework.js @@ -62,8 +62,8 @@ export const getClassWorkList = async (id) => { /** * 2024-10-17 由于 后面截止时间加了 时分,特加判断 - * 1、进行中、以前是以明天判断。现改为传当天的日期,并根据当前日期的时分与截止日期进行判断, - * 2、已结束、以前默认是以明天判断。现依然以明天为判断,并根据当前日期时分大于截止日期时分判断。 + * 1、待批改、以前是以明天判断。现改为传当天的日期,并根据当前日期的时分与截止日期进行判断, + * 2、已批改、以前默认是以明天判断。现依然以明天为判断,并根据当前日期时分大于截止日期时分判断。 */ let list = response.rows