PC端八项作业

pull/3/head
chenxinying 2024-02-29 08:46:56 +08:00
parent 3c7c37d7f2
commit 305800c71a
32 changed files with 3604 additions and 3400 deletions

View File

@ -184,7 +184,7 @@ a {
display: none;
}
@mixin table {
@mixin table($tdTextAlign,$titleTextAlign) {
border-collapse: collapse;
width: 100%;
display: table;
@ -198,17 +198,22 @@ a {
border: 1px solid var(--el-border-color);
padding: 8px;
line-height: 1.6;
text-align: center;
text-align: $tdTextAlign;
}
.title {
background: var(--el-fill-color-light);
width: 200px;
text-align: $titleTextAlign;
}
}
.print_table {
@include table;
@include table(center,left);
}
.archive_print_table {
@include table(left,center);
}
img.ml-10:first-child {
@ -326,7 +331,7 @@ div::-webkit-scrollbar-track {
}
.print_use {
@include table;
@include table(center,left);
}
.print_no_use {

View File

@ -1794,6 +1794,14 @@ export default [
},
component: "blind_plate_plugging/job_data/view",
},
{
path: "/blind_plate_plugging/job_data/add_video",
meta: {
title: "添加监控",
activeMenu: "/blind_plate_plugging/job_data",
},
component: "eightwork_videomanager/index",
},
],
},
{
@ -1834,6 +1842,14 @@ export default [
},
component: "groundbreaking/job_data/view",
},
{
path: "/blind_plate_plugging/job_data/add_video",
meta: {
title: "添加监控",
activeMenu: "/blind_plate_plugging/job_data",
},
component: "eightwork_videomanager/index",
},
],
},
{
@ -1922,6 +1938,14 @@ export default [
},
component: "hoisting/job_data/view",
},
{
path: "/hoisting/job_data/add_video",
meta: {
title: "添加监控",
activeMenu: "/hoisting/job_data",
},
component: "eightwork_videomanager/index",
},
],
},
{
@ -1942,6 +1966,7 @@ export default [
},
],
},
{
path: "/open_circuit",
redirect: "/open_circuit/job_data",
@ -1962,6 +1987,14 @@ export default [
},
component: "open_circuit/job_data/view",
},
{
path: "/open_circuit/job_data/add_video",
meta: {
title: "添加监控",
activeMenu: "/open_circuit/job_data",
},
component: "eightwork_videomanager/index",
},
],
},
{
@ -2002,6 +2035,14 @@ export default [
},
component: "temporary_electricity_usage/job_data/view",
},
{
path: "/temporary_electricity_usage/job_data/add_video",
meta: {
title: "添加监控",
activeMenu: "/temporary_electricity_usage/job_data",
},
component: "eightwork_videomanager/index",
},
],
},
{

View File

@ -10,6 +10,9 @@ export default function usePrint() {
id: "printContent",
closeCallback() {
document.querySelector("#printContent").style.overflow = "hidden";
for (let i = 0; i < elements.length; i++) {
elements[i].removeAttribute("style");
}
},
};
const fnPrint = () => {

View File

@ -1,6 +0,0 @@
import { post } from "@/request/axios.js";
export const getBlindPlatePluggingList = (params) =>
post("/blindboard/list", params); // 盲板抽堵作业管理列表
export const getBlindPlatePluggingView = (params) =>
post("/blindboard/goEdit", params); // 盲板抽堵作业管理查看

View File

@ -19,3 +19,33 @@ export const getHighWorkView = (params) => post("/highwork/findById", params); /
export const getHighWorkFlow = (params) =>
post("/highwork/getFlowList", params); // 高处作业流程图
export const getHoistingList = (params) => post("/hoisting/list", params);
export const getHoistingView = (params) => post("/hoisting/findById", params);
export const getHoistingFlow = (params) =>
post("/hoisting/getFlowList", params);
export const getBlindBoardList = (params) => post("/blindboard/list", params);
export const getBlindBoardView = (params) =>
post("/blindboard/findById", params);
export const getBlindBoardFlow = (params) =>
post("/blindboard/getFlowList", params);
export const getGroundbreakingList = (params) =>
post("/breakground/list", params);
export const getGroundbreakingView = (params) =>
post("/breakground/findById", params);
export const getGroundbreakingFlow = (params) =>
post("/breakground/getFlowList", params);
export const getOpenCircuitList = (params) => post("/cutroad/list", params);
export const getOpenCircuitView = (params) => post("/cutroad/findById", params);
export const getOpenCircuitFlow = (params) =>
post("/cutroad/getFlowList", params);
export const getTemporaryElectricityUsageList = (params) =>
post("/electricity/list", params);
export const getTemporaryElectricityUsageView = (params) =>
post("/electricity/findById", params);
export const getTemporaryElectricityUsageFlow = (params) =>
post("/electricity/getFlowList", params);

View File

@ -1,4 +0,0 @@
import { post } from "@/request/axios.js";
export const getHoistingList = (params) => post("/hoisting/list", params); // 吊装作业管理列表
export const getHoistingView = (params) => post("/hoisting/goEdit", params); // 吊装作业管理查看

View File

@ -191,7 +191,7 @@
<td colspan="10">
<div>
安全交底人
<div v-if="data.signs.CONFESS[0].IMG_PATH">
<div v-if="data.signs.CONFESS[0].IMG_PATH[0]">
<template
v-for="img in data.signs.CONFESS[0].IMG_PATH"
:key="img"

View File

@ -143,7 +143,7 @@
<td colspan="10">
<div>
安全交底人
<div v-if="data.signs.CONFESS[0].IMG_PATH">
<div v-if="data.signs.CONFESS[0].IMG_PATH[0]">
<template
v-for="img in data.signs.CONFESS[0].IMG_PATH"
:key="img"

View File

@ -1,81 +1,17 @@
<template>
<el-dialog v-model="visible" title="查看流程图" width="1200px">
<el-steps
:active="fnGetStatus()"
:process-status="fnGetProcessStatus()"
align-center
finish-status="success"
>
<el-step title="盲板抽堵作业提交">
<template #description>
<div>{{ fnGetProcessMessage().title }}</div>
<div>{{ fnGetProcessMessage().USER_NAME }}</div>
<div>{{ fnGetProcessMessage().OPERATTIME }}</div>
<el-dialog v-model="visible" title="查看流程图" width="1500px">
<el-scrollbar style="height: 150px">
<el-steps align-center finish-status="success" style="width: 2000px">
<template v-for="(item, index) in flowList" :key="index">
<el-step :title="item.STEP_NAME" :status="fnGetStatus(item)">
<template #description>
<div>{{ fnGetShowStepUser(item) }}</div>
<div>{{ item.ACT_TIME }}</div>
</template>
</el-step>
</template>
</el-step>
<el-step title="作业负责人意见">
<template #description>
<div>{{ info.CONSTRUCTION_USER_NAME }}</div>
<div>{{ info.CONSTRUCTION_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="所在单位意见">
<template #description>
<div>{{ info.LEADER_USER_NAME }}</div>
<div>{{ info.LEADER_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="完成验收">
<template #description>
<div>{{ info.ACCEPT_USER_NAME }}</div>
<div>{{ info.ACCEPT_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="验收归档">
<template #description>
<div>{{ info.ACCEPT_USER_NAME }}</div>
<div>{{ info.ACCEPT_USER_SIGNER_TIME }}</div>
</template>
</el-step>
</el-steps>
<div
style="
margin: 60px 60px 0 60px;
display: flex;
justify-content: space-between;
"
>
<div v-if="info.GUARDIAN_USER_SIGNER_TIME">
<div class="el-step__title is-success">
监护人{{ info.GUARDIAN_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.GUARDIAN_USER_SIGNER_TIME">
<div class="el-step__title is-error">
监护人{{ info.GUARDIAN_USER_NAME }}未签字
</div>
</div>
<div v-if="info.CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-success">
安全交底人{{ info.CONFESS_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-error">
安全交底人{{ info.CONFESS_USER_NAME }}未签字
</div>
</div>
<div v-if="info.ACCEPT_CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-success">
接受交底人{{ info.ACCEPT_CONFESS_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.ACCEPT_CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-error">
接受交底人{{ info.ACCEPT_CONFESS_USER_NAME }}未签字
</div>
</div>
</div>
</el-steps>
</el-scrollbar>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
@ -91,7 +27,12 @@ const props = defineProps({
required: true,
default: false,
},
info: {
flowList: {
type: Object,
required: true,
default: () => {},
},
flowing: {
type: Object,
required: true,
default: () => {},
@ -99,45 +40,27 @@ const props = defineProps({
});
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);
const fnGetStatus = () => {
const result = {
1: 1,
4: 2,
5: 3,
6: 5,
};
return result[props.info.APPLY_STATUS] || 0;
const fnGetStatus = (step) => {
if (step.STATUS === 1) {
return "finish";
} else if (step.STATUS < 0) {
return "error";
} else if (step.CURRENT_STEP) {
return "process";
}
};
const fnGetProcessStatus = () => {
if (props.info.APPLY_STATUS < "0") return "error";
else return "process";
};
const fnGetProcessMessage = () => {
const info = props.info;
const result = {
"-2": {
title: "作业负责人审核打回",
USER_NAME: info.CONSTRUCTION_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-5": {
title: "所在单位审核打回",
USER_NAME: info.LEADER_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-6": {
title: "验收打回",
USER_NAME: info.ACCEPT_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
};
return (
result[props.info.APPLY_STATUS] || {
title: "",
USER_NAME: info.APPLY_USER_NAME,
OPERATTIME: info.CREATTIME,
}
);
const fnGetShowStepUser = (step) => {
if (step.SIGN_USER) {
return step.SIGN_USER;
} else if (step.FINISHED_SIGN_USER) {
return step.FINISHED_SIGN_USER;
} else if (step.ACT_USER_NAME) {
return step.ACT_USER_NAME;
} else if (step.CAN_SKIP && !props.flowing[step.ACTOR_FIELD]) {
return "已跳过";
}
};
</script>

View File

@ -20,13 +20,13 @@
</el-form-item>
</el-col>
<el-col v-if="entrance === 'job_data'" :span="6">
<el-form-item label="状态" prop="APPLY_STATUS">
<el-select v-model="searchForm.APPLY_STATUS">
<el-form-item label="状态" prop="STEP_ID">
<el-select v-model="searchForm.STEP_ID">
<el-option
v-for="item in stateList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
v-for="item in stepList"
:key="item.STEP_ID"
:label="item.STEP_NAME"
:value="item.STEP_ID"
/>
</el-select>
</el-form-item>
@ -62,7 +62,7 @@
<el-table-column prop="APPLY_USER_NAME" label="申请人" width="100" />
<el-table-column prop="APPLY_DEPARTMENT_NAME" label="申请部门" />
<el-table-column
prop="CONSTRUCTION_USER_NAME"
prop="CONFIRM_USER_NAME"
label="作业负责人"
show-overflow-tooltip
/>
@ -76,19 +76,22 @@
label="验收部门负责人"
show-overflow-tooltip
/>
<el-table-column label="审核状态">
<el-table-column label="审核状态" width="170">
<template #default="{ row }">
{{
entrance === "job_data"
? translationStatus(row.APPLY_STATUS, stateList)
: "已归档"
}}
<span v-if="row.STEP_ID === 0"></span>
<span v-else-if="row.STATUS === -2">气体检测打回</span>
<span v-else-if="row.STEP_ID !== -1">{{ row.NEXT_STEP_NAME }}</span>
<span v-else>{{ row.STEP_NAME }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="250">
<template #default="{ row }">
<el-button
v-if="entrance === 'job_data' && row.APPLY_STATUS !== '6'"
v-if="
entrance === 'job_data' &&
row.STATUS > -1 &&
row.NEXT_STEP_ID !== 99
"
type="primary"
text
link
@ -109,10 +112,23 @@
type="primary"
text
link
@click="fnFlowChart(row)"
@click="fnFlowChart(row.BLINDBOARD_ID)"
>
流程图
</el-button>
<el-button
v-if="
entrance === 'archive' &&
row.NEXT_STEP_ID === 99 &&
row.VIDEO_PATH
"
type="primary"
text
link
@click="fnPreviewVideo(row.VIDEO_PATH)"
>
查看验收视频
</el-button>
<el-button
type="primary"
text
@ -135,18 +151,29 @@
</layout-card>
<flow-chart
v-model:visible="data.flowChartDialog.visible"
:info="data.flowChartDialog.info"
:flow-list="data.flowChartDialog.flowList"
:flowing="data.flowChartDialog.flowing"
/>
<layout-video
v-model:visible="data.videoDialog.visible"
:src="data.videoDialog.src"
append-to-body
/>
</div>
</template>
<script setup>
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
import { serialNumber } from "@/assets/js/utils.js";
import { useRouter } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import { reactive, ref } from "vue";
import FlowChart from "./components/flow_chart.vue";
import { getBlindPlatePluggingList } from "@/request/blind_plate_plugging.js";
import LayoutVideo from "@/components/video/index.vue";
import {
getBlindBoardFlow,
getBlindBoardList,
getTaskSetps,
} from "@/request/eight_work.js";
const props = defineProps({
entrance: {
@ -154,30 +181,43 @@ const props = defineProps({
default: "job_data",
},
});
const stateList = [
{ ID: "0", NAME: "待提交" },
{ ID: "1", NAME: "作业负责人待审核" },
{ ID: "4", NAME: "所在单位领导人待审核" },
{ ID: "5", NAME: "待验收" },
{ ID: "6", NAME: "验收归档" },
{ ID: "-2", NAME: "作业负责人待审核打回" },
{ ID: "-5", NAME: "所在单位领导人待审核打回" },
{ ID: "-6", NAME: "待验收打回" },
];
const stepList = ref([]);
const getStepList = async () => {
const { list } = await getTaskSetps({ TASK_ID: 1 });
stepList.value = [
{ STEP_NAME: "请选择", STEP_ID: "" },
...list,
{ STEP_NAME: "验收归档", STEP_ID: "99" },
];
};
getStepList();
const fnPreviewVideo = (VIDEO_PATH) => {
data.videoDialog.visible = true;
data.videoDialog.src = VIDEO_PATH;
};
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getBlindPlatePluggingList, {
otherParams: props.entrance === "archive" ? { APPLY_STATUS: "6" } : {},
useListData(getBlindBoardList, {
otherParams: props.entrance === "archive" ? { STEP_ID: "99" } : {},
});
const data = reactive({
flowChartDialog: {
visible: false,
info: {},
flowList: {},
flowing: {},
},
videoDialog: {
visible: false,
src: "",
},
});
const fnFlowChart = (info) => {
const fnFlowChart = async (BLINDBOARD_ID) => {
const { flowList, flowingWork } = await getBlindBoardFlow({ BLINDBOARD_ID });
data.flowChartDialog.visible = true;
data.flowChartDialog.info = info;
data.flowChartDialog.flowList = flowList;
data.flowChartDialog.flowing = flowingWork;
};
</script>

View File

@ -1,320 +1,383 @@
<template>
<layout-print-table-package :print="entrance === 'archive'">
<table>
<thead>
<layout-card>
<div id="printContent">
<table class="archive_print_table">
<thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left">
盲板抽堵安全作业票
</el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
</td>
</tr>
</thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left">
盲板抽堵安全作业票
</el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
<td class="title">申请单位</td>
<td colspan="2">{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业单位</td>
<td colspan="2">{{ data.info.CONFIRM_DEPARTMENT_NAME }}</td>
<td class="title">作业类别</td>
<td>
<input
:checked="data.info.WORK_TYPE === 1"
type="checkbox"
disabled
/>
<input
:checked="data.info.WORK_TYPE === 2"
type="checkbox"
disabled
/>
</td>
</tr>
</thead>
<tr>
<td class="title">申请单位</td>
<td colspan="2">{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业单位</td>
<td colspan="2">{{ data.info.CONSTRUCTION_DEPARTMENT_NAME }}</td>
<td class="title">作业类别</td>
<td>
<input
:checked="data.info.WORK_TYPE === 1"
type="checkbox"
disabled
/>
<input
:checked="data.info.WORK_TYPE === 2"
type="checkbox"
disabled
/>
</td>
</tr>
<tr>
<td rowspan="2" class="title">设备管道名称</td>
<td colspan="3" class="title">管道参数</td>
<td colspan="3" class="title">盲板参数</td>
<td rowspan="2" class="title">实际作业开始时间</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>
</tr>
<tr v-for="(item, index) in data.boardList" :key="index">
<td v-if="index === 0" :rowspan="data.boardList.length">
{{ data.info.NAME }}
</td>
<td v-if="index === 0" :rowspan="data.boardList.length">
{{ data.info.MEDIUM }}
</td>
<td v-if="index === 0" :rowspan="data.boardList.length">
{{ data.info.TEMPERATURE }}
</td>
<td v-if="index === 0" :rowspan="data.boardList.length">
{{ data.info.PRESSURE }}
</td>
<td>{{ item.BOARD_MATERIAL }}</td>
<td>{{ item.BOARD_SPECIFICATION }}</td>
<td>{{ item.BOARD_NO }}</td>
<td v-if="index === 0" :rowspan="data.boardList.length">
{{ data.info.BOARD_INSTALL_TIME }}
</td>
</tr>
<tr>
<td colspan="8">
<div>盲板位置图可另附图及编号</div>
<div
style="
display: flex;
justify-content: space-between;
margin-top: 20px;
"
>
<img
v-viewer
:src="VITE_FILE_URL + data.info.BOARD_PATH"
alt=""
width="100"
height="100"
/>
<div>
编制人
<img
v-viewer
:src="VITE_FILE_URL + data.info.APPLY_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
{{ data.info.APPLY_USER_SIGNER_TIME }}
</div>
</div>
</td>
</tr>
<tr>
<td colspan="2" class="title">作业负责人</td>
<td colspan="2">{{ data.info.CONSTRUCTION_USER_NAME }}</td>
<td class="title">作业人</td>
<td>{{ data.info.WORK_USER }}</td>
<td class="title">监护人</td>
<td v-if="data.info.GUARDIAN_USER_SIGNER_PATH" colspan="5">
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.GUARDIAN_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.GUARDIAN_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr>
<td colspan="2" class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="6">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td colspan="2" class="title">风险辨识结果</td>
<td colspan="6">{{ data.info.BOARD_HARM }}</td>
</tr>
<tr>
<td colspan="8">
<table>
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>{{ item.PROTECTIVE_MEASURES }}</td>
<td>
<span v-if="item.STATUS === '1'">
<input type="radio" checked disabled /> &nbsp;&nbsp;&nbsp;
</span>
<span v-if="item.STATUS === '-1'">
<input type="radio" checked disabled /> 不涉及
</span>
</td>
<td>
{{ item.CONFIRM_NAME }}
</td>
</tr>
<tr
v-if="
data.info.APPLY_USER_MEASURES ||
data.info.CONSTRUCTION_USER_MEASURES ||
data.info.LEADER_USER_MEASURES
<tr>
<td rowspan="2" class="title">设备管道名称</td>
<td colspan="3" class="title">管道参数</td>
<td colspan="3" class="title">盲板参数</td>
<td rowspan="2" class="title">实际作业开始时间</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>
</tr>
<tr v-for="(item, index) in data.boardList" :key="index">
<td v-if="index === 0" :rowspan="data.boardList.length">
{{ data.info.NAME }}
</td>
<td v-if="index === 0" :rowspan="data.boardList.length">
{{ data.info.MEDIUM }}
</td>
<td v-if="index === 0" :rowspan="data.boardList.length">
{{ data.info.TEMPERATURE }}
</td>
<td v-if="index === 0" :rowspan="data.boardList.length">
{{ data.info.PRESSURE }}
</td>
<td>{{ item.BOARD_MATERIAL }}</td>
<td>{{ item.BOARD_SPECIFICATION }}</td>
<td>{{ item.BOARD_NO }}</td>
<td v-if="index === 0" :rowspan="data.boardList.length">
{{ data.info.WORK_START_DATE }}
</td>
</tr>
<tr v-if="data.info.BOARD_PATH">
<td colspan="8">
<div>盲板位置图可另附图及编号</div>
<div
v-if="data.info.BOARD_PATH"
style="
display: flex;
justify-content: space-between;
margin-top: 20px;
"
>
<td>{{ data.measuresList.length + 1 }}</td>
<td colspan="3">
<div
v-if="data.info.APPLY_USER_MEASURES"
style="display: flex; justify-content: space-between"
>
<span>其他安全措施{{ data.info.APPLY_USER_MEASURES }}</span>
<span>编制人{{ data.info.APPLY_USER_NAME }}</span>
</div>
<div
v-if="data.info.CONSTRUCTION_USER_MEASURES"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
>
<span>
其他安全措施{{ data.info.CONSTRUCTION_USER_MEASURES }}
<img
v-viewer
:src="VITE_FILE_URL + data.info.BOARD_PATH"
alt=""
width="20"
height="20"
class="mt-10 mr-10"
/>
<div>
签字
<img
v-for="(item, index) in data.signs.WORKSHOP?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.WORKSHOP?.[0].SIGN_TIME[index] }}</span>
</div>
</div>
</td>
</tr>
<tr>
<td colspan="2" class="title">作业负责人</td>
<td colspan="2">
<img
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="ml-10"
/>
</td>
<td class="title">作业人</td>
<td>
<img
v-for="(item, index) in data.signs.WORK_USER?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="ml-10 mt-10"
/>
</td>
<td class="title">监护人</td>
<td colspan="4">
<img
v-for="(item, index) in data.signs.GUARDIAN?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="ml-10 mt-10"
/>
</td>
</tr>
<tr>
<td colspan="2" class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="6">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td colspan="2" class="title">风险辨识结果</td>
<td colspan="6">{{ data.info.RISK_IDENTIFICATION }}</td>
</tr>
<tr>
<td colspan="11">
<table class="archive_print_table">
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>
{{ item.PROTECTIVE_MEASURES }}
<div v-if="item.IMG_PATH" class="mt-10">
<template
v-for="img in item.IMG_PATH.split(',')"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="ml-10 mt-10"
/>
</template>
</div>
</td>
<td>
<span v-if="item.STATUS === '1'">
&nbsp;&nbsp;&nbsp;
</span>
<span>编制人{{ data.info.CONSTRUCTION_USER_NAME }}</span>
</div>
<div
v-if="data.info.LEADER_USER_MEASURES"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
<span v-if="item.STATUS === '-1'"> </span>
</td>
<td>
<img
v-if="item.SIGN_PATH"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="20"
height="20"
class="ml-10 mt-10"
/>
</td>
</tr>
<template v-if="data.signs.MEASURES_CONFIRM">
<tr
v-for="(item, index) in data.signs.MEASURES_CONFIRM"
:key="item.BUS_BLINDBOARD_MEASURES_ID"
>
<span>
其他安全措施{{ data.info.LEADER_USER_MEASURES }}
</span>
<span>编制人{{ data.info.LEADER_USER_NAME }}</span>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="title">安全交底人</td>
<td colspan="10">
<div v-if="data.info.CONFESS_USER_SIGNER_PATH" class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONFESS_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.CONFESS_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr>
<td class="title">接受交底人</td>
<td colspan="10">
<div
v-for="item in data.imgList"
:key="item.ACCEPT_CONFESS_ID"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + item.ACCEPT_CONFESS_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ item.ACCEPT_CONFESS_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.CONSTRUCTION_USER_SIGNER_PATH">
<td colspan="8">
<div>作业负责人意见{{ data.info.CONSTRUCTION_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONSTRUCTION_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.CONSTRUCTION_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.LEADER_USER_SIGNER_PATH">
<td colspan="8">
<div>所在单位意见{{ data.info.LEADER_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.LEADER_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.LEADER_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.imgList1.length > 0">
<td colspan="10">
<div>完工验收{{ data.info.ACCEPT_CONTENT }}</div>
<div
v-for="item in data.imgList1"
:key="item.ACCEPT_CONFESS_ID"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + item.ACCEPT_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ item.ACCEPT_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
</table>
</layout-print-table-package>
<td>{{ data.measuresList.length + 1 + index }}</td>
<td colspan="2">
<div style="display: flex; justify-content: space-between">
<span> 其他安全措施 {{ item.DESCR }} </span>
</div>
</td>
<td>
<img
v-if="item.SIGN_PATH?.[0]"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH?.[0]"
alt=""
width="20"
height="20"
class="ml-10 mt-10"
/>
</td>
</tr>
</template>
</table>
</td>
</tr>
<tr v-if="data.signs.CONFESS">
<td colspan="11">
<div>
安全交底人
<div v-if="data.signs.CONFESS?.[0].IMG_PATH?.[0]">
<template
v-for="img in data.signs.CONFESS?.[0].IMG_PATH"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="ml-10 mt-10"
/>
</template>
</div>
</div>
<div
v-for="(item, index) in data.signs.CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFESS?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT_CONFESS">
<td colspan="11">
<div>接受交底人</div>
<div
v-for="(item, index) in data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="
VITE_FILE_URL +
data.signs.ACCEPT_CONFESS?.[0].SIGN_PATH[index]
"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFIRM">
<td colspan="11">
<div>作业负责人意见{{ data.signs.CONFIRM?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFIRM?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFIRM?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.LEADER">
<td colspan="11">
<div>所在单位意见{{ data.signs.LEADER?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.LEADER?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.LEADER?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.LEADER?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT">
<td colspan="11">
<div>完工验收{{ data.signs.ACCEPT?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.ACCEPT?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.ACCEPT?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
</table>
</div>
</layout-card>
<div v-if="entrance === 'archive'" class="mt-10 tc">
<el-button v-print="'#printContent'" type="primary"></el-button>
</div>
</template>
<script setup>
import LayoutPrintTablePackage from "@/components/print_table_package/index.vue";
import { reactive } from "vue";
import { useRoute } from "vue-router";
import { getBlindPlatePluggingView } from "@/request/blind_plate_plugging.js";
import { getBlindBoardView } from "@/request/eight_work.js";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const route = useRoute();
const { BLINDBOARD_ID, entrance } = route.query;
const data = reactive({
info: {},
imgList: [],
imgList1: [],
boardList: [],
measuresList: [],
signs: [],
});
const fnGetData = async () => {
const resData = await getBlindPlatePluggingView({ BLINDBOARD_ID });
const resData = await getBlindBoardView({ BLINDBOARD_ID });
data.info = resData.pd;
data.imgList = resData.imgList;
data.imgList1 = resData.imgList1;
data.boardList = resData.boardList;
data.measuresList = resData.measuresList;
data.info.APPLY_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[0];
data.info.CONSTRUCTION_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[1];
data.info.LEADER_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[2];
data.signs = resData.signs;
};
fnGetData();
</script>

View File

@ -1,15 +1,17 @@
<template>
<el-dialog v-model="visible" title="查看流程图" width="1500px">
<el-steps align-center finish-status="success">
<template v-for="(item, index) in flowList" :key="index">
<el-step :title="item.STEP_NAME" :status="fnGetStatus(item)">
<template #description>
<div>{{ item.ACT_USER_NAME || item.SIGN_USER }}</div>
<div>{{ item.ACT_TIME }}</div>
</template>
</el-step>
</template>
</el-steps>
<el-scrollbar style="height: 150px">
<el-steps align-center finish-status="success" style="width: 2000px">
<template v-for="(item, index) in flowList" :key="index">
<el-step :title="item.STEP_NAME" :status="fnGetStatus(item)">
<template #description>
<div>{{ fnGetShowStepUser(item) }}</div>
<div>{{ item.ACT_TIME }}</div>
</template>
</el-step>
</template>
</el-steps>
</el-scrollbar>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
@ -30,17 +32,33 @@ const props = defineProps({
required: true,
default: () => {},
},
flowing: {
type: Object,
required: true,
default: () => {},
},
});
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);
const fnGetStatus = (step) => {
if (step.STATUS === 1) {
return "finish";
} else if (step.STATUS < 0) {
return "error";
} else if (step.CURRENT_STEP) {
return "process";
}
};
const fnGetShowStepUser = (step) => {
if (step.SIGN_USER) {
return step.SIGN_USER;
} else if (step.FINISHED_SIGN_USER) {
return step.FINISHED_SIGN_USER;
} else if (step.ACT_USER_NAME) {
return step.ACT_USER_NAME;
} else if (step.CAN_SKIP && !props.flowing[step.ACTOR_FIELD]) {
return "已跳过";
}
};
</script>

View File

@ -87,7 +87,11 @@
添加监控
</el-button>
<el-button
v-if="entrance === 'archive' && row.NEXT_STEP_ID === 99"
v-if="
entrance === 'archive' &&
row.NEXT_STEP_ID === 99 &&
row.VIDEO_PATH
"
type="primary"
text
link
@ -127,6 +131,7 @@
<flow-chart
v-model:visible="data.flowChartDialog.visible"
:flow-list="data.flowChartDialog.flowList"
:flowing="data.flowChartDialog.flowing"
/>
<layout-video
v-model:visible="data.videoDialog.visible"
@ -182,6 +187,7 @@ const data = reactive({
flowChartDialog: {
visible: false,
flowList: {},
flowing: {},
},
videoDialog: {
visible: false,
@ -189,9 +195,12 @@ const data = reactive({
},
});
const fnFlowChart = async (CONFINEDSPACE_ID) => {
const { flowList } = await getConfinedSpaceFlow({ CONFINEDSPACE_ID });
const { flowList, flowingWork } = await getConfinedSpaceFlow({
CONFINEDSPACE_ID,
});
data.flowChartDialog.visible = true;
data.flowChartDialog.flowList = flowList;
data.flowChartDialog.flowing = flowingWork;
};
</script>

View File

@ -1,340 +1,368 @@
<template>
<layout-print-table-package :print="entrance === 'archive'">
<table>
<thead>
<layout-card>
<div id="printContent">
<table class="archive_print_table">
<thead>
<tr>
<td colspan="11" style="border: none">
<el-divider content-position="left">
受限空间安全作业票
</el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
</td>
</tr>
</thead>
<tr>
<td colspan="11" style="border: none">
<el-divider content-position="left">
受限空间安全作业票
</el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
<td class="title">作业申请单位</td>
<td colspan="5">{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业申请时间</td>
<td colspan="4">{{ data.info.CREATTIME }}</td>
</tr>
<tr>
<td class="title">受限空间名称</td>
<td colspan="5">{{ data.info.LIMITSPACE_NAME }}</td>
<td class="title">受限空间内原有介质名称</td>
<td colspan="4">{{ data.info.MEDIUM_NAME }}</td>
</tr>
<tr>
<td class="title">作业内容</td>
<td colspan="10">{{ data.info.WORK_CONTENT }}</td>
</tr>
<tr>
<td class="title">作业单位</td>
<td colspan="5">{{ data.info.CONFIRM_DEPARTMENT_NAME }}</td>
<td class="title">作业负责人</td>
<td colspan="4">
<img
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</thead>
<tr>
<td class="title">作业申请单位</td>
<td colspan="5">{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业申请时间</td>
<td colspan="4">{{ data.info.CREATTIME }}</td>
</tr>
<tr>
<td class="title">受限空间名称</td>
<td colspan="5">{{ data.info.LIMITSPACE_NAME }}</td>
<td class="title">受限空间内原有介质名称</td>
<td colspan="4">{{ data.info.MEDIUM_NAME }}</td>
</tr>
<tr>
<td class="title">作业内容</td>
<td colspan="10">{{ data.info.WORK_CONTENT }}</td>
</tr>
<tr>
<td class="title">作业单位</td>
<td colspan="5">{{ data.info.CONFIRM_DEPARTMENT_NAME }}</td>
<td class="title">作业负责人</td>
<td colspan="4">{{ data.info.CONFIRM_USER_NAME }}</td>
</tr>
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="10">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td class="title">风险辨识结果</td>
<td colspan="10">{{ data.info.RISK_IDENTIFICATION }}</td>
</tr>
<tr>
<td :rowspan="3 + data.gasList.length" class="title">气体分析</td>
<td class="title" rowspan="2">分析项目</td>
<td class="title" colspan="2">有毒有害气体名称</td>
<td class="title" colspan="2">可燃气体名称</td>
<td class="title" rowspan="2">氧气含量</td>
<td class="title" rowspan="3">取样分析时间</td>
<td class="title" rowspan="3">分析部位</td>
<td class="title" rowspan="3">分析地点</td>
<td class="title" rowspan="3">分析人</td>
</tr>
<tr>
<td :style="{ padding: data.gas.GAS_NAME1 ? '8px' : '16px' }">
{{ data.gas.GAS_NAME1 }}
</td>
<td :style="{ padding: data.gas.GAS_NAME2 ? '8px' : '16px' }">
{{ data.gas.GAS_NAME2 }}
</td>
<td :style="{ padding: data.gas.GAS_NAME3 ? '8px' : '16px' }">
{{ data.gas.GAS_NAME3 }}
</td>
<td :style="{ padding: data.gas.GAS_NAME4 ? '8px' : '16px' }">
{{ data.gas.GAS_NAME4 }}
</td>
</tr>
<tr>
<td class="title">合格标准</td>
<td>{{ data.gas.GAS_STANDARD1 }}</td>
<td>{{ data.gas.GAS_STANDARD2 }}</td>
<td>{{ data.gas.GAS_STANDARD3 }}</td>
<td>{{ data.gas.GAS_STANDARD4 }}</td>
<td>19.5% 21%体积分数</td>
</tr>
<tr v-for="(item, index) in data.gasList" :key="index">
<td v-if="index === 0" :rowspan="data.gasList.length" class="title">
分析数据
</td>
<td>
<span v-if="data.gas.GAS_NAME1">{{ item.DATA1 }}</span>
</td>
<td>
<span v-if="data.gas.GAS_NAME2">{{ item.DATA2 }}</span>
</td>
<td>
<span v-if="data.gas.GAS_NAME3">{{ item.DATA3 }}</span>
</td>
<td>
<span v-if="data.gas.GAS_NAME4">{{ item.DATA4 }}</span>
</td>
<td>{{ item.OXYGEN_CONTENT }}</td>
<td>{{ item.ANALYZE_TIME }}</td>
<td>{{ item.ANALYZE_PART }}</td>
<td>{{ item.ANALYZE_PLACE }}</td>
<td>{{ item.ANALYZE_USER }}</td>
</tr>
<tr>
<td class="title">作业实施时间</td>
<td colspan="10">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="11">
<table>
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>
{{ item.PROTECTIVE_MEASURES }}
<div v-if="item.IMG_PATH">
<template v-for="img in item.IMG_PATH.split(',')" :key="img">
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="100"
height="100"
/>
</template>
</div>
</td>
<td>
<span v-if="item.STATUS === '1'"> &nbsp;&nbsp;&nbsp; </span>
<span v-if="item.STATUS === '-1'"> </span>
</td>
<td>
<img
v-if="item.SIGN_PATH"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="100"
height="100"
/>
</td>
</tr>
<template v-if="data.signs.MEASURES_CONFIRM">
<tr
v-for="(item, index) in data.signs.MEASURES_CONFIRM"
:key="item.BUS_CONFINEDSPACE_MEASURES_ID"
>
<td>{{ data.measuresList.length + 1 + index }}</td>
<td colspan="2">
<div style="display: flex; justify-content: space-between">
<span> 其他安全措施 {{ item.DESCR }} </span>
<tr>
<td class="title">作业人</td>
<td colspan="5">
<img
v-for="(item, index) in data.signs.WORK_USER?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
<td class="title">监护人</td>
<td colspan="4">
<img
v-for="(item, index) in data.signs.GUARDIAN?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="10">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td class="title">风险辨识结果</td>
<td colspan="10">{{ data.info.RISK_IDENTIFICATION }}</td>
</tr>
<tr>
<td :rowspan="3 + data.gasList.length" class="title">气体分析</td>
<td class="title" rowspan="2">分析项目</td>
<td class="title" colspan="2">有毒有害气体名称</td>
<td class="title" colspan="2">可燃气体名称</td>
<td class="title" rowspan="2">氧气含量</td>
<td class="title" rowspan="3">取样分析时间</td>
<td class="title" rowspan="3">分析部位</td>
<td class="title" rowspan="3">分析地点</td>
<td class="title" rowspan="3">分析人</td>
</tr>
<tr>
<td :style="{ padding: data.gas.GAS_NAME1 ? '8px' : '16px' }">
{{ data.gas.GAS_NAME1 }}
</td>
<td :style="{ padding: data.gas.GAS_NAME2 ? '8px' : '16px' }">
{{ data.gas.GAS_NAME2 }}
</td>
<td :style="{ padding: data.gas.GAS_NAME3 ? '8px' : '16px' }">
{{ data.gas.GAS_NAME3 }}
</td>
<td :style="{ padding: data.gas.GAS_NAME4 ? '8px' : '16px' }">
{{ data.gas.GAS_NAME4 }}
</td>
</tr>
<tr>
<td class="title">合格标准</td>
<td>{{ data.gas.GAS_STANDARD1 }}</td>
<td>{{ data.gas.GAS_STANDARD2 }}</td>
<td>{{ data.gas.GAS_STANDARD3 }}</td>
<td>{{ data.gas.GAS_STANDARD4 }}</td>
<td>19.5% 21%体积分数</td>
</tr>
<tr v-for="(item, index) in data.gasList" :key="index">
<td v-if="index === 0" :rowspan="data.gasList.length" class="title">
分析数据
</td>
<td>
<span v-if="data.gas.GAS_NAME1">{{ item.DATA1 }}</span>
</td>
<td>
<span v-if="data.gas.GAS_NAME2">{{ item.DATA2 }}</span>
</td>
<td>
<span v-if="data.gas.GAS_NAME3">{{ item.DATA3 }}</span>
</td>
<td>
<span v-if="data.gas.GAS_NAME4">{{ item.DATA4 }}</span>
</td>
<td>{{ item.OXYGEN_CONTENT }}</td>
<td>{{ item.ANALYZE_TIME }}</td>
<td>{{ item.ANALYZE_PART }}</td>
<td>{{ item.ANALYZE_PLACE }}</td>
<td>
<img
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
<tr>
<td class="title">作业实施时间</td>
<td colspan="10">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="11">
<table class="archive_print_table">
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>
{{ item.PROTECTIVE_MEASURES }}
<div v-if="item.IMG_PATH" class="mt-10">
<template
v-for="img in item.IMG_PATH.split(',')"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</template>
</div>
</td>
<td>
<span v-if="item.STATUS === '1'">
&nbsp;&nbsp;&nbsp;
</span>
<span v-if="item.STATUS === '-1'"> </span>
</td>
<td>
<img
v-if="item.SIGN_PATH[0]"
v-if="item.SIGN_PATH"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH[0]"
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="100"
height="100"
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</template>
</table>
</td>
</tr>
<tr v-if="data.signs.GUARDIAN">
<td colspan="11">
<div>监护人</div>
<div
v-for="(item, index) in data.signs.GUARDIAN[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.GUARDIAN[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.GUARDIAN[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFESS">
<td colspan="11">
<div>
安全交底人
<div v-if="data.signs.CONFESS[0].IMG_PATH">
<template
v-for="img in data.signs.CONFESS[0].IMG_PATH"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="100"
height="100"
/>
<template v-if="data.signs.MEASURES_CONFIRM">
<tr
v-for="(item, index) in data.signs.MEASURES_CONFIRM"
:key="item.BUS_CONFINEDSPACE_MEASURES_ID"
>
<td>{{ data.measuresList.length + 1 + index }}</td>
<td colspan="2">
<div style="display: flex; justify-content: space-between">
<span> 其他安全措施 {{ item.DESCR }} </span>
</div>
</td>
<td>
<img
v-if="item.SIGN_PATH?.[0]"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH?.[0]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</template>
</table>
</td>
</tr>
<tr v-if="data.signs.CONFESS">
<td colspan="11">
<div>
安全交底人
<div v-if="data.signs.CONFESS?.[0].IMG_PATH?.[0]">
<template
v-for="img in data.signs.CONFESS?.[0].IMG_PATH"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</template>
</div>
</div>
</div>
<div
v-for="(item, index) in data.signs.CONFESS[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFESS[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.CONFESS[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT_CONFESS">
<td colspan="11">
<div>接受交底人</div>
<div
v-for="(item, index) in data.signs.ACCEPT_CONFESS[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="
VITE_FILE_URL + data.signs.ACCEPT_CONFESS[0].SIGN_PATH[index]
"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.ACCEPT_CONFESS[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.WORK_USER">
<td colspan="11">
<div>作业人</div>
<div
v-for="(item, index) in data.signs.WORK_USER[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.WORK_USER[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.WORK_USER[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFIRM">
<td colspan="11">
<div>作业负责人意见{{ data.signs.CONFIRM[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.CONFIRM[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFIRM[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.CONFIRM[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<div
v-for="(item, index) in data.signs.CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFESS?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT_CONFESS">
<td colspan="11">
<div>接受交底人</div>
<div
v-for="(item, index) in data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="
VITE_FILE_URL +
data.signs.ACCEPT_CONFESS?.[0].SIGN_PATH[index]
"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.LEADER">
<td colspan="11">
<div>所在单位意见{{ data.signs.LEADER[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.LEADER[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.LEADER[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.LEADER[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFIRM">
<td colspan="11">
<div>作业负责人意见{{ data.signs.CONFIRM?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFIRM?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFIRM?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT">
<td colspan="11">
<div>完工验收{{ data.signs.ACCEPT[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.ACCEPT[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.ACCEPT[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.ACCEPT[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
</table>
</layout-print-table-package>
<tr v-if="data.signs.LEADER">
<td colspan="11">
<div>所在单位意见{{ data.signs.LEADER?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.LEADER?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.LEADER?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.LEADER?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT">
<td colspan="11">
<div>完工验收{{ data.signs.ACCEPT?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.ACCEPT?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.ACCEPT?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
</table>
</div>
<div v-if="entrance === 'archive'" class="mt-10 tc">
<el-button v-print="'#printContent'" type="primary"></el-button>
</div>
</layout-card>
</template>
<script setup>
import LayoutPrintTablePackage from "@/components/print_table_package/index.vue";
import { reactive } from "vue";
import { useRoute } from "vue-router";
import { findCharIndex } from "@/assets/js/utils.js";

View File

@ -1,96 +1,17 @@
<template>
<el-dialog v-model="visible" title="查看流程图" width="1500px">
<el-steps
:active="fnGetStatus()"
:process-status="fnGetProcessStatus()"
align-center
finish-status="success"
>
<el-step title="动土作业提交">
<template #description>
<div>{{ fnGetProcessMessage().title }}</div>
<div>{{ fnGetProcessMessage().USER_NAME }}</div>
<div>{{ fnGetProcessMessage().OPERATTIME }}</div>
<el-scrollbar style="height: 150px">
<el-steps align-center finish-status="success" style="width: 2000px">
<template v-for="(item, index) in flowList" :key="index">
<el-step :title="item.STEP_NAME" :status="fnGetStatus(item)">
<template #description>
<div>{{ fnGetShowStepUser(item) }}</div>
<div>{{ item.ACT_TIME }}</div>
</template>
</el-step>
</template>
</el-step>
<el-step title="作业负责人意见">
<template #description>
<div>{{ info.CONSTRUCTION_USER_NAME }}</div>
<div>{{ info.CONSTRUCTION_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="所在单位意见">
<template #description>
<div v-if="!info.PRODUCTION_USER_NAME">{{ "" }}</div>
<div v-else>{{ info.PRODUCTION_USER_NAME }}</div>
<div>{{ info.PRODUCTION_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="有关部门意见">
<template #description>
<div v-if="!info.SAFETY_USER_NAME">{{ "" }}</div>
<div v-else>{{ info.SAFETY_USER_NAME }}</div>
<div>{{ info.SAFETY_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="审批部门意见">
<template #description>
<div v-if="!info.LEADER_USER_NAME">{{ "" }}</div>
<div v-else>{{ info.LEADER_USER_NAME }}</div>
<div>{{ info.LEADER_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="完成验收">
<template #description>
<div>{{ info.ACCEPT_USER_NAME }}</div>
<div>{{ info.ACCEPT_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="验收归档">
<template #description>
<div>{{ info.ACCEPT_USER_NAME }}</div>
<div>{{ info.ACCEPT_USER_SIGNER_TIME }}</div>
</template>
</el-step>
</el-steps>
<div
style="
margin: 60px 60px 0 60px;
display: flex;
justify-content: space-between;
"
>
<div v-if="info.GUARDIAN_USER_SIGNER_TIME">
<div class="el-step__title is-success">
监护人{{ info.GUARDIAN_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.GUARDIAN_USER_SIGNER_TIME">
<div class="el-step__title is-error">
监护人{{ info.GUARDIAN_USER_NAME }}未签字
</div>
</div>
<div v-if="info.CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-success">
安全交底人{{ info.CONFESS_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-error">
安全交底人{{ info.CONFESS_USER_NAME }}未签字
</div>
</div>
<div v-if="info.ACCEPT_CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-success">
接受交底人{{ info.ACCEPT_CONFESS_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.ACCEPT_CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-error">
接受交底人{{ info.ACCEPT_CONFESS_USER_NAME }}未签字
</div>
</div>
</div>
</el-steps>
</el-scrollbar>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
@ -106,7 +27,12 @@ const props = defineProps({
required: true,
default: false,
},
info: {
flowList: {
type: Object,
required: true,
default: () => {},
},
flowing: {
type: Object,
required: true,
default: () => {},
@ -114,57 +40,27 @@ const props = defineProps({
});
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);
const fnGetStatus = () => {
const result = {
1: 1,
2: 2,
3: 3,
4: 4,
5: 5,
6: 7,
};
return result[props.info.APPLY_STATUS] || 0;
const fnGetStatus = (step) => {
if (step.STATUS === 1) {
return "finish";
} else if (step.STATUS < 0) {
return "error";
} else if (step.CURRENT_STEP) {
return "process";
}
};
const fnGetProcessStatus = () => {
if (props.info.APPLY_STATUS < "0") return "error";
else return "process";
};
const fnGetProcessMessage = () => {
const info = props.info;
const result = {
"-2": {
title: "作业负责人审核打回",
USER_NAME: info.CONSTRUCTION_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-3": {
title: "所在单位审核打回",
USER_NAME: info.PRODUCTION_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-4": {
title: "有关部门审核打回",
USER_NAME: info.SAFETY_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-5": {
title: "审批部门审核打回",
USER_NAME: info.LEADER_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-6": {
title: "验收打回",
AUSER_NAME: info.ACCEPT_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
};
return (
result[props.info.APPLY_STATUS] || {
title: "",
USER_NAME: info.APPLY_USER_NAME,
OPERATTIME: info.CREATTIME,
}
);
const fnGetShowStepUser = (step) => {
if (step.SIGN_USER) {
return step.SIGN_USER;
} else if (step.FINISHED_SIGN_USER) {
return step.FINISHED_SIGN_USER;
} else if (step.ACT_USER_NAME) {
return step.ACT_USER_NAME;
} else if (step.CAN_SKIP && !props.flowing[step.ACTOR_FIELD]) {
return "已跳过";
}
};
</script>

View File

@ -16,13 +16,13 @@
</el-form-item>
</el-col>
<el-col v-if="entrance === 'job_data'" :span="6">
<el-form-item label="状态" prop="APPLY_STATUS">
<el-select v-model="searchForm.APPLY_STATUS">
<el-form-item label="状态" prop="STEP_ID">
<el-select v-model="searchForm.STEP_ID">
<el-option
v-for="item in stateList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
v-for="item in stepList"
:key="item.STEP_ID"
:label="item.STEP_NAME"
:value="item.STEP_ID"
/>
</el-select>
</el-form-item>
@ -50,47 +50,51 @@
</template>
</el-table-column>
<el-table-column prop="CHECK_NO" label="编号" show-overflow-tooltip />
<el-table-column prop="CONSTRUCTION_DEPARTMENT_NAME" label="施工单位" />
<el-table-column prop="APPLY_USER_NAME" label="申请人" width="100" />
<el-table-column prop="APPLY_DEPARTMENT_NAME" label="申请部门" />
<el-table-column
prop="CONSTRUCTION_USER_NAME"
prop="CONFIRM_USER_NAME"
label="作业负责人"
show-overflow-tooltip
/>
<el-table-column label="所在单位负责人" show-overflow-tooltip>
<template #default="{ row }">
{{ row.PRODUCTION_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column label="有关部门负责人" show-overflow-tooltip>
<template #default="{ row }">
{{ row.SAFETY_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column label="审批部门负责人" show-overflow-tooltip>
<template #default="{ row }">
{{ row.LEADER_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column
prop="LEADER_USER_NAME"
label="所在单位负责人"
show-overflow-tooltip
/>
<el-table-column
prop="SAFETY_USER_NAME"
label="有关水、电、汽、工艺、设备、消防安全等部门意见负责人"
show-overflow-tooltip
width="150"
/>
<el-table-column
prop="APPROVE_USER_NAME"
label="审批部门负责人"
show-overflow-tooltip
width="150"
/>
<el-table-column
prop="ACCEPT_USER_NAME"
label="验收部门负责人"
show-overflow-tooltip
/>
<el-table-column label="审核状态">
<el-table-column label="审核状态" width="170">
<template #default="{ row }">
{{
entrance === "job_data"
? translationStatus(row.APPLY_STATUS, stateList)
: "已归档"
}}
<span v-if="row.STEP_ID === 0"></span>
<span v-else-if="row.STATUS === -2">气体检测打回</span>
<span v-else-if="row.STEP_ID !== -1">{{ row.NEXT_STEP_NAME }}</span>
<span v-else>{{ row.STEP_NAME }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="250">
<template #default="{ row }">
<el-button
v-if="entrance === 'job_data' && row.APPLY_STATUS !== '6'"
v-if="
entrance === 'job_data' &&
row.STATUS > -1 &&
row.NEXT_STEP_ID !== 99
"
type="primary"
text
link
@ -111,10 +115,23 @@
type="primary"
text
link
@click="fnFlowChart(row)"
@click="fnFlowChart(row.BREAKGROUND_ID)"
>
流程图
</el-button>
<el-button
v-if="
entrance === 'archive' &&
row.NEXT_STEP_ID === 99 &&
row.VIDEO_PATH
"
type="primary"
text
link
@click="fnPreviewVideo(row.VIDEO_PATH)"
>
查看验收视频
</el-button>
<el-button
type="primary"
text
@ -137,18 +154,29 @@
</layout-card>
<flow-chart
v-model:visible="data.flowChartDialog.visible"
:info="data.flowChartDialog.info"
:flow-list="data.flowChartDialog.flowList"
:flowing="data.flowChartDialog.flowing"
/>
<layout-video
v-model:visible="data.videoDialog.visible"
:src="data.videoDialog.src"
append-to-body
/>
</div>
</template>
<script setup>
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
import { serialNumber } from "@/assets/js/utils.js";
import { useRouter } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import { reactive, ref } from "vue";
import FlowChart from "./components/flow_chart.vue";
import { getGroundbreakingList } from "@/request/groundbreaking.js";
import LayoutVideo from "@/components/video/index.vue";
import {
getGroundbreakingList,
getTaskSetps,
getGroundbreakingFlow,
} from "@/request/eight_work.js";
const props = defineProps({
entrance: {
@ -156,35 +184,47 @@ const props = defineProps({
default: "job_data",
},
});
const stateList = [
{ ID: "0", NAME: "动土作业待提交" },
{ ID: "1", NAME: "作业负责人待审核" },
{ ID: "2", NAME: "所在单位待审核" },
{ ID: "3", NAME: "有关部门待审核" },
{ ID: "4", NAME: "审批部门待审核" },
{ ID: "5", NAME: "待验收" },
{ ID: "6", NAME: "验收归档" },
{ ID: "-2", NAME: "作业负责人审核打回" },
{ ID: "-3", NAME: "所在单位审核打回" },
{ ID: "-4", NAME: "有关部门审核打回" },
{ ID: "-5", NAME: "审批部门审核打回" },
{ ID: "-6", NAME: "验收打回" },
];
const stepList = ref([]);
const getStepList = async () => {
const { list } = await getTaskSetps({ TASK_ID: 1 });
stepList.value = [
{ STEP_NAME: "请选择", STEP_ID: "" },
...list,
{ STEP_NAME: "验收归档", STEP_ID: "99" },
];
};
getStepList();
const fnPreviewVideo = (VIDEO_PATH) => {
data.videoDialog.visible = true;
data.videoDialog.src = VIDEO_PATH;
};
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getGroundbreakingList, {
otherParams: props.entrance === "archive" ? { APPLY_STATUS: "6" } : {},
otherParams: props.entrance === "archive" ? { STEP_ID: "99" } : {},
});
const data = reactive({
flowChartDialog: {
visible: false,
info: {},
flowList: {},
flowing: {},
},
videoDialog: {
visible: false,
src: "",
},
});
const fnFlowChart = (info) => {
const fnFlowChart = async (BREAKGROUND_ID) => {
const { flowList, flowingWork } = await getGroundbreakingFlow({
BREAKGROUND_ID,
});
data.flowChartDialog.visible = true;
data.flowChartDialog.info = info;
data.flowChartDialog.flowList = flowList;
data.flowChartDialog.flowing = flowingWork;
};
</script>
<style scoped></style>

View File

@ -1,362 +1,389 @@
<template>
<layout-print-table-package :print="entrance === 'archive'">
<table>
<thead>
<layout-card>
<div id="printContent">
<table class="archive_print_table">
<thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left"> 动土安全作业票 </el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
</td>
</tr>
</thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left"> 动土安全作业票 </el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
<td class="title">申请单位</td>
<td>{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title" colspan="2">作业申请时间</td>
<td colspan="2">{{ data.info.CREATTIME }}</td>
</tr>
<tr>
<td class="title">作业单位</td>
<td>{{ data.info.CONFIRM_DEPARTMENT_NAME }}</td>
<td class="title">作业地点</td>
<td>{{ data.info.WORK_PLACE }}</td>
<td class="title">作业内容</td>
<td>{{ data.info.JOB_CONTENT }}</td>
</tr>
<tr>
<td class="title">监护人</td>
<td>
<img
v-for="(item, index) in data.signs.GUARDIAN?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
<td class="title" colspan="2">作业负责人</td>
<td colspan="2">
<img
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</thead>
<tr>
<td class="title">申请单位</td>
<td>{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title" colspan="2">作业申请时间</td>
<td colspan="2">{{ data.info.CREATTIME }}</td>
</tr>
<tr>
<td class="title">作业单位</td>
<td>{{ data.info.CONSTRUCTION_DEPARTMENT_NAME }}</td>
<td class="title">作业地点</td>
<td>{{ data.info.WORK_PLACE }}</td>
<td class="title">作业内容</td>
<td>{{ data.info.JOB_CONTENT }}</td>
</tr>
<tr>
<td class="title">监护人</td>
<td>
<div v-if="data.info.GUARDIAN_USER_SIGNER_PATH" class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.GUARDIAN_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.GUARDIAN_USER_SIGNER_TIME }}</span>
</div>
</td>
<td class="title" colspan="2">作业负责人</td>
<td colspan="2">{{ data.info.CONSTRUCTION_USER_NAME }}</td>
</tr>
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="5">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td colspan="6">
<div>
作业内容范围方式包括深度面积并附简图{{
data.info.WORK_CONTENT
}}
</div>
<div
style="
display: flex;
justify-content: space-between;
margin-top: 20px;
"
>
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONTENT_IMG_PATH"
alt=""
width="100"
height="100"
/>
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="5">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td colspan="6">
<div>
编制人
<img
v-viewer
:src="VITE_FILE_URL + data.info.APPLY_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
{{ data.info.APPLY_USER_SIGNER_TIME }}
作业内容范围方式包括深度面积并附简图{{
data.info.WORK_CONTENT
}}
</div>
</div>
</td>
</tr>
<tr>
<td class="title">风险辨识结果</td>
<td colspan="5">
{{ data.info.HAZARD_IDENTIFICATION?.split(";_;")[0] }}
</td>
</tr>
<tr>
<td class="title">作业实施时间</td>
<td colspan="5">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="6">
<table>
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>{{ item.PROTECTIVE_MEASURES }}</td>
<td>
<span v-if="item.STATUS === '1'">
<input type="radio" disabled checked />&nbsp;&nbsp;&nbsp;
</span>
<span v-if="item.STATUS === '-1'">
<input type="radio" disabled checked />不涉及
</span>
</td>
<td>
{{ item.CONFIRM_NAME }}
</td>
</tr>
<tr
v-if="
data.info.APPLY_USER_MEASURES ||
data.info.CONSTRUCTION_USER_MEASURES ||
data.info.PRODUCTION_USER_MEASURES ||
data.info.SAFETY_USER_MEASURES ||
data.info.LEADER_USER_MEASURES
<div
v-if="data.info.CONTENT_IMG_PATH"
style="
display: flex;
justify-content: space-between;
margin-top: 20px;
"
>
<td>{{ data.measuresList.length + 1 }}</td>
<td colspan="3">
<div
v-if="data.info.APPLY_USER_MEASURES"
style="display: flex; justify-content: space-between"
>
<span>其他安全措施{{ data.info.APPLY_USER_MEASURES }}</span>
<span>编制人{{ data.info.APPLY_USER_NAME }}</span>
</div>
<div
v-if="data.info.CONSTRUCTION_USER_MEASURES"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
>
<span>
其他安全措施{{ data.info.CONSTRUCTION_USER_MEASURES }}
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONTENT_IMG_PATH"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<div>
签字
<img
v-for="(item, index) in data.signs.WORK_USER?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</div>
</td>
</tr>
<tr>
<td class="title">风险辨识结果</td>
<td colspan="5">
{{ data.info.RISK_IDENTIFICATION?.split(";_;")[0] }}
</td>
</tr>
<tr>
<td class="title">作业实施时间</td>
<td colspan="5">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="11">
<table class="archive_print_table">
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>
{{ item.PROTECTIVE_MEASURES }}
<div v-if="item.IMG_PATH" class="mt-10">
<template
v-for="img in item.IMG_PATH.split(',')"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</template>
</div>
</td>
<td>
<span v-if="item.STATUS === '1'">
&nbsp;&nbsp;&nbsp;
</span>
<span>编制人{{ data.info.CONSTRUCTION_USER_NAME }}</span>
</div>
<div
v-if="
data.info.PRODUCTION_USER_ID &&
data.info.PRODUCTION_USER_MEASURES
"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
<span v-if="item.STATUS === '-1'"> </span>
</td>
<td>
<img
v-if="item.SIGN_PATH"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
<template v-if="data.signs.MEASURES_CONFIRM">
<tr
v-for="(item, index) in data.signs.MEASURES_CONFIRM"
:key="item.BUS_BREAKGROUND_MEASURES_ID"
>
<span>
其他安全措施{{ data.info.PRODUCTION_USER_MEASURES }}
</span>
<span>编制人{{ data.info.PRODUCTION_USER_NAME }}</span>
</div>
<div
v-if="
data.info.SAFETY_USER_ID && data.info.SAFETY_USER_MEASURES
"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
<td>{{ data.measuresList.length + 1 + index }}</td>
<td colspan="2">
<div style="display: flex; justify-content: space-between">
<span> 其他安全措施 {{ item.DESCR }} </span>
</div>
</td>
<td>
<img
v-if="item.SIGN_PATH?.[0]"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH?.[0]"
alt=""
width="20"
height="20"
/>
</td>
</tr>
</template>
</table>
</td>
</tr>
<tr v-if="data.signs.CONFESS">
<td colspan="11">
<div>
安全交底人
<div v-if="data.signs.CONFESS?.[0].IMG_PATH?.[0]">
<template
v-for="img in data.signs.CONFESS?.[0].IMG_PATH"
:key="img"
>
<span>
其他安全措施{{ data.info.SAFETY_USER_MEASURES }}
</span>
<span>编制人{{ data.info.SAFETY_USER_NAME }}</span>
</div>
<div
v-if="
data.info.LEADER_USER_ID && data.info.LEADER_USER_MEASURES
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</template>
</div>
</div>
<div
v-for="(item, index) in data.signs.CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFESS?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT_CONFESS">
<td colspan="11">
<div>接受交底人</div>
<div
v-for="(item, index) in data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="
VITE_FILE_URL +
data.signs.ACCEPT_CONFESS?.[0].SIGN_PATH[index]
"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFIRM">
<td colspan="11">
<div>作业负责人意见{{ data.signs.CONFIRM?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFIRM?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFIRM?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.LEADER">
<td colspan="11">
<div>所在单位意见{{ data.signs.LEADER?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.LEADER?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.LEADER?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.LEADER?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.SAFETY">
<td colspan="6">
<div>
有关水工艺设备消防安全等部门会签意见{{
data.signs.SAFETY?.[0].DESCR
}}
</div>
<div
v-for="(item, index) in data.signs.SAFETY?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.SAFETY?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.SAFETY?.[0].SIGN_TIME[index] }}</span>
</div>
</div>
</td>
</tr>
<tr v-if="data.signs.APPROVE">
<td colspan="6">
<div>审批部门意见{{ data.signs.APPROVE?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.APPROVE?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="
VITE_FILE_URL + data.signs.APPROVE?.[0].SIGN_PATH[index]
"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
>
<span>
其他安全措施{{ data.info.LEADER_USER_MEASURES }}
</span>
<span>编制人{{ data.info.LEADER_USER_NAME }}</span>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="title">安全交底人</td>
<td colspan="10">
<div v-if="data.info.CONFESS_USER_SIGNER_PATH" class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONFESS_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.CONFESS_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr>
<td class="title">接受交底人</td>
<td colspan="10">
<div
v-for="item in data.imgList"
:key="item.ACCEPT_CONFESS_ID"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + item.ACCEPT_CONFESS_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ item.ACCEPT_CONFESS_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.CONSTRUCTION_USER_SIGNER_PATH">
<td colspan="6">
<div>作业负责人意见{{ data.info.CONSTRUCTION_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONSTRUCTION_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.CONSTRUCTION_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.PRODUCTION_USER_SIGNER_PATH">
<td colspan="6">
<div>所在单位意见{{ data.info.PRODUCTION_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.PRODUCTION_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.PRODUCTION_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.SAFETY_USER_SIGNER_PATH">
<td colspan="6">
<div>
有关水工艺设备消防安全等部门会签意见{{
data.info.SAFETY_CONTENT
}}
</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.SAFETY_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.SAFETY_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.LEADER_USER_SIGNER_PATH">
<td colspan="6">
<div>审批部门意见{{ data.info.LEADER_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.LEADER_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.LEADER_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.imgList1.length > 0">
<td colspan="10">
<div>完工验收{{ data.info.ACCEPT_CONTENT }}</div>
<div
v-for="item in data.imgList1"
:key="item.ACCEPT_CONFESS_ID"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + item.ACCEPT_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ item.ACCEPT_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
</table>
</layout-print-table-package>
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.APPROVE?.[0].SIGN_TIME[index] }}</span>
</div>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT">
<td colspan="11">
<div>完工验收{{ data.signs.ACCEPT?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.ACCEPT?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.ACCEPT?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
</table>
</div>
<div v-if="entrance === 'archive'" class="mt-10 tc">
<el-button v-print="'#printContent'" type="primary"></el-button>
</div>
</layout-card>
</template>
<script setup>
import LayoutPrintTablePackage from "@/components/print_table_package/index.vue";
import { reactive } from "vue";
import { useRoute } from "vue-router";
import { getGroundbreakingView } from "@/request/groundbreaking.js";
import { getGroundbreakingView } from "@/request/eight_work.js";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const route = useRoute();
const { BREAKGROUND_ID, entrance } = route.query;
const data = reactive({
info: {},
imgList: [],
imgList1: [],
measuresList: [],
signs: [],
});
const fnGetData = async () => {
const resData = await getGroundbreakingView({ BREAKGROUND_ID });
data.info = resData.pd;
data.imgList = resData.imgList;
data.imgList1 = resData.imgList1;
data.measuresList = resData.measuresList;
data.info.APPLY_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[0];
data.info.CONSTRUCTION_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[1];
data.info.PRODUCTION_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[2];
data.info.SAFETY_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[3];
data.info.LEADER_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[4];
data.signs = resData.signs;
};
fnGetData();
</script>

View File

@ -1,15 +1,22 @@
<template>
<el-dialog v-model="visible" title="查看流程图" width="1500px">
<el-steps align-center finish-status="success">
<template v-for="(item, index) in flowList" :key="index">
<el-step :title="item.STEP_NAME" :status="fnGetStatus(item)">
<template #description>
<div>{{ item.ACT_USER_NAME || item.SIGN_USER }}</div>
<div>{{ item.ACT_TIME }}</div>
<el-dialog v-model="visible" title="查看流程图" width="1500px">
<el-scrollbar style="height: 150px">
<el-steps align-center finish-status="success" style="width: 2000px">
<template v-for="(item, index) in flowList" :key="index">
<el-step :title="item.STEP_NAME" :status="fnGetStatus(item)">
<template #description>
<div>{{ fnGetShowStepUser(item) }}</div>
<div>{{ item.ACT_TIME }}</div>
</template>
</el-step>
</template>
</el-step>
</el-steps>
</el-scrollbar>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
</el-steps>
</el-dialog>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
@ -30,17 +37,33 @@ const props = defineProps({
required: true,
default: () => {},
},
flowing: {
type: Object,
required: true,
default: () => {},
},
});
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);
const fnGetStatus = (step) => {
if (step.STATUS === 1) {
return "finish";
} else if (step.STATUS < 0) {
return "error";
} else if (step.CURRENT_STEP) {
return "process";
}
};
const fnGetShowStepUser = (step) => {
if (step.SIGN_USER) {
return step.SIGN_USER;
} else if (step.FINISHED_SIGN_USER) {
return step.FINISHED_SIGN_USER;
} else if (step.ACT_USER_NAME) {
return step.ACT_USER_NAME;
} else if (step.CAN_SKIP && !props.flowing[step.ACTOR_FIELD]) {
return "已跳过";
}
};
</script>

View File

@ -103,7 +103,11 @@
添加监控
</el-button>
<el-button
v-if="entrance === 'archive' && row.NEXT_STEP_ID === 99"
v-if="
entrance === 'archive' &&
row.NEXT_STEP_ID === 99 &&
row.VIDEO_PATH
"
type="primary"
text
link
@ -143,6 +147,7 @@
<flow-chart
v-model:visible="data.flowChartDialog.visible"
:flow-list="data.flowChartDialog.flowList"
:flowing="data.flowChartDialog.flowing"
/>
<layout-video
v-model:visible="data.videoDialog.visible"
@ -196,6 +201,7 @@ const data = reactive({
flowChartDialog: {
visible: false,
flowList: {},
flowing: {},
},
videoDialog: {
visible: false,
@ -203,9 +209,10 @@ const data = reactive({
},
});
const fnFlowChart = async (HIGHWORK_ID) => {
const { flowList } = await getHighWorkFlow({ HIGHWORK_ID });
const { flowList, flowingWork } = await getHighWorkFlow({ HIGHWORK_ID });
data.flowChartDialog.visible = true;
data.flowChartDialog.flowList = flowList;
data.flowChartDialog.flowing = flowingWork;
};
</script>

View File

@ -1,331 +1,353 @@
<template>
<layout-print-table-package :print="entrance === 'archive'">
<table>
<thead>
<layout-card>
<div id="printContent">
<table class="archive_print_table">
<thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left"> 高处安全作业票 </el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
</td>
</tr>
</thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left"> 高处安全作业票 </el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
<td class="title">作业申请单位</td>
<td>{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业申请时间</td>
<td>{{ data.info.CREATTIME }}</td>
</tr>
<tr>
<td class="title">作业地点</td>
<td>{{ data.info.WORK_PLACE }}</td>
<td class="title">作业内容</td>
<td>{{ data.info.WORK_CONTENT }}</td>
</tr>
<tr>
<td class="title">作业高度</td>
<td>{{ data.info.WORK_HIGH }}</td>
<td class="title">高处作业级别</td>
<td>
{{ data.info.WORK_LEVEL === 1 ? "I级高处作业" : "" }}
{{ data.info.WORK_LEVEL === 2 ? "II级高处作业" : "" }}
{{ data.info.WORK_LEVEL === 3 ? "III级高处作业" : "" }}
{{ data.info.WORK_LEVEL === 4 ? "IV级高处作业" : "" }}
</td>
</tr>
<tr>
<td class="title">作业单位</td>
<td>{{ data.info.CONFIRM_DEPARTMENT_NAME }}</td>
<td class="title">监护人</td>
<td>
<img
v-for="(item, index) in data.signs.GUARDIAN?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</thead>
<tr>
<td class="title">作业申请单位</td>
<td>{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业申请时间</td>
<td>{{ data.info.CREATTIME }}</td>
</tr>
<tr>
<td class="title">作业地点</td>
<td>{{ data.info.WORK_PLACE }}</td>
<td class="title">作业内容</td>
<td>{{ data.info.WORK_CONTENT }}</td>
</tr>
<tr>
<td class="title">作业高度</td>
<td>{{ data.info.WORK_HIGH }}</td>
<td class="title">高处作业级别</td>
<td>
{{ data.info.WORK_LEVEL === 1 ? "I级高处作业" : "" }}
{{ data.info.WORK_LEVEL === 2 ? "II级高处作业" : "" }}
{{ data.info.WORK_LEVEL === 3 ? "III级高处作业" : "" }}
{{ data.info.WORK_LEVEL === 4 ? "IV级高处作业" : "" }}
</td>
</tr>
<tr>
<td class="title">作业单位</td>
<td>{{ data.info.CONFIRM_DEPARTMENT_NAME }}</td>
<td class="title">作业负责人</td>
<td>{{ data.info.CONFIRM_USER_NAME }}</td>
</tr>
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="3">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td class="title">风险辨识结果</td>
<td colspan="3">{{ data.info.RISK_IDENTIFICATION }}</td>
</tr>
<tr>
<td class="title">作业实施时间</td>
<td colspan="3">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="4">
<table>
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>
{{ item.PROTECTIVE_MEASURES }}
<div v-if="item.IMG_PATH">
<template v-for="img in item.IMG_PATH.split(',')" :key="img">
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="100"
height="100"
/>
</template>
</div>
</td>
<td>
<span v-if="item.STATUS === '1'"> &nbsp;&nbsp;&nbsp; </span>
<span v-if="item.STATUS === '-1'"> </span>
</td>
<td>
<img
v-if="item.SIGN_PATH"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="100"
height="100"
/>
</td>
</tr>
<template v-if="data.signs.MEASURES_CONFIRM">
<tr
v-for="(item, index) in data.signs.MEASURES_CONFIRM"
:key="item.BUS_HOTWORK_MEASURES_ID"
>
<td>{{ data.measuresList.length + 1 + index }}</td>
<td colspan="2">
<div style="display: flex; justify-content: space-between">
<span> 其他安全措施 {{ item.DESCR }} </span>
<tr>
<td class="title">作业人</td>
<td>
<img
v-for="(item, index) in data.signs.WORK_USER?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
<td class="title">作业负责人</td>
<td>
<img
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="3">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td class="title">风险辨识结果</td>
<td colspan="3">{{ data.info.RISK_IDENTIFICATION }}</td>
</tr>
<tr>
<td class="title">作业实施时间</td>
<td colspan="3">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="11">
<table class="archive_print_table">
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>
{{ item.PROTECTIVE_MEASURES }}
<div v-if="item.IMG_PATH" class="mt-10">
<template
v-for="img in item.IMG_PATH.split(',')"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</template>
</div>
</td>
<td>
<span v-if="item.STATUS === '1'">
&nbsp;&nbsp;&nbsp;
</span>
<span v-if="item.STATUS === '-1'"> </span>
</td>
<td>
<img
v-if="item.SIGN_PATH[0]"
v-if="item.SIGN_PATH"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH[0]"
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="100"
height="100"
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</template>
</table>
</td>
</tr>
<tr v-if="data.signs.GUARDIAN">
<td colspan="10">
<div>监护人</div>
<div
v-for="(item, index) in data.signs.GUARDIAN[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.GUARDIAN[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.GUARDIAN[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFESS">
<td colspan="10">
<div>
安全交底人
<div v-if="data.signs.CONFESS[0].IMG_PATH">
<template
v-for="img in data.signs.CONFESS[0].IMG_PATH"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="100"
height="100"
/>
<template v-if="data.signs.MEASURES_CONFIRM">
<tr
v-for="(item, index) in data.signs.MEASURES_CONFIRM"
:key="item.BUS_HIGHWORK_MEASURES_ID"
>
<td>{{ data.measuresList.length + 1 + index }}</td>
<td colspan="2">
<div style="display: flex; justify-content: space-between">
<span> 其他安全措施 {{ item.DESCR }} </span>
</div>
</td>
<td>
<img
v-if="item.SIGN_PATH?.[0]"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH?.[0]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</template>
</table>
</td>
</tr>
<tr v-if="data.signs.CONFESS">
<td colspan="10">
<div>
安全交底人
<div v-if="data.signs.CONFESS?.[0].IMG_PATH?.[0]">
<template
v-for="img in data.signs.CONFESS?.[0].IMG_PATH"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</template>
</div>
</div>
</div>
<div
v-for="(item, index) in data.signs.CONFESS[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFESS[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.CONFESS[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT_CONFESS">
<td colspan="10">
<div>接受交底人</div>
<div
v-for="(item, index) in data.signs.ACCEPT_CONFESS[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="
VITE_FILE_URL + data.signs.ACCEPT_CONFESS[0].SIGN_PATH[index]
"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.ACCEPT_CONFESS[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.WORK_USER">
<td colspan="10">
<div>作业人</div>
<div
v-for="(item, index) in data.signs.WORK_USER[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.WORK_USER[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.WORK_USER[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFIRM">
<td colspan="10">
<div>作业负责人意见{{ data.signs.CONFIRM[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.CONFIRM[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFIRM[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.CONFIRM[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<div
v-for="(item, index) in data.signs.CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFESS?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT_CONFESS">
<td colspan="10">
<div>接受交底人</div>
<div
v-for="(item, index) in data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="
VITE_FILE_URL +
data.signs.ACCEPT_CONFESS?.[0].SIGN_PATH[index]
"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.LEADER">
<td colspan="10">
<div>所在单位意见{{ data.signs.LEADER[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.LEADER[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.LEADER[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.LEADER[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.AUDIT">
<td colspan="10">
<div>审核部门意见{{ data.signs.AUDIT[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.AUDIT[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.AUDIT[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.AUDIT[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFIRM">
<td colspan="10">
<div>作业负责人意见{{ data.signs.CONFIRM?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFIRM?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFIRM?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.APPROVE">
<td colspan="10">
<div>审批部门意见{{ data.signs.APPROVE[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.APPROVE[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.APPROVE[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.APPROVE[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.LEADER">
<td colspan="10">
<div>所在单位意见{{ data.signs.LEADER?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.LEADER?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.LEADER?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.LEADER?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.AUDIT">
<td colspan="10">
<div>审核部门意见{{ data.signs.AUDIT?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.AUDIT?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.AUDIT?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.AUDIT?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT">
<td colspan="10">
<div>完工验收{{ data.signs.ACCEPT[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.ACCEPT[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.ACCEPT[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.ACCEPT[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
</table>
</layout-print-table-package>
<tr v-if="data.signs.APPROVE">
<td colspan="10">
<div>审批部门意见{{ data.signs.APPROVE?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.APPROVE?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.APPROVE?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.APPROVE?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT">
<td colspan="10">
<div>完工验收{{ data.signs.ACCEPT?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.ACCEPT?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.ACCEPT?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
</table>
</div>
<div v-if="entrance === 'archive'" class="mt-10 tc">
<el-button v-print="'#printContent'" type="primary"></el-button>
</div>
</layout-card>
</template>
<script setup>
import LayoutPrintTablePackage from "@/components/print_table_package/index.vue";
import { reactive } from "vue";
import { useRoute } from "vue-router";
import { getHighWorkView } from "@/request/eight_work.js";

View File

@ -1,96 +1,17 @@
<template>
<el-dialog v-model="visible" title="查看流程图" width="1500px">
<el-steps
:active="fnGetStatus()"
:process-status="fnGetProcessStatus()"
align-center
finish-status="success"
>
<el-step title="吊装作业提交">
<template #description>
<div>{{ fnGetProcessMessage().title }}</div>
<div>{{ fnGetProcessMessage().USER_NAME }}</div>
<div>{{ fnGetProcessMessage().OPERATTIME }}</div>
<el-scrollbar style="height: 150px">
<el-steps align-center finish-status="success" style="width: 2000px">
<template v-for="(item, index) in flowList" :key="index">
<el-step :title="item.STEP_NAME" :status="fnGetStatus(item)">
<template #description>
<div>{{ fnGetShowStepUser(item) }}</div>
<div>{{ item.ACT_TIME }}</div>
</template>
</el-step>
</template>
</el-step>
<el-step title="作业指挥意见">
<template #description>
<div>{{ info.LEADER_USER_NAME }}</div>
<div>{{ info.LEADER_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="所在单位意见">
<template #description>
<div v-if="!info.CONSTRUCTION_USER_NAME">{{ "" }}</div>
<div v-else>{{ info.CONSTRUCTION_USER_NAME }}</div>
<div>{{ info.CONSTRUCTION_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="审核部门意见">
<template #description>
<div v-if="!info.AUDIT_USER_NAME">{{ "" }}</div>
<div v-else>{{ info.AUDIT_USER_NAME }}</div>
<div>{{ info.AUDIT_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="审批部门意见">
<template #description>
<div v-if="!info.APPROVE_USER_NAME">{{ "" }}</div>
<div v-else>{{ info.APPROVE_USER_NAME }}</div>
<div>{{ info.APPROVE_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="完成验收">
<template #description>
<div>{{ info.ACCEPT_USER_NAME }}</div>
<div>{{ info.ACCEPT_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="验收归档">
<template #description>
<div>{{ info.ACCEPT_USER_NAME }}</div>
<div>{{ info.ACCEPT_USER_SIGNER_TIME }}</div>
</template>
</el-step>
</el-steps>
<div
style="
margin: 60px 60px 0 60px;
display: flex;
justify-content: space-between;
"
>
<div v-if="info.GUARDIAN_USER_SIGNER_TIME">
<div class="el-step__title is-success">
监护人{{ info.GUARDIAN_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.GUARDIAN_USER_SIGNER_TIME">
<div class="el-step__title is-error">
监护人{{ info.GUARDIAN_USER_NAME }}未签字
</div>
</div>
<div v-if="info.CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-success">
安全交底人{{ info.CONFESS_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-error">
安全交底人{{ info.CONFESS_USER_NAME }}未签字
</div>
</div>
<div v-if="info.ACCEPT_CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-success">
接受交底人{{ info.ACCEPT_CONFESS_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.ACCEPT_CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-error">
接受交底人{{ info.ACCEPT_CONFESS_USER_NAME }}未签字
</div>
</div>
</div>
</el-steps>
</el-scrollbar>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
@ -106,7 +27,12 @@ const props = defineProps({
required: true,
default: false,
},
info: {
flowList: {
type: Object,
required: true,
default: () => {},
},
flowing: {
type: Object,
required: true,
default: () => {},
@ -114,57 +40,27 @@ const props = defineProps({
});
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);
const fnGetStatus = () => {
const result = {
1: 1,
2: 2,
3: 3,
4: 4,
5: 5,
6: 7,
};
return result[props.info.APPLY_STATUS] || 0;
const fnGetStatus = (step) => {
if (step.STATUS === 1) {
return "finish";
} else if (step.STATUS < 0) {
return "error";
} else if (step.CURRENT_STEP) {
return "process";
}
};
const fnGetProcessStatus = () => {
if (props.info.APPLY_STATUS < "0") return "error";
else return "process";
};
const fnGetProcessMessage = () => {
const info = props.info;
const result = {
"-2": {
title: "作业指挥审核打回",
USER_NAME: info.LEADER_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-3": {
title: "所在单位审核打回",
USER_NAME: info.CONSTRUCTION_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-4": {
title: "审核部门审核打回",
USER_NAME: info.AUDIT_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-5": {
title: "审批部门审核打回",
USER_NAME: info.APPROVE_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-6": {
title: "验收打回",
USER_NAME: info.ACCEPT_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
};
return (
result[props.info.APPLY_STATUS] || {
title: "",
USER_NAME: info.APPLY_USER,
OPERATTIME: info.CREATTIME,
}
);
const fnGetShowStepUser = (step) => {
if (step.SIGN_USER) {
return step.SIGN_USER;
} else if (step.FINISHED_SIGN_USER) {
return step.FINISHED_SIGN_USER;
} else if (step.ACT_USER_NAME) {
return step.ACT_USER_NAME;
} else if (step.CAN_SKIP && !props.flowing[step.ACTOR_FIELD]) {
return "已跳过";
}
};
</script>

View File

@ -16,13 +16,13 @@
</el-form-item>
</el-col>
<el-col v-if="entrance === 'job_data'" :span="6">
<el-form-item label="状态" prop="APPLY_STATUS">
<el-select v-model="searchForm.APPLY_STATUS">
<el-form-item label="状态" prop="STEP_ID">
<el-select v-model="searchForm.STEP_ID">
<el-option
v-for="item in stateList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
v-for="item in stepList"
:key="item.STEP_ID"
:label="item.STEP_NAME"
:value="item.STEP_ID"
/>
</el-select>
</el-form-item>
@ -50,45 +50,38 @@
</template>
</el-table-column>
<el-table-column prop="CHECK_NO" label="编号" show-overflow-tooltip />
<el-table-column prop="LEADER_DEPARTMENT_NAME" label="作业单位" />
<el-table-column prop="CONFIRM_USER_NAME" label="作业负责人" />
<el-table-column prop="LEADER_USER_NAME" label="所在单位负责人" />
<el-table-column
prop="LEADER_USER_NAME"
label="作业指挥负责人"
label="审核部门负责人"
show-overflow-tooltip
/>
<el-table-column label="所在单位负责人" show-overflow-tooltip>
<template #default="{ row }">
{{ row.CONSTRUCTION_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column label="审核部门负责人" show-overflow-tooltip>
<template #default="{ row }">
{{ row.AUDIT_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column label="审批部门负责人" show-overflow-toolti>
<template #default="{ row }">
{{ row.APPROVE_USER_NAME || " 已跳过" }}
</template>
prop="AUDIT_USER_NAME"
width="150"
>
</el-table-column>
<el-table-column
prop="ACCEPT_USER_NAME"
label="验收部门负责人"
label="审批部门负责人"
prop="APPROVE_USER_NAME"
show-overflow-tooltip
/>
<el-table-column label="审核状态">
>
</el-table-column>
<el-table-column prop="ACCEPT_USER_NAME" label="验收部门负责人" />
<el-table-column label="审核状态" width="170">
<template #default="{ row }">
{{
entrance === "job_data"
? translationStatus(row.APPLY_STATUS, stateList)
: "已归档"
}}
<span v-if="row.STEP_ID === 0"></span>
<span v-else-if="row.STATUS === -2">气体检测打回</span>
<span v-else-if="row.STEP_ID !== -1">{{ row.NEXT_STEP_NAME }}</span>
<span v-else>{{ row.STEP_NAME }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="250">
<template #default="{ row }">
<el-button
v-if="entrance === 'job_data' && row.APPLY_STATUS !== '6'"
v-if="
entrance === 'job_data' &&
row.STATUS > -1 &&
row.NEXT_STEP_ID !== 99
"
type="primary"
text
link
@ -109,10 +102,23 @@
type="primary"
text
link
@click="fnFlowChart(row)"
@click="fnFlowChart(row.HOISTING_ID)"
>
流程图
</el-button>
<el-button
v-if="
entrance === 'archive' &&
row.NEXT_STEP_ID === 99 &&
row.VIDEO_PATH
"
type="primary"
text
link
@click="fnPreviewVideo(row.VIDEO_PATH)"
>
查看验收视频
</el-button>
<el-button
type="primary"
text
@ -135,18 +141,29 @@
</layout-card>
<flow-chart
v-model:visible="data.flowChartDialog.visible"
:info="data.flowChartDialog.info"
:flow-list="data.flowChartDialog.flowList"
:flowing="data.flowChartDialog.flowing"
/>
<layout-video
v-model:visible="data.videoDialog.visible"
:src="data.videoDialog.src"
append-to-body
/>
</div>
</template>
<script setup>
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
import { serialNumber } from "@/assets/js/utils.js";
import { useRouter } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import { reactive, ref } from "vue";
import FlowChart from "./components/flow_chart.vue";
import { getHoistingList } from "@/request/hoisting.js";
import LayoutVideo from "@/components/video/index.vue";
import {
getHoistingList,
getTaskSetps,
getHoistingFlow,
} from "@/request/eight_work.js";
const props = defineProps({
entrance: {
@ -154,34 +171,45 @@ const props = defineProps({
default: "job_data",
},
});
const stateList = [
{ ID: "0", NAME: "吊装作业待提交" },
{ ID: "1", NAME: "作业指挥待审核" },
{ ID: "2", NAME: "所在单位待审核" },
{ ID: "3", NAME: "审核部门待审核" },
{ ID: "4", NAME: "审批部门待审核" },
{ ID: "5", NAME: "待验收" },
{ ID: "6", NAME: "验收归档" },
{ ID: "-2", NAME: "作业指挥审核打回" },
{ ID: "-3", NAME: "所在单位审核打回" },
{ ID: "-4", NAME: "审核部门审核打回" },
{ ID: "-5", NAME: "审批部门审核打回" },
{ ID: "-6", NAME: "验收打回" },
];
const stepList = ref([]);
const getStepList = async () => {
const { list } = await getTaskSetps({ TASK_ID: 1 });
stepList.value = [
{ STEP_NAME: "请选择", STEP_ID: "" },
...list,
{ STEP_NAME: "验收归档", STEP_ID: "99" },
];
};
getStepList();
const fnPreviewVideo = (VIDEO_PATH) => {
data.videoDialog.visible = true;
data.videoDialog.src = VIDEO_PATH;
};
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getHoistingList, {
otherParams: props.entrance === "archive" ? { APPLY_STATUS: "6" } : {},
otherParams: props.entrance === "archive" ? { STEP_ID: "99" } : {},
});
const data = reactive({
flowChartDialog: {
visible: false,
info: {},
flowList: {},
flowing: {},
},
videoDialog: {
visible: false,
src: "",
},
});
const fnFlowChart = (info) => {
const fnFlowChart = async (HOISTING_ID) => {
const { flowList, flowingWork } = await getHoistingFlow({ HOISTING_ID });
data.flowChartDialog.visible = true;
data.flowChartDialog.info = info;
data.flowChartDialog.flowList = flowList;
data.flowChartDialog.flowing = flowingWork;
};
</script>

View File

@ -1,338 +1,407 @@
<template>
<layout-print-table-package :print="entrance === 'archive'">
<table>
<thead>
<layout-card>
<div id="printContent">
<table class="archive_print_table">
<thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left"> 吊装安全作业票 </el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
</td>
</tr>
</thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left"> 吊装安全作业票 </el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
<td class="title">作业申请单位</td>
<td>{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业单位</td>
<td>{{ data.info.LEADER_DEPARTMENT_NAME }}</td>
<td class="title">作业申请时间</td>
<td>{{ data.info.CREATTIME }}</td>
</tr>
<tr>
<td class="title">吊装地点</td>
<td>{{ data.info.WORK_PLACE }}</td>
<td class="title">吊具名称</td>
<td>{{ data.info.TOOL_NAME }}</td>
<td class="title">吊物内容</td>
<td>{{ data.info.WORK_CONTENT }}</td>
</tr>
<tr>
<td class="title">吊装作业人</td>
<td>
<img
v-for="(item, index) in data.signs.WORK_USER?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
<td class="title">司索人</td>
<td>
<img
v-for="(item, index) in data.signs.SISUO?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
<td class="title">监护人</td>
<td>
<img
v-for="(item, index) in data.signs.GUARDIAN?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</thead>
<tr>
<td class="title">作业申请单位</td>
<td>{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业单位</td>
<td>{{ data.info.LEADER_DEPARTMENT_NAME }}</td>
<td class="title">作业申请时间</td>
<td>{{ data.info.CREATTIME }}</td>
</tr>
<tr>
<td class="title">吊装地点</td>
<td>{{ data.info.WORK_PLACE }}</td>
<td class="title">吊具名称</td>
<td>{{ data.info.TOOL_NAME }}</td>
<td class="title">吊物内容</td>
<td>{{ data.info.WORK_CONTENT }}</td>
</tr>
<tr>
<td class="title">吊装作业人</td>
<td>{{ data.info.WORK_USER }}</td>
<td class="title">司索人</td>
<td>{{ data.info.SISUO_USER }}</td>
<td class="title">监护人</td>
<td>
<div v-if="data.info.GUARDIAN_USER_SIGNER_PATH" class="tr">
<span>签字</span>
<tr>
<td class="title">指挥人员</td>
<td>
<img
v-for="(item, index) in data.signs.PROJECT_MANAGER?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + data.info.GUARDIAN_USER_SIGNER_PATH"
:src="VITE_FILE_URL + item"
alt=""
width="100"
height="100"
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.info.GUARDIAN_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr>
<td class="title">指挥人员</td>
<td>{{ data.info.PROJECT_MANAGER }}</td>
<td class="title" colspan="2">吊物质量t及作业级别</td>
<td colspan="2">
<span>{{ data.info.PART_WEIGHT }}t</span>
<span style="margin-left: 20px">
{{ data.info.WORK_LEVEL === 1 ? "一级作业级别" : "" }}
{{ data.info.WORK_LEVEL === 2 ? "二级作业级别" : "" }}
{{ data.info.WORK_LEVEL === 3 ? "三级作业级别" : "" }}
</span>
</td>
</tr>
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="5">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr />
<tr>
<td class="title">风险辨识结果</td>
<td colspan="5">{{ data.info.HAZARD_IDENTIFICATION }}</td>
</tr>
<tr>
<td class="title">作业实施时间</td>
<td colspan="5">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="6">
<table>
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>{{ item.PROTECTIVE_MEASURES }}</td>
<td>
<span v-if="item.STATUS === '1'">
<input type="radio" disabled checked />&nbsp;&nbsp;&nbsp;
</span>
<span v-if="item.STATUS === '-1'">
<input type="radio" disabled checked />不涉及
</span>
</td>
<td>
{{ item.CONFIRM_NAME }}
</td>
</tr>
<tr
v-if="
data.info.LEADER_USER_MEASURES ||
data.info.CONFIRM_USER_MEASURES ||
data.info.AUDIT_USER_MEASURES ||
data.info.APPROVE_USER_MEASURES
"
</td>
<td class="title" colspan="2">吊物质量t及作业级别</td>
<td colspan="2">
<span>{{ data.info.PART_WEIGHT }}t</span>
<span style="margin-left: 20px">
{{ data.info.WORK_LEVEL === 1 ? "一级作业级别" : "" }}
{{ data.info.WORK_LEVEL === 2 ? "二级作业级别" : "" }}
{{ data.info.WORK_LEVEL === 3 ? "三级作业级别" : "" }}
</span>
</td>
</tr>
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="5">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr />
<tr>
<td class="title">风险辨识结果</td>
<td colspan="5">{{ data.info.RISK_IDENTIFICATION }}</td>
</tr>
<tr>
<td class="title">作业实施时间</td>
<td colspan="5">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="11">
<table class="archive_print_table">
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>
{{ item.PROTECTIVE_MEASURES }}
<div v-if="item.IMG_PATH" class="mt-10">
<template
v-for="img in item.IMG_PATH.split(',')"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</template>
</div>
</td>
<td>
<span v-if="item.STATUS === '1'">
&nbsp;&nbsp;&nbsp;
</span>
<span v-if="item.STATUS === '-1'"> </span>
</td>
<td>
<img
v-if="item.SIGN_PATH"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
<template v-if="data.signs.MEASURES_CONFIRM">
<tr
v-for="(item, index) in data.signs.MEASURES_CONFIRM"
:key="item.BUS_HOISTING_MEASURES_ID"
>
<td>{{ data.measuresList.length + 1 + index }}</td>
<td colspan="2">
<div style="display: flex; justify-content: space-between">
<span> 其他安全措施 {{ item.DESCR }} </span>
</div>
</td>
<td>
<img
v-if="item.SIGN_PATH?.[0]"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH?.[0]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</template>
</table>
</td>
</tr>
<tr v-if="data.signs.CONFESS">
<td colspan="10">
<div>
安全交底人
<div v-if="data.signs.CONFESS?.[0].IMG_PATH?.[0]">
<template
v-for="img in data.signs.CONFESS?.[0].IMG_PATH"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</template>
</div>
</div>
<div
v-for="(item, index) in data.signs.CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<td>{{ data.measuresList.length + 1 }}</td>
<td colspan="3">
<div
v-if="data.info.LEADER_USER_MEASURES"
style="display: flex; justify-content: space-between"
>
<span>
其他安全措施{{ data.info.LEADER_USER_MEASURES }}
</span>
<span>编制人{{ data.info.LEADER_USER_NAME }}</span>
</div>
<div
v-if="
data.info.CONSTRUCTION_USER_ID &&
data.info.CONFIRM_USER_MEASURES
"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
>
<span>
其他安全措施{{ data.info.CONFIRM_USER_MEASURES }}
</span>
<span>编制人{{ data.info.CONSTRUCTION_USER_NAME }}</span>
</div>
<div
v-if="
data.info.AUDIT_USER_ID && data.info.AUDIT_USER_MEASURES
"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
>
<span>其他安全措施{{ data.info.AUDIT_USER_MEASURES }}</span>
<span>编制人{{ data.info.AUDIT_USER_NAME }}</span>
</div>
<div
v-if="
data.info.APPROVE_USER_ID && data.info.APPROVE_USER_MEASURES
"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
>
<span>
其他安全措施{{ data.info.APPROVE_USER_MEASURES }}
</span>
<span>编制人{{ data.info.APPROVE_USER_NAME }}</span>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="title">安全交底人</td>
<td colspan="10">
<div v-if="data.info.CONFESS_USER_SIGNER_PATH" class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONFESS_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.CONFESS_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr>
<td class="title">接受交底人</td>
<td colspan="10">
<div
v-for="item in data.imgList"
:key="item.ACCEPT_CONFESS_ID"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + item.ACCEPT_CONFESS_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ item.ACCEPT_CONFESS_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.LEADER_USER_SIGNER_PATH">
<td colspan="6">
<div>作业指挥意见{{ data.info.LEADER_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.LEADER_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.LEADER_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.CONSTRUCTION_USER_SIGNER_PATH">
<td colspan="6">
<div>所在单位意见{{ data.info.CONSTRUCTION_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONSTRUCTION_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.CONSTRUCTION_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.AUDIT_USER_SIGNER_PATH">
<td colspan="6">
<div>审核部门意见{{ data.info.AUDIT_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.AUDIT_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.AUDIT_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.APPROVE_USER_SIGNER_PATH">
<td colspan="6">
<div>审批部门意见{{ data.info.APPROVE_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.APPROVE_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.APPROVE_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.imgList1.length > 0">
<td colspan="10">
<div>完工验收{{ data.info.ACCEPT_CONTENT }}</div>
<div
v-for="item in data.imgList1"
:key="item.ACCEPT_CONFESS_ID"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + item.ACCEPT_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ item.ACCEPT_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
</table>
</layout-print-table-package>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFESS?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT_CONFESS">
<td colspan="10">
<div>接受交底人</div>
<div
v-for="(item, index) in data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="
VITE_FILE_URL +
data.signs.ACCEPT_CONFESS?.[0].SIGN_PATH[index]
"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFIRM">
<td colspan="10">
<div>作业负责人意见{{ data.signs.CONFIRM?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFIRM?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFIRM?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.PROJECT_MANAGER">
<td colspan="10">
<div>
吊装指挥负责人意见{{ data.signs.PROJECT_MANAGER?.[0].DESCR }}
</div>
<div
v-for="(item, index) in data.signs.PROJECT_MANAGER?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="
VITE_FILE_URL +
data.signs.PROJECT_MANAGER?.[0].SIGN_PATH[index]
"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{
data.signs.PROJECT_MANAGER?.[0].SIGN_TIME[index]
}}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.LEADER">
<td colspan="10">
<div>所在单位意见{{ data.signs.LEADER?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.LEADER?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.LEADER?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.LEADER?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.AUDIT">
<td colspan="10">
<div>审核部门意见{{ data.signs.AUDIT?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.AUDIT?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.AUDIT?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.AUDIT?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.APPROVE">
<td colspan="10">
<div>审批部门意见{{ data.signs.APPROVE?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.APPROVE?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.APPROVE?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.APPROVE?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT">
<td colspan="10">
<div>完工验收{{ data.signs.ACCEPT?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.ACCEPT?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.ACCEPT?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
</table>
</div>
<div v-if="entrance === 'archive'" class="mt-10 tc">
<el-button v-print="'#printContent'" type="primary"></el-button>
</div>
</layout-card>
</template>
<script setup>
import LayoutPrintTablePackage from "@/components/print_table_package/index.vue";
import { reactive } from "vue";
import { useRoute } from "vue-router";
import { getHoistingView } from "@/request/hoisting.js";
import { findCharIndex } from "@/assets/js/utils.js";
import { getHoistingView } from "@/request/eight_work.js";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const route = useRoute();
const { HOISTING_ID, entrance } = route.query;
const data = reactive({
info: {},
imgList: [],
imgList1: [],
measuresList: [],
signs: [],
});
const fnGetData = async () => {
const resData = await getHoistingView({ HOISTING_ID });
data.info = resData.pd;
data.imgList = resData.imgList;
data.imgList1 = resData.imgList1;
for (let i = 0; i < resData.measuresList.length; i++) {
const PROTECTIVE_MEASURES =
resData.measuresList[i].PROTECTIVE_MEASURES.split("");
for (let j = 1; j <= 3; j++) {
if (findCharIndex(PROTECTIVE_MEASURES, "", j) !== -1) {
PROTECTIVE_MEASURES.splice(
findCharIndex(PROTECTIVE_MEASURES, "", j) + 1,
0,
resData.measuresList[i]["ANSWER" + j]
);
}
}
resData.measuresList[i].PROTECTIVE_MEASURES = PROTECTIVE_MEASURES.join("");
}
data.measuresList = resData.measuresList;
data.info.LEADER_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[0];
data.info.CONFIRM_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[1];
data.info.AUDIT_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[2];
data.info.APPROVE_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[3];
data.signs = resData.signs;
};
fnGetData();
</script>

View File

@ -1,15 +1,17 @@
<template>
<el-dialog v-model="visible" title="查看流程图" width="1500px">
<el-steps align-center finish-status="success">
<template v-for="(item, index) in flowList" :key="index">
<el-step :title="item.STEP_NAME" :status="fnGetStatus(item)">
<template #description>
<div>{{ fnGetShowStepUser(item) }}</div>
<div>{{ item.ACT_TIME }}</div>
</template>
</el-step>
</template>
</el-steps>
<el-scrollbar style="height: 150px">
<el-steps align-center finish-status="success" style="width: 2000px">
<template v-for="(item, index) in flowList" :key="index">
<el-step :title="item.STEP_NAME" :status="fnGetStatus(item)">
<template #description>
<div>{{ fnGetShowStepUser(item) }}</div>
<div>{{ item.ACT_TIME }}</div>
</template>
</el-step>
</template>
</el-steps>
</el-scrollbar>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>

View File

@ -109,7 +109,11 @@
流程图
</el-button>
<el-button
v-if="entrance === 'archive' && row.NEXT_STEP_ID === 99"
v-if="
entrance === 'archive' &&
row.NEXT_STEP_ID === 99 &&
row.VIDEO_PATH
"
type="primary"
text
link

View File

@ -1,353 +1,395 @@
<template>
<layout-print-table-package :print="entrance === 'archive'">
<table>
<thead>
<layout-card>
<div id="printContent">
<table class="archive_print_table">
<thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left"> 动火安全作业票 </el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
</td>
</tr>
</thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left"> 动火安全作业票 </el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
<td class="title">作业申请单位</td>
<td>{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业申请时间</td>
<td>{{ data.info.CREATTIME }}</td>
</tr>
<tr>
<td class="title">作业内容</td>
<td>{{ data.info.WORK_CONTENT }}</td>
<td class="title">动火地点及动火部位</td>
<td>{{ data.info.WORK_PLACE }}</td>
</tr>
<tr>
<td class="title">动火作业级别</td>
<td>{{ data.info.WORK_LEVEL }}</td>
<td class="title">动火方式</td>
<td>{{ data.info.WORK_FUNCTION }}</td>
</tr>
<tr>
<td class="title">动火人及证书编号</td>
<td colspan="3">{{ data.info.WORK_USER }}</td>
</tr>
<tr>
<td class="title">作业单位</td>
<td>{{ data.info.CONFIRM_DEPARTMENT_NAME }}</td>
<td class="title">作业负责人</td>
<td>
<img
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="ml-10 mt-10"
/>
</td>
</tr>
</thead>
<tr>
<td class="title">作业申请单位</td>
<td>{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业申请时间</td>
<td>{{ data.info.CREATTIME }}</td>
</tr>
<tr>
<td class="title">作业内容</td>
<td>{{ data.info.WORK_CONTENT }}</td>
<td class="title">动火地点及动火部位</td>
<td>{{ data.info.WORK_PLACE }}</td>
</tr>
<tr>
<td class="title">动火作业级别</td>
<td>{{ data.info.WORK_LEVEL }}</td>
<td class="title">动火方式</td>
<td>{{ data.info.WORK_FUNCTION }}</td>
</tr>
<tr>
<td class="title">动火人及证书编号</td>
<td colspan="3">{{ data.info.WORK_USER }}</td>
</tr>
<tr>
<td class="title">作业单位</td>
<td>{{ data.info.CONFIRM_DEPARTMENT_NAME }}</td>
<td class="title">作业负责人</td>
<td>{{ data.info.CONFIRM_USER_NAME }}</td>
</tr>
<template v-for="(item, index) in data.gasList" :key="index">
<template v-for="(item, index) in data.gasList" :key="index">
<tr>
<td class="title">气体取样分析时间</td>
<td>{{ item.ANALYZE_TIME }}</td>
<td class="title">代表性气体</td>
<td>{{ item.ANALYZE_GAS }}</td>
</tr>
<tr>
<td class="title">分析结果/%</td>
<td>{{ item.ANALYZE_RESULT }}</td>
<td class="title">分析人</td>
<td>
<img
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="20"
height="20"
class="ml-10 mt-10"
/>
</td>
</tr>
<tr v-if="item.ANALYZE_PLACE">
<td class="title">分析地点</td>
<td colspan="3">{{ item.ANALYZE_PLACE }}</td>
</tr>
</template>
<tr>
<td class="title">气体取样分析时间</td>
<td>{{ item.ANALYZE_TIME }}</td>
<td class="title">代表性气体</td>
<td>{{ item.ANALYZE_GAS }}</td>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="3">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td class="title">分析结果/%</td>
<td>{{ item.ANALYZE_RESULT }}</td>
<td class="title">分析人</td>
<td>{{ item.ANALYZE_USER }}</td>
<td class="title">风险辨识结果</td>
<td colspan="3">{{ data.info.RISK_IDENTIFICATION }}</td>
</tr>
<tr v-if="item.ANALYZE_PLACE">
<td class="title">分析地点</td>
<td colspan="3">{{ item.ANALYZE_PLACE }}</td>
<tr>
<td class="title">动火作业实施时间</td>
<td colspan="3">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
</template>
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="3">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td class="title">风险辨识结果</td>
<td colspan="3">{{ data.info.RISK_IDENTIFICATION }}</td>
</tr>
<tr>
<td class="title">动火作业实施时间</td>
<td colspan="3">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="4">
<table>
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>
{{ item.PROTECTIVE_MEASURES }}
<div v-if="item.IMG_PATH">
<template v-for="img in item.IMG_PATH.split(',')" :key="img">
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="100"
height="100"
/>
</template>
</div>
</td>
<td>
<span v-if="item.STATUS === '1'"> &nbsp;&nbsp;&nbsp; </span>
<span v-if="item.STATUS === '-1'"> </span>
</td>
<td>
<img
v-if="item.SIGN_PATH"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="100"
height="100"
/>
</td>
</tr>
<template v-if="data.signs.MEASURES_CONFIRM">
<tr
v-for="(item, index) in data.signs.MEASURES_CONFIRM"
:key="item.BUS_HOTWORK_MEASURES_ID"
>
<td>{{ data.measuresList.length + 1 + index }}</td>
<td colspan="2">
<div style="display: flex; justify-content: space-between">
<span> 其他安全措施 {{ item.DESCR }} </span>
<tr>
<td colspan="4">
<table class="archive_print_table">
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>
{{ item.PROTECTIVE_MEASURES }}
<div v-if="item.IMG_PATH">
<template
v-for="img in item.IMG_PATH.split(',')"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="100"
height="100"
class="mr-10 mt-10"
/>
</template>
</div>
</td>
<td>
<span v-if="item.STATUS === '1'">
&nbsp;&nbsp;&nbsp;
</span>
<span v-if="item.STATUS === '-1'"> </span>
</td>
<td>
<img
v-if="item.SIGN_PATH[0]"
v-if="item.SIGN_PATH"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH[0]"
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="100"
height="100"
class="mr-10 mt-10"
/>
</td>
</tr>
</template>
</table>
</td>
</tr>
<tr v-if="data.signs.GUARDIAN">
<td colspan="10">
<div>监护人</div>
<div
v-for="(item, index) in data.signs.GUARDIAN[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.GUARDIAN[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.GUARDIAN[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFESS">
<td colspan="10">
<div>
安全交底人
<div v-if="data.signs.CONFESS[0].IMG_PATH">
<template
v-for="img in data.signs.CONFESS[0].IMG_PATH"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="100"
height="100"
/>
<template v-if="data.signs.MEASURES_CONFIRM">
<tr
v-for="(item, index) in data.signs.MEASURES_CONFIRM"
:key="item.BUS_HOTWORK_MEASURES_ID"
>
<td>{{ data.measuresList.length + 1 + index }}</td>
<td colspan="2">
<div style="display: flex; justify-content: space-between">
<span> 其他安全措施 {{ item.DESCR }} </span>
</div>
</td>
<td>
<img
v-if="item.SIGN_PATH?.[0]"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH?.[0]"
alt=""
width="100"
height="100"
class="mr-10 mt-10"
/>
</td>
</tr>
</template>
</table>
</td>
</tr>
<tr v-if="data.signs.CONFESS">
<td colspan="10">
<div>
安全交底人
<div v-if="data.signs.CONFESS?.[0].IMG_PATH?.[0]">
<template
v-for="img in data.signs.CONFESS?.[0].IMG_PATH"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="100"
height="100"
class="mr-10 mt-10"
/>
</template>
</div>
</div>
</div>
<div
v-for="(item, index) in data.signs.CONFESS[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFESS[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.CONFESS[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<div
v-for="(item, index) in data.signs.CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFESS?.[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT_CONFESS">
<td colspan="10">
<div>接受交底人</div>
<div
v-for="(item, index) in data.signs.ACCEPT_CONFESS[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="
VITE_FILE_URL + data.signs.ACCEPT_CONFESS[0].SIGN_PATH[index]
"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.ACCEPT_CONFESS[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT_CONFESS">
<td colspan="10">
<div>接受交底人</div>
<div
v-for="(item, index) in data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="
VITE_FILE_URL +
data.signs.ACCEPT_CONFESS?.[0].SIGN_PATH[index]
"
alt=""
width="100"
height="100"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.GUARDIAN">
<td colspan="10">
<div>监护人</div>
<div
v-for="(item, index) in data.signs.GUARDIAN?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.GUARDIAN?.[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
class="mr-10 mt-10"
/>
<span>{{ data.signs.GUARDIAN?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFIRM">
<td colspan="10">
<div>作业负责人意见{{ data.signs.CONFIRM[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.CONFIRM[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFIRM[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.CONFIRM[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFIRM">
<td colspan="10">
<div>作业负责人意见{{ data.signs.CONFIRM?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFIRM?.[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFIRM?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.LEADER">
<td colspan="10">
<div>所在单位意见{{ data.signs.LEADER[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.LEADER[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.LEADER[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.LEADER[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.LEADER">
<td colspan="10">
<div>所在单位意见{{ data.signs.LEADER?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.LEADER?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.LEADER?.[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
class="mr-10 mt-10"
/>
<span>{{ data.signs.LEADER?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.AUDIT">
<td colspan="10">
<div>安全管理部门意见{{ data.signs.AUDIT[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.AUDIT[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.AUDIT[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.AUDIT[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.AUDIT">
<td colspan="10">
<div>安全管理部门意见{{ data.signs.AUDIT?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.AUDIT?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.AUDIT?.[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
class="mr-10 mt-10"
/>
<span>{{ data.signs.AUDIT?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.APPROVE">
<td colspan="10">
<div>动火审批人意见{{ data.signs.APPROVE[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.APPROVE[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.APPROVE[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.APPROVE[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.APPROVE">
<td colspan="10">
<div>动火审批人意见{{ data.signs.APPROVE?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.APPROVE?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.APPROVE?.[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
class="mr-10 mt-10"
/>
<span>{{ data.signs.APPROVE?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.MONITOR">
<td colspan="10">
<div>动火前在岗班长意见{{ data.signs.MONITOR[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.MONITOR[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.MONITOR[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.MONITOR[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.MONITOR">
<td colspan="10">
<div>动火前在岗班长意见{{ data.signs.MONITOR?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.MONITOR?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.MONITOR?.[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
class="mr-10 mt-10"
/>
<span>{{ data.signs.MONITOR?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT">
<td colspan="10">
<div>完工验收{{ data.signs.ACCEPT[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.ACCEPT[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.ACCEPT[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
/>
<span>{{ data.signs.ACCEPT[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
</table>
</layout-print-table-package>
<tr v-if="data.signs.ACCEPT">
<td colspan="10">
<div>完工验收{{ data.signs.ACCEPT?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.ACCEPT?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.ACCEPT?.[0].SIGN_PATH[index]"
alt=""
width="100"
height="100"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
</table>
</div>
<div v-if="entrance === 'archive'" class="mt-10 tc">
<el-button v-print="'#printContent'" type="primary"></el-button>
</div>
</layout-card>
</template>
<script setup>
import LayoutPrintTablePackage from "@/components/print_table_package/index.vue";
import { reactive } from "vue";
import { useRoute } from "vue-router";
import { getHotWorkView } from "@/request/eight_work.js";

View File

@ -1,96 +1,22 @@
<template>
<el-dialog v-model="visible" title="查看流程图" width="1500px">
<el-steps
:active="fnGetStatus()"
:process-status="fnGetProcessStatus()"
align-center
finish-status="success"
>
<el-step title="断路安全作业提交">
<template #description>
<div>{{ fnGetProcessMessage().title }}</div>
<div>{{ fnGetProcessMessage().USER_NAME }}</div>
<div>{{ fnGetProcessMessage().OPERATTIME }}</div>
</template>
</el-step>
<el-step title="作业负责人意见">
<template #description>
<div>{{ info.CONSTRUCTION_USER_NAME }}</div>
<div>{{ info.CONSTRUCTION_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="所在单位意见">
<template #description>
<div v-if="!info.PRODUCTION_USER_NAME">{{ "" }}</div>
<div v-else>{{ info.PRODUCTION_USER_NAME }}</div>
<div>{{ info.PRODUCTION_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="消防、安全管理部门意见">
<template #description>
<div v-if="!info.LEADER_USER_NAME">{{ "" }}</div>
<div v-else>{{ info.SAFETY_USER_NAME }}</div>
<div>{{ info.SAFETY_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="审批部门意见">
<template #description>
<div v-if="!info.LEADER_USER_NAME">{{ "" }}</div>
<div v-else>{{ info.LEADER_USER_NAME }}</div>
<div>{{ info.LEADER_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="完成验收">
<template #description>
<div>{{ info.ACCEPT_USER_NAME }}</div>
<div>{{ info.ACCEPT_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="验收归档">
<template #description>
<div>{{ info.ACCEPT_USER_NAME }}</div>
<div>{{ info.ACCEPT_USER_SIGNER_TIME }}</div>
</template>
</el-step>
</el-steps>
<div
style="
margin: 60px 60px 0 60px;
display: flex;
justify-content: space-between;
"
>
<div v-if="info.GUARDIAN_USER_SIGNER_TIME">
<div class="el-step__title is-success">
监护人{{ info.GUARDIAN_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.GUARDIAN_USER_SIGNER_TIME">
<div class="el-step__title is-error">
监护人{{ info.GUARDIAN_USER_NAME }}未签字
</div>
</div>
<div v-if="info.CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-success">
安全交底人{{ info.CONFESS_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-error">
安全交底人{{ info.CONFESS_USER_NAME }}未签字
</div>
</div>
<div v-if="info.ACCEPT_CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-success">
接受交底人{{ info.ACCEPT_CONFESS_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.ACCEPT_CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-error">
接受交底人{{ info.ACCEPT_CONFESS_USER_NAME }}未签字
</div>
</div>
</div>
<el-dialog v-model="visible" title="查看流程图" width="1500px">
<el-scrollbar style="height: 150px">
<el-steps align-center finish-status="success" style="width: 2000px">
<template v-for="(item, index) in flowList" :key="index">
<el-step :title="item.STEP_NAME" :status="fnGetStatus(item)">
<template #description>
<div>{{ fnGetShowStepUser(item) }}</div>
<div>{{ item.ACT_TIME }}</div>
</template>
</el-step>
</template>
</el-steps>
</el-scrollbar>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
</el-dialog>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
@ -106,7 +32,12 @@ const props = defineProps({
required: true,
default: false,
},
info: {
flowList: {
type: Object,
required: true,
default: () => {},
},
flowing: {
type: Object,
required: true,
default: () => {},
@ -114,57 +45,26 @@ const props = defineProps({
});
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);
const fnGetStatus = () => {
const result = {
1: 1,
2: 2,
3: 3,
4: 4,
5: 5,
6: 7,
};
return result[props.info.APPLY_STATUS] || 0;
const fnGetStatus = (step) => {
if (step.STATUS === 1) {
return "finish";
} else if (step.STATUS < 0) {
return "error";
} else if (step.CURRENT_STEP) {
return "process";
}
};
const fnGetProcessStatus = () => {
if (props.info.APPLY_STATUS < "0") return "error";
else return "process";
};
const fnGetProcessMessage = () => {
const info = props.info;
const result = {
"-2": {
title: "作业负责人审核打回",
USER_NAME: info.CONSTRUCTION_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-3": {
title: "所在单位审核打回",
USER_NAME: info.PRODUCTION_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-4": {
title: "消防、安全管理部门审核打回",
USER_NAME: info.SAFETY_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-5": {
title: "审批部门审核打回",
USER_NAME: info.LEADER_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-6": {
title: "验收打回",
USER_NAME: info.ACCEPT_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
};
return (
result[props.info.APPLY_STATUS] || {
title: "",
USER_NAME: info.APPLY_USER_NAME,
OPERATTIME: info.CREATTIME,
}
);
const fnGetShowStepUser = (step) => {
if (step.SIGN_USER) {
return step.SIGN_USER;
} else if (step.FINISHED_SIGN_USER) {
return step.FINISHED_SIGN_USER;
} else if (step.ACT_USER_NAME) {
return step.ACT_USER_NAME;
} else if (step.CAN_SKIP && !props.flowing[step.ACTOR_FIELD]) {
return "已跳过";
}
};
</script>

View File

@ -16,13 +16,13 @@
</el-form-item>
</el-col>
<el-col v-if="entrance === 'job_data'" :span="6">
<el-form-item label="状态" prop="APPLY_STATUS">
<el-select v-model="searchForm.APPLY_STATUS">
<el-form-item label="状态" prop="STEP_ID">
<el-select v-model="searchForm.STEP_ID">
<el-option
v-for="item in stateList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
v-for="item in stepList"
:key="item.STEP_ID"
:label="item.STEP_NAME"
:value="item.STEP_ID"
/>
</el-select>
</el-form-item>
@ -52,13 +52,13 @@
<el-table-column prop="CHECK_NO" label="编号" show-overflow-tooltip />
<el-table-column prop="APPLY_USER_NAME" label="填写人" />
<el-table-column
prop="CONSTRUCTION_USER_NAME"
prop="CONFIRM_USER_NAME"
label="作业负责人"
show-overflow-tooltip
/>
<el-table-column label="所在单位负责人" show-overflow-tooltip>
<template #default="{ row }">
{{ row.PRODUCTION_USER_NAME || " 已跳过" }}
{{ row.LEADER_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column
@ -67,12 +67,12 @@
width="200"
>
<template #default="{ row }">
{{ row.SAFETY_DEPARTMENT_NAME || " 已跳过" }}
{{ row.AUDIT_DEPARTMENT_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column label="审批部门负责人" show-overflow-tooltip>
<template #default="{ row }">
{{ row.LEADER_USER_NAME || " 已跳过" }}
{{ row.APPROVE_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column
@ -82,35 +82,53 @@
/>
<el-table-column label="审核状态">
<template #default="{ row }">
{{
entrance === "job_data"
? translationStatus(row.APPLY_STATUS, stateList)
: "已归档"
}}
<span v-if="row.STEP_ID === 0"></span>
<span v-else-if="row.STEP_ID !== -1">{{ row.NEXT_STEP_NAME }}</span>
<span v-else>{{ row.STEP_NAME }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="250">
<template #default="{ row }">
<el-button
v-if="entrance === 'job_data' && row.APPLY_STATUS !== '6'"
v-if="
entrance === 'job_data' &&
row.STATUS > -1 &&
row.NEXT_STEP_ID !== 99
"
type="primary"
text
link
@click="
router.push({
path: '/open_circuit/job_data/add_video',
query: { CUTROAD_ID: row.CUTROAD_ID, CHECK_NO: row.CHECK_NO },
query: {
CUTROAD_ID: row.CUTROAD_ID,
CHECK_NO: row.CHECK_NO,
},
})
"
>
添加监控
</el-button>
<el-button
v-if="
entrance === 'archive' &&
row.NEXT_STEP_ID === 99 &&
row.VIDEO_PATH
"
type="primary"
text
link
@click="fnPreviewVideo(row.VIDEO_PATH)"
>
查看验收视频
</el-button>
<el-button
v-if="entrance === 'job_data'"
type="primary"
text
link
@click="fnFlowChart(row)"
@click="fnFlowChart(row.CUTROAD_ID)"
>
流程图
</el-button>
@ -136,18 +154,29 @@
</layout-card>
<flow-chart
v-model:visible="data.flowChartDialog.visible"
:info="data.flowChartDialog.info"
:flow-list="data.flowChartDialog.flowList"
:flowing="data.flowChartDialog.flowing"
/>
<layout-video
v-model:visible="data.videoDialog.visible"
:src="data.videoDialog.src"
append-to-body
/>
</div>
</template>
<script setup>
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
import { serialNumber } from "@/assets/js/utils.js";
import { useRouter } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import { reactive, ref } from "vue";
import FlowChart from "./components/flow_chart.vue";
import { getOpenCircuitList } from "@/request/open_circuit.js";
import {
getOpenCircuitFlow,
getOpenCircuitList,
getTaskSetps,
} from "@/request/eight_work.js";
import LayoutVideo from "@/components/video/index.vue";
const props = defineProps({
entrance: {
@ -155,35 +184,42 @@ const props = defineProps({
default: "job_data",
},
});
const stateList = [
{ ID: "0", NAME: "断路安全作业待提交" },
{ ID: "1", NAME: "作业负责人待审核" },
{ ID: "2", NAME: "所在单位待审核" },
{ ID: "3", NAME: "消防、安全管理部门待审核" },
{ ID: "4", NAME: "审批部门待审核" },
{ ID: "5", NAME: "待验收" },
{ ID: "6", NAME: "验收归档" },
{ ID: "-2", NAME: "作业负责人审核打回" },
{ ID: "-3", NAME: "所在单位审核打回" },
{ ID: "-4", NAME: "消防、安全管理部门审核打回" },
{ ID: "-5", NAME: "审批部门审核打回" },
{ ID: "-6", NAME: "验收打回" },
];
const stepList = ref([]);
const getStepList = async () => {
const { list } = await getTaskSetps({ TASK_ID: 1 });
stepList.value = [
{ STEP_NAME: "请选择", STEP_ID: "" },
...list,
{ STEP_NAME: "验收归档", STEP_ID: "99" },
];
};
const fnPreviewVideo = (VIDEO_PATH) => {
data.videoDialog.visible = true;
data.videoDialog.src = VIDEO_PATH;
};
getStepList();
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getOpenCircuitList, {
otherParams: props.entrance === "archive" ? { APPLY_STATUS: "6" } : {},
otherParams: props.entrance === "archive" ? { STEP_ID: "99" } : {},
});
const data = reactive({
flowChartDialog: {
visible: false,
info: {},
flowList: {},
flowing: {},
},
videoDialog: {
visible: false,
src: "",
},
});
const fnFlowChart = (info) => {
const fnFlowChart = async (CUTROAD_ID) => {
const { flowList, flowingWork } = await getOpenCircuitFlow({ CUTROAD_ID });
data.flowChartDialog.visible = true;
data.flowChartDialog.info = info;
data.flowChartDialog.flowList = flowList;
data.flowChartDialog.flowing = flowingWork;
};
</script>
<style scoped></style>

View File

@ -1,354 +1,378 @@
<template>
<layout-print-table-package :print="entrance === 'archive'">
<table>
<thead>
<layout-card>
<div id="printContent">
<table class="archive_print_table">
<thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left"> 断路安全作业票 </el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
</td>
</tr>
</thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left"> 断路安全作业票 </el-divider>
<div class="tr">编号:{{ data.info.CHECK_NO }}</div>
<td class="title">申请单位</td>
<td>{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业单位</td>
<td>{{ data.info.CONFIRM_DEPARTMENT_NAME }}</td>
<td class="title">作业负责人</td>
<td>
<img
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</thead>
<tr>
<td class="title">申请单位</td>
<td>{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业单位</td>
<td>{{ data.info.CONSTRUCTION_DEPARTMENT_NAME }}</td>
<td class="title">作业负责人</td>
<td>{{ data.info.CONSTRUCTION_USER_NAME }}</td>
</tr>
<tr>
<td class="title">涉及相关单位部门</td>
<td colspan="3">{{ data.info.OTHER_DEPT }}</td>
<td class="title">监护人</td>
<td>
<div v-if="data.info.GUARDIAN_USER_SIGNER_PATH" class="tr">
<span>签字</span>
<tr>
<td class="title">涉及相关单位部门</td>
<td colspan="3">{{ data.info.OTHER_DEPT }}</td>
<td class="title">监护人</td>
<td>
<img
v-for="(item, index) in data.signs.GUARDIAN?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + data.info.GUARDIAN_USER_SIGNER_PATH"
:src="VITE_FILE_URL + item"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.GUARDIAN_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr>
<td class="title">断路原因</td>
<td colspan="5">{{ data.info.WORK_REASON }}</td>
</tr>
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="5">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td colspan="6">
<div>
断路地段示意图可另附图及相关说明{{ data.info.WORK_CONTENT }}
</div>
<div
style="
display: flex;
justify-content: space-between;
margin-top: 20px;
"
>
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONTENT_IMG_PATH"
alt=""
width="100"
height="100"
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
<tr>
<td class="title">断路原因</td>
<td colspan="5">{{ data.info.WORK_REASON }}</td>
</tr>
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="5">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td colspan="6">
<div>
编制人
<img
v-viewer
:src="VITE_FILE_URL + data.info.APPLY_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
{{ data.info.APPLY_USER_SIGNER_TIME }}
断路地段示意图可另附图及相关说明{{ data.info.WORK_CONTENT }}
</div>
</div>
</td>
</tr>
<tr>
<td class="title">风险辨识结果</td>
<td colspan="5">
{{ data.info.HAZARD_IDENTIFICATION?.split(";_;")[0] }}
</td>
</tr>
<tr>
<td class="title">作业实施时间</td>
<td colspan="5">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="6">
<table>
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>{{ item.PROTECTIVE_MEASURES }}</td>
<td>
<span v-if="item.STATUS === '1'">
<input type="radio" disabled checked />&nbsp;&nbsp;&nbsp;
</span>
<span v-if="item.STATUS === '-1'">
<input type="radio" disabled checked />不涉及
</span>
</td>
<td>
{{ item.CONFIRM_NAME }}
</td>
</tr>
<tr
v-if="
data.info.APPLY_USER_MEASURES ||
data.info.CONSTRUCTION_USER_MEASURES ||
data.info.PRODUCTION_USER_MEASURES ||
data.info.SAFETY_USER_MEASURES ||
data.info.LEADER_USER_MEASURES
<div
v-if="data.info.CONTENT_IMG_PATH"
style="
display: flex;
justify-content: space-between;
margin-top: 20px;
"
>
<td>{{ data.measuresList.length + 1 }}</td>
<td colspan="3">
<div
v-if="data.info.APPLY_USER_MEASURES"
style="display: flex; justify-content: space-between"
>
<span>其他安全措施{{ data.info.APPLY_USER_MEASURES }}</span>
<span>编制人{{ data.info.APPLY_USER_NAME }}</span>
</div>
<div
v-if="data.info.CONSTRUCTION_USER_MEASURES"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
>
<span>
其他安全措施{{ data.info.CONSTRUCTION_USER_MEASURES }}
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONTENT_IMG_PATH"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<div>
签字
<img
v-for="(item, index) in data.signs.PROJECT_MANAGER?.[0]
.SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{
data.signs.PROJECT_MANAGER?.[0].SIGN_TIME[index]
}}</span>
</div>
</div>
</td>
</tr>
<tr>
<td class="title">风险辨识结果</td>
<td colspan="5">{{ data.info.RISK_IDENTIFICATION }}</td>
</tr>
<tr>
<td class="title">作业实施时间</td>
<td colspan="5">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="11">
<table class="archive_print_table">
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>
{{ item.PROTECTIVE_MEASURES }}
<div v-if="item.IMG_PATH" class="mt-10">
<template
v-for="img in item.IMG_PATH.split(',')"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</template>
</div>
</td>
<td>
<span v-if="item.STATUS === '1'">
&nbsp;&nbsp;&nbsp;
</span>
<span>编制人{{ data.info.CONSTRUCTION_USER_NAME }}</span>
</div>
<div
v-if="
data.info.PRODUCTION_USER_ID &&
data.info.PRODUCTION_USER_MEASURES
"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
<span v-if="item.STATUS === '-1'"> </span>
</td>
<td>
<img
v-if="item.SIGN_PATH"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
<template v-if="data.signs.MEASURES_CONFIRM">
<tr
v-for="(item, index) in data.signs.MEASURES_CONFIRM"
:key="item.BUS_CUTROAD_MEASURES_ID"
>
<span>
其他安全措施{{ data.info.PRODUCTION_USER_MEASURES }}
</span>
<span>编制人{{ data.info.PRODUCTION_USER_NAME }}</span>
</div>
<div
v-if="
data.info.SAFETY_USER_ID && data.info.SAFETY_USER_MEASURES
"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
<td>{{ data.measuresList.length + 1 + index }}</td>
<td colspan="2">
<div style="display: flex; justify-content: space-between">
<span> 其他安全措施 {{ item.DESCR }} </span>
</div>
</td>
<td>
<img
v-if="item.SIGN_PATH?.[0]"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH?.[0]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</template>
</table>
</td>
</tr>
<tr v-if="data.signs.CONFESS">
<td colspan="10">
<div>
安全交底人
<div v-if="data.signs.CONFESS?.[0].IMG_PATH?.[0]">
<template
v-for="img in data.signs.CONFESS?.[0].IMG_PATH"
:key="img"
>
<span>
其他安全措施{{ data.info.SAFETY_USER_MEASURES }}
</span>
<span>编制人{{ data.info.SAFETY_USER_NAME }}</span>
</div>
<div
v-if="
data.info.LEADER_USER_ID && data.info.LEADER_USER_MEASURES
"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
>
<span>
其他安全措施{{ data.info.LEADER_USER_MEASURES }}
</span>
<span>编制人{{ data.info.LEADER_USER_NAME }}</span>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="title">安全交底人</td>
<td colspan="10">
<div v-if="data.info.CONFESS_USER_SIGNER_PATH" class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONFESS_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.CONFESS_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr>
<td class="title">接受交底人</td>
<td colspan="10">
<div
v-for="item in data.imgList"
:key="item.ACCEPT_CONFESS_ID"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + item.ACCEPT_CONFESS_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ item.ACCEPT_CONFESS_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.CONSTRUCTION_USER_SIGNER_PATH">
<td colspan="6">
<div>作业负责人意见{{ data.info.CONSTRUCTION_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONSTRUCTION_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.CONSTRUCTION_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.PRODUCTION_USER_SIGNER_PATH">
<td colspan="6">
<div>所在单位意见{{ data.info.PRODUCTION_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.PRODUCTION_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.PRODUCTION_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.SAFETY_USER_SIGNER_PATH">
<td colspan="6">
<div>消防安全管理部门意见{{ data.info.SAFETY_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.SAFETY_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.SAFETY_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.LEADER_USER_SIGNER_PATH">
<td colspan="6">
<div>审批部门意见{{ data.info.LEADER_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.LEADER_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.LEADER_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.imgList1.length > 0">
<td colspan="10">
<div>完工验收{{ data.info.ACCEPT_CONTENT }}</div>
<div
v-for="item in data.imgList1"
:key="item.ACCEPT_CONFESS_ID"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + item.ACCEPT_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ item.ACCEPT_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
</table>
</layout-print-table-package>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</template>
</div>
</div>
<div
v-for="(item, index) in data.signs.CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFESS?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT_CONFESS">
<td colspan="10">
<div>接受交底人</div>
<div
v-for="(item, index) in data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="
VITE_FILE_URL +
data.signs.ACCEPT_CONFESS?.[0].SIGN_PATH[index]
"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFIRM">
<td colspan="10">
<div>作业负责人意见{{ data.signs.CONFIRM?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFIRM?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFIRM?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.LEADER">
<td colspan="10">
<div>所在单位意见{{ data.signs.LEADER?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.LEADER?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.LEADER?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.LEADER?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.AUDIT">
<td colspan="10">
<div>消防安全管理部门意见{{ data.signs.AUDIT?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.AUDIT?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.AUDIT?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.AUDIT?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.APPROVE">
<td colspan="10">
<div>审批部门意见{{ data.signs.APPROVE?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.APPROVE?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.APPROVE?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.APPROVE?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT">
<td colspan="10">
<div>完工验收{{ data.signs.ACCEPT?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.ACCEPT?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.ACCEPT?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
</table>
</div>
<div v-if="entrance === 'archive'" class="mt-10 tc">
<el-button v-print="'#printContent'" type="primary"></el-button>
</div>
</layout-card>
</template>
<script setup>
import LayoutPrintTablePackage from "@/components/print_table_package/index.vue";
import { reactive } from "vue";
import { useRoute } from "vue-router";
import { getOpenCircuitView } from "@/request/open_circuit.js";
import { getOpenCircuitView } from "@/request/eight_work.js";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const route = useRoute();
const { CUTROAD_ID, entrance } = route.query;
const data = reactive({
info: {},
imgList: [],
imgList1: [],
measuresList: [],
signs: [],
});
const fnGetData = async () => {
const resData = await getOpenCircuitView({ CUTROAD_ID });
data.info = resData.pd;
data.measuresList = resData.measuresList;
data.imgList = resData.imgList;
data.imgList1 = resData.imgList1;
data.info.APPLY_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[0];
data.info.CONSTRUCTION_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[1];
data.info.PRODUCTION_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[2];
data.info.SAFETY_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[3];
data.info.LEADER_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[4];
data.signs = resData.signs;
};
fnGetData();
</script>

View File

@ -1,87 +1,17 @@
<template>
<el-dialog v-model="visible" title="查看流程图" width="1300px">
<el-steps
:active="fnGetStatus()"
:process-status="fnGetProcessStatus()"
align-center
finish-status="success"
>
<el-step title="临时用电作业提交">
<template #description>
<div>{{ fnGetProcessMessage().title }}</div>
<div>{{ fnGetProcessMessage().USER_NAME }}</div>
<div>{{ fnGetProcessMessage().OPERATTIME }}</div>
<el-dialog v-model="visible" title="查看流程图" width="1500px">
<el-scrollbar style="height: 150px">
<el-steps align-center finish-status="success" style="width: 2000px">
<template v-for="(item, index) in flowList" :key="index">
<el-step :title="item.STEP_NAME" :status="fnGetStatus(item)">
<template #description>
<div>{{ fnGetShowStepUser(item) }}</div>
<div>{{ item.ACT_TIME }}</div>
</template>
</el-step>
</template>
</el-step>
<el-step title="作业负责人意见">
<template #description>
<div>{{ info.CONFIRM_USER_NAME }}</div>
<div>{{ info.CONFIRM_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="用电单位意见">
<template #description>
<div>{{ info.AUDIT_USER_NAME }}</div>
<div>{{ info.AUDIT_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="配送电单位意见">
<template #description>
<div>{{ info.APPROVE_USER_NAME }}</div>
<div>{{ info.APPROVE_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="完成验收">
<template #description>
<div>{{ info.ACCEPT_USER_NAME }}</div>
<div>{{ info.ACCEPT_USER_SIGNER_TIME }}</div>
</template>
</el-step>
<el-step title="验收归档">
<template #description>
<div>{{ info.ACCEPT_USER_NAME }}</div>
<div>{{ info.ACCEPT_USER_SIGNER_TIME }}</div>
</template>
</el-step>
</el-steps>
<div
style="
margin: 60px 60px 0 60px;
display: flex;
justify-content: space-between;
"
>
<div v-if="info.GUARDIAN_USER_SIGNER_TIME">
<div class="el-step__title is-success">
监护人{{ info.GUARDIAN_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.GUARDIAN_USER_SIGNER_TIME">
<div class="el-step__title is-error">
监护人{{ info.GUARDIAN_USER_NAME }}未签字
</div>
</div>
<div v-if="info.CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-success">
安全交底人{{ info.CONFESS_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-error">
安全交底人{{ info.CONFESS_USER_NAME }}未签字
</div>
</div>
<div v-if="info.ACCEPT_CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-success">
接受交底人{{ info.ACCEPT_CONFESS_USER_NAME }}已签字
</div>
</div>
<div v-if="!info.ACCEPT_CONFESS_USER_SIGNER_TIME">
<div class="el-step__title is-error">
接受交底人{{ info.ACCEPT_CONFESS_USER_NAME }}未签字
</div>
</div>
</div>
</el-steps>
</el-scrollbar>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
@ -97,7 +27,12 @@ const props = defineProps({
required: true,
default: false,
},
info: {
flowList: {
type: Object,
required: true,
default: () => {},
},
flowing: {
type: Object,
required: true,
default: () => {},
@ -105,56 +40,27 @@ const props = defineProps({
});
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);
const fnGetStatus = () => {
const result = {
1: 1,
2: 2,
3: 3,
4: 4,
5: 6,
};
return result[props.info.APPLY_STATUS] || 0;
const fnGetStatus = (step) => {
if (step.STATUS === 1) {
return "finish";
} else if (step.STATUS < 0) {
return "error";
} else if (step.CURRENT_STEP) {
return "process";
}
};
const fnGetProcessStatus = () => {
if (props.info.APPLY_STATUS < "0") return "error";
else return "process";
};
const fnGetProcessMessage = () => {
const info = props.info;
const result = {
"-2": {
title: "作业负责人审核打回",
USER_NAME: info.CONFIRM_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-3": {
title: "用电单位审核打回",
USER_NAME: info.AUDIT_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-4": {
title: "配送电单位审核打回",
USER_NAME: info.APPROVE_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-5": {
title: "验收打回",
USER_NAME: info.ACCEPT_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-99": {
title: "已作废",
USER_NAME: "",
OPERATTIME: info.OPERATTIME,
},
};
return (
result[props.info.APPLY_STATUS] || {
title: "",
USER_NAME: info.APPLY_USER_NAME,
OPERATTIME: info.CREATTIME,
}
);
const fnGetShowStepUser = (step) => {
if (step.SIGN_USER) {
return step.SIGN_USER;
} else if (step.FINISHED_SIGN_USER) {
return step.FINISHED_SIGN_USER;
} else if (step.ACT_USER_NAME) {
return step.ACT_USER_NAME;
} else if (step.CAN_SKIP && !props.flowing[step.ACTOR_FIELD]) {
return "已跳过";
}
};
</script>

View File

@ -16,13 +16,13 @@
</el-form-item>
</el-col>
<el-col v-if="entrance === 'job_data'" :span="6">
<el-form-item label="状态" prop="APPLY_STATUS">
<el-select v-model="searchForm.APPLY_STATUS">
<el-form-item label="状态" prop="STEP_ID">
<el-select v-model="searchForm.STEP_ID">
<el-option
v-for="item in stateList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
v-for="item in stepList"
:key="item.STEP_ID"
:label="item.STEP_NAME"
:value="item.STEP_ID"
/>
</el-select>
</el-form-item>
@ -51,18 +51,21 @@
</el-table-column>
<el-table-column prop="CHECK_NO" label="编号" />
<el-table-column prop="APPLY_USER_NAME" label="申请人" />
<el-table-column prop="ANALYZE_USER_NAME" label="分析人" />
<el-table-column label="分析人">
<template #default="{ row }">
{{ row.ANALYZE_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column prop="CONFIRM_USER_NAME" label="作业单位负责人" />
<el-table-column prop="AUDIT_USER_NAME" label="用电单位负责人" />
<el-table-column prop="APPROVE_USER_NAME" label="配送电单位负责人" />
<el-table-column prop="ACCEPT_USER_NAME" label="验收部门负责人" />
<el-table-column label="审核状态">
<template #default="{ row }">
{{
entrance === "job_data"
? translationStatus(row.APPLY_STATUS, stateList)
: "已归档"
}}
<span v-if="row.STEP_ID === 0"></span>
<span v-else-if="row.STATUS === -2">气体检测打回</span>
<span v-else-if="row.STEP_ID !== -1">{{ row.NEXT_STEP_NAME }}</span>
<span v-else>{{ row.STEP_NAME }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="250">
@ -70,8 +73,8 @@
<el-button
v-if="
entrance === 'job_data' &&
row.APPLY_STATUS !== '5' &&
row.APPLY_STATUS !== '-99'
row.STATUS > -1 &&
row.NEXT_STEP_ID !== 99
"
type="primary"
text
@ -93,10 +96,23 @@
type="primary"
text
link
@click="fnFlowChart(row)"
@click="fnFlowChart(row.ELECTRICITY_ID)"
>
流程图
</el-button>
<el-button
v-if="
entrance === 'archive' &&
row.NEXT_STEP_ID === 99 &&
row.VIDEO_PATH
"
type="primary"
text
link
@click="fnPreviewVideo(row.VIDEO_PATH)"
>
查看验收视频
</el-button>
<el-button
type="primary"
text
@ -119,18 +135,29 @@
</layout-card>
<flow-chart
v-model:visible="data.flowChartDialog.visible"
:info="data.flowChartDialog.info"
:flow-list="data.flowChartDialog.flowList"
:flowing="data.flowChartDialog.flowing"
/>
<layout-video
v-model:visible="data.videoDialog.visible"
:src="data.videoDialog.src"
append-to-body
/>
</div>
</template>
<script setup>
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
import { serialNumber } from "@/assets/js/utils.js";
import { useRouter } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import { reactive, ref } from "vue";
import FlowChart from "./components/flow_chart.vue";
import { getTemporaryElectricityUsageList } from "@/request/temporary_electricity_usage.js";
import {
getTemporaryElectricityUsageFlow,
getTaskSetps,
getTemporaryElectricityUsageList,
} from "@/request/eight_work.js";
import LayoutVideo from "@/components/video/index.vue";
const props = defineProps({
entrance: {
@ -138,33 +165,47 @@ const props = defineProps({
default: "job_data",
},
});
const stateList = [
{ ID: "0", NAME: "临时用电作业待提交" },
{ ID: "1", NAME: "作业负责人待审核" },
{ ID: "2", NAME: "用电单位待审核" },
{ ID: "3", NAME: "配送电单位待审核" },
{ ID: "4", NAME: "待验收" },
{ ID: "5", NAME: "验收归档" },
{ ID: "-2", NAME: "作业负责人审核打回" },
{ ID: "-3", NAME: "用电单位审核打回" },
{ ID: "-4", NAME: "配送电单位审核打回" },
{ ID: "-5", NAME: "验收打回" },
{ ID: "-99", NAME: "已作废" },
];
const stepList = ref([]);
const getStepList = async () => {
const { list } = await getTaskSetps({ TASK_ID: 1 });
stepList.value = [
{ STEP_NAME: "请选择", STEP_ID: "" },
...list,
{ STEP_NAME: "验收归档", STEP_ID: "99" },
];
};
getStepList();
const fnPreviewVideo = (VIDEO_PATH) => {
data.videoDialog.visible = true;
data.videoDialog.src = VIDEO_PATH;
};
const router = useRouter();
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getTemporaryElectricityUsageList, {
otherParams: props.entrance === "archive" ? { APPLY_STATUS: "5" } : {},
otherParams: props.entrance === "archive" ? { STEP_ID: "99" } : {},
});
const data = reactive({
flowChartDialog: {
visible: false,
info: {},
flowList: {},
flowing: {},
},
videoDialog: {
visible: false,
src: "",
},
});
const fnFlowChart = (info) => {
const fnFlowChart = async (ELECTRICITY_ID) => {
const { flowList, flowingWork } = await getTemporaryElectricityUsageFlow({
ELECTRICITY_ID,
});
data.flowChartDialog.visible = true;
data.flowChartDialog.info = info;
data.flowChartDialog.flowList = flowList;
data.flowChartDialog.flowing = flowingWork;
};
</script>

View File

@ -1,300 +1,391 @@
<template>
<layout-print-table-package :print="entrance === 'archive'">
<table>
<thead>
<layout-card>
<div id="printContent">
<table class="archive_print_table">
<thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left">
临时用电作业许可证
</el-divider>
</td>
</tr>
</thead>
<tr>
<td colspan="10" style="border: none">
<el-divider content-position="left">
临时用电作业许可证
</el-divider>
<td class="title">申请单位</td>
<td colspan="2">{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业申请时间</td>
<td colspan="2">{{ data.info.CREATTIME }}</td>
</tr>
<tr>
<td class="title">作业地点</td>
<td colspan="2">{{ data.info.WORK_PLACE }}</td>
<td class="title">作业内容</td>
<td colspan="2">{{ data.info.WORK_CONTENT }}</td>
</tr>
<tr>
<td class="title">电源接入点及许可用电功率</td>
<td colspan="2">{{ data.info.ALLOW_POWER }}</td>
<td class="title">工作电压</td>
<td colspan="2">{{ data.info.WORK_VOLTAGE }}</td>
</tr>
<tr>
<td class="title">用电设备名称及额定功率</td>
<td>{{ data.info.RATED_POWER }}</td>
<td class="title">监护人</td>
<td>
<img
v-for="(item, index) in data.signs.GUARDIAN?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
<td class="title">用电人</td>
<td>
<img
v-for="(item, index) in data.signs.ELECTRICITY?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</thead>
<tr>
<td class="title">申请单位</td>
<td colspan="2">{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业申请时间</td>
<td colspan="2">{{ data.info.CREATTIME }}</td>
</tr>
<tr>
<td class="title">作业地点</td>
<td colspan="2">{{ data.info.WORK_PLACE }}</td>
<td class="title">作业内容</td>
<td colspan="2">{{ data.info.WORK_CONTENT }}</td>
</tr>
<tr>
<td class="title">电源接入点及许可用电功率</td>
<td colspan="2">{{ data.info.ALLOW_POWER }}</td>
<td class="title">工作电压</td>
<td colspan="2">{{ data.info.WORK_VOLTAGE }}</td>
</tr>
<tr>
<td class="title">用电设备名称及额定功率</td>
<td>{{ data.info.RATED_POWER }}</td>
<td class="title">监护人</td>
<td>
<div v-if="data.info.GUARDIAN_USER_SIGNER_PATH" class="tr">
<span>签字</span>
<tr>
<td class="title">作业人</td>
<td colspan="2">
<img
v-for="(item, index) in data.signs.WORK_USER?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + data.info.GUARDIAN_USER_SIGNER_PATH"
:src="VITE_FILE_URL + item"
alt=""
width="100"
height="100"
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.info.GUARDIAN_USER_SIGNER_TIME }}</span>
</div>
</td>
<td class="title">用电人</td>
<td>{{ data.info.ELECTRICITY_USER }}</td>
</tr>
<tr>
<td class="title">作业人</td>
<td colspan="2">{{ data.info.WORK_USER }}</td>
<td class="title">电工证号</td>
<td colspan="2">{{ data.info.CARD_NO }}</td>
</tr>
<tr>
<td class="title">作业负责人</td>
<td colspan="2">{{ data.info.CONFIRM_USER_NAME }}</td>
<td class="title">电工证号</td>
<td colspan="2">{{ data.info.LEADER_CARD_NO }}</td>
</tr>
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="5">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td class="title">风险辨识结果</td>
<td colspan="5">{{ data.info.RISK_IDENTIFICATION }}</td>
</tr>
<tr>
<td class="title" colspan="6">
可燃气体分析运行的生产装置罐区和具有火灾爆炸危险场所
</td>
</tr>
<template v-for="(item, index) in data.gasList" :key="index">
<tr>
<td class="title">分析时间</td>
<td colspan="2">{{ item.ANALYZE_TIME }}</td>
<td class="title">分析点</td>
<td colspan="2">{{ item.ANALYZE_PLACE }}</td>
</td>
<td class="title">电工证号</td>
<td colspan="2">{{ data.info.CARD_NO }}</td>
</tr>
<tr>
<td class="title">可燃气体检测结果</td>
<td colspan="2">{{ item.ANALYZE_RESULT }}</td>
<td class="title">分析人</td>
<td colspan="2">{{ item.ANALYZE_USER }}</td>
<td class="title">作业负责人</td>
<td colspan="2">
<img
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_PATH"
:key="index"
v-viewer
:src="VITE_FILE_URL + item"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
<td class="title">电工证号</td>
<td colspan="2">{{ data.info.LEADER_CARD_NO }}</td>
</tr>
</template>
<tr>
<td class="title">作业实施时间</td>
<td colspan="5">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="6">
<table>
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>{{ item.PROTECTIVE_MEASURES }}</td>
<td>
<span v-if="item.STATUS === '1'">
<input type="radio" disabled checked />&nbsp;&nbsp;&nbsp;
</span>
<span v-if="item.STATUS === '-1'">
<input type="radio" disabled checked />不涉及
</span>
</td>
<td>
{{ item.CONFIRM_NAME }}
</td>
</tr>
<tr
v-if="
data.info.CONFIRM_USER_MEASURES ||
data.info.AUDIT_USER_MEASURES ||
data.info.APPROVE_USER_MEASURES
"
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="5">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td class="title">风险辨识结果</td>
<td colspan="5">{{ data.info.RISK_IDENTIFICATION }}</td>
</tr>
<tr>
<td class="title" colspan="6">
可燃气体分析运行的生产装置罐区和具有火灾爆炸危险场所
</td>
</tr>
<template v-for="(item, index) in data.gasList" :key="index">
<tr>
<td class="title">分析时间</td>
<td colspan="2">{{ item.ANALYZE_TIME }}</td>
<td class="title">分析点</td>
<td colspan="2">{{ item.ANALYZE_PLACE }}</td>
</tr>
<tr>
<td class="title">可燃气体检测结果</td>
<td colspan="2">{{ item.ANALYZE_RESULT }}</td>
<td class="title">分析人</td>
<td colspan="2">
<img
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</template>
<tr>
<td class="title">作业实施时间</td>
<td colspan="5">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="11">
<table class="archive_print_table">
<tr>
<td style="width: 80px">序号</td>
<td>安全措施</td>
<td style="width: 100px">是否涉及</td>
<td style="width: 100px">确认人</td>
</tr>
<tr v-for="(item, index) in data.measuresList" :key="index">
<td>{{ index + 1 }}</td>
<td>
{{ item.PROTECTIVE_MEASURES }}
<div v-if="item.IMG_PATH" class="mt-10">
<template
v-for="img in item.IMG_PATH.split(',')"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</template>
</div>
</td>
<td>
<span v-if="item.STATUS === '1'">
&nbsp;&nbsp;&nbsp;
</span>
<span v-if="item.STATUS === '-1'"> </span>
</td>
<td>
<img
v-if="item.SIGN_PATH"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
<template v-if="data.signs.MEASURES_CONFIRM">
<tr
v-for="(item, index) in data.signs.MEASURES_CONFIRM"
:key="item.BUS_ELECTRICITY_MEASURES_ID"
>
<td>{{ data.measuresList.length + 1 + index }}</td>
<td colspan="2">
<div style="display: flex; justify-content: space-between">
<span> 其他安全措施 {{ item.DESCR }} </span>
</div>
</td>
<td>
<img
v-if="item.SIGN_PATH?.[0]"
v-viewer
:src="VITE_FILE_URL + item.SIGN_PATH?.[0]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</td>
</tr>
</template>
</table>
</td>
</tr>
<tr v-if="data.signs.CONFESS">
<td colspan="11">
<div>
安全交底人
<div v-if="data.signs.CONFESS?.[0].IMG_PATH?.[0]">
<template
v-for="img in data.signs.CONFESS?.[0].IMG_PATH"
:key="img"
>
<img
v-viewer
:src="VITE_FILE_URL + img"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
</template>
</div>
</div>
<div
v-for="(item, index) in data.signs.CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<td>{{ data.measuresList.length + 1 }}</td>
<td colspan="3">
<div
v-if="data.info.CONFIRM_USER_MEASURES"
style="display: flex; justify-content: space-between"
>
<span>
其他安全措施{{ data.info.CONFIRM_USER_MEASURES }}
</span>
<span>编制人{{ data.info.CONFIRM_USER_NAME }}</span>
</div>
<div
v-if="data.info.AUDIT_USER_MEASURES"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
>
<span>其他安全措施{{ data.info.AUDIT_USER_MEASURES }}</span>
<span>编制人{{ data.info.AUDIT_USER_NAME }}</span>
</div>
<div
v-if="data.info.APPROVE_USER_MEASURES"
style="
display: flex;
justify-content: space-between;
margin-top: 10px;
"
>
<span>
其他安全措施{{ data.info.APPROVE_USER_MEASURES }}
</span>
<span>编制人{{ data.info.APPROVE_USER_NAME }}</span>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="title">安全交底人</td>
<td colspan="10">
<div v-if="data.info.CONFESS_USER_SIGNER_PATH" class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONFESS_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.CONFESS_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr>
<td class="title">接受交底人</td>
<td colspan="10">
<div
v-for="item in data.imgList"
:key="item.ACCEPT_CONFESS_ID"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + item.ACCEPT_CONFESS_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ item.ACCEPT_CONFESS_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.CONFIRM_USER_SIGNER_TIME">
<td colspan="6">
<div>作业负责人意见{{ data.info.CONFIRM_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.CONFIRM_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.CONFIRM_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.AUDIT_USER_SIGNER_TIME">
<td colspan="6">
<div>用电单位意见{{ data.info.AUDIT_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.AUDIT_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.AUDIT_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.info.APPROVE_USER_SIGNER_TIME">
<td colspan="6">
<div>配送电单位意见{{ data.info.APPROVE_CONTENT }}</div>
<div class="tr">
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.info.APPROVE_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ data.info.APPROVE_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
<tr v-if="data.imgList1.length > 0">
<td colspan="10">
<div>完工验收{{ data.info.ACCEPT_CONTENT }}</div>
<div
v-for="item in data.imgList1"
:key="item.ACCEPT_CONFESS_ID"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + item.ACCEPT_USER_SIGNER_PATH"
alt=""
width="100"
height="100"
/>
<span>{{ item.ACCEPT_USER_SIGNER_TIME }}</span>
</div>
</td>
</tr>
</table>
</layout-print-table-package>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFESS?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT_CONFESS">
<td colspan="11">
<div>接受交底人</div>
<div
v-for="(item, index) in data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="
VITE_FILE_URL +
data.signs.ACCEPT_CONFESS?.[0].SIGN_PATH[index]
"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT_CONFESS?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.CONFIRM">
<td colspan="11">
<div>作业负责人意见{{ data.signs.CONFIRM?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.CONFIRM?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.CONFIRM?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.CONFIRM?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.AUDIT">
<td colspan="11">
<div>用电单位意见{{ data.signs.AUDIT?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.AUDIT?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.AUDIT?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.AUDIT?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.APPROVE">
<td colspan="11">
<div>配送电单位意见{{ data.signs.APPROVE?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.APPROVE?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.APPROVE?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.APPROVE?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
<tr v-if="data.signs.ACCEPT">
<td colspan="11">
<div>完工验收{{ data.signs.ACCEPT?.[0].DESCR }}</div>
<div
v-for="(item, index) in data.signs.ACCEPT?.[0].SIGN_TIME"
:key="index"
class="tr"
>
<span>签字</span>
<img
v-viewer
:src="VITE_FILE_URL + data.signs.ACCEPT?.[0].SIGN_PATH[index]"
alt=""
width="20"
height="20"
class="mr-10 mt-10"
/>
<span>{{ data.signs.ACCEPT?.[0].SIGN_TIME[index] }}</span>
</div>
</td>
</tr>
</table>
</div>
<div v-if="entrance === 'archive'" class="mt-10 tc">
<el-button v-print="'#printContent'" type="primary"></el-button>
</div>
</layout-card>
</template>
<script setup>
import LayoutPrintTablePackage from "@/components/print_table_package/index.vue";
import { reactive } from "vue";
import { useRoute } from "vue-router";
import { getTemporaryElectricityUsageView } from "@/request/temporary_electricity_usage.js";
import { getTemporaryElectricityUsageView } from "@/request/eight_work.js";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const route = useRoute();
const { ELECTRICITY_ID, entrance } = route.query;
const data = reactive({
info: {},
imgList: [],
imgList1: [],
measuresList: [],
gasList: [],
gas: {},
measuresList: [],
signs: [],
});
const fnGetData = async () => {
const resData = await getTemporaryElectricityUsageView({ ELECTRICITY_ID });
data.info = resData.pd;
data.imgList = resData.imgList;
data.imgList1 = resData.imgList1;
data.measuresList = resData.measuresList;
data.gasList = resData.gasList;
data.gas = resData.gas || {};
data.signs = resData.signs;
};
fnGetData();
</script>