forked from integrated_whb/integrated_whb_vue
班级管理
parent
f0c4ec11bb
commit
fa41f42465
|
@ -224,12 +224,12 @@ export const layoutFnGetInsuranceCompany = async () => {
|
|||
// 培训类型
|
||||
export const layoutFnGetTrainingType = async (params) => {
|
||||
const resData = await getTrainingType(params);
|
||||
return ref(resData.trainingtypelist);
|
||||
return ref(resData.varList);
|
||||
};
|
||||
// 行业类型
|
||||
export const layoutFnGetIndustryType = async (params) => {
|
||||
const resData = await getIndustryType(params);
|
||||
return ref(JSON.parse(resData.zTreeNodes));
|
||||
return ref(resData.zTreeNodes);
|
||||
};
|
||||
// 岗位类型
|
||||
export const layoutFnGetPostType = async (params) => {
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -59,8 +59,8 @@ axios.interceptors.response.use(
|
|||
import.meta.env.DEV &&
|
||||
ElMessage.error(`连接错误${error.response.status}`);
|
||||
endLoading();
|
||||
ElMessage.error("登录失效,请重新登陆");
|
||||
router.push("/login").then();
|
||||
// ElMessage.error("登录失效,请重新登陆");
|
||||
// router.push("/login").then();
|
||||
}
|
||||
} else {
|
||||
error.message = "连接到服务器失败";
|
||||
|
|
|
@ -133,7 +133,7 @@ export const getStandardLevels = () =>
|
|||
});
|
||||
// 培训类型
|
||||
export const getTrainingType = (params) =>
|
||||
post("/trainingtype/privateList", {
|
||||
post("/trainingtype/listAll", {
|
||||
loading: false,
|
||||
...params,
|
||||
});
|
||||
|
|
|
@ -18,3 +18,15 @@ export const setExamPaperManagementTestQuestionsEdit = (params) =>
|
|||
post("/paperQuestion/edit", params); // 试卷管理试题修改
|
||||
export const getAssociatedCoursewareNameList = (params) =>
|
||||
post("/videocourseware/getCourseWareName", params); // 关联课件名称
|
||||
export const getClassManagementList = (params) => post("/class/list", params); // 班级管理列表
|
||||
export const setClassManagementDelete = (params) =>
|
||||
post("/class/delete", params); // 班级管理删除
|
||||
export const setClassManagementDelay = (params) =>
|
||||
post("/class/postpone", params); // 班级管理延期
|
||||
export const getPersonnelList = (params) =>
|
||||
post("/trainedusersign/listByEnt", { loading: false, params }); // 班级管理添加人员
|
||||
export const getClassManagementView = (params) => post("/class/goEdit", params); // 班级管理查看
|
||||
export const setClassManagementAdd = (params) => post("/class/add", params); // 班级管理添加
|
||||
export const setClassManagementEdit = (params) => post("/class/edit", params); // 班级管理修改
|
||||
export const setClassManagementModifyExamTimes = (params) =>
|
||||
post("/class/editNumberofexams", params); // 班级管理修改考试次数
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
<template>
|
||||
<layout-card>
|
||||
<el-tabs v-model="active" @tab-change="fnTabChange">
|
||||
<el-tab-pane
|
||||
label="基本信息"
|
||||
:name="
|
||||
!CLASS_ID
|
||||
? '/training_process_management/class_management/add'
|
||||
: STATE === '1'
|
||||
? '/training_process_management/class_management/edit'
|
||||
: '/training_process_management/class_management/view'
|
||||
"
|
||||
lazy
|
||||
:disabled="!CLASS_ID"
|
||||
>
|
||||
<basic-info />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane
|
||||
label="学员"
|
||||
name="/training_process_management/class_management/student"
|
||||
lazy
|
||||
:disabled="!CLASS_ID"
|
||||
>
|
||||
<student />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane
|
||||
label="课程"
|
||||
name="/training_process_management/class_management/curriculum"
|
||||
lazy
|
||||
:disabled="!CLASS_ID"
|
||||
>
|
||||
<curriculum />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</layout-card>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import BasicInfo from "./components/basic_info.vue";
|
||||
import Student from "./components/student.vue";
|
||||
import Curriculum from "./components/curriculum.vue";
|
||||
import { ref } from "vue";
|
||||
import { useRoute, useRouter } from "vue-router";
|
||||
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
const { CLASS_ID, STATE } = route.query;
|
||||
const active = ref(route.path);
|
||||
const fnTabChange = (path) => {
|
||||
router.replace({
|
||||
path,
|
||||
query: { ...route.query },
|
||||
});
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -0,0 +1,374 @@
|
|||
<template>
|
||||
<el-form ref="formRef" :model="data.form" :rules="rules" label-width="160px">
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-divider content-position="left">基本信息</el-divider>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="班级名称" prop="NAME">
|
||||
<el-input
|
||||
v-model="data.form.NAME"
|
||||
placeholder="请输入班级名称"
|
||||
:disabled="isDisabled"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="培训日期" prop="TIME">
|
||||
<el-date-picker
|
||||
v-model="data.form.TIME"
|
||||
value-format="YYYY-MM-DD"
|
||||
format="YYYY-MM-DD"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
:disabled="isDisabled"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="培训类型" prop="TRAINTYPE">
|
||||
<layout-learning-train-type
|
||||
ref="trainingTypeRef"
|
||||
v-model="data.form.TRAINTYPE"
|
||||
type="trainingType"
|
||||
:disabled="isDisabled"
|
||||
@update:model-value="
|
||||
data.form.POSTTYPE = '';
|
||||
data.form.TRAINLEVEL = '';
|
||||
"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="岗位类型" prop="POSTTYPE">
|
||||
<layout-learning-train-type
|
||||
ref="postTypeRef"
|
||||
v-model="data.form.POSTTYPE"
|
||||
type="postType"
|
||||
:search-value="data.form.TRAINTYPE"
|
||||
:disabled="isDisabled"
|
||||
@update:model-value="data.form.TRAINLEVEL = ''"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
label="培训级别"
|
||||
prop="TRAINLEVEL"
|
||||
:rules="[
|
||||
{
|
||||
required: data.trainingLevelList.length !== 0,
|
||||
message: '请选择培训级别',
|
||||
trigger: 'change',
|
||||
},
|
||||
]"
|
||||
>
|
||||
<layout-learning-train-type
|
||||
ref="trainingLevelRef"
|
||||
v-model="data.form.TRAINLEVEL"
|
||||
type="trainingLevel"
|
||||
:search-value="data.form.POSTTYPE"
|
||||
:disabled="isDisabled"
|
||||
@throw-data="data.trainingLevelList = $event"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<template
|
||||
v-if="
|
||||
data.form.TRAINTYPE &&
|
||||
data.form.TRAINTYPE !== 'c70bf859512241579a8a30fc5d1ae153'
|
||||
"
|
||||
>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="记录人员" prop="RECORDOR">
|
||||
<el-select
|
||||
v-model="data.form.RECORDOR"
|
||||
filterable
|
||||
:disabled="isDisabled"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in data.recordingPersonnelList"
|
||||
:key="item.USERSIGNID"
|
||||
:value="item.USERSIGNID"
|
||||
:label="item.USERNAME"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="考核人员" prop="ASSESSOR">
|
||||
<el-select
|
||||
v-model="data.form.ASSESSOR"
|
||||
filterable
|
||||
:disabled="isDisabled"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in data.assessorsList"
|
||||
:key="item.USERSIGNID"
|
||||
:value="item.USERSIGNID"
|
||||
:label="item.USERNAME"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="安全管理部门负责人" prop="SAFETYDEPTOR">
|
||||
<el-select
|
||||
v-model="data.form.SAFETYDEPTOR"
|
||||
filterable
|
||||
:disabled="isDisabled"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in data.headOfSafetyManagementDepartmentList"
|
||||
:key="item.USERSIGNID"
|
||||
:value="item.USERSIGNID"
|
||||
:label="item.USERNAME"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="负责人" prop="PRINCIPAL">
|
||||
<el-input
|
||||
v-model="data.form.PRINCIPAL"
|
||||
placeholder="请输入负责人"
|
||||
:disabled="isDisabled"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="负责人电话" prop="PRINCIPAL_PHONE">
|
||||
<el-input
|
||||
v-model="data.form.PRINCIPAL_PHONE"
|
||||
placeholder="请输入负责人电话"
|
||||
:disabled="isDisabled"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</template>
|
||||
<el-col :span="24">
|
||||
<el-divider content-position="left">基本设置</el-divider>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="是否开启考试" prop="EXAMINATION">
|
||||
<el-radio-group
|
||||
v-model="data.form.EXAMINATION"
|
||||
:disabled="isDisabled"
|
||||
>
|
||||
<el-radio :label="1">是</el-radio>
|
||||
<el-radio :label="0">否</el-radio>
|
||||
</el-radio-group>
|
||||
<span class="ml-10">
|
||||
不考试的班级,学员学习完所有课程,即为完成学业。
|
||||
</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-if="data.form.EXAMINATION === 1" :span="12">
|
||||
<el-form-item label="考试次数" prop="NUMBEROFEXAMS">
|
||||
<div style="flex: 1; display: flex">
|
||||
<el-input-number
|
||||
v-model="data.form.NUMBEROFEXAMS"
|
||||
:min="1"
|
||||
:max="2147483600"
|
||||
:disabled="isDisabled"
|
||||
/>
|
||||
<el-button
|
||||
v-if="STATE && STATE !== '1' && STATE !== '6'"
|
||||
type="primary"
|
||||
class="ml-10"
|
||||
@click="fnModifyExamTimes"
|
||||
>
|
||||
修改考试次数
|
||||
</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="是否人脸识别" prop="ISFACE">
|
||||
<el-radio-group v-model="data.form.ISFACE" :disabled="isDisabled">
|
||||
<el-radio label="1">是</el-radio>
|
||||
<el-radio label="0">否</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-if="data.form.EXAMINATION === 1" :span="12">
|
||||
<el-form-item label="是否效果评估" prop="ISSTRENGTHEN">
|
||||
<el-radio-group
|
||||
v-model="data.form.ISSTRENGTHEN"
|
||||
:disabled="isDisabled"
|
||||
>
|
||||
<el-radio label="2">强制</el-radio>
|
||||
<el-radio label="1">是</el-radio>
|
||||
<el-radio label="0">否</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<div class="mt-10 tc">
|
||||
<el-button type="primary" @click="fnSubmit">
|
||||
{{ !CLASS_ID ? "保存并下一步" : "保存" }}
|
||||
</el-button>
|
||||
</div>
|
||||
<modify-exam-times
|
||||
:id="CLASS_ID"
|
||||
v-model:visible="data.modifyExamTimesDialog.visible"
|
||||
v-model:form="data.modifyExamTimesDialog.form"
|
||||
@get-data="fnGetData"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { nextTick, reactive, ref } from "vue";
|
||||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||
import {
|
||||
getClassManagementView,
|
||||
getPersonnelList,
|
||||
setClassManagementAdd,
|
||||
setClassManagementEdit,
|
||||
} from "@/request/training_process_management.js";
|
||||
import { debounce } from "throttle-debounce";
|
||||
import useFormValidate from "@/assets/js/useFormValidate.js";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { useRoute, useRouter } from "vue-router";
|
||||
import ModifyExamTimes from "./modify_exam_times.vue";
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const { STATE, CLASS_ID } = route.query;
|
||||
const isDisabled = STATE && STATE !== "1";
|
||||
const formRef = ref(null);
|
||||
const trainingTypeRef = ref(null);
|
||||
const postTypeRef = ref(null);
|
||||
const trainingLevelRef = ref(null);
|
||||
const data = reactive({
|
||||
recordingPersonnelList: [],
|
||||
assessorsList: [],
|
||||
headOfSafetyManagementDepartmentList: [],
|
||||
trainingLevelList: [],
|
||||
form: {
|
||||
NAME: "",
|
||||
TIME: "",
|
||||
TRAINTYPE: "",
|
||||
POSTTYPE: "",
|
||||
TRAINLEVEL: "",
|
||||
RECORDOR: "",
|
||||
ASSESSOR: "",
|
||||
SAFETYDEPTOR: "",
|
||||
PRINCIPAL: "",
|
||||
PRINCIPAL_PHONE: "",
|
||||
EXAMINATION: 1,
|
||||
NUMBEROFEXAMS: 1,
|
||||
ISFACE: "1",
|
||||
ISSTRENGTHEN: "1",
|
||||
},
|
||||
modifyExamTimesDialog: {
|
||||
visible: false,
|
||||
form: { NUMBEROFEXAMS: 1, source: 1 },
|
||||
},
|
||||
});
|
||||
const rules = {
|
||||
NAME: [{ required: true, message: "请输入班级名称", trigger: "blur" }],
|
||||
TIME: [{ required: true, message: "请选择培训日期", trigger: "change" }],
|
||||
TRAINTYPE: [{ required: true, message: "请选择培训类型", trigger: "change" }],
|
||||
POSTTYPE: [{ required: true, message: "请选择岗位类型", trigger: "change" }],
|
||||
RECORDOR: [{ required: true, message: "请选择记录人员", trigger: "change" }],
|
||||
ASSESSOR: [{ required: true, message: "请选择考核人员", trigger: "change" }],
|
||||
SAFETYDEPTOR: [
|
||||
{ required: true, message: "请选择安全管理部门负责人", trigger: "change" },
|
||||
],
|
||||
PRINCIPAL: [{ required: true, message: "请输入负责人", trigger: "blur" }],
|
||||
PRINCIPAL_PHONE: [
|
||||
{ required: true, message: "请输入负责人电话", trigger: "blur" },
|
||||
{
|
||||
pattern:
|
||||
/^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/,
|
||||
message: "请输入正确的手机号码",
|
||||
},
|
||||
],
|
||||
EXAMINATION: [
|
||||
{ required: true, message: "请选择是否开启考试", trigger: "change" },
|
||||
],
|
||||
ISFACE: [
|
||||
{ required: true, message: "请选择是否人脸识别", trigger: "change" },
|
||||
],
|
||||
ISSTRENGTHEN: [
|
||||
{ required: true, message: "请选择是否效果评估", trigger: "change" },
|
||||
],
|
||||
NUMBEROFEXAMS: [
|
||||
{ required: true, message: "请输入考试次数", trigger: "blur" },
|
||||
],
|
||||
};
|
||||
const fnGetData = async () => {
|
||||
if (!CLASS_ID) return;
|
||||
const resData = await getClassManagementView({ CLASS_ID });
|
||||
resData.pd.TIME = [resData.pd.START_TIME, resData.pd.END_TIME];
|
||||
data.form = resData.pd;
|
||||
};
|
||||
fnGetData();
|
||||
const fnGetPersonnelList = async () => {
|
||||
const { varList: recordingPersonnelList } = await getPersonnelList({
|
||||
USERSIGNTYPE: "854c77daf3734384807a638dfafe04d5",
|
||||
});
|
||||
const { varList: assessorsList } = await getPersonnelList({
|
||||
USERSIGNTYPE: "f2726f92987d4f77be1c3f0460669418",
|
||||
});
|
||||
const { varList: headOfSafetyManagementDepartmentList } =
|
||||
await getPersonnelList({
|
||||
USERSIGNTYPE: "5f4794189cf24fc2a7e12fa47b70139e",
|
||||
});
|
||||
data.recordingPersonnelList = recordingPersonnelList;
|
||||
data.assessorsList = assessorsList;
|
||||
data.headOfSafetyManagementDepartmentList =
|
||||
headOfSafetyManagementDepartmentList;
|
||||
};
|
||||
fnGetPersonnelList();
|
||||
const fnSubmit = debounce(
|
||||
1000,
|
||||
async () => {
|
||||
await useFormValidate(formRef);
|
||||
const params = {
|
||||
...data.form,
|
||||
ISSTRENGTHEN: data.form.EXAMINATION === 1 ? data.form.ISSTRENGTHEN : "0",
|
||||
START_TIME: data.form.TIME[0],
|
||||
END_TIME: data.form.TIME[1],
|
||||
SAMPLINGNUMBER: "0",
|
||||
TRAINTYPE_NAME: trainingTypeRef.value.getCurrentNode().NAME,
|
||||
POSTTYPE_NAME: postTypeRef.value.getCurrentNode().NAME,
|
||||
TRAINLEVEL_NAME: trainingLevelRef.value.getCurrentNode().NAME || "",
|
||||
trainAllName:
|
||||
trainingTypeRef.value.getCurrentNode().NAME +
|
||||
"-" +
|
||||
postTypeRef.value.getCurrentNode().NAME,
|
||||
};
|
||||
let resData;
|
||||
!CLASS_ID
|
||||
? (resData = await setClassManagementAdd(params))
|
||||
: await setClassManagementEdit(params);
|
||||
ElMessage.success("提交成功");
|
||||
await router.replace({
|
||||
path: !CLASS_ID
|
||||
? "/training_process_management/class_management/student"
|
||||
: STATE === "1"
|
||||
? "/training_process_management/class_management/edit"
|
||||
: "/training_process_management/class_management/view",
|
||||
query: {
|
||||
...route.query,
|
||||
CLASS_ID: !CLASS_ID ? resData.CLASS_ID : CLASS_ID,
|
||||
TRAINTYPE: data.form.TRAINTYPE,
|
||||
},
|
||||
});
|
||||
},
|
||||
{ atBegin: true }
|
||||
);
|
||||
const fnModifyExamTimes = async () => {
|
||||
data.modifyExamTimesDialog.visible = true;
|
||||
await nextTick();
|
||||
data.modifyExamTimesDialog.form.NUMBEROFEXAMS = data.form.NUMBEROFEXAMS;
|
||||
data.modifyExamTimesDialog.form.source = data.form.NUMBEROFEXAMS;
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<div></div>
|
||||
</template>
|
||||
|
||||
<script setup></script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -0,0 +1,61 @@
|
|||
<template>
|
||||
<el-dialog v-model="visible" title="延期" :on-close="fnClose">
|
||||
<el-form ref="formRef" :model="form" :rules="rules" label-width="60px">
|
||||
<el-form-item label="日期" prop="TIME">
|
||||
<el-date-picker
|
||||
v-model="form.TIME"
|
||||
value-format="YYYY-MM-DD"
|
||||
format="YYYY-MM-DD"
|
||||
:disabled-date="fnDisabledDate"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="fnClose">取消</el-button>
|
||||
<el-button type="primary" @click="fnSubmit">确定</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useVModels } from "@vueuse/core";
|
||||
import { ref } from "vue";
|
||||
import useFormValidate from "@/assets/js/useFormValidate.js";
|
||||
import { setClassManagementDelay } from "@/request/training_process_management.js";
|
||||
import { ElMessage } from "element-plus";
|
||||
|
||||
const props = defineProps({
|
||||
visible: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
default: false,
|
||||
},
|
||||
form: {
|
||||
type: Object,
|
||||
required: true,
|
||||
default: () => {},
|
||||
},
|
||||
});
|
||||
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
|
||||
const { visible, form } = useVModels(props, emits);
|
||||
const formRef = ref(null);
|
||||
const rules = {
|
||||
TIME: [{ required: true, message: "请选择日期", trigger: "change" }],
|
||||
};
|
||||
const fnDisabledDate = (time) => {
|
||||
return time.getTime() <= new Date(form.value.TIME).getTime();
|
||||
};
|
||||
const fnClose = () => {
|
||||
formRef.value.resetFields();
|
||||
visible.value = false;
|
||||
};
|
||||
const fnSubmit = async () => {
|
||||
await useFormValidate(formRef);
|
||||
await setClassManagementDelay({ ...form.value });
|
||||
ElMessage.success("延期成功");
|
||||
fnClose();
|
||||
emits("get-data");
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -0,0 +1,70 @@
|
|||
<template>
|
||||
<el-dialog v-model="visible" title="修改考试次数" :on-close="fnClose">
|
||||
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
|
||||
<el-form-item label="原考试次数" prop="source">
|
||||
<el-input-number v-model="form.source" disabled />
|
||||
</el-form-item>
|
||||
<el-form-item label="新考试次数" prop="NUMBEROFEXAMS">
|
||||
<el-input-number v-model="form.NUMBEROFEXAMS" :min="+form.source + 1" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="fnClose">取消</el-button>
|
||||
<el-button type="primary" @click="fnSubmit">确定</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useVModels } from "@vueuse/core";
|
||||
import { ref } from "vue";
|
||||
import useFormValidate from "@/assets/js/useFormValidate.js";
|
||||
import { setClassManagementModifyExamTimes } from "@/request/training_process_management.js";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
|
||||
const props = defineProps({
|
||||
visible: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
default: false,
|
||||
},
|
||||
form: {
|
||||
type: Object,
|
||||
required: true,
|
||||
default: () => {},
|
||||
},
|
||||
id: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: "",
|
||||
},
|
||||
});
|
||||
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
|
||||
const { visible, form } = useVModels(props, emits);
|
||||
const formRef = ref(null);
|
||||
const rules = {
|
||||
NUMBEROFEXAMS: [
|
||||
{ required: true, message: "请填写考试次数", trigger: "blur" },
|
||||
],
|
||||
};
|
||||
const fnClose = () => {
|
||||
formRef.value.resetFields();
|
||||
visible.value = false;
|
||||
};
|
||||
const fnSubmit = async () => {
|
||||
await useFormValidate(formRef);
|
||||
await ElMessageBox.confirm(
|
||||
"确定要修改该班级的考试次数吗?考试已通过的学员不受影响",
|
||||
{ type: "warning" }
|
||||
);
|
||||
await setClassManagementModifyExamTimes({
|
||||
...form.value,
|
||||
CLASS_ID: props.id,
|
||||
});
|
||||
ElMessage.success("修改成功");
|
||||
fnClose();
|
||||
emits("get-data");
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -0,0 +1,7 @@
|
|||
<template>
|
||||
<div></div>
|
||||
</template>
|
||||
|
||||
<script setup></script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -0,0 +1,334 @@
|
|||
<template>
|
||||
<div>
|
||||
<el-card>
|
||||
<el-form
|
||||
:model="searchForm"
|
||||
label-width="100px"
|
||||
@submit.prevent="fnResetPaginationTransfer"
|
||||
>
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="班级编码" prop="CODE">
|
||||
<el-input v-model="searchForm.CODE" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="班级名称" prop="KEYWORDS">
|
||||
<el-input v-model="searchForm.KEYWORDS" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="培训类型" prop="TRAINTYPE">
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.TRAINTYPE"
|
||||
type="trainingType"
|
||||
@update:model-value="
|
||||
searchForm.POSTTYPE = '';
|
||||
searchForm.TRAINLEVEL = '';
|
||||
"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="行业类型" prop="INDUSTRY_END_ID">
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.INDUSTRY_END_ID"
|
||||
type="industryType"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="岗位类型" prop="POSTTYPE">
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.POSTTYPE"
|
||||
type="postType"
|
||||
:search-value="searchForm.TRAINTYPE"
|
||||
@update:model-value="searchForm.TRAINLEVEL = ''"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="培训级别" prop="TRAINLEVEL">
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.TRAINLEVEL"
|
||||
type="trainingLevel"
|
||||
:search-value="searchForm.POSTTYPE"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="班级状态" prop="STATE">
|
||||
<el-select v-model="searchForm.STATE">
|
||||
<el-option
|
||||
v-for="item in classStatusList"
|
||||
:key="item.ID"
|
||||
:value="item.ID"
|
||||
:label="item.NAME"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="开班时间" prop="TIME">
|
||||
<el-date-picker
|
||||
v-model="searchForm.TIME"
|
||||
value-format="YYYY-MM-DD"
|
||||
format="YYYY-MM-DD"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="结束时间" prop="TIME1">
|
||||
<el-date-picker
|
||||
v-model="searchForm.TIME1"
|
||||
value-format="YYYY-MM-DD"
|
||||
format="YYYY-MM-DD"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label-width="10px">
|
||||
<el-button type="primary" native-type="submit">搜索</el-button>
|
||||
<el-button native-type="reset" @click="fnResetPaginationTransfer">
|
||||
重置
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<layout-card>
|
||||
<div class="mb-10">
|
||||
<span class="mr-10">
|
||||
班级总数:<i>{{ data.clsNum }}</i>
|
||||
</span>
|
||||
<span>
|
||||
班级总人次:<i>{{ data.stuNum }}</i>
|
||||
</span>
|
||||
</div>
|
||||
<layout-table
|
||||
v-model:pagination="pagination"
|
||||
:data="list"
|
||||
@get-data="fnGetDataTransfer"
|
||||
>
|
||||
<el-table-column label="序号" width="60" fixed="left">
|
||||
<template #default="{ $index }">
|
||||
{{ serialNumber(pagination, $index) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="班级名称"
|
||||
prop="NAME"
|
||||
show-overflow-tooltip
|
||||
fixed="left"
|
||||
/>
|
||||
<el-table-column
|
||||
label="班级编码"
|
||||
prop="CODE"
|
||||
width="150"
|
||||
fixed="left"
|
||||
/>
|
||||
<el-table-column
|
||||
label="培训类型"
|
||||
prop="TRAININGTYPE_NAME"
|
||||
width="150"
|
||||
/>
|
||||
<el-table-column label="行业类型" prop="POSTTYPE_NAME" width="150" />
|
||||
<el-table-column
|
||||
label="岗位类型"
|
||||
prop="INDUSTRY_ALL_NAME"
|
||||
width="200"
|
||||
/>
|
||||
<el-table-column label="培训等级" prop="TRAINLEVEL_NAME" width="150" />
|
||||
<el-table-column label="负责人" prop="PRINCIPAL" width="150" />
|
||||
<el-table-column label="培训开始时间" prop="START_TIME" width="150" />
|
||||
<el-table-column label="培训结束时间" prop="END_TIME" width="150" />
|
||||
<el-table-column label="涉及培训岗位数" prop="POSTNUM" width="150" />
|
||||
<el-table-column label="学员人员数" prop="STUDENT_NUM" width="150" />
|
||||
<el-table-column label="试卷类型" width="150">
|
||||
<template #default="{ row }">
|
||||
{{ translationStatus(row.STATE, classStatusList) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="200" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button
|
||||
type="primary"
|
||||
text
|
||||
link
|
||||
@click="
|
||||
router.push({
|
||||
path:
|
||||
row.STATE === '1'
|
||||
? '/training_process_management/class_management/edit'
|
||||
: '/training_process_management/class_management/view',
|
||||
query: {
|
||||
STATE: row.STATE,
|
||||
CLASS_ID: row.CLASS_ID,
|
||||
TRAINTYPE: row.TRAINTYPE,
|
||||
},
|
||||
})
|
||||
"
|
||||
>
|
||||
{{ row.STATE === "1" ? "编辑" : "查看" }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
text
|
||||
link
|
||||
@click="
|
||||
router.push({
|
||||
path: '/training_process_management/class_management/student',
|
||||
query: {
|
||||
STATE: row.STATE,
|
||||
CLASS_ID: row.CLASS_ID,
|
||||
TRAINTYPE: row.TRAINTYPE,
|
||||
},
|
||||
})
|
||||
"
|
||||
>
|
||||
学员
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
text
|
||||
link
|
||||
@click="
|
||||
router.push({
|
||||
path: '/training_process_management/class_management/curriculum',
|
||||
query: {
|
||||
STATE: row.STATE,
|
||||
CLASS_ID: row.CLASS_ID,
|
||||
TRAINTYPE: row.TRAINTYPE,
|
||||
},
|
||||
})
|
||||
"
|
||||
>
|
||||
课程
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="row.STATE === '1' && row.STUDYRECORDCNT === 0"
|
||||
type="primary"
|
||||
text
|
||||
link
|
||||
@click="fnDelete(row.CLASS_ID)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="row.STATE !== '1'"
|
||||
type="primary"
|
||||
text
|
||||
link
|
||||
@click="fnDelay(row.CLASS_ID, row.END_TIME)"
|
||||
>
|
||||
延期
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<template #button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="
|
||||
router.push({
|
||||
path: '/training_process_management/class_management/add',
|
||||
})
|
||||
"
|
||||
>
|
||||
新建培训任务
|
||||
</el-button>
|
||||
</template>
|
||||
</layout-table>
|
||||
</layout-card>
|
||||
<delay
|
||||
v-model:visible="data.delayDialog.visible"
|
||||
v-model:form="data.delayDialog.form"
|
||||
@get-data="fnResetPaginationTransfer"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import useListData from "@/assets/js/useListData.js";
|
||||
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
|
||||
import { useRouter } from "vue-router";
|
||||
import { debounce } from "throttle-debounce";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import {
|
||||
getClassManagementList,
|
||||
setClassManagementDelete,
|
||||
} from "@/request/training_process_management.js";
|
||||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||
import { nextTick, reactive } from "vue";
|
||||
import Delay from "./components/delay.vue";
|
||||
|
||||
const classStatusList = [
|
||||
{ ID: "1", NAME: "未申请" },
|
||||
{ ID: "4", NAME: "待开班" },
|
||||
{ ID: "5", NAME: "培训中" },
|
||||
{ ID: "6", NAME: "培训结束" },
|
||||
];
|
||||
const router = useRouter();
|
||||
const data = reactive({
|
||||
stuNum: 0,
|
||||
clsNum: 0,
|
||||
delayDialog: {
|
||||
visible: false,
|
||||
form: {
|
||||
CLASS_ID: "",
|
||||
TIME: "",
|
||||
},
|
||||
},
|
||||
});
|
||||
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||
useListData(getClassManagementList, {
|
||||
callbackFn: (list, resData) => {
|
||||
data.stuNum = resData.stuNum;
|
||||
data.clsNum = resData.clsNum;
|
||||
},
|
||||
});
|
||||
const fnGetDataTransfer = () => {
|
||||
fnGetData({
|
||||
STARTTIME: searchForm.value.TIME?.[0],
|
||||
ENDTIME: searchForm.value.TIME?.[1],
|
||||
OVERSTARTTIME: searchForm.value.TIME1?.[0],
|
||||
OVERENDTIME: searchForm.value.TIME1?.[1],
|
||||
});
|
||||
};
|
||||
const fnResetPaginationTransfer = () => {
|
||||
fnResetPagination({
|
||||
STARTTIME: searchForm.value.TIME?.[0],
|
||||
ENDTIME: searchForm.value.TIME?.[1],
|
||||
OVERSTARTTIME: searchForm.value.TIME1?.[0],
|
||||
OVERENDTIME: searchForm.value.TIME1?.[1],
|
||||
});
|
||||
};
|
||||
const fnDelete = debounce(
|
||||
1000,
|
||||
async (CLASS_ID) => {
|
||||
await ElMessageBox.confirm("确定要删除吗?", {
|
||||
type: "warning",
|
||||
});
|
||||
await setClassManagementDelete({ CLASS_ID });
|
||||
ElMessage.success("删除成功");
|
||||
fnResetPaginationTransfer();
|
||||
},
|
||||
{ atBegin: true }
|
||||
);
|
||||
const fnDelay = async (CLASS_ID, END_TIME) => {
|
||||
data.delayDialog.visible = true;
|
||||
await nextTick();
|
||||
data.delayDialog.form.CLASS_ID = CLASS_ID;
|
||||
data.delayDialog.form.TIME = END_TIME;
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -61,14 +61,12 @@
|
|||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="关联课件名称" prop="VIDEOCOURSEWARE_ID">
|
||||
<el-select v-model="form.VIDEOCOURSEWARE_ID" filterable>
|
||||
<el-option
|
||||
v-for="item in associatedCoursewareName"
|
||||
:key="item.VIDEOCOURSEWARE_ID"
|
||||
:label="item.COURSEWARENAME"
|
||||
:value="item.VIDEOCOURSEWARE_ID"
|
||||
/>
|
||||
</el-select>
|
||||
<el-select-v2
|
||||
v-model="form.VIDEOCOURSEWARE_ID"
|
||||
:options="associatedCoursewareName"
|
||||
filterable
|
||||
:props="{ label: 'COURSEWARENAME', value: 'VIDEOCOURSEWARE_ID' }"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="答案解析" prop="DESCR">
|
||||
<el-input
|
||||
|
|
|
@ -19,6 +19,10 @@
|
|||
ref="trainingTypeRef"
|
||||
v-model="data.form.TRAINTYPE"
|
||||
type="trainingType"
|
||||
@update:model-value="
|
||||
data.form.POSTTYPE = '';
|
||||
data.form.TRAINLEVEL = '';
|
||||
"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
@ -38,6 +42,7 @@
|
|||
v-model="data.form.POSTTYPE"
|
||||
type="postType"
|
||||
:search-value="data.form.TRAINTYPE"
|
||||
@update:model-value="data.form.TRAINLEVEL = ''"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
|
|
@ -30,6 +30,10 @@
|
|||
<layout-learning-train-type
|
||||
v-model="searchForm.TRAINTYPE"
|
||||
type="trainingType"
|
||||
@update:model-value="
|
||||
searchForm.POSTTYPE = '';
|
||||
searchForm.TRAINLEVEL = '';
|
||||
"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
@ -47,6 +51,7 @@
|
|||
v-model="searchForm.POSTTYPE"
|
||||
type="postType"
|
||||
:search-value="searchForm.TRAINTYPE"
|
||||
@update:model-value="searchForm.TRAINLEVEL = ''"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
<layout-learning-train-type
|
||||
v-model="searchForm.TRAINTYPE"
|
||||
type="trainingType"
|
||||
@update:model-value="searchForm.POSTTYPE = ''"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
|
Loading…
Reference in New Issue