This commit is contained in:
lcw
2026-02-05 10:47:01 +08:00
33 changed files with 1273 additions and 444 deletions

View File

@ -133,7 +133,6 @@ onBeforeUnmount(() => {
}); });
// 带样式的下载方法 // 带样式的下载方法
const downloadWithStyles = () => { const downloadWithStyles = () => {
const wordDocument = ` const wordDocument = `
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" > <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" >
<head> <head>

View File

@ -732,6 +732,15 @@ export const publicRoutes = [
// } // }
// }, // },
{
path: "/permissionApply",
name: "permissionApply",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/permissionApply/index"),
meta: {
title: "权限申请",
icon: "article-create"
}
},
{ {
path: "/JobAppraisal", path: "/JobAppraisal",
name: "JobAppraisal", name: "JobAppraisal",

View File

@ -173,20 +173,18 @@ const pageData = reactive({
}, },
controlsWidth: 280, controlsWidth: 280,
tableColumn: [ tableColumn: [
{ label: "群体名称", prop: "qtMc", width: 150 }, { label: "群体名称", prop: "qtMc" },
{ label: "群体类别", prop: "qtLb", showSolt: true, width: 150 }, { label: "群体类别", prop: "qtLb", showSolt: true },
{ label: "风险等级", prop: "qtFxdj", showSolt: true, width: 150 }, { label: "风险等级", prop: "qtFxdj", showSolt: true },
{ label: "背景资料", prop: "qtBjzl", width: 150 }, // { label: "背景资料", prop: "qtBjzl" },
{ label: "背景信息", prop: "bgxx", showSolt: true, width: 150 }, { label: "背景信息", prop: "bgxx", showSolt: true },
{ label: "管辖单位", prop: "gxSsdwmc", width: 150 }, { label: "管辖单位", prop: "gxSsdwmc" },
{ label: "列控原因", prop: "zdrLkyy", width: 150 }, { label: "列控原因", prop: "zdrLkyy" },
{ label: "开始时间", prop: "zdrRkkssj", width: 150 }, { label: "开始时间", prop: "zdrRkkssj" },
{ label: "截至时间", prop: "zdrRkjssj", width: 150 }, { label: "截至时间", prop: "zdrRkjssj" },
{ label: "稳控人数", prop: "zdryList", showSolt: true, width: 150 }, { label: "稳控人数", prop: "zdryList", showSolt: true },
{ label: "状态", prop: "qtZt", showSolt: true, width: 150 }, { label: "状态", prop: "qtZt", showSolt: true },
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true, width: 400 }, { label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true, },
{ label: "创建单位", prop: "xtCjbmmc", width: 150 },
{ label: "创建时间", prop: "xtCjsj", width: 150 },
] ]
}); });

View File

@ -0,0 +1,232 @@
<template>
<div class="inforReport">
<el-dialog :close-on-click-modal="false" :show-close="false" title="信息上报" v-model="visible" width="50%" top="5vh">
<div class="cntBox">
<Toolbar
style="border-bottom: 1px solid #ccc"
:editor="editorRef"
:defaultConfig="toolbarConfig"
:mode="mode"
/>
<Editor
style="height: 67vh; overflow-y: hidden;"
v-model="valueHtml"
:defaultConfig="editorConfig"
:mode="mode"
@onCreated="handleCreated"
@onChange="handChange"
/>
</div>
<div class="tc mt10">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="downloadWithStyles">下载</el-button>
</div>
</el-dialog>
</div>
</template>
<script setup>
import { connectSSEWithPost } from '@/utils/sse.js'
import { timeValidate } from '@/utils/tools'
import { getItem } from "@/utils/storage";
import "@wangeditor/editor/dist/css/style.css";
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import { ref, shallowRef, computed, onBeforeUnmount, onMounted, watch } from "vue";
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
data: {
type: Array,
default: () => []
}
})
const baseInfo = {
ssbm:getItem('deptId') ? getItem("deptId")[0].deptName : '',
time:timeValidate(null,'ymd')
}
const emit = defineEmits(['update:modelValue'])
const visible = computed({
get: () => props.modelValue,
set: (val) => emit('update:modelValue', val)
})
// 编辑器实例,必须用 shallowRef
const editorRef = shallowRef()
const valueHtml = ref('')// 内容 HTML
const mode = 'default'
const toolbarConfig = {}
const editorConfig = { placeholder: '请输入内容...' }
// 带样式的下载方法
const downloadWithStyles = () => {
const wordDocument = `
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>富文本导出</title>
<style>
/* 应用两端对齐样式 */
body {
text-align: justify;
text-justify: inter-character; /* 中文文本两端对齐 */
font-family: "Microsoft YaHei", Arial, sans-serif;
}
p {
text-align: justify;
text-justify: inter-character;
}
.w-e-text-container [data-slate-editor] .table-container{
border: none !important;
border-bottom: 1px solid #ccc !important;
padding: 10px 10px 0px !important;
border-radius: 0 !important;
}
.w-e-text-container [data-slate-editor] table td, .w-e-text-container [data-slate-editor] table th{
border: none !important;
}
</style>
</head>
<body>
${valueHtml.value}
</body>
</html>
`;
const blob = new Blob([wordDocument], {
type: 'application/msword'
});
saveAs(blob, '情报信息报告.doc');
};
// 处理事件
const handleEvents = async () =>{
// 模拟
// setTimeout(async ()=>{
// let prompt = '对事件的性质、事件的发展,指向性、危害性、可控性等进行分析。'
// if (valueHtml.value.includes('事件分析中。。。')) {
// valueHtml.value = valueHtml.value.replace('事件分析中。。。', prompt)
// }
// },1500)
try {
let prompt = '对事件的性质、事件的发展,指向性、危害性、可控性等进行分析。'
await connectSSEWithPost(prompt, {
onChunk: (content) => {
valueHtml.value = valueHtml.value.replace('事件分析中。。。', content)
},
onComplete: () => {
console.log('SSE连接完成');
},
onError: (error) => {
console.error('SSE连接错误:', error);
}
});
} catch (err) {
valueHtml.value = valueHtml.value.replace('事件分析中。。。', '分析失败,请稍后重试')
console.error('分析失败:', err);
}
}
// 工作指引
const handleWork = async () =>{
// 模拟
// setTimeout(async ()=>{
// let prompt = '根据分析内容,针对性提出一些对策建议。'
// if (valueHtml.value.includes('工作指引分析中。。。')) {
// valueHtml.value = valueHtml.value.replace('工作指引分析中。。。', prompt)
// }
// },1500)
try {
let prompt = '根据分析内容,针对性提出一些对策建议。'
await connectSSEWithPost(prompt, {
onChunk: (content) => {
valueHtml.value = valueHtml.value.replace('工作指引分析中。。。', content)
},
onComplete: () => {
console.log('SSE连接完成');
},
onError: (error) => {
console.error('SSE连接错误:', error);
}
});
} catch (err) {
valueHtml.value = valueHtml.value.replace('工作指引分析中。。。', '分析失败,请稍后重试')
console.error('分析失败:', err);
}
}
const handleHtml = async (val) =>{
let html = `<h1 style="text-align: center; font-size: 32px; font-weight: bold; font-family: 'Songti SC', 'SimSun', serif; margin-bottom: 20px;">
<span style="color: rgb(225, 60, 57);">林芝公安情报信息</span>
</h1>
<table style="width: 100%; border-bottom: 1px solid black; margin-bottom: 30px; font-family: 'FangSong', serif; font-size: 16px; border-collapse: collapse;">
<tr >
<td style="text-align: left; padding-bottom: 10px; border: none;">单位:${baseInfo.ssbm}</td>
<td style="text-align: right; padding-bottom: 10px; border: none;">时间:${baseInfo.time}</td>
</tr>
</table><h2 style="text-align: center;"></h2>
<h2 style="text-align: center; font-size: 24px; font-family: 'SimHei', sans-serif; margin-bottom: 20px;">关于对 XXXX 事件的综合研判</h2>
<p style="text-indent: 2em; line-height: 2; font-family: 'FangSong', serif; font-size: 18px;">近日,${baseInfo.ssbm}(单位)接报 ${val.length} 起关于 XXXXXX 事件的情报信息,合并研判如下:</p>
<h3 style="font-size: 20px; font-weight: bold; margin-top: 20px; margin-bottom: 10px; font-family: 'SimHei', sans-serif;">一、事件概况</h3>`
val.forEach((item,index)=>{
html+=`<p style="text-indent: 2em; line-height: 2; font-family: 'FangSong', serif; font-size: 18px;">事件 ${index+1}${item.qbmc}${item.xsBh}</p>`
})
html+=`<h3 style="font-size: 20px; font-weight: bold; margin-top: 20px; margin-bottom: 10px; font-family: 'SimHei', sans-serif;">二、事件分析</h3>`
html+=`<p style="text-indent: 2em; line-height: 2; font-family: 'FangSong', serif; font-size: 18px;">事件分析中。。。</p>`
html+=`<h3 style="font-size: 20px; font-weight: bold; margin-top: 20px; margin-bottom: 10px; font-family: 'SimHei', sans-serif;">三、工作指引</h3>
<p style="text-indent: 2em; line-height: 2; font-family: 'FangSong', serif; font-size: 18px;">工作指引分析中。。。</p>
`
valueHtml.value = html
await handleWork(html) //工作指引
await handleEvents(html) //处理事件
}
watch(()=>props.data,val=>{
handleHtml(val)
},{immediate:true,deep:true})
// 组件销毁时,也及时销毁编辑器
onBeforeUnmount(() => {
const editor = editorRef.value
if (editor == null) return
editor.destroy()
})
const handleCreated = (editor) => {
editorRef.value = editor // 记录 editor 实例,重要!
}
//内容发生变化
const handChange = (editor) => {
// 判断是否是一个空段落,是空就传空文本
console.log(editor.getHtml(), 'editor.getHtml()');
};
</script>
<style lang="scss" scoped>
.cntBox {
width: 100%;
border: 1px solid #ccc;
margin: 0 auto;
}
</style>
<style lang="scss">
.inforReport{
.w-e-text-container [data-slate-editor] .table-container{
border: none !important;
border-bottom: 1px solid #ccc !important;
padding: 10px 10px 0px !important;
border-radius: 0 !important;
}
.w-e-text-container [data-slate-editor] table td, .w-e-text-container [data-slate-editor] table th{
border: none !important;
}
}
</style>

View File

@ -12,7 +12,7 @@
</el-icon> </el-icon>
<span class="vertical-middle">新增</span> <span class="vertical-middle">新增</span>
</el-button> </el-button>
<el-button type="primary" @click="dologCancel()" size="small"> <el-button type="primary" @click="exportFileModel = true;" size="small">
<el-icon class="vertical-middle"> <el-icon class="vertical-middle">
<CirclePlus /> <CirclePlus />
</el-icon> </el-icon>
@ -30,7 +30,12 @@
<CirclePlus /> <CirclePlus />
</el-icon> </el-icon>
<span class="vertical-middle">删除</span> <span class="vertical-middle">删除</span>
</el-button></template> </el-button>
<el-button type="primary" size="small" @click="handleReport">
<el-icon class="vertical-middle"><Edit /></el-icon>
<span class="vertical-middle">情报信息报告</span>
</el-button>
</template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }"> <div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
@ -49,7 +54,6 @@
<template #lczt="{ row }"> <template #lczt="{ row }">
<DictTag :tag="false" :value="row.lczt" :options="D_BZ_LCZT" /> <DictTag :tag="false" :value="row.lczt" :options="D_BZ_LCZT" />
</template> </template>
<template #cyqk="{ row }"> <template #cyqk="{ row }">
<el-link v-if="isShowBtn('采纳')" size="small" type="danger" @click="cnMsg(row)" <el-link v-if="isShowBtn('采纳')" size="small" type="danger" @click="cnMsg(row)"
:disabled="butcontroll('04', row.lczt)">采纳</el-link> :disabled="butcontroll('04', row.lczt)">采纳</el-link>
@ -68,10 +72,8 @@
@click="postXxcjXxcjTjsh(row)">送审</el-link> @click="postXxcjXxcjTjsh(row)">送审</el-link>
<!-- 01 提交 02 上报县局 03 上班市局 04 采纳 05 退回 06 打标签 07 转合成 08 转线索 09 转会商v-if="qxkz.deptLevel == '01'" --> <!-- 01 提交 02 上报县局 03 上班市局 04 采纳 05 退回 06 打标签 07 转合成 08 转线索 09 转会商v-if="qxkz.deptLevel == '01'" -->
<el-link v-if="isShowBtn('上报') && qxkz.deptLevel == '03'" size="small" type="primary" @click="appearNewspapers(row)" :disabled="row.lczt != '01'">上报</el-link> <el-link v-if="isShowBtn('上报') && qxkz.deptLevel == '03'" size="small" type="primary" @click="appearNewspapers(row)" :disabled="row.lczt != '01'">上报</el-link>
<el-link v-else-if="isShowBtn('上报')" size="small" type="primary" @click="appearNewspapers(row)" <el-link v-else-if="isShowBtn('上报')" size="small" type="primary" @click="appearNewspapers(row)" :disabled="!(row.xldshzt == '02'&&row.lczt == '02')">上报</el-link>
:disabled="!(row.xldshzt == '02'&&row.lczt == '02')">上报</el-link>
<!-- && row.lczt != '02' --> <!-- && row.lczt != '02' -->
<el-link v-if="isShowBtn('分组')" size="small" type="primary" @click="opneMsg(row)" <el-link v-if="isShowBtn('分组')" size="small" type="primary" @click="opneMsg(row)"
:disabled="row.sldshzt != '02'">分组</el-link> :disabled="row.sldshzt != '02'">分组</el-link>
@ -87,17 +89,13 @@
<el-link v-if="isShowBtn('转线索')" size="small" type="primary" @click="FollowUpOnLeads(row)" <el-link v-if="isShowBtn('转线索')" size="small" type="primary" @click="FollowUpOnLeads(row)"
:disabled="row.sldshzt != '02'">转线索</el-link> :disabled="row.sldshzt != '02'">转线索</el-link>
<!-- 所有状态都能进行转合成 --> <!-- 所有状态都能进行转合成 -->
<!-- <el-link v-if="isShowBtn('转合成')" size="small" type="primary" @click="openFkDialogszl(row)" <!-- <el-link v-if="isShowBtn('转合成')" size="small" type="primary" @click="openFkDialogszl(row)" :disabled="butcontroll('01', row.lczt)">转合成</el-link> -->
:disabled="butcontroll('01', row.lczt)">转合成</el-link> -->
<!-- 所有状态都能进行转会商 --> <!-- 所有状态都能进行转会商 -->
<!-- <el-link v-if="isShowBtn('转会商')" size="small" type="primary" @click="handleTransferMerchant(row)" <!-- <el-link v-if="isShowBtn('转会商')" size="small" type="primary" @click="handleTransferMerchant(row)" :disabled="butcontroll('01', row.lczt)">转会商</el-link> -->
:disabled="butcontroll('01', row.lczt)">转会商</el-link> -->
<el-link v-if="isShowBtn('关注部门')" :disabled="row.sldshzt != '02'" size="small" type="primary" <el-link v-if="isShowBtn('关注部门')" :disabled="row.sldshzt != '02'" size="small" type="primary" @click="FollowUpOnDept(row)">关注</el-link>
@click="FollowUpOnDept(row)">关注</el-link>
<!-- 市局能给所有数据创建标签 --> <!-- 市局能给所有数据创建标签 -->
<el-link v-if="isShowBtn('打标签')" size="small" type="primary" @click="openCustomTag(row)" <el-link v-if="isShowBtn('打标签')" size="small" type="primary" @click="openCustomTag(row)" :disabled="row.sldshzt != '02'">打标签</el-link>
:disabled="row.sldshzt != '02'">打标签</el-link>
</template> </template>
</MyTable> </MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{ <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -108,21 +106,55 @@
<!-- 新增 --> <!-- 新增 -->
<AddForm ref="detailDiloag" @getList="getList" :titleData="titleData" :dict="{ D_BZ_LCZT, D_BZ_SSSHZT }" /> <AddForm ref="detailDiloag" @getList="getList" :titleData="titleData" :dict="{ D_BZ_LCZT, D_BZ_SSSHZT }" />
</div> </div>
<ExportFile v-model="exportFileModel" :tableColumn="tableColumn" :dict="{ D_GS_XS_LY, D_GS_XS_LX, D_GS_XS_LX }"
:dataModel="pageData.tableData" /> <ExportFile
<MakeTag v-model="chooseRow" :dataList="dataList" :dict="{ D_BZ_CJLX, D_BZ_QBCZZT, D_GS_XS_LX, D_BZ_BQJB }" v-model="exportFileModel"
@getList="getList" /> :tableColumn="tableColumn"
<Fszl v-model="fszlShow" path="/xxcj/sendFqzl" :itemData="dataList" /> :dict="{ D_GS_XS_LY, D_GS_XS_LX, D_GS_XS_LX }"
<CustomTag v-model="customTagShow" :dataList="dataList" @getList="getList" :dict="{ D_XXCJ_BQLX }" /> :dataModel="pageData.tableData"
<Configuration v-model="configurationShow" :dataList="dataList" @getList="getList" /> />
<MakeTag
v-model="chooseRow"
:dataList="dataList"
:dict="{ D_BZ_CJLX, D_BZ_QBCZZT, D_GS_XS_LX, D_BZ_BQJB }"
@getList="getList"
/>
<Fszl
v-model="fszlShow"
path="/xxcj/sendFqzl"
:itemData="dataList"
/>
<CustomTag
v-model="customTagShow"
:dataList="dataList"
@getList="getList"
:dict="{ D_XXCJ_BQLX }"
/>
<Configuration
v-model="configurationShow"
:dataList="dataList"
@getList="getList"
/>
<!-- 转会商 --> <!-- 转会商 -->
<transferMerchant v-if="isShowTransferMerchantTc" :row="currRow" ref="transferMerchantRef" title="转会商" <transferMerchant
@close="isShowTransferMerchantTc = false" @ok="getList" /> v-if="isShowTransferMerchantTc"
:row="currRow"
title="转会商"
@close="isShowTransferMerchantTc = false"
@ok="getList"
/>
<!-- 情报信息报告 -->
<InforReport v-if="inforReportShow" v-model="inforReportShow" :data="tableList" />
</template> </template>
<script setup> <script setup>
import InforReport from './components/inforReport.vue'
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -140,32 +172,28 @@ import Fszl from '@/views/backOfficeSystem/HumanIntelligence/components/fszl.vue
import CustomTag from '../components/customTag.vue' import CustomTag from '../components/customTag.vue'
import Configuration from '../components/configuration.vue' import Configuration from '../components/configuration.vue'
import transferMerchant from "./components/transferMerchant.vue"; import transferMerchant from "./components/transferMerchant.vue";
import { isShiQingZhi } from "@/utils/auth.js" import { Edit } from "@element-plus/icons";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_GS_XS_LY, D_BZ_SSSHZT, D_BZ_SSZT, D_BZ_SF, D_GS_XS_LX, D_BZ_BQJB, const { D_GS_XS_LY, D_BZ_SSSHZT, D_GS_XS_LX, D_BZ_BQJB,D_BZ_QBCZZT, D_BZ_CJLX, D_BZ_LCZT,D_XXCJ_BQLX } = proxy.$dict( "D_GS_XS_LY", 'D_BZ_SSSHZT',"D_GS_XS_LX", "D_BZ_QBCZZT", "D_BZ_CJLX", "D_BZ_BQJB", "D_BZ_LCZT", "D_XXCJ_BQLX"); //获取字典数据
D_GS_XS_QTLX, D_GS_ZDQT_LB, const route = useRoute()
D_BZ_BMJB, D_BZ_CLPP, D_BZ_CLYS, D_BZ_CLLX, D_BZ_XZQHDM, D_BZ_QBCZZT, D_BZ_CJLX, D_BZ_LCZT, const titleData = ref()
D_XXCJ_BQLX } = const exportFileModel = ref(false)
proxy.$dict("D_BZ_BMJB", "D_GS_XS_LY", 'D_BZ_SSSHZT', const qxkz = reactive({
"D_BZ_SSZT", "D_BZ_SF", "D_GS_XS_LX", "D_GS_XS_QTLX", deptBizType: '',
"D_GS_ZDQT_LB", "D_BZ_CLPP", "D_BZ_CLYS", "D_BZ_CLLX", "D_BZ_XZQHDM", "D_BZ_QBCZZT", "D_BZ_CJLX", "D_BZ_BQJB", "D_BZ_LCZT", "D_XXCJ_BQLX"); //获取字典数据 deptLevel: '',
roleCode: false,
depBool: false
});
const fszlShow = ref(false)// 发送指令
const detailDiloag = ref(); const detailDiloag = ref();
const inforReportShow = ref(false) //情报信息报告
const customTagShow = ref(false)// 打标签
const configurationShow = ref(false)// 配置关注部门
const searchBox = ref(); //搜索框 const searchBox = ref(); //搜索框
const ids = ref([]) const ids = ref([])
const tableList = ref([]); const tableList = ref([]);
const chooseData = (val) => {
ids.value = val.map(item => {
return item.id
})
tableList.value = val
}
/** 市情指 */
const cityIntelligenceCommand = isShiQingZhi()
const currRow = ref({}) const currRow = ref({})
const transferMerchantRef = ref()
const isShowTransferMerchantTc = ref(false) const isShowTransferMerchantTc = ref(false)
const isShow = ref(false) const isShow = ref(false)
const searchConfiger = ref([ const searchConfiger = ref([
{ label: "录入人", prop: 'xssbr', placeholder: "请输入录入人", showType: "input" }, { label: "录入人", prop: 'xssbr', placeholder: "请输入录入人", showType: "input" },
@ -201,29 +229,38 @@ const pageData = reactive({
{ label: "上报单位", prop: "ssbm" }, { label: "上报单位", prop: "ssbm" },
{ label: "流程状态", prop: "lczt", showSolt: true }, { label: "流程状态", prop: "lczt", showSolt: true },
{ label: "采用情况", prop: "cyqk", showSolt: true }, { label: "采用情况", prop: "cyqk", showSolt: true },
// { label: "标签内容", prop: "lczt", showSolt: true },
// { label: "消息状态", prop: "czzt", showSolt: true },
] ]
}); });
// 导出数据
const tableColumn = reactive([
{ label: "上报人姓名", prop: "xssbr" },
{ label: "情报上报时间", prop: "sxsbsj" },
{ label: "情报编号", prop: "xsBh" },
{ label: "情报标题", prop: "qbmc" },
{ label: "情报来源", prop: "qbly", showSolt: true, zd: 'D_BZ_CJLX' },
])
const queryFrom = ref({}); const queryFrom = ref({});
const chooseRow = ref(false) const chooseRow = ref(false)
const dataList = ref() const dataList = ref()
const chooseData = (val) => {
ids.value = val.map(item => item.id)
tableList.value = val
}
// 采纳 // 采纳
const cnMsg = (item) => { const cnMsg = (item) => {
// if ( qxkz.depBool) {
proxy.$confirm("确定要采纳", "警告", { type: "warning" }).then(() => { proxy.$confirm("确定要采纳", "警告", { type: "warning" }).then(() => {
xxcjUpdateCzlc({ id: item.id, lczt: '04' }).then(res => { xxcjUpdateCzlc({ id: item.id, lczt: '04' }).then(res => {
proxy.$message({ type: "success", message: "采纳成功" }); proxy.$message({ type: "success", message: "采纳成功" });
getList(); getList();
}) })
}).catch(() => { }); }).catch(() => { });
// } }
const handleReport = () => {
if(tableList.value.length == 0) return proxy.$message({ type: "warning", message: "请选择情报信息" });
inforReportShow.value = true
} }
// 回退 // 回退
const rollbackNewspapers = (item) => { const rollbackNewspapers = (item) => {
@ -271,17 +308,12 @@ const rollbackNewspapers = (item) => {
const appearNewspapers = (item) => { const appearNewspapers = (item) => {
if ((item.lczt == '01' || item.lczt == '05' || item.lczt == '02') && item.qbjb == '00' && qxkz.deptLevel != '01') { if ((item.lczt == '01' || item.lczt == '05' || item.lczt == '02') && item.qbjb == '00' && qxkz.deptLevel != '01') {
proxy.$confirm("确定要上报", "警告", { type: "warning" }).then(() => { proxy.$confirm("确定要上报", "警告", { type: "warning" }).then(() => {
let promes = {} let promes = { id: item.id }
if (qxkz.deptLevel == '02') { promes.lczt = qxkz.deptLevel == '02' ? '03' : '02';
promes = { id: item.id, lczt: '03' }
} else {
promes = { id: item.id, lczt: '02' }
}
xxcjUpdateCzlc(promes).then(res => { xxcjUpdateCzlc(promes).then(res => {
proxy.$message({ type: "success", message: "上报成功" }); proxy.$message({ type: "success", message: "上报成功" });
getList(); getList();
}) })
}).catch(() => { }); }).catch(() => { });
} else { } else {
proxy.$message({ type: "warning", message: "市局无法进行上报" }); proxy.$message({ type: "warning", message: "市局无法进行上报" });
@ -292,8 +324,7 @@ const opneMsg = (item) => {
chooseRow.value = true chooseRow.value = true
dataList.value = [item] dataList.value = [item]
} }
// 打标签
const customTagShow = ref(false)
const openCustomTag = (item) => { const openCustomTag = (item) => {
if (qxkz.depBool) { if (qxkz.depBool) {
customTagShow.value = true customTagShow.value = true
@ -310,10 +341,9 @@ const affirm = (item) => {
getList(); getList();
}) })
}) })
} }
// 配置关注部门
const configurationShow = ref(false)
const FollowUpOnDept = (item) => { const FollowUpOnDept = (item) => {
if (qxkz.depBool) { if (qxkz.depBool) {
configurationShow.value = true configurationShow.value = true
@ -321,12 +351,8 @@ const FollowUpOnDept = (item) => {
} else { } else {
proxy.$message.warning('暂无权限') proxy.$message.warning('暂无权限')
} }
} }
// 批量分组 // 批量分组
// const batchMark = () => { // const batchMark = () => {
// const listDb = tableList.value.filter(item => item.lczt != '04') // const listDb = tableList.value.filter(item => item.lczt != '04')
@ -341,6 +367,7 @@ const FollowUpOnDept = (item) => {
// }) // })
// } // }
// } // }
const handleSumbit = () => { const handleSumbit = () => {
const listDb = tableList.value.filter(item => item.czzt != '01' && item.czzt != '04') const listDb = tableList.value.filter(item => item.czzt != '01' && item.czzt != '04')
if (listDb.length == 0) { if (listDb.length == 0) {
@ -351,11 +378,7 @@ const handleSumbit = () => {
}) })
}).catch(() => { }); }).catch(() => { });
} else { } else {
proxy.$message({ proxy.$message({ message: '请选择正确数据', type: 'warning', showClose: true })
message: '请选择正确数据',
type: 'warning',
showClose: true,
})
} }
} }
@ -378,8 +401,6 @@ const butcontroll = (val, zt) => {
// 搜索 // 搜索
const onSearch = (val) => { const onSearch = (val) => {
console.log(val.bqdmList);
const promes = { const promes = {
...pageData.pageConfiger, ...pageData.pageConfiger,
...val, ...val,
@ -387,7 +408,6 @@ const onSearch = (val) => {
endTime: val.endTime ? val.endTime[1] : '', endTime: val.endTime ? val.endTime[1] : '',
bqdmList: val.bqdmList ? val.bqdmList.join(',') : "" bqdmList: val.bqdmList ? val.bqdmList.join(',') : ""
} }
queryFrom.value = { ...promes } queryFrom.value = { ...promes }
pageData.pageConfiger.pageCurrent = 1; pageData.pageConfiger.pageCurrent = 1;
getList() getList()
@ -405,8 +425,6 @@ const changeSize = (val) => {
// 获取列表 // 获取列表
const getList = () => { const getList = () => {
pageData.tableConfiger.loading = true; pageData.tableConfiger.loading = true;
console.log(pageData.pageConfiger);
let data = { ...pageData.pageConfiger, ...queryFrom.value }; let data = { ...pageData.pageConfiger, ...queryFrom.value };
xxcjSelectXxsbPage(data).then(res => { xxcjSelectXxsbPage(data).then(res => {
pageData.tableData = res.records || []; pageData.tableData = res.records || [];
@ -424,17 +442,7 @@ const delDictItem = (id) => {
}) })
}).catch(() => { }); }).catch(() => { });
} }
// 导出数据
const tableColumn = reactive([
{ label: "上报人姓名", prop: "xssbr" },
{ label: "情报上报时间", prop: "sxsbsj" },
{ label: "情报编号", prop: "xsBh" },
{ label: "情报标题", prop: "qbmc" },
// { label: "情报类型", prop: "qblx", showSolt: true, zd: 'D_GS_XS_LX' },
{ label: "情报来源", prop: "qbly", showSolt: true, zd: 'D_BZ_CJLX' },
// { label: "指向地点", prop: "zxdz" },
// { label: "情报内容", prop: "qbnr", showOverflowTooltip: true },
])
// 详情 // 详情
const addEdit = (type, row) => { const addEdit = (type, row) => {
isShow.value = true; isShow.value = true;
@ -450,67 +458,17 @@ const openXxqk = (row) => {
}, 500) }, 500)
} }
} }
const route = useRoute()
const titleData = ref()
const qxkz = reactive({
deptBizType: '',
deptLevel: '',
roleCode: false,
depBool: false
});
const qxzt = ref(false)
onMounted(() => {
const { deptBizType, deptLevel } = getItem('deptId')[0]
const Jb = deptLevel[0] == '2' ? '01' : deptLevel[0] == '3' ? '02' : '03'
qxkz.roleCode = getItem('roleList').find(item => item.roleCode == 'JS_666666') != undefined
qxkz.deptBizType = deptBizType
qxkz.deptLevel = Jb
if (deptBizType == '23' && Jb == '01') {
qxkz.depBool = true
} else {
qxkz.depBool = false
}
getRouter()
tabHeightFn()
if (route.query.id) {
detailDiloag.value.init('edit', {
id: route.query.id
});
return
}
getList()
});
const getRouter = () => {
titleData.value = route.meta.title
}
const exportFileModel = ref(false)
const dologCancel = () => {
exportFileModel.value = true;
}
// 搜索栏
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250; pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
window.onresize = function () { window.onresize = function () {
tabHeightFn(); tabHeightFn();
}; };
}; };
// 转线索 // 转线索
const FollowUpOnLeads = (row) => { const FollowUpOnLeads = (row) => {
if (!qxkz.depBool) { if (!qxkz.depBool) return proxy.$message({message: '权限不足',type: 'warning',showClose: true, })
proxy.$message({
message: '权限不足',
type: 'warning',
showClose: true,
})
return
} else {
proxy.$confirm("确定要转线索吗?", "警告", { type: "warning" }).then(() => { proxy.$confirm("确定要转线索吗?", "警告", { type: "warning" }).then(() => {
xxcjXxzsx({ ids: Array.isArray(row) ? row.join(',') : row.id }).then(res => { xxcjXxzsx({ ids: Array.isArray(row) ? row.join(',') : row.id }).then(res => {
proxy.$message({ type: "success", message: "转线索成功" }); proxy.$message({ type: "success", message: "转线索成功" });
@ -519,9 +477,6 @@ const FollowUpOnLeads = (row) => {
}) })
} }
}
// 发送指令
const fszlShow = ref(false)
const openFkDialogszl = (row) => { const openFkDialogszl = (row) => {
if (!qxkz.depBool) { if (!qxkz.depBool) {
proxy.$message({ proxy.$message({
@ -536,13 +491,6 @@ const openFkDialogszl = (row) => {
} }
} }
/** 获取当前角色 */ /** 获取当前角色 */
function getRole() { function getRole() {
const { deptBizType, deptLevel } = getItem('deptId')[0] const { deptBizType, deptLevel } = getItem('deptId')[0]
@ -576,7 +524,6 @@ const isShowBtn = (btnName, row = {}) => {
if (role === '部门') { if (role === '部门') {
if (btnName === '续报') return lczt != '01' if (btnName === '续报') return lczt != '01'
if (btnName === '修改') return lczt == '01' if (btnName === '修改') return lczt == '01'
// if(btnName === '上报') return lczt == '01'
} }
return true return true
} }
@ -584,8 +531,6 @@ const handleTransferMerchant = (row) => {
currRow.value = row currRow.value = row
isShowTransferMerchantTc.value = true isShowTransferMerchantTc.value = true
} }
// 送审 // 送审
const postXxcjXxcjTjsh = (row) => { const postXxcjXxcjTjsh = (row) => {
proxy.$confirm("确定要送审吗", "提示", { type: "warning" }).then(() => { proxy.$confirm("确定要送审吗", "提示", { type: "warning" }).then(() => {
@ -595,20 +540,25 @@ const postXxcjXxcjTjsh = (row) => {
}) })
}).catch(() => { }) }).catch(() => { })
} }
const getDisabled = (val, zt) => {
console.log(val, zt);
// switch (val) { onMounted(() => {
// case '01': const { deptBizType, deptLevel } = getItem('deptId')[0]
// return !(['04', '06', '07', '08', '09'].includes(zt)) const Jb = deptLevel[0] == '2' ? '01' : deptLevel[0] == '3' ? '02' : '03'
// case '02': qxkz.roleCode = getItem('roleList').find(item => item.roleCode == 'JS_666666') != undefined
// return !(['03', '05'].includes(zt)) qxkz.deptBizType = deptBizType
// case '03': qxkz.deptLevel = Jb
// return !(['02', '03', '04'].includes(zt)) if (deptBizType == '23' && Jb == '01') {
// case '04': qxkz.depBool = true
// return ([ '04', '05' ,'06', '07', '08', '09'].includes(zt)) } else {
// } qxkz.depBool = false
} }
titleData.value = route.meta.title
tabHeightFn()
if (route.query.id) {
detailDiloag.value.init('edit', { id: route.query.id });
}
getList()
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -0,0 +1,117 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<!-- 表格 -->
<div class="tabBox mt10" :style="{height: pageData.tableHeight +30+ 'px'}">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
/>
</div>
/>
</div>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckGet } from "@/api/qcckApi.js";
import { reactive, ref, onMounted } from "vue";
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{ label: "申请人姓名", prop: "xm", placeholder: "请输入申请人姓名", showType: "input" },
{ label: "申请人身份证", prop: "sfzh", placeholder: "请输入申请人身份证号", showType: "input"},
{ label: "申请人联系电话", prop: "lxdh", placeholder: "请输入申请人联系电话", showType: "input"}
]);
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 200,
tableColumn: [
{ label: "申请人姓名", prop: "xm" },
{ label: "申请人身份证", prop: "sfzh"},
{ label: "申请人联系电话", prop: "lxdh"},
{ label: "权限说明", prop: "qxsm" },
]
});
const queryFrom = ref({});
onMounted(() => {
getList();
tabHeightFn();
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val };
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
// 获取列表
const getList = () => {
pageData.tableConfiger.loading = true;
let data = { ...pageData.pageConfiger, ...queryFrom.value };
qcckGet(data, "/mosty-gsxt/gsxt/qxsq/getPageList").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 220;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -10,7 +10,16 @@
<el-radio v-for="(it,idx) in timeList" :key="idx" :label="it.num" >{{ it.label }}</el-radio> <el-radio v-for="(it,idx) in timeList" :key="idx" :label="it.num" >{{ it.label }}</el-radio>
</el-radio-group> </el-radio-group>
<span class="ml5 mr5">自定义</span> <span class="ml5 mr5">自定义</span>
<el-date-picker @change="handleDateChange" v-model="formSearch.dateRange" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" /> <el-date-picker
@change="handleDateChange"
v-model="formSearch.dateRange"
:unlink-panels="true"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD" />
</div> </div>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>

View File

@ -31,13 +31,12 @@ const props = defineProps({
}) })
const legendList = ref([]) const legendList = ref([])
watch(() => props.data, (newVal) => { watch(() => props.data, (newVal) => {
console.log(newVal,'-------------监听');
if (newVal.length) { if (newVal.length) {
const total = newVal.reduce((s, v) => s + v.value, 0); const total = newVal.reduce((s, v) => s + v.value, 0);
legendList.value = newVal.map((d, i) => ({ legendList.value = newVal.map((d, i) => ({
name: d.name, name: d.name,
value: 20, value: d.value,
percent: Math.round((d.value / total )* 100), percent: total > 0 ? Math.round((d.value / total )* 100) : 0,
dotColor: i === 0 ? 'linear-gradient(90deg, #FF8DA7 0%, #D66A8D 100%)': d.color dotColor: i === 0 ? 'linear-gradient(90deg, #FF8DA7 0%, #D66A8D 100%)': d.color
})) }))
nextTick(() => { nextTick(() => {

View File

@ -17,11 +17,11 @@
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
import QbtjCount from './qbtjCount.vue' import QbtjCount from './qbtjCount.vue'
import YjCount from './yjCount.vue' import YjCount from './yjCount.vue'
import XxhjCount from './xxhjCount.vue'
import QygktjCount from './qygktjCount.vue' import QygktjCount from './qygktjCount.vue'
import XxhjCount from './xxhjCount.vue'
import { ref } from "vue"; import { ref } from "vue";
const butList=ref(["情报统计分析","预警统计",'全域管控统计','信息汇聚统计']) const butList=ref(["情报统计分析","预警统计",'全域管控统计','信息汇聚统计'])
const qh = ref('预警统计') const qh = ref('情报统计分析')
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -14,10 +14,10 @@
</li> </li>
<li class="cnt-item"> <li class="cnt-item">
<div class="common-title"> <div class="common-title">
<div class="title">管控状态统计</div> <div class="title">重点人等级</div>
</div> </div>
<div class="echratsBox"> <div class="echratsBox">
<StatusCount :data="obj.gkztList" id="gkztCount" /> <StatusCount :data="obj.zdrdjList" id="gkztCount" />
</div> </div>
</li> </li>
<li class="cnt-item"> <li class="cnt-item">
@ -29,9 +29,12 @@
<li class="cnt-item"> <li class="cnt-item">
<div class="common-title"> <div class="common-title">
<div class="title">各部门管控数量统计</div> <div class="title">各部门管控数量统计</div>
<div class="btn-group">
<div class="btn" @click="handle_gbmgk" v-if="activeTab">返回</div>
</div> </div>
<div class="echratsBox"> </div>
<DbarEcharts echartsId="bardepDChart" :key="ketcount" :data="obj.gbmgkList" /> <div class="echratsBox" v-loading="loading">
<DbarEcharts echartsId="bardepDChart" :rotate="25" :key="ketcount" :data="obj.gbmgkList" @click="handleClick" />
</div> </div>
</li> </li>
</ul> </ul>
@ -39,6 +42,8 @@
</template> </template>
<script setup> <script setup>
import { getItem } from "@/utils/storage";
import { qcckGet } from '@/api/qcckApi'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import HeadLayout from './components/headLayout.vue' import HeadLayout from './components/headLayout.vue'
import BqyjslCount from './components/bqyjslCount.vue' import BqyjslCount from './components/bqyjslCount.vue'
@ -48,59 +53,153 @@ import { onMounted, reactive, ref } from "vue";
const searchRef = ref() //筛选组件实例 const searchRef = ref() //筛选组件实例
const boxHeight = ref() //盒子高度 const boxHeight = ref() //盒子高度
const formSearch = ref({}) //查询条件 const formSearch = ref({}) //查询条件
const activeTab = ref(false)
const loading = ref(false)
const ketcount = ref(0) const ketcount = ref(0)
const obj = reactive({ const obj = reactive({
gkztList: [
{ name: '失控', value: 85 ,color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [{ offset: 0, color: '#FF8DA7' },{ offset: 1, color: '#D66A8D' }])},
{ name: '在控', value: 55 ,color: '#17C0AE'},
],//管控状态统计
bqgkslList: [
{ label: '涉兼爆炸等恐怖袭击人员', value: 100 },
{ label: '全国涉稳重点人', value: 80 },
{ label: '国保涉稳人员', value: 70 },
{ label: '涉政涉恐涉稳重点人员', value: 60 },
{ label: '区涉稳人员', value: 50 },
],//各类标签预警数量统计
sevenList: [
{ label:'涉恐',value:30 },
{ label:'涉暴',value:20 },
{ label:'涉恐暴',value:10 },
{ label:'涉睡',value:30 },
{ label:'涉睡暴',value:20 },
{ label:'涉睡恐',value:10 },
{ label:'涉睡恐暴',value:5 },
],//7类重点人员预警统计
rylyList: { rylyList: {
list: [ list: [
{ label:'基础库',value:50 }, { label:'基础库',value:0 },
{ label:'重点库',value:40 }, { label:'重点库',value:0 },
{ label:'关注库',value:10 }, { label:'关注库',value:0 },
{ label:'重点群体',value:50 }, { label:'重点群体',value:0 },
{ label:'重点车辆',value:40 }, { label:'重点车辆',value:0 },
], ],
topColor:'#17c8c3', topColor:'#17c8c3',
colors: ["#28EEBF","#0DBAC5"], colors: ["#28EEBF","#0DBAC5"],
},//人员来源统计 },//人员来源统计
zdrdjList: [
{ name: '一级', value: 0 ,color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [{ offset: 0, color: '#FF8DA7' },{ offset: 1, color: '#D66A8D' }])},
{ name: '二级', value: 0 ,color: '#FFB944'},
{ name: '三级', value: 0 ,color: '#fcfc54'},
{ name: '四级', value: 0 ,color: '#0072ff'},
],//重点人等级
bqgkslList: [
{ label: '涉嫌爆炸等恐怖袭击人员', value: 0 },
{ label: '全国涉稳重点人', value: 0 },
{ label: '自治区涉稳人员', value: 0 },
{ label: '国保涉稳人员', value: 0 },
{ label: '涉政涉恐涉稳重点人员', value: 0 },
],//各类标签预警数量统计
gbmgkList: { gbmgkList: {
list: [ list: [
{ label:'国家保',value:100 }, { label:'巴宜区',value:0,ssbmdm: "540402000000" },
{ label:'省保',value:80 }, { label:'工布江达县',value:0,ssbmdm: "540421000000" },
{ label:'市保',value:70 }, { label:'米林县',value:0,ssbmdm: "540481000000" },
{ label:'区保',value:60 }, { label:'墨脱县',value:0,ssbmdm: "540423000000" },
{ label:'其他保',value:50 }, { label:'波密县',value:0,ssbmdm: "540424000000" },
{ label:'察隅县',value:0,ssbmdm: "540425000000" },
{ label:'朗县',value:0,ssbmdm: "540426000000" },
{ label:'雅下分局',value:0,ssbmdm: "540481450000" },
], ],
topColor:'#17c8c3', topColor:'#17c8c3',
colors: ["#28EEBF","#0DBAC5"], colors: ["#28EEBF","#0DBAC5"],
},//各部门管控数量统计 },//各部门管控数量统计
}) })
// 2开头是市、3开头是县、4开头派出所级
const userInfo = getItem("deptId")[0];
onMounted(()=>{ onMounted(()=>{
init()
tabHeightFn() tabHeightFn()
}) })
// 筛选 // 筛选
const handleChange = (val) => { const handleChange = (val) => {
formSearch.value = val formSearch.value = {...val }
formSearch.value.startTime = val.dateRange ? val.dateRange[0] : ''
formSearch.value.endTime = val.dateRange ? val.dateRange[1] : ''
delete formSearch.value.dateRange;
init()
}
// 初始化
const init = () =>{
handle_ryly(); //人员来源统计
handle_gkjb(); //管控级别统计
handle_bq(); //各类标签预警数量统计
handle_gbmgk(); //各部门管控数量统计
}
//人员来源统计
const handle_ryly = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/tbGsxtZdry/lytjCount');
let list = res || [];
obj.rylyList.list = list.map(item => ({
label: item.mc,
value: item.sl || 0,
}))
}
// 重点人等级
const handle_gkjb = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/tbGsxtZdry/gkdjCount');
let color = [
new echarts.graphic.LinearGradient(0, 0, 1, 1, [{ offset: 0, color: '#FF8DA7' },{ offset: 1, color: '#D66A8D' }]),
'#FFB944',
'#fcfc54',
'#0072ff'
]
obj.zdrdjList = (res || []).map((item,idx) => ({
name: item.zdmc,
value: Number(item.sl) || 0,
color: color[idx],
}))
console.log(obj.zdrdjList,'=====00');
}
//各类标签预警数量统计
const handle_bq = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/tbGsxtZdry/rybqCount');
let list = res || [];
obj.bqgkslList = list.map(item => ({
label: item.bqmc,
value: item['count(bq_mc)'] || 0,
}))
}
// 部门点击事件
const handleClick = async (val) =>{
// 当前部门是派出所 bb
if(userInfo?.deptLevel?.startsWith('4')) return;
if(val.includes('派出所')) return;
let info = obj.gbmgkList.list.find(i => i.label === val);
let params = {...formSearch.value }
params.ssbmdm = info.ssbmdm;
loading.value = true;
let res = await qcckGet(params,'/mosty-gsxt/tbGsxtZdry/bmCount');
activeTab.value = true;
loading.value = false;
obj.gbmgkList.list = (res || []).map(v=>{
return {
label: v.ssbmmc,
value: Number(v.sl),
ssbmdm:v.ssbmdm
}
})
}
//各部门管控数量统计
const handle_gbmgk = async () => {
activeTab.value = false;
let params = {...formSearch.value}
params.ssbmdm = userInfo?.deptCode;
loading.value = true;
let res = await qcckGet(params,'/mosty-gsxt/tbGsxtZdry/bmCount');
loading.value = false;
obj.gbmgkList.list = (res || []).map(v=>{
return {
label: v.ssbmmc,
value: Number(v.sl),
ssbmdm:v.ssbmdm
}
})
} }
// 表格高度计算 // 表格高度计算

View File

@ -30,10 +30,21 @@
</li> </li>
<li class="cnt-item cnt-item-last"> <li class="cnt-item cnt-item-last">
<div class="common-title"> <div class="common-title">
<div class="title">各部门管控数量统计</div> <div class="title">标签统计</div>
</div> </div>
<div class="echratsBox"> <div class="echratsBox">
<DbarEcharts echartsId="bardepDChart" :key="ketcount" :data="obj.bqList" /> <BqyjslCount :data="obj.bqList"/>
</div>
</li>
<li class="cnt-item cnt-item-last">
<div class="common-title">
<div class="title">各部门管控数量统计</div>
<div class="btn-group">
<div class="btn" @click="handle_bm" v-if="activeTab">返回</div>
</div>
</div>
<div class="echratsBox" v-loading="loading">
<DbarEcharts echartsId="bardepDChart" :rotate="25" :key="ketcount" @click="handleClick" :data="obj.bmList" />
</div> </div>
</li> </li>
</ul> </ul>
@ -41,6 +52,9 @@
</template> </template>
<script setup> <script setup>
import { getItem } from "@/utils/storage";
import BqyjslCount from './components/bqyjslCount.vue'
import { qcckGet } from '@/api/qcckApi'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import HeadLayout from './components/headLayout.vue' import HeadLayout from './components/headLayout.vue'
import StatusCount from './components/statusCount.vue' import StatusCount from './components/statusCount.vue'
@ -50,46 +64,152 @@ const searchRef = ref() //筛选组件实例
const boxHeight = ref() //盒子高度 const boxHeight = ref() //盒子高度
const formSearch = ref({}) //查询条件 const formSearch = ref({}) //查询条件
const ketcount = ref(0) const ketcount = ref(0)
const activeTab = ref(true)
const loading = ref(false)
const obj = reactive({ const obj = reactive({
// 采用情况统计
cyqkList: [ cyqkList: [
{ name:'采纳',value:30,color:'#0dbac5' }, { name:'采纳',value:0,color:'#0dbac5' },
{ name:'退回',value:20,color:'#ff7700' }, { name:'退回',value:0,color:'#ff7700' },
], ],
// 分组统计
fzList: [ fzList: [
{ name:'内部',value:30,color:'#fdbc3a' }, { name:'内部',value:0,color:'#fdbc3a' },
{ name:'共享',value:20,color:'#ff7700' }, { name:'共享',value:0,color:'#ff7700' },
], ],
// 状态统计
ztList: [ ztList: [
{ name: '送审', value: 85 ,color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [{ offset: 0, color: '#FF8DA7' },{ offset: 1, color: '#D66A8D' }])}, { name: '送审', value: 0 ,color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [{ offset: 0, color: '#FF8DA7' },{ offset: 1, color: '#D66A8D' }])},
{ name: '转线索', value: 55 ,color: '#17C0AE'}, { name: '转线索', value: 0 ,color: '#17C0AE'},
], ],
bqList: { bqList: [],//标签
bmList: {
list: [ list: [
{ label:'肇事肇祸',value:100 }, { label:'巴宜区',value:0,ssbmdm: "540402000000" },
{ label:'涉稳人员',value:80 }, { label:'工布江达县',value:0,ssbmdm: "540421000000" },
{ label:'前科人员',value:70 }, { label:'米林县',value:0,ssbmdm: "540481000000" },
{ label:'肇事肇祸',value:100 }, { label:'墨脱县',value:0,ssbmdm: "540423000000" },
{ label:'涉稳人员',value:80 }, { label:'波密县',value:0,ssbmdm: "540424000000" },
{ label:'前科人员',value:70 }, { label:'察隅县',value:0,ssbmdm: "540425000000" },
{ label:'肇事肇祸',value:100 }, { label:'朗县',value:0,ssbmdm: "540426000000" },
{ label:'涉稳人员',value:80 }, { label:'雅下分局',value:0,ssbmdm: "540481450000" },
{ label:'前科人员',value:70 },
{ label:'肇事肇祸',value:100 },
{ label:'涉稳人员',value:80 },
{ label:'前科人员',value:70 },
], ],
topColor:'#17c8c3', topColor:'#17c8c3',
colors: ["#28EEBF","#0DBAC5"], colors: ["#28EEBF","#0DBAC5"],
},//各部门管控数量统计 },//各部门管控数量统计
}) })
// 2开头是市、3开头是县、4开头派出所级
const userInfo = getItem("deptId")[0];
onMounted(()=>{ onMounted(()=>{
init()
tabHeightFn() tabHeightFn()
}) })
// 筛选 // 筛选
const handleChange = (val) => { const handleChange = (val) => {
formSearch.value = val formSearch.value = {...val }
formSearch.value.startTime = val.dateRange ? val.dateRange[0] : ''
formSearch.value.endTime = val.dateRange ? val.dateRange[1] : ''
delete formSearch.value.dateRange;
init()
}
const init = async () => {
await handle_cyqk(); //采用情况统计
await handle_fz(); //分组统计
await handle_zt(); //状态统计
await handle_bq(); //标签统计
await handle_bm(); //各部门管控数量统计
}
//采用情况统计
const handle_cyqk = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/xxcj/cyqkCount');
let list = res || [];
let color = ['#0dbac5','#ff7700','#409eff']
obj.cyqkList = list.map((item,idx) => ({
name: item.dmmc,
value: item.sl || 0,
color: color[idx] || '#0dbac5',
}))
}
//分组统计
const handle_fz = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/xxcj/fzCount');
let list = res || [];
let color = ['#fdbc3a','#ff7700','#409eff']
obj.fzList = list.map((item,idx) => ({
name: item.dmmc,
value: item.sl || 0,
color: color[idx] || '#0dbac5',
}))
}
//状态统计
const handle_zt = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/xxcj/ztCount');
let list = res || [];
let color = [new echarts.graphic.LinearGradient(0, 0, 1, 1, [{ offset: 0, color: '#FF8DA7' },{ offset: 1, color: '#D66A8D' }]),'#17C0AE','#409eff']
obj.ztList = list.map((item,idx) => ({
name: item.dmmc,
value: item.sl || 0,
color: color[idx] || '#0dbac5',
}))
}
//标签
const handle_bq = async () => {
let params = {...formSearch.value}
let res = await qcckGet(params,'/mosty-gsxt/xxcj/bqCount');
let list = res || [];
obj.bqList = list.map((item) => ({
label: item.bqmc,
value: item['count(bqmc)'] || 0,
}))
}
// 部门点击事件
const handleClick = async (val) =>{
// 当前部门是派出所 bb
if(userInfo?.deptLevel?.startsWith('4')) return;
if(val.includes('派出所')) return;
let info = obj.bmList.list.find(i => i.label === val);
let params = {...formSearch.value }
params.ssbmdm = info.ssbmdm;
loading.value = true;
let res = await qcckGet(params,'/mosty-gsxt/tbGsxtZdry/bmCount');
activeTab.value = true;
loading.value = false;
obj.bmList.list = (res || []).map(v=>{
return {
label: v.ssbmmc,
value: Number(v.sl),
ssbmdm:v.ssbmdm
}
})
}
//各部门管控数量统计
const handle_bm = async () => {
activeTab.value = false;
let params = {...formSearch.value}
params.ssbmdm = userInfo?.deptCode;
loading.value = true;
let res = await qcckGet(params,'/mosty-gsxt/xxcj/bmCount');
loading.value = false;
obj.bmList.list = (res || []).map(v=>{
return {
label: v.ssbmmc,
value: Number(v.sl),
ssbmdm:v.ssbmdm
}
})
} }
// 表格高度计算 // 表格高度计算
@ -139,6 +259,32 @@ const tabHeightFn = () => {
background: linear-gradient(to right, #409EFF, #ffffff); background: linear-gradient(to right, #409EFF, #ffffff);
} }
} }
.btn-group {
display: flex;
gap: 10px;
.btn {
padding: 3px 16px;
border: 1px solid #dcdfe6;
border-radius: 4px;
font-size: 12px;
cursor: pointer;
color: #606266;
transition: all 0.3s;
user-select: none;
&.active {
background: #409EFF;
color: #fff;
border-color: #409EFF;
}
&:hover:not(.active) {
color: #409EFF;
border-color: #c6e2ff;
background-color: #ecf5ff;
}
}
}
} }
.echratsBox{ .echratsBox{
height: calc(100% - 40px); height: calc(100% - 40px);
@ -146,7 +292,7 @@ const tabHeightFn = () => {
} }
} }
.cnt-item-last{ .cnt-item-last{
width: 100%; width: 49.8%;
} }
} }
} }

View File

@ -44,7 +44,7 @@
</div> </div>
</div> </div>
<div class="echratsBox" v-loading="loading"> <div class="echratsBox" v-loading="loading">
<DbarEcharts echartsId="bar3DChart" :key="ketcount" :data="obj.cnList" @click="handleClick" /> <DbarEcharts echartsId="bar3DChart" :rotate="25" :key="ketcount" :data="obj.cnList" @click="handleClick" />
</div> </div>
</li> </li>
<li class="cnt-item"> <li class="cnt-item">
@ -58,7 +58,7 @@
<div class="title">7类重点人员预警统计</div> <div class="title">7类重点人员预警统计</div>
</div> </div>
<div class="echratsBox"> <div class="echratsBox">
<LineEcharts echartsId="seventTypeChart" color="#333333" :data="obj.sevenList" /> <LineEcharts echartsId="seventTypeChart" color="#333333" :data="obj.sevenList" name="预警数量" />
</div> </div>
</li> </li>
<li class="cnt-item"> <li class="cnt-item">
@ -87,18 +87,26 @@ const activeTab = ref(false)
const loading = ref(false) const loading = ref(false)
const ketcount = ref(0) const ketcount = ref(0)
const countList = ref([ const countList = ref([
{ zddm:'01',label: '红色预警', hb:0,tb:0, dysl: '0', sysl: '0', snsl: '0', icon: require('@/assets/images/icon-red.png') }, { zddm:'01',label: '红色预警', hb:0,tb:0, dysl: 0, sysl: 0, snsl: 0, icon: require('@/assets/images/icon-red.png') },
{ zddm:'02',label: '橙色预警', hb:0,tb:0, dysl: '0', sysl: '0', snsl: '0', icon: require('@/assets/images/icon-orange.png') }, { zddm:'02',label: '橙色预警', hb:0,tb:0, dysl: 0, sysl: 0, snsl: 0, icon: require('@/assets/images/icon-orange.png') },
{ zddm:'03',label: '黄色预警', hb:0,tb:0, dysl: '0', sysl: '0', snsl: '0', icon: require('@/assets/images/icon-yellow.png') }, { zddm:'03',label: '黄色预警', hb:0,tb:0, dysl: 0, sysl: 0, snsl: 0, icon: require('@/assets/images/icon-yellow.png') },
{ zddm:'04',label: '蓝色预警', hb:0,tb:0, dysl: '0', sysl: '0', snsl: '0', icon: require('@/assets/images/icon-blue.png') }, { zddm:'04',label: '蓝色预警', hb:0,tb:0, dysl: 0, sysl: 0, snsl: 0, icon: require('@/assets/images/icon-blue.png') },
]) ])
const obj = reactive({ const obj = reactive({
bqyjslList: [], //各类标签预警数量统计 { label: '涉毒人员', value: 0 }, bqyjslList: [], //各类标签预警数量统计 { label: '涉毒人员', value: 0 },
sevenList: [], //7类重点人员预警统计 { label:'涉恐',value:0 }, sevenList: [], //7类重点人员预警统计 { label:'涉恐',value:0 },
// 2开头是市、3开头是县、4开头派出所级 { label:'工布江达县',value:0 }, // 2开头是市、3开头是县、4开头派出所级 { label:'工布江达县',value:0 },
cnList: { cnList: {
list: [], list: [
{ label:'巴宜区',value:0,ssbmdm: "540402000000" },
{ label:'工布江达县',value:0,ssbmdm: "540421000000" },
{ label:'米林县',value:0,ssbmdm: "540481000000" },
{ label:'墨脱县',value:0,ssbmdm: "540423000000" },
{ label:'波密县',value:0,ssbmdm: "540424000000" },
{ label:'察隅县',value:0,ssbmdm: "540425000000" },
{ label:'朗县',value:0,ssbmdm: "540426000000" },
{ label:'雅下分局',value:0,ssbmdm: "540481450000" },
],
topColor:'#17c8c3', topColor:'#17c8c3',
colors: ["#28EEBF","#0DBAC5"], colors: ["#28EEBF","#0DBAC5"],
}, },
@ -128,11 +136,11 @@ const handleChange = (val) => {
// 初始化 // 初始化
const init = () =>{ const init = () =>{
handle_yjfl(); handle_yjfl(); //预警分类统计 同比、环比
handle_gbm(); handle_gbm(); // 各部门预警数量统计
handle_yjbq(); handle_yjbq(); // 预警标签统计
handle_seven(); handle_seven(); // 7类重点人员预警统计
handle_czzt(); handle_czzt(); // 处置状态统计
} }
// 预警分类统计 同比、环比 // 预警分类统计 同比、环比
@ -144,15 +152,15 @@ const handle_yjfl = async () =>{
let obj = list.find(i => i.zddm === item.zddm); let obj = list.find(i => i.zddm === item.zddm);
obj.hb = Number(obj.hb.substring(0, obj.hb.length - 1)); obj.hb = Number(obj.hb.substring(0, obj.hb.length - 1));
obj.tb = Number(obj.tb.substring(0, obj.tb.length - 1)); obj.tb = Number(obj.tb.substring(0, obj.tb.length - 1));
return obj ? {...item,obj} : item return obj ? { ...item, ...obj } : item;
}) })
} }
// 部门点击事件 // 部门点击事件
const handleClick = async (val) =>{ const handleClick = async (val) =>{
// 当前部门是派出所 bb // 当前部门是派出所 bb
if(userInfo?.deptLevel?.startsWith('4')) return; if(userInfo?.deptLevel?.startsWith('4')) return;
if(val.includes('派出所')) return;
let info = obj.cnList.list.find(i => i.label === val); let info = obj.cnList.list.find(i => i.label === val);
let params = {...formSearch.value } let params = {...formSearch.value }
params.ssbmdm = info.ssbmdm; params.ssbmdm = info.ssbmdm;
@ -169,8 +177,6 @@ const handleClick = async (val) =>{
}) })
} }
// 各部门预警数量统计 // 各部门预警数量统计
const handle_gbm = async () =>{ const handle_gbm = async () =>{
activeTab.value = false; activeTab.value = false;
@ -187,16 +193,17 @@ const handle_gbm = async () =>{
} }
}) })
} }
// 预警标签统计 // 预警标签统计
const handle_yjbq = async () =>{ const handle_yjbq = async () =>{
let params = {...formSearch.value} let params = {...formSearch.value}
params.ssbmdm = userInfo?.deptCode;
let res = await qcckGet(params,'/mosty-gsxt/yjxx/tj/yjbqtj'); let res = await qcckGet(params,'/mosty-gsxt/yjxx/tj/yjbqtj');
obj.bqyjslList = (res || []).map(item => ({ obj.bqyjslList = (res || []).map(item => ({
label: item.yjbq, label: item.yjbq,
value: Number(item.count), value: Number(item.count),
})); }));
} }
// 7类重点人员预警统计 // 7类重点人员预警统计
const handle_seven = async () =>{ const handle_seven = async () =>{
let params = {...formSearch.value} let params = {...formSearch.value}
@ -206,6 +213,7 @@ const handle_seven = async () =>{
value: Number(item.sl), value: Number(item.sl),
})); }));
} }
// 处置状态统计 // 处置状态统计
const handle_czzt = async () =>{ const handle_czzt = async () =>{
let params = {...formSearch.value} let params = {...formSearch.value}
@ -216,7 +224,6 @@ const handle_czzt = async () =>{
})); }));
} }
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
boxHeight.value = window.innerHeight - searchRef.value.offsetHeight - 300; boxHeight.value = window.innerHeight - searchRef.value.offsetHeight - 300;
@ -318,7 +325,7 @@ const tabHeightFn = () => {
justify-content: space-between; justify-content: space-between;
align-content: space-between; align-content: space-between;
margin-top: 10px; margin-top: 10px;
overflow: hidden; // overflow: hidden;
.cnt-item{ .cnt-item{
width: 49.8%; width: 49.8%;
height: 49.5%; height: 49.5%;
@ -375,7 +382,7 @@ const tabHeightFn = () => {
} }
.echratsBox{ .echratsBox{
height: calc(100% - 40px); height: calc(100% - 40px);
overflow: hidden; /* overflow: hidden; */
} }
} }
} }

View File

@ -33,6 +33,21 @@
<template #expand="{ props }"> <template #expand="{ props }">
<Items :row="props || {}" :dict="dict" /> <Items :row="props || {}" :dict="dict" />
</template> </template>
<template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</template>
<el-image v-else style="width: 30px; height:30px" :src="row.yjTp" :preview-src-list="[row.yjTp]"
show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="30" height="30" v-if="row.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="30" height="30" v-else />
</div>
</template>
</el-image>
</template>
<template #yjJb="{ row }"> <template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_GS_SSYJ" /> <DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_GS_SSYJ" />
</template> </template>
@ -53,7 +68,9 @@
<template #bqdl="{ row }"> <template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" /> <DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template> </template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link> <el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
@ -110,7 +127,8 @@ const searchConfiger = ref([
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" }, { label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "布控时间", prop: 'startTime', placeholder: "请选择布控时间", showType: "datetimerange" }, { label: "布控时间", prop: 'startTime', placeholder: "请选择布控时间", showType: "datetimerange" },
]); ]);
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const permission_sfqs = ref(false) const permission_sfqs = ref(false)
const roleCode = ref(false) const roleCode = ref(false)
@ -133,19 +151,17 @@ const pageData = reactive({
}, },
controlsWidth: 180, //操作栏宽度 controlsWidth: 180, //操作栏宽度
tableColumn: [ tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true }, { label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
{ label: "预警时间", prop: "yjFssj" ,width: 160}, { label: "处置状态", prop: "czzt", showSolt: true },
{ label: "人员姓名", prop: "yjRyxm" }, { label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 },
{ label: "身份证号码", prop: "yjRysfzh" ,width: 180}, { label: "姓名", prop: "yjRyxm" },
{ label: "性别", prop: "sex" ,showSolt: true,width: 60 }, { label: "性别", prop: "sex", showSolt: true, width: 80 },
// { label: "年龄", prop: "age", showSolt: true,width: 60 }, { label: "年龄", prop: "age", showSolt: true, width: 80 },
{ label: "预警级别", prop: "yjJb", showSolt: true,width: 84 }, { label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
// { label: "人员类别", prop: "bqdl", showSolt: true ,width: 84}, { label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
{ label: "细类", prop: "yjbqmc",width: 84 }, { label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "轨迹类别", prop: "yjLylx", showSolt: true ,width: 84}, { label: "相似度", prop: "xsd", showSolt: true },
{ label: "活动发生地", prop: "yjDz" }, { label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ label: "接收单位", prop: "ssbm" },
{ label: "预警次数", prop: "yjCs" ,width: 84 },
] ]
}); });
@ -277,24 +293,31 @@ const handleChooseData = (val) => {
} }
const exportExl = () => { const exportExl = () => {
const titleObj = { const titleObj = {
yjRyxm: "预警人员姓名", czzt_cname: "处置状态",
yjRysfzh: "预警人员身份证号码", yjSj: "预警时间",
yjbqmc: "预警标签", yjRyxm: "姓名",
yjJrcs: "今日预警次数", nl_cname: "年龄", // IdCard(row.yjRysfzh, 3)
yjJb_name: "标签颜色", yjLylx: "数据来源",
yjNr: "预警内容", xb_cname: "性别",
yjFssj: "预警时间", yjJb_cname: "预警级别",
czzt_name: "处置状态", xsd_cname: "相似度",
ssxgaj: "所属县局", yjDz: "预警地点",
ssbm: "处置单位", yjCs: "预警次数",
yjRysjh: "布控手机号",
yjClcph: "布控车牌号",
yjRysfzh: "身份证",
} }
/** 导出【选中】的数据 (没有就全部)*/ /** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => { const data = needArr.map(item => {
return { return {
...item, ...item,
nl_cname: IdCard(item.yjRysfzh, 3),
xb_cname: IdCard(item.yjRysfzh, 2),
xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%',
yjJb_name: getMultiDictVal(item.yjJb, D_GS_SSYJ), yjJb_name: getMultiDictVal(item.yjJb, D_GS_SSYJ),
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT), czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
} }
}) })
exportExlByObj(titleObj, data, '预警布控') exportExlByObj(titleObj, data, '预警布控')

View File

@ -234,7 +234,7 @@ const getList = () => {
pageData.tableData = res.records.map(item => { pageData.tableData = res.records.map(item => {
return { return {
...item, ...item,
yjTp: item.yjlx == '01' ? item.yjTpreplace(ORDIMG, IMGYM) : item.yjTp yjTp: item.yjlx == '01' ? item.yjTp.replace(ORDIMG, IMGYM) : item.yjTp
} }
}) || []; }) || [];
pageData.total = res.total; pageData.total = res.total;

View File

@ -1,6 +1,13 @@
<template> <template>
<el-dialog :model-value="modelValue" :title="title" width="70%" @close="closeDialog" destroy-on-close append-to-body> <el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 60vh; overflow: auto;"> <template #title>
<div class="flex just-between align-center">
<span class="f18">{{ title }}</span>
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
</div>
</template>
<div>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
@ -33,6 +40,8 @@
</template> </template>
<script setup> <script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -141,6 +150,24 @@ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
changePage() changePage()
} }
// 导出
const exportFile = () =>{
const titleObj = {
sxsbsj: "情报上报时间",
xsBh: "情报编号",
qbmc: "情报标题",
qbly_name: "情报来源",
lczt_name: "流程状态",
}
let list = pageData.tableData.map(item => ({
...item,
qbly_name: getMultiDictVal(item.jqdjdm, D_BZ_CJLX),
lczt_name: getMultiDictVal(item.jqlbdm, D_BZ_QBCZZT),
}))
exportExlByObj(titleObj, list, props.title)
}
</script> </script>
<style scoped></style> <style scoped></style>

View File

@ -1,6 +1,12 @@
<template> <template>
<el-dialog :model-value="modelValue" title="重点群体" width="70%" @close="closeDialog" destroy-on-close append-to-body> <el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body :close-on-click-modal="false">
<div style="height: 60vh; overflow: auto;"> <template #title>
<div class="flex just-between align-center">
<span class="f18">重点群体</span>
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
</div>
</template>
<div>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@ -45,6 +51,8 @@
</template> </template>
<script setup> <script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -149,7 +157,6 @@ const changePage = () => {
} }
const changeNo = (val) => { const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val; pageData.pageConfiger.pageCurrent = val;
changePage() changePage()
@ -158,6 +165,25 @@ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
changePage() changePage()
} }
// 导出
const exportFile = () =>{
const titleObj = {
qtMc: "群体名称",
qtLb_name: "群体类别",
qtFxdj_name: "风险等级",
qtBjzl: "背景资料",
bgxx_name: "背景信息",
gxSsdwmc: "管辖单位",
}
let list = pageData.tableData.map(item => ({
...item,
qtLb_name: getMultiDictVal(item.qtLb, D_GS_ZDQT_LB),
qtFxdj_name: getMultiDictVal(item.qtFxdj, D_GS_ZDQT_FXDJ),
}))
exportExlByObj(titleObj, list, '重点群体')
}
</script> </script>
<style scoped></style> <style scoped></style>

View File

@ -1,8 +1,12 @@
<template> <template>
<el-dialog :model-value="modelValue" title="重点人总数" width="70%" @close="closeDialog" destroy-on-close append-to-body> <el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body :close-on-click-modal="false">
<div style="height: 60vh; overflow: auto;"> <template #title>
<div class="flex just-between align-center">
<span class="f18">重点人总数</span>
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
</div>
</template>
<div>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@ -63,6 +67,8 @@
</template> </template>
<script setup> <script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -175,16 +181,6 @@ const changePage = () => {
} }
// 查看详情
const showDetail = (item) => {
router.push({
path: '/CollectCrculate',
query: {
id: item.id
}
})
}
const changeNo = (val) => { const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val; pageData.pageConfiger.pageCurrent = val;
changePage() changePage()
@ -193,6 +189,28 @@ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
changePage() changePage()
} }
// 导出
const exportFile = () =>{
const titleObj = {
ryXm: "姓名",
ryXb_name: "性别",
ryJg_name: "籍贯",
rySfzh: "身份证",
ryMz_name: "民族",
hjdQh_name: "户籍地区划",
hjdPcsmc: "户籍派出所",
}
let list = pageData.tableData.map(item => ({
...item,
ryXb_name: getMultiDictVal(item.ryXb, D_BZ_XB),
ryJg_name: getMultiDictVal(item.ryJg, D_BZ_XZQHDM),
ryMz_name: getMultiDictVal(item.ryMz, D_BZ_MZ),
hjdQh_name: getMultiDictVal(item.hjdQh, D_BZ_XZQHDM),
}))
exportExlByObj(titleObj, list, '重点人总数')
}
</script> </script>
<style scoped> <style scoped>

View File

@ -1,6 +1,13 @@
<template> <template>
<el-dialog :model-value="modelValue" :title="title" width="70%" @close="closeDialog" destroy-on-close append-to-body> <el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 60vh; overflow: auto;">
<template #title>
<div class="flex just-between align-center">
<span class="f18">{{ title }}</span>
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
</div>
</template>
<div>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
@ -54,6 +61,8 @@
</template> </template>
<script setup> <script setup>
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -196,6 +205,30 @@ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
changePage() changePage()
} }
// 导出
const exportFile = () =>{
const titleObj = {
ryxm: "姓名",
rysfzh: "身份证号",
yjbq: "预警标签",
yjdz: "预警地址",
yjjb_name: "预警级别",
yjlb_name: "预警类别",
yjlx_name: "预警类型",
yjsj: "预警时间",
ssbm: "所属部门",
cph: "车牌号",
}
let list = pageData.tableData.map(item => ({
...item,
yjjb_name: getMultiDictVal(item.yjjb, D_BZ_YJJB),
yjlb_name: getMultiDictVal(item.yjlb, D_BZ_YJLX),
yjlx_name: getMultiDictVal(item.yjlx, D_GS_ZDQT_YJLB),
}))
exportExlByObj(titleObj, list, title.value)
}
</script> </script>
<style scoped></style> <style scoped></style>

View File

@ -1,8 +1,12 @@
<template> <template>
<el-dialog :model-value="modelValue" title="警情总数" width="70%" @close="closeDialog" destroy-on-close append-to-body> <el-dialog :model-value="modelValue" width="70%" @close="closeDialog" :close-on-click-modal="false" destroy-on-close append-to-body>
<div style="height: 60vh; overflow: auto;"> <template #title>
<div class="flex just-between align-center">
<span class="f18">警情总数</span>
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
</div>
</template>
<div>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
@ -43,6 +47,8 @@
</template> </template>
<script setup> <script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -127,7 +133,7 @@ const pageData = reactive({
{ label: "补充接警内容", prop: "bcjjnr", showOverflowTooltip: true }, { label: "补充接警内容", prop: "bcjjnr", showOverflowTooltip: true },
{ label: "研判状态", prop: "ypzt",showSolt:true }, { label: "研判状态", prop: "ypzt",showSolt:true },
], ],
tableHeight: "43vh", tableHeight: "40vh",
}); });
const parameter = ref() const parameter = ref()
const onSearch = (val) => { const onSearch = (val) => {
@ -153,7 +159,6 @@ pageData.tableConfiger.loading = true;
...parameter.value ...parameter.value
} }
lzJcjPjdbSelectPage(params).then(res => { lzJcjPjdbSelectPage(params).then(res => {
console.log(res);
pageData.tableData = res.records || []; pageData.tableData = res.records || [];
pageData.total = res.total; pageData.total = res.total;
@ -162,16 +167,6 @@ pageData.tableConfiger.loading = true;
}) })
} }
// 查看详情
const showDetail = (item) => {
router.push({
path: '/CollectCrculate',
query: {
id: item.id
}
})
}
const changeNo = (val) => { const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val; pageData.pageConfiger.pageCurrent = val;
changePage() changePage()
@ -180,6 +175,29 @@ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
changePage() changePage()
} }
// 导出
const exportFile = () =>{
const titleObj = {
jjdbh: "接警单编号",
bjdh: "报警电话",
bjsj: "报警时间",
bjnr: "报警内容",
jjyxm: "接警员姓名",
jqdjdm_name: "警情级别",
jqlbdm_name: "警情类型",
jqdz: "警情地址",
bcjjnr: "补充接警内容",
ypzt_name: "研判状态",
}
let list = pageData.tableData.map(item => ({
...item,
jqdjdm_name: getMultiDictVal(item.jqdjdm, D_GS_BQ_DJ),
jqlbdm_name: getMultiDictVal(item.jqlbdm, JQLB),
ypzt_name: item.ypzt == '01' ? '已研判' : '未研判'
}))
exportExlByObj(titleObj, list, '警情总数')
}
</script> </script>
<style scoped></style> <style scoped></style>

View File

@ -0,0 +1,77 @@
<template>
<div>
<el-dialog title="权限申请" v-model="showDialog" width="500px" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false" >
<el-form :model="listQuery" label-width="120px" :rules="rules" ref="formRef">
<el-form-item label="申请人姓名" prop="xm">
<el-input placeholder="请输入申请人姓名" v-model="listQuery.xm" clearable></el-input>
</el-form-item>
<el-form-item label="申请人身份证" prop="sfzh">
<el-input placeholder="请输入申请人身份证" v-model="listQuery.sfzh" clearable></el-input>
</el-form-item>
<el-form-item label="申请人联系电话" prop="lxdh">
<el-input placeholder="请输入申请人联系电话" v-model="listQuery.lxdh" clearable></el-input>
</el-form-item>
<el-form-item label="权限说明" prop="qxsm">
<el-input placeholder="请输入权限说明" v-model="listQuery.qxsm" clearable type="textarea" :rows="3"></el-input>
</el-form-item>
<div class="tc">
<el-button type="primary" :loading="loading" @click="okSubit">确定</el-button>
<el-button @click="reset()"> 重置 </el-button>
</div>
</el-form>
</el-dialog>
</div>
</template>
<script setup>
import { getItem } from "@/utils/storage";
import { ElMessage } from "element-plus";
import { qcckGet ,qcckPost} from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref,onUnmounted } from 'vue'
const showDialog = ref(false)
const listQuery = ref({
xm: getItem("USERNAME") || '',
sfzh: getItem("idEntityCard") || '',
lxdh: '',
qxsm: '',
})
const formRef = ref()
const rules = ref({
xm: [{ required: true, message: '请输入申请人姓名', trigger: 'blur' }],
sfzh: [{ required: true, message: '请输入申请人身份证', trigger: 'blur' }],
lxdh: [{ required: true, message: '请输入申请人联系电话', trigger: 'blur' }],
qxsm: [{ required: true, message: '请输入权限说明', trigger: 'blur' }],
})
const loading = ref(false)
onMounted(()=>{
emitter.on("openPermminsion", () => {
showDialog.value = true
})
})
// 提交
const okSubit = async () => {
formRef.value.validate((valid) => {
if (!valid) return false;
loading.value = true
qcckPost(listQuery.value, "/mosty-gsxt/gsxt/qxsq/addEntity").then(() => {
ElMessage.success("提交成功");
showDialog.value = false;
loading.value = false
}).catch(() => {
ElMessage.error("提交失败");
loading.value = false
});
})
// 提交表单
console.log(listQuery.value)
}
// 重置
const reset = () => {
listQuery.value = {}
formRef.value.resetFields()
}
</script>

View File

@ -1,6 +1,12 @@
<template> <template>
<el-dialog :model-value="modelValue" :title="title" width="70%" @close="closeDialog" destroy-on-close append-to-body> <el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body :close-on-click-modal="false" >
<div style="height: 60vh; overflow: auto;"> <template #title>
<div class="flex just-between align-center">
<span class="f18">{{ props.title }}</span>
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
</div>
</template>
<div>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
@ -36,13 +42,15 @@
</template> </template>
<script setup> <script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import { xxcjXfxsSelectPage } from "@/api/xxcj.js" import { xxcjXfxsSelectPage } from "@/api/xxcj.js"
import { ref, reactive, getCurrentInstance, watch } from "vue"; import { ref, reactive, getCurrentInstance, watch } from "vue";
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const { D_GS_XS_SJLY, D_GS_XS_ZLLX, D_GS_ZDQT_FXDJ, D_GS_XS_CZZT } = proxy.$dict('D_GS_XS_SJLY', 'D_GS_XS_ZLLX', 'D_GS_ZDQT_FXDJ', 'D_GS_XS_CZZT') const { D_BZ_SF,D_GS_XS_SJLY, D_GS_XS_ZLLX, D_GS_ZDQT_FXDJ, D_GS_XS_CZZT } = proxy.$dict('D_BZ_SF','D_GS_XS_SJLY', 'D_GS_XS_ZLLX', 'D_GS_ZDQT_FXDJ', 'D_GS_XS_CZZT')
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {
type: Boolean, type: Boolean,
@ -51,7 +59,8 @@ const props = defineProps({
dict: { dict: {
type: Object, type: Object,
default: () => ({}) default: () => ({})
}, title: { },
title: {
default: "下发总数", default: "下发总数",
type: String type: String
}, },
@ -140,6 +149,29 @@ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
changePage() changePage()
} }
// 导出
const exportFile = () =>{
const titleObj = {
zlbt: "指令标题",
zllx_name: "指令类型",
zldj_name: "指令等级",
jssj: "反馈截止时间",
czzt_name: "处置状态",
jsffk_name: "是否反馈",
sfqs_name: "是否签收",
}
let list = pageData.tableData.map(item => ({
...item,
zllx_name: getMultiDictVal(item.zllx, D_GS_XS_ZLLX),
zldj_name: getMultiDictVal(item.zldj, D_GS_ZDQT_FXDJ),
czzt_name: getMultiDictVal(item.czzt, D_GS_XS_CZZT),
sffk_name: getMultiDictVal(item.sffk, D_BZ_SF),
sfqs_name: getMultiDictVal(item.sfqs, D_BZ_SF),
}))
exportExlByObj(titleObj, list, props.title)
}
</script> </script>
<style scoped></style> <style scoped></style>

View File

@ -1,6 +1,12 @@
<template> <template>
<el-dialog :model-value="modelValue" title="线索总数" width="70%" @close="closeDialog" destroy-on-close append-to-body> <el-dialog :model-value="modelValue" width="70%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 60vh; overflow: auto;"> <template #title>
<div class="flex just-between align-center">
<span class="f18">线索总数</span>
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
</div>
</template>
<div>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
@ -33,6 +39,8 @@
</template> </template>
<script setup> <script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -83,7 +91,6 @@ const pageData = reactive({
{ label: "线索来源", prop: "cjLx",showSolt:true }, { label: "线索来源", prop: "cjLx",showSolt:true },
{ label: "上报时间", prop: "sxsbsj",showOverflowTooltip:true }, { label: "上报时间", prop: "sxsbsj",showOverflowTooltip:true },
{ label: "线索内容", prop: "qbnr"}, { label: "线索内容", prop: "qbnr"},
{ label: "审核状态", prop: "shzt", showSolt: true }, { label: "审核状态", prop: "shzt", showSolt: true },
], ],
tableHeight: "43vh", tableHeight: "43vh",
@ -124,6 +131,27 @@ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
changePage() changePage()
} }
// 导出
const exportFile = () =>{
const titleObj = {
xsBh: "线索编号",
qbmc: "线索名称",
qblx_name: "线索类型",
cjLx_name: "线索来源",
sxsbsj: "上报时间",
qbnr: "线索内容",
shzt_name: "审核状态",
}
let list = pageData.tableData.map(item => ({
...item,
qblx_name: getMultiDictVal(item.qblx, D_GS_XS_LX),
cjLx_name: getMultiDictVal(item.cjLx, D_GS_XS_LY),
shzt_name: getMultiDictVal(item.shzt, D_BZ_XSSHZT),
}))
exportExlByObj(titleObj, list, '线索总数')
}
</script> </script>
<style scoped></style> <style scoped></style>

View File

@ -1,5 +1,7 @@
<template> <template>
<div class="noScollLine"> <div class="noScollLine">
<!-- 情报上报列表 -->
<Intelligence v-model="isShow.showQbsb" v-if="isShow.showQbsb" />
<!-- 预警信息弹框 --> <!-- 预警信息弹框 -->
<Home_YJ v-if="isShow.showYj" :show="isShow.showYj" :data="list.Info_YJ" /> <Home_YJ v-if="isShow.showYj" :show="isShow.showYj" :data="list.Info_YJ" />
<PopupWarning v-if="isShow.showWarning" :show="isShow.showWarning" :data="list.Info_Warning" /> <PopupWarning v-if="isShow.showWarning" :show="isShow.showWarning" :data="list.Info_Warning" />
@ -10,11 +12,13 @@
import emitter from "@/utils/eventBus.js"; import emitter from "@/utils/eventBus.js";
import Home_YJ from "./components/home_yj.vue"; import Home_YJ from "./components/home_yj.vue";
import PopupWarning from './components/popupWarning' import PopupWarning from './components/popupWarning'
import Intelligence from "@/views/home/model/mesgSwitch/intelligence.vue";
import { ref, onMounted, onUnmounted, reactive, getCurrentInstance } from "vue"; import { ref, onMounted, onUnmounted, reactive, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const isShow = ref({ const isShow = ref({
showYj: false, //预警弹窗 showYj: false, //预警弹窗
showWarning: false showWarning: false, //预警弹窗
showQbsb: false, //情报上报列表弹窗
}); });
const list = reactive({ const list = reactive({
Info_YJ: [], //预警数据 Info_YJ: [], //预警数据
@ -32,6 +36,10 @@ onMounted(() => {
isShow.value.showWarning = res ? true : false; isShow.value.showWarning = res ? true : false;
if (res) list.Info_Warning = res; if (res) list.Info_Warning = res;
}); });
// 展示情报上报列表
emitter.on("lookQbsbList", (res) => {
isShow.value.showQbsb = res ? true : false;
});
}); });
onUnmounted(() => { onUnmounted(() => {
emitter.off("showHomeYJ"); emitter.off("showHomeYJ");

View File

@ -12,6 +12,10 @@ const props = defineProps({
data: { data: {
type: Object, type: Object,
default: () => { } default: () => { }
},
rotate: {
type: Number,
default: 0
} }
}); });
const emit = defineEmits(['click']); const emit = defineEmits(['click']);
@ -108,7 +112,7 @@ function chartFn() {
top: '15%', top: '15%',
left: '2%', left: '2%',
right: '2%', right: '2%',
bottom: '15%', bottom: '0%',
containLabel: true containLabel: true
}, },
tooltip: { tooltip: {
@ -139,8 +143,9 @@ function chartFn() {
show: true show: true
}, },
axisLabel: { axisLabel: {
interval: 1, // 控制标签的显示间隔0 表示全部显示,可以根据需要调整为其他值,例如 1 表示每隔一个显示一个标签。 interval: 0, // 控制标签的显示间隔0 表示全部显示,可以根据需要调整为其他值,例如 1 表示每隔一个显示一个标签。
color: '#666666' color: '#666666',
rotate: props.rotate || 0,
} }
}, },
yAxis: { yAxis: {
@ -155,7 +160,6 @@ function chartFn() {
axisTick: { show: false }, axisTick: { show: false },
axisLine: { show: false }, axisLine: { show: false },
axisLabel: { color: props.color }, axisLabel: { color: props.color },
}, },
series: [ series: [
{ {

View File

@ -3,7 +3,7 @@
</template> </template>
<script setup> <script setup>
import * as echarts from "echarts"; import * as echarts from "echarts";
import { onMounted, ref, reactive, defineProps, onUnmounted, watch, nextTick } from "vue"; import { defineProps, watch, nextTick } from "vue";
const props = defineProps({ const props = defineProps({
echartsId:{ echartsId:{
type:String, type:String,
@ -18,25 +18,14 @@ const props = defineProps({
default:[] default:[]
} }
}); });
// 监听数据变化
// 保存echarts实例 watch(()=>props.data,val=>{
const myChart = ref(null); nextTick(()=>{ chartFn(val) })
},{immediate:true,deep:true})
// 定义resize处理函数
const handleResize = () => {
if (myChart.value) {
myChart.value.resize();
}
};
function chartFn() { function chartFn() {
// 如果已有实例,先销毁
if (myChart.value) {
myChart.value.dispose();
}
// 创建新实例 // 创建新实例
myChart.value = echarts.init(document.getElementById(props.echartsId)); let myChart = echarts.init(document.getElementById(props.echartsId));
var option = { var option = {
grid: { grid: {
top: "8%", top: "8%",
@ -86,6 +75,7 @@ function chartFn() {
}, },
series: [ series: [
{ {
name: props.name,
type: "line", type: "line",
smooth:true, smooth:true,
showSymbol:false, showSymbol:false,
@ -115,28 +105,14 @@ function chartFn() {
} }
] ]
}; };
option && myChart.value.setOption(option); option && myChart.setOption(option);
window.addEventListener('resize',function(){
myChart.resize();
})
} }
// 监听数据变化
watch(()=>props.data,val=>{
nextTick(()=>{ chartFn() })
},{immediate:true,deep:true})
// 组件挂载时初始化图表并添加事件监听
onMounted(()=>{
chartFn();
window.addEventListener('resize', handleResize);
});
// 组件卸载时清理资源
onUnmounted(()=>{
if (myChart.value) {
myChart.value.dispose();
myChart.value = null;
}
window.removeEventListener('resize', handleResize);
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -130,9 +130,13 @@
<LeftDialog></LeftDialog> <LeftDialog></LeftDialog>
<!-- 人员弹窗 --> <!-- 人员弹窗 -->
<PeoDialog ref="peoDialogRef"></PeoDialog> <PeoDialog ref="peoDialogRef"></PeoDialog>
<!-- 权限申请 -->
<QxsqDialog />
</template> </template>
<script setup> <script setup>
import QxsqDialog from './components/qxsqDialog.vue'
import { qcckGet ,qcckPost} from "@/api/qcckApi.js"; import { qcckGet ,qcckPost} from "@/api/qcckApi.js";
import { ref, onMounted, onUnmounted,getCurrentInstance } from 'vue' import { ref, onMounted, onUnmounted,getCurrentInstance } from 'vue'
import PeoDialog from './components/peoDialog.vue' import PeoDialog from './components/peoDialog.vue'

View File

@ -106,15 +106,11 @@
<script setup> <script setup>
import FlowLine from './flowLine.vue' import FlowLine from './flowLine.vue'
import { getItem } from "@/utils/storage"; import { getItem } from "@/utils/storage";
import emitter from "@/utils/eventBus.js";
import { timeValidate, weekValidate } from "@/utils/tools.js"; import { timeValidate, weekValidate } from "@/utils/tools.js";
import { useRouter, useRoute, onBeforeRouteLeave } from "vue-router"; import { useRouter, useRoute, onBeforeRouteLeave } from "vue-router";
import { useStore } from "vuex"; import { useStore } from "vuex";
import { getUserIsRed } from "@/api/sys.js" import { getUserIsRed } from "@/api/sys.js"
import xinxi from "@/assets/images/icon_045.png";
import tool from "@/assets/images/icon_044.png";
const icon1 = require("@/assets/images/icon_048.png"); //晴天 const icon1 = require("@/assets/images/icon_048.png"); //晴天
const icon2 = require("@/assets/images/icon_049.png"); //小雨 const icon2 = require("@/assets/images/icon_049.png"); //小雨
const icon3 = require("@/assets/images/icon_050.png"); //高温 const icon3 = require("@/assets/images/icon_050.png"); //高温
@ -152,11 +148,11 @@ const btns = reactive({
leftBtn: ["数据整合", '分析研判'], leftBtn: ["数据整合", '分析研判'],
moreBtn: [ moreBtn: [
{ name: '后台', img: require('@/assets/images/Group427322486.png') }, { name: '后台', img: require('@/assets/images/Group427322486.png') },
{ name: '权限申请', img: require('@/assets/images/Group427322486.png') },
{ name: '退出登录', img: require('@/assets/images/Group427322485.png') }] { name: '退出登录', img: require('@/assets/images/Group427322485.png') }]
}); });
const btnsActive = ref(""); const btnsActive = ref("");
const showMore = ref(false); //更多 const showMore = ref(false); //更多
const activeText = ref(""); const activeText = ref("");
const day = ref(0); const day = ref(0);
@ -201,6 +197,9 @@ const handleBtns = (val) => {
case "退出登录": case "退出登录":
store.dispatch("user/logout"); store.dispatch("user/logout");
break; break;
case "权限申请":
emitter.emit("openPermminsion")
break;
} }
}; };

View File

@ -79,7 +79,6 @@ const openTc = (val) => {
title.value = '信息采集总数' title.value = '信息采集总数'
break; break;
case 'xszs': case 'xszs':
openShow.xszs = true openShow.xszs = true
title.value = '线索总数' title.value = '线索总数'
break; break;

View File

@ -1,5 +1,11 @@
<template> <template>
<el-dialog :model-value="modelValue" title="情报列表" width="70%" @close="closeDialog" destroy-on-close> <el-dialog :model-value="modelValue" width="70%" @close="closeDialog" :destroy-on-close="true" :close-on-click-modal="false" >
<template #title>
<div class="flex just-between align-center">
<span class="f18" style="color: #333;">情报列表</span>
<span @click="exportFile" class="f14 pointer" style="color: #0072ff;">下载</span>
</div>
</template>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable customClass="zdy_peo_table" :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" <MyTable customClass="zdy_peo_table" :tableData="pageData.tableData" :tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :tableHeight="pageData.tableHeight" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger"
@ -10,7 +16,6 @@
<template #qbly="{ row }"> <template #qbly="{ row }">
<DictTag :tag="false" :value="row.qbly" :options="D_GS_XS_LY" /> <DictTag :tag="false" :value="row.qbly" :options="D_GS_XS_LY" />
</template> </template>
<template #shzt="{ row }"> <template #shzt="{ row }">
<!-- 采纳将这条信息推送到情报管理,退回 --> <!-- 采纳将这条信息推送到情报管理,退回 -->
<DictTag :tag="false" :value="row.shzt" :options="D_BZ_XSSHZT" @clickTag="clickTag(row.shzt)" /> <DictTag :tag="false" :value="row.shzt" :options="D_BZ_XSSHZT" @clickTag="clickTag(row.shzt)" />
@ -34,15 +39,14 @@
</template> </template>
<script setup> <script setup>
import { exportExlByObj } from "@/utils/exportExcel.js"
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import Xq from "./xq.vue"; import Xq from "./xq.vue";
import { qbcjSelectPage } from "@/api/Intelligence.js"; import {xxcjSelectPage} from '@/api/xxcj.js'
import {xxcjSelectPage,xxcjXxzsx} from '@/api/xxcj.js' import { ref, reactive, getCurrentInstance, watch, onMounted } from "vue";
import { ref, reactive, getCurrentInstance, watch } from "vue";
import { useRoute,useRouter } from 'vue-router' import { useRoute,useRouter } from 'vue-router'
const route = useRoute()
const router = useRouter() const router = useRouter()
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const { D_BZ_QBSBLY,D_GS_XS_LX,D_GS_XS_LY ,D_BZ_XSSHZT} = proxy.$dict("D_BZ_QBSBLY","D_GS_XS_LX","D_GS_XS_LY","D_BZ_XSSHZT") const { D_BZ_QBSBLY,D_GS_XS_LX,D_GS_XS_LY ,D_BZ_XSSHZT} = proxy.$dict("D_BZ_QBSBLY","D_GS_XS_LX","D_GS_XS_LY","D_BZ_XSSHZT")
@ -102,29 +106,26 @@ const pageData = reactive({
{ label: "上报人姓名", prop: "xssbr" }, { label: "上报人姓名", prop: "xssbr" },
{ label: "情报编号", prop: "xsBh" }, { label: "情报编号", prop: "xsBh" },
{ label: "情报标题", prop: "qbmc" }, { label: "情报标题", prop: "qbmc" },
// { label: "情报类型", prop: "qblx", showSolt: true },
// { label: "情报来源", prop: "qbly", showSolt: true },
{ label: "情报上报时间", prop: "sxsbsj" ,watch:'300'}, { label: "情报上报时间", prop: "sxsbsj" ,watch:'300'},
// { label: "指向地点", prop: "zxdz" },
{ label: "情报内容", prop: "qbnr" }, { label: "情报内容", prop: "qbnr" },
], ],
tableHeight: "50vh", tableHeight: "40vh",
}); });
const parameter = ref() const parameter = ref()
onMounted(() => {
changePage()
})
const onSearch = (val) => { const onSearch = (val) => {
const promes = { const promes = {
startTime: val.startTime && val.startTime.length > 0 ? val.startTime[0] : '', startTime: val.startTime ? val.startTime[0] : '',
endTime: val.startTime && val.startTime.length > 0 ? val.startTime[1] : '', endTime: val.endTime ? val.endTime[1] : '',
} }
parameter.value = { ...val, ...promes } parameter.value = { ...val, ...promes }
pageData.pageConfiger.pageCurrent = 1; pageData.pageConfiger.pageCurrent = 1;
changePage() changePage()
} }
watch(() => props.modelValue, (val) => {
if (val) {
changePage()
}
})
const changePage = () => { const changePage = () => {
pageData.tableConfiger.loading = true; pageData.tableConfiger.loading = true;
let data = { ...pageData.pageConfiger, ...parameter.value,qbjb:'01' }; let data = { ...pageData.pageConfiger, ...parameter.value,qbjb:'01' };
@ -162,6 +163,19 @@ const clickTag = (row) => {
dataList.value = row.row; dataList.value = row.row;
} }
} }
// 导出
const exportFile = () =>{
const titleObj = {
xssbr: "上报人姓名",
xsBh: "情报编号",
qbmc: "情报标题",
sxsbsj: "情报上报时间",
qbnr: "情报内容",
}
exportExlByObj(titleObj, pageData.tableData, '情报列表')
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@ -1,33 +1,18 @@
<template> <template>
<div class="comom-title"> <div class="comom-title">
<span class="title">情报上报统计<span class="titleFz ml18" @click.stop="reversalPush">切换</span></span> <span class="title">情报上报统计<span class="titleFz ml18" @click.stop="reversalPush">切换</span></span>
<div class="title titleFz" @click="visible = true"> <div class="title titleFz" @click="lookList">查看列表</div>
查看列表
</div>
<!-- <el-popover placement="right" :width="430" :visible="visible">
<template #reference>
</template>
<div>
<div class="qbltData">
<div>查询</div>
<div class="close" @click.stop="close()">X</div>
</div>
<TimeData v-if="visible" @changeTime="changeTime" />
</div>
</el-popover> -->
</div> </div>
<div class="comom-cnt qxsbBox"> <div class="comom-cnt qxsbBox">
<LineEcharts echartsId="qbsbEcharts" :data="dataList" :dataZoom="false" :rotate="-25"></LineEcharts > <LineEcharts echartsId="qbsbEcharts" :data="dataList" :dataZoom="false" :rotate="-25"></LineEcharts >
</div> </div>
<Intelligence v-model="visible" :dict="{D_BZ_QBSBLY}"/>
</template> </template>
<script setup> <script setup>
import emitter from "@/utils/eventBus.js";
import { qcckPost } from "@/api/qcckApi.js"; import { qcckPost } from "@/api/qcckApi.js";
import LineEcharts from "../echarts/moreLineEcharts.vue"; import LineEcharts from "../echarts/moreLineEcharts.vue";
import Intelligence from "@/views/home/model/mesgSwitch/intelligence.vue";
import { defineEmits, onMounted, ref, } from 'vue'; import { defineEmits, onMounted, ref, } from 'vue';
// import TimeData from '@/views/home/model/mesgSwitch/timeData.vue'
const emit = defineEmits(['change']) const emit = defineEmits(['change'])
const dataList = ref({ const dataList = ref({
@ -55,15 +40,8 @@ const getCount = () => {
}) })
} }
const visible = ref(false) const lookList = () => {
const changeTime = (val) => { emitter.emit('lookQbsbList',true)
listQuery.value = {
...val
}
getCount()
}
const close = () => {
visible.value = false
} }
const reversalPush = () => { const reversalPush = () => {

View File

@ -3,8 +3,8 @@
<div class="flex align-center" v-for="(item, idx) in contentItem" :key="idx"> <div class="flex align-center" v-for="(item, idx) in contentItem" :key="idx">
<div class="mr10"><img :src="item.icon" alt=""></div> <div class="mr10"><img :src="item.icon" alt=""></div>
<div class="vountItem"> <div class="vountItem">
<div style="color:#ffffff" class="f16 lh20">{{ item.label }} <span @click="openTc(item.type,'zs')" v-if="item.type == 'yjzs'">{{ item.value }}</span></div> <div style="color:#ffffff" class="f16 lh20">{{ item.label }} <span class="pointer" @click="openTc(item.type,'zs')" v-if="item.type == 'yjzs'">{{ item.value }}</span></div>
<div v-if="!item.isChild" class="mt4 f12" style="color: #ffffff;font-size: 24px;">{{ item.value }}</div> <div v-if="!item.isChild" class="mt4 f12 pointer" style="color: #ffffff;font-size: 24px;" @click="openTc(item.type,'zs')" >{{ item.value }}</div>
<div v-else class="mt4 flex align-center just-between" style="color: #ffffff;"> <div v-else class="mt4 flex align-center just-between" style="color: #ffffff;">
<span class="f12" style="color: #ff0000;" @click="openTc(item.type,'wqs')">未签收:{{ item.wqsyj }}</span> <span class="f12" style="color: #ff0000;" @click="openTc(item.type,'wqs')">未签收:{{ item.wqsyj }}</span>
<span class="f12" style="color: #4cf35d;" @click="openTc(item.type,'yfk')">已反馈:{{ item.yfkyj }}</span> <span class="f12" style="color: #4cf35d;" @click="openTc(item.type,'yfk')">已反馈:{{ item.yfkyj }}</span>