Files
fe-manage/src/components/drawers/project/ProjectExternalExamManage.vue
2023-02-10 19:20:54 +08:00

733 lines
20 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- 外部考试 -->
<template>
<a-drawer
v-if="TMvisibleExternal"
:visible="TMvisibleExternal"
class="drawerStyle ProjectExternalExamManage"
placement="right"
width="80%"
@after-visible-change="afterVisibleChange"
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">考试{{ title }}</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div class="main">
<!-- <div class="endtime">起止时间{{datasource.startTime}} {{datasource.endTime}}</div> -->
<div class="search">
<div class="namecon" style="margin-right: 30px">
<div class="name">姓名</div>
<a-input
v-model:value="name"
style="width: 200px; height: 40px; border-radius: 8px"
placeholder="请输入姓名"
/>
</div>
<div v-if="datasource.type !==5" class="namecon" style="margin-right: 50px">
<div class="name">任务状态</div>
<div class="select">
<a-select
v-model:value="projectName"
style="width: 170px"
placeholder="请选择"
:options="projectNameList"
@change="selectProjectName"
allowClear
></a-select>
</div>
</div>
<div class="btns">
<div
class="btn btn1"
style="margin-right: 20px"
@click="searchTableData"
>
<div class="img1"></div>
<div class="wz">搜索</div>
</div>
<div class="btn btn2" @click="reseatTableData">
<div class="img2"></div>
<div class="wz">重置</div>
</div>
</div>
</div>
<div class="btnss" style="margin-top: 20px">
<!--
<div class="btn btn1" @click="godie" style="margin-right: 20px">
<div class="img1"></div>
<div class="wz">催促考试</div>
</div>-->
<div class="btn btn2" @click="exportData">
<div class="img2"></div>
<div class="wz">导出数据</div>
</div>
<div class="btn btn2" @click="showEScoreModal">
<div class="wz">导入成绩</div>
</div>
</div>
<!-- <div class="line">
<div class="inline">
<div class="left">
<div class="img"></div>
<div class="text" style="margin-left: 10px">已选择</div>
<div class="text2">{{ selectedRowKeys.length }}</div>
<div class="text"></div>
<div class="text3">列表选项总计</div>
<div class="text4">{{ tableDataTotal }}</div>
</div>
<div class="right" @click="clearLine">清空</div>
</div>
</div> -->
<div class="tableBox" style="margin-top: 20px; margin-bottom: 100px">
<a-table
style="border: 1px solid #f2f6fe"
:columns="tablecolumns"
:data-source="tabledata"
:loading="loadingData"
:scroll="{ x: 900 }"
:pagination="false"
/>
<div class="pa">
<a-pagination
:showSizeChanger="false"
showQuickJumper="true"
hideOnSinglePage="true"
:pageSize="pageSize"
:current="currentPage"
:total="tableDataTotal"
class="pagination"
v-if="tableDataTotal > 10"
@change="changePaginationStu"
/>
</div>
</div>
</div>
<!-- <div class="btnn">
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="closeDrawer">确定</button>
</div> -->
</div>
<!-- 导出成绩抽屉 -->
<ExportAchievement
@closeDraw="closeDraw"
v-model:eScorevisibleExternalExternal="eScorevisibleExternalExternal"
:type="2"
:targetId="datasource.projectId"
:taskId="datasource.courseId"
:chapterId="datasource.stageId" />
</a-drawer>
</template>
<script>
import { toRefs, reactive } from "vue";
import { message } from "ant-design-vue";
import ExportAchievement from "../ExportAchievement.vue";
import * as api from '../../../api/indexTaskManage';
export default {
name: "ProjectExternalExamManage",
components: {
ExportAchievement,
},
props: {
TMvisibleExternal: {
type: Boolean,
default: false,
},
title: {
type: String,
default: "",
},
projectTaskId: {
type: Number,
default: null,
},
datasource: {
type: Object,
default: function () {
return {};
},
},
},
setup(props, ctx) {
const state = reactive({
name: "",
open: false,
projectName: undefined,
projectNameList: [
{
id: 1,
value: "0",
label: "未开始",
},
{
id: 2,
value: "1",
label: "进行中",
},
{
id: 3,
value: "9",
label: "已完成",
},
],
selectedRowKeys: [],
eScorevisibleExternalExternal: false, //导入成绩抽屉
pageNo: 1,
pageSize: 10,
currentPage: 1,
tableDataTotal: 0,
tabledata: [],
tablecolumns: [
{
title: "工号",
dataIndex: "studentCode",
key: "studentCode",
width: 120,
align: "center",
className: "h head",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentCode?text.record.studentCode:"-"}</span>
</div>
);
},
},
{
title: "姓名",
dataIndex: "studentName",
key: "studentName",
width: 50,
align: "center",
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentName?text.record.studentName:"-"}</span>
</div>
);
},
},
{
title: "所在部门",
dataIndex: "studentDepartName",
key: "studentDepartName",
width: 60,
align: "center",
ellipsis: true,
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentDepartName?text.record.studentDepartName:"-"}</span>
</div>
);
},
},
{
title: "所在岗位",
dataIndex: "studentJobName",
key: "studentJobName",
width: 60,
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentJobName?text.record.studentJobName:"-"}</span>
</div>
);
},
},
{
title: "学员关卡",
dataIndex: "currentStageId",
key: "currentStageId",
width: 60,
align: "center",
ellipsis: true,
className: "h",
customRender: () => {
return (
<div class="racona">
<span> {props.levelName}</span>
</div>
);
},
},
{
title: "考试次数",
dataIndex: "testNumber",
key: "testNumber",
width: 60,
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.testNumber?text.record.testNumber:"-"}</span>
</div>
);
},
},
{
title: "成绩",
dataIndex: "score",
key: "score",
width: 60,
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.score?text.record.score:"-"}</span>
</div>
);
},
},
{
title: "完成时间",
dataIndex: "finishedTime",
key: "finishedTime",
width: 60,
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.finishedTime?text.record.finishedTime:"-"}</span>
</div>
);
},
},
{
title: "任务状态",
dataIndex: "status",
key: "status",
width: 60,
align: "center",
ellipsis: true,
className: "h",
customRender: ({record:{status}}) => ({0:'未开始',1:'进行中',null:'进行中',2:'已完成'}[status] || '未开始'),
},
],
loadingData: true
});
const closeDrawer = () => {
ctx.emit("update:TMvisibleExternal", false);
state.name = "";
state.projectName = undefined;
state.selectedRowKeys = [];
state.currentPage = 1;
state.tabledata = [];
};
const afterVisibleChange = (bol) => {
if (bol == true) {
state.loadingData = true;
console.log(props.datasource)
getData();
}
};
const selectProjectName = (value) => {
state.projectName = value;
};
const onSelectChange = (selectedRowKeys) => {
console.log('表格前方选中项目', selectedRowKeys)
if (selectedRowKeys.length > 2) {
return;
}
state.selectedRowKeys = selectedRowKeys;
};
//催促学员学习
const godie = () => {
message.destroy();
message.success("催促" + props.title + "成功");
};
//导入成绩
const showEScoreModal = () => {
state.eScorevisibleExternalExternal = true;
};
//表头清空
const clearLine = () => {
state.selectedRowKeys = [];
};
// 获取数据
function getData() {
state.loadingData = true;
api.QueryExternalExamManageDetail({
chapterId: props.datasource.stageId,
pageNo: state.currentPage,
pageSize: state.pageSize,
status: state.projectName,
studentName: state.name,
targetId: props.datasource.projectId,
taskId: props.datasource.projectTaskId,
type: 2,
}).then(res=>{
console.log(res)
state.tabledata = res.data.data.records;
state.tableDataTotal = res.data.data.total;
state.loadingData = false;
})
}
// 搜索
function searchTableData() {
state.loadingData = true;
getData();
}
// 重置
function reseatTableData() {
state.loadingData = true;
state.currentPage = 1;
state.name = '';
state.projectName = undefined;
getData();
}
//分页
const changePaginationStu = (page) => {
state.loadingData = true;
state.currentPage = page;
getData();
};
{/* 导出数据 */}
function exportData() {
window.open(`${process.env.VUE_APP_BASE_API}/admin/external/exam/manage/exportExternalExam?chapterId=${props.datasource.stageId}&type=${2}&targetId=${props.datasource.projectId}&taskId=${props.datasource.projectTaskId}`)
}
const closeDraw = (e) => {
console.log('我关闭了导入成绩弹框吗', e)
getData();
}
return {
...toRefs(state),
selectProjectName,
closeDrawer,
afterVisibleChange,
onSelectChange,
godie,
clearLine,
showEScoreModal,
searchTableData,
reseatTableData,
changePaginationStu,
exportData,
closeDraw
};
},
};
</script>
<style lang="scss">
.ProjectExternalExamManage {
.drawerMain {
min-width: 550px;
margin: 0px 32px 0px 32px;
overflow-x: auto;
display: flex;
flex-direction: column;
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
}
}
.main {
width: 100%;
height: 100%;
overflow: auto;
padding-right: 10px;
.endtime {
font-size: 16px;
font-weight: 500;
color: #333333;
}
.search {
width: 100%;
display: flex;
flex-wrap: wrap;
margin-top: 20px;
.namecon {
display: flex;
flex-wrap: nowrap;
margin-bottom: 10px;
.name {
margin-top: 8px;
}
}
.btns {
display: flex;
flex-wrap: nowrap;
.btn {
cursor: pointer;
width: 100px;
height: 40px;
border-radius: 8px;
display: flex;
justify-content: center;
align-items: center;
.img1 {
width: 15px;
height: 17px;
background-image: url(../../../assets/images/courseManage/search0.png);
background-size: 100% 100%;
margin-right: 7px;
}
.img2 {
width: 16px;
height: 18px;
background-image: url(../../../assets/images/courseManage/reset1.png);
background-size: 100% 100%;
margin-right: 7px;
}
}
.btn1 {
background: #4ea6ff;
color: #ffffff;
}
.btn2 {
background: #ffffff;
color: #4ea6ff;
border: 1px solid #4ea6ff;
}
}
}
.btnss {
display: flex;
flex-wrap: nowrap;
.btn {
cursor: pointer;
width: 130px;
height: 40px;
border-radius: 8px;
display: flex;
justify-content: center;
align-items: center;
.img1 {
width: 15px;
height: 17px;
background-image: url(../../../assets/images/basicinfo/call.png);
background-size: 100% 100%;
margin-right: 7px;
}
.img2 {
width: 17px;
height: 16px;
background-image: url(../../../assets/images/coursewareManage/export.png);
background-size: 100% 100%;
margin-right: 7px;
}
}
.btn1 {
background: #4ea6ff;
color: #ffffff;
}
.btn2 {
background: #ffffff;
margin-right: 20px;
color: #4ea6ff;
border: 1px solid #4ea6ff;
}
}
.line {
width: 100%;
height: 40px;
background-color: #e9f6fe;
display: flex;
justify-content: center;
align-items: center;
margin-top: 20px;
border: 1px solid #c3e6fc;
.inline {
width: 95%;
height: 100%;
display: flex;
justify-content: space-between;
.left {
height: 100%;
display: flex;
align-items: center;
.img {
width: 14px;
height: 15px;
background-image: url(../../../assets/images/leveladd/gan.png);
background-size: 100% 100%;
}
.text {
color: #999ba3;
}
.text2 {
color: #4ea6ff;
margin-left: 5px;
margin-right: 5px;
}
.text3 {
color: #999ba3;
margin-left: 20px;
}
}
.right {
font-size: 14px;
font-weight: 400;
color: #387df7;
height: 100%;
display: flex;
align-items: center;
cursor: pointer;
}
}
}
.tableBox {
.ant-table-selection-column {
padding: 0px !important;
}
.ant-pagination-item,
.ant-pagination-prev,
.ant-pagination-next,
.ant-pagination-options {
margin-bottom: 10px;
}
.ant-table-thead > tr > th {
background-color: rgba(239, 244, 252, 1) !important;
}
.ant-table-selection-column {
padding: 0 !important;
}
th.h {
background-color: #eff4fc !important;
}
.head {
padding-left: 0px !important;
}
.ant-table-tbody
> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td {
background: #f6f9fd;
}
.studentopea1 {
font-size: 14px;
font-weight: 400;
color: #387df7;
line-height: 22px;
padding-right: 8px;
border-right: 1px solid #e9e9e9;
cursor: pointer;
}
.studentopea2 {
font-size: 14px;
font-weight: 400;
color: #387df7;
line-height: 22px;
padding-right: 8px;
padding-left: 8px;
border-right: 1px solid #e9e9e9;
cursor: pointer;
}
.pa {
margin-top: 15px;
width: 100%;
display: flex;
justify-content: center;
}
}
}
.btnn {
height: 72px;
width: 100%;
position: absolute;
background-color: #fff;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn1 {
width: 100px;
height: 40px;
border: 1px solid #4ea6ff;
border-radius: 8px;
color: #4ea6ff;
background-color: #fff;
cursor: pointer;
}
.btn2 {
cursor: pointer;
width: 100px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-left: 15px;
color: #fff;
}
}
}
}
</style>