Browse Source

fix--增加提示框

master
buaixuexideshitongxue 1 month ago
parent
commit
c4a1c6a19a
  1. 177
      src/views/datav/AuditSuper.vue
  2. 194
      src/views/datav/CaseVerif.vue
  3. 191
      src/views/datav/MailVisits.vue
  4. 174
      src/views/datav/RightsComfort.vue
  5. 193
      src/views/datav/SceneInsp.vue
  6. 172
      src/views/datav/VideoInsp.vue

177
src/views/datav/AuditSuper.vue

@ -220,35 +220,31 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<datav-date-picker v-model="time" /> <datav-date-picker v-model="time" />
<div class="flex gap-42"> <div class="flex gap-42 overview-stat-row">
<datav-statistic <el-tooltip
:value="overview.projectNumber" v-for="item in overviewCards"
title="审计单位/项目" :key="item.title"
style="width: 20%" placement="top"
/> :show-after="120"
<datav-statistic :offset="18"
:value="overview.auditAmount" popper-class="audit-overview-tooltip"
:title="`审计总金额\n(万元)`" >
:isDecimal="true" <template #content>
style="width: 20%" <div class="overview-tip-card">
/> <div class="overview-tip-title">{{ item.title }}</div>
<datav-statistic <div class="overview-tip-desc">{{ item.desc }}</div>
:value="`${overview.auditSjAmount}`" <div class="overview-tip-formula">{{ item.formula }}</div>
:title="`审减/问题金额\n(万元)`" </div>
:isDecimal="true" </template>
style="width: 20%" <div class="overview-tip-trigger" style="width: 20%">
/>
<datav-statistic
:value="overview.negativeNumber"
title="查处问题数"
style="width: 20%"
/>
<datav-statistic <datav-statistic
:value="overview.accountableNumber" :value="item.value"
title="追责问责数" :title="item.displayTitle || item.title"
style="width: 20%" :isDecimal="item.isDecimal"
/> />
</div> </div>
</el-tooltip>
</div>
<v-charts <v-charts
style="height: 450px" style="height: 450px"
:option="option" :option="option"
@ -371,6 +367,42 @@ const overview = ref({
auditSjAmount: 0, auditSjAmount: 0,
auditWtAmount: 0, auditWtAmount: 0,
}); });
const overviewCards = computed(() => [
{
title: "审计单位/项目",
value: overview.value.projectNumber,
desc: "统计当前所选审计类型在时间范围内纳入统计的单位或项目数量。",
formula: "统计方式:按当前审计类型汇总单位或项目数量",
},
{
title: "审计总金额(万元)",
displayTitle: "审计总金额\n(万元)",
value: overview.value.auditAmount,
isDecimal: true,
desc: "统计当前所选审计类型在时间范围内对应的审计金额总和。",
formula: "统计方式:按当前审计类型汇总审计金额并换算为万元",
},
{
title: "审减/问题金额(万元)",
displayTitle: "审减/问题金额\n(万元)",
value: `${overview.value.auditSjAmount}`,
isDecimal: true,
desc: "统计当前所选审计类型在时间范围内形成的审减金额或问题金额总和。",
formula: "统计方式:按当前审计类型汇总审减金额或问题金额并换算为万元",
},
{
title: "查处问题数",
value: overview.value.negativeNumber,
desc: "统计当前所选审计类型在时间范围内关联形成的问题数量。",
formula: "统计方式:按当前审计类型汇总查处问题数量",
},
{
title: "追责问责数",
value: overview.value.accountableNumber,
desc: "统计当前所选审计类型在时间范围内形成的追责问责人次。",
formula: "统计方式:对相关问题中的有效问责人次汇总",
},
]);
const problemOptions = ref({ const problemOptions = ref({
series: [ series: [
@ -757,6 +789,35 @@ const getAuditMapData = async ()=>{
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/style/datav.scss"; @import "@/style/datav.scss";
.overview-stat-row {
margin-bottom: 8px;
}
.overview-tip-trigger {
cursor: help;
transition: transform 0.22s ease, filter 0.22s ease;
}
.overview-tip-trigger:hover {
transform: translateY(-3px);
filter: drop-shadow(0 8px 18px rgba(28, 217, 255, 0.18));
}
:global(.audit-overview-tooltip) {
border: none !important;
background: transparent !important;
box-shadow: none !important;
padding: 0 !important;
color: inherit !important;
}
:global(.audit-overview-tooltip .el-popper__arrow),
:global(.audit-overview-tooltip .el-popper__arrow::before) {
display: none !important;
background: transparent !important;
border: none !important;
}
:deep() { :deep() {
// //
.tooltip { .tooltip {
@ -836,6 +897,70 @@ const getAuditMapData = async ()=>{
} }
} }
.overview-tip-card {
position: relative;
width: 260px;
padding: 14px 16px;
border: 1px solid rgba(77, 145, 255, 0.72);
border-radius: 14px;
background:
radial-gradient(circle at top right, rgba(41, 126, 255, 0.25), transparent 38%),
linear-gradient(180deg, rgba(3, 13, 74, 0.96) 0%, rgba(2, 26, 112, 0.96) 100%);
box-shadow:
0 16px 40px rgba(0, 10, 48, 0.45),
inset 0 1px 0 rgba(132, 201, 255, 0.24);
backdrop-filter: blur(8px);
}
.overview-tip-card::before {
content: "";
position: absolute;
left: 50%;
top: -12px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 11px solid transparent;
border-right: 11px solid transparent;
border-bottom: 12px solid rgba(77, 145, 255, 0.72);
}
.overview-tip-card::after {
content: "";
position: absolute;
left: 50%;
top: -10px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-bottom: 11px solid rgba(2, 26, 112, 0.98);
}
.overview-tip-title {
font-size: 15px;
font-weight: 700;
color: #f3fbff;
margin-bottom: 8px;
letter-spacing: 0.5px;
}
.overview-tip-desc {
font-size: 13px;
line-height: 1.6;
color: #9fc2ff;
margin-bottom: 10px;
}
.overview-tip-formula {
padding-top: 10px;
border-top: 1px solid rgba(111, 164, 255, 0.24);
font-size: 12px;
line-height: 1.5;
color: #e7f6ff;
}
.message { .message {
padding: 10px; padding: 10px;
margin-bottom: 10px; margin-bottom: 10px;

194
src/views/datav/CaseVerif.vue

@ -61,40 +61,36 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<datav-date-picker v-model="time"/> <datav-date-picker v-model="time"/>
<div class="flex gap-42"> <div class="flex gap-42 overview-stat-row">
<datav-statistic <el-tooltip
:value="overview.total" v-for="item in overviewCards"
title="案件总数(起)" :key="item.title"
style="width: 16.66%" placement="top"
@click="open('/data/ajhc?open=caseVerify')" :show-after="120"
/> :offset="18"
<datav-statistic popper-class="case-overview-tooltip"
:value="overview.confirmed" >
title="查实案件数" <template #content>
style="width: 16.66%" <div class="overview-tip-card">
/> <div class="overview-tip-title">{{ item.title }}</div>
<datav-statistic <div class="overview-tip-desc">{{ item.desc }}</div>
:value="overview.dealCasePro" <div class="overview-tip-formula">{{ item.formula }}</div>
title="查处问题(个)" </div>
style="width: 16.66%" </template>
/> <div
<datav-statistic class="overview-tip-trigger"
:value="overview.punishOrg"
title="问责单位数"
style="width: 16.66%"
/>
<datav-statistic
:value="overview.punishPre"
title="问责人次"
style="width: 16.66%" style="width: 16.66%"
/> :class="{ 'is-clickable': item.clickable }"
@click="item.onClick && item.onClick()"
>
<datav-statistic <datav-statistic
:value="overview.rate" :value="item.value"
value-unit="%" :value-unit="item.valueUnit"
title="查实率" :title="item.title"
style="width: 16.66%"
/> />
</div> </div>
</el-tooltip>
</div>
<v-charts <v-charts
style="height: 420px" style="height: 420px"
:option="option" :option="option"
@ -214,6 +210,47 @@ const overview = ref({
punishOrg: 0, // punishOrg: 0, //
Rate: 0, // Rate: 0, //
}); });
const overviewCards = computed(() => [
{
title: "案件总数(起)",
value: overview.value.total,
desc: "统计时间范围内纳入案件核查总览的案件总数。",
formula: "统计方式:时间范围内所有案件数量汇总",
clickable: true,
onClick: () => open('/data/ajhc?open=caseVerify'),
},
{
title: "查实案件数",
value: overview.value.confirmed,
desc: "统计核查认定为查实的案件数量。",
formula: "统计方式:时间范围内核查结果为查实的案件数量",
},
{
title: "查处问题(个)",
value: overview.value.dealCasePro,
desc: "统计案件核查过程中发现并查处的问题数量。",
formula: "统计方式:时间范围内查处问题总数汇总",
},
{
title: "问责单位数",
value: overview.value.punishOrg,
desc: "统计案件核查中形成有效问责的单位数量。",
formula: "统计方式:对被问责单位去重后汇总",
},
{
title: "问责人次",
value: overview.value.punishPre,
desc: "统计案件核查中形成有效问责的人次。",
formula: "统计方式:对个人和领导问责情况汇总后形成人次",
},
{
title: "查实率",
value: overview.value.rate,
valueUnit: "%",
desc: "反映案件总数中查实案件所占的比例。",
formula: "统计方式:查实案件数 ÷ 案件总数",
},
]);
let globalTempMapVoList = ref([]); let globalTempMapVoList = ref([]);
const caseVerifRankTab = ref('1'); const caseVerifRankTab = ref('1');
@ -798,6 +835,39 @@ const caseVerifJbclSituationAnimationStop = () => {
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/style/datav.scss"; @import "@/style/datav.scss";
.overview-stat-row {
margin-bottom: 8px;
}
.overview-tip-trigger {
cursor: help;
transition: transform 0.22s ease, filter 0.22s ease;
}
.overview-tip-trigger:hover {
transform: translateY(-3px);
filter: drop-shadow(0 8px 18px rgba(28, 217, 255, 0.18));
}
.overview-tip-trigger.is-clickable {
cursor: pointer;
}
:global(.case-overview-tooltip) {
border: none !important;
background: transparent !important;
box-shadow: none !important;
padding: 0 !important;
color: inherit !important;
}
:global(.case-overview-tooltip .el-popper__arrow),
:global(.case-overview-tooltip .el-popper__arrow::before) {
display: none !important;
background: transparent !important;
border: none !important;
}
:deep() { :deep() {
// //
.tooltip { .tooltip {
@ -870,6 +940,70 @@ const caseVerifJbclSituationAnimationStop = () => {
} }
.overview-tip-card {
position: relative;
width: 260px;
padding: 14px 16px;
border: 1px solid rgba(77, 145, 255, 0.72);
border-radius: 14px;
background:
radial-gradient(circle at top right, rgba(41, 126, 255, 0.25), transparent 38%),
linear-gradient(180deg, rgba(3, 13, 74, 0.96) 0%, rgba(2, 26, 112, 0.96) 100%);
box-shadow:
0 16px 40px rgba(0, 10, 48, 0.45),
inset 0 1px 0 rgba(132, 201, 255, 0.24);
backdrop-filter: blur(8px);
}
.overview-tip-card::before {
content: "";
position: absolute;
left: 50%;
top: -12px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 11px solid transparent;
border-right: 11px solid transparent;
border-bottom: 12px solid rgba(77, 145, 255, 0.72);
}
.overview-tip-card::after {
content: "";
position: absolute;
left: 50%;
top: -10px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-bottom: 11px solid rgba(2, 26, 112, 0.98);
}
.overview-tip-title {
font-size: 15px;
font-weight: 700;
color: #f3fbff;
margin-bottom: 8px;
letter-spacing: 0.5px;
}
.overview-tip-desc {
font-size: 13px;
line-height: 1.6;
color: #9fc2ff;
margin-bottom: 10px;
}
.overview-tip-formula {
padding-top: 10px;
border-top: 1px solid rgba(111, 164, 255, 0.24);
font-size: 12px;
line-height: 1.5;
color: #e7f6ff;
}
.gobal-dropdown-container { .gobal-dropdown-container {
position: absolute; position: absolute;
right: 20px; right: 20px;

191
src/views/datav/MailVisits.vue

@ -109,39 +109,35 @@
<div class="datav-col"> <div class="datav-col">
<datav-date-picker v-model="time"/> <datav-date-picker v-model="time"/>
</div> </div>
<div class="flex gap-42"> <div class="flex gap-42 overview-stat-row">
<datav-statistic <el-tooltip
:value="overview.manageMail" v-for="item in overviewCards"
title="局长信箱" :key="item.title"
style="width: 20%" placement="top"
@click="open('/query?open=Mailbox')" :show-after="120"
/> :offset="18"
<datav-statistic popper-class="mail-overview-tooltip"
:value="overview.totalMail" >
title="信访总数" <template #content>
style="width: 20%" <div class="overview-tip-card">
<div class="overview-tip-title">{{ item.title }}</div>
/> <div class="overview-tip-desc">{{ item.desc }}</div>
<datav-statistic <div class="overview-tip-formula">{{ item.formula }}</div>
:value="overview.countryMail" </div>
title="国家信访" </template>
style="width: 20%" <div
@click="open('/data/gjxf?open=view')" class="overview-tip-trigger"
/>
<datav-statistic
:value="overview.policeMail"
title="公安部信访"
style="width: 20%" style="width: 20%"
@click="open('/data/gabxf?open=view')" :class="{ 'is-clickable': item.clickable }"
/> @click="item.onClick && item.onClick()"
>
<datav-statistic <datav-statistic
:value="overview.numberMail" :value="item.value"
title="12337信访" :title="item.title"
style="width: 20%"
@click="open('/query?open=12337')"
/> />
</div> </div>
</el-tooltip>
</div>
<v-charts <v-charts
style="height: 450px" style="height: 450px"
@ -333,6 +329,46 @@ const overview = ref({
numberMail: 0, numberMail: 0,
manageMail: 0, manageMail: 0,
}); });
const overviewCards = computed(() => [
{
title: "局长信箱",
value: overview.value.manageMail,
desc: "统计时间范围内局长信箱中的来信数量。",
formula: "统计方式:局长信箱有效来信数量汇总",
clickable: true,
onClick: () => open('/query?open=Mailbox'),
},
{
title: "信访总数",
value: overview.value.totalMail,
desc: "统计时间范围内纳入信访总数口径的数据量。",
formula: "统计方式:国家信访 + 公安部信访 + 12337信访",
},
{
title: "国家信访",
value: overview.value.countryMail,
desc: "统计时间范围内国家信访来源的数据数量。",
formula: "统计方式:国家信访数据数量汇总",
clickable: true,
onClick: () => open('/data/gjxf?open=view'),
},
{
title: "公安部信访",
value: overview.value.policeMail,
desc: "统计时间范围内公安部信访来源的数据数量。",
formula: "统计方式:公安部信访数据数量汇总",
clickable: true,
onClick: () => open('/data/gabxf?open=view'),
},
{
title: "12337信访",
value: overview.value.numberMail,
desc: "统计时间范围内 12337 平台来源的数据数量。",
formula: "统计方式:12337信访数据数量汇总",
clickable: true,
onClick: () => open('/query?open=12337'),
},
]);
// //
// //
const fxjsFirstAndRepeatOverview = ref({ const fxjsFirstAndRepeatOverview = ref({
@ -1095,6 +1131,39 @@ function open(path) {
align-items: center; align-items: center;
} }
.overview-stat-row {
margin-bottom: 8px;
}
.overview-tip-trigger {
cursor: help;
transition: transform 0.22s ease, filter 0.22s ease;
}
.overview-tip-trigger:hover {
transform: translateY(-3px);
filter: drop-shadow(0 8px 18px rgba(28, 217, 255, 0.18));
}
.overview-tip-trigger.is-clickable {
cursor: pointer;
}
:global(.mail-overview-tooltip) {
border: none !important;
background: transparent !important;
box-shadow: none !important;
padding: 0 !important;
color: inherit !important;
}
:global(.mail-overview-tooltip .el-popper__arrow),
:global(.mail-overview-tooltip .el-popper__arrow::before) {
display: none !important;
background: transparent !important;
border: none !important;
}
:deep() { :deep() {
// //
@ -1154,6 +1223,70 @@ function open(path) {
} }
.overview-tip-card {
position: relative;
width: 260px;
padding: 14px 16px;
border: 1px solid rgba(77, 145, 255, 0.72);
border-radius: 14px;
background:
radial-gradient(circle at top right, rgba(41, 126, 255, 0.25), transparent 38%),
linear-gradient(180deg, rgba(3, 13, 74, 0.96) 0%, rgba(2, 26, 112, 0.96) 100%);
box-shadow:
0 16px 40px rgba(0, 10, 48, 0.45),
inset 0 1px 0 rgba(132, 201, 255, 0.24);
backdrop-filter: blur(8px);
}
.overview-tip-card::before {
content: "";
position: absolute;
left: 50%;
top: -12px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 11px solid transparent;
border-right: 11px solid transparent;
border-bottom: 12px solid rgba(77, 145, 255, 0.72);
}
.overview-tip-card::after {
content: "";
position: absolute;
left: 50%;
top: -10px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-bottom: 11px solid rgba(2, 26, 112, 0.98);
}
.overview-tip-title {
font-size: 15px;
font-weight: 700;
color: #f3fbff;
margin-bottom: 8px;
letter-spacing: 0.5px;
}
.overview-tip-desc {
font-size: 13px;
line-height: 1.6;
color: #9fc2ff;
margin-bottom: 10px;
}
.overview-tip-formula {
padding-top: 10px;
border-top: 1px solid rgba(111, 164, 255, 0.24);
font-size: 12px;
line-height: 1.5;
color: #e7f6ff;
}
.test { .test {
width: 95px; width: 95px;

174
src/views/datav/RightsComfort.vue

@ -92,34 +92,31 @@
<el-col :span="12"> <el-col :span="12">
<datav-date-picker v-model="time"/> <datav-date-picker v-model="time"/>
<div class="flex gap-42"> <div class="flex gap-42 overview-stat-row">
<datav-statistic <el-tooltip
:value="overview.rightsNumber" v-for="item in overviewCards"
title="维权案件总数" :key="item.title"
style="width: 20%" placement="top"
/> :show-after="120"
<datav-statistic :offset="18"
:value="overview.victimNumber" popper-class="rights-overview-tooltip"
title="受侵害人数" >
style="width: 20%" <template #content>
/> <div class="overview-tip-card">
<datav-statistic <div class="overview-tip-title">{{ item.title }}</div>
:value="overview.hitPersonNumber" <div class="overview-tip-desc">{{ item.desc }}</div>
title="打击处理人数" <div class="overview-tip-formula">{{ item.formula }}</div>
style="width: 20%" </div>
/> </template>
<datav-statistic <div class="overview-tip-trigger" style="width: 20%">
:value="overview.comfortPersonNumber"
title="抚慰人数"
style="width: 20%"
/>
<datav-statistic <datav-statistic
:value="overview.comfortMoney" :value="item.value"
:title="`抚慰金额\n(万元)`" :title="item.displayTitle || item.title"
:isDecimal="true" :isDecimal="item.isDecimal"
style="width: 20%"
/> />
</div> </div>
</el-tooltip>
</div>
<v-charts <v-charts
style="height: 360px" style="height: 360px"
:option="option" :option="option"
@ -242,6 +239,40 @@ const overview = ref({
comfortPersonNumber: 0, comfortPersonNumber: 0,
comfortMoney: 0 comfortMoney: 0
}) })
const overviewCards = computed(() => [
{
title: "维权案件总数",
value: overview.value.rightsNumber,
desc: "统计时间范围内纳入维权申请的案件总数。",
formula: "统计方式:按案件编号去重后汇总维权案件数量",
},
{
title: "受侵害人数",
value: overview.value.victimNumber,
desc: "统计时间范围内维权案件中受侵害人员数量。",
formula: "统计方式:按受侵害人员数量汇总",
},
{
title: "打击处理人数",
value: overview.value.hitPersonNumber,
desc: "统计时间范围内打击处理对象的人数,遇到一条记录多人时会拆分累计。",
formula: "统计方式:将多人姓名拆分后汇总实际人数",
},
{
title: "抚慰人数",
value: overview.value.comfortPersonNumber,
desc: "统计时间范围内进入抚慰流程的人数。",
formula: "统计方式:按抚慰申请人数汇总",
},
{
title: "抚慰金额(万元)",
displayTitle: "抚慰金额\n(万元)",
value: overview.value.comfortMoney,
isDecimal: true,
desc: "统计时间范围内抚慰金额总和,并按万元展示。",
formula: "统计方式:抚慰金额汇总后换算为万元",
},
])
// //
const activeMailTab = ref("1") const activeMailTab = ref("1")
@ -833,6 +864,35 @@ const colors = [
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/style/datav.scss"; @import "@/style/datav.scss";
.overview-stat-row {
margin-bottom: 8px;
}
.overview-tip-trigger {
cursor: help;
transition: transform 0.22s ease, filter 0.22s ease;
}
.overview-tip-trigger:hover {
transform: translateY(-3px);
filter: drop-shadow(0 8px 18px rgba(28, 217, 255, 0.18));
}
:global(.rights-overview-tooltip) {
border: none !important;
background: transparent !important;
box-shadow: none !important;
padding: 0 !important;
color: inherit !important;
}
:global(.rights-overview-tooltip .el-popper__arrow),
:global(.rights-overview-tooltip .el-popper__arrow::before) {
display: none !important;
background: transparent !important;
border: none !important;
}
:deep() { :deep() {
// //
@ -905,6 +965,70 @@ const colors = [
} }
.overview-tip-card {
position: relative;
width: 260px;
padding: 14px 16px;
border: 1px solid rgba(77, 145, 255, 0.72);
border-radius: 14px;
background:
radial-gradient(circle at top right, rgba(41, 126, 255, 0.25), transparent 38%),
linear-gradient(180deg, rgba(3, 13, 74, 0.96) 0%, rgba(2, 26, 112, 0.96) 100%);
box-shadow:
0 16px 40px rgba(0, 10, 48, 0.45),
inset 0 1px 0 rgba(132, 201, 255, 0.24);
backdrop-filter: blur(8px);
}
.overview-tip-card::before {
content: "";
position: absolute;
left: 50%;
top: -12px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 11px solid transparent;
border-right: 11px solid transparent;
border-bottom: 12px solid rgba(77, 145, 255, 0.72);
}
.overview-tip-card::after {
content: "";
position: absolute;
left: 50%;
top: -10px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-bottom: 11px solid rgba(2, 26, 112, 0.98);
}
.overview-tip-title {
font-size: 15px;
font-weight: 700;
color: #f3fbff;
margin-bottom: 8px;
letter-spacing: 0.5px;
}
.overview-tip-desc {
font-size: 13px;
line-height: 1.6;
color: #9fc2ff;
margin-bottom: 10px;
}
.overview-tip-formula {
padding-top: 10px;
border-top: 1px solid rgba(111, 164, 255, 0.24);
font-size: 12px;
line-height: 1.5;
color: #e7f6ff;
}
.test { .test {
width: 95px; width: 95px;
height: 25px; height: 25px;

193
src/views/datav/SceneInsp.vue

@ -184,39 +184,35 @@
<el-col :span="12"> <el-col :span="12">
<datav-date-picker v-model="time" /> <datav-date-picker v-model="time" />
<div class="flex gap-42"> <div class="flex gap-42 overview-stat-row">
<datav-statistic <el-tooltip
:value="overview.problemNumber" v-for="item in overviewCards"
title="通报问题数" :key="item.title"
style="width: 16.66%" placement="top"
/> :show-after="120"
<datav-statistic :offset="18"
:value="overview.reportNumber" popper-class="scene-overview-tooltip"
title="通报期数" >
style="width: 16.66%" <template #content>
@click="handleShow" <div class="overview-tip-card">
/> <div class="overview-tip-title">{{ item.title }}</div>
<datav-statistic <div class="overview-tip-desc">{{ item.desc }}</div>
:value="overview.processingNumber" <div class="overview-tip-formula">{{ item.formula }}</div>
title="办理中" </div>
style="width: 16.66%" </template>
/> <div
<datav-statistic class="overview-tip-trigger"
:value="overview.completedNumber"
title="已办结"
style="width: 16.66%"
/>
<datav-statistic
:value="overview.departNumber"
title="问责单位数"
style="width: 16.66%" style="width: 16.66%"
/> :class="{ 'is-clickable': item.clickable }"
@click="item.onClick && item.onClick()"
>
<datav-statistic <datav-statistic
:value="overview.personNumber" :value="item.value"
title="问责人次" :title="item.title"
style="width: 16.66%"
/> />
</div> </div>
</el-tooltip>
</div>
<v-charts <v-charts
style="height: 450px" style="height: 450px"
:option="option" :option="option"
@ -660,7 +656,7 @@ import { workDynamicColorMapping } from "@/enums/workDynamicColorMapping.js";
import { mapOrgNameMapping } from "@/enums/orgMapping.js"; import { mapOrgNameMapping } from "@/enums/orgMapping.js";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
import { onMounted } from "vue"; import { computed, onMounted } from "vue";
import {getListData,getNegativePageByQuery} from "@/api/superviseReport/superviseReport"; import {getListData,getNegativePageByQuery} from "@/api/superviseReport/superviseReport";
import {timeFormat,formatTimeText, getDictLable, getInvolveProblem} from "@/utils/util"; import {timeFormat,formatTimeText, getDictLable, getInvolveProblem} from "@/utils/util";
import {ProcessingStatus} from "@/enums/flowEnums"; import {ProcessingStatus} from "@/enums/flowEnums";
@ -697,6 +693,46 @@ const overview = ref({
personNumber: 0, personNumber: 0,
completedRate: 0, completedRate: 0,
}); // }); //
const overviewCards = computed(() => [
{
title: "通报问题数",
value: overview.value.problemNumber,
desc: "统计时间范围内纳入现场专项的问题总数(现场督察、专项督察、灵敏感知)。",
formula: "统计方式:时间范围内所有查处问题数量汇总",
},
{
title: "通报期数",
value: overview.value.reportNumber,
desc: "统计时间范围内形成的现场专项通报期数。",
formula: "统计方式:时间范围内通报报告数量汇总",
clickable: true,
onClick: handleShow,
},
{
title: "办理中",
value: overview.value.processingNumber,
desc: "统计当前仍处于办理中的问题数量。",
formula: "统计方式:时间范围内办理状态为办理中的问题数量",
},
{
title: "已办结",
value: overview.value.completedNumber,
desc: "统计当前已经完成办理的问题数量。",
formula: "统计方式:时间范围内办理状态为已办结的问题数量",
},
{
title: "问责单位数",
value: overview.value.departNumber,
desc: "统计已形成有效问责结果的单位数量。",
formula: "统计方式:对已查实问题中的被问责单位去重后汇总",
},
{
title: "问责人次",
value: overview.value.personNumber,
desc: "统计个人问责和领导问责累计形成的人次。",
formula: "统计方式:对已查实问题中的个人和领导问责汇总后形成人次",
},
]);
const leftOverview = ref({}); const leftOverview = ref({});
const fxsjRankOverview = ref({}); // const fxsjRankOverview = ref({}); //
const jsdwRankOverview = ref({}); // const jsdwRankOverview = ref({}); //
@ -1407,6 +1443,39 @@ const getNegativePageFun = async ()=>{
} }
} }
.overview-stat-row {
margin-bottom: 8px;
}
.overview-tip-trigger {
cursor: help;
transition: transform 0.22s ease, filter 0.22s ease;
}
.overview-tip-trigger:hover {
transform: translateY(-3px);
filter: drop-shadow(0 8px 18px rgba(28, 217, 255, 0.18));
}
.overview-tip-trigger.is-clickable {
cursor: pointer;
}
:global(.scene-overview-tooltip) {
border: none !important;
background: transparent !important;
box-shadow: none !important;
padding: 0 !important;
color: inherit !important;
}
:global(.scene-overview-tooltip .el-popper__arrow),
:global(.scene-overview-tooltip .el-popper__arrow::before) {
display: none !important;
background: transparent !important;
border: none !important;
}
:deep() { :deep() {
// //
.tooltip { .tooltip {
@ -1466,6 +1535,70 @@ const getNegativePageFun = async ()=>{
} }
.overview-tip-card {
position: relative;
width: 260px;
padding: 14px 16px;
border: 1px solid rgba(77, 145, 255, 0.72);
border-radius: 14px;
background:
radial-gradient(circle at top right, rgba(41, 126, 255, 0.25), transparent 38%),
linear-gradient(180deg, rgba(3, 13, 74, 0.96) 0%, rgba(2, 26, 112, 0.96) 100%);
box-shadow:
0 16px 40px rgba(0, 10, 48, 0.45),
inset 0 1px 0 rgba(132, 201, 255, 0.24);
backdrop-filter: blur(8px);
}
.overview-tip-card::before {
content: "";
position: absolute;
left: 50%;
top: -12px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 11px solid transparent;
border-right: 11px solid transparent;
border-bottom: 12px solid rgba(77, 145, 255, 0.72);
}
.overview-tip-card::after {
content: "";
position: absolute;
left: 50%;
top: -10px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-bottom: 11px solid rgba(2, 26, 112, 0.98);
}
.overview-tip-title {
font-size: 15px;
font-weight: 700;
color: #f3fbff;
margin-bottom: 8px;
letter-spacing: 0.5px;
}
.overview-tip-desc {
font-size: 13px;
line-height: 1.6;
color: #9fc2ff;
margin-bottom: 10px;
}
.overview-tip-formula {
padding-top: 10px;
border-top: 1px solid rgba(111, 164, 255, 0.24);
font-size: 12px;
line-height: 1.5;
color: #e7f6ff;
}
.test { .test {
width: 95px; width: 95px;
height: 25px; height: 25px;

172
src/views/datav/VideoInsp.vue

@ -83,33 +83,30 @@
<el-col :span="12"> <el-col :span="12">
<datav-date-picker v-model="time" /> <datav-date-picker v-model="time" />
<div class="flex gap-42"> <div class="flex gap-42 overview-stat-row">
<datav-statistic <el-tooltip
:value="overview.total" v-for="item in overviewCards"
title="问题数" :key="item.title"
style="width: 20%" placement="top"
/> :show-after="120"
<datav-statistic :offset="18"
:value="overview.completionProblem" popper-class="video-overview-tooltip"
title="办结问题数" >
style="width: 20%" <template #content>
/> <div class="overview-tip-card">
<datav-statistic <div class="overview-tip-title">{{ item.title }}</div>
:value="overview.discoverProblem" <div class="overview-tip-desc">{{ item.desc }}</div>
title="查实问题数" <div class="overview-tip-formula">{{ item.formula }}</div>
style="width: 20%" </div>
/> </template>
<datav-statistic <div class="overview-tip-trigger" style="width: 20%">
:value="overview.relativeOrg"
title="问责单位数"
style="width: 20%"
/>
<datav-statistic <datav-statistic
:value="overview.relativePer" :value="item.value"
title="问责人次" :title="item.title"
style="width: 20%"
/> />
</div> </div>
</el-tooltip>
</div>
<v-charts <v-charts
style="height: 420px" style="height: 420px"
:option="option" :option="option"
@ -208,7 +205,7 @@ import {
import { listVideoInspection } from "@/api/data/videoInspection"; import { listVideoInspection } from "@/api/data/videoInspection";
import moment from "moment/moment.js"; import moment from "moment/moment.js";
import { mapOrgNameMapping } from "@/enums/orgMapping.js"; import { mapOrgNameMapping } from "@/enums/orgMapping.js";
import { onMounted } from "vue"; import { computed, onMounted } from "vue";
// region // region
const router = useRouter(); const router = useRouter();
@ -227,6 +224,38 @@ const overview = ref({
relativePer: 0, relativePer: 0,
completionRate: 0, completionRate: 0,
}); });
const overviewCards = computed(() => [
{
title: "问题数",
value: overview.value.total,
desc: "统计时间范围内纳入视频督察总览的问题总量。",
formula: "统计方式:时间范围内所有视频督察问题的总数",
},
{
title: "办结问题数",
value: overview.value.completionProblem,
desc: "统计处理状态为已办结的问题数量。",
formula: "统计方式:时间范围内已经办结的问题数量",
},
{
title: "查实问题数",
value: overview.value.discoverProblem,
desc: "统计核查结果为属实或部分属实的问题数量。",
formula: "统计方式:核查认定为属实或部分属实的问题数量",
},
{
title: "问责单位数",
value: overview.value.relativeOrg,
desc: "统计已形成有效问责结果的单位次数。",
formula: "统计方式:对已查实问题中被问责的单位进行去重后汇总",
},
{
title: "问责人次",
value: overview.value.relativePer,
desc: "统计个人问责和领导问责的有效累计人次。",
formula: "统计方式:对已查实问题中的个人和领导问责情况汇总后形成的人次",
},
]);
const mapIconList = ref([ const mapIconList = ref([
{ {
originalName: "浏阳市局", originalName: "浏阳市局",
@ -781,6 +810,20 @@ img {
} }
} }
.overview-stat-row {
margin-bottom: 8px;
}
.overview-tip-trigger {
cursor: help;
transition: transform 0.22s ease, filter 0.22s ease;
}
.overview-tip-trigger:hover {
transform: translateY(-3px);
filter: drop-shadow(0 8px 18px rgba(28, 217, 255, 0.18));
}
.message { .message {
padding: 10px; padding: 10px;
margin-bottom: 10px; margin-bottom: 10px;
@ -832,6 +875,21 @@ img {
} }
} }
:global(.video-overview-tooltip) {
border: none !important;
background: transparent !important;
box-shadow: none !important;
padding: 0 !important;
color: inherit !important;
}
:global(.video-overview-tooltip .el-popper__arrow),
:global(.video-overview-tooltip .el-popper__arrow::before) {
display: none !important;
background: transparent !important;
border: none !important;
}
:deep() { :deep() {
// //
.tooltip { .tooltip {
@ -910,6 +968,70 @@ img {
} }
} }
.overview-tip-card {
position: relative;
width: 260px;
padding: 14px 16px;
border: 1px solid rgba(77, 145, 255, 0.72);
border-radius: 14px;
background:
radial-gradient(circle at top right, rgba(41, 126, 255, 0.25), transparent 38%),
linear-gradient(180deg, rgba(3, 13, 74, 0.96) 0%, rgba(2, 26, 112, 0.96) 100%);
box-shadow:
0 16px 40px rgba(0, 10, 48, 0.45),
inset 0 1px 0 rgba(132, 201, 255, 0.24);
backdrop-filter: blur(8px);
}
.overview-tip-card::before {
content: "";
position: absolute;
left: 50%;
top: -12px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 11px solid transparent;
border-right: 11px solid transparent;
border-bottom: 12px solid rgba(77, 145, 255, 0.72);
}
.overview-tip-card::after {
content: "";
position: absolute;
left: 50%;
top: -10px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-bottom: 11px solid rgba(2, 26, 112, 0.98);
}
.overview-tip-title {
font-size: 15px;
font-weight: 700;
color: #f3fbff;
margin-bottom: 8px;
letter-spacing: 0.5px;
}
.overview-tip-desc {
font-size: 13px;
line-height: 1.6;
color: #9fc2ff;
margin-bottom: 10px;
}
.overview-tip-formula {
padding-top: 10px;
border-top: 1px solid rgba(111, 164, 255, 0.24);
font-size: 12px;
line-height: 1.5;
color: #e7f6ff;
}
.gobal-dropdown-container { .gobal-dropdown-container {
position: absolute; position: absolute;
right: 20px; right: 20px;

Loading…
Cancel
Save