Browse Source

Merge remote-tracking branch 'origin/master'

main
sjh 1 year ago
parent
commit
d528c897dd
  1. 2
      package.json
  2. 15
      src/api/datav.ts
  3. 14
      src/api/sensitivePerception/profileDepart.ts
  4. 22097
      src/assets/data/changsha.json
  5. 155
      src/components/datav/chart-bar-mail.vue
  6. 21
      src/components/datav/chart-bar.vue
  7. 1
      src/components/datav/date-picker.vue
  8. 2
      src/views/data/Ajhc.vue
  9. 9
      src/views/data/Gabxf.vue
  10. 9
      src/views/data/Gjxf.vue
  11. 279
      src/views/datav/MailVisits.vue
  12. 330
      src/views/sensitivePerception/DepartNegative.vue
  13. 342
      src/views/sensitivePerception/PoliceNegative.vue

2
package.json

@ -40,10 +40,12 @@
"lodash": "^4.17.21", "lodash": "^4.17.21",
"moment": "^2.30.1", "moment": "^2.30.1",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"perfect-scrollbar": "^1.5.6",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"typescript": "^5.3.3", "typescript": "^5.3.3",
"vue": "^3.3.11", "vue": "^3.3.11",
"vue-echarts": "^6.6.8", "vue-echarts": "^6.6.8",
"vue-perfect-scrollbar": "^0.2.1",
"vue-router": "^4.2.5" "vue-router": "^4.2.5"
}, },
"devDependencies": { "devDependencies": {

15
src/api/datav.ts

@ -12,10 +12,21 @@ export function getMailVisitsData(times) {
}); });
} }
export function getRightsComfortData(times) { export function getRightsComfortData(times) {
return request.get({ return request.get({
url: `/datav/rightsComfort?beginTime=${times[0]}&endTime=${times[1]}` url: `/datav/rightsComfort?beginTime=${times[0]}&endTime=${times[1]}`
}); });
} }
export function getRecentlyMailTrend(query) {
// alert(days + activeMailTrend.value)
return request.get({
url: `/datav/mailVisits/getRecentlyMailTrendMonth`,
query
});
}

14
src/api/sensitivePerception/profileDepart.ts

@ -0,0 +1,14 @@
import request from "@/api/request";
export function listDepartNegative(query) {
return request.get({
url: `/profile/depart`,
query
});
}
export function getDepartProfile(departId) {
return request.get({
url: `/profile/depart/${departId}`
});
}

22097
src/assets/data/changsha.json

File diff suppressed because one or more lines are too long

155
src/components/datav/chart-bar-mail.vue

@ -0,0 +1,155 @@
<template>
<div class="flex between v-center mb-10">
<span class="bar-title">{{ title }}</span>
<span class="bar-sub-title">{{ subTitle }}</span>
</div>
<el-scrollbar height="300px">
<div>
<div
class="flex v-center bar-item between"
v-for="item in data"
:size="size"
>
<span class="bar-item-name mr-10">{{ item.label }}</span>
<div class="bar-item_content mr-16">
<div
class="bar-item_content-bar"
:style="{
width: `${(item.value / max) * 100}%`,
background: getColor(item.value / max ),
}"
></div>
</div>
<span class="mr-16">{{ item.value }}</span>
<span
class="bar-item_remark text-right"
v-if="item.denominator"
style="min-width: 40px"
>
<span class="text-success">{{ item.numerator }}</span>
<span>/</span>
<span>{{ item.denominator }}</span>
</span>
</div>
</div>
</el-scrollbar>
</template>
<script setup>
import {onMounted} from "vue";
const props = defineProps({
title: {
type: String,
default: "",
},
subTitle: {
type: String,
default: "",
},
data: {
type: Array,
default: [],
},
size: {
type: String,
default: "",
},
unit: {
type: String,
default: "",
},
});
const isMouseOver = ref(false);
const handleMouseEnter = () => {
isMouseOver.value = true;
};
const handleMouseLeave = () => {
isMouseOver.value = false;
};
const max = ref(100);
watch(
() => props.data,
(arr) => {
getMax()
}
);
function getMax() {
if (props.unit !== "%") {
max.value = Math.max(...props.data.map((item) => item.value));
}
}
onMounted(() => {
getMax()
})
function getColor(val) {
if (val > 0.8) {
return "linear-gradient( 270deg, #FB002D 0%, #822232 100%)";
}
if (val >= 0.6) {
return "linear-gradient( 270deg, #FFB90E 0%, #71501D 100%)";
}
return "linear-gradient(270deg, #63e700 0%, #19674c 100%)";
}
</script>
<style lang="scss" scoped>
.bar-title {
font-size: 19px;
}
.bar-sub-title {
color: #597ae9;
font-size: 14px;
}
.bar-item {
font-size: 17px;
height: 32px;
&[size="large"] {
height: 42px;
.bar-item_content {
.bar-item_content-bar {
height: 13px;
}
}
}
.bar-item-name {
width: 19%;
text-align: right;
}
.bar-item_content {
width: 55%;
.bar-item_content-bar {
width: 0;
height: 9px;
background: linear-gradient(270deg, #63e700 0%, #19674c 100%);
box-shadow: 1px 0 0px 0px #020b5f;
transition: width 0.3s;
}
}
.bar-item_remark {
font-size: 14px;
.text-success {
color: #09c700;
}
}
}
</style>

21
src/components/datav/chart-bar.vue

@ -84,14 +84,21 @@ function getColor(val) {
if (props.color instanceof String) { if (props.color instanceof String) {
return props.color; return props.color;
} }
if (props.color instanceof Array) {
if (val > 0.8) { const colors = [...props.color]
return "linear-gradient(270deg, #63e700 0%, #19674c 100%)"; colors.reduce((a, b) => b.percentage - a.percentage)
} console.log(colors)
if (val >= 0.7) { for (let i = 0; i < colors.length; i++) {
return "linear-gradient( 270deg, #FFB90E 0%, #71501D 100%)"; if (val > colors[0].percentage) {
return colors[0].color;
}
}
} }
return "linear-gradient( 270deg, #FB002D 0%, #822232 100%)"; return "linear-gradient(270deg, #63e700 0%, #19674c 100%)";
// if (val >= 0.7) {
// return "linear-gradient( 270deg, #FFB90E 0%, #71501D 100%)";
// }
// return "linear-gradient( 270deg, #FB002D 0%, #822232 100%)";
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

1
src/components/datav/date-picker.vue

@ -12,7 +12,6 @@
:clearable="false" :clearable="false"
@change="handleChange" @change="handleChange"
style="--el-input-bg-color: transparent; box-shadow: none; --el-text-color-regular: #fff; --el-text-color-primary: #fff" style="--el-input-bg-color: transparent; box-shadow: none; --el-text-color-regular: #fff; --el-text-color-primary: #fff"
/> />
</div> </div>
</template> </template>

2
src/views/data/Ajhc.vue

@ -122,7 +122,7 @@
<el-table-column label="业务类别" prop="businessTypeName" /> <el-table-column label="业务类别" prop="businessTypeName" />
<el-table-column label="涉嫌问题" prop="involveProblem" /> <el-table-column label="涉嫌问题" prop="involveProblem" />
<el-table-column label="涉及警种" prop="policeTypeName" /> <el-table-column label="涉及警种" prop="policeTypeName" />
<el-table-column label="涉及单位" prop="involveDepartName" /> <el-table-column label="涉及单位" prop="thirdDepartName" />
<el-table-column <el-table-column
label="具体内容" label="具体内容"
prop="thingDesc" prop="thingDesc"

9
src/views/data/Gabxf.vue

@ -84,14 +84,10 @@
label="投诉渠道" label="投诉渠道"
prop="channelForFilingComplaints" prop="channelForFilingComplaints"
/> />
<el-table-column
label="受理层级"
prop="acceptanceLevel"
show-overflow-tooltip
/>
<el-table-column <el-table-column
label="登记时间" label="登记时间"
width="discoveryTime" prop="discoveryTime"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column <el-table-column
@ -118,7 +114,6 @@
<span v-if="row.massVisits === false"></span> <span v-if="row.massVisits === false"></span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="涉嫌问题" prop="involveProblem" />
<el-table-column <el-table-column
label="被投诉机构" label="被投诉机构"
show-overflow-tooltip show-overflow-tooltip

9
src/views/data/Gjxf.vue

@ -84,14 +84,10 @@
label="投诉渠道" label="投诉渠道"
prop="channelForFilingComplaints" prop="channelForFilingComplaints"
/> />
<el-table-column
label="受理层级"
prop="acceptanceLevel"
show-overflow-tooltip
/>
<el-table-column <el-table-column
label="登记时间" label="登记时间"
width="discoveryTime" prop="discoveryTime"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column <el-table-column
@ -122,7 +118,6 @@
<span v-if="row.massVisits === false"></span> <span v-if="row.massVisits === false"></span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="涉嫌问题" prop="involveProblem" />
<el-table-column <el-table-column
label="被投诉机构" label="被投诉机构"
show-overflow-tooltip show-overflow-tooltip

279
src/views/datav/MailVisits.vue

@ -38,7 +38,6 @@
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<datav-card> <datav-card>
<datav-tabs v-model="activeTab"> <datav-tabs v-model="activeTab">
<datav-tab-item label="分县市局" name="1"> <datav-tab-item label="分县市局" name="1">
@ -47,61 +46,65 @@
type="bottom-button" type="bottom-button"
> >
<datav-tab-item label="初信初访" name="1"> <datav-tab-item label="初信初访" name="1">
<datav-chart-bar <datav-chart-bar-mail
:data="fxsjFirstMailList" :data="fxsjFirstMailList"
size="large" size="large"
:max="11"
/> />
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="重复信访" name="2"> <datav-tab-item label="重复信访" name="2">
<datav-chart-bar <datav-chart-bar-mail
:data="fxsjRepeatMailList" :data="fxsjRepeatMailList"
:max="11" :max="11"
size="large" size="large"
/> />
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="领导接访" name="3"> <datav-tab-item label="领导接访" name="3">
<datav-chart-bar <datav-chart-bar-mail
:data="fxsjLeaderViewMailList" :data="fxsjLeaderViewMailList"
:max="11" :max="11"
size="large" size="large"
/> />
</datav-tab-item> </datav-tab-item>
</datav-tabs> </datav-tabs>
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="部委支队" name="2"> <datav-tab-item label="部委支队" name="2">
<datav-tabs <datav-tabs
v-model="activeTab" v-model="bwzdActiveTab"
type="bottom-button" type="bottom-button"
> >
<datav-tab-item label="初信初访" name="1"> <datav-tab-item label="初信初访" name="1">
<datav-chart-bar <div style="height: 300px; overflow: auto">
:data="bwzdFirstMailList" <datav-chart-bar
size="large" :data="bwzdFirstMailList"
/> size="large"
/>
</div>
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="重复信访" name="2"> <datav-tab-item label="重复信访" name="2">
<datav-chart-bar <div style="height: 300px; overflow: auto">
:data="bwzdRepeatMailList" <datav-chart-bar
:max="11" :data="bwzdRepeatMailList"
size="large" :max="11"
/> size="large"
/>
</div>
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="领导接访" name="3"> <datav-tab-item label="领导接访" name="3">
<datav-chart-bar <div style="height: 300px; overflow: auto">
:data="bwzdLeaderViewMailList" <datav-chart-bar
:max="11" :data="bwzdLeaderViewMailList"
size="large" :max="11"
/> size="large"
/>
</div>
</datav-tab-item> </datav-tab-item>
</datav-tabs> </datav-tabs>
</datav-tab-item> </datav-tab-item>
</datav-tabs> </datav-tabs>
</datav-card> </datav-card>
</datav-card> </datav-card>
<datav-card title="信访问题类型"> <datav-card title="信访问题类型">
@ -112,10 +115,10 @@
/> />
</datav-card> </datav-card>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<div class="datav-col"> <div class="datav-col">
<label for="">统计周期</label> <datav-date-picker v-model="time"/>
<span>2024年01月01日 - 2024年08月30日</span>
</div> </div>
<div class="flex gap-42"> <div class="flex gap-42">
<datav-statistic <datav-statistic
@ -144,19 +147,59 @@
style="width: 20%" style="width: 20%"
/> />
</div> </div>
<v-charts <v-charts
style="height: 450px" style="height: 450px"
:option="option" :option="option"
autoresize autoresize
/> />
<datav-card title="信访趋势"> <datav-card title="信访趋势">
<v-charts <datav-tabs v-model="activeMailTrend" @change="handleTabChange">
style="height: 300px" <datav-tab-item label="国家信访" name="1">
:option="option1" <v-charts
autoresize style="height: 300px"
/> :option="option1"
autoresize
/>
</datav-tab-item>
<datav-tab-item label="公安部信访" name="2">
<v-charts
style="height: 300px"
:option="option1"
autoresize
/>
</datav-tab-item>
<datav-tab-item label="局长信箱" name="3">
<v-charts
style="height: 300px"
:option="option1"
autoresize
/>
</datav-tab-item>
<datav-tab-item label="12337信访" name="4">
<v-charts
style="height: 300px"
:option="option1"
autoresize
/>
</datav-tab-item>
</datav-tabs>
<div class="dropdown-container">
<el-dropdown @command="handleCommand" placement="top-start">
<span class="el-dropdown-link">{{ selectedOption }} </span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="2024">2024</el-dropdown-item>
<el-dropdown-item command="2023">2023</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</datav-card> </datav-card>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<datav-card title="缠访集访情况"> <datav-card title="缠访集访情况">
<el-row class="mb-32"> <el-row class="mb-32">
@ -191,12 +234,6 @@
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<!-- <datav-chart-bar-->
<!-- sub-title="数量"-->
<!-- :data="data3"-->
<!-- :max="7"-->
<!-- />-->
<datav-card> <datav-card>
<datav-tabs v-model="activeTabRight"> <datav-tabs v-model="activeTabRight">
<datav-tab-item label="分县市局" name="1"> <datav-tab-item label="分县市局" name="1">
@ -205,28 +242,27 @@
type="bottom-button" type="bottom-button"
> >
<datav-tab-item label="领导督办" name="1"> <datav-tab-item label="领导督办" name="1">
<datav-chart-bar <datav-chart-bar-mail
:data="fxsjFirstMailList" :data="xx"
size="large" size="large"
/> />
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="缠访闹访" name="2"> <datav-tab-item label="缠访闹访" name="2">
<datav-chart-bar <datav-chart-bar-mail
:data="fxsjEntanglementMailList" :data="xx"
:max="11" :max="11"
size="large" size="large"
/> />
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="群体集访" name="3"> <datav-tab-item label="群体集访" name="3">
<datav-chart-bar <datav-chart-bar-mail
:data="fxsjMassMailList" :data="xx"
:max="11" :max="11"
size="large" size="large"
/> />
</datav-tab-item> </datav-tab-item>
</datav-tabs> </datav-tabs>
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="部委支队" name="2"> <datav-tab-item label="部委支队" name="2">
<datav-tabs <datav-tabs
@ -234,28 +270,27 @@
type="bottom-button" type="bottom-button"
> >
<datav-tab-item label="领导督办" name="1"> <datav-tab-item label="领导督办" name="1">
<datav-chart-bar <datav-chart-bar-mail
:data="fxsjFirstMailList" :data="xx"
size="large" size="large"
/> />
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="缠访闹访" name="2"> <datav-tab-item label="缠访闹访" name="2">
<datav-chart-bar <datav-chart-bar-mail
:data="bwzdEntanglementMailList" :data="xx"
:max="11" :max="11"
size="large" size="large"
/> />
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="群体集访" name="3"> <datav-tab-item label="群体集访" name="3">
<datav-chart-bar <datav-chart-bar-mail
:data="bwzdMassMailList" :data="xx"
:max="11" :max="11"
size="large" size="large"
/> />
</datav-tab-item> </datav-tab-item>
</datav-tabs> </datav-tabs>
</datav-tab-item> </datav-tab-item>
</datav-tabs> </datav-tabs>
</datav-card> </datav-card>
@ -268,6 +303,7 @@
/> />
</datav-card> </datav-card>
</el-col> </el-col>
</el-row> </el-row>
</main> </main>
</div> </div>
@ -279,7 +315,7 @@
import vCharts from "vue-echarts"; import vCharts from "vue-echarts";
import changshaMap from "@/assets/data/changsha.json"; import changshaMap from "@/assets/data/changsha.json";
import * as echarts from "echarts/core"; import * as echarts from "echarts/core";
import {getMailVisitsData} from "@/api/datav"; import {getMailVisitsData, getRecentlyMailTrend} from "@/api/datav";
import moment from "moment/moment.js"; import moment from "moment/moment.js";
echarts.registerMap("changsha", changshaMap); echarts.registerMap("changsha", changshaMap);
@ -327,26 +363,12 @@ const option = {
}, },
], ],
}; };
const option1 = ref({ const option1 = ref({
xAxis: { xAxis: {
type: "category", type: "category",
boundaryGap: false, boundaryGap: false,
data: [ data: [],
"9/10",
"9/11",
"9/12",
"9/13",
"9/14",
"9/15",
"9/16",
"9/17",
"9/18",
"9/19",
"9/20",
"9/21",
"9/22",
"9/23",
],
}, },
yAxis: { yAxis: {
type: "value", type: "value",
@ -357,6 +379,15 @@ const option1 = ref({
}, },
} }
}, },
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#6a7985'
}
}
},
series: [ series: [
{ {
type: "line", type: "line",
@ -380,13 +411,12 @@ const option1 = ref({
}, },
]), ]),
}, },
data: [ data: [],
521, 321, 561, 312, 411, 123, 121, 312, 312, 311,
111, 121, 211, 321,
],
}, },
], ],
}); });
const option2 = { const option2 = {
series: [ series: [
{ {
@ -396,12 +426,12 @@ const option2 = {
color: "#fff", color: "#fff",
}, },
data: [ data: [
{value: 311, name: "慢作为"}, // {value: 311, name: ""},
{value: 735, name: "意见建议"}, // {value: 735, name: ""},
{value: 580, name: "违法违纪违规"}, // {value: 580, name: ""},
{value: 484, name: "乱作为"}, // {value: 484, name: ""},
{value: 300, name: "其他"}, // {value: 300, name: ""},
{value: 300, name: "不作为"}, // {value: 300, name: ""},
], ],
}, },
], ],
@ -415,19 +445,23 @@ const option3 = {
color: "#fff", color: "#fff",
}, },
data: [ data: [
{value: 21, name: "其他"}, // {value: 21, name: ""},
{value: 33, name: "通报批评"}, // {value: 33, name: ""},
{value: 56, name: "责令检查"}, // {value: 56, name: ""},
{value: 31, name: "考核降级"}, // {value: 31, name: ""},
{value: 120, name: "组织处理"}, // {value: 120, name: ""},
{value: 32, name: "党纪处分"}, // {value: 32, name: ""},
], ],
}, },
], ],
}; };
const activeTab = ref("1"); const activeTab = ref("1");
const bwzdActiveTab = ref("1"); // tab
const activeMailTrend = ref("1"); // 访tab
const activeMailTab = ref("1"); const activeMailTab = ref("1");
const activeTabRight = ref("1"); const activeTabRight = ref("1");
const activeMailTabRight = ref("1"); const activeMailTabRight = ref("1");
@ -445,7 +479,6 @@ const overview = ref({
tangleMail: 0, tangleMail: 0,
massMail: 0, massMail: 0,
}); });
// //
const fxsjFirstMailList = ref([]); const fxsjFirstMailList = ref([]);
const fxsjRepeatMailList = ref([]); const fxsjRepeatMailList = ref([]);
@ -457,15 +490,76 @@ const bwzdLeaderViewMailList = ref([]);
// //
const fxsjEntanglementMailList = ref([]); const fxsjEntanglementMailList = ref([]);
const fxsjMassMailList = ref([]); const fxsjMassMailList = ref([]);
// //
const bwzdEntanglementMailList = ref([]); const bwzdEntanglementMailList = ref([]);
const bwzdMassMailList = ref([]); const bwzdMassMailList = ref([]);
const time = ref([ const time = ref([
moment().startOf("year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
/**
* 信访趋势
* @type {Ref<UnwrapRef<string>, UnwrapRef<string> | string>}
*/
const selectedOption = ref('2024');
const shihao= ref(1);
const handleCommand = async (command) => {
selectedOption.value = `${command}`;
const recentlyMailTrend = await getRecentlyMailTrend({
sourcesCode: activeMailTab.value,
year: command,
startTime: time.value[0],
endTime: time.value[1]
}); // 访
// xAxis series
option1.value.xAxis.data = recentlyMailTrend.monthList;
option1.value.series[0].data = recentlyMailTrend.totalList;
};
function initRecentlyMailTrend() {
getRecentlyMailTrend({
sourcesCode: "1",
year: "2024",
startTime: time.value[0],
endTime: time.value[1]
}).then((data) => {
// xAxis series
option1.value.xAxis.data = data.monthList;
option1.value.series[0].data = data.totalList;
});
}
watch(activeMailTrend, async () => {
// console.log("Active Tab: ", activeMailTrend.value);
// console.log("Active Tab Right: ", selectedOption.value);
const recentlyMailTrend = await getRecentlyMailTrend({
sourcesCode: activeMailTrend.value,
year: selectedOption.value,
startTime: time.value[0],
endTime: time.value[1]
});
option1.value.xAxis.data = recentlyMailTrend.monthList;
option1.value.series[0].data = recentlyMailTrend.totalList;
})
/**
* 初始化
*/
let timer;
watch(time, () => {
getData();
// initRecentlyMailTrend()
})
onMounted(() => {
getData();
initRecentlyMailTrend();
// timer = setInterval(() => {
// activeMailTab.value = (parseInt(activeMailTab.value) % 3 + 1).toString();
// console.log("Active Tab: ", activeMailTab.value);
// }, 3000); // 3
});
function getData() { function getData() {
getMailVisitsData(time.value).then((data) => { getMailVisitsData(time.value).then((data) => {
overview.value = data.overview; overview.value = data.overview;
@ -482,16 +576,17 @@ function getData() {
}); });
} }
watch(time, () => {
getData();
})
onMounted(() => {
getData();
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/style/datav.scss"; @import "@/style/datav.scss";
.dropdown-container {
position: absolute;
right: 30px;
top: 65px;
}
</style> </style>

330
src/views/sensitivePerception/DepartNegative.vue

@ -4,24 +4,20 @@
<el-form :label-width="114"> <el-form :label-width="114">
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="单位名称"> <el-form-item label="三级单位">
<el-input <depart-tree-select
placeholder="请输入" v-model="query.departId"
v-model="query.name" :check-strictly="false"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="单位类型"> <el-form-item label="统计时间">
<el-input <date-time-range-picker-ext
placeholder="请输入" v-model="query.crtTime"
v-model="query.six"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6">
<el-form-item label="统计时间"> </el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
<div class="mb-25 flex end"> <div class="mb-25 flex end">
@ -38,56 +34,101 @@
</header> </header>
<div class="table-container"> <div class="table-container">
<el-table :data="list"> <el-table :data="list">
<el-table-column label="单位名称" prop="" /> <el-table-column label="单位名称">
<el-table-column label="主要责任人" prop="" /> <template #default="{ row }">
<el-table-column label="民警人数" prop="" /> <span
<el-table-column label="协辅警人数" prop="" /> >{{ row.parentDepartName }}/{{
<el-table-column label="查实问题涉及人数" prop="" width="180" /> row.departName
}}</span
>
</template>
</el-table-column>
<el-table-column <el-table-column
label="查实问题数" label="民警人数"
prop="departName" prop="policeSize"
width="120" align="center"
width="160"
/>
<el-table-column
label="协辅警人数"
prop="auxSize"
align="center"
width="160"
/> />
<el-table-column <el-table-column
label="风险指数" label="查实问题涉及人数"
prop="fxzs" prop="verifyPoliceSize"
width="120"
align="center" align="center"
width="160"
/>
<el-table-column
label="查实问题数"
prop="verifySize"
align="center"
width="160"
/> />
<el-table-column label="操作" width="160"> <el-table-column label="操作">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="show = true" <el-button
>查看详情</el-button type="primary"
link
@click="handleShowProfile(row)"
>问题画像</el-button
> >
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
<div class="flex end mt-8">
<el-pagination
@size-change="getList"
@current-change="getList"
:current-page="query.current"
:page-sizes="[9, 18, 36]"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total, sizes, prev, pager, next"
:total="total"
v-if="list.length"
>
</el-pagination>
</div>
</div> </div>
<el-dialog title="单位问题画像" v-model="show" width="85vw" top="2vh"> <el-dialog title="单位问题画像" v-model="show" width="85vw" top="2vh">
<header class="flex center v-center gap"> <header class="flex center v-center gap">
<label for="">统计范围</label> <label>统计范围</label>
<div style="width: 320px">
<date-time-range-picker-ext
v-model="query.crtTime"
style="width: 300px"
/>
</div>
<el-button type="primary">查询</el-button> <el-button type="primary">查询</el-button>
</header> </header>
<main> <main v-loading="loading">
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<h5>单位情况</h5> <h5>单位情况</h5>
<div class="row"> <div class="row">
<div class="col col-24"> <div class="col col-24">
<label>单位名称</label> <label>单位名称</label>
<span>{{}}</span> <span>{{ departInfo.name }}</span>
</div> </div>
<div class="col col-24"> <div class="col col-24">
<label>所长</label> <label>所长</label>
<span>{{}}</span> <span>{{ departInfo.mainRole }}</span>
</div> </div>
<div class="col col-24"> <div class="col col-24">
<label>副所长</label> <label>副所长</label>
<span>{{}}</span> <span>
<span
v-for="item in departInfo.deputyRole"
:key="item"
>{{ item }}</span
>
</span>
</div> </div>
</div> </div>
<el-row> <el-row>
@ -95,8 +136,8 @@
<description-pair <description-pair
label1="民警总人数" label1="民警总人数"
label2="问题涉及民警数" label2="问题涉及民警数"
value1="132" :value1="departInfo.policeSize"
value2="21" :value2="departInfo.policeSize"
size="large" size="large"
/> />
</el-col> </el-col>
@ -104,8 +145,8 @@
<description-pair <description-pair
label1="协辅警人数" label1="协辅警人数"
label2="问题涉及协辅警数" label2="问题涉及协辅警数"
value1="132" :value1="departInfo.auxSize"
value2="21" :value2="departInfo.policeSize"
size="large" size="large"
/> />
</el-col> </el-col>
@ -116,7 +157,7 @@
<el-row> <el-row>
<el-col :span="6" class="text-center"> <el-col :span="6" class="text-center">
<div class="text-primary" style="font-size: 34px"> <div class="text-primary" style="font-size: 34px">
51 {{ activeRow.verifySize }}
</div> </div>
<div>问题总数</div> <div>问题总数</div>
</el-col> </el-col>
@ -152,11 +193,25 @@
:width="250" :width="250"
color="#DC6231" color="#DC6231"
> >
<div> <div style="line-height: 64px" class="mt-40">
<span style="">78</span> <span
style="
font-weight: 600;
font-size: 60px;
color: #e87749;
"
>78</span
>
<span style="font-size: 18px; color: #999"
></span
>
</div>
<div style="font-size: 14px" class="mb-10">
分险指标值
</div>
<div style="color: #e87749; font-size: 28px">
中风险
</div> </div>
<div>分险指标值</div>
<div>中风险</div>
</el-progress> </el-progress>
</div> </div>
</el-col> </el-col>
@ -164,40 +219,231 @@
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<h5>问题来源占比</h5> <h5>问题来源占比</h5>
<v-charts
style="height: 320px"
:option="pieOptions"
autoresize
/>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<h5>业务类型占比</h5> <h5>业务类型占比</h5>
<v-charts
style="height: 320px"
:option="pieOptions"
autoresize
/>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<h5>风险问题构成</h5> <h5>风险问题构成</h5>
<v-charts
style="height: 320px"
:option="radarOption"
autoresize
/>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<h5>个人问题排名</h5> <h5>个人问题排名</h5>
<datav-chart-bar :data="barList" :color="colors" />
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<h5>突出问题排名</h5> <h5>突出问题排名</h5>
<datav-chart-bar :data="barList" />
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<h5>单位问题标签</h5> <h5>单位问题标签</h5>
<datav-chart-bar :data="barList" />
</el-col> </el-col>
</el-row> </el-row>
<h5>问题变化趋势</h5> <h5>问题变化趋势</h5>
<v-charts style="height: 320px" :option="barOption" autoresize />
<div></div> <div></div>
<h5>问题清单</h5> <h5>问题清单</h5>
<div></div> <el-table :data="negativeList">
<el-table-column label="发现时间" prop="discoveryTime" />
<el-table-column label="问题来源" prop="problemSources" />
<el-table-column label="业务类别" prop="businessTypeName" />
<el-table-column label="涉及单位" prop="involveDepartName" />
<el-table-column
label="核查情况"
prop="checkStatusName"
width="180"
align="center"
/>
</el-table>
<div class="flex end mt-8">
<el-pagination
@size-change="getNegativeList"
@current-change="getNegativeList"
:current-page="negativeQuery.current"
:page-sizes="[10, 20, 50]"
:page-size="negativeQuery.size"
v-model:current-page="negativeQuery.current"
layout="total, sizes, prev, pager, next"
:total="negativeTotal"
>
</el-pagination>
</div>
</main> </main>
</el-dialog> </el-dialog>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import vCharts from "vue-echarts";
import {
listDepartNegative,
getDepartProfile,
} from "@/api/sensitivePerception/profileDepart";
import { listNegative } from "@/api/work/negative";
import { InspectCase } from "@/enums/dictEnums";
const query = ref({ const query = ref({
current: 1, current: 1,
size: 10, size: 10,
}); });
const list = ref<any[]>([]); const list = ref<any[]>([]);
const total = ref(0);
function getList() {
listDepartNegative(query.value).then((data) => {
list.value = data.records;
total.value = data.total;
});
}
function reset() {
query.value = {
current: 1,
size: 10,
};
getList();
}
onMounted(() => {
getList();
});
const activeRow = ref({});
const show = ref(false);
const departInfo = ref({});
const loading = ref(false);
const negativeQuery = ref({
checkStatusList: [InspectCase.TRUE, InspectCase.TRUE],
});
const negativeList = ref([]);
const negativeTotal = ref(0);
async function handleShowProfile(row) {
activeRow.value = row;
loading.value = true;
show.value = true;
negativeQuery.value.involveDepartId = row.departId;
getNegativeList();
const data = await getDepartProfile(row.departId);
departInfo.value = data.departInfo;
loading.value = false;
}
function getNegativeList() {
listNegative(negativeQuery.value).then((data) => {
negativeList.value = data.records;
negativeTotal.value = data.total;
});
}
const colors = [
{ color: "#f56c6c", percentage: 20 },
{ color: "#e6a23c", percentage: 40 },
{ color: "#5cb87a", percentage: 60 },
{ color: "#1989fa", percentage: 80 },
{ color: "#6f7ad3", percentage: 100 },
];
const barList = [
{
label: "张三",
value: 67,
},
{
label: "李四",
value: 80,
},
{
label: "王五",
value: 40,
},
{
label: "王五",
value: 40,
},
{
label: "王五",
value: 10,
},
];
const pieOptions = computed(() => {
return {
series: [
{
type: "pie",
radius: ["40%", "70%"],
data: [
{ value: 311, name: "慢作为" },
{ value: 735, name: "意见建议" },
{ value: 580, name: "违法违纪违规" },
{ value: 484, name: "乱作为" },
{ value: 300, name: "其他" },
{ value: 300, name: "不作为" },
],
},
],
};
});
const radarOption = {
radar: {
// shape: 'circle',
indicator: [
{ name: "内部管理", max: 6500 },
{ name: "涉及监督", max: 6500 },
{ name: "记录作风", max: 30000 },
{ name: "警保卫工作", max: 38000 },
{ name: "执法办案", max: 52000 },
{ name: "专项工作", max: 25000 },
],
},
series: [
{
name: "Budget vs spending",
type: "radar",
data: [
{
value: [4200, 3000, 20000, 35000, 50000, 18000],
},
],
},
],
};
const show = ref(true); const barOption = {
xAxis: {
type: "category",
data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
},
yAxis: {
type: "value",
},
series: [
{
data: [120, 200, 150, 80, 70, 110, 130],
type: "bar",
},
],
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>

342
src/views/sensitivePerception/PoliceNegative.vue

@ -0,0 +1,342 @@
<template>
<div class="container">
<header>
<el-form :label-width="114">
<el-row>
<el-col :span="6">
<el-form-item label="所在单位">
<depart-tree-select
v-model="query.departId"
:check-strictly="false"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="统计时间">
<date-time-range-picker-ext
v-model="query.crtTime"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="mb-25 flex end">
<div>
<el-button type="primary" @click="getList">
<template #icon>
<icon name="el-icon-Search" />
</template>
查询</el-button
>
<el-button @click="reset">重置</el-button>
</div>
</div>
</header>
<div class="table-container">
<el-table :data="list">
<el-table-column label="姓名" prop="name" />
<el-table-column label="性别" />
<el-table-column label="职务" prop="" />
<el-table-column label="警号" prop="empNo" />
<el-table-column label="任职年限" prop="" />
<el-table-column label="单位名称" prop="policeSize" />
<el-table-column
label="查实问题数"
prop="verifySize"
width="120"
/>
<el-table-column label="操作" width="160">
<template #default="{ row }">
<el-button type="primary" link @click="show = true"
>问题画像</el-button
>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getList"
@current-change="getList"
:current-page="query.current"
:page-sizes="[9, 18, 36]"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total, sizes, prev, pager, next"
:total="total"
v-if="list.length"
>
</el-pagination>
</div>
</div>
<el-dialog title="单位问题画像" v-model="show" width="85vw" top="2vh">
<header class="flex center v-center gap">
<label>统计范围</label>
<div style="width: 320px">
<date-time-range-picker-ext v-model="query.crtTime" style="width: 300px" />
</div>
<el-button type="primary">查询</el-button>
</header>
<main>
<el-row>
<el-col :span="8">
<h5>单位情况</h5>
<div class="row">
<div class="col col-24">
<label>单位名称</label>
<span>{{}}</span>
</div>
<div class="col col-24">
<label>所长</label>
<span>{{}}</span>
</div>
<div class="col col-24">
<label>副所长</label>
<span>{{}}</span>
</div>
</div>
<el-row>
<el-col :span="12">
<description-pair
label1="民警总人数"
label2="问题涉及民警数"
value1="132"
value2="21"
size="large"
/>
</el-col>
<el-col :span="12">
<description-pair
label1="协辅警人数"
label2="问题涉及协辅警数"
value1="132"
value2="21"
size="large"
/>
</el-col>
</el-row>
</el-col>
<el-col :span="8">
<h5>问题情况</h5>
<el-row>
<el-col :span="6" class="text-center">
<div class="text-primary" style="font-size: 34px">
51
</div>
<div>问题总数</div>
</el-col>
<el-col :span="18">
<el-row>
<el-col :span="12">
<description-pair
label1="110接处警量"
label2="问题数"
value1="132"
value2="21"
/>
</el-col>
<el-col :span="12">
<description-pair
label1="执法办案"
label2="问题数"
value1="132"
value2="21"
/>
</el-col>
</el-row>
</el-col>
</el-row>
</el-col>
<el-col :span="8">
<h5>风险指数</h5>
<div class="flex center">
<el-progress
type="dashboard"
:percentage="78"
:stroke-width="16"
:width="250"
color="#DC6231"
>
<div>
<span style="">78</span>
</div>
<div>分险指标值</div>
<div>中风险</div>
</el-progress>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<h5>问题来源占比</h5>
<v-charts
style="height: 320px"
:option="pieOptions"
autoresize
/>
</el-col>
<el-col :span="8">
<h5>业务类型占比</h5>
<v-charts
style="height: 320px"
:option="pieOptions"
autoresize
/>
</el-col>
<el-col :span="8">
<h5>风险问题构成</h5>
<v-charts
style="height: 320px"
:option="radarOption"
autoresize
/>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<h5>个人问题排名</h5>
<datav-chart-bar :data="barList" />
</el-col>
<el-col :span="8">
<h5>突出问题排名</h5>
<datav-chart-bar :data="barList" />
</el-col>
<el-col :span="8">
<h5>单位问题标签</h5>
<datav-chart-bar :data="barList" />
</el-col>
</el-row>
<h5>问题变化趋势</h5>
<v-charts style="height: 320px" :option="barOption" autoresize />
<div></div>
<h5>问题清单</h5>
<el-table>
<el-table-column label="发现时间" prop="" />
<el-table-column label="问题来源" prop="" />
<el-table-column label="业务类别" prop="" />
<el-table-column label="涉及单位" prop="" />
<el-table-column label="是否属实" prop="" width="180" />
<el-table-column
label="完善情况"
prop="departName"
width="120"
/>
<el-table-column
label="最后编辑人"
prop="fxzs"
width="120"
align="center"
/>
</el-table>
</main>
</el-dialog>
</template>
<script lang="ts" setup>
import vCharts from "vue-echarts";
import { listDepartNegative } from "@/api/sensitivePerception/profileDepart";
import { onMounted } from "vue";
const query = ref({
current: 1,
size: 10,
});
const list = ref<any[]>([]);
const total = ref(0);
function getList() {
}
onMounted(() => {
getList();
});
const show = ref(false);
const barList = [
{
label: "张三",
value: 67,
},
{
label: "李四",
value: 80,
},
{
label: "王五",
value: 40,
},
{
label: "王五",
value: 40,
},
{
label: "王五",
value: 10,
},
];
const pieOptions = computed(() => {
return {
series: [
{
type: "pie",
radius: ["40%", "70%"],
data: [
{ value: 311, name: "慢作为" },
{ value: 735, name: "意见建议" },
{ value: 580, name: "违法违纪违规" },
{ value: 484, name: "乱作为" },
{ value: 300, name: "其他" },
{ value: 300, name: "不作为" },
],
},
],
};
});
const radarOption = {
radar: {
// shape: 'circle',
indicator: [
{ name: "内部管理", max: 6500 },
{ name: "涉及监督", max: 6500 },
{ name: "记录作风", max: 30000 },
{ name: "警保卫工作", max: 38000 },
{ name: "执法办案", max: 52000 },
{ name: "专项工作", max: 25000 },
],
},
series: [
{
name: "Budget vs spending",
type: "radar",
data: [
{
value: [4200, 3000, 20000, 35000, 50000, 18000],
},
],
},
],
};
const barOption = {
xAxis: {
type: "category",
data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
},
yAxis: {
type: "value",
},
series: [
{
data: [120, 200, 150, 80, 70, 110, 130],
type: "bar",
},
],
};
</script>
<style lang="scss" scoped>
</style>
Loading…
Cancel
Save