This commit is contained in:
2026-01-28 16:56:02 +08:00
parent 2635c76e79
commit 5545659aee
7 changed files with 342 additions and 14 deletions

View File

@ -166,7 +166,7 @@ export const publicRoutes = [
{
path: "/YjData",
name: "YjData",
meta: { title: "预警", icon: "article-create" },
meta: { title: "预警列表", icon: "article-create" },
component: () => import("@/views/backOfficeSystem/fourColorManage/YjData/index.vue"),
},
// {

View File

@ -7,13 +7,14 @@
</PageTitle>
<FouColorWarning v-if="qh=='预警整合'" />
<SevenWarning v-if="qh=='七类重点'" />
<IdentityWarning v-if="qh=='身份预警'" />
<BehaviorWarning v-if="qh=='行为预警'" />
<CombinedWarning v-if="qh=='组合预警'" />
<PortraitWarning v-if="qh=='人像预警'" />
<VehicleWarning v-if="qh=='车辆预警'" />
<ControlWarning v-if="qh=='布控预警'" />
<RegionalControl v-if="qh=='区域预警'" />
<WrjWarning v-if="qh=='无人机预警'" />
<IdentityWarning v-if="qh=='身份预警'" />
<BehaviorWarning v-if="qh=='行为预警'" />
<CombinedWarning v-if="qh=='组合预警'" />
</div>
</template>
<script setup>
@ -27,9 +28,10 @@ import PortraitWarning from "@/views/backOfficeSystem/fourColorManage/warningLis
import VehicleWarning from "@/views/backOfficeSystem/fourColorManage/warningList/vehicleWarning/index.vue"
import ControlWarning from "@/views/backOfficeSystem/fourColorManage/warningControl/controlWarning/index.vue"
import RegionalControl from "@/views/backOfficeSystem/fourColorManage/warningControl/regionalControl/index.vue"
import WrjWarning from "@/views/backOfficeSystem/fourColorManage/warningControl/wrjWarning/index.vue"
import { ref } from "vue";
const butList=ref(["预警整合","七类重点","身份预警","行为预警","组合预警","人像预警","车辆预警","布控预警","区域预警"])
const qh = ref('区域预警')
const butList=ref(["预警整合","七类重点","人像预警","车辆预警","布控预警","区域预警","无人机预警","身份预警","行为预警","组合预警",])
const qh = ref('预警整合')
const add = (flag) => {
qh.value = flag
}

View File

@ -0,0 +1,252 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount">
<template #age="{ row }">
<div class="ageBox">
<el-input v-model="queryFrom.age_s" placeholder="开始年龄" type="number" :min="1" :max="100" style="width: 102px;"></el-input>
<span style="color: #333;" class="ml5 mr5"></span>
<el-input v-model="queryFrom.age_b" placeholder="结束年龄" type="number" :min="parseInt(queryFrom.age_s)+1" :max="100" style="width: 102px;"></el-input>
</div>
</template>
</Search>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox heightBox">
<MyTable expand
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="handleChooseData"
>
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" />
</div>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #sex="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh,2) }} </span>
</template>
<template #age="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh,3) }} </span>
</template>
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :options="D_BZ_YJJB" />
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #yjLx="{ row }">
<DictTag :value="row.yjLx" :tag="false" :options="D_GS_QLZDRYXX" />
</template>
<template #controls="{ row }">
<el-link type="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</el-link>
<el-link type="warning" @click="pushWarning(row)">指派</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<ZpForm v-model="warningShow" :dataList="dataList"/>
</template>
<script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import Items from '@/views/backOfficeSystem/fourColorManage/warningList/portraitWarning/item/items.vue'
import ZpForm from "./zpForm.vue";
import { IdCard } from '@/utils/validate.js'
import Search from "@/components/aboutTable/Search.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, } from "vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLY,D_GS_QLZDRLX,D_BZ_YJJB, D_GS_QLZDRYXX,D_BZ_XB,D_GSXT_YJXX_CZZT } = proxy.$dict('D_BZ_YJLY','D_GS_QLZDRLX',"D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB","D_GSXT_YJXX_CZZT"); //获取字典数据
const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref(
[
{ label: "姓名", prop: 'yjRyxm', placeholder: "请输入姓名", showType: "input" },
// { label: "年龄段", prop: 'age', placeholder: "请输入身份证号码", showType: "Slot" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX },
{ label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
{ label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
{ label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 160, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjSj" },
{ label: "人员姓名", prop: "yjRyxm", },
{ label: "身份证号", prop: "yjRysfzh", },
{ label: "性别", prop: "sex" ,showSolt: true },
{ label: "年龄", prop: "age", showSolt: true },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "人员类别", prop: "bqdl", showSolt: true },
{ label: "细类", prop: "yjbqmc" },
{ label: "轨迹类别", prop: "yjLylx", showSolt: true },
{ label: "活动发生地", prop: "yjDz" },
{ label: "接收单位", prop: "ssbm" },
{ label: "预警次数", prop: "yjCs" },
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val }
queryFrom.value.startTime = val.times ? val.times[0] : ''
queryFrom.value.endTime = val.times ? val.times[1] : ''
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;
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
}
delete promes.times;
qcckPost(promes, '/mosty-gsxt/tbYjxx/getQlzdrPageList').then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records || []
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const pushWarning = (val) => {
warningShow.value = true;
dataList.value = val;
}
const failWarning = (val) => {
let ids = [val.id]
qcckPost({ids}, '/mosty-gsxt/tbYjxx/yjbc').then((res) => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}
/** 选中项 */
const selectRows = ref([])
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_name: "状态",
yjSj: "预警时间",
yjRyxm: "人员姓名",
yjRysfzh: "身份证号",
yjJb_name: "预警级别",
bqdl_name: "人员类别",
yjbqmc: "细类",
yjDz: "活动发生地",
ssbm: "接收单位",
yjCs: "预警次数",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_name: getMultiDictVal(item.yjJb, D_BZ_YJJB),
bqdl_name: getMultiDictVal(item.bqdl, D_GS_QLZDRLX),
}
})
exportExlByObj(titleObj, data, '七类重点')
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id)
qcckPost({ids}, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -0,0 +1,76 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container">
<FormMessage :formList="formData" v-model="listQuery" ref="elform" :rules="rules" :labelWidth="90">
</FormMessage>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button type="primary" @click="submit">确定</el-button>
<el-button @click="close">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ref, defineProps, defineEmits, reactive, getCurrentInstance } from 'vue';
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { tbYjxxYjzp } from '@/api/yj'
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '预警指派'
},
width: {
type: String,
default: '50%'
},
url: {
type: String,
default: ''
},
dataList: {
type: Object,
default: () => ({})
}
});
const listQuery = ref()
const formData = ref([
{ label: "指派部门", prop: "zpbmdm", depMc: 'zpbm', type: "department", width: '45%' },
{ label: "指派原因", prop: "zpyy", type: "textarea", width: '80%' },
])
const rules = reactive({
zpbmdm: [{ required: true, message: "请选择指派部门", trigger: "blur" }],
zpyy: [{ required: true, message: "请输入指派原因", trigger: "change" }],
});
const elform = ref(null)
const submit = async () => {
elform.value.submit(() => {
const params = { ...listQuery.value, yjid: props.dataList.id };
tbYjxxYjzp(params).then((res) => {
proxy.$message({ type: "success", message: "成功" });
close();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
});
}
// 定义事件
const emit = defineEmits(['update:modelValue']);
const close = () => {
elform.value.reset()
emit('update:modelValue', false);
};
</script>
<style scoped>
</style>

View File

@ -37,8 +37,8 @@
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" @click="addEdit('edit', row)">详情</el-link>
<el-link type="warning" @click="handleYP('研判', row)">研判</el-link>
<el-link type="danger" @click="handleYP('深度研判', row)">深度研判</el-link>
<!-- <el-link type="warning" @click="handleYP('研判', row)">研判</el-link>
<el-link type="danger" @click="handleYP('深度研判', row)">深度研判</el-link> -->
</template>
</MyTable>
<Pages

View File

@ -48,9 +48,9 @@
<div class="mt4 two_text_detail" v-if="buttonBox">
<el-button type="primary" @click="pushAssess(item)">全息档案</el-button>
<el-button type="primary" @click="pushWarning(item)">预警指派</el-button>
<el-button color="#ef7762" @click="showDetail(item)" style="color: #fff;">转合成</el-button>
<!-- <el-button color="#ef7762" @click="showDetail(item)" style="color: #fff;">转合成</el-button> -->
<!-- <el-button type="warning">转基管</el-button> -->
<el-button type="danger" @click="showTransfer(item)">转会商</el-button>
<!-- <el-button type="danger" @click="showTransfer(item)">转会商</el-button> -->
<el-button type="success" @click="showFeedback(item, '签收')" v-if="item.czzt == '01'">签收</el-button>
<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>

View File

@ -181,14 +181,12 @@ function getIsRed() {
}
// 按钮切换
const handleBtns = (val) => {
console.log(val);
btnsActive.value = val;
switch (val) {
case "数据整合":
router.push("/dataReduction");
router.push("/mpvPeo");
break;
case "实支撑":
case "实支撑":
router.push("/InfoCollection");
break;
case "分析研判":