提交代码

This commit is contained in:
wangchengming 2025-07-19 00:14:18 +08:00
parent ebf64bf396
commit b34746e615
10 changed files with 595 additions and 45 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -403,6 +403,21 @@ export const dynamicRoutes = [
}
]
},
{
path: '/safetyReview/safetyDashboardDitail',
component: Layout,
hidden: true,
permissions: ['safetyReview:dashboardDitail'],
children: [
{
path: ':dependencyId(\\d+)?',
component: () => import('@/views/safetyReview/dashboard/detailForm'),
name: 'safetyDashboardDitail',
meta: { title: '安全审查看板详情', activeMenu: '/safetyReview/safetyDashboard' }
}
]
},
{
path: '/ppeToolForm',
component: Layout,

View File

@ -8,11 +8,11 @@
<div class="right-cell">
<div class="right-content">
<el-button-group>
<el-button :class="activeOne === item.value ? 'activeOption' : 'right-item'"
v-for="item in oneBtns" :key="item.key" link
@click="handleChoseOneType(item.value)">
{{ item.lable }}
</el-button>
<el-button :class="activeOne === '全部' ? 'activeOption' : 'right-item'" key="one-1" link
@click="handleChoseOneType('全部')">全部</el-button>
<el-button :class="activeOne === dict.value ? 'activeOption' : 'right-item'"
v-for="dict in category_one" :key="dict.value" link
@click="handleChoseOneType(dict.value)"> {{ dict.label }} </el-button>
</el-button-group>
</div>
</div>
@ -22,6 +22,8 @@
<div class="right-cell">
<div class="right-content">
<el-button-group>
<el-button :class="activeOne === '全部' ? 'activeOption' : 'right-item'" key="two-1" link
@click="handleChoseTwoType('全部')">全部</el-button>
<el-button :class="activeTwo === item.value ? 'activeOption' : 'right-item'"
v-for="item in twoBtns" :key="item.key" link @click="activeTwo = item.value">
{{ item.lable }}
@ -52,6 +54,13 @@ import { Search } from '@element-plus/icons-vue'
import Breadcrumb from '@/components/Breadcrumb'
import list from './components/list.vue'
import card from './components/card.vue'
const { proxy } = getCurrentInstance()
//
const { category_one, laws_regulations, training_materials, safety_meeting, security_document } = proxy.useDict("category_one", "laws_regulations", "training_materials", "safety_meeting", "security_document")
const router = useRouter()
//
const fileListRef = ref(null)
@ -59,18 +68,7 @@ const isShowFileList = ref(true)
//
const fileCardRef = ref(null)
const isShowFileCard = ref(false)
const activeOne = ref('全部')
const oneBtns = ref([
{ key: 'one-1', value: '全部', lable: '全部' },
{ key: 'one-2', value: '法律法规文件', lable: '法律法规文件' },
{ key: 'one-3', value: '组织架构', lable: '组织架构' },
{ key: 'one-4', value: '高压培训材料', lable: '高压培训材料' },
{ key: 'one-5', value: '高压安全会议', lable: '高压安全会议' },
{ key: 'one-6', value: '应急宣贯文件', lable: '应急宣贯文件' },
{ key: 'one-7', value: '车型技术概述', lable: '车型技术概述' },
{ key: 'one-8', value: '随车卡', lable: '随车卡' },
{ key: 'one-9', value: '高压安全文件', lable: '高压安全文件' }
])
const activeOne = ref('全部')
const activeTwo = ref('全部')
const twoBtns = ref([
{ key: 'two-1', value: '全部', lable: '全部' },
@ -173,31 +171,45 @@ const queryParams = ref({
.right-item {
font-family: Microsoft YaHei;
font-weight: 400 !important;;
font-size: 18px !important;;
color: #000000 !important;;
line-height: 40px !important;;
padding: 0px 10px 0px 20px !important;;
font-weight: 400 !important;
;
font-size: 18px !important;
;
color: #000000 !important;
;
line-height: 40px !important;
;
padding: 0px 10px 0px 20px !important;
;
border: 0px !important;
}
.right-item:hover {
font-family: Microsoft YaHei;
font-weight: 400 !important;;
font-size: 18px !important;;
font-weight: 400 !important;
;
font-size: 18px !important;
;
color: #0090FF !important;
line-height: 40px !important;;
padding: 0px 10px 0px 20px !important;;
line-height: 40px !important;
;
padding: 0px 10px 0px 20px !important;
;
border: 0px !important;
}
.activeOption {
font-family: Microsoft YaHei;
font-weight: 600 !important;;
font-size: 18px !important;;
color: #0090FF !important;;
line-height: 40px !important;;
padding: 0px 10px 0px 20px !important;;
font-weight: 600 !important;
;
font-size: 18px !important;
;
color: #0090FF !important;
;
line-height: 40px !important;
;
padding: 0px 10px 0px 20px !important;
;
border: 0px !important;
}

View File

@ -0,0 +1,514 @@
<template>
<div class="app-page-container">
<el-breadcrumb class="app-breadcrumb" separator=">">
<transition-group name="breadcrumb">
<el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
<span v-if="index == levelList.length - 1" class="link-redirect">{{
item.title }}</span>
<span v-else class="no-redirect">{{ item.title }}</span>
</el-breadcrumb-item>
</transition-group>
</el-breadcrumb>
<div class="rootContainer2 clearBoth">
<el-card>
<template #header>
<div class="card-header">
<span>详情</span>
</div>
</template>
<el-form label-position="left">
<div class="headerTitle">基本信息</div>
<div class="applyFormContainer">
<el-row class="myRow" :gutter="20">
<el-col :span="8">
<el-form-item label="年度:">
<el-select v-model="detailForm.year" placeholder="请选择工具名称" style="width: 100px;">
<el-option v-for="item in allSafetyData" :key="item.year" :label="item.year"
:value="item.year" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="部门:">
{{ detailForm.deptName }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="属地:">
{{ detailForm.dependencyName }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="属地ESC:">
{{ detailForm.escUserName }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="ESC工号:">
{{ detailForm.workNo }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开口项数量:">
{{ detailForm.openItemCount }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="审查时间:">
{{ detailForm.reviewDate }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="下次审查时间:">
{{ detailForm.nextReviewDate }}
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
<div class="headerTitle">审查问题追踪</div>
<div class="groupBtnPanel">
<el-button-group>
<el-button v-for="(item, index) in ToolOptions" :key="index"
:type="activeIndex === index ? 'primary' : 'default'"
@click="handleChangeLeve(index, item)">
{{ item }}
</el-button>
</el-button-group>
</div>
<div class="applyFormContainer">
<div class="borderLine"></div>
<el-table :data="showTableData" style="width: 100%; margin-bottom: 20px;">
<el-table-column label="序号" width="60">
<template #default="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="remark" label="问题描述" min-width="260"></el-table-column>
<el-table-column prop="level" label="等级" align="center" width="150">
<template #default="scope">
<el-text v-if="scope.row.level == 3" type="danger" class="dangerText">主要偏差</el-text>
<el-text v-if="scope.row.level == 2" type="danger" class="infoinfoText">一般偏差</el-text>
<el-text v-if="scope.row.level == 1" type="success" class="successText">建议项</el-text>
</template>
</el-table-column>
<el-table-column prop="chargeUserName" label="整改负责人" width="120" />
<el-table-column prop="planDoneTime" label="计划完成时间" width="160"></el-table-column>
<el-table-column prop="state" label="状态" width="100">
<template #default="scope">
<el-text v-if="scope.row.state == 0" type="info" class="nomarlText">未整改</el-text>
<el-text v-if="scope.row.state == 1" type="info" class="nomarlText">待审核</el-text>
<el-text v-if="scope.row.state == 2" type="success" class="successText">已整改</el-text>
<el-text v-if="scope.row.state == 9" type="danger" class="dangerText">驳回</el-text>
</template>
</el-table-column>
</el-table>
</div>
</el-card>
</div>
</div>
</template>
<script setup>
import { onMounted, reactive } from 'vue'
import { useRouter } from 'vue-router'
import { listByDependency } from "@/api/safetyReview"
import moment from 'moment'
const router = useRouter()
const route = useRoute()
const allSafetyData = ref([])
const escUserId = ref(null)
const escUserName = ref(null)
const escWorkNo = ref(null)
//
const buildingNo = ref(null)
//
const factoryArea = ref(null)
//
const reviewProblemList = ref([])
//
const showTableData = ref([])
//
const cachShowTableData = ref([])
//
const ToolOptions = ref(['全部', '主要偏差', '一般偏差', '建议项'])
const activeIndex = ref(0)
const levelList = ref([
{ title: '高压安全审查', path: '/safetyReview' },
{ title: 'Dashboard', path: '/safetyReview/safetyDashboard' },
{ title: '详情', path: '/safetyReview/safetyDashboardDitail' }
])
//
onMounted(() => {
const dependencyId = route.params && route.params.dependencyId
if (dependencyId) {
console.log('接收id', dependencyId)
getListByDependencyList(dependencyId)
}
});
const { proxy } = getCurrentInstance()
const detailForm = ref({})
//
const getListByDependencyList = (_dependencyId) => {
showTableData.value = []
cachShowTableData.value = []
listByDependency({ dependencyId: _dependencyId }).then(res => {
if (res.code == 200) {
allSafetyData.value = res.data
if (res.data.length > 0) {
//
detailForm.value = res.data[0]
}
// ruleForm.value = res.data
// ruleForm.value.year = res.data.year.toString()
// escUserName.value = res.data.escUserName
// escWorkNo.value = res.data.workNo
// escUserId.value = res.data.escUserId
// res.data.reviewProblemList.forEach(item => {
// showTableData.value.push(item)
// cachShowTableData.value.push(item)
// });
}
})
}
//
const handleChangeLeve = (index, _level) => {
activeIndex.value = index
if (_level == '主要偏差') showTableData.value = cachShowTableData.value.filter(item => item.level == 3)
else if (_level == '一般偏差') showTableData.value = cachShowTableData.value.filter(item => item.level == 2)
else if (_level == '建议项') showTableData.value = cachShowTableData.value.filter(item => item.level == 1)
else showTableData.value = cachShowTableData.value
}
</script>
<style lang='scss'>
.app-main {
height: 100vh;
width: 100%;
position: relative;
overflow: hidden;
background-color: #F8F8F8;
}
.app-breadcrumb.el-breadcrumb {
width: 1200px;
margin: 0 auto;
height: 44px;
line-height: 44px;
font-size: 18px;
background: #f8f8f8;
.el-breadcrumb__item {
.el-breadcrumb__separator {
font-family: Microsoft YaHei;
font-weight: 400;
font-size: 18px;
color: #000000 !important;
margin: 0 9px;
}
}
.no-redirect {
font-family: Microsoft YaHei;
font-weight: 400;
font-size: 18px;
color: #000000;
cursor: text;
}
.link-redirect {
font-family: Microsoft YaHei;
font-weight: 400;
font-size: 18px;
color: #0090FF;
cursor: text;
text-decoration: underline;
text-underline-offset: 4px;
}
}
.clearBoth {
clear: both;
}
.rootContainer2 {
width: 1200px;
margin: 0 auto;
height: calc(100vh - 140px);
overflow-y: auto;
overflow-x: hidden;
background: #ffffff;
}
.el-card {
border: none;
}
.el-card__header {
min-height: 50px;
font-family: Microsoft YaHei;
font-weight: 700;
font-size: 20px;
text-align: left;
color: #000000;
border-bottom: 1px solid #DCDCDC;
box-sizing: border-box;
padding: 10px 20px 17px 20px;
}
.el-card__body {
padding: 20px 20px 0 20px !important;
}
.el-card.is-always-shadow {
box-shadow: none;
}
.headerTitle {
font-family: Microsoft YaHei;
font-weight: 700;
font-size: 18px;
text-align: left;
color: #000000;
background: #e9e9e9;
padding: 6px 14px;
}
.nomarlText {
font-family: Microsoft YaHei;
font-weight: 400;
font-size: 18px;
color: #b3b2b0;
}
.infoinfoText {
font-family: Microsoft YaHei;
font-weight: 400;
font-size: 18px;
color: #DD9200;
}
.successText {
font-family: Microsoft YaHei;
font-weight: 400;
font-size: 18px;
color: #00B32A;
}
.dangerText {
font-family: Microsoft YaHei;
font-weight: 400;
font-size: 18px;
color: #E13434;
}
.applyFormContainer {
padding: 20px 0;
overflow: hidden;
}
.submitTool {
width: 100%;
height: 76px;
position: absolute;
top: calc(100% - 76px);
background: #ffffff;
box-shadow: 1px 2px 10px 0 #93939333;
text-align: center;
line-height: 76px;
}
.cancelApplyBtn {
width: 100px;
height: 36px;
border-radius: 4px 4px 4px 4px;
background: #ea9f0e;
font-family: Microsoft YaHei;
font-weight: 700;
font-size: 16px;
text-align: center;
color: #FFFFFF;
}
.cancelApplyBtn:hover {
background: #ea9f0e;
color: #FFFFFF;
}
.submitApplyBtn {
width: 100px;
height: 36px;
border-radius: 4px 4px 4px 4px;
background: #4276d1;
font-family: Microsoft YaHei;
font-weight: 700;
font-size: 16px;
text-align: center;
color: #FFFFFF;
}
.submitApplyBtn:hover {
background: #4276d1;
color: #FFFFFF;
}
.myRow {
margin-left: 0 !important;
margin-right: 0 !important;
}
.el-form-item--default {
margin-bottom: 20px !important;
}
.el-form-item--label-left .el-form-item__label {
font-family: Microsoft YaHei;
font-weight: 400;
font-size: 16px;
text-align: left;
color: #787878;
padding: 0 10px 0 0;
}
.myFormItemLable {
padding-top: 22px;
}
.myFormItemLable .el-form-item__label {
font-family: Microsoft YaHei !important;
font-weight: 400 !important;
font-size: 16px !important;
text-align: left !important;
color: #787878 !important;
padding: 0 10px 0 60px;
}
.myFormItemLable .el-form-item__content {
font-family: Arial !important;
font-weight: 400 !important;
font-size: 18px !important;
text-align: left !important;
color: #000000 !important;
padding-left: 60px;
}
.el-form-item--label-left .el-form-item__content {
font-family: Arial;
font-weight: 400;
font-size: 18px;
text-align: left;
color: #000000;
}
.el-form-item--label-top .el-form-item__label {
font-family: Microsoft YaHei;
font-weight: 400;
font-size: 18px;
text-align: left;
color: #666666;
}
.el-form-item--label-top .el-form-item__content {
font-family: Arial;
font-weight: 400;
font-size: 18px;
text-align: left;
color: #000000;
}
.el-form-item--label-top .el-textarea__inner {
font-family: Arial;
font-weight: 400;
font-size: 18px;
color: #000000;
}
.el-input__inner {
font-weight: 400;
font-size: 18px;
text-align: left;
color: #000000;
}
.el-select__wrapper {
font-weight: 400;
font-size: 18px;
text-align: left;
color: #000000;
}
.el-form-item__error {
font-size: 16px;
}
.el-radio__inner {
width: 16px !important;
height: 16px !important;
}
.el-radio__label {
font-weight: 400;
font-size: 18px;
text-align: left;
color: #000000;
}
.el-button,
.el-button.is-round {
padding: 10px 11px;
}
.el-button-group>.el-button {
float: left;
position: relative;
height: 38px;
border: 1px solid #DFDFDF;
background: #ffffff;
font-family: Microsoft YaHei;
font-weight: 400;
font-size: 18px;
text-align: center;
color: #000000;
}
.el-button-group>.el-button--primary {
background: #1f1f1f;
font-family: Microsoft YaHei;
font-weight: 600;
color: #FFFFFF;
border: 1px solid #1f1f1f;
}
.groupBtnPanel {
padding: 20px 0 0;
}
.problemAddBtn {
width: 100%;
height: 50px;
border-radius: 6px 6px 6px 6px;
background: #ffffff;
font-family: Microsoft YaHei;
font-weight: 400;
font-size: 18px;
color: #BABDC0;
border: 1px dashed #BABDC0;
}
.problemAddBtn:hover {
background: #ffffff;
color: #BABDC0;
border: 1px dashed #BABDC0;
}
.verticalLine {
border-left: 1px solid #0090ff !important;
}
</style>

View File

@ -40,7 +40,8 @@
<td>{{ itemRow.dependencyName }}</td>
<td>{{ itemRow.escUserName }}</td>
<td>
<span v-if="itemRow.reviewState != 1" class="status-pending">待查</span>
<span v-if="itemRow.reviewFlag" class="status-pending" @click="handleViewDetail(itemRow.dependencyId)">待查</span>
<span v-else class="status-checked" @click="handleViewDetail(itemRow.dependencyId)">无需审查</span>
</td>
</tr>
</tbody>
@ -248,6 +249,11 @@ onMounted(() => {
getListBuildingDashboard()
});
//
const handleViewDetail = (dependencyId) => {
router.push('/safetyReview/safetyDashboardDitail/' + dependencyId)
}
//
const getListBuildingDashboard = () => {
loading.value = true
@ -296,6 +302,7 @@ const getListBuildingDashboard = () => {
}
//
const handleChangeFactory = (val) => {
closePropModal()
getListBuildingDashboard()
}
//
@ -619,8 +626,8 @@ const initMRA = () => {
.attr('x', bbox.x - data.paddingLeft)
.attr('y', bbox.y - data.paddingTop)
.attr('width', d => {
if (data.reviewFlag) return bbox.width + 2 * data.paddingLeft
else return bbox.width + 2 * data.paddingLeft + 20
if (data.reviewFlag) return bbox.width + 2 * data.paddingLeft + 20
else return bbox.width + 2 * data.paddingLeft
})
.attr('height', bbox.height + 2 * data.paddingTop)
.attr('rx', data.rx) //
@ -636,8 +643,8 @@ const initMRA = () => {
.attr('height', 39)
.attr('x', d => {
if (data.text == '192' || data.text == '193') {
if (data.reviewFlag) return bbox.x + 36
return bbox.x + 56
if (data.reviewFlag) return bbox.x + 56
return bbox.x + 36
}
return bbox.x
})
@ -753,8 +760,8 @@ const initShunYi = () => {
.attr('width', 36)
.attr('height', 39)
.attr('x', d => {
if (data.reviewFlag) return bbox.x
else return bbox.x + 10
if (data.reviewFlag) return bbox.x + 10
else return bbox.x
})
.attr('y', bbox.y + 30);
@ -931,10 +938,12 @@ const initShunYi = () => {
.status-checked {
color: #00B32A;
cursor: pointer;
}
.status-pending {
color: #E13434;
cursor: pointer;
}
}
</style>

View File

@ -13,7 +13,7 @@
<el-card>
<template #header>
<div class="card-header">
<span>详情</span>
<span>审批</span>
</div>
</template>
<el-form label-position="left">
@ -28,7 +28,7 @@
</el-row>
<el-row class="myRow" :gutter="20">
<el-col :span="5">
<el-form-item label="当前标签:" prop="targetQualification">
<el-form-item label="问题等级:" prop="targetQualification">
<el-text v-if="detailForm.level == 1" type="success"
class="successText">建议项</el-text>
<el-text v-if="detailForm.level == 2" type="info"

View File

@ -13,7 +13,7 @@
<el-card>
<template #header>
<div class="card-header">
<span>审批</span>
<span>详情</span>
</div>
</template>
<el-form label-position="left">
@ -28,7 +28,7 @@
</el-row>
<el-row class="myRow" :gutter="20">
<el-col :span="5">
<el-form-item label="当前标签:" prop="targetQualification">
<el-form-item label="问题等级:" prop="targetQualification">
<el-text v-if="detailForm.level == 1" type="success"
class="successText">建议项</el-text>
<el-text v-if="detailForm.level == 2" type="info"

View File

@ -28,7 +28,7 @@
</el-row>
<el-row class="myRow" :gutter="20">
<el-col :span="5">
<el-form-item label="当前标签:" prop="targetQualification">
<el-form-item label="问题等级:" prop="targetQualification">
<el-text v-if="detailForm.level == 1" type="success"
class="successText">建议项</el-text>
<el-text v-if="detailForm.level == 2" type="info"

View File

@ -28,7 +28,7 @@
</el-row>
<el-row class="myRow" :gutter="20">
<el-col :span="5">
<el-form-item label="当前标签:" prop="targetQualification">
<el-form-item label="问题等级:" prop="targetQualification">
<el-text v-if="detailForm.level == 1" type="success"
class="successText">建议项</el-text>
<el-text v-if="detailForm.level == 2" type="info"

View File

@ -2,7 +2,7 @@ import { defineConfig, loadEnv } from 'vite'
import path from 'path'
import createVitePlugins from './vite/plugins'
const baseUrl = 'http://43.143.229.145:8090' // 后端接口
const baseUrl = 'http://43.143.229.145:8090' // 后端接口
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {