作业布置
This commit is contained in:
parent
a33ff1abea
commit
2a95f08bb2
|
@ -47,7 +47,7 @@
|
||||||
"electron-store": "8.0.0",
|
"electron-store": "8.0.0",
|
||||||
"electron-updater": "^6.1.7",
|
"electron-updater": "^6.1.7",
|
||||||
"element-china-area-data": "^6.1.0",
|
"element-china-area-data": "^6.1.0",
|
||||||
"element-plus": "^2.7.6",
|
"element-plus": "^2.8.0",
|
||||||
"fabric": "^5.3.0",
|
"fabric": "^5.3.0",
|
||||||
"im_electron_sdk": "^8.0.5904",
|
"im_electron_sdk": "^8.0.5904",
|
||||||
"js-cookie": "^3.0.5",
|
"js-cookie": "^3.0.5",
|
||||||
|
|
|
@ -70,9 +70,9 @@ export const constantRoutes = [
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/classTaskAssign',
|
path: '/classTaskAssign',
|
||||||
component: () => import('@/views/classTaskAssign/index.vue'),
|
component: () => import('@/views/classTask/classTaskAssign.vue'),
|
||||||
name: 'classTaskAssign',
|
name: 'classTaskAssign',
|
||||||
meta: {title: '作业设计'},
|
meta: {title: '作业布置'},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/classTask',
|
path: '/classTask',
|
||||||
|
|
|
@ -302,7 +302,7 @@
|
||||||
addClasses({classIds:classids.value.join(','),userId:userStore.userId}).then(res => {
|
addClasses({classIds:classids.value.join(','),userId:userStore.userId}).then(res => {
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
ElMessage({x
|
ElMessage({
|
||||||
message: res.msg,
|
message: res.msg,
|
||||||
type: 'success',
|
type: 'success',
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,527 @@
|
||||||
|
<template>
|
||||||
|
<div class="page-classTaskAssign flex">
|
||||||
|
<el-menu
|
||||||
|
default-active="1"
|
||||||
|
class="el-menu-vertical-demo"
|
||||||
|
:collapse="isCollapse"
|
||||||
|
>
|
||||||
|
<!--左侧 教材 目录-->
|
||||||
|
<div v-if="!isCollapse" style="height: 100%;overflow: hidden;">
|
||||||
|
<ChooseTextbook @change-book="getData" @node-click="getData" />
|
||||||
|
</div>
|
||||||
|
</el-menu>
|
||||||
|
|
||||||
|
<div class="page-right" :style="{'margin-left': isCollapse ? '0' : '20px'}">
|
||||||
|
<!-- 标题 -->
|
||||||
|
<el-row style="align-items: center; margin-bottom: 0px; flex: 0 0 auto">
|
||||||
|
<el-col :span="12" style="padding-left: 20px; text-align: left;">
|
||||||
|
<div class="unit-top-left" @click="isCollapse = !isCollapse">
|
||||||
|
<i v-if="!isCollapse" class="iconfont icon-xiangzuo"></i>
|
||||||
|
<span>课程目录</span>
|
||||||
|
<i v-if="isCollapse" class="iconfont icon-xiangyou"></i>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<div class="classtype-right">
|
||||||
|
<!-- <el-button type="primary" icon="Postcard" @click="handleNewClassWorkDialog" style="margin-left: 20px; margin-top: 10px">{{initDataProps.queryType!=='single'?'设计新作业':'设计新活动'}}</el-button>
|
||||||
|
<el-button v-if="initDataProps.queryType!=='single'" type="success" icon="Promotion" @click="handleTaskAssignToAllClass()" style="margin-left: 20px; margin-top: 10px">一键推送</el-button>
|
||||||
|
<el-button type="danger" icon="delete" @click="handleDelete" style="margin-left: 20px; margin-top: 10px">删除</el-button> -->
|
||||||
|
<el-button type="primary" @click="handleNewClassWorkDialog" style="margin-left: 20px; margin-top: 10px">设计新作业</el-button>
|
||||||
|
<el-button type="success" @click="handleTaskAssignToAllClass()" style="margin-left: 20px; margin-top: 10px">一键推送</el-button>
|
||||||
|
<el-button type="danger" @click="handleDelete" style="margin-left: 20px; margin-top: 10px">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<!-- 作业类型:内容 -->
|
||||||
|
<div style="flex: 1;overflow: hidden;">
|
||||||
|
<el-table
|
||||||
|
ref="taskTable"
|
||||||
|
:data="taskList"
|
||||||
|
:tree-props="{checkStrictly: true}"
|
||||||
|
row-key="id"
|
||||||
|
style="width: 100%;height: 100%; border: 1px solid #dcdfe6;border-radius: 3px;flex:1"
|
||||||
|
:row-class-name="tableRowClassName"
|
||||||
|
>
|
||||||
|
<el-table-column type="selection" min-width="10%" align="center" :selectable="selectable"/>
|
||||||
|
<el-table-column :label="props.initDataProps.queryType!=='single'?'作业名称':'活动名称'" prop="uniquekey" min-width="18%" align="center">
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column :label="props.initDataProps.queryType!=='single'?'作业类型':'活动类型'" align="center" prop="worktype" min-width="20%" sortable>
|
||||||
|
<template #default="scope">
|
||||||
|
<el-tag :type="scope.row.workclass" size="large">{{ scope.row.worktype }}</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column v-if="props.initDataProps.queryType!=='single'" label="作业内容" align="center" min-width="20%">
|
||||||
|
<template #default="scope">
|
||||||
|
<div style="border: 1px solid #ccc; width: 100%; height: auto; display: flex; justify-content: space-between; padding-left: 10px">
|
||||||
|
<div style="display: flex; margin-top: 5px">
|
||||||
|
<el-tag v-if="scope.row.entpcourseworklistarray.length>0" effect="dark" type="warning" size="small" style="margin-left: 5px" round>{{ scope.row.entpcourseworklistarray.length }}</el-tag>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div v-if="scope.row.status == '10'">
|
||||||
|
<el-button v-hasPermi="['teaching:classwork:edit']" text @click="newHandleWorkEdit2ClassWorkQuizAdd(scope.row, scope.$index)">编辑</el-button>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<el-button v-hasPermi="['teaching:classwork:edit']" text @click="handleWorkEdit(scope.row, scope.$index)">查看详情</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column v-if="props.initDataProps.queryType!=='single'" label="作业说明" align="center" min-width="36%">
|
||||||
|
<template #default="scope">
|
||||||
|
<div style="border: 1px solid #ccc; width: 100%; height: auto; display: flex; justify-content: space-between; padding-left: 10px">
|
||||||
|
<div style="display: flex; margin-top: 5px">
|
||||||
|
<div v-html="scope.row.title" style="max-width: 200px" class="singe-line"></div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div v-if="scope.row.status == '10'">
|
||||||
|
<el-button text @click="handleWorkTitleEdit(scope.row, scope.$index)" v-hasPermi="['teaching:classwork:edit']">编辑</el-button>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<el-button text @click="handleWorkTitleEdit(scope.row, scope.$index)" v-hasPermi="['teaching:classwork:edit']">查看详情</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column v-if="props.initDataProps.queryType!=='single'" label="创建时间" align="center" prop="timestamp" min-width="30%" sortable>
|
||||||
|
<template #default="scope">
|
||||||
|
<el-tag size="large">{{ scope.row.timestamp }}</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column v-if="props.initDataProps.queryType!=='single'" label="推送配置" align="left" min-width="16%">
|
||||||
|
<template #default="scope">
|
||||||
|
<div style="display: flex">
|
||||||
|
<el-button link icon="Setting" @click="scope.row.status == '10' ? openClassWorkConfigDialog(scope.row, -1,'item') : ''" :style="formatStyle(scope.row)" v-hasPermi="['teaching:classwork:edit']">{{scope.row.status == '10'? '推送' : '已推送'}}</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 作业内容编辑 -->
|
||||||
|
<el-dialog v-model="workEdit" title="作业内容详情" width="90%" append-to-body>
|
||||||
|
<div v-if="currentTag=='学习目标定位'" style="display: flex;">
|
||||||
|
<degreeevolution :attainmentList="attainmentList" :show-class="true" :courseQualityList="courseQualityList"/>
|
||||||
|
</div>
|
||||||
|
<!-- 课标研读 目标设定 教材研读 框架梳理 学科定位 -->
|
||||||
|
|
||||||
|
<div v-if="currentTag=='习题训练'" :style="{'padding': '15px', 'overflow': 'auto'}">
|
||||||
|
<el-table :data="workConfObj.quizlist" style="width: 100%;">
|
||||||
|
<el-table-column type="index" width="60" />
|
||||||
|
<el-table-column label="题目内容" align="left" >
|
||||||
|
<template #default="scope">
|
||||||
|
<div>
|
||||||
|
<div v-html="scope.row.titleFormat" style="overflow: hidden; text-overflow: ellipsis; font-weight:700"></div>
|
||||||
|
<div v-html="scope.row.workdescFormat" style="overflow: hidden; text-overflow: ellipsis; margin-top: 6px;"></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="分值" align="center" width="180">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-input-number v-model="scope.row.score" :min="1" :max="100" :disabled="taskParams.viewkey=='作业反馈'||checkTaskAssigned(currentTask)"></el-input-number >
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="操作" align="center" width="100">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button @click="handleWorkConfigQuizMinus(scope.$index)" :disabled="taskParams.viewkey=='作业反馈'||checkTaskAssigned(currentTask)">删除</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div slot="footer" class="dialog-footer" style="text-align: right; margin-top: 20px;">
|
||||||
|
<div style="display: flex">
|
||||||
|
<el-button v-if="currentTag=='习题训练'" style="margin-right: auto" type="primary"
|
||||||
|
@click="handleWorkEdit2ClassWorkQuizAdd" :disabled="taskParams.viewkey=='作业反馈'||checkTaskAssigned(currentTask)">添加作业</el-button>
|
||||||
|
<el-button type="primary" style="margin-left: auto" @click="submitStudy('submit')"
|
||||||
|
:disabled="taskParams.viewkey=='作业反馈'||checkTaskAssigned(currentTask)">确 定</el-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- 作业说明编辑 -->
|
||||||
|
<el-dialog v-model="currentWorkEdit.workTitleEdit" title="作业说明编辑" width="70%" append-to-body>
|
||||||
|
<el-input v-model="currentTitle" type="textarea" rows="5" placeholder="请输入作业说明" :disabled="taskParams.viewkey=='作业反馈'||checkTaskAssigned(currentTask)"/>
|
||||||
|
<div slot="footer" class="dialog-footer" style="text-align: right; margin-top: 20px;">
|
||||||
|
<el-button type="primary" @click="submitWorkTitle('submit')"
|
||||||
|
:disabled="taskParams.viewkey=='作业反馈'||checkTaskAssigned(currentTask)">确 定</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { onMounted, ref, toRaw,watch, reactive } from 'vue'
|
||||||
|
import ChooseTextbook from '@/components/choose-textbook/index.vue'
|
||||||
|
import { homeworklist, listEntpcoursework, listClassworkeval } from '@/api/teaching/classwork'
|
||||||
|
|
||||||
|
import { useGetHomework } from '@/hooks/useGetHomework'
|
||||||
|
import { processList } from '@/hooks/useProcessList'
|
||||||
|
|
||||||
|
import { getCurrentTime } from '@/utils/date'
|
||||||
|
import useUserStore from '@/store/modules/user'
|
||||||
|
const userStore = useUserStore().user
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
initDataProps: {
|
||||||
|
type: Object,
|
||||||
|
default: function () {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// ---------------------------------------------------
|
||||||
|
|
||||||
|
const isCollapse = ref(false)
|
||||||
|
|
||||||
|
|
||||||
|
const courseObj = reactive({
|
||||||
|
// 课程相关参数: 教材id,单元id,章节id,课程名称
|
||||||
|
textbookId: '',
|
||||||
|
levelFirstId: '',
|
||||||
|
levelSecondId: '',
|
||||||
|
coursetitle:'',
|
||||||
|
node: null, // 选择的课程节点
|
||||||
|
//
|
||||||
|
})
|
||||||
|
|
||||||
|
const taskList = ref([]);
|
||||||
|
const loading = ref(false);
|
||||||
|
|
||||||
|
// 作业编辑
|
||||||
|
const workEdit = ref(false);
|
||||||
|
const currentWorkEdit = reactive({
|
||||||
|
workTitleEdit: false,
|
||||||
|
currentTask: {},
|
||||||
|
currentTitle: '',
|
||||||
|
currentIndex: 0,
|
||||||
|
})// 当前作业编辑
|
||||||
|
const currentTag = ref('');// 当前作业类型
|
||||||
|
|
||||||
|
const workConfObj = reactive({
|
||||||
|
quizlist: [], // 习题list
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// 查询
|
||||||
|
const getData = (data) => {
|
||||||
|
const { textBook, node } = data
|
||||||
|
let textbookId = textBook.curBookId
|
||||||
|
let levelSecondId = node.id
|
||||||
|
let levelFirstId
|
||||||
|
if (node.parentNode) {
|
||||||
|
levelFirstId = node.parentNode.id
|
||||||
|
} else {
|
||||||
|
levelFirstId = node.id
|
||||||
|
levelSecondId = ''
|
||||||
|
}
|
||||||
|
|
||||||
|
courseObj.textbookId = textbookId // 版本
|
||||||
|
courseObj.levelFirstId = levelFirstId // 单元
|
||||||
|
courseObj.levelSecondId = levelSecondId // 章节
|
||||||
|
courseObj.coursetitle = node.itemtitle // (单元/章节) 名称
|
||||||
|
courseObj.node = node; // 保存当前节点
|
||||||
|
|
||||||
|
// 头部 教材分析打开外部链接需要当前章节ID
|
||||||
|
localStorage.setItem('unitId', JSON.stringify({ levelFirstId, levelSecondId}))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1.获取作业列表
|
||||||
|
*/
|
||||||
|
const getTaskList = async () => {
|
||||||
|
const { chapterId } = await useGetHomework(courseObj.node)
|
||||||
|
// this.entpcourseid = chapterId
|
||||||
|
// 新版查询方式
|
||||||
|
homeworklist({entpcourseid: chapterId, orderby: "concat(deaddate,uniquekey) DESC" , edituserid: userStore.userId, pageSize: 100}).then(res => {
|
||||||
|
let model = [];
|
||||||
|
let mission = [];
|
||||||
|
|
||||||
|
for (let item of res.rows){
|
||||||
|
item.taskconfig = [];
|
||||||
|
|
||||||
|
// 赋值默认值
|
||||||
|
if (item.timelength == null) {
|
||||||
|
item.timelength = 1;
|
||||||
|
}
|
||||||
|
if (item.weights == null) {
|
||||||
|
item.weights = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理任务类型的UI
|
||||||
|
if (item.worktype == '学习目标定位') {
|
||||||
|
item.workclass = 'success';
|
||||||
|
item.workcodesList = JSON.parse(item.workcodes);
|
||||||
|
} else if (item.worktype == '教材研读') {
|
||||||
|
item.workclass = 'primary';
|
||||||
|
} else if (item.worktype == '框架梳理') {
|
||||||
|
item.workclass = 'warning';
|
||||||
|
} else if (item.worktype == '学科定位') {
|
||||||
|
item.workclass = 'info';
|
||||||
|
} else if (item.worktype == '习题训练') {
|
||||||
|
item.workclass = 'danger';
|
||||||
|
} else {
|
||||||
|
item.workclass = 'primary';
|
||||||
|
}
|
||||||
|
// 如果是习题训练任务,则检查一共有多少道
|
||||||
|
if (item.entpcourseworklist != '') {
|
||||||
|
item.entpcourseworklistarray = JSON.parse('['+item.entpcourseworklist+']');
|
||||||
|
} else {
|
||||||
|
item.entpcourseworklistarray = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据状态,过滤之前的旧任务
|
||||||
|
if (item.status == '10') {
|
||||||
|
// 任务状态为模板, 直接添加
|
||||||
|
model.push(item);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (item.status == '1') {
|
||||||
|
// 任务状态为已推送的任务, 则格式化推送学生数据
|
||||||
|
let ss = [];
|
||||||
|
if (item.classworkdatastudentids != null) {
|
||||||
|
ss = JSON.parse('['+ item.classworkdatastudentids+']');
|
||||||
|
}
|
||||||
|
const js = {
|
||||||
|
id: item.id,
|
||||||
|
classid: item.classid,
|
||||||
|
classcaption: item.classcaption,
|
||||||
|
parentid: 0,
|
||||||
|
worktype: '',
|
||||||
|
workkey: item.workkey,
|
||||||
|
worktag: '',
|
||||||
|
entpcourseid: 0,
|
||||||
|
evalid: 0,
|
||||||
|
edusubject: '',
|
||||||
|
edudegree: '',
|
||||||
|
workdate: '',
|
||||||
|
title: '',
|
||||||
|
workcodes: '',
|
||||||
|
studentlist: ss,
|
||||||
|
deaddate: item.deaddate,
|
||||||
|
timelength: item.timelength,
|
||||||
|
weights: item.weights,
|
||||||
|
feedtype: item.feedtype
|
||||||
|
}
|
||||||
|
item.taskconfig.push(js);
|
||||||
|
mission.push(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 再根据父子关系重新排序
|
||||||
|
let list = [];
|
||||||
|
for (let item of model){
|
||||||
|
item.children = [];
|
||||||
|
for (let child of mission) {
|
||||||
|
if (item.id == child.parentid) {
|
||||||
|
item.children.push(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
list.push(item);
|
||||||
|
}
|
||||||
|
console.log(list,'========================')
|
||||||
|
taskList.value = list;
|
||||||
|
loading.value = false;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 【编辑/查看】作业说明
|
||||||
|
const handleWorkTitleEdit = (row, index) => {
|
||||||
|
currentWorkEdit.workTitleEdit = true;
|
||||||
|
currentWorkEdit.currentTask = row;
|
||||||
|
currentWorkEdit.currentTitle = row.title;
|
||||||
|
currentWorkEdit.currentIndex = index;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// 编辑作业内容
|
||||||
|
const handleWorkEdit = (row, index) =>{
|
||||||
|
workEdit.value = true
|
||||||
|
// this.currentTask = row;
|
||||||
|
// this.currentIndex = index;
|
||||||
|
currentTag.value = row.worktype;
|
||||||
|
this.attainmentList = row.workcodesList?.attlist;
|
||||||
|
this.courseQualityList = row.workcodesList?.qualist;
|
||||||
|
if (row.worktype == '框架梳理') {
|
||||||
|
this.$nextTick(()=>{
|
||||||
|
this.getFlowData()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// if (currentTag.value.worktype == '学科定位') {
|
||||||
|
// // TODO 后续需要再迁
|
||||||
|
// rootid:entpcoursework里的id rootid: row.entpcourseworklistarray[0].id,
|
||||||
|
// listEvaluationclue({ cluegroup: 'graph', edusubject: this.courseObj.edusubject, pageSize: 1000 }).then((res) => {
|
||||||
|
// var glist = [];
|
||||||
|
// for (var i = 0; i < res.rows.length; i++) {
|
||||||
|
// glist.push(res.rows[i]);
|
||||||
|
// }
|
||||||
|
// this.isEditable = false;
|
||||||
|
// this.preKnowList = glist;
|
||||||
|
// this.$refs.jsMind.updateFromParent(this.preKnowList, this.courseObj.edusubject);
|
||||||
|
// this.$refs.jsMind.initJsMindMap();
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // 课标研读 目标设定 教材研读 框架梳理 学科定位
|
||||||
|
if (currentTag.value.worktype == '习题训练') {
|
||||||
|
var idlist = JSON.parse('['+row.entpcourseworklist+']');
|
||||||
|
var ids = [];
|
||||||
|
for (var i=0; i<idlist.length; i++) {
|
||||||
|
ids.push(idlist[i].id);
|
||||||
|
}
|
||||||
|
|
||||||
|
listEntpcoursework({ids: ids.join(","), pageSize: 50}).then(idres => {
|
||||||
|
for (var i=0; i<idlist.length; i++) {
|
||||||
|
for (var j=0; j<idres.rows.length; j++) {
|
||||||
|
if (idres.rows[j].id == idlist[i].id) {
|
||||||
|
idres.rows[j].classworkevalid = idlist[i].classworkevalid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
workConfObj.quizlist = idres.rows;
|
||||||
|
|
||||||
|
// 获取当前题目的分值
|
||||||
|
listClassworkeval({workid: row.id, workdataid: 0, pageSize: 50}).then(idres => {
|
||||||
|
idres.rows.forEach(item => {
|
||||||
|
const quizItem = workConfObj.quizlist.find(quiz => quiz.id === item.entpcourseworkid);
|
||||||
|
if (quizItem) {
|
||||||
|
quizItem.score = item.score;
|
||||||
|
quizItem.scoreOrigin = item.score;
|
||||||
|
quizItem.evalid = item.id;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 格式化试题信息
|
||||||
|
processList(workConfObj.quizlist);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 常规作业、课堂展示
|
||||||
|
if(currentTag.value.worktype == '常规作业' || row.worktype == '课堂展示'){
|
||||||
|
console.log(row,'常规作业-课堂展示');
|
||||||
|
// 老师布置的附件 workcodes ?? 与批改哪里这个字段值不一样
|
||||||
|
if(row.workcodes != ''){
|
||||||
|
const teachWorkFileList = JSON.parse(row.workcodes);
|
||||||
|
teachWorkFileList&&teachWorkFileList.forEach(item => {
|
||||||
|
if(item.name.indexOf('jpg') > -1 || item.name.indexOf('jpeg') > -1 || item.name.indexOf('png') > -1){
|
||||||
|
this.teachImageList.push(item);
|
||||||
|
}else{
|
||||||
|
this.teachFileList.push(item);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.teacherFeedContentList.push(teachWorkFileList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表格子项背景暗调
|
||||||
|
*/
|
||||||
|
const tableRowClassName=({row,rowIndex})=>{
|
||||||
|
if (row.status == '10') {
|
||||||
|
//父模版
|
||||||
|
return 'father-row'
|
||||||
|
} else {
|
||||||
|
// 子项
|
||||||
|
return 'son-row'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const selectable=(row, index)=>{
|
||||||
|
return row.status == '10';
|
||||||
|
};
|
||||||
|
|
||||||
|
//格式化配置的样式
|
||||||
|
const formatStyle = (row) =>{
|
||||||
|
//没有taskconfig,就是灰色
|
||||||
|
//所有的taskconfig的id都不是0,绿色
|
||||||
|
//只要有一个taskconfig的id是0,就是红色
|
||||||
|
if (!row.taskconfig|| row.taskconfig.length === 0) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
for (var i=0; i<row.taskconfig.length; i++) {
|
||||||
|
if (row.taskconfig[i].id == 0) {
|
||||||
|
return {backgroundColor: '#fde2e2',color: '#f56c6c'};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {backgroundColor: '#e1f3d8',color: '#67c23a'};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
})
|
||||||
|
|
||||||
|
watch(() => courseObj.node, (newVal) => {
|
||||||
|
console.log(courseObj,'课程选择')
|
||||||
|
// 习题资源
|
||||||
|
getTaskList();
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.el-table .hidden-row {
|
||||||
|
display: none !important;
|
||||||
|
/* color: #ccc !important; */
|
||||||
|
}
|
||||||
|
.el-table .father-row {
|
||||||
|
--el-table-tr-bg-color: #fff;
|
||||||
|
}
|
||||||
|
.el-table .son-row {
|
||||||
|
--el-table-tr-bg-color: #f0f0f08a;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.page-classTaskAssign {
|
||||||
|
padding-top: 10px;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.el-menu--collapse {
|
||||||
|
width: 0px;
|
||||||
|
min-height: 100%;
|
||||||
|
}
|
||||||
|
.el-menu-vertical-demo:not(.el-menu--collapse) {
|
||||||
|
width: 300px;
|
||||||
|
min-height: 100%;
|
||||||
|
}
|
||||||
|
.unit-top-left {
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
.icon-xiangzuo {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.classtype-right{
|
||||||
|
padding: 5px;
|
||||||
|
margin-bottom: 0px !important;
|
||||||
|
}
|
||||||
|
.el-form-item--default{
|
||||||
|
margin-bottom: 0px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-right {
|
||||||
|
min-width: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex: 1;
|
||||||
|
margin-left: 20px;
|
||||||
|
height: 100%;
|
||||||
|
background: #ffffff;
|
||||||
|
border-radius: 10px;
|
||||||
|
box-shadow: 0px 0px 20px 0px rgba(99, 99, 99, 0.06);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -17,7 +17,7 @@
|
||||||
<el-col :span="12" style="padding-left: 20px; text-align: left;">
|
<el-col :span="12" style="padding-left: 20px; text-align: left;">
|
||||||
<div class="unit-top-left" @click="isCollapse = !isCollapse">
|
<div class="unit-top-left" @click="isCollapse = !isCollapse">
|
||||||
<i v-if="!isCollapse" class="iconfont icon-xiangzuo"></i>
|
<i v-if="!isCollapse" class="iconfont icon-xiangzuo"></i>
|
||||||
<span>作业范围</span>
|
<span>课程目录</span>
|
||||||
<i v-if="isCollapse" class="iconfont icon-xiangyou"></i>
|
<i v-if="isCollapse" class="iconfont icon-xiangyou"></i>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
@ -37,26 +37,12 @@
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref, toRaw,watch, reactive } from 'vue'
|
import { onMounted, ref, toRaw,watch, reactive } from 'vue'
|
||||||
// import useResoureStore from './store'
|
|
||||||
import ChooseTextbook from '@/components/choose-textbook/index.vue'
|
import ChooseTextbook from '@/components/choose-textbook/index.vue'
|
||||||
import Third from '@/components/choose-textbook/third.vue'
|
|
||||||
// import ResoureSearch from './container/resoure-search.vue'
|
|
||||||
// import ResoureList from './container/resoure-list.vue'
|
|
||||||
// import ThirdList from './container/third-list.vue'
|
|
||||||
import TaskTypeView from '@/views/classTask/container/newTask/taskTypeView.vue'
|
import TaskTypeView from '@/views/classTask/container/newTask/taskTypeView.vue'
|
||||||
import uploadDialog from '@/components/upload-dialog/index.vue'
|
|
||||||
// import { createWindow } from '@/utils/tool'
|
|
||||||
import { useToolState } from '@/store/modules/tool'
|
|
||||||
import { getCurrentTime } from '@/utils/date'
|
import { getCurrentTime } from '@/utils/date'
|
||||||
import useUserStore from '@/store/modules/user'
|
import useUserStore from '@/store/modules/user'
|
||||||
const userStore = useUserStore().user
|
const userStore = useUserStore().user
|
||||||
|
|
||||||
// const sourceStore = useResoureStore()
|
|
||||||
const isDialogOpen = ref(false)
|
|
||||||
const toolStore = useToolState()
|
|
||||||
const openDialog = () => {
|
|
||||||
isDialogOpen.value = true
|
|
||||||
}
|
|
||||||
// ---------------------------------------------------
|
// ---------------------------------------------------
|
||||||
const classWorkForm = reactive({
|
const classWorkForm = reactive({
|
||||||
// uniquekey: userStore.edusubject+'-' + getCurrentTime('MMDD')+'-'+(this.taskList.length+1),
|
// uniquekey: userStore.edusubject+'-' + getCurrentTime('MMDD')+'-'+(this.taskList.length+1),
|
||||||
|
|
|
@ -1,242 +0,0 @@
|
||||||
<template>
|
|
||||||
<div v-loading="isLoading" class="page-resource flex">
|
|
||||||
<!--左侧 教材 目录-->
|
|
||||||
<ChooseTextbook @change-book="getData" @node-click="getData" />
|
|
||||||
<!--右侧 作业设计/布置 列表 -->
|
|
||||||
<div class="page-right">
|
|
||||||
<div class="prepare-body-header">
|
|
||||||
<el-button @click="handleOutLink('design')">作业设计</el-button>
|
|
||||||
<el-button @click="handleOutLink('assign')">作业布置</el-button>
|
|
||||||
<label style="font-size: 15px; margin-left: 20px">共{{ listClassWork.length }}个作业</label>
|
|
||||||
<el-select
|
|
||||||
v-model="queryParams.workType"
|
|
||||||
placeholder="作业类型"
|
|
||||||
size="small"
|
|
||||||
@change="queryClassWorkByParams"
|
|
||||||
style="width: 100px; margin-left: auto;"
|
|
||||||
>
|
|
||||||
<template v-for="(item, index) in listWorkType" :key="index">
|
|
||||||
<el-option :label="item.label" :value="item" />
|
|
||||||
</template>
|
|
||||||
</el-select>
|
|
||||||
</div>
|
|
||||||
<div class="prepare-work-wrap">
|
|
||||||
<FileListItem
|
|
||||||
v-for="(item, index) in desingDataList"
|
|
||||||
:key="index"
|
|
||||||
:item="item"
|
|
||||||
:index="index"
|
|
||||||
@on-set="openSet"
|
|
||||||
@on-delhomework="delhomework"
|
|
||||||
>
|
|
||||||
</FileListItem>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<SetHomework v-model="setAssingDialog" :entpcourseid="entpcourseid" :row="curClassWork" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
|
|
||||||
<script setup>
|
|
||||||
import {ref, onMounted, reactive, watch, nextTick, getCurrentInstance, computed} from 'vue'
|
|
||||||
import { ElMessage } from 'element-plus'
|
|
||||||
import { homeworklist, delClasswork } from '@/api/teaching/classwork'
|
|
||||||
import useResoureStore from '@/views/resource/store'
|
|
||||||
import useUserStore from '@/store/modules/user'
|
|
||||||
import useClassTaskStore from "@/store/modules/classTask";
|
|
||||||
import outLink from '@/utils/linkConfig'
|
|
||||||
|
|
||||||
import ChooseTextbook from '@/components/choose-textbook/index.vue'
|
|
||||||
import FileListItem from '@/views/prepare/container/file-list-item.vue'
|
|
||||||
import SetHomework from '@/components/set-homework/index.vue'
|
|
||||||
|
|
||||||
|
|
||||||
const { ipcRenderer } = require('electron')
|
|
||||||
const userStore = useUserStore().user
|
|
||||||
const classTaskStore = useClassTaskStore()
|
|
||||||
const {proxy} = getCurrentInstance();
|
|
||||||
const sourceStore = useResoureStore();
|
|
||||||
// 当前选中的章节或单元
|
|
||||||
const curNode = ref({});
|
|
||||||
const isLoading = ref(false);
|
|
||||||
const listClassWork = ref([]);
|
|
||||||
const listWorkType = ref(['不限', '习题训练', '框架梳理', '课堂展示', '常规作业']);
|
|
||||||
const isOpenHomework = ref(false);
|
|
||||||
const curClassWork = ref({});
|
|
||||||
const setAssingDialog = ref(false);
|
|
||||||
const entpcourseid = ref(0);
|
|
||||||
|
|
||||||
const queryParams = reactive({
|
|
||||||
workType: '不限',
|
|
||||||
total: 0,
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @desc: 更新作业任务
|
|
||||||
* @return: {*}
|
|
||||||
* @param {*} computed
|
|
||||||
*/
|
|
||||||
const desingDataList = computed(() => {
|
|
||||||
return listClassWork.value;
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @desc: 选中单元章节后的回调, 获取单元章节信息
|
|
||||||
* @return: {*}
|
|
||||||
* @param {*} data
|
|
||||||
*/
|
|
||||||
const getData = async (data) => {
|
|
||||||
if (curNode.value.id == data.node.id) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 1. 情况原作业集合并切换章节
|
|
||||||
curNode.value = data.node;
|
|
||||||
listClassWork.value = [];
|
|
||||||
isLoading.value = true;
|
|
||||||
console.log(curNode.value);
|
|
||||||
|
|
||||||
// 2. 作业设计模板
|
|
||||||
await getClassWorkList();
|
|
||||||
|
|
||||||
isLoading.value = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @desc: 根据作业类型查询作业模板
|
|
||||||
* @return: {*}
|
|
||||||
*/
|
|
||||||
const queryClassWorkByParams = async () => {
|
|
||||||
// 1.先清空原作业集合
|
|
||||||
listClassWork.value = [];
|
|
||||||
isLoading.value = true;
|
|
||||||
|
|
||||||
// 2.根据[作业类型]查询
|
|
||||||
const params = {
|
|
||||||
worktype: queryParams.workType, // 此处多了[作业类型]参数
|
|
||||||
}
|
|
||||||
if (queryParams.workType == '不限') {
|
|
||||||
delete params.worktype;
|
|
||||||
}
|
|
||||||
await getClassWorkList(params);
|
|
||||||
isLoading.value = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @desc: 获取作业设计模板
|
|
||||||
* @return: {*}
|
|
||||||
*/
|
|
||||||
const getClassWorkList = async(params) => {
|
|
||||||
// 班级作业数据,包含多个班级 homeworklist
|
|
||||||
let query = {
|
|
||||||
evalid: curNode.value.id,
|
|
||||||
edituserid: userStore.userId,
|
|
||||||
edustage: userStore.edustage,
|
|
||||||
edusubject: userStore.edusubject,
|
|
||||||
status: '10',
|
|
||||||
orderby: 'concat(worktype,uniquekey) DESC',
|
|
||||||
pageSize: 100,
|
|
||||||
}
|
|
||||||
// 将形参更新至query
|
|
||||||
if (params !== null && params !== undefined) {
|
|
||||||
query = {...query, ...params};
|
|
||||||
}
|
|
||||||
const res = await homeworklist(query);
|
|
||||||
if (res.rows && res.rows.length > 0) {
|
|
||||||
for (const item of res.rows) {
|
|
||||||
item.fileShowName = item.uniquekey;
|
|
||||||
}
|
|
||||||
listClassWork.value = res.rows;
|
|
||||||
//TODO: 这里没分页,貌似这个 total 不重要,后续看
|
|
||||||
queryParams.total = res.total
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @desc: 作业设计/布置
|
|
||||||
* @return: {*}
|
|
||||||
* @param {*} key design-设计 assign-布置. 当key为设计时, url需再增加openDialog字段以便自动打开[设计新作业]
|
|
||||||
*/
|
|
||||||
const handleOutLink = (key) => {
|
|
||||||
isOpenHomework.value = true;
|
|
||||||
// key 对应的 linkConfig.js 外部链接配置
|
|
||||||
let configObj = outLink()['homeWork']
|
|
||||||
let fullPath = configObj.fullPath;
|
|
||||||
|
|
||||||
//打开作业url增加unitId 章节ID
|
|
||||||
let unitId = curNode.value.id;
|
|
||||||
fullPath += `&unitId=${unitId}`;
|
|
||||||
|
|
||||||
// 作业设计时, 再增加参数openDialog以自动打开教师端的[设计新作业]
|
|
||||||
if (key == 'design') {
|
|
||||||
fullPath += `&openDialog=newClassTask`;
|
|
||||||
}
|
|
||||||
// 通知主进程
|
|
||||||
ipcRenderer.send('openWindow', {
|
|
||||||
key,
|
|
||||||
fullPath: fullPath,
|
|
||||||
cookieData: { ...configObj.data }
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const openSet = (item) => {
|
|
||||||
// 打开布置作业窗口
|
|
||||||
curClassWork.value = item;
|
|
||||||
setAssingDialog.value = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const delhomework = (item) => {
|
|
||||||
isLoading.value = true
|
|
||||||
delClasswork(item.id)
|
|
||||||
.then(async(res) => {
|
|
||||||
ElMessage.success('删除成功');
|
|
||||||
isLoading.value = false;
|
|
||||||
await getClassWorkList();
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
isLoading.value = false;
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.page-resource {
|
|
||||||
padding-top: 10px;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
//右侧栏
|
|
||||||
.page-right {
|
|
||||||
min-width: 0;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
flex: 1;
|
|
||||||
margin-left: 20px;
|
|
||||||
height: 100%;
|
|
||||||
background: #ffffff;
|
|
||||||
border-radius: 10px;
|
|
||||||
box-shadow: 0px 0px 20px 0px rgba(99, 99, 99, 0.06);
|
|
||||||
|
|
||||||
.prepare-body-header {
|
|
||||||
padding: 10px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prepare-work-wrap{
|
|
||||||
flex: 1;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -116,8 +116,9 @@ const menuList = [{
|
||||||
{
|
{
|
||||||
name: '作业布置',
|
name: '作业布置',
|
||||||
icon: 'icon-xiezuo1',
|
icon: 'icon-xiezuo1',
|
||||||
isOuter: true,
|
// isOuter: true,
|
||||||
path: '/teaching/classtaskassign?titleName=作业布置'
|
// path: '/teaching/classtaskassign?titleName=作业布置'
|
||||||
|
path: '/classTaskAssign'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '作业批改',
|
name: '作业批改',
|
||||||
|
|
Loading…
Reference in New Issue