wxc 1 year ago
parent
commit
97e92c6364
  1. 36
      src/api/data/petition12337.ts
  2. 8
      src/api/datav.ts
  3. 189
      src/components/data/distrbute12337.vue
  4. 24
      src/components/datav/header.vue
  5. 1
      src/layout/components/Aside.vue
  6. 96
      src/views/data/Ajhc.vue
  7. 271
      src/views/data/Mail12337.vue
  8. 6
      src/views/datav/AuditSuper.vue
  9. 37
      src/views/datav/CaseVerif.vue
  10. 179
      src/views/datav/MailVisits.vue
  11. 6
      src/views/datav/RightsComfort.vue
  12. 51
      src/views/datav/SceneInsp.vue

36
src/api/data/petition12337.ts

@ -0,0 +1,36 @@
import request from "@/api/request";
export function listPetitionComplaint12337(query) {
return request.get({
url: '/data/petitionComplaint12337',
query
});
}
export function importPetitionComplaint(body) {
return request.post({
url: '/data/petitionComplaint/import',
body
});
}
export function addPetitionComplaint(body) {
return request.post({
url: `/data/petitionComplaint`,
body
});
}
export function delPetitionComplaint12337(id) {
return request.del({
url: `/data/petitionComplaint12337/${id}`
});
}
export function distributePetitionComplaint12337(body) {
return request.post({
url: `/data/petitionComplaint12337/distribute`,
body
});
}

8
src/api/datav.ts

@ -24,9 +24,17 @@ export function getRecentlyMailTrend(query) {
url: `/datav/mailVisits/getRecentlyMailTrendMonth`, url: `/datav/mailVisits/getRecentlyMailTrendMonth`,
query query
}); });
}
export function getRecentlyMailTrend12337(query) {
// alert(days + activeMailTrend.value)
return request.get({
url: `/datav/mailVisits/getRecentlyMailTrendByMonth12337`,
query
});
} }

189
src/components/data/distrbute12337.vue

@ -0,0 +1,189 @@
<template>
<el-dialog title="问题分发" v-model="show" width="80vw" top="5vh">
<header>
<div class="flex v-center end mb-20">
<span class="mr-20"
>
<span class="text-primary">{{ data.length }}</span>
条数据</span
>
</div>
</header>
<div style="min-height: 500px">
<div class="table-container">
<el-table :data="data">
<el-table-column
label="案件编号"
prop="onlyId"
show-overflow-tooltip
/>
<el-table-column
label="受理时间"
prop="discoverTime"
show-overflow-tooltip
/>
<el-table-column
label="问题发生时间"
prop="happenTime"
show-overflow-tooltip
/>
<el-table-column
label="问题来源"
prop="letterSource"
show-overflow-tooltip
/>
<el-table-column
label="投诉人"
prop="name"
width="90"
/>
<el-table-column
label="投诉人电话"
prop="phone"
width="120"
/>
<el-table-column label="业务类别" prop="businessTypeName" />
<el-table-column label="涉嫌问题" prop="involveProblem" />
<el-table-column label="涉及警种" prop="policeTypeName" />
<el-table-column
label="涉及单位"
prop="thirdDepartName"
/>
<el-table-column
label="具体内容"
prop="wjwfProject"
show-overflow-tooltip
/>
<el-table-column label="操作" width="140">
<template #default="{ row }">
<el-button
type="info"
link
@click="handleRemoveDistribute(row)"
>移除</el-button
>
</template>
</el-table-column>
</el-table>
</div>
</div>
<footer class="flex end mt-20">
<el-button
type="primary"
size="large"
@click="handleShowDistributeDialog"
:disabled="data.length === 0"
>确认数据</el-button
>
</footer>
</el-dialog>
<el-dialog title="任务分发" v-model="distributeShow" width="50vw" top="5vh">
<el-form :label-width="120" ref="formRef" :model="form">
<el-form-item
label="办理时限"
prop="timeLimit"
:rules="{
required: true,
message: '请选择办理时限',
}"
>
<time-limit-select
v-model="form.timeLimit"
v-model:maxSignDuration="form.maxSignDuration"
v-model:maxHandleDuration="form.maxHandleDuration"
v-model:maxExtensionDuration="form.maxExtensionDuration"
/>
</el-form-item>
<el-form-item
label="审核流程"
prop="approvalFlow"
:rules="{
required: true,
message: '请选择审核流程',
}"
>
<el-radio-group v-model="form.approvalFlow">
<el-radio
v-for="item in dict.approvalFlow"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel
}}{{ item.remark ? `(${item.remark})` : "" }}</el-radio
>
</el-radio-group>
<div class="tips mt-10">
<p>
三级审核 在问题提交办结时需经过所队>二级机构>市局三级审核通过后方可办结
</p>
<p>
二级审核 在问题提交办结时仅需经过所队>二级机构两级审核通过后即可办结
</p>
</div>
</el-form-item>
</el-form>
<footer class="flex end mt-20">
<el-button type="primary" size="large" @click="handleSubmit"
>确认下发</el-button
>
</footer>
</el-dialog>
</template>
<script setup>
import useCatchStore from "@/stores/modules/catch";
import { distributePetitionComplaint } from "@/api/data/petitionComplaint";
import {distributePetitionComplaint12337} from "@/api/data/petition12337.ts";
const catchStore = useCatchStore();
const dict = catchStore.getDicts(["timeLimit", "approvalFlow"]);
const props = defineProps({
show: {
type: Boolean,
default: false,
},
data: {
type: Array,
default: [],
},
});
const emit = defineEmits(["update:data", "update:show", "update"]);
const show = ref(props.show);
const distributeShow = ref(false);
watch(
() => props.show,
(val) => {
show.value = val;
}
);
watch(show, (val) => {
emit("update:show", val);
});
function handleRemoveDistribute(row) {
let data = [...props.data];
data.splice(props.data.indexOf(row), 1);
emit("update:data", data);
}
const form = ref({});
const formRef = ref();
function handleShowDistributeDialog() {
distributeShow.value = true;
}
async function handleSubmit() {
await formRef.value.validate();
form.value.data = props.data;
await distributePetitionComplaint12337(form.value);
form.value = {};
distributeShow.value = false;
show.value = false;
emit("update");
emit("update:data", []);
}
</script>
<style lang="scss" scoped>
</style>

24
src/components/datav/header.vue

@ -4,19 +4,19 @@
<nav class="flex"> <nav class="flex">
<router-link to="/datav/videoInsp" v-slot="{ isActive }"> <router-link to="/datav/videoInsp" v-slot="{ isActive }">
<span>视频督察</span> <span>视频督察</span>
<img :src="isActive ? Img2 : Img1" alt="" /> <img :src="isActive ? Img2 : Img1" alt=""/>
</router-link> </router-link>
<router-link to="/datav/sceneInsp" v-slot="{ isActive }"> <router-link to="/datav/sceneInsp" v-slot="{ isActive }">
<span>现场督察</span> <span>现场督察</span>
<img :src="isActive ? Img2 : Img1" alt="" /> <img :src="isActive ? Img2 : Img1" alt=""/>
</router-link> </router-link>
<router-link to="/datav/caseVerif" v-slot="{ isActive }"> <router-link to="/datav/caseVerif" v-slot="{ isActive }">
<span>案件核查</span> <span>案件核查</span>
<img :src="isActive ? Img2 : Img1" alt="" /> <img :src="isActive ? Img2 : Img1" alt=""/>
</router-link> </router-link>
<router-link to="/datav/jwpy" v-slot="{ isActive }"> <router-link to="/datav/jwpy" v-slot="{ isActive }">
<span>警务评议</span> <span>警务评议</span>
<img :src="isActive ? Img2 : Img1" alt="" /> <img :src="isActive ? Img2 : Img1" alt=""/>
</router-link> </router-link>
</nav> </nav>
<h1> <h1>
@ -27,19 +27,19 @@
<nav class="flex right"> <nav class="flex right">
<router-link to="/datav/mailVisits" v-slot="{ isActive }"> <router-link to="/datav/mailVisits" v-slot="{ isActive }">
<span>信访投诉</span> <span>信访投诉</span>
<img :src="isActive ? Img2 : Img1" alt="" /> <img :src="isActive ? Img2 : Img1" alt=""/>
</router-link> </router-link>
<router-link to="/datav/rightsComfort" v-slot="{ isActive }"> <router-link to="/datav/rightsComfort" v-slot="{ isActive }">
<span>维权抚慰</span> <span>维权抚慰</span>
<img :src="isActive ? Img2 : Img1" alt="" /> <img :src="isActive ? Img2 : Img1" alt=""/>
</router-link> </router-link>
<router-link to="/datav/auditSuper" v-slot="{ isActive }"> <router-link to="/datav/auditSuper" v-slot="{ isActive }">
<span>审计监督</span> <span>审计监督</span>
<img :src="isActive ? Img2 : Img1" alt="" /> <img :src="isActive ? Img2 : Img1" alt=""/>
</router-link> </router-link>
<router-link to="/datav/lmgz" v-slot="{ isActive }"> <router-link to="/datav/lmgz" v-slot="{ isActive }">
<span>灵敏感知</span> <span>灵敏感知</span>
<img :src="isActive ? Img2 : Img1" alt="" /> <img :src="isActive ? Img2 : Img1" alt=""/>
</router-link> </router-link>
</nav> </nav>
</div> </div>
@ -54,6 +54,7 @@ header {
color: #fff; color: #fff;
margin-bottom: 20px; margin-bottom: 20px;
position: relative; position: relative;
&::before { &::before {
display: block; display: block;
content: ""; content: "";
@ -66,13 +67,16 @@ header {
background-image: url("/imgs/datav/bg-1.png"); background-image: url("/imgs/datav/bg-1.png");
z-index: 0; z-index: 0;
} }
h1 { h1 {
font-family: PangMenZhengDao; font-family: PangMenZhengDao;
font-size: 48px; font-size: 48px;
line-height: 1; line-height: 1;
letter-spacing: 2px; letter-spacing: 2px;
margin: 0; margin: 0;
white-space: nowrap;
} }
nav { nav {
a { a {
color: inherit; color: inherit;
@ -80,13 +84,16 @@ header {
text-align: center; text-align: center;
font-size: 19px; font-size: 19px;
} }
span { span {
display: block; display: block;
} }
img { img {
display: block; display: block;
margin-top: -12px; margin-top: -12px;
} }
&.right { &.right {
img { img {
transform: scaleX(-1); transform: scaleX(-1);
@ -94,6 +101,7 @@ header {
} }
} }
} }
:deep() { :deep() {
a { a {
color: inherit; color: inherit;

1
src/layout/components/Aside.vue

@ -85,7 +85,6 @@ function handleMenuClick(route, index) {
return; return;
} }
} }
const activeSecondMenuName = ref(null); const activeSecondMenuName = ref(null);
function handleSecondMenuClick(route) { function handleSecondMenuClick(route) {
activeSecondMenuName.value = route.name; activeSecondMenuName.value = route.name;

96
src/views/data/Ajhc.vue

@ -19,8 +19,8 @@
style="width: 160px" style="width: 160px"
@change="delete query.responderValue" @change="delete query.responderValue"
> >
<el-option value="name" label="姓名" /> <el-option value="name" label="姓名"/>
<el-option value="phone" label="电话" /> <el-option value="phone" label="电话"/>
</el-select> </el-select>
<el-input <el-input
placeholder="请输入" placeholder="请输入"
@ -57,12 +57,33 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6">
<el-form-item label="是否属实">
<el-select
size="small"
style="width: 146px"
placeholder="核查情况"
clearable
v-model="query.checkStatus"
>
<el-option
v-for="item in dict.inspectCase"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
<div class="mb-25 flex between"> <div class="mb-25 flex between">
<div> <div>
<el-button type="primary" @click="show = true" <el-button type="primary" @click="show = true"
>数据导入</el-button >数据导入
</el-button
> >
<el-badge <el-badge
:value="distributeList.length" :value="distributeList.length"
@ -72,16 +93,18 @@
<el-button <el-button
type="primary" type="primary"
@click="distributeListShow = true" @click="distributeListShow = true"
>问题下发</el-button >问题下发
</el-button
> >
</el-badge> </el-badge>
</div> </div>
<div> <div>
<el-button type="primary" @click="getList"> <el-button type="primary" @click="getList">
<template #icon> <template #icon>
<icon name="el-icon-Search" /> <icon name="el-icon-Search"/>
</template> </template>
查询</el-button 查询
</el-button
> >
<el-button @click="reset">重置</el-button> <el-button @click="reset">重置</el-button>
</div> </div>
@ -119,15 +142,23 @@
prop="contactPhone" prop="contactPhone"
width="120" width="120"
/> />
<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="thirdDepartName" /> <el-table-column label="涉及单位" prop="thirdDepartName"/>
<el-table-column <el-table-column
label="具体内容" label="具体内容"
prop="thingDesc" prop="thingDesc"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column label="是否属实" prop="isReal">
<template v-slot="scope">
<span v-if="scope.row.isReal === 1">属实</span>
<span v-else-if="scope.row.isReal === 2">部分属实</span>
<span v-else-if="scope.row.isReal === 3">不属实</span>
<span v-else>未知状态</span>
</template>
</el-table-column>
<el-table-column label="状态"> <el-table-column label="状态">
<template #default="{ row }"> <template #default="{ row }">
<el-tag>{{ <el-tag>{{
@ -135,7 +166,8 @@
dict.distributionState, dict.distributionState,
row.distributionState row.distributionState
) )
}}</el-tag> }}
</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="200"> <el-table-column label="操作" width="200">
@ -156,19 +188,22 @@
(item) => item.originId === row.originId (item) => item.originId === row.originId
).length === 0 ).length === 0
" "
>加入问题下发</el-button >加入问题下发
</el-button
> >
<el-button <el-button
type="info" type="info"
link link
v-else v-else
@click="handleRemoveDistribute(row)" @click="handleRemoveDistribute(row)"
>移除</el-button >移除
</el-button
> >
</template> </template>
<el-button type="danger" link @click="handleDel(row)" <el-button type="danger" link @click="handleDel(row)"
>删除</el-button >删除
</el-button
> >
</template> </template>
</el-table-column> </el-table-column>
@ -226,7 +261,7 @@
prop="discoveryTime" prop="discoveryTime"
show-overflow-tooltip show-overflow-tooltip
/> />
<!-- <el-table-column label="问题发生时间" prop="happenTime" show-overflow-tooltip />--> <!-- <el-table-column label="问题发生时间" prop="happenTime" show-overflow-tooltip />-->
<el-table-column <el-table-column
label="问题来源" label="问题来源"
prop="problemSources" prop="problemSources"
@ -242,9 +277,9 @@
prop="contactPhone" prop="contactPhone"
width="120" width="120"
/> />
<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 <el-table-column
label="涉及单位" label="涉及单位"
prop="involveDepartName" prop="involveDepartName"
@ -261,7 +296,8 @@
type="info" type="info"
link link
@click="handleRemoveDistribute(row)" @click="handleRemoveDistribute(row)"
>移除</el-button >移除
</el-button
> >
</template> </template>
</el-table-column> </el-table-column>
@ -274,7 +310,8 @@
size="large" size="large"
@click="handleShowDistributeDialog" @click="handleShowDistributeDialog"
:disabled="distributeList.length === 0" :disabled="distributeList.length === 0"
>确认数据</el-button >确认数据
</el-button
> >
</footer> </footer>
</el-dialog> </el-dialog>
@ -309,8 +346,10 @@
v-for="item in dict.approvalFlow" v-for="item in dict.approvalFlow"
:key="item.dictCode" :key="item.dictCode"
:value="item.dictValue" :value="item.dictValue"
>{{ item.dictLabel >{{
}}{{ item.remark ? `(${item.remark})` : "" }}</el-radio item.dictLabel
}}{{ item.remark ? `(${item.remark})` : "" }}
</el-radio
> >
</el-radio-group> </el-radio-group>
<div class="tips mt-10"> <div class="tips mt-10">
@ -328,20 +367,21 @@
type="primary" type="primary"
size="large" size="large"
@click="handleSubmit" @click="handleSubmit"
>确认下发</el-button >确认下发
</el-button
> >
</footer> </footer>
</el-dialog> </el-dialog>
</template> </template>
<script setup> <script setup>
import { BASE_PATH } from "@/api/request"; import {BASE_PATH} from "@/api/request";
import { import {
listCaseVerif, listCaseVerif,
delCaseVerif, delCaseVerif,
distributeCaseVerif, distributeCaseVerif,
} from "@/api/data/caseVerif"; } from "@/api/data/caseVerif";
import { DistributionState } from "@/enums/dictEnums"; import {DistributionState} from "@/enums/dictEnums";
import { getDictLable } from "@/utils/util"; import {getDictLable} from "@/utils/util";
import feedback from "@/utils/feedback"; import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
@ -350,7 +390,7 @@ const catchStore = useCatchStore();
const dict = catchStore.getDicts([ const dict = catchStore.getDicts([
"distributionState", "distributionState",
"timeLimit", "timeLimit",
"approvalFlow" "approvalFlow",
]); ]);
const query = ref({ const query = ref({
@ -361,6 +401,7 @@ const query = ref({
const list = ref([]); const list = ref([]);
const total = ref(0); const total = ref(0);
function getList() { function getList() {
listCaseVerif(query.value).then((data) => { listCaseVerif(query.value).then((data) => {
list.value = data.records; list.value = data.records;
@ -398,6 +439,7 @@ function handleAddDistribute(row) {
function handleShowDistributeDialog() { function handleShowDistributeDialog() {
distributeShow.value = true; distributeShow.value = true;
} }
const form = ref({}); const form = ref({});
const formRef = ref() const formRef = ref()

271
src/views/data/Mail12337.vue

@ -0,0 +1,271 @@
<template>
<div class="container">
<header>
<el-form :label-width="114">
<el-row>
<el-col :span="6">
<el-form-item label="信件编号">
<el-input
placeholder="请输入"
v-model="query.originId"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="投诉人">
<div class="flex gap">
<el-select
v-model="query.responderKey"
style="width: 160px"
@change="delete query.responderValue"
>
<el-option value="name" label="姓名"/>
<el-option value="phone" label="电话"/>
</el-select>
<el-input
placeholder="请输入"
v-model="query.responderValue"
clearable
/>
</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="登记时间">
<date-time-range-picker-ext
v-model="query.discoverTime"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="具体内容">
<el-input
placeholder="请输入"
v-model="query.thingDesc"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="mb-25 flex between">
<div>
<el-button type="primary" @click="show = true"
>数据导入
</el-button
>
<el-badge
:value="distributeList.length"
class="ml-10"
v-if="distributeList.length"
>
<el-button type="primary" @click="distributeShow = true">问题下发</el-button>
</el-badge>
</div>
<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="onlyId"
show-overflow-tooltip
/>
<el-table-column
label="投诉渠道"
prop="letterSource"
/>
<el-table-column
label="登记时间"
prop="discoverTime"
show-overflow-tooltip
/>
<el-table-column
label="投诉人"
prop="name"
width="90"
/>
<el-table-column label="电话" prop="phone"/>
<el-table-column
label="被投诉机构"
show-overflow-tooltip
>
<template #default="{ row }">
<span>{{ row.secondDepartName }}</span>
<span>{{ row.thirdDepartName }}</span>
</template>
</el-table-column>
<el-table-column
label="具体内容"
prop="wjwfProject"
show-overflow-tooltip
/>
<el-table-column label="状态">
<template #default="{ row }">
<el-tag>{{
getDictLable(
dict.distributionState,
row.distributionState
)
}}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template #default="{ row }">
<template
v-if="
row.distributionState ===
DistributionState.UNDISTRIBUTED
"
>
<el-button
type="primary"
link
@click="handleAddDistribute(row)"
v-if="
distributeList.filter(
(item) => item.onlyId === row.onlyId
).length === 0
"
>加入问题下发
</el-button
>
<el-button
type="info"
link
v-else
@click="handleRemoveDistribute(row)"
>移除
</el-button
>
</template>
<el-button type="danger" link @click="handleDel(row)"
>删除
</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="[10, 20, 50]"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total, sizes, prev, pager, next"
:total="total"
>
</el-pagination>
</div>
</div>
<!-- <data-import
v-model="show"
title="公安部信访投诉 数据导入"
:problemSourcesCode="ProblemSources.GABXF"
@close="show = false"
@update="getList"
/>-->
<data-distrbute-12337
v-model:show="distributeShow"
v-model:data="distributeList"
@update="getList"
/>
</template>
<script setup>
import {
delPetitionComplaint,
} from "@/api/data/petitionComplaint";
import {ProblemSources, DistributionState} from "@/enums/dictEnums";
import feedback from "@/utils/feedback";
import {getDictLable} from "@/utils/util";
import useCatchStore from "@/stores/modules/catch";
import {delPetitionComplaint12337, listPetitionComplaint12337} from "@/api/data/petition12337.ts";
const catchStore = useCatchStore();
const dict = catchStore.getDicts([
"distributionState",
"timeLimit",
"approvalFlow",
"distributionFlow",
"distributionState",
]);
const query = ref({
size: 10,
current: 1,
responderKey: "name",
problemSourcesCode: ProblemSources.GABXF,
});
const list = ref([]);
const total = ref(0);
function getList() {
listPetitionComplaint12337(query.value).then((data) => {
list.value = data.records;
total.value = data.total;
});
}
function reset() {
query.value = {
size: 10,
current: 1,
responderKey: "name",
problemSourcesCode: ProblemSources.XF12337,
};
getList();
}
getList();
const show = ref(false);
//
async function handleDel(row) {
await feedback.confirm("确定要删除该数据?");
await delPetitionComplaint12337(row.onlyId);
getList();
}
const distributeShow = ref(false)
const distributeList = ref([])
function handleAddDistribute(row) {
distributeList.value.push(row);
}
function handleRemoveDistribute(row) {
distributeList.value.splice(
distributeList.value.findIndex(
(item) => item.originId === row.originId
),
1
);
}
</script>
<style lang="scss" scoped>
</style>

6
src/views/datav/AuditSuper.vue

@ -339,6 +339,9 @@ const option2 = {
], ],
}, },
], ],
tooltip: {
trigger: "item",
},
}; };
const option3 = { const option3 = {
@ -357,6 +360,9 @@ const option3 = {
], ],
}, },
], ],
tooltip: {
trigger: "item",
},
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

37
src/views/datav/CaseVerif.vue

@ -1,7 +1,7 @@
<template> <template>
<el-scrollbar height="100vh"> <el-scrollbar height="100vh">
<div class="wrapper"> <div class="wrapper">
<datav-header /> <datav-header/>
<main> <main>
<el-row :gutter="16"> <el-row :gutter="16">
<el-col :span="6"> <el-col :span="6">
@ -57,7 +57,7 @@
</datav-card> </datav-card>
</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">
<datav-statistic <datav-statistic
:value="overview.total" :value="overview.total"
@ -147,7 +147,7 @@ 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 moment from "moment"; import moment from "moment";
import { getCaseVerifData } from "@/api/datav"; import {getCaseVerifData} from "@/api/datav";
const time = ref([ const time = ref([
moment().startOf("year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
@ -165,12 +165,12 @@ const overview = ref({
const fxsjBarList = ref([]); const fxsjBarList = ref([]);
const jsdwBarList = ref([]); const jsdwBarList = ref([]);
const zfbaPieList = ref([]); const zfbaPieList = ref([]);
const fwglPieList = ref([]); const fwglPieList = ref([]);
const jjjgPieList = ref([]); const jjjgPieList = ref([]);
const ajlyPieList = ref([]); const ajlyPieList = ref([]);
function getData() { function getData() {
getCaseVerifData(time.value).then((data) => { getCaseVerifData(time.value).then((data) => {
overview.value = data.overview; overview.value = data.overview;
@ -272,9 +272,9 @@ const option = {
type: "piecewise", type: "piecewise",
bottom: 10, bottom: 10,
pieces: [ pieces: [
{ gte: 85, lte: 100, label: "问题数低于500" }, {gte: 85, lte: 100, label: "问题数低于500"},
{ gte: 65, lte: 85, label: "问题数低于1000" }, {gte: 65, lte: 85, label: "问题数低于1000"},
{ gte: 0, lte: 65, label: "问题数低于1000" }, {gte: 0, lte: 65, label: "问题数低于1000"},
], ],
right: 10, // right: 10, //
realtime: false, realtime: false,
@ -335,6 +335,15 @@ const option1 = ref({
}, },
}, },
}, },
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#6a7985'
}
}
},
series: [ series: [
{ {
type: "line", type: "line",
@ -378,13 +387,13 @@ const option4 = {
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: "违反生活纪律"},
{ value: 11, name: "涉嫌违纪违法" }, {value: 11, name: "涉嫌违纪违法"},
], ],
}, },
], ],

179
src/views/datav/MailVisits.vue

@ -117,6 +117,11 @@
:option="option2" :option="option2"
autoresize autoresize
/> />
<div class="flex tab-title flex center mt-20" style="margin-bottom: 20px">
<div class="tab-title-item active">
暂无数据
</div>
</div>
</datav-card> </datav-card>
</el-col> </el-col>
@ -130,6 +135,11 @@
title="信访总件数" title="信访总件数"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic
:value="overview.commissionerMail"
title="局长信箱"
style="width: 20%"
/>
<datav-statistic <datav-statistic
:value="overview.countryMail" :value="overview.countryMail"
title="国家信访" title="国家信访"
@ -140,11 +150,7 @@
title="公安部信访" title="公安部信访"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic
:value="overview.commissionerMail"
title="局长信箱"
style="width: 20%"
/>
<datav-statistic <datav-statistic
:value="overview.numMail" :value="overview.numMail"
title="12337信访" title="12337信访"
@ -162,28 +168,28 @@
<datav-tabs v-model="activeMailTrend" @change="handleTabChange"> <datav-tabs v-model="activeMailTrend" @change="handleTabChange">
<datav-tab-item label="国家信访" name="1"> <datav-tab-item label="国家信访" name="1">
<v-charts <v-charts
style="height: 300px" style="width: 105%; height: 300px;"
:option="option1" :option="option1"
autoresize autoresize
/> />
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="公安部信访" name="2"> <datav-tab-item label="公安部信访" name="2">
<v-charts <v-charts
style="height: 300px" style="width: 105%; height: 300px; "
:option="option1" :option="option1"
autoresize autoresize
/> />
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="局长信箱" name="3"> <datav-tab-item label="局长信箱" name="3">
<v-charts <v-charts
style="height: 300px" style="width: 105%; height: 300px; "
:option="option1" :option="option1"
autoresize autoresize
/> />
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="12337信访" name="4"> <datav-tab-item label="12337信访" name="4">
<v-charts <v-charts
style="height: 300px" style="width: 105%; height: 300px; "
:option="option1" :option="option1"
autoresize autoresize
/> />
@ -252,6 +258,7 @@
size="large" size="large"
/> />
</el-scrollbar> </el-scrollbar>
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="缠访闹访" name="2"> <datav-tab-item label="缠访闹访" name="2">
<el-scrollbar height="300px"> <el-scrollbar height="300px">
@ -317,6 +324,11 @@
:option="option3" :option="option3"
autoresize autoresize
/> />
<div class="flex tab-title flex center mt-20" style="margin-bottom: 20px">
<div class="tab-title-item active">
暂无数据
</div>
</div>
</datav-card> </datav-card>
</el-col> </el-col>
</el-row> </el-row>
@ -331,16 +343,74 @@
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, getRecentlyMailTrend} from "@/api/datav"; import {getMailVisitsData, getRecentlyMailTrend, getRecentlyMailTrend12337} from "@/api/datav";
import moment from "moment/moment.js"; import moment from "moment/moment.js";
/**
* 地图渲染
*/
const getMapDataList = async () => {
try {
mapDataList = await mapCountyData(currentParams);
changsMap();
} catch (error) {}
};
echarts.registerMap("changsha", changshaMap); echarts.registerMap("changsha", changshaMap);
let mapDataList = reactive([
{name: '长沙县', value: 500},
{name: '浏阳市', value: 400},
{name: '开福区', value: 300},
{name: '浏阳市', value: 400},
{name: '望城区', value: 400},
{name: '芙蓉区', value: 400},
{name: '天心区', value: 400},
{name: '雨花区', value: 400},
{name: '岳麓区', value: 400},
{name: '宁乡市', value: 400},
]);
const option = { const option = {
geo: { geo: {
// registerMap'' // registerMap''
map: "changsha", map: "changsha",
itemStyle: {
normal: {
areaColor: "#02215E", //
},
},
},
tooltip: {
show: true,
trigger: "item",
position: "right",
formatter: function (params) {
if (typeof params.data === "undefined") {
console.log(params);
} else {
console.log(params);
return `<div class="tooltip">
<div class="tooltip-title">${params.name}</div>
<div class="tooltip-content">
<ul class="tooltip-ul">
<li>信访总件数 <span>${params.data.todaysum}</span></li>
<li>国家信访 <span>${params.data.allsum}</span>
</li>
<li>公安部信访 <span>${params.data.completed}</span>
</li>
<li>局长信箱 <span>${params.data.completedrate}</span></li>
<li>12337信访 <span>${params.data.resolvedrate}</span></li>
</ul>
</div>
</div>`;
}
},
backgroundColor: "#031577", //
borderColor: "#0A2F86",
borderWidth: 0, // 1
borderRadius: 3, // 3
shadowBlur: 0, // 8
shadowOffsetX: 0, // 0
shadowOffsetY: 0, // 6
}, },
visualMap: { visualMap: {
type: "piecewise", type: "piecewise",
bottom: 10, bottom: 10,
@ -366,18 +436,15 @@ const option = {
type: "map", type: "map",
map: "changsha", map: "changsha",
hoverAnimation: true, hoverAnimation: true,
label: { label: {
show: true, show: true,
color: "white", color: "white",
}, },
itemStyle: { data: mapDataList,
normal: {
areaColor: "#02215E", //
},
},
}, },
], ],
}; };
const option1 = ref({ const option1 = ref({
xAxis: { xAxis: {
@ -512,9 +579,9 @@ const time = ref([
* @type {Ref<UnwrapRef<string>, UnwrapRef<string> | string>} * @type {Ref<UnwrapRef<string>, UnwrapRef<string> | string>}
*/ */
const selectedOption = ref('2024'); const selectedOption = ref('2024');
const shihao = ref(1);
const handleCommand = async (command) => { const handleCommand = async (command) => {
selectedOption.value = `${command}`; selectedOption.value = `${command}`;
if (activeMailTrend.value === "1" || activeMailTrend.value === "2") {
const recentlyMailTrend = await getRecentlyMailTrend({ const recentlyMailTrend = await getRecentlyMailTrend({
sourcesCode: activeMailTab.value, sourcesCode: activeMailTab.value,
year: command, year: command,
@ -524,22 +591,23 @@ const handleCommand = async (command) => {
// xAxis series // xAxis series
option1.value.xAxis.data = recentlyMailTrend.monthList; option1.value.xAxis.data = recentlyMailTrend.monthList;
option1.value.series[0].data = recentlyMailTrend.totalList; option1.value.series[0].data = recentlyMailTrend.totalList;
}; }
function initRecentlyMailTrend() { if (activeMailTrend.value === "3") {
getRecentlyMailTrend({ }
sourcesCode: "1", if (activeMailTrend.value === "4") {
year: "2024", const recentlyMailTrend = await getRecentlyMailTrend12337({
year: selectedOption.value,
startTime: time.value[0], startTime: time.value[0],
endTime: time.value[1] endTime: time.value[1]
}).then((data) => { })
// xAxis series option1.value.xAxis.data = recentlyMailTrend.monthList;
option1.value.xAxis.data = data.monthList; option1.value.series[0].data = recentlyMailTrend.totalList;
option1.value.series[0].data = data.totalList; }
}); };
} // 访tab
watch(activeMailTrend, async () => { watch(activeMailTrend, async () => {
if (activeMailTrend.value <= 2) {
const recentlyMailTrend = await getRecentlyMailTrend({ const recentlyMailTrend = await getRecentlyMailTrend({
sourcesCode: activeMailTrend.value, sourcesCode: activeMailTrend.value,
year: selectedOption.value, year: selectedOption.value,
@ -548,6 +616,21 @@ watch(activeMailTrend, async () => {
}); });
option1.value.xAxis.data = recentlyMailTrend.monthList; option1.value.xAxis.data = recentlyMailTrend.monthList;
option1.value.series[0].data = recentlyMailTrend.totalList; option1.value.series[0].data = recentlyMailTrend.totalList;
}
if (activeMailTrend.value === "3") {
option1.value.xAxis.data = null;
option1.value.series[0].data = null;
}
if (activeMailTrend.value === "4") {
const recentlyMailTrend = await getRecentlyMailTrend12337({
year: selectedOption.value,
startTime: time.value[0],
endTime: time.value[1]
})
option1.value.xAxis.data = recentlyMailTrend.monthList;
option1.value.series[0].data = recentlyMailTrend.totalList;
}
}) })
@ -555,6 +638,21 @@ watch(activeMailTrend, async () => {
* 初始化 * 初始化
*/ */
let timer; let timer;
const currentYear = new Date().getFullYear();
function initRecentlyMailTrend() {
getRecentlyMailTrend({
sourcesCode: "1",
year: currentYear,
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(time, () => { watch(time, () => {
getData(); getData();
// initRecentlyMailTrend() // initRecentlyMailTrend()
@ -586,6 +684,12 @@ function getData() {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/style/datav.scss"; @import "@/style/datav.scss";
@ -595,16 +699,13 @@ function getData() {
top: 65px; top: 65px;
} }
.main { .datav-tab-item {
padding: 0 10px 10px; display: flex;
justify-content: center;
align-items: center;
} }
.main-left,
.main-right {
float: left;
width: 25%;
padding: 0 10px;
height: 90%;
}
</style> </style>

6
src/views/datav/RightsComfort.vue

@ -373,6 +373,9 @@ const option3 = computed(() => {
data: punishmentSituationList.value, data: punishmentSituationList.value,
}, },
], ],
tooltip: {
trigger: "item",
},
}; };
}); });
@ -388,6 +391,9 @@ const option4 = computed(() => {
data: comfortSituationList.value, data: comfortSituationList.value,
}, },
], ],
tooltip: {
trigger: "item",
},
}; };
}); });

51
src/views/datav/SceneInsp.vue

@ -1,7 +1,7 @@
<template> <template>
<el-scrollbar height="100vh"> <el-scrollbar height="100vh">
<div class="wrapper"> <div class="wrapper">
<datav-header /> <datav-header/>
<main> <main>
<el-row :gutter="16"> <el-row :gutter="16">
<el-col :span="6"> <el-col :span="6">
@ -186,14 +186,16 @@
</div> </div>
</div> </div>
<div class="message" type="warning"> <div class="message" type="warning">
<div class="message-title" >督察通报</div> <div class="message-title">督察通报</div>
<div class="message-content">自20******日起****同志担任****单位****职务期间的经济责任履行情况进行审计必要时将追溯至相关年度或延伸审计有关单位</div> <div class="message-content">
自20******日起****同志担任****单位****职务期间的经济责任履行情况进行审计必要时将追溯至相关年度或延伸审计有关单位
</div>
<div class="message-footer flex end"> <div class="message-footer flex end">
<span>2024-09-18 18:00:13</span> <span>2024-09-18 18:00:13</span>
</div> </div>
</div> </div>
<div class="message" type="success"> <div class="message" type="success">
<div class="message-title" >工作简报</div> <div class="message-title">工作简报</div>
<div class="message-content">关于报送2024年第二季度贯彻落实防止干预司法三个规定进展情况的通知</div> <div class="message-content">关于报送2024年第二季度贯彻落实防止干预司法三个规定进展情况的通知</div>
<div class="message-footer flex end"> <div class="message-footer flex end">
<span>2024-09-18 18:00:13</span> <span>2024-09-18 18:00:13</span>
@ -230,9 +232,9 @@ const option = {
type: "piecewise", type: "piecewise",
bottom: 10, bottom: 10,
pieces: [ pieces: [
{ gte: 85, lte: 100, label: "问题数低于500" }, {gte: 85, lte: 100, label: "问题数低于500"},
{ gte: 65, lte: 85, label: "问题数低于1000" }, {gte: 65, lte: 85, label: "问题数低于1000"},
{ gte: 0, lte: 65, label: "问题数低于1000" }, {gte: 0, lte: 65, label: "问题数低于1000"},
], ],
right: 10, // right: 10, //
realtime: false, realtime: false,
@ -295,6 +297,15 @@ const option1 = ref({
}, },
} }
}, },
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
label: {
backgroundColor: '#6a7985'
}
}
},
series: [ series: [
{ {
type: "line", type: "line",
@ -410,6 +421,9 @@ const data2 = [
]; ];
const option2 = { const option2 = {
tooltip: {
trigger: "item",
},
series: [ series: [
{ {
type: "pie", type: "pie",
@ -418,12 +432,12 @@ const option2 = {
color: "#fff", color: "#fff",
}, },
data: [ data: [
{ value: 18.6, name: "执法办案" }, {value: 18.6, name: "执法办案"},
{ value: 15.5, name: "训练执勤" }, {value: 15.5, name: "训练执勤"},
{ value: 1.9, name: "纪律作风" }, {value: 1.9, name: "纪律作风"},
{ value: 2.5, name: "专项工作" }, {value: 2.5, name: "专项工作"},
{ value: 30, name: "整改核查" }, {value: 30, name: "整改核查"},
{ value: 31, name: "其他类型" }, {value: 31, name: "其他类型"},
], ],
}, },
], ],
@ -431,20 +445,25 @@ const option2 = {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/style/datav.scss"; @import "@/style/datav.scss";
.message { .message {
padding: 10px; padding: 10px;
margin-bottom: 10px; margin-bottom: 10px;
background: linear-gradient( 270deg, rgba(16,151,255,0.1) 0%, rgba(0,55,236,0.87) 100%); background: linear-gradient(270deg, rgba(16, 151, 255, 0.1) 0%, rgba(0, 55, 236, 0.87) 100%);
&[type=warning] { &[type=warning] {
background: linear-gradient( 270deg, rgba(255,190,16,0.1) 0%, rgba(236,84,0,0.87) 100%); background: linear-gradient(270deg, rgba(255, 190, 16, 0.1) 0%, rgba(236, 84, 0, 0.87) 100%);
} }
&[type=success] { &[type=success] {
background: linear-gradient( 270deg, rgba(91,216,9,0.14) 0%, #28813D 100%); background: linear-gradient(270deg, rgba(91, 216, 9, 0.14) 0%, #28813D 100%);
} }
.message-title { .message-title {
font-size: 14px; font-size: 14px;
margin-bottom: 10px; margin-bottom: 10px;
} }
.message-content { .message-content {
margin-bottom: 10px; margin-bottom: 10px;
} }

Loading…
Cancel
Save