Browse Source

fix:1、去除领导侧的禁闭关联,调整详情的禁闭查询;2、优化大屏(维权)

main
pengwei 9 months ago
parent
commit
b0b975552b
  1. 10
      src/components/data/gab-replenish.vue
  2. 7
      src/components/data/gj-replenish.vue
  3. 60
      src/components/negative/dialog.vue
  4. 115
      src/components/negative/verify-description.vue
  5. 83
      src/components/negative/verify.vue
  6. 142
      src/views/datav/RightsComfort.vue

10
src/components/data/gab-replenish.vue

@ -16,7 +16,7 @@ const emit=defineEmits(['success','close'])
//
watch(()=>replenishType,()=>{
fileList.value=[]
if (replenishType == 1){
if (replenishType === 1){
dialogTitle.value='公安部信访集访导入'
}else{
dialogTitle.value='公安部信访领导接访导入'
@ -32,12 +32,11 @@ const handleNext = async ()=>{
formData.append("file", fileList.value[fileList.value.length - 1].raw);
loading.value = true;
try {
if(replenishType == 1){
if (replenishType === 1){
await replenishExcelGab(formData);
}else{
await replenishLedaoExcelGab(formData);
}
feedback.msgSuccess("操作成功");
emit("success")
} catch (e) {
@ -83,19 +82,20 @@ const handleNext = async ()=>{
</el-upload>
<div class="mt-20">
<span>文件模板</span>
<a
v-if="replenishType.value===1"
class="link"
:href="`${BASE_PATH}/templates/公安部信访集访导入模板.xlsx`"
target="__blank"
>{{dialogTitle}}模板.xlsx 下载</a
>公安部信访集访导入模板.xlsx 下载</a
>
<a
v-else
class="link"
:href="`${BASE_PATH}/templates/公安部信访领导接访导入模板.xlsx`"
target="__blank"
>{{dialogTitle}}模板.xlsx 下载</a
>公安部信访领导接访模板.xlsx 下载</a
>
</div>
<footer class="flex end mt-20 v-center">

7
src/components/data/gj-replenish.vue

@ -1,6 +1,6 @@
<script setup>
import { BASE_PATH } from "@/api/request";
import {replenishExcelGab} from "@/api/data/petitionComplaint";
import {replenishExcelGab,replenishLedaoExcelGab} from "@/api/data/petitionComplaint";
import feedback from "@/utils/feedback";
let fileList = ref([])
let loading =ref(false)
@ -32,7 +32,12 @@ const handleNext = async ()=>{
formData.append("file", fileList.value[fileList.value.length - 1].raw);
loading.value = true;
try {
if (replenishType === 1){
await replenishExcelGab(formData);
}else{
await replenishLedaoExcelGab(formData);
}
feedback.msgSuccess("操作成功");
emit("success")
} catch (e) {

60
src/components/negative/dialog.vue

@ -483,6 +483,7 @@ function getDetails() {
loading.value = true;
getNegativeDetails(props.id, work?.value.workId).then((data) => {
negative.value = data.negative;
getConfinementData();
flowActions.value = data.flowActions;
actionHistory.value = data.actionHistory;
signReturns.value = data.signReturns;
@ -495,9 +496,66 @@ function getDetails() {
components.value = getComponents(data.flowNode?.flowKey);
//
confirmationCompletionFlag.value = data.confirmationCompletionFlag;
loading.value = false;
});
}
/**
* 禁闭信息入参
* */
let confinementQuery = ref({
current: 1,
size: 100,
departBranch: false
})
const getConfinementData=()=>{
if(negative.value.blames){
for (let item in negative.value.blames){
rtuenConfinementData(negative.value.blames[item],item)
}
}
if(negative.value.blameLeaders){
for (let item in negative.value.blames){
rtuenLeadConfinementData(negative.value.blames[item],item)
}
}
}
/**
* 警员禁闭处罚
* */
function rtuenConfinementData(val,index){
confinementQuery.value.id = val.confinementId
getConfinementListAll(confinementQuery.value).then((res)=>{
const data = res.records;
if(Array.isArray(data)){
negative.value.blames[index].ConfinementData= data[0]
}else{
return null;
}
})
}
/**
* 领导禁闭处罚
* */
async function rtuenLeadConfinementData(val,index){
confinementQuery.value.id = val.leadConfinementId
getConfinementListAll(confinementQuery.value).then((res)=>{
const data = res.records;
if(Array.isArray(data)){
negative.value.blames[index].leadConfinement= data[0]
}else{
return null;
}
})
}
const componentRef = ref([]);
const actionItemRefs = ref({});
@ -646,7 +704,7 @@ watch(
watch(loading, (val) => {
if (!val) {
nextTick(() => {
console.log("nextTick", [leftContainerRef.value.offsetHeight]);
actionHistoryRef.value.style.height = `${
leftContainerRef.value.offsetHeight -
(countdownContainerRef.value?.offsetHeight || 0) -

115
src/components/negative/verify-description.vue

@ -151,21 +151,21 @@
</div>
</div>
<!-- <div class="row">-->
<div class="row">
<!-- <div class="col col-12" v-if="blame.ConfinementData">-->
<!-- <label>禁闭时间</label>-->
<!-- <span >{{blame.ConfinementData.startTime+ " - " + blame.ConfinementData.endTime}}</span>-->
<!-- </div>-->
<!-- <div class="col col-4" v-if="blame.ConfinementData">-->
<!-- <label>禁闭时长</label>-->
<!-- <span >{{blame.ConfinementData.confinementTime}}</span>-->
<!-- </div>-->
<!-- <div class="col col-24" v-if="blame.ConfinementData">-->
<!-- <label>禁闭措施</label>-->
<!-- <span>{{blame.ConfinementData.matter}}</span>-->
<!-- </div>-->
<!-- </div>-->
<div class="col col-12" v-if="blame.ConfinementData">
<label>禁闭时间</label>
<span >{{blame.ConfinementData.startTime+ " - " + blame.ConfinementData.endTime}}</span>
</div>
<div class="col col-4" v-if="blame.ConfinementData">
<label>禁闭时长</label>
<span >{{blame.ConfinementData.confinementTime}}</span>
</div>
<div class="col col-24" v-if="blame.ConfinementData">
<label>禁闭措施</label>
<span>{{blame.ConfinementData.matter}}</span>
</div>
</div>
<div v-perms="['negative:score']">
<div
class="row"
@ -217,20 +217,20 @@
</div>
</div>
<!-- <div class="row" style="background: #f5f5f5" v-if="blame.leadConfinement">-->
<!-- <div class="col col-12"v-if="blames.leadConfinement" >-->
<!-- <label>禁闭时间</label>-->
<!-- <span >{{blames.leadConfinement.startTime+ " - " + blames.leadConfinement.endTime}}</span>-->
<!-- </div>-->
<!-- <div class="col col-4" v-if="blames.leadConfinement">-->
<!-- <label>禁闭时长</label>-->
<!-- <span >{{blames.leadConfinement.confinementTime}}</span>-->
<!-- </div>-->
<!-- <div class="col col-24" v-if="blames.leadConfinement">-->
<!-- <label>禁闭措施</label>-->
<!-- <span>{{blames.leadConfinement.matter}}</span>-->
<!-- </div>-->
<!-- </div>-->
<div class="row" style="background: #f5f5f5" v-if="blame.leadConfinement">
<div class="col col-12"v-if="blame.leadConfinement" >
<label>禁闭时间</label>
<span >{{blame.leadConfinement.startTime+ " - " + blame.leadConfinement.endTime}}</span>
</div>
<div class="col col-4" v-if="blame.leadConfinement">
<label>禁闭时长</label>
<span >{{blame.leadConfinement.confinementTime}}</span>
</div>
<div class="col col-24" v-if="blame.leadConfinement">
<label>禁闭措施</label>
<span>{{blame.leadConfinement.matter}}</span>
</div>
</div>
<div class="row" style="background: #f5f5f5">
@ -333,66 +333,9 @@ const activeNames = ref([
"completed",
]);
let negative = inject("negative");
console.log(negative)
let ConfinementDataList= ref([])
/**
* 禁闭信息入参
* */
let confinementQuery = ref({
current: 1,
size: 100,
departBranch: false
})
/**
* 警员禁闭处罚
* */
function rtuenConfinementData(val){
const data = getConfinementData(val.confinementId)
if(Array.isArray(data)){
val.ConfinementData[index]= data.find(s=>s.id === val.confinementId)
}else{
return null;
}
}
/**
* 领导禁闭处罚
* */
function rtuenLeadConfinementData(val){
const data = getConfinementData(val.leadConfinementId)
if(Array.isArray(data)){
val.leadConfinement[index]= data.find(s=>s.id === val.leadConfinementId)
}else{
return null;
}
}
// watch(()=>negative,()=>{
// console.log('00001010101')
// console.log(negative)
// if(negative.value.blames){
// for (let item in negative.value.blames){
// rtuenConfinementData(item)
// }
// }
//
// if(negative.value.blames){
// for (let item in negative.value.blames){
// rtuenLeadConfinementData(item)
// }
// }
// },{immediate:true,deep:true})
/**
* 获取禁闭信息
* */
async function getConfinementData(val){
confinementQuery.value.id = val
const res = await getConfinementListAll(confinementQuery.value);
return res.records;
}
console.log('negative.value',negative.value)
for (
let i = 0;
i <

83
src/components/negative/verify.vue

@ -950,46 +950,46 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="禁闭关联">
<el-select
filterable
remote
:remote-method="fileConfinement"
v-model="item.leadConfinementId"
popper-class="widthClass" >
<template #header>
<el-row>
<el-col :span="2">姓名</el-col>
<el-col :span="2">警号</el-col>
<el-col :span="3">部门</el-col>
<el-col :span="8">事由</el-col>
<el-col :span="4">禁闭时间</el-col>
</el-row>
</template>
<el-option v-for="(val,key) in confinementOpens" :key="key" :label="val.matter" :value="val.id">
<el-row>
<el-col :span="2">{{ val.name }}</el-col>
<el-col :span="2">{{ val.empNo }}</el-col>
<el-col :span="3">
<div class="flex gap-4">
<span>{{ val.departShortName ||'/' }}</span>
</div>
</el-col>
<el-col :span="8">
<el-tooltip :content="val.matter" placement="top">
<el-text truncated> {{val.matter}}</el-text>
</el-tooltip>
</el-col>
<el-col :span="4">
{{val.startTime + "-" +val.endTime}}
</el-col>
</el-row>
</el-option>
<!-- <el-col :span="24">-->
<!-- <el-form-item label="禁闭关联">-->
<!-- <el-select-->
<!-- filterable-->
<!-- remote-->
<!-- :remote-method="fileConfinement"-->
<!-- v-model="item.leadConfinementId"-->
<!-- popper-class="widthClass" >-->
<!-- <template #header>-->
<!-- <el-row>-->
<!-- <el-col :span="2">姓名</el-col>-->
<!-- <el-col :span="2">警号</el-col>-->
<!-- <el-col :span="3">部门</el-col>-->
<!-- <el-col :span="8">事由</el-col>-->
<!-- <el-col :span="4">禁闭时间</el-col>-->
<!-- </el-row>-->
<!-- </template>-->
<!-- <el-option v-for="(val,key) in confinementOpens" :key="key" :label="val.matter" :value="val.id">-->
<!-- <el-row>-->
<!-- <el-col :span="2">{{ val.name }}</el-col>-->
<!-- <el-col :span="2">{{ val.empNo }}</el-col>-->
<!-- <el-col :span="3">-->
<!-- <div class="flex gap-4">-->
<!-- <span>{{ val.departShortName ||'/' }}</span>-->
<!-- </div>-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-tooltip :content="val.matter" placement="top">-->
<!-- <el-text truncated> {{val.matter}}</el-text>-->
<!-- </el-tooltip>-->
<!-- </el-col>-->
<!-- <el-col :span="4">-->
<!-- {{val.startTime + "-" +val.endTime}}-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- </el-option>-->
</el-select>
</el-form-item>
</el-col>
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col
:span="12"
v-if="item.leadHandleResultCode?.includes('11')"
@ -1663,11 +1663,13 @@ const fileConfinement = async (query)=>{
departBranch: false
}
if(query){
confinementQuery.value.id = query
confinementQuery.value.name = query
confinementQuery.value.empNo = query
}
const data =await getConfinementListAll(confinementQuery.value);
confinementOpens.value = reduceMerge(confinementOpens.value.concat(data.records));
console.log('data',data)
confinementOpens.value = data.records;
}
@ -1716,6 +1718,7 @@ async function getFormData() {
visitingLeaderEmpNo: negative.value.visitingLeaderEmpNo
};
if(negative.value.blames){
console.log('-----cs-----')
negative.value.blames.forEach((item)=>{
fileConfinement(item.confinementId)
})

142
src/views/datav/RightsComfort.vue

@ -9,6 +9,7 @@
<datav-tabs v-model="activeTab">
<datav-tab-item label="维权案件情况" name="1">
<datav-tabs
ref="firstAndRepeat"
v-model="activeMailTab"
type="bottom-button"
title="案件数"
@ -68,7 +69,7 @@
<datav-card title="案件类别占比">
<datav-tabs
v-model="activeMailTab"
v-model="activeMailTabCase"
type="bottom-button"
>
<datav-tab-item label="刑事案件" name="1">
@ -151,17 +152,17 @@
<datav-card title="民辅警受伤情况" sub-title="人数">
<datav-tabs
v-model="activeMailTab"
v-model="comfortInjuryActiveMailTab"
type="bottom-button"
>
<datav-tab-item label="受伤人数" name="1">
<v-charts
style="height: 310px;"
:option="comfortPoliceInjurySituation"
autoresize
/>
</datav-tab-item>
<datav-tab-item label="受伤类別" name="2">
<!-- <datav-tab-item label="受伤人数" name="1">-->
<!-- <v-charts-->
<!-- style="height: 310px;"-->
<!-- :option="comfortPoliceInjurySituation"-->
<!-- autoresize-->
<!-- />-->
<!-- </datav-tab-item>-->
<datav-tab-item label="受伤类別" name="1">
<v-charts
style="height: 310px;"
:option="comfortInjuryCategory"
@ -174,7 +175,7 @@
<datav-card title="发案情况占比">
<datav-tabs
v-model="activeMailTab"
v-model="activeMailTabAriseCase"
type="bottom-button"
>
<datav-tab-item label="发案环节" name="1">
@ -240,7 +241,40 @@ const overview = ref({
comfortPersonNumber: 0,
comfortMoney: 0
})
//
const activeMailTab = ref("1")
//()
const activeMailTabCase = ref("1")
//()
const activeMailTabAriseCase = ref("1")
//
const comfortInjuryActiveMailTab = ref("1")
/**
* //
* 切换动画
* */
let activeMailTabIntervalId;
const activeMailTabRepeatAnimation = () => {
activeMailTab.value = (parseInt(activeMailTab.value) % 2 + 1).toString();
};
activeMailTabIntervalId = setInterval(activeMailTabRepeatAnimation, 3000);
/**
* 绑定自动事件
* */
let firstAndRepeat =ref(null)
const activeMailTabAnimationStop = () => {
const temp = firstAndRepeat.value.$el;
temp.addEventListener('mouseenter', () => {
clearInterval(activeMailTabIntervalId)
});
temp.addEventListener('mouseleave', () => {
activeMailTabIntervalId = setInterval(activeMailTabRepeatAnimation, 3000);
});
}
const countyRightsBarList = ref([
{
label: "岳麓分局",
@ -349,18 +383,27 @@ const comfortInjuryCategory = ref(
);
//////////////////////////////////////////////////////////////////////////////////////////////////
function getData() {
getRightsComfortData(time.value).then(data => {
overview.value.rightsNumber = data.rightsNumber
overview.value.victimNumber = data.victimNumber
overview.value.hitPersonNumber = data.hitPersonNumber
overview.value.comfortPersonNumber = data.comfortPersonNumber
overview.value.comfortMoney = data.comfortMoney
countyComfortMoneyBarList.value = data.countyComfortMoneyBarList;
bureauComfortMoneyBarList.value = data.bureauComfortMoneyBarList;
punishmentSituationOption.value.series[0].data = data.punishmentSituation
comfortPoliceInjurySituation.value.series[0].data = data.comfortPoliceInjurySituation
comfortInjuryCategory.value.series[0].data = data.comfortInjuryCategory
countyRightsBarList.value = data.countyRightsBarList;
bureauRightsBarList.value=data.bureauRightsBarList;
xsajCaseTypeOption.value.series[0].data = data.crownCaseBarList;
xzajCaseTypeOption.value.series[0].data = data.administrativeCaseList;
})
getCaseAriseSituationRateList(time.value)
getMapData(time.value)
}
watch(time, () => {
@ -376,6 +419,7 @@ let globalTempMapVoList = ref([]);
//
const getMapData = async (timeValue) => {
const res = await getComfortMapIcon(timeValue);
console.log('res',res)
const mappedData = res.comfortMapVoList?.map(item => {
let name;
switch (item.name) {
@ -425,6 +469,7 @@ const getMapData = async (timeValue) => {
const avg = total / mappedData.length; //
const range30Percent = avg * 0.3 //
option.value.series[0].data = mappedData;
option.value.visualMap.pieces = [
{gte: 0, lte: avg - range30Percent, label: "低于平均问题30%", color: "#4987F6"},
{gte: avg - range30Percent, lte: avg + range30Percent + 0.1, label: `平均问题上下浮动30%内`, color: "#F6A149"},
@ -464,7 +509,7 @@ const option = ref({
tooltip: {
trigger: 'item',
formatter: function (params) {
console.log(params)
console.log('---------123e123------',params)
const dataItem = globalTempMapVoList.value.find(item => item.name.includes(params.name.substring(0, 2)));
if (dataItem) {
return `
@ -472,17 +517,17 @@ const option = ref({
<div class="tooltip-title">${dataItem.name}</div>
<div class="tooltip-content">
<ul class="tooltip-ul" >
<li>维权案件总数 <span>${dataItem.totalCase}</span></li>
<li>受侵害人数 <span>${dataItem.victimPer}</span></li>
<li>抚慰人数 <span>${dataItem.comfortPer}</span></li>
<li>打击处理人数 <span>${dataItem.hitPro}</span></li>
<li>抚慰金额 <span>${dataItem.comfortMon}</span></li>
<li>维权案件总数 <span>${dataItem.rightsNumber }</span></li>
<li>受侵害人数 <span>${dataItem.victimNumber}</span></li>
<li>抚慰人数 <span>${dataItem.comfortPersonNumber}</span></li>
<li>打击处理人数 <span>${dataItem.hitPersonNumber}</span></li>
<li>抚慰金额 <span>${dataItem.comfortMoney}</span></li>
</ul>
</div>
</div>`;
} else {
return `<div class="tooltip">
<div class="tooltip-title">${dataItem.name}</div>
<div class="tooltip-title">${dataItem?dataItem.name:'-'}</div>
<div class="tooltip-content">
<ul class="tooltip-ul"">
<li>维权案件总数 <span>-</span></li>
@ -546,10 +591,7 @@ const xsajCaseTypeOption = ref({
color: "#fff",
},
data: [
{value: 32, name: "故意伤害"},
{value: 42, name: "袭警罪"},
{value: 12, name: "寻衅滋事"},
{value: 28, name: "妨碍公务"}
],
},
],
@ -565,11 +607,11 @@ const xzajCaseTypeOption = ref({
label: {
color: "#fff",
},
tooltip: {
trigger: "item",
},
data: [
{value: 2, name: "故意伤害"},
{value: 42, name: "袭警罪"},
{value: 2, name: "寻衅滋事"},
{value: 28, name: "妨碍公务"}
],
},
],
@ -591,9 +633,7 @@ const hurtNumOption = ref({
trigger: "item",
},
data: [
{value: 68, name: "民警"},
{value: 50, name: "辅警"},
{value: 3, name: "协警"},
],
},
],
@ -613,9 +653,7 @@ const hurtTypeOption = ref({
trigger: "item",
},
data: [
{value: 68, name: "民警"},
{value: 250, name: "辅警"},
{value: 3, name: "协警"},
],
},
@ -633,14 +671,7 @@ const ariseCaseLinkOption = ref({
color: "#fff",
},
data: [
{value: 127, name: "110警情"},
{value: 32, name: "执勤处室"},
{value: 2, name: "组织调解"},
{value: 3, name: "传唤抓捕"},
{value: 2, name: "安保维稳"},
{value: 2, name: "网络侵权"},
{value: 2, name: "医闹纠纷"},
{value: 1, name: "其它"},
],
},
],
@ -657,14 +688,7 @@ const ariseCasePoliceOption = ref({
color: "#fff",
},
data: [
{value: 127, name: "110警情"},
{value: 132, name: "执勤处室"},
{value: 222, name: "组织调解"},
{value: 332, name: "传唤抓捕"},
{value: 2, name: "安保维稳"},
{value: 276, name: "网络侵权"},
{value: 492, name: "医闹纠纷"},
{value: 199, name: "其它"},
],
},
],
@ -681,14 +705,7 @@ const ariseCaseORgOption = ref({
color: "#fff",
},
data: [
{value: 17, name: "110警情"},
{value: 322, name: "执勤处室"},
{value: 234, name: "组织调解"},
{value: 343, name: "传唤抓捕"},
{value: 22, name: "安保维稳"},
{value: 2, name: "网络侵权"},
{value: 2, name: "医闹纠纷"},
{value: 1, name: "其它"},
],
},
],
@ -758,21 +775,20 @@ const colors = [
}
.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; /* */
}

Loading…
Cancel
Save