Browse Source

审计大屏 11/17/ 2:46 现场督察 黄赌毒

main
parent
commit
93f2015dd6
  1. 66
      src/views/datav/SceneInsp.vue
  2. 496
      src/views/sensitivePerception/DictContent.vue

66
src/views/datav/SceneInsp.vue

@ -50,36 +50,18 @@
</el-col> </el-col>
</el-row> </el-row>
<datav-tabs
type="bottom-button"
v-model="activeTabLeft"
> <el-scrollbar height="350px">
<datav-tab-item label="分县市局" name="3"> <datav-chart-bar
<el-scrollbar height="350px"> :data="data1"
<datav-chart-bar :color="colors"
:data="data1" :size="small"
:color="colors" title="整改率排名"
:size="small" sub-title="已整改/问题数"
title="整改率排名" unit="%"
sub-title="已整改/问题数" />
unit="%" </el-scrollbar>
/>
</el-scrollbar>
</datav-tab-item>
<datav-tab-item label="局属单位" name="4">
<el-scrollbar height="350px">
<datav-chart-bar
:data="data1"
:max="11"
size="large"
:color="colors"
title="整改率排名"
sub-title="完成数/问题数"
/>
</el-scrollbar>
</datav-tab-item>
</datav-tabs>
</datav-card> </datav-card>
@ -158,22 +140,14 @@
<datav-card> <datav-card>
<datav-tabs v-model="activeTabRight" size="small"> <datav-tabs v-model="activeTabRight" size="small">
<datav-tab-item label="黄赌毒" name="3"> <datav-tab-item label="黄赌毒" name="3">
<datav-tabs <el-scrollbar height="420px">
v-model="activeMailTabRight" <datav-chart-bar
type="bottom-button" :data="hddList"
> size="large"
<datav-tab-item label="分县市局" name="1"> title="问题数排名"
<el-scrollbar height="300px"> sub-title="问题数"
<datav-chart-bar />
:data="hddList" </el-scrollbar>
size="large"
title="问题数排名"
sub-title="问题数"
/>
</el-scrollbar>
</datav-tab-item>
</datav-tabs>
</datav-tab-item> </datav-tab-item>
</datav-tabs> </datav-tabs>
@ -482,7 +456,7 @@ function getData() {
getChangedRank(time.value, 3).then((res) => { getChangedRank(time.value, 3).then((res) => {
rankOverview.value = res.rankOverview; rankOverview.value = res.rankOverview;
data1.value = res.changedRankList; data1.value = res.changedRankList;
option2.series[0].data = res.wtlxList; // option2.series[0].data = res.wtlxList;
}); });
getSupervisionTrend(new Date().getFullYear()).then((res) => { getSupervisionTrend(new Date().getFullYear()).then((res) => {

496
src/views/sensitivePerception/DictContent.vue

@ -1,219 +1,226 @@
<template> <template>
<div class="container" v-loading="loading"> <div class="container" v-loading="loading">
<header class="mb-20"> <header class="mb-20">
<div class="flex between"> <div class="flex between">
<div> <div>
<el-button type="primary" @click="handleAdd"> <el-button type="primary" @click="handleAdd">
<template #icon> <template #icon>
<icon name="el-icon-Plus" /> <icon name="el-icon-Plus"/>
</template> </template>
新增</el-button 新增
> </el-button
</div> >
<div style="width: 50%"> </div>
<el-row> <div style="width: 50%">
<el-col :span="12"> </el-col> <el-row>
<el-col :span="12"> <el-col :span="12"></el-col>
<div class="flex end"> <el-col :span="12">
<el-button type="primary" @click="handleCalculate"> <div class="flex end">
重新计算分值</el-button <el-button type="primary" @click="handleCalculate">
> 重新计算分值
</div> </el-button
</el-col>
</el-row>
</div>
</div>
<div class="flex between mt-10">
<div>
<div class="text-primary mt-10 mb-10">赋分分公式如下</div>
<div>
问题综合得分 =
基础分值x(1+问题严重等级系数)x(1+问题发生频次系数)x(1+问题发生率系数)
</div>
</div>
<a
class="flex v-center gap file-link"
:href="`${BASE_PATH}/templates/长沙公安数字督察灵敏感知体系问题赋分及风险预警机制.pdf`"
target="__blank"
>
<icon name="local-icon-pdf" :size="38" />
<span>问题赋分机制.pdf</span>
</a>
</div>
</header>
<div class="table-container">
<el-table :data="dictContents" row-key="id">
<el-table-column
label="问题条目"
prop="name"
show-overflow-tooltip=""
/>
<el-table-column label="基础分值" prop="score" width="200" align="center">
<template #default="{ row }">
<span v-if="row.level === 1">{{
getScoreRange(row)
}}</span>
<span v-else>{{ row.score }}</span>
</template>
</el-table-column>
<el-table-column
label="问题严重等级"
prop="isActiveLevel"
align="center"
> >
<template #default="{ row }"> </div>
<el-tag type="success" v-if="row.isActiveLevel === true" </el-col>
>开启</el-tag </el-row>
>
<el-tag type="danger" v-if="row.isActiveLevel === false"
>关闭</el-tag
>
</template>
</el-table-column>
<el-table-column
label="序号"
prop="sort"
width="100"
align="center"
/>
<el-table-column label="最后更新时间" prop="updTime" />
<el-table-column label="操作">
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)"
>编辑</el-button
>
<el-button type="danger" link @click="handleDelete(row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</div> </div>
<div class="mt-40"> </div>
<div>基础分值设定规则</div> <div class="flex between mt-10">
<p> <div>
1二级问题条目设定的基础分值作为其下属三级问题条目的默认基础分值 <div class="text-primary mt-10 mb-10">赋分分公式如下</div>
</p> <div>
<p> 问题综合得分 =
2若三级问题条目已单独设置基础分值则赋分时以该三级条目的基础分值为准 问题风险值 = 基础风险值+(基础风险值×问题严重等级系数)+(基础风险值×问题发生频次系数)
</p> </div>
<p>
3如三级问题条目未设置基础分值则采用其所属二级问题条目的基础分值进行赋分
</p>
</div> </div>
<a
class="flex v-center gap file-link"
:href="`${BASE_PATH}/templates/长沙公安数字督察灵敏感知体系问题赋分及风险预警机制.pdf`"
target="__blank"
>
<icon name="local-icon-pdf" :size="38"/>
<span>问题赋分机制.pdf</span>
</a>
</div>
</header>
<div class="table-container">
<el-table :data="dictContents" row-key="id">
<el-table-column
label="问题条目"
prop="name"
show-overflow-tooltip=""
/>
<el-table-column label="基础分值" prop="score" width="200" align="center">
<template #default="{ row }">
<span v-if="row.level === 1">{{
getScoreRange(row)
}}</span>
<span v-else>{{ row.score }}</span>
</template>
</el-table-column>
<el-table-column
label="问题严重等级"
prop="isActiveLevel"
align="center"
>
<template #default="{ row }">
<el-tag type="success" v-if="row.isActiveLevel === true"
>开启
</el-tag
>
<el-tag type="danger" v-if="row.isActiveLevel === false"
>关闭
</el-tag
>
</template>
</el-table-column>
<el-table-column
label="序号"
prop="sort"
width="100"
align="center"
/>
<el-table-column label="最后更新时间" prop="updTime"/>
<el-table-column label="操作">
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)"
>编辑
</el-button
>
<el-button type="danger" link @click="handleDelete(row)"
>删除
</el-button
>
</template>
</el-table-column>
</el-table>
</div> </div>
<div class="mt-40">
<div>基础分值设定规则</div>
<p>
1二级问题条目设定的基础分值作为其下属三级问题条目的默认基础分值
</p>
<p>
2若三级问题条目已单独设置基础分值则赋分时以该三级条目的基础分值为准
</p>
<p>
3如三级问题条目未设置基础分值则采用其所属二级问题条目的基础分值进行赋分
</p>
</div>
</div>
<el-dialog <el-dialog
v-model="show" v-model="show"
:title="mode === 'add' ? '新增问题类型' : '编辑问题类型'" :title="mode === 'add' ? '新增问题类型' : '编辑问题类型'"
width="600" width="600"
> >
<el-form label-width="120" ref="formRef" :model="formData"> <el-form label-width="120" ref="formRef" :model="formData">
<el-form-item <el-form-item
label="父级节点" label="父级节点"
:rules="{ :rules="{
required: true, required: true,
message: '请选择父级节点', message: '请选择父级节点',
}" }"
prop="parentCode" prop="parentCode"
> >
<el-tree-select <el-tree-select
class="flex-1" class="flex-1"
v-model="formData.parentCode" v-model="formData.parentCode"
:data="dictContentOptions" :data="dictContentOptions"
clearable clearable
node-key="id" node-key="id"
:props="{ :props="{
label: 'name', label: 'name',
}" }"
:default-expanded-keys="[DICT_CONTENT_ROOT_ID]" :default-expanded-keys="[DICT_CONTENT_ROOT_ID]"
placeholder="请选择父级节点" placeholder="请选择父级节点"
check-strictly check-strictly
filterable filterable
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="问题条目" label="问题条目"
prop="name" prop="name"
:rules="{ :rules="{
required: true, required: true,
message: '请输入问题条目', message: '请输入问题条目',
}" }"
> >
<el-input <el-input
v-model="formData.name" v-model="formData.name"
placeholder="请输入问题条目" placeholder="请输入问题条目"
clearable clearable
/> />
</el-form-item> </el-form-item>
<el-form-item label="基础分值" prop="score" v-if="formData.parentCode != DICT_CONTENT_ROOT_ID"> <el-form-item label="基础分值" prop="score" v-if="formData.parentCode != DICT_CONTENT_ROOT_ID">
<el-input <el-input
v-model="formData.score" v-model="formData.score"
placeholder="请输入序号" placeholder="请输入序号"
type="number" type="number"
clearable clearable
/> />
</el-form-item> </el-form-item>
<el-form-item label="序号" prop="sort"> <el-form-item label="序号" prop="sort">
<el-input <el-input
v-model="formData.sort" v-model="formData.sort"
placeholder="请输入序号" placeholder="请输入序号"
type="number" type="number"
clearable clearable
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="问题严重等级" label="问题严重等级"
prop="isActiveLevel" prop="isActiveLevel"
:rules="{ :rules="{
required: true, required: true,
message: '请选择问题严重等级', message: '请选择问题严重等级',
trigger: ['blur'], trigger: ['blur'],
}" }"
> >
<el-switch <el-switch
v-model="formData.isActiveLevel" v-model="formData.isActiveLevel"
inline-prompt inline-prompt
active-text="开启" active-text="开启"
inactive-text="关闭" inactive-text="关闭"
:active-value="true" :active-value="true"
:inactive-value="false" :inactive-value="false"
/> />
</el-form-item> </el-form-item>
</el-form> </el-form>
<footer class="flex end"> <footer class="flex end">
<el-button @click="show = false">取消</el-button> <el-button @click="show = false">取消</el-button>
<el-button type="primary" @click="submit">确定</el-button> <el-button type="primary" @click="submit">确定</el-button>
</footer> </footer>
</el-dialog> </el-dialog>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { BASE_PATH } from "@/api/request"; import {BASE_PATH} from "@/api/request";
import { calculateScore } from "@/api/work/negative"; import {calculateScore} from "@/api/work/negative";
import { DICT_CONTENT_ROOT_ID } from "@/enums/appEnums"; import {DICT_CONTENT_ROOT_ID} from "@/enums/appEnums";
import { import {
listDictContentTree, listDictContentTree,
addDictContent, addDictContent,
updateDictContent, updateDictContent,
delDictContent, delDictContent,
} from "@/api/system/dictContent"; } from "@/api/system/dictContent";
import feedback from "@/utils/feedback"; import feedback from "@/utils/feedback";
const dictContents = ref([]); const dictContents = ref([]);
const dictContentOptions = ref([ const dictContentOptions = ref([
{ {
id: DICT_CONTENT_ROOT_ID, id: DICT_CONTENT_ROOT_ID,
name: "顶级", name: "顶级",
children: [], children: [],
}, },
]); ]);
function getList() { function getList() {
listDictContentTree().then((data) => { listDictContentTree().then((data) => {
dictContents.value = data; dictContents.value = data;
dictContentOptions.value[0].children = data; dictContentOptions.value[0].children = data;
}); });
} }
getList(); getList();
const show = ref(false); const show = ref(false);
@ -222,85 +229,88 @@ const formRef = ref();
const mode = ref<string>("add"); const mode = ref<string>("add");
watch(mode, (val) => { watch(mode, (val) => {
if (val === "add") { if (val === "add") {
formData.value = {}; formData.value = {};
formRef.value.resetFields(); formRef.value.resetFields();
} }
}); });
async function submit() { async function submit() {
await formRef.value.validate(); await formRef.value.validate();
if (mode.value === "add") { if (mode.value === "add") {
await addDictContent(formData.value); await addDictContent(formData.value);
const parentCode = formData.value.parentCode; const parentCode = formData.value.parentCode;
formData.value = {}; formData.value = {};
formRef.value.resetFields(); formRef.value.resetFields();
formData.value.parentCode = parentCode; formData.value.parentCode = parentCode;
} else { } else {
await updateDictContent(formData.value); await updateDictContent(formData.value);
} }
show.value = false; show.value = false;
getList(); getList();
} }
function handleAdd() { function handleAdd() {
show.value = true; show.value = true;
mode.value = "add"; mode.value = "add";
} }
function handleEdit(row) { function handleEdit(row) {
show.value = true; show.value = true;
mode.value = "edit"; mode.value = "edit";
formData.value = {...row}; formData.value = {...row};
} }
const handleDelete = async (row) => { const handleDelete = async (row) => {
await feedback.confirm(`确定要删除 "${row.name}"?`); await feedback.confirm(`确定要删除 "${row.name}"?`);
await delDictContent(row.id); await delDictContent(row.id);
getList(); getList();
feedback.msgSuccess("删除成功"); feedback.msgSuccess("删除成功");
}; };
function getScoreRange(row) { function getScoreRange(row) {
const sorceSet = new Set(); const sorceSet = new Set();
row.children.forEach((item) => { row.children.forEach((item) => {
if (item.score) { if (item.score) {
sorceSet.add(item.score); sorceSet.add(item.score);
}
item.children.forEach((j) => {
if (j.score) {
sorceSet.add(j.score);
}
});
});
if (sorceSet.size === 0) {
return ''
}
if (sorceSet.size === 1) {
return sorceSet.values().next().value
} }
const min = Math.min(...sorceSet); item.children.forEach((j) => {
const max = Math.max(...sorceSet); if (j.score) {
return `${min}-${max}` sorceSet.add(j.score);
}
});
});
if (sorceSet.size === 0) {
return ''
}
if (sorceSet.size === 1) {
return sorceSet.values().next().value
}
const min = Math.min(...sorceSet);
const max = Math.max(...sorceSet);
return `${min}-${max}`
} }
const loading = ref(false) const loading = ref(false)
async function handleCalculate() { async function handleCalculate() {
await feedback.confirm("确定要重新计算风险指数?"); await feedback.confirm("确定要重新计算风险指数?");
loading.value = true loading.value = true
await calculateScore() await calculateScore()
feedback.msgSuccess("风险指数计算完成"); feedback.msgSuccess("风险指数计算完成");
loading.value = false loading.value = false
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.file-link { .file-link {
font-size: 16px; font-size: 16px;
text-decoration: none; text-decoration: none;
color: #19257d; color: #19257d;
padding: 0 8px; padding: 0 8px;
border-radius: 8px; border-radius: 8px;
&:hover {
background-color: #eee; &:hover {
} background-color: #eee;
}
} }
</style> </style>
Loading…
Cancel
Save