Browse Source

fix:区县总览大屏:1、总览数及地图详情参考市级大屏修改(现场督察、数字督察、案件核查、局长信箱、信访投诉、审计项目),2、其它统计图统一维度; fix:1、大屏名称改“监督管理” ;fix:1、隐藏“办结率” 2、右上角新增“登录客户端”入口,链接参考首页的视频督察 3、视频做轮播效果 4、总览数据参考市局大屏

main
pengwei 6 months ago
parent
commit
9b7ad19a22
  1. 2
      src/components/datav/header.vue
  2. 6
      src/components/datav/statistic.vue
  3. 34
      src/views/datav/Global.vue
  4. 27
      src/views/datav/Jwpy.vue
  5. 25
      src/views/datav/VideoInsp.vue
  6. 105
      src/views/datav/subonedatav/SubOneGlobal.vue
  7. 62
      src/views/datav/subonedatav/SubOneVideoInsp.vue

2
src/components/datav/header.vue

@ -7,7 +7,7 @@
<img :src="isActive ? Img2 : Img1" alt=""/>
</router-link>
<router-link to="/datav/sceneInsp" v-slot="{ isActive }">
<span>督导检查</span>
<span>监督管理</span>
<img :src="isActive ? Img2 : Img1" alt=""/>
</router-link>
<router-link to="/datav/caseVerif" v-slot="{ isActive }">

6
src/components/datav/statistic.vue

@ -28,8 +28,12 @@ const props = defineProps({
});
const value = ref(props.value);
console.log(
value
)
watch(() => props.value, (val) => {
value.value = val;
value.value = val || 0;
})
const outputValue = useTransition(value, {
duration: 1500,

34
src/views/datav/Global.vue

@ -296,31 +296,29 @@ const option = ref({
<div class="tooltip-title">${dataItem.originalName}</div>
<div class="tooltip-content">
<ul class="tooltip-ul" >
<li>问题总数 <span>${dataItem.totalPro}</span></li>
<li>现场督导检查问题 <span>${dataItem.supervisePro}</span></li>
<li>数字督察检查问题<span>${dataItem.numSupervisePro}</span></li>
<li>案件核查问题 <span>${dataItem.caseVerifyPro}</span></li>
<li>信访投诉问题 <span>${dataItem.mailPro}</span></li>
<li>民意感知问题 <span>${dataItem.policePro}</span></li>
<li>审计监督问题 <span>${dataItem.reviewPro}</span></li>
<li>现场督察 <span>${dataItem.supervisePro || 0}</span></li>
<li>数字督察 <span>${dataItem.numSupervisionPro || 0}</span></li>
<li>案件核查<span>${dataItem.caseVerificationPro || 0}</span></li>
<li>局长信箱 <span>${dataItem.mailboxNumber || 0}</span></li>
<li>信访投诉 <span>${dataItem.complaintPro || 0}</span></li>
<li>审计项目 <span>${dataItem.auditPro || 0}</span></li>
</ul>
</div>
</div>`;
} else {
}
else {
return `
<div class="tooltip">
<div class="tooltip-title">${dataItem.originalName}</div>
<div class="tooltip-content">
<ul class="tooltip-ul"">
<li>问题总数 <span>0000</span></li>
<li>现场督导检查问题 <span>0000</span></li>
<li>数字督导检查问题 <span>0000</span></li>
<li>案件核查问题 <span>0000</span></li>
<li>信访投诉问题 <span>0000</span></li>
<li>民意感知问题 <span>0000</span></li>
<li>审计监督问题 <span>0000</span></li>
<ul class="tooltip-ul" >
<li>现场督察 <span>-</span></li>
<li>数字督察 <span>-</span></li>
<li>案件核查<span>-</span></li>
<li>局长信箱 <span>-</span></li>
<li>信访投诉 <span>-</span></li>
<li>审计项目 <span>-</span></li>
</ul>
</div>
</div>`;
}
@ -461,6 +459,7 @@ const getAllGlobalCountData = async (timeValue = time.value) => {
const getGlobalMapData = async (timeValue = time.value) => {
const res = await getGlobalMap(timeValue);
const mappedData = mapOrgNameMapping(res.globalTempMapVoList, "totalPro");
console.log('mappedData',mappedData)
//
const maxItem = mappedData.reduce(
(max, item) => (Number(item.value) > Number(max.value) ? item : max),
@ -470,6 +469,7 @@ const getGlobalMapData = async (timeValue = time.value) => {
const range80Percent = maxItem.value * 0.8; //
globalTempMapVoList.value = mappedData;
option.value.series[0].data = mappedData;
console.log('mappedData',mappedData)
option.value.visualMap.pieces = [
{
gte: 0,

27
src/views/datav/Jwpy.vue

@ -252,6 +252,7 @@
<v-charts
:option="option4"
autoresize
ref="xmxfqk"
/>
</div>
</datav-card>
@ -268,19 +269,22 @@
<script setup>
import vCharts from "vue-echarts";
import changshaMap from "@/assets/data/changsha.json";
import * as echarts from "echarts/core";
import vCharts from "vue-echarts";
import {
GetBMYYBQS, GetCustomOffLineSonPeriodSet,
GetBMYYBQS,
GetCustomOffLineSonPeriodSet,
GetDCQK,
GetDITU,
GetDXFX,
GetGLFW,
GetMyPeriod, GetOffLineStatisticsSetList,
GetMyPeriod,
GetOffLineStatisticsSetList,
GetRCSQQK,
GetZHMYLPM,
GetZRSJXF, qx_get
GetZRSJXF,
qx_get
} from "@/api/screen/jwpy.ts";
import moment from "moment/moment";
import {selectDistribution} from "@/api/datav";
@ -326,13 +330,12 @@ const time = ref([
]);
const getDistributionFun = async()=>{
console.log('---------')
console.log("time",time.value)
const res = await selectDistribution(time.value);
option4.value.series[0].data=res.total;
option4.value.series[1].data=res.processing;
option4.value.series[2].data=res.total;
// option4.value.series[2].data=res.checkStatus;
option4.value.yAxis.data=res.name;
console.log('option4',option4.value)
}
@ -769,8 +772,9 @@ const option4 = ref({
// region
onMounted(async () => {
console.log('--------------')
await getDistributionFun();
console.log('-----end-------')
//
const resYears = await GetMyPeriod();
years.value = resYears.map(item => ({
@ -863,11 +867,11 @@ async function getData() {
]
let groupData =temp.filter(item => item.SetName === "(省)县市考评" || item.SetName === "(省)区");
groupData= filterAndSortObjectsByName(groupData,orgSortArray)
groupData = filterAndSortObjectsByName(groupData,orgSortArray)
tableData2.value=groupData;
// tableData2.value = group2
// tableData3.value = group3
console.log('综合满意度排名.value', tableData1.value)
console.log('综合满意度排名.value', tableData2.value)
});
//
@ -938,8 +942,7 @@ const filterAndSortObjectsByName = (objects, keywords) => {
return keywordIndexMap[keywordA] - keywordIndexMap[keywordB];
};
//
const sortedObjects = filteredObjects.sort(sortFunction);
return sortedObjects;
return filteredObjects.sort(sortFunction);
};
// endregion

25
src/views/datav/VideoInsp.vue

@ -107,12 +107,6 @@
title="问责人次"
style="width: 20%"
/>
<!-- <datav-statistic-->
<!-- :value="overview.completionRate"-->
<!-- value-unit="%"-->
<!-- title="办结率"-->
<!-- style="width: 20%"-->
<!-- />-->
</div>
<v-charts
style="height: 420px"
@ -863,22 +857,21 @@ img {
list-style-type: none; /* 移除默认的小圆点 */
padding: 0;
}
.tooltip-content ul li {
margin-left: 5px;
height: 25px;
color: #597ae9;
font-size: 13px;
display: flex;
justify-content: space-around;
height: 26px;
color: #597AE9;
font-weight: 400;
font-size: 14px;
}
// span
.tooltip-ul span {
display: inline-block;
float: right;
width: 30px;
text-align: right;
margin-right: 15px;
color: #fff;
font-size: 13px;
font-size: 14px;
//text-align: center; /* */
}
/* 小尖角 */

105
src/views/datav/subonedatav/SubOneGlobal.vue

@ -44,39 +44,39 @@
/>
</datav-card>
</el-col>
<el-col :span="12">
<datav-date-picker v-model="time"/>
<div class="flex gap-42">
<datav-statistic
:value="overview.totalPro"
title="问题总数"
style="width: 13.66%; margin-left: 20px"
:value="overviewData.supervisionPro"
:title="`现场督察`"
style="width: 20%;"
/>
<datav-statistic
:value="overview.supervisionPro"
title="督导检查问题"
style="width: 13.66%; margin-left: 30px"
:value="overviewData.numSupervisionPro"
:title="`数字督察`"
style="width: 20%;"
/>
<datav-statistic
:value="overview.caseVerificationPro"
title="案件核查问题"
style="width: 13.66%; margin-left: 30px"
:value="overviewData.caseVerificationPro"
:title="`案件核查`"
style="width: 20%; margin-left: 10px"
/>
<datav-statistic
:value="overview.complaintPro"
title="信访投诉问题"
style="width: 13.66%; margin-left: 30px"
:value="overviewData.mailboxNumber"
:title="`局长信箱`"
style="width: 20%; margin-left: 10px"
/>
<datav-statistic
:value="overview.talkPro"
title="民意感知问题"
style="width: 13.66%; margin-left: 30px"
:value="overviewData.complaintPro"
:title="`信访投诉`"
style="width: 20%; margin-left: 10px"
/>
<datav-statistic
:value="overview.auditPro"
title="审计监督问题"
style="width: 13.66%; margin-left: 10px"
:value="overviewData.auditPro"
:title="`审计项目`"
style="width: 20%; margin-left: 10px"
/>
</div>
<div id="map">
@ -172,15 +172,17 @@ const fxsjlist = ref([]); // 分县市区机构问题排名
const jsdwlist = ref([]); //
const ywzblist = ref([]); //
const wtlxlist = ref([]); //
const tcwtlist = ref([]); //
const overview = ref({
const tcwtlist = ref([]);//
let overviewData = ref({
totalPro: 0,
supervisionPro: 0,
numSupervisionPro:0,
caseVerificationPro: 0,
complaintPro: 0,
talkPro: 0,
auditPro: 0,
}); //
mailboxNumber: 0
}) //
const time = ref([
moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"),
@ -189,7 +191,7 @@ const globalTempMapVoList = ref([]); // 地图临时数据
const currentYear = new Date().getFullYear();
const years = ref([currentYear.toString(), (currentYear - 1).toString(), (currentYear - 2).toString()]); //
const selectedYear = ref('2024'); //
const selectedYear = ref('2025'); //
const colors = [
{
color: "linear-gradient( 270deg, #FB002D 0%, #822232 100%)",
@ -261,19 +263,19 @@ const option = ref({
position: 'bottom',
formatter: function (params) {
const dataItem = globalTempMapVoList.value.find(item => item.name === params.name) || {}; //
// console.log("Data item:", dataItem);
console.log("Data item:", dataItem);
if (dataItem.name === params.name) {
return `
<div class="tooltip">
<div class="tooltip-title">${params.name}</div>
<div class="tooltip-content">
<ul class="tooltip-ul" >
<li>问题总数 <span>${dataItem.totalPro}</span></li>
<li>督导检查问题 <span>${dataItem.supervisePro}</span></li>
<li>案件核查问题 <span>${dataItem.caseVerifyPro}</span></li>
<li>信访投诉问题 <span>${dataItem.mailPro}</span></li>
<li>民意感知问题 <span>${dataItem.policePro}</span></li>
<li>审计监督问题 <span>${dataItem.reviewPro}</span></li>
<li>现场督察 <span>${dataItem.supervisePro || 0}</span></li>
<li>数字督察 <span>${dataItem.numSupervisionPro || 0}</span></li>
<li>案件核查<span>${dataItem.caseVerificationPro || 0}</span></li>
<li>局长信箱 <span>${dataItem.mailboxNumber || 0}</span></li>
<li>信访投诉 <span>${dataItem.complaintPro || 0}</span></li>
<li>审计项目 <span>${dataItem.auditPro || 0}</span></li>
</ul>
</div>
</div>
@ -283,13 +285,13 @@ const option = ref({
<div class="tooltip">
<div class="tooltip-title">${params.name}</div>
<div class="tooltip-content">
<ul class="tooltip-ul"">
<li>问题总数 <span>-</span></li>
<li>督导检查问题 <span>-</span></li>
<li>案件核查问题 <span>-</span></li>
<li>信访投诉问题 <span>-</span></li>
<li>民意感知问题 <span>-</span></li>
<li>审计监督问题 <span>-</span></li>
<ul class="tooltip-ul" >
<li>现场督察 <span>-</span></li>
<li>数字督察 <span>-</span></li>
<li>案件核查<span>-</span></li>
<li>局长信箱 <span>-</span></li>
<li>信访投诉 <span>-</span></li>
<li>审计项目 <span>-</span></li>
</ul>
</div>
</div>
@ -429,11 +431,11 @@ const getOrganizationProRankData = async (departId = currentDepartId, timeValue
}
const getBusinessRateData = async (departId = currentDepartId, timeValue = time.value) => {
const res = await getSubOneBusinessRate(departId, timeValue);
ywzblist.value = res.ywzblist;
ywlxPieOption.value.series[0].data = res.ywzblist;
}
const getAllGlobalCountData = async (departId = currentDepartId, timeValue = time.value) => {
const res = await getSubOneAllCount(departId, timeValue);
overview.value = res.overview;
overviewData.value = res.overview;
}
const getSubOneGlobalMapIcon = async (departId = currentDepartId, timeValue = time.value) => {
const res = await getSubOneGlobalMap(departId, timeValue)
@ -443,10 +445,12 @@ const getSubOneGlobalMapIcon = async (departId = currentDepartId, timeValue = ti
value: item.totalPro,
};
});
const maxItem = mappedData.reduce((max, item) => (Number(item.value) > Number(max.value) ? item : max), mappedData[0]);
const range60Percent = maxItem.value * 0.6 //
const range80Percent = maxItem.value * 0.8 //
globalTempMapVoList.value = mappedData;
console.log('globalTempMapVoList', globalTempMapVoList.value)
option.value.series[0].data = globalTempMapVoList;
option.value.visualMap.pieces = [
{gte: 0, lte: range60Percent, label: "低于最大问题的60%", color: "#4987F6"},
@ -497,11 +501,14 @@ const handleMouseLeave = () => {
}, 3000);
};
//
//todo
const subOneYwlxzbCircularAnimation = () => {
const ywlxzbOptionTemp = subOneYwlxzbOption?.value?.chart;
// ywzblist.value
if (!ywlxzbOptionTemp) return;
const length = ywlxPieOption.value.series[0].data.length;
const randomNum = Math.floor(Math.random() * length);
ywlxzbOptionTemp?.dispatchAction({type: 'downplay', seriesIndex: 0});
ywlxzbOptionTemp?.dispatchAction({type: 'highlight', seriesIndex: 0, dataIndex: randomNum}); //
@ -562,6 +569,7 @@ subOneWtlxPieCircularIntervalId = setInterval(subOneWtlxzbCircularAnimation, 200
onMounted(() => {
getData();
setupEventListeners();
selectedYear.value= currentYear.toString()
});
// endregion
@ -663,8 +671,9 @@ const handleClick = (params) => {
.tooltip-content {
width: 160px;
height: 150px;
background: linear-gradient(180deg, #010457 0%, #031577 100%)
height: 155px;
background: linear-gradient(180deg, #010457 0%, #031577 100%);
}
.tooltip-content ul {
@ -672,23 +681,21 @@ const handleClick = (params) => {
padding-left: 5px;
margin: 0;
}
.tooltip-content ul li {
height: 24px;
display: flex;
justify-content: space-around;
height: 26px;
color: #597AE9;
font-weight: 400;
font-size: 14px;
}
//// span
.tooltip-ul span {
display: inline-block;
float: right;
width: 55px;
color: #fff;
font-size: 14px;
text-align: center; /* 水平居中 */
//text-align: center; /* */
}

62
src/views/datav/subonedatav/SubOneVideoInsp.vue

@ -5,7 +5,7 @@
<main>
<el-row :gutter="16">
<el-col :span="6">
<datav-card title="内部视频">
<datav-card title="内部视频" sub-title="登录客户端" :titleClick="titleClickFun">
<div class="row mt-4 mb-20">
<div class="col col-8">
<label>视频总数</label>
@ -78,8 +78,8 @@
<datav-date-picker v-model="time" />
<div class="flex gap-42">
<datav-statistic
:value="overview.discoverProblem"
title="发现问题数"
:value="overview.total"
title="问题数"
style="width: 20%"
/>
<datav-statistic
@ -88,19 +88,18 @@
style="width: 20%"
/>
<datav-statistic
:value="overview.relativeOrg"
title="涉及单位数"
:value="overview.discoverProblem"
title="查实问题数"
style="width: 20%"
/>
<datav-statistic
:value="overview.relativePer"
title="涉及人数"
:value="overview.relativeOrg"
title="问责单位数"
style="width: 20%"
/>
<datav-statistic
:value="overview.completionRate"
value-unit="%"
title="办结率"
:value="overview.relativePer"
title="问责人次"
style="width: 20%"
/>
</div>
@ -357,11 +356,10 @@ const option = ref({
<div class="tooltip-title">${params.name}</div>
<div class="tooltip-content">
<ul class="tooltip-ul" >
<li>发现问题数 <span>${dataItem.discoverProblem}</span></li>
<li>办结问题数 <span>${dataItem.completionProblem}</span></li>
<li>涉及单位数 <span>${dataItem.relativeOrg}</span></li>
<li>涉及人数 <span>${dataItem.relativePer}</span></li>
<li>办结率 <span>${dataItem.completionRate}%</span></li>
<li>查实问题数 <span>${dataItem.discoverProblem || 0}</span></li>
<li>办结问题数 <span>${dataItem.completionProblem || 0}</span></li>
<li>涉及单位数 <span>${dataItem.relativeOrg || 0}</span></li>
<li>涉及人数 <span>${dataItem.relativePer || 0}</span></li>
</ul>
</div>
</div>`;
@ -370,11 +368,10 @@ const option = ref({
<div class="tooltip-title">${params.name}</div>
<div class="tooltip-content">
<ul class="tooltip-ul"">
<li>发现问题数 <span>-</span></li>
<li>查实问题数 <span>-</span></li>
<li>办结问题数 <span>-</span></li>
<li>涉及单位数 <span>-</span></li>
<li>涉及人数 <span>-</span></li>
<li>办结率 <span>-</span></li>
</ul>
</div>
</div>`;
@ -466,6 +463,10 @@ const getSubOneAllVideoSuperviseCountData = async (departId, timeValue) => {
const res = await getSubOneAllVideoSuperviseCount(departId, timeValue);
overview.value = res.overview;
};
//
const titleClickFun =()=>{
window.open("http://65.47.26.34")
}
const getSubOneVideoSuperviseMapData = async (departId, timeValue) => {
const res = await getSubOneVideoSuperviseMap(departId, timeValue);
const mappedData = res.videoSuperviseMapIconVoList.map((item) => {
@ -724,11 +725,20 @@ onMounted(() => {
})
});
const activeVideoIndex = ref(0);
function handlePlay(item, index) {
activeVideoIndex.value = index;
activeUrl.value = item.videoUrl;
}
//
setInterval(()=>{
activeVideoIndex.value = (parseInt(activeVideoIndex.value) % videos.value.length + 1) || 0
activeUrl.value=videos?.value[parseInt(activeVideoIndex.value) % videos.value.length - 1].videoUrl;
},3000)
const videoInspections = ref([]);
async function getVideoInspection() {
@ -864,20 +874,20 @@ img {
}
.tooltip-content ul li {
margin-left: 5px;
height: 25px;
color: #597ae9;
font-size: 13px;
display: flex;
justify-content: space-around;
height: 26px;
color: #597AE9;
font-weight: 400;
font-size: 14px;
}
// span
.tooltip-ul span {
display: inline-block;
float: right;
width: 30px;
text-align: right;
margin-right: 15px;
color: #fff;
font-size: 13px;
font-size: 14px;
//text-align: center; /* */
}
/* 小尖角 */

Loading…
Cancel
Save