教育培训-档案管理

pull/1/head
duhang 2024-01-09 19:51:01 +08:00
parent faeb08ff24
commit d200851bc9
27 changed files with 4201 additions and 436 deletions

View File

@ -1,6 +1,6 @@
<template>
<el-dialog title="文档" v-model="visible">
<div v-if="visible">
<el-dialog title="文档" :model-value="visible && model === 'dialog'">
<div v-if="visible && model === 'dialog'">
<vue-pdf
ref="pdfRef"
v-for="page in numOfPages"
@ -10,6 +10,15 @@
/>
</div>
</el-dialog>
<div v-if="model === 'normal'">
<vue-pdf
ref="pdfRef"
v-for="page in numOfPages"
:key="page"
:src="VITE_FILE_URL + src"
:page="page"
/>
</div>
</template>
<script setup>
@ -32,6 +41,11 @@ const props = defineProps({
default: false,
required: true,
},
model: {
type: String,
required: false,
default: "dialog", // : dialog=, normal=
},
});
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);

View File

@ -1,4 +1,4 @@
import { post } from "@/request/axios.js";
import { post, upload } from "@/request/axios.js";
export const getUserList = (params) => post("/user/list", params); // 档案管理-一人一档-获取人员列表
@ -9,7 +9,7 @@ export const getTaskListByUser = (params) =>
export const getStudyTaskInfo = (params) => post("/studytask/goEdit", params); // 档案管理-一人一档-档案详情-获取任务信息
export const getCurriculums = (params) =>
export const getAllCourseware = (params) =>
post("/studytask/getAllCourseware", params); // 档案管理-一人一档-档案详情-获取课程列表
export const getArchivesPaper = (params) =>
@ -22,3 +22,113 @@ export const getUserExamScoreByStudyTaskId = (params) =>
post("/stageexam/getUserExamScoreByStudystaskId", params); // 档案管理-一人一档-档案详情-???
export const getTaskList = (params) => post("/studytask/list", params); // 档案管理-一期一档-获取任务列表
export const getArchivesFileList = (params) =>
post("/archivesfiles/list", params); // 档案管理-获取文件列表
export const deleteArchivesFile = (params) =>
post("/archivesfiles/delete", params); // 档案管理-删除文件
export const uploadArchivesFile = (params) =>
upload("/archivesfiles/add", params); // 档案管理-上传文件
export const getArchivesCapitalList = (params) =>
post("/archivescapital/list", params); // 档案管理-一企一档-获取年度培训资金提取和使用情况管理台账列表
export const deleteArchivesCapital = (params) =>
post("/archivescapital/delete", params); // 档案管理-一企一档-删除年度培训资金提取和使用情况管理台账
export const getArchivesCapital = (params) =>
post("/archivescapital/goEdit", params); // 档案管理-一企一档-获取年度培训资金提取和使用情况管理台账
export const addArchivesCapital = (params) =>
post("/archivescapital/add", params); // 档案管理-一企一档-新增年度培训资金提取和使用情况管理台账
export const editArchivesCapital = (params) =>
post("/archivescapital/edit", params); // 档案管理-一企一档-修改年度培训资金提取和使用情况管理台账
export const getArchivesEdumanagerList = (params) =>
post("/archivesedumanager/list", params); // 档案管理-一企一档-获取年度安全培训教育管理台账列表
export const deleteArchivesEdumanager = (params) =>
post("/archivesedumanager/delete", params); // 档案管理-一企一档-删除年度安全培训教育管理台账
export const getArchivesEdumanager = (params) =>
post("/archivesedumanager/goEdit", params); // 档案管理-一企一档-获取年度安全培训教育管理台账
export const addArchivesEdumanager = (params) =>
post("/archivesedumanager/add", params); // 档案管理-一企一档-新增年度安全培训教育管理台账
export const editArchivesEdumanager = (params) =>
post("/archivesedumanager/edit", params); // 档案管理-一企一档-修改年度安全培训教育管理台账
export const getArchivesEduplanList = (params) =>
post("/archiveseduplan/list", params); // 档案管理-一企一档-获取年度安全培训教育计划列表
export const deleteArchivesEduplan = (params) =>
post("/archiveseduplan/delete", params); // 档案管理-一企一档-删除年度安全培训教育计划
export const getArchivesEduplan = (params) =>
post("/archiveseduplan/goEdit", params); // 档案管理-一企一档-获取年度安全培训教育计划
export const addArchivesEduplan = (params) =>
post("/archiveseduplan/add", params); // 档案管理-一企一档-新增年度安全培训教育计划
export const editArchivesEduplan = (params) =>
post("/archiveseduplan/edit", params); // 档案管理-一企一档-修改年度安全培训教育计划
export const getArchivesTeacherList = (params) =>
post("/archivesteacher/list", params); // 档案管理-一企一档-获取年度本单位师资管理台账列表
export const deleteArchivesTeacher = (params) =>
post("/archivesteacher/delete", params); // 档案管理-一企一档-删除年度本单位师资管理台账
export const getArchivesTeacher = (params) =>
post("/archivesteacher/goEdit", params); // 档案管理-一企一档-获取年度本单位师资管理台账
export const addArchivesTeacher = (params) =>
post("/archivesteacher/add", params); // 档案管理-一企一档-新增年度本单位师资管理台账
export const editArchivesTeacher = (params) =>
post("/archivesteacher/edit", params); // 档案管理-一企一档-修改年度本单位师资管理台账
export const getArchivesPostmanList = (params) =>
post("/archivespostman/list", params); // 档案管理-一企一档-获取年度三岗人员管理台账列表
export const deleteArchivesPostman = (params) =>
post("/archivespostman/delete", params); // 档案管理-一企一档-删除年度三岗人员管理台账
export const getArchivesPostman = (params) =>
post("/archivespostman/goEdit", params); // 档案管理-一企一档-获取年度三岗人员管理台账
export const addArchivesPostman = (params) =>
post("/archivespostman/add", params); // 档案管理-一企一档-新增年度三岗人员管理台账
export const editArchivesPostman = (params) =>
post("/archivespostman/edit", params); // 档案管理-一企一档-修改年度三岗人员管理台账
export const getArchivesTrainingScheduleList = (params) =>
post("/trainingschedule/list", params); // 档案管理-一期一档-获取培训计划列表
export const deleteArchivesTrainingSchedule = (params) =>
post("/trainingschedule/delete", params); // 档案管理-一期一档-删除培训计划
export const getArchivesTrainingSchedule = (params) =>
post("/trainingschedule/goEdit", params); // 档案管理-一期一档-获取培训计划
export const addArchivesTrainingSchedule = (params) =>
post("/trainingschedule/add", params); // 档案管理-一期一档-新增培训计划
export const editArchivesTrainingSchedule = (params) =>
post("/trainingschedule/edit", params); // 档案管理-一期一档-修改培训计划
export const getAllCoursewareByHandout = (params) =>
post("/studytask/getAllCoursewareByHandout", params); // 档案管理-一期一档-安全培训教材或课程讲义-获取课件
export const getStudentByTaskId = (params) =>
post("/stagestudentrelation/listAllByStudyTaskId", params); // 档案管理-一期一档-安全培训教育记录及签字表-获取学生
export const getPaperByTaskId = (params) => post("/studytask/getPaper", params); // 档案管理-一期一档-培训考核试卷-获取试卷
export const getAllCurriculum = (params) =>
post("/studytask/getAllcurriculum", params); // 档案管理-一期一档-本期综合考评报告-获取课程

View File

@ -3,19 +3,40 @@
<layout-table :data="catalogueList" :show-pagination="false">
<el-table-column show-overflow-tooltip prop="NAME" label="目录" />
<el-table-column label="操作">
<template v-slot>
<el-button type="primary" text link> 编辑 </el-button>
<!-- todo -->
<template v-slot="{ row }">
<el-button type="primary" text link @click="fnGoEdit(row)">
编辑
</el-button>
</template>
</el-table-column>
</layout-table>
<edit v-model:visible="data.editVisible" />
<component
v-if="data.current"
:is="data.current.component"
v-model:current="data.current"
:title="data.current.NAME"
:year="year"
:type="data.current.TYPE"
:study-task-id="studyTaskId"
/>
</div>
</template>
<script setup>
import LayoutTable from "@/components/table/index.vue";
import edit from "./components/edit.vue";
import { computed, reactive } from "vue";
import ArchivesPdf from "./components/archives_pdf.vue";
import Capital from "./components/capital.vue";
import Edumanager from "./components/edumanager.vue";
import Eduplan from "./components/eduplan.vue";
import Postman from "./components/postman.vue";
import Teacher from "./components/teacher.vue";
import ArchivesZip from "../semester/components/archives_zip.vue";
import Handout from "../semester/components/handout.vue";
import Paper from "../semester/components/paper.vue";
import Report from "../semester/components/report.vue";
import Result from "../semester/components/result.vue";
import Sign from "../semester/components/sign.vue";
import TrainingSchedule from "../semester/components/training_schedule.vue";
import { computed, markRaw, reactive } from "vue";
import { useVModels } from "@vueuse/core";
import { useRoute } from "vue-router";
@ -26,46 +47,68 @@ const props = defineProps({
default: "", // : corp=, semester=
},
year: {
// , corp=
type: String,
required: false,
default: "",
},
});
const { source } = useVModels(props);
const { source, year } = useVModels(props);
const route = useRoute();
const { source: sourceByRoute } = route.query;
const { source: sourceFromRoute, studyTaskId } = route.query;
const data = reactive({
current: undefined,
editVisible: false,
semesterList: [
{ NAME: "安全培训教材会审表", TYPE: 5 },
{ NAME: "培训日程安排通知/也可称为培训计划", TYPE: 101 },
{ NAME: "安全培训教材或课程讲义", TYPE: 106 },
{ NAME: "安全培训教育记录及签字表", TYPE: 102 },
{ NAME: "培训影像资料", TYPE: 7 },
{ NAME: "培训考核试卷", TYPE: 103 },
{ NAME: "学员考核成绩统计表", TYPE: 104 },
{ NAME: "本期综合考评报告", TYPE: 105 },
{ NAME: "与培训机构签订的服务合同或者协议复印件", TYPE: 6 },
{ NAME: "安全培训教材会审表", TYPE: 5, component: markRaw(ArchivesPdf) },
{
NAME: "培训日程安排通知/也可称为培训计划",
TYPE: 101,
component: markRaw(TrainingSchedule),
},
{ NAME: "安全培训教材或课程讲义", TYPE: 106, component: markRaw(Handout) },
{ NAME: "安全培训教育记录及签字表", TYPE: 102, component: markRaw(Sign) },
{ NAME: "培训影像资料", TYPE: 7, component: markRaw(ArchivesZip) },
{ NAME: "培训考核试卷", TYPE: 103, component: markRaw(Paper) },
{ NAME: "学员考核成绩统计表", TYPE: 104, component: markRaw(Result) },
{ NAME: "本期综合考评报告", TYPE: 105, component: markRaw(Report) },
{
NAME: "与培训机构签订的服务合同或者协议复印件",
TYPE: 6,
component: markRaw(ArchivesZip),
},
],
corpList: [
{ NAME: "安全培训教育制度", TYPE: 1 },
{ NAME: "关于任命安全教育主管部门和人员的文件", TYPE: 2 },
{ NAME: "三岗人员管理台账", TYPE: 101 },
{ NAME: "培训需求调查表", TYPE: 3 },
{ NAME: "本单位师资管理台账", TYPE: 102 },
{ NAME: "年度安全培训教育计划", TYPE: 103 },
{ NAME: "年度安全培训教育管理台账", TYPE: 104 },
{ NAME: "年度培训资金提取和使用情况管理台账", TYPE: 105 },
{ NAME: "培训条件证明材料", TYPE: 4 },
{ NAME: "安全培训教育制度", TYPE: 1, component: markRaw(ArchivesPdf) },
{
NAME: "关于任命安全教育主管部门和人员的文件",
TYPE: 2,
component: markRaw(ArchivesPdf),
},
{ NAME: "三岗人员管理台账", TYPE: 101, component: markRaw(Postman) },
{ NAME: "培训需求调查表", TYPE: 3, component: markRaw(ArchivesPdf) },
{ NAME: "本单位师资管理台账", TYPE: 102, component: markRaw(Teacher) },
{ NAME: "年度安全培训教育计划", TYPE: 103, component: markRaw(Eduplan) },
{
NAME: "年度安全培训教育管理台账",
TYPE: 104,
component: markRaw(Edumanager),
},
{
NAME: "年度培训资金提取和使用情况管理台账",
TYPE: 105,
component: markRaw(Capital),
},
{ NAME: "培训条件证明材料", TYPE: 4, component: markRaw(ArchivesPdf) },
],
});
const catalogueList = computed(() => {
let sourceTemp = "";
let sourceTemp;
if (!source.value || source.value.length < 1) {
sourceTemp = sourceByRoute;
sourceTemp = sourceFromRoute;
} else {
sourceTemp = source.value;
}
@ -76,4 +119,13 @@ const catalogueList = computed(() => {
}
return [];
});
const fnGoEdit = (row) => {
data.current = undefined;
if (row) {
data.current = row;
}
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,172 @@
<template>
<div>
<el-dialog
v-if="type === 1 || type === 2 || type === 3 || type === 4 || type === 5"
:model-value="
type === 1 || type === 2 || type === 3 || type === 4 || type === 5
"
:title="title"
:before-close="fnClose"
>
<el-space wrap>
<layout-upload
v-model:file-list="data.form.file"
accept=".pdf"
:show-file-list="false"
auto-upload
:http-request="fnUploadArchivesFile"
:limit="1"
>
<template #tip>只能上传pdf文件</template>
</layout-upload>
</el-space>
<br /><br />
<el-row>
<el-col :span="8">
<template v-for="(row, index) in data.fileList" :key="index">
<el-row>
<el-col :span="16">
<el-button type="primary" text link @click="fnShowPDF(row)">
{{ row.FILE_NAME }}
</el-button>
</el-col>
<el-col :span="8">
<el-button
type="primary"
text
link
@click="fnDeleteArchivesFile(row)"
>
删除
</el-button>
</el-col>
</el-row>
</template>
</el-col>
<el-col :span="16">
<pdf
v-if="data.currentFile && data.currentFile.length > 0"
model="normal"
:visible="data.currentFile && data.currentFile.length > 0"
:src="data.currentFile"
/>
</el-col>
</el-row>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import {
uploadArchivesFile,
getArchivesFileList,
deleteArchivesFile,
} from "@/request/archives.js";
import LayoutUpload from "@/components/upload/index.vue";
import Pdf from "@/components/pdf/index.vue";
import { reactive } from "vue";
import { useVModels } from "@vueuse/core";
import { ElMessageBox } from "element-plus";
const props = defineProps({
title: {
type: String,
required: false,
default: "",
},
year: {
type: String,
required: false,
default: "",
},
type: {
type: Number,
required: true,
},
studyTaskId: {
type: String,
required: false,
default: "",
},
});
const { title, year, type, studyTaskId } = useVModels(props);
const data = reactive({
form: {
file: [],
},
fileList: [],
currentFile: "",
});
const emits = defineEmits(["update:visible"]);
const fnClear = () => {
data.currentFile = "";
data.form.file = [];
data.fileList = [];
};
const fnUploadArchivesFile = async (item) => {
const formData = new FormData();
formData.append("FFILE", item.file);
formData.append("TYPE", type.value);
if (year.value && year.value.length > 0) {
formData.append("YEAR", year.value);
}
if (studyTaskId.value && studyTaskId.value.length > 0) {
formData.append("STUDYTASK_ID", studyTaskId.value);
}
await uploadArchivesFile(formData);
await fnGetArchivesFileList();
};
const fnGetArchivesFileList = async () => {
fnClear();
const params = {
TYPE: type.value,
};
if (studyTaskId.value && studyTaskId.value.length > 0) {
params.STUDYTASK_ID = studyTaskId.value;
}
if (year.value && year.value.length > 0) {
params.YEAR = year.value;
}
const respData = await getArchivesFileList(params);
if (respData && respData.varList) {
data.fileList = respData.varList;
data.form.file = respData.varList;
}
};
await fnGetArchivesFileList();
const fnDeleteArchivesFile = async (row) => {
if (row) {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
const respData = await deleteArchivesFile({
ARCHIVESFILES_ID: row.ARCHIVESFILES_ID,
FILE_PATH: row.FILE_PATH,
});
if (respData && respData.result === "success") {
await fnGetArchivesFileList();
}
}
};
const fnShowPDF = (row) => {
if (row) {
data.currentFile = row.FILE_PATH;
}
};
const fnClose = () => {
emits("update:current", undefined);
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,187 @@
<template>
<div>
<el-dialog
v-if="type === 105"
:model-value="type === 105"
:title="title"
:before-close="fnClose"
>
<el-space wrap>
<el-button type="primary" @click="fnAddArchivesCapital"></el-button>
<el-button type="danger" @click="fnDeleteArchivesCapital">
删除
</el-button>
<el-button type="primary" v-print="'#printContent'"></el-button>
</el-space>
<div id="printContent">
<div style="text-align: center">
<el-text size="large">
{{ year }}年度培训资金提取和使用情况管理台账
</el-text>
</div>
<div>
<el-text size="small">单位名称:{{ CORP_NAME }}</el-text>
</div>
<layout-table
:data="data.capitalList"
:show-pagination="false"
highlight-current-row
@row-click="fnCurrentChange"
@row-dblclick="fnAddOrUpdate"
>
<el-table-column label="序号" width="40">
<template v-slot="{ $index }">
{{ serialNumber({ currentPage: 1, pageSize: 99999 }, $index) }}
</template>
</el-table-column>
<el-table-column prop="DATE" label="日期" width="85" />
<el-table-column label="费用项目">
<el-table-column prop="AMOUNT" label="提取金额" width="80" />
<el-table-column
prop="MATERIAL_COST"
label="培训教材教具费"
width="80"
/>
<el-table-column prop="TEACHER_COST" label="师资费" width="80" />
<el-table-column prop="PAPER_COST" label="试卷印制费" width="80" />
<el-table-column
prop="OUTSIDE_COST"
label="外出培训费"
width="80"
/>
<el-table-column
prop="EQUIPMENT_COST"
label="教学设备、课桌椅等购置维护费"
width="80"
/>
<el-table-column prop="TRAIN_COST" label="培训活动费" width="80" />
<el-table-column
prop="ENTRUST_COST"
label="委托活动费"
width="80"
/>
<el-table-column
prop="OTHER_COST"
label="其他与培训有关的直接支出"
width="80"
/>
</el-table-column>
<el-table-column prop="BALANCE" label="余额" width="75" />
</layout-table>
<el-row>
<el-col :span="6">制表人:</el-col>
<el-col :span="6">编制日期:</el-col>
<el-col :span="6">审核人:</el-col>
<el-col :span="6">审核日期:</el-col>
</el-row>
<br />
<div>
<el-text size="small">
填表说明:1.将实际发生的费用金额记录在费用项目栏内2.培训提取比例按职工工资1.5%可按季或月提取
</el-text>
</div>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
<capital-form
v-if="data.formVisible"
v-model:visible="data.formVisible"
:ARCHIVESCAPITAL_ID="data.current.ARCHIVESCAPITAL_ID"
:type="data.current.ARCHIVESCAPITAL_ID ? 'edit' : 'add'"
:year="year"
@get-data="fnGetArchivesCapitalList"
/>
</div>
</template>
<script setup>
import {
deleteArchivesCapital,
getArchivesCapitalList,
} from "@/request/archives.js";
import { reactive } from "vue";
import { useVModels } from "@vueuse/core";
import { useUserStore } from "@/pinia/user.js";
import LayoutTable from "@/components/table/index.vue";
import { serialNumber } from "@/assets/js/utils.js";
import CapitalForm from "./capital_form.vue";
import { ElMessageBox } from "element-plus";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
const props = defineProps({
title: {
type: String,
required: false,
default: "",
},
year: {
type: String,
required: false,
default: "",
},
type: {
type: Number,
required: true,
},
studyTaskId: {
type: String,
required: false,
default: "",
},
});
const { title, year, type } = useVModels(props);
const data = reactive({
capitalList: [],
current: undefined,
formVisible: false,
});
const emits = defineEmits(["update:visible"]);
const fnClose = () => {
emits("update:current", undefined);
};
const fnCurrentChange = (row) => {
data.current = row;
};
const fnAddArchivesCapital = () => {
data.capitalList.push({});
};
const fnDeleteArchivesCapital = async () => {
if (data.current) {
if (data.current.ARCHIVESCAPITAL_ID) {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await deleteArchivesCapital({
ARCHIVESCAPITAL_ID: data.current.ARCHIVESCAPITAL_ID,
});
}
data.current = undefined;
await fnGetArchivesCapitalList();
}
};
const fnGetArchivesCapitalList = async () => {
const respData = await getArchivesCapitalList({ YEAR: year.value });
if (respData && respData.varList) {
data.capitalList = respData.varList;
}
};
await fnGetArchivesCapitalList();
const fnAddOrUpdate = (row) => {
data.current = row;
if (row) {
data.formVisible = true;
}
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,284 @@
<template>
<div>
<el-dialog
v-if="visible"
:model-value="visible"
:title="type === 'add' ? '新增' : '修改'"
:before-close="fnClose"
>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="150px"
>
<el-form-item label="日期" prop="DATE">
<el-date-picker
v-model="data.form.DATE"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
clearable
placeholder="选择日期"
/>
</el-form-item>
<el-form-item label="提取金额" prop="AMOUNT">
<el-input
v-model="data.form.AMOUNT"
maxlength="11"
placeholder="这里输入提取金额"
/>
</el-form-item>
<el-form-item label="培训教材教具费" prop="MATERIAL_COST">
<el-input
v-model="data.form.MATERIAL_COST"
maxlength="11"
placeholder="这里输入培训教材教具费"
/>
</el-form-item>
<el-form-item label="师资费" prop="TEACHER_COST">
<el-input
v-model="data.form.TEACHER_COST"
maxlength="11"
placeholder="这里输入师资费"
/>
</el-form-item>
<el-form-item label="试卷印制费" prop="PAPER_COST">
<el-input
v-model="data.form.PAPER_COST"
maxlength="11"
placeholder="这里输入试卷印制费"
/>
</el-form-item>
<el-form-item label="外出培训费" prop="OUTSIDE_COST">
<el-input
v-model="data.form.OUTSIDE_COST"
maxlength="11"
placeholder="这里输入外出培训费"
/>
</el-form-item>
<el-form-item
label="教学设备、课桌椅等购置维护费"
prop="EQUIPMENT_COST"
>
<el-input
v-model="data.form.EQUIPMENT_COST"
maxlength="11"
placeholder="这里输入教学设备、课桌椅等购置维护费"
/>
</el-form-item>
<el-form-item label="培训活动费" prop="TRAIN_COST">
<el-input
v-model="data.form.TRAIN_COST"
maxlength="11"
placeholder="这里输入培训活动费"
/>
</el-form-item>
<el-form-item label="委托培训费" prop="ENTRUST_COST">
<el-input
v-model="data.form.ENTRUST_COST"
maxlength="11"
placeholder="这里输入委托培训费"
/>
</el-form-item>
<el-form-item label="其他与培训有关的直接支出" prop="OTHER_COST">
<el-input
v-model="data.form.OTHER_COST"
maxlength="11"
placeholder="这里输入其他与培训有关的直接支出"
/>
</el-form-item>
<el-form-item label="余额" prop="BALANCE">
<el-input
v-model="data.form.BALANCE"
maxlength="11"
placeholder="这里输入余额"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"> </el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { useVModels } from "@vueuse/core";
import {
getArchivesCapital,
addArchivesCapital,
editArchivesCapital,
} from "@/request/archives.js";
const props = defineProps({
visible: {
type: Boolean,
required: true,
},
year: {
type: String,
required: true,
},
type: {
type: String,
required: true,
},
ARCHIVESCAPITAL_ID: {
type: String,
required: false,
default: "",
},
});
const { visible, year, type, ARCHIVESCAPITAL_ID } = useVModels(props);
const emits = defineEmits(["update:visible", "getData"]);
const data = reactive({
form: {
ARCHIVESCAPITAL_ID: undefined,
AMOUNT: undefined,
BALANCE: undefined,
DATE: undefined,
ENTRUST_COST: undefined,
EQUIPMENT_COST: undefined,
MATERIAL_COST: undefined,
OTHER_COST: undefined,
OUTSIDE_COST: undefined,
PAPER_COST: undefined,
TEACHER_COST: undefined,
TRAIN_COST: undefined,
YEAR: year.value,
},
});
const rules = {
AMOUNT: [
{
type: "number",
message: "请输入有效数字",
trigger: "blur",
transform: (value) => Number(value),
},
],
BALANCE: [
{
type: "number",
message: "请输入有效数字",
trigger: "blur",
transform: (value) => Number(value),
},
],
ENTRUST_COST: [
{
type: "number",
message: "请输入有效数字",
trigger: "blur",
transform: (value) => Number(value),
},
],
EQUIPMENT_COST: [
{
type: "number",
message: "请输入有效数字",
trigger: "blur",
transform: (value) => Number(value),
},
],
MATERIAL_COST: [
{
type: "number",
message: "请输入有效数字",
trigger: "blur",
transform: (value) => Number(value),
},
],
OTHER_COST: [
{
type: "number",
message: "请输入有效数字",
trigger: "blur",
transform: (value) => Number(value),
},
],
OUTSIDE_COST: [
{
type: "number",
message: "请输入有效数字",
trigger: "blur",
transform: (value) => Number(value),
},
],
PAPER_COST: [
{
type: "number",
message: "请输入有效数字",
trigger: "blur",
transform: (value) => Number(value),
},
],
TEACHER_COST: [
{
type: "number",
message: "请输入有效数字",
trigger: "blur",
transform: (value) => Number(value),
},
],
TRAIN_COST: [
{
type: "number",
message: "请输入有效数字",
trigger: "blur",
transform: (value) => Number(value),
},
],
};
const formRef = ref(null);
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const params = Object.assign({}, data.form);
let respData;
if (type.value === "add") {
respData = await addArchivesCapital(params);
} else if (type.value === "edit") {
respData = await editArchivesCapital(params);
}
if (respData && respData.result === "success") {
emits("getData");
fnClose();
}
},
{ atBegin: true }
);
const fnClose = () => {
emits("update:visible", false);
};
const fnGetArchivesCapital = async () => {
if (
ARCHIVESCAPITAL_ID &&
ARCHIVESCAPITAL_ID.value &&
ARCHIVESCAPITAL_ID.value.length > 0
) {
const respData = await getArchivesCapital({
ARCHIVESCAPITAL_ID: ARCHIVESCAPITAL_ID.value,
});
if (respData && respData.pd) {
data.form = respData.pd;
}
}
};
await fnGetArchivesCapital();
</script>
<style scoped lang="scss"></style>

View File

@ -1,3 +0,0 @@
<template>
<div>todo</div>
</template>

View File

@ -0,0 +1,166 @@
<template>
<div>
<el-dialog
v-if="type === 104"
:model-value="type === 104"
:title="title"
:before-close="fnClose"
>
<el-space wrap>
<el-button type="primary" @click="fnAdd"></el-button>
<el-button type="danger" @click="fnDelete"> </el-button>
<el-button type="primary" v-print="'#printContent'"></el-button>
</el-space>
<div id="printContent">
<div style="text-align: center">
<el-text size="large">{{ year }}年度安全培训教育管理台账</el-text>
</div>
<div>
<el-text size="small">单位名称:{{ CORP_NAME }}</el-text>
</div>
<layout-table
:data="data.dataList"
:show-pagination="false"
highlight-current-row
@row-click="fnCurrentChange"
@row-dblclick="fnAddOrUpdate"
>
<el-table-column label="序号" width="45">
<template v-slot="{ $index }">
{{ serialNumber({ currentPage: 1, pageSize: 99999 }, $index) }}
</template>
</el-table-column>
<el-table-column prop="TRAINING_DATE" label="培训时间" />
<el-table-column prop="TRAINING_OBJECT" label="培训对象" />
<el-table-column prop="TRAINING_TYPE" label="培训类型" />
<el-table-column
show-overflow-tooltip
prop="TRAINING_CONTENT"
label="培训内容"
/>
<el-table-column prop="PERSON_NUMBER" label="参加人数" />
<el-table-column prop="CLASS_HOURS" label="培训学时" />
<el-table-column
show-overflow-tooltip
prop="TRAINING_PLACE"
label="培训地点"
/>
<el-table-column prop="TRAINING_TEACHER" label="培训教师" />
<el-table-column prop="ASSESSMENT_METHOD" label="考核方式" />
<el-table-column
show-overflow-tooltip
prop="ASSESSMENT"
label="汇总考核情况"
/>
</layout-table>
<el-row>
<el-col :span="6">填表人:</el-col>
<el-col :span="6"></el-col>
<el-col :span="6"></el-col>
<el-col :span="6">填表日期:</el-col>
</el-row>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
<edumanager-form
v-if="data.formVisible"
v-model:visible="data.formVisible"
:ARCHIVESEDUMANAGER_ID="data.current.ARCHIVESEDUMANAGER_ID"
:type="data.current.ARCHIVESEDUMANAGER_ID ? 'edit' : 'add'"
:year="year"
@get-data="fnGetList"
/>
</div>
</template>
<script setup>
import {
deleteArchivesEdumanager,
getArchivesEdumanagerList,
} from "@/request/archives.js";
import { reactive } from "vue";
import { useVModels } from "@vueuse/core";
import { useUserStore } from "@/pinia/user.js";
import LayoutTable from "@/components/table/index.vue";
import { serialNumber } from "@/assets/js/utils.js";
import EdumanagerForm from "./edumanager_form.vue";
import { ElMessageBox } from "element-plus";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
const props = defineProps({
title: {
type: String,
required: false,
default: "",
},
year: {
type: String,
required: false,
default: "",
},
type: {
type: Number,
required: true,
},
studyTaskId: {
type: String,
required: false,
default: "",
},
});
const { title, year, type } = useVModels(props);
const data = reactive({
dataList: [],
current: undefined,
formVisible: false,
});
const emits = defineEmits(["update:visible"]);
const fnClose = () => {
emits("update:current", undefined);
};
const fnCurrentChange = (row) => {
data.current = row;
};
const fnAdd = () => {
data.dataList.push({});
};
const fnDelete = async () => {
if (data.current) {
if (data.current.ARCHIVESEDUMANAGER_ID) {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await deleteArchivesEdumanager({
ARCHIVESEDUMANAGER_ID: data.current.ARCHIVESEDUMANAGER_ID,
});
}
data.current = undefined;
await fnGetList();
}
};
const fnGetList = async () => {
const respData = await getArchivesEdumanagerList({ YEAR: year.value });
if (respData && respData.varList) {
data.dataList = respData.varList;
}
};
await fnGetList();
const fnAddOrUpdate = (row) => {
data.current = row;
if (row) {
data.formVisible = true;
}
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,209 @@
<template>
<div>
<el-dialog
v-if="visible"
:model-value="visible"
:title="type === 'add' ? '新增' : '修改'"
:before-close="fnClose"
>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="150px"
>
<el-form-item label="培训时间" prop="DATE">
<el-date-picker
v-model="data.form.TRAINING_DATE"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
clearable
placeholder="选择日期"
/>
</el-form-item>
<el-form-item label="培训对象" prop="TRAINING_OBJECT">
<el-input
v-model="data.form.TRAINING_OBJECT"
maxlength="255"
placeholder="这里输入培训对象"
/>
</el-form-item>
<el-form-item label="培训类型" prop="TRAINING_TYPE">
<el-input
v-model="data.form.TRAINING_TYPE"
maxlength="255"
placeholder="这里输入培训类型"
/>
</el-form-item>
<el-form-item label="培训内容" prop="TRAINING_CONTENT">
<el-input
v-model="data.form.TRAINING_CONTENT"
maxlength="255"
placeholder="这里输入培训内容"
/>
</el-form-item>
<el-form-item label="参加人数" prop="PERSON_NUMBER">
<el-input
v-model="data.form.PERSON_NUMBER"
maxlength="11"
placeholder="这里输入参加人数"
/>
</el-form-item>
<el-form-item label="培训学时" prop="CLASS_HOURS">
<el-input
v-model="data.form.CLASS_HOURS"
maxlength="11"
placeholder="这里输入培训学时"
/>
</el-form-item>
<el-form-item label="培训地点" prop="TRAINING_PLACE">
<el-input
v-model="data.form.TRAINING_PLACE"
maxlength="255"
placeholder="这里输入培训地点"
/>
</el-form-item>
<el-form-item label="培训教师" prop="TRAINING_TEACHER">
<el-input
v-model="data.form.TRAINING_TEACHER"
maxlength="255"
placeholder="这里输入培训教师"
/>
</el-form-item>
<el-form-item label="考核方式" prop="ASSESSMENT_METHOD">
<el-input
v-model="data.form.ASSESSMENT_METHOD"
maxlength="255"
placeholder="这里输入考核方式"
/>
</el-form-item>
<el-form-item label="汇总考核情况" prop="ASSESSMENT">
<el-input
v-model="data.form.ASSESSMENT"
maxlength="255"
placeholder="这里输入汇总考核情况"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"> </el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { useVModels } from "@vueuse/core";
import {
getArchivesEdumanager,
addArchivesEdumanager,
editArchivesEdumanager,
} from "@/request/archives.js";
const props = defineProps({
visible: {
type: Boolean,
required: true,
},
year: {
type: String,
required: true,
},
type: {
type: String,
required: true,
},
ARCHIVESEDUMANAGER_ID: {
type: String,
required: false,
default: "",
},
});
const { visible, year, type, ARCHIVESEDUMANAGER_ID } = useVModels(props);
const emits = defineEmits(["update:visible", "getData"]);
const data = reactive({
form: {
ARCHIVESEDUMANAGER_ID: undefined,
TRAINING_DATE: undefined,
TRAINING_OBJECT: undefined,
TRAINING_TYPE: undefined,
TRAINING_CONTENT: undefined,
PERSON_NUMBER: undefined,
CLASS_HOURS: undefined,
TRAINING_PLACE: undefined,
TRAINING_TEACHER: undefined,
ASSESSMENT_METHOD: undefined,
ASSESSMENT: undefined,
YEAR: year.value,
},
});
const rules = {
PERSON_NUMBER: [
{
type: "number",
message: "请输入有效数字",
trigger: "blur",
transform: (value) => Number(value),
},
],
CLASS_HOURS: [
{
type: "number",
message: "请输入有效数字",
trigger: "blur",
transform: (value) => Number(value),
},
],
};
const formRef = ref(null);
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const params = Object.assign({}, data.form);
let respData;
if (type.value === "add") {
respData = await addArchivesEdumanager(params);
} else if (type.value === "edit") {
respData = await editArchivesEdumanager(params);
}
if (respData && respData.result === "success") {
emits("getData");
fnClose();
}
},
{ atBegin: true }
);
const fnClose = () => {
emits("update:visible", false);
};
const fnGetData = async () => {
if (
ARCHIVESEDUMANAGER_ID &&
ARCHIVESEDUMANAGER_ID.value &&
ARCHIVESEDUMANAGER_ID.value.length > 0
) {
const respData = await getArchivesEdumanager({
ARCHIVESEDUMANAGER_ID: ARCHIVESEDUMANAGER_ID.value,
});
if (respData && respData.pd) {
data.form = respData.pd;
}
}
};
await fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,167 @@
<template>
<div>
<el-dialog
v-if="type === 103"
:model-value="type === 103"
:title="title"
:before-close="fnClose"
>
<el-space wrap>
<el-button type="primary" @click="fnAdd"></el-button>
<el-button type="danger" @click="fnDelete"> </el-button>
<el-button type="primary" v-print="'#printContent'"></el-button>
</el-space>
<div id="printContent">
<div style="text-align: center">
<el-text size="large">{{ year }}年度安全培训教育计划</el-text>
</div>
<div>
<el-text size="small">单位名称:{{ CORP_NAME }}</el-text>
</div>
<layout-table
:data="data.dataList"
:show-pagination="false"
highlight-current-row
@row-click="fnCurrentChange"
@row-dblclick="fnAddOrUpdate"
>
<el-table-column label="序号" width="45">
<template v-slot="{ $index }">
{{ serialNumber({ currentPage: 1, pageSize: 99999 }, $index) }}
</template>
</el-table-column>
<el-table-column prop="START_DATE" label="开始时间" width="85" />
<el-table-column prop="END_DATE" label="结束时间" width="85" />
<el-table-column prop="TRAINING_OBJECT" label="培训对象" />
<el-table-column
show-overflow-tooltip
prop="TRAINING_MATERIALS"
label="培训教材"
/>
<el-table-column prop="TRAINING_METHODS" label="培训方式" />
<el-table-column prop="ASSESSMENT_METHOD" label="考核方式" />
<el-table-column prop="CLASS_HOURS" label="学时" width="70" />
<el-table-column show-overflow-tooltip prop="PLACE" label="地点" />
<el-table-column prop="TRAINING_TEACHERS" label="培训教师" />
<el-table-column
show-overflow-tooltip
prop="FUND_GUARANTEE"
label="经费保障"
/>
<el-table-column
show-overflow-tooltip
prop="QUALITY_ASSESSMENT"
label="质量评估"
/>
</layout-table>
<el-row>
<el-col :span="6">档案管理人员:</el-col>
<el-col :span="6"></el-col>
<el-col :span="6"></el-col>
<el-col :span="6">更新日期:</el-col>
</el-row>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
<eduplan-form
v-if="data.formVisible"
v-model:visible="data.formVisible"
:ARCHIVESEDUPLAN_ID="data.current.ARCHIVESEDUPLAN_ID"
:type="data.current.ARCHIVESEDUPLAN_ID ? 'edit' : 'add'"
:year="year"
@get-data="fnGetList"
/>
</div>
</template>
<script setup>
import {
deleteArchivesEduplan,
getArchivesEduplanList,
} from "@/request/archives.js";
import { reactive } from "vue";
import { useVModels } from "@vueuse/core";
import { useUserStore } from "@/pinia/user.js";
import LayoutTable from "@/components/table/index.vue";
import { serialNumber } from "@/assets/js/utils.js";
import EduplanForm from "./eduplan_form.vue";
import { ElMessageBox } from "element-plus";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
const props = defineProps({
title: {
type: String,
required: false,
default: "",
},
year: {
type: String,
required: false,
default: "",
},
type: {
type: Number,
required: true,
},
studyTaskId: {
type: String,
required: false,
default: "",
},
});
const { title, year, type } = useVModels(props);
const data = reactive({
dataList: [],
current: undefined,
formVisible: false,
});
const emits = defineEmits(["update:visible"]);
const fnClose = () => {
emits("update:current", undefined);
};
const fnCurrentChange = (row) => {
data.current = row;
};
const fnAdd = () => {
data.dataList.push({});
};
const fnDelete = async () => {
if (data.current) {
if (data.current.ARCHIVESEDUPLAN_ID) {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await deleteArchivesEduplan({
ARCHIVESEDUPLAN_ID: data.current.ARCHIVESEDUPLAN_ID,
});
}
data.current = undefined;
await fnGetList();
}
};
const fnGetList = async () => {
const respData = await getArchivesEduplanList({ YEAR: year.value });
if (respData && respData.varList) {
data.dataList = respData.varList;
}
};
await fnGetList();
const fnAddOrUpdate = (row) => {
data.current = row;
if (row) {
data.formVisible = true;
}
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,212 @@
<template>
<div>
<el-dialog
v-if="visible"
:model-value="visible"
:title="type === 'add' ? '新增' : '修改'"
:before-close="fnClose"
>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="150px"
>
<el-form-item label="开始时间" prop="START_DATE">
<el-date-picker
v-model="data.form.START_DATE"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
clearable
placeholder="选择日期"
/>
</el-form-item>
<el-form-item label="结束时间" prop="END_DATE">
<el-date-picker
v-model="data.form.END_DATE"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
clearable
placeholder="选择日期"
/>
</el-form-item>
<el-form-item label="培训对象" prop="TRAINING_OBJECT">
<el-input
v-model="data.form.TRAINING_OBJECT"
maxlength="255"
placeholder="这里输入培训对象"
/>
</el-form-item>
<el-form-item label="培训教材" prop="TRAINING_MATERIALS">
<el-input
v-model="data.form.TRAINING_MATERIALS"
maxlength="255"
placeholder="这里输入培训教材"
/>
</el-form-item>
<el-form-item label="培训方式" prop="TRAINING_METHODS">
<el-input
v-model="data.form.TRAINING_METHODS"
maxlength="255"
placeholder="这里输入培训方式"
/>
</el-form-item>
<el-form-item label="考核方式" prop="ASSESSMENT_METHOD">
<el-input
v-model="data.form.ASSESSMENT_METHOD"
maxlength="255"
placeholder="这里输入考核方式"
/>
</el-form-item>
<el-form-item label="学时" prop="CLASS_HOURS">
<el-input
v-model="data.form.CLASS_HOURS"
maxlength="11"
placeholder="这里输入学时"
/>
</el-form-item>
<el-form-item label="地点" prop="PLACE">
<el-input
v-model="data.form.PLACE"
maxlength="255"
placeholder="这里输入地点"
/>
</el-form-item>
<el-form-item label="培训教师" prop="TRAINING_TEACHERS">
<el-input
v-model="data.form.TRAINING_TEACHERS"
maxlength="255"
placeholder="这里输入培训教师"
/>
</el-form-item>
<el-form-item label="经费保障" prop="FUND_GUARANTEE">
<el-input
v-model="data.form.FUND_GUARANTEE"
maxlength="255"
placeholder="这里输入经费保障"
/>
</el-form-item>
<el-form-item label="质量评估" prop="QUALITY_ASSESSMENT">
<el-input
v-model="data.form.QUALITY_ASSESSMENT"
maxlength="255"
placeholder="这里输入质量评估"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"> </el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { useVModels } from "@vueuse/core";
import {
getArchivesEduplan,
addArchivesEduplan,
editArchivesEduplan,
} from "@/request/archives.js";
const props = defineProps({
visible: {
type: Boolean,
required: true,
},
year: {
type: String,
required: true,
},
type: {
type: String,
required: true,
},
ARCHIVESEDUPLAN_ID: {
type: String,
required: false,
default: "",
},
});
const { visible, year, type, ARCHIVESEDUPLAN_ID } = useVModels(props);
const emits = defineEmits(["update:visible", "getData"]);
const data = reactive({
form: {
ARCHIVESEDUPLAN_ID: undefined,
START_DATE: undefined,
END_DATE: undefined,
TRAINING_OBJECT: undefined,
TRAINING_MATERIALS: undefined,
TRAINING_METHODS: undefined,
ASSESSMENT_METHOD: undefined,
CLASS_HOURS: undefined,
PLACE: undefined,
TRAINING_TEACHERS: undefined,
FUND_GUARANTEE: undefined,
QUALITY_ASSESSMENT: undefined,
YEAR: year.value,
},
});
const rules = {
CLASS_HOURS: [
{
type: "number",
message: "请输入有效数字",
trigger: "blur",
transform: (value) => Number(value),
},
],
};
const formRef = ref(null);
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const params = Object.assign({}, data.form);
let respData;
if (type.value === "add") {
respData = await addArchivesEduplan(params);
} else if (type.value === "edit") {
respData = await editArchivesEduplan(params);
}
if (respData && respData.result === "success") {
emits("getData");
fnClose();
}
},
{ atBegin: true }
);
const fnClose = () => {
emits("update:visible", false);
};
const fnGetData = async () => {
if (
ARCHIVESEDUPLAN_ID &&
ARCHIVESEDUPLAN_ID.value &&
ARCHIVESEDUPLAN_ID.value.length > 0
) {
const respData = await getArchivesEduplan({
ARCHIVESEDUPLAN_ID: ARCHIVESEDUPLAN_ID.value,
});
if (respData && respData.pd) {
data.form = respData.pd;
}
}
};
await fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,154 @@
<template>
<div>
<el-dialog
v-if="type === 101"
:model-value="type === 101"
:title="title"
:before-close="fnClose"
>
<el-space wrap>
<el-button type="primary" @click="fnAdd"></el-button>
<el-button type="danger" @click="fnDelete"> </el-button>
<el-button type="primary" v-print="'#printContent'"></el-button>
</el-space>
<div id="printContent">
<div style="text-align: center">
<el-text size="large">{{ year }}三岗人员管理台账</el-text>
</div>
<div>
<el-text size="small">单位名称:{{ CORP_NAME }}</el-text>
</div>
<layout-table
:data="data.dataList"
:show-pagination="false"
highlight-current-row
@row-click="fnCurrentChange"
@row-dblclick="fnAddOrUpdate"
>
<el-table-column label="序号" width="45">
<template v-slot="{ $index }">
{{ serialNumber({ currentPage: 1, pageSize: 99999 }, $index) }}
</template>
</el-table-column>
<el-table-column prop="NAME" label="姓名" />
<el-table-column prop="POST" label="岗位/操作项目" />
<el-table-column prop="PHONE" label="电话" />
<el-table-column
show-overflow-tooltip
prop="CARD_ID"
label="证书号"
/>
<el-table-column prop="EFFECTIVE_DATE" label="证书有效期限" />
<el-table-column prop="RETRAINING" label="复训日期" />
</layout-table>
<el-row>
<el-col :span="6">档案管理人员:</el-col>
<el-col :span="6"></el-col>
<el-col :span="6"></el-col>
<el-col :span="6">更新日期:</el-col>
</el-row>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
<postman-form
v-if="data.formVisible"
v-model:visible="data.formVisible"
:ARCHIVES_POSTMAN_ID="data.current.ARCHIVES_POSTMAN_ID"
:type="data.current.ARCHIVES_POSTMAN_ID ? 'edit' : 'add'"
:year="year"
@get-data="fnGetList"
/>
</div>
</template>
<script setup>
import {
deleteArchivesPostman,
getArchivesPostmanList,
} from "@/request/archives.js";
import { reactive } from "vue";
import { useVModels } from "@vueuse/core";
import { useUserStore } from "@/pinia/user.js";
import LayoutTable from "@/components/table/index.vue";
import { serialNumber } from "@/assets/js/utils.js";
import PostmanForm from "./postman_form.vue";
import { ElMessageBox } from "element-plus";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
const props = defineProps({
title: {
type: String,
required: false,
default: "",
},
year: {
type: String,
required: false,
default: "",
},
type: {
type: Number,
required: true,
},
studyTaskId: {
type: String,
required: false,
default: "",
},
});
const { title, year, type } = useVModels(props);
const data = reactive({
dataList: [],
current: undefined,
formVisible: false,
});
const emits = defineEmits(["update:visible"]);
const fnClose = () => {
emits("update:current", undefined);
};
const fnCurrentChange = (row) => {
data.current = row;
};
const fnAdd = () => {
data.dataList.push({});
};
const fnDelete = async () => {
if (data.current) {
if (data.current.ARCHIVES_POSTMAN_ID) {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await deleteArchivesPostman({
ARCHIVES_POSTMAN_ID: data.current.ARCHIVES_POSTMAN_ID,
});
}
data.current = undefined;
await fnGetList();
}
};
const fnGetList = async () => {
const respData = await getArchivesPostmanList({ YEAR: year.value });
if (respData && respData.varList) {
data.dataList = respData.varList;
}
};
await fnGetList();
const fnAddOrUpdate = (row) => {
data.current = row;
if (row) {
data.formVisible = true;
}
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,184 @@
<template>
<div>
<el-dialog
v-if="visible"
:model-value="visible"
:title="type === 'add' ? '新增' : '修改'"
:before-close="fnClose"
>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="150px"
>
<el-form-item label="姓名" prop="NAME">
<el-input
v-model="data.form.NAME"
maxlength="255"
placeholder="这里输入姓名"
/>
</el-form-item>
<el-form-item label="岗位/操作项目" prop="POST">
<el-input
v-model="data.form.POST"
maxlength="255"
placeholder="这里输入岗位/操作项目"
/>
</el-form-item>
<el-form-item label="电话" prop="PHONE">
<el-input
v-model="data.form.PHONE"
maxlength="255"
placeholder="这里输入电话"
/>
</el-form-item>
<el-form-item label="证书号" prop="CARD_ID">
<el-input
v-model="data.form.CARD_ID"
maxlength="255"
placeholder="这里输入证书号"
/>
</el-form-item>
<el-form-item label="证书有效期限" prop="EFFECTIVE_DATE">
<el-date-picker
v-model="data.form.EFFECTIVE_DATE"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
clearable
placeholder="选择日期"
/>
</el-form-item>
<el-form-item label="复训日期" prop="RETRAINING">
<el-date-picker
v-model="data.form.RETRAINING"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
clearable
placeholder="选择日期"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"> </el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { useVModels } from "@vueuse/core";
import {
getArchivesPostman,
addArchivesPostman,
editArchivesPostman,
} from "@/request/archives.js";
const props = defineProps({
visible: {
type: Boolean,
required: true,
},
year: {
type: String,
required: true,
},
type: {
type: String,
required: true,
},
ARCHIVES_POSTMAN_ID: {
type: String,
required: false,
default: "",
},
});
const { visible, year, type, ARCHIVES_POSTMAN_ID } = useVModels(props);
const emits = defineEmits(["update:visible", "getData"]);
const data = reactive({
form: {
ARCHIVES_POSTMAN_ID: undefined,
NAME: undefined,
POST: undefined,
PHONE: undefined,
CARD_ID: undefined,
EFFECTIVE_DATE: undefined,
RETRAINING: undefined,
YEAR: year.value,
},
isoccupation: [
{ value: "0", label: "专职" },
{ value: "1", label: "兼职" },
],
});
const rules = {
NAME: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
POST: [{ required: true, message: "岗位/操作项目不能为空", trigger: "blur" }],
PHONE: [
{ required: true, message: "电话不能为空", trigger: "blur" },
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
CARD_ID: [{ required: true, message: "证书号不能为空", trigger: "blur" }],
EFFECTIVE_DATE: [
{ required: true, message: "请选择证书有效期限", trigger: "blur" },
],
RETRAINING: [{ required: true, message: "请选择复训日期", trigger: "blur" }],
};
const formRef = ref(null);
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const params = Object.assign({}, data.form);
let respData;
if (type.value === "add") {
respData = await addArchivesPostman(params);
} else if (type.value === "edit") {
respData = await editArchivesPostman(params);
}
if (respData && respData.result === "success") {
emits("getData");
fnClose();
}
},
{ atBegin: true }
);
const fnClose = () => {
emits("update:visible", false);
};
const fnGetData = async () => {
if (
ARCHIVES_POSTMAN_ID &&
ARCHIVES_POSTMAN_ID.value &&
ARCHIVES_POSTMAN_ID.value.length > 0
) {
const respData = await getArchivesPostman({
ARCHIVES_POSTMAN_ID: ARCHIVES_POSTMAN_ID.value,
});
if (respData && respData.pd) {
data.form = respData.pd;
}
}
};
await fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,161 @@
<template>
<div>
<el-dialog
v-if="type === 102"
:model-value="type === 102"
:title="title"
:before-close="fnClose"
>
<el-space wrap>
<el-button type="primary" @click="fnAdd"></el-button>
<el-button type="danger" @click="fnDelete"> </el-button>
<el-button type="primary" v-print="'#printContent'"></el-button>
</el-space>
<div id="printContent">
<div style="text-align: center">
<el-text size="large">{{ year }}年度本单位师资管理台账</el-text>
</div>
<div>
<el-text size="small">单位名称:{{ CORP_NAME }}</el-text>
</div>
<layout-table
:data="data.dataList"
:show-pagination="false"
highlight-current-row
@row-click="fnCurrentChange"
@row-dblclick="fnAddOrUpdate"
>
<el-table-column label="序号" width="45">
<template v-slot="{ $index }">
{{ serialNumber({ currentPage: 1, pageSize: 99999 }, $index) }}
</template>
</el-table-column>
<el-table-column prop="NAME" label="姓名" />
<el-table-column prop="PHONE" label="电话" />
<el-table-column prop="WORK_YEAR" label="从事本专业工作年限">
<template v-slot="{ row }">
{{ row.WORK_YEAR ? row.WORK_YEAR + "年" : "" }}
</template>
</el-table-column>
<el-table-column prop="OCCUPATION" label="专/兼职" />
<el-table-column
show-overflow-tooltip
prop="CARD_ID"
label="证书编号"
/>
<el-table-column prop="ASSESSMENT_DEPT" label="考核部门" />
<el-table-column prop="ASSESSMENT_DATE" label="考核日期" />
<el-table-column prop="ASSESSMENT_RESULT" label="考核结果" />
<el-table-column show-overflow-tooltip prop="DESCR" label="备注" />
</layout-table>
<el-row>
<el-col :span="6">档案管理人员:</el-col>
<el-col :span="6"></el-col>
<el-col :span="6"></el-col>
<el-col :span="6">更新日期:</el-col>
</el-row>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
<teacher-form
v-if="data.formVisible"
v-model:visible="data.formVisible"
:ARCHIVESTEACHER_ID="data.current.ARCHIVESTEACHER_ID"
:type="data.current.ARCHIVESTEACHER_ID ? 'edit' : 'add'"
:year="year"
@get-data="fnGetList"
/>
</div>
</template>
<script setup>
import {
deleteArchivesTeacher,
getArchivesTeacherList,
} from "@/request/archives.js";
import { reactive } from "vue";
import { useVModels } from "@vueuse/core";
import { useUserStore } from "@/pinia/user.js";
import LayoutTable from "@/components/table/index.vue";
import { serialNumber } from "@/assets/js/utils.js";
import TeacherForm from "./teacher_form.vue";
import { ElMessageBox } from "element-plus";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
const props = defineProps({
title: {
type: String,
required: false,
default: "",
},
year: {
type: String,
required: false,
default: "",
},
type: {
type: Number,
required: true,
},
studyTaskId: {
type: String,
required: false,
default: "",
},
});
const { title, year, type } = useVModels(props);
const data = reactive({
dataList: [],
current: undefined,
formVisible: false,
});
const emits = defineEmits(["update:visible"]);
const fnClose = () => {
emits("update:current", undefined);
};
const fnCurrentChange = (row) => {
data.current = row;
};
const fnAdd = () => {
data.dataList.push({});
};
const fnDelete = async () => {
if (data.current) {
if (data.current.ARCHIVESTEACHER_ID) {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await deleteArchivesTeacher({
ARCHIVESTEACHER_ID: data.current.ARCHIVESTEACHER_ID,
});
}
data.current = undefined;
await fnGetList();
}
};
const fnGetList = async () => {
const respData = await getArchivesTeacherList({ YEAR: year.value });
if (respData && respData.varList) {
data.dataList = respData.varList;
}
};
await fnGetList();
const fnAddOrUpdate = (row) => {
data.current = row;
if (row) {
data.formVisible = true;
}
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,221 @@
<template>
<div>
<el-dialog
v-if="visible"
:model-value="visible"
:title="type === 'add' ? '新增' : '修改'"
:before-close="fnClose"
>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="150px"
>
<el-form-item label="姓名" prop="NAME">
<el-input
v-model="data.form.NAME"
maxlength="255"
placeholder="这里输入姓名"
/>
</el-form-item>
<el-form-item label="电话" prop="PHONE">
<el-input
v-model="data.form.PHONE"
maxlength="255"
placeholder="这里输入电话"
/>
</el-form-item>
<el-form-item label="从事本专业工作年限" prop="WORK_YEAR">
<el-input-number
:min="0"
v-model.number="data.form.WORK_YEAR"
maxlength="11"
placeholder="这里输入从事本专业工作年限"
/>
</el-form-item>
<el-form-item label="专/兼职" prop="OCCUPATION">
<el-select v-model="data.form.OCCUPATION" title="请选择专/兼职">
<el-option
v-for="item in data.isoccupation"
:key="item.value"
:label="item.label"
:value="item.label"
/>
</el-select>
</el-form-item>
<el-form-item label="证书编号" prop="CARD_ID">
<el-input
v-model="data.form.CARD_ID"
maxlength="255"
placeholder="这里输入证书编号"
/>
</el-form-item>
<el-form-item label="考核部门" prop="ASSESSMENT_DEPT">
<el-input
v-model="data.form.ASSESSMENT_DEPT"
maxlength="255"
placeholder="这里输入考核部门"
/>
</el-form-item>
<el-form-item label="考核日期" prop="ASSESSMENT_DATE">
<el-date-picker
v-model="data.form.ASSESSMENT_DATE"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
clearable
placeholder="选择日期"
/>
</el-form-item>
<el-form-item label="考核结果" prop="ASSESSMENT_RESULT">
<el-input
v-model="data.form.ASSESSMENT_RESULT"
maxlength="255"
placeholder="这里输入考核结果"
/>
</el-form-item>
<el-form-item label="备注" prop="DESCR">
<el-input
v-model="data.form.DESCR"
maxlength="255"
placeholder="这里输入备注"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"> </el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { useVModels } from "@vueuse/core";
import {
getArchivesTeacher,
addArchivesTeacher,
editArchivesTeacher,
} from "@/request/archives.js";
const props = defineProps({
visible: {
type: Boolean,
required: true,
},
year: {
type: String,
required: true,
},
type: {
type: String,
required: true,
},
ARCHIVESTEACHER_ID: {
type: String,
required: false,
default: "",
},
});
const { visible, year, type, ARCHIVESTEACHER_ID } = useVModels(props);
const emits = defineEmits(["update:visible", "getData"]);
const data = reactive({
form: {
ARCHIVESTEACHER_ID: undefined,
NAME: undefined,
PHONE: undefined,
WORK_YEAR: undefined,
OCCUPATION: undefined,
CARD_ID: undefined,
ASSESSMENT_DEPT: undefined,
ASSESSMENT_DATE: undefined,
DESCR: undefined,
YEAR: year.value,
},
isoccupation: [
{ value: "0", label: "专职" },
{ value: "1", label: "兼职" },
],
});
const rules = {
NAME: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
PHONE: [
{ required: true, message: "电话不能为空", trigger: "blur" },
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
WORK_YEAR: [
{
required: true,
message: "从事本专业工作年限不能为空",
trigger: "change",
},
{ type: "number", message: "从事本专业工作年限必须为数字" },
],
OCCUPATION: [{ required: true, message: "专/兼职不能为空", trigger: "blur" }],
CARD_ID: [{ required: true, message: "证书编号不能为空", trigger: "blur" }],
ASSESSMENT_DEPT: [
{ required: true, message: "考核部门不能为空", trigger: "blur" },
],
ASSESSMENT_DATE: [
{ required: true, message: "请选择考核日期", trigger: "blur" },
],
ASSESSMENT_RESULT: [
{ required: true, message: "考核结果不能为空", trigger: "blur" },
],
};
const formRef = ref(null);
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const params = Object.assign({}, data.form);
let respData;
if (type.value === "add") {
respData = await addArchivesTeacher(params);
} else if (type.value === "edit") {
respData = await editArchivesTeacher(params);
}
if (respData && respData.result === "success") {
emits("getData");
fnClose();
}
},
{ atBegin: true }
);
const fnClose = () => {
emits("update:visible", false);
};
const fnGetData = async () => {
if (
ARCHIVESTEACHER_ID &&
ARCHIVESTEACHER_ID.value &&
ARCHIVESTEACHER_ID.value.length > 0
) {
const respData = await getArchivesTeacher({
ARCHIVESTEACHER_ID: ARCHIVESTEACHER_ID.value,
});
if (respData && respData.pd) {
data.form = respData.pd;
}
}
};
await fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -21,7 +21,7 @@
</el-col>
</el-row>
</el-form>
<catalogue source="corp" />
<catalogue source="corp" :year="data.form.year" />
</div>
</template>
<script setup>
@ -38,3 +38,5 @@ const data = reactive({
},
});
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,158 @@
<template>
<div>
<el-dialog
v-if="type === 6 || type === 7"
:model-value="type === 6 || type === 7"
:title="title"
:before-close="fnClose"
>
<el-space wrap>
<layout-upload
v-model:file-list="data.form.file"
accept=".zip"
:show-file-list="false"
auto-upload
:http-request="fnUploadArchivesFile"
:limit="99"
>
<template #tip>只能上传zip文件</template>
</layout-upload>
</el-space>
<br /><br />
<template v-for="(row, index) in data.fileList" :key="index">
<el-row>
<el-col :span="16">
{{ row.FILE_NAME }}
</el-col>
<el-col :span="8">
<el-button
type="primary"
text
link
@click="useDownloadFile(row.FILE_PATH)"
>
下载
</el-button>
<el-button
type="primary"
text
link
@click="fnDeleteArchivesFile(row)"
>
删除
</el-button>
</el-col>
</el-row>
</template>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import {
uploadArchivesFile,
getArchivesFileList,
deleteArchivesFile,
} from "@/request/archives.js";
import LayoutUpload from "@/components/upload/index.vue";
import { reactive } from "vue";
import { useVModels } from "@vueuse/core";
import useDownloadFile from "@/assets/js/useDownloadFile.js";
import { ElMessageBox } from "element-plus";
const props = defineProps({
title: {
type: String,
required: false,
default: "",
},
year: {
type: String,
required: false,
default: "",
},
type: {
type: Number,
required: true,
},
studyTaskId: {
type: String,
required: false,
default: "",
},
});
const { title, year, type, studyTaskId } = useVModels(props);
const data = reactive({
form: {
file: [],
},
fileList: [],
currentFile: "",
});
const emits = defineEmits(["update:visible"]);
const fnClear = () => {
data.currentFile = "";
data.form.file = [];
data.fileList = [];
};
const fnUploadArchivesFile = async (item) => {
const formData = new FormData();
formData.append("FFILE", item.file);
formData.append("TYPE", type.value);
if (year.value && year.value.length > 0) {
formData.append("YEAR", year.value);
}
if (studyTaskId.value && studyTaskId.value.length > 0) {
formData.append("STUDYTASK_ID", studyTaskId.value);
}
await uploadArchivesFile(formData);
await fnGetArchivesFileList();
};
const fnGetArchivesFileList = async () => {
fnClear();
const params = {
TYPE: type.value,
};
if (studyTaskId.value && studyTaskId.value.length > 0) {
params.STUDYTASK_ID = studyTaskId.value;
}
if (year.value && year.value.length > 0) {
params.YEAR = year.value;
}
const respData = await getArchivesFileList(params);
if (respData && respData.varList) {
data.fileList = respData.varList;
data.form.file = respData.varList;
}
};
await fnGetArchivesFileList();
const fnDeleteArchivesFile = async (row) => {
if (row) {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
const respData = await deleteArchivesFile({
ARCHIVESFILES_ID: row.ARCHIVESFILES_ID,
FILE_PATH: row.FILE_PATH,
});
if (respData && respData.result === "success") {
await fnGetArchivesFileList();
}
}
};
const fnClose = () => {
emits("update:current", undefined);
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,114 @@
<template>
<div>
<el-dialog
v-if="type === 106"
:model-value="type === 106"
:title="title"
:before-close="fnClose"
>
<el-space wrap>
<el-button type="primary" v-print="'#printContent'"></el-button>
</el-space>
<div id="printContent">
<div style="text-align: center">
<el-text size="large">
{{ CORP_NAME }} {{ data.taskInfo.post_type_name }}
</el-text>
</div>
<template v-for="(item, index) in data.coursewareList" :key="index">
<el-descriptions
:title="`${index + 1}.${item.COURSEWARENAME}`"
:column="1"
border
>
<el-descriptions-item label="讲师:">
{{ item.SPEAKER }}
</el-descriptions-item>
<el-descriptions-item label="课件类型:">
{{ item.coutType }}
</el-descriptions-item>
<el-descriptions-item label="课件描述:">
{{ item.COURSEWAREINTRODUCE }}
</el-descriptions-item>
</el-descriptions>
</template>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import {
getAllCoursewareByHandout,
getStudyTaskInfo,
} from "@/request/archives.js";
import { reactive } from "vue";
import { useVModels } from "@vueuse/core";
import { useUserStore } from "@/pinia/user.js";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
const props = defineProps({
title: {
type: String,
required: false,
default: "",
},
year: {
type: String,
required: false,
default: "",
},
type: {
type: Number,
required: true,
},
studyTaskId: {
type: String,
required: false,
default: "",
},
});
const { title, type, studyTaskId } = useVModels(props);
const data = reactive({
taskInfo: {},
coursewareList: [],
});
const emits = defineEmits(["update:visible"]);
const fnClose = () => {
emits("update:current", undefined);
};
const fnGetStudyTaskInfo = async () => {
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
const respData = await getStudyTaskInfo({
STUDYTASK_ID: studyTaskId.value,
});
if (respData && respData.pd) {
data.taskInfo = respData.pd;
}
}
};
await fnGetStudyTaskInfo();
const fnGetAllCoursewareByHandout = async () => {
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
const respData = await getAllCoursewareByHandout({
STUDYTASK_ID: studyTaskId.value,
});
if (respData && respData.varList) {
data.coursewareList = respData.varList;
}
}
};
await fnGetAllCoursewareByHandout();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,177 @@
<template>
<div>
<el-dialog
v-if="type === 103"
:model-value="type === 103"
:title="title"
:before-close="fnClose"
>
<el-space wrap>
<el-button type="primary" v-print="'#printContent'"></el-button>
</el-space>
<br /><br />
<div id="printContent">
<div>
<el-text>单位名称:{{ CORP_NAME }}</el-text>
</div>
<br />
<div>
<el-text>任务名称:{{ data.taskInfo.STUDY_NAME }}</el-text>
</div>
<div style="text-align: center">
<el-text size="large">{{ data.paperInfo.EXAMNAME }}</el-text>
</div>
<div style="text-align: center">
<el-text size="small">
(满分:{{ data.paperInfo.EXAMSCORE }})
</el-text>
</div>
<div v-if="data.paperInfo.selectList.length > 0" style="color: white">
<el-divider content-position="left">单选题</el-divider>
<template
v-for="(item, index) in data.paperInfo.selectList"
:key="item.QUESTION_ID"
>
{{ index + 1 }}.{{ item.QUESTIONDRY }}
<el-row>
<el-col :span="2"></el-col>
<el-col :span="22">
<p>A.{{ item.OPTIONA }}</p>
<p>B.{{ item.OPTIONB }}</p>
<p>C.{{ item.OPTIONC }}</p>
<p>D.{{ item.OPTIOND }}</p>
</el-col>
</el-row>
</template>
</div>
<div v-if="data.paperInfo.multiList.length > 0" style="color: white">
<el-divider content-position="left">多选题</el-divider>
<template
v-for="(item, index) in data.paperInfo.multiList"
:key="item.QUESTION_ID"
>
{{ index + 1 }}.{{ item.QUESTIONDRY }}
<el-row>
<el-col :span="2"></el-col>
<el-col :span="22">
<p>A.{{ item.OPTIONA }}</p>
<p>B.{{ item.OPTIONB }}</p>
<p>C.{{ item.OPTIONC }}</p>
<p>D.{{ item.OPTIOND }}</p>
</el-col>
</el-row>
</template>
</div>
<div v-if="data.paperInfo.judgeList.length > 0" style="color: white">
<el-divider content-position="left">判断题</el-divider>
<template
v-for="(item, index) in data.paperInfo.judgeList"
:key="item.QUESTION_ID"
>
{{ index + 1 }}.{{ item.QUESTIONDRY }}
<el-row>
<el-col :span="2"></el-col>
<el-col :span="22">
<p>A.{{ item.OPTIONA }}</p>
<p>B.{{ item.OPTIONB }}</p>
</el-col>
</el-row>
</template>
</div>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { getStudyTaskInfo, getPaperByTaskId } from "@/request/archives.js";
import { reactive } from "vue";
import { useVModels } from "@vueuse/core";
import { useUserStore } from "@/pinia/user.js";
const props = defineProps({
title: {
type: String,
required: false,
default: "",
},
year: {
type: String,
required: false,
default: "",
},
type: {
type: Number,
required: true,
},
studyTaskId: {
type: String,
required: false,
default: "",
},
});
const { title, type, studyTaskId } = useVModels(props);
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
const data = reactive({
taskInfo: {},
paperInfo: {
selectList: [],
multiList: [],
judgeList: [],
},
});
const emits = defineEmits(["update:visible"]);
const fnClose = () => {
emits("update:current", undefined);
};
const fnGetStudyTaskInfo = async () => {
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
const respData = await getStudyTaskInfo({
STUDYTASK_ID: studyTaskId.value,
});
if (respData && respData.pd) {
data.taskInfo = respData.pd;
}
}
};
await fnGetStudyTaskInfo();
const fnGetPaperByTaskId = async () => {
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
const respData = await getPaperByTaskId({
STUDYTASK_ID: studyTaskId.value,
});
if (respData.paper) {
if (respData.paper) {
data.paperInfo = respData.paper;
}
data.paperInfo.selectList = [];
data.paperInfo.multiList = [];
data.paperInfo.judgeList = [];
if (respData.questionList && respData.questionList.length > 0) {
respData.questionList.forEach((question) => {
if (question.QUESTIONTYPE === "1") {
data.paperInfo.selectList.push(question);
} else if (question.QUESTIONTYPE === "2") {
data.paperInfo.multiList.push(question);
} else if (question.QUESTIONTYPE === "3") {
data.paperInfo.judgeList.push(question);
}
});
}
}
}
};
await fnGetPaperByTaskId();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,186 @@
<template>
<div>
<el-dialog
v-if="type === 105"
:model-value="type === 105"
:title="title"
:before-close="fnClose"
>
<el-space wrap>
<el-button type="primary" v-print="'#printContent'"></el-button>
</el-space>
<div id="printContent">
<div style="text-align: center">
<el-text size="large">
{{ data.taskInfo.STUDY_NAME }}培训综合考评报告
</el-text>
</div>
<br />
<el-descriptions :column="2" border>
<el-descriptions-item label="任务名称">
{{ data.taskInfo.STUDY_NAME }}
</el-descriptions-item>
<el-descriptions-item label="培训组织部门">
<!-- todo 原项目为空 -->
</el-descriptions-item>
<el-descriptions-item label="评估日期">
{{ data.taskInfo.PEIXUE_END_TIME }}
</el-descriptions-item>
<el-descriptions-item label="考核方式">
<!-- todo 原项目是写死的 -->
考核
</el-descriptions-item>
<el-descriptions-item label="本次工作培训描述" :span="2">
本次培训的主要内容是:{{ curriculums }} 共应参加人数为{{
data.studentList.length
}}, 实际参加培训人数为{{ join_student_list.length }}, 参加率为{{
(
(join_student_list.length / data.studentList.length) *
100
).toFixed(2)
}}%
</el-descriptions-item>
<el-descriptions-item label="本次培训考评结论" :span="2">
本次通过笔试的方式进行了培训效果考核,考核人数为{{
data.studentList.length
}},考核合格人数为{{ pass_student_list.length }}, 合格率为{{
(
(pass_student_list.length / data.studentList.length) *
100
).toFixed(2)
}}%
</el-descriptions-item>
<el-descriptions-item label="改进意见建议" :span="2">
<div>1.本次培训的讲师</div>
<div>讲师的语言表达能力应该更加的生动清晰易懂</div>
<div>非常满意</div>
<div>2.本次培训的课程</div>
<div>课程内容应该更加专业可以对我的工作帮助更大</div>
<div>非常满意</div>
</el-descriptions-item>
</el-descriptions>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import {
getAllCurriculum,
getStudyTaskInfo,
getStudentByTaskId,
} from "@/request/archives.js";
import { computed, reactive } from "vue";
import { useVModels } from "@vueuse/core";
const props = defineProps({
title: {
type: String,
required: false,
default: "",
},
year: {
type: String,
required: false,
default: "",
},
type: {
type: Number,
required: true,
},
studyTaskId: {
type: String,
required: false,
default: "",
},
});
const { title, type, studyTaskId } = useVModels(props);
const data = reactive({
taskInfo: {},
curriculumList: [],
studentList: [],
});
const curriculums = computed(() => {
if (data.curriculumList && data.curriculumList.length > 0) {
return data.curriculumList
.map((item) => {
return item.CURRICULUMNAME;
})
.join(",");
}
return "";
});
const pass_student_list = computed(() => {
const result = [];
if (data.studentList && data.studentList.length > 0) {
data.studentList.forEach((item) => {
if (Number(item.STAGEEXAMSCORE) >= Number(data.taskInfo.PASSSCORE)) {
result.push(item);
}
});
}
return result;
});
const join_student_list = computed(() => {
const result = [];
if (data.studentList && data.studentList.length > 0) {
data.studentList.forEach((item) => {
if (item.COMPLETE_COURSEWARE > 0) {
result.push(item);
}
});
}
return result;
});
const emits = defineEmits(["update:visible"]);
const fnClose = () => {
emits("update:current", undefined);
};
const fnGetStudyTaskInfo = async () => {
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
const respData = await getStudyTaskInfo({
STUDYTASK_ID: studyTaskId.value,
});
if (respData && respData.pd) {
data.taskInfo = respData.pd;
}
}
};
await fnGetStudyTaskInfo();
const fnGetAllCurriculum = async () => {
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
const respData = await getAllCurriculum({
STUDYTASK_ID: studyTaskId.value,
});
if (respData && respData.varList) {
data.curriculumList = respData.varList;
}
}
};
await fnGetAllCurriculum();
const fnGetStudentByTaskId = async () => {
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
const respData = await getStudentByTaskId({
STUDYTASK_ID: studyTaskId.value,
});
if (respData && respData.varList) {
data.studentList = respData.varList;
}
}
};
await fnGetStudentByTaskId();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,219 @@
<template>
<div>
<el-dialog
v-if="type === 104"
:model-value="type === 104"
:title="title"
:before-close="fnClose"
>
<el-space wrap>
<el-button type="primary" v-print="'#printContent'"></el-button>
</el-space>
<div id="printContent">
<div style="text-align: center">
<el-text size="large">学员统计情况总表</el-text>
</div>
<div style="display: flex; justify-content: space-between">
<el-text size="small">平台名称:</el-text>
<el-text size="small">报表日期:{{ fnGetCurrentDay() }}</el-text>
</div>
<el-descriptions direction="vertical" :column="2" border>
<el-descriptions-item label="公司名称">
{{ CORP_NAME }}
</el-descriptions-item>
<el-descriptions-item label="任务名称">
{{ data.taskInfo.STUDY_NAME }}
</el-descriptions-item>
<el-descriptions-item label="培训时间">
{{ data.taskInfo.PEIXUE_START_TIME }}
{{ data.taskInfo.PEIXUE_END_TIME }}
</el-descriptions-item>
<el-descriptions-item label="计划课时">
{{ class_hours }}
</el-descriptions-item>
<el-descriptions-item label="培训人数">
{{ data.studentList.length }}
</el-descriptions-item>
<el-descriptions-item label="合格人数">
{{ pass_student_list.length }}
</el-descriptions-item>
</el-descriptions>
<br />
<div style="text-align: center">
<el-text>合格学员名单</el-text>
</div>
<layout-table :data="pass_student_list" :show-pagination="false">
<el-table-column label="序号" width="50">
<template v-slot="{ $index }">
{{ serialNumber({ currentPage: 1, pageSize: 99999 }, $index) }}
</template>
</el-table-column>
<el-table-column prop="USER_NAME" label="姓名" />
<el-table-column prop="USER_ID_CARD" label="身份证" />
<el-table-column prop="PHONE" label="手机号" />
<el-table-column prop="SEX_NAME" label="性别" />
<el-table-column prop="COMPLETE_CLASSHOUR" label="完成学时" />
<el-table-column prop="STAGEEXAMSCORE" label="结业考试成绩">
<template v-slot="{ row }">
{{ row.STAGEEXAMSCORE > -1 ? row.STAGEEXAMSCORE : "未参加" }}
</template>
</el-table-column>
</layout-table>
<div style="text-align: center">
<el-text>未合格学员名单</el-text>
</div>
<layout-table :data="unpass_student_list" :show-pagination="false">
<el-table-column label="序号" width="50">
<template v-slot="{ $index }">
{{ serialNumber({ currentPage: 1, pageSize: 99999 }, $index) }}
</template>
</el-table-column>
<el-table-column prop="USER_NAME" label="姓名" />
<el-table-column prop="USER_ID_CARD" label="身份证" />
<el-table-column prop="PHONE" label="手机号" />
<el-table-column prop="SEX_NAME" label="性别" />
<el-table-column prop="COMPLETE_CLASSHOUR" label="完成学时" />
<el-table-column prop="STAGEEXAMSCORE" label="结业考试成绩">
<template v-slot="{ row }">
{{ row.STAGEEXAMSCORE > -1 ? row.STAGEEXAMSCORE : "未参加" }}
</template>
</el-table-column>
</layout-table>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import {
getAllCourseware,
getStudyTaskInfo,
getStudentByTaskId,
} from "@/request/archives.js";
import { computed, reactive } from "vue";
import { useVModels } from "@vueuse/core";
import LayoutTable from "@/components/table/index.vue";
import { useUserStore } from "@/pinia/user.js";
import { serialNumber } from "@/assets/js/utils.js";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
const props = defineProps({
title: {
type: String,
required: false,
default: "",
},
year: {
type: String,
required: false,
default: "",
},
type: {
type: Number,
required: true,
},
studyTaskId: {
type: String,
required: false,
default: "",
},
});
const { title, type, studyTaskId } = useVModels(props);
const data = reactive({
taskInfo: {},
coursewareList: [],
studentList: [],
});
const class_hours = computed(() => {
let result = 0;
if (data.coursewareList && data.coursewareList.length > 0) {
data.coursewareList.forEach((item) => {
result += item.CLASSHOUR;
});
}
return ((result || 0) / 45).toFixed(2);
});
const pass_student_list = computed(() => {
const result = [];
if (data.studentList && data.studentList.length > 0) {
data.studentList.forEach((item) => {
if (Number(item.STAGEEXAMSCORE) >= Number(data.taskInfo.PASSSCORE)) {
result.push(item);
}
});
}
return result;
});
const unpass_student_list = computed(() => {
const result = [];
if (data.studentList && data.studentList.length > 0) {
data.studentList.forEach((item) => {
if (Number(item.STAGEEXAMSCORE) < Number(data.taskInfo.PASSSCORE)) {
result.push(item);
}
});
}
return result;
});
const emits = defineEmits(["update:visible"]);
const fnClose = () => {
emits("update:current", undefined);
};
const fnGetStudyTaskInfo = async () => {
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
const respData = await getStudyTaskInfo({
STUDYTASK_ID: studyTaskId.value,
});
if (respData && respData.pd) {
data.taskInfo = respData.pd;
}
}
};
await fnGetStudyTaskInfo();
const fnGetAllCoursewareByHandout = async () => {
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
const respData = await getAllCourseware({
STUDYTASK_ID: studyTaskId.value,
});
if (respData && respData.varList) {
data.coursewareList = respData.varList;
}
}
};
await fnGetAllCoursewareByHandout();
const fnGetStudentByTaskId = async () => {
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
const respData = await getStudentByTaskId({
STUDYTASK_ID: studyTaskId.value,
});
if (respData && respData.varList) {
data.studentList = respData.varList;
}
}
};
await fnGetStudentByTaskId();
const fnGetCurrentDay = () => {
const currentDatetime = new Date();
const year = currentDatetime.getFullYear();
const month = String(currentDatetime.getMonth() + 1).padStart(2, "0");
const day = String(currentDatetime.getDate()).padStart(2, "0");
return `${year}${month}${day}`;
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,174 @@
<template>
<div>
<el-dialog
v-if="type === 102"
:model-value="type === 102"
:title="title"
:before-close="fnClose"
>
<el-space wrap>
<el-button type="primary" v-print="'#printContent'"></el-button>
</el-space>
<div id="printContent">
<div style="text-align: center">
<el-text size="large">安全培训教育记录及签字表</el-text>
</div>
<div style="text-align: center">
(
<el-checkbox>岗前三级培训</el-checkbox>
<el-checkbox>专项培训</el-checkbox>
<el-checkbox>再培训</el-checkbox>
<el-checkbox>日常培训</el-checkbox>
)
</div>
<el-descriptions :column="3" border>
<el-descriptions-item label="日期">
{{ data.taskInfo.CREATTIME }}
</el-descriptions-item>
<el-descriptions-item label="培训地点">
<!-- todo 原项目为空 -->
</el-descriptions-item>
<el-descriptions-item label="人数">
{{ data.studentList.length }}
</el-descriptions-item>
<el-descriptions-item label="学时">
{{ class_hours }}
</el-descriptions-item>
<el-descriptions-item label="培训对象" :span="2">
<!-- todo 原项目为空 -->
</el-descriptions-item>
<el-descriptions-item label="培训教师" :span="3">
{{ teachers }}
</el-descriptions-item>
<el-descriptions-item label="培训内容:" :span="3">
{{ coursewares }}
</el-descriptions-item>
</el-descriptions>
<div style="text-align: center">
<el-text>受培训人</el-text>
</div>
<layout-table :data="data.studentList" :show-pagination="false">
<el-table-column prop="USER_NAME" label="姓名" />
<el-table-column prop="DEPARTMENT_NAME" label="部门" />
</layout-table>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import {
getAllCourseware,
getStudyTaskInfo,
getStudentByTaskId,
} from "@/request/archives.js";
import { computed, reactive } from "vue";
import { useVModels } from "@vueuse/core";
import LayoutTable from "@/components/table/index.vue";
const props = defineProps({
title: {
type: String,
required: false,
default: "",
},
year: {
type: String,
required: false,
default: "",
},
type: {
type: Number,
required: true,
},
studyTaskId: {
type: String,
required: false,
default: "",
},
});
const { title, type, studyTaskId } = useVModels(props);
const data = reactive({
taskInfo: {},
coursewareList: [],
studentList: [],
});
const class_hours = computed(() => {
let result = 0;
if (data.coursewareList && data.coursewareList.length > 0) {
data.coursewareList.forEach((item) => {
result += item.CLASSHOUR;
});
}
return ((result || 0) / 45).toFixed(2);
});
const teachers = computed(() => {
const result = [];
if (data.coursewareList && data.coursewareList.length > 0) {
data.coursewareList.forEach((item) => {
result.push(item.SPEAKER);
});
}
return result.length > 0 ? result.join(",") : "";
});
const coursewares = computed(() => {
const result = [];
if (data.coursewareList && data.coursewareList.length > 0) {
data.coursewareList.forEach((item) => {
result.push(item.COURSEWARENAME);
});
}
return result.length > 0 ? result.join(",") : "";
});
const emits = defineEmits(["update:visible"]);
const fnClose = () => {
emits("update:current", undefined);
};
const fnGetStudyTaskInfo = async () => {
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
const respData = await getStudyTaskInfo({
STUDYTASK_ID: studyTaskId.value,
});
if (respData && respData.pd) {
data.taskInfo = respData.pd;
}
}
};
await fnGetStudyTaskInfo();
const fnGetAllCoursewareByHandout = async () => {
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
const respData = await getAllCourseware({
STUDYTASK_ID: studyTaskId.value,
});
if (respData && respData.varList) {
data.coursewareList = respData.varList;
}
}
};
await fnGetAllCoursewareByHandout();
const fnGetStudentByTaskId = async () => {
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
const respData = await getStudentByTaskId({
STUDYTASK_ID: studyTaskId.value,
});
if (respData && respData.varList) {
data.studentList = respData.varList;
}
}
};
await fnGetStudentByTaskId();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,173 @@
<template>
<div>
<el-dialog
v-if="type === 101"
:model-value="type === 101"
:title="title"
:before-close="fnClose"
>
<el-space wrap>
<el-button type="primary" @click="fnAdd"></el-button>
<el-button type="danger" @click="fnDelete"> </el-button>
<el-button type="primary" v-print="'#printContent'"></el-button>
</el-space>
<div id="printContent">
<div style="text-align: center">
<el-text size="large">{{ CORP_NAME }}培训计划</el-text>
</div>
<div>
<el-text size="small">单位名称:{{ CORP_NAME }}</el-text>
</div>
<layout-table
:data="data.dataList"
:show-pagination="false"
highlight-current-row
@row-click="fnCurrentChange"
@row-dblclick="fnAddOrUpdate"
>
<el-table-column label="序号" width="45">
<template v-slot="{ $index }">
{{ serialNumber({ currentPage: 1, pageSize: 99999 }, $index) }}
</template>
</el-table-column>
<el-table-column
show-overflow-tooltip
prop="ORGANIZATION_DEPARTMENT"
label="培训组织部门"
/>
<el-table-column prop="TRAINING_DATE" label="培训日期" width="85" />
<el-table-column prop="TRAINING_TIME" label="培训时间" width="85" />
<el-table-column
show-overflow-tooltip
prop="TRAINING_CONTENT"
label="培训内容"
/>
<el-table-column prop="TRAINING_METHODS" label="培训方式" />
<el-table-column prop="TRAINING_OBJECT" label="培训对象" />
<el-table-column prop="ASSESSMENT_METHOD" label="考核方式" />
<el-table-column show-overflow-tooltip prop="PLACE" label="地点" />
<el-table-column prop="TRAINING_TEACHER" label="培训教师" />
<el-table-column
show-overflow-tooltip
prop="FUND_GUARANTEE"
label="经费保障"
/>
<el-table-column
show-overflow-tooltip
prop="QUALITY_ASSESSMENT"
label="质量评估"
/>
</layout-table>
<el-row>
<el-col :span="6">编制人:</el-col>
<el-col :span="6">编制日期:</el-col>
<el-col :span="6">审核人:</el-col>
<el-col :span="6">审核日期:</el-col>
</el-row>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
<training-schedule-form
v-if="data.formVisible"
v-model:visible="data.formVisible"
:TRAININGSCHEDULE_ID="data.current.TRAININGSCHEDULE_ID"
:type="data.current.TRAININGSCHEDULE_ID ? 'edit' : 'add'"
:study-task-id="studyTaskId"
@get-data="fnGetList"
/>
</div>
</template>
<script setup>
import {
deleteArchivesTrainingSchedule,
getArchivesTrainingScheduleList,
} from "@/request/archives.js";
import { reactive } from "vue";
import { useVModels } from "@vueuse/core";
import { useUserStore } from "@/pinia/user.js";
import LayoutTable from "@/components/table/index.vue";
import { serialNumber } from "@/assets/js/utils.js";
import TrainingScheduleForm from "./training_schedule_form.vue";
import { ElMessageBox } from "element-plus";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
const props = defineProps({
title: {
type: String,
required: false,
default: "",
},
year: {
type: String,
required: false,
default: "",
},
type: {
type: Number,
required: true,
},
studyTaskId: {
type: String,
required: false,
default: "",
},
});
const { title, type, studyTaskId } = useVModels(props);
const data = reactive({
dataList: [],
current: undefined,
formVisible: false,
});
const emits = defineEmits(["update:visible"]);
const fnClose = () => {
emits("update:current", undefined);
};
const fnCurrentChange = (row) => {
data.current = row;
};
const fnAdd = () => {
data.dataList.push({});
};
const fnDelete = async () => {
if (data.current) {
if (data.current.TRAININGSCHEDULE_ID) {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await deleteArchivesTrainingSchedule({
TRAININGSCHEDULE_ID: data.current.TRAININGSCHEDULE_ID,
});
}
data.current = undefined;
await fnGetList();
}
};
const fnGetList = async () => {
const respData = await getArchivesTrainingScheduleList({
STUDYTASK_ID: studyTaskId.value,
});
if (respData && respData.varList) {
data.dataList = respData.varList;
}
};
await fnGetList();
const fnAddOrUpdate = (row) => {
data.current = row;
if (row) {
data.formVisible = true;
}
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,202 @@
<template>
<div>
<el-dialog
v-if="visible"
:model-value="visible"
:title="type === 'add' ? '新增' : '修改'"
:before-close="fnClose"
>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="150px"
>
<el-form-item label="培训组织部门" prop="ORGANIZATION_DEPARTMENT">
<el-input
v-model="data.form.ORGANIZATION_DEPARTMENT"
maxlength="255"
placeholder="这里输入培训组织部门"
/>
</el-form-item>
<el-form-item label="培训日期" prop="TRAINING_DATE">
<el-date-picker
v-model="data.form.TRAINING_DATE"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
clearable
placeholder="选择日期"
/>
</el-form-item>
<el-form-item label="培训时间" prop="TRAINING_TIME">
<el-time-picker
v-model="data.form.TRAINING_TIME"
value-format="HH:mm:ss"
format="HH:mm:ss"
clearable
placeholder="选择时间"
/>
</el-form-item>
<el-form-item label="培训内容" prop="TRAINING_CONTENT">
<el-input
v-model="data.form.TRAINING_CONTENT"
maxlength="255"
placeholder="这里输入培训内容"
/>
</el-form-item>
<el-form-item label="培训方式" prop="TRAINING_METHODS">
<el-input
v-model="data.form.TRAINING_METHODS"
maxlength="255"
placeholder="这里输入培训方式"
/>
</el-form-item>
<el-form-item label="培训对象" prop="TRAINING_OBJECT">
<el-input
v-model="data.form.TRAINING_OBJECT"
maxlength="255"
placeholder="这里输入培训对象"
/>
</el-form-item>
<el-form-item label="考核方式" prop="ASSESSMENT_METHOD">
<el-input
v-model="data.form.ASSESSMENT_METHOD"
maxlength="255"
placeholder="这里输入考核方式"
/>
</el-form-item>
<el-form-item label="地点" prop="PLACE">
<el-input
v-model="data.form.PLACE"
maxlength="255"
placeholder="这里输入地点"
/>
</el-form-item>
<el-form-item label="培训教师" prop="TRAINING_TEACHER">
<el-input
v-model="data.form.TRAINING_TEACHER"
maxlength="255"
placeholder="这里输入培训教师"
/>
</el-form-item>
<el-form-item label="经费保障" prop="FUND_GUARANTEE">
<el-input
v-model="data.form.FUND_GUARANTEE"
maxlength="255"
placeholder="这里输入经费保障"
/>
</el-form-item>
<el-form-item label="质量评估" prop="QUALITY_ASSESSMENT">
<el-input
v-model="data.form.QUALITY_ASSESSMENT"
maxlength="255"
placeholder="这里输入质量评估"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"></el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { useVModels } from "@vueuse/core";
import {
getArchivesTrainingSchedule,
addArchivesTrainingSchedule,
editArchivesTrainingSchedule,
} from "@/request/archives.js";
const props = defineProps({
visible: {
type: Boolean,
required: true,
},
type: {
type: String,
required: true,
},
studyTaskId: {
type: String,
required: true,
},
TRAININGSCHEDULE_ID: {
type: String,
required: false,
default: "",
},
});
const { visible, type, studyTaskId, TRAININGSCHEDULE_ID } = useVModels(props);
const emits = defineEmits(["update:visible", "getData"]);
const data = reactive({
form: {
TRAININGSCHEDULE_ID: undefined,
ORGANIZATION_DEPARTMENT: undefined,
TRAINING_DATE: undefined,
TRAINING_TIME: undefined,
TRAINING_CONTENT: undefined,
TRAINING_METHODS: undefined,
TRAINING_OBJECT: undefined,
ASSESSMENT_METHOD: undefined,
PLACE: undefined,
TRAINING_TEACHER: undefined,
FUND_GUARANTEE: undefined,
QUALITY_ASSESSMENT: undefined,
STUDYTASK_ID: studyTaskId.value,
},
});
const rules = {};
const formRef = ref(null);
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const params = Object.assign({}, data.form);
let respData;
if (type.value === "add") {
respData = await addArchivesTrainingSchedule(params);
} else if (type.value === "edit") {
respData = await editArchivesTrainingSchedule(params);
}
if (respData && respData.result === "success") {
emits("getData");
fnClose();
}
},
{ atBegin: true }
);
const fnClose = () => {
emits("update:visible", false);
};
const fnGetData = async () => {
if (
TRAININGSCHEDULE_ID &&
TRAININGSCHEDULE_ID.value &&
TRAININGSCHEDULE_ID.value.length > 0
) {
const respData = await getArchivesTrainingSchedule({
TRAININGSCHEDULE_ID: TRAININGSCHEDULE_ID.value,
});
if (respData && respData.pd) {
data.form = respData.pd;
}
}
};
await fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -90,7 +90,7 @@
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="140">
<template v-slot>
<template v-slot="{ row }">
<el-button
type="primary"
text
@ -100,6 +100,7 @@
path: '/archives/semester/catalogue',
query: {
source: 'semester',
studyTaskId: row.STUDYTASK_ID,
},
})
"
@ -152,3 +153,5 @@ const fnCompareDate = (row) => {
}
};
</script>
<style scoped lang="scss"></style>

View File

@ -1,117 +1,130 @@
<template>
<el-dialog v-model="visible" title="人员登记表" :before-close="fnClose">
<el-button type="primary">打印</el-button>
<el-button type="primary" v-print="'#printContent'"></el-button>
<br /><br />
<el-descriptions title="生产经营单位新入职从业人员登记表" :column="2">
<el-descriptions-item label="生产经营单位名称(盖章):">
{{ CORP_NAME }}
</el-descriptions-item>
<el-descriptions-item label="档案编号:">
<!-- todo 原项目是空的 -->
</el-descriptions-item>
</el-descriptions>
<el-descriptions :column="2" border>
<el-descriptions-item label="姓名">
{{ data.userInfo.NAME }}
</el-descriptions-item>
<el-descriptions-item label="性别">
{{ data.userInfo.SEX_NAME }}
</el-descriptions-item>
<!-- <el-descriptions-item label="" :span="2">-->
<!-- <img-->
<!-- v-if="data.userInfo.USERAVATARURL_CONVERT"-->
<!-- :src="-->
<!-- data.userInfo.USERAVATARPREFIX + data.userInfo.USERAVATARURL_CONVERT-->
<!-- "-->
<!-- alt="头像"-->
<!-- />-->
<!-- </el-descriptions-item>-->
<el-descriptions-item label="民族">
{{ data.userInfo.NATION_NAME }}
</el-descriptions-item>
<el-descriptions-item label="政治面貌">
{{ data.userInfo.POLITICAL_OUTLOOK_NAME }}
</el-descriptions-item>
<el-descriptions-item label="文化程度">
{{ data.userInfo.DEGREE_OF_EDUCATION_NAME }}
</el-descriptions-item>
<el-descriptions-item label="健康状况">
<!-- todo 原项目是空的 -->
</el-descriptions-item>
<el-descriptions-item label="出生年月">
{{ data.userInfo.DATE_OF_BIRTH }}
</el-descriptions-item>
<el-descriptions-item label="身份证号">
{{ data.userInfo.USER_ID_CARD }}
</el-descriptions-item>
</el-descriptions>
<el-descriptions :column="2" border>
<el-descriptions-item label="毕业院校及专业">
<!-- todo 原项目是空的 -->
</el-descriptions-item>
<el-descriptions-item label="职务/职称">
{{ data.userInfo.DUTIES_NAME }}
</el-descriptions-item>
<el-descriptions-item label="户籍所在地">
<!-- todo 原项目是空的 -->
</el-descriptions-item>
<el-descriptions-item label="参加工作时间">
{{ data.userInfo.WORKING_DATE }}
</el-descriptions-item>
<el-descriptions-item label="进入本单位时间">
{{ data.userInfo.ENTRY_DATE }}
</el-descriptions-item>
<el-descriptions-item label="入职部门">
{{ data.userInfo.DEPARTMENT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="岗位名称">
{{ data.userInfo.POST_NAME }}
</el-descriptions-item>
<el-descriptions-item label="之前从事本岗位时间">
<!-- todo 原项目是空的 -->
</el-descriptions-item>
</el-descriptions>
<el-descriptions :column="1" border>
<el-descriptions-item label="主要工作经历">
<!-- todo 原项目是空的 -->
</el-descriptions-item>
<el-descriptions-item
label="入职前接受安全培训和考核以及取得安全培训有关的岗位证书等情况"
>
<!-- todo 原项目是空的 -->
</el-descriptions-item>
<el-descriptions-item
label="入职前受过何种有关安全生产的处罚以及是否受到刑事处罚"
>
<!-- todo 原项目是空的 -->
</el-descriptions-item>
<el-descriptions-item label="入职统计表相关信息核定情况">
<div>
<p>
入职人承诺:以上信息已经本人核实信息真实有效完整如有虚假或欺骗等行为自愿承担相应的法律责任.
</p>
<div class="flex">
<p>入职人(签字并按指纹)</p>
<p>
承诺日期<span style="padding-left: 40px"></span
><span style="padding-left: 20px"></span
><span style="padding-left: 20px"></span>
</p>
<div id="printContent">
<div style="text-align: center">
<el-text size="large">生产经营单位新入职从业人员登记表</el-text>
</div>
<el-descriptions :column="2">
<el-descriptions-item label="生产经营单位名称(盖章):">
{{ CORP_NAME }}
</el-descriptions-item>
<el-descriptions-item label="档案编号:">
<!-- todo 原项目是空的 -->
</el-descriptions-item>
</el-descriptions>
<el-row>
<el-col :span="20">
<el-descriptions :column="2" border>
<el-descriptions-item label="姓名">
{{ data.userInfo.NAME }}
</el-descriptions-item>
<el-descriptions-item label="性别">
{{ data.userInfo.SEX_NAME }}
</el-descriptions-item>
<el-descriptions-item label="民族">
{{ data.userInfo.NATION_NAME }}
</el-descriptions-item>
<el-descriptions-item label="政治面貌">
{{ data.userInfo.POLITICAL_OUTLOOK_NAME }}
</el-descriptions-item>
<el-descriptions-item label="文化程度">
{{ data.userInfo.DEGREE_OF_EDUCATION_NAME }}
</el-descriptions-item>
<el-descriptions-item label="健康状况">
<!-- todo 原项目是空的 -->
</el-descriptions-item>
<el-descriptions-item label="出生年月">
{{ data.userInfo.DATE_OF_BIRTH }}
</el-descriptions-item>
<el-descriptions-item label="身份证号">
{{ data.userInfo.USER_ID_CARD }}
</el-descriptions-item>
</el-descriptions>
</el-col>
<el-col :span="4">
<div style="width: 152px; height: 160px">
<img
v-if="data.userInfo.USERAVATARURL_CONVERT"
:src="
data.userInfo.USERAVATARPREFIX +
data.userInfo.USERAVATARURL_CONVERT
"
alt="头像"
style="width: 100%; height: 100%"
/>
</div>
</div>
<div>
<p>生产经营单位核查意见</p>
<div class="flex">
<p>核查人员(签字)</p>
</el-col>
</el-row>
<el-descriptions :column="2" border>
<el-descriptions-item label="毕业院校及专业">
<!-- todo 原项目是空的 -->
</el-descriptions-item>
<el-descriptions-item label="职务/职称">
{{ data.userInfo.DUTIES_NAME }}
</el-descriptions-item>
<el-descriptions-item label="户籍所在地">
<!-- todo 原项目是空的 -->
</el-descriptions-item>
<el-descriptions-item label="参加工作时间">
{{ data.userInfo.WORKING_DATE }}
</el-descriptions-item>
<el-descriptions-item label="进入本单位时间">
{{ data.userInfo.ENTRY_DATE }}
</el-descriptions-item>
<el-descriptions-item label="入职部门">
{{ data.userInfo.DEPARTMENT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="岗位名称">
{{ data.userInfo.POST_NAME }}
</el-descriptions-item>
<el-descriptions-item label="之前从事本岗位时间">
<!-- todo 原项目是空的 -->
</el-descriptions-item>
</el-descriptions>
<el-descriptions :column="1" border>
<el-descriptions-item label="主要工作经历">
<!-- todo 原项目是空的 -->
</el-descriptions-item>
<el-descriptions-item
label="入职前接受安全培训和考核以及取得安全培训有关的岗位证书等情况"
>
<!-- todo 原项目是空的 -->
</el-descriptions-item>
<el-descriptions-item
label="入职前受过何种有关安全生产的处罚以及是否受到刑事处罚"
>
<!-- todo 原项目是空的 -->
</el-descriptions-item>
<el-descriptions-item label="入职统计表相关信息核定情况">
<div>
<p>
核查日期<span style="padding-left: 40px"></span
><span style="padding-left: 20px"></span
><span style="padding-left: 20px"></span>
入职人承诺:以上信息已经本人核实信息真实有效完整如有虚假或欺骗等行为自愿承担相应的法律责任.
</p>
<div class="flex">
<p>入职人(签字并按指纹)</p>
<p>
承诺日期<span style="padding-left: 40px"></span
><span style="padding-left: 20px"></span
><span style="padding-left: 20px"></span>
</p>
</div>
</div>
</div>
</el-descriptions-item>
</el-descriptions>
<div>
<p>生产经营单位核查意见</p>
<div class="flex">
<p>核查人员(签字)</p>
<p>
核查日期<span style="padding-left: 40px"></span
><span style="padding-left: 20px"></span
><span style="padding-left: 20px"></span>
</p>
</div>
</div>
</el-descriptions-item>
</el-descriptions>
</div>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>

View File

@ -2,308 +2,353 @@
<div>
<el-descriptions title="学时证明" :column="1">
<template #extra>
<el-button type="primary" size="small">打印</el-button>
<el-button type="primary" v-print="'#printContent'" size="small">
打印
</el-button>
</template>
<el-descriptions-item label="证书编号:"> </el-descriptions-item>
</el-descriptions>
<el-descriptions :column="1" border>
<el-descriptions-item label="姓名">
{{ data.userInfo.NAME }}
</el-descriptions-item>
<el-descriptions-item label="证件类型"> 身份证 </el-descriptions-item>
<el-descriptions-item label="证件编号">
{{ data.userInfo.USER_ID_CARD }}
</el-descriptions-item>
<el-descriptions-item label="培训单位名称">
{{ CORP_NAME }}
</el-descriptions-item>
<el-descriptions-item label="任务名称">
{{ data.studyTaskInfo.STUDY_NAME }}
</el-descriptions-item>
<el-descriptions-item label="培训日期">
{{ data.studyTaskInfo.PEIXUE_START_TIME }}
{{ data.studyTaskInfo.PEIXUE_END_TIME }}
</el-descriptions-item>
<el-descriptions-item label="培训类型">
{{ data.studyTaskInfo.train_type_name }}
</el-descriptions-item>
<el-descriptions-item label="视频学习时长">
{{ video_class_hours }}分钟(包含{{ video_count }}个视频)
</el-descriptions-item>
<el-descriptions-item label="资料学习时长">
{{ data_class_hours }}分钟(包含{{ data_count }}个资料)
</el-descriptions-item>
<el-descriptions-item label="合计学习时长">
{{ video_class_hours + data_class_hours }}分钟
</el-descriptions-item>
<el-descriptions-item>
<template #label>
培训单位:(盖章) 日期: {{ fnGetCurrentDay() }}
<div id="printContent">
<div class="print_use">
<div style="text-align: right">
<span>档案编号</span>
</div>
<div
style="
font-size: 30px;
font-weight: 700;
text-align: center;
padding-top: 100px;
"
>
<span>生产经营单位从业人员安全培训档案</span>
</div>
<div style="width: 300px; margin: auto; padding-top: 400px">
<div>
<span
style="
text-align: justify;
text-align-last: justify;
width: 64px;
display: inline-block;
"
>
姓名
</span>
<span>{{ data.userInfo.NAME }}</span>
</div>
<div style="padding-top: 20px">
<span style="width: 64px; display: inline-block">身份证号</span>
<span>{{ data.userInfo.USER_ID_CARD }}</span>
</div>
<div style="padding-top: 20px">
<span style="width: 64px; display: inline-block">建档日期</span>
<span>{{ fnGetCurrentDay() }}</span>
</div>
<div style="padding-top: 20px">单位名称公章</div>
</div>
</div>
<div>
<span style="color: white">证书编号:</span>
</div>
<el-descriptions :column="1" border>
<el-descriptions-item label="姓名">
{{ data.userInfo.NAME }}
</el-descriptions-item>
<el-descriptions-item label="证件类型">身份证</el-descriptions-item>
<el-descriptions-item label="证件编号">
{{ data.userInfo.USER_ID_CARD }}
</el-descriptions-item>
<el-descriptions-item label="培训单位名称">
{{ CORP_NAME }}
</el-descriptions-item>
<el-descriptions-item label="任务名称">
{{ data.studyTaskInfo.STUDY_NAME }}
</el-descriptions-item>
<el-descriptions-item label="培训日期">
{{ data.studyTaskInfo.PEIXUE_START_TIME }}
{{ data.studyTaskInfo.PEIXUE_END_TIME }}
</el-descriptions-item>
<el-descriptions-item label="培训类型">
{{ data.studyTaskInfo.train_type_name }}
</el-descriptions-item>
<el-descriptions-item label="视频学习时长">
{{ video_class_hours }}分钟(包含{{ video_count }}个视频)
</el-descriptions-item>
<el-descriptions-item label="资料学习时长">
{{ data_class_hours }}分钟(包含{{ data_count }}个资料)
</el-descriptions-item>
<el-descriptions-item label="合计学习时长">
{{ video_class_hours + data_class_hours }}分钟
</el-descriptions-item>
<el-descriptions-item>
<template #label>
培训单位:(盖章) 日期: {{ fnGetCurrentDay() }}
</template>
</el-descriptions-item>
</el-descriptions>
<br />
<el-descriptions title="课程资料" :column="2">
<el-descriptions-item label="姓名:">
{{ data.userInfo.NAME }}
</el-descriptions-item>
<el-descriptions-item label="身份证号:">
{{ data.userInfo.USER_ID_CARD }}
</el-descriptions-item>
</el-descriptions>
<layout-table :data="data.curriculumList" :show-pagination="false">
<el-table-column label="任务名称">
<el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ serialNumber({ currentPage: 1, pageSize: 99999 }, $index) }}
</template>
</el-table-column>
</el-table-column>
<el-table-column :label="data.studyTaskInfo.STUDY_NAME">
<el-table-column prop="COURSEWARENAME" label="课程内容" />
<el-table-column prop="CLASSHOUR" label="课时">
<template v-slot="{ row }">
{{ (row.CLASSHOUR / 45).toFixed(2) }}
</template>
</el-table-column>
<el-table-column prop="SPEAKER" label="讲师" />
</el-table-column>
</layout-table>
<el-descriptions title="考卷详情" :column="2" />
<div style="text-align: center; color: white">
<h3>{{ data.paper.info.EXAMNAME }}</h3>
<span>(满分:{{ data.paper.info.EXAMSCORE || 0 }})</span>
</div>
<el-descriptions :column="2">
<el-descriptions-item label="任务名称:">
{{ data.studyTaskInfo.STUDY_NAME }}
</el-descriptions-item>
<el-descriptions-item label="姓名:">
{{ data.userInfo.NAME }}
</el-descriptions-item>
<el-descriptions-item label="考试时间:">
{{ data.paper.info.OPERATTIME }}
</el-descriptions-item>
<el-descriptions-item label="分数:">
{{ data.examScore.userSecond[0] }}
</el-descriptions-item>
</el-descriptions>
<div v-if="data.paper.selectList.length > 0" style="color: white">
<el-divider content-position="left">单选题</el-divider>
<template
v-for="(item, index) in data.paper.selectList"
:key="item.QUESTION_ID"
>
<el-row>
<el-col :span="24">
{{ index + 1 }}.{{ item.QUESTIONDRY }} 选择答案[{{
data.paper.isExam === "1" ? item.ANSWER : ""
}}]
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="4">A.{{ item.OPTIONA }}</el-col>
<el-col :span="4">B.{{ item.OPTIONB }}</el-col>
<el-col :span="4">C.{{ item.OPTIONC }}</el-col>
<el-col :span="4">D.{{ item.OPTIOND }}</el-col>
<el-col :span="4">
参考答案:{{
data.paper.isExam === "1" ? item.ANSWERRIGHT : item.ANSWER
}}
</el-col>
</el-row>
<el-divider border-style="dashed" />
</template>
</el-descriptions-item>
</el-descriptions>
</div>
<div v-if="data.paper.multiList.length > 0" style="color: white">
<el-divider content-position="left">多选题</el-divider>
<template
v-for="(item, index) in data.paper.multiList"
:key="item.QUESTION_ID"
>
<el-row>
<el-col :span="24">
{{ index + 1 }}.{{ item.QUESTIONDRY }} 选择答案[{{
data.paper.isExam === "1" ? item.ANSWER : ""
}}]
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="4">A.{{ item.OPTIONA }}</el-col>
<el-col :span="4">B.{{ item.OPTIONB }}</el-col>
<el-col :span="4">C.{{ item.OPTIONC }}</el-col>
<el-col :span="4">D.{{ item.OPTIOND }}</el-col>
<el-col :span="4">
参考答案:{{
data.paper.isExam === "1" ? item.ANSWERRIGHT : item.ANSWER
}}
</el-col>
</el-row>
<el-divider border-style="dashed" />
</template>
</div>
<div v-if="data.paper.judgeList.length > 0" style="color: white">
<el-divider content-position="left">判断题</el-divider>
<template
v-for="(item, index) in data.paper.judgeList"
:key="item.QUESTION_ID"
>
<el-row>
<el-col :span="24">
{{ index + 1 }}.{{ item.QUESTIONDRY }} 选择答案[{{
data.paper.isExam === "1" ? item.ANSWER : ""
}}]
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="4">A.{{ item.OPTIONA }}</el-col>
<el-col :span="4">B.{{ item.OPTIONB }}</el-col>
<el-col :span="4">
参考答案:{{
data.paper.isExam === "1" ? item.ANSWERRIGHT : item.ANSWER
}}
</el-col>
</el-row>
<el-divider border-style="dashed" />
</template>
</div>
<br />
<br />
<el-descriptions title="课程资料" :column="2">
<el-descriptions-item label="姓名:">
{{ data.userInfo.NAME }}
</el-descriptions-item>
<el-descriptions-item label="身份证号:">
{{ data.userInfo.USER_ID_CARD }}
</el-descriptions-item>
</el-descriptions>
<layout-table :data="data.curriculumList" :show-pagination="false">
<el-table-column label="任务名称">
<el-descriptions title="培训考核记录" :column="5" />
<div style="text-align: center; color: white">
<h4>
{{ data.studyTaskInfo.train_type_name }}生产经营单位{{
data.studyTaskInfo.post_type_name
}}安全培训考核记录
</h4>
</div>
<el-descriptions :column="2">
<el-descriptions-item label="生产经营单位或安全生产管理机构名称:(盖章)">
<!-- todo 原项目为空 -->
</el-descriptions-item>
<el-descriptions-item label="档案编号:">
<!-- todo 原项目为空 -->
</el-descriptions-item>
</el-descriptions>
<el-descriptions :column="5" border>
<el-descriptions-item label="姓名">
{{ data.userInfo.NAME }}
</el-descriptions-item>
<el-descriptions-item label="性别">
{{ data.userInfo.SEX_NAME }}
</el-descriptions-item>
<el-descriptions-item label="身份证">
{{ data.userInfo.USER_ID_CARD }}
</el-descriptions-item>
<el-descriptions-item label="学历">
{{ data.userInfo.DEGREE_OF_EDUCATION_NAME }}
</el-descriptions-item>
<el-descriptions-item label="专业">
<!-- todo 原项目为空 -->
</el-descriptions-item>
<el-descriptions-item label="职务">
{{ data.userInfo.DUTIES_NAME }}
</el-descriptions-item>
<el-descriptions-item label="部门">
{{ data.userInfo.DEPARTMENT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="工种">
{{ data.userInfo.TYPE_OF_WORK_NAME }}
</el-descriptions-item>
<el-descriptions-item label="行业类别">
{{ data.studyTaskInfo.train_type_name }}
</el-descriptions-item>
<el-descriptions-item label="联系电话">
{{ data.userInfo.USERNAME }}
</el-descriptions-item>
<el-descriptions-item label="人员类型" :span="5">
<el-checkbox-group v-model="data.checkPerType" disabled>
<el-checkbox
v-for="(item, index) in data.personalTypeList"
:key="index"
:label="item.DICTIONARIES_ID"
>{{ item.NAME }}</el-checkbox
>
</el-checkbox-group>
</el-descriptions-item>
</el-descriptions>
<div style="text-align: center; color: white">
<span>安全培训及考核实施情况</span>
</div>
<layout-table
:data="data.curriculumList"
:show-pagination="false"
:span-method="fnMergeCells"
>
<el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ serialNumber({ currentPage: 1, pageSize: 99999 }, $index) }}
</template>
</el-table-column>
</el-table-column>
<el-table-column :label="data.studyTaskInfo.STUDY_NAME">
<el-table-column prop="COURSEWARENAME" label="课程内容" />
<el-table-column prop="CLASSHOUR" label="课时">
<el-table-column label="培训时间">
<template v-slot>
{{ data.studyTaskInfo.PEIXUE_START_TIME }}
{{ data.studyTaskInfo.PEIXUE_END_TIME }}
</template>
</el-table-column>
<el-table-column label="培训地点">
<template v-slot></template>
</el-table-column>
<el-table-column prop="COURSEWARENAME" label="培训主要内容" />
<el-table-column label="学时">
<template v-slot="{ row }">
{{ (row.CLASSHOUR / 45).toFixed(2) }}
</template>
</el-table-column>
<el-table-column prop="SPEAKER" label="讲师" />
</el-table-column>
</layout-table>
<el-descriptions title="考卷详情" :column="2" />
<div style="text-align: center; color: white">
<h3>{{ data.paper.info.EXAMNAME }}</h3>
<span>(满分:{{ data.paper.info.EXAMSCORE || 0 }})</span>
<el-table-column prop="SPEAKER" label="培训教师" />
<el-table-column label="考试成绩">
<template v-slot>{{ data.examScore.userSecond[0] }}</template>
</el-table-column>
<el-table-column label="补考成绩">
<template v-slot>{{ data.examScore.userSecond[1] }}</template>
</el-table-column>
<el-table-column label="本人签字">
<template v-slot>
<img
v-if="data.examScore.USER_SIGN_PATH"
:src="FILE_URL + data.examScore.USER_SIGN_PATH"
style="height: 50px; width: 50px"
alt="本人"
/>
</template>
</el-table-column>
</layout-table>
<el-descriptions :column="4">
<el-descriptions-item label="记录人员(签字):">
<div v-for="(item, index) in data.signList" :key="index">
<img
v-if="item.TYPE === 1 && item.USER_SIGN_FILE_PATH"
:src="FILE_URL + item.USER_SIGN_FILE_PATH"
style="height: 50px; width: 50px"
alt="记录人员"
/>
</div>
</el-descriptions-item>
<el-descriptions-item label="考核人员(签字):">
<div v-for="(item, index) in data.signList" :key="index">
<img
v-if="item.TYPE === 2 && item.USER_SIGN_FILE_PATH"
:src="FILE_URL + item.USER_SIGN_FILE_PATH"
style="height: 50px; width: 50px"
alt="考核人员"
/>
</div>
</el-descriptions-item>
<el-descriptions-item label="安全生产管理机构负责人(签章):">
</el-descriptions-item>
<el-descriptions-item label="归档日期:">
{{ fnGetCurrentDay() }}
</el-descriptions-item>
</el-descriptions>
</div>
<el-descriptions :column="2">
<el-descriptions-item label="任务名称:">
{{ data.studyTaskInfo.STUDY_NAME }}
</el-descriptions-item>
<el-descriptions-item label="姓名:">
{{ data.userInfo.NAME }}
</el-descriptions-item>
<el-descriptions-item label="考试时间:">
{{ data.paper.info.OPERATTIME }}
</el-descriptions-item>
<el-descriptions-item label="分数:">
{{ data.examScore.userSecond[0] }}
</el-descriptions-item>
</el-descriptions>
<div v-if="data.paper.selectList.length > 0" style="color: white">
<el-divider content-position="left">单选题</el-divider>
<template
v-for="(item, index) in data.paper.selectList"
:key="item.QUESTION_ID"
>
<el-row>
<el-col :span="24">
{{ index + 1 }}.{{ item.QUESTIONDRY }} 选择答案[{{
data.paper.isExam === "1" ? item.ANSWER : ""
}}]
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="4">A.{{ item.OPTIONA }}</el-col>
<el-col :span="4">B.{{ item.OPTIONB }}</el-col>
<el-col :span="4">C.{{ item.OPTIONC }}</el-col>
<el-col :span="4">D.{{ item.OPTIOND }}</el-col>
<el-col :span="4">
参考答案:{{
data.paper.isExam === "1" ? item.ANSWERRIGHT : item.ANSWER
}}
</el-col>
</el-row>
<el-divider border-style="dashed" />
</template>
</div>
<div v-if="data.paper.multiList.length > 0" style="color: white">
<el-divider content-position="left">多选题</el-divider>
<template
v-for="(item, index) in data.paper.multiList"
:key="item.QUESTION_ID"
>
<el-row>
<el-col :span="24">
{{ index + 1 }}.{{ item.QUESTIONDRY }} 选择答案[{{
data.paper.isExam === "1" ? item.ANSWER : ""
}}]
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="4">A.{{ item.OPTIONA }}</el-col>
<el-col :span="4">B.{{ item.OPTIONB }}</el-col>
<el-col :span="4">C.{{ item.OPTIONC }}</el-col>
<el-col :span="4">D.{{ item.OPTIOND }}</el-col>
<el-col :span="4">
参考答案:{{
data.paper.isExam === "1" ? item.ANSWERRIGHT : item.ANSWER
}}
</el-col>
</el-row>
<el-divider border-style="dashed" />
</template>
</div>
<div v-if="data.paper.judgeList.length > 0" style="color: white">
<el-divider content-position="left">判断题</el-divider>
<template
v-for="(item, index) in data.paper.judgeList"
:key="item.QUESTION_ID"
>
<el-row>
<el-col :span="24">
{{ index + 1 }}.{{ item.QUESTIONDRY }} 选择答案[{{
data.paper.isExam === "1" ? item.ANSWER : ""
}}]
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="4">A.{{ item.OPTIONA }}</el-col>
<el-col :span="4">B.{{ item.OPTIONB }}</el-col>
<el-col :span="4">
参考答案:{{
data.paper.isExam === "1" ? item.ANSWERRIGHT : item.ANSWER
}}
</el-col>
</el-row>
<el-divider border-style="dashed" />
</template>
</div>
<br />
<el-descriptions title="培训考核记录" :column="5" />
<div style="text-align: center; color: white">
<h4>
{{ data.studyTaskInfo.train_type_name }}生产经营单位{{
data.studyTaskInfo.post_type_name
}}安全培训考核记录
</h4>
</div>
<el-descriptions :column="2">
<el-descriptions-item label="生产经营单位或安全生产管理机构名称:(盖章)">
<!-- todo 原项目为空 -->
</el-descriptions-item>
<el-descriptions-item label="档案编号:">
<!-- todo 原项目为空 -->
</el-descriptions-item>
</el-descriptions>
<el-descriptions :column="5" border>
<el-descriptions-item label="姓名">
{{ data.userInfo.NAME }}
</el-descriptions-item>
<el-descriptions-item label="性别">
{{ data.userInfo.SEX_NAME }}
</el-descriptions-item>
<el-descriptions-item label="身份证">
{{ data.userInfo.USER_ID_CARD }}
</el-descriptions-item>
<el-descriptions-item label="学历">
{{ data.userInfo.DEGREE_OF_EDUCATION_NAME }}
</el-descriptions-item>
<el-descriptions-item label="专业">
<!-- todo 原项目为空 -->
</el-descriptions-item>
<el-descriptions-item label="职务">
{{ data.userInfo.DUTIES_NAME }}
</el-descriptions-item>
<el-descriptions-item label="部门">
{{ data.userInfo.DEPARTMENT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="工种">
{{ data.userInfo.TYPE_OF_WORK_NAME }}
</el-descriptions-item>
<el-descriptions-item label="行业类别">
{{ data.studyTaskInfo.train_type_name }}
</el-descriptions-item>
<el-descriptions-item label="联系电话">
{{ data.userInfo.USERNAME }}
</el-descriptions-item>
<el-descriptions-item label="人员类型" :span="5">
<el-checkbox-group v-model="data.checkPerType" disabled>
<el-checkbox
v-for="(item, index) in data.personalTypeList"
:key="index"
:label="item.DICTIONARIES_ID"
>{{ item.NAME }}</el-checkbox
>
</el-checkbox-group>
</el-descriptions-item>
</el-descriptions>
<div style="text-align: center; color: white">
<span>安全培训及考核实施情况</span>
</div>
<layout-table
:data="data.curriculumList"
:show-pagination="false"
:span-method="fnMergeCells"
>
<el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ serialNumber({ currentPage: 1, pageSize: 99999 }, $index) }}
</template>
</el-table-column>
<el-table-column label="培训时间">
<template v-slot>
{{ data.studyTaskInfo.PEIXUE_START_TIME }}
{{ data.studyTaskInfo.PEIXUE_END_TIME }}
</template>
</el-table-column>
<el-table-column label="培训地点">
<template v-slot></template>
</el-table-column>
<el-table-column prop="COURSEWARENAME" label="培训主要内容" />
<el-table-column label="学时">
<template v-slot="{ row }">
{{ (row.CLASSHOUR / 45).toFixed(2) }}
</template>
</el-table-column>
<el-table-column prop="SPEAKER" label="培训教师" />
<el-table-column label="考试成绩">
<template v-slot>{{ data.examScore.userSecond[0] }}</template>
</el-table-column>
<el-table-column label="补考成绩">
<template v-slot>{{ data.examScore.userSecond[1] }}</template>
</el-table-column>
<el-table-column label="本人签字">
<template v-slot>
<img
v-if="data.examScore.USER_SIGN_PATH"
:src="FILE_URL + data.examScore.USER_SIGN_PATH"
style="height: 50px; width: 50px"
alt="本人"
/>
</template>
</el-table-column>
</layout-table>
<el-descriptions :column="4">
<el-descriptions-item label="记录人员(签字):">
<div v-for="(item, index) in data.signList" :key="index">
<img
v-if="item.TYPE === 1 && item.USER_SIGN_FILE_PATH"
:src="FILE_URL + item.USER_SIGN_FILE_PATH"
style="height: 50px; width: 50px"
alt="记录人员"
/>
</div>
</el-descriptions-item>
<el-descriptions-item label="考核人员(签字):">
<div v-for="(item, index) in data.signList" :key="index">
<img
v-if="item.TYPE === 2 && item.USER_SIGN_FILE_PATH"
:src="FILE_URL + item.USER_SIGN_FILE_PATH"
style="height: 50px; width: 50px"
alt="考核人员"
/>
</div>
</el-descriptions-item>
<el-descriptions-item label="安全生产管理机构负责人(签章):">
</el-descriptions-item>
<el-descriptions-item label="归档日期:">
{{ fnGetCurrentDay() }}
</el-descriptions-item>
</el-descriptions>
</div>
</template>
@ -311,7 +356,7 @@
import {
getStudyTaskInfo,
getUserInfo,
getCurriculums,
getAllCourseware,
getArchivesPaper,
getSignByStudyTask,
getUserExamScoreByStudyTaskId,
@ -349,7 +394,7 @@ const data = reactive({
examScore: {
USER_SIGN_PATH: "",
userExamScore: {},
userSecond: [0, 0], // todo
userSecond: [0, 0],
},
});
@ -409,13 +454,13 @@ const fnGetStudyTaskInfo = async () => {
};
await fnGetStudyTaskInfo();
const fnGetCurriculums = async () => {
const respData = await getCurriculums({ STUDYTASK_ID });
const fnGetAllCourseware = async () => {
const respData = await getAllCourseware({ STUDYTASK_ID });
if (respData && respData.varList) {
data.curriculumList = respData.varList;
}
};
await fnGetCurriculums();
await fnGetAllCourseware();
const fnGetUserInfo = async () => {
const respData = await getUserInfo({ USER_ID });
@ -469,6 +514,15 @@ const fnGetUserExamScoreByStudyTaskId = async () => {
if (respData) {
data.examScore.USER_SIGN_PATH = respData.USER_SIGN_PATH;
data.examScore.userExamScore = respData.userExamScore;
if (
data.examScore.userExamScore &&
Object.keys(data.examScore.userExamScore).length > 0
) {
const user_score = data.examScore.userExamScore[USER_ID];
if (user_score && user_score.indexOf(",") > -1) {
data.examScore.userSecond = user_score.split(",");
}
}
}
};
await fnGetUserExamScoreByStudyTaskId();