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

pull/1/head
chenxinying 2024-01-12 09:56:35 +08:00
commit 8dd359b08f
55 changed files with 5189 additions and 1074 deletions

View File

@ -243,6 +243,68 @@ export default [
component:
"hazard_investigation/inventory_management/insurance_coverage",
},
{
path: "/hazard_investigation/inventory_management/add",
meta: {
title: "新增",
activeMenu: "/hazard_investigation/inventory_management",
},
component: "hazard_investigation/inventory_management/add",
},
{
path: "/hazard_investigation/inventory_management/edit",
meta: {
title: "修改",
activeMenu: "/hazard_investigation/inventory_management",
},
component: "hazard_investigation/inventory_management/add",
},
{
path: "/hazard_investigation/inventory_management/inheritance_list",
meta: {
title: "继承清单",
activeMenu: "/hazard_investigation/inventory_management",
},
component: "hazard_investigation/inventory_management/add",
},
],
},
{
path: "/hazard_investigation/delete_inventory_management",
meta: { title: "删除清单管理", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "hazard_investigation/delete_inventory_management/index",
},
{
path: "/hazard_investigation/delete_inventory_management/view",
meta: {
title: "查看",
activeMenu: "/hazard_investigation/delete_inventory_management",
},
component: "hazard_investigation/delete_inventory_management/view",
},
],
},
{
path: "/hazard_investigation/inventory_troubleshooting",
meta: { title: "清单排查", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "hazard_investigation/inventory_troubleshooting/index",
},
{
path: "/hazard_investigation/inventory_troubleshooting/inspect",
meta: {
title: "开始检查",
activeMenu: "/hazard_investigation/inventory_troubleshooting",
},
component: "hazard_investigation/inventory_troubleshooting/inspect",
},
],
},
],
@ -311,7 +373,7 @@ export default [
{
path: "/platform_resource_library/curriculum/view",
meta: {
title: "课程详情查看",
title: "查看详情",
activeMenu: "/platform_resource_library/curriculum/list",
},
component: "platform_resource_library/curriculum/view",
@ -330,7 +392,7 @@ export default [
{
path: "/platform_resource_library/paper/view",
meta: {
title: "试卷详情查看",
title: "查看试卷",
activeMenu: "/platform_resource_library/paper/list",
},
component: "platform_resource_library/paper/view",
@ -339,6 +401,62 @@ export default [
},
],
},
{
path: "/online_learn_exam",
redirect: "/online_learn_exam/courseware",
meta: { title: "在线学习与考试", model: MODEL["2"] },
component: "children",
children: [
{
path: "/online_learn_exam/courseware",
redirect: "/online_learn_exam/courseware/video",
meta: { title: "课件管理" },
component: "children",
children: [
{
path: "/online_learn_exam/courseware/video",
meta: { title: "视频课件维护", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "online_learn_exam/courseware/video/index",
},
{
path: "/online_learn_exam/courseware/video/question_list",
meta: {
title: "课件习题",
activeMenu: "/online_learn_exam/courseware/video",
},
component:
"online_learn_exam/courseware/question/question_list",
},
],
},
{
path: "/online_learn_exam/courseware/data",
meta: { title: "资料课件维护", isSubMenu: false },
component: "children",
children: [
{
path: "",
component: "online_learn_exam/courseware/data/index",
},
{
path: "/online_learn_exam/courseware/data/question_list",
meta: {
title: "课件习题",
activeMenu: "/online_learn_exam/courseware/data",
},
component:
"online_learn_exam/courseware/question/question_list",
},
],
},
],
},
],
},
{
path: "/archives",
redirect: "/archives/user",

View File

@ -139,6 +139,34 @@ export const layoutFnGetTroubleshootingType = async () => {
});
return ref(resData.list);
};
// 隐患级别
export const layoutFnGetHazardLevel = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "5e7cf8620ba54ad89719d0be62133c7a",
});
return ref(resData.list);
};
// 隐患类别
export const layoutFnGetHazardCategories = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "ec1d6dcfd0f2438a88968feea542eab0",
});
return ref(resData.list);
};
// 各省隐患类型
export const layoutFnGetEveryProvinceHiddenDangerType = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "3babc15144444bdc8d763d0af2bdfff8",
});
return ref(resData.list);
};
// 排查周期
export const layoutFnGetTroubleshootingCycle = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "f60cf0e8315b4993b6d6049dd29f2ba5",
});
return ref(resData.list);
};
// 清单级别
export const layoutFnGetInventoryLevel = async () => {
const resData = await getLevels({
@ -146,6 +174,13 @@ export const layoutFnGetInventoryLevel = async () => {
});
return ref(resData.list);
};
// 任务类型
export const layoutFnGetTaskType = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "7a1afe8a5e594b6a9e0cef42bd00f352",
});
return ref(resData.list);
};
// 职务
export const layoutFnGetDuties = async () => {
const resData = await getLevelsCorp({

View File

@ -1,11 +1,10 @@
import { ref } from "vue";
export default function usePrint(THEAD_HEIGHT) {
export default function usePrint() {
const buttonRef = ref(null);
const A4_HEIGHT_MM = 297;
const A4_HEIGHT_MM_TO_PX_PROPORTION = 3.78;
let A4_HEIGHT_PX =
A4_HEIGHT_MM * A4_HEIGHT_MM_TO_PX_PROPORTION - THEAD_HEIGHT;
let A4_HEIGHT_PX = A4_HEIGHT_MM * A4_HEIGHT_MM_TO_PX_PROPORTION;
let elements = [];
const printObj = {
id: "printContent",
@ -16,9 +15,9 @@ export default function usePrint(THEAD_HEIGHT) {
const fnPrint = () => {
document.querySelector("#printContent").style.overflow = "visible";
elements = document.querySelectorAll("#printContent > table > tr");
if (!document.querySelector("#printContent > table thead")) {
A4_HEIGHT_PX = A4_HEIGHT_PX + THEAD_HEIGHT;
}
const thead = document.querySelector("#printContent > table thead");
if (thead) A4_HEIGHT_PX = A4_HEIGHT_PX - thead.offsetHeight;
else A4_HEIGHT_PX = A4_HEIGHT_PX + thead.offsetHeight;
fnIsPaging();
buttonRef.value.$el.click();
};

View File

@ -99,7 +99,7 @@ export function ArrayDeduplication(arr) {
* @param {string} name 去重的key
* @return {Array} 去重后的数组
**/
export function ArrayObjectDeduplication(arr, name) {
export function arrayObjectDeduplication(arr, name) {
const obj = {};
arr = arr.reduce(function (previousValue, currentValue) {
if (!obj[currentValue[name]]) {
@ -349,10 +349,7 @@ export function idCardGetDateAndGender(idCard) {
else MonthDate = Month;
if (DayDate < 10) Day = "0" + DayDate;
else Day = DayDate;
sex =
org_gender % 2 === 1
? "998f8531a6254c2eab5c825fa2d9896f"
: "fdd532d9def447cdb68af3a938f6f05c";
sex = org_gender % 2 === 1 ? "1" : "0";
date = birthdays.getFullYear() + "-" + MonthDate + "-" + Day;
}
return { sex, date };

View File

@ -0,0 +1,48 @@
<template>
<el-cascader
ref="cascaderRef"
v-model="modelValue"
:options="hiddenDangerTypeList"
:props="{
value: 'id',
label: 'name',
children: 'nodes',
checkStrictly: true,
}"
/>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
import { getHiddenDangerType } from "@/request/data_dictionary.js";
import { ref } from "vue";
defineOptions({
name: "LayoutHiddenDangerType",
});
const props = defineProps({
modelValue: {
type: [String, Array],
required: true,
default: "",
},
joinSeparator: {
type: String,
default: "/",
},
});
const emits = defineEmits(["update:modelValue"]);
const modelValue = useVModel(props, "modelValue", emits);
const cascaderRef = ref(null);
const getCheckedNodes = () => {
return cascaderRef.value
.getCheckedNodes()[0]
.pathLabels.join(props.joinSeparator);
};
defineExpose({
getCheckedNodes,
});
const hiddenDangerTypeList = await getHiddenDangerType();
</script>
<style scoped lang="scss"></style>

View File

@ -1,8 +1,11 @@
<template>
<el-dialog title="文档" :model-value="visible && model === 'dialog'">
<div v-if="visible && model === 'dialog'">
<el-dialog
title="文档"
:model-value="visible && model === 'dialog'"
@update:model-value="visible = false"
>
<div v-if="visible">
<vue-pdf
ref="pdfRef"
v-for="page in numOfPages"
:key="page"
:src="VITE_FILE_URL + src"
@ -10,9 +13,8 @@
/>
</div>
</el-dialog>
<div v-if="model === 'normal'">
<div v-if="model === 'normal'" :key="src">
<vue-pdf
ref="pdfRef"
v-for="page in numOfPages"
:key="page"
:src="VITE_FILE_URL + src"
@ -49,10 +51,9 @@ const props = defineProps({
});
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);
const pdfRef = ref(null);
const numOfPages = ref(0);
watchEffect(() => {
if (props.visible) {
if (props.visible || props.src) {
const loadingTask = createLoadingTask(VITE_FILE_URL + props.src);
loadingTask.promise
.then((pdf) => {

View File

@ -28,17 +28,13 @@ import usePrint from "@/assets/js/usePrint.js";
defineOptions({
name: "LayoutPrintTablePackage",
});
const props = defineProps({
theadHeight: {
type: Number,
default: 81.59,
},
defineProps({
entrance: {
type: String,
default: "",
},
});
const { fnPrint, printObj, buttonRef } = usePrint(props.theadHeight);
const { fnPrint, printObj, buttonRef } = usePrint();
</script>
<style lang="scss" scoped>

View File

@ -138,10 +138,15 @@ const getSelectionRows = () => {
const clearSelection = () => {
return tableRef.value.clearSelection();
};
const toggleRowSelection = (id, selected) => {
const toggleRowSelection = (value, selected) => {
if (typeof value === "object") {
tableRef.value.toggleRowSelection(value, selected);
return;
}
for (let i = 0; i < props.data.length; i++) {
if (props.data[i][props.rowKey] === id) {
if (props.data[i][props.rowKey] === value) {
tableRef.value.toggleRowSelection(props.data[i], selected);
break;
}
}
};

View File

@ -1,4 +1,7 @@
import { post } from "@/request/axios.js";
import { useUserStore } from "@/pinia/user.js";
import pinia from "@/pinia/index.js";
import { layoutFnGetEveryProvinceHiddenDangerType } from "@/assets/js/data_dictionary.js";
// 获取数据字典
export const getLevels = (params) =>
@ -48,3 +51,24 @@ export const getPostListAll = (params) =>
loading: false,
...params,
});
// 获取用户
export const getUserListAll = (params) =>
post("/user/listAll", {
loading: false,
...params,
});
// 获取当前用户省隐患类型
export const getHiddenDangerType = async () => {
const userStore = useUserStore(pinia);
const { value } = await layoutFnGetEveryProvinceHiddenDangerType();
for (let i = 0; i < value.length; i++) {
if (value[i].BIANMA.indexOf(userStore.getUserInfo.PROVINCE) > -1) {
const resData = await post("/dictionaries/listAllDictToParId", {
parentId: value[i].DICTIONARIES_ID,
loading: false,
});
return JSON.parse(resData.zTreeNodes.replaceAll('"nodes":[],', ""));
}
}
};

View File

@ -20,3 +20,33 @@ export const setInventoryManagementInsuranceCoverageList = (params) =>
post("/labelFactory/termList", params); // 清单管理设置包保责任类型选择列表
export const setInventoryManagementInsuranceCoverageSave = (params) =>
post("/listmanager/saveBaoBaoType", params); // 清单管理设置包保责任类型提交
export const getInventoryManagementInspectionItems = (params) =>
post("/riskcheckitem/itemlistAll", params); // 清单管理检查项列表
export const getInventoryManagementOtherRiskList = (params) =>
post("/riskcheckitem/list", params); // 清单管理选择其他存在风险列表
export const setInventoryManagementAdd = (params) =>
post("/listmanager/add", params); // 清单管理新增
export const setInventoryManagementEdit = (params) =>
post("/listmanager/edit", params); // 清单管理修改
export const getDeleteInventoryManagementList = (params) =>
post("/stoplistmanager/list", params); // 删除清单管理列表
export const setDeleteInventoryManagementRecovery = (params) =>
post("/stoplistmanager/restore", params); // 删除清单管理恢复
export const getInventoryTroubleshootingList = (params) =>
post("/listmanager/checkList", params); // 清单排查列表
export const getInventoryTroubleshootingOtherHiddenList = (params) =>
post("/hidden/getOtherHidden", params); // 清单排查其它隐患列表
export const getHiddenDangerDatabaseList = (params) =>
post("/hiddenLibrary/list", params); // 隐患数据库列表
export const setInventoryTroubleshootingOtherHiddenDangerAdd = (params) =>
post("/hidden/add", params); // 清单排查其它隐患添加
export const getInventoryTroubleshootingOtherHiddenDangerView = (params) =>
post("/hidden/goEdit", params); // 清单排查其它隐患查看
export const setInventoryTroubleshootingOtherHiddenDangerDelete = (params) =>
post("/hidden/delete", params); // 清单排查其它隐患删除
export const setInventoryTroubleshootingOtherHiddenDangerEdit = (params) =>
post("/hidden/edit", params); // 清单排查其它隐患修改
export const setInventoryTroubleshootingOtherHiddenDangerListAdd = (params) =>
post("/hidden/listAdd", params); // 清单排查其它隐患添加
export const setInventoryTroubleshootingSubmit = (params) =>
post("/checkrecord/add", params); // 清单排查提交

View File

@ -0,0 +1,33 @@
import { post, upload } from "@/request/axios.js";
export const getVideoCoursewareList = (params) =>
post("/videocourseware/list", params); // 视频课件维护-获取课件列表
export const editVideoCoursewareState = (params) =>
post("/videocourseware/editState", params); // 视频课件维护-启用/禁用
export const deleteVideoCourseware = (params) =>
post("/videocourseware/delete", params); // 视频课件维护-删除
export const getDataCoursewareList = (params) =>
post("/datacourseware/list", params); // 视频课件维护-获取课件列表
export const editDataCoursewareState = (params) =>
post("/datacourseware/editState", params); // 视频课件维护-启用/禁用
export const deleteDataCourseware = (params) =>
post("/datacourseware/delete", params); // 视频课件维护-删除
export const getQuestionListByCoursewareIdAndType = (params) =>
post("/question/list", params); // 课件管理-视频/资料课件维护-获取课件习题列表
export const deleteQuestion = (params) => post("/question/delete", params); // 课件管理-视频/资料课件维护-删除课件习题
export const deleteQuestionBatch = (params) =>
post("/question/deleteAll", params); // 课件管理-视频/资料课件维护-批量删除课件习题
export const importQuestion = (params) => upload("/question/readExcel", params); // 课件管理-视频/资料课件维护-导入课件习题
export const addQuestion = (params) => upload("/question/add", params); // 课件管理-视频/资料课件维护-新增课件习题
export const editQuestion = (params) => upload("/question/edit", params); // 课件管理-视频/资料课件维护-修改课件习题

View File

@ -1,5 +1,5 @@
<template>
<div>
<layout-card>
<layout-table :data="catalogueList" :show-pagination="false">
<el-table-column show-overflow-tooltip prop="NAME" label="目录" />
<el-table-column label="操作">
@ -19,7 +19,7 @@
:type="data.current.TYPE"
:study-task-id="studyTaskId"
/>
</div>
</layout-card>
</template>
<script setup>
import LayoutTable from "@/components/table/index.vue";

View File

@ -10,12 +10,12 @@
>
<el-space wrap>
<layout-upload
v-model:file-list="data.form.file"
:file-list="[]"
accept=".pdf"
:show-file-list="false"
auto-upload
:http-request="fnUploadArchivesFile"
:limit="1"
:limit="999"
>
<template #tip>只能上传pdf文件</template>
</layout-upload>
@ -104,7 +104,7 @@ const data = reactive({
currentFile: "",
});
const emits = defineEmits(["update:visible"]);
const emits = defineEmits(["update:visible", "update:current"]);
const fnClear = () => {
data.currentFile = "";

View File

@ -14,73 +14,124 @@
<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) }}
<table class="print_use mb-10" style="width: 100%">
<thead>
<tr>
<td colspan="12" style="border: none">
<div class="tc">
<h3>{{ year }}年度培训资金提取和使用情况管理台账</h3>
</div>
<p class="tl">单位名称:{{ CORP_NAME }}</p>
</td>
</tr>
<tr>
<td class="title" rowspan="2">序号</td>
<td class="title" rowspan="2">日期</td>
<td class="title" colspan="9">费用项目</td>
<td class="title" rowspan="2">余额</td>
</tr>
<tr>
<td class="title">提取金额</td>
<td class="title">培训教材教具费</td>
<td class="title">师资费</td>
<td class="title">试卷印制费</td>
<td class="title">外出培训费</td>
<td class="title">教学设备课桌椅等购置维护费</td>
<td class="title">培训活动费</td>
<td class="title">委托活动费</td>
<td class="title">其他与培训有关的直接支出</td>
</tr>
</thead>
<tbody>
<template v-if="data.dataList && data.dataList.length > 0">
<tr v-for="(item, index) in data.dataList" :key="index">
<td class="tc">{{ index + 1 }}</td>
<td class="tc">{{ item.DATE }}</td>
<td class="tc">{{ item.AMOUNT }}</td>
<td class="tc">{{ item.MATERIAL_COST }}</td>
<td class="tc">{{ item.TEACHER_COST }}</td>
<td class="tc">{{ item.PAPER_COST }}</td>
<td class="tc">{{ item.OUTSIDE_COST }}</td>
<td class="tc">{{ item.EQUIPMENT_COST }}</td>
<td class="tc">{{ item.TRAIN_COST }}</td>
<td class="tc">{{ item.ENTRUST_COST }}</td>
<td class="tc">{{ item.OTHER_COST }}</td>
<td class="tc">{{ item.BALANCE }}</td>
</tr>
</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>
</tbody>
</table>
<div class="print_no_use">
<div class="tc">
<h3>{{ year }}年度培训资金提取和使用情况管理台账</h3>
</div>
<p class="mtb-10">单位名称:{{ CORP_NAME }}</p>
<layout-table
:data="data.dataList"
: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>
</div>
<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>
<p class="mt-10">
填表说明:1.将实际发生的费用金额记录在费用项目栏内2.培训提取比例按职工工资1.5%可按季或月提取
</p>
</div>
<div v-html="PRINT_STYLE" />
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
@ -108,6 +159,7 @@ 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";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
@ -136,12 +188,12 @@ const props = defineProps({
const { title, year, type } = useVModels(props);
const data = reactive({
capitalList: [],
dataList: [],
current: undefined,
formVisible: false,
});
const emits = defineEmits(["update:visible"]);
const emits = defineEmits(["update:visible", "update:current"]);
const fnClose = () => {
emits("update:current", undefined);
@ -152,7 +204,7 @@ const fnCurrentChange = (row) => {
};
const fnAddArchivesCapital = () => {
data.capitalList.push({});
data.dataList.push({});
};
const fnDeleteArchivesCapital = async () => {
@ -171,7 +223,7 @@ const fnDeleteArchivesCapital = async () => {
const fnGetArchivesCapitalList = async () => {
const respData = await getArchivesCapitalList({ YEAR: year.value });
if (respData && respData.varList) {
data.capitalList = respData.varList;
data.dataList = respData.varList;
}
};
await fnGetArchivesCapitalList();

View File

@ -12,54 +12,95 @@
<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) }}
<table class="print_use mb-10" style="width: 100%">
<thead>
<tr>
<td colspan="11" style="border: none">
<div class="tc">
<h3>{{ year }}年度安全培训教育管理台账</h3>
</div>
<p class="tl">单位名称:{{ CORP_NAME }}</p>
</td>
</tr>
<tr>
<td class="title">序号</td>
<td class="title">培训时间</td>
<td class="title">培训对象</td>
<td class="title">培训类型</td>
<td class="title">培训内容</td>
<td class="title">参加人数</td>
<td class="title">培训学时</td>
<td class="title">培训地点</td>
<td class="title">培训教师</td>
<td class="title">考核方式</td>
<td class="title">汇总考核情况</td>
</tr>
</thead>
<tbody>
<template v-if="data.dataList && data.dataList.length > 0">
<tr v-for="(item, index) in data.dataList" :key="index">
<td class="tc">{{ index + 1 }}</td>
<td class="tc">{{ item.TRAINING_DATE }}</td>
<td class="tc">{{ item.TRAINING_OBJECT }}</td>
<td class="tc">{{ item.TRAINING_TYPE }}</td>
<td class="tc">{{ item.TRAINING_CONTENT }}</td>
<td class="tc">{{ item.PERSON_NUMBER }}</td>
<td class="tc">{{ item.CLASS_HOURS }}</td>
<td class="tc">{{ item.TRAINING_PLACE }}</td>
<td class="tc">{{ item.TRAINING_TEACHER }}</td>
<td class="tc">{{ item.ASSESSMENT_METHOD }}</td>
<td class="tc">{{ item.ASSESSMENT }}</td>
</tr>
</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>
</tbody>
</table>
<div class="print_no_use">
<div class="tc">
<h3>{{ year }}年度安全培训教育管理台账</h3>
</div>
<p class="mtb-10">单位名称:{{ CORP_NAME }}</p>
<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>
</div>
<div class="flex">
<span>填表人:</span>
<span>填表日期:</span>
</div>
</div>
<div v-html="PRINT_STYLE" />
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
@ -87,6 +128,7 @@ 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";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
@ -120,7 +162,7 @@ const data = reactive({
formVisible: false,
});
const emits = defineEmits(["update:visible"]);
const emits = defineEmits(["update:visible", "update:current"]);
const fnClose = () => {
emits("update:current", undefined);

View File

@ -12,55 +12,98 @@
<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) }}
<table class="print_use mb-10" style="width: 100%">
<thead>
<tr>
<td colspan="12" style="border: none">
<div class="tc">
<h3>{{ year }}年度安全培训教育计划</h3>
</div>
<p class="tl">单位名称:{{ CORP_NAME }}</p>
</td>
</tr>
<tr>
<td class="title">序号</td>
<td class="title">开始时间</td>
<td class="title">结束时间</td>
<td class="title">培训对象</td>
<td class="title">培训教材</td>
<td class="title">培训方式</td>
<td class="title">考核方式</td>
<td class="title">学时</td>
<td class="title">地点</td>
<td class="title">培训教师</td>
<td class="title">经费保障</td>
<td class="title">质量评估</td>
</tr>
</thead>
<tbody>
<template v-if="data.dataList && data.dataList.length > 0">
<tr v-for="(item, index) in data.dataList" :key="index">
<td class="tc">{{ index + 1 }}</td>
<td class="tc">{{ item.START_DATE }}</td>
<td class="tc">{{ item.END_DATE }}</td>
<td class="tc">{{ item.TRAINING_OBJECT }}</td>
<td class="tc">{{ item.TRAINING_MATERIALS }}</td>
<td class="tc">{{ item.TRAINING_METHODS }}</td>
<td class="tc">{{ item.ASSESSMENT_METHOD }}</td>
<td class="tc">{{ item.CLASS_HOURS }}</td>
<td class="tc">{{ item.PLACE }}</td>
<td class="tc">{{ item.TRAINING_TEACHERS }}</td>
<td class="tc">{{ item.FUND_GUARANTEE }}</td>
<td class="tc">{{ item.QUALITY_ASSESSMENT }}</td>
</tr>
</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>
</tbody>
</table>
<div class="print_no_use">
<div class="tc">
<h3>{{ year }}年度安全培训教育计划</h3>
</div>
<p class="mtb-10">单位名称:{{ CORP_NAME }}</p>
<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>
</div>
<div class="flex">
<span>档案管理人员:</span>
<span>更新日期:</span>
</div>
</div>
<div v-html="PRINT_STYLE" />
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
@ -88,6 +131,7 @@ 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";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
@ -121,7 +165,7 @@ const data = reactive({
formVisible: false,
});
const emits = defineEmits(["update:visible"]);
const emits = defineEmits(["update:visible", "update:current"]);
const fnClose = () => {
emits("update:current", undefined);
@ -164,4 +208,10 @@ const fnAddOrUpdate = (row) => {
};
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
.flex {
display: flex;
justify-content: space-between;
width: 80%;
}
</style>

View File

@ -12,42 +12,75 @@
<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) }}
<table class="print_use mb-10" style="width: 100%">
<thead>
<tr>
<td colspan="7" style="border: none">
<div class="tc">
<h3>{{ year }}三岗人员管理台账</h3>
</div>
<p class="tl">单位名称:{{ CORP_NAME }}</p>
</td>
</tr>
<tr>
<td class="title">序号</td>
<td class="title">姓名</td>
<td class="title">岗位/操作项目</td>
<td class="title">电话</td>
<td class="title">证书号</td>
<td class="title">证书有效期限</td>
<td class="title">复训日期</td>
</tr>
</thead>
<tbody>
<template v-if="data.dataList && data.dataList.length > 0">
<tr v-for="(item, index) in data.dataList" :key="index">
<td class="tc">{{ index + 1 }}</td>
<td class="tc">{{ item.NAME }}</td>
<td class="tc">{{ item.POST }}</td>
<td class="tc">{{ item.PHONE }}</td>
<td class="tc">{{ item.CARD_ID }}</td>
<td class="tc">{{ item.EFFECTIVE_DATE }}</td>
<td class="tc">{{ item.RETRAINING }}</td>
</tr>
</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>
</tbody>
</table>
<div class="print_no_use">
<div class="tc mt-10">
<h3>{{ year }}三岗人员管理台账</h3>
</div>
<p class="mtb-10">单位名称:{{ CORP_NAME }}</p>
<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>
</div>
<div class="flex">
<span>档案管理人员:</span>
<span>更新日期:</span>
</div>
</div>
<div v-html="PRINT_STYLE" />
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
@ -75,6 +108,7 @@ 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";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
@ -108,7 +142,7 @@ const data = reactive({
formVisible: false,
});
const emits = defineEmits(["update:visible"]);
const emits = defineEmits(["update:visible", "update:current"]);
const fnClose = () => {
emits("update:current", undefined);
@ -151,4 +185,10 @@ const fnAddOrUpdate = (row) => {
};
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
.flex {
display: flex;
justify-content: space-between;
width: 80%;
}
</style>

View File

@ -12,49 +12,90 @@
<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) }}
<table class="print_use mb-10" style="width: 100%">
<thead>
<tr>
<td colspan="10" style="border: none">
<div class="tc">
<h3>{{ year }}年度本单位师资管理台账</h3>
</div>
<p class="tl">单位名称:{{ CORP_NAME }}</p>
</td>
</tr>
<tr>
<td class="title">序号</td>
<td class="title">姓名</td>
<td class="title">电话</td>
<td class="title">从事本专业工作年限</td>
<td class="title">/兼职</td>
<td class="title">证书编号</td>
<td class="title">考核部门</td>
<td class="title">考核日期</td>
<td class="title">考核结果</td>
<td class="title">备注</td>
</tr>
</thead>
<tbody>
<template v-if="data.dataList && data.dataList.length > 0">
<tr v-for="(item, index) in data.dataList" :key="index">
<td class="tc">{{ index + 1 }}</td>
<td class="tc">{{ item.NAME }}</td>
<td class="tc">{{ item.PHONE }}</td>
<td class="tc">
{{ item.WORK_YEAR ? item.WORK_YEAR + "年" : "" }}
</td>
<td class="tc">{{ item.OCCUPATION }}</td>
<td class="tc">{{ item.CARD_ID }}</td>
<td class="tc">{{ item.ASSESSMENT_DEPT }}</td>
<td class="tc">{{ item.ASSESSMENT_DATE }}</td>
<td class="tc">{{ item.ASSESSMENT_RESULT }}</td>
<td class="tc">{{ item.DESCR }}</td>
</tr>
</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>
</tbody>
</table>
<div class="print_no_use">
<div class="tc">
<h3>{{ year }}年度本单位师资管理台账</h3>
</div>
<p class="mtb-10">单位名称:{{ CORP_NAME }}</p>
<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>
</div>
<div class="flex">
<span>档案管理人员:</span>
<span>更新日期:</span>
</div>
</div>
<div v-html="PRINT_STYLE" />
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
@ -82,6 +123,7 @@ 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";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
@ -115,7 +157,7 @@ const data = reactive({
formVisible: false,
});
const emits = defineEmits(["update:visible"]);
const emits = defineEmits(["update:visible", "update:current"]);
const fnClose = () => {
emits("update:current", undefined);
@ -158,4 +200,10 @@ const fnAddOrUpdate = (row) => {
};
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
.flex {
display: flex;
justify-content: space-between;
width: 80%;
}
</style>

View File

@ -1,26 +1,28 @@
<template>
<div>
<el-form :model="data.form" label-width="80px">
<el-row>
<el-col :span="4">
<el-form-item label="企业名称:" prop="KEYWORDS">
<span style="color: white">{{ CORP_NAME }}</span>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="年份:" prop="YEAR">
<el-date-picker
v-model="data.form.year"
value-format="YYYY"
format="YYYY"
type="year"
clearable
placeholder="请选择年份"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-card>
<el-form :model="data.form" label-width="80px">
<el-row>
<el-col :span="4">
<el-form-item label="企业名称:" prop="KEYWORDS">
<span style="color: white">{{ CORP_NAME }}</span>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="年份:" prop="YEAR">
<el-date-picker
v-model="data.form.year"
value-format="YYYY"
format="YYYY"
type="year"
clearable
placeholder="请选择年份"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<catalogue source="corp" :year="data.form.year" />
</div>
</template>

View File

@ -96,7 +96,7 @@ const data = reactive({
currentFile: "",
});
const emits = defineEmits(["update:visible"]);
const emits = defineEmits(["update:visible", "update:current"]);
const fnClear = () => {
data.currentFile = "";

View File

@ -10,27 +10,26 @@
<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 class="tc">
<h3>{{ CORP_NAME }} {{ data.taskInfo.post_type_name }}</h3>
</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>
<div>
<el-divider content-position="left">
{{ index + 1 }}.{{ item.COURSEWARENAME }}
</el-divider>
<el-descriptions :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>
</div>
</template>
</div>
<template #footer>
@ -80,7 +79,7 @@ const data = reactive({
coursewareList: [],
});
const emits = defineEmits(["update:visible"]);
const emits = defineEmits(["update:visible", "update:current"]);
const fnClose = () => {
emits("update:current", undefined);
@ -111,4 +110,8 @@ const fnGetAllCoursewareByHandout = async () => {
await fnGetAllCoursewareByHandout();
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
.title {
width: 100px;
}
</style>

View File

@ -11,74 +11,104 @@
</el-space>
<br /><br />
<div id="printContent">
<p>单位名称:{{ CORP_NAME }}</p>
<p class="mt-10">任务名称:{{ data.taskInfo.STUDY_NAME }}</p>
<div class="tc">
<h3 class="mt-10">{{ data.paperInfo.EXAMNAME }}</h3>
<p class="mt-10">(满分:{{ data.paperInfo.EXAMSCORE }})</p>
</div>
<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 v-if="data.paperInfo.selectList.length > 0">
<table style="width: 100%">
<thead>
<tr>
<td style="border: none">
<el-divider content-position="left">单选题</el-divider>
</td>
</tr>
</thead>
<tbody>
<tr
v-for="(item, index) in data.paperInfo.selectList"
:key="item.QUESTION_ID"
>
<td style="border: none">
<p class="mt-10">{{ index + 1 }}.{{ item.QUESTIONDRY }}</p>
<el-row class="mt-10">
<el-col :span="2"></el-col>
<el-col :span="22">
<p class="mt-10">A.{{ item.OPTIONA }}</p>
<p class="mt-10">B.{{ item.OPTIONB }}</p>
<p class="mt-10">C.{{ item.OPTIONC }}</p>
<p class="mt-10">D.{{ item.OPTIOND }}</p>
</el-col>
</el-row>
</td>
</tr>
</tbody>
</table>
</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 v-if="data.paperInfo.multiList.length > 0">
<table style="width: 100%">
<thead>
<tr>
<td style="border: none">
<el-divider content-position="left">多选题</el-divider>
</td>
</tr>
</thead>
<tbody>
<tr
v-for="(item, index) in data.paperInfo.multiList"
:key="item.QUESTION_ID"
>
<td style="border: none">
<p class="mt-10">{{ index + 1 }}.{{ item.QUESTIONDRY }}</p>
<el-row class="mt-10">
<el-col :span="2"></el-col>
<el-col :span="22">
<p class="mt-10">A.{{ item.OPTIONA }}</p>
<p class="mt-10">B.{{ item.OPTIONB }}</p>
<p class="mt-10">C.{{ item.OPTIONC }}</p>
<p class="mt-10">D.{{ item.OPTIOND }}</p>
</el-col>
</el-row>
</td>
</tr>
</tbody>
</table>
</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 v-if="data.paperInfo.judgeList.length > 0">
<table style="width: 100%">
<thead>
<tr>
<td style="border: none">
<el-divider content-position="left">判断题</el-divider>
</td>
</tr>
</thead>
<tbody>
<tr
v-for="(item, index) in data.paperInfo.judgeList"
:key="item.QUESTION_ID"
>
<td style="border: none">
<p class="mt-10">{{ index + 1 }}.{{ item.QUESTIONDRY }}</p>
<el-row class="mt-10">
<el-col :span="2"></el-col>
<el-col :span="22">
<p class="mt-10">A.{{ item.OPTIONA }}</p>
<p class="mt-10">B.{{ item.OPTIONB }}</p>
</el-col>
</el-row>
</td>
</tr>
</tbody>
</table>
</template>
</div>
</div>
<div v-html="PRINT_STYLE" />
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
@ -91,6 +121,7 @@ import { getStudyTaskInfo, getPaperByTaskId } from "@/request/archives.js";
import { reactive } from "vue";
import { useVModels } from "@vueuse/core";
import { useUserStore } from "@/pinia/user.js";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const props = defineProps({
title: {
@ -127,7 +158,7 @@ const data = reactive({
},
});
const emits = defineEmits(["update:visible"]);
const emits = defineEmits(["update:visible", "update:current"]);
const fnClose = () => {
emits("update:current", undefined);

View File

@ -10,51 +10,55 @@
<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 class="tc mt-10">
<h3>{{ data.taskInfo.STUDY_NAME }}培训综合考评报告</h3>
</div>
<br />
<el-descriptions :column="2" border>
<el-descriptions-item label="任务名称">
{{ data.taskInfo.STUDY_NAME }}
</el-descriptions-item>
<el-descriptions-item label="培训组织部门"> </el-descriptions-item>
<el-descriptions-item label="培训组织部门"></el-descriptions-item>
<el-descriptions-item label="评估日期">
{{ data.taskInfo.PEIXUE_END_TIME }}
</el-descriptions-item>
<el-descriptions-item label="考核方式"> 考核 </el-descriptions-item>
<el-descriptions-item label="考核方式">考核</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)
}}%
<div class="large-content">
本次培训的主要内容是:{{ curriculums }} 共应参加人数为{{
data.studentList.length
}}, 实际参加培训人数为{{ join_student_list.length }},
参加率为{{
(
(join_student_list.length / data.studentList.length) *
100
).toFixed(2)
}}%
</div>
</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)
}}%
<div class="large-content">
本次通过笔试的方式进行了培训效果考核,考核人数为{{
data.studentList.length
}},考核合格人数为{{ pass_student_list.length }}, 合格率为{{
(
(pass_student_list.length / data.studentList.length) *
100
).toFixed(2)
}}%
</div>
</el-descriptions-item>
<el-descriptions-item label="改进意见建议" :span="2">
<div>1.本次培训的讲师</div>
<div>讲师的语言表达能力应该更加的生动清晰易懂</div>
<div>非常满意</div>
<div>2.本次培训的课程</div>
<div>课程内容应该更加专业可以对我的工作帮助更大</div>
<div>非常满意</div>
<p>1.本次培训的讲师</p>
<p class="mt-10">讲师的语言表达能力应该更加的生动清晰易懂</p>
<p class="mt-10">非常满意</p>
<p class="mt-10">2.本次培训的课程</p>
<p class="mt-10">课程内容应该更加专业可以对我的工作帮助更大</p>
<p class="mt-10">非常满意</p>
</el-descriptions-item>
</el-descriptions>
</div>
<div v-html="PRINT_STYLE" />
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
@ -70,6 +74,7 @@ import {
} from "@/request/archives.js";
import { computed, reactive } from "vue";
import { useVModels } from "@vueuse/core";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const props = defineProps({
title: {
@ -135,7 +140,7 @@ const join_student_list = computed(() => {
return result;
});
const emits = defineEmits(["update:visible"]);
const emits = defineEmits(["update:visible", "update:current"]);
const fnClose = () => {
emits("update:current", undefined);
@ -178,4 +183,8 @@ const fnGetStudentByTaskId = async () => {
await fnGetStudentByTaskId();
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
.large-content {
height: 127px;
}
</style>

View File

@ -10,14 +10,17 @@
<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 class="tc mt-10">
<h3>学员统计情况总表</h3>
</div>
<div style="display: flex; justify-content: space-between">
<el-text size="small">平台名称:</el-text>
<el-text size="small">报表日期:{{ fnGetCurrentDay() }}</el-text>
<div
class="mt-10"
style="display: flex; justify-content: space-between"
>
<span>平台名称:</span>
<span>报表日期:{{ fnGetCurrentDay() }}</span>
</div>
<el-descriptions direction="vertical" :column="2" border>
<el-descriptions class="mt-10" direction="vertical" :column="2" border>
<el-descriptions-item label="公司名称">
{{ CORP_NAME }}
</el-descriptions-item>
@ -38,48 +41,125 @@
{{ pass_student_list.length }}
</el-descriptions-item>
</el-descriptions>
<br />
<div style="text-align: center">
<el-text>合格学员名单</el-text>
<table class="print_use" style="width: 100%">
<thead>
<tr>
<td colspan="7" class="tc" style="border: none">合格学员名单</td>
</tr>
<tr>
<td class="title">序号</td>
<td class="title">姓名</td>
<td class="title">身份证</td>
<td class="title">手机号</td>
<td class="title">性别</td>
<td class="title">完成学时</td>
<td class="title">结业考试成绩</td>
</tr>
</thead>
<tbody>
<template v-if="pass_student_list && pass_student_list.length > 0">
<tr
v-for="(item, index) in pass_student_list"
:key="item.USER_ID"
>
<td class="tc">{{ index + 1 }}</td>
<td class="tc">{{ item.USER_NAME }}</td>
<td class="tc">{{ item.USER_ID_CARD }}</td>
<td class="tc">{{ item.PHONE }}</td>
<td class="tc">{{ item.SEX_NAME }}</td>
<td class="tc">{{ item.COMPLETE_CLASSHOUR }}</td>
<td class="tc">
{{
item.STAGEEXAMSCORE > -1 ? item.STAGEEXAMSCORE : "未参加"
}}
</td>
</tr>
</template>
</tbody>
</table>
<table class="print_use" style="width: 100%">
<thead>
<tr>
<td colspan="7" class="tc" style="border: none">
未合格学员名单
</td>
</tr>
<tr>
<td class="title">序号</td>
<td class="title">姓名</td>
<td class="title">身份证</td>
<td class="title">手机号</td>
<td class="title">性别</td>
<td class="title">完成学时</td>
<td class="title">结业考试成绩</td>
</tr>
</thead>
<tbody>
<template
v-if="unpass_student_list && unpass_student_list.length > 0"
>
<tr
v-for="(item, index) in unpass_student_list"
:key="item.USER_ID"
>
<td class="tc">{{ index + 1 }}</td>
<td class="tc">{{ item.USER_NAME }}</td>
<td class="tc">{{ item.USER_ID_CARD }}</td>
<td class="tc">{{ item.PHONE }}</td>
<td class="tc">{{ item.SEX_NAME }}</td>
<td class="tc">{{ item.COMPLETE_CLASSHOUR }}</td>
<td class="tc">
{{
item.STAGEEXAMSCORE > -1 ? item.STAGEEXAMSCORE : "未参加"
}}
</td>
</tr>
</template>
</tbody>
</table>
<div class="print_no_use">
<div class="tc mtb-10">合格学员名单</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 class="tc mb-10">未合格学员名单</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>
<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>
<div v-html="PRINT_STYLE" />
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
@ -98,6 +178,7 @@ 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";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
@ -165,7 +246,7 @@ const unpass_student_list = computed(() => {
return result;
});
const emits = defineEmits(["update:visible"]);
const emits = defineEmits(["update:visible", "update:current"]);
const fnClose = () => {
emits("update:current", undefined);

View File

@ -1,59 +1,83 @@
<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="培训地点"> </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">
</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>
<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 class="tc">
<h3>安全培训教育记录及签字表</h3>
</div>
<div class="tc">
(
<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="培训地点"> </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">
</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>
<table class="print_use">
<thead>
<tr>
<td colspan="2" class="tc" style="border: none">受培训人</td>
</tr>
<tr>
<td class="title">姓名</td>
<td class="title">部门</td>
</tr>
</thead>
<tbody>
<template v-if="data.studentList && data.studentList.length > 0">
<tr v-for="(item, index) in data.studentList" :key="index">
<td>
{{ item.USER_NAME }}
</td>
<td>
{{ item.DEPARTMENT_NAME }}
</td>
</tr>
</template>
</tbody>
</table>
<div class="print_no_use">
<div class="tc">受培训人</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>
</div>
<div v-html="PRINT_STYLE" />
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</template>
<script setup>
@ -65,6 +89,7 @@ import {
import { computed, reactive } from "vue";
import { useVModels } from "@vueuse/core";
import LayoutTable from "@/components/table/index.vue";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const props = defineProps({
title: {
@ -125,7 +150,7 @@ const coursewares = computed(() => {
return result.length > 0 ? result.join(",") : "";
});
const emits = defineEmits(["update:visible"]);
const emits = defineEmits(["update:visible", "update:current"]);
const fnClose = () => {
emits("update:current", undefined);
@ -168,4 +193,10 @@ const fnGetStudentByTaskId = async () => {
await fnGetStudentByTaskId();
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
:deep {
.el-descriptions__label {
width: 100px;
}
}
</style>

View File

@ -11,60 +11,107 @@
<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) }}
<table class="print_use" style="width: 100%">
<thead>
<tr>
<td colspan="12" style="border: none">
<div class="tc">
<h3>{{ CORP_NAME }}培训计划</h3>
</div>
<div class="tl">单位名称:{{ CORP_NAME }}</div>
</td>
</tr>
<tr>
<td class="title">序号</td>
<td class="title">培训组织部门</td>
<td class="title">培训日期</td>
<td class="title">培训时间</td>
<td class="title">培训内容</td>
<td class="title">培训方式</td>
<td class="title">培训对象</td>
<td class="title">考核方式</td>
<td class="title">地点</td>
<td class="title">培训教师</td>
<td class="title">经费保障</td>
<td class="title">质量评估</td>
</tr>
</thead>
<tbody>
<template v-if="data.dataList && data.dataList.length > 0">
<tr v-for="(item, index) in data.dataList" :key="index">
<td class="tc">{{ index + 1 }}</td>
<td class="tc">{{ item.ORGANIZATION_DEPARTMENT }}</td>
<td class="tc">{{ item.TRAINING_DATE }}</td>
<td class="tc">{{ item.TRAINING_TIME }}</td>
<td class="tc">{{ item.TRAINING_CONTENT }}</td>
<td class="tc">{{ item.TRAINING_METHODS }}</td>
<td class="tc">{{ item.TRAINING_OBJECT }}</td>
<td class="tc">{{ item.ASSESSMENT_METHOD }}</td>
<td class="tc">{{ item.PLACE }}</td>
<td class="tc">{{ item.TRAINING_TEACHER }}</td>
<td class="tc">{{ item.FUND_GUARANTEE }}</td>
<td class="tc">{{ item.QUALITY_ASSESSMENT }}</td>
</tr>
</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>
</tbody>
</table>
<div class="print_no_use mt-10">
<div class="tc">
<h3>{{ CORP_NAME }}培训计划</h3>
</div>
<p class="mtb-10">单位名称:{{ CORP_NAME }}</p>
<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>
</div>
<el-row class="mt-10">
<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>
<div v-html="PRINT_STYLE" />
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
@ -92,6 +139,7 @@ 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";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const userStore = useUserStore();
const CORP_NAME = userStore.getUserInfo.CORP_NAME;
@ -125,7 +173,7 @@ const data = reactive({
formVisible: false,
});
const emits = defineEmits(["update:visible"]);
const emits = defineEmits(["update:visible", "update:current"]);
const fnClose = () => {
emits("update:current", undefined);

View File

@ -1,40 +1,41 @@
<template>
<el-dialog v-model="visible" title="人员登记表" :before-close="fnClose">
<el-button type="primary" v-print="'#printContent'"></el-button>
<br /><br />
<div id="printContent">
<div style="text-align: center">
<el-text size="large">生产经营单位新入职从业人员登记表</el-text>
<div id="printContent" class="mt-20">
<div class="tc">
<h3>生产经营单位新入职从业人员登记表</h3>
</div>
<el-descriptions :column="2">
<el-descriptions-item label="生产经营单位名称(盖章):">
{{ CORP_NAME }}
</el-descriptions-item>
<el-descriptions-item label="档案编号:"> </el-descriptions-item>
</el-descriptions>
<el-row>
<div
class="mt-20"
style="display: flex; justify-content: space-between; width: 80%"
>
<span>生产经营单位名称(盖章):{{ CORP_NAME }}</span>
<span>档案编号:</span>
</div>
<el-row class="mt-10">
<el-col :span="20">
<el-descriptions :column="2" border>
<el-descriptions-item label="姓名">
<el-descriptions-item label="姓名" label-align="center">
{{ data.userInfo.NAME }}
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-descriptions-item label="性别" label-align="center">
{{ data.userInfo.SEX_NAME }}
</el-descriptions-item>
<el-descriptions-item label="民族">
<el-descriptions-item label="民族" label-align="center">
{{ data.userInfo.NATION_NAME }}
</el-descriptions-item>
<el-descriptions-item label="政治面貌">
<el-descriptions-item label="政治面貌" label-align="center">
{{ data.userInfo.POLITICAL_OUTLOOK_NAME }}
</el-descriptions-item>
<el-descriptions-item label="文化程度">
<el-descriptions-item label="文化程度" label-align="center">
{{ data.userInfo.DEGREE_OF_EDUCATION_NAME }}
</el-descriptions-item>
<el-descriptions-item label="健康状况"> </el-descriptions-item>
<el-descriptions-item label="出生年月">
<el-descriptions-item label="健康状况" label-align="center">
</el-descriptions-item>
<el-descriptions-item label="出生年月" label-align="center">
{{ data.userInfo.DATE_OF_BIRTH }}
</el-descriptions-item>
<el-descriptions-item label="身份证号">
<el-descriptions-item label="身份证号" label-align="center">
{{ data.userInfo.USER_ID_CARD }}
</el-descriptions-item>
</el-descriptions>
@ -54,59 +55,72 @@
</el-col>
</el-row>
<el-descriptions :column="2" border>
<el-descriptions-item label="毕业院校及专业"> </el-descriptions-item>
<el-descriptions-item label="职务/职称">
<el-descriptions-item label="毕业院校及专业" label-align="center">
</el-descriptions-item>
<el-descriptions-item label="职务/职称" label-align="center">
{{ data.userInfo.DUTIES_NAME }}
</el-descriptions-item>
<el-descriptions-item label="户籍所在地"> </el-descriptions-item>
<el-descriptions-item label="参加工作时间">
<el-descriptions-item label="户籍所在地" label-align="center">
</el-descriptions-item>
<el-descriptions-item label="参加工作时间" label-align="center">
{{ data.userInfo.WORKING_DATE }}
</el-descriptions-item>
<el-descriptions-item label="进入本单位时间">
<el-descriptions-item label="进入本单位时间" label-align="center">
{{ data.userInfo.ENTRY_DATE }}
</el-descriptions-item>
<el-descriptions-item label="入职部门">
<el-descriptions-item label="入职部门" label-align="center">
{{ data.userInfo.DEPARTMENT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="岗位名称">
<el-descriptions-item label="岗位名称" label-align="center">
{{ data.userInfo.POST_NAME }}
</el-descriptions-item>
<el-descriptions-item label="之前从事本岗位时间">
<el-descriptions-item label="之前从事本岗位时间" label-align="center">
</el-descriptions-item>
</el-descriptions>
<el-descriptions :column="1" border>
<el-descriptions-item label="主要工作经历"> </el-descriptions-item>
<el-descriptions-item label="主要工作经历" label-align="center">
<div class="large-content"></div>
</el-descriptions-item>
<el-descriptions-item
label="入职前接受安全培训和考核以及取得安全培训有关的岗位证书等情况"
label-align="center"
>
<div class="large-content"></div>
</el-descriptions-item>
<el-descriptions-item
label="入职前受过何种有关安全生产的处罚以及是否受到刑事处罚"
>
<div class="large-content"></div>
</el-descriptions-item>
<el-descriptions-item label="入职统计表相关信息核定情况">
<div>
<p>
<p class="mtb-20">
入职人承诺:以上信息已经本人核实信息真实有效完整如有虚假或欺骗等行为自愿承担相应的法律责任.
</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
class="mt-20"
style="display: flex; justify-content: space-between; width: 80%"
>
<span>入职人(签字并按指纹)</span>
<span>
承诺日期
<span class="pl-40"></span>
<span class="pl-20"></span>
<span class="pl-20"></span>
</span>
</div>
</div>
<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>
<p class="mt-20">生产经营单位核查意见</p>
<div
class="mtb-20"
style="display: flex; justify-content: space-between; width: 80%"
>
<span>核查人员(签字)</span>
<span>
核查日期
<span class="pl-40"></span>
<span class="pl-20"></span>
<span class="pl-20"></span>
</span>
</div>
</div>
</el-descriptions-item>
@ -159,4 +173,8 @@ const fnGetUserInfo = async () => {
await fnGetUserInfo();
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
.large-content {
height: 127px;
}
</style>

View File

@ -1,350 +1,406 @@
<template>
<div>
<el-descriptions title="学时证明" :column="1">
<template #extra>
<el-button type="primary" v-print="'#printContent'" size="small">
打印
</el-button>
</template>
</el-descriptions>
<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>
<layout-print-table-package entrance="archive">
<div class="print_use">
<div class="tr mt-30">
<span>档案编号</span>
</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>
</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="生产经营单位或安全生产管理机构名称:(盖章)">
</el-descriptions-item>
<el-descriptions-item label="档案编号:"> </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="专业"> </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"
<div
style="
font-size: 30px;
font-weight: 700;
text-align: center;
padding-top: 100px;
"
>
<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>
<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>
<table>
<thead>
<tr>
<td colspan="2" style="border: none">
<el-divider content-position="left">学时证明</el-divider>
<div class="mb-10">证书编号:</div>
</td>
</tr>
</thead>
<tbody>
<tr>
<td class="title">姓名</td>
<td>{{ data.userInfo.NAME }}</td>
</tr>
<tr>
<td class="title">证件类型</td>
<td>身份证</td>
</tr>
<tr>
<td class="title">证件编号</td>
<td>{{ data.userInfo.USER_ID_CARD }}</td>
</tr>
<tr>
<td class="title">培训单位名称</td>
<td>{{ CORP_NAME }}</td>
</tr>
<tr>
<td class="title">任务名称</td>
<td>{{ data.studyTaskInfo.STUDY_NAME }}</td>
</tr>
<tr>
<td class="title">培训日期</td>
<td>
{{ 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>
</div>
</td>
</tr>
<tr>
<td class="title">培训类型</td>
<td>{{ data.studyTaskInfo.train_type_name }}</td>
</tr>
<tr>
<td class="title">视频学习时长</td>
<td>{{ video_class_hours }}分钟(包含{{ video_count }}个视频)</td>
</tr>
<tr>
<td class="title">资料学习时长</td>
<td>{{ data_class_hours }}分钟(包含{{ data_count }}个资料)</td>
</tr>
<tr>
<td class="title">合计学习时长</td>
<td>{{ video_class_hours + data_class_hours }}分钟</td>
</tr>
<tr style="height: 150px">
<td class="title">
<div style="width: 150px">
<p>培训单位:(盖章)</p>
<p>日期: {{ fnGetCurrentDay() }}</p>
</div>
</td>
<td></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<td colspan="4" style="border: none">
<el-divider content-position="left">课程材料</el-divider>
<div class="mb-10 flex">
<span>姓名:{{ data.userInfo.NAME }}</span>
<span>身份证号:{{ data.userInfo.USER_ID_CARD }}</span>
</div>
</td>
</tr>
<tr>
<td class="title">任务名称</td>
<td class="title" colspan="3">{{ data.studyTaskInfo.STUDY_NAME }}</td>
</tr>
<tr>
<td class="title">序号</td>
<td class="title">课程内容</td>
<td class="title">课时</td>
<td class="title">讲师</td>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in data.curriculumList" :key="index">
<td class="tc">{{ index + 1 }}</td>
<td class="tc">{{ item.COURSEWARENAME }}</td>
<td class="tc">{{ (item.CLASSHOUR / 45).toFixed(2) }}</td>
<td class="tc">{{ item.SPEAKER }}</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<td style="border: none">
<el-divider content-position="left">考卷详情</el-divider>
</td>
</tr>
<tr>
<td style="border: none">
<div class="tc">
<h3>{{ data.paper.info.EXAMNAME }}</h3>
</div>
<div class="tc mt-10">
<span>(满分:{{ data.paper.info.EXAMSCORE || 0 }})</span>
</div>
<div class="flex">
<span>任务名称:{{ data.studyTaskInfo.STUDY_NAME }}</span>
<span>姓名:{{ data.userInfo.NAME }}</span>
</div>
</td>
</tr>
<tr>
<td style="border: none">
<div class="flex">
<span>考试时间:{{ data.paper.info.OPERATTIME }}</span>
<span>分数:{{ data.examScore.userSecond[0] }}</span>
</div>
</td>
</tr>
</thead>
<tbody>
<template v-if="data.paper.selectList.length > 0">
<tr>
<td style="border: none">
<el-divider content-position="left">单选题</el-divider>
</td>
</tr>
<tr
v-for="(item, index) in data.paper.selectList"
:key="item.QUESTION_ID"
>
<td style="border: none">
<p>
{{ index + 1 }}.{{ item.QUESTIONDRY }} 选择答案[{{
data.paper.isExam === "1" ? item.ANSWER : ""
}}]
</p>
<el-row :gutter="30" class="mt-10">
<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" />
</td>
</tr>
</template>
<template v-if="data.paper.multiList.length > 0">
<tr>
<td style="border: none">
<el-divider content-position="left">多选题</el-divider>
</td>
</tr>
<tr
v-for="(item, index) in data.paper.multiList"
:key="item.QUESTION_ID"
>
<td style="border: none">
<p>
{{ index + 1 }}.{{ item.QUESTIONDRY }} 选择答案[{{
data.paper.isExam === "1" ? item.ANSWER : ""
}}]
</p>
<el-row :gutter="30" class="mt-10">
<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" />
</td>
</tr>
</template>
<template v-if="data.paper.judgeList.length > 0">
<tr>
<td style="border: none">
<el-divider content-position="left">判断题</el-divider>
</td>
</tr>
<tr
v-for="(item, index) in data.paper.judgeList"
:key="item.QUESTION_ID"
>
<td style="border: none">
<p>
{{ index + 1 }}.{{ item.QUESTIONDRY }} 选择答案[{{
data.paper.isExam === "1" ? item.ANSWER : ""
}}]
</p>
<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" />
</td>
</tr>
</template>
</tbody>
</table>
<table>
<thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left">培训考核记录</el-divider>
<div class="tc">
<h3>
{{ data.studyTaskInfo.train_type_name }}生产经营单位{{
data.studyTaskInfo.post_type_name
}}安全培训考核记录
</h3>
</div>
</td>
</tr>
<tr>
<td colspan="10" style="border: none">
<div class="flex">
<span>生产经营单位或安全生产管理机构名称:(盖章)</span>
<span>档案编号:</span>
</div>
</td>
</tr>
</thead>
<tbody>
<tr>
<td class="title">姓名</td>
<td class="tc">{{ data.userInfo.NAME }}</td>
<td class="title">性别</td>
<td class="tc">{{ data.userInfo.SEX_NAME }}</td>
<td class="title">身份证</td>
<td class="tc">{{ data.userInfo.USER_ID_CARD }}</td>
<td class="title">学历</td>
<td class="tc">{{ data.userInfo.DEGREE_OF_EDUCATION_NAME }}</td>
<td class="title">专业</td>
<td class="tc"></td>
</tr>
<tr>
<td class="title">职务</td>
<td class="tc">{{ data.userInfo.DUTIES_NAME }}</td>
<td class="title">部门</td>
<td class="tc">{{ data.userInfo.DEPARTMENT_NAME }}</td>
<td class="title">工种</td>
<td class="tc">{{ data.studyTaskInfo.TYPE_OF_WORK_NAME }}</td>
<td class="title">行业类别</td>
<td class="tc">{{ data.studyTaskInfo.train_type_name }}</td>
<td class="title">联系电话</td>
<td class="tc">{{ data.userInfo.USERNAME }}</td>
</tr>
<tr>
<td class="title">人员类型</td>
<td colspan="9" class="tc">
<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>
</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<td colspan="9" class="tc">安全培训及考核实施情况</td>
</tr>
<tr>
<td class="title" style="width: 4%">序号</td>
<td class="title">培训时间</td>
<td class="title">培训地点</td>
<td class="title">培训主要内容</td>
<td class="title">学时</td>
<td class="title">培训教师</td>
<td class="title">考试成绩</td>
<td class="title">补考成绩</td>
<td class="title">本人签字</td>
</tr>
</thead>
<tbody>
<template v-if="data.curriculumList && data.curriculumList.length > 0">
<tr
v-for="(item, index) in data.curriculumList"
:key="item.COURSEWARE_ID"
>
<td class="tc">{{ index + 1 }}</td>
<td class="tc">
{{ data.studyTaskInfo.PEIXUE_START_TIME }}
{{ data.studyTaskInfo.PEIXUE_END_TIME }}
</td>
<td class="tc">一体化双控平台</td>
<td class="tc">{{ item.COURSEWARENAME }}</td>
<td class="tc">{{ (item.CLASSHOUR / 45).toFixed(2) }}</td>
<td class="tc">{{ item.SPEAKER }}</td>
<td class="tc">{{ data.examScore.userSecond[0] }}</td>
<td class="tc">{{ data.examScore.userSecond[1] }}</td>
<td class="tc">
<img
v-if="data.examScore.USER_SIGN_PATH"
:src="FILE_URL + data.examScore.USER_SIGN_PATH"
style="height: 50px; width: 50px"
alt="本人"
/>
</td>
</tr>
</template>
</tbody>
</table>
<el-row class="mt-10">
<el-col :span="6">
记录人员(签字):
<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-col>
<el-col :span="6">
考核人员(签字):
<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-col>
<el-col :span="6"> 安全生产管理机构负责人(签章): </el-col>
<el-col :span="6"> 归档日期:{{ fnGetCurrentDay() }} </el-col>
</el-row>
</layout-print-table-package>
<div v-html="PRINT_STYLE" />
</template>
<script setup>
@ -357,11 +413,11 @@ import {
getUserExamScoreByStudyTaskId,
} from "@/request/archives.js";
import { layoutFnGetPersonnelType } from "@/assets/js/data_dictionary.js";
import LayoutTable from "@/components/table/index.vue";
import { computed, reactive } from "vue";
import { useRoute } from "vue-router";
import { useUserStore } from "@/pinia/user";
import { serialNumber } from "@/assets/js/utils.js";
import LayoutPrintTablePackage from "@/components/print_table_package/index.vue";
import { PRINT_STYLE } from "@/assets/js/constant.js";
const FILE_URL = import.meta.env.VITE_FILE_URL;
@ -529,21 +585,12 @@ const fnGetCurrentDay = () => {
const day = String(currentDatetime.getDate()).padStart(2, "0");
return `${year}${month}${day}`;
};
const fnMergeCells = ({ rowIndex, columnIndex }) => {
if (columnIndex > 5) {
if (rowIndex < 1) {
return {
rowspan: data.curriculumList.length,
colspan: 1,
};
}
return {
rowspan: 0,
colspan: 0,
};
}
};
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
.flex {
display: flex;
justify-content: space-between;
width: 80%;
}
</style>

View File

@ -38,7 +38,7 @@
/>
</el-form-item>
</el-form>
<div class="tc mt">
<div class="tc mt-10">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
</layout-card>

View File

@ -59,6 +59,21 @@
<el-input v-model="data.form.NAME" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="性别" prop="SEX">
<el-select v-model="data.form.SEX">
<el-option
v-for="item in [
{ NAME: '男', DICTIONARIES_ID: '1' },
{ NAME: '女', DICTIONARIES_ID: '0' },
]"
:key="item.DICTIONARIES_ID"
:label="item.NAME"
:value="item.DICTIONARIES_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="部门排序" prop="SORT">
<el-input
@ -215,7 +230,10 @@
<el-form-item label="性别" prop="SEX">
<el-select v-model="data.form.SEX">
<el-option
v-for="item in data.sexList"
v-for="item in [
{ NAME: '男', DICTIONARIES_ID: '1' },
{ NAME: '女', DICTIONARIES_ID: '0' },
]"
:key="item.DICTIONARIES_ID"
:label="item.NAME"
:value="item.DICTIONARIES_ID"
@ -416,7 +434,6 @@ import {
layoutFnGetPersonnelType,
layoutFnGetPoliticalLandscape,
layoutFnGetProfessionalTitle,
layoutFnGetSex,
} from "@/assets/js/data_dictionary.js";
import { ElMessageBox, ElMessage } from "element-plus";
import { debounce } from "throttle-debounce";
@ -532,7 +549,6 @@ const data = reactive({
schedulingList1: [],
periodList: [],
nationList: [],
sexList: [],
politicalLandscapeList: [],
degreeOfEducationList: [],
personnelTypeList: [],
@ -655,8 +671,6 @@ const fnChangeIdCard = () => {
const fnGetLevels = async () => {
const { value: nationList } = await layoutFnGetNation();
data.nationList = nationList;
const { value: sexList } = await layoutFnGetSex();
data.sexList = sexList;
const { value: politicalLandscapeList } =
await layoutFnGetPoliticalLandscape();
data.politicalLandscapeList = politicalLandscapeList;

View File

@ -0,0 +1,247 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="90px"
@submit.prevent="fnResetPaginationTransfer"
>
<el-row>
<el-col :span="6">
<el-form-item label="清单名称" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入关键字"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="人员" prop="USERNAME">
<el-input
v-model="searchForm.USERNAME"
placeholder="请输入关键字"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="部门" prop="DEPTIDS">
<layout-department
v-model="searchForm.DEPTIDS"
multiple
show-checkbox
collapse-tags
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="清单类型" prop="TYPE">
<el-select v-model="searchForm.TYPE">
<el-option
v-for="item in inventoryTypeList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="排查类型" prop="RISKCHECKLISTTYPE">
<el-select v-model="searchForm.RISKCHECKLISTTYPE">
<el-option
v-for="item in troubleshootingTypeList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="清单级别" prop="LISTINGLEVEL">
<el-select v-model="searchForm.LISTINGLEVEL">
<el-option
v-for="item in [
{ BIANMA: '1', NAME: '公司' },
...inventoryLevelList,
]"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
:data="list"
v-model:pagination="pagination"
@get-data="fnGetDataTransfer"
row-key="LISTMANAGER_ID"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="NAME" label="清单名称" />
<el-table-column prop="DEPARTMENT_NAME_ALL" label="部门" />
<el-table-column prop="POST_NAME" label="岗位" />
<el-table-column
prop="USER_NAME"
label="人员"
width="100"
show-overflow-tooltip
/>
<el-table-column
prop="PERIODNAME"
label="排查周期"
width="100"
show-overflow-tooltip
/>
<el-table-column
prop="SCREENTYPENAME"
label="排查类型"
width="100"
show-overflow-tooltip
/>
<el-table-column
prop="TYPENAME"
label="清单类型"
width="100"
show-overflow-tooltip
/>
<el-table-column
v-if="SPECIAL_ENTERPRISES.includes(CORPINFO_ID)"
prop="TASK_TYPE_NAME"
label="任务类型"
width="100"
show-overflow-tooltip
/>
<el-table-column label="状态" width="100">
<template #default> 已删除 </template>
</el-table-column>
<el-table-column label="操作" width="100">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/hazard_investigation/delete_inventory_management/view',
query: { LISTMANAGER_ID: row.LISTMANAGER_ID },
})
"
>
查看
</el-button>
<el-button
type="primary"
text
link
@click="fnRecovery(row.LISTMANAGER_ID)"
>
启用
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
v-if="buttonJurisdiction.del"
type="danger"
@click="fnBatchDelete"
>
彻底删除
</el-button>
</template>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js";
import LayoutDepartment from "@/components/department/index.vue";
import { debounce } from "throttle-debounce";
import { ElMessage, ElMessageBox } from "element-plus";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import {
layoutFnGetInventoryLevel,
layoutFnGetInventoryType,
layoutFnGetTroubleshootingType,
} from "@/assets/js/data_dictionary.js";
import { SPECIAL_ENTERPRISES } from "@/assets/js/constant.js";
import { useUserStore } from "@/pinia/user.js";
import {
getDeleteInventoryManagementList,
setDeleteInventoryManagementRecovery,
setInventoryManagementBatchDelete,
} from "@/request/hazard_investigation.js";
import { useRouter } from "vue-router";
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getDeleteInventoryManagementList);
const userStore = useUserStore();
const CORPINFO_ID = userStore.getUserInfo.CORPINFO_ID;
const buttonJurisdiction = await useButtonJurisdiction("stoplistmanager");
const inventoryTypeList = await layoutFnGetInventoryType();
const troubleshootingTypeList = await layoutFnGetTroubleshootingType();
const inventoryLevelList = await layoutFnGetInventoryLevel();
const fnGetDataTransfer = () => {
fnGetData({
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
});
};
const fnResetPaginationTransfer = () => {
fnResetPagination({
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
});
};
const fnRecovery = debounce(
1000,
async (LISTMANAGER_ID) => {
await ElMessageBox.confirm("确定要恢复吗?", { type: "warning" });
await setDeleteInventoryManagementRecovery({ LISTMANAGER_ID });
ElMessage.success("恢复成功");
fnResetPaginationTransfer();
},
{ atBegin: true }
);
const fnBatchDelete = debounce(
1000,
async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要删除的项");
return;
}
await ElMessageBox.confirm(
"删除之后该清单无法恢复,确认要删除选中的数据吗?",
{ type: "warning" }
);
const DATA_IDS = selectionData.map((item) => item.LISTMANAGER_ID).join(",");
await setInventoryManagementBatchDelete({ DATA_IDS });
ElMessage.success("删除成功");
fnResetPaginationTransfer();
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -0,0 +1,73 @@
<template>
<layout-card>
<el-divider content-position="left">清单信息</el-divider>
<el-descriptions :column="2" border>
<el-descriptions-item label="清单名称">
{{ info.NAME }}
</el-descriptions-item>
<el-descriptions-item label="是否包保责任人任务">
<span v-if="info.BAO_BAO_TYPE === '0'"></span>
<span v-if="info.BAO_BAO_TYPE === '1'"></span>
</el-descriptions-item>
<el-descriptions-item label="任务类型" v-if="info.BAO_BAO_TYPE === '1'">
{{ info.TASK_TYPE_NAME }}
</el-descriptions-item>
<el-descriptions-item label="部门">
{{ info.DEPARTMENT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="岗位">
{{ info.POST_NAME }}
</el-descriptions-item>
<el-descriptions-item label="负责人">
{{ info.USER_NAME }}
</el-descriptions-item>
<el-descriptions-item label="排查类型">
{{ info.SCREENTYPENAME }}
</el-descriptions-item>
<el-descriptions-item label="排查周期">
{{ info.PERIODNAME }}
</el-descriptions-item>
<el-descriptions-item label="清单类型">
{{ info.TYPENAME }}
</el-descriptions-item>
<el-descriptions-item
label="排查日期"
v-if="info.TYPE === 'listType0005'"
>
{{ info.START_DATE }} - {{ info.END_DATE }}
</el-descriptions-item>
</el-descriptions>
<el-divider content-position="left">检查内容</el-divider>
<layout-table :data="list" :show-pagination="false">
<el-table-column type="index" label="序号" width="55" />
<el-table-column prop="RISKUNITNAME" label="风险点(单元)" width="180" />
<el-table-column prop="PARTSNAME" label="辨识部位" width="180" />
<el-table-column prop="RISK_DESCR" label="存在风险" width="300" />
<el-table-column prop="DNAME5" label="风险分级" width="180" />
<el-table-column prop="USERNAME" label="管控负责人" width="180" />
<el-table-column prop="CHECK_CONTENT" label="检查内容" />
</layout-table>
</layout-card>
</template>
<script setup>
import { useRoute } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import { getInventoryManagementView } from "@/request/hazard_investigation.js";
import { ref } from "vue";
const route = useRoute();
const { LISTMANAGER_ID } = route.query;
const info = ref({});
const { list } = useListData(getInventoryManagementView, {
otherParams: { LISTMANAGER_ID },
usePagination: false,
callbackFn: (list, resData) => {
info.value = resData.pd;
},
});
console.log(list);
console.log(info);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,465 @@
<template>
<layout-card>
<el-divider content-position="left">清单信息</el-divider>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="100px"
>
<el-row>
<el-col :span="6">
<el-form-item label="清单名称" prop="NAME">
<el-input v-model="data.form.NAME" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item
v-if="SPECIAL_ENTERPRISES.includes(CORPINFO_ID)"
label="是否包保责任人任务"
prop="BAO_BAO_TYPE"
label-width="160px"
>
<el-select v-model="data.form.BAO_BAO_TYPE">
<el-option
v-for="item in [
{ BIANMA: '0', NAME: '否' },
{ BIANMA: '1', NAME: '是' },
]"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col v-if="data.form.BAO_BAO_TYPE === '1'" :span="6">
<el-form-item label="任务类型" prop="TASK_TYPE">
<el-select v-model="data.form.TASK_TYPE">
<el-option
v-for="item in taskTypeList"
:key="item.DICTIONARIES_ID"
:label="item.NAME"
:value="item.DICTIONARIES_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="DEPARTMENT_ID" label="部门">
<layout-department
v-model="data.form.DEPARTMENT_ID"
@update:model-value="fnDepartmentChange"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="岗位" prop="POST_ID">
<el-select v-model="data.form.POST_ID" @change="fnPostChange">
<el-option
v-for="item in data.postList"
:key="item.POST_ID"
:label="item.NAME"
:value="item.POST_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item v-if="!LISTMANAGER_ID" label="负责人" prop="USER_IDS">
<el-select v-model="data.form.USER_IDS" multiple>
<el-option
v-for="item in data.userList"
:key="item.USER_ID"
:label="item.NAME"
:value="item.USER_ID"
/>
</el-select>
</el-form-item>
<el-form-item
v-else-if="LISTMANAGER_ID"
label="负责人"
prop="USER_ID"
>
<el-select v-model="data.form.USER_ID">
<el-option
v-for="item in data.userList"
:key="item.USER_ID"
:label="item.NAME"
:value="item.USER_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="排查类型" prop="SCREENTYPE">
<el-select v-model="data.form.SCREENTYPE">
<el-option
v-for="item in troubleshootingTypeList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="排查周期" prop="PERIOD">
<el-select v-model="data.form.PERIOD">
<el-option
v-for="item in troubleshootingCycleList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="清单类型" prop="TYPE">
<el-select v-model="data.form.TYPE">
<el-option
v-for="item in inventoryTypeList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col
v-if="
data.form.TYPE === 'listType0005' ||
data.form.TYPE === 'listType0006'
"
:key="data.form.TYPE"
:span="6"
>
<el-form-item label="排查日期" prop="dates">
<el-date-picker
v-model="data.form.dates"
:disabled-date="
data.form.TYPE === 'listType0006' ? fnDisabledDate : null
"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-divider content-position="left">检查内容</el-divider>
<el-form
:model="data.searchForm"
label-width="60px"
@submit.prevent="fnGetDataFilter"
>
<el-row>
<el-col :span="6">
<el-form-item label="关键字" prop="KEYWORDS">
<el-input
v-model="data.searchForm.KEYWORDS"
placeholder="请输入内容"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnGetDataFilter">
重置
</el-button>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item class="end">
<el-button
type="primary"
@click="data.selectRiskDialogVisible = true"
>
选择其他存在风险
</el-button>
<el-button
type="primary"
@click="data.addOrEditDialog.visible = true"
>
添加存在风险
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<layout-table
ref="tableRef"
:data="data.list"
:show-pagination="false"
max-height="400"
row-key="RISKCHECKITEM_ID"
>
<el-table-column type="selection" width="55" />
<el-table-column type="index" label="序号" width="55" />
<el-table-column prop="RISKUNITNAME" label="风险点(单元)" width="180" />
<el-table-column prop="PARTSNAME" label="辨识部位" width="180" />
<el-table-column prop="RISK_DESCR" label="存在风险" width="300" />
<el-table-column prop="DNAME5" label="风险分级" width="180" />
<el-table-column prop="USERNAME" label="管控负责人" width="180" />
<el-table-column prop="CHECK_CONTENT" label="检查内容" />
</layout-table>
<div class="tc mt-10">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
<add-risk
title="添加存在风险"
type="add"
v-model:visible="data.addOrEditDialog.visible"
v-model:form="data.addOrEditDialog.form"
:control="false"
@get-data="fnAddRiskSubmit"
/>
<select-risk
v-model:visible="data.selectRiskDialogVisible"
:list-data="data.listAll"
@submit="fnSelectRiskSubmit"
/>
<add-inspection-route
v-model:visible="data.inspectionRouteDialog.visible"
v-model:list="data.inspectionRouteDialog.list"
@submit="fnInspectionRouteSubmit"
/>
</layout-card>
</template>
<script setup>
import { nextTick, reactive, ref, watchEffect } from "vue";
import { SPECIAL_ENTERPRISES } from "@/assets/js/constant.js";
import { useUserStore } from "@/pinia/user.js";
import {
layoutFnGetInventoryType,
layoutFnGetTaskType,
layoutFnGetTroubleshootingCycle,
layoutFnGetTroubleshootingType,
} from "@/assets/js/data_dictionary.js";
import LayoutDepartment from "@/components/department/index.vue";
import { getPostListAll, getUserListAll } from "@/request/data_dictionary.js";
import { useRoute, useRouter } from "vue-router";
import {
getInventoryManagementInspectionItems,
getInventoryManagementView,
setInventoryManagementAdd,
setInventoryManagementEdit,
} from "@/request/hazard_investigation.js";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import AddRisk from "@/views/risk_control/ledger/components/add.vue";
import SelectRisk from "./components/select_risk.vue";
import AddInspectionRoute from "./components/add_inspection_route.vue";
const route = useRoute();
const router = useRouter();
const { LISTMANAGER_ID } = route.query;
const userStore = useUserStore();
const CORPINFO_ID = userStore.getUserInfo.CORPINFO_ID;
const rules = {
NAME: [{ required: true, message: "清单名称不能为空", trigger: "blur" }],
BAO_BAO_TYPE: [
{
required: true,
message: "是否包保责任人任务不能为空",
trigger: "change",
},
],
TASK_TYPE: [
{ required: true, message: "任务类型不能为空", trigger: "change" },
],
DEPARTMENT_ID: [
{ required: true, message: "部门不能为空", trigger: "change" },
],
POST_ID: [{ required: true, message: "岗位不能为空", trigger: "change" }],
USER_IDS: [{ required: true, message: "负责人不能为空", trigger: "change" }],
USER_ID: [{ required: true, message: "负责人不能为空", trigger: "change" }],
SCREENTYPE: [
{ required: true, message: "排查类型不能为空", trigger: "change" },
],
PERIOD: [{ required: true, message: "排查周期不能为空", trigger: "change" }],
TYPE: [{ required: true, message: "清单类型不能为空", trigger: "change" }],
dates: [{ required: true, message: "排查日期不能为空", trigger: "change" }],
};
const formRef = ref(null);
const tableRef = ref(null);
const data = reactive({
form: {
NAME: "",
BAO_BAO_TYPE: "",
TASK_TYPE: "",
DEPARTMENT_ID: "",
POST_ID: "",
USER_IDS: [],
USER_ID: "",
SCREENTYPE: "",
PERIOD: "",
TYPE: "",
dates: [],
},
postList: [],
userList: [],
list: [],
listAll: [],
searchForm: {},
selectRiskDialogVisible: false,
addOrEditDialog: {
visible: false,
form: {
DEPARTMENT_ID: "",
USER_ID: "",
RISK_UNIT_ID: "",
IDENTIFICATION_ID: "",
RISK_DESCR: "",
LIKELIHOOD: "",
EXPOSURE: "",
CONSEQUENCE: "",
LEVEL_NAME: "",
DANGER: "",
MEASURES: "",
ACCIDENTS: [],
EME_MEASURES: "",
},
},
inspectionRouteDialog: {
visible: false,
list: [],
},
});
const taskTypeList = await layoutFnGetTaskType();
const troubleshootingTypeList = await layoutFnGetTroubleshootingType();
const troubleshootingCycleList = await layoutFnGetTroubleshootingCycle();
const inventoryTypeList = await layoutFnGetInventoryType();
const fnGetData = async () => {
if (!LISTMANAGER_ID) return;
const resData = await getInventoryManagementView({ LISTMANAGER_ID });
data.form = resData.pd;
data.form.dates = [resData.pd.START_DATE, resData.pd.END_DATE];
data.list = resData.varList;
data.listAll = resData.varList;
};
fnGetData();
const fnGetInspectionItems = async () => {
const resData = await getInventoryManagementInspectionItems({
DEPARTMENT_ID: data.form.DEPARTMENT_ID,
POST_ID: data.form.POST_ID,
});
data.list = [...tableRef.value.getSelectionRows(), ...resData.varList];
data.listAll = [...tableRef.value.getSelectionRows(), ...resData.varList];
await fnTableSelection();
};
const fnDepartmentChange = () => {
data.postList = [];
data.userList = [];
data.form.POST_ID = "";
data.form.USER_IDS = [];
data.form.USER_ID = "";
};
const fnPostChange = () => {
data.userList = [];
data.form.USER_IDS = [];
data.form.USER_ID = "";
fnGetInspectionItems();
};
const fnGetPost = async (DEPARTMENT_ID) => {
const resData = await getPostListAll({ DEPARTMENT_ID });
data.postList = resData.postList;
};
const fnGetUser = async (POST_ID) => {
const resData = await getUserListAll({ POST_ID });
data.userList = resData.userList;
};
const fnDisabledDate = (time) => {
return time.getTime() < Date.now();
};
const fnGetDataFilter = () => {
const keyword = data.searchForm.KEYWORDS;
if (keyword) {
data.list = data.listAll.filter(
(item) =>
item.RISKUNITNAME?.indexOf(keyword) > -1 ||
item.PARTSNAME?.indexOf(keyword) > -1 ||
item.USERNAME?.indexOf(keyword) > -1
);
} else {
data.list = data.listAll;
}
fnTableSelection();
};
const fnTableSelection = async () => {
const selectionData = tableRef.value.getSelectionRows();
await nextTick();
selectionData.forEach((item) => {
tableRef.value.toggleRowSelection(item, true);
});
};
const fnAddRiskSubmit = (item) => {
data.list.push(item);
data.listAll.push(item);
fnTableSelection();
};
const fnSelectRiskSubmit = (listData) => {
data.list.push(...listData);
data.listAll.push(...listData);
fnTableSelection();
};
const fnSubmit = async () => {
await useFormValidate(formRef);
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.error("请选择检查内容");
return;
}
const allParts = [];
const allPartIds = [];
selectionData.forEach((item) => {
if (!allPartIds.includes(item.IDENTIFICATIONPARTS_ID)) {
allPartIds.push(item.IDENTIFICATIONPARTS_ID);
const part = {
ID: item.IDENTIFICATIONPARTS_ID,
NAME: item.PARTSNAME,
};
allParts.push(part);
}
});
data.inspectionRouteDialog.list = allParts;
data.inspectionRouteDialog.visible = true;
};
const fnInspectionRouteSubmit = debounce(
1000,
async () => {
const selectionData = tableRef.value.getSelectionRows();
const params = {
...data.form,
USER_IDS: data.form.USER_IDS?.join(","),
LISTITEM: JSON.stringify(selectionData),
ROUTE: JSON.stringify(data.inspectionRouteDialog.list),
BAO_BAO_DEPARTMENT_ID: data.form.DEPARTMENT_ID,
BAO_BAO_USER_ID: data.form.USER_ID,
START_DATE: data.form.dates[0],
END_DATE: data.form.dates[1],
BAO_BAO_TYPE: data.form.BAO_BAO_TYPE || "0",
};
!LISTMANAGER_ID
? await setInventoryManagementAdd(params)
: await setInventoryManagementEdit(params);
ElMessage.success("保存成功");
router.back();
},
{ atBegin: true }
);
watchEffect(() => {
if (data.form.DEPARTMENT_ID) fnGetPost(data.form.DEPARTMENT_ID);
if (data.form.POST_ID) fnGetUser(data.form.POST_ID);
});
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,53 @@
<template>
<el-dialog v-model="visible" title="设置巡检路线">
<vue-draggable
v-model="list"
style="display: flex; flex-wrap: wrap; gap: 10px 0"
>
<div
style="display: flex; align-items: center; cursor: move"
v-for="(item, index) in list"
:key="item.ID"
>
<el-tag>{{ index + 1 }}.{{ item.NAME }}</el-tag>
<el-icon v-if="index < list.length - 1">
<Right />
</el-icon>
</div>
</vue-draggable>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"></el-button>
</template>
</el-dialog>
</template>
<script setup>
import { Right } from "@element-plus/icons-vue";
import { useVModels } from "@vueuse/core";
import { VueDraggable } from "vue-draggable-plus";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
list: {
type: Array,
required: true,
default: () => [],
},
});
const emits = defineEmits(["update:visible", "update:list", "submit"]);
const { visible, list } = useVModels(props, emits);
const fnClose = () => {
visible.value = false;
};
const fnSubmit = async () => {
emits("submit");
fnClose();
};
</script>
<style scoped lang="scss"></style>

View File

@ -25,7 +25,10 @@
{{ info.TYPENAME }}
</el-descriptions-item>
<el-descriptions-item label="设置巡检路线" :span="2">
<vue-draggable v-model="list" style="display: flex">
<vue-draggable
v-model="list"
style="display: flex; flex-wrap: wrap; gap: 10px 0"
>
<div
style="display: flex; align-items: center; cursor: move"
v-for="(item, index) in list"

View File

@ -1,6 +1,6 @@
<template>
<el-dialog v-model="visible" title="设置包保责任类型">
<el-descriptions :column="2" border>
<el-descriptions :column="2" border class="mb-10">
<el-descriptions-item label="风险点">
{{ info.RISKUNITNAME }}
</el-descriptions-item>

View File

@ -0,0 +1,125 @@
<template>
<el-dialog title="选择其他存在风险" v-model="visible" width="1500">
<el-form
:model="searchForm"
label-width="60px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-form-item label="关键字" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入关键字"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="部门" prop="DEPARTMENT_ID">
<layout-department v-model="searchForm.DEPARTMENT_ID" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="类型" prop="OTHERLEVELID">
<el-select v-model="searchForm.OTHERLEVELID">
<el-option
v-for="item in riskClassificationList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<layout-table
ref="tableRef"
:data="list"
v-model:pagination="pagination"
@get-data="fnGetData"
row-key="RISKCHECKITEM_ID"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="RISKUNITNAME" label="风险点(单元)" width="105" />
<el-table-column prop="PARTSNAME" label="辨识部位" width="90" />
<el-table-column prop="RISK_DESCR" label="存在风险" />
<el-table-column prop="DNAME5" label="风险分级" width="100" />
<el-table-column prop="USERNAME" label="管控负责人" width="90" />
<el-table-column prop="CHECK_CONTENT" label="检查内容" />
</layout-table>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"> </el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
import { debounce } from "throttle-debounce";
import LayoutDepartment from "@/components/department/index.vue";
import useListData from "@/assets/js/useListData.js";
import { getInventoryManagementOtherRiskList } from "@/request/hazard_investigation.js";
import { watch } from "vue";
import { serialNumber } from "@/assets/js/utils.js";
import { layoutFnGetRiskClassification } from "@/assets/js/data_dictionary.js";
import { differenceWith } from "lodash-es";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
listData: {
type: Array,
required: true,
default: () => [],
},
});
const emits = defineEmits(["update:visible", "submit"]);
const visible = useVModel(props, "visible", emits);
const { list, searchForm, pagination, fnGetData, fnResetPagination, tableRef } =
useListData(getInventoryManagementOtherRiskList, { immediate: false });
const riskClassificationList = await layoutFnGetRiskClassification();
const stop = watch(
() => props.visible,
(value) => {
if (value) {
fnGetData();
stop && stop();
}
}
);
const fnClose = () => {
visible.value = false;
};
const fnSubmit = debounce(
1000,
() => {
const selectionData = tableRef.value.getSelectionRows();
const listData = differenceWith(selectionData, props.listData, (a, b) => {
return a.RISKCHECKITEM_ID === b.RISKCHECKITEM_ID;
});
emits("submit", listData);
fnClose();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -30,7 +30,6 @@
multiple
show-checkbox
collapse-tags
root-disabled="N"
/>
</el-form-item>
</el-col>
@ -174,6 +173,12 @@
type="primary"
text
link
@click="
router.push({
path: '/hazard_investigation/inventory_management/edit',
query: { LISTMANAGER_ID: row.LISTMANAGER_ID },
})
"
>
修改
</el-button>
@ -234,7 +239,15 @@
</template>
</el-table-column>
<template #button>
<el-button v-if="buttonJurisdiction.add" type="primary">
<el-button
v-if="buttonJurisdiction.add"
type="primary"
@click="
router.push({
path: '/hazard_investigation/inventory_management/add',
})
"
>
新增
</el-button>
<el-button
@ -244,7 +257,9 @@
>
批量删除
</el-button>
<el-button type="primary"> 继承清单 </el-button>
<el-button type="primary" @click="fnInheritanceList">
继承清单
</el-button>
</template>
</layout-table>
</layout-card>
@ -386,6 +401,23 @@ const fnBatchDelete = debounce(
},
{ atBegin: true }
);
const fnInheritanceList = () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要继承的清单");
return;
}
if (selectionData.length > 1) {
ElMessage.warning("只能选择一个清单");
return;
}
router.push({
path: "/hazard_investigation/inventory_management/inheritance_list",
query: {
LISTMANAGER_ID: selectionData[0].LISTMANAGER_ID,
},
});
};
</script>
<style scoped></style>

View File

@ -84,8 +84,8 @@ const { list } = useListData(getInventoryManagementView, {
LISTMANAGER_ID,
},
usePagination: false,
callbackFn: (list, responseData) => {
info.value = responseData.pd;
callbackFn: (list, resData) => {
info.value = resData.pd;
},
});
const fnSelect = (row, index) => {

View File

@ -75,8 +75,8 @@ const { list } = useListData(getInventoryManagementView, {
LISTMANAGER_ID,
},
usePagination: false,
callbackFn: (list, responseData) => {
info.value = responseData.pd;
callbackFn: (list, resData) => {
info.value = resData.pd;
},
});
const fnPartQrCode = (row) => {

View File

@ -107,8 +107,8 @@ const { list } = useListData(getInventoryManagementView, {
LISTMANAGER_ID,
},
usePagination: false,
callbackFn: (list, responseData) => {
info.value = responseData.pd;
callbackFn: (list, resData) => {
info.value = resData.pd;
},
});
</script>

View File

@ -0,0 +1,75 @@
<template>
<el-dialog v-model="visible" title="检查照片" :on-close="fnClose">
<el-form ref="formRef" :model="form" label-width="100px">
<el-row>
<el-col :span="24">
<el-form-item label="检查照片" prop="file">
<layout-upload
v-model:file-list="form.file"
:limit="99"
list-type="picture-card"
accept=".jpg,.jpeg,.png"
delete-to-server
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"></el-button>
</template>
</el-dialog>
</template>
<script setup>
import { ref } from "vue";
import LayoutUpload from "@/components/upload/index.vue";
import { useVModels } from "@vueuse/core";
import { debounce } from "throttle-debounce";
import { setUploadImg } from "@/request/api.js";
import { ElMessage } from "element-plus";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
form: {
type: Object,
required: true,
default: () => ({}),
},
id: {
type: String,
required: true,
default: "",
},
});
const emits = defineEmits(["update:visible", "update:form"]);
const { visible, form } = useVModels(props, emits);
const formRef = ref(null);
const fnClose = () => {
formRef.value.resetFields();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
const formData = new FormData();
for (let i = 0; i < form.value.file.length; i++) {
if (form.value.file[i].raw)
formData.append("FFILE", form.value.file[i].raw);
}
formData.append("FOREIGN_KEY", props.id);
formData.append("TYPE", 14);
await setUploadImg(formData);
fnClose();
ElMessage.success("保存成功");
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,446 @@
<template>
<el-dialog
v-model="visible"
:title="type === 'add' ? '添加隐患' : '修改隐患'"
:on-close="fnClose"
width="1200"
>
<el-row :gutter="24">
<el-col :span="12">
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-row>
<el-col :span="24" v-if="hiddenType === 'unqualified'">
<el-form-item label="检查内容" prop="CHECK_CONTENT">
<el-input
:model-value="info.CHECK_CONTENT"
disabled
type="textarea"
autosize
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患部位" prop="HIDDENPART">
<el-input
v-model="form.HIDDENPART"
placeholder="请输入内容"
@blur="fnGetHiddenDangerDatabaseList"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患描述" prop="HIDDENDESCR">
<el-input v-model="form.HIDDENDESCR" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患级别" prop="HIDDENLEVEL">
<el-select
v-model="form.HIDDENLEVEL"
@change="
form.HIDDENLEVEL === 'hiddenLevel0002'
? (form.RECTIFICATIONTYPE = '2')
: null
"
>
<el-option
v-for="item in hazardLevelList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24" v-if="info.BAO_BAO_TYPE === '1'">
<el-form-item label="隐患类别" prop="HIDDEN_CATEGORY">
<el-select v-model="form.HIDDEN_CATEGORY">
<el-option
v-for="item in hazardCategoriesList"
:key="item.DICTIONARIES_ID"
:label="item.NAME"
:value="item.DICTIONARIES_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患类型" prop="HIDDENTYPE">
<layout-hidden-danger-type
v-model="form.HIDDENTYPE"
ref="hiddenDangerTypeRef"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患图片" prop="hiddenImgs">
<layout-upload
v-model:file-list="form.hiddenImgs"
list-type="picture-card"
accept=".jpg,.jpeg,.png"
:limit="99"
delete-to-server
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患视频" prop="videoFiles">
<layout-upload
v-model:file-list="form.videoFiles"
accept=".mp4"
:size="50"
@preview="fnVideoPreview"
>
<template #tip>只能上传mp4文件且不超过50M</template>
</layout-upload>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患处置" prop="RECTIFICATIONTYPE">
<el-radio-group v-model="form.RECTIFICATIONTYPE">
<el-radio
:disabled="form.HIDDENLEVEL === 'hiddenLevel0002'"
label="1"
>
立即整改
</el-radio>
<el-radio label="2">限期整改</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<template v-if="form.RECTIFICATIONTYPE === '1'">
<el-col :span="24">
<el-form-item prop="RECTIFYDESCR" label="整改描述">
<el-input
v-model="form.RECTIFYDESCR"
placeholder="请输入内容"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="整改后图片" prop="rectifyImgs">
<layout-upload
v-model:file-list="form.rectifyImgs"
list-type="picture-card"
accept=".jpg,.jpeg,.png"
:limit="99"
delete-to-server
/>
</el-form-item>
</el-col>
</template>
<template v-if="form.RECTIFICATIONTYPE === '2'">
<el-col :span="24">
<el-form-item prop="RECTIFICATIONDEADLINE" label="整改期限">
<el-date-picker
v-model="form.RECTIFICATIONDEADLINE"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="整改部门" prop="RECTIFICATIONDEPT">
<layout-department
v-model="form.RECTIFICATIONDEPT"
@update:model-value="form.RECTIFICATIONOR = ''"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="整改人" prop="RECTIFICATIONOR">
<el-select v-model="form.RECTIFICATIONOR">
<el-option
v-for="item in data.rectifyUserList"
:key="item.USER_ID"
:label="item.NAME"
:value="item.USER_ID"
/>
</el-select>
</el-form-item>
</el-col>
</template>
</el-row>
</el-form>
</el-col>
<el-col :span="12">
<div
v-for="item in data.list"
:key="item.HIDDEN_LIBRARY_ID"
class="item"
@click="fnChoice(item)"
>
<el-descriptions :column="1" border>
<el-descriptions-item label="风险单元名称">
{{ item.RISK_UNIT_NAME }}
</el-descriptions-item>
<el-descriptions-item label="隐患部位">
{{ item.HIDDEN_PART }}
</el-descriptions-item>
<el-descriptions-item label="隐患描述">
{{ item.INSPECTION_BASIS }}
</el-descriptions-item>
</el-descriptions>
</div>
</el-col>
</el-row>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"></el-button>
</template>
</el-dialog>
<layout-video
v-model:visible="data.videoDialog.visible"
:src="data.videoDialog.src"
/>
</template>
<script setup>
import { reactive, ref, watchEffect } from "vue";
import LayoutUpload from "@/components/upload/index.vue";
import { useVModels } from "@vueuse/core";
import { debounce } from "throttle-debounce";
import { ElMessage } from "element-plus";
import {
getHiddenDangerDatabaseList,
setInventoryTroubleshootingOtherHiddenDangerAdd,
setInventoryTroubleshootingOtherHiddenDangerEdit,
setInventoryTroubleshootingOtherHiddenDangerListAdd,
} from "@/request/hazard_investigation.js";
import {
layoutFnGetHazardCategories,
layoutFnGetHazardLevel,
} from "@/assets/js/data_dictionary.js";
import LayoutHiddenDangerType from "@/components/hazard_type/index.vue";
import LayoutVideo from "@/components/video/index.vue";
import LayoutDepartment from "@/components/department/index.vue";
import { getUserListAll } from "@/request/data_dictionary.js";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { setUploadImg } from "@/request/api.js";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
form: {
type: Object,
required: true,
default: () => ({}),
},
info: {
type: Object,
required: true,
default: () => ({}),
},
type: {
type: String,
required: true,
default: "",
},
hiddenType: {
type: String,
required: true,
default: "",
},
listManagerId: {
type: String,
required: true,
default: "",
},
longitude: {
type: Number,
required: true,
default: 0,
},
latitude: {
type: Number,
required: true,
default: 0,
},
});
const emits = defineEmits(["update:visible", "update:form", "submit"]);
const { visible, form } = useVModels(props, emits);
const rules = {
HIDDENPART: [{ required: true, message: "请输入隐患部位", trigger: "blur" }],
HIDDENDESCR: [{ required: true, message: "请输入隐患描述", trigger: "blur" }],
HIDDENLEVEL: [
{ required: true, message: "请选择隐患级别", trigger: "change" },
],
HIDDEN_CATEGORY: [
{ required: true, message: "请选择隐患类别", trigger: "change" },
],
HIDDENTYPE: [
{ required: true, message: "请选择隐患类型", trigger: "change" },
],
hiddenImgs: [
{ required: true, message: "请上传隐患图片", trigger: "change" },
],
RECTIFICATIONTYPE: [
{ required: true, message: "请选择隐患处置", trigger: "change" },
],
RECTIFYDESCR: [
{ required: true, message: "请输入整改描述", trigger: "blur" },
],
rectifyImgs: [
{ required: true, message: "请上传整改后图片", trigger: "change" },
],
RECTIFICATIONDEADLINE: [
{ required: true, message: "请选择整改期限", trigger: "change" },
],
RECTIFICATIONDEPT: [
{ required: true, message: "请选择整改部门", trigger: "change" },
],
RECTIFICATIONOR: [
{ required: true, message: "请选择整改人", trigger: "change" },
],
};
const formRef = ref(null);
const hiddenDangerTypeRef = ref(null);
const data = reactive({
list: [],
rectifyUserList: [],
videoDialog: {
visible: false,
src: "",
},
});
const hazardLevelList = await layoutFnGetHazardLevel();
const hazardCategoriesList = await layoutFnGetHazardCategories();
const fnGetHiddenDangerDatabaseList = async () => {
if (!form.value.HIDDENPART) return;
const resData = await getHiddenDangerDatabaseList({
RISK_UNIT_NAME: props.info.RISKUNITNAME,
HIDDEN_PART: form.value.HIDDENPART,
});
data.list = resData.varList;
};
const fnChoice = (item) => {
form.value.HIDDENPART = item.HIDDEN_PART;
form.value.HIDDENDESCR = item.INSPECTION_BASIS;
form.value.HIDDENLEVEL = "hiddenLevel0001";
form.value.HIDDENTYPE = [
item.HIDDEN_TYPE_ONE,
item.HIDDEN_TYPE_TWO,
item.HIDDEN_TYPE_THREE,
];
};
const fnVideoPreview = (event) => {
if (event.url) {
data.videoDialog.visible = true;
data.videoDialog.src = event.url;
}
};
const fnRectificationDepartmentChange = async (event) => {
const resData = await getUserListAll({
DEPARTMENT_ID: event,
});
data.rectifyUserList = resData.userList;
};
watchEffect(() => {
if (form.value.RECTIFICATIONDEPT)
fnRectificationDepartmentChange(form.value.RECTIFICATIONDEPT);
});
const fnClose = () => {
formRef.value.resetFields();
data.list = [];
data.rectifyUserList = [];
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
let currentHiddenId = "";
let params = {
...form.value,
STATE: "0",
HIDDENTYPE1: form.value.HIDDENTYPE[0],
HIDDENTYPE2: form.value.HIDDENTYPE[1],
HIDDENTYPE3: form.value.HIDDENTYPE[2],
HIDDENTYPE_NAME: hiddenDangerTypeRef.value.getCheckedNodes(),
LISTMANAGER_ID: props.listManagerId,
};
if (props.hiddenType === "unqualified") {
if (!props.longitude && !props.latitude) {
ElMessage.error("正在获取当前位置中,请等待");
return;
}
params = {
...params,
SOURCE: "2",
RISK_UNIT: props.info.RISKUNITNAME,
IDENTIFICATION: props.info.PARTSNAME,
RISK_DESCR: props.info.RISK_DESCR,
RISK_POSITION: props.info.POSITIONNAME,
LEVEL: props.info.DNAME5,
CHECK_CONTENT: props.info.CHECK_CONTENT,
RECORDITEM_ID: props.info.RECORDITEM_ID,
RISKITEM_ID: props.info.LISTCHECKITEM_ID,
LONGITUDE: props.longitude,
LATITUDE: props.latitude,
};
const resData = await setInventoryTroubleshootingOtherHiddenDangerAdd(
params
);
currentHiddenId = resData.pd.HIDDEN_ID;
}
if (props.hiddenType === "otherHidden") {
params = {
...params,
HIDDEN_ID: props.info.HIDDEN_ID,
SOURCE: "3",
HAVESCHEME: 0,
};
if (props.type === "add") {
const resData =
await setInventoryTroubleshootingOtherHiddenDangerListAdd(params);
currentHiddenId = resData.pd.HIDDEN_ID;
}
if (props.type === "edit") {
const resData = await setInventoryTroubleshootingOtherHiddenDangerEdit(
params
);
currentHiddenId = resData.pd.HIDDEN_ID;
}
}
for (let i = 0; i < form.value.hiddenImgs.length; i++) {
if (form.value.hiddenImgs[i].raw)
await fnUploadImage(currentHiddenId, form.value.hiddenImgs[i].raw, 3);
}
for (let i = 0; i < form.value.videoFiles.length; i++) {
if (form.value.videoFiles[i].raw)
await fnUploadImage(currentHiddenId, form.value.videoFiles[i].raw, 3);
}
for (let i = 0; i < form.value.rectifyImgs.length; i++) {
if (form.value.rectifyImgs[i].raw)
await fnUploadImage(currentHiddenId, form.value.rectifyImgs[i].raw, 4);
}
fnClose();
ElMessage.success("保存成功");
emits("submit", currentHiddenId);
},
{ atBegin: true }
);
const fnUploadImage = async (HIDDEN_ID, FFILE, TYPE) => {
const formData = new FormData();
formData.append("FOREIGN_KEY", HIDDEN_ID);
formData.append("TYPE", TYPE);
formData.append("FFILE", FFILE);
await setUploadImg(formData);
};
</script>
<style scoped lang="scss">
.item {
cursor: pointer;
border-bottom: 1px dashed #ccc;
padding: 10px 0;
&:first-child {
padding-top: 0;
}
}
</style>

View File

@ -0,0 +1,189 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="90px"
@submit.prevent="fnResetPaginationTransfer"
>
<el-row>
<el-col :span="6">
<el-form-item label="清单名称" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入关键字"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="人员" prop="USERNAME">
<el-input
v-model="searchForm.USERNAME"
placeholder="请输入关键字"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="部门" prop="DEPTIDS">
<layout-department
v-model="searchForm.DEPTIDS"
multiple
show-checkbox
collapse-tags
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="检查状态" prop="STATUS">
<el-select v-model="searchForm.STATUS">
<el-option
v-for="item in [
{ ID: '0', NAME: '未检查' },
{ ID: '1', NAME: '已检查' },
]"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="排查周期" prop="PERIOD">
<el-select v-model="searchForm.PERIOD">
<el-option
v-for="item in troubleshootingCycleList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="清单级别" prop="LISTINGLEVEL">
<el-select v-model="searchForm.LISTINGLEVEL">
<el-option
v-for="item in [
{ BIANMA: '1', NAME: '公司' },
...inventoryLevelList,
]"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
v-model:pagination="pagination"
@get-data="fnGetDataTransfer"
>
<el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="NAME" label="清单名称" />
<el-table-column prop="DEPARTMENT_NAME_ALL" label="部门" />
<el-table-column prop="POST_NAME" label="岗位" />
<el-table-column
prop="USER_NAME"
label="人员"
width="140"
show-overflow-tooltip
/>
<el-table-column
prop="PERIODNAME"
label="排查周期"
width="140"
show-overflow-tooltip
/>
<el-table-column label="检查次数" width="140" show-overflow-tooltip>
<template v-slot="{ row }">
<span :class="{ 'text-red': row.checkCount === 0 }">
{{ row.checkCount }}/1
</span>
</template>
</el-table-column>
<el-table-column
prop="TYPENAME"
label="清单类型"
width="140"
show-overflow-tooltip
/>
<el-table-column label="操作" width="100">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="fnInspect(row.LISTMANAGER_ID)"
>
开始检查
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js";
import LayoutDepartment from "@/components/department/index.vue";
import {
layoutFnGetInventoryLevel,
layoutFnGetTroubleshootingCycle,
} from "@/assets/js/data_dictionary.js";
import { getInventoryTroubleshootingList } from "@/request/hazard_investigation.js";
import { useRouter } from "vue-router";
import { ElMessageBox } from "element-plus";
const router = useRouter();
let ISREST = "";
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getInventoryTroubleshootingList, {
callbackFn: (list, resData) => {
ISREST = resData.ISREST;
},
});
const troubleshootingCycleList = await layoutFnGetTroubleshootingCycle();
const inventoryLevelList = await layoutFnGetInventoryLevel();
const fnGetDataTransfer = () => {
fnGetData({
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
});
};
const fnResetPaginationTransfer = () => {
fnResetPagination({
DEPTIDS: searchForm.value.DEPTIDS?.join(","),
});
};
const fnInspect = (LISTMANAGER_ID) => {
if (ISREST === "1") {
ElMessageBox.alert("您处于离岗状态,无需检查清单");
return;
}
router.push({
path: "/hazard_investigation/inventory_troubleshooting/inspect",
query: { LISTMANAGER_ID },
});
};
</script>
<style scoped></style>

View File

@ -0,0 +1,455 @@
<template>
<layout-card>
<el-divider content-position="left">清单信息</el-divider>
<el-descriptions :column="2" border>
<el-descriptions-item label="清单名称">
{{ info.NAME }}
</el-descriptions-item>
<el-descriptions-item label="排查清单类型">
{{ info.SCREENTYPENAME }}
</el-descriptions-item>
<el-descriptions-item
:label="info.BAO_BAO_TYPE === '1' ? '包保责任人部门' : '所属部门'"
>
{{ info.DEPARTMENT_NAME }}
</el-descriptions-item>
<el-descriptions-item
:label="info.BAO_BAO_TYPE === '1' ? '包保责任人岗位' : '所属岗位'"
>
{{ info.POST_NAME }}
</el-descriptions-item>
<el-descriptions-item label="排查周期">
{{ info.PERIODNAME }}
</el-descriptions-item>
<el-descriptions-item label="清单类型">
{{ info.TYPENAME }}
</el-descriptions-item>
<el-descriptions-item
label="排查日期"
v-if="info.TYPE === 'listType0006'"
>
{{ info.START_DATE }} - {{ info.END_DATE }}
</el-descriptions-item>
<el-descriptions-item label="包保责任人" v-if="info.BAO_BAO_TYPE === '1'">
{{ info.USER_NAME }}
</el-descriptions-item>
</el-descriptions>
<el-divider content-position="left">检查内容</el-divider>
<layout-table :data="inspectionList" :show-pagination="false">
<el-table-column label="序号" width="70" type="index" />
<el-table-column prop="RISKUNITNAME" label="风险点(单元)" />
<el-table-column prop="PARTSNAME" label="辨识部位" />
<el-table-column prop="RISK_DESCR" label="存在风险" />
<el-table-column prop="DNAME5" label="风险分级" />
<el-table-column prop="CHECK_CONTENT" label="检查内容" />
<el-table-column label="操作" width="280">
<template v-slot="{ row, $index }">
<el-radio-group :disabled="row.HASHIDDEN > 0" v-model="row.ISNORMAL">
<el-radio :label="0" @click.prevent="fnQualified($index, row)">
合格
</el-radio>
<el-radio :label="1" @click.prevent="fnUnqualified($index, row)">
不合格
</el-radio>
<el-radio :label="2" @click.prevent="fnNotInvolved($index, row)">
不涉及
</el-radio>
</el-radio-group>
</template>
</el-table-column>
</layout-table>
<el-divider content-position="left">其他隐患</el-divider>
<div class="tr mb-10">
<el-button type="primary" @click="fnAddOrEditOtherHidden({}, 'add')">
添加
</el-button>
</div>
<layout-table :data="otherHiddenList" :show-pagination="false">
<el-table-column label="序号" width="70" type="index" />
<el-table-column prop="HIDDENDESCR" label="隐患描述" />
<el-table-column label="操作" width="280">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="fnAddOrEditOtherHidden(row, 'edit')"
>
修改
</el-button>
<el-button
type="primary"
text
link
@click="fnDeleteOtherHidden(row.HIDDEN_ID)"
>
删除
</el-button>
</template>
</el-table-column>
</layout-table>
<el-form
ref="formRef"
:model="data.form"
:rules="rules"
label-width="100px"
>
<el-row>
<el-col :span="24">
<el-form-item label="检查时间" prop="CHECK_TIME">
<el-date-picker
v-model="data.form.CHECK_TIME"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetime"
placeholder="这里输入检查时间"
/>
</el-form-item>
</el-col>
<template
v-for="(item, index) in data.form.inspectedList"
:key="item.id"
>
<el-col :span="11">
<el-form-item
label="检查部门"
:prop="'inspectedList.' + index + '.DEPARTMENT_ID'"
:rules="{
required: true,
message: '请选择检查部门',
trigger: 'change',
}"
>
<layout-department
v-model="item.DEPARTMENT_ID"
@update:model-value="fnInspectDepartmentChange($event, index)"
/>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item
label="检查人"
:prop="'inspectedList.' + index + '.USER_ID'"
:rules="{
required: true,
message: '请选择检查人',
trigger: 'change',
}"
>
<el-select
:model-value="item.USER_ID"
@change="
verifyDuplicateSelection(
data.form.inspectedList,
index,
'USER_ID',
$event
)
"
>
<el-option
v-for="item in item.userList"
:key="item.USER_ID"
:label="item.NAME"
:value="item.USER_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="2">
<el-form-item label-width="10px">
<el-button
type="primary"
v-if="index === 0"
@click="fnAddInspectedList"
>
添加
</el-button>
<el-button
type="danger"
v-if="index !== 0"
@click="data.form.inspectedList.splice(index, 1)"
>
删除
</el-button>
</el-form-item>
</el-col>
</template>
<el-col :span="24">
<el-form-item label="备注" prop="DESCR">
<el-input
v-model="data.form.DESCR"
type="textarea"
:autosize="{
minRows: 3,
}"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="tc mt-10">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
<qualified
v-model:visible="data.qualifiedDialog.visible"
v-model:form="data.qualifiedDialog.form"
:id="data.qualifiedDialog.RECORDITEM_ID"
/>
<un-qualified
v-model:visible="data.unQualifiedDialog.visible"
v-model:form="data.unQualifiedDialog.form"
:type="data.unQualifiedDialog.type"
:hidden-type="data.unQualifiedDialog.hiddenType"
:list-manager-id="LISTMANAGER_ID"
:info="{ ...data.unQualifiedDialog.info, ...info.value }"
:longitude="data.longitude"
:latitude="data.latitude"
@submit="fnHiddenSubmit"
/>
</layout-card>
</template>
<script setup>
import { nextTick, onMounted, reactive, ref } from "vue";
import {
getInventoryManagementView,
getInventoryTroubleshootingOtherHiddenList,
getInventoryTroubleshootingOtherHiddenDangerView,
setInventoryTroubleshootingOtherHiddenDangerDelete,
setInventoryTroubleshootingSubmit,
} from "@/request/hazard_investigation.js";
import { useRoute, useRouter } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import LayoutDepartment from "@/components/department/index.vue";
import {
addingPrefixToFile,
getFileSuffix,
verifyDuplicateSelection,
} from "@/assets/js/utils.js";
import { getUserListAll } from "@/request/data_dictionary.js";
import { getViewImg } from "@/request/api.js";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage, ElMessageBox } from "element-plus";
import Qualified from "./components/qualified.vue";
import UnQualified from "./components/un_qualified.vue";
import { cloneDeep } from "lodash-es";
const route = useRoute();
const router = useRouter();
const { LISTMANAGER_ID } = route.query;
const rules = {
CHECK_TIME: [
{ required: true, message: "请选择检查时间", trigger: "change" },
],
};
const formRef = ref(null);
const info = ref({});
const data = reactive({
longitude: 0,
latitude: 0,
form: {
CHECK_TIME: "",
inspectedList: [],
},
qualifiedDialog: {
visible: false,
RECORDITEM_ID: "",
form: { file: [] },
},
unQualifiedDialog: {
visible: false,
type: "",
index: "",
hiddenType: "",
info: {},
form: {
HIDDENPART: "",
HIDDENDESCR: "",
HIDDENLEVEL: "",
HIDDEN_CATEGORY: "",
HIDDENTYPE: [],
hiddenImgs: [],
videoFiles: [],
RECTIFICATIONTYPE: "2",
RECTIFYDESCR: "",
rectifyImgs: [],
RECTIFICATIONDEADLINE: "",
RECTIFICATIONDEPT: "",
RECTIFICATIONOR: "",
},
},
});
onMounted(() => {
const geolocation = new window.BMapGL.Geolocation();
geolocation.getCurrentPosition(async (r) => {
if (!r) {
await ElMessageBox.alert("获取位置信息失败,请刷新重试", {
type: "warning",
});
window.location.reload();
}
data.longitude = r.longitude;
data.latitude = r.latitude;
});
});
const { list: inspectionList } = useListData(getInventoryManagementView, {
otherParams: { LISTMANAGER_ID },
usePagination: false,
callbackFn: (list, resData) => {
for (let i = 0; i < list.length; i++) {
if (list[i].HASHIDDEN <= 0) list[i].ISNORMAL = 0;
}
info.value = resData.pd;
},
});
const { list: otherHiddenList, fnGetData: fnGetOtherHidden } = useListData(
getInventoryTroubleshootingOtherHiddenList,
{
otherParams: { LISTMANAGER_ID },
usePagination: false,
key: "hiddenList",
}
);
const fnQualified = async (index, row) => {
if (row.HASHIDDEN > 0) return;
data.qualifiedDialog.visible = true;
await nextTick();
data.qualifiedDialog.RECORDITEM_ID = row.RECORDITEM_ID;
if (row.ISNORMAL === 1) fnRemoveUnqualified(index);
else if (row.ISNORMAL !== 1) {
const resData = await getViewImg({
FOREIGN_KEY: row.RECORDITEM_ID,
TYPE: "14",
});
data.qualifiedDialog.form.file = addingPrefixToFile(resData.imgs);
}
inspectionList.value[index].ISNORMAL = 0;
};
const fnNotInvolved = (index, row) => {
if (row.HASHIDDEN > 0) return;
fnRemoveUnqualified(index);
inspectionList.value[index].ISNORMAL = 2;
};
const fnRemoveUnqualified = (index) => {
inspectionList.value[index].HIDDEN_ID = "";
};
const fnUnqualified = async (index, row) => {
if (row.HASHIDDEN > 0) return;
data.unQualifiedDialog.visible = true;
await nextTick();
if (
inspectionList.value[index].ISNORMAL === 0 ||
inspectionList.value[index].ISNORMAL === 2
)
data.unQualifiedDialog.type = "add";
else if (inspectionList.value[index].ISNORMAL === 1) {
data.unQualifiedDialog.type = "edit";
await fnGetHiddenDangerView(inspectionList.value[index].HIDDEN_ID);
}
data.unQualifiedDialog.info = row;
data.unQualifiedDialog.index = index;
data.unQualifiedDialog.hiddenType = "unqualified";
};
const fnGetHiddenDangerView = async (HIDDEN_ID) => {
const resData = await getInventoryTroubleshootingOtherHiddenDangerView({
HIDDEN_ID,
});
data.unQualifiedDialog.form = resData.pd;
const HIDDENTYPE = [];
const videoFiles = [];
const hiddenImgs = [];
for (let i = 0; i < resData.hImgs.length; i++) {
if (getFileSuffix(resData.hImgs[i].FILEPATH) === "mp4")
videoFiles.push(...addingPrefixToFile([resData.hImgs[i]]));
else hiddenImgs.push(...addingPrefixToFile([resData.hImgs[i]]));
}
data.unQualifiedDialog.form.videoFiles = videoFiles;
data.unQualifiedDialog.form.hiddenImgs = hiddenImgs;
data.unQualifiedDialog.form.rectifyImgs = addingPrefixToFile(resData.rImgs);
if (resData.pd.HIDDENTYPE1) HIDDENTYPE.push(resData.pd.HIDDENTYPE1);
if (resData.pd.HIDDENTYPE2) HIDDENTYPE.push(resData.pd.HIDDENTYPE2);
if (resData.pd.HIDDENTYPE3) HIDDENTYPE.push(resData.pd.HIDDENTYPE3);
data.unQualifiedDialog.form.HIDDENTYPE = HIDDENTYPE;
};
const fnHiddenSubmit = (currentHiddenId) => {
const { hiddenType, index } = data.unQualifiedDialog;
if (hiddenType === "unqualified") {
inspectionList.value[index].ISNORMAL = 1;
inspectionList.value[index].HIDDEN_ID = currentHiddenId;
}
if (hiddenType === "otherHidden") {
fnGetOtherHidden();
}
};
const fnAddInspectedList = () => {
data.form.inspectedList.push({
id: Math.random(),
DEPARTMENT_ID: "",
USER_ID: "",
userList: [],
});
};
fnAddInspectedList();
const fnInspectDepartmentChange = async (event, index) => {
data.form.inspectedList[index].USER_ID = "";
const resData = await getUserListAll({
DEPARTMENT_ID: event,
NOMAIN: "1",
});
data.form.inspectedList[index].userList = resData.userList;
};
const fnDeleteOtherHidden = async (HIDDEN_ID) => {
await ElMessageBox.confirm("确定要删除吗?", {
type: "warning",
});
await setInventoryTroubleshootingOtherHiddenDangerDelete({ HIDDEN_ID });
fnGetOtherHidden();
};
const fnAddOrEditOtherHidden = async (row, type) => {
data.unQualifiedDialog.visible = true;
await nextTick();
data.unQualifiedDialog.type = type;
data.unQualifiedDialog.info = row;
data.unQualifiedDialog.hiddenType = "otherHidden";
if (type === "edit") await fnGetHiddenDangerView(row.HIDDEN_ID);
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const items = [];
const ids = [];
for (let i = 0; i < inspectionList.value.length; i++) {
const item = {};
item.LISTCHECKITEM_ID = inspectionList.value[i].LISTCHECKITEM_ID;
item.ISNORMAL = inspectionList.value[i].ISNORMAL;
item.RECORDITEM_ID = inspectionList.value[i].RECORDITEM_ID;
items.push(item);
if (inspectionList.value[i].ISNORMAL === 1)
ids.push(inspectionList.value[i].HIDDEN_ID);
}
const inspectedList = cloneDeep(data.form.inspectedList);
if (inspectedList.length > 0) inspectedList.splice(0, 1);
await setInventoryTroubleshootingSubmit({
LISTMANAGER_ID,
LIST_NAME: info.value.NAME,
CHECK_TIME: data.form.CHECK_TIME,
DESCR: data.form.DESCR,
ITEMS: JSON.stringify(items),
IDS: ids.join(","),
CHECKDEPT: data.form.inspectedList[0].DEPARTMENT_ID,
CHECKOR: data.form.inspectedList[0].USER_ID,
OTHER: JSON.stringify(inspectedList),
LONGITUDE: data.longitude,
LATITUDE: data.latitude,
});
ElMessage.success("操作成功");
router.back();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,293 @@
<template>
<el-card>
<el-form
:model="searchForm"
label-width="130px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-form-item label="课程名称" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入课程名称"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="教师名称" prop="SPEAKER">
<el-input
v-model="searchForm.SPEAKER"
placeholder="请输入教师名称"
/>
</el-form-item>
</el-col>
<el-col v-show="data.searchFromUnfolded" :span="6">
<el-form-item label="培训板块类型" prop="trainingSectionKey">
<layout-learning-train-type
v-model="searchForm.trainingSectionKey"
type="post"
placeholder="请选择培训板块类型"
/>
</el-form-item>
</el-col>
<el-col v-show="data.searchFromUnfolded" :span="6">
<el-form-item label="培训行业类型" prop="TRAINTYPE">
<layout-learning-train-type
v-model="searchForm.TRAINTYPE"
type="post"
placeholder="请选择培训行业类型"
/>
</el-form-item>
</el-col>
<el-col v-show="data.searchFromUnfolded" :span="6">
<el-form-item label="岗位培训类型" prop="POSTTYPE">
<layout-learning-train-type
v-model="searchForm.POSTTYPE"
type="post"
placeholder="请选择岗位培训类型"
/>
</el-form-item>
</el-col>
<el-col v-show="data.searchFromUnfolded" :span="6">
<el-form-item label="课件状态" prop="STATE">
<el-select v-model="searchForm.STATE" placeholder="请选择状态">
<el-option
v-for="item in data.courseStates"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
<el-button
v-if="!data.searchFromUnfolded"
type="text"
@click="data.searchFromUnfolded = true"
>
展开<el-icon><arrow-down /></el-icon>
</el-button>
<el-button
v-else
type="text"
@click="data.searchFromUnfolded = false"
>
合并<el-icon><arrow-up /></el-icon>
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
>
<el-table-column label="序号" width="50">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column
show-overflow-tooltip
prop="COURSEWARENAME"
label="课件名称"
/>
<el-table-column
show-overflow-tooltip
prop="post_type_name"
label="岗位培训类型"
/>
<el-table-column
show-overflow-tooltip
prop="train_type_name"
label="培训行业类型"
/>
<el-table-column prop="SPEAKER" label="讲师名称" />
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" />
<el-table-column
show-overflow-tooltip
prop="trainingSectionName"
label="培训板块"
/>
<el-table-column prop="CREATTIME" label="上传时间" />
<el-table-column prop="STATE" label="课件状态">
<template v-slot="{ row }">
<template v-if="row.STATE === 0">
<div>启用</div>
</template>
<template v-else-if="row.STATE === 1">
<div>禁用</div>
</template>
</template>
</el-table-column>
<el-table-column label="操作" width="300">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
v-if="interceptTheSuffix(row.COURSEWAREFILES, '.pdf')"
@click="fnPreviewPdf(row.COURSEWAREFILES)"
>
预览
</el-button>
<el-button
type="primary"
text
link
v-if="buttonJurisdiction.edit && row.STATE === 1"
@click="fnEditState(row.DATACOURSEWARE_ID, 0)"
>
启用
</el-button>
<el-button
type="primary"
text
link
v-if="buttonJurisdiction.edit && row.STATE === 0"
@click="fnEditState(row.DATACOURSEWARE_ID, 1)"
>
禁用
</el-button>
<el-button
type="primary"
text
link
v-if="
buttonJurisdiction.edit &&
row.CURRICULUMCOUNT === 0 &&
row.STAGECOUNT === 0 &&
row.ISPLATFORM === '0'
"
>
修改<!-- todo -->
</el-button>
<el-button
type="primary"
text
link
v-if="
buttonJurisdiction.del &&
row.CURRICULUMCOUNT === 0 &&
row.STAGECOUNT === 0 &&
row.ISPLATFORM === '0'
"
@click="fnDelete(row.DATACOURSEWARE_ID)"
>
删除
</el-button>
<el-button
type="primary"
text
link
@click="
router.push({
path: '/online_learn_exam/courseware/data/question_list',
query: {
COURSE_ID: row.DATACOURSEWARE_ID, // ID
COURSE_TYPE: '2', // (1:2:)
},
})
"
>
课件习题
</el-button>
</template>
</el-table-column>
<template #button>
<el-button v-if="buttonJurisdiction.add" type="primary">
新增<!-- todo -->
</el-button>
</template>
</layout-table>
</layout-card>
<layout-pdf
:src="data.pdfDialog.src"
v-model:visible="data.pdfDialog.visible"
/>
</template>
<script setup>
import LayoutCard from "@/components/card/index.vue";
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
import {
getDataCoursewareList,
editDataCoursewareState,
deleteDataCourseware,
} from "@/request/online_learn_exam.js";
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import { interceptTheSuffix, serialNumber } from "@/assets/js/utils.js";
import LayoutTable from "@/components/table/index.vue";
import { ArrowDown, ArrowUp } from "@element-plus/icons-vue";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import { ElMessage, ElMessageBox } from "element-plus";
import { useRouter } from "vue-router";
import LayoutPdf from "@/components/pdf/index.vue";
import { debounce } from "throttle-debounce";
const router = useRouter();
const buttonJurisdiction = await useButtonJurisdiction("courseware");
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getDataCoursewareList);
const data = reactive({
courseStates: [
{ value: "0", label: "启用" },
{ value: "1", label: "禁用" },
],
searchFromUnfolded: false,
pdfDialog: {
src: "",
visible: false,
},
});
const fnPreviewPdf = (FILEPATH) => {
data.pdfDialog.visible = true;
data.pdfDialog.src = FILEPATH;
};
const fnEditState = debounce(
1000,
async (DATACOURSEWARE_ID, STATE) => {
const respData = await editDataCoursewareState({
DATACOURSEWARE_ID,
STATE,
});
if (respData && respData.result === "success") {
ElMessage.success("设置成功");
await fnGetData();
}
},
{ atBegin: true }
);
const fnDelete = debounce(
1000,
async (DATACOURSEWARE_ID) => {
if (DATACOURSEWARE_ID) {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
const respData = await deleteDataCourseware({ DATACOURSEWARE_ID });
if (respData && respData.result === "success") {
ElMessage.success("删除成功");
await fnGetData();
}
}
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,235 @@
<template>
<el-dialog
v-model="visible"
:title="type === 'edit' ? '修改' : '新增'"
:before-close="fnClose"
>
<el-form ref="formRef" :rules="rules" :model="form" label-width="150px">
<el-row>
<el-col :span="24">
<el-form-item label="试题类型" prop="QUESTIONTYPE">
<el-select
v-model="form.QUESTIONTYPE"
placeholder="请选择"
style="width: 100%"
@change="changeQuestionType"
>
<el-option
v-for="item in data.questionTypeList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="题干" prop="QUESTIONDRY">
<el-input
type="textarea"
autosize
maxlength="255"
v-model="form.QUESTIONDRY"
placeholder="这里输入题干"
/>
</el-form-item>
</el-col>
<el-col v-if="form.QUESTIONTYPE !== '3'" :span="24">
<el-form-item label="选项A" prop="OPTIONA">
<el-input
maxlength="255"
v-model="form.OPTIONA"
placeholder="这里输入选项A"
/>
</el-form-item>
</el-col>
<el-col v-if="form.QUESTIONTYPE !== '3'" :span="24">
<el-form-item label="选项B" prop="OPTIONB">
<el-input
maxlength="255"
v-model="form.OPTIONB"
placeholder="这里输入选项B"
/>
</el-form-item>
</el-col>
<el-col v-if="form.QUESTIONTYPE !== '3'" :span="24">
<el-form-item label="选项C" prop="OPTIONC">
<el-input
maxlength="255"
v-model="form.OPTIONC"
placeholder="这里输入选项C"
/>
</el-form-item>
</el-col>
<el-col v-if="form.QUESTIONTYPE !== '3'" :span="24">
<el-form-item label="选项D" prop="OPTIOND">
<el-input
maxlength="255"
v-model="form.OPTIOND"
placeholder="这里输入选项D"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="答案" prop="ANSWER">
<el-select v-model="form.ANSWER" placeholder="请选择">
<el-option
v-for="item in data.answerList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"> </el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModels } from "@vueuse/core";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import { reactive, ref, watchEffect } from "vue";
import { addQuestion, editQuestion } from "@/request/online_learn_exam.js";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
type: {
type: String,
required: true,
default: "",
},
form: {
type: Object,
required: true,
default: () => ({}),
},
});
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, type, form } = useVModels(props, emits);
const data = reactive({
questionTypeList: [
{
value: "1",
label: "单选题",
},
{
value: "2",
label: "多选题",
},
{
value: "3",
label: "判断题",
},
],
answerList: [],
});
const rules = {
QUESTIONTYPE: [
{
required: true,
message: "试题类型(单选题、多选题、判断题)不能为空",
trigger: "blur",
},
],
QUESTIONDRY: [{ required: true, message: "题干不能为空", trigger: "blur" }],
OPTIONA: [{ required: true, message: "选项A不能为空", trigger: "blur" }],
OPTIONB: [{ required: true, message: "选项B不能为空", trigger: "blur" }],
OPTIONC: [{ required: true, message: "选项C不能为空", trigger: "blur" }],
OPTIOND: [{ required: true, message: "选项D不能为空", trigger: "blur" }],
ANSWER: [{ required: true, message: "答案不能为空", trigger: "blur" }],
COURSEWARETYPE: [
{
required: true,
message: "课件类型(1:视频课件、2:资料课件)不能为空",
trigger: "blur",
},
],
COURSEWAREID: [
{ required: true, message: "课件ID不能为空", trigger: "blur" },
],
};
const formRef = ref(null);
const fnClose = () => {
formRef.value.resetFields();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const respData =
type.value === "add"
? await addQuestion({ ...form.value })
: await editQuestion({ ...form.value });
if (respData.result === "success") {
fnClose();
ElMessage.success("保存成功");
emits("get-data");
}
},
{ atBegin: true }
);
const changeAnswerList = () => {
data.answerList = [];
if (form.value.QUESTIONTYPE === "1") {
data.answerList = [
{ value: "A", label: "A" },
{ value: "B", label: "B" },
{ value: "C", label: "C" },
{ value: "D", label: "D" },
];
} else if (form.value.QUESTIONTYPE === "2") {
data.answerList = [
{ value: "AB", label: "AB" },
{ value: "AC", label: "AC" },
{ value: "AD", label: "AD" },
{ value: "BC", label: "BC" },
{ value: "BD", label: "BD" },
{ value: "CD", label: "CD" },
{ value: "ABC", label: "ABC" },
{ value: "ABD", label: "ABD" },
{ value: "ACD", label: "ACD" },
{ value: "BCD", label: "BCD" },
{ value: "ABCD", label: "ABCD" },
];
} else if (form.value.QUESTIONTYPE === "3") {
data.answerList = [
{ value: "A", label: "正确" },
{ value: "B", label: "错误" },
];
}
};
const changeQuestionType = () => {
form.value.ANSWER = "";
changeAnswerList();
};
watchEffect(() => {
if (form.value.QUESTIONTYPE) {
changeAnswerList();
}
});
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,272 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="130px"
@submit.prevent="fnResetPaginationTransfer"
>
<el-row>
<el-col :span="6">
<el-form-item label="题干" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入题干"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
</el-form-item>
</el-col>
<el-col :span="6"></el-col>
<el-col :span="6">
<el-form-item label-width="10px" class="end">
<el-button @click="fnImportDialogChangeShow"></el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
row-key="QUESTION_ID"
:data="list"
@get-data="fnGetDataTransfer"
v-model:pagination="pagination"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column prop="QUESTIONNUMBER" label="题号" width="60" />
<el-table-column
prop="QUESTIONTYPE"
label="试题类型"
show-overflow-tooltip
width="80"
>
<template v-slot="{ row }">
{{ fnFormatterQuestionType(row) }}
</template>
</el-table-column>
<el-table-column
show-overflow-tooltip
prop="QUESTIONDRY"
label="题干"
align="left"
/>
<el-table-column
show-overflow-tooltip
prop="ANSWER"
label="答案"
width="55"
>
<template v-slot="{ row }">
<template v-if="row.QUESTIONTYPE === '3'">
<div v-if="row.ANSWER === 'A'"></div>
<div v-if="row.ANSWER === 'B'"></div>
</template>
<template v-else>
<div>{{ row.ANSWER }}</div>
</template>
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
v-if="
buttonJurisdiction.edit &&
row.STUDYCOUNT === 0 &&
row.COURSEEXAMRECORDCOUNT === 0 &&
row.STAGEEXAMRECORDCOUNT === 0 &&
row.COURSEEXAMCOUNT === 0 &&
row.STAGEEXAMCOUNT === 0
"
@click="fnAddOrEdit(row)"
>
修改
</el-button>
<el-button
type="primary"
text
link
v-if="
buttonJurisdiction.del &&
row.STUDYCOUNT === 0 &&
row.COURSEEXAMRECORDCOUNT === 0 &&
row.STAGEEXAMRECORDCOUNT === 0 &&
row.COURSEEXAMCOUNT === 0 &&
row.STAGEEXAMCOUNT === 0
"
@click="fnDelete(row.QUESTION_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
v-if="buttonJurisdiction.add"
type="primary"
@click="fnAddOrEdit(null)"
>
新增
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="danger"
@click="fnBatchDelete"
>
删除
</el-button>
</template>
</layout-table>
</layout-card>
<layout-import-file
v-model:visible="data.importDialogVisible"
template-url="/template/questionExcelTemplate.xls"
@submit="fnSubmitImport"
/>
<add
v-model:visible="data.addOrEditDialog.visible"
v-model:form="data.addOrEditDialog.form"
:type="data.addOrEditDialog.type"
@get-data="fnResetPaginationTransfer"
/>
</div>
</template>
<script setup>
import LayoutTable from "@/components/table/index.vue";
import LayoutCard from "@/components/card/index.vue";
import {
importQuestion,
deleteQuestion,
deleteQuestionBatch,
getQuestionListByCoursewareIdAndType,
} from "@/request/online_learn_exam.js";
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import { useRoute } from "vue-router";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import { debounce } from "throttle-debounce";
import { ElMessage, ElMessageBox } from "element-plus";
import LayoutImportFile from "@/components/import_file/index.vue";
import Add from "./components/add.vue";
const route = useRoute();
const { COURSE_ID, COURSE_TYPE } = route.query;
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
useListData(getQuestionListByCoursewareIdAndType, {
otherParams: { COURSEWAREID: COURSE_ID, COURSEWARETYPE: COURSE_TYPE },
});
const buttonJurisdiction = await useButtonJurisdiction("courseware");
const data = reactive({
importDialogVisible: false,
questionTypeOptions: [
{
value: "1",
label: "单选题",
},
{
value: "2",
label: "多选题",
},
{
value: "3",
label: "判断题",
},
],
addOrEditDialog: {
visible: false,
form: {},
type: "add",
},
});
const fnGetDataTransfer = async () => {
await fnGetData({
COURSEWAREID: COURSE_ID,
COURSEWARETYPE: COURSE_TYPE,
});
};
const fnResetPaginationTransfer = async () => {
await fnResetPagination({
COURSEWAREID: COURSE_ID,
COURSEWARETYPE: COURSE_TYPE,
});
};
const fnFormatterQuestionType = (row) => {
let label = "";
data.questionTypeOptions.forEach((option) => {
if (option.value === row.QUESTIONTYPE) {
label = option.label;
}
});
return label;
};
const fnDelete = debounce(
1000,
async (QUESTION_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await deleteQuestion({ QUESTION_ID });
ElMessage.success("删除成功");
fnGetDataTransfer();
},
{ atBegin: true }
);
const fnBatchDelete = debounce(
1000,
async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选中要删除的项");
return;
}
await ElMessageBox.confirm("确定要删除选中的数据吗?", { type: "warning" });
const DATA_IDS = selectionData.map((item) => item.RISKUNIT_ID).join(",");
await deleteQuestionBatch({ DATA_IDS });
ElMessage.success("删除成功");
fnResetPaginationTransfer();
},
{ atBegin: true }
);
const fnImportDialogChangeShow = () => {
data.importDialogVisible = !data.importDialogVisible;
};
const fnSubmitImport = async (formData) => {
formData.append("COURSEWARETYPE", COURSE_TYPE);
formData.append("COURSEWAREID", COURSE_ID);
const respData = await importQuestion(formData);
ElMessage.success(respData.msg);
fnImportDialogChangeShow();
fnResetPaginationTransfer();
};
const fnAddOrEdit = (row) => {
data.addOrEditDialog.form = {};
if (row) {
data.addOrEditDialog.form = JSON.parse(JSON.stringify(row));
data.addOrEditDialog.type = "edit";
} else {
data.addOrEditDialog.form.COURSEWAREID = COURSE_ID;
data.addOrEditDialog.form.COURSEWARETYPE = COURSE_TYPE;
data.addOrEditDialog.type = "add";
}
data.addOrEditDialog.visible = true;
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,340 @@
<template>
<el-card>
<el-form
:model="searchForm"
label-width="130px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-form-item label="课程名称" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入课程名称"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="教师名称" prop="SPEAKER">
<el-input
v-model="searchForm.SPEAKER"
placeholder="请输入教师名称"
/>
</el-form-item>
</el-col>
<el-col v-show="data.searchFromUnfolded" :span="6">
<el-form-item label="培训板块类型" prop="trainingSectionKey">
<layout-learning-train-type
v-model="searchForm.trainingSectionKey"
type="post"
placeholder="请选择培训板块类型"
/>
</el-form-item>
</el-col>
<el-col v-show="data.searchFromUnfolded" :span="6">
<el-form-item label="培训行业类型" prop="TRAINTYPE">
<layout-learning-train-type
v-model="searchForm.TRAINTYPE"
type="post"
placeholder="请选择培训行业类型"
/>
</el-form-item>
</el-col>
<el-col v-show="data.searchFromUnfolded" :span="6">
<el-form-item label="岗位培训类型" prop="POSTTYPE">
<layout-learning-train-type
v-model="searchForm.POSTTYPE"
type="post"
placeholder="请选择岗位培训类型"
/>
</el-form-item>
</el-col>
<el-col v-show="data.searchFromUnfolded" :span="6">
<el-form-item label="课件状态" prop="STATE">
<el-select v-model="searchForm.STATE" placeholder="请选择状态">
<el-option
v-for="item in data.courseStates"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
<el-button
v-if="!data.searchFromUnfolded"
type="text"
@click="data.searchFromUnfolded = true"
>
展开<el-icon><arrow-down /></el-icon>
</el-button>
<el-button
v-else
type="text"
@click="data.searchFromUnfolded = false"
>
合并<el-icon><arrow-up /></el-icon>
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
>
<el-table-column label="序号" width="50">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column
show-overflow-tooltip
prop="COURSEWARENAME"
label="课件名称"
/>
<el-table-column
show-overflow-tooltip
prop="post_type_name"
label="岗位培训类型"
/>
<el-table-column
show-overflow-tooltip
prop="train_type_name"
label="培训行业类型"
/>
<el-table-column prop="SPEAKER" label="讲师名称" />
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" />
<el-table-column
show-overflow-tooltip
prop="trainingSectionName"
label="培训板块"
/>
<el-table-column prop="CREATTIME" label="上传时间" />
<el-table-column prop="STATE" label="课件状态">
<template v-slot="{ row }">
<template v-if="row.STATE === 0">
<div>启用</div>
</template>
<template v-else-if="row.STATE === 1">
<div>禁用</div>
</template>
</template>
</el-table-column>
<el-table-column prop="CURRICULUM_ID_REMOTE" label="课件来源">
<template v-slot="{ row }">
<template v-if="row.CURRICULUM_ID_REMOTE">
<div>商城</div>
</template>
<template v-else>
<div>自传</div>
</template>
</template>
</el-table-column>
<el-table-column prop="NUMEXAMPLE" label="习题数" />
<el-table-column label="操作" width="300">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
v-if="
(row.VIDEOCOURSEWARE_ID_REMOTE &&
row.VIDEOCOURSEWARE_ID_REMOTE.length > 0) ||
(row.VIDEOFILES && row.VIDEOFILES.length > 0)
"
@click="fnPreviewVideo(row)"
>
预览
</el-button>
<el-button
type="primary"
text
link
v-if="buttonJurisdiction.edit && row.STATE === 1"
@click="fnEditState(row.VIDEOCOURSEWARE_ID, 0)"
>
启用
</el-button>
<el-button
type="primary"
text
link
v-if="buttonJurisdiction.edit && row.STATE === 0"
@click="fnEditState(row.VIDEOCOURSEWARE_ID, 1)"
>
禁用
</el-button>
<el-button
type="primary"
text
link
v-if="
buttonJurisdiction.edit &&
row.CURRICULUMCOUNT === 0 &&
row.STAGECOUNT === 0 &&
row.ISPLATFORM === 0
"
>
修改<!-- todo -->
</el-button>
<el-button
type="primary"
text
link
v-if="
buttonJurisdiction.del &&
row.CURRICULUMCOUNT === 0 &&
row.STAGECOUNT === 0 &&
row.ISPLATFORM === 0
"
@click="fnDelete(row.VIDEOCOURSEWARE_ID)"
>
删除
</el-button>
<el-button
type="primary"
text
link
@click="
router.push({
path: '/online_learn_exam/courseware/video/question_list',
query: {
COURSE_ID: row.VIDEOCOURSEWARE_ID, // ID
COURSE_TYPE: '1', // (1:2:)
},
})
"
>
课件习题
</el-button>
</template>
</el-table-column>
<template #button>
<el-button v-if="buttonJurisdiction.add" type="primary">
新增<!-- todo -->
</el-button>
</template>
</layout-table>
</layout-card>
<layout-video
:src="data.videoDialog.src"
:vid="data.videoDialog.vid"
:play-auth="data.videoDialog.playAuth"
v-model:visible="data.videoDialog.visible"
/>
</template>
<script setup>
import LayoutCard from "@/components/card/index.vue";
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
import {
getVideoCoursewareList,
editVideoCoursewareState,
deleteVideoCourseware,
} from "@/request/online_learn_exam.js";
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import { serialNumber } from "@/assets/js/utils.js";
import LayoutTable from "@/components/table/index.vue";
import LayoutVideo from "@/components/video/index.vue";
import { getVideoAuth, getVideoSource } from "@/request/api.js";
import { ArrowDown, ArrowUp } from "@element-plus/icons-vue";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import { ElMessage, ElMessageBox } from "element-plus";
import { useRouter } from "vue-router";
import { debounce } from "throttle-debounce";
const router = useRouter();
const buttonJurisdiction = await useButtonJurisdiction("courseware");
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getVideoCoursewareList);
const data = reactive({
courseStates: [
{ value: "0", label: "启用" },
{ value: "1", label: "禁用" },
],
searchFromUnfolded: false,
videoDialog: {
src: "",
vid: "",
playAuth: "",
visible: false,
},
});
const fnPreviewVideo = async (row) => {
data.videoDialog.src = "";
data.videoDialog.vid = "";
data.videoDialog.playAuth = "";
if (
row.VIDEOCOURSEWARE_ID_REMOTE &&
row.VIDEOCOURSEWARE_ID_REMOTE.length > 0
) {
const respData = await getVideoSource({
VIDEOCOURSEWARE_ID: row.VIDEOCOURSEWARE_ID_REMOTE,
CURRICULUM_ID: row.CURRICULUM_ID_REMOTE,
});
if (respData && respData.type === "success") {
const video = {};
respData.videoList?.forEach((item) => {
video[item.definition] = item.playURL;
});
data.videoDialog.src = JSON.stringify(video);
data.videoDialog.visible = true;
}
} else if (row.VIDEOFILES && row.VIDEOFILES.length > 0) {
const respData = await getVideoAuth({
videoId: row.VIDEOFILES,
});
if (respData && respData.type === "success") {
data.videoDialog.playAuth = respData.playAuth;
data.videoDialog.vid = row.VIDEOFILES;
data.videoDialog.visible = true;
}
}
};
const fnEditState = debounce(
1000,
async (VIDEOCOURSEWARE_ID, STATE) => {
const respData = await editVideoCoursewareState({
VIDEOCOURSEWARE_ID,
STATE,
});
if (respData && respData.result === "success") {
ElMessage.success("设置成功");
await fnGetData();
}
},
{ atBegin: true }
);
const fnDelete = debounce(
1000,
async (VIDEOCOURSEWARE_ID) => {
if (VIDEOCOURSEWARE_ID) {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
const respData = await deleteVideoCourseware({ VIDEOCOURSEWARE_ID });
if (respData && respData.result === "success") {
ElMessage.success("删除成功");
await fnGetData();
}
}
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -210,7 +210,7 @@ const fnPreviewVideo = async (row) => {
});
if (respData && respData.type === "success") {
const video = {};
respData.videoList.forEach((item) => {
respData.videoList?.forEach((item) => {
video[item.definition] = item.playURL;
});
data.videoDialog.src = JSON.stringify(video);

View File

@ -196,7 +196,7 @@ const fnPreviewVideo = async (row) => {
});
if (respData && respData.type === "success") {
const video = {};
respData.videoList.forEach((item) => {
respData.videoList?.forEach((item) => {
video[item.definition] = item.playURL;
});
data.videoDialog.src = JSON.stringify(video);

View File

@ -4,7 +4,6 @@
<el-descriptions-item label="试卷名称">
{{ data.paperInfo.EXAMNAME }}
</el-descriptions-item>
<el-descriptions-item label="" />
<el-descriptions-item label="试卷总分">
{{ data.paperInfo.EXAMSCORE }}
</el-descriptions-item>
@ -37,57 +36,53 @@
</el-descriptions-item>
</el-descriptions>
<template v-for="(row, index) in data.questionList" :key="row.QUESTION_ID">
<div>
<el-row>
<el-col :span="24">
{{ index + 1 }}.
<el-text v-if="row.QUESTIONTYPE === '1'" type="info">
(单选题)
</el-text>
<el-text v-if="row.QUESTIONTYPE === '2'" type="info">
(多选题)
</el-text>
<el-text v-if="row.QUESTIONTYPE === '3'" type="info">
(判断题)
</el-text>
{{ row.QUESTIONDRY }}
</el-col>
</el-row>
<el-space wrap>
<el-radio-group
v-if="row.QUESTIONTYPE === '1'"
:disabled="true"
v-model="row.ANSWER"
>
<el-radio label="A">A.{{ row.OPTIONA }}</el-radio>
<el-radio label="B">B.{{ row.OPTIONB }}</el-radio>
<el-radio label="C">C.{{ row.OPTIONC }}</el-radio>
<el-radio label="D">D.{{ row.OPTIOND }}</el-radio>
</el-radio-group>
<el-checkbox-group
v-if="row.QUESTIONTYPE === '2'"
:disabled="true"
:model-value="row.ANSWER.split('')"
>
<el-checkbox label="A">A.{{ row.OPTIONA }}</el-checkbox>
<el-checkbox label="B">B.{{ row.OPTIONB }}</el-checkbox>
<el-checkbox label="C">C.{{ row.OPTIONC }}</el-checkbox>
<el-checkbox label="D">D.{{ row.OPTIOND }}</el-checkbox>
</el-checkbox-group>
<el-radio-group
v-if="row.QUESTIONTYPE === '3'"
:disabled="true"
v-model="row.ANSWER"
>
<el-radio label="A">A.{{ row.OPTIONA }}</el-radio>
<el-radio label="B">B.{{ row.OPTIONB }}</el-radio>
</el-radio-group>
</el-space>
<div>答案{{ row.ANSWER }}</div>
<div v-for="(row, index) in data.questionList" :key="row.QUESTION_ID">
<div class="mt-20">
{{ index + 1 }}.
<span v-if="row.QUESTIONTYPE === '1'" class="question-type">
(单选题)
</span>
<span v-if="row.QUESTIONTYPE === '2'" class="question-type">
(多选题)
</span>
<span v-if="row.QUESTIONTYPE === '3'" class="question-type">
(判断题)
</span>
{{ row.QUESTIONDRY }}
</div>
</template>
<div class="mt-10 ml-30">
<el-radio-group
v-if="row.QUESTIONTYPE === '1'"
:disabled="true"
v-model="row.ANSWER"
>
<el-radio label="A">A.{{ row.OPTIONA }}</el-radio>
<el-radio label="B">B.{{ row.OPTIONB }}</el-radio>
<el-radio label="C">C.{{ row.OPTIONC }}</el-radio>
<el-radio label="D">D.{{ row.OPTIOND }}</el-radio>
</el-radio-group>
<el-checkbox-group
v-if="row.QUESTIONTYPE === '2'"
:disabled="true"
:model-value="row.ANSWER.split('')"
>
<el-checkbox label="A">A.{{ row.OPTIONA }}</el-checkbox>
<el-checkbox label="B">B.{{ row.OPTIONB }}</el-checkbox>
<el-checkbox label="C">C.{{ row.OPTIONC }}</el-checkbox>
<el-checkbox label="D">D.{{ row.OPTIOND }}</el-checkbox>
</el-checkbox-group>
<el-radio-group
v-if="row.QUESTIONTYPE === '3'"
:disabled="true"
v-model="row.ANSWER"
>
<el-radio label="A">A.{{ row.OPTIONA }}</el-radio>
<el-radio label="B">B.{{ row.OPTIONB }}</el-radio>
</el-radio-group>
</div>
<div class="mt-10">答案{{ row.ANSWER }}</div>
</div>
</layout-card>
</template>
@ -114,4 +109,9 @@ const fnGetPaperInfo = async () => {
await fnGetPaperInfo();
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
.question-type {
font-size: 12px;
color: gray;
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<el-dialog
v-model="visible"
:title="type === 'add' ? '新增' : '修改'"
:title="title ? title : type === 'add' ? '新增' : '修改'"
:before-close="fnClose"
>
<el-form ref="formRef" :rules="rules" :model="form" label-width="240px">
@ -150,44 +150,46 @@
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="管控措施分类1" prop="MANAGEMENT_CONTROL_ONE">
<el-select
v-model="form.MANAGEMENT_CONTROL_ONE"
@change="form.MANAGEMENT_CONTROL_TWO = ''"
>
<el-option
v-for="item in controlList1"
:key="item.id"
:label="item.name"
:value="item.id"
<template v-if="control">
<el-col :span="24">
<el-form-item label="管控措施分类1" prop="MANAGEMENT_CONTROL_ONE">
<el-select
v-model="form.MANAGEMENT_CONTROL_ONE"
@change="form.MANAGEMENT_CONTROL_TWO = ''"
>
<el-option
v-for="item in controlList1"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="管控措施分类2" prop="MANAGEMENT_CONTROL_TWO">
<el-select v-model="form.MANAGEMENT_CONTROL_TWO">
<el-option
v-for="item in controlList2"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="管控措施分类3" prop="MANAGEMENT_CONTROL_THREE">
<el-input
v-model="form.MANAGEMENT_CONTROL_THREE"
type="textarea"
:autosize="{
minRows: 3,
}"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="管控措施分类2" prop="MANAGEMENT_CONTROL_TWO">
<el-select v-model="form.MANAGEMENT_CONTROL_TWO">
<el-option
v-for="item in controlList2"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="管控措施分类3" prop="MANAGEMENT_CONTROL_THREE">
<el-input
v-model="form.MANAGEMENT_CONTROL_THREE"
type="textarea"
:autosize="{
minRows: 3,
}"
/>
</el-form-item>
</el-col>
</el-form-item>
</el-col>
</template>
</el-row>
</el-form>
<template #footer>
@ -232,6 +234,14 @@ const props = defineProps({
required: true,
default: "",
},
control: {
type: Boolean,
default: true,
},
title: {
type: String,
default: "",
},
});
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form } = useVModels(props, emits);
@ -371,11 +381,12 @@ const fnSubmit = debounce(
ACCIDENTS: form.value.ACCIDENTS.join(","),
ACCIDENTS_NAME,
};
if (props.type === "add") await setRiskControlLedgerAdd(params);
else await setRiskControlLedgerEdit(params);
let resData = {};
if (props.type === "add") resData = await setRiskControlLedgerAdd(params);
else resData = await setRiskControlLedgerEdit(params);
ElMessage.success("操作成功");
fnClose();
emits("get-data");
emits("get-data", resData.pd);
},
{ atBegin: true }
);

View File

@ -34,7 +34,6 @@
multiple
show-checkbox
collapse-tags
root-disabled="N"
/>
</el-form-item>
</el-col>

View File

@ -1,5 +1,5 @@
<template>
<layout-print-table-package :entrance="entrance" :thead-height="65.5">
<layout-print-table-package :entrance="entrance">
<table>
<thead>
<tr>