Merge remote-tracking branch 'origin/dev' into dev

dev
xiepeng 2024-03-25 10:17:49 +08:00
commit 0e10930e28
58 changed files with 1902 additions and 1887 deletions

View File

@ -84,13 +84,6 @@ export const layoutFnGetDegreeOfEducation = async () => {
}); });
return ref(resData.list); return ref(resData.list);
}; };
// 人员类型
// export const layoutFnGetPersonnelType = async () => {
// const resData = await getLevels({
// DICTIONARIES_ID: "0b62f92b0b624aab8e89a77304a64d5e",
// });
// return ref(resData.list);
// };
// 人员类型(交通版) // 人员类型(交通版)
export const layoutFnGetPersonnelTypeTraffic = async (params) => { export const layoutFnGetPersonnelTypeTraffic = async (params) => {
const resData = await getLevelsByObject(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 getClassGoEdit = (params) => post("/class/goEdit", params);
export const getReviewGoEdit = (params) => export const getReviewGoEdit = (params) =>
post("/archivesReview/goEdit", params); // 一期一档安全培训教材会审表详情 post("/archivesReview/goEdit", params); // 一期一档安全培训教材会审表详情
export const getReviewRecord = (params) => export const getReviewAdd = (params) => post("/archivesReview/add", params); // 一期一档安全培训教材会审表添加
post("/archives/reviewRecord", 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) => export const getStudentSigns = (params) =>
post("/archives/getStudentSigns", params); // 一期一档学员考核成绩统计表 post("/archives/getStudentSigns", params); // 一期一档学员考核成绩统计表
export const getClassPaper = (params) => post("/archives/getPaper", 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 getReviewUserList = (params) => post("/reviewUser/list", params); // 获取审查人员列表
export const setReviewUserDelete = (params) => export const setReviewUserDelete = (params) =>
post("/reviewUser/delete", params); // 审查人员删除 post("/reviewUser/delete", params); // 审查人员删除
export const setReviewUserAdd = (params) => post("/reviewUser/save", params); // 审查人员添加 export const setReviewUserAdd = (params) => upload("/reviewUser/save", params); // 审查人员添加
export const setReviewUserEdit = (params) => post("/reviewUser/edit", params); // 审查人员编辑 export const setReviewUserEdit = (params) => upload("/reviewUser/edit", params); // 审查人员编辑
export const getReviewUserGoEdit = (params) => export const getReviewUserGoEdit = (params) =>
post("/reviewUser/goEdit", params); // 获取审查人员编辑信息 post("/reviewUser/goEdit", params); // 获取审查人员编辑信息
export const getSignUserList = (params) => export const getSignUserList = (params) =>
post("/trainedusersign/list", params); // 获取签字人员列表 post("/trainedusersign/list", params); // 获取签字人员列表
export const setSignUserDelete = (params) => export const setSignUserDelete = (params) =>
post("/trainedusersign/delete", 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) => export const setSignUserEdit = (params) =>
post("/trainedusersign/edit", params); // 签字人员编辑 upload("/trainedusersign/edit", params); // 签字人员编辑
export const getSignUserGoEdit = (params) => export const getSignUserGoEdit = (params) =>
post("/trainedusersign/goEdit", 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

@ -21,6 +21,7 @@ export const getAssociatedCoursewareNameList = (params) =>
export const getClassManagementList = (params) => post("/class/list", params); // 班级管理列表 export const getClassManagementList = (params) => post("/class/list", params); // 班级管理列表
export const setClassManagementDelete = (params) => export const setClassManagementDelete = (params) =>
post("/class/delete", params); // 班级管理删除 post("/class/delete", params); // 班级管理删除
export const setClassFinish = (params) => post("/class/finish", params); // 班级管理完成
export const setClassManagementDelay = (params) => export const setClassManagementDelay = (params) =>
post("/class/postpone", params); // 班级管理延期 post("/class/postpone", params); // 班级管理延期
export const getPersonnelList = (params) => export const getPersonnelList = (params) =>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
<template> <template>
<div> <layout-card>
<div class="tr mb"> <div class="tr mb">
<el-button type="primary" @click="fnExport"></el-button> <el-button type="primary" @click="fnExport"></el-button>
</div> </div>
@ -11,7 +11,7 @@
> >
<el-table-column reserve-selection type="selection" width="55" /> <el-table-column reserve-selection type="selection" width="55" />
<el-table-column prop="NAME" label="目录" /> <el-table-column prop="NAME" label="目录" />
<el-table-column prop="" label="操作" width="140"> <el-table-column label="操作" width="100">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" text link @click="fnView(row)"> <el-button type="primary" text link @click="fnView(row)">
编辑 编辑
@ -25,37 +25,11 @@
v-model:type="data.type" v-model:type="data.type"
:title="data.title" :title="data.title"
:clazz-id="CLASS_ID" :clazz-id="CLASS_ID"
:post-id="POST_ID"
:corp-info-id="CORPINFO_ID" :corp-info-id="CORPINFO_ID"
:corp-name="CORP_NAME" :corp-name="CORP_NAME"
:post-name="POST_NAME"
/> />
<el-dialog <setting v-model:visible="data.settingDialogVisible" @submit="fnSubmit" />
:model-value="data.delayDialog.visible" </layout-card>
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>
</template> </template>
<script setup> <script setup>
@ -66,16 +40,16 @@ import Results from "./components/results.vue";
import SignatureForm from "./components/signature_form.vue"; import SignatureForm from "./components/signature_form.vue";
import { markRaw, reactive, ref } from "vue"; import { markRaw, reactive, ref } from "vue";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus"; import { ElMessage, ElMessageBox } from "element-plus";
import { import {
getClassPapers, getClassPapers,
downloadArchiveDirectory, downloadArchiveDirectory,
} from "@/request/training_archive_management.js"; } from "@/request/training_archive_management.js";
import Setting from "./components/setting.vue";
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
const { CLASS_ID, CORP_NAME, CLASS_NAME, CORPINFO_ID, POST_ID, POST_NAME } = const { CLASS_ID, CORP_NAME, CLASS_NAME, CORPINFO_ID } = route.query;
route.query;
const tableRef = ref(null); const tableRef = ref(null);
const data = reactive({ const data = reactive({
list: [ list: [
@ -114,15 +88,7 @@ const data = reactive({
type: 0, type: 0,
title: "", title: "",
component: "", component: "",
delayDialog: { settingDialogVisible: false,
visible: false,
form: {
TIME: "",
},
rules: {
TIME: [{ required: true, message: "请选择日期", trigger: "blur" }],
},
},
}); });
const fnView = ({ TYPE, NAME, component, url }) => { const fnView = ({ TYPE, NAME, component, url }) => {
if (!component && url) { if (!component && url) {
@ -139,30 +105,23 @@ const fnView = ({ TYPE, NAME, component, url }) => {
} }
}; };
const fnExport = async () => { const fnExport = async () => {
let setDateFlag = false;
const selectionData = tableRef.value.getSelectionRows(); const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) { if (selectionData.length === 0) {
ElMessage.warning("请选中要导出的项"); ElMessage.warning("请选中要导出的项");
return; return;
} }
for (let i = 0; i < selectionData.length; i++) { const TYPE = selectionData.map((item) => item.TYPE);
if (JSON.stringify(selectionData[i].TYPE) === "101") { if (TYPE.includes(101)) {
setDateFlag = true;
}
}
if (setDateFlag) {
await ElMessageBox.confirm("导出前,请设置培训计划表中的编制日期", { await ElMessageBox.confirm("导出前,请设置培训计划表中的编制日期", {
type: "warning", type: "warning",
}); });
data.delayDialog.visible = true; data.settingDialogVisible = true;
} else { } else {
submit(); await fnSubmit();
} }
}; };
const submit = async () => { const fnSubmit = async (UPDATE_DATE) => {
data.delayDialog.visible = false;
const selectionData = tableRef.value.getSelectionRows(); const selectionData = tableRef.value.getSelectionRows();
//
if ( if (
selectionData.length === 1 && selectionData.length === 1 &&
JSON.stringify(selectionData[0].TYPE) === "103" JSON.stringify(selectionData[0].TYPE) === "103"
@ -171,13 +130,13 @@ const submit = async () => {
if (resData.varList.length === 0) { if (resData.varList.length === 0) {
ElMessage.error("培训考核试卷没有数据!"); ElMessage.error("培训考核试卷没有数据!");
} else { } else {
recordDownLoad(selectionData); await recordDownLoad(selectionData, UPDATE_DATE);
} }
} else { } else {
recordDownLoad(selectionData); await recordDownLoad(selectionData, UPDATE_DATE);
} }
}; };
const recordDownLoad = async (selectionData) => { const recordDownLoad = async (selectionData, UPDATE_DATE) => {
const archiveDirectory = []; const archiveDirectory = [];
for (let i = 0; i < selectionData.length; i++) { for (let i = 0; i < selectionData.length; i++) {
archiveDirectory.push({ archiveDirectory.push({
@ -191,7 +150,7 @@ const recordDownLoad = async (selectionData) => {
CLASS_ID, CLASS_ID,
CORPINFO_ID, CORPINFO_ID,
typeList: JSON.stringify(archiveDirectory), typeList: JSON.stringify(archiveDirectory),
UPDATE_DATE: data.delayDialog.form.TIME, UPDATE_DATE,
}); });
await ElMessageBox.confirm("导出后请前往档案下载中下载该档案!", "温馨提示", { await ElMessageBox.confirm("导出后请前往档案下载中下载该档案!", "温馨提示", {
type: "info", 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 }} {{ item.CURRICULUMNAME }}
</h2> </h2>
<div <div
v-for="(cha, i) in item.chapterList" v-for="(item1, index1) in item.chapterList"
:key="i" :key="index1"
style="padding-bottom: 20px" style="padding-bottom: 20px"
> >
<div v-if="item.CATALOGUELEVEL === '1'"> <div v-if="item.CATALOGUELEVEL === '1'">
<dt>{{ i + 1 }}.{{ cha.CHAPTER_NAME }}</dt> <dt>{{ index1 + 1 }}.{{ item1.CHAPTER_NAME }}</dt>
<dd>课件描述 {{ cha.COURSEWAREINTRODUCE }}</dd> <dd>课件描述 {{ item1.COURSEWAREINTRODUCE }}</dd>
</div> </div>
<div v-else-if="item.CATALOGUELEVEL === '2'"> <div v-else-if="item.CATALOGUELEVEL === '2'">
<dt>{{ i + 1 }}.{{ cha.CHAPTER_NAME }}</dt> <dt>{{ index1 + 1 }}.{{ item1.CHAPTER_NAME }}</dt>
<div v-for="(video, j) in cha.nodes" :key="j"> <div v-for="(item2, index2) in item1.nodes" :key="index2">
<dd>{{ j + 1 }}.{{ video.CHAPTER_NAME }}</dd> <dd>{{ index2 + 1 }}.{{ item2.CHAPTER_NAME }}</dd>
<dd>课件描述 {{ video.COURSEWAREINTRODUCE }}</dd> <dd>课件描述 {{ item2.COURSEWAREINTRODUCE }}</dd>
</div> </div>
</div> </div>
</div> </div>
@ -57,22 +57,6 @@ const props = defineProps({
type: String, type: String,
required: true, required: true,
}, },
postId: {
type: String,
required: true,
},
corpInfoId: {
type: String,
required: true,
},
corpName: {
type: String,
required: true,
},
postName: {
type: String,
required: true,
},
curriculumId: { curriculumId: {
type: String, type: String,
required: true, required: true,

View File

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

View File

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

View File

@ -9,7 +9,7 @@
<el-button type="primary" @click="fnExport"></el-button> <el-button type="primary" @click="fnExport"></el-button>
</div> </div>
<h2 class="tc mb">{{ data.clazz.NAME }}培训综合考评报告</h2> <h2 class="tc mb">{{ data.clazz.NAME }}培训综合考评报告</h2>
<table> <table class="print_table">
<tr class="tab_tr"> <tr class="tab_tr">
<td class="tc">培训班名称</td> <td class="tc">培训班名称</td>
<td class="tc">{{ data.clazz.NAME }}</td> <td class="tc">{{ data.clazz.NAME }}</td>
@ -98,22 +98,10 @@ const props = defineProps({
type: String, type: String,
required: true, required: true,
}, },
postId: {
type: String,
required: true,
},
corpInfoId: { corpInfoId: {
type: String, type: String,
required: true, required: true,
}, },
corpName: {
type: String,
required: true,
},
postName: {
type: String,
required: true,
},
}); });
const data = reactive({ const data = reactive({
info: {}, info: {},
@ -166,16 +154,4 @@ const fnClose = () => {
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss"></style>
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

@ -16,7 +16,7 @@
>报表日期:{{ dayjs(data.clazz.END_TIME).format("YYYY-MM-DD") }}</span >报表日期:{{ dayjs(data.clazz.END_TIME).format("YYYY-MM-DD") }}</span
> >
</div> </div>
<table> <table class="print_table">
<tr> <tr>
<td colspan="2">公司名称</td> <td colspan="2">公司名称</td>
</tr> </tr>
@ -47,7 +47,7 @@
</tr> </tr>
<tr> <tr>
<td colspan="6" style="padding: 0"> <td colspan="6" style="padding: 0">
<table> <table class="print_table">
<tr> <tr>
<td class="title" style="width: 5%">序号</td> <td class="title" style="width: 5%">序号</td>
<td class="title" style="width: 15%">姓名</td> <td class="title" style="width: 15%">姓名</td>
@ -87,7 +87,7 @@
</tr> </tr>
<tr> <tr>
<td colspan="6" style="padding: 0"> <td colspan="6" style="padding: 0">
<table> <table class="print_table">
<tr> <tr>
<td class="title" style="width: 5%">序号</td> <td class="title" style="width: 5%">序号</td>
<td class="title" style="width: 15%">姓名</td> <td class="title" style="width: 15%">姓名</td>
@ -254,16 +254,4 @@ const fnClose = () => {
align-items: center; align-items: center;
justify-content: space-between; 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>

View File

@ -6,37 +6,32 @@
@close="fnClose" @close="fnClose"
> >
<div class="tr mb"> <div class="tr mb">
<el-button type="primary" @click="data.dialogFormEdit = true" <el-button type="primary" @click="fnAdd"> </el-button>
>新增</el-button
>
<el-button type="primary" @click="fnExport"></el-button> <el-button type="primary" @click="fnExport"></el-button>
</div> </div>
<el-divider content-position="left"> <el-divider content-position="left">
生产经营单位安全培训教材会审表 生产经营单位安全培训教材会审表
</el-divider> </el-divider>
<table> <table class="print_table">
<tr> <tr>
<th>教材名称</th> <th>教材名称</th>
<td colspan="3">{{ props.curriculumname }}</td> <td colspan="3">{{ props.curriculumname }}</td>
<th>出版书号</th> <th>出版书号</th>
<td> <td>
<el-input v-model="data.form.BOOK_NUM" style="width: 100%"></el-input> <el-input v-model="data.form.BOOK_NUM" />
</td> </td>
</tr> </tr>
<tr> <tr>
<th>编写单位</th> <th>编写单位</th>
<td colspan="3"> <td colspan="3">
<el-input <el-input v-model="data.form.CORP_NAME" />
v-model="data.form.CORP_NAME"
style="width: 100%"
></el-input>
</td> </td>
<th>编写时间</th> <th>编写时间</th>
<td> <td>
<el-date-picker <el-date-picker
v-model="data.form.CREATTIME" v-model="data.form.CREATTIME"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
style="width: 100%" format="YYYY-MM-DD"
/> />
</td> </td>
</tr> </tr>
@ -47,24 +42,18 @@
<tr> <tr>
<th width="12%">会审地点</th> <th width="12%">会审地点</th>
<td width="15%"> <td width="15%">
<el-input <el-input v-model="data.form.enterpriseName" />
v-model="data.form.CORP_NAME"
style="width: 100%"
></el-input>
</td> </td>
<th width="12%">主持人</th> <th width="12%">主持人</th>
<td width="25%"> <td width="25%">
<el-input <el-input v-model="data.form.REVIEW_PERSON" />
v-model="data.form.REVIEW_PERSON"
style="width: 100%"
></el-input>
</td> </td>
<th width="12%">会审时间</th> <th width="12%">会审时间</th>
<td width="24%"> <td width="24%">
<el-date-picker <el-date-picker
v-model="data.form.REVIEW_TIME" v-model="data.form.REVIEW_TIME"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
style="width: 100%" format="YYYY-MM-DD"
/> />
</td> </td>
</tr> </tr>
@ -73,199 +62,90 @@
</tr> </tr>
<tr> <tr>
<td colspan="6" style="padding: 0"> <td colspan="6" style="padding: 0">
<table> <layout-table
<tr> :data="data.reviewRecordList"
<td class="tc">审查人员</td> :show-pagination="false"
<td class="tc">工作部门</td> @row-dblclick="fnEdit"
<td class="tc">职务/职称</td> >
<td class="tc">审查意见</td> <el-table-column label="审查人员" prop="NAME" />
<td class="tc">本人签字</td> <el-table-column label="工作部门" prop="DEPARTMENT_NAME" />
</tr> <el-table-column label="职务/职称" prop="DUTIES" />
<template v-for="(item, index) in data.reviewRecord" :key="index"> <el-table-column label="审查意见" prop="CHECK_OPINION" />
<tr style="height: 40px"> <el-table-column label="本人签字">
<td class="tc">{{ item.NAME }}</td> <template #default="{ row }">
<td class="tc">{{ item.DEPARTMENT_NAME }}</td> <viewer v-if="row.SIGN_PICTURE">
<td class="tc">{{ item.DUTIES }}</td>
<td class="tc">{{ item.CHECK_OPINION }}</td>
<td class="tc">
<viewer v-if="item.SIGN_PICTURE">
<img <img
:src="FILE_URL + item.SIGN_PICTURE" :src="FILE_URL + row.SIGN_PICTURE"
alt="" alt=""
width="100" width="100"
height="25" height="25"
/> />
</viewer> </viewer>
</td>
</tr>
</template> </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> </td>
</tr> </tr>
<tr style="height: 200px"> <tr style="height: 200px">
<th>会审意见</th> <th>会审意见</th>
<td colspan="5">此教材符合相关文件要求同意使用</td> <td colspan="5">
<el-input v-model="data.form.REVIEW_OPINIONS" />
</td>
</tr> </tr>
</table> </table>
<div class="footer"> <div class="footer">
<div> <div>
单位盖章 单位盖章
<img :src="data.info.OFFICIAL_SEAL_PATH" /> <img :src="data.form.OFFICIAL_SEAL_PATH" />
</div> </div>
<div>档案编号{{ data.info.CODE }}</div> <div>档案编号{{ data.form.CODE }}</div>
<div> <div>
归档日期{{ dayjs(data.info.END_TIME).format("YYYY年MM月DD日") }} 归档日期{{ dayjs(data.form.END_TIME).format("YYYY年MM月DD日") }}
</div> </div>
</div> </div>
<template #footer> <template #footer>
<el-button @click="fnClose"></el-button> <el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"></el-button>
</template> </template>
</el-dialog> </el-dialog>
<el-dialog <add-review
v-if="data.dialogFormEdit" v-model:visible="data.addDialog.visible"
v-model:visible="data.dialogFormEdit" v-model:form="data.addDialog.form"
:append-to-body="true" :type="data.addDialog.type"
:title="data.dialogType === 'edit' ? '修改' : '新增'" :outer-layer-form="data.form"
width="600px" @get-data="fnGetReviewRecordList"
>
<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="会审人员"
/> />
</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> </template>
<script setup> <script setup>
import dayjs from "dayjs"; import dayjs from "dayjs";
import { reactive, watchEffect } from "vue"; import { nextTick, reactive, watchEffect } from "vue";
import { ElMessageBox } from "element-plus"; import { ElMessage, ElMessageBox } from "element-plus";
import { import {
getClassGoEdit, getClassGoEdit,
getReviewGoEdit, getReviewGoEdit,
getReviewRecord, getReviewRecordList,
downloadHs, downloadHs,
getReviewAdd,
getReviewEdit,
setReviewRecordDelete,
setReviewRecordView,
} from "@/request/training_archive_management.js"; } 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 FILE_URL = import.meta.env.VITE_FILE_URL;
const props = defineProps({ const props = defineProps({
type: { type: {
@ -284,14 +164,6 @@ const props = defineProps({
type: String, type: String,
required: true, required: true,
}, },
corpName: {
type: String,
required: true,
},
postName: {
type: String,
required: true,
},
industryAllName: { industryAllName: {
type: String, type: String,
required: true, required: true,
@ -306,29 +178,28 @@ const props = defineProps({
}, },
}); });
const data = reactive({ const data = reactive({
info: {}, form: {
form: {},
reviewInfo: {},
reviewRecord: {},
ARCHIVES_REVIEW_ID: "", ARCHIVES_REVIEW_ID: "",
dialogFormEdit: false, CODE: "",
signPictureVisible: false, END_TIME: "",
dialogType: "add", BOOK_NUM: "",
review: { CORP_NAME: "",
reviewform: {}, CREATTIME: "",
rules: { enterpriseName: "",
REVIEW_USER: [ REVIEW_PERSON: "",
{ required: true, message: "审查人员不能为空", trigger: "blur" }, REVIEW_TIME: "",
], REVIEW_OPINIONS: "此教材符合相关文件要求,同意使用。",
DEPARTMENT: [ },
{ required: true, message: "工作部门不能为空", trigger: "blur" }, reviewRecordList: [],
], addDialog: {
DUTIES: [ visible: false,
{ required: true, message: "职务/职称不能为空", trigger: "blur" }, type: "",
], form: {
CHECK_OPINION: [ REVIEW_USER: "",
{ required: true, message: "审查意见不能为空", trigger: "blur" }, DEPARTMENT_NAME: "",
], DUTIES: "",
CHECK_OPINION: "",
SIGN_PICTURE: "",
}, },
}, },
}); });
@ -338,38 +209,74 @@ const fnGetData = async () => {
TYPE: props.type, TYPE: props.type,
CLASS_ID: props.clazzId, CLASS_ID: props.clazzId,
}); });
data.info = resData.pd; data.form = resData.pd;
// //
const reviewInfo = await getReviewGoEdit({ const reviewInfo = await getReviewGoEdit({
CLASS_ID: props.clazzId, CLASS_ID: props.clazzId,
CURRICULUM_ID: props.curriculumId, CURRICULUM_ID: props.curriculumId,
}); });
data.reviewInfo = reviewInfo.pd;
if (reviewInfo.pd) { if (reviewInfo.pd) {
data.reviewInfo = reviewInfo.pd;
if (reviewInfo.pd.ARCHIVES_REVIEW_ID) { if (reviewInfo.pd.ARCHIVES_REVIEW_ID) {
data.ARCHIVES_REVIEW_ID = reviewInfo.pd.ARCHIVES_REVIEW_ID; data.form.ARCHIVES_REVIEW_ID = reviewInfo.pd.ARCHIVES_REVIEW_ID;
if (reviewInfo.pd.CORP_NAME) { if (reviewInfo.pd.REVIEW_TIME)
data.info.CORP_NAME = reviewInfo.pd.CORP_NAME; data.form.REVIEW_TIME = reviewInfo.pd.REVIEW_TIME;
} if (reviewInfo.pd.REVIEW_PERSON)
if (reviewInfo.pd.CREATTIME) { data.form.REVIEW_PERSON = reviewInfo.pd.REVIEW_PERSON;
data.info.CREATTIME = reviewInfo.pd.CREATTIME; if (reviewInfo.pd.BOOK_NUM) data.form.BOOK_NUM = reviewInfo.pd.BOOK_NUM;
} data.form.REVIEW_OPINIONS =
if (reviewInfo.pd.END_TIME) { reviewInfo.pd.REVIEW_OPINIONS || "此教材符合相关文件要求,同意使用。";
data.info.END_TIME = reviewInfo.pd.END_TIME; 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 fnGetReviewRecordList = async () => {
const reviewRecord = await getReviewRecord({ const reviewRecord = await getReviewRecordList({
ARCHIVES_REVIEW_ID: data.ARCHIVES_REVIEW_ID, ARCHIVES_REVIEW_ID: data.form.ARCHIVES_REVIEW_ID,
}); });
data.reviewRecord = reviewRecord.pd; data.reviewRecordList = reviewRecord.varList;
}
}; };
watchEffect(() => { watchEffect(() => {
if (props.type === 100) fnGetData(); 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 () => { const fnExport = async () => {
await ElMessageBox.confirm("确定要导出吗?", { type: "warning" }); await ElMessageBox.confirm("确定要导出吗?", { type: "warning" });
await downloadHs({ await downloadHs({
@ -384,28 +291,23 @@ const fnExport = async () => {
const fnClose = () => { const fnClose = () => {
emits("update:type", 0); 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> </script>
<style scoped lang="scss"> <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 { .footer {
margin-top: 40px; margin-top: 40px;
display: flex; display: flex;
@ -424,4 +326,11 @@ table {
} }
} }
} }
:deep(.el-input) {
.el-input__wrapper {
box-shadow: none;
background-color: transparent;
}
}
</style> </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>
<div> <div>
<h2 class="tc">安全培训教育记录及签字表</h2> <h2 class="tc">安全培训教育记录及签字表</h2>
<table class="mt"> <table class="mt print_table">
<tr> <tr>
<td class="tc">日期</td> <td class="tc">日期</td>
<td class="tc"> <td class="tc">
@ -38,7 +38,7 @@
</tr> </tr>
<tr> <tr>
<td colspan="6" style="padding: 0"> <td colspan="6" style="padding: 0">
<table> <table class="print_table">
<tr> <tr>
<td class="tc">姓名</td> <td class="tc">姓名</td>
<td class="tc">部门</td> <td class="tc">部门</td>
@ -127,22 +127,10 @@ const props = defineProps({
type: String, type: String,
required: true, required: true,
}, },
postId: {
type: String,
required: true,
},
corpInfoId: { corpInfoId: {
type: String, type: String,
required: true, required: true,
}, },
corpName: {
type: String,
required: true,
},
postName: {
type: String,
required: true,
},
}); });
const FILE_URL = import.meta.env.VITE_FILE_URL; const FILE_URL = import.meta.env.VITE_FILE_URL;
const data = reactive({ const data = reactive({
@ -180,16 +168,4 @@ const fnClose = () => {
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss"></style>
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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -15,7 +15,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col v-show="!data.searchFromCollapse" :span="8"> <el-col :span="8">
<el-form-item label="开始时间" prop="STARTTIME"> <el-form-item label="开始时间" prop="STARTTIME">
<el-date-picker <el-date-picker
v-model="searchForm.STARTTIME" v-model="searchForm.STARTTIME"
@ -25,7 +25,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col v-show="!data.searchFromCollapse" :span="8"> <el-col :span="8">
<el-form-item label="结束时间" prop="ENDTIME"> <el-form-item label="结束时间" prop="ENDTIME">
<el-date-picker <el-date-picker
v-model="searchForm.ENDTIME" v-model="searchForm.ENDTIME"
@ -35,14 +35,14 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col v-show="!data.searchFromCollapse" :span="8"> <el-col :span="8">
<el-form-item label="状态" prop="STATUS"> <el-form-item label="状态" prop="STATUS">
<el-select v-model="searchForm.STATUS"> <el-select v-model="searchForm.STATUS">
<el-option <el-option
v-for="item in data.statusList" v-for="item in statusList"
:key="item.value" :key="item.ID"
:label="item.label" :label="item.NAME"
:value="item.value" :value="item.ID"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -53,19 +53,7 @@
<el-button native-type="reset" @click="fnResetPagination"> <el-button native-type="reset" @click="fnResetPagination">
重置 重置
</el-button> </el-button>
<el-button type="primary" @click="derivedRecord"></el-button> <el-button type="primary" @click="fnExport"> </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-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -78,7 +66,7 @@
:data="list" :data="list"
@get-data="fnGetData" @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"> <el-table-column label="序号" width="60">
<template #default="{ $index }"> <template #default="{ $index }">
{{ serialNumber(pagination, $index) }} {{ serialNumber(pagination, $index) }}
@ -87,12 +75,9 @@
<el-table-column prop="NAME" label="班级名称" /> <el-table-column prop="NAME" label="班级名称" />
<el-table-column prop="DEPARTMENT_NAME" label="部门" /> <el-table-column prop="DEPARTMENT_NAME" label="部门" />
<el-table-column prop="POST_NAME" label="工种" /> <el-table-column prop="POST_NAME" label="工种" />
<el-table-column prop="STATE" label="班级状态"> <el-table-column label="班级状态">
<template #default="{ row }"> <template #default="{ row }">
<template v-if="row.STATE === '1'"> </template> {{ translationStatus(row.STATE, statusList) }}
<template v-if="row.STATE === '4'"> </template>
<template v-if="row.STATE === '5'"> </template>
<template v-if="row.STATE === '6'"> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="TRAININGTYPE_NAME" label="培训类型" /> <el-table-column prop="TRAININGTYPE_NAME" label="培训类型" />
@ -100,22 +85,14 @@
<el-table-column prop="TRAINLEVEL_NAME" label="培训级别" /> <el-table-column prop="TRAINLEVEL_NAME" label="培训级别" />
<el-table-column prop="SUM_CLASSHOUR" 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 prop="COMPLETE_CLASSHOUR" label="考试结果"> <el-table-column label="考试结果">
<template #default="{ row }"> <template #default="{ row }">
<template v-if="row.STAGEEXAMSTATE === '0'"> </template> {{ translationStatus(row.STAGEEXAMSTATE, examStatus) }}
<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>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="START_TIME" label="开始时间" /> <el-table-column prop="START_TIME" label="开始时间" />
<el-table-column prop="END_TIME" label="结束时间" /> <el-table-column prop="END_TIME" label="结束时间" />
<el-table-column label="操作"> <el-table-column label="操作" width="170">
<template #default="{ row }"> <template #default="{ row }">
<el-button <el-button
type="primary" type="primary"
@ -126,12 +103,14 @@
人员登记表 人员登记表
</el-button> </el-button>
<el-button <el-button
v-if=" :disabled="
!(
row.STATE === '6' || row.STATE === '6' ||
(row.EXAMINATION === 1 && (row.EXAMINATION === 1 &&
parseInt(row.STAGEEXAMSCORE) > -1 && parseInt(row.STAGEEXAMSCORE) > -1 &&
parseInt(row.STUDYSTATE) !== 5) || parseInt(row.STUDYSTATE) !== 5) ||
(row.EXAMINATION === 0 && parseInt(row.STUDYSTATE) > 1) (row.EXAMINATION === 0 && parseInt(row.STUDYSTATE) > 1)
)
" "
type="primary" type="primary"
text text
@ -161,9 +140,6 @@
> >
档案详情 档案详情
</el-button> </el-button>
<el-button v-else disabled type="primary" text link>
档案详情
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</layout-table> </layout-table>
@ -173,36 +149,51 @@
:user-id="data.personnelRegistrationFormDialog.USER_ID" :user-id="data.personnelRegistrationFormDialog.USER_ID"
/> />
</layout-card> </layout-card>
<class-file-export
v-model:visible="classFileExportDialogVisible"
@submit="fnSubmit"
/>
</div> </div>
</template> </template>
<script setup> <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 useListData from "@/assets/js/useListData.js";
import { reactive, ref } from "vue"; import { reactive, ref } from "vue";
import PersonnelRegistrationForm from "./components/personnel_registration_form.vue"; import PersonnelRegistrationForm from "./components/personnel_registration_form.vue";
import { getUserClassesList } from "@/request/training_archive_management.js"; import {
import { useRoute } from "vue-router"; classDetailsDownload,
import router from "@/router/index.js"; 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 route = useRoute();
const tableRef = ref(null); const router = useRouter();
const { USER_ID } = route.query; 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({ const data = reactive({
searchFromCollapse: true,
statusList: [
{ value: 1, label: "未申请" },
{ value: 4, label: "待开班" },
{ value: 5, label: "培训中" },
{ value: 6, label: "培训结束" },
],
personnelRegistrationFormDialog: { personnelRegistrationFormDialog: {
visible: false, visible: false,
STUDENT_ID: "", STUDENT_ID: "",
USER_ID: "", USER_ID: "",
}, },
}); });
const { list, pagination, searchForm, fnGetData, fnResetPagination } = const classFileExportDialogVisible = ref(false);
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getUserClassesList, { useListData(getUserClassesList, {
otherParams: { USER_ID }, otherParams: { USER_ID },
}); });
@ -211,6 +202,51 @@ const fnPersonnelRegistrationForm = (STUDENT_ID, USER_ID) => {
data.personnelRegistrationFormDialog.USER_ID = USER_ID; data.personnelRegistrationFormDialog.USER_ID = USER_ID;
data.personnelRegistrationFormDialog.visible = true; 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> </script>
<style scoped></style> <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> </div>
<h2 class="tc">生产经营单位新入职从业人员登记表</h2> <h2 class="tc">生产经营单位新入职从业人员登记表</h2>
<div class="flex mt mb"> <div class="flex mt mb">
<span>生产经营单位名称(盖章):{{ data.info.CORP_NAME }}</span> <span>生产经营单位名称(盖章):{{ info.CORP_NAME }}</span>
<span>档案编号:{{ data.info.FILE_NUMBER }}</span> <span>档案编号:{{ info.FILE_NUMBER }}</span>
</div> </div>
<table> <table class="print_table">
<tr> <tr>
<td width="20%">姓名</td> <td width="20%">姓名</td>
<td width="20%"> <td width="20%">
{{ data.info.NAME }} {{ info.NAME }}
</td> </td>
<td width="20%">性别</td> <td width="20%">性别</td>
<td width="20%"> <td width="20%">
{{ data.info.SEX_NAME }} {{ info.SEX_NAME }}
</td> </td>
<td rowspan="4" width="120" class="tc" style="padding: 0"> <td rowspan="4" width="120" class="tc" style="padding: 0">
<div> <div>
<img <img
v-if="data.info.PORTRAIT" v-if="info.PORTRAIT"
:src="FILE_URL + data.info.PORTRAIT" alt=""
:src="FILE_URL + info.PORTRAIT"
width="100" width="100"
height="100" height="100"
/> />
@ -32,89 +33,89 @@
<tr> <tr>
<td>民族</td> <td>民族</td>
<td> <td>
{{ data.info.NATION_NAME }} {{ info.NATION_NAME }}
</td> </td>
<td>政治面貌</td> <td>政治面貌</td>
<td> <td>
{{ data.info.POLITICAL_OUTLOOK_NAME }} {{ info.POLITICAL_OUTLOOK_NAME }}
</td> </td>
</tr> </tr>
<tr> <tr>
<td>文化程度</td> <td>文化程度</td>
<td> <td>
{{ data.info.DEGREE_OF_EDUCATION_NAME }} {{ info.DEGREE_OF_EDUCATION_NAME }}
</td> </td>
<td>健康状况</td> <td>健康状况</td>
<td> <td>
{{ data.info.HEALTH }} {{ info.HEALTH }}
</td> </td>
</tr> </tr>
<tr> <tr>
<td>出生年月</td> <td>出生年月</td>
<td> <td>
{{ data.info.DATE_OF_BIRTH }} {{ info.DATE_OF_BIRTH }}
</td> </td>
<td>身份证号</td> <td>身份证号</td>
<td> <td>
{{ data.info.USER_ID_CARD }} {{ info.USER_ID_CARD }}
</td> </td>
</tr> </tr>
<tr> <tr>
<td>毕业院校及专业</td> <td>毕业院校及专业</td>
<td> <td>
{{ data.info.UNIVERSITY }} {{ info.UNIVERSITY }}
</td> </td>
<td>职务/职称</td> <td>职务/职称</td>
<td colspan="2"> <td colspan="2">
{{ data.info.DUTIES_NAME }} {{ info.DUTIES_NAME }}
</td> </td>
</tr> </tr>
<tr> <tr>
<td>户籍所在地</td> <td>户籍所在地</td>
<td> <td>
{{ data.info.RESIDENCE }} {{ info.RESIDENCE }}
</td> </td>
<td>参加工作时间</td> <td>参加工作时间</td>
<td colspan="2"> <td colspan="2">
{{ data.info.WORKING_DATE }} {{ info.WORKING_DATE }}
</td> </td>
</tr> </tr>
<tr> <tr>
<td>进入本单位时间</td> <td>进入本单位时间</td>
<td> <td>
{{ data.info.ENTRY_DATE }} {{ info.ENTRY_DATE }}
</td> </td>
<td>入职部门</td> <td>入职部门</td>
<td colspan="2"> <td colspan="2">
{{ data.info.DEPARTMENT_NAME }} {{ info.DEPARTMENT_NAME }}
</td> </td>
</tr> </tr>
<tr> <tr>
<td>岗位名称</td> <td>岗位名称</td>
<td> <td>
{{ data.info.POST_NAME }} {{ info.POST_NAME }}
</td> </td>
<td>之前从事本岗位时间</td> <td>之前从事本岗位时间</td>
<td colspan="2"> <td colspan="2">
{{ data.info.PREVIOUS_POST_DATE }} {{ info.PREVIOUS_POST_DATE }}
</td> </td>
</tr> </tr>
<tr style="height: 100px"> <tr style="height: 100px">
<td>主要工作经历</td> <td>主要工作经历</td>
<td colspan="4"> <td colspan="4">
{{ data.info.WORK_EXPERIENCE }} {{ info.WORK_EXPERIENCE }}
</td> </td>
</tr> </tr>
<tr style="height: 100px"> <tr style="height: 100px">
<td>入职前接受安全培训和考核以及取得安全培训有关的岗位证书等情况</td> <td>入职前接受安全培训和考核以及取得安全培训有关的岗位证书等情况</td>
<td colspan="4"> <td colspan="4">
{{ data.info.CERTIFICATES }} {{ info.CERTIFICATES }}
</td> </td>
</tr> </tr>
<tr style="height: 100px"> <tr style="height: 100px">
<td>入职前受过何种有关安全生产的处罚以及是否受到刑事处罚</td> <td>入职前受过何种有关安全生产的处罚以及是否受到刑事处罚</td>
<td colspan="4"> <td colspan="4">
{{ data.info.PUNISH }} {{ info.PUNISH }}
</td> </td>
</tr> </tr>
<tr> <tr>
@ -126,16 +127,20 @@
<div class="flex mt" style="padding: 0"> <div class="flex mt" style="padding: 0">
<p>入职人(签字并按指纹)</p> <p>入职人(签字并按指纹)</p>
<p> <p>
承诺日期<span>&emsp;&emsp;</span><span>&emsp;</span 承诺日期
><span>&emsp;</span> <span>&emsp;&emsp;</span>
<span>&emsp;</span>
<span>&emsp;</span>
</p> </p>
</div> </div>
<p class="mt">生产经营单位核查意见</p> <p class="mt">生产经营单位核查意见</p>
<div class="flex mt" style="padding: 0"> <div class="flex mt" style="padding: 0">
<p>核查人员(签字)</p> <p>核查人员(签字)</p>
<p> <p>
核查日期<span>&emsp;&emsp;</span><span>&emsp;</span 核查日期
><span>&emsp;</span> <span>&emsp;&emsp;</span>
<span>&emsp;</span>
<span>&emsp;</span>
</p> </p>
</div> </div>
</td> </td>
@ -150,7 +155,7 @@
<script setup> <script setup>
import { useVModel } from "@vueuse/core"; import { useVModel } from "@vueuse/core";
import { ElMessageBox } from "element-plus"; import { ElMessageBox } from "element-plus";
import { reactive, watchEffect } from "vue"; import { ref, watchEffect } from "vue";
import { import {
getArchivesStudentEdit, getArchivesStudentEdit,
downloadRegisterform, downloadRegisterform,
@ -173,15 +178,13 @@ const props = defineProps({
const emits = defineEmits(["update:visible"]); const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits); const visible = useVModel(props, "visible", emits);
const FILE_URL = import.meta.env.VITE_FILE_URL; const FILE_URL = import.meta.env.VITE_FILE_URL;
const data = reactive({ const info = ref({});
info: {},
});
const fnGetData = async () => { const fnGetData = async () => {
const response = await getArchivesStudentEdit({ const response = await getArchivesStudentEdit({
STUDENT_ID: props.studentId, STUDENT_ID: props.studentId,
USER_ID: props.userId, USER_ID: props.userId,
}); });
data.info = response.pd; info.value = response.pd;
}; };
watchEffect(() => { watchEffect(() => {
if (visible.value) fnGetData(); if (visible.value) fnGetData();
@ -190,7 +193,7 @@ const fnExport = async () => {
await ElMessageBox.confirm("确定要导出吗?", { type: "warning" }); await ElMessageBox.confirm("确定要导出吗?", { type: "warning" });
await downloadRegisterform({ await downloadRegisterform({
STUDENT_ID: props.studentId, STUDENT_ID: props.studentId,
STUDENT_NAME: data.info.NAME, STUDENT_NAME: info.value.NAME,
USER_ID: props.userId, USER_ID: props.userId,
}); });
await ElMessageBox.confirm("导出后请前往档案下载中下载该档案!", "温馨提示", { await ElMessageBox.confirm("导出后请前往档案下载中下载该档案!", "温馨提示", {
@ -205,15 +208,4 @@ const fnExport = async () => {
align-items: center; align-items: center;
justify-content: space-between; 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> </style>

View File

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

View File

@ -35,17 +35,16 @@
{{ serialNumber(pagination, $index) }} {{ serialNumber(pagination, $index) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="INQUIRYCONTENT" label="问询内容" width="330" />
<el-table-column <el-table-column
prop="INQUIRYCONTENT" prop="INQUIRYCONCLUSION"
label="问询内容" label="问询结果"
width="330" width="230"
/> />
<el-table-column prop="INQUIRYCONCLUSION" label="问询结果" width="230" />
<el-table-column prop="CREATTIME" label="创建时间" width="130" /> <el-table-column prop="CREATTIME" label="创建时间" width="130" />
<el-table-column prop="OPERATTIME" label="修改时间" width="130" /> <el-table-column prop="OPERATTIME" label="修改时间" width="130" />
<el-table-column label="操作"> <el-table-column label="操作">
<template #default="{ row }"> <template #default="{ row }">
<el-button <el-button
type="primary" type="primary"
text text
@ -65,10 +64,7 @@
</template> </template>
</el-table-column> </el-table-column>
<template #button> <template #button>
<el-button <el-button type="primary" @click="fnAddOrEdit('', 'add')">
type="primary"
@click="fnAddOrEdit('', 'add')"
>
新增 新增
</el-button> </el-button>
</template> </template>
@ -89,7 +85,8 @@ import useListData from "@/assets/js/useListData.js";
import { nextTick, reactive } from "vue"; import { nextTick, reactive } from "vue";
import Add from "./components/add.vue"; import Add from "./components/add.vue";
import { import {
getSafetyDrivingCommitmentList, getSafetyDrivingCommitmentView, getSafetyDrivingCommitmentList,
getSafetyDrivingCommitmentView,
setDrivingCommitmentDelete, setDrivingCommitmentDelete,
} from "@/request/traffic_driving_commitment.js"; } from "@/request/traffic_driving_commitment.js";
import { ElMessage, ElMessageBox } from "element-plus"; import { ElMessage, ElMessageBox } from "element-plus";
@ -111,7 +108,9 @@ const fnAddOrEdit = async (DRIVINGCOMMITMENT_ID, type) => {
await nextTick(); await nextTick();
data.addOrEditDialog.type = type; data.addOrEditDialog.type = type;
if (type === "edit") { if (type === "edit") {
const resData = await getSafetyDrivingCommitmentView({ DRIVINGCOMMITMENT_ID }); const resData = await getSafetyDrivingCommitmentView({
DRIVINGCOMMITMENT_ID,
});
data.addOrEditDialog.form = resData.pd; data.addOrEditDialog.form = resData.pd;
} }
}; };

View File

@ -57,7 +57,11 @@
<tr v-for="(item, index) in data.info.varList" :key="index"> <tr v-for="(item, index) in data.info.varList" :key="index">
<td :rowspan="1" class="title">{{ item.CHECKTYPE_NAME }}检查</td> <td :rowspan="1" class="title">{{ item.CHECKTYPE_NAME }}检查</td>
<td colspan="8"> <td colspan="8">
<table class="archive_print_table" v-for="(item1,index1) in item.pd1Children" :key="index1"> <table
v-for="(item1, index1) in item.pd1Children"
:key="index1"
class="archive_print_table"
>
<tr> <tr>
<td :rowspan="10" class="title">检查记录</td> <td :rowspan="10" class="title">检查记录</td>
</tr> </tr>
@ -99,17 +103,12 @@
class="mr-10 mt-10" class="mr-10 mt-10"
/> />
</template> </template>
</div> </div>
</td> </td>
</tr> </tr>
</table> </table>
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
</layout-card> </layout-card>
@ -131,7 +130,6 @@ const fnGetData = async () => {
const resData = await getSafetyDrivingLogView({ WAYBILLREGISTRATION_ID }); const resData = await getSafetyDrivingLogView({ WAYBILLREGISTRATION_ID });
data.info = resData.pd; data.info = resData.pd;
data.commitmentList = resData.commitmentList; data.commitmentList = resData.commitmentList;
}; };
fnGetData(); fnGetData();
</script> </script>

View File

@ -28,7 +28,6 @@
<!-- </el-form-item>--> <!-- </el-form-item>-->
<!-- </el-col>--> <!-- </el-col>-->
<el-col :span="12"> <el-col :span="12">
<el-form-item label-width="10px"> <el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button> <el-button type="primary" native-type="submit">搜索</el-button>
@ -74,7 +73,7 @@
router.push({ router.push({
path: '/driving_inspections/driving_log/drivingLog_info', path: '/driving_inspections/driving_log/drivingLog_info',
query: { query: {
WAYBILLREGISTRATION_ID: row.WAYBILLREGISTRATION_ID WAYBILLREGISTRATION_ID: row.WAYBILLREGISTRATION_ID,
}, },
}) })
" "
@ -113,7 +112,6 @@ const fnResetPaginationTransfer = () => {
WORK_START_DATE: searchForm.value.WORK_START_DATE, WORK_START_DATE: searchForm.value.WORK_START_DATE,
}); });
}; };
</script> </script>
<style scoped></style> <style scoped></style>

View File

@ -42,18 +42,13 @@
{{ serialNumber(pagination, $index) }} {{ serialNumber(pagination, $index) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column prop="CHECKITEMNAME" label="检查项名称" width="330" />
prop="CHECKITEMNAME"
label="检查项名称"
width="330"
/>
<el-table-column prop="CHECKTYPE_NAME" label="检查项类型" width="230" /> <el-table-column prop="CHECKTYPE_NAME" label="检查项类型" width="230" />
<el-table-column prop="REMARKS" label="检查项说明" width="330" /> <el-table-column prop="REMARKS" label="检查项说明" width="330" />
<el-table-column prop="CREATTIME" label="创建时间" width="230" /> <el-table-column prop="CREATTIME" label="创建时间" width="230" />
<el-table-column prop="OPERATTIME" label="修改时间" width="230" /> <el-table-column prop="OPERATTIME" label="修改时间" width="230" />
<el-table-column label="操作"> <el-table-column label="操作">
<template #default="{ row }"> <template #default="{ row }">
<el-button <el-button
type="primary" type="primary"
text text
@ -73,10 +68,7 @@
</template> </template>
</el-table-column> </el-table-column>
<template #button> <template #button>
<el-button <el-button type="primary" @click="fnAddOrEdit('', 'add')">
type="primary"
@click="fnAddOrEdit('', 'add')"
>
新增 新增
</el-button> </el-button>
</template> </template>
@ -97,7 +89,8 @@ import useListData from "@/assets/js/useListData.js";
import { nextTick, reactive } from "vue"; import { nextTick, reactive } from "vue";
import Add from "./components/add.vue"; import Add from "./components/add.vue";
import { import {
getSafetyDrivingTypeList, getSafetyDrivingTypeView, getSafetyDrivingTypeList,
getSafetyDrivingTypeView,
setDrivingTypeDelete, setDrivingTypeDelete,
} from "@/request/traffic_driving_type.js"; } from "@/request/traffic_driving_type.js";
import { ElMessage, ElMessageBox } from "element-plus"; import { ElMessage, ElMessageBox } from "element-plus";
@ -136,7 +129,6 @@ const deleteItem = async (value) => {
fnGetData(); fnGetData();
}; };
const drivingTypeList = await layoutFnGetDrivingType(); const drivingTypeList = await layoutFnGetDrivingType();
</script> </script>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -449,7 +449,6 @@
<script setup> <script setup>
import { reactive, ref } from "vue"; import { reactive, ref } from "vue";
import LayoutTerritory from "@/components/territory/index.vue"; import LayoutTerritory from "@/components/territory/index.vue";
import LayoutRegulatoryType from "@/components/regulatory_type/index.vue";
import LayoutIndustry from "@/components/industry/index.vue"; import LayoutIndustry from "@/components/industry/index.vue";
import LayoutEconomicType from "@/components/economic_type/index.vue"; import LayoutEconomicType from "@/components/economic_type/index.vue";
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue"; import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";

View File

@ -113,10 +113,7 @@
</template> </template>
<script setup> <script setup>
import { import { getUserListAll } from "@/request/safety_production_related.js";
layoutFnGetMEETINGTYPEClassification,
getUserListAll,
} from "@/request/safety_production_related.js";
import { addSafetyMeetingView } from "@/request/traffic_safety_meeting.js"; import { addSafetyMeetingView } from "@/request/traffic_safety_meeting.js";
import { reactive, ref } from "vue"; import { reactive, ref } from "vue";
import LayoutUpload from "@/components/upload/index.vue"; import LayoutUpload from "@/components/upload/index.vue";
@ -162,12 +159,6 @@ const fnGetUnitsList = async () => {
data.unitsList = resData.varList; data.unitsList = resData.varList;
}; };
fnGetUnitsList(); fnGetUnitsList();
const relatedClassificationTempList =
await layoutFnGetMEETINGTYPEClassification();
const relatedClassificationList = [];
JSON.parse(relatedClassificationTempList.value.zTreeNodes).forEach((e) => {
relatedClassificationList.push({ name: e.id, BIANMA: e.name });
});
const data = reactive({ const data = reactive({
form: { form: {

View File

@ -61,7 +61,7 @@ import {
getClassManagementSelectStudentAdd, getClassManagementSelectStudentAdd,
getClassManagementSelectStudentList, getClassManagementSelectStudentList,
} from "@/request/training_process_management.js"; } 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 { ref, watch } from "vue";
import { debounce } from "throttle-debounce"; import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js"; 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 = () => { const fnClose = () => {
formRef.value.resetFields(); formRef.value.resetFields();
tableRef.value.clearSelection(); tableRef.value.clearSelection();

View File

@ -100,7 +100,7 @@
> >
上一步 上一步
</el-button> </el-button>
<el-button type="primary"> 完成 </el-button> <el-button type="primary" @click="fnComplete"> </el-button>
</div> </div>
<involved-in-training <involved-in-training
:id="data.involvedInTrainingDialog.CLASSCURRICULUM_ID" :id="data.involvedInTrainingDialog.CLASSCURRICULUM_ID"
@ -122,6 +122,7 @@ import useListData from "@/assets/js/useListData.js";
import { import {
getClassManagementCurriculumList, getClassManagementCurriculumList,
getClassManagementInvolvedInTrainingList, getClassManagementInvolvedInTrainingList,
setClassFinish,
setClassManagementCurriculumDelete, setClassManagementCurriculumDelete,
} from "@/request/training_process_management.js"; } from "@/request/training_process_management.js";
import { debounce } from "throttle-debounce"; import { debounce } from "throttle-debounce";
@ -170,6 +171,22 @@ const fnDelete = debounce(
}, },
{ atBegin: true } { atBegin: true }
); );
const fnComplete = debounce(
1000,
async () => {
await ElMessageBox.confirm(
"完成之后将开班,只能新增学员,不能再进行其它更改,确认继续吗?",
{
type: "warning",
}
);
await setClassFinish({ CLASS_ID, EXAMINATION });
ElMessage.success("班级添加完成");
fnResetPagination();
router.back();
},
{ atBegin: true }
);
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

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

View File

@ -277,17 +277,13 @@ const fnGetLearningRecords = async () => {
"/student/exportStudentInfo?CLASS_ID=" + "/student/exportStudentInfo?CLASS_ID=" +
CLASS_ID + CLASS_ID +
"&START_TIME=" + "&START_TIME=" +
searchForm.value.TIME?.[0] + searchForm.value.TIME?.[0] ||
"&END_TIME=" + "" + "&END_TIME=" + searchForm.value.TIME?.[1] ||
searchForm.value.TIME?.[1] + "" + "&DEPARTMENT_ID=" + searchForm.value.DEPARTMENT_ID ||
"&DEPARTMENT_ID=" + "" + "&POST_ID=" + searchForm.value.POST_ID ||
searchForm.value.DEPARTMENT_ID + "" + "&STUDYSTATE=" + searchForm.value.STUDYSTATE ||
"&POST_ID=" + "" + "&STAGEEXAMSTATE=" + searchForm.value.STAGEEXAMSTATE ||
searchForm.value.POST_ID + "";
"&STUDYSTATE=" +
searchForm.value.STUDYSTATE +
"&STAGEEXAMSTATE=" +
searchForm.value.STAGEEXAMSTATE;
ElMessage.success("导出成功"); ElMessage.success("导出成功");
}; };
const fnDelete = debounce( const fnDelete = debounce(

View File

@ -96,7 +96,7 @@ const data = reactive({
OPTIONALDANYUANTICOUNT: 0, OPTIONALDANYUANTICOUNT: 0,
OPTIONALDUOXUANTICOUNT: 0, OPTIONALDUOXUANTICOUNT: 0,
OPTIONALPANDUITICOUNT: 0, OPTIONALPANDUITICOUNT: 0,
COURSEWAREIDS: "", COURSEWAREIDS: [],
EXAMNAME: "", EXAMNAME: "",
EXAMSCORE: 0, EXAMSCORE: 0,
PASSSCORE: 0, PASSSCORE: 0,

View File

@ -141,12 +141,7 @@
prop="TRAININGTYPE_NAME" prop="TRAININGTYPE_NAME"
width="150" width="150"
/> />
<el-table-column label="行业类型" prop="POSTTYPE_NAME" width="150" /> <el-table-column label="岗位类型" prop="POSTTYPE_NAME" width="150" />
<el-table-column
label="岗位类型"
prop="INDUSTRY_ALL_NAME"
width="200"
/>
<el-table-column label="培训等级" prop="TRAINLEVEL_NAME" width="150" /> <el-table-column label="培训等级" prop="TRAINLEVEL_NAME" width="150" />
<el-table-column label="负责人" prop="PRINCIPAL" width="150" /> <el-table-column label="负责人" prop="PRINCIPAL" width="150" />
<el-table-column label="培训开始时间" prop="START_TIME" width="150" /> <el-table-column label="培训开始时间" prop="START_TIME" width="150" />

View File

@ -25,7 +25,7 @@
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<div v-if="type !== 'add'"> <div>
<el-divider content-position="left">试卷题目信息</el-divider> <el-divider content-position="left">试卷题目信息</el-divider>
<el-form <el-form
:model="searchForm" :model="searchForm"