This commit is contained in:
lcw
2025-12-17 16:28:08 +08:00
21 changed files with 1074 additions and 299 deletions

View File

@ -106,3 +106,10 @@ export const useStatistics = (data) => {
data
});
};
/** 获取是否红色名字,市情指领导、优秀信息员、优秀研判名字要变橙红色 */
export const getUserIsRed = () => {
return request({
url: '/mosty-api/mosty-gsxt' + "/xxcj/mjjf/sfgxys",
method: "GET"
});
};

View File

@ -23,122 +23,6 @@ export const privateRoutes = [
* 公开路由表
*/
export const publicRoutes = [
{
path: "/systemConfig",
component: layout,
name: "systemConfigModel",
redirect: "/dict/index",
meta: {
title: "系统管理",
icon: "article"
},
children: [
{
path: "/user/department-ist",
name: "departmentList",
component: () => import("@/views/backOfficeSystem/systemConfig/department-list/index"),
meta: {
title: "部门管理",
icon: "article-ranking"
}
},
{
path: "/user/userList",
name: "userList",
component: () =>
import("@/views/backOfficeSystem/systemConfig/user-list/index"),
meta: {
title: "用户管理",
icon: "article-ranking"
}
},
{
path: "/user/role",
name: "userRoleIndex",
component: () =>
import("@/views/backOfficeSystem/systemConfig/role-list/index"),
meta: {
title: "角色列表",
icon: "article-ranking"
}
},
{
path: "/user/menuList",
name: "menuList",
component: () =>
import("@/views/backOfficeSystem/systemConfig/menu-list/index"),
meta: {
title: "菜单管理",
icon: "article-ranking"
}
},
{
path: "/dict/detail",
name: "dictDetail",
component: () =>
import("@/views/backOfficeSystem/systemConfig/dict/detail"),
meta: {
title: "字典数据"
}
},
{
path: "/dict/index",
name: "dictIndex",
component: () =>
import("@/views/backOfficeSystem/systemConfig/dict/index"),
meta: {
title: "字典列表",
icon: "article-ranking"
}
},
{
path: "/user/deptAllocationUser/:id",
name: "deptAllocationUser",
component: () =>
import(
"@/views/backOfficeSystem/systemConfig/department-list/deptAllocationUser"
),
meta: {
title: "管理用户"
}
},
{
path: "/user/allocationUser/:id",
name: "allocationUser",
component: () =>
import(
"@/views/backOfficeSystem/systemConfig/role-list/allocationUser"
),
meta: {
title: "分配用户"
}
},
{
path: "/user/systemConfig",
name: "systemConfig",
component: () =>
import(
"@/views/backOfficeSystem/systemConfig/system-config-list/index"
),
meta: {
title: "系统配置",
icon: "article-ranking"
}
}, {
path: "/calendar",
name: "calendar",
component: () => import("@/views/backOfficeSystem/calendar/index.vue"),
meta: {
title: "敏感节点",
icon: "article"
}
},
]
},
{
path: "/oatuh_login",
name: "oatuh_login",
@ -252,12 +136,12 @@ export const publicRoutes = [
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/index"),
// meta: { title: "预警中心大屏", icon: "article" },
// },
{
path: "/warningBk",
name: "warningBk",
meta: { title: "布控预警", icon: "article" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/warningBk/index"),
},
// {
// path: "/warningBk",
// name: "warningBk",
// meta: { title: "布控预警", icon: "article" },
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/warningBk/index"),
// },
{
path: "/identityWarning",
@ -306,12 +190,12 @@ export const publicRoutes = [
icon: "article"
}
},
{
path: "/fouColorWarning",
name: "fouColorWarning",
meta: { title: "四色预警", icon: "article" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/fouColorWarning/index"),
},
// {
// path: "/fouColorWarning",
// name: "fouColorWarning",
// meta: { title: "四色预警", icon: "article" },
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/fouColorWarning/index"),
// },
{
path: "/scoreRanking",
name: "scoreRanking",
@ -442,14 +326,6 @@ export const publicRoutes = [
}
},
{
path: "/tsypHome_",
name: "tsypHome",
component: () => import("@/views/backOfficeSystem/JudgmentHome/tsypHome/index"),
meta: {
title: "数据监测",
icon: "article"
}
}, {
path: "/ssemanticAnalysis",
name: "semanticAnalysis",
component: () => import("@/views/backOfficeSystem/SemanticAnalysis/index.vue"),
@ -485,31 +361,6 @@ export const publicRoutes = [
}
]
},
{
path: "/dataMonitor",
name: "dataMonitor",
meta: { title: "数据监控", icon: "article" },
children: [
{
path: "/resourceMonitoring",
name: "resourceMonitoring",
component: () => import("@/views/backOfficeSystem/dataMonitor/resourceMonitoring/index.vue"),
meta: {
title: "数据资源检测",
icon: "article"
}
},
// {
// path: "/onlineUserMonitoring",
// name: "onlineUserMonitoring",
// component: () => import("@/views/backOfficeSystem/dataMonitor/onlineUserMonitoring/index.vue"),
// meta: {
// title: "在线用户监控",
// icon: "article"
// }
// }
]
},
{
path: "/IntelligentControl",
name: "IntelligentControl",
@ -735,6 +586,15 @@ export const publicRoutes = [
icon: "article"
},
children: [
{
path: "/ResearchHome",
name: "ResearchHome",
component: () => import("@/views/backOfficeSystem/JudgmentHome/ResearchHome/index"),
meta: {
title: "智能研判",
icon: "article"
}
},
{
path: "/dataReduction",
name: "dataReduction",
@ -744,44 +604,34 @@ export const publicRoutes = [
icon: "article"
}
},
// {
// path: "/situationHome",
// name: "situationHome",
// component: () => import("@/views/backOfficeSystem/JudgmentHome/situationHome/index"),
// meta: {
// title: "战略研判",
// icon: "article"
// }
// },
// 后面写的研判
{
path: "/ResearchHome",
name: "ResearchHome",
component: () => import("@/views/backOfficeSystem/JudgmentHome/ResearchHome/index"),
path: "/tacticalResearch",
name: "tacticalResearch",
component: () => import("@/views/backOfficeSystem/JudgmentHome/tacticalResearch/index.vue"),
meta: {
title: "战术研判",
icon: "article"
}
},
{
path: "/situationHome",
name: "situationHome",
component: () => import("@/views/backOfficeSystem/JudgmentHome/situationHome/index"),
path: "/strategicResearch",
name: "strategicResearch",
component: () => import("@/views/backOfficeSystem/JudgmentHome/strategicResearch/index.vue"),
meta: {
title: "战略研判",
icon: "article"
}
},
// 后面写的研判
// {
// path: "/tacticalResearch",
// name: "tacticalResearch",
// component: () => import("@/views/backOfficeSystem/JudgmentHome/tacticalResearch/index.vue"),
// meta: {
// title: "战术研判",
// icon: "article"
// }
// },
// {
// path: "/strategicResearch",
// name: "strategicResearch",
// component: () => import("@/views/backOfficeSystem/JudgmentHome/strategicResearch/index.vue"),
// meta: {
// title: "战略研判",
// icon: "article"
// }
// },
{
path: "/judgmentCommand",
name: "judgmentCommand",
@ -929,6 +779,147 @@ export const publicRoutes = [
title: "情报论坛",
icon: "article"
}
},
{
path: "/dataMonitor",
name: "dataMonitor",
meta: { title: "数据监控", icon: "article" },
children: [
{
path: "/resourceMonitoring",
name: "resourceMonitoring",
component: () => import("@/views/backOfficeSystem/dataMonitor/resourceMonitoring/index.vue"),
meta: {
title: "数据资源检测",
icon: "article"
}
},
{
path: "/onlineUserMonitoring",
name: "onlineUserMonitoring",
component: () => import("@/views/backOfficeSystem/dataMonitor/onlineUserMonitoring/index.vue"),
meta: {
title: "在线用户监控",
icon: "article"
}
}
]
},
{
path: "/systemConfig",
component: layout,
name: "systemConfigModel",
redirect: "/dict/index",
meta: {
title: "系统管理",
icon: "article"
},
children: [
{
path: "/user/department-ist",
name: "departmentList",
component: () => import("@/views/backOfficeSystem/systemConfig/department-list/index"),
meta: {
title: "部门管理",
icon: "article-ranking"
}
},
{
path: "/user/userList",
name: "userList",
component: () =>
import("@/views/backOfficeSystem/systemConfig/user-list/index"),
meta: {
title: "用户管理",
icon: "article-ranking"
}
},
{
path: "/user/role",
name: "userRoleIndex",
component: () =>
import("@/views/backOfficeSystem/systemConfig/role-list/index"),
meta: {
title: "角色列表",
icon: "article-ranking"
}
},
{
path: "/user/menuList",
name: "menuList",
component: () =>
import("@/views/backOfficeSystem/systemConfig/menu-list/index"),
meta: {
title: "菜单管理",
icon: "article-ranking"
}
},
{
path: "/dict/detail",
name: "dictDetail",
component: () =>
import("@/views/backOfficeSystem/systemConfig/dict/detail"),
meta: {
title: "字典数据"
}
},
{
path: "/dict/index",
name: "dictIndex",
component: () =>
import("@/views/backOfficeSystem/systemConfig/dict/index"),
meta: {
title: "字典列表",
icon: "article-ranking"
}
},
{
path: "/user/deptAllocationUser/:id",
name: "deptAllocationUser",
component: () =>
import(
"@/views/backOfficeSystem/systemConfig/department-list/deptAllocationUser"
),
meta: {
title: "管理用户"
}
},
{
path: "/user/allocationUser/:id",
name: "allocationUser",
component: () =>
import(
"@/views/backOfficeSystem/systemConfig/role-list/allocationUser"
),
meta: {
title: "分配用户"
}
},
{
path: "/user/systemConfig",
name: "systemConfig",
component: () =>
import(
"@/views/backOfficeSystem/systemConfig/system-config-list/index"
),
meta: {
title: "系统配置",
icon: "article-ranking"
}
}, {
path: "/calendar",
name: "calendar",
component: () => import("@/views/backOfficeSystem/calendar/index.vue"),
meta: {
title: "敏感节点",
icon: "article"
}
},
]
},
{
path: "/rests",
@ -938,19 +929,36 @@ export const publicRoutes = [
icon: "article"
},
children: [
// {
// path: "/fouColorWarning",
// name: "fouColorWarning",
// meta: { title: "四色预警", icon: "article" },
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/fouColorWarning/index"),
// },
{
path: "/CollectCrculate",
name: "CollectCrculate",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/CollectCrculate/index"),
meta: { title: "信息采集", icon: "article" },
meta: { title: "情报采集", icon: "article" },
},
{
path: "/fouColorWarning",
name: "fouColorWarning",
meta: { title: "四色预警", icon: "article" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/fouColorWarning/index"),
},
// {
// path: "/ResearchHome",
// name: "ResearchHome",
// component: () => import("@/views/backOfficeSystem/JudgmentHome/ResearchHome/index"),
// meta: {
// title: "战术研判",
// icon: "article"
// }
// },
// {
// path: "/situationHome",
// name: "situationHome",
// component: () => import("@/views/backOfficeSystem/JudgmentHome/situationHome/index"),
// meta: {
// title: "战略研判",
// icon: "article"
// }
// },
]
},
]

View File

@ -1,4 +1,4 @@
import { ref, toRefs } from 'vue';
import { ref, toRefs, isRef } from 'vue';
import { getSysDictByCode } from '@/api/sysDict' //引入封装数字字典接口
import { getLocalDic } from "@/utils/localDic/index.js"
@ -45,7 +45,7 @@ export function getDict(...args) {
p.children = p.itemList
})
res.value[d] = result.itemList
// console.log(`${d} - ${result.zdmc} :`, result.itemList);
//
})
}
@ -142,3 +142,38 @@ export function IdCard(IdCard, type) {
}
return user
}
/**
*翻译字典数据
* @export
* @param {*} dm
* @param {*} array
*/
export function getDictValue(dm, array) {
let item = array.value.find(item => {
if (item.value) {
return item.value == dm;
} else if (item.dm) {
return item.dm == dm;
}
})
return item ? item.label : ""
}
/** 获取多个字典值(一个值也可以) 字典内容 value-label
* @param {String} 要查的值
* @param {Array} dict 字典内容
*/
export function getMultiDictVal(values, dict) {
if (typeof values === 'string' && values?.length) values = values.split(',')
if (!Array.isArray(values)) return ''
if (isRef(dict)) dict = dict.value
if (!Array.isArray(dict)) return ''
return values.map(v => {
const item = dict.find(item => item.value === v);
return item ? item.label : v;
}).join(',');
}

56
src/utils/exportExcel.js Normal file
View File

@ -0,0 +1,56 @@
import * as XLSX from "xlsx";
/**
* 导出Excel(简单的导出)
* @param {Array} data 二维数据
* @param {String} fileName 文件名
*/
export function easyExport(data, fileName = '导出文件') {
const wb = XLSX.utils.book_new();
// 二维数组例子:[ ['姓名', '年龄', '城市'], ['张三', 25, '北京'], ['李四', 30, '上海'] ];
const ws = XLSX.utils.aoa_to_sheet(data); // aoa_to_sheet 方法将二维数组转换为工作表
// 宽度调整
ws['!cols'] = Array(data?.[0]?.length || 0).fill({ wpx: 80 });
XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
XLSX.writeFile(wb, fileName + '.xlsx');
}
/**
* 根据对象导出Excel
* @param {Object} titleObj 标题对象 {key: '标题', key2: '标题2'}
* @param {Array} dataArr 数据数组 例子 [{key: '张三', key2: '25'}, {key: '李四', key2: '30'}]
* @param {String} fileName 文件名
*/
export function exportExlByObj(titleObj, dataArr, fileName = '导出文件') {
dataArr = Array.isArray(dataArr) ? [...dataArr] : []
/** 列表标题数组 */
const titleArr = [Object.values(titleObj)];
const sheetHead = [fileName]
/** 转二维数据 */
const toNeedArr = (titleObj = {}, tableData = []) => {
return tableData.map(row => {
const rowArr = []
Object.keys(titleObj || {}).map(key => {
const cellVal = row[key] || ''
if (typeof cellVal !== 'string') String(cellVal)
rowArr.push(cellVal)
})
return rowArr
})
}
/** @param {Array} 表格数据 (二维数组) */
const tableData = toNeedArr(titleObj, dataArr);
// 合并标题和数据
const finalData = [...titleArr, ...tableData];
// 合并标题
easyExport(finalData, fileName);
}

View File

@ -10,6 +10,7 @@
<span style="vertical-align: middle" v-if="!search">搜索</span>
<span style="vertical-align: middle" v-else>关闭搜索</span>
</el-button>
<el-button type="primary" @click="exportExl">导出</el-button>
</PageTitle>
</div>
<!-- 搜索 -->
@ -19,16 +20,22 @@
<!-- 表格 -->
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<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"
:expand="true" @chooseData="handleChooseData">
<template #xwcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.xwcs }}</span>
</template>
<template #bqYs="{ row }">
<template #bqys="{ row }">
<DictTag :value="row.bqys" :tag="false" :color="bqYs(row.bqys)" :options="D_GS_SSYJ" />
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%">
<Items :row="props" :dict="dict" />
</div>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="showDetail(row)">转合成</el-link>
@ -64,6 +71,7 @@ import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Items from "./item/items.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import { tbGsxtBqglSelectList } from '@/api/zdr'
@ -74,10 +82,21 @@ import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/ce
import { reactive, ref, onMounted, getCurrentInstance, computed, watch, nextTick } from "vue";
import AddFrom from './components/addFrom.vue'
import { holographicProfileJump } from "@/utils/tools.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
const { proxy } = getCurrentInstance();
const { D_GS_SSYJ, D_GSXT_YJXX_CZZT } = proxy.$dict("D_GS_SSYJ", "D_GSXT_YJXX_CZZT"); //获取字典数据
// 字典数据集合
const dict = ref({
D_GS_SSYJ,
D_GSXT_YJXX_CZZT
})
const searchBox = ref(); //搜索框
/** 选中项 */
const selectRows = ref([])
const bqLbData = ref({
bqXl: []
})
@ -100,7 +119,7 @@ const pageData = reactive({
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
showSelectType: "checkBox",
loading: false,
haveControls: true
},
@ -118,7 +137,7 @@ const pageData = reactive({
{ label: "行为子类", prop: "xwzlmc", showOverflowTooltip: true },
{ label: "行为描述", prop: "xwms", showOverflowTooltip: true },
{ label: "行为次数", prop: "xwcs", showSolt: true },
{ label: "行为颜色", prop: "bqYs", showSolt: true },
{ label: "行为颜色", prop: "bqys", showSolt: true },
{ label: "行为分值", prop: "xwfz", },
{ label: "处置状态", prop: "czzt", showSolt: true },
{ label: "所属县局", prop: "ssbm" },
@ -286,6 +305,39 @@ const tabHeightFn = () => {
tabHeightFn();
};
};
/** 触发选中 */
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
xm: "姓名",
sfzh: "身份证号",
dh: "电话",
xldlmc: "行为大类",
xwzlmc: "行为子类",
xwms: "行为描述",
xwcs: "行为次数",
bqys_cname: "行为颜色",
xwfz: "行为分值",
czzt_cname: "处置状态",
ssbm: "所属县局",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
bqys_cname: getMultiDictVal(item.bqys, D_GS_SSYJ),
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
}
})
exportExlByObj(titleObj, data, '行为预警')
}
</script>
<style>

View File

@ -0,0 +1,106 @@
<template>
<div class="warning-item">
<div class="second-row">
<div class="info-item">预警人姓名<span>{{ row.xm }}</span></div>
<div class="info-item">身份证号<span>{{ row.sfzh }}</span></div>
<div class="info-item">电话<span>{{ row.dh }}</span></div>
</div>
<div class="second-row">
<div class="info-item">行为大类<span>{{ row.xldlmc }}</span></div>
<div class="info-item">行为子类<span>{{ row.xwzlmc }}</span></div>
<div class="info-item">行为次数<span>{{ row.xwcs }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
标签颜色
<DictTag :value="row.bqys" :tag="false" :color="bqYs(row.bqys)"
:options="Array.isArray(props.dict.D_GS_SSYJ) ? props.dict.D_GS_SSYJ : []" />
</div>
<div class=" info-item">预警时间<span>{{ row.yjsj }}</span>
</div>
<div class="info-item">行为分值<span>{{ row.xwfz }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
处置状态
<DictTag v-model:value="row.czzt"
:options="Array.isArray(props.dict.D_GSXT_YJXX_CZZT) ? props.dict.D_GSXT_YJXX_CZZT : []" />
</div>
<div class="info-item">所属部门<span>{{ row.ssbm }}</span></div>
<div class="info-item">所属县局<span>{{ row.ssxgaj }}</span></div>
</div>
<div class="second-row">
<div class="info-item">所属市局<span>{{ row.sssgaj }}</span></div>
<div class="info-item">接警员姓名<span>{{ row.jjyxm }}</span></div>
</div>
<div class="second-row">
<div class="info-item full-width">行为描述<span>{{ row.xwms }}</span></div>
</div>
</div>
</template>
<script setup>
const props = defineProps({
/** 表格行数据 */
row: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({
D_GS_SSYJ: [],
D_GSXT_YJXX_CZZT: []
})
},
})
const bqYs = (val) => {
if (val == '01') { // 红
return '#ff0202'
} else if (val == '02') { // 橙
return '#ff8c00'
} else if (val == '03') { // 黄
return '#c2c203' // 原亮黄色ffff00
} else if (val == '04') { // 蓝
return '#0000ff'
}
}
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
border: 1px solid #e8e8e8;
border-radius: 8px;
background-color: #fafafa;
}
.second-row {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin-bottom: 10px;
}
.info-item {
flex: 0 0 calc(33.33% - 20px);
box-sizing: border-box;
display: flex;
padding: 5px 0;
color: #333;
span {
font-weight: 500;
color: #606266;
}
}
// 全宽字段
.full-width {
flex: 0 0 100% !important;
}
</style>

View File

@ -10,6 +10,7 @@
<span style="vertical-align: middle" v-if="!search">搜索</span>
<span style="vertical-align: middle" v-else>关闭搜索</span>
</el-button>
<el-button type="primary" @click="exportExl">导出</el-button>
</PageTitle>
</div>
<!-- 搜索 -->
@ -17,9 +18,10 @@
<Searchs :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Searchs>
</div>
<!-- 表格 -->
<div class="tabBox" :style="{height:(pageData.tableHeight + 40)+'px'}">
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<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"
:expand="true" @chooseData="handleChooseData">
<template #sfcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.sfcs }}</span>
</template>
@ -29,6 +31,11 @@
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%">
<Items :row="props || {}" :dict="dict" />
</div>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="showDetail(row)">转合成</el-link>
@ -60,19 +67,29 @@ import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Items from "./item/items.vue";
import { tbYjxxGetZbtj, tbGsxtBqzhSelectList } from '@/api/yj.js'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import AddFrom from "./components/addFrom.vue";
import { reactive, ref, onMounted, getCurrentInstance, watch,nextTick } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, watch, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import Detail from './components/detail.vue'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import emitter from "@/utils/eventBus.js";
const searchBox = ref();
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB } = proxy.$dict("D_GSXT_YJXX_CZZT","D_GS_SSYJ","D_BZ_YJJB");
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ", "D_BZ_YJJB");
// 字典数据集合
const dict = ref({
D_GS_SSYJ,
D_GSXT_YJXX_CZZT
})
import { holographicProfileJump } from "@/utils/tools.js"
// 搜索配置
@ -184,6 +201,8 @@ const handleClick = (row) => {
detailRef.value.init(row)
}
const assessShow = ref(false)
/** 选中项 */
const selectRows = ref([])
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val?.sfzh) // 全息档案跳转
@ -255,10 +274,43 @@ const tabHeightFn = () => {
} else {
pageData.tableHeight = window.innerHeight - 250;
}
window.onresize = function () {
window.onresize = function() {
tabHeightFn();
};
};
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
xm: "姓名",
sfzh: "身份证号",
dh: "电话",
sfdlmc: "组合大类",
sfzlmc: "组合小类",
sfcs: "组合次数",
bqys_cname: "标签颜色",
yjsj: "预警时间",
sffz: "预警分值",
czzt_cname: "处置状态",
ssbm: "所属县局",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
bqys_cname: getMultiDictVal(item.bqys, D_GS_SSYJ),
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
}
})
exportExlByObj(titleObj, data, '组合预警')
}
</script>
<style>

View File

@ -0,0 +1,74 @@
<template>
<div class="warning-item">
<div class="second-row">
<div class="info-item">姓名<span>{{ row.xm }}</span></div>
<div class="info-item">身份证号<span>{{ row.sfzh }}</span></div>
<div class="info-item">电话<span>{{ row.dh }}</span></div>
</div>
<div class="second-row">
<div class="info-item">组合大类<span>{{ row.sfdlmc }}</span></div>
<div class="info-item">组合小类<span>{{ row.sfzlmc }}</span></div>
<div class="info-item">组合次数<span>{{ row.sfcs }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
标签颜色<DictTag v-model:value="row.bqys" :options="props.dict.D_GS_SSYJ" />
</div>
<div class="info-item">预警时间<span>{{ row.yjsj }}</span></div>
<div class="info-item">预警分值<span>{{ row.sffz }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
处置状态<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
</div>
<div class="info-item">所属县局<span>{{ row.ssbm }}</span></div>
</div>
</div>
</template>
<script setup>
const props = defineProps({
/** 表格行数据 */
row: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({
D_GS_SSYJ: [],
D_GSXT_YJXX_CZZT: []
})
},
})
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
border: 1px solid #e8e8e8;
border-radius: 8px;
background-color: #fafafa;
}
.second-row {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin-bottom: 10px;
}
.info-item {
flex: 0 0 calc(33.33% - 20px);
box-sizing: border-box;
display: flex;
padding: 5px 0;
color: #333;
span {
font-weight: 500;
color: #606266;
}
}
</style>

View File

@ -10,6 +10,7 @@
<span style="vertical-align: middle" v-if="!search">搜索</span>
<span style="vertical-align: middle" v-else>关闭搜索</span>
</el-button>
<el-button type="primary" @click="exportExl">导出</el-button>
</PageTitle>
</div>
<!-- 搜索 -->
@ -29,9 +30,15 @@
</Searchs>
</div>
<!-- 表格 -->
<div class="tabBox" :style="{height:(pageData.tableHeight + 40)+'px'}">
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<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" expand
@chooseData="handleChooseData">
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%">
<Items :row="props || {}" :dict="dict" />
</div>
</template>
<template #sfcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.sfcs }}</span>
</template>
@ -64,7 +71,7 @@
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<AddFrom ref="addModelRef" :dict="{D_GSXT_YJXX_CZZT, D_BZ_YJJB,D_GS_SSYJ}"/>
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
</template>
<script setup>
@ -77,7 +84,7 @@ import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import AddFrom from "./components/addFrom.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import { reactive, ref, onMounted, getCurrentInstance,nextTick } from "vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { yjzxSfyjSelectList } from "@/api/yj.js";
import { tbGsxtBqglSelectList } from '@/api/zdr'
@ -85,10 +92,14 @@ import Detail from './components/detail.vue'
import { watch } from "vue";
import emitter from "@/utils/eventBus.js";
import { holographicProfileJump } from "@/utils/tools.js"
import Items from "./item/items.vue"
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
const { proxy } = getCurrentInstance();
const searchBox = ref();
const {D_GSXT_YJXX_CZZT,D_GS_SSYJ} = proxy.$dict("D_GSXT_YJXX_CZZT","D_GS_SSYJ")
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ")
const dict = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ })
// 搜索配置
const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
@ -156,8 +167,16 @@ const getList = () => {
pageData.tableConfiger.loading = true;
// TODO: 替换为实际的身份预警API接口
yjzxSfyjSelectList(queryFrom.value).then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total || 0;
pageData.tableData = Array.isArray(res?.records) ? res.records : [];
pageData.tableData = pageData.tableData.map(item => {
return {
...item,
bqys_cname: getMultiDictVal(item.bqys, D_GS_SSYJ),
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
}
})
pageData.total = res?.total || 0;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
@ -287,10 +306,42 @@ const tabHeightFn = () => {
} else {
pageData.tableHeight = window.innerHeight - 250;
}
window.onresize = function () {
window.onresize = function() {
tabHeightFn();
};
};
/** 选中项 */
const selectRows = ref([])
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
xm: "姓名",
sfzh: "身份证号",
dh: "电话",
sfdlmc: "组合大类",
sfzlmc: "组合小类",
sfcs: "组合次数",
bqys_cname: "标签颜色",
yjsj: "预警时间",
sffz: "预警分值",
czzt_cname: "处置状态",
ssbm: "所属县局",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
bqys_cname: getMultiDictVal(item.bqys, D_GS_SSYJ),
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
}
})
exportExlByObj(titleObj, data, '身份预警')
}
</script>
<style>

View File

@ -0,0 +1,83 @@
<template>
<div class="warning-item">
<div class="second-row">
<div class="info-item">预警人姓名<span>{{ row.xm }}</span></div>
<div class="info-item">身份证号<span>{{ row.sfzh }}</span></div>
<div class="info-item">电话<span>{{ row.dh }}</span></div>
</div>
<div class="second-row">
<div class="info-item">组合大类<span>{{ row.sfdlmc }}</span></div>
<div class="info-item">组合小类<span>{{ row.sfzlmc }}</span></div>
<div class="info-item">组合预警次数<span>{{ row.sfcs }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
标签颜色
<DictTag v-model:value="row.bqys" :options="props.dict.D_GS_SSYJ" />
</div>
<div class="info-item">预警时间<span>{{ row.yjsj }}</span></div>
<div class="info-item">预警分值<span>{{ row.sffz }}</span></div>
</div>
<div class="second-row">
<div class="info-item">
处置状态
<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
</div>
<div class="info-item">所属部门<span>{{ row.ssbm }}</span></div>
<div class="info-item">所属县局<span>{{ row.ssxgaj }}</span></div>
</div>
<div class="second-row">
<div class="info-item">所属市局<span>{{ row.sssgaj }}</span></div>
<div class="info-item">接警员姓名<span>{{ row.jjyxm }}</span></div>
</div>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
// import DictTag from '@/components/dictTag.vue'
const props = defineProps({
/** 表格行数据 */
row: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({
D_GS_SSYJ: [],
D_GSXT_YJXX_CZZT: []
})
},
})
// console.log('row😃: ', props.row);
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
border: 1px solid #e8e8e8;
border-radius: 8px;
background-color: #fafafa;
}
.second-row {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin-bottom: 10px;
}
.info-item {
flex: 0 0 calc(33.33% - 20px);
box-sizing: border-box;
display: flex;
padding: 5px 0;
color: #333;
span {
font-weight: 500;
color: #606266;
}
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<div>
<div class="titleBox">
<PageTitle title="预警布控">
<PageTitle title="布控预警">
<el-button>
<span style="vertical-align: middle">导出</span>
</el-button>
@ -13,24 +13,22 @@
</div>
<!-- 表格 -->
<div class="tabBox">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:expand="true">
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_BZ_YJJB" />
</template>
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%">
<Items :row="props || {}" :dict="dict" />
</div>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
}"></Pages>
</div>
</div>
</template>
@ -40,22 +38,33 @@ import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet } from "@/api/qcckApi.js";
import Items from "./item/items.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { bqYs } from '@/utils/tools'
const { proxy } = getCurrentInstance();
const { D_BZ_YJJB, D_GS_ZDQT_YJLB, D_BZ_YJLX, D_GS_SSYJ, D_GSXT_YJXX_CZZT } = proxy.$dict("D_BZ_YJJB", "D_GS_ZDQT_YJLB", "D_BZ_YJLX", "D_GS_SSYJ", "D_GSXT_YJXX_CZZT"); //获取字典数据
// 字典数据集合
const dict = ref({
D_BZ_YJJB
})
const searchBox = ref();
// 搜索配置
const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input"},
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input"},
{ label: "身份类型", prop: 'sflx', placeholder: "请选择身份类型", showType: "select", options: [
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{
label: "身份类型", prop: 'sflx', placeholder: "请选择身份类型", showType: "select", options: [
{ label: "重点人员", value: "1" },
{ label: "在逃人员", value: "2" },
{ label: "涉毒人员", value: "3" },
{ label: "涉恐人员", value: "4" }
]},
]
},
]);
const queryFrom = ref({});
@ -77,14 +86,17 @@ const pageData = reactive({
},
controlsWidth: 160,
tableColumn: [
{ label: "姓名", prop: "xm",},
{ label: "身份证号", prop: "sfzh", },
{ label: "电话", prop: "dh", },
{ label: "身份类型", prop: "sflx",},
{ label: "身份等级", prop: "sfdj",},
{ label: "预警原因", prop: "yjyy", showOverflowTooltip: true },
{ label: "预警时间", prop: "yjsj",},
{ label: "处理状态", prop: "clzt",},
{ label: "预警标题", prop: "yjBt", },
{ label: "姓名", prop: "yjRyxm", },
{ label: "身份证号", prop: "yjRysfzh", },
{ label: "电话", prop: "yjRysjh", },
// { label: "身份类型", prop: "sflx",},
// { label: "身份等级", prop: "sfdj",},
{ label: "预警内容", prop: "yjNr", showOverflowTooltip: true },
{ label: "预警日期", prop: "yjFsrq", },
{ label: "预警时间", prop: "yjFssj", },
{ label: "预警标签详情", prop: "yjbqmc", },
{ label: "预警级别", prop: "yjJb", showSolt: true, showOverflowTooltip: true },
]
});
@ -94,7 +106,7 @@ onMounted(() => {
});
const onSearch = (val) => {
queryFrom.value = {...val};
queryFrom.value = { ...val };
pageData.pageConfiger.pageCurrent = 1;
getList();
};
@ -112,7 +124,8 @@ const changeSize = (val) => {
const getList = () => {
pageData.tableConfiger.loading = true;
// TODO: 替换为实际的身份预警API接口
qcckGet(queryFrom.value, '/mosty-gsxt/identityWarning/selectPage').then((res) => {
// qcckGet(queryFrom.value, '/mosty-gsxt/identityWarning/selectPage').then((res) => {
qcckPost(queryFrom.value, '/mosty-gsxt/tbYjxx/getPageList').then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
@ -124,7 +137,7 @@ const getList = () => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
window.onresize = function () {
window.onresize = function() {
tabHeightFn();
};
};

View File

@ -0,0 +1,70 @@
<template>
<div class="warning-item">
<div class="second-row">
<div class="info-item">预警标题<span>{{ row.yjBt }}</span></div>
<div class="info-item">姓名<span>{{ row.yjRyxm }}</span></div>
<div class="info-item">身份证号<span>{{ row.yjRysfzh }}</span></div>
</div>
<div class="second-row">
<div class="info-item">电话<span>{{ row.yjRysjh }}</span></div>
<div class="info-item">预警内容<span>{{ row.yjNr }}</span></div>
<div class="info-item">预警日期<span>{{ row.yjFsrq }}</span></div>
</div>
<div class="second-row">
<div class="info-item">预警时间<span>{{ row.yjFssj }}</span></div>
<div class="info-item">预警标签详情<span>{{ row.yjbqmc }}</span></div>
<div class="info-item">
预警级别
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="Array.isArray(props.dict.D_BZ_YJJB) ? props.dict.D_BZ_YJJB : []" />
</div>
</div>
</div>
</template>
<script setup>
import { bqYs } from '@/utils/tools'
const props = defineProps({
/** 表格行数据 */
row: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({
D_BZ_YJJB: []
})
},
})
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
border: 1px solid #e8e8e8;
border-radius: 8px;
background-color: #fafafa;
}
.second-row {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin-bottom: 10px;
}
.info-item {
flex: 0 0 calc(33.33% - 20px);
box-sizing: border-box;
display: flex;
padding: 5px 0;
color: #333;
span {
font-weight: 500;
color: #606266;
}
}
</style>

View File

@ -4,7 +4,7 @@
<div class="tabBox" :style="{ height: !search ? maxHeight + 200 + 'px' : (maxHeight + 150) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="maxHeight + 'px'"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:expand="true">
:expand="true" @chooseData="handleChooseData">
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%">
<Items :data="props" :dict="dict" />
@ -85,6 +85,10 @@ import { holographicProfileJump } from "@/utils/tools.js"
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
const { proxy } = getCurrentInstance();
const props = defineProps({
dict: {
@ -97,6 +101,10 @@ const props = defineProps({
}, search: {
type: Boolean,
default: false
},
excelTitle: {
type: String,
default: '预警信息'
}
});
const pageData = reactive({
@ -104,7 +112,7 @@ const pageData = reactive({
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
showSelectType: "checkBox",
loading: false,
haveControls: true
},
@ -131,8 +139,8 @@ const pageData = reactive({
});
/** 选中项 */
const selectRows = ref([])
@ -243,7 +251,49 @@ const getRowClassName = (row) => {
// tabHeightFn();
// };
// };
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_cname: "处置状态",
yjSj: "预警时间",
yjRyxm: "姓名",
nl_cname: "年龄", // IdCard(row.yjRysfzh, 3)
yjLylx: "数据来源",
xb_cname: "性别",
yjJb_cname: "预警级别",
xsd_cname: "相似度",
yjDz: "预警地点",
yjCs: "预警次数",
yjRysjh: "布控手机号",
yjClcph: "布控车牌号",
yjRysfzh: "身份证",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
nl_cname: IdCard(item.yjRysfzh, 3),
xb_cname: IdCard(item.yjRysfzh, 2),
xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%',
czzt_cname: getMultiDictVal(item.czzt, props.dict.D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, props.dict.D_BZ_YJJB),
}
})
exportExlByObj(titleObj, data, props.excelTitle || '人像预警.xlsx')
}
defineExpose({
exportExl,
getList
})
</script>

View File

@ -8,6 +8,7 @@
<span style="vertical-align: middle" v-if="!search">搜索</span>
<span style="vertical-align: middle" v-else>关闭搜索</span>
</el-button>
<el-button type="primary" @click="exportExl">导出</el-button>
</PageTitle>
</div>
<!-- 搜索 -->
@ -32,9 +33,9 @@
</div>
<!-- 表格 -->
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px', paddingTop: '10px' }">
<div style="padding:0 10px;"> <el-button type="primary" @click="exportExcel">导出</el-button></div>
<LocalWarning :maxHeight="search ? (pageData.tableHeight - 200) : (pageData.tableHeight - 150)"
ref="localWarningRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" :search="search" />
<!-- <div style="padding:0 10px;"> <el-button type="primary" @click="exportExcel">导出</el-button></div> -->
<LocalWarning :maxHeight="search ? (pageData.tableHeight - 160) : (pageData.tableHeight - 110)"
ref="localWarningRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" :search="search" excelTitle="人像预警" />
</div>
</div>
<el-dialog v-model="showDc" title="导出预警" width="80%">
@ -99,6 +100,8 @@ import AddFromz from './components/addFrom.vue';
import FileSaver from "file-saver";
import emitter from "@/utils/eventBus.js";
import * as XLSX from "xlsx";
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_BZ_YJJB", "D_BZ_YJLYXT")
const searchBox = ref(); //搜索框
@ -131,6 +134,8 @@ const shortcuts = [
},
},
]
const pageData = reactive({
/** 表格高度 */
tableHeight: 600,
@ -344,6 +349,10 @@ const handleExport = () => {
console.error('导出Excel失败:', e);
}
}
const exportExl = () => {
localWarningRef.value && localWarningRef.value.exportExl()
};
</script>
<style lang="scss" scoped>
::v-deep .el-table--fit {

View File

@ -1,10 +1,10 @@
<template>
<div>
<!-- 表格 -->
<div class="tabBox" :style="{height:!search?maxHeight+200+'px':(maxHeight+150)+'px'}">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="maxHeight+'px'"
<div class="tabBox" :style="{ height: !search ? maxHeight + 200 + 'px' : (maxHeight + 150) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="maxHeight + 'px'"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:expand="true" >
:expand="true" @chooseData="handleChooseData">
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%">
<Items :data="props" :dict="dict" />
@ -54,7 +54,7 @@
<el-button type="success" @click="showFeedback(item, '反馈')" v-if="item.czzt == '02'">反馈</el-button>
<el-button type="success" @click="showFeedback(item, '查看反馈')" v-if="item.czzt == '03'">查看反馈</el-button> -->
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="maxHeight+100" :pageConfiger="{
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="maxHeight + 100" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
@ -82,9 +82,12 @@ import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import emitter from "@/utils/eventBus.js";
import { holographicProfileJump } from "@/utils/tools.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const props = defineProps({
dict: {
@ -104,7 +107,7 @@ const pageData = reactive({
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
showSelectType: "checkBox",
loading: false,
haveControls: true
},
@ -116,11 +119,11 @@ const pageData = reactive({
}, //分页
controlsWidth: 300, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true,width: 100 },
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
{ label: "处置状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "姓名", prop: "yjRyxm" },
{ label: "年龄", prop: "nl", showSolt: true,width: 80 },
{ label: "年龄", prop: "nl", showSolt: true, width: 80 },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
// { label: "预警级别", prop: "yjJb", showSolt: true },
@ -131,7 +134,8 @@ const pageData = reactive({
});
/** 选中项 */
const selectRows = ref([])
@ -243,8 +247,48 @@ const getRowClassName = (row) => {
// tabHeightFn();
// };
// };
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_cname: "处置状态",
yjSj: "预警时间",
yjRyxm: "姓名",
nl_cname: "年龄", // IdCard(row.yjRysfzh, 3)
yjLylx: "数据来源",
xb_cname: "性别",
yjJb_cname: "预警级别",
xsd_cname: "相似度",
yjDz: "预警地点",
yjCs: "预警次数",
yjRysjh: "布控手机号",
yjClcph: "布控车牌号",
yjRysfzh: "身份证",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
nl_cname: IdCard(item.yjRysfzh, 3),
xb_cname: IdCard(item.yjRysfzh, 2),
xsd_cname: (item.xsd > 0 ? item.xsd : 0) + '%',
czzt_cname: getMultiDictVal(item.czzt, props.dict.D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, props.dict.D_BZ_YJJB),
}
})
exportExlByObj(titleObj, data, props.excelTitle || '预警.xlsx')
}
defineExpose({
getList
getList,
exportExl
})
</script>
@ -252,6 +296,7 @@ defineExpose({
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
/* 预警级别行样式 */
.warning-level-01 {
background-color: rgba(255, 2, 2, 0.1) !important;
@ -260,6 +305,7 @@ defineExpose({
.warning-level-01:hover {
background-color: rgba(255, 2, 2, 0.15) !important;
}
.warning-level-02 {
background-color: rgba(255, 140, 0, 0.1) !important;
}
@ -267,6 +313,7 @@ defineExpose({
.warning-level-02:hover {
background-color: rgba(255, 140, 0, 0.15) !important;
}
.warning-level-03 {
background-color: rgba(255, 210, 8, 0.1) !important;
}
@ -274,6 +321,7 @@ defineExpose({
.warning-level-03:hover {
background-color: rgba(255, 210, 8, 0.15) !important;
}
.warning-level-04 {
background-color: rgba(0, 0, 255, 0.1) !important;
}
@ -281,6 +329,7 @@ defineExpose({
.warning-level-04:hover {
background-color: rgba(0, 0, 255, 0.15) !important;
}
/* 确保行样式应用到所有单元格 */
.warning-level-01 td,
.warning-level-02 td,

View File

@ -8,6 +8,7 @@
<span style="vertical-align: middle" v-if="!search">搜索</span>
<span style="vertical-align: middle" v-else>关闭搜索</span>
</el-button>
<el-button type="primary" @click="exportExl">导出</el-button>
</PageTitle>
</div>
<!-- 搜索 -->
@ -29,9 +30,9 @@
</div>
<!-- 表格 -->
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px', paddingTop: '10px' }">
<div style="padding:0 10px;"> <el-button type="primary" @click="exportExcel">导出</el-button></div>
<LocalWarning :maxHeight="search ? (pageData.tableHeight - 200) : (pageData.tableHeight - 150)"
ref="localWarningRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" :search="search" />
<!-- <div style="padding:0 10px;"> <el-button type="primary" @click="exportExcel">导出</el-button></div> -->
<LocalWarning :maxHeight="search ? (pageData.tableHeight - 160) : (pageData.tableHeight - 110)"
ref="localWarningRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" :search="search" excelTitle="车辆预警" />
</div>
</div>
<el-dialog v-model="showDc" title="导出预警" width="80%">
@ -341,6 +342,11 @@ const handleExport = () => {
console.error('导出Excel失败:', e);
}
}
const exportExl = () => {
localWarningRef.value && localWarningRef.value.exportExl()
};
</script>
<style lang="scss" scoped>
::v-deep .el-table--fit {

View File

@ -65,7 +65,7 @@
<script setup>
import { IdCard } from '@/utils/validate.js'
import { reactive, ref, getCurrentInstance, watch } from "vue";
import { reactive, ref, getCurrentInstance, watch, defineEmits } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from './holographicArchive.vue'
import WarningAssignment from './warningAssignment.vue'
@ -85,10 +85,10 @@ const props = defineProps({
default: false
}
});
const emit = defineEmits(["plotThetrajectory", "showDetail", 'showFeedback','fkLxOptions']);
watch(() => props.item, (newVal, oldVal) => {
emit('fkLxOptions', newVal);
},{deep:true,immediate:true})
const emit = defineEmits(["plotThetrajectory", "showDetail", 'showFeedback','fkLxOptions']);
const showTransfer = (item) => {
router.push({

View File

@ -75,7 +75,7 @@
<div class="flex align-center">
<img class="mr10" src="@/assets/images/icon_046.png" alt="" />
<div class="f14">
<div style="color:#0BB7FF">{{ userName }}</div>
<div :style="{color:isRed ? '#ff5500' : '#fff',fontWeight:isRed ? 'bold' : 'normal'}">{{ userName }}</div>
<div>{{ dept }}</div>
</div>
@ -110,8 +110,11 @@ import { getItem } from "@/utils/storage";
import { timeValidate, weekValidate } from "@/utils/tools.js";
import { useRouter, useRoute, onBeforeRouteLeave } from "vue-router";
import { useStore } from "vuex";
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 icon2 = require("@/assets/images/icon_049.png"); //小雨
const icon3 = require("@/assets/images/icon_050.png"); //高温
@ -122,6 +125,8 @@ const icon7 = require("@/assets/images/icon_055.png"); //多云转晴 - 阴天
const icon8 = require("@/assets/images/icon_056.png"); //多云
import { ref, onMounted, defineEmits, defineProps, onUnmounted, reactive, watch } from "vue";
const userName = getItem("USERNAME");
/** 是否红色名字 市情指领导、优秀信息员、优秀研判名字要变橙红色*/
const isRed = ref(false)
const dept = getItem("deptId") ? getItem("deptId")[0].deptName : '';
const props = defineProps({
title: {
@ -163,12 +168,17 @@ const datatime = ref(timeValidate(null, "ymd"));
const timersfm = ref(null);
onMounted(() => {
// getWheather();
getIsRed()
timersfm.value = setInterval(() => {
CurrentTime();
}, 1000);
});
/** 获取名字是否标红 */
function getIsRed() {
getUserIsRed().then(res=>{
isRed.value = res === true
})
}
// 按钮切换
const handleBtns = (val) => {
console.log(val);

View File

@ -1,6 +1,6 @@
<template>
<div class="comom-title">
<div class="title">情报来源类型<span class="switchover" @click="reversalPush">切换</span></div>
<div class="title">岗位标兵<span class="switchover" @click="reversalPush">切换</span></div>
<el-popover :visible="visible" placement="right" :width="430">
<template #reference>
<div class="title" style="position: relative;z-index: 10000;height: 40px;width: 40px;" @click="visible = true">

View File

@ -5,7 +5,7 @@
优秀信息员
</div>
<div class="tab-button" :class="{ active: activeTab === 'ypy' }" @click="switchTab('ypy')">
优秀研判的列表
优秀研判
</div>
</div>

View File

@ -1,12 +1,56 @@
@echo off
echo <20><>ʼ<EFBFBD><CABC>֥<EFBFBD>ڸ<EFBFBD>pc<70><63><EFBFBD><EFBFBD>(sgxt_pc)...
chcp 65001 >nul
title 构建和打包工具
echo ========================================
echo 《林芝哨岗》 vue构建和打包工具
echo ========================================
echo.
cd /d "%~dp0"
echo [1/3] 清理旧的构建文件...
@REM if exist gsxt (
@REM rmdir /s /q gsxt
@REM )
if exist gsxt.zip (
del gsxt.zip
)
echo.
echo [2/3] 开始构建项目...
call npm run build
echo <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>...
if exist gsxt.zip del gsxt.zip
if %ERRORLEVEL% NEQ 0 (
echo.
echo ❌ 构建失败!请检查错误信息。
pause
exit /b 1
)
echo.
echo [3/3] 压缩构建文件...
if not exist gsxt (
echo ❌ 找不到构建输出文件夹 gsxt
pause
exit /b 1
)
powershell Compress-Archive -Path gsxt -DestinationPath gsxt.zip
echo ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>
explorer .
msg * "<EFBFBD><EFBFBD>֥<EFBFBD>ڸ<EFBFBD>pc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>"
start http://localhost:9528?project=sgxt_pc
powershell -Command "Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>', '<27>ɹ<EFBFBD>', [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Exclamation)"
if %ERRORLEVEL% EQU 0 (
echo.
echo ✅ 构建和打包完成!
echo 📦 输出文件: gsxt.zip
echo 📁 文件大小:
dir gsxt.zip | findstr gsxt.zip
start http://localhost:9528?project=sgxt_pc
explorer .
msg * "《林芝哨岗》打包完成!"
@REM powershell -Command "Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show('打包和压缩已完成!', '成功', [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Exclamation)"
) else (
echo ❌ 压缩失败!
)
echo.
echo 按任意键退出...
pause >nul