企业用户管理、档案管理、效果评估

dev
LiuJiaNan 2024-03-25 09:13:10 +08:00
parent 2d1eb54c60
commit 6df0f3f247
45 changed files with 1760 additions and 1731 deletions

View File

@ -84,13 +84,6 @@ export const layoutFnGetDegreeOfEducation = async () => {
});
return ref(resData.list);
};
// 人员类型
// export const layoutFnGetPersonnelType = async () => {
// const resData = await getLevels({
// DICTIONARIES_ID: "0b62f92b0b624aab8e89a77304a64d5e",
// });
// return ref(resData.list);
// };
// 人员类型(交通版)
export const layoutFnGetPersonnelTypeTraffic = async (params) => {
const resData = await getLevelsByObject(params);

View File

@ -35,8 +35,19 @@ export const getClassCurriculumList = (params) =>
export const getClassGoEdit = (params) => post("/class/goEdit", params);
export const getReviewGoEdit = (params) =>
post("/archivesReview/goEdit", params); // 一期一档安全培训教材会审表详情
export const getReviewRecord = (params) =>
post("/archives/reviewRecord", params); // 一期一档安全培训教材会审表情况
export const getReviewAdd = (params) => post("/archivesReview/add", params); // 一期一档安全培训教材会审表添加
export const getReviewEdit = (params) => post("/archivesReview/edit", params); // 一期一档安全培训教材会审表修改
export const getReviewersList = (params) => post("/reviewUser/listAll", params); // 审查人员列表
export const setReviewRecordAdd = (params) =>
upload("/archivesReviewRecord/add", params); // 一期一档安全培训教材会审表情况添加
export const setReviewRecordEdit = (params) =>
upload("/archivesReviewRecord/edit", params); // 一期一档安全培训教材会审表情况修改
export const setReviewRecordDelete = (params) =>
post("/archivesReviewRecord/delete", params); // 一期一档安全培训教材会审表情况删除
export const setReviewRecordView = (params) =>
post("/archivesReviewRecord/goEdit", params); // 一期一档安全培训教材会审表情况查看
export const getReviewRecordList = (params) =>
post("/archivesReviewRecord/list", params); // 一期一档安全培训教材会审表情况
export const getStudentSigns = (params) =>
post("/archives/getStudentSigns", params); // 一期一档学员考核成绩统计表
export const getClassPaper = (params) => post("/archives/getPaper", params); // 一期一档试卷详情
@ -127,16 +138,23 @@ export const getStudentEvaluation = (params) =>
export const getReviewUserList = (params) => post("/reviewUser/list", params); // 获取审查人员列表
export const setReviewUserDelete = (params) =>
post("/reviewUser/delete", params); // 审查人员删除
export const setReviewUserAdd = (params) => post("/reviewUser/save", params); // 审查人员添加
export const setReviewUserEdit = (params) => post("/reviewUser/edit", params); // 审查人员编辑
export const setReviewUserAdd = (params) => upload("/reviewUser/save", params); // 审查人员添加
export const setReviewUserEdit = (params) => upload("/reviewUser/edit", params); // 审查人员编辑
export const getReviewUserGoEdit = (params) =>
post("/reviewUser/goEdit", params); // 获取审查人员编辑信息
export const getSignUserList = (params) =>
post("/trainedusersign/list", params); // 获取签字人员列表
export const setSignUserDelete = (params) =>
post("/trainedusersign/delete", params); // 签字人员删除
export const setSignUserAdd = (params) => post("/trainedusersign/save", params); // 签字人员添加
export const setSignUserAdd = (params) =>
upload("/trainedusersign/save", params); // 签字人员添加
export const setSignUserEdit = (params) =>
post("/trainedusersign/edit", params); // 签字人员编辑
upload("/trainedusersign/edit", params); // 签字人员编辑
export const getSignUserGoEdit = (params) =>
post("/trainedusersign/goEdit", params); // 获取签字人员编辑信息
export const getClassProfileClassList = (params) =>
post("/class/getClassAllByCorOrEnt", params); // 班级档案班级列表
export const classProfileDownload = (params) =>
post("/archivesstudent/batchDownByClass", params); // 班级档案导出
export const classDetailsDownload = (params) =>
post("/archivesstudent/archivepersonnel", params); // 班级详情导出

View File

@ -1,31 +1,25 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="80px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-col :span="4">
<el-form-item label="档案描述" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入档案描述"
/>
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="4">
<el-form-item label="档案类型" prop="TYPE">
<el-select
v-model="searchForm.TYPE"
placeholder="请选择档案类型"
style="width: 100%"
>
<el-select v-model="searchForm.TYPE">
<el-option
v-for="item in data.typeList"
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in typeList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
/>
</el-select>
</el-form-item>
@ -40,18 +34,14 @@
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="4">
<el-form-item label="状态" prop="STATUS">
<el-select
v-model="searchForm.STATUS"
placeholder="请选择状态"
style="width: 100%"
>
<el-select v-model="searchForm.STATUS">
<el-option
v-for="item in data.statusList"
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in statusList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
/>
</el-select>
</el-form-item>
@ -66,110 +56,102 @@
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
v-model:pagination="pagination"
:data="list"
@get-data="fnGetData"
>
<el-table-column
reserve-selection
type="selection"
width="55"
align="center"
/>
<el-table-column label="序号" width="60" align="center">
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="DESCR" label="档案描述" align="center" />
<el-table-column prop="TYPE" label="档案类型" align="center" width="100">
<el-table-column prop="DESCR" label="档案描述" />
<el-table-column label="档案类型" width="100">
<template #default="{ row }">
<template v-if="row.TYPE === '1'"> </template>
<template v-else-if="row.TYPE === '2'"> 一期一档 </template>
<template v-else-if="row.TYPE === '3'"> 一企一档 </template>
{{ translationStatus(row.TYPE, typeList) }}
</template>
</el-table-column>
<el-table-column prop="STATUS" label="状态" align="center" width="100">
<el-table-column label="状态" width="100">
<template #default="{ row }">
<template v-if="row.STATUS === '0'">
<div>上传中</div>
</template>
<template v-else-if="row.STATUS === '1'">
<div style="color: green">上传成功</div>
</template>
<template v-else-if="row.STATUS === '-1'">
<div style="color: red">上传失败</div>
</template>
<template v-else-if="row.STATUS === '-2'">
<div>已删除</div>
</template>
<span
:class="{
'text-red': row.STATUS === '-1',
'text-green': row.STATUS === '1',
}"
>
{{ translationStatus(row.STATUS, statusList) }}
</span>
</template>
</el-table-column>
<el-table-column prop="CREATOR" label="获取人" align="center" />
<el-table-column prop="CREATTIME" label="获取时间" align="center" />
<el-table-column label="操作" align="center" width="150" fixed="right">
<el-table-column prop="CREATOR" label="获取人" />
<el-table-column prop="CREATTIME" label="获取时间" width="150" />
<el-table-column label="操作" width="120">
<template #default="{ row }">
<el-button
v-show="row.STATUS === '1' && row.FILE_PATH"
type="text"
type="primary"
text
link
@click="fnHandleDownload(row.FILE_PATH)"
>下载</el-button
>
下载
</el-button>
<el-button
v-show="row.STATUS === '-1' && row.FILE_PATH"
type="text"
type="primary"
text
link
@click="fnRedownLoad(row.ARCHIVES_PDF_FILE_ID)"
>重新下载</el-button
>
重新下载
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import LayoutTable from "@/components/table/index.vue";
import { serialNumber } from "@/assets/js/utils";
import { serialNumber, translationStatus } from "@/assets/js/utils";
import { ElMessageBox } from "element-plus";
import { reactive, ref } from "vue";
import {
getPdffileList,
redownLoad,
} from "@/request/training_archive_management.js";
import useListData from "@/assets/js/useListData.js";
const tableRef = ref(null);
const FILE_URL = import.meta.env.VITE_FILE_URL;
const data = reactive({
typeList: [
{ id: "1", name: "一人一档" },
{ id: "2", name: "一期一档" },
{ id: "3", name: "一企一档" },
],
statusList: [
{ id: "0", name: "上传中" },
{ id: "1", name: "上传成功" },
{ id: "-1", name: "上传失败" },
{ id: "-2", name: "已删除" },
],
});
const typeList = [
{ ID: "1", NAME: "一人一档" },
{ ID: "2", NAME: "一期一档" },
{ ID: "3", NAME: "一企一档" },
];
const statusList = [
{ ID: "0", NAME: "上传中" },
{ ID: "1", NAME: "上传成功" },
{ ID: "-1", NAME: "上传失败" },
{ ID: "-2", NAME: "已删除" },
];
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getPdffileList);
const fnHandleDownload = (filePath) => {
window.open(FILE_URL + filePath);
};
const fnRedownLoad = async (ARCHIVES_PDF_FILE_ID) => {
ElMessageBox.confirm("确定要重新下载吗?(如状态未更新,请稍后刷新页面)", {
await ElMessageBox.confirm(
"确定要重新下载吗?(如状态未更新,请稍后刷新页面)",
{
type: "info",
});
}
);
await redownLoad({
ARCHIVES_PDF_FILE_ID,
});
setTimeout(() => {
fnGetData();
}, 2000);
};
</script>

View File

@ -19,16 +19,19 @@
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table :data="data.list" :show-pagination="false">
<el-table-column prop="NAME" label="目录" />
<el-table-column label="操作" width="150">
<template #default="{ row }">
<el-button type="primary" text link @click="fnEdit(row)"
>编辑</el-button
>
<el-button type="primary" text link @click="fnEdit(row)">
编辑
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
<component
:is="data.component"
v-if="data.component"
@ -37,12 +40,10 @@
:corp-name="data.corp_name"
:year="data.YEAR"
/>
</el-card>
</div>
</template>
<script setup>
import LayoutTable from "@/components/table/index.vue";
import { markRaw, reactive } from "vue";
import dayjs from "dayjs";
import { debounce } from "throttle-debounce";

View File

@ -101,7 +101,6 @@
</template>
<script setup>
import LayoutTable from "@/components/table/index";
import { nextTick, reactive, watchEffect } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { debounce } from "throttle-debounce";

View File

@ -57,7 +57,6 @@
</template>
<script setup>
import LayoutTable from "@/components/table/index";
import { watchEffect } from "vue";
import { ElMessageBox } from "element-plus";
import { debounce } from "throttle-debounce";

View File

@ -39,18 +39,19 @@
<div>档案管理人员:</div>
<div>更新日期:</div>
</div>
<template #footer> <el-button @click="fnClose"></el-button> </template>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
<pdf
v-model:visible="data.dialogForFile.visible"
:title="'安全培训教育计划'"
:type="103"
title="安全培训教育计划"
:type="type"
:year="year"
/>
</el-dialog>
</template>
<script setup>
import LayoutTable from "@/components/table/index";
import { reactive, watchEffect } from "vue";
import { ElMessageBox } from "element-plus";
import { debounce } from "throttle-debounce";

View File

@ -101,10 +101,6 @@ const props = defineProps({
type: String,
required: true,
},
corpName: {
type: String,
required: true,
},
year: {
type: String,
required: true,

View File

@ -88,7 +88,6 @@
</template>
<script setup>
import LayoutTable from "@/components/table/index";
import { nextTick, reactive, watchEffect } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { debounce } from "throttle-debounce";
@ -135,6 +134,7 @@ const data = reactive({
CARD_ID: "",
EFFECTIVE_DATE: "",
RETRAINING: "",
file: [],
},
},
});
@ -174,6 +174,7 @@ const fnRowDblclick = async (row) => {
ARCHIVES_POSTMAN_ID: row.ARCHIVES_POSTMAN_ID,
});
data.addOrEditDialog.form = resData.pd;
data.addOrEditDialog.form.file = [{ url: FILE_URL + resData.pd.FILEPATH }];
data.addOrEditDialog.type = "edit";
} else data.addOrEditDialog.type = "add";
};

View File

@ -15,13 +15,11 @@
<el-form-item label="手机号" prop="PHONE">
<el-input v-model="form.PHONE" />
</el-form-item>
<el-form-item label="照片" prop="hideUpload">
<el-form-item label="照片" prop="file">
<layout-upload
v-model:file-list="form.hideUpload"
v-model:file-list="form.file"
accept=".jpg,.jpeg,.png"
list-type="picture-card"
:limit="1"
delete-to-server
/>
</el-form-item>
<el-form-item label="证书号" prop="CARD_ID">
@ -99,7 +97,7 @@ const rules = {
trigger: "blur",
},
],
hideUpload: [{ required: true, message: "照片不能为空", trigger: "blur" }],
file: [{ required: true, message: "照片不能为空", trigger: "blur" }],
CARD_ID: [{ required: true, message: "证书号不能为空", trigger: "blur" }],
EFFECTIVE_DATE: [
{ required: true, message: "请选择证书有效期限", trigger: "change" },
@ -121,8 +119,8 @@ const fnSubmit = debounce(
Object.keys(props.form).forEach((key) => {
formData.append(key, props.form[key]);
});
if (props.form.hideUpload[0].raw) {
formData.append("FFILE", props.form.hideUpload[0].raw);
if (props.form.file[0].raw) {
formData.append("FFILE", props.form.file[0].raw);
}
formData.append("YEAR", props.year);
props.type === "add"

View File

@ -16,13 +16,13 @@
<el-table-column type="index" label="序号" width="60" />
<el-table-column prop="NAME" label="姓名" />
<el-table-column prop="WORKYEAR" label="从事本专业工作年限" />
<el-table-column prop="OCCUPATION" label="专/兼职">
<el-table-column label="专/兼职" width="100">
<span>兼职</span>
</el-table-column>
<el-table-column prop="CARD_ID" label="证书编号" />
<el-table-column prop="ASSESSMENTDEPARTMENT" label="考核部门" />
<el-table-column prop="ASSESSMENTTIME" label="考核日期" />
<el-table-column prop="ASSESSMENTRESULT" label="考核结果" />
<el-table-column prop="ASSESSMENTTIME" label="考核日期" width="100" />
<el-table-column prop="ASSESSMENTRESULT" label="考核结果" width="100" />
<el-table-column prop="DESCR" label="备注" />
</layout-table>
<div class="flex mt">
@ -36,7 +36,6 @@
</template>
<script setup>
import LayoutTable from "@/components/table/index";
import { watchEffect } from "vue";
import { ElMessageBox } from "element-plus";
import { debounce } from "throttle-debounce";

View File

@ -1,5 +1,5 @@
<template>
<div>
<layout-card>
<div class="tr mb">
<el-button type="primary" @click="fnExport"></el-button>
</div>
@ -11,7 +11,7 @@
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column prop="NAME" label="目录" />
<el-table-column prop="" label="操作" width="140">
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button type="primary" text link @click="fnView(row)">
编辑
@ -25,37 +25,11 @@
v-model:type="data.type"
:title="data.title"
:clazz-id="CLASS_ID"
:post-id="POST_ID"
:corp-info-id="CORPINFO_ID"
:corp-name="CORP_NAME"
:post-name="POST_NAME"
/>
<el-dialog
:model-value="data.delayDialog.visible"
title="设置"
width="500px"
append-to-body
>
<el-form
ref="delayDialogForm"
:model="data.delayDialog.form"
:rules="data.delayDialog.rules"
label-width="80px"
>
<el-form-item label="编制日期" prop="TIME">
<el-date-picker
v-model="data.delayDialog.form.TIME"
value-format="YYYY-MM-DD"
style="width: 100%"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" @click="submit"> </el-button>
<el-button @click="data.delayDialog.visible = false"> </el-button>
</template>
</el-dialog>
</div>
<setting v-model:visible="data.settingDialogVisible" @submit="fnSubmit" />
</layout-card>
</template>
<script setup>
@ -66,16 +40,16 @@ import Results from "./components/results.vue";
import SignatureForm from "./components/signature_form.vue";
import { markRaw, reactive, ref } from "vue";
import { useRoute, useRouter } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import {
getClassPapers,
downloadArchiveDirectory,
} from "@/request/training_archive_management.js";
import Setting from "./components/setting.vue";
const router = useRouter();
const route = useRoute();
const { CLASS_ID, CORP_NAME, CLASS_NAME, CORPINFO_ID, POST_ID, POST_NAME } =
route.query;
const { CLASS_ID, CORP_NAME, CLASS_NAME, CORPINFO_ID } = route.query;
const tableRef = ref(null);
const data = reactive({
list: [
@ -114,15 +88,7 @@ const data = reactive({
type: 0,
title: "",
component: "",
delayDialog: {
visible: false,
form: {
TIME: "",
},
rules: {
TIME: [{ required: true, message: "请选择日期", trigger: "blur" }],
},
},
settingDialogVisible: false,
});
const fnView = ({ TYPE, NAME, component, url }) => {
if (!component && url) {
@ -139,30 +105,23 @@ const fnView = ({ TYPE, NAME, component, url }) => {
}
};
const fnExport = async () => {
let setDateFlag = false;
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要导出的项");
return;
}
for (let i = 0; i < selectionData.length; i++) {
if (JSON.stringify(selectionData[i].TYPE) === "101") {
setDateFlag = true;
}
}
if (setDateFlag) {
const TYPE = selectionData.map((item) => item.TYPE);
if (TYPE.includes(101)) {
await ElMessageBox.confirm("导出前,请设置培训计划表中的编制日期", {
type: "warning",
});
data.delayDialog.visible = true;
data.settingDialogVisible = true;
} else {
submit();
await fnSubmit();
}
};
const submit = async () => {
data.delayDialog.visible = false;
const fnSubmit = async (UPDATE_DATE) => {
const selectionData = tableRef.value.getSelectionRows();
//
if (
selectionData.length === 1 &&
JSON.stringify(selectionData[0].TYPE) === "103"
@ -171,13 +130,13 @@ const submit = async () => {
if (resData.varList.length === 0) {
ElMessage.error("培训考核试卷没有数据!");
} else {
recordDownLoad(selectionData);
await recordDownLoad(selectionData, UPDATE_DATE);
}
} else {
recordDownLoad(selectionData);
await recordDownLoad(selectionData, UPDATE_DATE);
}
};
const recordDownLoad = async (selectionData) => {
const recordDownLoad = async (selectionData, UPDATE_DATE) => {
const archiveDirectory = [];
for (let i = 0; i < selectionData.length; i++) {
archiveDirectory.push({
@ -191,7 +150,7 @@ const recordDownLoad = async (selectionData) => {
CLASS_ID,
CORPINFO_ID,
typeList: JSON.stringify(archiveDirectory),
UPDATE_DATE: data.delayDialog.form.TIME,
UPDATE_DATE,
});
await ElMessageBox.confirm("导出后请前往档案下载中下载该档案!", "温馨提示", {
type: "info",

View File

@ -0,0 +1,142 @@
<template>
<el-dialog
v-model="visible"
:title="type === 'edit' ? '修改' : '新增'"
@close="fnClose"
>
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="审查人员" prop="REVIEW_USER">
<el-select v-model="form.REVIEW_USER" @change="fnReviewersChange">
<el-option
v-for="item in reviewersList"
:key="item.REVIEW_USER_ID"
:label="item.NAME"
:value="item.REVIEW_USER_ID"
/>
</el-select>
<span v-if="reviewersList.length === 0" class="text-red">
*请到审查人员管理菜单中配置
</span>
</el-form-item>
<el-form-item label="工作部门" prop="DEPARTMENT_NAME">
<el-input v-model="form.DEPARTMENT_NAME" disabled />
</el-form-item>
<el-form-item label="职务/职称" prop="DUTIES">
<el-input v-model="form.DUTIES" disabled />
</el-form-item>
<el-form-item label="审查意见" prop="CHECK_OPINION">
<el-input v-model="form.CHECK_OPINION" />
</el-form-item>
<el-form-item v-show="form.SIGN_PICTURE" label="本人签字">
<img
:src="VITE_FILE_URL + form.SIGN_PICTURE"
alt=""
width="300"
height="100"
/>
</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 {
getReviewersList,
setReviewRecordAdd,
setReviewRecordEdit,
} from "@/request/training_archive_management.js";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
type: {
type: String,
required: true,
default: "",
},
form: {
type: Object,
required: true,
default: () => {},
},
outerLayerForm: {
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 reviewersList = ref([]);
const rules = {
REVIEW_USER: [
{ required: true, message: "审查人员不能为空", trigger: "change" },
],
CHECK_OPINION: [
{ required: true, message: "审查意见不能为空", trigger: "blur" },
],
DEPARTMENT_NAME: [
{ required: true, message: "工作部门不能为空", trigger: "blur" },
],
DUTIES: [{ required: true, message: "职务/职称不能为空", trigger: "blur" }],
};
const fnGetReviewersList = async () => {
const resData = await getReviewersList();
reviewersList.value = resData.varList;
};
fnGetReviewersList();
const fnReviewersChange = (event) => {
for (let i = 0; i < reviewersList.value.length; i++) {
if (reviewersList.value[i].REVIEW_USER_ID === event) {
form.value.DEPARTMENT_NAME = reviewersList.value[i].DEPARTMENT_NAME;
form.value.DUTIES = reviewersList.value[i].DUTIES;
form.value.SIGN_PICTURE = reviewersList.value[i].SIGN_PICTURE;
break;
}
}
};
const fnClose = () => {
formRef.value.resetFields();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const formData = new FormData();
Object.keys(props.outerLayerForm).forEach((key) => {
formData.append(key, props.outerLayerForm[key]);
});
formData.append("REVIEW_USER", form.value.REVIEW_USER);
formData.append("CHECK_OPINION", form.value.CHECK_OPINION);
form.value.ARCHIVES_REVIEW_RECORD_ID &&
formData.append(
"ARCHIVES_REVIEW_RECORD_ID",
form.value.ARCHIVES_REVIEW_RECORD_ID
);
props.type === "add"
? await setReviewRecordAdd(formData)
: await setReviewRecordEdit(formData);
ElMessage.success("操作成功");
fnClose();
emits("get-data");
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -13,19 +13,19 @@
{{ item.CURRICULUMNAME }}
</h2>
<div
v-for="(cha, i) in item.chapterList"
:key="i"
v-for="(item1, index1) in item.chapterList"
:key="index1"
style="padding-bottom: 20px"
>
<div v-if="item.CATALOGUELEVEL === '1'">
<dt>{{ i + 1 }}.{{ cha.CHAPTER_NAME }}</dt>
<dd>课件描述 {{ cha.COURSEWAREINTRODUCE }}</dd>
<dt>{{ index1 + 1 }}.{{ item1.CHAPTER_NAME }}</dt>
<dd>课件描述 {{ item1.COURSEWAREINTRODUCE }}</dd>
</div>
<div v-else-if="item.CATALOGUELEVEL === '2'">
<dt>{{ i + 1 }}.{{ cha.CHAPTER_NAME }}</dt>
<div v-for="(video, j) in cha.nodes" :key="j">
<dd>{{ j + 1 }}.{{ video.CHAPTER_NAME }}</dd>
<dd>课件描述 {{ video.COURSEWAREINTRODUCE }}</dd>
<dt>{{ index1 + 1 }}.{{ item1.CHAPTER_NAME }}</dt>
<div v-for="(item2, index2) in item1.nodes" :key="index2">
<dd>{{ index2 + 1 }}.{{ item2.CHAPTER_NAME }}</dd>
<dd>课件描述 {{ item2.COURSEWAREINTRODUCE }}</dd>
</div>
</div>
</div>
@ -57,22 +57,6 @@ const props = defineProps({
type: String,
required: true,
},
postId: {
type: String,
required: true,
},
corpInfoId: {
type: String,
required: true,
},
corpName: {
type: String,
required: true,
},
postName: {
type: String,
required: true,
},
curriculumId: {
type: String,
required: true,

View File

@ -9,9 +9,9 @@
<el-button type="primary" @click="fnExport"></el-button>
</div>
<div class="flex mb">
<p>班级名称:{{ data.info.NAME }}</p>
<p>班级名称:{{ info.NAME }}</p>
</div>
<table>
<table class="print_table">
<tr>
<td width="5%">序号</td>
<td width="10%">学员姓名</td>
@ -20,7 +20,7 @@
<td width="10%">头像</td>
<td colspan="5">认证照片</td>
</tr>
<template v-for="(item, index) in data.list" :key="index">
<template v-for="(item, index) in list" :key="index">
<tr style="height: 75px">
<td width="5%">{{ index + 1 }}</td>
<td width="10%">{{ item.NAME }}</td>
@ -85,13 +85,14 @@
</template>
<script setup>
import { reactive, watchEffect } from "vue";
import { ref, watchEffect } from "vue";
import { ElMessageBox } from "element-plus";
import {
getClassGoEdit,
getStudentFaces,
downloadImagedata,
} from "@/request/training_archive_management.js";
import useListData from "@/assets/js/useListData.js";
const props = defineProps({
type: {
@ -106,27 +107,8 @@ const props = defineProps({
type: String,
required: true,
},
postId: {
type: String,
required: true,
},
corpInfoId: {
type: String,
required: true,
},
corpName: {
type: String,
required: true,
},
postName: {
type: String,
required: true,
},
});
const data = reactive({
info: {},
list: [],
});
const info = ref({});
const emits = defineEmits(["update:type"]);
const FILE_URL = import.meta.env.VITE_FILE_URL;
const fnGetData = async () => {
@ -134,26 +116,25 @@ const fnGetData = async () => {
TYPE: props.type,
CLASS_ID: props.clazzId,
});
data.info = resData.pd;
info.value = resData.pd;
};
const fnStudentFaces = async () => {
const resData = await getStudentFaces({
CLASS_ID: props.clazzId,
const { list, fnGetData: fnStudentFaces } = useListData(getStudentFaces, {
usePagination: false,
immediate: false,
key: "studentList",
callbackFn: (list) => {
list.forEach((item) => {
if (item.FACES) item.FACES = item.FACES.split(",");
else item.FACES = [];
});
data.list = resData.studentList;
data.list.forEach((item) => {
if (item.FACES) {
item.FACES = item.FACES.split(",");
} else {
item.FACES = [];
}
});
};
fnStudentFaces();
},
});
watchEffect(() => {
if (props.type === 107) {
fnGetData();
fnStudentFaces();
fnStudentFaces({
CLASS_ID: props.clazzId,
});
}
});
const fnExport = async () => {
@ -176,16 +157,4 @@ const fnClose = () => {
align-items: center;
justify-content: space-between;
}
table {
border-collapse: collapse;
width: 100%;
td {
border: 1px solid var(--el-border-color);
padding: 8px;
font-size: 14px;
text-align: center;
}
}
</style>

View File

@ -8,34 +8,31 @@
<div class="tr mb">
<el-button type="primary" @click="fnExport"></el-button>
</div>
<div
class="title"
style="text-align: center; font-size: 28px; color: #000000"
>
<h2 class="tc">
{{ data.info.EXAMNAME }}
</div>
</h2>
<div class="tc mt">(满分:{{ data.info.EXAMSCORE || 0 }})</div>
<dl v-for="(item, index) in data.questionList" :key="item.QUESTION_ID">
<dt>
<el-tag v-if="item.QUESTIONTYPE === '1'" type="success">
(单选题)
</el-tag>
<el-tag v-if="item.QUESTIONTYPE === '2'"> () </el-tag>
<el-tag v-if="item.QUESTIONTYPE === '3'" type="warning">
(判断题)
</el-tag>
<el-tag v-if="item.QUESTIONTYPE === '4'" type="danger">
(填空题)
</el-tag>
{{ index + 1 }}.{{ item.QUESTIONDRY }}
<span class="ml">
<div class="items mt-20 p-20">
<div
v-for="(item, index) in data.questionList"
:key="item.QUESTION_ID"
class="item ptb-20"
>
<div class="mt-10">
{{ index + 1 }}.
<span v-if="item.QUESTIONTYPE === '1'"> () </span>
<span v-if="item.QUESTIONTYPE === '2'"> () </span>
<span v-if="item.QUESTIONTYPE === '3'"> () </span>
{{ item.QUESTIONDRY }}
<span class="ml-10">
(题目分值{{ item.SCORE }} 正确答案{{ item.ANSWER }})
</span>
</dt>
</div>
<div class="mt-10 ml-30">
<el-radio-group
v-if="item.QUESTIONTYPE === '1'"
v-model="item.ANSWER"
:disabled="true"
disabled
:model-value="item.ANSWER"
>
<el-radio value="A">A.{{ item.OPTIONA }}</el-radio>
<el-radio value="B">B.{{ item.OPTIONB }}</el-radio>
@ -44,8 +41,8 @@
</el-radio-group>
<el-checkbox-group
v-if="item.QUESTIONTYPE === '2'"
v-model="item.checkList"
:disabled="true"
disabled
:model-value="item.ANSWER?.split('')"
>
<el-checkbox value="A">A.{{ item.OPTIONA }}</el-checkbox>
<el-checkbox value="B">B.{{ item.OPTIONB }}</el-checkbox>
@ -54,16 +51,15 @@
</el-checkbox-group>
<el-radio-group
v-if="item.QUESTIONTYPE === '3'"
v-model="item.ANSWER"
:disabled="true"
class="panduan"
disabled
:model-value="item.ANSWER"
>
<el-radio value="A">A.{{ item.OPTIONA }}</el-radio>
<div class="el-radio"></div>
<el-radio value="B">B.{{ item.OPTIONB }}</el-radio>
<div class="el-radio"></div>
</el-radio-group>
</dl>
</div>
</div>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
@ -107,14 +103,6 @@ const fnGetData = async () => {
});
data.info = resData.paper;
data.questionList = resData.questionList;
for (let i = 0; i < data.questionList.length; i++) {
if (
data.questionList[i].QUESTIONTYPE === "2" &&
data.questionList[i].ANSWER
) {
data.questionList[i].checkList = data.questionList[i].ANSWER.split("");
}
}
};
watchEffect(() => {
@ -136,44 +124,18 @@ const fnClose = () => {
</script>
<style scoped lang="scss">
dl {
width: 100%;
}
:deep {
.el-radio__input.is-disabled + span.el-radio__label {
white-space: break-spaces;
word-break: break-all;
line-height: 20px;
.items {
border: 1px solid var(--el-border-color);
.item {
border-bottom: 1px dashed #ebeef5;
&:first-child {
padding-top: 0;
}
.el-checkbox__input.is-disabled + span.el-checkbox__label {
white-space: break-spaces;
word-break: break-all;
line-height: 20px;
}
.el-radio-group {
width: 90%;
margin: 0 5%;
justify-content: space-between;
flex-wrap: wrap;
.el-radio {
width: 25%;
margin-right: 0;
height: auto;
min-height: 30px;
}
}
.el-checkbox-group {
width: 90%;
margin: 0 5%;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
.el-checkbox {
flex-basis: 25%;
margin-right: 0;
height: auto;
min-height: 30px;
line-height: 10px;
&:last-child {
border-bottom: none;
}
}
}

View File

@ -9,7 +9,7 @@
<el-button type="primary" @click="fnExport"></el-button>
</div>
<h2 class="tc mb">{{ data.clazz.NAME }}培训综合考评报告</h2>
<table>
<table class="print_table">
<tr class="tab_tr">
<td class="tc">培训班名称</td>
<td class="tc">{{ data.clazz.NAME }}</td>
@ -98,22 +98,10 @@ const props = defineProps({
type: String,
required: true,
},
postId: {
type: String,
required: true,
},
corpInfoId: {
type: String,
required: true,
},
corpName: {
type: String,
required: true,
},
postName: {
type: String,
required: true,
},
});
const data = reactive({
info: {},
@ -166,16 +154,4 @@ const fnClose = () => {
};
</script>
<style scoped lang="scss">
table {
border-collapse: collapse;
width: 100%;
td {
border: 1px solid var(--el-border-color);
padding: 8px;
font-size: 14px;
line-height: 1.6;
}
}
</style>
<style scoped lang="scss"></style>

View File

@ -16,7 +16,7 @@
>报表日期:{{ dayjs(data.clazz.END_TIME).format("YYYY-MM-DD") }}</span
>
</div>
<table>
<table class="print_table">
<tr>
<td colspan="2">公司名称</td>
</tr>
@ -47,7 +47,7 @@
</tr>
<tr>
<td colspan="6" style="padding: 0">
<table>
<table class="print_table">
<tr>
<td class="title" style="width: 5%">序号</td>
<td class="title" style="width: 15%">姓名</td>
@ -87,7 +87,7 @@
</tr>
<tr>
<td colspan="6" style="padding: 0">
<table>
<table class="print_table">
<tr>
<td class="title" style="width: 5%">序号</td>
<td class="title" style="width: 15%">姓名</td>
@ -254,16 +254,4 @@ const fnClose = () => {
align-items: center;
justify-content: space-between;
}
table {
width: 100%;
border-collapse: collapse;
td {
border: 1px solid var(--el-border-color);
padding: 8px;
font-size: 14px;
text-align: center;
}
}
</style>

View File

@ -6,37 +6,32 @@
@close="fnClose"
>
<div class="tr mb">
<el-button type="primary" @click="data.dialogFormEdit = true"
>新增</el-button
>
<el-button type="primary" @click="fnAdd"> </el-button>
<el-button type="primary" @click="fnExport"></el-button>
</div>
<el-divider content-position="left">
生产经营单位安全培训教材会审表
</el-divider>
<table>
<table class="print_table">
<tr>
<th>教材名称</th>
<td colspan="3">{{ props.curriculumname }}</td>
<th>出版书号</th>
<td>
<el-input v-model="data.form.BOOK_NUM" style="width: 100%"></el-input>
<el-input v-model="data.form.BOOK_NUM" />
</td>
</tr>
<tr>
<th>编写单位</th>
<td colspan="3">
<el-input
v-model="data.form.CORP_NAME"
style="width: 100%"
></el-input>
<el-input v-model="data.form.CORP_NAME" />
</td>
<th>编写时间</th>
<td>
<el-date-picker
v-model="data.form.CREATTIME"
value-format="YYYY-MM-DD"
style="width: 100%"
format="YYYY-MM-DD"
/>
</td>
</tr>
@ -47,24 +42,18 @@
<tr>
<th width="12%">会审地点</th>
<td width="15%">
<el-input
v-model="data.form.CORP_NAME"
style="width: 100%"
></el-input>
<el-input v-model="data.form.enterpriseName" />
</td>
<th width="12%">主持人</th>
<td width="25%">
<el-input
v-model="data.form.REVIEW_PERSON"
style="width: 100%"
></el-input>
<el-input v-model="data.form.REVIEW_PERSON" />
</td>
<th width="12%">会审时间</th>
<td width="24%">
<el-date-picker
v-model="data.form.REVIEW_TIME"
value-format="YYYY-MM-DD"
style="width: 100%"
format="YYYY-MM-DD"
/>
</td>
</tr>
@ -73,199 +62,90 @@
</tr>
<tr>
<td colspan="6" style="padding: 0">
<table>
<tr>
<td class="tc">审查人员</td>
<td class="tc">工作部门</td>
<td class="tc">职务/职称</td>
<td class="tc">审查意见</td>
<td class="tc">本人签字</td>
</tr>
<template v-for="(item, index) in data.reviewRecord" :key="index">
<tr style="height: 40px">
<td class="tc">{{ item.NAME }}</td>
<td class="tc">{{ item.DEPARTMENT_NAME }}</td>
<td class="tc">{{ item.DUTIES }}</td>
<td class="tc">{{ item.CHECK_OPINION }}</td>
<td class="tc">
<viewer v-if="item.SIGN_PICTURE">
<layout-table
:data="data.reviewRecordList"
:show-pagination="false"
@row-dblclick="fnEdit"
>
<el-table-column label="审查人员" prop="NAME" />
<el-table-column label="工作部门" prop="DEPARTMENT_NAME" />
<el-table-column label="职务/职称" prop="DUTIES" />
<el-table-column label="审查意见" prop="CHECK_OPINION" />
<el-table-column label="本人签字">
<template #default="{ row }">
<viewer v-if="row.SIGN_PICTURE">
<img
:src="FILE_URL + item.SIGN_PICTURE"
:src="FILE_URL + row.SIGN_PICTURE"
alt=""
width="100"
height="25"
/>
</viewer>
</td>
</tr>
</template>
</table>
</el-table-column>
<el-table-column label="操作" width="80">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="fnDelete(row.ARCHIVES_REVIEW_RECORD_ID)"
>
删除
</el-button>
</template>
</el-table-column>
</layout-table>
</td>
</tr>
<tr style="height: 200px">
<th>会审意见</th>
<td colspan="5">此教材符合相关文件要求同意使用</td>
<td colspan="5">
<el-input v-model="data.form.REVIEW_OPINIONS" />
</td>
</tr>
</table>
<div class="footer">
<div>
单位盖章
<img :src="data.info.OFFICIAL_SEAL_PATH" />
<img :src="data.form.OFFICIAL_SEAL_PATH" />
</div>
<div>档案编号{{ data.info.CODE }}</div>
<div>档案编号{{ data.form.CODE }}</div>
<div>
归档日期{{ dayjs(data.info.END_TIME).format("YYYY年MM月DD日") }}
归档日期{{ dayjs(data.form.END_TIME).format("YYYY年MM月DD日") }}
</div>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"></el-button>
</template>
</el-dialog>
<el-dialog
v-if="data.dialogFormEdit"
v-model:visible="data.dialogFormEdit"
:append-to-body="true"
:title="data.dialogType === 'edit' ? '修改' : '新增'"
width="600px"
>
<el-form
ref="form"
:model="data.review.reviewform"
:rules="data.review.rules"
label-width="120px"
style="width: 500px"
>
<el-form-item label="审查人员" prop="REVIEW_USER">
<el-input
id="REVIEW_USER"
ref="REVIEW_USER"
v-model="reviewform.REVIEW_USER"
maxlength="255"
placeholder="这里输入审查人员..."
title="会审人员"
<add-review
v-model:visible="data.addDialog.visible"
v-model:form="data.addDialog.form"
:type="data.addDialog.type"
:outer-layer-form="data.form"
@get-data="fnGetReviewRecordList"
/>
</el-form-item>
<el-form-item label="工作部门" prop="DEPARTMENT">
<el-input
id="DEPARTMENT"
ref="DEPARTMENT"
v-model="data.review.reviewform.DEPARTMENT"
maxlength="255"
placeholder="这里输入工作部门..."
title="工作部门"
/>
</el-form-item>
<el-form-item label="职务/职称" prop="DUTIES">
<el-input
id="DUTIES"
ref="DUTIES"
v-model="data.review.reviewform.DUTIES"
maxlength="255"
placeholder="这里输入职务/职称..."
title="职务/职称"
/>
</el-form-item>
<el-form-item label="审查意见" prop="CHECK_OPINION">
<el-input
id="CHECK_OPINION"
ref="CHECK_OPINION"
v-model="data.review.reviewform.CHECK_OPINION"
maxlength="255"
placeholder="这里输入审查意见..."
title="审查意见"
/>
</el-form-item>
<el-form-item
v-show="data.review.reviewform.SIGN_PATH"
:span="24"
label="本人签字"
prop="SIGN_PATH"
>
<template #default="{}">
<img
:src="FILE_URL + data.review.reviewform.SIGN_PATH"
alt=""
width="300"
height="100"
/>
</template>
</el-form-item>
<el-form-item
v-show="!data.review.reviewform.SIGN_PATH"
:span="24"
label="本人签字"
prop="SIGN_PATH"
>
<el-select
v-model="data.review.reviewform.SIGNTYPE"
style="width: 100%"
>
<el-option
v-for="idx in options"
:key="idx.value"
:label="idx.label"
:value="idx.value"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="data.review.reviewform.SIGNTYPE === '0'"
prop="SIGN_PICTURE"
>
<vue-esign
ref="esign"
:width="500"
:height="300"
style="border: 1px dashed #2f0e0e"
>
<span>请在虚线内进行签名...</span>
</vue-esign>
</el-form-item>
<el-form-item v-if="data.review.reviewform.SIGNTYPE === '1'">
<el-upload
:on-preview="handlePreviewSignPicture"
:on-remove="handleRemoveSignPicture"
:on-change="handleChangeSignPicture"
:auto-upload="false"
:file-list="data.review.reviewform.SIGN_PICTURE_2"
:limit="1"
:class="{ hide: signPictureUpload }"
action="#"
accept=".png"
list-type="picture-card"
>
<i class="el-icon-plus" />
</el-upload>
<el-dialog v-model:visible="data.signPictureVisible" append-to-body>
<img :src="data.review.reviewform.SIGN_PATH" width="100%" alt="" />
</el-dialog>
</el-form-item>
</el-form>
<template #footer>
<el-button
v-if="data.review.reviewform.SIGNTYPE === '0'"
@click="
$refs.esign && $refs.esign.reset();
data.review.reviewform.SIGN_PATH = '';
"
>重签</el-button
>
<el-button @click="data.dialogFormEdit = false"> </el-button>
<el-button type="primary" @click="confirm"> </el-button>
</template>
</el-dialog>
</template>
<script setup>
import dayjs from "dayjs";
import { reactive, watchEffect } from "vue";
import { ElMessageBox } from "element-plus";
import { nextTick, reactive, watchEffect } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import {
getClassGoEdit,
getReviewGoEdit,
getReviewRecord,
getReviewRecordList,
downloadHs,
getReviewAdd,
getReviewEdit,
setReviewRecordDelete,
setReviewRecordView,
} from "@/request/training_archive_management.js";
import { debounce } from "throttle-debounce";
import AddReview from "./add_review.vue";
const FILE_URL = import.meta.env.VITE_FILE_URL;
const props = defineProps({
type: {
@ -284,14 +164,6 @@ const props = defineProps({
type: String,
required: true,
},
corpName: {
type: String,
required: true,
},
postName: {
type: String,
required: true,
},
industryAllName: {
type: String,
required: true,
@ -306,29 +178,28 @@ const props = defineProps({
},
});
const data = reactive({
info: {},
form: {},
reviewInfo: {},
reviewRecord: {},
form: {
ARCHIVES_REVIEW_ID: "",
dialogFormEdit: false,
signPictureVisible: false,
dialogType: "add",
review: {
reviewform: {},
rules: {
REVIEW_USER: [
{ required: true, message: "审查人员不能为空", trigger: "blur" },
],
DEPARTMENT: [
{ required: true, message: "工作部门不能为空", trigger: "blur" },
],
DUTIES: [
{ required: true, message: "职务/职称不能为空", trigger: "blur" },
],
CHECK_OPINION: [
{ required: true, message: "审查意见不能为空", trigger: "blur" },
],
CODE: "",
END_TIME: "",
BOOK_NUM: "",
CORP_NAME: "",
CREATTIME: "",
enterpriseName: "",
REVIEW_PERSON: "",
REVIEW_TIME: "",
REVIEW_OPINIONS: "此教材符合相关文件要求,同意使用。",
},
reviewRecordList: [],
addDialog: {
visible: false,
type: "",
form: {
REVIEW_USER: "",
DEPARTMENT_NAME: "",
DUTIES: "",
CHECK_OPINION: "",
SIGN_PICTURE: "",
},
},
});
@ -338,38 +209,74 @@ const fnGetData = async () => {
TYPE: props.type,
CLASS_ID: props.clazzId,
});
data.info = resData.pd;
data.form = resData.pd;
//
const reviewInfo = await getReviewGoEdit({
CLASS_ID: props.clazzId,
CURRICULUM_ID: props.curriculumId,
});
data.reviewInfo = reviewInfo.pd;
if (reviewInfo.pd) {
data.reviewInfo = reviewInfo.pd;
if (reviewInfo.pd.ARCHIVES_REVIEW_ID) {
data.ARCHIVES_REVIEW_ID = reviewInfo.pd.ARCHIVES_REVIEW_ID;
if (reviewInfo.pd.CORP_NAME) {
data.info.CORP_NAME = reviewInfo.pd.CORP_NAME;
}
if (reviewInfo.pd.CREATTIME) {
data.info.CREATTIME = reviewInfo.pd.CREATTIME;
}
if (reviewInfo.pd.END_TIME) {
data.info.END_TIME = reviewInfo.pd.END_TIME;
data.form.ARCHIVES_REVIEW_ID = reviewInfo.pd.ARCHIVES_REVIEW_ID;
if (reviewInfo.pd.REVIEW_TIME)
data.form.REVIEW_TIME = reviewInfo.pd.REVIEW_TIME;
if (reviewInfo.pd.REVIEW_PERSON)
data.form.REVIEW_PERSON = reviewInfo.pd.REVIEW_PERSON;
if (reviewInfo.pd.BOOK_NUM) data.form.BOOK_NUM = reviewInfo.pd.BOOK_NUM;
data.form.REVIEW_OPINIONS =
reviewInfo.pd.REVIEW_OPINIONS || "此教材符合相关文件要求,同意使用。";
if (reviewInfo.pd.CODE) data.form.CODE = reviewInfo.pd.CODE;
if (reviewInfo.pd.END_TIME) data.form.END_TIME = reviewInfo.pd.END_TIME;
if (reviewInfo.pd.enterpriseName)
data.form.enterpriseName = reviewInfo.pd.enterpriseName;
if (reviewInfo.pd.CORP_NAME)
data.form.CORP_NAME = reviewInfo.pd.CORP_NAME;
if (reviewInfo.pd.CREATTIME)
data.form.CREATTIME = reviewInfo.pd.CREATTIME;
await fnGetReviewRecordList();
}
}
//
const reviewRecord = await getReviewRecord({
ARCHIVES_REVIEW_ID: data.ARCHIVES_REVIEW_ID,
};
const fnGetReviewRecordList = async () => {
const reviewRecord = await getReviewRecordList({
ARCHIVES_REVIEW_ID: data.form.ARCHIVES_REVIEW_ID,
});
data.reviewRecord = reviewRecord.pd;
}
data.reviewRecordList = reviewRecord.varList;
};
watchEffect(() => {
if (props.type === 100) fnGetData();
});
const fnAdd = () => {
if (data.reviewRecordList.length < 10) {
data.reviewRecordList.push({});
} else {
ElMessage.warning("已经超出上限最多只能添加10条");
}
};
const fnEdit = async ({ ARCHIVES_REVIEW_RECORD_ID }) => {
data.addDialog.visible = true;
await nextTick();
if (!ARCHIVES_REVIEW_RECORD_ID) {
data.addDialog.type = "add";
} else {
const resData = await setReviewRecordView({ ARCHIVES_REVIEW_RECORD_ID });
data.addDialog.form = resData.pd;
data.addDialog.type = "edit";
}
};
const fnDelete = debounce(
1000,
async (ARCHIVES_REVIEW_RECORD_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
ARCHIVES_REVIEW_RECORD_ID &&
(await setReviewRecordDelete({ ARCHIVES_REVIEW_RECORD_ID }));
ElMessage.success("删除成功");
await fnGetReviewRecordList();
},
{ atBegin: true }
);
const fnExport = async () => {
await ElMessageBox.confirm("确定要导出吗?", { type: "warning" });
await downloadHs({
@ -384,28 +291,23 @@ const fnExport = async () => {
const fnClose = () => {
emits("update:type", 0);
};
const fnSubmit = debounce(
1000,
async () => {
!data.form.ARCHIVES_REVIEW_ID
? await getReviewAdd({ ...data.form, CURRICULUM_ID: props.curriculumId })
: await getReviewEdit({
...data.form,
CURRICULUM_ID: props.curriculumId,
});
ElMessage.success("保存成功");
fnClose();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss">
table {
border-collapse: collapse;
width: 100%;
td {
border: 1px solid var(--el-border-color);
padding: 8px;
font-size: 14px;
line-height: 1.6;
}
th {
background: var(--el-fill-color-light);
border: 1px solid var(--el-border-color);
padding: 8px;
text-align: center;
}
}
.footer {
margin-top: 40px;
display: flex;
@ -424,4 +326,11 @@ table {
}
}
}
:deep(.el-input) {
.el-input__wrapper {
box-shadow: none;
background-color: transparent;
}
}
</style>

View File

@ -0,0 +1,49 @@
<template>
<el-dialog v-model="visible" title="设置" width="500px" @close="fnClose">
<el-form ref="formRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="编制日期" prop="TIME">
<el-date-picker
v-model="form.TIME"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" @click="fnSubmit"> </el-button>
<el-button @click="fnClose"> </el-button>
</template>
</el-dialog>
</template>
<script setup>
import { ref } from "vue";
import { useVModel } from "@vueuse/core";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
});
const emits = defineEmits(["update:visible", "submit"]);
const visible = useVModel(props, "visible", emits);
const form = ref({
TIME: "",
});
const rules = {
TIME: [{ required: true, message: "请选择日期", trigger: "change" }],
};
const formRef = ref(null);
const fnClose = () => {
formRef.value.resetFields();
visible.value = false;
};
const fnSubmit = () => {
emits("submit", form.value.TIME);
fnClose();
};
</script>
<style scoped lang="scss"></style>

View File

@ -10,7 +10,7 @@
</div>
<div>
<h2 class="tc">安全培训教育记录及签字表</h2>
<table class="mt">
<table class="mt print_table">
<tr>
<td class="tc">日期</td>
<td class="tc">
@ -38,7 +38,7 @@
</tr>
<tr>
<td colspan="6" style="padding: 0">
<table>
<table class="print_table">
<tr>
<td class="tc">姓名</td>
<td class="tc">部门</td>
@ -127,22 +127,10 @@ const props = defineProps({
type: String,
required: true,
},
postId: {
type: String,
required: true,
},
corpInfoId: {
type: String,
required: true,
},
corpName: {
type: String,
required: true,
},
postName: {
type: String,
required: true,
},
});
const FILE_URL = import.meta.env.VITE_FILE_URL;
const data = reactive({
@ -180,16 +168,4 @@ const fnClose = () => {
};
</script>
<style scoped lang="scss">
table {
border-collapse: collapse;
width: 100%;
td {
border: 1px solid var(--el-border-color);
padding: 8px;
font-size: 14px;
line-height: 1.6;
}
}
</style>
<style scoped lang="scss"></style>

View File

@ -12,7 +12,7 @@
<h3>{{ corpName }}培训计划</h3>
</div>
<p class="mb">单位名称:{{ corpName }}</p>
<layout-table :data="data.list" :show-pagination="false">
<layout-table :data="list" :show-pagination="false">
<el-table-column type="index" label="序号" width="50" />
<el-table-column label="培训人员类型"> 从业人员 </el-table-column>
<el-table-column prop="POST_NAME" label="岗位(工种)" />
@ -40,42 +40,19 @@
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
<el-dialog
:model-value="data.delayDialog.visible"
title="设置"
width="500px"
append-to-body
>
<el-form
ref="delayDialogForm"
:model="data.delayDialog.form"
:rules="data.delayDialog.rules"
label-width="80px"
>
<el-form-item label="编制日期" prop="TIME">
<el-date-picker
v-model="data.delayDialog.form.TIME"
value-format="YYYY-MM-DD"
style="width: 100%"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" @click="submit"> </el-button>
<el-button @click="data.delayDialog.visible = false"> </el-button>
</template>
</el-dialog>
<setting v-model:visible="settingDialogVisible" @submit="fnSubmit" />
</template>
<script setup>
import LayoutTable from "@/components/table/index";
import { reactive, watchEffect } from "vue";
import { ref, watchEffect } from "vue";
import { ElMessageBox } from "element-plus";
import {
getTrainingSchedule,
downloadTrainingPlan,
} from "@/request/training_archive_management.js";
import dayjs from "dayjs";
import useListData from "@/assets/js/useListData.js";
import Setting from "@/views/archives_management/semester/components/setting.vue";
const props = defineProps({
type: {
@ -90,57 +67,35 @@ const props = defineProps({
type: String,
required: true,
},
postId: {
type: String,
required: true,
},
corpInfoId: {
type: String,
required: true,
},
corpName: {
type: String,
required: true,
},
postName: {
type: String,
required: true,
},
});
const data = reactive({
list: [],
delayDialog: {
visible: false,
form: {
TIME: "",
},
rules: {
TIME: [{ required: true, message: "请选择日期", trigger: "blur" }],
},
},
});
const settingDialogVisible = ref(false);
const emits = defineEmits(["update:type"]);
const fnGetData = async () => {
const resData = await getTrainingSchedule({
const { list, fnGetData } = useListData(getTrainingSchedule, {
usePagination: false,
immediate: false,
key: "pd",
});
watchEffect(() => {
if (props.type === 101)
fnGetData({
TYPE: props.type,
CLASS_ID: props.clazzId,
});
data.list = resData.pd;
};
watchEffect(() => {
if (props.type === 101) fnGetData();
});
const fnExport = async () => {
await ElMessageBox.confirm("导出前,请设置培训计划表中的编制日期", {
type: "warning",
});
data.delayDialog.visible = true;
settingDialogVisible.value = true;
};
const submit = async () => {
data.delayDialog.visible = false;
const fnSubmit = async (UPDATE_DATE) => {
await downloadTrainingPlan({
CLASS_ID: props.clazzId,
UPDATE_DATE: data.delayDialog.form.TIME,
UPDATE_DATE,
});
await ElMessageBox.confirm("导出后请前往档案下载中下载该档案!", "温馨提示", {
type: "info",

View File

@ -1,6 +1,6 @@
<template>
<div>
<el-card>
<layout-card>
<div class="tr mb">
<el-button type="primary" @click="fnExport"></el-button>
</div>
@ -30,19 +30,18 @@
</layout-table>
<handout
v-model:type="data.type"
zz
title="安全培训教材或课程讲义"
:clazz-id="CLASS_ID"
:curriculum-id="data.CURRICULUM_ID"
/>
</el-card>
</layout-card>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils";
import Handout from "./components/handout.vue";
import { reactive, ref } from "vue";
import { reactive } from "vue";
import { useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import { debounce } from "throttle-debounce";
@ -54,7 +53,6 @@ import useListData from "@/assets/js/useListData.js";
const route = useRoute();
const { CLASS_ID } = route.query;
const tableRef = ref(null);
const data = reactive({
type: 0,
CURRICULUM_ID: "",
@ -63,9 +61,12 @@ const fnView = (row) => {
data.type = 106;
data.CURRICULUM_ID = row.CURRICULUM_ID;
};
const { list, pagination, fnGetData } = useListData(getClassCurriculumList, {
const { list, pagination, fnGetData, tableRef } = useListData(
getClassCurriculumList,
{
otherParams: { CLASS_ID },
});
}
);
const fnExport = debounce(
1000,
async () => {
@ -76,10 +77,10 @@ const fnExport = debounce(
}
const archiveDirectory = [];
for (let i = 0; i < selectionData.length; i++) {
const info = {};
info.CURRICULUM_ID = selectionData[i].CURRICULUM_ID;
info.CURRICULUMNAME = selectionData[i].CURRICULUMNAME;
archiveDirectory.push(info);
archiveDirectory.push({
CURRICULUM_ID: selectionData[i].CURRICULUM_ID,
CURRICULUMNAME: selectionData[i].CURRICULUMNAME,
});
}
await downloadTeachingMaterialAll({
CLASS_ID,

View File

@ -19,10 +19,10 @@
<el-form-item label="状态" prop="STATUS">
<el-select v-model="searchForm.STATUS">
<el-option
v-for="item in data.statusList"
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in statusList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
/>
</el-select>
</el-form-item>
@ -40,31 +40,26 @@
</el-card>
<layout-card>
<layout-table
ref="tableRef"
v-model:pagination="pagination"
:data="list"
@get-data="fnGetData"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="NAME" label="班级名称" width="250" />
<el-table-column prop="START_TIME" label="培训开始时间" width="200" />
<el-table-column prop="END_TIME" label="培训结束时间" width="200" />
<el-table-column prop="STUDENT_NUM" label="学员人员数" width="200" />
<el-table-column prop="STATE" label="班级状态" width="200">
<el-table-column prop="NAME" label="班级名称" />
<el-table-column prop="START_TIME" label="培训开始时间" />
<el-table-column prop="END_TIME" label="培训结束时间" />
<el-table-column prop="STUDENT_NUM" label="学员人员数" />
<el-table-column label="班级状态">
<template #default="{ row }">
<template v-if="row.STATE === '1'"> </template>
<template v-if="row.STATE === '4'"> </template>
<template v-if="row.STATE === '5'"> </template>
<template v-if="row.STATE === '6'"> </template>
{{ translationStatus(row.STATE, statusList) }}
</template>
</el-table-column>
<el-table-column prop="POST_NUM" label="涉及工种数" width="200" />
<el-table-column label="操作">
<el-table-column prop="POST_NUM" label="涉及工种数" />
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"
@ -92,22 +87,18 @@
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js";
import { reactive, ref } from "vue";
import { getClassesList } from "@/request/training_archive_management.js";
import router from "@/router/index.js";
import { useRouter } from "vue-router";
const tableRef = ref(null);
const data = reactive({
statusList: [
{ value: 1, label: "未申请" },
{ value: 4, label: "待开班" },
{ value: 5, label: "培训中" },
{ value: 6, label: "培训结束" },
],
});
const router = useRouter();
const statusList = [
{ ID: "1", NAME: "未申请" },
{ ID: "4", NAME: "待开班" },
{ ID: "5", NAME: "培训中" },
{ ID: "6", NAME: "培训结束" },
];
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getClassesList);
</script>

View File

@ -18,13 +18,23 @@
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
<el-button v-if="list.length > 0" type="primary" @click="fnExport"
>导出</el-button
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label-width="10px" class="end">
<el-button
v-if="list.length > 0"
type="primary"
@click="fnExport"
>
导出
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
v-model:pagination="pagination"
@ -41,7 +51,7 @@
<el-table-column prop="EXAMNAME" label="试卷名称" />
<el-table-column prop="ALL_POST_NAME" label="涉及岗位" />
<el-table-column prop="STUDENT_SUM" label="人数" />
<el-table-column label="操作" width="200">
<el-table-column label="操作" width="120">
<template #default="{ row }">
<el-button
type="primary"
@ -60,14 +70,14 @@
:clazz-id="CLASS_ID"
:stageexampaperinput-id="data.STAGEEXAMPAPERINPUT_ID"
/>
</el-card>
</layout-card>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils";
import Paper from "./components/paper.vue";
import { reactive, ref } from "vue";
import { reactive } from "vue";
import { useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import { debounce } from "throttle-debounce";
@ -79,7 +89,6 @@ import useListData from "@/assets/js/useListData.js";
const route = useRoute();
const { CLASS_ID, CLASS_NAME } = route.query;
const tableRef = ref(null);
const data = reactive({
type: 0,
STAGEEXAMPAPERINPUT_ID: "",
@ -88,7 +97,7 @@ const fnView = (STAGEEXAMPAPERINPUT_ID) => {
data.type = 103;
data.STAGEEXAMPAPERINPUT_ID = STAGEEXAMPAPERINPUT_ID;
};
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
const { list, pagination, searchForm, tableRef, fnGetData, fnResetPagination } =
useListData(getClassPaperList, { otherParams: { CLASS_ID } });
const fnExport = debounce(
1000,
@ -100,12 +109,12 @@ const fnExport = debounce(
}
const paperList = [];
for (let i = 0; i < selectionData.length; i++) {
const info = {};
info.CLASS_ID = selectionData[i].CLASS_ID;
info.CLASS_NAME = CLASS_NAME;
info.EXAMNAME = selectionData[i].EXAMNAME;
info.STAGEEXAMPAPERINPUT_ID = selectionData[i].STAGEEXAMPAPERINPUT_ID;
paperList.push(info);
paperList.push({
CLASS_ID: selectionData[i].CLASS_ID,
EXAMNAME: selectionData[i].EXAMNAME,
STAGEEXAMPAPERINPUT_ID: selectionData[i].STAGEEXAMPAPERINPUT_ID,
CLASS_NAME,
});
}
await downloadArchivePapers({
paperList: JSON.stringify(paperList),

View File

@ -1,6 +1,6 @@
<template>
<div>
<el-card>
<layout-card>
<div class="tr mb">
<el-button type="primary" @click="fnExport"></el-button>
</div>
@ -22,27 +22,22 @@
<el-table-column prop="INDUSTRY_ALL_NAME" label="教材类型" />
<el-table-column label="操作" width="200">
<template #default="{ row }">
<el-button type="primary" text link @click="tiao(row)"
>编辑</el-button
>
<el-button type="primary" text link @click="fnView(row)">
编辑
</el-button>
</template>
</el-table-column>
</layout-table>
<component
:is="data.component"
v-if="data.component"
<review
v-model:type="data.type"
:title="data.title"
title="安全培训教材会审表"
:clazz-id="CLASS_ID"
:corp-info-id="CORPINFO_ID"
:corp-name="CORP_NAME"
:post-name="POST_NAME"
:industry-all-name="data.INDUSTRY_ALL_NAME"
:curriculumname="data.CURRICULUMNAME"
:curriculum-id="data.CURRICULUM_ID"
/>
</el-card>
</layout-card>
</div>
</template>
@ -52,33 +47,30 @@ import {
getClassCurriculumList,
} from "@/request/training_archive_management";
import Review from "./components/review.vue";
import { markRaw, reactive, ref } from "vue";
import { reactive } from "vue";
import { serialNumber } from "@/assets/js/utils";
import { useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import useListData from "@/assets/js/useListData.js";
const route = useRoute();
const tableRef = ref(null);
const { CLASS_ID, CORP_NAME, CORPINFO_ID, POST_NAME } = route.query;
const { CLASS_ID, CORPINFO_ID } = route.query;
const data = reactive({
fold: false,
type: 100,
title: "",
component: "",
type: 0,
INDUSTRY_ALL_NAME: "",
CURRICULUMNAME: "",
CURRICULUM_ID: "",
});
const { list, pagination, fnGetData } = useListData(getClassCurriculumList, {
const { list, pagination, fnGetData, tableRef } = useListData(
getClassCurriculumList,
{
otherParams: { CLASS_ID },
});
}
);
const tiao = (row) => {
const fnView = (row) => {
data.type = 100;
data.NAME = "安全培训教材会审表";
data.component = markRaw(Review);
data.CURRICULUM_ID = row.CURRICULUM_ID;
data.CURRICULUMNAME = row.CURRICULUMNAME;
data.INDUSTRY_ALL_NAME = row.INDUSTRY_ALL_NAME;
@ -92,10 +84,10 @@ const fnExport = async () => {
}
const typeList = [];
for (let i = 0; i < selectionData.length; i++) {
const info = {};
info.CURRICULUM_ID = selectionData[i].CURRICULUM_ID;
info.CURRICULUMNAME = selectionData[i].CURRICULUMNAME;
typeList.push(info);
typeList.push({
CURRICULUM_ID: selectionData[i].CURRICULUM_ID,
CURRICULUMNAME: selectionData[i].CURRICULUMNAME,
});
}
await downloadHsAll({
CLASS_ID,

View File

@ -41,13 +41,12 @@
:data="list"
@get-data="fnGetData"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="NAME" label="班级名称" width="200" />
<el-table-column prop="NAME" label="班级名称" />
<el-table-column prop="CODE" label="班级编码" width="150" />
<el-table-column
prop="TRAININGTYPE_NAME"
@ -57,8 +56,8 @@
<el-table-column prop="POSTTYPE_NAME" label="岗位类型" width="150" />
<el-table-column prop="START_TIME" label="培训开始时间" width="150" />
<el-table-column prop="END_TIME" label="培训结束时间" width="150" />
<el-table-column prop="STUDENT_NUM" label="学员人员数" width="150" />
<el-table-column prop="START_TIME" label="任务状态" width="150">
<el-table-column prop="STUDENT_NUM" label="学员人员数" width="100" />
<el-table-column label="任务状态" width="100">
<template #default="{ row }">
<template v-if="row.STATE === '1'"> </template>
<template v-if="row.STATE === '4'"> </template>
@ -66,7 +65,7 @@
<template v-if="row.STATE === '6'"> </template>
</template>
</el-table-column>
<el-table-column label="操作">
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"
@ -93,12 +92,10 @@
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js";
import { ref } from "vue";
import { getClassForHealthList } from "@/request/training_archive_management.js";
import router from "@/router/index.js";
import { useRouter } from "vue-router";
const tableRef = ref(null);
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getClassForHealthList);
</script>

View File

@ -3,7 +3,7 @@
<el-card>
<el-form
:model="searchForm"
label-width="100px"
label-width="60px"
@submit.prevent="fnResetPagination"
>
<el-row>
@ -28,40 +28,42 @@
</el-card>
<layout-card>
<layout-table
ref="tableRef"
v-model:pagination="pagination"
:data="list"
@get-data="fnGetData"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="NAME" label="姓名" width="200" />
<el-table-column prop="DEPARTMENT_NAME" label="部门" width="200" />
<el-table-column prop="POST_NAME" label="工种" width="200" />
<el-table-column prop="USER_ID_CARD" label="身份证号" width="200" />
<el-table-column prop="FILE_NUMBER" label="档案编号" width="200" />
<el-table-column prop="AUTHENTICATION" label="人脸认证" width="200">
<el-table-column prop="NAME" label="姓名" />
<el-table-column prop="DEPARTMENT_NAME" label="部门" />
<el-table-column prop="POST_NAME" label="工种" />
<el-table-column prop="USER_ID_CARD" label="身份证号" />
<el-table-column prop="FILE_NUMBER" label="档案编号" />
<el-table-column label="人脸认证" width="100">
<template #default="{ row }">
{{ row.AUTHENTICATION === "0" ? "未认证" : "已认证" }}
</template>
</el-table-column>
<el-table-column label="操作">
<el-table-column label="操作" width="120">
<template #default="{ row }">
<el-button
v-if="
:disabled="
!(
row.STATE === '6' ||
(row.EXAMINATION === 1 && parseInt(row.EXAMSCORE) > -1) ||
(row.EXAMINATION === 0 && parseInt(row.STUDYSTATE) > 1)
)
"
type="text"
type="primary"
text
link
@click="fnDownLoadArchive(row)"
>学员档案下载</el-button
>
<el-button v-else type="text" disabled>学员档案下载</el-button>
学员档案下载
</el-button>
</template>
</el-table-column>
</layout-table>
@ -72,7 +74,6 @@
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js";
import { ref } from "vue";
import { useRoute } from "vue-router";
import {
downLoadStudentArchive,
@ -81,7 +82,6 @@ import {
import { ElMessageBox } from "element-plus";
const route = useRoute();
const tableRef = ref(null);
const { CLASS_ID } = route.query;
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getClassForHealthStudentList, {

View File

@ -1,11 +1,13 @@
<template>
<div>
<layout-card>
<div class="tr mb">
<el-button type="primary" @click="fnExport"></el-button>
<el-button type="primary" @click="data.exportDialogVisible = true">
导出
</el-button>
</div>
<div>
<el-divider content-position="left">学时证明</el-divider>
<table>
<table class="archive_print_table">
<tr>
<td>姓名</td>
<td>{{ data.classInfo.STUDENT_NAME }}</td>
@ -170,7 +172,7 @@
<div class="chapter_right_img">
<img :src="data.official_seal_path" />
</div>
<table class="tc">
<table class="tc archive_print_table">
<thead />
<tr>
<td>班级名称</td>
@ -216,7 +218,7 @@
</span>
<span>档案编号:{{ data.classInfo.FILE_NUMBER }}</span>
</div>
<table class="tc">
<table class="tc archive_print_table">
<tbody>
<tr>
<td>姓名</td>
@ -251,7 +253,7 @@
<el-checkbox
v-for="(item, index) in personnelTypeList"
:key="index"
:label="item.DICTIONARIES_ID"
:value="item.DICTIONARIES_ID"
>
{{ item.NAME }}
</el-checkbox>
@ -263,7 +265,7 @@
</tr>
<tr>
<td colspan="10" style="padding: 0">
<table class="table-inside">
<table class="archive_print_table">
<tbody>
<tr>
<td width="6%">序号</td>
@ -401,7 +403,7 @@
</span>
<span>档案编号:{{ data.classInfo.FILE_NUMBER }}</span>
</div>
<table class="tc">
<table class="tc archive_print_table">
<tr>
<td>姓名</td>
<td>{{ data.classInfo.STUDENT_NAME }}</td>
@ -433,7 +435,7 @@
<el-checkbox
v-for="(item, index) in personnelTypeList"
:key="index"
:label="item.DICTIONARIES_ID"
:value="item.DICTIONARIES_ID"
>
{{ item.NAME }}
</el-checkbox>
@ -445,7 +447,7 @@
</tr>
<tr>
<td colspan="10" style="padding: 0">
<table class="table-inside">
<table class="archive_print_table">
<thead />
<tr>
<template
@ -575,7 +577,7 @@
</div>
<div>
<el-divider content-position="left">学习记录</el-divider>
<table class="tc" style="position: relative">
<table class="tc archive_print_table" style="position: relative">
<tr>
<td width="240px">班级名称</td>
<td colspan="3">
@ -648,7 +650,7 @@
<tr v-if="data.learningRecord.ISFACE === '1'">
<td>人脸验证记录</td>
<td colspan="3" style="padding: 0px; border: 0px">
<table>
<table class="archive_print_table">
<tr>
<td colspan="2">
共进行{{ data.learningRecord.FACELOG }}次人脸认证
@ -683,7 +685,9 @@
<img :src="data.official_seal_path" />
</div>
<h2 class="tc">{{ data.paper.EXAMNAME }}</h2>
<div class="tc">(满分:{{ data.paper.PAPEREXAMSCORE || 0 }})</div>
<div class="tc mt-10">
(满分:{{ data.paper.PAPEREXAMSCORE || 0 }})
</div>
<div class="mt tc">
<span style="line-height: 50px; margin-left: 200px"
>姓名:{{ data.classInfo.STUDENT_NAME }}</span
@ -702,129 +706,78 @@
>考试时间:{{ data.paper.EXAMTIMEEND }}</span
>
</div>
<div>
<dl
<div class="items mt-20 p-20">
<div
v-for="(item, index) in data.paper.QUESTIONLIST"
:key="item.QUESTION_ID"
class="item ptb-20"
>
<dt>
<el-tag v-if="item.QUESTIONTYPE === '1'" type="success">
(单选题)
</el-tag>
<el-tag v-if="item.QUESTIONTYPE === '2'"> () </el-tag>
<el-tag v-if="item.QUESTIONTYPE === '3'" type="warning">
(判断题)
</el-tag>
<el-tag v-if="item.QUESTIONTYPE === '4'" type="danger">
(填空题)
</el-tag>
{{ index + 1 }}.{{ item.QUESTIONDRY }}
<span class="ml">(题目分值{{ item.SCORE }})</span>
</dt>
<div class="mt-10">
{{ index + 1 }}.
<span v-if="item.QUESTIONTYPE === '1'"> () </span>
<span v-if="item.QUESTIONTYPE === '2'"> () </span>
<span v-if="item.QUESTIONTYPE === '3'"> () </span>
{{ item.QUESTIONDRY }}
<span class="ml-10">(题目分值{{ item.SCORE }})</span>
</div>
<div class="mt-10 ml-30">
<el-radio-group
v-if="item.QUESTIONTYPE === '1'"
v-model="item.ANSWER"
:disabled="true"
disabled
:model-value="item.ANSWERRIGHT"
>
<dd>
<el-radio value="A">A.{{ item.OPTIONA }}</el-radio>
</dd>
<dd>
<el-radio value="B">B.{{ item.OPTIONB }}</el-radio>
</dd>
<dd>
<el-radio value="C">C.{{ item.OPTIONC }}</el-radio>
</dd>
<dd>
<el-radio value="D">D.{{ item.OPTIOND }}</el-radio>
</dd>
</el-radio-group>
<el-checkbox-group
v-if="item.QUESTIONTYPE === '2'"
v-model="item.checkList"
:disabled="true"
disabled
:model-value="item.ANSWERRIGHT?.split('')"
>
<dd>
<el-checkbox value="A">A.{{ item.OPTIONA }}</el-checkbox>
</dd>
<dd>
<el-checkbox value="B">B.{{ item.OPTIONB }}</el-checkbox>
</dd>
<dd>
<el-checkbox value="C">C.{{ item.OPTIONC }}</el-checkbox>
</dd>
<dd>
<el-checkbox value="D">D.{{ item.OPTIOND }}</el-checkbox>
</dd>
</el-checkbox-group>
<el-radio-group
v-if="item.QUESTIONTYPE === '3'"
v-model="item.ANSWER"
:disabled="true"
disabled
:model-value="item.ANSWERRIGHT"
>
<dd>
<el-radio value="A">A.{{ item.OPTIONA }}</el-radio>
</dd>
<dd>
<el-radio value="B">B.{{ item.OPTIONB }}</el-radio>
</dd>
</el-radio-group>
<div class="flex">
<div>
<div v-if="item.QUESTIONTYPE === '4'" class="mb">
学员答案{{ item.ANSWER }}
</div>
<div class="mb">参考答案{{ item.ANSWERRIGHT }}</div>
<div>答案解析{{ item.DESCR }}</div>
</div>
</div>
</dl>
<div class="mt-10">答案{{ item.ANSWERRIGHT }}</div>
<div class="mt-10">答案解析{{ item.DESCR }}</div>
</div>
</div>
</div>
<el-dialog v-model="data.exportDialog.visible" title="选择导出数据">
<el-form label-width="60px">
<el-form-item prop="checkList">
<el-checkbox-group v-model="data.exportDialog.checkList">
<el-checkbox
v-for="item in checkboxList"
:key="item"
:label="item"
style="display: block"
>
{{ item.label }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" @click="fnExportDialogConfirm">
导出
</el-button>
<el-button @click="fnExportDialogChangeShow"></el-button>
</template>
</el-dialog>
</div>
<export
v-model:visible="data.exportDialogVisible"
:checkbox-list="checkboxList"
/>
</layout-card>
</template>
<script setup>
import { reactive } from "vue";
import { reactive, ref } from "vue";
import dayjs from "dayjs";
import { debounce } from "throttle-debounce";
import { ElMessageBox } from "element-plus";
import {
getLearningRecord,
getUserArchives,
downloadFilesdetailword,
} from "@/request/training_archive_management.js";
import { useRoute } from "vue-router";
import { layoutFnGetPersonnelType } from "@/assets/js/data_dictionary.js";
import { layoutFnGetPersonnelTypeTraffic } from "@/assets/js/data_dictionary.js";
import Export from "./components/export.vue";
const route = useRoute();
const {
CLASS_NAME,
STUDENT_ID,
STUDENT_NAME,
CORP_NAME,
RECORDOR_SIGN,
ASSESSOR_SIGN,
@ -838,15 +791,18 @@ const {
PERSONNEL_TYPE,
} = route.query;
const FILE_URL = import.meta.env.VITE_FILE_URL;
const checkboxList = [
const checkboxList = ref([
{ sort: 1, label: "首页" },
{ sort: 2, label: "学时证明" },
{ sort: 2, label: "学员学习档案" },
{ sort: 3, label: "课程材料" },
{ sort: 5, label: "培训考核记录" },
{ sort: 6, label: "学习记录" },
];
const personnelTypeList = await layoutFnGetPersonnelType();
]);
const personnelTypeList = await layoutFnGetPersonnelTypeTraffic({
DICTIONARIES_ID: "0b62f92b0b624aab8e89a77304a64d5e",
BIANMA: "TRAFFIC_EMPLOYMENT",
});
const data = reactive({
classInfo: {},
videoList: [],
@ -857,10 +813,7 @@ const data = reactive({
learningRecord: {},
faceList: [],
PORTRAIT: "",
exportDialog: {
visible: false,
checkList: [],
},
exportDialogVisible: false,
});
const fnGetData = async () => {
const resData = await getUserArchives({
@ -880,16 +833,7 @@ const fnGetData = async () => {
data.SIGNATURE_PATH = FILE_URL + resData.student.SIGNATURE_PATH;
if (resData.paper) {
if (resData.paper.QUESTIONLIST && resData.paper.QUESTIONLIST.length > 0) {
checkboxList.push({ sort: 7, label: "考卷信息" });
for (let i = 0; i < resData.paper.QUESTIONLIST.length; i++) {
if (
resData.paper.QUESTIONLIST[i].QUESTIONTYPE === "2" &&
resData.paper.QUESTIONLIST[i].ANSWER
) {
resData.paper.QUESTIONLIST[i].checkList =
resData.paper.QUESTIONLIST[i].ANSWER.split("");
}
}
checkboxList.value.push({ sort: 7, label: "考卷信息" });
}
data.paper = { ...resData.paper };
}
@ -899,7 +843,7 @@ const fnGetData = async () => {
"1b250e1ec1e24576aaa84daa804e9ab2" &&
data.classInfo.TRAINLEVEL === "c698a92dda3848b9a40d4bcee79f23a3"
) {
checkboxList.push({ sort: 4, label: "师傅带徒弟实习教育" });
checkboxList.value.push({ sort: 4, label: "师傅带徒弟实习教育" });
}
data.videoList = resData.videoList;
data.classInfo.SUMVIDEOTIME = data.classInfo.SUMVIDEOTIME || 0;
@ -926,37 +870,6 @@ const fnGetLearningRecord = async () => {
};
fnGetData();
fnGetLearningRecord();
const fnExportDialogChangeShow = () => {
data.exportDialog.visible = !data.exportDialog.visible;
};
const fnExport = async () => {
fnExportDialogChangeShow();
data.exportDialog.checkList = [];
};
const fnExportDialogConfirm = debounce(
1000,
async () => {
await ElMessageBox.confirm("确定要导出PDF吗", { type: "warning" });
data.exportDialog.checkList.sort((a, b) => a.sort - b.sort);
const checkList = data.exportDialog.checkList.map((item) => item.label);
await downloadFilesdetailword({
STUDENT_ID,
CORP_NAME,
STUDENT_NAME,
RECORDOR_SIGN,
ASSESSOR_SIGN,
SAFETYDEPTOR_SIGN,
CHECKLISTWORD: JSON.stringify(checkList),
});
await ElMessageBox.confirm(
"导出后请前往档案下载中下载该档案!",
"温馨提示",
{ type: "info" }
);
fnExportDialogChangeShow();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss">
@ -994,21 +907,25 @@ const fnExportDialogConfirm = debounce(
}
}
}
table {
width: 100%;
border-collapse: collapse;
td {
border: 1px solid var(--el-border-color);
padding: 8px;
font-size: 14px;
}
}
.flex {
display: flex;
align-items: center;
justify-content: space-between;
}
.items {
border: 1px solid var(--el-border-color);
.item {
border-bottom: 1px dashed #ebeef5;
&:first-child {
padding-top: 0;
}
&:last-child {
border-bottom: none;
}
}
}
</style>

View File

@ -15,7 +15,7 @@
/>
</el-form-item>
</el-col>
<el-col v-show="!data.searchFromCollapse" :span="8">
<el-col :span="8">
<el-form-item label="开始时间" prop="STARTTIME">
<el-date-picker
v-model="searchForm.STARTTIME"
@ -25,7 +25,7 @@
/>
</el-form-item>
</el-col>
<el-col v-show="!data.searchFromCollapse" :span="8">
<el-col :span="8">
<el-form-item label="结束时间" prop="ENDTIME">
<el-date-picker
v-model="searchForm.ENDTIME"
@ -35,14 +35,14 @@
/>
</el-form-item>
</el-col>
<el-col v-show="!data.searchFromCollapse" :span="8">
<el-col :span="8">
<el-form-item label="状态" prop="STATUS">
<el-select v-model="searchForm.STATUS">
<el-option
v-for="item in data.statusList"
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in statusList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
/>
</el-select>
</el-form-item>
@ -53,19 +53,7 @@
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
<el-button type="primary" @click="derivedRecord"></el-button>
<el-button
v-if="data.searchFromCollapse"
type="text"
@click="data.searchFromCollapse = false"
>展开 <i class="el-icon-arrow-down"
/></el-button>
<el-button
v-else
type="text"
@click="data.searchFromCollapse = true"
>合并 <i class="el-icon-arrow-up"
/></el-button>
<el-button type="primary" @click="fnExport"> </el-button>
</el-form-item>
</el-col>
</el-row>
@ -78,7 +66,7 @@
:data="list"
@get-data="fnGetData"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
@ -87,12 +75,9 @@
<el-table-column prop="NAME" label="班级名称" />
<el-table-column prop="DEPARTMENT_NAME" label="部门" />
<el-table-column prop="POST_NAME" label="工种" />
<el-table-column prop="STATE" label="班级状态">
<el-table-column label="班级状态">
<template #default="{ row }">
<template v-if="row.STATE === '1'"> </template>
<template v-if="row.STATE === '4'"> </template>
<template v-if="row.STATE === '5'"> </template>
<template v-if="row.STATE === '6'"> </template>
{{ translationStatus(row.STATE, statusList) }}
</template>
</el-table-column>
<el-table-column prop="TRAININGTYPE_NAME" label="培训类型" />
@ -100,22 +85,14 @@
<el-table-column prop="TRAINLEVEL_NAME" label="培训级别" />
<el-table-column prop="SUM_CLASSHOUR" label="任务学时" />
<el-table-column prop="COMPLETE_CLASSHOUR" label="已学学时" />
<el-table-column prop="COMPLETE_CLASSHOUR" label="考试结果">
<el-table-column label="考试结果">
<template #default="{ row }">
<template v-if="row.STAGEEXAMSTATE === '0'"> </template>
<template v-else-if="row.STAGEEXAMSTATE === '1'"> 待考试 </template>
<template v-else-if="row.STAGEEXAMSTATE === '2'">
考试未通过
</template>
<template v-else-if="row.STAGEEXAMSTATE === '3'">
考试通过
</template>
<template v-else-if="row.STAGEEXAMSTATE === '4'"> 未参加 </template>
{{ translationStatus(row.STAGEEXAMSTATE, examStatus) }}
</template>
</el-table-column>
<el-table-column prop="START_TIME" label="开始时间" />
<el-table-column prop="END_TIME" label="结束时间" />
<el-table-column label="操作">
<el-table-column label="操作" width="170">
<template #default="{ row }">
<el-button
type="primary"
@ -126,12 +103,14 @@
人员登记表
</el-button>
<el-button
v-if="
:disabled="
!(
row.STATE === '6' ||
(row.EXAMINATION === 1 &&
parseInt(row.STAGEEXAMSCORE) > -1 &&
parseInt(row.STUDYSTATE) !== 5) ||
(row.EXAMINATION === 0 && parseInt(row.STUDYSTATE) > 1)
)
"
type="primary"
text
@ -161,9 +140,6 @@
>
档案详情
</el-button>
<el-button v-else disabled type="primary" text link>
档案详情
</el-button>
</template>
</el-table-column>
</layout-table>
@ -173,36 +149,51 @@
:user-id="data.personnelRegistrationFormDialog.USER_ID"
/>
</layout-card>
<class-file-export
v-model:visible="classFileExportDialogVisible"
@submit="fnSubmit"
/>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js";
import { reactive, ref } from "vue";
import PersonnelRegistrationForm from "./components/personnel_registration_form.vue";
import { getUserClassesList } from "@/request/training_archive_management.js";
import { useRoute } from "vue-router";
import router from "@/router/index.js";
import {
classDetailsDownload,
getUserClassesList,
} from "@/request/training_archive_management.js";
import { useRoute, useRouter } from "vue-router";
import ClassFileExport from "@/views/archives_management/user/components/class_file_export.vue";
import { ElMessage } from "element-plus";
const route = useRoute();
const tableRef = ref(null);
const router = useRouter();
const { USER_ID } = route.query;
const statusList = [
{ ID: "1", NAME: "未申请" },
{ ID: "4", NAME: "待开班" },
{ ID: "5", NAME: "培训中" },
{ ID: "6", NAME: "培训结束" },
];
const examStatus = [
{ ID: "0", NAME: "不考试" },
{ ID: "1", NAME: "待考试" },
{ ID: "2", NAME: "考试未通过" },
{ ID: "3", NAME: "考试通过" },
{ ID: "4", NAME: "未参加" },
];
const data = reactive({
searchFromCollapse: true,
statusList: [
{ value: 1, label: "未申请" },
{ value: 4, label: "待开班" },
{ value: 5, label: "培训中" },
{ value: 6, label: "培训结束" },
],
personnelRegistrationFormDialog: {
visible: false,
STUDENT_ID: "",
USER_ID: "",
},
});
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
const classFileExportDialogVisible = ref(false);
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getUserClassesList, {
otherParams: { USER_ID },
});
@ -211,6 +202,51 @@ const fnPersonnelRegistrationForm = (STUDENT_ID, USER_ID) => {
data.personnelRegistrationFormDialog.USER_ID = USER_ID;
data.personnelRegistrationFormDialog.visible = true;
};
const fnExport = () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要导出的项");
return;
}
classFileExportDialogVisible.value = true;
};
const fnSubmit = async (checkArchivesList) => {
const selectionData = tableRef.value.getSelectionRows();
let cnt = 0;
if (checkArchivesList.indexOf("人员登记表") !== -1) {
selectionData.forEach((item) => {
if (
!(
item.STATE === "6" ||
(item.EXAMINATION === "1" &&
parseInt(item.STAGEEXAMSCORE) > -1 &&
parseInt(item.STUDYSTATE) !== "5") ||
(item.EXAMINATION === 0 && parseInt(item.STUDYSTATE) > 1)
)
) {
cnt = cnt + 1;
}
});
}
if (cnt === selectionData.length) {
ElMessage.warning("所选中的内容不符合导出条件");
} else {
const curriculum = [];
for (let i = 0; i < selectionData.length; i++) {
curriculum.push({
STUDENT_ID: selectionData[i].STUDENT_ID,
CLASS_ID: selectionData[i].CLASS_ID,
STUDENT_NAME: selectionData[i].STUDENT_NAME,
ENTERPRISE_ID: selectionData[i].ENTERPRISE_ID,
USER_ID: selectionData[i].USER_ID,
});
}
await classDetailsDownload({
curriculum: JSON.stringify(curriculum),
checkArchivesList,
});
}
};
</script>
<style scoped></style>

View File

@ -0,0 +1,80 @@
<template>
<el-dialog v-model="visible" title="班级档案" width="500" @close="fnClose">
<el-form ref="formRef" :model="form" :rules="rules" label-width="100">
<el-form-item label="班级" prop="CLASS_ID">
<el-select v-model="form.CLASS_ID" filterable>
<el-option
v-for="item in classList"
:key="item.CLASS_ID"
:label="item.NAME"
:value="item.CLASS_ID"
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnConfirm"></el-button>
</template>
</el-dialog>
<class-file-export
v-model:visible="classFileExportDialogVisible"
@submit="fnSubmit"
/>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
import { ref } from "vue";
import {
classProfileDownload,
getClassProfileClassList,
} from "@/request/training_archive_management.js";
import ClassFileExport from "./class_file_export.vue";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessageBox } from "element-plus";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
});
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);
const classFileExportDialogVisible = ref(false);
const form = ref({ CLASS_ID: "" });
const formRef = ref(null);
const classList = ref([]);
const rules = {
CLASS_ID: [{ required: true, message: "请选择班级", trigger: "change" }],
};
const fnGetData = async () => {
const resData = await getClassProfileClassList({
TRAINTYPE_ID: "c70bf859512241579a8a30fc5d1ae153",
});
classList.value = resData.varList;
};
fnGetData();
const fnClose = () => {
formRef.value.resetFields();
visible.value = false;
};
const fnConfirm = async () => {
await useFormValidate(formRef);
classFileExportDialogVisible.value = true;
};
const fnSubmit = async (checkArchivesList) => {
await classProfileDownload({
checkArchivesList,
CLASS_ID: form.value.CLASS_ID,
});
fnClose();
await ElMessageBox.confirm("导出后请前往档案下载中下载该档案!", "温馨提示", {
type: "info",
});
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,146 @@
<template>
<el-dialog
v-model="visible"
title="请选择导出数据"
width="500"
@close="fnClose"
>
<el-form ref="formRef" :model="form" label-width="60px">
<el-col :span="24">
<el-form-item prop="archiveInfo">
<span>1是否下载档案详情</span>
<div class="ml-20">
<el-switch
v-model="form.archiveInfo"
active-text="是"
inactive-text="否"
/>
</div>
</el-form-item>
</el-col>
<el-col v-if="form.archiveInfo" :span="24">
<el-form-item prop="checkArchivesList">
<div class="ml-20">
<el-checkbox
v-model="form.checkAll"
:indeterminate="isIndeterminate"
@change="fnCheckAllChange"
>
全选
</el-checkbox>
<div class="mtb-15" />
<el-checkbox-group
v-if="form.archiveInfo"
v-model="form.checkArchivesList"
@change="fnCheckedChange"
>
<el-checkbox
v-for="item in checkboxgroupList"
:key="item"
:label="item"
style="display: block"
>
{{ item.label }}
</el-checkbox>
</el-checkbox-group>
</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="register">
<span>2是否下载人员登记表</span>
<div class="ml-20">
<el-switch
v-model="form.register"
active-text="是"
inactive-text="否"
/>
</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="certificate">
<span>3是否下载培训证明</span>
<div class="ml-20">
<el-switch
v-model="form.certificate"
active-text="是"
inactive-text="否"
/>
</div>
</el-form-item>
</el-col>
</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 { useVModel } from "@vueuse/core";
import { ref } from "vue";
import { ElMessage } from "element-plus";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
});
const emits = defineEmits(["update:visible", "submit"]);
const visible = useVModel(props, "visible", emits);
const form = ref({
archiveInfo: false,
checkAll: false,
checkArchivesList: [],
register: false,
certificate: false,
});
const formRef = ref(null);
const isIndeterminate = ref(false);
const checkboxgroupList = [
{ sort: 1, label: "首页" },
{ sort: 2, label: "学时证明" },
{ sort: 2, label: "学员学习档案" },
{ sort: 3, label: "课程材料" },
{ sort: 5, label: "培训考核记录" },
{ sort: 6, label: "学习记录" },
{ sort: 7, label: "考卷信息" },
{ sort: 4, label: "师傅带徒弟实习教育" },
];
const fnCheckAllChange = (val) => {
form.value.checkArchivesList = val ? checkboxgroupList : [];
isIndeterminate.value = false;
};
const fnCheckedChange = (val) => {
const checkedCount = val.length;
form.value.checkAll = checkedCount === checkboxgroupList.length;
isIndeterminate.value =
checkedCount > 0 && checkedCount < checkboxgroupList.length;
};
const fnClose = () => {
formRef.value.resetFields();
isIndeterminate.value = false;
form.value.checkAll = false;
visible.value = false;
};
const fnSubmit = async () => {
if (form.value.register) {
form.value.checkArchivesList.push({ sort: 50, label: "人员登记表" });
}
if (form.value.certificate) {
form.value.checkArchivesList.push({ sort: 60, label: "培训证明" });
}
if (form.value.checkArchivesList.length === 0) {
ElMessage.warning("请选择要导出的项");
return;
}
emits("submit", JSON.stringify(form.value.checkArchivesList));
fnClose();
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,88 @@
<template>
<el-dialog v-model="visible" title="选择导出数据" @close="fnClose">
<el-form label-width="60px">
<el-form-item prop="checkList">
<el-checkbox-group v-model="checkList">
<el-checkbox
v-for="item in checkboxList"
:key="item"
:value="item"
style="display: block"
>
{{ item.label }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" @click="fnExportDialogConfirm">
导出
</el-button>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
import { debounce } from "throttle-debounce";
import { ElMessageBox } from "element-plus";
import { downloadFilesdetailword } from "@/request/training_archive_management.js";
import { useRoute } from "vue-router";
import { ref } from "vue";
const route = useRoute();
const {
STUDENT_ID,
STUDENT_NAME,
CORP_NAME,
RECORDOR_SIGN,
ASSESSOR_SIGN,
SAFETYDEPTOR_SIGN,
} = route.query;
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
checkboxList: {
type: Array,
required: true,
default: () => [],
},
});
const checkList = ref([]);
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);
const fnClose = () => {
visible.value = false;
checkList.value = [];
};
const fnExportDialogConfirm = debounce(
1000,
async () => {
await ElMessageBox.confirm("确定要导出PDF吗", { type: "warning" });
checkList.value.sort((a, b) => a.sort - b.sort);
const CHECKLISTWORD = checkList.value.map((item) => item.label);
await downloadFilesdetailword({
STUDENT_ID,
CORP_NAME,
STUDENT_NAME,
RECORDOR_SIGN,
ASSESSOR_SIGN,
SAFETYDEPTOR_SIGN,
CHECKLISTWORD: JSON.stringify(CHECKLISTWORD),
});
await ElMessageBox.confirm(
"导出后请前往档案下载中下载该档案!",
"温馨提示",
{ type: "info" }
);
fnClose();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -5,24 +5,25 @@
</div>
<h2 class="tc">生产经营单位新入职从业人员登记表</h2>
<div class="flex mt mb">
<span>生产经营单位名称(盖章):{{ data.info.CORP_NAME }}</span>
<span>档案编号:{{ data.info.FILE_NUMBER }}</span>
<span>生产经营单位名称(盖章):{{ info.CORP_NAME }}</span>
<span>档案编号:{{ info.FILE_NUMBER }}</span>
</div>
<table>
<table class="print_table">
<tr>
<td width="20%">姓名</td>
<td width="20%">
{{ data.info.NAME }}
{{ info.NAME }}
</td>
<td width="20%">性别</td>
<td width="20%">
{{ data.info.SEX_NAME }}
{{ info.SEX_NAME }}
</td>
<td rowspan="4" width="120" class="tc" style="padding: 0">
<div>
<img
v-if="data.info.PORTRAIT"
:src="FILE_URL + data.info.PORTRAIT"
v-if="info.PORTRAIT"
alt=""
:src="FILE_URL + info.PORTRAIT"
width="100"
height="100"
/>
@ -32,89 +33,89 @@
<tr>
<td>民族</td>
<td>
{{ data.info.NATION_NAME }}
{{ info.NATION_NAME }}
</td>
<td>政治面貌</td>
<td>
{{ data.info.POLITICAL_OUTLOOK_NAME }}
{{ info.POLITICAL_OUTLOOK_NAME }}
</td>
</tr>
<tr>
<td>文化程度</td>
<td>
{{ data.info.DEGREE_OF_EDUCATION_NAME }}
{{ info.DEGREE_OF_EDUCATION_NAME }}
</td>
<td>健康状况</td>
<td>
{{ data.info.HEALTH }}
{{ info.HEALTH }}
</td>
</tr>
<tr>
<td>出生年月</td>
<td>
{{ data.info.DATE_OF_BIRTH }}
{{ info.DATE_OF_BIRTH }}
</td>
<td>身份证号</td>
<td>
{{ data.info.USER_ID_CARD }}
{{ info.USER_ID_CARD }}
</td>
</tr>
<tr>
<td>毕业院校及专业</td>
<td>
{{ data.info.UNIVERSITY }}
{{ info.UNIVERSITY }}
</td>
<td>职务/职称</td>
<td colspan="2">
{{ data.info.DUTIES_NAME }}
{{ info.DUTIES_NAME }}
</td>
</tr>
<tr>
<td>户籍所在地</td>
<td>
{{ data.info.RESIDENCE }}
{{ info.RESIDENCE }}
</td>
<td>参加工作时间</td>
<td colspan="2">
{{ data.info.WORKING_DATE }}
{{ info.WORKING_DATE }}
</td>
</tr>
<tr>
<td>进入本单位时间</td>
<td>
{{ data.info.ENTRY_DATE }}
{{ info.ENTRY_DATE }}
</td>
<td>入职部门</td>
<td colspan="2">
{{ data.info.DEPARTMENT_NAME }}
{{ info.DEPARTMENT_NAME }}
</td>
</tr>
<tr>
<td>岗位名称</td>
<td>
{{ data.info.POST_NAME }}
{{ info.POST_NAME }}
</td>
<td>之前从事本岗位时间</td>
<td colspan="2">
{{ data.info.PREVIOUS_POST_DATE }}
{{ info.PREVIOUS_POST_DATE }}
</td>
</tr>
<tr style="height: 100px">
<td>主要工作经历</td>
<td colspan="4">
{{ data.info.WORK_EXPERIENCE }}
{{ info.WORK_EXPERIENCE }}
</td>
</tr>
<tr style="height: 100px">
<td>入职前接受安全培训和考核以及取得安全培训有关的岗位证书等情况</td>
<td colspan="4">
{{ data.info.CERTIFICATES }}
{{ info.CERTIFICATES }}
</td>
</tr>
<tr style="height: 100px">
<td>入职前受过何种有关安全生产的处罚以及是否受到刑事处罚</td>
<td colspan="4">
{{ data.info.PUNISH }}
{{ info.PUNISH }}
</td>
</tr>
<tr>
@ -126,16 +127,20 @@
<div class="flex mt" style="padding: 0">
<p>入职人(签字并按指纹)</p>
<p>
承诺日期<span>&emsp;&emsp;</span><span>&emsp;</span
><span>&emsp;</span>
承诺日期
<span>&emsp;&emsp;</span>
<span>&emsp;</span>
<span>&emsp;</span>
</p>
</div>
<p class="mt">生产经营单位核查意见</p>
<div class="flex mt" style="padding: 0">
<p>核查人员(签字)</p>
<p>
核查日期<span>&emsp;&emsp;</span><span>&emsp;</span
><span>&emsp;</span>
核查日期
<span>&emsp;&emsp;</span>
<span>&emsp;</span>
<span>&emsp;</span>
</p>
</div>
</td>
@ -150,7 +155,7 @@
<script setup>
import { useVModel } from "@vueuse/core";
import { ElMessageBox } from "element-plus";
import { reactive, watchEffect } from "vue";
import { ref, watchEffect } from "vue";
import {
getArchivesStudentEdit,
downloadRegisterform,
@ -173,15 +178,13 @@ const props = defineProps({
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);
const FILE_URL = import.meta.env.VITE_FILE_URL;
const data = reactive({
info: {},
});
const info = ref({});
const fnGetData = async () => {
const response = await getArchivesStudentEdit({
STUDENT_ID: props.studentId,
USER_ID: props.userId,
});
data.info = response.pd;
info.value = response.pd;
};
watchEffect(() => {
if (visible.value) fnGetData();
@ -190,7 +193,7 @@ const fnExport = async () => {
await ElMessageBox.confirm("确定要导出吗?", { type: "warning" });
await downloadRegisterform({
STUDENT_ID: props.studentId,
STUDENT_NAME: data.info.NAME,
STUDENT_NAME: info.value.NAME,
USER_ID: props.userId,
});
await ElMessageBox.confirm("导出后请前往档案下载中下载该档案!", "温馨提示", {
@ -205,15 +208,4 @@ const fnExport = async () => {
align-items: center;
justify-content: space-between;
}
table {
border-collapse: collapse;
width: 100%;
td {
border: 1px solid var(--el-border-color);
padding: 8px;
font-size: 14px;
line-height: 1.6;
}
}
</style>

View File

@ -3,7 +3,7 @@
<el-card>
<el-form
:model="searchForm"
label-width="100px"
label-width="60px"
@submit.prevent="fnResetPagination"
>
<el-row>
@ -15,7 +15,7 @@
/>
</el-form-item>
</el-col>
<el-col :span="4">
<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="fnResetPagination">
@ -23,14 +23,16 @@
</el-button>
</el-form-item>
</el-col>
<el-form-item label-width="10px">
<el-col :span="12">
<el-form-item label-width="10px" class="end">
<el-button type="primary" @click="fnBatchDownload">
下载补充档案
</el-button>
<el-button type="primary" @click="classFileDialogVisible = true">
班级档案
</el-button>
</el-form-item>
<el-form-item label-width="10px">
<el-button type="primary"> 班级档案 </el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
@ -39,30 +41,29 @@
ref="tableRef"
v-model:pagination="pagination"
:data="list"
row-key="USER_ID"
@get-data="fnGetData"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="USERNAME" label="用户名" width="200" />
<el-table-column prop="NAME" label="姓名" width="200" />
<el-table-column prop="CLASS_COUNT" label="班级数" width="200" />
<el-table-column prop="COMPLETE_COUNT" label="完成班级数" width="200" />
<el-table-column prop="CLIENT" label="是否补充" width="200">
<el-table-column prop="USERNAME" label="用户名" />
<el-table-column prop="NAME" label="姓名" />
<el-table-column prop="CLASS_COUNT" label="班级数" />
<el-table-column prop="COMPLETE_COUNT" label="完成班级数" />
<el-table-column prop="CLIENT" label="是否补充">
<template #default="{ row }">
<template
v-if="
{{
row.ARCHIVES_AWARD_PUN_LOG_ID || row.ARCHIVES_SPECIAL_WORK_ID
"
></template
>
<template v-else></template>
? "是"
: "否"
}}
</template>
</el-table-column>
<el-table-column label="操作">
<el-table-column label="操作" width="120">
<template #default="{ row }">
<el-button
type="primary"
@ -83,26 +84,27 @@
</el-table-column>
</layout-table>
</layout-card>
<class-file v-model:visible="classFileDialogVisible" />
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js";
import { ref } from "vue";
import {
downloadAward,
getStudentsList,
} from "@/request/training_archive_management.js";
import router from "@/router/index.js";
import { ElMessage, ElMessageBox } from "element-plus";
import { debounce } from "throttle-debounce";
import { useRouter } from "vue-router";
import { ref } from "vue";
import ClassFile from "./components/class_file.vue";
const tableRef = ref(null);
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getStudentsList);
const classFileDialogVisible = ref(false);
const fnBatchDownload = debounce(
1000,
async () => {

View File

@ -1,43 +1,45 @@
<template>
<el-dialog
v-model="visible"
:append-to-body="true"
:title="reviewUserId ? (type === 'view' ? '查看' : '修改') : '添加'"
:on-close="fnClose"
:title="type === 'add' ? '添加' : type === 'view' ? '查看' : '修改'"
@close="fnClose"
>
<el-form
ref="formRef"
:model="form"
:rules="rules"
label-width="120px"
:disabled="type === 'view'"
>
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
<el-col :span="24">
<el-form-item label="姓名" prop="NAME">
<el-input v-model="form.NAME" :disabled="type === 'view'" />
<el-input v-model="form.NAME" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="工作部门" prop="DEPARTMENT_NAME">
<el-input
v-model="form.DEPARTMENT_NAME"
:disabled="type === 'view'"
/>
<el-input v-model="form.DEPARTMENT_NAME" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="职务职称" prop="DUTIES">
<el-input v-model="form.DUTIES" :disabled="type === 'view'" />
<el-input v-model="form.DUTIES" />
</el-form-item>
</el-col>
<el-col v-show="!form.SIGN_PICTURE" :span="24">
<el-form-item label="签字" prop="SIGN_PICTURE">
<el-select v-model="data.SIGNTYPE" style="width: 100%">
<el-form-item label="签字" prop="SIGNTYPE">
<el-select v-model="form.SIGNTYPE">
<el-option
v-for="idx in data.options"
:key="idx.value"
:label="idx.label"
:value="idx.value"
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col v-show="form.SIGN_PICTURE" :span="24">
<el-form-item label="本人签字" prop="SIGN_PICTURE">
<el-form-item label="本人签字">
<img
:src="FILE_URL + form.SIGN_PICTURE"
alt=""
@ -47,7 +49,7 @@
</el-form-item>
</el-col>
<el-col v-show="!form.SIGN_PICTURE" :span="24">
<el-form-item v-if="data.SIGNTYPE === '0'" prop="SIGN_PICTURE">
<el-form-item v-if="form.SIGNTYPE === 0" prop="SIGN_PICTURE">
<vue-esign
ref="signRef"
:width="700"
@ -61,41 +63,36 @@
</el-form-item>
</el-col>
<el-col v-show="!form.SIGN_PICTURE" :span="24">
<el-form-item v-if="data.SIGNTYPE === '1'" prop="SIGN_PICTURE">
<el-form-item v-if="form.SIGNTYPE === 1" prop="SIGN_PICTURE_2">
<layout-upload
v-model:file-list="form.SIGN_PICTURE_2"
list-type="picture-card"
accept=".jpg,.jpeg,.png"
:limit="1"
delete-to-server
/>
</el-form-item>
</el-col>
</el-form>
<template #footer>
<el-button
v-if="type !== 'view' && (data.SIGNTYPE === '0' || form.SIGN_PICTURE)"
@click="
$refs.signRef.reset();
form.SIGN_PICTURE = '';
"
>重签</el-button
v-if="type !== 'view' && (form.SIGNTYPE === 0 || form.SIGN_PICTURE)"
@click="fnReset"
>
重签
</el-button>
<el-button @click="fnClose"></el-button>
<el-button v-if="type !== 'view'" type="primary" @click="fnSubmit"
>确定</el-button
>
<el-button v-if="type !== 'view'" type="primary" @click="fnSubmit">
确定
</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModels } from "@vueuse/core";
import { reactive, ref, watchEffect } from "vue";
import { ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import {
getReviewUserGoEdit,
setReviewUserAdd,
setReviewUserEdit,
} from "@/request/training_archive_management.js";
@ -119,65 +116,66 @@ const props = defineProps({
required: true,
default: "",
},
reviewUserId: {
type: String,
required: true,
default: "",
},
});
const FILE_URL = import.meta.env.VITE_FILE_URL;
const emits = defineEmits(["update:visible", "update:form"]);
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form } = useVModels(props, emits);
const data = reactive({
SIGNTYPE: "",
options: [
{
value: "0",
label: "手写签字",
},
{
value: "1",
label: "上传图片",
},
],
});
const options = [
{ value: 0, label: "手写签字" },
{ value: 1, label: "上传图片" },
];
const rules = {
NAME: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
DEPARTMENT_NAME: [
{ required: true, message: "工作部门不能为空", trigger: "blur" },
],
DUTIES: [{ required: true, message: "职务职称不能为空", trigger: "blur" }],
SIGNTYPE: [
{ required: true, message: "签字方式不能为空", trigger: "change" },
],
SIGN_PICTURE: [
{ required: true, message: "本人签字不能为空", trigger: "change" },
],
SIGN_PICTURE_2: [
{ required: true, message: "本人签字不能为空", trigger: "change" },
],
};
const formRef = ref(null);
const signRef = ref(null);
const fnReset = () => {
signRef.value && signRef.value.reset();
form.value.SIGN_PICTURE = "";
};
const fnClose = () => {
formRef.value.resetFields();
signRef.value && signRef.value.reset();
form.value.SIGN_PICTURE = "";
visible.value = false;
};
const fnGetData = async () => {
const resData = await getReviewUserGoEdit({
REVIEW_USER_ID: props.reviewUserId,
});
form.value = resData.pd;
};
watchEffect(() => {
if (props.reviewUserId) fnGetData();
});
const fnSubmit = debounce(
1000,
async () => {
if (form.value.SIGNTYPE === 0) {
try {
form.value.SIGN_PICTURE = await signRef.value.generate();
} catch {
form.value.SIGN_PICTURE = "";
}
}
await useFormValidate(formRef);
const formData = new FormData();
Object.keys(props.form).forEach((key) => {
formData.append(key, props.form[key]);
Object.keys(form.value).forEach((key) => {
formData.append(key, form.value[key]);
});
if (props.form.hideUpload[0].raw) {
formData.append("FFILE", props.form.hideUpload[0].raw);
if (form.value.SIGN_PICTURE_2[0]?.raw) {
formData.append("SIGN_PICTURE_2", form.value.SIGN_PICTURE_2[0].raw);
}
props.type === "add"
? await setReviewUserAdd(formData)
: await setReviewUserEdit(formData);
ElMessage.success("操作成功");
fnClose();
emits("get-data");
},
{
atBegin: true,

View File

@ -3,16 +3,13 @@
<el-card>
<el-form
:model="searchForm"
label-width="100px"
label-width="50px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-form-item label="姓名" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入姓名"
/>
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="4">
@ -28,21 +25,19 @@
</el-card>
<layout-card>
<layout-table
ref="tableRef"
v-model:pagination="pagination"
:data="list"
@get-data="fnGetData"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="NAME" label="姓名" width="200" />
<el-table-column prop="DEPARTMENT_NAME" label="工作部门" width="200" />
<el-table-column prop="DUTIES" label="职务职称" width="200" />
<el-table-column prop="CLIENT" label="签字图片" width="200">
<el-table-column prop="NAME" label="姓名" />
<el-table-column prop="DEPARTMENT_NAME" label="工作部门" />
<el-table-column prop="DUTIES" label="职务职称" />
<el-table-column label="签字图片">
<template #default="{ row }">
<img
v-viewer
@ -53,18 +48,17 @@
/>
</template>
</el-table-column>
<el-table-column prop="CREATTIME" label="签字录入时间" width="200" />
<el-table-column label="操作">
<el-table-column prop="CREATTIME" label="签字录入时间" />
<el-table-column label="操作" width="150">
<template #default="{ row }">
<el-button
type="primary"
text
link
@click="fnAdd(row.REVIEW_USER_ID)"
@click="fnAdd(row.REVIEW_USER_ID, 'edit')"
>
编辑
</el-button>
<el-divider direction="vertical" />
<el-button
type="primary"
text
@ -73,7 +67,6 @@
>
查看
</el-button>
<el-divider direction="vertical" />
<el-button
type="primary"
text
@ -85,7 +78,7 @@
</template>
</el-table-column>
<template #button>
<el-button type="primary" @click="fnAdd('')"> </el-button>
<el-button type="primary" @click="fnAdd('', 'add')"> 新建 </el-button>
</template>
</layout-table>
</layout-card>
@ -93,7 +86,7 @@
v-model:visible="data.addOrEditDialog.visible"
v-model:form="data.addOrEditDialog.form"
:type="data.addOrEditDialog.type"
:review-user-id="data.addOrEditDialog.REVIEW_USER_ID"
@get-data="fnResetPagination"
/>
</div>
</template>
@ -101,8 +94,9 @@
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js";
import { reactive, ref } from "vue";
import { nextTick, reactive } from "vue";
import {
getReviewUserGoEdit,
getReviewUserList,
setReviewUserDelete,
} from "@/request/training_archive_management.js";
@ -111,22 +105,34 @@ import { ElMessage, ElMessageBox } from "element-plus";
import ReviewAdd from "./components/review_add.vue";
const FILE_URL = import.meta.env.VITE_FILE_URL;
const tableRef = ref(null);
const data = reactive({
addOrEditDialog: {
visible: false,
form: {},
type: "",
REVIEW_USER_ID: "",
form: {
NAME: "",
DEPARTMENT_NAME: "",
DUTIES: "",
SIGNTYPE: "",
SIGN_PICTURE: "",
SIGN_PICTURE_2: [],
},
},
});
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getReviewUserList);
const fnAdd = (REVIEW_USER_ID, type) => {
const fnAdd = async (REVIEW_USER_ID, type) => {
data.addOrEditDialog.visible = true;
data.addOrEditDialog.REVIEW_USER_ID = REVIEW_USER_ID;
await nextTick();
data.addOrEditDialog.type = type;
if (type !== "add") {
const resData = await getReviewUserGoEdit({
REVIEW_USER_ID,
});
data.addOrEditDialog.form = resData.pd;
data.addOrEditDialog.form.SIGN_PICTURE_2 = [];
}
};
const fnDelete = debounce(
1000,

View File

@ -1,23 +1,24 @@
<template>
<el-dialog
v-model="visible"
:append-to-body="true"
:title="usersignid ? (type === 'view' ? '查看' : '修改') : '添加'"
:on-close="fnClose"
:title="type === 'add' ? '添加' : type === 'view' ? '查看' : '修改'"
@close="fnClose"
>
<el-form
ref="formRef"
:model="form"
:rules="rules"
label-width="120px"
:disabled="type === 'view'"
>
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
<el-col :span="24">
<el-form-item label="姓名" prop="USERNAME">
<el-input v-model="form.USERNAME" :disabled="type === 'view'" />
<el-input v-model="form.USERNAME" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="签字人员类型" prop="USERSIGNTYPE">
<el-select
v-model="form.USERSIGNTYPE"
:disabled="type === 'view'"
style="width: 100%"
>
<el-select v-model="form.USERSIGNTYPE">
<el-option
v-for="item in signUserTypeList"
:key="item.DICTIONARIES_ID"
@ -27,16 +28,11 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="职务职称" prop="DUTIES">
<el-input v-model="form.DUTIES" :disabled="type === 'view'" />
</el-form-item>
</el-col>
<el-col v-show="!form.SIGN_PICTURE" :span="24">
<el-form-item label="签字" prop="SIGN_PICTURE">
<el-select v-model="data.SIGNTYPE" style="width: 100%">
<el-form-item label="签字" prop="SIGNTYPE">
<el-select v-model="form.SIGNTYPE">
<el-option
v-for="idx in data.options"
v-for="idx in options"
:key="idx.value"
:label="idx.label"
:value="idx.value"
@ -45,7 +41,7 @@
</el-form-item>
</el-col>
<el-col v-show="form.SIGN_PICTURE" :span="24">
<el-form-item label="本人签字" prop="SIGN_PICTURE">
<el-form-item label="本人签字">
<img
:src="FILE_URL + form.SIGN_PICTURE"
alt=""
@ -55,7 +51,7 @@
</el-form-item>
</el-col>
<el-col v-show="!form.SIGN_PICTURE" :span="24">
<el-form-item v-if="data.SIGNTYPE === '0'" prop="SIGN_PICTURE">
<el-form-item v-if="form.SIGNTYPE === 0" prop="SIGN_PICTURE">
<vue-esign
ref="signRef"
:width="700"
@ -69,41 +65,36 @@
</el-form-item>
</el-col>
<el-col v-show="!form.SIGN_PICTURE" :span="24">
<el-form-item v-if="data.SIGNTYPE === '1'" prop="SIGN_PICTURE">
<el-form-item v-if="form.SIGNTYPE === 1" prop="SIGN_PICTURE_2">
<layout-upload
v-model:file-list="form.SIGN_PICTURE_2"
list-type="picture-card"
accept=".jpg,.jpeg,.png"
:limit="1"
delete-to-server
/>
</el-form-item>
</el-col>
</el-form>
<template #footer>
<el-button
v-if="type !== 'view' && (data.SIGNTYPE === '0' || form.SIGN_PICTURE)"
@click="
$refs.signRef.reset();
form.SIGN_PICTURE = '';
"
>重签</el-button
v-if="type !== 'view' && (form.SIGNTYPE === 0 || form.SIGN_PICTURE)"
@click="fnReset"
>
重签
</el-button>
<el-button @click="fnClose"></el-button>
<el-button v-if="type !== 'view'" type="primary" @click="fnSubmit"
>确定</el-button
>
<el-button v-if="type !== 'view'" type="primary" @click="fnSubmit">
确定
</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModels } from "@vueuse/core";
import { reactive, ref, watchEffect } from "vue";
import { ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import {
getSignUserGoEdit,
setSignUserAdd,
setSignUserEdit,
} from "@/request/training_archive_management.js";
@ -128,28 +119,14 @@ const props = defineProps({
required: true,
default: "",
},
usersignid: {
type: String,
required: true,
default: "",
},
});
const FILE_URL = import.meta.env.VITE_FILE_URL;
const emits = defineEmits(["update:visible", "update:form"]);
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form } = useVModels(props, emits);
const data = reactive({
SIGNTYPE: "",
options: [
{
value: "0",
label: "手写签字",
},
{
value: "1",
label: "上传图片",
},
],
});
const options = [
{ value: 0, label: "手写签字" },
{ value: 1, label: "上传图片" },
];
const rules = {
USERNAME: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
USERSIGNTYPE: [
@ -158,45 +135,53 @@ const rules = {
DEPARTMENT_NAME: [
{ required: true, message: "工作部门不能为空", trigger: "blur" },
],
DUTIES: [{ required: true, message: "职务职称不能为空", trigger: "blur" }],
SIGNTYPE: [
{ required: true, message: "签字方式不能为空", trigger: "change" },
],
SIGN_PICTURE: [
{ required: true, message: "本人签字不能为空", trigger: "change" },
],
SIGN_PICTURE_2: [
{ required: true, message: "本人签字不能为空", trigger: "change" },
],
};
const formRef = ref(null);
const signRef = ref(null);
const signUserTypeList = await layoutFnGetSignUserType();
const fnReset = () => {
signRef.value && signRef.value.reset();
form.value.SIGN_PICTURE = "";
};
const fnClose = () => {
formRef.value.resetFields();
signRef.value && signRef.value.reset();
form.value.SIGN_PICTURE = "";
visible.value = false;
};
const fnGetData = async () => {
const resData = await getSignUserGoEdit({
REVIEW_USER_ID: props.reviewUserId,
});
form.value = resData.pd;
data.SIGNTYPE = data.pd.SIGNTYPE;
};
watchEffect(() => {
if (props.reviewUserId) fnGetData();
});
const fnSubmit = debounce(
1000,
async () => {
if (form.value.SIGNTYPE === 0) {
try {
form.value.SIGN_PICTURE = await signRef.value.generate();
} catch {
form.value.SIGN_PICTURE = "";
}
}
await useFormValidate(formRef);
const formData = new FormData();
Object.keys(props.form).forEach((key) => {
formData.append(key, props.form[key]);
Object.keys(form.value).forEach((key) => {
formData.append(key, form.value[key]);
});
if (data.SIGNTYPE === "") {
this.$message.warning("请签字");
return;
}
if (props.form.hideUpload[0].raw) {
formData.append("FFILE", props.form.hideUpload[0].raw);
if (form.value.SIGN_PICTURE_2[0]?.raw) {
formData.append("SIGN_PICTURE_2", form.value.SIGN_PICTURE_2[0].raw);
}
props.type === "add"
? await setSignUserAdd(formData)
: await setSignUserEdit(formData);
ElMessage.success("操作成功");
fnClose();
emits("get-data");
},
{
atBegin: true,

View File

@ -2,19 +2,17 @@
<div>
<layout-card>
<layout-table
ref="tableRef"
v-model:pagination="pagination"
:data="list"
@get-data="fnGetData"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column label="序号" width="150">
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="SIGNTYPENAME" label="签字人员类型" width="350" />
<el-table-column label="签字图片" width="350">
<el-table-column prop="SIGNTYPENAME" label="签字人员类型" />
<el-table-column label="签字图片">
<template #default="{ row }">
<img
v-viewer
@ -25,13 +23,17 @@
/>
</template>
</el-table-column>
<el-table-column prop="CREATTIME" label="签字录入时间" width="350" />
<el-table-column label="操作">
<el-table-column prop="CREATTIME" label="签字录入时间" />
<el-table-column label="操作" width="150">
<template #default="{ row }">
<el-button type="primary" text link @click="fnAdd(row.USERSIGNID)">
<el-button
type="primary"
text
link
@click="fnAdd(row.USERSIGNID, 'edit')"
>
编辑
</el-button>
<el-divider direction="vertical" />
<el-button
type="primary"
text
@ -40,7 +42,6 @@
>
查看
</el-button>
<el-divider direction="vertical" />
<el-button
type="primary"
text
@ -52,7 +53,7 @@
</template>
</el-table-column>
<template #button>
<el-button type="primary" @click="fnAdd('')"> </el-button>
<el-button type="primary" @click="fnAdd('', 'add')"> 新建 </el-button>
</template>
</layout-table>
</layout-card>
@ -60,7 +61,7 @@
v-model:visible="data.addOrEditDialog.visible"
v-model:form="data.addOrEditDialog.form"
:type="data.addOrEditDialog.type"
:usersignid="data.addOrEditDialog.USERSIGNID"
@get-data="fnResetPagination"
/>
</div>
</template>
@ -68,8 +69,9 @@
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js";
import { reactive, ref } from "vue";
import { nextTick, reactive } from "vue";
import {
getSignUserGoEdit,
getSignUserList,
setSignUserDelete,
} from "@/request/training_archive_management.js";
@ -78,22 +80,34 @@ import { ElMessage, ElMessageBox } from "element-plus";
import SignAdd from "./components/sign_add.vue";
const FILE_URL = import.meta.env.VITE_FILE_URL;
const tableRef = ref(null);
const data = reactive({
addOrEditDialog: {
visible: false,
form: {},
type: "",
USERSIGNID: "",
form: {
USERNAME: "",
USERSIGNTYPE: "",
DUTIES: "",
SIGNTYPE: "",
SIGN_PICTURE: "",
SIGN_PICTURE_2: [],
},
},
});
const { list, pagination, fnGetData, fnResetPagination } =
useListData(getSignUserList);
const fnAdd = (USERSIGNID, type) => {
const fnAdd = async (USERSIGNID, type) => {
data.addOrEditDialog.visible = true;
data.addOrEditDialog.USERSIGNID = USERSIGNID;
await nextTick();
data.addOrEditDialog.type = type;
if (type !== "add") {
const resData = await getSignUserGoEdit({
USERSIGNID,
});
data.addOrEditDialog.form = resData.varList;
data.addOrEditDialog.form.SIGN_PICTURE_2 = [];
}
};
const fnDelete = debounce(
1000,

View File

@ -3,49 +3,49 @@
<div class="tr mb">
<el-button type="primary" @click="fnExport"></el-button>
</div>
<div id="printContent">
<h1 style="text-align: center; margin-left: 60px">
安全生产教育培训动态评估报告
</h1>
<p class="p1" style="width: 100%; text-align: center">
<div>
<h1 class="tc">安全生产教育培训动态评估报告</h1>
<p class="tc">
<span>
企业名称:
{{ data.evaluationDialogForm.CORP_NAME }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{{ data.evaluationDialogForm.CORP_NAME }}
</span>
<span class="ml-10">
评估日期:
{{ data.evaluationDialogForm.END_TIME }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{{ data.evaluationDialogForm.END_TIME }}
</span>
</p>
<h3>评估概述</h3>
<p class="p1">
<h3 class="mt-10">评估概述</h3>
<p class="mt-10">
本报告旨在对{{ data.evaluationDialogForm.CORP_NAME }}公司
的安全生产培训进行动态评估安全生产培训的目标是提高员工的安全意识和技能促进工作场所的安全管理和事故预防本报告将对培训的实施情况培训效果参与度员工考试通过率知识盲点以及可能的改进措施进行评估和分析
</p>
<h3>评估内容</h3>
<p class="p1">
<h3 class="mt-10">评估内容</h3>
<p class="mt-10">
贵公司于{{ data.evaluationDialogForm.START_TIME }}时间 -
{{ data.evaluationDialogForm.END_TIME }}时间进行了{{
data.evaluationDialogForm.CLASS_NAME
}}培训培训内容如下{{ data.evaluationDialogForm.coursewareName }}
</p>
<h3>考试结果</h3>
<p class="p1">
<b
>本次考试共{{
<h3 class="mt-10">考试结果</h3>
<p class="mt-10">
<b>
本次考试共{{
data.evaluationDialogForm.EXMA_COUNT
}}人参加合格人数{{
data.evaluationDialogForm.PASS_COUNT
}}未合格人数{{
data.evaluationDialogForm.NO_PASS_COUNT
}}通过率{{
data.evaluationDialogForm.passRate
}}%具体情况如下</b
>
}}通过率{{ data.evaluationDialogForm.passRate }}%具体情况如下
</b>
</p>
<div id="chart" ref="chart" style="width: 900px; height: 320px" />
<p class="p1"><b>评估结果和分析</b></p>
<p class="p1">
<div id="chart" style="width: 900px; height: 320px; margin: 10px auto" />
<p class="mt-10"><b>评估结果和分析</b></p>
<p class="mt-10">
基于评估结果和培训过程中的观察我们对员工的知识盲点进行分析指出可能存在的理解不足或需要加强的知识领域主要知识盲点体现为
</p>
<p class="p1">{{ data.evaluationDialogForm.error }}</p>
<table class="table">
<p class="mt-10">{{ data.evaluationDialogForm.error }}</p>
<table class="print_table mt-10">
<tr>
<td>标签名称</td>
<td>错误率</td>
@ -58,15 +58,15 @@
<td>{{ value }}%</td>
</tr>
</table>
<p class="p1">知识盲点对应课件为</p>
<p class="p1">{{ data.evaluationDialogForm.errorVideoName }}</p>
<p class="p1"><b>评估建议</b></p>
<p class="p1">
<p class="mt-10">知识盲点对应课件为</p>
<p class="mt-10">{{ data.evaluationDialogForm.errorVideoName }}</p>
<p class="mt-10"><b>评估建议</b></p>
<p class="mt-10">
存在的知识盲点需要进一步加强和补充我们建议您将重点放在弥补这些盲点上通过进一步学习参与讨论或与安全专家交流弥补知识盲区
</p>
<h3>强化培训记录</h3>
<p class="p1"><b>强化培训考试记录</b></p>
<table class="table">
<h3 class="mt-10">强化培训记录</h3>
<p class="mt-10"><b>强化培训考试记录</b></p>
<table class="print_table mt-10">
<tr>
<td colspan="3">班级名称</td>
<td colspan="3">培训时间</td>
@ -105,15 +105,15 @@
<td style="width: 25%">效果评估成绩</td>
</tr>
<tr
v-for="(value, key) in data.evaluationDialogForm.PASS_List"
:key="key"
v-for="(item, index) in data.evaluationDialogForm.PASS_List"
:key="index"
>
<td style="width: 10%">{{ key + 1 }}</td>
<td style="width: 15%">{{ value.NAME }}</td>
<td style="width: 25%">{{ value.USER_ID_CARD }}</td>
<td style="width: 20%">{{ value.PHONE }}</td>
<td style="width: 10%">{{ value.SEX }}</td>
<td style="width: 25%">{{ value.STRENGTHENEXAMSCORE }}</td>
<td style="width: 10%">{{ index + 1 }}</td>
<td style="width: 15%">{{ item.NAME }}</td>
<td style="width: 25%">{{ item.USER_ID_CARD }}</td>
<td style="width: 20%">{{ item.PHONE }}</td>
<td style="width: 10%">{{ item.SEX }}</td>
<td style="width: 25%">{{ item.STRENGTHENEXAMSCORE }}</td>
</tr>
<tr>
<td colspan="6">未合格学员名单</td>
@ -127,15 +127,15 @@
<td style="width: 25%">效果评估成绩</td>
</tr>
<tr
v-for="(value, key) in data.evaluationDialogForm.NO_PASS_List"
:key="key"
v-for="(item, index) in data.evaluationDialogForm.NO_PASS_List"
:key="index"
>
<td style="width: 10%">{{ key + 1 }}</td>
<td style="width: 15%">{{ value.NAME }}</td>
<td style="width: 25%">{{ value.USER_ID_CARD }}</td>
<td style="width: 20%">{{ value.PHONE }}</td>
<td style="width: 10%">{{ value.SEX }}</td>
<td style="width: 25%">{{ value.STRENGTHENEXAMSCORE }}</td>
<td style="width: 10%">{{ index + 1 }}</td>
<td style="width: 15%">{{ item.NAME }}</td>
<td style="width: 25%">{{ item.USER_ID_CARD }}</td>
<td style="width: 20%">{{ item.PHONE }}</td>
<td style="width: 10%">{{ item.SEX }}</td>
<td style="width: 25%">{{ item.STRENGTHENEXAMSCORE }}</td>
</tr>
</table>
</div>
@ -146,11 +146,12 @@
</template>
<script setup>
import { reactive, ref, watchEffect } from "vue";
import { reactive, watchEffect } from "vue";
import { ElMessageBox } from "element-plus";
import { tryOnMounted, useVModel } from "@vueuse/core";
import { getClassEvaluation } from "@/request/training_archive_management.js";
import { useVModel } from "@vueuse/core";
import dayjs from "dayjs";
import * as echarts from "echarts";
const props = defineProps({
@ -164,7 +165,6 @@ const props = defineProps({
default: false,
},
});
const chart = ref(null);
const visible = useVModel(props, "visible");
const data = reactive({
evaluationDialogForm: {},
@ -180,7 +180,9 @@ const fnGetData = async () => {
data.count1 = resData.pageData.count1;
data.count2 = resData.pageData.count2;
data.count3 = resData.pageData.count3;
tryOnMounted(() => {
fnGetPie();
});
};
const fnExport = async () => {
await ElMessageBox.confirm("确定要导出吗?", { type: "warning" });
@ -193,29 +195,22 @@ watchEffect(() => {
if (visible.value) fnGetData();
});
const fnGetPie = async () => {
const bar_dv = chart.value;
const count1 = data.count1;
const count2 = data.count2;
const count3 = data.count3;
if (bar_dv) {
const data = [];
if (count1 !== 0) {
data.push({ value: count1, name: "正确率100%" });
}
if (count2 !== 0) {
data.push({ value: count2, name: "正确率80%-100%" });
}
if (count3 !== 0) {
data.push({ value: count3, name: "正确率80%以下" });
}
const myChart = echarts.init(bar_dv);
const seriesData = [];
if (count1 !== "0") seriesData.push({ value: count1, name: "正确率100%" });
if (count2 !== "0")
seriesData.push({ value: count2, name: "正确率80%-100%" });
if (count3 !== "0") seriesData.push({ value: count3, name: "正确率80%以下" });
const myChart = echarts.init(document.querySelector("#chart"));
myChart.setOption({
title: {
text: "人数",
left: "center",
textStyle: {
color: "#fff",
},
tooltip: {
trigger: "item",
},
series: [
{
@ -223,12 +218,12 @@ const fnGetPie = async () => {
type: "pie",
itemStyle: {
borderRadius: 10,
borderColor: "#fff",
borderColor: "#c7c6c6",
borderWidth: 2,
},
radius: "80%",
silent: "ture",
data,
data: seriesData,
label: {
normal: {
show: true,
@ -237,32 +232,14 @@ const fnGetPie = async () => {
textStyle: {
fontWeight: 500,
fontSize: "12",
color: "#fff",
},
},
},
},
],
});
}
};
</script>
<style scoped lang="scss">
.flex {
display: flex;
align-items: center;
justify-content: space-between;
}
table {
width: 100%;
border-collapse: collapse;
td {
border: 1px solid var(--el-border-color);
padding: 8px;
font-size: 14px;
text-align: center;
}
}
</style>
<style scoped lang="scss"></style>

View File

@ -3,30 +3,23 @@
<div class="tr mb">
<el-button type="primary" @click="fnExport"></el-button>
</div>
<div id="printContent">
<h1 style="text-align: center; margin-left: 60px">
安全生产教育培训动态评估报告
</h1>
<p class="p1" style="width: 100%; text-align: center">
姓名: {{ data.evaluationDialogForm.NAME }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
身份证号:
{{
data.evaluationDialogForm.USER_ID_CARD
}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 评估日期:
{{ data.evaluationDialogForm.OPERATTIME }}
<div>
<h1 class="tc">安全生产教育培训动态评估报告</h1>
<p class="tc">
<span>姓名: {{ data.evaluationDialogForm.NAME }}</span>
<span class="ml-20">
身份证号: {{ data.evaluationDialogForm.USER_ID_CARD }}
</span>
<span class="ml-20">
评估日期: {{ data.evaluationDialogForm.OPERATTIME }}
</span>
</p>
<h3>评估概述</h3>
<p class="p1">
<h3 class="mt-10">评估概述</h3>
<p class="mt-10">
本报告旨在评估您在最近接受的安全培训中的个人效果并提供课程考试结果以及指出可能存在的知识盲点安全培训的目标是提高您在工作环境中的安全意识和行为以减少事故和伤害的发生本报告将对您的培训参与度知识掌握程度课程考试成绩以及可能存在的知识盲点进行评估
</p>
<h3>学员基本情况</h3>
<table
align="center"
border="1"
cellspacing="0"
width="100%"
class="table"
>
<h3 class="mt-10">学员基本情况</h3>
<table class="print_table mt-10">
<tr>
<td style="width: 70px">姓名</td>
<td style="width: 60px">{{ data.evaluationDialogForm.NAME }}</td>
@ -60,154 +53,116 @@
<td colspan="9">{{ data.evaluationDialogForm.PERSONNEL_TYPE }}</td>
</tr>
</table>
<h3>评估内容</h3>
<p class="p1">
<h3 class="mt-10">评估内容</h3>
<p class="mt-10">
您在 {{ data.evaluationDialogForm.START_TIME }} -
{{ data.evaluationDialogForm.END_TIME }} 进行了
{{ data.evaluationDialogForm.CLASS_NAME }} 培训内容如下
{{ data.evaluationDialogForm.coursewareName }}
</p>
<p class="p1">
<p class="mt-10">
您参加了培训后的课程考试并取得了以下成绩{{
data.evaluationDialogForm.STAGEEXAMSCORE
}}
</p>
<h3>评估结果</h3>
<p class="p1">根据我们的评估您的个人培训效果如下</p>
<p class="p1">
<b
>您在培训期间表现出积极的参与度完成了所有的培训课程和活动</b
>
<h3 class="mt-10">评估结果</h3>
<p class="mt-10">根据我们的评估您的个人培训效果如下</p>
<p class="mt-10">
<b>
您在培训期间表现出积极的参与度完成了所有的培训课程和活动
</b>
</p>
<p class="p1">
<b
><span v-if="data.evaluationDialogForm.correct !== ''"
>您对 {{ data.evaluationDialogForm.correct }} 知识掌握得很好</span
>在评估过程中我们发现您可能存在以下知识盲点{{
<p class="mt-10">
<b>
<span v-if="data.evaluationDialogForm.correct !== ''">
您对 {{ data.evaluationDialogForm.correct }} 知识掌握得很好
</span>
在评估过程中我们发现您可能存在以下知识盲点{{
data.evaluationDialogForm.error
}}</b
>
}}
</b>
</p>
<p class="p1">知识盲点对应课件为</p>
<p class="p1">{{ data.evaluationDialogForm.errorVideoName }}</p>
<p class="p1"><b>评估建议</b></p>
<p class="p1">
<p class="mt-10">知识盲点对应课件为</p>
<p class="mt-10">{{ data.evaluationDialogForm.errorVideoName }}</p>
<p class="mt-10"><b>评估建议</b></p>
<p class="mt-10">
存在的知识盲点需要进一步加强和补充我们建议您将重点放在弥补这些盲点上通过进一步学习参与讨论或与安全专家交流弥补知识盲区
</p>
<h3>强化培训记录</h3>
<p class="p1"><b>强化培训考试记录</b></p>
<div
v-if="data.evaluationDialogForm.STRENGTHEN_EXAMNAME !== '0'"
class="page-break"
>
<div class="levelup no-print">
<h3 class="mt-10">强化培训记录</h3>
<p class="mt-10"><b>强化培训考试记录</b></p>
<div v-if="data.evaluationDialogForm.STRENGTHEN_EXAMNAME !== '0'">
<div class="tc">
<h1>考卷详情</h1>
</div>
<div class="paper-details chapter_box">
<div class="chapter_right_img" />
<h1 style="text-align: center">
<div>
<h1 class="tc">
{{ data.evaluationDialogForm.STRENGTHEN_EXAMNAME }}
</h1>
<div style="text-align: center">
<div class="tc">
(满分:{{ data.evaluationDialogForm.STRENGTHEN_EXAMSCORE }})
</div>
<div class="subflex">
<div class="mt-10">
<span>班级名称:{{ data.evaluationDialogForm.CLASS_NAME }}</span>
<span>姓名:{{ data.evaluationDialogForm.NAME }}</span>
<span class="ml-20">姓名:{{ data.evaluationDialogForm.NAME }}</span>
</div>
<div class="subflex">
<span
>考试时间:{{
data.evaluationDialogForm.STRENGTHEN_OPERATTIME
}}</span
>
<span
>分数:{{ data.evaluationDialogForm.STRENGTHENEXAMSCORE }}</span
>
</div>
<div class="study-papg">
<dl
v-for="(row, key) in data.evaluationDialogForm
.strengthenexamrecord"
:key="key"
>
<dt>
<span v-if="row.QUESTIONTYPE === '1'" class="mark mark-green"
>(单选题)
<div class="mt-10">
<span>
考试时间:{{ data.evaluationDialogForm.STRENGTHEN_OPERATTIME }}
</span>
<span v-if="row.QUESTIONTYPE === '2'" class="mark mark-blue"
>(多选题)</span
<span class="ml-20">
分数:{{ data.evaluationDialogForm.STRENGTHENEXAMSCORE }}
</span>
</div>
<div class="items mt-20 p-20">
<div
v-for="(item, index) in data.evaluationDialogForm
.strengthenexamrecord"
:key="item.index"
class="item ptb-20"
>
<span v-if="row.QUESTIONTYPE === '3'" class="mark mark-orange"
>(判断题)</span
>
<span v-if="row.QUESTIONTYPE === '4'" class="mark mark-purple"
>(填空题)</span
>
{{ key + 1 }}.{{ row.QUESTIONDRY }}
<span class="ml-10">(题目分值{{ row.SCORE }})</span>
</dt>
<div class="mt-10">
{{ index + 1 }}.
<span v-if="item.QUESTIONTYPE === '1'"> () </span>
<span v-if="item.QUESTIONTYPE === '2'"> () </span>
<span v-if="item.QUESTIONTYPE === '3'"> () </span>
{{ item.QUESTIONDRY }}
<span class="ml-10">(题目分值{{ item.SCORE }})</span>
</div>
<div class="mt-10 ml-30">
<el-radio-group
v-if="row.QUESTIONTYPE === '1'"
v-model="row.ANSWER"
:disabled="true"
v-if="item.QUESTIONTYPE === '1'"
disabled
:model-value="item.ANSWER"
>
<dd>
<el-radio value="A">A.{{ row.OPTIONA }}</el-radio>
</dd>
<dd>
<el-radio value="B">B.{{ row.OPTIONB }}</el-radio>
</dd>
<dd>
<el-radio value="C">C.{{ row.OPTIONC }}</el-radio>
</dd>
<dd>
<el-radio value="D">D.{{ row.OPTIOND }}</el-radio>
</dd>
<el-radio value="A">A.{{ item.OPTIONA }}</el-radio>
<el-radio value="B">B.{{ item.OPTIONB }}</el-radio>
<el-radio value="C">C.{{ item.OPTIONC }}</el-radio>
<el-radio value="D">D.{{ item.OPTIOND }}</el-radio>
</el-radio-group>
<el-checkbox-group
v-if="row.QUESTIONTYPE === '2'"
v-model="row.checkList"
:disabled="true"
v-if="item.QUESTIONTYPE === '2'"
disabled
:model-value="item.ANSWER?.split('')"
>
<dd>
<el-checkbox value="A">A.{{ row.OPTIONA }}</el-checkbox>
</dd>
<dd>
<el-checkbox value="B">B.{{ row.OPTIONB }}</el-checkbox>
</dd>
<dd>
<el-checkbox value="C">C.{{ row.OPTIONC }}</el-checkbox>
</dd>
<dd>
<el-checkbox value="D">D.{{ row.OPTIOND }}</el-checkbox>
</dd>
<el-checkbox value="A">A.{{ item.OPTIONA }}</el-checkbox>
<el-checkbox value="B">B.{{ item.OPTIONB }}</el-checkbox>
<el-checkbox value="C">C.{{ item.OPTIONC }}</el-checkbox>
<el-checkbox value="D">D.{{ item.OPTIOND }}</el-checkbox>
</el-checkbox-group>
<el-radio-group
v-if="row.QUESTIONTYPE === '3'"
v-model="row.ANSWER"
:disabled="true"
v-if="item.QUESTIONTYPE === '3'"
disabled
:model-value="item.ANSWER"
>
<dd>
<el-radio value="A">A.{{ row.OPTIONA }}</el-radio>
</dd>
<dd>
<el-radio value="B">B.{{ row.OPTIONB }}</el-radio>
</dd>
<el-radio value="A">A.{{ item.OPTIONA }}</el-radio>
<el-radio value="B">B.{{ item.OPTIONB }}</el-radio>
</el-radio-group>
<div class="flex-layout space-between">
<div>
<div v-if="row.QUESTIONTYPE === '4'" class="mb-10">
学员答案{{ row.ANSWER }}
</div>
<div class="mb-10">参考答案{{ row.ANSWERRIGHT }}</div>
<div>答案解析{{ row.DESCR }}</div>
<div class="mt-10">答案{{ item.ANSWER }}</div>
<div class="mt-10">答案解析{{ item.DESCR }}</div>
</div>
</div>
</dl>
</div>
</div>
</div>
</div>
@ -263,21 +218,19 @@ watchEffect(() => {
</script>
<style scoped lang="scss">
.flex {
display: flex;
align-items: center;
justify-content: space-between;
}
table {
width: 100%;
border-collapse: collapse;
td {
.items {
border: 1px solid var(--el-border-color);
padding: 8px;
font-size: 14px;
text-align: center;
.item {
border-bottom: 1px dashed #ebeef5;
&:first-child {
padding-top: 0;
}
&:last-child {
border-bottom: none;
}
}
}
</style>

View File

@ -9,10 +9,7 @@
<el-row>
<el-col :span="6">
<el-form-item label="班级名称" prop="NAME">
<el-input
v-model="searchForm.NAME"
placeholder="请输入班级名称"
/>
<el-input v-model="searchForm.NAME" />
</el-form-item>
</el-col>
<el-col :span="6">
@ -21,7 +18,6 @@
v-model="searchForm.YEAR"
value-format="YYYY"
type="year"
style="width: 100%"
/>
</el-form-item>
</el-col>
@ -38,32 +34,30 @@
</el-card>
<layout-card>
<layout-table
ref="tableRef"
v-model:pagination="pagination"
:data="list"
@get-data="fnGetData"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="NAME" label="班级名称" width="200" />
<el-table-column prop="NAME" label="班级名称" />
<el-table-column prop="CODE" label="班级编码" width="200" />
<el-table-column prop="TRAINTYPENAME" label="培训类型" width="200" />
<el-table-column prop="POSTTYPENAME" label="岗位类型" width="200" />
<el-table-column
prop="PASSSTUDENTCOUNT"
label="效果评估通过人数"
width="200"
width="150"
/>
<el-table-column
prop="ALLSTUDENTCOUNT"
label="效果评估总人数"
width="200"
width="150"
/>
<el-table-column label="操作">
<el-table-column label="操作" width="200">
<template #default="{ row }">
<el-button
type="primary"
@ -102,19 +96,18 @@
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js";
import { reactive, ref } from "vue";
import { reactive } from "vue";
import { getClassStrengthenDetailsList } from "@/request/training_archive_management.js";
import router from "@/router/index.js";
import ClassStrengthen from "./components/classStrengthen.vue";
import { useRouter } from "vue-router";
const router = useRouter();
const data = reactive({
evaluationDialog: {
visible: false,
CLASS_ID: "",
},
});
const tableRef = ref(null);
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getClassStrengthenDetailsList);

View File

@ -3,7 +3,7 @@
<el-card>
<el-form
:model="searchForm"
label-width="100px"
label-width="60px"
@submit.prevent="fnResetPagination"
>
<el-row>
@ -18,7 +18,6 @@
v-model="searchForm.YEAR"
value-format="YYYY"
type="year"
style="width: 100%"
/>
</el-form-item>
</el-col>
@ -35,36 +34,26 @@
</el-card>
<layout-card>
<layout-table
ref="tableRef"
v-model:pagination="pagination"
:data="list"
@get-data="fnGetData"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="STUDENTNAME" label="姓名" width="200" />
<el-table-column prop="USERIDCARD" label="身份证号" width="200" />
<el-table-column prop="PHONE" label="手机号" width="200" />
<el-table-column
prop="STRENGTHENEXAMSTATE"
label="效果评估状态"
width="200"
>
<el-table-column prop="STUDENTNAME" label="姓名" />
<el-table-column prop="USERIDCARD" label="身份证号" />
<el-table-column prop="PHONE" label="手机号" />
<el-table-column label="效果评估状态" width="100">
<template #default="{ row }">
<span>
{{ row.STRENGTHENEXAMSTATE === "3" ? "通过" : "未通过" }}
</span>
</template>
</el-table-column>
<el-table-column
prop="STRENGTHENEXAMSCORE"
label="效果评估最高分"
width="200"
>
<el-table-column label="效果评估最高分" width="200">
<template #default="{ row }">
<span>
{{
@ -75,7 +64,7 @@
</span>
</template>
</el-table-column>
<el-table-column label="操作">
<el-table-column label="操作" width="150">
<template #default="{ row }">
<el-button
type="primary"
@ -99,15 +88,13 @@
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js";
import { reactive, ref } from "vue";
import { reactive } from "vue";
import { getStudentStrengthenDetailsList } from "@/request/training_archive_management.js";
import { useRoute } from "vue-router";
import StudentStrengthen from "./components/studentStrengthen.vue";
const route = useRoute();
const { CLASS_ID } = route.query;
const tableRef = ref(null);
const data = reactive({
evaluationDialog: {
visible: false,

View File

@ -61,7 +61,7 @@ import {
getClassManagementSelectStudentAdd,
getClassManagementSelectStudentList,
} from "@/request/training_process_management.js";
import { layoutFnGetPersonnelType } from "@/assets/js/data_dictionary.js";
import { layoutFnGetPersonnelTypeTraffic } from "@/assets/js/data_dictionary.js";
import { ref, watch } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
@ -127,7 +127,10 @@ watch(
}
}
);
const personnelTypeList = await layoutFnGetPersonnelType();
const personnelTypeList = await layoutFnGetPersonnelTypeTraffic({
DICTIONARIES_ID: "0b62f92b0b624aab8e89a77304a64d5e",
BIANMA: "TRAFFIC_EMPLOYMENT",
});
const fnClose = () => {
formRef.value.resetFields();
tableRef.value.clearSelection();

View File

@ -63,13 +63,13 @@
:rules="rules"
label-position="top"
>
<el-form-item label="试卷名称">
<el-form-item label="试卷名称" prop="EXAMNAME">
<el-input :model-value="data.form.EXAMNAME" readonly />
</el-form-item>
<el-form-item label="试卷分数">
<el-form-item label="试卷分数" prop="EXAMSCORE">
<el-input :model-value="data.form.EXAMSCORE" readonly />
</el-form-item>
<el-form-item label="合格分数">
<el-form-item label="合格分数" prop="PASSSCORE">
<el-input :model-value="data.form.PASSSCORE" readonly />
</el-form-item>
<el-form-item label="考试时长(分)" prop="ANSWERSHEETTIME">
@ -97,7 +97,7 @@ import {
getExamPaperManagementTestQuestions,
getExamPaperManagementView,
} from "@/request/training_resource_management.js";
import { reactive, ref, watchEffect } from "vue";
import { reactive, ref, watch } from "vue";
import { serialNumber } from "@/assets/js/utils.js";
import ExamPaperDetails from "./exam_paper_details.vue";
import { debounce } from "throttle-debounce";
@ -132,9 +132,15 @@ const emits = defineEmits(["update:visible", "submit"]);
const visible = useVModel(props, "visible", emits);
const { list, searchForm, pagination, fnGetData, fnResetPagination } =
useListData(getExamPaperManagementList, { immediate: false });
watchEffect(() => {
if (visible.value) fnResetPagination();
});
const stop = watch(
() => visible.value,
() => {
if (visible.value) {
fnResetPagination();
stop && stop();
}
}
);
const data = reactive({
viewDialog: {
visible: false,