Files
fe-manage/src/views/lecturer/ExternalTeaching.vue
2025-02-21 16:34:09 +08:00

1433 lines
46 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>
<div>
<!-- 搜索框及按钮 -->
<div class="filter">
<a-form layout="inline" style="min-width: 1056px;">
<a-form-item class="select">
<!-- v-model:value="searchParam.name" -->
<!-- <a-input v-model:value="searchParam.userNo" style="width: 276px; height: 40px; border-radius: 8px"
placeholder="请输入工号/讲师姓名进行检索" allowClear showSearch>
</a-input> -->
<a-input style="width: 235px; height: 40px; border-radius: 8px" placeholder="请输入姓名进行检索" showSearch allowClear
v-model:value="searchParam.name" v-on:keydown.enter="enterPressHadlerSearch"></a-input>
</a-form-item>
<a-form-item class="select">
<a-select style="width: 235px ;margin-bottom:20px" v-model:value="searchParam.supplier" placeholder="请输入供应商"
:options="supperList" allowClear v-on:keydown.enter="enterPressHadlerSearch" showSearch>
</a-select>
</a-form-item>
<a-form-item class="select">
<a-input v-model:value="searchParam.courseName" style="width: 235px; height: 40px; border-radius: 8px"
placeholder="请输入课程名称进行搜索" allowClear showSearch v-on:keydown.enter="enterPressHadlerSearch">
</a-input>
</a-form-item>
<a-form-item class="select ">
<!-- <div class="select addTimeBox">
<div class="addTime">授课日期</div> -->
<a-range-picker v-model:value="searchdate" style="width: 340px !important;" format="YYYY-MM-DD"
valueFormat="YYYY-MM-DD" separator="至" :placeholder="['授课日期开始时间', '授课日期结束时间']
" v-on:keydown.enter="enterPressHadlerSearch" />
<!-- </div> -->
</a-form-item>
<a-form-item class="select">
<a-select style="width: 200px ;margin-bottom:20px" v-model:value="searchParam.createFrom" placeholder="录入类型"
:options="entryTypeList" allowClear v-on:keydown.enter="enterPressHadlerSearch">
</a-select>
</a-form-item>
<a-form-item class="select">
<a-tree-select style="width: 235px" :fieldNames="{
children: 'children',
label: 'name',
value: 'code',
}" allow-clear :getPopupContainer="triggerNode => triggerNode.parentNode || document.body"
v-model:value="searchParam.courseTypeId" show-search
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" placeholder="请选择内容分类" tree-default-expand-all
:tree-data="sysTypeOptions" v-on:keydown.enter="enterPressHadlerSearch">
</a-tree-select>
</a-form-item>
<a-form-item class="select">
<a-select style="width: 200px" v-model:value="searchParam.courseStatus" placeholder="开课状态"
:options="AuthenticationStatusList" allowClear v-on:keydown.enter="enterPressHadlerSearch">
</a-select>
</a-form-item>
<div style="display: flex; margin-bottom: 20px">
<a-button @click="searchSubmit()" type="primary" class="resetbtn">查询 </a-button>
<!-- <div class="btn btn1" @click="searchReset" style="background:rgba(64, 158, 255, 0);" > -->
<!-- <div class="search"></div> -->
<a-button class="resetbtn " @click="searchReset">重置</a-button>
<!-- 更多筛选-->
<!-- <div v-if="moreid == 1">
<a-button @click="handlemoreid()" class="moreidbtn" type="text"> 展开
<RightOutlined />
</a-button>
</div>
<div v-if="moreid == 2">
<a-button @click="handlemoreid()" class="moreidbtn"> 返回
<UpOutlined />
</a-button>
</div> -->
</div>
<div style="width:100%"></div>
</a-form>
<div style="width: 100%;"></div>
<div style="display: flex; margin-bottom: 20px">
<a-button v-if="checkMenu('lecturerRecordsAdd')" @click="addTeacher()" type="primary" class="langbtn">
<div class="search"></div> 添加授课记录
</a-button>
<!-- <div style="margin-left: 20px ;">
<a-button @click="addTeacher()" class="langbtn">
<UploadOutlined /> 一键生成讲师费
</a-button>
</div> -->
<a-button v-if="checkMenu('lecturerRecordsImport')" class="resetbtn" @click="handleImport()">
<DownloadOutlined /> 导入
</a-button>
<a-button v-if="checkMenu('lecturerRecordsExport')" @click="handleExport()" class="resetbtn">
<UploadOutlined /> 导出
</a-button>
</div>
<!-- 表格 -->
<div>
<a-table :header-cell-style="{ 'text-align': 'center' }" style="border: 1px solid #f2f6fe" :columns="columns"
:scroll="{ x: 1500 }" :data-source="tableData" :loading="tableLoading" @expand="expandTable"
:pagination="false">
<template #bodyCell="{ record, column }">
<template v-if="column.key === 'operation'">
<a-space>
<a-button type="link" @click="() => handleLook(record, String(record.courseform))">查看</a-button>
<a-button type="link" @click="() => handleModify(record, String(record.courseform))"
v-if="record.createFrom == 1 && checkMenu('lecturerRecordsEdit')">编辑</a-button>
<a-button v-if="record.isSuperPermission === 'true' && checkMenu('lecturerRecordsDel')" type="link"
@click="() => deleteModal(record, String(record.courseform))">删除</a-button>
</a-space>
</template>
</template>
</a-table>
</div>
</div>
<div class="tableBox ">
<div class="pa">
<a-pagination v-if="tableDataTotal > 10" :showSizeChanger="true" :showQuickJumper="false"
:hideOnSinglePage="false" :pageSize="searchParam.pageSize" :current="searchParam.pageNo"
:total="tableDataTotal" class="pagination" @change="changePagination" />
<!-- :show-total="total => `共 ${total} 条数据`" -->
</div>
</div>
<!-- 弹窗组件 -->
<a-drawer class="largeDrawerInside" v-model:visible="teacherdialog" placement="right" :maskClosable="false"
:closable="false" width="60%" :title="false">
<div style="padding:24px;">
<div class="headers" style="margin-top:-24px;">
<div class="headerTitle">{{ teacherdialogtitle }}</div>
<img style="width: 29px; height: 29px; cursor: pointer" src="@/assets/images/basicinfo/close.png"
@click="cancelTeacherDialog" />
</div>
<a-form :model="formParam" layout="vertical" ref="formRef">
<!--讲师名称 teacherName 内容分类 coursetypeid -->
<a-row :gutter="16">
<a-col :span="12">
<a-form-item name="teacherName">
<template v-slot:label>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
讲师名称
</template>
<!-- TODO GX01 -->
<ProjectManagerOutTeacher v-model:value="formParam.name" v-model:name="formParam.teacherName"
v-model:supplier="formParam.supplier"
placeholder="请输入工号/讲师姓名进行检索" @onChange="managerChange"></ProjectManagerOutTeacher>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item name="supplier">
<template v-slot:label>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
供应商
</template>
<!-- TODO GX01 -->
<a-input class="draitem" v-model:value="formParam.supplier" disabled :maxlength="20" showCount >
</a-input>
</a-form-item>
</a-col>
</a-row>
<!-- 课程名称name 开课状态 courseStatus-->
<a-row :gutter="16">
<a-col :span="12">
<a-form-item name="courseTypeId">
<template v-slot:label>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
内容分类
</template>
<a-tree-select :fieldNames="{
children: 'children',
label: 'name',
value: 'code',
}" allow-clear :getPopupContainer="triggerNode => triggerNode.parentNode || document.body"
v-model:value="formParam.courseTypeId" show-search
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" placeholder="请选择内容分类"
tree-default-expand-all :tree-data="sysTypeOptions" @change="treetype">
</a-tree-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item name="courseName">
<template v-slot:label>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
课程名称
</template>
<a-input class="draitem" v-model:value="formParam.courseName" :maxlength="20" showCount
placeholder="请输入课程名称" @blur="sendName" allowClear showSearch>
</a-input>
</a-form-item>
</a-col>
<!-- <a-col :span="12">
<a-form-item label="开课状态">
<a-radio-group v-model:value="formParam.courseStatus" class="draitem">
<a-radio :value="'0'">未开课</a-radio>
<a-radio :value="'1'">已开课</a-radio>
</a-radio-group>
</a-form-item>
</a-col> -->
</a-row>
<!-- 授课日期 teachingDate 授课时长defaultTeachingTime-->
<a-row :gutter="16">
<a-col :span="12">
<a-form-item name="teachingDate">
<template v-slot:label>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
授课/课程日期 :
</template>
<a-date-picker class="draitem" v-model:value="teachingDate" style="width:100%" format="YYYY-MM-DD HH:mm"
:show-time="{ format: 'HH:mm' }" placeholder="请选择课程日期" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item name="teaching">
<template v-slot:label>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
授课时长
</template>
<a-input v-model:value="formParam.teaching" style="width:100%; height: 40px; border-radius: 8px; "
placeholder="请输入授课时长" allowClear showSearch suffix="分钟" :maxLength="8" @change="clearNonNumber">
</a-input>
<!-- <span style="margin-left: 5px ;" v-if="formParam.teaching != null">{{ (formParam.teaching / 60
).toFixed(2) }}小时</span>
<span style="margin-left: 5px ;" v-if="formParam.teaching == null">0.00小时</span> -->
</a-form-item>
</a-col>
</a-row>
<!-- 参训人数 studys评分 score-->
<a-row :gutter="16">
<a-col :span="12">
<a-form-item name="studys">
<template v-slot:label>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
参训人数
</template>
<a-input v-model:value="formParam.studys" class="draitem" placeholder="请输入参训人数" allowClear showSearch
:maxLength="8" @blur="clearstudysNumber">
</a-input>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item name="score">
<template v-slot:label>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
评分
</template>
<!-- <a-input class="draitem" v-model:value="formParam.score" @blur="clearscoreNumber" placeholder="" allowClear showSearch>
</a-input> -->
<a-input-number @blur="blurScore" @focus="focusScore" v-model:value="formParam.score" :precision="2"
:min="1" :max="100" style="width:100%; height: 40px; border-radius: 8px ; " placeholder="请输入评分" />
</a-form-item>
</a-col>
</a-row>
<!-- 备注 remark -->
<a-row :gutter="16">
<a-col :span="24">
<a-form-item label="备注">
<a-textarea v-model:value="formParam.remark" showCount :maxlength="200" @blur="sendRemark"
style="width: 100%; height: 100px; border-radius: 8px" placeholder="请输入" />
</a-form-item>
</a-col>
</a-row>
</a-form>
<div :style="{
position: 'absolute',
right: 0,
bottom: 0,
width: '100%',
borderTop: '1px solid #e9e9e9',
padding: '10px 16px',
background: '#fff',
textAlign: 'right',
zIndex: 1,
}">
<a-button class="drabtn" @click="cancelTeacherDialog">取消</a-button>
<a-button class="drabtn" type="primary" @click="createTeacherDialog" :loading="buttonLoading">保存
</a-button>
</div>
</div>
</a-drawer>
<!-- 查看授课记录 -->
<a-drawer class="largeDrawerInside" v-model:visible="teachingdialog" placement="right" :maskClosable="true"
:closable="false" width="60%" :title="false">
<div style="padding:24px;">
<div class="headers" style="margin-top:-24px;">
<div class="headerTitle">查看讲师授课记录</div>
<img style="width: 29px; height: 29px; cursor: pointer" src="@/assets/images/basicinfo/close.png"
@click="cancelTeachingDialog" />
</div>
<a-descriptions bordered :column="2" :contentStyle="rowCenter" :labelStyle="{ 'width': '160px' }">
<a-descriptions-item label="讲师名称">{{ formParam.teacherName || '-' }}</a-descriptions-item>
<a-descriptions-item label="供应商">{{ formParam.supplier || '-' }}</a-descriptions-item>
<a-descriptions-item label="手机号码">{{ formParam.mobile || '-' }}</a-descriptions-item>
<a-descriptions-item label="课程类型">
{{ formParam.type == 0 ? '在线课' : formParam.type == 1 ? '面授课' : formParam.type == 2 ? '训练班' : formParam.type == 5 ? '手动录入' : '-'}}
</a-descriptions-item>
<a-descriptions-item label="课程名称">{{ formParam.courseName || '-' }}</a-descriptions-item>
<a-descriptions-item label="开课状态">{{ formParam.courseStatus == 0 ? '未开课' : formParam.courseStatus == 1
? '已开课' : '-' }}</a-descriptions-item>
<a-descriptions-item label="内容分类 ">{{ formParam.courseTypeName || '-' }}</a-descriptions-item>
<a-descriptions-item label="授课/课程日期 ">{{ formParam.teachingDate || '-' }}
</a-descriptions-item>
<a-descriptions-item label="授课时长 "> <span> {{ formParam.teaching }} 分钟</span>
<span style="margin-left: 10px ;" v-if="formParam.teaching != '0'">({{ (formParam.teaching / 60
).toFixed(2) }}小时)</span>
</a-descriptions-item>
<a-descriptions-item label="评分 ">{{
formParam.score ? Number(formParam.score).toFixed(0) == 0 ? '-' : Number(formParam.score).toFixed(2) +'分':'-'}}</a-descriptions-item>
<a-descriptions-item label="参训人数 ">{{ formParam.studys ? formParam.studys + '人' : '-' }}</a-descriptions-item>
<a-descriptions-item label="备注 " :span="2">{{ formParam.remark || '-' }}</a-descriptions-item>
</a-descriptions>
<!-- <div :style="{
position: 'absolute',
right: 0,
bottom: 0,
width: '100%',
borderTop: '1px solid #e9e9e9',
padding: '10px 16px',
background: '#fff',
textAlign: 'right',
zIndex: 1,
}">
<a-button class="drabtn" @click="cancelTeachingDialog">取消</a-button>
<a-button class="drabtn" type="primary" @click="cancelTeachingDialog" :loading="buttonLoading">返回
</a-button>
</div> -->
</div>
</a-drawer>
<!-- 删除功能弹窗 -->
<div>
<a-modal v-model:visible="deleteTeacherdialog" :footer="null" :closable="close" wrapClassName="canclestu1"
centered="true">
<div class="delete">
<div class="del_header"></div>
<div class="del_main">
<div class="header">
<img src="@/assets/images/coursewareManage/QR.png" alt="" style="margin-right:10px" />
<span>提示</span>
</div>
<div class="body">
<span>您确定要删除此条记录吗</span>
</div>
<div class="del_btnbox">
<div class="del_btn btn2" @click="cancelTeacherDialog1" style="margin-right: 32px">
<div class="btnText">取消</div>
</div>
<div class="del_btn btn2" @click="closeDeleteTeacher">
<div class="btnText">确定</div>
</div>
</div>
</div>
</div>
</a-modal>
</div>
<!-- <div> <ImageUpload/> </div> -->
<ImportWork v-model:showWork="showWork" :template="'外部讲师授课记录导入模版-20250115.xlsx'"
:url="'/admin/export/importOutTeacherRecord'" :title="title"></ImportWork>
</div>
</template>
<script lang="jsx">
import { reactive, toRefs, ref, computed, onMounted ,watch} from "vue";
import { useRouter, useRoute } from "vue-router";
import { useStore } from "vuex";
import {
RightOutlined,
UpOutlined,
UploadOutlined,
FolderAddOutlined,
DownloadOutlined
} from '@ant-design/icons-vue';
import ImportWork from "../../components/lecturer/ImportWork.vue";
import { message } from "ant-design-vue";
import ProjectManager from "@/components/project/ProjectManagerNew";
import ProjectManagerOutTeacher from "@/components/project/ProjectManagerOutTeacher";
import dayjs from "dayjs";
import { getTeacherCourseList, updateInTeacherCourse, getNewInTeacherCourseList, deleteInTeacherCourse, insertInTeacherCourse, selectSupplier } from "../../api/Teaching";
// import {getProjSt} from "../../api/indexProjStu";
import { checkMenu } from '@/utils/utils'
// import AddTeacher from "../../components/drawers/project/AddTeacher"
export default {
name: "ExternalTeaching",
components: {
RightOutlined, //图标--展开
UpOutlined,//图标--收起
UploadOutlined,//图标--导出
DownloadOutlined,//图标-导入
FolderAddOutlined,//图标--新增
ProjectManager,
ProjectManagerOutTeacher,
ImportWork,
},
setup() {
onMounted(() => {
const search = sessionStorage.getItem('searchExter')
if (route.query.activeKey == 2 && search) {
state.searchParam = JSON.parse(search)
}
searchSubmit()
getSupplier()
})
const route = useRoute()
const formRef = ref();
const store = useStore();
const router = useRouter();
const state = reactive({
vf: false,
showWork: false,
moreid: 1,
title: "导入外部授课记录",
tableLoading: false,
delTeacherId: null, //删除id确认
userNoid: null, //详情工号确认
lookTeacherId: null, //详情id确认
deleteTeacherdialog: false, //删除弹窗
teacherdialog: false, //控制弹窗
teacherdialogtitle: '',//讲师弹框title内容
teachingdialog: false,//查看抽屉
pageSizeOptions: ['10', '20', '30', '50'], //下拉选择每页显示多少条
beginTime: null, //开始时间
endTime: null, //结束时间
teachingDate: undefined, //选择时间
tableDataTotal: -1,//table列表总条数
formParam: {
name: null,
supplier: null,
courseStatus: '1',
createFrom: 1,
teaching: null,
teachingDate: null,
teacherId: null,
mobile: null,
score: null
},
searchdate: undefined, //选择时间
searchParam: {
recordType: 2,
pageNo: 1,
pageSize: 10,
name: null,
address: null,
courseStatus: null,
beginTime: null,
endTime: null,
createFrom: null,
},
})
// function searchTimeChange(time, timeStr) {
// let startTime = timeStr[0]
// let endTime = timeStr[1] ;
// state.startTime = new Date(startTime).getTime();
// state.endTime = new Date(endTime).getTime();
// // state.searchParam.beginTime = new Date(beginTime).getTime() ;
// // state.searchParam.endTime = new Date(endTime).getTime() ;
// state.searchParam.beginTime = state.startTime ? state.startTime : null,
// state.searchParam.endTime = state.endTime ? state.endTime : null
// }
const AddressList = ref([
]);
const rules = {
teacherName: [{ required: true, message: '', log: '讲师不能为空' }],
courseTypeId: [{ required: true, message: '', log: '内容分类不能为空' }],
courseName: [{ required: true, message: '', log: '课程名称不能为空' }],
courseStatus: [{ required: true, message: '', log: '开课状态不能为空' }],
teachingDate: [{ required: true, message: '', log: '授课日期不能为空' }],
teaching: [{ required: true, message: '', log: '授课时长不能为空' }],
studys: [{ required: true, message: '', log: '参训人数不能为空' }],
score: [{ required: true, message: '', log: '评分不能为空' }],
}
//获取开课场地
//获取内容分类
const sysTypeOptions = computed(() => store.state.content_type);
watch(() => state.formParam.name, (val) => {
console.log(val, 'name gx data')
})
watch(() => state.formParam.teacherName, (val) => {
console.log(val, 'teacherName gx data')
})
const treetype = (val, lab) => {
state.formParam.courseTypeName = lab.toString()
}
const OnTheJobStatusList = ref([
{ value: 1, label: "项目开课" },
{ value: 2, label: "路径开课" },
{ value: 3, label: "面授开课" },
])
const supperList = ref([])
const getSupplier = () => {
selectSupplier().then(res => {
if (res.data.code == 200) {
supperList.value = res.data.data.map(item => {
return {
value: item,
label: item
}
})
supperList.value.unshift({
value: '',
label: '全部'
})
}
})
}
const AuthenticationStatusList = ref([
{ value: '', label: "全部" },
{ value: '0', label: "未开课" },
{ value: '1', label: "已开课" },
])
const entryTypeList = ref([
{ value: '', label: "全部" },
{ value: '0', label: "系统生成" },
{ value: '1', label: "手动录入" },
])
const columns = ref([
// {
// title: '课程编号 ',
// dataIndex: 'userNo',
// key: 'userNo',
// ellipsis: true,
// width: 100,
// },
{
title: '讲师姓名 ',
dataIndex: 'teacherName',
key: 'teacherName',
ellipsis: true, align: "center",
width: 150,
},
{
title: '供应商',
dataIndex: 'supplier',
key: 'supplier',
ellipsis: true, align: "center",
width: 150,
customRender: ({ text }) => text || '-'
},
{
title: '课程名称 ',
dataIndex: 'courseName',
key: 'courseName',
ellipsis: true, align: "center",
width: 200,
},
// {
// title: '手机号码 ',
// dataIndex: 'mobile',
// key: 'mobile',
// ellipsis: true, align: "center",
// width: 150,
// customRender: ({text}) => text||'-'
// },
{
title: '课程类型 ',
dataIndex: 'type',
key: 'type',
ellipsis: true, align: "center",
width: 120,
customRender: (value) => {
return (
<div>
{ String(value.record.type)
? {
"0": "在线课",
"1": "面授课",
"2": "训练班",
"5": "手动录入",
}[value.record.type + ""]
: "-" }
</div>
)
}
},
{
title: '授课/课程日期 ',
dataIndex: 'teachingDate',
key: 'teachingDate',
ellipsis: true, align: "center",
width: 200,
customRender: (value) => {
return (
<div>
{ value.record?.teachingDate ? dayjs(value.record?.teachingDate).format("YYYY-MM-DD HH:mm") : '-' }
</div>
);
},
},
// {
// title: '开课场地 ',
// dataIndex: 'address',
// key: 'address',
// ellipsis: true, align: "center",
// width: 100,
// },
{
title: '开课状态 ',
dataIndex: 'courseStatus',
key: 'courseStatus',
ellipsis: true, align: "center",
width: 120,
customRender: (value) => {
return (
<div>
{ value.record.courseStatus == 0 || value.record.courseStatus == 1
? {
"0": "未开课",
"1": "已开课",
}[value.record.courseStatus + ""] || ""
: "-" }
</div>
)
}
},
// {
// title: "内容分类",
// width: 100,
// dataIndex: "sysType1",
// ellipsis: true,
// key: "keywords",
// align: "center",
// //customRender: ({ record,text }) =>
// //`${getSysTypeMap(record.sysType1, record.sysTypeId)?getSysTypeMap//(record.sysType1) : ""}
// //${getSysTypeMap(record.sysType2, record.sysTypeId)?'-'+getSysTypeMap//(record.sysType2) : ""}
// //${getSysTypeMap(record.sysType3, record.sysTypeId)?'-'+getSysTypeMap//(record.sysType3) : ""}
// // `
// },
// {
// title: '内容分类',
// dataIndex: 'courseTypeName',
// key: 'courseTypeName',
// ellipsis: true, align: "center",
// width: 120,
// },
{
title: '授课/课程时长(分钟)',
dataIndex: 'teaching',
key: 'teaching',
ellipsis: true, align: "center",
width: 160,
customRender: (value) => {
return (
<div>
{ value.record?.teaching ? value.record.teaching + '分钟' : '-' }
</div>
);
},
},
{
title: '参训人数',
dataIndex: 'studys',
key: 'studys',
ellipsis: true, align: "center",
width: 120,
customRender: ({ text }) => {
return text ? text + '人' : '-'
}
},
{
title: '评分',
dataIndex: 'score',
key: 'score',
ellipsis: true, align: "center",
width: 120,
customRender: (value) => {
return (
<div>
{ value.record.score ? Number(value.record.score).toFixed(0) == 0 ? '-' : Number(value.record.score).toFixed(2) + '分' : '-' }
</div>
)
}
},
{
title: '数据来源',
dataIndex: 'createFrom',
key: 'createFrom',
ellipsis: true, align: "center",
width: 120,
customRender: (value) => {
return (
<div>
{ value.record.createFrom == "0" || value.record.createFrom == "1"
? {
"0": "系统生成",
"1": "手动录入",
}[value.record.createFrom + ""] || ""
: "-" }
</div>
)
}
},
{
title: '操作 ',
dataIndex: 'operation',
key: 'operation',
ellipsis: true,
align: "right",
fixed: "right",
width: 200,
scopedSlots: { customRender: "action" },
},
])
//列表数据
const tableData = ref([
// {
// name: '夏冬',
// userNo: '1152790',
// organizationDTO: '京东方科技集团股份有限公司/显示器创新业务中台/品质中台/整机品保中心QA部',
// lecturerSystem: 'MiniLED事业',
// grade: '1',
// placeOfPay: 'B1',
// teachingDuration: '0.00小时',
// onTheJobStatus: '1',
// authenticationStatus: '1',
// accountStatus: '1',
// },
])
const getSysTypeMap = (code) => {
if (code == "") return
// console.log(store.state.sysTypeMap,'map集合');
return store.state.sysTypeMap.get(code)
}
// getSysTypeMap()
// 搜索
const searchSubmit = () => {
state.searchParam.pageNo = 1
getTableDate();
};
//重置
const searchReset = () => {
state.searchdate = null,
state.searchParam = {
recordType: 2,
pageNo: 1,
pageSize: 10,
managerId: null,
name: null,
manager: null,
courseStatus: null,
createFrom: null,
systemId: null,
endTime: null,
beginTime: null,
supplier: null,
};
getTableDate();
};
// List接口数据
const getTableDate = (obj) => {
state.tableLoading = true
state.tableLoading = true
let objA = { ...state.searchParam };
objA.beginTime = state.searchdate ? dayjs(state.searchdate[0]).format("YYYY-MM-DD") : "",
objA.endTime = state.searchdate ? dayjs(state.searchdate[1]).format("YYYY-MM-DD") : "",
getNewInTeacherCourseList(objA)
.then((res) => {
tableData.value = res.data.data.records
state.tableDataTotal = Number(res.data.data.total);
state.tableLoading = false
})
.catch(err => {
state.tableLoading = false
message.error(err.data.msg)
})
};
getTableDate()
const changePagination = (page, pageSize) => {
state.searchParam.pageNo = page;
// state.pageNo = page;
state.searchParam.pageSize = pageSize;
getTableDate();
};
// 新增讲师
const addTeacher = () => {
cancel()
state.teacherdialog = true;
state.teacherdialogtitle = '添加授课记录'
state.formParam.createFrom = '1'
state.vf = true
}
//修改讲师信息弹窗
const handleModify = (record) => {
state.teacherdialog = true;
state.teacherdialogtitle = '编辑授课记录'
state.lookTeacherId = record.id
state.formParam.recordType = '1'
state.vf = false
TeacherSystem()
}
async function validateField(name) {
return new Promise((resolve) => {
formRef.value.validateFields([name])
.then(() => {
resolve(false);
})
.catch(() => {
resolve(true);
});
});
}
//保存
const createTeacherDialog = async () => {
state.formParam.teachingDate = state.teachingDate ? dayjs(state.teachingDate).format("YYYY-MM-DD HH:mm").toString() : ""
if (state.formParam.studys == 0) {
state.formParam.studys = null
}
if (state.formParam.score || state.formParam.score == 0) {
state.formParam.score = String(state.formParam.score)
} else {
state.formParam.score = null
}
state.formParam.courseStatus = String(state.formParam.courseStatus)
const formItemNames = Object.keys(rules);
for (let i = 0; i < formItemNames.length; i++) {
// const result = await validateField(formItemNames[i]);
const result = state.formParam[formItemNames[i]]
if (!result) {
return message.error(rules[formItemNames[i]][0].log)
}
}
state.formParam = { ...state.formParam }
if (state.vf == false) {
updateInTeacherCourse(state.formParam).then(response => {
message.success("编辑成功");
state.teacherdialog = false;
cancel()
getTableDate();
});
}
else {
insertInTeacherCourse(state.formParam)
.then((res) => {
message.success("新增成功");
state.teacherdialog = false;
cancel()
getTableDate();
}).catch((err) => {
console.log(err);
});
}
};
//删除弹窗
const deleteModal = (record) => {
state.deleteTeacherdialog = true
state.delTeacherId = record.id
};
//确认删除
const closeDeleteTeacher = () => {
//调用删除接口
// let obj ={
// offcourseId :state.delTeacherId,
// recordType:2
// }
deleteInTeacherCourse(state.delTeacherId,).then((res) => {
if (res.data.code == 200) {
message.success("删除成功");
state.deleteTeacherdialog = false
getTableDate();
}
}).catch((err) => {
state.deleteTeacherdialog = false
});
}
//取消按钮 清空输入的数据
const cancelTeacherDialog = () => {
if (state.teacherdialog = true) {
formRef.value.resetFields();
state.teacherdialog = false
cancel()
}
state.deleteTeacherdialog = false
};
const cancelTeacherDialog1 = () => {
state.deleteTeacherdialog = false
};
//清空数据
const cancel = () => {
state.formParam = {
courseStatus: '1',
recordType: 2,
mobile: null,
name: null,
type: null,
teaching: null,
score: null,
remark: null,
teachingDate: null,
teacherId: null
}
state.teachingDate = null
}
//展开切换
const handlemoreid = () => {
if (state.moreid == 1) {
state.moreid = 2
}
else if (state.moreid == 2) {
state.moreid = 1
state.searchParam.type = null
state.searchParam.courseStatus = null
state.searchParam.id = null
state.searchParam.createFrom = null
}
}
//表格内查看数据操作
const handleLook = (record) => {
state.teachingdialog = true
state.lookTeacherId = record.id
TeacherSystem()
}
//取消查看
const cancelTeachingDialog = () => {
state.teachingdialog = false
}
//外部授课详情
const TeacherSystem = () => {
getTeacherCourseList({ id: state.lookTeacherId }).then((res) => {
state.formParam = res.data.data
state.teachingDate = res.data.data.teachingDate ? dayjs(res.data.data.teachingDate, 'YYYY-MM-DD HH:mm') : '',
state.formParam.name = state.formParam.teacherName
state.formParam.teachingDate = state.teachingDate ? dayjs(state.teachingDate).format("YYYY-MM-DD HH:mm").toString() : ""
state.formParam.courseStatus = String(state.formParam.courseStatus)
})
.catch((err) => {
});
}
function managerChange(e, l, d, t, orgName) {
console.log("managerChange e l",e,l)
// console.log(e, l, d, t, orgName,'e, l, d, t, orgName');
state.formParam.mobile = e ? l.mobile : '';
state.formParam.teacherId = e ? l.id : '';
state.formParam.supplier = e ? l.supplier : '';
// state.searchParam.userNo = d;
// state.searchParam.name = t;
// state.searchParam.trainorgName=orgName
}
const clearNonNumber = () => {
state.formParam.teaching = state.formParam.teaching.replace(/\D/g, '');
}
//导入功能
const handleImport = () => {
state.showWork = true
}
//导出功能
const handleExport = () => {
window.open(
`${process.env.VUE_APP_BASE_API}/admin/export/exportOutTeacherRecord?recordType=2&name=${state.searchParam.name || ""}&courseName=${state.searchParam.courseName || ""}&createFrom=${state.searchParam.createFrom || ""}&beginTime=${state.searchParam.beginTime || ""}&endTime=${state.searchParam.endTime || ""}&courseTypeId=${state.searchParam.courseTypeId || ""}&courseStatus=${state.searchParam.courseStatus || ""}&supplier=${state.searchParam.supplier || ""}`
);
}
const clearstudysNumber = () => {
state.formParam.studys = state.formParam.studys.replace(/\D/g, '');
}
const clearscoreNumber = () => {
state.formParam.score = state.formParam.score.replace(/\D/g, '');
}
//回车
const enterPressHadlerSearch = e => {
if (e.keyCode === 13) {
searchSubmit()
}
};
const sendName = () => {
state.formParam.courseName = state.formParam.courseName.replace(/\s/g, '');
}
const blurScore = () => {
// !state.formParam.score && (state.formParam.score = '0')
}
const focusScore = () => {
// state.formParam.score == 0 && (state.formParam.score = null)
}
const sendRemark = () => {
state.formParam.remark = state.formParam.remark.replace(/\s/g, '');
}
return {
...toRefs(state),
rules,
sendName,
sendRemark,
blurScore,
focusScore,
enterPressHadlerSearch,
treetype,
clearscoreNumber,
clearstudysNumber,
validateField,
sysTypeOptions,
formRef,
handleImport,
clearNonNumber,
managerChange,
entryTypeList,
// searchTimeChange,
cancelTeachingDialog,
handlemoreid,
handleExport,
AddressList,
OnTheJobStatusList,
AuthenticationStatusList,
supperList,
getSupplier,
searchSubmit,
searchReset,
columns,
tableData,
changePagination,
addTeacher,
cancelTeacherDialog,
cancelTeacherDialog1,
handleLook,
cancel,
deleteModal,
handleModify,
closeDeleteTeacher,
createTeacherDialog,
getTableDate, //list接口数据调用
// getStu
TeacherSystem,
checkMenu
// getSysTypeMap
}
},
};
</script>
<style lang="scss" scoped>
.select .ant-picker {
width: 410px !important;
}
.headers {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
// background-color: red;
margin-bottom: 20px;
flex-shrink: 0;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
// margin-left: 24px;
}
}
.addTimeBox {
position: relative;
display: flex;
align-items: center;
.addTime {
position: absolute;
z-index: 1;
margin-left: 10px;
color: rgba(0, 0, 0, 0.4);
}
.ant-picker {
padding-left: 85px;
}
::v-deep .ant-picker-range .ant-picker-active-bar {
margin-left: 85px !important;
}
}
//导出按钮icon
.daochu {
width: 16px;
height: 18px;
background-image: url("../../assets/images/coursewareManage/export1.png");
}
//弹窗内详情样式
.display1 {
display: inline-block;
width: 200px;
}
// .display0{
// display:inline-block ;
// width:200px ;
// text-align:center }
//弹窗内确认取消按钮布局
.del_btnbox {
display: flex;
margin: 30px auto;
justify-content: center;
.del_btn {
width: 100px;
height: 40px;
background: rgba(64, 158, 255, 0);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
cursor: pointer;
.btnText {
font-size: 14px;
font-weight: 400;
line-height: 40px;
}
}
.btn1 {
border: 1px solid rgba(64, 158, 255, 1);
color: #4ea6ff;
margin-right: 14px;
}
.btn2 {
background-color: #4ea6ff;
color: #ffffff;
}
}
.ant-table-cell-fix-right {
width: 300px !important;
}
.ant-table-tbody>tr>td {
text-align: center;
}
.ExternalTeaching {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.filter {
margin-left: 38px;
margin-right: 38px;
margin-top: 30px;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
.select {
margin-right: 20px;
margin-bottom: 20px;
}
}
}
.delete {
z-index: 9999;
width: 424px;
background: #ffffff;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.21);
border-radius: 4px;
position: absolute;
left: 30%;
top: 10%;
// transform: translate(-50%, -50%);
.del_header {
position: absolute;
width: calc(100%);
height: 40px;
background: linear-gradient(rgba(78, 166, 255, 0.2) 0%,
rgba(78, 166, 255, 0) 100%);
}
.del_main {
width: 100%;
position: relative;
.header {
display: flex;
align-items: center;
padding-top: 20px;
padding-left: 26px;
font-size: 16px;
.del-icon {
width: 16px;
height: 16px;
margin-right: 10px;
background-image: url(@/assets/images/coursewareManage/notice.png);
background-size: 100% 100%;
}
.icon {
width: 16px;
height: 16px;
margin-right: 10px;
background-image: url(@/assets/images/coursewareManage/QR.png);
background-size: 100% 100%;
}
.close_exit {
position: absolute;
right: 42px;
cursor: pointer;
width: 20px;
height: 20px;
background-image: url(@/assets/images/coursewareManage/close.png);
background-size: 100% 100%;
}
}
.body {
width: 100%;
margin: 34px auto 56px auto;
display: flex;
justify-content: center;
align-items: center;
}
.del_btnbox {
display: flex;
margin: 30px auto;
justify-content: center;
.del_btn {
width: 100px;
height: 40px;
background: rgba(64, 158, 255, 0);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 14px;
flex-shrink: 0;
cursor: pointer;
.btnText {
font-size: 14px;
font-weight: 400;
line-height: 40px;
}
}
.btn1 {
border: 1px solid rgba(64, 158, 255, 1);
color: #4ea6ff;
}
.btn2 {
background-color: #4ea6ff;
color: #ffffff;
}
}
}
}
.CreatePath {
.out {
z-index: 9999;
display: block;
position: absolute;
top: 90px;
width: 1080px !important;
height: 650px;
overflow: auto;
background-color: #fff;
box-shadow: 0 0 10px rgba(118, 136, 166, 0.21);
left: 50%;
top: 300px;
transform: translate(-50%, -50%);
.top {
width: 100%;
height: 68px;
background: linear-gradient(rgba(78, 166, 255, 0.2) 0%,
rgba(78, 166, 255, 0) 100%);
display: flex;
align-items: center;
.topimg {
width: 18px;
height: 18px;
margin-left: 27px;
margin-top: -2px;
}
.topc {
color: #000000;
font-size: 16px;
margin-left: 8px;
}
}
.mid {
width: 100%;
height: 100%;
background-color: #fff;
display: flex;
flex-direction: column;
align-items: center;
.d {
// margin-top: 8px;
// color: #ff4e4e;
margin-left: -5px;
}
}
}
}
//添加样式
.langbtn {
height: 40px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 14px;
flex-shrink: 0;
cursor: pointer;
.search {
width: 15px;
height: 16px;
margin-right: 5px;
background: url("../../assets/images/courseManage/add0.png") no-repeat;
background-size: 100% 100%;
}
}
// 重置样式
.resetbtn {
width: 100px;
height: 40px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 14px;
flex-shrink: 0;
cursor: pointer;
}
//展开收起样式
.moreidbtn {
border: none;
color: #4ea6ff;
width: 80px
}
//小竖线
.line {
float: left;
width: 3px;
height: 25px;
background: #4ea6ff;
border-radius: 30%;
margin-right: 5px;
}
//抽屉功能
.drawaer // /* 改变所有 a-tree-select 输入框的高度 */
// ::v-deep .ant-select:not(.ant-select-customize-input) .ant-select-selector{
// height: 40px;
// line-height: 40px;
// border-radius: 8px
// /* 确保文字垂直居中 */
// }
::v-deep .ant-select-single:not(.ant-select-customize-input) .ant-select-selector {
height: 40px !important;
line-height: 40px;
border-radius: 8px
}
// 抽屉内样式
.draitem {
width: 100%;
height: 40px !important;
border-radius: 8px;
line-height: 40px;
}
.drabtn {
height: 40px;
width: 80px;
border-radius: 8px;
margin-right: 20px
}
::v-deep .ant-select:not(.ant-select-customize-input) .ant-select-selector {
border-radius: 8px;
height: 40px;
}
.ant-col-12 {
height: 80px;
}
.tableBox {
padding-bottom: 20px;
margin: 20px 38px 30px;
::v-deep .ant-select-dropdown {
display: inline-block;
}
::v-deep .ant-select-selection-item {
margin-left: 3px;
}
::v-deep .ant-pagination-options-size-changer.ant-select {
width: 84px;
}
.pa {
width: 100%;
display: flex;
justify-content: right;
}
}
</style>