feat: 从甘肃完整复制过来,下一步在改内容

This commit is contained in:
2026-01-16 14:35:57 +08:00
parent 5f291c4ffb
commit 9236ef0280
2037 changed files with 563859 additions and 0 deletions

View File

@ -0,0 +1,135 @@
<template>
<div class="industry-center-container">
<!-- <div class="title">行业预警中心</div> -->
<div class="industry-center-header">
<div class="tab-container">
<el-tabs v-model="activeTab" type="card" @tab-click="onTabClick">
<el-tab-pane :label="item.label" :name="item.value" v-for="(item, i) in tabList" :key="i" />
</el-tabs>
</div>
<el-select style="width: 230px;" v-model="yearValue" placeholder="请选择年份">
<el-option v-for="item in yearList" :key="item" :label="item" :value="item" />
</el-select>
<el-button style="margin-left: 15px;" v-if="activeTab !== 'synthesis'" type="primary"
@click="onDownLoad">下载预警信息</el-button>
<el-button style="margin-left: 15px;" type="primary"
@click="configShow">{{activeTab === 'synthesis' ? '配置' : '查看配置'}}</el-button>
</div>
<div class="industry-center-content">
<div class="right-content">
<ThresholdAndSpecial ref="thresholdAndSpecialRef"
v-if="activeTab === 'threshold' || activeTab === 'special'" :yearValue="yearValue" />
<Synthesis ref="synthesisRef" v-if="activeTab === 'synthesis'" :yearValue="yearValue" />
</div>
</div>
<specialTable v-if="isShowSpecialTableTable" @close="isShowSpecialTableTable = false" />
<ThresholdTable v-if="isShowThresholdTable" @close="isShowThresholdTable = false" />
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import ThresholdAndSpecial from './tabsCom/ThresholdAndSpecial.vue'
import Synthesis from './tabsCom/Synthesis.vue'
import specialTable from './tabsCom/specialTable.vue'
import ThresholdTable from './tabsCom/ThresholdTable.vue'
const yearList = ref([])
const yearValue = ref(new Date().getFullYear())
const activeTab = ref('synthesis')
const thresholdAndSpecialRef = ref()
const synthesisRef = ref()
const isShowSpecialTableTable = ref(false)
const isShowThresholdTable = ref(false)
const tabList = ref([
{ label: '综合预警', value: 'synthesis' },
{ label: '阈值预警', value: 'threshold' },
{ label: '专项预警', value: 'special' },
])
const onTabClick = (tab) => {
console.log(tab)
}
const onDownLoad = () => {
console.log('下载。。')
if (typeof thresholdAndSpecialRef.value?.onDownLoad === 'function') {
thresholdAndSpecialRef.value.onDownLoad()
}
}
const configShow = () => {
console.log('配置。。')
if (activeTab.value === 'special') {
isShowSpecialTableTable.value = true
}
if (activeTab.value === 'threshold') {
isShowThresholdTable.value = true
}
}
onMounted(() => {
yearList.value = Array.from({ length: 10 }, (_, index) => new Date().getFullYear() - index)
})
</script>
<style lang="scss" scoped>
@import "@/views/dutyBook/jgryandzz/talentPool/tabContainer.scss";
/**tab-container.部分样式在 上面tabContainer.scss 文件中 */
.tab-container {
margin-left: 5px;
}
.industry-center-container {
width: 100%;
height: calc(100vh - 140px);
}
.industry-center-header {
display: flex;
// padding: 5px 10px;
align-items: center;
background-color: #fff;
}
.industry-center-content {
display: flex;
width: 100%;
height: calc(100vh - 182px);
// margin-top: 10px;
}
.left-tab {
width: 70px;
.left-tab-item {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
width: 100%;
height: 160px;
cursor: pointer;
background-color: #fff;
color: #000;
border-bottom: 1px solid var(--el-table-border-color);
.left-tab-item-img {
width: 50px;
height: 50px;
margin-bottom: 10px;
}
&.active {
background-color: var(--el-color-primary);
}
}
}
.right-content {
// width: calc(100% - 70px);
height: 100%;
}
</style>

View File

@ -0,0 +1,168 @@
<template>
<div class="synthesis-container">
<div class="synthesis-left">
<div class="synthesis-left-top">
<div class="synthesis-left-top-container">
<div class="synthesis-left-top-left">
<div>行业预警得分</div>
<div>
单位排行榜
</div>
</div>
<div class="synthesis-left-top-right">
<el-image style="width: 100px; height: 100%" :src="require('@/assets/images/jcgl_bj.png')"
fit="cover"></el-image>
</div>
</div>
</div>
<div class="synthesis-left-content">
<div class="synthesis-left-content-title">
<span class="col-1">
排序
</span>
<span class="col-2">
名称
</span>
<span class="col-3">
分数
</span>
</div>
<div class="synthesis-left-content-list">
<div v-for="(item, index) in 99" :key="index" class="synthesis-left-content-item">
<span class="rank-col-1">
<span class="rank-col-1-num">
{{ (index + 1) < 10 ? '0' + (index + 1) : (index + 1) }} </span>
</span>
<span class="rank-col-2">
甘肃兰州
</span>
<span class="rank-col-3">
99.99
</span>
</div>
</div>
</div>
</div>
<div class="synthesis-right">
<div class="synthesis-right-top">
<ScoreGlobe style="width: calc(50% - 5px);margin-right: 10px;" />
<LineChart style="width: calc(50% - 5px);" />
</div>
<SynthesisTable style="margin-top: 10px;" />
</div>
</div>
</template>
<script setup>
import ScoreGlobe from './synthesisCom/ScoreGlobe.vue';
import LineChart from './synthesisCom/lineChart.vue'
import SynthesisTable from './synthesisCom/synthesisTable.vue'
</script>
<style lang="scss" scoped>
.synthesis-container {
width: 100%;
height: 100%;
// background-color: #fff;
display: flex;
.synthesis-left {
width: 380px;
height: 100%;
margin-right: 10px;
.synthesis-left-content {
height: calc(100% - 100px);
padding: 10px;
font-weight: bolder;
color: #000;
background-color: #fff;
.synthesis-left-content-title {
display: flex;
border-radius: 2px;
background-color: #f0f0f0;
.col-1 {
display: inline-block;
width: 100px;
text-align: center;
padding: 6px 10px;
}
.col-2 {
display: inline-block;
// width: 180px;
flex: 1;
text-align: center;
padding: 6px 10px;
}
.col-3 {
display: inline-block;
width: 100px;
text-align: center;
padding: 6px 10px;
}
}
.synthesis-left-content-list {
height: calc(100% - 30px);
overflow: auto;
.synthesis-left-content-item {
display: flex;
border-bottom: 1px solid #ededee;
.rank-col-1 {
display: inline-block;
width: 100px;
text-align: center;
padding: 6px 10px;
.rank-col-1-num {
display: inline-block;
width: 22px;
height: 22px;
text-align: center;
line-height: 22px;
border-radius: 50%;
color: #fff;
background-color: var(--el-color-primary);
}
}
.rank-col-2 {
display: inline-block;
flex: 1;
// width: 180px;
text-align: center;
padding: 6px 10px;
}
.rank-col-3 {
display: inline-block;
width: 100px;
text-align: center;
padding: 6px 10px;
color: var(--el-color-primary);
}
}
}
}
}
.synthesis-right {
flex: 1;
padding-top: 10px;
.synthesis-right-top {
display: flex;
height: 280px;
width: 100%;
}
}
}
</style>

View File

@ -0,0 +1,179 @@
<template>
<div class="threshold-container">
<div class="top">
<div class="mapleft">
<!-- 地图 -->
<div class="tabBox">
<!-- <BigMap /> -->
</div>
</div>
<div class="mapright">
<div class="title">
<img src="@/assets/map/yujing.png" alt="">
<span class="ml5">预警图标</span>
</div>
<div>
<ul>
<li v-for="it in yjzblist" :key="it" class="libox">
<div style="width: 78%;">
<div class="name">{{ it.name }}</div>
<div class="num">{{ it.num }}</div>
</div>
<div class="iconmg">
<img src="@/assets/map/yujing.png" alt="">
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="btom">
<ul class="one">
<li v-for="item in list" :key="item" class="ont_li">
<span style="font-size: 15px;font-weight: 600;">{{ item.title }}</span>
<div v-for="it in item.lists" :key="it" class="mt10 boxss">
<span class="coubox">{{ it.name }}</span><span class="szbox">{{ it.num }}</span>
</div>
</li>
</ul>
</div>
</div>
</template>
<script setup>
// 引入
import { onMounted, ref, onBeforeUnmount } from "vue";
// import BigMap from "@/components/Map/yjMap.vue";
import * as MOSTY from "@/components/MyComponents/index";
import { useRouter } from "vue-router";
const router = useRouter();
import { useStore } from "vuex";
const store = useStore();
const yjzblist = ref([
{ name: '安全工程师岗位聘任比率', num: '6.93%' },
{ name: '专职驾驶员体检率', num: '2.93%' },
{ name: '电工体检率', num: '6.93%' },
{ name: '安全协议签订率', num: '6.93%' },
{ name: '相关方资质符合率', num: '6.93%' },
{ name: '使用超过8年车辆占比', num: '6.93%' },
{ name: '较大风险(橙区)现状风险单元数量', num: '6.93%' },
{ name: '隐患按期整改率', num: '6.93%' },
])
const list = ref([
{ title: '安全管理队伍', lists: [{ name: '安全管理人员数占比', num: '1.67%' }] },
{ title: '建筑物', lists: [{ name: '安全管理人员数占比', num: '1.67%' }, { name: '安全管理人员数占比', num: '1.67%' }] },
{ title: '职业健康', lists: [{ name: '安全管理人员数占比', num: '1.67%' }] },
{ title: '道路交通', lists: [{ name: '安全管理人员数占比', num: '1.67%' }] },
])
onMounted(() => {
});
</script>
<style lang="scss" scoped>
.threshold-container {
background: #f0f3fa;
}
.top {
height: calc(100vh - 359px);
display: flex;
}
.mapleft {
width: 58%;
.tabBox {
height: calc(100vh - 359px);
}
}
.mapright {
width: 42%;
padding: 10px;
background-color: #fff;
.title {
font-size: 18px;
color: #000;
}
ul {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
}
.libox {
width: 215px;
display: flex;
justify-content: space-between;
background: rgba(243, 198, 183, 0.5607843137);
padding: 10px;
margin: 8px;
.name {
font-size: 14px;
color: #000;
}
.num {
font-size: 20px;
color: red;
}
.iconmg {
>img {
height: 31px;
}
}
}
.one {
display: flex;
justify-content: start;
.ont_li {
padding: 10px;
margin: 10px;
background: #ffffff7a;
color: #000;
height: 159px;
}
}
.coubox {
display: inline-block;
width: 60%;
overflow: hidden; // 溢出隐藏
white-space: nowrap; // 强制一行
text-overflow: ellipsis; // 文字溢出显示省略号
}
.szbox {
color: var(--el-color-primary);
font-size: 15px;
font-weight: 600;
}
.boxss {
display: flex;
justify-content: space-between;
background: linear-gradient(378deg, #a8e3f5 0%, #c7ebf13d 100%);
padding: 5px;
}
</style>

View File

@ -0,0 +1,286 @@
<template>
<!-- <div class="synthesis-conf-container"> -->
<el-dialog v-model="dialogVisible" title="配置" width="85vw" :before-close="close">
<div class="synthesis-conf-content">
<el-table :data="tableData" height="calc(100vh - 250px)" border @selection-change="selectionChange"
:span-method="arraySpanMethod">
<el-table-column type="index" width="55" label="序号" />
<el-table-column prop="warningModule" label="预警模块" width="180"></el-table-column>
<el-table-column prop="warningIndex" label="预警指标" width="180"></el-table-column>
<el-table-column prop="indexRule" label="指标规则" width="300"></el-table-column>
<el-table-column prop="thresholdDefaultConfig" label="阈值默认配置" width="150"></el-table-column>
<el-table-column prop="threshold" label="阈值" width="100">
<template #default="scope">
<span>{{ scope.row.threshold }}%</span>
</template>
</el-table-column>
</el-table>
</div>
<template #footer>
<!-- <el-button type="primary" @click="ok">保存</el-button> -->
<el-button @click="close">关闭</el-button>
</template>
</el-dialog>
<!-- </div> -->
</template>
<script setup>
import { ref } from 'vue';
const dialogVisible = ref(true);
const emit = defineEmits(['ok', 'close']);
const tableData = [
{
"warningModule": "综合管理",
"warningIndex": "安全管理机构设置比率",
"indexRule": "独立设置安全管理机构单位数量/应独立设置安全管理机构数量*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 85
},
{
"warningModule": "综合管理",
"warningIndex": "安全生产标准化达标率",
"indexRule": "安全生产标准化达标单位数量/安全生产标准化应达标单位数量*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 80
},
{
"warningModule": "综合管理",
"warningIndex": "安全工程师岗位设置比率",
"indexRule": "设置安全工程师岗位单位数量/应设置安全工程师岗位单位数量*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 85
},
{
"warningModule": "安全管理队伍",
"warningIndex": "安全工程师岗位聘任比率",
"indexRule": "评聘安全工程师人数/专职安全管理人员数量*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 12
},
{
"warningModule": "安全管理队伍",
"warningIndex": "安全管理人员数占比",
"indexRule": "专职安全管理人员数量/从业人员总数*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 1
},
{
"warningModule": "",
"warningIndex": "高层民用建筑可燃外墙保温材料性能占比",
"indexRule": "高层民用建筑可燃外墙保温材料性能建筑数量/高层民用建筑总量*100%",
"thresholdDefaultConfig": "高于(不含)",
"threshold": 0
},
{
"warningModule": "",
"warningIndex": "高层民用建筑易燃外墙保温材料性能占比",
"indexRule": "高层民用建筑易燃外墙保温材料性能建筑数量/高层民用建筑总量*100%",
"thresholdDefaultConfig": "高于(不含)",
"threshold": 0
},
{
"warningModule": "",
"warningIndex": "联合工房易燃外墙保温材料性能占比",
"indexRule": "联合工房建筑易燃外墙保温材料性能建筑数量/联合工房建筑总量*100%",
"thresholdDefaultConfig": "高于(不含)",
"threshold": 0
},
{
"warningModule": "",
"warningIndex": "高层民用建筑消火栓系统设置比率",
"indexRule": "高层民用建筑设置消火栓系统建筑数量/高层民用建筑总数量*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 0
},
{
"warningModule": "",
"warningIndex": "高层民用建筑火灾自动报警系统设置比率",
"indexRule": "高层民用建筑设置火灾自动报警系统建筑数量/高层民用建筑总数量*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 0
},
{
"warningModule": "",
"warningIndex": "高层民用建筑自动灭火系统设置比率",
"indexRule": "高层民用建筑设置自动灭火系统建筑数量/高层民用建筑总数量*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 0
},
{
"warningModule": "",
"warningIndex": "联合工房消火栓系统设置比率",
"indexRule": "联合工房建筑设置消火栓系统建筑数量/联合工房建筑总数量*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 0
},
{
"warningModule": "",
"warningIndex": "联合工房火灾自动报警系统设置比率",
"indexRule": "联合工房建筑设置火灾自动报警系统建筑数量/联合工房建筑总数量*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 0
},
{
"warningModule": "仓储安全",
"warningIndex": "仓储消防设施设置比率",
"indexRule": "配置消火栓系统或火灾自动报警系统或自动灭火系统的(条件同分母)仓库数量/占地面积大于1500平方米或者总建筑面积大于3000平方米的单层库或多层库的仓库数量+立体库的仓库数量)*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 23
},
{
"warningModule": "职业健康和劳动保护",
"warningIndex": "专职驾驶员体检率",
"indexRule": "专职驾驶员特种作业人员体检数/驾驶员总数量*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 100
},
{
"warningModule": "职业健康和劳动保护",
"warningIndex": "电工体检率",
"indexRule": "电工特种作业人员体检数/电工总人数*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 100
},
{
"warningModule": "职业健康和劳动保护",
"warningIndex": "压力容器操作工体检率",
"indexRule": "压力容器操作工特种作业人员体检数/压力容器操作工总人数*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 100
},
{
"warningModule": "相关方",
"warningIndex": "安全协议签订率",
"indexRule": "签订安全协议相关数量/重点相关方总数量*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 100
},
{
"warningModule": "相关方",
"warningIndex": "相关方资质符合率",
"indexRule": "具备相应单位资质相关方数量/重点相关方总数量*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 100
},
{
"warningModule": "道路交通",
"warningIndex": "使用超过8年车辆占比",
"indexRule": "使用超过8年车辆数量/机动车辆总数*100%",
"thresholdDefaultConfig": "高于(不含)",
"threshold": 27
},
{
"warningModule": "道路交通",
"warningIndex": "使用超过30万公里车辆占比",
"indexRule": "使用超过30万公里车辆数量/机动车辆总数*100%",
"thresholdDefaultConfig": "高于(不含)",
"threshold": 27
},
{
"warningModule": "风险管控",
"warningIndex": "较大风险(橙区)现状风险单元数量(个)",
"indexRule": "较大风险(橙区)现状风险单元数量(个)",
"thresholdDefaultConfig": "高于(不含)",
"threshold": 0
},
{
"warningModule": "风险管控",
"warningIndex": "重大风险(红区)现状风险单元数量(个)",
"indexRule": "重大风险(红区)现状风险单元数量(个)",
"thresholdDefaultConfig": "高于(不含)",
"threshold": 0
},
{
"warningModule": "隐患治理",
"warningIndex": "隐患按期整改率",
"indexRule": "在整改期限小于等于统计周期最后一自然日内,隐患状态为\"已完成\"的隐患数量/整改期限小于等于统计周期最后一自然日的隐患数量*100%",
"thresholdDefaultConfig": "低于(不含)",
"threshold": 90
},
{
"warningModule": "隐患治理",
"warningIndex": "重大隐患占比",
"indexRule": "重大隐患数量/隐患总数*100%",
"thresholdDefaultConfig": "高于(不含)",
"threshold": 1
},
{
"warningModule": "事故事件",
"warningIndex": "交通事故万车死亡率",
"indexRule": "事故类型为\"道路交通机动车辆伤害”的死亡人数/车辆总数*10000",
"thresholdDefaultConfig": "高于(不含)",
"threshold": 1.38
},
{
"warningModule": "事故事件",
"warningIndex": "千人生产安全事故死亡率",
"indexRule": "事故类型为非\"道路交通机动车辆伤害”死亡人数/单位从业人数*1000",
"thresholdDefaultConfig": "高于(不含)",
"threshold": 0.01244
}
];
const form = ref({});
const ok = () => {
emit('ok');
};
/** 是否可选 */
const selectable = () => {
return true;
}
const selectionChange = (selection) => {
console.log('selectionChange', selection);
}
const arraySpanMethod = ({ row, column, rowIndex, columnIndex }) => {
// 第一列,,向下合并
if (columnIndex === 1) {
// 综合管理 合并3个 。对比excel序号少2个(因为列表序号从0开始而excel序号从2开始)
if (rowIndex === 0) return [3, 1]
if (rowIndex > 0 && rowIndex < 3) return [0, 0]
// 安全管理队伍 合并2个
if (rowIndex === 3) return [2, 1]
if (rowIndex > 3 && rowIndex < 5) return [0, 0]
// 无名菜单 (建筑) 合并 8个
if (rowIndex === 5) return [8, 1]
if (rowIndex > 5 && rowIndex < 13) return [0, 0]
// 仓储安全 合并 1个
if (rowIndex === 13) return [1, 1]
// 职业健康和劳动保护 合并 3个
if (rowIndex === 14) return [3, 1]
if (rowIndex > 14 && rowIndex < 17) return [0, 0]
// 相关方 合并 2个
if (rowIndex === 17) return [2, 1]
if (rowIndex > 17 && rowIndex < 19) return [0, 0]
// 道路交通 合并 2个
if (rowIndex === 19) return [2, 1]
if (rowIndex > 19 && rowIndex < 21) return [0, 0]
// 风险管控 合并 2个
if (rowIndex === 21) return [2, 1]
if (rowIndex > 21 && rowIndex < 23) return [0, 0]
// 隐患治理 合并 2个
if (rowIndex === 23) return [2, 1]
if (rowIndex > 23 && rowIndex < 25) return [0, 0]
// 事故事件 合并 2个
if (rowIndex === 25) return [2, 1]
if (rowIndex > 25 && rowIndex < 27) return [0, 0]
}
return [1, 1]
}
const close = () => {
emit('close');
};
// /** 设置table数据 */
// const setTable = ()=>{
// tableData.value = []
// }
</script>
<style lang="scss" scoped>
// .synthesis-conf-container {
// width: 100%;
// height: 100%;
// }</style>

View File

@ -0,0 +1,303 @@
<template>
<!-- <div class="synthesis-conf-container"> -->
<el-dialog v-model="dialogVisible" title="配置" width="85vw" :before-close="close">
<div class="synthesis-conf-content">
<el-table :data="tableData" height="calc(100vh - 250px)" border @selection-change="selectionChange"
:span-method="arraySpanMethod">
<el-table-column type="index" width="55" />
<el-table-column prop="warningProject" label="预警项目"></el-table-column>
<el-table-column prop="warningElement" label="预警要素"></el-table-column>
<el-table-column prop="warningThreshold" label="预警阈值"></el-table-column>
<el-table-column prop="warningLevel" label="预警等级"></el-table-column>
<el-table-column prop="businessModule" label="业务模块"></el-table-column>
<el-table-column prop="indicatorName" label="指标名称"></el-table-column>
<el-table-column prop="displayForm" label="显示形式"></el-table-column>
</el-table>
</div>
<template #footer>
<!-- <el-button type="primary" @click="ok">保存</el-button> -->
<el-button @click="close">关闭</el-button>
</template>
</el-dialog>
<!-- </div> -->
</template>
<script setup>
import { ref } from 'vue';
const dialogVisible = ref(true);
const emit = defineEmits(['ok', 'close']);
const tableData = [
{
warningProject: "风险单元预警",
warningElement: "风险单元",
warningThreshold: "出现红区风险单元(固有风险除外)",
warningLevel: "红",
businessModule: "14风险分级管控",
indicatorName: "不同级别现状风险单元数量",
displayForm: "风险单元"
},
{
warningProject: "风险单元预警",
warningElement: "风险单元",
warningThreshold: "出现橙区风险单元(固有风险除外)",
warningLevel: "橙",
businessModule: "14风险分级管控",
indicatorName: "不同级别现状风险单元数量",
displayForm: "风险单元"
},
{
warningProject: "风险单元预警",
warningElement: "重大隐患数量",
warningThreshold: "重大隐患数量≧2",
warningLevel: "红",
businessModule: "15隐患排查治理",
indicatorName: "重大隐患数量",
displayForm: "重大隐患数量"
},
{
warningProject: "风险单元预警",
warningElement: "重大隐患数量",
warningThreshold: "出现重大隐患",
warningLevel: "橙",
businessModule: "15隐患排查治理",
indicatorName: "重大隐患数量",
displayForm: "重大隐患数量"
},
{
warningProject: "风险单元预警",
warningElement: "同类别隐患占隐患总数",
warningThreshold: "同类别隐患占隐患总数超过70%",
warningLevel: "红",
businessModule: "15隐患排查治理",
indicatorName: "各隐患类别数量占比",
displayForm: "同类隐患占比"
},
{
warningProject: "风险单元预警",
warningElement: "同类别隐患占隐患总数",
warningThreshold: "同类别隐患占隐患总数超过60%",
warningLevel: "橙",
businessModule: "15隐患排查治理",
indicatorName: "各隐患类别数量占比",
displayForm: "同类隐患占比"
},
{
warningProject: "风险单元预警",
warningElement: "同类别隐患占隐患总数",
warningThreshold: "同类别隐患占隐患总数超过50%",
warningLevel: "黄",
businessModule: "15隐患排查治理",
indicatorName: "各隐患类别数量占比",
displayForm: "同类隐患占比"
},
{
warningProject: "风险单元预警",
warningElement: "隐患整改",
warningThreshold: "隐患按期整改率低于60%",
warningLevel: "红",
businessModule: "15隐患排查治理",
indicatorName: "隐患按期整改率",
displayForm: "隐患按期整改率"
},
{
warningProject: "风险单元预警",
warningElement: "隐患整改",
warningThreshold: "隐患按期整改率低于70%",
warningLevel: "橙",
businessModule: "15隐患排查治理",
indicatorName: "隐患按期整改率",
displayForm: "隐患按期整改率"
},
{
warningProject: "风险单元预警",
warningElement: "隐患整改",
warningThreshold: "隐患按期整改率低于80%",
warningLevel: "黄",
businessModule: "15隐患排查治理",
indicatorName: "隐患按期整改率",
displayForm: "隐患按期整改率"
},
{
warningProject: "事故预警",
warningElement: "事故事件",
warningThreshold: "发生死亡1人以上或重伤3人以上或直接经济损失100万以上的安全事故",
warningLevel: "红",
businessModule: "17事故事件",
indicatorName: "一般事故-3数量、一般事故-2数量、一般事故-1数量",
displayForm: "事故事件"
},
{
warningProject: "事故预警",
warningElement: "事故事件",
warningThreshold: "发生重伤1-2人或直接经济损失50万-100万的安全事故",
warningLevel: "橙",
businessModule: "17事故事件",
indicatorName: "一般事故-3数量、一般事故-2数量、一般事故-1数量",
displayForm: "事故事件"
},
{
warningProject: "事故预警",
warningElement: "事故事件",
warningThreshold: "发生轻伤3人及以上或直接经济损失10万-50万的安全事故",
warningLevel: "黄",
businessModule: "17事故事件",
indicatorName: "一般事故-3数量、一般事故-2数量、一般事故-1数量",
displayForm: "事故事件"
},
{
warningProject: "其他预警",
warningElement: "安全管理机构人员配置率",
warningThreshold: "配置率低于50%",
warningLevel: "红",
businessModule: "1综合管理",
indicatorName: "安全管理机构人员配置率",
displayForm: "安全管理机构人员配置率"
},
{
warningProject: "其他预警",
warningElement: "安全管理机构人员配置率",
warningThreshold: "配置率低于60%",
warningLevel: "橙",
businessModule: "1综合管理",
indicatorName: "安全管理机构人员配置率",
displayForm: "安全管理机构人员配置率"
},
{
warningProject: "其他预警",
warningElement: "安全管理机构人员配置率",
warningThreshold: "配置率低于70%",
warningLevel: "黄",
businessModule: "1综合管理",
indicatorName: "安全管理机构人员配置率",
displayForm: "安全管理机构人员配置率"
},
{
warningProject: "其他预警",
warningElement: "安全工程师评聘比例",
warningThreshold: "评聘比例低于5%",
warningLevel: "红",
businessModule: "2安全管理队伍",
indicatorName: "安全管理队伍安全工程师聘任率",
displayForm: "安全工程师评聘"
},
{
warningProject: "其他预警",
warningElement: "安全工程师评聘比例",
warningThreshold: "评聘比例低于10%",
warningLevel: "橙",
businessModule: "2安全管理队伍",
indicatorName: "安全管理队伍安全工程师聘任率",
displayForm: "安全工程师评聘"
},
{
warningProject: "其他预警",
warningElement: "安全工程师评聘比例",
warningThreshold: "评聘比例低于15%",
warningLevel: "黄",
businessModule: "2安全管理队伍",
indicatorName: "安全管理队伍安全工程师聘任率",
displayForm: "安全工程师评聘"
},
{
warningProject: "其他预警",
warningElement: "主要负责人安全培训符合学时要求≥12学时占比",
warningThreshold: "符合学时要求≥12学时的企业主要负责人占比低于60%",
warningLevel: "红",
businessModule: "3安全教育培训",
indicatorName: "主要负责人安全培训学时达标率",
displayForm: "主要负责人安全培训"
},
{
warningProject: "其他预警",
warningElement: "主要负责人安全培训符合学时要求≥12学时占比",
warningThreshold: "符合学时要求≥12学时的企业主要负责人占比低于80%",
warningLevel: "橙",
businessModule: "3安全教育培训",
indicatorName: "主要负责人安全培训学时达标率",
displayForm: "主要负责人安全培训"
},
{
warningProject: "其他预警",
warningElement: "主要负责人安全培训符合学时要求≥12学时占比",
warningThreshold: "符合学时要求≥12学时的企业主要负责人占比低于100%",
warningLevel: "黄",
businessModule: "3安全教育培训",
indicatorName: "主要负责人安全培训学时达标率",
displayForm: "主要负责人安全培训"
}
];
const form = ref({});
const ok = () => {
emit('ok');
};
/** 是否可选 */
const selectable = () => {
return true;
}
const selectionChange = (selection) => {
console.log('selectionChange', selection);
}
const arraySpanMethod = ({ row, column, rowIndex, columnIndex }) => {
// 第一列,第二列相同项,向下合并
if (columnIndex === 1) {
// 安全责任年度对比excel序号少2个(因为列表序号从0开始而excel序号从2开始)
if (rowIndex === 0) return [2, 1]
if (rowIndex === 1) return [0, 0]
// 未知?
if (rowIndex === 2) return [8, 1]
if (rowIndex > 2 && rowIndex < 10) return [0, 0]
// 事故预警
if (rowIndex === 10) return [3, 1]
if (rowIndex > 10 && rowIndex < 13) return [0, 0]
// 其他预警
if (rowIndex === 13) return [9, 1]
if (rowIndex > 13 && rowIndex < 22) return [0, 0]
}
if (columnIndex === 2) {
// 风险单元
if (rowIndex === 0) return [2, 1]
if (rowIndex > 0 && rowIndex < 2) return [0, 0]
// 重大隐患 合并2个
if (rowIndex === 2) return [2, 1]
if (rowIndex > 2 && rowIndex < 4) return [0, 0]
// 同类别隐患占隐患总数 合并3个
if (rowIndex === 4) return [3, 1]
if (rowIndex > 4 && rowIndex < 7) return [0, 0]
// 隐患整改 合并3个
if (rowIndex === 7) return [3, 1]
if (rowIndex > 7 && rowIndex < 10) return [0, 0]
// 事故事件 合并3个
if (rowIndex === 10) return [3, 1]
if (rowIndex > 10 && rowIndex < 13) return [0, 0]
// 安全管理机构人员配置率 合并3个
if (rowIndex === 13) return [3, 1]
if (rowIndex > 13 && rowIndex < 16) return [0, 0]
// 安全工程师评聘比例 合并3个
if (rowIndex === 16) return [3, 1]
if (rowIndex > 16 && rowIndex < 19) return [0, 0]
// 主要负责人安全培训符合学时要求≥12学时占比 合并3个
if (rowIndex === 19) return [3, 1]
if (rowIndex > 19 && rowIndex < 22) return [0, 0]
}
return [1, 1]
}
const close = () => {
emit('close');
};
// /** 设置table数据 */
// const setTable = ()=>{
// tableData.value = []
// }
</script>
<style lang="scss" scoped>
// .synthesis-conf-container {
// width: 100%;
// height: 100%;
// }</style>

View File

@ -0,0 +1,147 @@
<template>
<div class="score-globe-container">
<MOSTY.Assort title="甘肃省烟草行业预警得分"></MOSTY.Assort>
<div class="score-globe-content">
<div class="score-globe">
<div id="waveChart" class="liquidfill"></div>
</div>
<div class="score-globe-detail">
<div v-for="(item, index) in globeDetailList" :key="index" class="score-globe-item">
<span class="score-globe-item-title">
{{ item.name }} ({{ item.bracket }})
</span>
<span class="score-globe-item-value">
{{ item.value }}
</span>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import * as echarts from 'echarts'
import * as MOSTY from "@/components/MyComponents/index";
import 'echarts-liquidfill';
const globeDetailList = ref(
[
{
name: '安全责任',
value: 99.99,
bracket: 100
},
{
name: '双层预防',
value: 99.99,
bracket: 100
},
{
name: '培训教育',
value: 99.99,
bracket: 100
},
{
name: '应急管理',
value: 99.99,
bracket: 100
},
{
name: '重点领域',
value: 99.99,
bracket: 100
},
{
name: '事故事件',
value: 99.99,
bracket: '扣分项目'
}
]
);
/**
* @description 设置波浪图
*/
const setWaveChart = (value) => {
const cssText = document.documentElement.style.cssText;
const color = cssText.match(/--el-color-primary: (.*);/)[1] || '#007457';
const chart = echarts.init(document.getElementById('waveChart'));
const option = {
series: [
{
type: 'liquidFill',
// 水波图的配置
data: [value], // 设置水位值为0到1之间
radius: '90%', // 设置图的大小
color: [color],
outline: {
borderDistance: 0, // 外边框距离
itemStyle: {
borderWidth: 2, // 外边框宽度
borderColor: color // 外边框颜色
}
},
backgroundStyle: {
color: '#fff' // 背景色
},
label: {
show: false
}
},
],
};
chart.setOption(option);
}
onMounted(() => {
setWaveChart(0.22);
})
</script>
<style lang="scss" scoped>
.score-globe-container {
// width: calc(50% - 10px);
height: 100%;
padding: 0 10px 10px;
background-color: #fff;
}
.score-globe-content {
display: flex;
align-items: center;
}
.score-globe {
width: 200px;
height: 200px;
.liquidfill {
width: 100%;
height: 100%;
}
}
.score-globe-detail {
display: flex;
justify-content: center;
width: calc(100% - 200px);
flex-wrap: wrap;
color: #000;
.score-globe-item {
font-weight: bolder;
padding: 1.8%;
.score-globe-item-title {
display: inline-block;
width: 10.5em;
}
.score-globe-item-value {
display: inline-block;
min-width: 5em;
color: var(--el-color-primary);
}
}
}
</style>

View File

@ -0,0 +1,62 @@
<template>
<div class="line-chart-container">
<MOSTY.Assort style="margin-left: 10px;" title="甘肃省烟草行业预警得分"></MOSTY.Assort>
<div id="lineChart" class="line-chart"></div>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import * as echarts from 'echarts';
import * as MOSTY from "@/components/MyComponents/index";
const setLineChart = (dataList, timeList) => {
const chart = echarts.init(document.getElementById('lineChart'));
let option2 = {
// title: {
// text: '贵州烟草专卖(公司)总得分趋势情况',
// left: 'center'
// },
xAxis: {
type: 'category',
data: timeList
},
yAxis: {
type: 'value'
},
series: [{
data: dataList,
type: 'line',
areaStyle: {
color: '#24CCB8',
opacity: 0.4
},
lineStyle: {
color: '#24CCB8'
},
itemStyle: {
normal: {
color: '#24CCB8', // 连接点的颜色
}
},
}]
}
chart.setOption(option2);
}
onMounted(() => {
setLineChart([100, 90, 80, 70, 60, 50, 40, 30, 20, 10], ['2024-01', '2024-02', '2024-03', '2024-04', '2024-05', '2024-06', '2024-07', '2024-08', '2024-09', '2024-10']);
})
</script>
<style lang="scss" scoped>
.line-chart-container {
width: 100%;
height: 100%;
background-color: #fff;
}
.line-chart {
width: 100%;
height: calc(100% - 40px);
}
</style>

View File

@ -0,0 +1,465 @@
<template>
<!-- <div class="synthesis-conf-container"> -->
<el-dialog v-model="dialogVisible" title="配置" width="85vw" :before-close="close">
<div class="synthesis-conf-content">
<el-table :data="tableData" height="calc(100vh - 250px)" border @selection-change="selectionChange"
:span-method="arraySpanMethod">
<el-table-column type="index" width="55" />
<el-table-column prop="projectName" label="评估项目"></el-table-column>
<el-table-column prop="warningKey" label="预警要素"></el-table-column>
<el-table-column type="selection" :selectable="selectable" width="55" />
<el-table-column prop="indexName" label="指标名称"></el-table-column>
<el-table-column prop="rule" label="规则">
<template #default="{ row }">
<div class="rule-content" v-html="row.rule"></div>
</template>
</el-table-column>
<el-table-column prop="weightValue" label="权重">
<template #default="{ row }">
<el-input v-model="row.weightValue" />
</template>
</el-table-column>
<el-table-column prop="scoreRule" label="评分规则">
<template #default="{ row }">
<div class="score-rule-content" v-html="row.scoreRule"></div>
</template>
</el-table-column>
<el-table-column v-if="false" prop="cycle" label="取值周期">
</el-table-column>
</el-table>
</div>
<template #footer>
<el-button type="primary" @click="ok">保存</el-button>
<el-button @click="close">关闭</el-button>
</template>
</el-dialog>
<!-- </div> -->
</template>
<script setup>
import { ref, getCurrentInstance } from 'vue';
const dialogVisible = ref(true);
const { proxy } = getCurrentInstance();
const emit = defineEmits(['ok', 'close']);
const tableData = ref([
{
projectName: '安全责任(年度)',
warningKey: '安全生产标准化',
indexName: '安全生产标准化达标率',
rule: '安全生产标准化达标企业总数/应达标单位总数*100%<br/>(统计口径:各卷烟工厂、复烤厂、薄片厂、市局(公司)及醋纤企业的单位总数)',
weightValue: '2',
scoreRule: '比率*权重',
cycle: '搜索当前年度时,展示上一年搜索历史年度时,展示当前年',
index: 2
},
{
projectName: '安全责任(年度)',
warningKey: '机构队伍',
indexName: '安全管理机构设置比率',
rule: '安全管理机构设置数量/应独立设置安全管理机构单位总数*100%<br/>统计口径:省级公司本部、卷烟工厂、复烤厂、薄片厂、市局 (公司) 及醋纤企业的单位总数',
weightValue: '5',
scoreRule: '比率*权重',
cycle: '搜索当前年度时,展示上一年搜索历史年度时,展示当前年',
index: 3
},
{
projectName: '安全责任(年度)',
warningKey: '机构队伍',
indexName: '安全管理机构人员配置率',
rule: '配置人数/编制人数*100%',
weightValue: '5',
scoreRule: '比率*权重',
cycle: '搜索当前年度时,展示上一年搜索历史年度时,展示当前年',
index: 4
},
{
projectName: '安全责任(年度)',
warningKey: '机构队伍',
indexName: '安全管理人员数占比',
rule: '专职安全管理人员数/行业在册职工和劳动派遣者总数*100%',
weightValue: '4',
scoreRule: '占比≥1%得4分1%>占比≥0.9%等3分0.9%>占比≥0.8%等2分0.8%>占比≥0.7%等1分低于0.7%得0分',
cycle: '搜索当前年度时,展示上一年搜索历史年度时,展示当前年',
index: 5
},
{
projectName: '安全责任(年度)',
warningKey: '机构队伍',
indexName: '注册安全(消防)工程师占比',
rule: '从事专职安全管理岗位注册安全(消防)工程师/专职安全管理人员数量*100%',
weightValue: '3',
scoreRule: '工业占比≥50%得3分50%>占比≥30%得 2分 30%>占比≥10% 的1分10%>占比 得0分商业占比≥25%得3分25%>占比≥20%得 2分20%>占比≥10% 的1分10%>占比 得0分',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 6
},
{
projectName: '安全责任(年度)',
warningKey: '机构队伍',
indexName: '安全工程师应聘比率',
rule: '已聘任安全工程师单位总数/应聘任安全工程师单位总数*100%(统计口径为:省级公司本部(不含中烟实业本级)、卷烟工厂(不包含雪茄厂),复烤厂、市局(公司)及醋纤企业的单位总数)',
weightValue: '2',
scoreRule: '比率*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 7
},
{
projectName: '安全责任(年度)',
warningKey: '安委会会议',
indexName: '安委会会议频次',
rule: '安委会会议次数每年省级公司至少1次、下属企业至少2次',
weightValue: '5',
scoreRule: '省级公司缺少次数扣1分/次、下属企业缺少次数扣0.5分/次',
cycle: '搜索当前年度时,展示上一年搜索历史年度时,展示当前年',
index: 8
},
{
projectName: '教育培训(半年)',
warningKey: '培训学时',
indexName: '企业主要负责人培训总学时',
rule: '符合学时要求≥12学时的企业主要负责人/企业主要负责人数量*100%',
weightValue: '3',
scoreRule: '比率*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示下半年',
index: 9
},
{
projectName: '教育培训(半年)',
warningKey: '培训学时',
indexName: '安全分管领导(安全总监)培训总学时',
rule: '符合学时要求≥12学时的安全分管领导安全总监/安全分管领导(安全总监)数量*100%',
weightValue: '3',
scoreRule: '比率*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示下半年',
index: 10
},
{
projectName: '教育培训(半年)',
warningKey: '培训学时',
indexName: '专职安全管理人员人均培训学时',
rule: '专职安全管理人员人均培训学时/专职安全管理人员应培训学时12学时*100%',
weightValue: '3',
scoreRule: '比率*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示下半年',
index: 11
},
{
projectName: '教育培训(半年)',
warningKey: '培训学时',
indexName: '新员工人均培训学时',
rule: '新员工人均培训学时/新员工应培训学时24学时*100%',
weightValue: '3',
scoreRule: '比率*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示下半年',
index: 12
},
{
projectName: '重点领域',
warningKey: '工程建设项目“三同时”(半年)',
indexName: '建设项目“三同时”符合率',
rule: '可研、设计、验收阶段“三同时”资料均上传的已竣工验收项目数量/已竣工验收项目总数量*100%',
weightValue: '5',
scoreRule: '比率*权重 <br/>1.都在建,无建设项目,为满分 <br/> 2有在建的有竣工验收的分子分母只计算竣工验收的',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示下半年',
index: 13
},
{
projectName: '重点领域',
warningKey: '消防安全(半年)',
indexName: '易燃可燃外墙保温材料建筑物占比',
rule: '(易燃外墙保温材料的建筑物数量+可燃外墙保温材料的建筑物数量) /总建筑物数量*100%',
weightValue: '4',
scoreRule: '比率*权重(没有建筑得满分)',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示下半年',
index: 14
},
{
projectName: '重点领域',
warningKey: '消防安全(半年)',
indexName: '高层民用建筑消防设施符合率',
rule: '同时配置消火栓系统、火灾自动报警系统、自动灭火系统的高层民用建筑数量/高层民用建筑总数量*100%',
weightValue: '1',
scoreRule: '比率*权重(没有建筑得满分)',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示下半年',
index: 15
},
{
projectName: '重点领域',
warningKey: '消防安全(半年)',
indexName: '联合工房消防设施符合率',
rule: '同时配置消火栓系统、火灾自动报警系统的联合工房数量/联合工房总数量*100%',
weightValue: '1',
scoreRule: '比率*权重(没有建筑得满分)',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示下半年',
index: 16
},
{
projectName: '重点领域',
warningKey: '消防安全(半年)',
indexName: '仓储消防设施符合率',
rule: '配置消火栓系统或火灾自动报警系统或自动灭火系统的(条件同分母)仓库数量/占地面积大于1500平方米或者总建筑面积大于3000平方米的单层库或多层库的仓库数量+立体库的仓库数量)*100%',
weightValue: '1',
scoreRule: '比率*权重(没有仓储得满分)',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示下半年',
index: 17
},
{
projectName: '重点领域',
warningKey: '消防安全(半年)',
indexName: '消控室持证人员配置率',
rule: '四级/中级工以上(人)/消控室值班人员(人)*100%',
weightValue: '1',
scoreRule: '比率*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示下半年',
index: 18
},
{
projectName: '重点领域',
warningKey: '职业健康(季度)',
indexName: '职业危害因素超标点位率',
rule: '超标点位数量/检测点位数量*100%',
weightValue: '4',
scoreRule: '(1-比率)*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 19
},
{
projectName: '重点领域',
warningKey: '职业健康(季度)',
indexName: '职业病确诊人数',
rule: '职业病确认人数',
weightValue: '4',
scoreRule: '扣1分/人',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 20
},
{
projectName: '重点领域',
warningKey: '危险化学品(季度)',
indexName: '“两重一大”危险化学品',
rule: '构成重大危险源数量',
weightValue: '4',
scoreRule: '扣0.1分/品种',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 21
},
{
projectName: '重点领域',
warningKey: '相关方(季度)',
indexName: '重点相关方资质符合率',
rule: '具备相应的的单位资质相关方数量/重点相关方总数量*100%',
weightValue: '5',
scoreRule: '比例*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 22
},
{
projectName: '重点领域',
warningKey: '相关方(季度)',
indexName: '重点相关方安全协议签订率',
rule: '签订安全协议相关数量/重点相关方总数量*100%',
weightValue: '5',
scoreRule: '比例*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 23
},
{
projectName: '重点领域',
warningKey: '道路交通(季度)',
indexName: '超过8年或30万公里的车辆占比',
rule: '使用超过8年或使用超过30万公里的非已报废车辆数量/非已报废机动车辆总数*100%',
weightValue: '1',
scoreRule: '(1-比率)*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 24
},
{
projectName: '重点领域',
warningKey: '道路交通(季度)',
indexName: '车辆定位系统安装占比',
rule: '安装定位系统的自有物流运输车辆及自有通勤非已报废车辆数量/自有物流运输车辆及自有通勤非已报废车辆总数*100%',
weightValue: '1',
scoreRule: '比例*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 25
},
{
projectName: '重点领域',
warningKey: '道路交通(季度)',
indexName: '车辆影像雷达安装占比',
rule: '安装倒车影像且安装全车雷达的自有物流运输车辆及自有通勤非已报废车辆数量/自有物流运输车辆及自有通勤非已报废车辆总数*100%',
weightValue: '1',
scoreRule: '比例*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 26
},
{
projectName: '重点领域',
warningKey: '道路交通(季度)',
indexName: '车载监控系统安装占比',
rule: '安装驾驶行为监控预警的自有物流运输车辆及自有通勤非已报废车辆数量/自有物流运输车辆及自有通勤非已报废车辆总数*100%',
weightValue: '1',
scoreRule: '比例*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 27
},
{
projectName: '双重预防',
warningKey: '风险管理(半年)',
indexName: '橙区及以上现状风险单元数量(半年)',
rule: '现状风险单元出现红、橙风险的数量',
weightValue: '6',
scoreRule: '扣-0.1分/个',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示下半年',
index: 28
},
{
projectName: '双重预防',
warningKey: '隐患管理(季度)',
indexName: '主要负责人参与排查次数',
rule: '主要负责人参与的隐患排查次数',
weightValue: '3',
scoreRule: '省级单位≥1缺一次扣0.5分下属单位≥1季度缺一次扣0.5分。',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 29
},
{
projectName: '双重预防',
warningKey: '隐患管理(季度)',
indexName: '隐患按期整改率',
rule: '按期已整改隐患数量/到期应整改隐患数量*100%',
weightValue: '6',
scoreRule: '比例*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 30
},
{
projectName: '双重预防',
warningKey: '隐患管理(季度)',
indexName: '重大隐患数量',
rule: '隐患类别为“重大隐患”的非已整改完成的隐患数量',
weightValue: '6',
scoreRule: '-1分/个',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 31
},
{
projectName: '应急管理',
warningKey: '应急管理(季度)',
indexName: '应急预案演练覆盖率',
rule: '统计周期内发生演练的专项应急预案和现场处置方案数量之和/专项和现场应急预案总数*100%',
weightValue: '1',
scoreRule: '比例*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 32
},
{
projectName: '应急管理',
warningKey: '应急管理(季度)',
indexName: '应急演练评估覆盖率',
rule: '应急演练评估总次数/应急演练总次数*100%',
weightValue: '1',
scoreRule: '比例*权重',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 33
},
{
projectName: '事故事件',
warningKey: '事故事件',
indexName: '事故发生次数',
rule: '事故台账填报次数',
weightValue: '',
scoreRule: '一般事故轻伤3人及以上或直接经济损失10万-50万扣2分/起<br/>重伤1-2人或直接经济损失50万-100万扣5分/起<br/>死亡1-2人或重伤3-9人或直接经济损失100万-1000万扣10分/起<br/>较大及以上事故死亡3人及以上重伤10人及以上直接经济损失1000万及以上扣20分/起',
cycle: '搜索当前年度时,展示上周期搜索历史年度时,展示第四季度',
index: 34
}
]);
const form = ref({});
const ok = () => {
emit('ok');
};
/** 是否可选 */
const selectable = () => {
return true;
}
const selectionChange = (selection) => {
console.log('selectionChange', selection);
}
const arraySpanMethod = ({ row, column, rowIndex, columnIndex }) => {
// 第一列,第二列相同项,向下合并
if (columnIndex === 1) {
// 安全责任年度对比excel序号少2个(因为列表序号从0开始而excel序号从2开始)
if (rowIndex === 0) return [7, 1]
if (rowIndex > 0 && rowIndex < 7) return [0, 0]
// 教育培训(半年)序号
if (rowIndex === 7) return [4, 1]
if (rowIndex > 7 && rowIndex < 11) return [0, 0]
// 重点领域
if (rowIndex === 11) return [15, 1]
if (rowIndex > 11 && rowIndex < 26) return [0, 0]
// 双重预防
if (rowIndex === 26) return [4, 1]
if (rowIndex > 26 && rowIndex < 30) return [0, 0]
// 应急管理
if (rowIndex === 30) return [2, 1]
if (rowIndex > 30 && rowIndex < 32) return [0, 0]
}
if (columnIndex === 2) {
// 机构队伍
if (rowIndex === 1) return [5, 1]
if (rowIndex > 1 && rowIndex < 6) return [0, 0]
// 培训学时 合并4个
if (rowIndex === 7) return [4, 1]
if (rowIndex > 7 && rowIndex < 11) return [0, 0]
// 工程建设项目“三同时”(半年)不合并
if (rowIndex === 11) return [1, 1]
// 消防安全 半年合并5个
if (rowIndex === 12) return [5, 1]
if (rowIndex > 12 && rowIndex < 17) return [0, 0]
// 职业健康(季度) 合并2个
if (rowIndex === 17) return [2, 1]
if (rowIndex > 17 && rowIndex < 19) return [0, 0]
// 危险化学品(季度) 1个
if (rowIndex === 19) return [1, 1]
// 相关方(季度) 合并2个
if (rowIndex === 20) return [2, 1]
if (rowIndex > 20 && rowIndex < 22) return [0, 0]
// 道路交通(季度) 合并4个
if (rowIndex === 22) return [4, 1]
if (rowIndex > 22 && rowIndex < 26) return [0, 0]
// 风险管理(半年) 1个
if (rowIndex === 26) return [1, 1]
// 隐患管理(季度) 合并3个
if (rowIndex === 27) return [3, 1]
if (rowIndex > 27 && rowIndex < 30) return [0, 0]
// 应急管理 合并2个
if (rowIndex === 30) return [2, 1]
if (rowIndex > 30 && rowIndex < 32) return [0, 0]
}
return [1, 1]
}
const close = () => {
proxy.$modal.confirm('离开会丢失页面中修改的内容,确认离开吗?')
.then(() => {
emit('close');
})
.catch(() => {
// catch error
})
};
// /** 设置table数据 */
// const setTable = ()=>{
// tableData.value = []
// }
</script>
<style lang="scss" scoped>
// .synthesis-conf-container {
// width: 100%;
// height: 100%;
// }</style>

View File

@ -0,0 +1,52 @@
<template>
<div class="synthesis-table-container">
<div class="synthesis-table-header">
<MOSTY.Assort title="甘肃省烟预警指标明细"></MOSTY.Assort>
<el-button type="primary" @click="handleConfig">配置</el-button>
</div>
<el-table :data="tableData" style="width: 100%;">
<el-table-column prop="name" label="评估项目" />
<el-table-column prop="value" label="预警" />
<el-table-column prop="score" label="指标名称" />
<el-table-column prop="score" label="得分" />
</el-table>
<SynthesisConf v-if="isShowConf" @ok="configOk" @close="configClose" />
</div>
</template>
<script setup>
import * as MOSTY from "@/components/MyComponents/index";
import SynthesisConf from './synthesisConf.vue';
import { ref } from 'vue';
const isShowConf = ref(false);
const tableData = ref([
{ name: '评估项目', value: '预警', score: '指标名称', score: '得分' },
{ name: '评估项目', value: '预警', score: '指标名称', score: '得分' },
{ name: '评估项目', value: '预警', score: '指标名称', score: '得分' },
{ name: '评估项目', value: '预警', score: '指标名称', score: '得分' },
]);
const handleConfig = () => {
console.log('配置');
isShowConf.value = true;
};
const configOk = () => {
isShowConf.value = false;
};
const configClose = () => {
isShowConf.value = false;
};
</script>
<style lang="scss" scoped>
.synthesis-table-container {
width: 100%;
height: 100%;
padding: 0 10px 10px;
background-color: #fff;
.synthesis-table-header {
display: flex;
align-items: center;
}
}
</style>