feat:合并

This commit is contained in:
lixg
2023-02-24 10:38:08 +08:00
15 changed files with 412 additions and 724 deletions

View File

@@ -80,6 +80,7 @@ export const delStudent = (obj) =>
// 获取学员路径图进度明细 // 获取学员路径图进度明细
export const stuProgress = (params) => http.get('/admin/router/detail', { params }); export const stuProgress = (params) => http.get('/admin/router/detail', { params });
export const stuRouterProgress = (params) => http.get('/admin/router/stuDetail', { params });
// export const stuProgress = (obj) =>http.post("/admin/router/studentProcess", obj); // export const stuProgress = (obj) =>http.post("/admin/router/studentProcess", obj);
//编辑学习路径基本信息 //编辑学习路径基本信息
@@ -219,6 +220,8 @@ export const cancelOrAuth = (obj) => http.post('/admin/certificate/cancelOrAuth'
export const allPoints = (obj) => http.get('/points/project/allPoints', { params: obj }) export const allPoints = (obj) => http.get('/points/project/allPoints', { params: obj })
export const updateStuCert = (obj) => http.post('/admin/certificate/updateStuCert', obj) export const updateStuCert = (obj) => http.post('/admin/certificate/updateStuCert', obj)
//添加外部考试
export const createExamination = (obj) => http.post('/examination/createExamination', obj)
// 外部考试导入成绩 // 外部考试导入成绩
export const ImportExternalExamScore = (obj) => http.post('/admin/external/exam/manage/importExternalExamScore', obj, { headers: { "Content-Type": "multipart/form-data" } }) export const ImportExternalExamScore = (obj) => http.post('/admin/external/exam/manage/importExternalExamScore', obj, { headers: { "Content-Type": "multipart/form-data" } })
//分组 //分组

View File

@@ -27,7 +27,9 @@ export const removeGroupStudent = (obj) => http.post('/admin/project/removeGroup
//查看学员 //查看学员
// export const studentProcess = (obj) => http.get('/admin/project/studentProcess', { params: obj }) // export const studentProcess = (obj) => http.get('/admin/project/studentProcess', { params: obj })
export const studentProcess = (obj) => http.get('/admin/project/detail', { params: obj }) export const studentProcess = (obj) => http.get('/admin/project/detail', { params: obj })
export const studentRank = (obj) => http.get('/admin/project/studentRank', { params: obj }) export const projectStudentProcess = (obj) => http.get('/admin/project/stuDetail', { params: obj })
export const projectStudentRank = (obj) => http.get('/admin/project/studentRank', { params: obj })
export const routerStudentRank = (obj) => http.get('/admin/router/studentRank', { params: obj })
//是否优秀学员 //是否优秀学员
export const topStudent = (obj) => http.post('/admin/project/topStudent', obj) export const topStudent = (obj) => http.post('/admin/project/topStudent', obj)

View File

@@ -386,6 +386,7 @@ function openDrawer(i, row) {
console.log(i, row) console.log(i, row)
row && (formData.value = { ...row.info }); row && (formData.value = { ...row.info });
row && (dateTime.value = [row.info.liveStartTime, row.info.liveEndTime]); row && (dateTime.value = [row.info.liveStartTime, row.info.liveEndTime]);
row && (imageUrl.value = row.info.liveCover);
i >= 0 && (taskIndex.value = i); i >= 0 && (taskIndex.value = i);
visible.value = true; visible.value = true;
} }

View File

@@ -2,46 +2,21 @@
<div @click="openDrawer"> <div @click="openDrawer">
<slot></slot> <slot></slot>
</div> </div>
<a-drawer <a-drawer :visible="visible" class="drawerStyle addtestDrawer" width="800" placement="right">
:visible="visible"
class="drawerStyle addtestDrawer"
width="800"
placement="right"
>
<div class="drawerMain"> <div class="drawerMain">
<div class="header"> <div class="header">
<div class="headerTitle"> <div class="headerTitle">{{ taskIndex >= 0 ? "编辑" : "添加" }}考试</div>
{{ taskIndex >= 0 ? "编辑" : "添加" }}考试 <img style="width: 29px; height: 29px; cursor: pointer" src="../../assets/images/basicinfo/close.png"
@click="closeDrawer" />
</div> </div>
<img <div style="display: flex; flex-direction: row; padding-top: 0px; margin-top: 20px; margin-left: 32px;">
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div
style="
display: flex;
flex-direction: row;
padding-top: 0px;
margin-top: 20px;
margin-left: 32px;
"
>
<div> <div>
<button <button style="width: 100px; cursor: pointer;" @click="changeOuter(1)"
style="width: 100px; cursor: pointer" :class="formData.examType === 1 ? 'outer' : 'notOuter'">
@click="changeOuter(1)"
:class="formData.examType === 1 ? 'outer' : 'notOuter'"
>
系统考试 系统考试
</button> </button>
<button <button :disabled="taskIndex >= 0" style="width: 100px; cursor: pointer;" @click="changeOuter(2)"
:disabled="taskIndex >= 0" :class="formData.examType === 2 ? 'outer' : 'notOuter'">
style="width: 100px; cursor: pointer"
@click="changeOuter(2)"
:class="formData.examType === 2 ? 'outer' : 'notOuter'"
>
外部考试 外部考试
</button> </button>
</div> </div>
@@ -52,58 +27,33 @@
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<div class="sign"> <div class="sign">
<img <img src="@/assets/images/coursewareManage/asterisk.png" alt="" />
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div> </div>
<span style="margin-right: 3px">考试名称</span> <span style="margin-right: 3px">考试名称</span>
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-input <a-input v-model:value="formData.examinationName" style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="formData.examinationName" placeholder="请输入考试名称" :maxlength="20" :disabled="taskIndex >= 0" />
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
:maxlength="20"
:disabled="taskIndex >= 0"
/>
</div> </div>
</div> </div>
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<div class="sign"> <div class="sign">
<img <img src="@/assets/images/coursewareManage/asterisk.png" alt="" />
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div> </div>
<span style="margin-right: 3px">选择试卷</span> <span style="margin-right: 3px">选择试卷</span>
</div> </div>
<s-test <s-test v-model:id="formData.examinationPaperId" v-model:name="formData.examinationTestName">
v-model:id="formData.examinationPaperId"
v-model:name="formData.examinationTestName"
>
<div class="btnbox"> <div class="btnbox">
<button <button class="xkbtn" style="margin:0" :disabled="taskIndex >= 0">
class="xkbtn"
style="margin: 0"
:disabled="taskIndex >= 0"
>
{{ formData.examinationPaperId ? "重选" : "选择" }}试卷 {{ formData.examinationPaperId ? "重选" : "选择" }}试卷
</button> </button>
</div> </div>
</s-test> </s-test>
<div v-if="formData.examinationPaperId"> <div v-if="formData.examinationPaperId">
<a-tag <a-tag closable color="processing" @close="delTag" :closeIcon="true">
closable <span style="font-size: 14px; line-height: 33px">{{ formData.examinationTestName }}</span>
color="processing"
@close="delTag"
:closeIcon="true"
>
<span style="font-size: 14px; line-height: 33px">{{
formData.examinationTestName
}}</span>
</a-tag> </a-tag>
</div> </div>
</div> </div>
@@ -111,65 +61,40 @@
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<div class="sign"> <div class="sign">
<img <img src="@/assets/images/coursewareManage/asterisk.png" alt="" />
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div> </div>
<span style="margin-right: 3px">考试时间</span> <span style="margin-right: 3px">考试时间</span>
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-range-picker <a-range-picker style="width: 400px; height: 40px; border-radius: 8px" :show-time="{ format: 'hh:mm' }"
style="width: 400px; height: 40px; border-radius: 8px" :disabled-date="disabledDate" format="YYYY-MM-DD HH:mm" valueFormat="YYYY-MM-DD HH:mm"
:show-time="{ format: 'hh:mm' }" v-model:value="dateTime" @change="timeChange" :placeholder="[' 开始时间', ' 结束时间']" />
:disabled-date="disabledDate"
format="YYYY-MM-DD HH:mm"
valueFormat="YYYY-MM-DD HH:mm"
v-model:value="dateTime"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</div> </div>
</div> </div>
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<div class="sign"> <div class="sign">
<img <img src="@/assets/images/coursewareManage/asterisk.png" alt="" />
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div> </div>
<span style="margin-right: 3px">考试时长</span> <span style="margin-right: 3px">考试时长</span>
</div> </div>
<div class="select"> <div class="select">
<a-input-number <a-input-number :disabled="taskIndex >= 0" :min="0" :max="300" :precision="0"
:disabled="taskIndex >= 0"
:min="0"
:max="300"
:precision="0"
style="width: 400px; height: 40px; border-radius: 8px" style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="formData.examinationDuration" v-model:value="formData.examinationDuration"></a-input-number>
></a-input-number>
<span style="color: #999999; margin-left: 8px">分钟</span> <span style="color: #999999; margin-left: 8px">分钟</span>
</div> </div>
</div> </div>
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<div class="sign"> <div class="sign">
<img <img src="@/assets/images/coursewareManage/asterisk.png" alt="" />
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div> </div>
<span style="margin-right: 3px">及格线</span> <span style="margin-right: 3px">及格线</span>
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-input <a-input :disabled="taskIndex >= 0" v-model:value="formData.passLine" type="number"
:disabled="taskIndex >= 0" style="width: 400px; height: 40px; border-radius: 8px" />
v-model:value="formData.passLine"
type="number"
style="width: 400px; height: 40px; border-radius: 8px"
/>
<span style="color: #999999; margin-left: 8px"></span> <span style="color: #999999; margin-left: 8px"></span>
</div> </div>
@@ -179,43 +104,24 @@
<span style="margin-right: 3px">考试说明</span> <span style="margin-right: 3px">考试说明</span>
</div> </div>
<div class="textarea"> <div class="textarea">
<a-textarea <a-textarea :disabled="taskIndex >= 0" v-model:value="formData.examinationExplain" placeholder="请输入考试说明"
:disabled="taskIndex >= 0" allow-clear show-count :maxlength="200" :rows="6" />
v-model:value="formData.examinationExplain"
placeholder="请输入考试说明"
allow-clear
show-count
:maxlength="200"
:rows="6"
/>
</div> </div>
</div> </div>
<div class="main_item2"> <div class="main_item2">
<div class="signbox"> <div class="signbox">
<span style="margin-right: 3px; margin-top: 10px" <span style="margin-right: 3px;margin-top: 10px;">考试限制</span>
>考试限制</span
>
</div> </div>
<div class="kqszbox"> <div class="kqszbox">
<div class="setbox"> <div class="setbox">
<div class="timerbox"> <div class="timerbox">
<span>允许重复考试</span> <span>允许重复考试</span>
<a-input-number <a-input-number :disabled="taskIndex >= 0" :min="-1" :max="300" :precision="0" style="
:disabled="taskIndex >= 0"
:min="-1"
:max="300"
:precision="0"
style="
width: 100px; width: 100px;
height: 32px; height: 32px;
border-radius: 8px; border-radius: 8px;
overflow: hidden; overflow: hidden;" v-model:value="formData.examinationLimit"></a-input-number>
" <span style="color: #999999; margin-left: 8px">,-1表示无限制</span>
v-model:value="formData.examinationLimit"
></a-input-number>
<span style="color: #999999; margin-left: 8px"
>,-1表示无限制</span
>
</div> </div>
</div> </div>
</div> </div>
@@ -226,11 +132,7 @@
<span style="margin-right: 3px">显示答案</span> <span style="margin-right: 3px">显示答案</span>
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-radio-group <a-radio-group :disabled="taskIndex >= 0" style="margin-right: 12px" v-model:value="formData.showAnswers">
:disabled="taskIndex >= 0"
style="margin-right: 12px"
v-model:value="formData.showAnswers"
>
<a-radio :value="1">允许查看</a-radio> <a-radio :value="1">允许查看</a-radio>
<a-radio :value="2">不允许查看</a-radio> <a-radio :value="2">不允许查看</a-radio>
</a-radio-group> </a-radio-group>
@@ -241,11 +143,7 @@
<span style="margin-right: 3px">显示解析</span> <span style="margin-right: 3px">显示解析</span>
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-radio-group <a-radio-group :disabled="taskIndex >= 0" style="margin-right: 12px" v-model:value="formData.showAnalysis">
:disabled="taskIndex >= 0"
style="margin-right: 12px"
v-model:value="formData.showAnalysis"
>
<a-radio :value="1">允许查看</a-radio> <a-radio :value="1">允许查看</a-radio>
<a-radio :value="2">不允许查看</a-radio> <a-radio :value="2">不允许查看</a-radio>
</a-radio-group> </a-radio-group>
@@ -256,27 +154,21 @@
<span style="margin-right: 3px">评分模式</span> <span style="margin-right: 3px">评分模式</span>
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-radio-group <a-radio-group :disabled="taskIndex >= 0" style="margin-right: 12px" v-model:value="formData.scoringModel">
:disabled="taskIndex >= 0"
style="margin-right: 12px"
v-model:value="formData.scoringModel"
>
<a-radio :value="1">最高一次</a-radio> <a-radio :value="1">最高一次</a-radio>
<a-radio :value="2">最后一次</a-radio> <a-radio :value="2">最后一次</a-radio>
</a-radio-group> </a-radio-group>
</div> </div>
</div> </div>
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<span style="margin-right: 3px">试题排列</span> <span style="margin-right: 3px">试题排列</span>
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-radio-group <a-radio-group :disabled="taskIndex >= 0" style="margin-right: 12px"
:disabled="taskIndex >= 0" v-model:value="formData.questionArrangement">
style="margin-right: 12px"
v-model:value="formData.questionArrangement"
>
<a-radio :value="1">试题乱序</a-radio> <a-radio :value="1">试题乱序</a-radio>
<a-radio :value="2">选项乱序</a-radio> <a-radio :value="2">选项乱序</a-radio>
<a-radio :value="3">全部乱序</a-radio> <a-radio :value="3">全部乱序</a-radio>
@@ -284,7 +176,7 @@
</a-radio-group> </a-radio-group>
</div> </div>
</div> </div>
<div class="main_item" style="height: 20px"></div> <div class="main_item" style="height: 20px;"></div>
</div> </div>
</div> </div>
<div v-else class="contentMain"> <div v-else class="contentMain">
@@ -292,39 +184,25 @@
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<div class="sign"> <div class="sign">
<img <img src="@/assets/images/coursewareManage/asterisk.png" alt="" />
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div> </div>
<span style="margin-right: 3px">考试名称</span> <span style="margin-right: 3px">考试名称</span>
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-input <a-input v-model:value="formData.examinationName" style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="formData.examinationName" placeholder="请输入考试名称" :maxlength="20" />
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
:maxlength="20"
/>
</div> </div>
</div> </div>
<div class="main_item"> <div class="main_item">
<div class="signbox"> <div class="signbox">
<div class="sign"> <div class="sign">
<img <img src="@/assets/images/coursewareManage/asterisk.png" alt="" />
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div> </div>
<span style="margin-right: 3px">数据来源</span> <span style="margin-right: 3px">数据来源</span>
</div> </div>
<div class="btnbox"> <div class="btnbox">
<a-input <a-input v-model:value="formData.source" style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="formData.source" placeholder="请输入数据来源" :maxlength="20" />
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入数据来源"
:maxlength="20"
/>
</div> </div>
</div> </div>
<div class="main_item2"> <div class="main_item2">
@@ -332,14 +210,8 @@
<span style="margin-right: 3px">考试说明</span> <span style="margin-right: 3px">考试说明</span>
</div> </div>
<div class="textarea"> <div class="textarea">
<a-textarea <a-textarea v-model:value="formData.externalExplain" placeholder="请输入考试说明" allow-clear show-count
v-model:value="formData.externalExplain" :maxlength="200" :rows="6" />
placeholder="请输入考试说明"
allow-clear
show-count
:maxlength="200"
:rows="6"
/>
</div> </div>
</div> </div>
</div> </div>
@@ -354,161 +226,160 @@
<script setup> <script setup>
import { defineEmits, defineProps, ref, watch } from "vue"; import { defineEmits, defineProps, ref, watch } from "vue";
import STest from "./SelectTest.vue"; import STest from "./SelectTest.vue";
import { createExamination } from "@/api/index1";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { Form, message } from "ant-design-vue"; import { Form, message } from "ant-design-vue";
const props = defineProps({ const props = defineProps({
type: Number, type: Number,
taskList: [], taskList: []
}); })
const visible = ref(false); const visible = ref(false)
const initValue = { const initValue = {
examinationName: "", examinationName: '',
examinationPaperId: "", examinationPaperId: '',
examinationStartTime: "", examinationStartTime: '',
examinationEndTime: "", examinationEndTime: '',
examinationDuration: "", examinationDuration: '',
passLine: "", passLine: '',
examType: 1, examType: 1,
source: "", source: "",
showAnswers: 2, showAnswers: 2,
showAnalysis: 2, showAnalysis: 2,
scoringModel: 2, scoringModel: 2,
questionArrangement: 4, questionArrangement: 4,
externalExplain: "", externalExplain: ""
}; }
const formData = ref(initValue); const formData = ref(initValue)
const innerRule = { const innerRule = {
examinationName: [ examinationName: [
{ {
required: true, required: true,
message: "请输入考试名称", message: '请输入考试名称',
}, },
], ],
examinationPaperId: [ examinationPaperId: [
{ {
required: true, required: true,
message: "请输入选择试卷", message: '请输入选择试卷',
}, },
], ],
examinationStartTime: [ examinationStartTime: [
{ {
required: true, required: true,
message: "请输入开始开始时间", message: '请输入开始开始时间',
}, },
], ],
examinationEndTime: [ examinationEndTime: [
{ {
required: true, required: true,
message: "请输入开始结束时间", message: '请输入开始结束时间',
}, },
], ],
examinationDuration: [ examinationDuration: [
{ {
required: true, required: true,
message: "请输入考试时长", message: '请输入考试时长',
}, },
], ],
passLine: [ passLine: [
{ {
required: true, required: true,
message: "请输入及格线", message: '请输入及格线',
}, },
], ],
}; }
const outerRule = { const outerRule = {
examinationName: [ examinationName: [
{ {
required: true, required: true,
message: "请输入考试名称", message: '请输入考试名称',
}, },
], ],
source: [ source: [
{ {
required: true, required: true,
message: "请输入数据来源", message: '请输入数据来源',
}, },
], ],
}; }
const rulesRef = ref(innerRule); const rulesRef = ref(innerRule);
const emit = defineEmits({}); const emit = defineEmits({})
const taskIndex = ref(-1); const taskIndex = ref(-1);
const dateTime = ref([]); const dateTime = ref([]);
const { resetFields, validate } = Form.useForm(formData, rulesRef); const { resetFields, validate } = Form.useForm(formData, rulesRef);
watch( watch(() => formData.value.examType, () => {
() => formData.value.examType, formData.value.examType === 1 ? rulesRef.value = innerRule : rulesRef.value = outerRule
() => { })
formData.value.examType === 1
? (rulesRef.value = innerRule)
: (rulesRef.value = outerRule);
}
);
const closeDrawer = () => { const closeDrawer = () => {
visible.value = false; visible.value = false
taskIndex.value = -1; taskIndex.value = -1
resetFields(); resetFields()
dateTime.value = []; dateTime.value = []
}; };
function timeChange(time, timeStr) { function timeChange(time, timeStr) {
formData.value.examinationStartTime = timeStr[0]; formData.value.examinationStartTime = timeStr[0]
formData.value.examinationEndTime = timeStr[1]; formData.value.examinationEndTime = timeStr[1]
} }
const disabledDate = (current) => { const disabledDate = (current) => {
return current && current < dayjs().startOf("day"); return current && current < dayjs().startOf('day');
}; };
// 系统考试 // 系统考试
async function confirm() { async function confirm() {
// debugger
await validate().catch(({ errorFields }) => { await validate().catch(({ errorFields }) => {
message.warning(errorFields[0].errors.join()); message.warning(errorFields[0].errors.join());
throw Error("数据校验不通过"); throw Error("数据校验不通过")
}); });
if (taskIndex.value === -1) { if (taskIndex.value === -1) {
const list = props.taskList; const list = props.taskList
list.push({ list.push({ name: formData.value.examinationName, type: props.type, info: { ...formData.value } })
name: formData.value.examinationName,
type: props.type,
info: { ...formData.value },
});
} else { } else {
const data = props.taskList[taskIndex.value]; const data = props.taskList[taskIndex.value]
data.name = formData.value.examinationName; data.name = formData.value.examinationName
data.info = { ...formData.value }; data.info = { ...formData.value }
} }
emit("update:taskList", [...props.taskList]); let obj = formData.value;
closeDrawer(); createExamination(obj).then(res => {
console.log(res)
message.success("成功");
}).catch(err => {
console.log(err)
})
emit('update:taskList', [...props.taskList])
closeDrawer()
} }
function openDrawer(i, row) { function openDrawer(i, row) {
row && resetFields(row.info); row && resetFields(row.info);
row && row && (dateTime.value = [row.info.examinationStartTime, row.info.examinationEndTime]);
(dateTime.value = [ (i >= 0) && (taskIndex.value = i);
row.info.examinationStartTime, visible.value = true
row.info.examinationEndTime,
]);
i >= 0 && (taskIndex.value = i);
visible.value = true;
} }
const delTag = () => { const delTag = () => {
formData.value.examinationPaperId = ""; formData.value.examinationPaperId = '';
formData.value.examinationTestName = ""; formData.value.examinationTestName = '';
}; }
function changeOuter(v) { function changeOuter(v) {
if (taskIndex.value >= 0) { if (taskIndex.value >= 0) {
return message.warn("编辑状态不允许切换。"); return message.warn("编辑状态不允许切换。")
} }
formData.value.examType = v; formData.value.examType = v;
} }
defineExpose({ openDrawer }); defineExpose({ openDrawer })
</script> </script>
<style lang="scss"> <style lang="scss">
.ant-table-striped :deep(.table-striped) td { .ant-table-striped :deep(.table-striped) td {
@@ -648,6 +519,7 @@ defineExpose({ openDrawer });
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
.timerbox { .timerbox {
margin-top: 6px; margin-top: 6px;
margin-right: 32px; margin-right: 32px;
@@ -702,9 +574,7 @@ defineExpose({ openDrawer });
background-color: #eff4fc !important; background-color: #eff4fc !important;
} }
.ant-table-tbody .ant-table-tbody>tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)>td {
> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td {
background: #f6f9fd; background: #f6f9fd;
} }

View File

@@ -4,7 +4,6 @@
class="drawerStyle CheckStu" class="drawerStyle CheckStu"
placement="right" placement="right"
width="70%" width="70%"
@after-visible-change="afterVisibleChange"
> >
<div class="drawerMain"> <div class="drawerMain">
<div class="header"> <div class="header">
@@ -22,14 +21,16 @@
<img src="../../assets/images/studentimg/character.png"/> <img src="../../assets/images/studentimg/character.png"/>
</div> </div>
<div class="stumation"> <div class="stumation">
<div class="stuname">{{pro==null?"":pro.routerInfo.name}}</div> <div class="stuname">{{ pro.userInfo?.realName }}</div>
<div class="stugangw">{{pro==null?"":pro.routerInfo.organizationName?pro.routerInfo.organizationName:"" + '-' + pro==null?"":pro.routerInfo.jobName?pro.routerInfo.jobName:""}}</div> <div class="stugangw">
{{pro.routerInfo?.departName || '' }} - {{ pro.userInfo?.jobName || ''}}
</div>
</div> </div>
<div class="sortbox"> <div class="sortbox">
<div class="sortname">进度排名</div> <div class="sortname">进度排名</div>
<div class="sortnub"> <div class="sortnub">
<span class="nub1">{{rank.current}}</span> <span class="nub1">{{ rank.current || 0 }}</span>
<span class="total">/{{rank.total}}</span> <span class="total">/{{ rank.total || 0 }}</span>
</div> </div>
</div> </div>
<a-divider <a-divider
@@ -43,8 +44,8 @@
<div class="sortbox" style="margin-left: 34px"> <div class="sortbox" style="margin-left: 34px">
<div class="sortname">完成必修</div> <div class="sortname">完成必修</div>
<div class="sortnub"> <div class="sortnub">
<span class="nub1">{{pro==null?"":pro.currentReqCnt}}</span> <span class="nub1">{{ rank.finishCompulsoryNum || 0 }}</span>
<span class="total">/{{pro==null?"":pro.totalReqCnt}}</span> <span class="total">/{{ rank.totalCompulsoryNum || 0 }}</span>
</div> </div>
</div> </div>
<a-divider <a-divider
@@ -57,50 +58,10 @@
<div class="sortbox" style="margin-left: 34px"> <div class="sortbox" style="margin-left: 34px">
<div class="sortname">已修证书</div> <div class="sortname">已修证书</div>
<div class="sortnub"> <div class="sortnub">
<span class="nub1">{{pro==null?"":pro.routerInfo.certCnt?pro.routerInfo.certCnt:0}}</span> <span class="nub1">{{ rank.certNum || 0 }}</span>
</div> </div>
</div> </div>
</div> </div>
<!-- <div class="secondrow">
<div class="rowleft">{{ pro.name }}</div> -->
<!-- <div class="rowbox" @click="showProMess">
<div class="shuom">说明</div>
<div><img src="../../assets/images/studentimg/chak.png" /></div>
</div> -->
<!-- </div> -->
<!-- <div v-for="(item) in pro.chapterList" class="mainbox"
style="margin-top: 15px; height: 56px"
:key="item.chapterId">
<div class="rowtitle" @click="changeDown">
<div class="titleimg">
<img
:src="
showDown
? require('../../assets/images/studentimg/open.png')
: require('../../assets/images/studentimg/close.png')
"
/>
</div>
<div class="titletext">{{item.chapterName}}</div>
</div>
<div :style="{ display: showDown ? 'block' : 'none' }">
<div v-for="_item in item.taskList" :key="_item.routerTaskId" class="rowclass">
<div class="leftclass">
<div><img src="../../assets/images/leveladd/zai.png" /></div>
<div class="text1">{{checkType(_item.type)}}</div>
<div class="text2">{{_item.name}}</div>
</div>
<div class="alreadyclass">
<div class="alimg">
<img src="../../assets/images/studentimg/complete.png" />
</div>
<div class="altext">{{checkStatus(_item.status)}}</div>
</div>
</div>
</div>
</div> -->
<div class="mainbox"> <div class="mainbox">
<a-collapse v-model:activeKey="stageListActive"> <a-collapse v-model:activeKey="stageListActive">
<template #expandIcon="{ isActive }"> <template #expandIcon="{ isActive }">
@@ -114,12 +75,7 @@
/> />
<div></div> <div></div>
</template> </template>
<a-collapse-panel <a-collapse-panel v-for="value in pro.chapterList || []" :key="value.id" :header="value.name">
v-for="value in pro==null?[]:pro.chapterList"
:key="value.chapterId"
:header="value.chapterName"
>
<template #extra> <template #extra>
<div @click.stop=""> <div @click.stop="">
<div class="rowbox"> <div class="rowbox">
@@ -133,13 +89,11 @@
</div> </div>
</div> </div>
</template> </template>
<div <div
class="rowclass" class="rowclass"
v-for="(item, key) in value.taskList" v-for="(item, key) in value.taskList"
:key="key" :key="key"
> >
<div class="leftclass"> <div class="leftclass">
<div> <div>
<img <img
@@ -187,7 +141,7 @@
" "
/> />
</div> </div>
<div class="altext">{{ item.status ==0?"进行中":item.status ==1?"已完成":"未开始" }}</div> <div class="altext">{{ item.status === 0 ? "进行中" : item.status === 1 ? "已完成" : "未开始" }}</div>
</div> </div>
</div> </div>
@@ -205,14 +159,12 @@
</template> </template>
<script> <script>
import { reactive, toRefs } from "vue"; import {reactive, toRefs, watch} from "vue";
import CheckStuMess from "./CheckStuMess.vue"; import {stuRouterProgress} from "@/api/index1";
import {stuProgress} from "@/api/index1"; import {routerStudentRank} from "@/api/indexProjStu";
import {studentRank} from "@/api/indexProjStu";
// import {message} from "ant-design-vue";
export default { export default {
name: "CheckStu", name: "CheckStu",
components: { CheckStuMess },
props: { props: {
CheckStuvisible: { CheckStuvisible: {
type: Boolean, type: Boolean,
@@ -232,52 +184,37 @@ export default {
StuMessvisible: false, StuMessvisible: false,
showDown: false, showDown: false,
pro: null, pro: null,
loading:true, loading: false,
stageListActive: 0, stageListActive: 0,
rank:{total:1,current:1}, rank: {total: 0, current: 0, finishCompulsoryNum: 0, totalCompulsoryNum: 0, certNum: 0},
}); });
watch([()=>props.studentId, ()=>props.routerId], () => {
console.log(111111)
console.log(props)
getStuProgress()
getStuRank()
})
const closeDrawer = () => { const closeDrawer = () => {
ctx.emit("update:CheckStuvisible", false); ctx.emit("update:CheckStuvisible", false);
}; };
const getStuRank = () => { const getStuRank = () => {
studentRank({ routerStudentRank({routerId: props.routerId, studentId: props.studentId}).then(res => state.rank = res.data.data)
projectId: props.routerId,
studentId: props.studentId,
type:2
}).then(res=>{
state.rank = res.data.data
})
} }
const showProMess = () => { const showProMess = () => {
state.StuMessvisible = true; state.StuMessvisible = true;
}; };
const afterVisibleChange = (bool) => {
if(props.CheckStuvisible) {
getStuProgress()
getStuRank()
}
console.log("state", bool);
};
const changeDown = () => { const changeDown = () => {
state.showDown = !state.showDown; state.showDown = !state.showDown;
}; };
const getStuProgress = () => { const getStuProgress = () => {
state.loading = true state.loading = true
let obj = { stuRouterProgress({routerId: props.routerId, userId: props.studentId}).then(res => {
routerId:props.routerId==null?props.studentId:props.routerId
// routerId:props.studentId
}
stuProgress(obj).then(res => {
console.log("查询当前学员进度信息success",res)
state.pro = res.data.data state.pro = res.data.data
state.loading = false state.loading = false
console.log(res)
}).catch(err => {
console.log("查询当前学员进度信息err",err)
state.loading = false
console.log(err)
}) })
} }
@@ -301,25 +238,12 @@ export default {
return typeRules[type]; return typeRules[type];
} }
const checkStatus = (status) => {
if(status < 0) return "未开始"
let statusRules = [
"进行中","已完成"
]
return statusRules[status]
}
return { return {
...toRefs(state), ...toRefs(state),
afterVisibleChange,
closeDrawer, closeDrawer,
showProMess, showProMess,
changeDown, changeDown,
checkType, checkType,
checkStatus,
// change,
}; };
}, },
}; };
@@ -332,16 +256,19 @@ export default {
.ant-drawer-header { .ant-drawer-header {
display: none !important; display: none !important;
} }
.ant-drawer-body { .ant-drawer-body {
padding: 0; padding: 0;
} }
} }
.drawerMain { .drawerMain {
min-width: 600px; min-width: 600px;
margin: 0px 32px 0px 32px; margin: 0px 32px 0px 32px;
overflow-x: auto; overflow-x: auto;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.header { .header {
height: 73px; height: 73px;
border-bottom: 1px solid #e8e8e8; border-bottom: 1px solid #e8e8e8;
@@ -351,6 +278,7 @@ export default {
// background-color: red; // background-color: red;
margin-bottom: 20px; margin-bottom: 20px;
flex-shrink: 0; flex-shrink: 0;
.headerTitle { .headerTitle {
font-size: 18px; font-size: 18px;
font-weight: 600; font-weight: 600;
@@ -359,11 +287,13 @@ export default {
// margin-left: 24px; // margin-left: 24px;
} }
} }
.main { .main {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
overflow-y: auto; overflow-y: auto;
padding-bottom: 80px; padding-bottom: 80px;
.stuinfor { .stuinfor {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -373,35 +303,43 @@ export default {
background-image: url("../../assets/images/studentimg/bgimg.png"); background-image: url("../../assets/images/studentimg/bgimg.png");
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: right; background-position: right;
.stumation { .stumation {
margin-left: 24px; margin-left: 24px;
.stuname { .stuname {
color: #333333; color: #333333;
font-size: 18px; font-size: 18px;
} }
.stugangw { .stugangw {
color: #999999; color: #999999;
font-size: 16px; font-size: 16px;
margin-top: 7px; margin-top: 7px;
} }
} }
.sortbox { .sortbox {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
margin-left: 114px; margin-left: 114px;
.sortname { .sortname {
color: #666660; color: #666660;
font-size: 14px; font-size: 14px;
} }
.sortnub { .sortnub {
display: flex; display: flex;
justify-content: center; justify-content: center;
margin-top: 7px; margin-top: 7px;
.nub1 { .nub1 {
color: #0060ff; color: #0060ff;
font-size: 22px; font-size: 22px;
} }
.total { .total {
color: #999999; color: #999999;
font-size: 22px; font-size: 22px;
@@ -409,13 +347,16 @@ export default {
} }
} }
} }
.secondrow { .secondrow {
margin-top: 32px; margin-top: 32px;
display: flex; display: flex;
.rowleft { .rowleft {
color: rgba(51, 51, 51, 1); color: rgba(51, 51, 51, 1);
font-size: 16px; font-size: 16px;
} }
.rowbox { .rowbox {
width: 64px; width: 64px;
height: 24px; height: 24px;
@@ -426,6 +367,7 @@ export default {
border: 1px solid rgba(64, 158, 255, 1); border: 1px solid rgba(64, 158, 255, 1);
background: rgba(64, 158, 255, 0.1); background: rgba(64, 158, 255, 0.1);
cursor: pointer; cursor: pointer;
.shuom { .shuom {
color: rgba(64, 158, 255, 1); color: rgba(64, 158, 255, 1);
font-size: 14px; font-size: 14px;
@@ -434,6 +376,7 @@ export default {
} }
} }
} }
// .mainbox { // .mainbox {
// // height: 463px; // // height: 463px;
// margin-right: 37px; // margin-right: 37px;
@@ -511,6 +454,7 @@ export default {
background: rgba(64, 158, 255, 0.1); background: rgba(64, 158, 255, 0.1);
margin-right: 480px; margin-right: 480px;
cursor: pointer; cursor: pointer;
.shuom { .shuom {
color: rgba(64, 158, 255, 1); color: rgba(64, 158, 255, 1);
font-size: 14px; font-size: 14px;
@@ -518,23 +462,28 @@ export default {
margin-right: 5px; margin-right: 5px;
} }
} }
.ant-collapse { .ant-collapse {
background-color: #ffffff; background-color: #ffffff;
border: 0; border: 0;
} }
.ant-collapse-content > .ant-collapse-content-box { .ant-collapse-content > .ant-collapse-content-box {
padding: 0; padding: 0;
border: 0; border: 0;
} }
.ant-collapse > .ant-collapse-item { .ant-collapse > .ant-collapse-item {
border: 1px solid rgba(221, 238, 255, 1); border: 1px solid rgba(221, 238, 255, 1);
border-radius: 6px; border-radius: 6px;
margin-bottom: 15px; margin-bottom: 15px;
border-bottom: 0px; border-bottom: 0px;
} }
.ant-collapse-content { .ant-collapse-content {
border-top: 0; border-top: 0;
} }
.ant-collapse-header { .ant-collapse-header {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -544,16 +493,19 @@ export default {
color: rgba(51, 51, 51, 1); color: rgba(51, 51, 51, 1);
font-weight: 500; font-weight: 500;
} }
.rowclass { .rowclass {
height: 81px; height: 81px;
border-bottom: 1px solid rgba(221, 238, 255, 1); border-bottom: 1px solid rgba(221, 238, 255, 1);
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
.leftclass { .leftclass {
display: flex; display: flex;
margin-left: 25px; margin-left: 25px;
align-items: center; align-items: center;
.text1 { .text1 {
color: #000000; color: #000000;
font-size: 14px; font-size: 14px;
@@ -562,6 +514,7 @@ export default {
word-break: keep-all; word-break: keep-all;
white-space: nowrap; white-space: nowrap;
} }
.text2 { .text2 {
color: rgba(51, 51, 51, 0.8); color: rgba(51, 51, 51, 0.8);
font-size: 14px; font-size: 14px;
@@ -572,13 +525,16 @@ export default {
text-overflow: ellipsis; text-overflow: ellipsis;
} }
} }
.alreadyclass { .alreadyclass {
display: flex; display: flex;
margin-right: 57px; margin-right: 57px;
.alimg { .alimg {
height: 16px; height: 16px;
width: 16px; width: 16px;
} }
.altext { .altext {
color: rgba(56, 125, 247, 1); color: rgba(56, 125, 247, 1);
font-size: 14px; font-size: 14px;
@@ -590,6 +546,7 @@ export default {
} }
} }
} }
.btnn { .btnn {
height: 72px; height: 72px;
width: 100%; width: 100%;
@@ -601,6 +558,7 @@ export default {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16); box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn2 { .btn2 {
cursor: pointer; cursor: pointer;
width: 100px; width: 100px;

View File

@@ -645,7 +645,7 @@ export default {
bum: item.userInfoBo.deptName, bum: item.userInfoBo.deptName,
gangw: item.userInfoBo.jobName, gangw: item.userInfoBo.jobName,
group: item.groupName, group: item.groupName,
diploma: "0", diploma: item.allPointsCount,
// operation: "查看", // operation: "查看",
}; };
array.push(obj); array.push(obj);

View File

@@ -1,7 +1,6 @@
<!-- eslint-disable vue/no-use-v-if-with-v-for --> <!-- eslint-disable vue/no-use-v-if-with-v-for -->
<template> <template>
<a-drawer :visible="Seevisible" class="drawerStyle seestu" placement="right" width="70%" <a-drawer :visible="Seevisible" class="drawerStyle seestu" placement="right" width="70%">
@after-visible-change="afterVisibleChange">
<div class="drawerMain"> <div class="drawerMain">
<div class="header"> <div class="header">
<div class="headerTitle">查看</div> <div class="headerTitle">查看</div>
@@ -15,14 +14,14 @@
<img src="../../assets/images/studentimg/character.png"/> <img src="../../assets/images/studentimg/character.png"/>
</div> </div>
<div class="stumation"> <div class="stumation">
<div class="stuname">{{ userName }}</div> <div class="stuname">{{ info.userInfo?.realName }}</div>
<div class="stugangw">{{ deptName }} - {{ jobName }}</div> <div class="stugangw">{{ info.userInfo?.departName }} - {{ info.userInfo?.jobName }}</div>
</div> </div>
<div class="sortbox"> <div class="sortbox">
<div class="sortname">进度排名</div> <div class="sortname">进度排名</div>
<div class="sortnub"> <div class="sortnub">
<span class="nub1">{{ rank.current }}</span> <span class="nub1">{{ rank.current || 0 }}</span>
<span class="total">/{{ rank.total }}</span> <span class="total">/{{ rank.total || 0 }}</span>
</div> </div>
</div> </div>
<a-divider type="vertical" style=" <a-divider type="vertical" style="
@@ -33,8 +32,8 @@
<div class="sortbox" style="margin-left: 34px"> <div class="sortbox" style="margin-left: 34px">
<div class="sortname">完成必修</div> <div class="sortname">完成必修</div>
<div class="sortnub"> <div class="sortnub">
<span class="nub1">{{ currentReqCnt }}</span> <span class="nub1">{{ rank.finishCompulsoryNum || 0 }}</span>
<span class="total">/{{ totalReqCnt }}</span> <span class="total">/{{ rank.totalCompulsoryNum || 0 }}</span>
</div> </div>
</div> </div>
@@ -45,14 +44,13 @@
<div class="sortbox" style="margin-left: 34px"> <div class="sortbox" style="margin-left: 34px">
<div class="sortname">已修证书</div> <div class="sortname">已修证书</div>
<div class="sortnub"> <div class="sortnub">
<span class="nub1">{{ 0 }}</span> <span class="nub1">{{ rank.certNum || 0 }}</span>
</div> </div>
</div> </div>
</div> </div>
<div class="secondrow"> <div class="secondrow">
<div class="rowleft">{{ name }} </div> <div class="rowleft">{{ info.projectInfo.name }}</div>
<div class="rowRight"> 排序号{{ sort }}</div>
</div> </div>
<div class="mainbox"> <div class="mainbox">
<a-collapse v-model:activeKey="stageListActive"> <a-collapse v-model:activeKey="stageListActive">
@@ -64,7 +62,7 @@
"/> "/>
<div></div> <div></div>
</template> </template>
<a-collapse-panel v-for="value in stageList" :key="value.stageId" :header="value.stageName"> <a-collapse-panel v-for="value in info.stageList" :key="value.id" :header="value.name || '无阶段任务'">
<template #extra> <template #extra>
<div @click.stop=""> <div @click.stop="">
<div class="rowbox"> <div class="rowbox">
@@ -83,37 +81,36 @@
<div class="leftclass"> <div class="leftclass">
<div> <div>
<img :src=" <img
item.course === '在线' :src="
item.type === 1
? require('../../assets/images/leveladd/zai.png') ? require('../../assets/images/leveladd/zai.png')
: item.course === '面授' : item.type === 2
? require('../../assets/images/leveladd/mian.png') ? require('../../assets/images/leveladd/mian.png')
: item.course === '案例' : item.type === 3
? require('../../assets/images/leveladd/an.png') ? require('../../assets/images/leveladd/an.png')
: item.course === '作业' : item.type === 4
? require('../../assets/images/leveladd/zuo.png') ? require('../../assets/images/leveladd/zuo.png')
: item.course === '考试' : item.type === 5
? require('../../assets/images/leveladd/kao.png') ? require('../../assets/images/leveladd/kao.png')
: item.course === '直播' : item.type === 6
? require('../../assets/images/leveladd/zhi.png') ? require('../../assets/images/leveladd/zhi.png')
: item.course === '外链' : item.type === 7
? require('../../assets/images/leveladd/wai.png') ? require('../../assets/images/leveladd/wai.png')
: item.course === '讨论' : item.type === 8
? require('../../assets/images/leveladd/tao.png') ? require('../../assets/images/leveladd/tao.png')
: item.course === '活动' : item.type === 9
? require('../../assets/images/leveladd/huo.png') ? require('../../assets/images/leveladd/huo.png')
: item.course === '测评' : item.type === 10
? require('../../assets/images/leveladd/ce.png') ? require('../../assets/images/leveladd/ce.png')
: item.course === '调研' : item.type === 11
? require('../../assets/images/leveladd/diao.png') ? require('../../assets/images/leveladd/diao.png')
: item.course === '投票' : item.type === 12
? require('../../assets/images/leveladd/tou.png') ? require('../../assets/images/leveladd/tou.png')
: item.course === '评估' : item.type === 13
? require('../../assets/images/leveladd/diao.png')
: item.course === '项目'
? require('../../assets/images/leveladd/xiangmu.png') ? require('../../assets/images/leveladd/xiangmu.png')
: null : null"
" /> />
</div> </div>
<div class="text1">{{ item.course }}</div> <div class="text1">{{ item.course }}</div>
<div class="text2">{{ item.name }}</div> <div class="text2">{{ item.name }}</div>
@@ -128,7 +125,6 @@
</div> </div>
<div class="altext">{{ item.complete }}</div> <div class="altext">{{ item.complete }}</div>
</div> </div>
</div> </div>
</a-collapse-panel> </a-collapse-panel>
</a-collapse> </a-collapse>
@@ -143,9 +139,10 @@
</template> </template>
<script> <script>
import { reactive, toRefs } from "vue"; import {reactive, toRefs, watch} from "vue";
import ProMess from "./ProMess.vue"; import ProMess from "./ProMess.vue";
import { studentProcess, studentRank } from "../../api/indexProjStu"; import {projectStudentRank, projectStudentProcess} from "@/api/indexProjStu";
export default { export default {
name: "SeeStu", name: "SeeStu",
components: {ProMess}, components: {ProMess},
@@ -166,213 +163,40 @@ export default {
setup(props, ctx) { setup(props, ctx) {
const state = reactive({ const state = reactive({
loading: false, loading: false,
userName: null, //用户名 info: {},
deptName: null, //部门
jobName: null, //岗位
certCnt: null, //已修证书
name: null, //路径图名称
totalReqCnt: null, //累计必修数
currentReqCnt: null, //完成必修数
Provisible: false, Provisible: false,
showDown: true,
showDown1: false,
rank: { total: 1, current: 1 },
sort: null,
stageList: [
// {
// stageName: "阶段1腾飞班阶段1",
// stageId: 1,
// taskList: [
// {
// course: "在线",
// name: "如何成为一个产品经理",
// complete: "已完成",
// },
// {
// course: "直播",
// name: "管理直播课",
// complete: "已完成",
// },
// {
// course: "面授",
// name: "管理面授课",
// complete: "未完成",
// },
// {
// course: "活动",
// name: "管理活动",
// complete: "未完成",
// },
// {
// course: "作业",
// name: "管理者作业",
// complete: "未完成",
// },
// ],
// },
],
stageListActive: 0, stageListActive: 0,
rank: {total: 0, current: 0, finishCompulsoryNum: 0, totalCompulsoryNum: 0, certNum: 0},
}); });
watch([() => props.checkStuId, () => props.projectId], () => {
getStuRank()
check()
})
const closeDrawer = () => { const closeDrawer = () => {
ctx.emit("update:Seevisible", false); ctx.emit("update:Seevisible", false);
}; };
const getStuRank = () => { const getStuRank = () => {
studentRank({ projectStudentRank({projectId: props.projectId, studentId: props.checkStuId}).then(res => state.rank = res.data.data)
projectId: props.projectId,
studentId: props.checkStuId,
type: 1
}).then(res => {
state.rank = res.data.data
})
} }
const showProMess = () => { const showProMess = () => {
state.Provisible = true; state.Provisible = true;
}; };
const afterVisibleChange = (bool) => {
console.log("state", bool);
if (bool == true) {
check();
getStuRank()
}
};
const changeDown = () => {
state.showDown = !state.showDown;
};
const changeDown1 = () => {
state.showDown1 = !state.showDown1;
};
const taskList = (tableData) => {
let data = tableData;
console.log('我排序了吗--------------------------》', data)
let array = [];
if (data != undefined) {
data.map((value) => {
console.log('我排序了吗---------value-----------------》', value)
let obj = {
course:
value.type == 1
? "在线"
: value.type == 2
? "面授"
: value.type == 3
? "案例"
: value.type == 4
? "作业"
: value.type == 5
? "考试"
: value.type == 6
? "直播"
: value.type == 7
? "外链"
: value.type == 8
? "讨论"
: value.type == 9
? "活动"
: value.type == 10
? "测评"
: value.type == 11
? "评估"
: value.type == 12
? "投票"
: "-",
name: value.name,
projectId: value.projectId,
complete:
value.status == -1
? "未开始"
: value.status == 1
? "已完成"
: value.status == 0
? "未完成"
: "-",
flag: value.flag == 0 ? "选修" : "必修",
currentRatio: value.currentRatio,
routerTaskId: value.routerTaskId,
};
console.log('我排序了吗---------obj-----------------》', obj)
array.push(obj);
});
array.sort((a, b) => { return a.projectId - b.projectId })
}
console.log('我排序了吗-----------1---------------》', array)
return array;
};
const setStageList = (tableData) => {
let data = tableData;
console.log("查看了学员1", data);
let array = [];
//无阶段任务
if (data?.length == 1 && data[0].id == 0) {
console.log("无阶段任务", data);
data.map((value) => {
let obj = {
stageName: "无阶段任务",
stageId: 0,
remark: value.remark,
taskList: taskList(value.taskList),
};
array.push(obj);
});
} else { //有阶段
console.log("有阶段", data);
data.map((value) => {
console.log("有阶段value", value);
let obj = {
stageName: value.name,
stageId: value.id,
remark: value.remark,
taskList: taskList(value.taskList),
};
if (value.id > 0) {
array.push(obj);
}
console.log("有阶段array", array);
});
}
state.stageList = array;
};
const check = () => { const check = () => {
state.loading = true state.loading = true
let obj = { projectStudentProcess({projectId: props.projectId, userId: props.checkStuId}).then((res) => {
projectId: props.projectId,
studentId: props.checkStuId,
};
studentProcess(obj).then((res) => {
state.loading = false state.loading = false
console.log("查看了学员", res.data); state.info = res.data.data;
let result = res.data.data; })
console.log("查看了学员result:", result);
state.userName = result.projectInfo.name;
state.deptName = result.projectInfo.deptName;
state.jobName = result.projectInfo.jobName;
state.certCnt = result.projectInfo.certCnt == null ? 0 : result.projectInfo.certCnt;
state.name = result.projectInfo.name;
state.currentReqCnt = result.projectInfo.currentReqCnt;
state.totalReqCnt = result.projectInfo.totalReqCnt;
if (result.stageList.length > 0) {
state.sort = result.stageList[0].sort;
} }
setStageList(result.stageList);
});
};
return { return {
...toRefs(state), ...toRefs(state),
afterVisibleChange,
closeDrawer, closeDrawer,
showProMess, showProMess,
changeDown,
changeDown1,
check,
setStageList,
taskList,
// change,
}; };
}, },
}; };

View File

@@ -195,7 +195,7 @@ export default {
console.log('我是传递过来的参数2', props.basicdata) console.log('我是传递过来的参数2', props.basicdata)
api.QueryAssessmentDetail({ api.QueryAssessmentDetail({
"assessmentSubmitId": props.datasource.assessmentSubmitId, "assessmentSubmitId": props.datasource.assessmentSubmitId,
"courseId": props.basicdata.assessmentId, "courseId": props.basicdata.id,
"studentId": props.datasource.studentId "studentId": props.datasource.studentId
}).then(res=>{ }).then(res=>{
console.log(res) console.log(res)

View File

@@ -128,6 +128,8 @@
</div>--> </div>-->
</div> </div>
</a-drawer> </a-drawer>
<view-assess v-model:Assessvisible="Assessvisible" :datasource="evalDataSource" :evalName="datasource.info.assessmentName"
:basicdata="datasource.info" />
</template> </template>
<script> <script>
@@ -135,9 +137,11 @@ import { toRefs, reactive, onMounted, onUnmounted } from "vue";
import { message } from "ant-design-vue"; import { message } from "ant-design-vue";
// import * as api from "../../../api/index"; // import * as api from "../../../api/index";
import * as api from "../../../api/indexTaskManage"; import * as api from "../../../api/indexTaskManage";
import ViewAssess from "../ViewAssess";
export default { export default {
name: "ProjectOnlineManage", name: "ProjectOnlineManage",
components: { ViewAssess },
props: { props: {
Tvisible: { Tvisible: {
type: Boolean, type: Boolean,
@@ -195,6 +199,8 @@ export default {
], ],
tabledata: [], tabledata: [],
tableDataTotalLoading: true, // 表格loading加载配置 tableDataTotalLoading: true, // 表格loading加载配置
evalDataSource: "",
Assessvisible: false
}); });
const tableDataFunc = () => { const tableDataFunc = () => {
const columns = [ const columns = [
@@ -309,9 +315,42 @@ export default {
}, },
}, },
]; ];
let obj = {
title: "操作",
dataIndex: "finishStatus",
key: "finishStatus",
width: 60,
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<a
onClick={()=>{
console.log('iyiy', text.record)
showassess(text.record);
}}>查看</a>
</div>
);
},
}
{/* 评估查看操作 */}
if(props.datasource.type==11){
columns.push(obj)
}
return columns; return columns;
}; };
{/* 查看评估弹框 */}
const showassess = (data) => {
state.evalDataSource = data;
state.Assessvisible = true;
};
const closeDrawer = () => { const closeDrawer = () => {
ctx.emit("update:Tvisible", false); ctx.emit("update:Tvisible", false);
state.currentPage = 1; state.currentPage = 1;
@@ -461,6 +500,7 @@ export default {
return { return {
...toRefs(state), ...toRefs(state),
selectProjectName, selectProjectName,
showassess,
closeDrawer, closeDrawer,
afterVisibleChange, afterVisibleChange,
tableDataFunc, tableDataFunc,

View File

@@ -377,7 +377,7 @@
onClick={ onClick={
() => { () => {
{/* 当前学员 用来查看学员详情 */} {/* 当前学员 用来查看学员详情 */}
state.routerId = value.record.routerId; state.routerId = value.record.pid;
state.studentId = value.record.studentId; state.studentId = value.record.studentId;
state.CheckStuvisible = true; state.CheckStuvisible = true;
console.log(value); console.log(value);

View File

@@ -59,6 +59,7 @@ const props = defineProps({
}); });
const option = computed(() => { const option = computed(() => {
debugger
console.log("props.groupList", props.groupList); console.log("props.groupList", props.groupList);
return props.groupList.map((e) => ({ return props.groupList.map((e) => ({
label: e.groupName, label: e.groupName,

View File

@@ -374,7 +374,6 @@ const projectRowSelection = computed(() => ({
preserveSelectedRowKeys: true, preserveSelectedRowKeys: true,
})); }));
const getStu = () => { const getStu = () => {
debugger
let obj = { let obj = {
studentName: proStudentName.value, studentName: proStudentName.value,
pageNo: procurrentPage.value, pageNo: procurrentPage.value,
@@ -394,6 +393,7 @@ const getStu = () => {
id: value.id, id: value.id,
realName: value.studentName, realName: value.studentName,
userNo: value.studentId, userNo: value.studentId,
isLeader: value.isLeader,
orgName: value.studentOrgName ? value.studentOrgName : "-", orgName: value.studentOrgName ? value.studentOrgName : "-",
departName: value.studentDepartName ? value.studentDepartName : "-", departName: value.studentDepartName ? value.studentDepartName : "-",
}; };
@@ -760,9 +760,14 @@ const submitAuth = () => {
function handleStageOk() { function handleStageOk() {
// 判断添加人数是否已超过限制人数 限制 = 本次添加的人 + 原有的人 // 判断添加人数是否已超过限制人数 限制 = 本次添加的人 + 原有的人
if (props.type === 1) { if (props.type === 1) {
if (props.groupMemberCount < selectsData.value.studentList.length + props.groupMemberNumber) { if (props.groupMemberCount < selectsData.value.projectMemberList.length + Number(props.groupMemberNumber)) {
return message.warning("添加小组学员超过最大值"); return message.warning("添加小组学员超过最大值");
} }
// 判断是否是组长,组长不能添加
const leaderArray = selectsData.value.projectMemberList.filter(item => item.isLeader === '1');
if (leaderArray.length > 0) {
return message.warning("当前选学员"+leaderArray[0].realName+"已在其他小组为小组长,请勿重复选择。");
}
// 对选中的人员进行判断是否已经分组了 // 对选中的人员进行判断是否已经分组了
let haveGroupNum = selectsData.value.projectMemberList.filter(item => item.groupId !== null); let haveGroupNum = selectsData.value.projectMemberList.filter(item => item.groupId !== null);
if (haveGroupNum.length > 0) { if (haveGroupNum.length > 0) {

View File

@@ -858,7 +858,7 @@
</div> </div>
</a-modal> </a-modal>
<!--开课页面 --> <!--开课页面 -->
<!--新建开课页面 cstm_hs --> <!--新建开课页面 -->
<a-modal <a-modal
v-model:visible="cstm_hs" v-model:visible="cstm_hs"
style="margin-top: 400px" style="margin-top: 400px"
@@ -965,48 +965,6 @@
</div> </div>
</div> </div>
<div class="cstm_items">
<div class="signbox">
<span style="margin-right: 3px">考勤设置:</span>
</div>
<div style="display: flex; align-items: center">
<div style="margin-right: 10px">签到</div>
<div
style="display: flex; align-items: center; margin-right: 20px"
>
<span>开始前:</span>
<a-input-number
:min="0"
:max="300"
:precision="0"
style="
width: 100px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="beforeValue"
></a-input-number>
<span style="color: #999999; margin-left: 8px">分钟</span>
</div>
<div style="display: flex; align-items: center">
<span>开始后:</span>
<a-input-number
:min="0"
:max="300"
:precision="0"
style="
width: 100px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="afterStartValue"
></a-input-number>
<span style="color: #999999; margin-left: 8px">分钟</span>
</div>
</div>
</div>
<div class="cstm_items"> <div class="cstm_items">
<div class="signbox"> <div class="signbox">
<span style="margin-right: 3px">报名设置</span> <span style="margin-right: 3px">报名设置</span>
@@ -1684,13 +1642,6 @@ import dayjs from "dayjs";
//列表表格 //列表表格
const columns1 = [ const columns1 = [
{
title: "课程编号",
width: 130,
dataIndex: "offcourseNumber",
key: "offcourseNumber",
align: "center",
},
{ {
title: "名称", title: "名称",
width: 400, width: 400,
@@ -1702,7 +1653,13 @@ const columns1 = [
return text ? text : "-"; return text ? text : "-";
}, },
}, },
{
title: "课程编号",
width: 130,
dataIndex: "offcourseNumber",
key: "offcourseNumber",
align: "center",
},
{ {
title: "内容分类", title: "内容分类",
width: 130, width: 130,
@@ -1781,16 +1738,16 @@ const columns1 = [
return text ? text : "0"; return text ? text : "0";
}, },
}, },
{ // {
title: "评分", // title: "评分",
width: 130, // width: 130,
dataIndex: "score", // dataIndex: "grade",
key: "5", // key: "5",
align: "center", // align: "center",
customRender: ({ text }) => { // customRender: ({ text }) => {
return text ? text : "0"; // return text ? text : "0";
}, // },
}, // },
{ {
title: "状态", title: "状态",
width: 130, width: 130,
@@ -2660,8 +2617,6 @@ export default defineComponent({
xjkkinputV2: "", xjkkinputV2: "",
xjkkinputV3: "", xjkkinputV3: "",
xjkkinputV4: null, xjkkinputV4: null,
beforeValue: null,
afterStartValue: null,
//开课学员管理 //开课学员管理
xygl_inputV1: "", xygl_inputV1: "",
//录入成绩 //录入成绩
@@ -3119,7 +3074,6 @@ export default defineComponent({
pubtime: "publishTime", pubtime: "publishTime",
kkty: "status", kkty: "status",
offcourseId: "offcourseId", offcourseId: "offcourseId",
score: "score",
}, },
true true
); );
@@ -3685,6 +3639,7 @@ export default defineComponent({
state.of_hs = false; state.of_hs = false;
// state.ft_hs = true; // state.ft_hs = true;
CourseModalRef.value.visibleOpen(null, state.xzinputV1); CourseModalRef.value.visibleOpen(null, state.xzinputV1);
state.valueE1 = ""; state.valueE1 = "";
state.teacher = ""; state.teacher = "";
state.teacherName = ""; state.teacherName = "";
@@ -3780,8 +3735,7 @@ export default defineComponent({
state.assessmentId = null; state.assessmentId = null;
state.assessmentName = ""; state.assessmentName = "";
state.EditWorkId = null; state.EditWorkId = null;
state.beforeValue = null;
state.afterStartValue = null;
removePG(); removePG();
}; };
//保存开课 //保存开课
@@ -3847,12 +3801,18 @@ export default defineComponent({
console.log("state.addLoading ", state.addLoading); console.log("state.addLoading ", state.addLoading);
} }
state.addLoading = true; state.addLoading = true;
editPlan(postData).then(() => { editPlan(postData)
.then(() => {
getTableDate3(); getTableDate3();
handleCancelStu(); handleCancelStu();
rest(); rest();
state.addLoading = false; state.addLoading = false;
})
.catch((err) => {
state.loading = false;
console.log(err);
}); });
state.cstm_hs = false;
}; };
//编辑开课 //编辑开课

View File

@@ -2105,7 +2105,6 @@ export default {
pid: state.routerId, pid: state.routerId,
type: 2, type: 2,
}; };
debugger
getStuPage(stuobj) getStuPage(stuobj)
.then((res) => { .then((res) => {
console.log("获取学员列表", res.data.data.total); console.log("获取学员列表", res.data.data.total);

View File

@@ -217,6 +217,23 @@
<div v-if="hasTask"> <div v-if="hasTask">
<div class="onerow"> <div class="onerow">
<div class="taskmain">项目概览</div> <div class="taskmain">项目概览</div>
<a-popover title="项目信息">
<template #content>
<div class="setc_name"><span>项目名称:</span></div>
<div class="setc_main">
<span style="color: #999999">{{ name }}</span>
</div>
<div class="setc_name"><span>项目说明:</span></div>
<div class="setc_main">
<span style="color: #999999">{{ remark }}</span>
</div>
</template>
<div style="display:flex;justify-content: flex-start;margin-left: 10px;padding: 6px;">
<div class="script" style="border: 1px solid #40a9ff;padding: 2px;">
<span style="font-size: 16px; color: #40a9ff">项目说明</span>
</div>
</div>
</a-popover>
</div> </div>
<div class="second" style="margin-top: 0"> <div class="second" style="margin-top: 0">
<div class="nubbox"> <div class="nubbox">
@@ -3212,6 +3229,7 @@ export default {
state.total = res.data.data.total; state.total = res.data.data.total;
let arr = res.data.data.rows; let arr = res.data.data.rows;
getTableDataList(arr); getTableDataList(arr);
//
state.loading = false; state.loading = false;
}) })
.catch((err) => { .catch((err) => {
@@ -3285,7 +3303,10 @@ export default {
pageSize: 10, pageSize: 10,
projectId: state.projectId, projectId: state.projectId,
}; };
getGroupList(objf).then((res) => { state.groupPageList = res.data.data.rows }) getGroupList(objf).then((res) => {
state.groupPageList = res.data.data.rows;
setGroupList(res.data.data.rows)
})
}; };
//删除小组 //删除小组
const deleteGroupBtn = (projectGroupId) => { const deleteGroupBtn = (projectGroupId) => {
@@ -3298,13 +3319,17 @@ export default {
const createGroup = async () => { const createGroup = async () => {
console.log("state.groupPageList" + state.groupPageList) console.log("state.groupPageList" + state.groupPageList)
const d = state.groupPageList.filter(item => item.leaderId === state.groupInfo.leaderId); const d = state.groupPageList.filter(item => item.leaderId === state.groupInfo.leaderId);
const id = state.groupInfo.id;
// 过滤掉编辑时候,只修改了组员最大值时候
if(id !== d[0].id) {
if (d.length > 0 ) { if (d.length > 0 ) {
return message.warn(d[0].leaderName + "已是小组长,请重新选择"); return message.warn(d[0].leaderName + "已是小组长,请重新选择");
} }
const id = state.groupInfo.id }
await editGroup({ ...state.groupInfo, projectId: state.projectId }) await editGroup({ ...state.groupInfo, projectId: state.projectId })
message.success(id ? '小组编辑成功' : "小组创建成功"); message.success(id ? '小组编辑成功' : "小组创建成功");
getGroup(); getGroup();
console.log("state.groupPageList:")
getStu(); getStu();
}; };
//搜索小组重置 //搜索小组重置