pull/1/head
z 2024-01-05 14:32:49 +08:00
parent 0180e34d6e
commit 474c5ee580
54 changed files with 5079 additions and 153 deletions

1
.env
View File

@ -1,4 +1,5 @@
VITE_BASE_URL=http://192.168.0.17:8001/
VITE_PROXY=/api
VITE_FILE_URL=https://file.zcloudchina.com/YTHFile
VITE_TEMPLATE_URL='https://qaaq.qhdsafety.com/file/'

View File

@ -10,10 +10,10 @@
"lint": "eslint --ext .js,.vue --fix src .prettierrc.cjs"
},
"dependencies": {
"@element-plus/icons-vue": "^2.1.0",
"@element-plus/icons-vue": "^2.3.1",
"@icon-park/vue-next": "^1.4.2",
"@vueuse/core": "^9.13.0",
"@vueuse/integrations": "^10.7.0",
"@vueuse/integrations": "^10.7.1",
"animate.css": "^4.1.1",
"axios": "^1.6.3",
"dayjs": "^1.11.10",
@ -22,39 +22,39 @@
"mitt": "^3.0.1",
"normalize.css": "^8.0.1",
"pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^3.2.0",
"pinia-plugin-persistedstate": "^3.2.1",
"qrcode": "^1.5.3",
"qs": "^6.11.2",
"throttle-debounce": "^5.0.0",
"v-viewer": "^3.0.11",
"vue": "^3.3.13",
"vue": "^3.4.3",
"vue-router": "^4.2.5",
"vue3-print-nb": "^0.1.4",
"vue3-puzzle-vcode": "^1.0.16"
"vue3-puzzle-vcode": "^1.1.5"
},
"devDependencies": {
"@our-patches/postcss-px-to-viewport": "^1.2.0",
"@types/node": "^18.18.4",
"@vitejs/plugin-basic-ssl": "^1.0.1",
"@vitejs/plugin-vue": "^4.4.0",
"@types/node": "^18.19.4",
"@vitejs/plugin-basic-ssl": "^1.0.2",
"@vitejs/plugin-vue": "^4.6.2",
"@vue/eslint-config-prettier": "^7.1.0",
"autoprefixer": "^10.4.16",
"eslint": "^8.51.0",
"eslint": "^8.56.0",
"eslint-config-prettier": "^8.10.0",
"eslint-config-standard": "^17.1.0",
"eslint-plugin-import": "^2.28.1",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-n": "^15.7.0",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-vue": "^9.17.0",
"eslint-plugin-vue": "^9.19.2",
"prettier": "^2.8.8",
"sass": "^1.69.0",
"unplugin-auto-import": "^0.12.2",
"unplugin-vue-components": "^0.22.12",
"vite": "^4.4.11",
"vite": "^4.5.1",
"vite-plugin-enhance-log": "^0.5.2",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-remove-console": "^2.1.1",
"vue-eslint-parser": "^9.3.1"
"vite-plugin-remove-console": "^2.2.0",
"vue-eslint-parser": "^9.3.2"
}
}

View File

@ -10,7 +10,10 @@ import asyncRouter from "@/assets/js/asyncRouter";
import { getAsyncRouter } from "@/request/api";
// import { getRouteTreeAll } from "@/request/system_management.js";
const modules = import.meta.glob("./views/**/*.vue"); // 获取到views下所有的vue文件
const modules = import.meta.glob([
"./views/**/*.vue",
"!./views/**/components/*.vue",
]); // 获取到views下所有的vue文件
let storageRouter = null; // 用来获取后台拿到的路由
router.beforeEach(async (to, from, next) => {

View File

@ -380,6 +380,12 @@
color: var(--el-text-color-regular) !important;
}
.el-step__title{
font-size: 14px !important;;
.el-step__title {
font-size: 14px !important;
}
.el-step__description {
* {
font-size: 12px !important;
}
}

View File

@ -75,4 +75,249 @@ export default [
},
],
},
{
path: "/confined_space",
redirect: "/confined_space/job_data",
meta: { title: "受限空间作业管理", model: MODEL["3"] },
component: "children",
children: [
{
path: "/confined_space/job_data",
meta: { title: "受限空间作业数据", isSubMenu: false },
component: "children",
children: [
{ path: "", component: "confined_space/job_data/index" },
{
path: "/confined_space/job_data/view",
meta: {
title: "审批表详情",
activeMenu: "/confined_space/job_data",
},
component: "confined_space/job_data/view",
},
],
},
{
path: "/confined_space/ledger",
meta: { title: "受限空间台账", isSubMenu: false },
component: "confined_space/ledger/index",
},
{
path: "/confined_space/archive",
meta: { title: "归档管理", isSubMenu: false },
component: "children",
children: [
{ path: "", component: "confined_space/archive/index" },
{
path: "/confined_space/archive/view",
meta: {
title: "审批表详情",
activeMenu: "/confined_space/archive",
},
component: "confined_space/archive/view",
},
],
},
],
},
{
path: "/blind_plate_plugging",
redirect: "/blind_plate_plugging/job_data",
meta: { title: "盲板抽堵作业管理", model: MODEL["3"] },
component: "children",
children: [
{
path: "/blind_plate_plugging/job_data",
meta: { title: "盲板抽堵作业数据", isSubMenu: false },
component: "children",
children: [
{ path: "", component: "blind_plate_plugging/job_data/index" },
{
path: "/blind_plate_plugging/job_data/view",
meta: {
title: "审批表详情",
activeMenu: "/blind_plate_plugging/job_data",
},
component: "blind_plate_plugging/job_data/view",
},
],
},
{
path: "/blind_plate_plugging/archive",
meta: { title: "归档管理", isSubMenu: false },
component: "children",
children: [
{ path: "", component: "blind_plate_plugging/archive/index" },
{
path: "/blind_plate_plugging/archive/view",
meta: {
title: "审批表详情",
activeMenu: "/blind_plate_plugging/archive",
},
component: "blind_plate_plugging/archive/view",
},
],
},
],
},
{
path: "/groundbreaking",
redirect: "/groundbreaking/job_data",
meta: { title: "动土作业管理", model: MODEL["3"] },
component: "children",
children: [
{
path: "/groundbreaking/job_data",
meta: { title: "动土作业数据", isSubMenu: false },
component: "children",
children: [
{ path: "", component: "groundbreaking/job_data/index" },
{
path: "/groundbreaking/job_data/view",
meta: {
title: "审批表详情",
activeMenu: "/groundbreaking/job_data",
},
component: "groundbreaking/job_data/view",
},
],
},
{
path: "/groundbreaking/archive",
meta: { title: "归档管理", isSubMenu: false },
component: "children",
children: [
{ path: "", component: "groundbreaking/archive/index" },
{
path: "/groundbreaking/archive/view",
meta: {
title: "审批表详情",
activeMenu: "/groundbreaking/archive",
},
component: "groundbreaking/archive/view",
},
],
},
],
},
{
path: "/high",
redirect: "/high/job_data",
meta: { title: "高处作业管理", model: MODEL["3"] },
component: "children",
children: [
{
path: "/high/job_data",
meta: { title: "高处作业数据", isSubMenu: false },
component: "children",
children: [
{ path: "", component: "high/job_data/index" },
{
path: "/high/job_data/view",
meta: {
title: "审批表详情",
activeMenu: "/high/job_data",
},
component: "high/job_data/view",
},
],
},
{
path: "/high/archive",
meta: { title: "归档管理", isSubMenu: false },
component: "children",
children: [
{ path: "", component: "high/archive/index" },
{
path: "/high/archive/view",
meta: {
title: "审批表详情",
activeMenu: "/high/archive",
},
component: "high/archive/view",
},
],
},
],
},
{
path: "/hoisting",
redirect: "/hoisting/job_data",
meta: { title: "吊装作业管理", model: MODEL["3"] },
component: "children",
children: [
{
path: "/hoisting/job_data",
meta: { title: "吊装作业数据", isSubMenu: false },
component: "children",
children: [
{ path: "", component: "hoisting/job_data/index" },
{
path: "/hoisting/job_data/view",
meta: {
title: "审批表详情",
activeMenu: "/hoisting/job_data",
},
component: "hoisting/job_data/view",
},
],
},
{
path: "/hoisting/archive",
meta: { title: "归档管理", isSubMenu: false },
component: "children",
children: [
{ path: "", component: "hoisting/archive/index" },
{
path: "/hoisting/archive/view",
meta: {
title: "审批表详情",
activeMenu: "/hoisting/archive",
},
component: "hoisting/archive/view",
},
],
},
],
},
{
path: "/open_circuit",
redirect: "/open_circuit/job_data",
meta: { title: "断路作业管理", model: MODEL["3"] },
component: "children",
children: [
{
path: "/open_circuit/job_data",
meta: { title: "断路作业数据", isSubMenu: false },
component: "children",
children: [
{ path: "", component: "open_circuit/job_data/index" },
{
path: "/open_circuit/job_data/view",
meta: {
title: "审批表详情",
activeMenu: "/open_circuit/job_data",
},
component: "open_circuit/job_data/view",
},
],
},
{
path: "/open_circuit/archive",
meta: { title: "归档管理", isSubMenu: false },
component: "children",
children: [
{ path: "", component: "open_circuit/archive/index" },
{
path: "/open_circuit/archive/view",
meta: {
title: "审批表详情",
activeMenu: "/open_circuit/archive",
},
component: "open_circuit/archive/view",
},
],
},
],
},
];

View File

@ -53,6 +53,20 @@ export const layoutFnGetTrainingPlateType = async () => {
});
return ref(JSON.parse(resData.zTreeNodes));
};
// 受限空间类型
export const layoutFnGetTypeOfConfinedSpace = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "dad23a464729485ba364994942db83cc",
});
return ref(resData.list);
};
// 风险等级
export const layoutFnGetRiskLevel = async () => {
const resData = await getLevels({
DICTIONARIES_ID: "a178357ce6ce4d6a9ac95def6aca3a14",
});
return ref(resData.list);
};
// 无法确定DICTIONARIES_ID的数据字典
export const layoutFnGetLevels = async (DICTIONARIES_ID) => {
const resData = await getLevels({ DICTIONARIES_ID });

View File

@ -1,39 +0,0 @@
import { ref } from "vue";
const buttonRef = ref(null);
const THEAD_HEIGHT = 81.59;
const A4_HEIGHT_MM = 297;
const A4_HEIGHT_MM_TO_PX_PROPORTION = 3.78;
let A4_HEIGHT_PX = A4_HEIGHT_MM * A4_HEIGHT_MM_TO_PX_PROPORTION - THEAD_HEIGHT;
let elements = [];
const printObj = {
id: "printContent",
closeCallback() {
document.querySelector("#printContent").style.overflow = "hidden";
},
};
const fnPrint = () => {
document.querySelector("#printContent").style.overflow = "visible";
elements = document.querySelectorAll("#printContent > table > tr");
if (!document.querySelector("#printContent > table thead")) {
A4_HEIGHT_PX = A4_HEIGHT_PX + THEAD_HEIGHT;
}
fnIsPaging();
buttonRef.value.$el.click();
};
const fnIsPaging = (index = 0) => {
for (let i = index; i < elements.length; i++) {
if (
elements[i].offsetHeight +
elements[i].offsetTop -
elements[index].offsetTop >=
A4_HEIGHT_PX
) {
elements[i - 1].setAttribute("class", "page_break");
fnIsPaging(i === index ? i + 1 : i);
break;
}
}
};
export { fnPrint, printObj, buttonRef };

View File

@ -1,9 +1,9 @@
import { post } from "@/request/axios";
// 按钮权限
export const useButtonJurisdiction = async (type) => {
export default async function useButtonJurisdiction(type) {
const keys = `${type}:add,${type}:del,${type}:edit,toExcel`;
const resData = await post("/api/head/hasButton", {
const resData = await post("/head/hasButton", {
loading: false,
keys,
});
@ -13,4 +13,4 @@ export const useButtonJurisdiction = async (type) => {
edit: resData[`${type}fhadminedit`],
excel: resData.toExcel,
};
};
}

View File

@ -13,6 +13,8 @@ import { getDataType } from "@/assets/js/utils.js";
export default function useListData(api, options = {}) {
if (getDataType(api) !== "Function") throw new Error("api必须是一个函数");
if (getDataType(options) !== "Object")
throw new Error("options必须是一个对象");
if (options.immediate && getDataType(options.immediate) !== "Boolean")
throw new Error("options.immediate必须是一个布尔值");
if (options.usePagination && getDataType(options.usePagination) !== "Boolean")

41
src/assets/js/usePrint.js Normal file
View File

@ -0,0 +1,41 @@
import { ref } from "vue";
export default function usePrint(THEAD_HEIGHT = 81.59) {
const buttonRef = ref(null);
const A4_HEIGHT_MM = 297;
const A4_HEIGHT_MM_TO_PX_PROPORTION = 3.78;
let A4_HEIGHT_PX =
A4_HEIGHT_MM * A4_HEIGHT_MM_TO_PX_PROPORTION - THEAD_HEIGHT;
let elements = [];
const printObj = {
id: "printContent",
closeCallback() {
document.querySelector("#printContent").style.overflow = "hidden";
},
};
const fnPrint = () => {
document.querySelector("#printContent").style.overflow = "visible";
elements = document.querySelectorAll("#printContent > table > tr");
if (!document.querySelector("#printContent > table thead")) {
A4_HEIGHT_PX = A4_HEIGHT_PX + THEAD_HEIGHT;
}
fnIsPaging();
buttonRef.value.$el.click();
};
const fnIsPaging = (index = 0) => {
for (let i = index; i < elements.length; i++) {
if (
elements[i].offsetHeight +
elements[i].offsetTop -
elements[index].offsetTop >=
A4_HEIGHT_PX
) {
elements[i - 1].setAttribute("style", "page-break-after: always;");
fnIsPaging(i === index ? i + 1 : i);
break;
}
}
};
return { fnPrint, printObj, buttonRef };
}

View File

@ -0,0 +1,71 @@
<template>
<layout-card>
<div
v-for="print in 2"
:key="print"
:id="print === 2 ? 'printContent' : ''"
>
<slot></slot>
</div>
<div class="tc mt-10" v-if="entrance === 'archive'">
<el-button
type="primary"
v-print="printObj"
v-show="false"
ref="buttonRef"
>
打印
</el-button>
<el-button type="primary" @click="fnPrint"></el-button>
</div>
</layout-card>
</template>
<script setup>
import LayoutCard from "@/components/card/index.vue";
import { useRoute } from "vue-router";
import usePrint from "@/assets/js/usePrint.js";
const { fnPrint, printObj, buttonRef } = usePrint();
defineOptions({
name: "LayoutPrintTablePackage",
});
const route = useRoute();
const { entrance } = route.query;
</script>
<style lang="scss" scoped>
#printContent {
width: 210mm;
margin: auto;
height: 0;
overflow: hidden;
position: relative;
top: 200px;
}
@media print {
#printContent {
top: 0;
}
}
:deep {
table {
border-collapse: collapse;
width: 100%;
td {
border: 1px solid var(--el-border-color);
padding: 8px 12px;
font-size: 14px;
}
.title {
background: var(--el-fill-color-light);
width: 200px;
text-align: center;
}
}
}
</style>

View File

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

View File

@ -0,0 +1,12 @@
import { post, upload } from "@/request/axios.js";
export const getConfinedSpaceList = (params) =>
post("/confinedspace/list", params); // 受限空间作业管理列表
export const getConfinedSpaceView = (params) =>
post("/confinedspace/goEdit", params); // 受限空间作业管理查看
export const getLedgerList = (params) => post("/limitspace/list", params); // 台账列表
export const setLedgerImport = (params) =>
upload("/limitspace/readExcel2", params); // 台账导入
export const setLedgerAdd = (params) => post("/limitspace/add", params); // 台账添加
export const setLedgerEdit = (params) => post("/limitspace/edit", params); // 台账修改
export const setLedgerDelete = (params) => post("/limitspace/delete", params); // 台账删除

View File

@ -24,3 +24,9 @@ export const getLearningTrainType = (params) =>
loading: false,
...params,
});
// 获取用户
export const getUserListAllByCorp = (params) =>
post("/user/listUserByCorp", {
loading: false,
...params,
});

View File

@ -0,0 +1,6 @@
import { post } from "@/request/axios.js";
export const getGroundbreakingList = (params) =>
post("/breakground/list", params); // 动土作业管理列表
export const getGroundbreakingView = (params) =>
post("/breakground/goEdit", params); // 动土作业管理查看

4
src/request/high.js Normal file
View File

@ -0,0 +1,4 @@
import { post } from "@/request/axios.js";
export const getHighList = (params) => post("/highwork/list", params); // 高处作业管理列表
export const getHighView = (params) => post("/highwork/goEdit", params); // 高处作业管理查看

4
src/request/hoisting.js Normal file
View File

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

View File

@ -0,0 +1,4 @@
import { post } from "@/request/axios.js";
export const getOpenCircuitList = (params) => post("/cutroad/list", params); // 断路作业管理列表
export const getOpenCircuitView = (params) => post("/cutroad/goEdit", params); // 断路作业管理查看

View File

@ -0,0 +1,9 @@
<template>
<index-view entrance="archive" />
</template>
<script setup>
import IndexView from "../job_data/index.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,9 @@
<template>
<view-info />
</template>
<script setup>
import ViewInfo from "../job_data/view.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,144 @@
<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>
</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>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
info: {
type: Object,
required: true,
default: () => {},
},
});
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 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,
}
);
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,169 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="50px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-form-item
label="设备管道名称/编号"
prop="KEYWORDS"
label-width="130px"
>
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入关键字"
/>
</el-form-item>
</el-col>
<el-col :span="6" v-if="entrance === 'job_data'">
<el-form-item label="状态" prop="APPLY_STATUS">
<el-select v-model="searchForm.APPLY_STATUS">
<el-option
v-for="item in stateList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
v-model:pagination="pagination"
@get-data="fnGetData"
>
<el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column
prop="NAME"
label="设备管道名称"
show-overflow-tooltip
/>
<el-table-column prop="CHECK_NO" label="编号" show-overflow-tooltip />
<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"
label="作业负责人"
show-overflow-tooltip
/>
<el-table-column
prop="LEADER_USER_NAME"
label="所在单位负责人"
show-overflow-tooltip
/>
<el-table-column
prop="ACCEPT_USER_NAME"
label="验收部门负责人"
show-overflow-tooltip
/>
<el-table-column label="审核状态">
<template v-slot="{ row }">
{{
entrance === "job_data"
? translationStatus(row.APPLY_STATUS, stateList)
: "已归档"
}}
</template>
</el-table-column>
<el-table-column label="操作" width="150">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="fnFlowChart(row)"
v-if="entrance === 'job_data'"
>
流程图
</el-button>
<el-button
type="primary"
text
link
@click="
router.push({
path:
props.entrance === 'job_data'
? '/blind_plate_plugging/job_data/view'
: '/blind_plate_plugging/archive/view',
query: { BLINDBOARD_ID: row.BLINDBOARD_ID, entrance },
})
"
>
审批表详情
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
<flow-chart
v-model:visible="data.flowChartDialog.visible"
:info="data.flowChartDialog.info"
/>
</div>
</template>
<script setup>
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
import { useRouter } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import FlowChart from "./components/flow_chart.vue";
import { getBlindPlatePluggingList } from "@/request/blind_plate_plugging.js";
const props = defineProps({
entrance: {
type: String,
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 router = useRouter();
const listData = useListData(getBlindPlatePluggingList, {
otherParams: {
APPLY_STATUS: props.entrance === "archive" ? "6" : "",
},
});
const { list, pagination, searchForm, fnGetData, fnResetPagination } = listData;
const data = reactive({
flowChartDialog: {
visible: false,
info: {},
},
});
const fnFlowChart = (info) => {
data.flowChartDialog.visible = true;
data.flowChartDialog.info = info;
};
</script>
<style scoped></style>

View File

@ -0,0 +1,322 @@
<template>
<layout-print-table-package>
<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 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
"
>
<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 }}
</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>
其他安全措施{{ 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>
</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";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const route = useRoute();
const { BLINDBOARD_ID } = route.query;
const data = reactive({
info: {},
imgList: [],
imgList1: [],
boardList: [],
measuresList: [],
});
const fnGetData = async () => {
const resData = await getBlindPlatePluggingView({ 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];
};
fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,9 @@
<template>
<index-view entrance="archive" />
</template>
<script setup>
import IndexView from "../job_data/index.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,9 @@
<template>
<view-info />
</template>
<script setup>
import ViewInfo from "../job_data/view.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,154 @@
<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>
</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.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>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
info: {
type: Object,
required: true,
default: () => {},
},
});
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 fnGetProcessStatus = () => {
if (props.info.APPLY_STATUS < "0") return "error";
else return "process";
};
const fnGetProcessMessage = () => {
const info = props.info;
const result = {
"-4": {
title: "作业负责人审核打回",
USER_NAME: info.CONFIRM_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-5": {
title: "所在单位审核打回",
USER_NAME: info.APPROVE_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-6": {
title: "验收打回",
AUSER_NAME: info.ACCEPT_USER_NAME,
OPERATTIME: info.OPERATTIME,
},
"-99": {
title: "已作废(监护人未签字)",
AUSER_NAME: "",
OPERATTIME: info.OPERATTIME,
},
"-98": {
title: "已作废(未进行气体检测)",
AUSER_NAME: "",
OPERATTIME: info.OPERATTIME,
},
};
return (
result[props.info.APPLY_STATUS] || {
title: "",
USER_NAME: info.APPLY_USER_NAME,
OPERATTIME: info.CREATTIME,
}
);
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,150 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="50px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-form-item label="编号" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入关键字"
/>
</el-form-item>
</el-col>
<el-col :span="6" v-if="entrance === 'job_data'">
<el-form-item label="状态" prop="APPLY_STATUS">
<el-select v-model="searchForm.APPLY_STATUS">
<el-option
v-for="item in stateList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
v-model:pagination="pagination"
@get-data="fnGetData"
>
<el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</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 prop="CONFIRM_USER_NAME" label="作业负责人" />
<el-table-column prop="APPROVE_USER_NAME" label="所在单位负责人" />
<el-table-column prop="ACCEPT_USER_NAME" label="验收部门负责人" />
<el-table-column label="审核状态">
<template v-slot="{ row }">
{{
entrance === "job_data"
? translationStatus(row.APPLY_STATUS, stateList)
: "已归档"
}}
</template>
</el-table-column>
<el-table-column label="操作" width="150">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="fnFlowChart(row)"
v-if="entrance === 'job_data'"
>
流程图
</el-button>
<el-button
type="primary"
text
link
@click="
router.push({
path:
props.entrance === 'job_data'
? '/confined_space/job_data/view'
: '/confined_space/archive/view',
query: { CONFINEDSPACE_ID: row.CONFINEDSPACE_ID, entrance },
})
"
>
审批表详情
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
<flow-chart
v-model:visible="data.flowChartDialog.visible"
:info="data.flowChartDialog.info"
/>
</div>
</template>
<script setup>
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
import { useRouter } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import { getConfinedSpaceList } from "@/request/confined_space.js";
import { reactive } from "vue";
import FlowChart from "./components/flow_chart.vue";
const props = defineProps({
entrance: {
type: String,
default: "job_data",
},
});
const stateList = [
{ ID: "0", NAME: "受限空间作业待提交" },
{ ID: "1", NAME: "作业负责人待审核" },
{ ID: "4", NAME: "所在单位待审核" },
{ ID: "5", NAME: "待验收" },
{ ID: "6", NAME: "验收归档" },
{ ID: "-4", NAME: "作业负责人审核打回" },
{ ID: "-5", NAME: "所在单位审核打回" },
{ ID: "-6", NAME: "验收打回" },
{ ID: "-99", NAME: "已作废(监护人未签字)" },
{ ID: "-98", NAME: "已作废(未进行气体检测)" },
];
const router = useRouter();
const listData = useListData(getConfinedSpaceList, {
otherParams: {
APPLY_STATUS: props.entrance === "archive" ? "6" : "",
},
});
const { list, pagination, searchForm, fnGetData, fnResetPagination } = listData;
const data = reactive({
flowChartDialog: {
visible: false,
info: {},
},
});
const fnFlowChart = (info) => {
data.flowChartDialog.visible = true;
data.flowChartDialog.info = info;
};
</script>
<style scoped></style>

View File

@ -0,0 +1,318 @@
<template>
<layout-print-table-package>
<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 class="title">作业申请单位</td>
<td colspan="5">{{ data.info.APPLY_DEPARTMENT_NAME }}</td>
<td class="title">作业申请时间</td>
<td colspan="3">{{ data.info.CREATTIME }}</td>
</tr>
<tr>
<td class="title">受限空间名称</td>
<td colspan="5">{{ data.info.LIMITSPACE_NAME }}</td>
<td class="title">受限空间内原有介质名称</td>
<td colspan="3">{{ data.info.MEDIUM_NAME }}</td>
</tr>
<tr>
<td class="title">作业内容</td>
<td colspan="9">{{ 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="3">{{ data.info.CONFIRM_USER_NAME }}</td>
</tr>
<tr>
<td class="title">作业人</td>
<td colspan="5">{{ data.info.WORK_USER }}</td>
<td class="title">监护人</td>
<td colspan="5">
<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>
</tr>
<tr>
<td class="title">关联的其他特殊作业及安全作业票编号</td>
<td colspan="9">{{ data.info.SPECIAL_WORK }}</td>
</tr>
<tr>
<td class="title">风险辨识结果</td>
<td colspan="9">{{ 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>
</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_PLACE }}</td>
<td>{{ item.ANALYZE_USER }}</td>
</tr>
<tr>
<td class="title">作业实施时间</td>
<td colspan="9">
{{ data.info.WORK_START_DATE }}{{ data.info.WORK_END_DATE }}
</td>
</tr>
<tr>
<td colspan="10">
<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.CONFIRM_USER_MEASURES ||
data.info.APPROVE_USER_MEASURES
"
>
<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.APPROVE_USER_MEASURES"
style="display: flex; justify-content: space-between"
>
<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_PATH">
<td colspan="10">
<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.APPROVE_USER_SIGNER_PATH">
<td colspan="10">
<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>
</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";
import { getConfinedSpaceView } from "@/request/confined_space.js";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const route = useRoute();
const { CONFINEDSPACE_ID } = route.query;
const data = reactive({
info: {},
gasList: [],
gas: {},
measuresList: [],
imgList: [],
imgList1: [],
});
const fnGetData = async () => {
const resData = await getConfinedSpaceView({ CONFINEDSPACE_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.gasList = resData.gasList;
data.gas = resData.gas || {};
data.info.CONFIRM_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[0];
data.info.APPROVE_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[1];
};
fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,191 @@
<template>
<el-dialog
v-model="visible"
:title="type === 'edit' ? '修改' : '新增'"
:before-close="fnClose"
>
<el-form ref="formRef" :rules="rules" :model="form" label-width="150px">
<el-row>
<el-col :span="24">
<el-form-item label="受限空间名称" prop="NAME">
<el-input v-model="form.NAME" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="受限空间编号" prop="NUMBER">
<el-input v-model="form.NUMBER" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="受限空间类型" prop="LIMITSPACETYPE">
<el-select v-model="form.LIMITSPACETYPE">
<el-option
v-for="item in typeOfConfinedSpaceList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="位置及范围" prop="POSITIONSCOPE">
<el-input v-model="form.POSITIONSCOPE" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="主要危险及有害因素" prop="PRIMARYHAZARD">
<el-input v-model="form.PRIMARYHAZARD" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="风险等级" prop="RISKGRADE">
<el-select v-model="form.RISKGRADE">
<el-option
v-for="item in riskLevelList"
:key="item.BIANMA"
:label="item.NAME"
:value="item.BIANMA"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="最多作业人数" prop="MAXPERSON">
<el-input v-model="form.MAXPERSON" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="应急指导书" prop="HASINSTRUCTOR">
<el-radio-group v-model="form.HASINSTRUCTOR">
<el-radio :label="'1'"></el-radio>
<el-radio :label="'0'"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="DESCR">
<el-input v-model="form.DESCR" type="textarea" autosize />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="填报人" prop="INFORMANT">
<el-select v-model="form.INFORMANT">
<el-option
v-for="item in userList"
:key="item.USER_ID"
:label="item.USERNAME"
:value="item.USER_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="主要负责人" prop="PRINCIPAL">
<el-select v-model="form.PRINCIPAL">
<el-option
v-for="item in userList"
:key="item.USER_ID"
:label="item.USERNAME"
:value="item.USER_ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="填报时间" prop="COMPILETIME">
<el-date-picker
v-model="form.COMPILETIME"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"> </el-button>
</template>
</el-dialog>
</template>
<script setup>
import { ref } from "vue";
import { useVModels } from "@vueuse/core";
import {
layoutFnGetRiskLevel,
layoutFnGetTypeOfConfinedSpace,
} from "@/assets/js/data_dictionary.js";
import { getUserListAllByCorp } from "@/request/data_dictionary.js";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { setLedgerAdd, setLedgerEdit } from "@/request/confined_space.js";
import { ElMessage } from "element-plus";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
type: {
type: String,
required: true,
default: "",
},
form: {
type: Object,
required: true,
default: () => ({}),
},
});
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form } = useVModels(props, emits);
const rules = {
NUMBER: [{ required: true, message: "请输入受限空间编号", trigger: "blur" }],
NAME: [{ required: true, message: "请输入受限空间名称", trigger: "blur" }],
LIMITSPACETYPE: [
{ required: true, message: "请选择受限空间类型", trigger: "blur" },
],
POSITIONSCOPE: [
{ required: true, message: "请输入位置及范围", trigger: "blur" },
],
PRIMARYHAZARD: [
{ required: true, message: "请输入主要危险及有害因素", trigger: "blur" },
],
RISKGRADE: [{ required: true, message: "请选择风险等级", trigger: "blur" }],
MAXPERSON: [
{ required: true, message: "请输入最多作业人数", trigger: "blur" },
],
HASINSTRUCTOR: [
{ required: true, message: "请输入应急指导书", trigger: "blur" },
],
INFORMANT: [{ required: true, message: "请选择填报人", trigger: "blur" }],
PRINCIPAL: [{ required: true, message: "请选择主要负责人", trigger: "blur" }],
COMPILETIME: [{ required: true, message: "请选择填报时间", trigger: "blur" }],
};
const formRef = ref(null);
const typeOfConfinedSpaceList = await layoutFnGetTypeOfConfinedSpace();
const riskLevelList = await layoutFnGetRiskLevel();
const { userList } = await getUserListAllByCorp();
const fnClose = () => {
formRef.value.resetFields();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
if (props.type === "add") await setLedgerAdd({ ...form.value });
if (props.type === "edit") await setLedgerEdit({ ...form.value });
fnClose();
ElMessage.success("保存成功");
emits("get-data");
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,68 @@
<template>
<el-dialog v-model="visible" title="导入" :before-close="fnClose">
<el-form ref="formRef" :model="data.form" :rules="rules" label-width="80px">
<el-form-item label="附件" prop="file">
<layout-upload v-model:file-list="data.form.file" accept=".xls" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="fnExportTemplates"></el-button>
<el-button type="primary" @click="fnSubmit"></el-button>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</template>
<script setup>
import LayoutUpload from "@/components/upload/index.vue";
import { useVModel } from "@vueuse/core";
import { ElMessage, ElMessageBox } from "element-plus";
import { reactive, ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { setLedgerImport } from "@/request/confined_space.js";
const VITE_TEMPLATE_URL = import.meta.env.VITE_TEMPLATE_URL;
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
});
const emits = defineEmits(["update:visible", "get-data"]);
const visible = useVModel(props, "visible", emits);
const rules = {
file: [{ required: true, message: "附件不能为空", trigger: "change" }],
};
const formRef = ref(null);
const data = reactive({
form: {
file: [],
},
});
const fnExportTemplates = async () => {
await ElMessageBox.confirm("确定要下载excel模板吗", { type: "warning" });
window.open(`${VITE_TEMPLATE_URL}/template/limitSpace.xls`);
};
const fnClose = () => {
formRef.value.resetFields();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef, "请上传附件");
const formData = new FormData();
formData.append("FFILE", data.form.file[0].raw);
formData.append("FFILEName", data.form.file[0].name);
const resData = await setLedgerImport(formData);
ElMessage.success(resData.msg);
fnClose();
emits("get-data");
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,153 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="130px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-form-item label="受限空间编号/名称" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label-width="10px" class="end">
<el-button @click="data.importDialogVisible = true">
导入
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
@get-data="fnGetData"
v-model:pagination="pagination"
>
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="NUMBER" label="受限空间编号" />
<el-table-column prop="NAME" label="受限空间名称" />
<el-table-column prop="LIMITSPACETYPENAME" label="受限空间类型" />
<el-table-column prop="RISKGRADENAME" label="风险等级" />
<el-table-column prop="INFORMANTNAME" label="填报人" />
<el-table-column prop="PRINCIPALNAME" label="主要负责人" />
<el-table-column prop="COMPILETIME" label="填报时间" />
<el-table-column label="操作" width="100">
<template v-slot="{ row }">
<el-button
v-if="buttonJurisdiction.edit"
type="primary"
text
link
@click="fnAddOrEdit(row, 'edit')"
>
修改
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="primary"
text
link
@click="fnDelete(row.LIMITSPACE_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
v-if="buttonJurisdiction.add"
type="primary"
@click="fnAddOrEdit({}, 'add')"
>
新增
</el-button>
</template>
</layout-table>
</layout-card>
<import-file
v-model:visible="data.importDialogVisible"
@get-data="fnResetPagination"
/>
<add
v-model:visible="data.addOrEditDialog.visible"
v-model:form="data.addOrEditDialog.form"
:type="data.addOrEditDialog.type"
@get-data="fnResetPagination"
/>
</div>
</template>
<script setup>
import { nextTick, reactive } from "vue";
import LayoutTable from "@/components/table/index";
import { serialNumber } from "@/assets/js/utils";
import LayoutCard from "@/components/card/index.vue";
import { getLedgerList, setLedgerDelete } from "@/request/confined_space.js";
import { ElMessage, ElMessageBox } from "element-plus";
import { debounce } from "throttle-debounce";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import { cloneDeep } from "lodash-es";
import useListData from "@/assets/js/useListData.js";
import ImportFile from "./components/import_file.vue";
import Add from "./components/add.vue";
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getLedgerList);
const data = reactive({
importDialogVisible: false,
addOrEditDialog: {
visible: false,
type: "",
form: {
NUMBER: "",
NAME: "",
LIMITSPACETYPE: "",
POSITIONSCOPE: "",
PRIMARYHAZARD: "",
RISKGRADE: "",
MAXPERSON: "",
HASINSTRUCTOR: "1",
INFORMANT: "",
PRINCIPAL: "",
COMPILETIME: "",
DESCR: "",
},
},
});
const buttonJurisdiction = await useButtonJurisdiction("limitspace");
const fnAddOrEdit = async (row, type) => {
data.addOrEditDialog.visible = true;
await nextTick();
data.addOrEditDialog.type = type;
if (type === "edit") data.addOrEditDialog.form = cloneDeep(row);
};
const fnDelete = debounce(
1000,
async (LIMITSPACE_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setLedgerDelete({ LIMITSPACE_ID });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -2,7 +2,7 @@
<layout-card>
<el-form
ref="formRef"
:rules="data.rules"
:rules="rules"
:model="data.form"
label-width="110px"
>
@ -57,6 +57,14 @@ import useFormValidate from "@/assets/js/useFormValidate.js";
const router = useRouter();
const route = useRoute();
const { QUALIFICATIONS_ID } = route.query;
const rules = {
NAME: [{ required: true, message: "名称不能为空", trigger: "blur" }],
VALIDITYTIME: [
{ required: true, message: "证书有效期不能为空", trigger: "blur" },
],
NUMBER: [{ required: true, message: "证书编号不能为空", trigger: "blur" }],
file: [{ required: true, message: "证书图片不能为空", trigger: "blur" }],
};
const formRef = ref(null);
const data = reactive({
form: {
@ -67,14 +75,6 @@ const data = reactive({
file: [],
verifyFileUrl: "12",
},
rules: {
NAME: [{ required: true, message: "名称不能为空", trigger: "blur" }],
VALIDITYTIME: [
{ required: true, message: "证书有效期不能为空", trigger: "blur" },
],
NUMBER: [{ required: true, message: "证书编号不能为空", trigger: "blur" }],
file: [{ required: true, message: "证书图片不能为空", trigger: "blur" }],
},
});
const fnGetData = async () => {
if (!QUALIFICATIONS_ID) return;

View File

@ -2,21 +2,21 @@
<layout-card>
<el-descriptions :column="2" border>
<el-descriptions-item label="证书名称">
{{ data.info.NAME }}
{{ info.NAME }}
</el-descriptions-item>
<el-descriptions-item label="证书有效期">
{{ data.info.VALIDITYTIME }}
{{ info.VALIDITYTIME }}
</el-descriptions-item>
<el-descriptions-item label="证书编号">
{{ data.info.NUMBER }}
{{ info.NUMBER }}
</el-descriptions-item>
<el-descriptions-item label="备注">
{{ data.info.DESCR }}
{{ info.DESCR }}
</el-descriptions-item>
<el-descriptions-item label="证书图片">
<img
v-viewer
v-for="item in data.info.file"
v-for="item in info.file"
:key="item.FILEPATH"
:src="item.url"
width="100"
@ -31,19 +31,17 @@
<script setup>
import LayoutCard from "@/components/card/index.vue";
import { getIndustryQualificationsView } from "@/request/enterprise_management.js";
import { reactive } from "vue";
import { ref } from "vue";
import { useRoute } from "vue-router";
import { addingPrefixToFile } from "@/assets/js/utils.js";
const route = useRoute();
const { QUALIFICATIONS_ID } = route.query;
const data = reactive({
info: {},
});
const info = ref({});
const fnGetData = async () => {
const resData = await getIndustryQualificationsView({ QUALIFICATIONS_ID });
data.info = resData.pd;
data.info.file = addingPrefixToFile(resData.hImgs);
info.value = resData.pd;
info.value.file = addingPrefixToFile(resData.hImgs);
};
fnGetData();
</script>

View File

@ -4,7 +4,7 @@
<el-form
ref="formRef"
:model="data.form"
:rules="data.rules"
:rules="rules"
label-width="210px"
>
<el-row>
@ -486,6 +486,77 @@ const formRef = ref(null);
const territoryCascaderRef = ref(null);
const industryCascaderRef = ref(null);
const economicTypeCascaderRef = ref(null);
const rules = {
CORP_NAME: [{ required: true, message: "企业名称不能为空", trigger: "blur" }],
CODE: [
{ required: true, message: "统一社会信用代码不能为空", trigger: "blur" },
{
pattern: /^[^_IOZSVa-z\W]{2}\d{6}[^_IOZSVa-z\W]{10}$/,
message: "请输入正确的统一社会信用代码",
},
],
POSSESSION: [{ required: true, message: "属地不能为空", trigger: "blur" }],
INDUSTRYALL: [
{ required: true, message: "所属行业不能为空", trigger: "blur" },
],
ECO_TYPEALL: [
{ required: true, message: "经济类型不能为空", trigger: "blur" },
],
ADDRESS_BUSINESS: [
{
required: true,
message: "企事业单位经营地址不能为空",
trigger: "blur",
},
],
CORP_STATE: [
{ required: true, message: "企业状态不能为空", trigger: "blur" },
],
LONGITUDE: [{ required: true, message: "经度不能为空", trigger: "blur" }],
LATITUDE: [{ required: true, message: "纬度不能为空", trigger: "blur" }],
CONTACTS: [
{ required: true, message: "主要负责人不能为空", trigger: "blur" },
],
CONTACTS_PHONE: [
{ required: true, message: "主要负责人电话不能为空", trigger: "blur" },
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
TRAINTYPE: [
{ required: true, message: "培训行业类型不能为空", trigger: "blur" },
],
bus_images: [
{ required: true, message: "营业执照不能为空", trigger: "blur" },
],
LR_MOBILE: [
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
SAFETY_PHONE: [
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
SAFETY_NUMBER: [
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
};
const data = reactive({
form: {
CORP_NAME: "",
@ -537,79 +608,6 @@ const data = reactive({
WHETHER_LIQUIDAMMONIA: "",
WHETHER_PIPELINE: "",
},
rules: {
CORP_NAME: [
{ required: true, message: "企业名称不能为空", trigger: "blur" },
],
CODE: [
{ required: true, message: "统一社会信用代码不能为空", trigger: "blur" },
{
pattern: /^[^_IOZSVa-z\W]{2}\d{6}[^_IOZSVa-z\W]{10}$/,
message: "请输入正确的统一社会信用代码",
},
],
POSSESSION: [{ required: true, message: "属地不能为空", trigger: "blur" }],
INDUSTRYALL: [
{ required: true, message: "所属行业不能为空", trigger: "blur" },
],
ECO_TYPEALL: [
{ required: true, message: "经济类型不能为空", trigger: "blur" },
],
ADDRESS_BUSINESS: [
{
required: true,
message: "企事业单位经营地址不能为空",
trigger: "blur",
},
],
CORP_STATE: [
{ required: true, message: "企业状态不能为空", trigger: "blur" },
],
LONGITUDE: [{ required: true, message: "经度不能为空", trigger: "blur" }],
LATITUDE: [{ required: true, message: "纬度不能为空", trigger: "blur" }],
CONTACTS: [
{ required: true, message: "主要负责人不能为空", trigger: "blur" },
],
CONTACTS_PHONE: [
{ required: true, message: "主要负责人电话不能为空", trigger: "blur" },
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
TRAINTYPE: [
{ required: true, message: "培训行业类型不能为空", trigger: "blur" },
],
bus_images: [
{ required: true, message: "营业执照不能为空", trigger: "blur" },
],
LR_MOBILE: [
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
SAFETY_PHONE: [
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
SAFETY_NUMBER: [
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
},
mapDialog: {
visible: false,
loading: true,

View File

@ -0,0 +1,9 @@
<template>
<index-view entrance="archive" />
</template>
<script setup>
import IndexView from "../job_data/index.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,9 @@
<template>
<view-info />
</template>
<script setup>
import ViewInfo from "../job_data/view.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,171 @@
<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.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>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
info: {
type: Object,
required: true,
default: () => {},
},
});
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 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,
}
);
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,175 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="50px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-form-item label="编号" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入关键字"
/>
</el-form-item>
</el-col>
<el-col :span="6" v-if="entrance === 'job_data'">
<el-form-item label="状态" prop="APPLY_STATUS">
<el-select v-model="searchForm.APPLY_STATUS">
<el-option
v-for="item in stateList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
v-model:pagination="pagination"
@get-data="fnGetData"
>
<el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ serialNumber(pagination, $index) }}
</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"
label="作业负责人"
show-overflow-tooltip
/>
<el-table-column label="所在单位负责人" show-overflow-tooltip>
<template v-slot="{ row }">
{{ row.PRODUCTION_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column label="有关部门负责人" show-overflow-tooltip>
<template v-slot="{ row }">
{{ row.SAFETY_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column label="审批部门负责人" show-overflow-tooltip>
<template v-slot="{ row }">
{{ row.LEADER_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column
prop="ACCEPT_USER_NAME"
label="验收部门负责人"
show-overflow-tooltip
/>
<el-table-column label="审核状态">
<template v-slot="{ row }">
{{
entrance === "job_data"
? translationStatus(row.APPLY_STATUS, stateList)
: "已归档"
}}
</template>
</el-table-column>
<el-table-column label="操作" width="150">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="fnFlowChart(row)"
v-if="entrance === 'job_data'"
>
流程图
</el-button>
<el-button
type="primary"
text
link
@click="
router.push({
path:
props.entrance === 'job_data'
? '/groundbreaking/job_data/view'
: '/groundbreaking/archive/view',
query: { BREAKGROUND_ID: row.BREAKGROUND_ID, entrance },
})
"
>
审批表详情
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
<flow-chart
v-model:visible="data.flowChartDialog.visible"
:info="data.flowChartDialog.info"
/>
</div>
</template>
<script setup>
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
import { useRouter } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import FlowChart from "./components/flow_chart.vue";
import { getGroundbreakingList } from "@/request/groundbreaking.js";
const props = defineProps({
entrance: {
type: String,
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 router = useRouter();
const listData = useListData(getGroundbreakingList, {
otherParams: {
APPLY_STATUS: props.entrance === "archive" ? "6" : "",
},
});
const { list, pagination, searchForm, fnGetData, fnResetPagination } = listData;
const data = reactive({
flowChartDialog: {
visible: false,
info: {},
},
});
const fnFlowChart = (info) => {
data.flowChartDialog.visible = true;
data.flowChartDialog.info = info;
};
</script>
<style scoped></style>

View File

@ -0,0 +1,364 @@
<template>
<layout-print-table-package>
<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 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"
/>
<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 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
"
>
<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 }}
</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>
其他安全措施{{ 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;
"
>
<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>
</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";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const route = useRoute();
const { BREAKGROUND_ID } = route.query;
const data = reactive({
info: {},
imgList: [],
imgList1: [],
measuresList: [],
});
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];
};
fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,9 @@
<template>
<index-view entrance="archive" />
</template>
<script setup>
import IndexView from "../job_data/index.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,9 @@
<template>
<view-info />
</template>
<script setup>
import ViewInfo from "../job_data/view.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,171 @@
<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.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 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>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
info: {
type: Object,
required: true,
default: () => {},
},
});
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 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.LEADER_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,
}
);
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,173 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="50px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-form-item label="编号" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入关键字"
/>
</el-form-item>
</el-col>
<el-col :span="6" v-if="entrance === 'job_data'">
<el-form-item label="状态" prop="APPLY_STATUS">
<el-select v-model="searchForm.APPLY_STATUS">
<el-option
v-for="item in stateList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
v-model:pagination="pagination"
@get-data="fnGetData"
>
<el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="CHECK_NO" label="编号" show-overflow-tooltip />
<el-table-column prop="APPLY_USER" label="填写人" />
<el-table-column
prop="CONSTRUCTION_USER_NAME"
label="作业负责人"
show-overflow-tooltip
/>
<el-table-column label="所在单位负责人" show-overflow-tooltip>
<template v-slot="{ row }">
{{ row.LEADER_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column label="审核部门负责人" show-overflow-tooltip>
<template v-slot="{ row }">
{{ row.AUDIT_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column label="审批部门负责人" show-overflow-tooltip>
<template v-slot="{ row }">
{{ row.APPROVE_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column
prop="ACCEPT_USER_NAME"
label="验收部门负责人"
show-overflow-tooltip
/>
<el-table-column label="审核状态">
<template v-slot="{ row }">
{{
entrance === "job_data"
? translationStatus(row.APPLY_STATUS, stateList)
: "已归档"
}}
</template>
</el-table-column>
<el-table-column label="操作" width="150">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="fnFlowChart(row)"
v-if="entrance === 'job_data'"
>
流程图
</el-button>
<el-button
type="primary"
text
link
@click="
router.push({
path:
props.entrance === 'job_data'
? '/high/job_data/view'
: '/high/archive/view',
query: { HIGHWORK_ID: row.HIGHWORK_ID, entrance },
})
"
>
审批表详情
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
<flow-chart
v-model:visible="data.flowChartDialog.visible"
:info="data.flowChartDialog.info"
/>
</div>
</template>
<script setup>
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
import { useRouter } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import FlowChart from "./components/flow_chart.vue";
import { getHighList } from "@/request/high.js";
const props = defineProps({
entrance: {
type: String,
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 router = useRouter();
const listData = useListData(getHighList, {
otherParams: {
APPLY_STATUS: props.entrance === "archive" ? "6" : "",
},
});
const { list, pagination, searchForm, fnGetData, fnResetPagination } = listData;
const data = reactive({
flowChartDialog: {
visible: false,
info: {},
},
});
const fnFlowChart = (info) => {
data.flowChartDialog.visible = true;
data.flowChartDialog.info = info;
};
</script>
<style scoped></style>

View File

@ -0,0 +1,325 @@
<template>
<layout-print-table-package>
<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 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.CONSTRUCTION_DEPARTMENT_NAME }}</td>
<td class="title">监护人</td>
<td>
<div
v-if="data.info.GUARDIAN_USER_SIGNER_PATH"
style="text-align: right"
>
<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 class="title">作业人</td>
<td>{{ data.info.PROJECT_MANAGER }}</td>
<td class="title">作业负责人</td>
<td>{{ data.info.CONSTRUCTION_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.HAZARD_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 }}</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.LEADER_USER_MEASURES ||
data.info.AUDIT_USER_MEASURES ||
data.info.APPROVE_USER_MEASURES
"
>
<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.CONSTRUCTION_USER_NAME }}</span>
</div>
<div
v-if="
data.info.LEADER_USER_ID && data.info.CONFIRM_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>
<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_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"
style="text-align: right"
>
<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"
style="text-align: right"
>
<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="4">
<div>作业负责人意见{{ data.info.CONSTRUCTION_CONTENT }}</div>
<div style="text-align: right">
<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="4">
<div>所在单位意见{{ data.info.LEADER_CONTENT }}</div>
<div style="text-align: right">
<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.AUDIT_USER_SIGNER_PATH">
<td colspan="4">
<div>审核部门意见{{ data.info.AUDIT_CONTENT }}</div>
<div style="text-align: right">
<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="4">
<div>审批部门意见{{ data.info.APPROVE_CONTENT }}</div>
<div style="text-align: right">
<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"
style="text-align: right"
>
<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>
</template>
<script setup>
import LayoutPrintTablePackage from "@/components/print_table_package/index.vue";
import { reactive } from "vue";
import { useRoute } from "vue-router";
import { getHighView } from "@/request/high.js";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const route = useRoute();
const { HIGHWORK_ID } = route.query;
const data = reactive({
info: {},
imgList: [],
imgList1: [],
measuresList: [],
});
const fnGetData = async () => {
const resData = await getHighView({ HIGHWORK_ID });
data.info = resData.pd;
data.imgList = resData.imgList;
data.imgList1 = resData.imgList1;
data.measuresList = resData.measuresList;
data.info.CONFIRM_USER_MEASURES =
data.info.OTHER_PROTECTIVE_MEASURES.split(";_;")[0];
data.info.LEADER_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];
};
fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,9 @@
<template>
<index-view entrance="archive" />
</template>
<script setup>
import IndexView from "../job_data/index.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,9 @@
<template>
<view-info />
</template>
<script setup>
import ViewInfo from "../job_data/view.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,171 @@
<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.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>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
info: {
type: Object,
required: true,
default: () => {},
},
});
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 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,
}
);
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,173 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="50px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-form-item label="编号" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入关键字"
/>
</el-form-item>
</el-col>
<el-col :span="6" v-if="entrance === 'job_data'">
<el-form-item label="状态" prop="APPLY_STATUS">
<el-select v-model="searchForm.APPLY_STATUS">
<el-option
v-for="item in stateList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
v-model:pagination="pagination"
@get-data="fnGetData"
>
<el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ serialNumber(pagination, $index) }}
</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="LEADER_USER_NAME"
label="作业指挥负责人"
show-overflow-tooltip
/>
<el-table-column label="所在单位负责人" show-overflow-tooltip>
<template v-slot="{ row }">
{{ row.CONSTRUCTION_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column label="审核部门负责人" show-overflow-tooltip>
<template v-slot="{ row }">
{{ row.AUDIT_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column label="审批部门负责人" show-overflow-toolti>
<template v-slot="{ row }">
{{ row.APPROVE_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column
prop="ACCEPT_USER_NAME"
label="验收部门负责人"
show-overflow-tooltip
/>
<el-table-column label="审核状态">
<template v-slot="{ row }">
{{
entrance === "job_data"
? translationStatus(row.APPLY_STATUS, stateList)
: "已归档"
}}
</template>
</el-table-column>
<el-table-column label="操作" width="150">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="fnFlowChart(row)"
v-if="entrance === 'job_data'"
>
流程图
</el-button>
<el-button
type="primary"
text
link
@click="
router.push({
path:
props.entrance === 'job_data'
? '/hoisting/job_data/view'
: '/hoisting/archive/view',
query: { HOISTING_ID: row.HOISTING_ID, entrance },
})
"
>
审批表详情
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
<flow-chart
v-model:visible="data.flowChartDialog.visible"
:info="data.flowChartDialog.info"
/>
</div>
</template>
<script setup>
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
import { useRouter } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import FlowChart from "./components/flow_chart.vue";
import { getHoistingList } from "@/request/hoisting.js";
const props = defineProps({
entrance: {
type: String,
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 router = useRouter();
const listData = useListData(getHoistingList, {
otherParams: {
APPLY_STATUS: props.entrance === "archive" ? "6" : "",
},
});
const { list, pagination, searchForm, fnGetData, fnResetPagination } = listData;
const data = reactive({
flowChartDialog: {
visible: false,
info: {},
},
});
const fnFlowChart = (info) => {
data.flowChartDialog.visible = true;
data.flowChartDialog.info = info;
};
</script>
<style scoped></style>

View File

@ -0,0 +1,340 @@
<template>
<layout-print-table-package>
<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 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>
<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 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>{{ 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>
</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";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const route = useRoute();
const { HOISTING_ID } = route.query;
const data = reactive({
info: {},
imgList: [],
imgList1: [],
measuresList: [],
});
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];
};
fnGetData();
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,9 @@
<template>
<index-view entrance="archive" />
</template>
<script setup>
import IndexView from "../job_data/index.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,9 @@
<template>
<view-info />
</template>
<script setup>
import ViewInfo from "../job_data/view.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,171 @@
<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>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
info: {
type: Object,
required: true,
default: () => {},
},
});
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 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,
}
);
};
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,177 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="50px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-form-item label="编号" prop="KEYWORDS">
<el-input
v-model="searchForm.KEYWORDS"
placeholder="请输入关键字"
/>
</el-form-item>
</el-col>
<el-col :span="6" v-if="entrance === 'job_data'">
<el-form-item label="状态" prop="APPLY_STATUS">
<el-select v-model="searchForm.APPLY_STATUS">
<el-option
v-for="item in stateList"
:key="item.ID"
:label="item.NAME"
:value="item.ID"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
:data="list"
v-model:pagination="pagination"
@get-data="fnGetData"
>
<el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<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"
label="作业负责人"
show-overflow-tooltip
/>
<el-table-column label="所在单位负责人" show-overflow-tooltip>
<template v-slot="{ row }">
{{ row.PRODUCTION_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column
label="消防、安全管理部门负责人"
show-overflow-tooltip
width="200"
>
<template v-slot="{ row }">
{{ row.SAFETY_DEPARTMENT_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column label="审批部门负责人" show-overflow-tooltip>
<template v-slot="{ row }">
{{ row.LEADER_USER_NAME || " 已跳过" }}
</template>
</el-table-column>
<el-table-column
prop="ACCEPT_USER_NAME"
label="验收部门负责人"
show-overflow-tooltip
/>
<el-table-column label="审核状态">
<template v-slot="{ row }">
{{
entrance === "job_data"
? translationStatus(row.APPLY_STATUS, stateList)
: "已归档"
}}
</template>
</el-table-column>
<el-table-column label="操作" width="150">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="fnFlowChart(row)"
v-if="entrance === 'job_data'"
>
流程图
</el-button>
<el-button
type="primary"
text
link
@click="
router.push({
path:
props.entrance === 'job_data'
? '/open_circuit/job_data/view'
: '/open_circuit/archive/view',
query: { CUTROAD_ID: row.CUTROAD_ID, entrance },
})
"
>
审批表详情
</el-button>
</template>
</el-table-column>
</layout-table>
</layout-card>
<flow-chart
v-model:visible="data.flowChartDialog.visible"
:info="data.flowChartDialog.info"
/>
</div>
</template>
<script setup>
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
import { useRouter } from "vue-router";
import useListData from "@/assets/js/useListData.js";
import { reactive } from "vue";
import FlowChart from "./components/flow_chart.vue";
import { getOpenCircuitList } from "@/request/open_circuit.js";
const props = defineProps({
entrance: {
type: String,
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 router = useRouter();
const listData = useListData(getOpenCircuitList, {
otherParams: {
APPLY_STATUS: props.entrance === "archive" ? "6" : "",
},
});
const { list, pagination, searchForm, fnGetData, fnResetPagination } = listData;
const data = reactive({
flowChartDialog: {
visible: false,
info: {},
},
});
const fnFlowChart = (info) => {
data.flowChartDialog.visible = true;
data.flowChartDialog.info = info;
};
</script>
<style scoped></style>

View File

@ -0,0 +1,356 @@
<template>
<layout-print-table-package>
<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 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>
<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 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"
/>
<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 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
"
>
<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 }}
</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>
其他安全措施{{ 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;
"
>
<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>
</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";
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
const route = useRoute();
const { CUTROAD_ID } = route.query;
const data = reactive({
info: {},
imgList: [],
imgList1: [],
measuresList: [],
});
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];
};
fnGetData();
</script>
<style scoped lang="scss"></style>