This commit is contained in:
lcw
2026-03-14 19:46:21 +08:00
parent 93489b06fa
commit 9fb505eb8e
248 changed files with 21714 additions and 1840 deletions

View File

@ -4,6 +4,11 @@
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<!-- <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="addEdit('add')">新增</el-button>
</template>
</PageTitle> -->
<!-- 表格 -->
<div class="tabBox">
<MyTable
@ -82,6 +87,7 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import AddForm from "@/views/backOfficeSystem/DeploymentDisposal/mpvCar/components/addForm.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import { qcckGet, qcckPost,qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance();
@ -157,7 +163,7 @@ onMounted(() => {
});
// 移入
const handleSend=()=>{
}
// 搜索
const onSearch = (val) => {

View File

@ -4,6 +4,12 @@
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="addEdit('add')">新增</el-button>
<!-- <el-button type="danger" size="small" @click="handleRow()">批量删除</el-button> -->
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox">
<MyTable
@ -36,6 +42,8 @@
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="primary" @click="handleSend(row.id)">移入</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)" v-if="isShiQzDelet">删除</el-link>
<el-link size="small" type="success" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="success" @click="addEdit('detail', row)">详情</el-link>
</template>
</MyTable>
@ -45,7 +53,7 @@
}"></Pages>
</div>
<!-- 编辑 - 新增-->
<EditForm v-if="show" @updateDate="getList" ref="editFormDiloag" :dic="{D_BZ_XB,D_GS_ZDQT_LB,D_GS_ZDQT_FXDJ,D_GS_ZDR_CZZT}" />
<EditForm v-if="show" @updateDate="getList" qtlx="02" ref="editFormDiloag" :dic="{D_BZ_XB,D_GS_ZDQT_LB,D_GS_ZDQT_FXDJ,D_GS_ZDR_CZZT}" />
</div>
</template>
@ -57,6 +65,8 @@ import EditForm from "@/views/backOfficeSystem/DeploymentDisposal/mpvGroup/compo
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { ElMessage } from "element-plus";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import { getItem } from "@/utils/storage.js";
const { proxy } = getCurrentInstance();
const { D_GS_ZDR_CZZT,D_GS_BK_SQLX, D_GS_ZDQT_FXDJ, D_GS_ZDR_RYJB, D_GS_ZDQT_LB, D_GS_ZDR_BK_ZT, D_GS_BQ_LX, D_GS_ZDQT_ZT, D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDR_CZZT","D_GS_BK_SQLX", "D_GS_ZDQT_FXDJ", "D_GS_ZDR_RYJB", "D_GS_ZDQT_LB", "D_GS_ZDR_BK_ZT", "D_GS_BQ_LX", "D_GS_ZDQT_ZT", "D_BZ_SF", "D_BZ_XB", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX"); //获取字典数据
const showzxs = ref(false);
@ -127,7 +137,7 @@ const pageData = reactive({
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 150,
controlsWidth: 180,
tableColumn: [
{ label: "群体名称", prop: "qtMc",width:150 },
{ label: "群体类别", prop: "qtLb" , showSolt: true,width:150 },
@ -136,13 +146,16 @@ const pageData = reactive({
{ label: "背景信息", prop: "bgxx", showSolt: true ,width:150 },
{ label: "管辖单位", prop: "gxSsdwmc",width:150 },
{ label: "状态", prop: "qtZt", showSolt: true,width:150 },
{ label: "标签", prop: "bqList", showSolt: true ,showOverflowTooltip:true,width:400 },
{ label: "标签", prop: "bqList", showSolt: true ,showOverflowTooltip:true },
]
});
const isShiQzDelet = ref(false)
onMounted(() => {
tabHeightFn();
getList();
const isShiQz = getItem('roleList').find(item => item.roleCode == 'JS_777777') != undefined
if (isShiQz) isShiQzDelet.value = true
});
//移入

View File

@ -4,6 +4,13 @@
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="addEdit('add')">新增</el-button>
<!-- <el-button type="danger" size="small" @click="handleRow()">批量删除</el-button> -->
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
@ -46,6 +53,8 @@
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="success" @click="handleSend(row.id)">移入</el-link>
<el-link size="small" type="primary" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)" v-if="isShiQzDelet">删除</el-link>
<el-link size="small" type="primary" @click="addEdit('detail', row)">详情</el-link>
</template>
</MyTable>
@ -55,7 +64,7 @@
}"></Pages>
</div>
<!-- 详情 -->
<AddForm ref="addFormDiloag" @updateDate="getList"
<AddForm ref="addFormDiloag" @updateDate="getList" rylx="02"
:dic="{ D_GS_ZDR_RYJB, D_BZ_XB, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ }" />
</div>
</template>
@ -69,6 +78,7 @@ import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import AddForm from "@/views/backOfficeSystem/DeploymentDisposal/mpvPeo/components/addForm.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { getItem } from "@/utils/storage.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_ZDQT_ZT, D_GS_ZDR_RYJB, D_BZ_XB, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ, D_GS_BK_SQLX, D_BZ_SF, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } =
@ -126,7 +136,7 @@ const pageData = reactive({
tableColumn: [
{ label: "姓名", prop: "ryXm", width: 150 },
{ label: "性别", prop: "ryXb", showSolt: true, width: 100 },
{ label: "籍贯", prop: "ryJg", showSolt: true, width: 100},
{ label: "籍贯", prop: "ryJg", showSolt: true, width: 100 },
{ label: "身份证", prop: "rySfzh", width: 200 },
{ label: "民族", prop: "ryMz", showSolt: true, width: 100 },
{ label: "户籍地区划", prop: "hjdQh", showSolt: true, width: 150 },
@ -135,10 +145,12 @@ const pageData = reactive({
{ label: "审核状态", prop: "zdrZt", showSolt: true },
]
});
const isShiQzDelet = ref(false)
onMounted(() => {
getList();
tabHeightFn();
const isShiQz = getItem('roleList').find(item => item.roleCode == 'JS_777777') != undefined
if (isShiQz) isShiQzDelet.value = true
});
// 搜索
@ -161,7 +173,7 @@ const changeSize = (val) => {
const getList = () => {
pageData.tableConfiger.loading = true;
// 人员类型D_ZDRY_RYLX(01 重点 02 普通〉
let data = { rylx:'02',...pageData.pageConfiger, ...queryFrom.value };
let data = { rylx: '02', ...pageData.pageConfiger, ...queryFrom.value };
qcckGet(data, "/mosty-gsxt/tbGsxtZdry/selectPage").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
@ -251,7 +263,7 @@ const addEdit = (type, row) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};

View File

@ -2,79 +2,89 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<!-- <el-popover placement="bottom" :visible="visible" :width="400" trigger="click">
<template #reference>
<el-button type="primary" @click="(visible = !visible), (visiblefp = false)" size="small">布控申请</el-button>
</template>
<div class="flex just-center">
<el-button size="small" type="primary" v-for="it in D_GS_BK_SQLX" :key="it.dm" @click="handleApplication(it)" >{{ it.zdmc }}</el-button>
</div>
</el-popover>
<el-popover placement="bottom" :visible="visiblefp" :width="400" trigger="click">
<template #reference>
<div class="flex just-center">
<el-button size="small" type="primary" v-for="it in D_GS_BK_SQLX" :key="it.dm" @click="handleApplication(it)">{{
it.zdmc }}</el-button>
</div>
</el-popover>
<el-popover placement="bottom" :visible="visiblefp" :width="400" trigger="click">
<template #reference>
<el-button size="small" type="primary" @click="(visiblefp = !visiblefp), (visible = false)" >指定分配</el-button>
</template>
<div>
<el-input readonly v-model="obj.fpmc" @click="chooseUserVisible = true" placeholder="请选择民警"></el-input>
<div class="flex just-center mt10">
<el-button @click="(visiblefp = false), (obj = {})" size="small">取消</el-button>
<el-button type="primary" @click="handlefp" size="small">分配</el-button>
</div>
</div>
</el-popover>
<el-button size="small" type="primary" @click="handleZxs">转线索</el-button>
<el-button size="small" type="primary" @click="handleMove">移交管控</el-button> -->
<div>
<el-input readonly v-model="obj.fpmc" @click="chooseUserVisible = true" placeholder="请选择民警"></el-input>
<div class="flex just-center mt10">
<el-button @click="(visiblefp = false), (obj = {})" size="small">取消</el-button>
<el-button type="primary" @click="handlefp" size="small">分配</el-button>
</div>
</div>
</el-popover>
<el-button size="small" type="primary" @click="handleZxs">转线索</el-button>
<el-button size="small" type="primary" @click="handleMove">移交管控</el-button> -->
<el-button type="primary" size="small" @click="addEdit('add', '')">
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon>
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">新增</span>
</el-button>
</template>
</PageTitle>
</PageTitle>
<!-- 表格 -->
<div class="tabBox">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="chooseData"
>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="chooseData">
<template #ryxx="{ row }">
<div class="flex">
<img src="" alt="" style="width: 80px;height: 90px;" />
<ul class="tl ml10" style="flex:1 0 0">
<li class="one_text_detail">姓名{{ row.ryXm }}</li>
<li class="flex one_text_detail">性别<DictTag :tag="false" :value="row.ryXb" :options="D_BZ_XB" /></li>
<li class="flex one_text_detail">籍贯<DictTag :tag="false" :value="row.ryJg" :options="D_BZ_XZQHDM"/></li>
<li class="flex one_text_detail">性别
<DictTag :tag="false" :value="row.ryXb" :options="D_BZ_XB" />
</li>
<li class="flex one_text_detail">籍贯
<DictTag :tag="false" :value="row.ryJg" :options="D_BZ_XZQHDM" />
</li>
<li class="one_text_detail">身份证{{ row.rySfzh }}</li>
<li class="one_text_detail">出生日期{{ row.ryCsrq }}</li>
<li class="flex one_text_detail">民族<DictTag :tag="false" :value="row.ryMz" :options="D_BZ_MZ" /></li>
<li class="flex one_text_detail">民族
<DictTag :tag="false" :value="row.ryMz" :options="D_BZ_MZ" />
</li>
</ul>
</div>
</template>
<template #jzxx="{ row }">
<div class="flex one_text_detail">户籍地区划<DictTag :tag="false" :value="row.hjdQh" :options="D_BZ_XZQHDM" /></div>
<div class="flex one_text_detail">户籍地区划
<DictTag :tag="false" :value="row.hjdQh" :options="D_BZ_XZQHDM" />
</div>
<div class="flex one_text_detail">户籍派出所{{ row.hjdPcsmc }}</div>
<div class="flex one_text_detail">户籍地详址{{ row.hjdXz }}</div>
</template>
<template #bqList="{ row }">
<ul >
<li class="one_text_detail marks mb4" :key="index" v-for="(item, index) in row.bqList">{{ item.bqMc }}({{ item.bqFz || 0 }} ) </li>
<ul>
<li class="one_text_detail marks mb4" :key="index" v-for="(item, index) in row.bqList">{{ item.bqMc }}({{
item.bqFz || 0 }} ) </li>
</ul>
</template>
<template #gxdw="{ row }">
<div class="flex one_text_detail">管辖单位{{ row.gxSsbmmc }}</div>
<div class="flex">人员级别<DictTag :tag="false" :value="row.zdrRyjb" :options="D_GS_ZDR_RYJB"/> </div>
<div class="flex">人员级别
<DictTag :tag="false" :value="row.zdrRyjb" :options="D_GS_ZDR_RYJB" />
</div>
<div class="flex one_text_detail">管控原因{{ row.zdrLkyy }}</div>
<div class="flex">管控状态<DictTag :tag="false" :value="row.zdrBkZt" :options="D_GS_ZDR_BK_ZT" /></div>
<div class="flex">管控状态
<DictTag :tag="false" :value="row.zdrBkZt" :options="D_GS_ZDR_BK_ZT" />
</div>
</template>
<template #zdrCzzt="{ row }">
<DictTag :tag="false" :value="row.zdrCzzt" :options="D_GS_ZDR_CZZT" />
@ -88,27 +98,24 @@
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="primary" @click="addEdit('edit', row)" >编辑</el-link>
<el-link size="small" type="primary" @click="addEdit('detail', row)" >详情</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)">删除</el-link>
<el-link size="small" type="primary" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="primary" @click="addEdit('detail', row)">详情</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)" v-if="isShiQzDelet">删除</el-link>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<!-- 详情 -->
<AddForm ref="addFormDiloag" @updateDate="getList" :dic="{BD_BK_CLYJBQ,D_GS_ZDR_RYJB,D_BZ_XB,D_BZ_MZ,D_BZ_XZQHDM,D_GS_ZDR_BK_ZT,D_GS_ZDR_CZZT,D_GS_BQ_ZL,D_GS_BQ_LB,D_GS_BQ_LX,D_GS_ZDR_YJDJ,D_GS_BK_SSJZ}"/>
<AddForm ref="addFormDiloag" @updateDate="getList"
:dic="{ BD_BK_CLYJBQ, D_GS_ZDR_RYJB, D_BZ_XB, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ }" />
<!-- 选择用户 -->
<ChooseUser v-model="chooseUserVisible" @choosedUsers="handleUserSelected" :roleIds="roleIds"/>
<ChooseUser v-model="chooseUserVisible" @choosedUsers="handleUserSelected" :roleIds="roleIds" />
<!-- 转线索 -->
<ZxsForm v-if="showzxs" ref="zxsDilof" @change="getList" :dic="{D_BZ_SF,D_BZ_XB,D_GS_XS_LY,D_BZ_SSZT,D_GS_XS_LX,D_GS_XS_QTLX }"></ZxsForm>
<ZxsForm v-if="showzxs" ref="zxsDilof" @change="getList"
:dic="{ D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX }"></ZxsForm>
</div>
</template>
@ -121,10 +128,11 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import AddForm from "./components/addForm.vue";
import { qcckGet, qcckPost,qcckDelete } from "@/api/qcckApi.js";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { getItem } from "@/utils/storage.js";
const { proxy } = getCurrentInstance();
const { D_GS_ZDQT_ZT,D_GS_ZDR_RYJB, D_BZ_XB,BD_BK_CLYJBQ, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ, D_GS_BK_SQLX, D_BZ_SF, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDQT_ZT","D_GS_ZDR_RYJB","D_BZ_XB","D_BZ_MZ","D_BZ_XZQHDM","D_GS_ZDR_BK_ZT","D_GS_ZDR_CZZT","D_GS_BQ_ZL","D_GS_BQ_LB","D_GS_BQ_LX","D_GS_BK_SSJZ","D_GS_BK_SQLX","D_BZ_SF","D_GS_XS_LY","D_BZ_SSZT","D_GS_XS_LX","D_GS_XS_QTLX","BD_BK_CLYJBQ","D_GS_ZDR_YJDJ");
const { D_GS_ZDQT_ZT, D_GS_ZDR_RYJB, D_BZ_XB, BD_BK_CLYJBQ, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ, D_GS_BK_SQLX, D_BZ_SF, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDQT_ZT", "D_GS_ZDR_RYJB", "D_BZ_XB", "D_BZ_MZ", "D_BZ_XZQHDM", "D_GS_ZDR_BK_ZT", "D_GS_ZDR_CZZT", "D_GS_BQ_ZL", "D_GS_BQ_LB", "D_GS_BQ_LX", "D_GS_BK_SSJZ", "D_GS_BK_SQLX", "D_BZ_SF", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX", "BD_BK_CLYJBQ", "D_GS_ZDR_YJDJ");
const obj = ref({});
const showzxs = ref(false);
const zxsDilof = ref();
@ -179,9 +187,9 @@ const pageData = reactive({
},
controlsWidth: 150,
tableColumn: [
{ label: "车牌号", prop: "hphm",showOverflowTooltip:true },
{ label: "车牌号", prop: "hphm", showOverflowTooltip: true },
{ label: "车架号", prop: "clCjh" },
{ label: "车辆颜色", prop: "clYs",showOverflowTooltip:true},
{ label: "车辆颜色", prop: "clYs", showOverflowTooltip: true },
{ label: "车辆所有人", prop: "clSyr" },
{ label: "管辖单位", prop: "gxSsbmmc", showSolt: true },
{ label: "管控民警姓名", prop: "gkMjXm", showSolt: true },
@ -189,8 +197,12 @@ const pageData = reactive({
// { label: "审核状态", prop: "zdrZt", showSolt: true },
]
});
const isShiQzDelet = ref(false)
onMounted(() => {
console.log( getItem('roleList'));
const isShiQz = getItem('roleList').find(item => item.roleCode == 'JS_777777') != undefined
if (isShiQz) isShiQzDelet.value = true
getList();
tabHeightFn();
});
@ -249,7 +261,7 @@ const handleUserSelected = (val) => {
// 处理分配
const handlefp = () => {
if (ids.value.length === 0) return ElMessage.error("请先选择需要布控的重点人");
qcckPost({ ids: ids.value, uid: obj.value.fpid },"/mosty-gsxt/tbGsxtZdry/addGkmj").then(() => {
qcckPost({ ids: ids.value, uid: obj.value.fpid }, "/mosty-gsxt/tbGsxtZdry/addGkmj").then(() => {
ElMessage.success("分配成功");
visible.value = false;
visiblefp.value = false;
@ -285,7 +297,7 @@ const handleZxs = () => {
const deleteRow = (id) => {
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
qcckPost({id}, "/mosty-gsxt/tbGsxtZdcl/delete" ).then((res) => {
qcckPost({ id }, "/mosty-gsxt/tbGsxtZdcl/delete").then((res) => {
ElMessage.success("删除成功");
getList();
});
@ -296,7 +308,7 @@ const deleteRow = (id) => {
//新增编辑
const addEdit = (type, row) => {
show.value = true;
nextTick(()=>{
nextTick(() => {
addFormDiloag.value.init(type, row);
})
};
@ -311,7 +323,7 @@ const tabHeightFn = () => {
</script>
<style lang="scss" scoped>
.marks{
.marks {
padding: 0 4px;
white-space: nowrap;
background: #73acf1;
@ -323,5 +335,4 @@ const tabHeightFn = () => {
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -67,6 +67,14 @@ const disabled = ref(false)
const showBut = ref()
const title = ref('新增')
const portrayal = ref(false)
const props = defineProps({
qtlx: {
type: String,
default: '01'
}
})
const emit = defineEmits(['updateDate'])
const init = (type, row) => {
dialogForm.value = true
if (type == 'add') {
@ -168,7 +176,6 @@ const submit = async () => {
requestInfo.value.throwData(),
personnel.value.throwData()
]);
const datamasg = {
...infoData,
qtBjzl: backinfoData.qtbjxx,
@ -177,7 +184,8 @@ const submit = async () => {
qttz: featinfoData,
zyxx: demandsInfoData,
sqfj: requestInfoData.fileList.length > 0 ? JSON.stringify(requestInfoData.fileList) : "",
zdryList: personnelData
zdryList: personnelData,
qtlx: props.qtlx
}
const res = await tbGsxtZdqtAdd(datamasg)
@ -206,7 +214,7 @@ const submit = async () => {
message: '新增成功',
type: 'success',
})
emit('updateDate')
close()
} catch (error) {
console.log(error);

View File

@ -68,7 +68,7 @@
<el-link size="small" type="primary" v-if="row.qtZt == '01'" @click="handleSend(row.id)">办结</el-link>
<el-link size="small" type="success" v-if="row.qtZt == '01'" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="success" @click="addEdit('detail', row)">详情</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)">删除</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)" v-if="isShiQzDelet">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -97,6 +97,7 @@ import EditForm from "./components/addForm.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { ElMessage } from "element-plus";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { getItem } from "@/utils/storage.js";
const { proxy } = getCurrentInstance();
const { D_GS_ZDR_CZZT, D_GS_BK_SQLX, D_GS_ZDQT_FXDJ, D_GS_ZDR_RYJB, D_GS_ZDQT_LB, D_GS_ZDR_BK_ZT, D_GS_BQ_LX, D_GS_ZDQT_ZT, D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDR_CZZT", "D_GS_BK_SQLX", "D_GS_ZDQT_FXDJ", "D_GS_ZDR_RYJB", "D_GS_ZDQT_LB", "D_GS_ZDR_BK_ZT", "D_GS_BQ_LX", "D_GS_ZDQT_ZT", "D_BZ_SF", "D_BZ_XB", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX"); //获取字典数据
const showzxs = ref(false);
@ -185,8 +186,10 @@ const pageData = reactive({
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true, },
]
});
const isShiQzDelet = ref(false)
onMounted(() => {
const isShiQz = getItem('roleList').find(item => item.roleCode == 'JS_777777') != undefined
if (isShiQz) isShiQzDelet.value = true
tabHeightFn();
getList();
});

View File

@ -114,7 +114,13 @@ const showBut = ref(false)
const listQuery = ref({});
const butShow = ref(false)
const title = ref('新增')
const showData=ref(false)
const showData = ref(false)
const props = defineProps({
rylx: {
type: String,
default: '01'
}
})
// 初始化数据
const init = (type, row) => {
dialogForm.value = true;
@ -207,7 +213,7 @@ const submit = async () => {
info.value.throwData()
// personnelTags.value.throwData(),
]);
tbGsxtZdrySave({...infoData,rylx:'01'}).then(res => {
tbGsxtZdrySave({...infoData,rylx:props.rylx}).then(res => {
proxy.$message({
message: '新增成功',
type: 'success',

View File

@ -117,6 +117,7 @@ import AddForm from "./components/addForm.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { useRouter, useRoute } from 'vue-router'
import { getItem } from "@/utils/storage.js";
const router = useRouter()
const route = useRoute()
const { proxy } = getCurrentInstance();
@ -188,9 +189,11 @@ const pageData = reactive({
{ label: "入库时间", prop: "zdrRkkssj", },
]
});
const isShiQzDelet = ref(false)
onMounted(() => {
tabHeightFn();
tabHeightFn();
const isShiQz = getItem('roleList').find(item => item.roleCode == 'JS_777777') != undefined
if (isShiQz) isShiQzDelet.value = true
if (route.query.id) {
addEdit('x', {
id: route.query.id

View File

@ -17,7 +17,7 @@
<div class="phone-input-container">
<div class="inputGroup" v-for="(item, index) in listQuery.ryLxdh" :key="index">
<el-input v-model="listQuery.ryLxdh[index]" class="group" placeholder="请输入电话号码" />
<div class="flex align-center but" v-if="showBut">
<div class="flex align-center but" >
<el-button type="primary" :icon="Plus" circle @click="addPhone" title="添加电话号码"
v-if="listQuery.ryLxdh.length - 1 == index" />
<el-button type="success" :icon="Minus" circle @click="removePhone(index)" title="删除电话号码" />

View File

@ -0,0 +1,308 @@
<template>
<section class="query-wrap">
<div class="query-title">{{ title }}</div>
<div class="query-grid">
<div v-for="field in renderFields" :key="field.key" class="query-cell">
<div class="cell-label">{{ field.label }}</div>
<div class="cell-control" :class="{ 'is-checkbox': field.type === 'checkbox' }">
<el-input clearable v-if="field.type === 'input'" v-model="formState[field.key]" class="control-input"
:placeholder="field.placeholder || ''" />
<el-input clearable v-else-if="field.type === 'number'" v-model="formState[field.key]" class="control-input"
type="number" :placeholder="field.placeholder || ''" />
<el-select clearable v-else-if="field.type === 'select'" v-model="formState[field.key]" class="control-select"
:placeholder="field.placeholder || '请选择'" :multiple="field.multiple || false" collapse-tags
collapse-tags-tooltip>
<el-option v-for="item in field.options || []" :key="item.value ?? item" :label="item.label ?? item"
:value="item.value ?? item" />
</el-select>
<el-date-picker clearable v-else-if="field.type === 'date'" v-model="formState[field.key]"
class="control-date" type="date" :placeholder="field.placeholder || '请选择日期'" value-format="YYYY-MM-DD" />
<el-date-picker clearable v-else-if="field.type === 'datetime'" v-model="formState[field.key]"
class="control-date" type="datetime" :placeholder="field.placeholder || '请选择时间'"
value-format="YYYY-MM-DD HH:mm:ss" />
<el-date-picker clearable v-else-if="field.type === 'daterange'" v-model="formState[field.key]"
class="control-date" type="daterange" range-separator="" start-placeholder="开始日期" end-placeholder="结束日期"
value-format="YYYY-MM-DD" />
<el-date-picker clearable v-else-if="field.type === 'datetimerange'" v-model="formState[field.key]"
class="control-date" type="datetimerange" range-separator="" start-placeholder="开始时间"
end-placeholder="结束时间" value-format="YYYY-MM-DD HH:mm:ss" />
<template v-else-if="field.type === 'department'">
<MOSTY.Department clearable v-model="formState[field.key]" class="control-select" />
</template>
<div v-else-if="field.type === 'checkbox'" class=" checkbox-wrap">
<el-checkbox v-model="formState[field.key]" />
</div>
</div>
</div>
</div>
<div class="query-action">
<div>
<slot name="but"></slot>
</div>
<div>
<el-button size="small" type="primary" @click="handleSearch">{{ searchText }}</el-button>
<el-button size="small" type="button" @click="handleReset">重置 </el-button>
</div>
</div>
</section>
</template>
<script setup>
import { computed, reactive, watch } from 'vue'
import * as MOSTY from "@/components/MyComponents/index";
const props = defineProps({
title: {
type: String,
default: '查询条件'
},
searchText: {
type: String,
default: '查询'
},
fields: {
type: Array,
default: () => []
},
searchArr: {
type: Array,
default: () => []
}
})
const emit = defineEmits(['search', 'submit', 'reset'])
const formState = reactive({})
const renderFields = computed(() => {
const source = props.searchArr.length ? props.searchArr : props.fields
return source.map((field) => ({
...field,
key: field.key || field.prop,
type: field.type || field.showType || 'input'
})).filter((field) => field.key)
})
const getResetValue = (field) => {
if (field.defaultVal !== undefined) {
return Array.isArray(field.defaultVal) ? [...field.defaultVal] : field.defaultVal
}
if (field.type === 'checkbox') {
return false
}
if (field.type === 'daterange' || field.type === 'datetimerange') {
return []
}
if (field.type === 'select') {
if (field.multiple) {
return []
}
return null
}
return ''
}
const buildResetPayload = () => {
const payload = {}
renderFields.value.forEach((field) => {
payload[field.key] = getResetValue(field)
})
return payload
}
const setFormState = (value = {}) => {
Object.keys(formState).forEach((key) => {
delete formState[key]
})
renderFields.value.forEach((field) => {
if (value[field.key] !== undefined) {
formState[field.key] = Array.isArray(value[field.key]) ? [...value[field.key]] : value[field.key]
return
}
formState[field.key] = getResetValue(field)
})
}
const getFormSnapshot = () => {
const snapshot = {}
renderFields.value.forEach((field) => {
const value = formState[field.key]
if (Array.isArray(value)) {
snapshot[field.key] = [...value]
return
}
snapshot[field.key] = value
})
return snapshot
}
const handleSearch = () => {
const payload = getFormSnapshot()
emit('search', payload)
emit('submit', payload)
}
const handleReset = () => {
const payload = buildResetPayload()
setFormState(payload)
emit('reset', true)
emit('search', payload)
emit('submit', payload)
}
watch(
renderFields,
() => {
setFormState(buildResetPayload())
},
{ immediate: true }
)
defineExpose({
formState,
handleSearch,
handleReset
})
</script>
<style scoped lang="scss">
.query-wrap {
border: 1px solid #b8d3ff;
background: #fff;
}
.query-title {
height: 32px;
background: linear-gradient(to right, #9ed7ff, #e6f0f8);
line-height: 32px;
padding-left: 10px;
font-size: 16px;
font-weight: 700;
color: #0d2148;
border-bottom: 1px solid #b8d3ff;
}
.query-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.query-cell {
display: flex;
min-height: 40px;
border-right: 1px solid #b8d3ff;
border-bottom: 1px solid #b8d3ff;
}
.query-cell:nth-child(4n) {
border-right: 0;
}
.cell-label {
width: 130px;
flex-shrink: 0;
border-right: 1px solid #b8d3ff;
font-size: 14px;
color: #0d2148;
display: flex;
align-items: center;
justify-content: center;
white-space: nowrap;
}
.cell-control {
flex: 1;
min-width: 0;
padding: 4px 8px;
display: flex;
align-items: center;
overflow: hidden;
}
.cell-control.is-checkbox {
justify-content: center;
padding: 0;
}
.control-input,
.control-select,
.control-date {
width: 100%;
max-width: 100%;
min-width: 0;
}
:deep(.control-input .el-input__wrapper),
:deep(.control-select .el-select__wrapper),
:deep(.control-date .el-input__wrapper) {
width: 100%;
max-width: 100%;
min-height: 28px;
border-radius: 0;
box-shadow: 0 0 0 1px #b8d3ff inset;
}
:deep(.control-date.el-date-editor) {
width: 100%;
max-width: 100%;
min-width: 0;
}
:deep(.control-date.el-date-editor .el-range-input) {
min-width: 0;
}
:deep(.control-input .el-input__inner),
:deep(.control-select .el-select__placeholder),
:deep(.control-date .el-input__inner) {
font-size: 14px;
color: #0d2148;
}
:deep(.control-date .el-range-input) {
font-size: 14px;
color: #0d2148;
}
:deep(.control-date .el-range__icon),
:deep(.control-date .el-range__close-icon) {
line-height: 1;
}
.checkbox-wrap {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
:deep(.checkbox-wrap .el-checkbox) {
margin-right: 0;
height: 100%;
display: flex;
align-items: center;
}
:deep(.checkbox-wrap .el-checkbox__inner) {
width: 14px;
height: 14px;
}
.query-action {
height: 36px;
display: flex;
// justify-content: flex-end;
justify-content: space-between;
align-items: center;
padding: 0 8px;
}
.search-btn {
height: 26px;
min-width: 70px;
border: 1px solid #0f5bbd;
background: #0f5bbd;
color: #fff;
font-size: 14px;
cursor: pointer;
}
</style>

View File

@ -0,0 +1,170 @@
<template>
<section class="table-wrap">
<div class="table-box">
<el-table ref="tableRef" v-loading="loading" :data="data" :row-key="rowKey" border stripe class="warn-data-table"
@selection-change="onSelectionChange" :height="height">
<el-table-column v-if="selectionMode !== 'none'" type="selection" :width="selectionColumnWidth"
:align="selectionColumnAlign" />
<el-table-column v-for="column in columns" :key="column.prop || column.label || column.type" :prop="column.prop"
:type="column.type" :label="column.label" :width="column.width" :min-width="column.minWidth"
:align="column.align" :show-overflow-tooltip="true">
<template v-if="column.slotName" #default="scope">
<slot v-if="column.slotName" :name="column.slotName" :row="scope.row" :column="column"
:$index="scope.$index">
{{ column.prop ? scope.row[column.prop] : '' }}
</slot>
</template>
</el-table-column>
</el-table>
</div>
</section>
</template>
<script setup>
import { ref, watch } from 'vue'
const props = defineProps({
data: {
type: Array,
default: () => []
},
columns: {
type: Array,
default: () => []
},
selectionMode: {
type: String,
default: 'multiple'
},
rowKey: {
type: [String, Function],
default: 'id'
},
selectionColumnWidth: {
type: Number,
default: 38
},
selectionColumnAlign: {
type: String,
default: 'center'
},
toolbarActions: {
type: Array,
default: () => [
{ key: 'sign', text: '批量签收', red: true },
{ key: 'export', text: '批量导出' },
{ key: 'analysis', text: '批量分析' },
{ key: 'count', text: '计算人数' }
]
},
tableHeight: {
type: [Number, String],
default: '600px'
},
loading: {
type: Boolean,
default: false
}
})
const height = ref()
watch(() => props.tableHeight, (newVal) => {
if (newVal) {
height.value = newVal
}
})
const emit = defineEmits(['selection-change', 'row-change'])
const tableRef = ref()
const onSelectionChange = (selection) => {
if (props.selectionMode === 'single' && selection.length > 1) {
const selectedRow = selection[selection.length - 1]
tableRef.value.clearSelection()
tableRef.value.toggleRowSelection(selectedRow, true)
emit('selection-change', [selectedRow])
emit('row-change', selectedRow)
return
}
emit('selection-change', selection)
emit('row-change', selection[0] || null)
}
</script>
<style scoped lang="scss">
.table-wrap {
margin-top: 10px;
background: #fff;
}
:deep(.el-table--fit) {
position: static;
// width: calc(100% - 20px) !important;
height: calc(100% - 100px);
}
.tool-bar {
height: 24px;
display: flex;
align-items: center;
gap: 16px;
font-size: 14px;
color: #1f56ab;
}
.tool-link {
cursor: pointer;
}
.tool-link.red {
color: #e51414;
}
.table-box {
border: 1px solid #b5ccf2;
overflow: hidden;
}
:deep(.warn-data-table) {
width: 100%;
}
:deep(.warn-data-table .el-table__inner-wrapper::before) {
display: none;
}
:deep(.warn-data-table .el-table__header-wrapper th.el-table__cell) {
background: #16263e !important;
color: #fff !important;
border-color: #b5ccf2;
padding:0;
}
:deep(.warn-data-table .el-table__header-wrapper th.el-table__cell .cell) {
text-align: center;
overflow: visible;
white-space: normal;
text-overflow: clip;
word-break: break-word;
}
:deep(.warn-data-table .el-table__body-wrapper td.el-table__cell) {
border-color: #b5ccf2;
padding: 3px 0;
}
:deep(.warn-data-table .el-table__cell) {
font-size: 13px;
color: #0f223f;
}
:deep(.warn-data-table .el-table__cell .cell) {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
:deep(.warn-data-table.el-table--border::after),
:deep(.warn-data-table.el-table--group::after),
:deep(.warn-data-table::before) {
background-color: #b5ccf2;
}
</style>

View File

@ -0,0 +1,139 @@
<template>
<div class="ces-page">
<QueryFormPanel :fields="queryFields" @search="handleSearch" />
<WarnDataTable :data="tableData" :columns="columns" :selection-mode="selectionMode" :loading="loading">
<template #status="{ row }">
<span class="status" :class="row.statusClass">{{ row.status }}</span>
</template>
<template #level="{ row }">
<span class="level" :class="row.levelClass">{{ row.level }}</span>
</template>
<template #operation>
<span class="operation">签收 详情 指派 报错 关注</span>
</template>
<template #timeout="{ row }">
<span class="timeout">{{ row.timeout }}</span>
</template>
</WarnDataTable>
</div>
</template>
<script setup>
import { ref } from 'vue'
import QueryFormPanel from './components/QueryFormPanel.vue'
import WarnDataTable from './components/WarnDataTable.vue'
const selectionMode = ref('multiple')
const loading = ref(false)
const lastQueryParams = ref({})
const handleSearch = (params) => {
lastQueryParams.value = params
}
const queryFields = [
{ key: 'warnDate', label: '预警时间', type: 'input', placeholder: '年 / 月 / 日' },
{ key: 'warnLevel', label: '预警级别', type: 'select', options: ['全部', '红色', '橙色', '黄色', '蓝色'] },
{ key: 'receiveUnit', label: '接收单位', type: 'input' },
{ key: 'relatedWarn', label: '关联预警', type: 'checkbox' },
{ key: 'name', label: '姓名(精确、模糊)', type: 'input' },
{ key: 'gender', label: '性别', type: 'select', options: ['全部', '男', '女'] },
{ key: 'timeout', label: '超时状态', type: 'select', options: ['全部', '超时签收', '超时反馈'] },
{ key: 'personType', label: '人员类别', type: 'select', options: ['全部', '刑事前科类', '在逃人员', '重点关注'] },
{ key: 'focus', label: '重点关注', type: 'checkbox' },
{ key: 'secondDispatch', label: '二次指派', type: 'checkbox' },
{ key: 'idCard', label: '身份证号码(精确、模糊)', type: 'input' },
{ key: 'age', label: '年龄', type: 'input' },
{ key: 'warnCount', label: '预警次数', type: 'input' },
{ key: 'personLevel', label: '人员级别', type: 'select', options: ['全部', '一级', '二级', '三级'] },
{ key: 'traceType', label: '轨迹类别', type: 'select', options: ['全部', '人校核查', '轨迹追踪'] },
{ key: 'activePlace', label: '活动发生地模糊查询', type: 'input' },
{ key: 'groupType', label: '人员组类模糊查询', type: 'input' }
]
const columns = [
{ type: 'index', label: '序号', width: 60, align: 'center' },
{ label: '预警状态', width: 86, align: 'center', slotName: 'status' },
{ prop: 'time', label: '预警时间', width: 150 },
{ prop: 'name', label: '人员姓名', width: 80 },
{ prop: 'idCard', label: '身份证号', width: 158 },
{ prop: 'gender', label: '性别', width: 56, align: 'center' },
{ prop: 'age', label: '年龄', width: 56, align: 'center' },
{ label: '预警级别', width: 88, align: 'center', slotName: 'level' },
{ prop: 'category', label: '人员类别', width: 108 },
{ prop: 'group', label: '人员组类', width: 92 },
{ prop: 'trace', label: '轨迹类别', width: 92 },
{ prop: 'place', label: '活动发生地', minWidth: 130 },
{ prop: 'unit', label: '接收单位', width: 100 },
{ prop: 'count', label: '预警次数', width: 80, align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'timeout' }
]
const tableData = [
{ id: 1, status: '未签收', statusClass: 'danger', time: '2026-03-10 14:23:05', name: '张三', idCard: '513701199606095613', gender: '男', age: 30, level: '蓝色', levelClass: 'blue', category: '刑事前科类', group: '盗窃案', trace: '人校核查', place: '波密县玉许检查站出口', unit: '波密县公安局', count: 13, timeout: '' },
{ id: 2, status: '已签收', statusClass: 'ok', time: '2026-03-10 13:15:30', name: '曾海峰', idCard: '513701199606095613', gender: '男', age: 31, level: '红色', levelClass: 'red', category: '刑事前科类', group: '盗窃案', trace: '人校核查', place: '波密县玉许检查站', unit: '波密县公安局', count: 14, timeout: '超时签收' },
{ id: 3, status: '已签收', statusClass: 'ok', time: '2026-03-10 12:08:45', name: '曾海峰', idCard: '513701199606095613', gender: '男', age: 32, level: '红色', levelClass: 'red', category: '刑事前科类', group: '盗窃案', trace: '人校核查', place: '波密县玉许检查站', unit: '波密县公安局', count: 15, timeout: '' },
{ id: 4, status: '已反馈', statusClass: 'ok', time: '2026-03-10 11:42:18', name: '曾海峰', idCard: '513701199606095613', gender: '男', age: 33, level: '红色', levelClass: 'red', category: '刑事前科类', group: '盗窃案', trace: '人校核查', place: '波密县玉许检查站', unit: '波密县公安局', count: 16, timeout: '' },
{ id: 5, status: '未签收', statusClass: 'danger', time: '2026-03-09 16:30:22', name: '李明', idCard: '510105199203156789', gender: '男', age: 34, level: '橙色', levelClass: 'orange', category: '刑事前科类', group: '诈骗案', trace: '轨迹追踪', place: '成都市武侯区人民南路', unit: '武侯区公安局', count: 8, timeout: '超时签收' },
{ id: 6, status: '已签收', statusClass: 'ok', time: '2026-03-09 15:20:11', name: '王丽', idCard: '320106198807234561', gender: '女', age: 38, level: '黄色', levelClass: 'yellow', category: '重点关注', group: '涉毒人员', trace: '人校核查', place: '南京市鼓楼区中央路', unit: '鼓楼区公安局', count: 5, timeout: '' },
{ id: 7, status: '未签收', statusClass: 'danger', time: '2026-03-09 10:05:33', name: '赵强', idCard: '440101199505189012', gender: '男', age: 31, level: '红色', levelClass: 'red', category: '在逃人员', group: '抢劫案', trace: '轨迹追踪', place: '广州市荔湾区芳村大道', unit: '荔湾区公安局', count: 22, timeout: '超时签收' },
{ id: 8, status: '已反馈', statusClass: 'ok', time: '2026-03-08 22:18:44', name: '陈静', idCard: '350102199108267890', gender: '女', age: 35, level: '蓝色', levelClass: 'blue', category: '刑事前科类', group: '盗窃案', trace: '人校核查', place: '福州市鼓楼区东街口', unit: '鼓楼区公安局', count: 3, timeout: '' },
{ id: 9, status: '已签收', statusClass: 'ok', time: '2026-03-08 18:45:09', name: '孙伟', idCard: '210102199307123456', gender: '男', age: 33, level: '橙色', levelClass: 'orange', category: '重点关注', group: '逃犯人员', trace: '轨迹追踪', place: '沈阳市和平区太原街', unit: '和平区公安局', count: 11, timeout: '' },
{ id: 10, status: '未签收', statusClass: 'danger', time: '2026-03-08 09:30:56', name: '周芳', idCard: '420106199612085678', gender: '女', age: 30, level: '黄色', levelClass: 'yellow', category: '刑事前科类', group: '故意伤害', trace: '人校核查', place: '武汉市武昌区中南路', unit: '武昌区公安局', count: 7, timeout: '' }
]
</script>
<style scoped lang="scss">
.ces-page {
width: 100%;
padding: 8px;
box-sizing: border-box;
background: #fff;
}
.status {
color: #0f5bbd;
}
.status.danger {
color: #ff2424;
}
.status.ok {
color: #1d72e8;
}
.level {
display: inline-block;
min-width: 42px;
line-height: 1.2;
color: #fff;
font-weight: 700;
text-align: center;
padding: 2px 6px;
}
.level.red {
background: #e11212;
}
.level.orange {
background: #f39a14;
}
.level.yellow {
background: #d9bb17;
}
.level.blue {
background: #1b76eb;
}
.operation {
color: #1b59bf;
}
.timeout {
color: #ff1f1f;
text-align: center;
}
</style>

View File

@ -2,19 +2,22 @@
<div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button v-for="(item,index) in butList" :key="index" :type="qh == item ? 'primary' : 'default'" @click="qh = item" size="small">{{item}}</el-button>
<el-button v-for="(item, index) in butList" :key="index" :type="qh == item ? 'primary' : 'default'"
@click="qh = item" size="small">{{ item }}</el-button>
</template>
</PageTitle>
<FouColorWarning v-if="qh=='预警整合'" />
<SevenWarning 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=='组合预警'" />
<FouColorWarning v-if="qh == '预警整合'" />
<SevenWarning v-if="qh == '七类重点'" />
<PortraitWarning v-if="qh == '人像预警'" />
<VehicleWarning v-if="qh == '车辆预警'" />
<ControlWarning v-if="qh == '布控预警'" />
<RegionalControl v-if="qh == '区域预警'" />
<WrjWarning v-if="qh == '无人机预警'" />
<PoliticalSecurityWarning v-if="qh == '政保预警'" />
<IdentityWarning v-if="qh == '身份预警'" />
<BehaviorWarning v-if="qh == '行为预警'" />
<CombinedWarning v-if="qh == '组合预警'" />
<!-- <Cs v-if="qh == '测试'" /> -->
</div>
</template>
<script setup>
@ -30,23 +33,30 @@ import VehicleWarning from "@/views/backOfficeSystem/fourColorManage/warningList
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 PoliticalSecurityWarning from "@/views/backOfficeSystem/fourColorManage/warningControl/politicalSecurity/index.vue"
import Cs from '@/views/backOfficeSystem/ces/index.vue'
import { onMounted, ref } from "vue";
const butList=ref(["预警整合","七类重点","人像预警","车辆预警","布控预警","区域预警","无人机预警",])
const butList = ref(["七类重点", '政保预警', "人像预警", "车辆预警", "布控预警", "区域预警", "无人机预警", "预警整合",])
const qh = ref('预警整合')
const hasPermissin = ref(false)
onMounted(() => {
// rolCode : 市情指领导(JS_666666)、市情指权限(JS_777777)、县情指权限(JS_888888)、县情指领导权限(JS_999999);
// depCode : 市情指领导(513030199509084123 )、市情指(340827200404141028)、县情指领导(540421196805217650)、朗县公安局指挥中心(县情指)(540422200010197030)、朗县公安局县城派出所(部门)(513425199305205211)
let rolCode = ['JS_666666','JS_777777','JS_888888','JS_999999']
let depCode = ['513030199509084123','340827200404141028','540421196805217650','540422200010197030','513425199305205211']
let rolCode = ['JS_666666', 'JS_777777', 'JS_888888', 'JS_999999']
let depCode = ['513030199509084123', '340827200404141028', '540421196805217650', '540422200010197030', '513425199305205211']
let roleData = getItem('roleList');
let deptData = getItem('deptId');
roleData.forEach(item => {
if(rolCode.includes(item.roleCode)) hasPermissin.value = true
if (rolCode.includes(item.roleCode)) hasPermissin.value = true
})
deptData.forEach(item => {
if(depCode.includes(item.deptCode)) hasPermissin.value = true
if (depCode.includes(item.deptCode)) hasPermissin.value = true
})
if(hasPermissin.value) butList.value = [...butList.value,...["身份预警","行为预警","组合预警"]]
if (hasPermissin.value) {
const data = butList.value.filter(item => item !== "预警整合")
butList.value = [...data, ...["身份预警", "行为预警", "组合预警", "预警整合"]]
}
})
</script>

View File

@ -1,324 +0,0 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">组合标签管理{{ title }} </span>
<div>
<el-button
type="primary"
size="small"
:loading="loading"
@click="submit"
>保存</el-button
>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage
v-model="listQuery"
:formList="formData"
ref="elform"
:rules="rules"
>
<!-- 身份标签细类 -->
<template #sfbqIdList>
<el-button @click="openDialog('01')">选择</el-button>
<div class="boxlist">
<MyTable
:tableData="tableDate.sfbqIdList"
:tableColumn="tableDate.tableColumn"
:tableHeight="tableDate.tableHeight"
:key="tableDate.keyCount"
:tableConfiger="tableDate.tableConfiger"
:controlsWidth="tableDate.controlsWidth"
>
<template #bqLx="{ row }">
<DictTag
:value="row.bqLx"
:tag="false"
:options="props.dic.D_GS_BQ_LX"
/>
</template>
<template #bqLb="{ row }">
<DictTag
:value="row.bqLb"
:tag="false"
:options="props.dic.D_GS_BQ_LB"
/>
</template>
<template #bqYs="{ row }">
<DictTag
:value="row.bqYs"
:tag="false"
:options="props.dic.D_GS_SSYJ"
/>
</template>
<template #bqDj="{ row }">
<DictTag
:tag="false"
:value="row.bqDj"
:options="props.dic.D_GS_BQ_DJ"
/>
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link
type="danger"
@click="delDictItem(row.id, '身份标签细类')"
>删除</el-link
>
</template>
</MyTable>
</div>
</template>
<!-- 行为标签细类 -->
<template #xwbqIdList>
<el-button @click="openDialog('02')">选择</el-button>
<div class="boxlist">
<MyTable
:tableData="tableDate.xwbqIdList"
:tableColumn="tableDate.tableColumn"
:tableHeight="tableDate.tableHeight"
:key="tableDate.keyCount"
:tableConfiger="tableDate.tableConfiger"
:controlsWidth="tableDate.controlsWidth"
>
<template #bqLx="{ row }">
<DictTag
:value="row.bqLx"
:tag="false"
:options="props.dic.D_GS_BQ_LX"
/>
</template>
<template #bqLb="{ row }">
<DictTag
:value="row.bqLb"
:tag="false"
:options="props.dic.D_GS_BQ_LB"
/>
</template>
<template #bqYs="{ row }">
<DictTag
:value="row.bqYs"
:tag="false"
:options="props.dic.D_GS_SSYJ"
/>
</template>
<template #bqDj="{ row }">
<DictTag
:tag="false"
:value="row.bqDj"
:options="props.dic.D_GS_BQ_DJ"
/>
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link
type="danger"
@click="delDictItem(row.id, '行为标签细类')"
>删除</el-link
>
</template>
</MyTable>
</div>
</template>
</FormMessage>
</div>
<!-- 列表弹窗 -->
<DialogList
:Single="false"
:roleIds="roleIds"
v-if="chooseShow"
:dic="props.dic"
@chooseDate="chooseDate"
:titleValue="chooseTitle"
v-model="chooseShow"
:bqLx="chooseType"
bqDl="02"
></DialogList>
</div>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import DialogList from "@/views/backOfficeSystem/fourColorManage/components/dialogList.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import {
ref,
defineExpose,
defineProps,
reactive,
defineEmits,
getCurrentInstance
} from "vue";
const emit = defineEmits(["updateDate"]);
const { proxy } = getCurrentInstance();
const props = defineProps({
dic: Object
});
const roleIds = ref([]); //角色id
const chooseType = ref("01"); //选择弹窗类型
const chooseShow = ref(false); //选择弹窗
const chooseTitle = ref(""); //选择弹窗
const dialogForm = ref(false); //弹窗
const formData = reactive([
{ label: "组合标签名称", prop: "bqMc", type: "input" },
{ label: "组合标签代码", prop: "bqDm", type: "input" },
// {
// label: "标签等级",
// prop: "bqDj",
// type: "select",
// options: props.dic.D_GS_BQ_DJ
// },
{
label: "标签颜色",
prop: "bqYs",
type: "select",
options: props.dic.D_GS_SSYJ
},
{ label: "组合标签分值", prop: "bqFz", type: "input" },
{ label: "组合标签说明", prop: "bqSm", type: "input" },
{ label: "身份标签细类", prop: "sfbqIdList", type: "slot", width: "100%" },
{ label: "行为标签细类", prop: "xwbqIdList", type: "slot", width: "100%" }
]);
const rules = reactive({
bqMc: [{ required: true, message: "请输入组合标签名称", trigger: "blur" }],
bqDm: [{ required: true, message: "请输入组合标签代码", trigger: "blur" }],
zhbqjf: [{ required: true, message: "请输入组合标签积分", trigger: "blur" }],
sfbqIdList: [
{ required: true, message: "请选择身份标签细类", trigger: "change" }
],
xwbqIdList: [
{ required: true, message: "请选择行为标签细类", trigger: "change" }
]
});
const tableDate = reactive({
sfbqIdList: [], //表格数据
xwbqIdList: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 0,
tableHeight: 225,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 90, //操作栏宽度
tableColumn: [
{ label: "标签名称", prop: "bqMc", showOverflowTooltip: true },
{ label: "标签代码", prop: "bqDm" },
{ label: "标签大类名称", prop: "bqDlMc" },
{ label: "标签类型", prop: "bqLx", showSolt: true },
{ label: "标签类别", prop: "bqLb", showSolt: true },
{ label: "标签颜色", prop: "bqYs", showSolt: true },
{ label: "标签等级", prop: "bqDj", showSolt: true }
]
});
const listQuery = ref({}); //表单
const loading = ref(false);
const elform = ref();
const title = ref("");
// 初始化数据
const init = (type, row) => {
dialogForm.value = true;
title.value = type == "add" ? "新增" : "编辑";
if (row) getDataById(row.id);
};
// 根据id查询详情
const getDataById = (id) => {
qcckGet({}, "/mosty-gsxt/tbGsxtBqzh/selectVoById/" + id).then((res) => {
listQuery.value = res;
tableDate.sfbqIdList = res.sfbqList;
listQuery.value.sfbqIdList = res.sfbqList.map((item) => item.id);
tableDate.xwbqIdList = res.xwbqList;
listQuery.value.xwbqIdList = res.xwbqList.map((item) => item.id);
tableDate.keyCount++;
});
};
// 提交
const submit = () => {
elform.value.submit((data) => {
let url =
title.value == "新增"
? "/mosty-gsxt/tbGsxtBqzh/save"
: "/mosty-gsxt/tbGsxtBqzh/update";
let params = { ...data };
loading.value = true;
qcckPost(params, url)
.then((res) => {
proxy.$message({ type: "success", message: title.value + "成功" });
emit("updateDate");
loading.value = false;
close();
})
.catch(() => {
loading.value = false;
});
});
};
// 打开弹窗
const openDialog = (type) => {
chooseShow.value = true;
chooseType.value = type;
chooseTitle.value = type == "01" ? "选择身份标签细类" : "选择行为标签细类";
roleIds.value =
type == "01"
? tableDate.sfbqIdList.map((item) => item.id)
: tableDate.xwbqIdList.map((item) => item.id);
};
// 选择数据
const chooseDate = (data) => {
if (chooseType.value == "01") {
tableDate.sfbqIdList = data;
listQuery.value.sfbqIdList = tableDate.sfbqIdList.map((item) => item.id);
} else {
tableDate.xwbqIdList = data;
listQuery.value.xwbqIdList = tableDate.xwbqIdList.map((item) => item.id);
}
};
// 删除
const delDictItem = (id, type) => {
switch (type) {
case "身份标签细类":
tableDate.sfbqIdList = tableDate.sfbqIdList.filter(
(item) => item.id !== id
);
listQuery.value.sfbqIdList = tableDate.sfbqIdList.map((item) => item.id);
break;
case "行为标签细类":
tableDate.xwbqIdList = tableDate.xwbqIdList.filter(
(item) => item.id !== id
);
listQuery.value.xwbqIdList = tableDate.xwbqIdList.map((item) => item.id);
break;
}
};
// 关闭
const close = () => {
listQuery.value = {};
tableDate.sfbqIdList = [];
tableDate.xwbqIdList = [];
dialogForm.value = false;
loading.value = false;
};
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
.boxlist {
width: 99%;
height: 225px;
margin-top: 10px;
overflow: hidden;
}
</style>

View File

@ -1,178 +0,0 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<!-- <el-button>
<span style="vertical-align: middle">调级</span>
</el-button>
<el-button>
<span style="vertical-align: middle">导出</span>
</el-button>
<el-button>
<span style="vertical-align: middle">导入</span>
</el-button> -->
<el-button size="small" type="primary" @click="addEdit('add', '')">
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">新增</span>
</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #bqYs="{ row }">
<DictTag :value="row.bqYs" :tag="false" :options="D_GS_SSYJ" />
</template>
<template #bqDj="{ row }">
<DictTag :tag="false" :value="row.bqDj" :options="D_GS_BQ_DJ" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" @click="chooseJfFun(row)">配置系统</el-link>
<el-link type="primary" @click="addEdit('edit', row)">编辑</el-link>
<el-link type="danger" @click="delDictItem(row.id)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<!-- 编辑详情 -->
<EditAddForm v-if="show" ref="detailDiloag" :dic="{ D_GS_BQ_LX, D_GS_BQ_DJ, D_GS_SSYJ, D_GS_BQ_LB }"
@updateDate="getList" />
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
:chooseJfBh="chooseJfBh" url="/tbGsxtBqzh/sjxspz" :roleIds="roleIds"/>
</div>
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import EditAddForm from "./components/editAddForm.vue";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { tbGsxtBqzhId } from "@/api/yj.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_BQ_DJ, D_GS_SSYJ, D_GS_BQ_LB, D_GS_BQ_LX } = proxy.$dict("D_GS_BQ_DJ", "D_GS_SSYJ", "D_GS_BQ_LB", "D_GS_BQ_LX"); //获取字典数据
const detailDiloag = ref();
const show = ref(false)
const searchBox = ref(); //搜索框
const searchConfiger = ref(
[
{ label: "组合标签名称", prop: 'bqMc', placeholder: "请输入组合标签名称", showType: "input" },
// { label: "组合标签标签等级", prop: 'bqDj', placeholder: "请选择组合标签标签等级", showType: "select",options: D_GS_BQ_DJ },
{ label: "组合标签颜色", prop: 'bqYs', placeholder: "请选择组合标签标签颜色", showType: "select", options: D_GS_SSYJ },
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 160, //操作栏宽度
tableColumn: [
{ label: "组合标签名称", prop: "bqMc" },
{ label: "标签代码", prop: "bqDm" },
// { label: "组合标签等级", prop: "bqDj",showSolt:true },
{ label: "组合标签颜色", prop: "bqYs", showSolt: true },
{ label: "组合标签分值", prop: "bqFz" },
{ label: "组合标签说明", prop: "bqSm", showOverflowTooltip: true },
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
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;
qcckGet(queryFrom.value, '/mosty-gsxt/tbGsxtBqzh/selectPage').then((res) => {
pageData.tableData = res.records;
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
// 删除
const delDictItem = (id) => {
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
qcckDelete({}, '/mosty-gsxt/tbGsxtBqzh/' + id).then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
})
}).catch(() => { });
}
// 新增
const addEdit = (type, row) => {
show.value = true;
nextTick(() => {
detailDiloag.value.init(type, row,);
})
};
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds=ref()
const chooseJfFun = (val) => {
chooseJfBh.value=val.id
tbGsxtBqzhId(val.id).then(res => {
roleIds.value=res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -0,0 +1,415 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :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"
:expand="true" @chooseData="handleChooseData">
<template #xwcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.xwcs }}</span>
</template>
<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 #xwfz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="xwfz" width="90" align="center" label="计算分值"/>
</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="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)" >配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs ">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddModel(row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<!-- 详情 -->
<Detail ref="detailRef"></Detail>
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="02" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<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>
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
:chooseJfBh="chooseJfBh" url="/yjzxXwyj/sjxspz" :roleIds="roleIds"/>
</template>
<script setup>
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import * as XLSX from "xlsx";
import Detail from './components/detail.vue'
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 {yjzxXwyjSelectList } from "@/api/yj.js";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import { tbGsxtBqglSelectList } from '@/api/zdr'
import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import emitter from "@/utils/eventBus.js";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
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 czjyRef = ref()
const permission_sfqs = ref(false)
const roleCode = ref(false)
const { proxy } = getCurrentInstance();
const { D_BZ_YJJB,D_GS_SSYJ, D_GSXT_YJXX_CZZT } = proxy.$dict('D_BZ_YJJB',"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: []
})
const searchConfiger = ref(
[
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "电话号码", prop: 'dh', placeholder: "请输入电话号码", showType: "input" },
{ label: "预警标签", prop: 'xwms', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB},
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
]);
const detailRef = ref()
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: 300, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" },
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" },
{ label: "标签", prop: "xwms" },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "xwcs", showSolt: true,width: 90 },
{ label: "预警分值", prop: "xwfz",showSolt: true },
]
});
const gettbGsxtBqglSelectList = (val) => {
tbGsxtBqglSelectList({ bqLx: '02', bqlb: val, bqDlId: '241cc7b69a50428287cc79445e310180' }).then((res) => {
bqLbData.value.bqXl = res.map(item => {
return {
label: item.bqMc,
value: item.id
}
}) || []
})
}
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList'):[]
let obj = rols.find(item => {
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn();
getList()
gettbGsxtBqglSelectList('02')
});
const handleCzjy = (row) => {
czjyRef.value.init( row)
}
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...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 reset = () => {
delete queryFrom.value.ksfz
delete queryFrom.value.jsfz
}
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;
qcckGet(promes, '/mosty-gsxt/yjzxXwyj/getPageList').then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records.map(item => {
return { ...item }
}) || [];
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const handleClick = (row) => {
detailRef.value.init(row)
}
const exportExcel = () => {
if (pageData.tableData.length === 0) return ElMessage({ message: "暂无数据", type: "warning" });
const headers = pageData.tableColumn.map(item => item.label);
const data = pageData.tableData.map(item => {
return [item.xm, item.sfzh, item.dh, item.xldlmc, item.xwzlmc, item.xwms, item.xwcs, item.xwfz];
});
const worksheet = XLSX.utils.aoa_to_sheet([headers, ...data]);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, "sheet1");
XLSX.writeFile(workbook, "行为预警.xlsx");
}
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'
}
}
// 全息档案
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val.yjlx,val) // 全息档案跳转
// assessShow.value = true;
// dataList.value = val;
}
// 发送指令
const showDialog = ref(false)
const itemData = ref()
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const semdFqzlRef = ref()
const tacitly = {
title: 'yjbt',
instructionContent: 'yjnr'
}
const submit = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/yjzxXwyj/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const addModelRef = ref(null)
const openAddModel = (row) => {
console.log(row);
addModelRef.value.init(row)
}
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds=ref()
const chooseJfFun = (val) => {
chooseJfBh.value=val.id
yjzxXwyjSelectList(val.id).then(res => {
roleIds.value=res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
window.onresize = function() {
tabHeightFn();
};
};
/** 触发选中 */
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_cname: "状态",
yjsj: "预警时间",
xm: "姓名",
sfzh: "身份证号",
xwms: "标签",
ssbm: "接收单位",
sfcs: "活动频次",
sffz: "预警分值",
}
/** 导出【选中】的数据 (没有就全部)*/
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, '行为预警')
}
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/yjzxXwyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
</script>
<style lang="scss">
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
/** 方便查看对应的颜色, */
.test-top-color {
color: #ff0202;
background-color: #ff8c00;
border-color: #c2c203;
outline-color: #0000ff;
}
.tabBox_zdy{
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -2,7 +2,7 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
@ -10,24 +10,24 @@
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
<template #but>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</QueryFormPanel>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :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"
:expand="true" @chooseData="handleChooseData">
<div class="bgTable" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #xwcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.xwcs }}</span>
</template>
<template #bqys="{ row }">
<DictTag :value="row.bqys" :tag="false" :color="bqYs(row.bqys)" :options="D_GS_SSYJ" />
<div :style="{ 'background-color': bqYs(row.bqys) }">
<DictTag :value="row.bqys" :tag="false" color="#fff" :options="D_GS_SSYJ" />
</div>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
@ -35,25 +35,19 @@
<template #xwfz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="xwfz" width="90" align="center" label="计算分值"/>
<el-table-column prop="xwfz" width="90" align="center" label="计算分值" />
</template>
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%">
<Items :row="props" :dict="dict" />
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<span class="primary" @click="chooseJfFun(row)">配置系统</span>
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs">反馈</span>
<span class="primary" @click="openAddModel(row)">详情</span>
</div>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)" >配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs ">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddModel(row)">详情</el-link>
</template>
</MyTable>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -65,33 +59,26 @@
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="02" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<SemdFqzl
ref="semdFqzlRef"
:itemData="itemData"
@handleClose="handleClose"
identification="yj"
<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>
<!-- 处置建议 -->
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
:chooseJfBh="chooseJfBh" url="/yjzxXwyj/sjxspz" :roleIds="roleIds"/>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxXwyj/sjxspz"
:roleIds="roleIds" />
</template>
<script setup>
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import * as XLSX from "xlsx";
import { getItem } from '@/utils/storage'
import Detail from './components/detail.vue'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Items from "./item/items.vue";
import {yjzxXwyjSelectList } from "@/api/yj.js";
import { yjzxXwyjSelectList } from "@/api/yj.js";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
@ -100,16 +87,17 @@ import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import emitter from "@/utils/eventBus.js";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import { reactive, ref, onMounted, getCurrentInstance, computed, watch, nextTick } from "vue";
import { reactive, ref, onMounted, getCurrentInstance } 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"
import { bqYs } from '@/utils/tools.js'
const czjyRef = ref()
const permission_sfqs = ref(false)
const roleCode = ref(false)
const { proxy } = getCurrentInstance();
const { D_BZ_YJJB,D_GS_SSYJ, D_GSXT_YJXX_CZZT } = proxy.$dict('D_BZ_YJJB',"D_GS_SSYJ", "D_GSXT_YJXX_CZZT"); //获取字典数据
const { D_BZ_YJJB, D_GS_SSYJ, D_GSXT_YJXX_CZZT } = proxy.$dict('D_BZ_YJJB', "D_GS_SSYJ", "D_GSXT_YJXX_CZZT"); //获取字典数据
// 字典数据集合
const dict = ref({
@ -125,17 +113,18 @@ const bqLbData = ref({
const searchConfiger = ref(
[
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "电话号码", prop: 'dh', placeholder: "请输入电话号码", showType: "input" },
{ label: "预警标签", prop: 'xwms', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB},
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ key: 'xm', label: "姓名", placeholder: "请输入姓名", type: "input" },
{ key: 'sfzh', label: "身份证号码", placeholder: "请输入身份证号码", type: "input" },
{ key: 'dh', label: "电话号码", placeholder: "请输入电话号码", type: "input" },
{ key: 'xwms', label: "预警标签", placeholder: "请输入预警标签", type: "input" },
{ key: 'ssbmdm', label: "部门", placeholder: "请选择部门", type: "department" },
{ key: 'bqys', label: "级别", placeholder: "请选择级别", type: "select", options: D_BZ_YJJB },
{ key: 'jfd', label: "积分段", placeholder: "请选择积分段", type: "Slot" },
{ key: 'startTime', label: "预警时间", type: "datetimerange" },
]);
const detailRef = ref()
const listQuery = ref({});
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
@ -153,14 +142,16 @@ const pageData = reactive({
}, //分页
controlsWidth: 300, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" },
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" },
{ label: "标签", prop: "xwms" },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: "状态", slotName: "czzt", width: 100 },
{ label: "预警时间", prop: "yjsj", width: 200 },
{ label: "姓名", prop: "xm", width: 100 },
{ label: "身份证号", prop: "sfzh", width: 170 },
{ label: "标签", prop: "xwms", width: 120 },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "xwcs", showSolt: true,width: 90 },
{ label: "预警分值", prop: "xwfz",showSolt: true },
{ label: "活动频次", slotName: "xwcs", width: 90, align: 'center' },
{ label: "预警分值", slotName: "xwfz", width: 230 },
{ label: '操作', width: 300, slotName: 'operation', align: 'center' },
]
});
@ -178,11 +169,11 @@ const gettbGsxtBqglSelectList = (val) => {
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList'):[]
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
@ -193,14 +184,14 @@ onMounted(() => {
});
const handleCzjy = (row) => {
czjyRef.value.init( row)
czjyRef.value.init(row)
}
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value,...val };
queryFrom.value.startTime = val.times ? val.times[0] : ''
queryFrom.value.endTime = val.times ? val.times[1] : ''
queryFrom.value = { ...queryFrom.value, ...val };
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
@ -223,7 +214,7 @@ const getList = () => {
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
delete promes.startTime;
qcckGet(promes, '/mosty-gsxt/yjzxXwyj/getPageList').then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
@ -238,34 +229,11 @@ const getList = () => {
const handleClick = (row) => {
detailRef.value.init(row)
}
const exportExcel = () => {
if (pageData.tableData.length === 0) return ElMessage({ message: "暂无数据", type: "warning" });
const headers = pageData.tableColumn.map(item => item.label);
const data = pageData.tableData.map(item => {
return [item.xm, item.sfzh, item.dh, item.xldlmc, item.xwzlmc, item.xwms, item.xwcs, item.xwfz];
});
const worksheet = XLSX.utils.aoa_to_sheet([headers, ...data]);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, "sheet1");
XLSX.writeFile(workbook, "行为预警.xlsx");
}
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'
}
}
// 全息档案
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val.yjlx,val) // 全息档案跳转
return holographicProfileJump(val.yjlx, val) // 全息档案跳转
// assessShow.value = true;
// dataList.value = val;
}
@ -274,10 +242,6 @@ const pushAssess = (val) => {
// 发送指令
const showDialog = ref(false)
const itemData = ref()
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
@ -327,20 +291,20 @@ const openAddModel = (row) => {
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds=ref()
const roleIds = ref()
const chooseJfFun = (val) => {
chooseJfBh.value=val.id
chooseJfBh.value = val.id
yjzxXwyjSelectList(val.id).then(res => {
roleIds.value=res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
roleIds.value = res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function() {
window.onresize = function () {
tabHeightFn();
};
};
@ -375,14 +339,14 @@ const exportExl = () => {
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
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/yjzxXwyj/batchQs').then(() => {
qcckPost({ ids }, '/mosty-gsxt/yjzxXwyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
@ -393,7 +357,7 @@ const handleQs = () => {
</script>
<style lang="scss">
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
@ -406,10 +370,13 @@ const handleQs = () => {
outline-color: #0000ff;
}
.tabBox_zdy{
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
}
.bgTable {
background-color: #fff;
}
</style>

View File

@ -0,0 +1,387 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :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"
:expand="true" @chooseData="handleChooseData">
<template #sfcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.sfcs }}</span>
</template>
<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 #sffz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="sffz" width="90" align="center" label="计算分值"/>
</template>
<template #expand="{ props }">
<div>
<Items :row="props || {}" :dict="dict" />
</div>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddModel(row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<Detail ref="detailRef" />
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="04" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<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 }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxZhyj/sjxspz"
:roleIds="roleIds" />
</template>
<script setup>
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
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 ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { tbYjxxGetZbtj, tbGsxtBqzhSelectList, yjzxZhyjSelectList } 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, 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 permission_sfqs = ref(false)
const roleCode = ref(false)
const searchBox = ref();
const czjyRef = 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 dict = ref({
D_GS_SSYJ,
D_GSXT_YJXX_CZZT
})
import { holographicProfileJump } from "@/utils/tools.js"
// 搜索配置
const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
]);
const queryFrom = ref({});
// 页面数据
const pageData = reactive({
tableData: [{ sfcs: 1 }],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true,
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 300,
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" },
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" },
{ label: "标签", prop: "yjbqmc" },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "sfcs",width:'90' },
{ label: "预警分值", prop: "sffz",showSolt: true },
]
});
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn();
getList();
gettbGsxtBqglSelectList()
});
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
const onSearch = (val) => {
queryFrom.value = { ...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 reset = () => {
delete queryFrom.value.ksfz
delete queryFrom.value.jsfz
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
const getList = () => {
pageData.tableConfiger.loading = true;
// TODO: 替换为实际的组合预警API接口
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
tbYjxxGetZbtj(promes).then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#e6a23c'
} else if (val == '04') {
return '#0000ff'
}
}
const bqLbData = ref({
bqXl: []
})
const gettbGsxtBqglSelectList = (val) => {
tbGsxtBqzhSelectList({}).then((res) => {
bqLbData.value.bqXl = res.map(item => {
return {
label: item.bqMc,
value: item.bqDm
}
}) || []
})
}
// 查看详情
const detailRef = ref()
const handleClick = (row) => {
detailRef.value.init(row)
}
const assessShow = ref(false)
/** 选中项 */
const selectRows = ref([])
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val.yjlx, val) // 全息档案跳转
// assessShow.value = true;
// dataList.value = val;
}
// 发送指令
const showDialog = ref(false)
const itemData = ref()
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const semdFqzlRef = ref()
const tacitly = {
title: 'yjbt',
instructionContent: 'yjnr'
}
const submit = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/yjzxZhyj/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const addModelRef = ref(null)
const openAddModel = (row) => {
console.log(row);
addModelRef.value.init(row)
}
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds = ref()
const chooseJfFun = (val) => {
chooseJfBh.value = val.id
yjzxZhyjSelectList(val.id).then(res => {
roleIds.value = res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_cname: "状态",
yjsj: "预警时间",
xm: "姓名",
sfzh: "身份证号",
yjbqmc: "标签",
ssbm: "接收单位",
sfcs: "活动频次",
sffz: "预警分值",
}
/** 导出【选中】的数据 (没有就全部)*/
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, '组合预警')
}
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/yjzxZhyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
</script>
<style lang="scss">
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -3,7 +3,7 @@
<!-- 搜索 -->
<div ref="searchBox">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
@ -11,24 +11,24 @@
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
<template #but>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</QueryFormPanel>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :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"
:expand="true" @chooseData="handleChooseData">
<div class=" tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #sfcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.sfcs }}</span>
</template>
<template #bqys="{ row }">
<DictTag :value="row.bqys" :tag="false" :color="bqYs(row.bqys)" :options="D_GS_SSYJ" />
<div :style="{ 'background-color': bqYs(row.bqys) }">
<DictTag :value="row.bqys" :tag="false" color="#fff" :options="D_GS_SSYJ" />
</div>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
@ -36,26 +36,20 @@
<template #sffz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="sffz" width="90" align="center" label="计算分值"/>
<el-table-column prop="sffz" width="90" align="center" label="计算分值" />
</template>
<template #expand="{ props }">
<div>
<Items :row="props || {}" :dict="dict" />
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<span class="primary" @click="chooseJfFun(row)">配置系统</span>
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<span class="primary" @click="openAddModel(row)">详情</span>
</div>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddModel(row)">详情</el-link>
</template>
</MyTable>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -79,12 +73,10 @@
<script setup>
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { getItem } from '@/utils/storage'
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Items from "./item/items.vue";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { tbYjxxGetZbtj, tbGsxtBqzhSelectList, yjzxZhyjSelectList } from '@/api/yj.js'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
@ -92,12 +84,13 @@ 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, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { 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";
import { bqYs } from '@/utils/tools.js'
const permission_sfqs = ref(false)
const roleCode = ref(false)
const searchBox = ref();
@ -114,15 +107,16 @@ import { holographicProfileJump } from "@/utils/tools.js"
// 搜索配置
const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ key: 'xm', label: "姓名", placeholder: "请输入姓名", type: "input" },
{ key: 'sfzh', label: "身份证号码", placeholder: "请输入身份证号码", type: "input" },
{ key: 'yjbqmc', label: "预警标签", placeholder: "请输入预警标签", type: "input" },
{ key: 'ssbmdm', label: "部门", placeholder: "请选择部门", type: "department" },
{ key: 'bqys', label: "级别", placeholder: "请选择级别", type: "select", options: D_BZ_YJJB },
{ key: 'jfd', label: "积分段", placeholder: "请选择积分段", type: "Slot" },
{ key: 'startTime', label: "预警时间", type: "datetimerange" },
]);
const listQuery = ref({});
const queryFrom = ref({});
// 页面数据
@ -142,14 +136,16 @@ const pageData = reactive({
},
controlsWidth: 300,
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" },
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" },
{ label: "标签", prop: "yjbqmc" },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: "状态", slotName: "czzt", width: 100 },
{ label: "预警时间", prop: "yjsj", width: 200 },
{ label: "姓名", prop: "xm", width: 100 },
{ label: "身份证号", prop: "sfzh", width: 170 },
{ label: "标签", prop: "yjbqmc", width: 120 },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "sfcs",width:'90' },
{ label: "预警分值", prop: "sffz",showSolt: true },
{ label: "活动频次", slotName: "sfcs", width: 90, align: 'center' },
{ label: "预警分值", slotName: "sffz", width: 230 },
{ label: '操作', width: 300, slotName: 'operation', align: 'center' },
]
});
@ -175,8 +171,8 @@ const handleCzjy = (row) => {
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value, ...val };
queryFrom.value.startTime = val.times ? val.times[0] : ''
queryFrom.value.endTime = val.times ? val.times[1] : ''
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList();
};
@ -204,7 +200,7 @@ const getList = () => {
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
delete promes.startTime;
tbYjxxGetZbtj(promes).then((res) => {
pageData.tableData = res.records || [];
@ -214,17 +210,6 @@ const getList = () => {
pageData.tableConfiger.loading = false;
});
};
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#e6a23c'
} else if (val == '04') {
return '#0000ff'
}
}
const bqLbData = ref({
bqXl: []
})
@ -321,7 +306,7 @@ const chooseJfFun = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
@ -356,14 +341,14 @@ const exportExl = () => {
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
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/yjzxZhyj/batchQs').then(() => {
qcckPost({ ids }, '/mosty-gsxt/yjzxZhyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
@ -380,8 +365,6 @@ const handleQs = () => {
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
background-color: #fff;
}
</style>

View File

@ -0,0 +1,403 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :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" expand
@chooseData="handleChooseData">
<template #expand="{ props }">
<Items :row="props || {}" :dict="dict" />
</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 }">
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_GS_SSYJ" />
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :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 #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="primary" @click="openAddFrom(row)">详情</el-link> -->
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<FkDialog @change="getList" lx="05" />
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- <Pagination v-model="paginationOpen" /> -->
<Pagination v-model="paginationOpen" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ}" />
</template>
<script setup>
import { IdCard } from '@/utils/validate.js'
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
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 AddFrom from "./components/addFrom.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
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"
import Pagination from "./components/particulars.vue";
const czjyRef = ref()
const { proxy } = getCurrentInstance();
const searchBox = ref();
const { D_GS_QLZDRLX, D_BZ_YJLY, D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, D_BZ_BKLYS, D_BZ_XB, D_BZ_SF, D_GS_CSZT, D_GS_BKZT, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB,D_GS_BK_CZYQ } = proxy.$dict('D_GS_QLZDRLX', 'D_BZ_YJLY', "D_GSXT_YJXX_CZZT", "D_GS_SSYJ", 'D_BZ_YJJB', 'D_BZ_BKLYS', 'D_BZ_XB', 'D_BZ_SF', 'D_GS_CSZT', 'D_GS_BKZT', 'D_GS_ZDR_RYJB', 'D_GS_ZDR_GJLB','D_GS_BK_CZYQ'
)
const dict = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ })
// 搜索配置
const searchConfiger = ref([
{ label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "布控范围", prop: 'bkfw', showType: "input", placeholder: "请输入布控范围" },
{ label: "布控单位", prop: 'gkbmdm', showType: "department", placeholder: "请选择布控单位" },
{ label: "所属单位", prop: 'ssbmdm', showType: "department", placeholder: "请选择所属单位" },
{ label: "相似度", prop: 'xsd', showType: "input", placeholder: "请输入相似度" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "姓名", prop: 'yjRyxm', showType: "input", placeholder: "请输入姓名" },
{ label: "性别", prop: 'xbdm', showType: "select", options: D_BZ_XB, placeholder: "请选择性别" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "跨地区", prop: 'sflksd', showType: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "身份证号", prop: 'yjRysfzh', showType: "input", placeholder: "请输入身份证号" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
// { label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
// { label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
// { label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
// { label: "级别", prop: 'yjJb', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB},
// { label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
// { 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 roleCode = ref(false)
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: 180, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true, width: 80 },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "姓名", prop: "yjRyxm" , width: 50},
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "性别", prop: "sex", showSolt: true , width: 50},
{ label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "预警级别", prop: "yjJb", showSolt: true , width: 50},
{ label: "布控单位", prop: "gkbmdm", showSolt: true , width: 50},
{ label: "布控来源", prop: "bkly", showSolt: true , width: 50},
{ label: "布控范围", prop: "bkfw", showSolt: true },
{ label: "布控开始时间", showOverflowTooltip: true, prop: "bkkssj", showSolt: true },
{ label: "布控结束时间", showOverflowTooltip: true, prop: "bkjssj", showSolt: true },
{ label: "处置要求", prop: "bkczyq", showSolt: true, showOverflowTooltip: true },
{ label: "相似度", prop: "xsd", showSolt: true, width: 50 },
{ label: "预警内容", prop: "yjNr", showOverflowTooltip: true, showSolt: true },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
{ label: "超时状态", prop: "cszt", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "在控状态", prop: "zkzt", showOverflowTooltip: true, showSolt: true, width: 50 },
]
});
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn();
getList();
});
const onSearch = (val) => {
queryFrom.value = {
...queryFrom.value, ...val,
startTime: val.startTime ? val.startTime[0] : '',
endTime: val.startTime ? val.startTime[1] : '',
yjJb: val.yjJb?.join(',') || '',
sfglyj: val.sfglyj?.join(',') || '',
sfgz: val.sfgz?.join(',') || '',
sfzp: val.sfzp?.join(',') || ''
};
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const reset = () => {
delete queryFrom.value.ksfz
delete queryFrom.value.jsfz
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
const getList = () => {
pageData.tableConfiger.loading = true;
let params = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
}
qcckPost(params, '/mosty-gsxt/tbYjxx/getBdbkPageList').then((res) => {
pageData.tableData = res?.records || []
pageData.total = res?.total || 0;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/mosty-gsxt/tbYjxx/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const pushAssess = (val) => {
return holographicProfileJump(val?.yjLx, val) // 全息档案跳转
}
const bqYs = (val) => {
switch (val) {
case '01':
return '#ff0202'
case '02':
return '#ff8c00'
case '03':
return '#ffff00'
case '04':
return '#0000ff'
default:
return ''
}
}
// 新增
const addModelRef = ref(null)
const openAddFrom = (row) => {
addModelRef.value.init('add', row)
}
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
// 指派
const dataList = ref(null)
const warningShow = ref(false)
const pushWarning = (val) => {
warningShow.value = true;
dataList.value = val;
}
/** 选中项 */
const selectRows = ref([])
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) + '%',
yjJb_name: getMultiDictVal(item.yjJb, D_GS_SSYJ),
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
}
})
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 paginationOpen = ref(false)
const dataPres = ref({})
const openBox = (val) => {
paginationOpen.value = true
dataPres.value = val
}
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
</style>

View File

@ -2,30 +2,18 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #but>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</Searchs>
</QueryFormPanel>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy" :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" expand
@chooseData="handleChooseData">
<template #expand="{ props }">
<Items :row="props || {}" :dict="dict" />
</template>
<div class=" tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<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" />
@ -41,40 +29,48 @@
</template>
</el-image>
</template>
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_GS_SSYJ" />
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #sex="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh, 2) }} </span>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #age="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh, 3) }} </span>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
<template #bkly="{ row }">
<DictTag :value="row.bkly" :tag="false" :options="D_BZ_BKLYS" />
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
<template #bkczyq="{ row }">
<DictTag :value="row.bkczyq" :tag="false" :options="D_GS_BK_CZYQ" />
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="primary" @click="openAddFrom(row)">详情</el-link> -->
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_SJLY" />
</template>
</MyTable>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<!-- <span type="primary" @click="showDetail(row)">转合成</span> -->
<!-- <span type="danger" @click="delDictItem(row.id)">转会商</span> -->
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<!-- <span type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</span> -->
<span class="primary" @click="openBox(row)">详情</span>
<span class="primary" @click="pushWarning(row)">指派</span>
</div>
</template>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -87,16 +83,16 @@
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- <Pagination v-model="paginationOpen" /> -->
<Pagination v-model="paginationOpen" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ}" />
<Pagination v-model="paginationOpen" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_GS_BK_CZYQ }" />
</template>
<script setup>
import { IdCard } from '@/utils/validate.js'
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import AddFrom from "./components/addFrom.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
@ -112,9 +108,7 @@ import Pagination from "./components/particulars.vue";
const czjyRef = ref()
const { proxy } = getCurrentInstance();
const searchBox = ref();
const { D_GS_QLZDRLX, D_BZ_YJLY, D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, D_BZ_BKLYS, D_BZ_XB, D_BZ_SF, D_GS_CSZT, D_GS_BKZT, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB,D_GS_BK_CZYQ } = proxy.$dict('D_GS_QLZDRLX', 'D_BZ_YJLY', "D_GSXT_YJXX_CZZT", "D_GS_SSYJ", 'D_BZ_YJJB', 'D_BZ_BKLYS', 'D_BZ_XB', 'D_BZ_SF', 'D_GS_CSZT', 'D_GS_BKZT', 'D_GS_ZDR_RYJB', 'D_GS_ZDR_GJLB','D_GS_BK_CZYQ'
)
const { D_GS_QLZDRLX, D_BZ_YJLY, D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, D_BZ_BKLYS, D_BZ_XB, D_BZ_SF, D_GS_CSZT, D_GS_BKZT, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_GS_BK_CZYQ, D_BZ_SJLY } = proxy.$dict('D_GS_QLZDRLX', 'D_BZ_YJLY', "D_GSXT_YJXX_CZZT", "D_GS_SSYJ", 'D_BZ_YJJB', 'D_BZ_BKLYS', 'D_BZ_XB', 'D_BZ_SF', 'D_GS_CSZT', 'D_GS_BKZT', 'D_GS_ZDR_RYJB', 'D_GS_ZDR_GJLB', 'D_GS_BK_CZYQ', 'D_BZ_SJLY')
const dict = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ })
// 搜索配置
const searchConfiger = ref([
@ -127,9 +121,9 @@ const searchConfiger = ref([
{ label: "布控单位", prop: 'gkbmdm', showType: "department", placeholder: "请选择布控单位" },
{ label: "所属单位", prop: 'ssbmdm', showType: "department", placeholder: "请选择所属单位" },
{ label: "相似度", prop: 'xsd', showType: "input", placeholder: "请输入相似度" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ key: 'sfglyj', label: '关联预警', type: 'select', options: D_BZ_SF, placeholder: '请选择关联预警' },
{ key: 'sfgz', label: '重点关注', type: 'select', options: D_BZ_SF, placeholder: '请选择重点关注' },
{ key: 'sfzp', label: '二次指派', type: 'select', options: D_BZ_SF, placeholder: '请选择二次指派' },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
@ -140,13 +134,7 @@ const searchConfiger = ref([
{ label: "跨地区", prop: 'sflksd', showType: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "身份证号", prop: 'yjRysfzh', showType: "input", placeholder: "请输入身份证号" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
// { label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
// { label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
// { label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
// { label: "级别", prop: 'yjJb', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB},
// { label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
// { label: "布控时间", prop: 'startTime', placeholder: "请选择布控时间", showType: "datetimerange" },
]);
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
@ -172,25 +160,27 @@ const pageData = reactive({
},
controlsWidth: 180, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true, width: 80 },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "姓名", prop: "yjRyxm" , width: 50},
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "性别", prop: "sex", showSolt: true , width: 50},
{ label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "预警级别", prop: "yjJb", showSolt: true , width: 50},
{ label: "布控单位", prop: "gkbmdm", showSolt: true , width: 50},
{ label: "布控来源", prop: "bkly", showSolt: true , width: 50},
{ label: "布控范围", prop: "bkfw", showSolt: true },
{ label: "布控开始时间", showOverflowTooltip: true, prop: "bkkssj", showSolt: true },
{ label: "布控结束时间", showOverflowTooltip: true, prop: "bkjssj", showSolt: true },
{ label: "处置要求", prop: "bkczyq", showSolt: true, showOverflowTooltip: true },
{ label: "相似度", prop: "xsd", showSolt: true, width: 50 },
{ label: "预警内容", prop: "yjNr", showOverflowTooltip: true, showSolt: true },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
{ label: "超时状态", prop: "cszt", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "在控状态", prop: "zkzt", showOverflowTooltip: true, showSolt: true, width: 50 },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: "处置状态", align: 'center', width: 70, slotName: 'czzt' },
{ prop: 'yjSj', label: '预警时间', width: 80 },
{ prop: 'yjRyxm', label: '人员姓名', width: 70 },
{ prop: 'yjRysfzh', label: '身份证号', width: 80 },
{ label: '性别', width: 50, align: 'center', slotName: 'xbdm' },
{ prop: 'nl', label: '年龄', width: 50, align: 'center' },
{ label: '预警级别', width: 80, align: 'center', slotName: 'yjJb' },
{ label: "布控单位", prop: "gkbmmc", align: 'center' },
{ label: "布控来源", align: 'center', slotName: 'bkly', width: 70 },
{ prop: 'bkfw', label: "布控范围", align: 'center', width: 70 },
{ prop: 'bkkssj', label: "布控开始时间", align: 'center' },
{ prop: 'bkjssj', label: "布控结束时间", align: 'center' },
{ label: "处置要求", width: 70, slotName: 'bkczyq', align: 'center' },
{ label: "预警内容", prop: "yjNr", align: 'center' },
{ label: "相似度", slotName: "xsd", align: 'center', width: 50 },
{ label: "所属部门", prop: "ssbm", align: 'center' },
{ label: "数据来源", slotName: "yjLylx", align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' },
{ label: "在控状态", width: 70, align: 'center', slotName: "zkzt" },
]
});
@ -303,7 +293,7 @@ const handleCzjy = (row) => {
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
@ -389,10 +379,9 @@ const openBox = (val) => {
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
background-color: #fff;
}
::v-deep .el-table .cell {
padding: 0;
}

View File

@ -0,0 +1,205 @@
<template>
<div>
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
</div>
<!-- 搜索 -->
<!-- 表格 -->
<div class="tabBox heightBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
expand :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" />
</div>
</template>
<template #yjtp="{ row }">
<div v-if="!row.yjtp || row.yjtp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="40" v-if="row.yjlb == 2" />
<img src="@/assets/images/default_male.png" width="30" height="40" v-else />
</div>
<el-image preview-teleported v-else @click.stop style="width: 30px; height: 40px" :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="40" v-if="row.yjlb == 2" />
<img src="@/assets/images/default_male.png" width="30" height="40" v-else />
</div>
</template>
</el-image>
</template>
<template #yjjb="{ row }">
<DictTag :value="row.yjjb" :tag="false" :color="bqYs(row.yjjb)" :options="D_BZ_YJJB" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #yjlb="{ row }">
<DictTag :value="row.yjlb" :options="D_BZ_YJLX" />
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<!-- <el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<!-- <el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01'">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02'">反馈</el-link>
<el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<!-- <el-link type="primary" @click="openAddModel(row)">详情</el-link> -->
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<!-- 详情 -->
<HolographicArchive v-model="assessShow" :dataList="dataList" />
</template>
<script setup>
import Items from "./item/items.vue"
import Search from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import { reactive, ref, onMounted, getCurrentInstance, computed, watch } from "vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJJB, D_BZ_YJLX,D_BZ_YJLY } = proxy.$dict("D_BZ_YJJB","D_BZ_YJLX",'D_BZ_YJLY'); //获取字典数据
const searchBox = ref(); //搜索框
import { holographicProfileJump } from "@/utils/tools.js"
const searchConfiger = ref(
[
{ label: "预警级别", prop: 'yjjbList', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB },
{ label: "来源类型", prop: 'yjlxList', placeholder: "请选择来源类型", showType: "select", options: D_BZ_YJLY,multiple:true },
{ label: "身份证号", prop: 'rysfzh', placeholder: "请输入身份证", showType: "input",},
{ label: "部门", prop: 'ssbmdm', showType: "department"},
{ label: "时间", prop: 'timeRange', showType: "datetimerange"},
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 100, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjtp", showSolt: true, width: 100 },
{ label: "预警标签", prop: "yjbq", width: 120 },
{ label: "预警地址", prop: "yjdz" },
{ label: "预警级别", prop: "yjjb", showSolt: true, width: 85 },
{ label: "预警类别", prop: "yjlb", showSolt: true },
{ label: "来源类型", prop: "yjLylx", showSolt: true,width: 100 },
{ label: "预警时间", prop: "yjsj", width: 200 },
{ label: "所属部门", prop: "ssbm" },
{ label: "姓名", prop: "ryxm",width: 100 },
{ label: "身份证号", prop: "rysfzh", width: 170 },
{ label: "车牌号", prop: "cph" ,width: 100},
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val }
queryFrom.value.startTime = val.timeRange ? val.timeRange[0] : ''
queryFrom.value.endTime = val.timeRange ? val.timeRange[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const getList = () => {
pageData.tableConfiger.loading = true;
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.timeRange;
qcckPost(promes, '/mosty-gsxt/tbYjxx/getPageAllList').then((res) => {
console.log(res);
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records.map(item => {
return {
...item,
yjtp: item.yjlx == '01' ? item.yjtp.replace(ORDIMG, IMGYM) : item.yjtp
}
}) || [];
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#ffd325'
} else if (val == '04') {
return '#0000ff'
}
}
// 全息档案
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val?.yjlb, val) // 全息档案跳转
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 240;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -1,24 +1,19 @@
<template>
<div>
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
</div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch' />
</div>
<!-- 表格 -->
<div class="tabBox heightBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
expand :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" />
</div>
</template>
<div class="bgTable">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table">
<template #yjtp="{ row }">
<div v-if="!row.yjtp || row.yjtp.includes('baidu')">
<template v-if="!row.yjtp || row.yjtp.includes('baidu')">
<img src="@/assets/images/car.png" width="30" height="40" v-if="row.yjlb == 2" />
<img src="@/assets/images/default_male.png" width="30" height="40" v-else />
</div>
</template>
<el-image preview-teleported v-else @click.stop style="width: 30px; height: 40px" :src="row.yjtp"
:preview-src-list="[row.yjtp]" show-progress>
<template #error>
@ -31,7 +26,9 @@
</template>
<template #yjjb="{ row }">
<DictTag :value="row.yjjb" :tag="false" :color="bqYs(row.yjjb)" :options="D_BZ_YJJB" />
<div :style="{ 'background-color': bqYs(row.yjjb) }">
<DictTag :value="row.yjjb" :tag="false" color="#fff" :options="D_BZ_YJJB" />
</div>
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
@ -39,16 +36,12 @@
<template #yjlb="{ row }">
<DictTag :value="row.yjlb" :options="D_BZ_YJLX" />
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<!-- <el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<!-- <el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01'">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02'">反馈</el-link>
<el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<!-- <el-link type="primary" @click="openAddModel(row)">详情</el-link> -->
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
</div>
</template>
</MyTable>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -60,26 +53,27 @@
</template>
<script setup>
import Items from "./item/items.vue"
import Search from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import { reactive, ref, onMounted, getCurrentInstance, computed, watch } from "vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { bqYs } from '@/utils/tools.js'
const { proxy } = getCurrentInstance();
const { D_BZ_YJJB, D_BZ_YJLX,D_BZ_YJLY } = proxy.$dict("D_BZ_YJJB","D_BZ_YJLX",'D_BZ_YJLY'); //获取字典数据
const { D_BZ_YJJB, D_BZ_YJLX, D_BZ_YJLY } = proxy.$dict("D_BZ_YJJB", "D_BZ_YJLX", 'D_BZ_YJLY'); //获取字典数据
const searchBox = ref(); //搜索框
import { holographicProfileJump } from "@/utils/tools.js"
const searchConfiger = ref(
[
{ label: "预警级别", prop: 'yjjbList', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB },
{ label: "来源类型", prop: 'yjlxList', placeholder: "请选择来源类型", showType: "select", options: D_BZ_YJLY,multiple:true },
{ label: "身份证号", prop: 'rysfzh', placeholder: "请输入身份证", showType: "input",},
{ label: "部门", prop: 'ssbmdm', showType: "department"},
{ label: "时间", prop: 'timeRange', showType: "datetimerange"},
{ key: 'yjjbList', label: "预警级别", placeholder: "请选择预警级别", type: "select", options: D_BZ_YJJB },
{ key: 'yjlxList', label: "来源类型", placeholder: "请选择来源类型", type: "select", options: D_BZ_YJLY, multiple: true },
{ key: 'rysfzh', label: "身份证号", placeholder: "请输入身份证", type: "input" },
{ key: 'ssbmdm', label: "部门", type: "department" },
{ key: 'startTime', label: "时间", type: "datetimerange" },
]);
const listQuery = ref({});
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
@ -97,17 +91,19 @@ const pageData = reactive({
}, //分页
controlsWidth: 100, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjtp", showSolt: true, width: 100 },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: "预警图片", slotName: "yjtp", width: 100, align: 'center' },
{ label: "预警标签", prop: "yjbq", width: 120 },
{ label: "预警地址", prop: "yjdz" },
{ label: "预警级别", prop: "yjjb", showSolt: true, width: 85 },
{ label: "预警类别", prop: "yjlb", showSolt: true },
{ label: "来源类型", prop: "yjLylx", showSolt: true,width: 100 },
{ label: "预警级别", slotName: "yjjb", width: 85, align: 'center' },
{ label: "预警类别", slotName: "yjlb", width: 100 },
{ label: "来源类型", slotName: "yjLylx", width: 100 },
{ label: "预警时间", prop: "yjsj", width: 200 },
{ label: "所属部门", prop: "ssbm" },
{ label: "姓名", prop: "ryxm",width: 100 },
{ label: "姓名", prop: "ryxm", width: 100 },
{ label: "身份证号", prop: "rysfzh", width: 170 },
{ label: "车牌号", prop: "cph" ,width: 100},
{ label: "车牌号", prop: "cph", width: 100 },
{ label: '操作', width: 100, slotName: 'operation', align: 'center' },
]
});
@ -120,8 +116,8 @@ onMounted(() => {
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val }
queryFrom.value.startTime = val.timeRange ? val.timeRange[0] : ''
queryFrom.value.endTime = val.timeRange ? val.timeRange[1] : ''
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
@ -142,7 +138,7 @@ const getList = () => {
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.timeRange;
delete promes.startTime;
qcckPost(promes, '/mosty-gsxt/tbYjxx/getPageAllList').then((res) => {
console.log(res);
pageData.total = res.total || 0;
@ -160,17 +156,7 @@ const getList = () => {
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#ffd325'
} else if (val == '04') {
return '#0000ff'
}
}
// 全息档案
const assessShow = ref(false)
const dataList = ref()
@ -197,9 +183,13 @@ const tabHeightFn = () => {
};
</script>
<style>
<style scoped lang="scss">
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
.bgTable {
background-color: #fff;
}
</style>

View File

@ -0,0 +1,402 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
</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 tabBox_zdy heightBox" :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" expand
@chooseData="handleChooseData">
<template #expand="{ props }">
<div 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>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #sffz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="sffz" width="90" align="center" label="计算分值"/>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="handleQsFk(row)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<Detail ref="detailRef" />
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="03" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<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 }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxSfyj/sjxspz"
:roleIds="roleIds" />
</template>
<script setup>
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
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 HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import AddFrom from "./components/addFrom.vue";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { yjzxSfyjSelectList, yjzxyjzxSfyjSelectList } from "@/api/yj.js";
import { tbGsxtBqglSelectList } from '@/api/zdr'
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 czjyRef = ref()
const { proxy } = getCurrentInstance();
const searchBox = ref();
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 = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ })
// 搜索配置
const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
]);
const permission_sfqs = ref(false)
const roleCode = ref(false)
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: 300, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" ,width: 180},
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" ,width: 180},
{ label: "标签", prop: "yjbqmc" },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "sfcs",width: 90 },
{ label: "预警分值", prop: "sffz",showSolt: true },
]
});
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
gettbGsxtBqglSelectList()
tabHeightFn();
getList();
});
const onSearch = (val) => {
queryFrom.value = { ...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 reset = () => {
delete queryFrom.value.ksfz
delete queryFrom.value.jsfz
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
const getList = () => {
pageData.tableConfiger.loading = true;
// TODO: 替换为实际的身份预警API接口
let params = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
}
delete params.times;
yjzxSfyjSelectList(params).then((res) => {
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;
});
};
// 标签
const bqLbData = ref({
bqDl: [],
bqXl: []
})
const gettbGsxtBqglSelectList = (val) => {
const promes = {
bqLx: '01',
bqLb: val ? '02' : "01",
bqDlId: val ? bqLbData.value.bqDl.find(item => item.value == val)?.id : ""
}
tbGsxtBqglSelectList(promes).then((res) => {
if (val) {
queryFrom.value.bqxl = ''
bqLbData.value.bqXl = res.data ? res.data.map(item => {
return {
label: item.bqMc,
value: item.bqDm,
}
}) : []
} else {
bqLbData.value.bqDl = res ? res.map(item => {
return {
label: item.bqMc,
value: item.bqDm,
id: item.id
}
}) : []
}
})
}
watch(() => bqLbData.value.bqXl, (res) => {
bqLbData.value.bqXl = res
}, { deep: true })
// 查看详情
const detailRef = ref()
const handleClick = (row) => {
detailRef.value.init(row)
}
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt//yjzxSfyj/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
// 全息档案
const assessShow = ref(false)
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val.yjlb, val) // 全息档案跳转
}
// 发送指令
const showDialog = ref(false)
const itemData = ref()
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const semdFqzlRef = ref()
const tacitly = {
title: 'yjbt',
instructionContent: 'yjnr'
}
const submit = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#ffff00'
} else if (val == '04') {
return '#0000ff'
}
}
// 新增
const addModelRef = ref(null)
const openAddFrom = (row) => {
addModelRef.value.init('add', row)
}
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds = ref()
const chooseJfFun = (val) => {
chooseJfBh.value = val.id
yjzxyjzxSfyjSelectList(val.id).then(res => {
roleIds.value = res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
window.onresize = function () {
tabHeightFn();
};
};
/** 选中项 */
const selectRows = ref([])
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
czzt_cname: "状态",
yjsj: "预警时间",
xm: "姓名",
sfzh: "身份证号",
yjbqmc: "标签",
ssbm: "接收单位",
sfcs: "活动频次",
sffz: "预警分值",
}
/** 导出【选中】的数据 (没有就全部)*/
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, '身份预警')
}
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/yjzxSfyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
</script>
<style scoped></style>
<style lang="scss">
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -1,57 +1,44 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
<div ref="searchBox" class="mt10">
<QueryFormPanel :fields="searchConfiger" @search='onSearch'>
<template #but>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</Searchs>
</QueryFormPanel>
</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 tabBox_zdy heightBox" :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" expand
@chooseData="handleChooseData">
<template #expand="{ props }">
<div style="max-width: 100%">
<Items :row="props || {}" :dict="dict" />
</div>
</template>
<div :style="{ height: (pageData.tableHeight + 40) + 'px' }" class="bgTable">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #sfcs="{ row }">
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.sfcs }}</span>
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #sffz>
<el-table-column prop="bqfz" width="80" align="center" label="标签分值" />
<el-table-column prop="pzxs" width="60" align="center" label="系数" />
<el-table-column prop="sffz" width="90" align="center" label="计算分值"/>
<template #bqys="{ row }">
<div :style="{ 'background-color': bqYs(row.bqys) }">
<DictTag :value="row.bqys" color="#fff" :tag="false" :options="D_GS_SSYJ" />
</div>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)">配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="handleQsFk(row)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<span class="primary" @click="chooseJfFun(row)">配置系统</span>
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<span class="primary" @click="openAddFrom(row)">详情</span>
</div>
</template>
</MyTable>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -76,10 +63,7 @@
<script setup>
import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { getItem } from '@/utils/storage'
import Pages from "@/components/aboutTable/Pages.vue";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
@ -87,31 +71,34 @@ import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import AddFrom from "./components/addFrom.vue";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { qcckPost } from "@/api/qcckApi.js";
import { yjzxSfyjSelectList, yjzxyjzxSfyjSelectList } from "@/api/yj.js";
import { tbGsxtBqglSelectList } from '@/api/zdr'
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 { holographicProfileJump, bqYs } from "@/utils/tools.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
const czjyRef = ref()
const { proxy } = getCurrentInstance();
const searchBox = ref();
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 = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ })
// 搜索配置
const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ key: 'xm', label: '姓名', type: 'input', placeholder: '请输入姓名' },
{ key: 'sfzh', label: '身份证号码', type: 'input', placeholder: '请输入身份证号码' },
{ key: 'yjbqmc', label: '预警标签', type: 'input', placeholder: '请输入预警标签' },
{ key: 'ssbmdm', label: '部门', type: 'department', placeholder: '请选择部门' },
{ key: 'bqys', label: '级别', type: 'select', options: D_BZ_YJJB, placeholder: '请选择级别' },
{ key: 'ksfz', label: '开始身份分值', type: 'number', placeholder: '请输入开始身份分值' },
{ key: 'jsfz', label: '结束身份分值', type: 'number', placeholder: '请输入结束身份分值' },
{ key: 'startTime', label: '预警时间', type: 'datetimerange', placeholder: '请选择预警时间' },
]);
const permission_sfqs = ref(false)
@ -136,14 +123,19 @@ const pageData = reactive({
},
controlsWidth: 300, //操作栏宽度
tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjsj" ,width: 180},
{ label: "姓名", prop: "xm" },
{ label: "身份证号", prop: "sfzh" ,width: 180},
{ label: "标签", prop: "yjbqmc" },
{ label: "接收单位", prop: "ssbm" },
{ label: "活动频次", prop: "sfcs",width: 90 },
{ label: "预警分值", prop: "sffz",showSolt: true },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '状态', width: 80, align: 'center', slotName: 'czzt' },
{ prop: 'yjsj', label: '预警时间', width: 180, align: 'center' },
{ prop: 'xm', label: '姓名', width: 100, align: 'center' },
{ prop: 'sfzh', label: '身份证号', width: 180, align: 'center' },
{ prop: 'yjbqmc', label: '标签', width: 120, align: 'center' },
{ label: '级别', width: 88, align: 'center', slotName: 'bqys' },
{ prop: 'ssbm', label: '接收单位', align: 'center' },
{ label: '活动频次', slotName: 'sfcs', width: 90, align: 'center' },
{ prop: 'bqfz', label: '标签分值', width: 80, align: 'center' },
{ prop: 'pzxs', label: '系数', width: 60, align: 'center' },
{ prop: 'sffz', label: '计算分值', width: 90, align: 'center' },
{ label: '操作', width: 240, slotName: 'operation' },
]
});
@ -163,18 +155,15 @@ onMounted(() => {
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value, ...val };
queryFrom.value.startTime = val.times ? val.times[0] : ''
queryFrom.value.endTime = val.times ? val.times[1] : ''
queryFrom.value = { ...val };
if (val.startTime && Array.isArray(val.startTime)) {
queryFrom.value.startTime = val.startTime[0]
queryFrom.value.endTime = val.startTime[1]
}
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const reset = () => {
delete queryFrom.value.ksfz
delete queryFrom.value.jsfz
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
@ -193,16 +182,8 @@ const getList = () => {
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
}
delete params.times;
yjzxSfyjSelectList(params).then((res) => {
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(() => {
@ -299,17 +280,6 @@ const submit = () => {
const closeFszl = () => {
semdFqzlRef.value.close()
}
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#ffff00'
} else if (val == '04') {
return '#0000ff'
}
}
// 新增
const addModelRef = ref(null)
@ -336,7 +306,7 @@ const handleCzjy = (row) => {
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
@ -353,9 +323,12 @@ const exportExl = () => {
xm: "姓名",
sfzh: "身份证号",
yjbqmc: "标签",
bqys_cname: "级别",
ssbm: "接收单位",
sfcs: "活动频次",
sffz: "预警分值",
bqfz: "标签分值",
pzxs: "系数",
sffz: "计算分值",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
@ -370,14 +343,14 @@ const exportExl = () => {
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
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/yjzxSfyj/batchQs').then(() => {
qcckPost({ ids }, '/mosty-gsxt/yjzxSfyj/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
@ -388,15 +361,20 @@ const handleQs = () => {
</script>
<style scoped></style>
<style lang="scss">
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
.bgTable {
background-color: #fff;
}
</style>

View File

@ -0,0 +1,332 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</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>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</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 #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</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="primary" @click="handleQsSingle(row)">签收</el-link>
<el-link type="primary" @click="particularsOpen(row)">详情</el-link>
<el-link type="warning" @click="pushWarning(row)">指派</el-link>
<el-link type="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</el-link>
<el-link type="primary" @click="payAttention(row)">关注</el-link>
</template>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
</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" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
</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 Particulars from "./particulars.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";
import peopleConut from "./peopleConut.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT'); //获取字典数据
const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref(
[
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警级别", prop: 'yjJb', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB, multiple: true },
{ label: "接收单位", prop: 'ssbmdm', showType: "department" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX },
{ label: "预警次数", prop: 'yjCs', placeholder: "请输入预警次数", showType: "number" },
{ label: "人员级别", prop: 'yjJb', showType: "select", options: D_GS_ZDR_RYJB },
{ label: "轨迹类别", prop: 'yjLylx', showType: "select", options: D_GS_ZDR_GJLB },
{ label: "姓名", prop: 'yjRyxm', placeholder: "请输入姓名", showType: "input" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "活动发生地", prop: 'yjDz', placeholder: "请输入活动发生地", showType: "input" },
{ label: "人员细类", prop: 'yjbqmc', placeholder: "请输入人员细类", showType: "input" },
])
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: 200, //操作栏宽度
tableColumn: [
{ label: "预警状态", prop: "czzt", showSolt: true, width: 70 },
{ label: "预警时间", prop: "yjSj", width: 148 },
{ label: "人员姓名", prop: "yjRyxm", },
{ label: "身份证号", prop: "yjRysfzh", width: 148 },
{ label: "性别", prop: "xbdm", showSolt: true, width: 60 },
{ label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "级别", prop: "yjJb", showSolt: true, width: 50 },
{ label: "人员类别", prop: "bqdl", showSolt: true, width: 100 },
{ label: "人员细类", prop: "yjbqmc" },
{ label: "轨迹类别", prop: "yjLylx", showSolt: true },
{ label: "活动发生地", prop: "yjDz" },
{ label: "接收单位", prop: "ssbm", width: 148 },
{ label: "次数", prop: "yjCs", width: 50 },
{ label: "超时状态", prop: "cszt" },
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
queryFrom.value.sfgz = val.sfgz?.join(',') || ''
queryFrom.value.sfzp = val.sfzp?.join(',') || ''
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 dataPres = ref({})
const particularsShow = ref(false);
const particularsOpen = (row) => {
dataPres.value = row
particularsShow.value = true;
}
// 单条签收
const handleQsSingle = (row) => {
if (row.czzt == '02') return proxy.$message({ type: "warning", message: "数据已签收,无需重复签收" });
proxy.$confirm('确认要签收该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ ids: [row.id] }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 关注
const payAttention = (row) => {
let promes = {}
if (row.sfgz == '1') {
promes.sfgz = '0'
promes.msg = '取消关注'
} else {
promes.sfgz = '1'
promes.msg = '关注'
}
proxy.$confirm('确认要关注该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ sfgz: promes.sfgz, id: row.id }, '/mosty-gsxt/tbYjxx/yjgz').then(() => {
proxy.$message({ type: "success", message: `${promes.msg}成功` });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}).catch(() => { });
}
// 人数计算
const searchDom = ref(null)
const dataConut = ref(0)
const searchOpen = ref(false)
const countPeople = () => {
const promes = {
...searchDom.value.searchObj,
yjJb: searchDom.value.searchObj.yjJb?.join(',') || '',
startTime: searchDom.value.searchObj.startTime ? searchDom.value.searchObj.startTime[0] : '',
endTime: searchDom.value.searchObj.endTime ? searchDom.value.searchObj.endTime[1] : '',
sfglyj: searchDom.value.searchObj.sfglyj?.join(',') || '',
sfgz: searchDom.value.searchObj.sfgz?.join(',') || '',
sfzp: searchDom.value.searchObj.sfzp?.join(',') || '',
}
qcckPost(promes, '/mosty-gsxt/tbYjxx/bkyjQctj').then((res) => {
dataConut.value = res || 0
searchOpen.value = true
}).catch(() => {
// proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
</style>

View File

@ -0,0 +1,335 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<!-- <Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</Search> -->
<QueryFormPanel v-model="queryFrom" :fields="searchConfiger" ref="searchDom" @search='onSearch'>
<template #but>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</QueryFormPanel>
</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>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</PageTitle> -->
<!-- 表格 -->
<div style="background-color: #fff;">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #status="{ row }">
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</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 #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="primary" @click="handleQsSingle(row)">签收</span>
<span class="primary" @click="particularsOpen(row)">详情</span>
<span class="warning" @click="pushWarning(row)">指派</span>
<span class="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</span>
<span class="primary" @click="payAttention(row)">关注</span>
</div>
</template>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<ZpForm v-model="warningShow" :dataList="dataList" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
</template>
<script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import ZpForm from "./zpForm.vue";
import { bqYs } from '@/utils/tools.js'
import Particulars from "./particulars.vue";
import Search from "@/components/aboutTable/Search.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.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";
import peopleConut from "./peopleConut.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB, D_BZ_SF } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT', "D_BZ_SF"); //获取字典数据
const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref(
[
{ key: 'startTime', label: '预警时间', type: 'datetimerange', placeholder: '请选择预警时间' },
{ key: 'yjJb', label: '预警级别', type: 'select', options: D_BZ_YJJB, multiple: true, placeholder: '请选择预警级别' },
{ key: 'ssbmdm', label: '接收单位', type: 'department', placeholder: '请选择接收单位' },
{ key: 'sfglyj', label: '关联预警', type: 'select', options: D_BZ_SF, placeholder: '请选择关联预警' },
{ key: 'yjRyxm', label: '姓名', type: 'input', placeholder: '请输入姓名' },
{ key: 'xbdm', label: '性别', type: 'select', options: D_BZ_XB, placeholder: '请选择性别' },
{ key: 'cszt', label: '超时状态', type: 'select', options: D_GS_CSZT, placeholder: '请选择超时状态' },
{ key: 'bqdl', label: '人员类别', type: 'select', options: D_GS_QLZDRLX, placeholder: '请选择人员类别' },
{ key: 'sfgz', label: '重点关注', type: 'select', options: D_BZ_SF, placeholder: '请选择重点关注' },
{ key: 'sfzp', label: '二次指派', type: 'select', options: D_BZ_SF, placeholder: '请选择二次指派' },
{ key: 'yjRysfzh', label: '身份证号码', type: 'input', placeholder: '请输入身份证号码' },
{ key: 'ksnl', label: '开始年龄', type: 'input', placeholder: '请输入开始年龄' },
{ key: 'jsnl', label: '结束年龄', type: 'input', placeholder: '请输入结束年龄' },
{ key: 'yjCs', label: '预警次数', type: 'input', placeholder: '请输入预警次数' },
{ key: 'bqdl', label: '人员级别', type: 'select', options: D_GS_ZDR_RYJB },
{ key: 'yjLylx', label: '轨迹类别', type: 'select', options: D_GS_ZDR_GJLB },
{ key: 'yjDz', label: '活动发生地', type: 'input', placeholder: '请输入活动发生地' },
{ key: 'yjbqmc', label: '人员细类', type: 'input', placeholder: '请输入人员细类' }
])
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableHeight: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 200, //操作栏宽度
tableColumn: [
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '预警状态', width: 86, align: 'center', slotName: 'status' },
{ prop: 'yjSj', label: '预警时间', width: 150 },
{ prop: 'yjRyxm', label: '人员姓名', width: 80 },
{ prop: 'yjRysfzh', label: '身份证号', width: 158 },
{ label: '性别', width: 56, align: 'center', slotName: 'xbdm' },
{ prop: 'nl', label: '年龄', width: 56, align: 'center' },
{ label: '预警级别', width: 88, align: 'center', slotName: 'yjJb' },
{ label: '人员类别', width: 90, align: 'center', slotName: 'bqdl' },
{ prop: 'yjbqmc', label: '人员细类', width: 92 },
{ label: '轨迹类别', width: 92, align: 'center', slotName: 'yjLylx' },
{ prop: 'yjDz', label: '活动发生地' },
{ prop: 'ssbm', label: '接收单位' },
{ prop: 'yjCs', label: '次数', width: 60, align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' }
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
// queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
// queryFrom.value.sfgz = val.sfgz?.join(',') || ''
// queryFrom.value.sfzp = val.sfzp?.join(',') || ''
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,
yjlb: '03'
}
delete promes.times;
qcckPost(promes, '/mosty-gsxt/tbYjxx/getPageList').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 dataPres = ref({})
const particularsShow = ref(false);
const particularsOpen = (row) => {
dataPres.value = row
particularsShow.value = true;
}
// 单条签收
const handleQsSingle = (row) => {
if (row.czzt == '02') return proxy.$message({ type: "warning", message: "数据已签收,无需重复签收" });
proxy.$confirm('确认要签收该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ ids: [row.id] }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 关注
const payAttention = (row) => {
let promes = {}
if (row.sfgz == '1') {
promes.sfgz = '0'
promes.msg = '取消关注'
} else {
promes.sfgz = '1'
promes.msg = '关注'
}
proxy.$confirm('确认要关注该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ sfgz: promes.sfgz, id: row.id }, '/mosty-gsxt/tbYjxx/yjgz').then(() => {
proxy.$message({ type: "success", message: `${promes.msg}成功` });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}).catch(() => { });
}
// 人数计算
const searchDom = ref(null)
const dataConut = ref(0)
const searchOpen = ref(false)
const countPeople = () => {
const promes = {
...searchDom.value.formState,
yjJb: searchDom.value.formState.yjJb?.join(',') || '',
startTime: searchDom.value.formState.startTime ? searchDom.value.formState.startTime[0] : '',
endTime: searchDom.value.formState.endTime ? searchDom.value.formState.endTime[1] : '',
}
qcckPost(promes, '/mosty-gsxt/tbYjxx/bkyjQctj').then((res) => {
dataConut.value = res || 0
searchOpen.value = true
}).catch(() => {
// proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}
// 表格高度计算
const tabHeightFn = () => {
console.log("xxxxxxx");
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style lang="scss" scoped>
.danger {
color: #ff2424;
}
.ok {
color: #1d72e8;
}
</style>

View File

@ -0,0 +1,472 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container" v-loading="loading">
<div class="three-column-layout">
<!-- 重点人员基本信息页 -->
<div class="column">
<div class="column-header">重点人员基本信息页</div>
<div class="info-section">
<div class="info-row">
<div class="info-item">
<span class="info-label">人员姓名</span>
<span class="info-value">{{ dataForm.yjRyxm }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">性别</span>
<span class="info-value">
<DictTag :value="dataForm.xbdm" :tag="false" :options="dict.D_BZ_XB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">年龄</span>
<span class="info-value">{{ dataForm.nl }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">身份证号码</span>
<span class="info-value">{{ dataForm.yjRysfzh }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">户籍地</span>
<span class="info-value">{{ dataForm.hjdXz }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">现住地址</span>
<span class="info-value">{{ dataForm.xzdXz }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">入库时间</span>
<span class="info-value">{{ dataForm.zdrRkkssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">预警级别</span>
<span class="info-value warning-level" :class="ys()">
<DictTag :value="dataForm.yjJb" :tag="false" :options="dict.D_BZ_YJJB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">人员类别</span>
<span class="info-value">
<DictTag :value="dataForm.bqdl" :tag="false" :options="dict.D_GS_QLZDRLX" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">人员级别</span>
<span class="info-value">
<DictTag :value="dataForm.yjJb" :tag="false" :options="dict.D_GS_ZDR_RYJB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">人员细类</span>
<span class="info-value">{{ dataForm.yjbqmc }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">立案单位</span>
<span class="info-value"></span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">简要案情</span>
<span class="info-value text-area"></span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">一标三实</span>
<span class="info-value text-area"></span>
</div>
</div>
</div>
</div>
<!-- 重点人员活动信息页 -->
<div class="column">
<div class="column-header">重点人员活动信息页</div>
<div class="info-section blue-bg">
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">轨迹类别</span>
<span class="info-value">
<DictTag :value="dataForm.yjLylx" :tag="false" :options="dict.D_GS_ZDR_GJLB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">核查时间</span>
<span class="info-value">
<span v-if="dataForm.fkList && dataForm.fkList.length > 0">{{ dataForm.fkList[0].czsj }}</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">比对时间</span>
<span class="info-value">{{ dataForm.yjSj }}</span>
</div>
</div>
<!-- <div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动发生地</span>
<span class="info-value">{{ dataForm.xxdz }}</span>
</div>
</div> -->
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动场所</span>
<span class="info-value">
<span v-if="dataForm.fkList && dataForm.fkList.length > 0">{{ dataForm.fkList[0].xxdz }}</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动信息</span>
<span class="info-value">{{ dataForm.yjNr }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">信息提供单位</span>
<span class="info-value">{{ dataForm.jczmc }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">信息接收单位</span>
<span class="info-value">{{ dataForm.ssbm }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">二次指派单位</span>
<span class="info-value">
<div v-if="dataForm.zpList && dataForm.zpList.length > 0">
<span v-for="(item, index) in dataForm.zpList" :key="item.id">
{{ item.zpbm }}<span v-if="index < dataForm.zpList.length - 1">,</span>
</span>
</div>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">签收时限</span>
<span class="info-value">{{ dataForm.qssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">反馈时限</span>
<span class="info-value">{{ dataForm.fksj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">处置建议</span>
<span class="info-value">
<div v-if="dataForm.czjyList && dataForm.czjyList.length > 0">
<div v-for="(item, index) in dataForm.czjyList" :key="item.id">
<span>{{ `${index + 1}` + item.jynr }}</span>
</div>
</div>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">反馈内容</span>
<span class="info-value">
<div v-if="dataForm.fkList && dataForm.fkList.length > 0">
<div v-for="(item, index) in dataForm.fkList" :key="item.id">
<span v-if="item.ckczbcxx">{{ `${index + 1}` + item.ckczbcxx }}</span>
</div>
</div>
</span>
</div>
</div>
</div>
</div>
<!-- 历史预警信息页 -->
<div class="column">
<div class="column-header">历史预警信息页</div>
<div class="info-section">
<div class="history-item" v-for="(item, index) in dataForm.yjgjList" :key="item.id">
<span class="history-index">{{ `${index + 1}` }}</span>
<span class="history-content">{{ item.yjNr }}</span>
</div>
</div>
</div>
</div>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button @click="close">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { defineProps, getCurrentInstance, watch, ref } from 'vue';
import { qcckGet } from '@/api/qcckApi.js'
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '预警详情'
},
width: {
type: String,
default: '90%'
}, dataList: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({})
}
});
// 定义事件
const emit = defineEmits(['update:modelValue']);
const loading = ref(false)
let abortController = null
const close = () => {
if (abortController) {
abortController.abort()
abortController = null
}
loading.value = false
emit('update:modelValue', false);
};
const dataForm = ref({});
watch(() => props.modelValue, (newVal) => {
if (newVal) {
getPart(props.dataList.id)
}
}, { deep: true });
const getPart = (id) => {
if (abortController) {
abortController.abort()
}
abortController = new AbortController()
loading.value = true
qcckGet({}, `/mosty-gsxt/tbYjxx/getInfo/${id}`, { signal: abortController.signal }).then(res => {
if (res) {
dataForm.value = res
} else {
dataForm.value = {}
}
}).catch(err => {
if (err.name !== 'AbortError') {
console.error('请求失败:', err)
}
}).finally(() => {
loading.value = false
})
}
const ys = () => {
switch (dataForm.value.yjJb) {
case '01':
return 'red';
case '02':
return 'orange';
case '03':
return 'yellow';
case '04':
return 'blue';
default:
return '';
}
}
</script>
<style scoped>
.archive-container {
padding: 20px;
height: 600px;
overflow-y: auto;
}
.three-column-layout {
display: flex;
gap: 20px;
height: 100%;
}
.column {
flex: 1;
display: flex;
flex-direction: column;
min-width: 300px;
}
.column-header {
font-size: 16px;
font-weight: bold;
margin-bottom: 15px;
padding: 10px;
background: #f0f2f5;
border: 1px solid #e4e7ed;
border-radius: 4px 4px 0 0;
text-align: center;
color: #303133;
}
.column .info-section {
flex: 1;
border-radius: 0 0 4px 4px;
overflow-y: auto;
}
.info-section {
border: 1px solid #e4e7ed;
border-radius: 4px;
padding: 15px;
background: #ffffff;
}
.info-section.blue-bg {
background: #e6f0f8;
border-color: #9ed7ff;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 12px;
}
.info-item {
flex: 1;
min-width: 300px;
display: flex;
align-items: center;
}
.info-item.full-width {
flex: 100%;
min-width: 100%;
}
.info-label {
width: 80px;
font-weight: bold;
margin-right: 10px;
white-space: nowrap;
color: #333;
}
.info-value {
flex: 1;
padding: 4px 8px;
border: 1px solid #dcdfe6;
border-radius: 4px;
background: #ffffff;
min-height: 28px;
display: flex;
align-items: center;
}
.info-value.text-area {
min-height: 80px;
align-items: flex-start;
padding: 8px;
resize: vertical;
}
/* 红 */
.warning-level.red {
background: #fef0f0;
border-color: #ffccc7;
color: #f56c6c !important;
font-weight: bold;
}
/* 橙 */
.warning-level.orange {
background: #fffbe6;
border-color: #ffe58f;
color: #d48806 !important;
font-weight: bold;
}
/* 黄 */
.warning-level.yellow {
background: #fdf6ec;
border-color: #faecd8;
color: #e6a23c !important;
font-weight: bold;
}
/* 蓝 */
.warning-level.blue {
background: #ecf5ff;
border-color: #d9ecff;
color: #409eff !important;
font-weight: bold;
}
.history-item {
margin-bottom: 10px;
padding: 8px 12px;
border: 1px solid #e4e7ed;
border-radius: 4px;
background: #ffffff;
display: flex;
/* align-items: center; */
}
.history-index {
font-weight: bold;
margin-right: 10px;
color: #409eff;
}
.history-content {
flex: 1;
color: #606266;
}
.demo-tabs {
margin-bottom: 20px;
}
::v-deep .el-tabs__header {
margin-bottom: 20px;
}
::v-deep .el-tabs__content {
min-height: 400px;
}
</style>

View File

@ -0,0 +1,80 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="count-container">
<div class="count-number">{{dataConut}}</div>
<div class="count-label">预警人数</div>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button @click="close">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { defineProps,getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '人数查询'
},
dataConut: {
type: Number,
default: 0
},width: {
type: String,
default: '20%'
},
});
// 定义事件
const emit = defineEmits(['update:modelValue']);
const close = () => {
emit('update:modelValue', false);
};
</script>
<style scoped>
.count-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 40px 0;
text-align: center;
}
.count-number {
font-size: 48px;
font-weight: bold;
color: #409eff;
margin-bottom: 16px;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
animation: pulse 2s infinite;
}
.count-label {
font-size: 18px;
color: #606266;
font-weight: 500;
}
@keyframes pulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
transform: scale(1);
}
}
</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

@ -0,0 +1,441 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<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"
:expand="true" @chooseData="handleChooseData">
<template #xsd="{ row }">
{{ `${row.xsd}%` }}
</template>
<template #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_BZ_YJJB" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%; max-height: 400px; overflow-y: auto; padding: 10px;">
<Items :row="props || {}" :dict="dict" />
</div>
</template>
<template #yjLx="{ row }">
<DictTag :value="row.yjLx" :tag="false" :options="D_BZ_YJLX" />
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<Detail ref="detailRef" />
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="04" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<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 }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxZhyj/sjxspz"
:roleIds="roleIds" />
<!-- <Pagination v-model="paginationOpen" /> -->
<Pagination v-model="paginationOpen" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ}" />
</template>
<script setup>
import Czjy from './components/czjy.vue'
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 ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { tbYjxxGetZbtj, tbGsxtBqzhSelectList, yjzxZhyjSelectList } 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, 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";
import Pagination from "./components/particulars.vue";
const permission_sfqs = ref(false)
const roleCode = ref(false)
const searchBox = ref();
const czjyRef = ref()
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, D_BZ_YJLY, D_BZ_YJLX, D_BZ_BKLYS, D_GS_CSZT, D_GS_BKZT, D_BZ_XB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ } =
proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ", "D_BZ_YJJB", "D_BZ_YJLY", "D_BZ_YJLX", "D_BZ_BKLYS", "D_GS_CSZT", "D_GS_BKZT", "D_BZ_XB","D_GS_QLZDRLX","D_GS_ZDR_RYJB","D_GS_ZDR_GJLB","D_GS_BK_CZYQ");
// 字典数据集合
const dict = ref({
D_GS_SSYJ,
D_GSXT_YJXX_CZZT,
D_BZ_YJLY,
D_BZ_YJJB,
D_BZ_YJLX
})
import { holographicProfileJump } from "@/utils/tools.js"
// 搜索配置
const searchConfiger = ref([
{ label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "比中项", prop: 'yjLx', showType: "checkbox", showSelectAll: true, options: [{ label: '人员', value: '1', }, { label: '车辆', value: '2', }] },
{ label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "区域所属单位", prop: 'ssbmdm', placeholder: "请选择区域所属单位", showType: "department" },
{ label: "布控单位", prop: 'ssbmdm', placeholder: "请选择布控单位", showType: "department" },
{ label: "所属部门", prop: 'ssbmdm', placeholder: "请选择所属部门", showType: "department" },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "性别", prop: 'xbdm', showType: "select", options: D_BZ_XB, placeholder: "请选择性别" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "车牌号码", prop: 'clcph', placeholder: "请输入车牌号码", showType: "input" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
// { label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
// { label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
// { label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
]);
const queryFrom = ref({});
// 页面数据
const pageData = reactive({
tableData: [{ sfcs: 1 }],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true,
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth:160,
tableColumn: [
{ label: "状态", prop: "czzt", showOverflowTooltip: true, showSolt: true, width: 80 },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 50 },
{ label: "区域名称", prop: "bkqymc", showOverflowTooltip: true, width: 50 },
{ label: "区域范围", prop: "bkfw", showOverflowTooltip: true, width: 50},
// { label: "区域所属", prop: "gkbmmc", showOverflowTooltip: true, width: 50 },
{ label: "比中", prop: "yjLx", showOverflowTooltip: true, width: 60, showSolt: true },
{ label: "姓名", prop: "yjRyxm", showOverflowTooltip: true, width: 60 },
{ label: "身份证号", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "性别", prop: "xbdm", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "年龄", prop: "nl", showOverflowTooltip: true, width: 50 },
{ label: "预警级别", prop: "yjJb", showOverflowTooltip: true,showSolt: true, width: 60 },
{ label: "布控单位", prop: "gkbmmc", showOverflowTooltip: true, width: 60 },
{ label: "布控来源", prop: "bkly", showOverflowTooltip: true ,showSolt: true, width: 60 },
{ label: "布控范围", prop: "bkfw", showOverflowTooltip: true, width: 60 },
{ label: "布控开始时间", prop: "bkkssj", showOverflowTooltip: true },
{ label: "布控结束时间", prop: "bkjssj", showOverflowTooltip: true },
{ label: "处置要求", prop: "bkczyq",showSolt: true, showOverflowTooltip: true, width: 50 },
{ label: "相似度", prop: "xsd", showSolt: true, showOverflowTooltip: true, width:45 },
{ label: "预警内容", prop: "yjNr", showOverflowTooltip: true, width: 50 },
{ label: "所属单位", prop: "ssbm", showOverflowTooltip: true, width: 50 },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true,showSolt: true, width: 65 },
{ label: "超时状态", prop: "cszt", showOverflowTooltip: true,showSolt: true, width: 50 },
{ label: "在控状态", prop: "zkzt", showOverflowTooltip: true,showSolt: true, width: 50 },
// { label: "相似度", prop: "xsd", showSolt: true },
// { label: "处置状态", prop: "czzt", showSolt: true },
// { label: "预警时间", prop: "yjSj", width: 200 },
// { label: "预警标签", prop: "yjbqmc" },
// { label: "身份证号", prop: "yjRysfzh", width: 200 },
// { label: "预警来源", prop: "yjLylx", showSolt: true },
// { label: "预警级别", prop: "yjJb", showSolt: true },
// { label: "车牌号", prop: "yjClcph" },
// { label: "布控区域名称", prop: "bkqymc" },
// { label: "所属部门", prop: "ssbm" },
]
});
onMounted(() => {
// let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
// permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
// let rols = getItem('roleList') ? getItem('roleList'):[]
// let obj = rols.find(item => {
// return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
// })
// roleCode.value = obj ? true : false;
tabHeightFn();
getList();
gettbGsxtBqglSelectList()
});
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value, ...val,sfglyj:val.sfglyj.join(',') };
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const reset = () => {
delete queryFrom.value.ksfz
delete queryFrom.value.jsfz
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
const getList = () => {
pageData.tableConfiger.loading = true;
// TODO: 替换为实际的组合预警API接口
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
qcckPost({ promes }, "/mosty-gsxt/tbYjxx/getQybkPageList").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#e6a23c'
} else if (val == '04') {
return '#0000ff'
}
}
const bqLbData = ref({
bqXl: []
})
const gettbGsxtBqglSelectList = (val) => {
tbGsxtBqzhSelectList({}).then((res) => {
bqLbData.value.bqXl = res.map(item => {
return {
label: item.bqMc,
value: item.bqDm
}
}) || []
})
}
// 查看详情
const detailRef = ref()
const handleClick = (row) => {
detailRef.value.init(row)
}
const assessShow = ref(false)
/** 选中项 */
const selectRows = ref([])
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val.yjlx, val) // 全息档案跳转
// assessShow.value = true;
// dataList.value = val;
}
// 发送指令
const showDialog = ref(false)
const itemData = ref()
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const semdFqzlRef = ref()
const tacitly = {
title: 'yjbt',
instructionContent: 'yjnr'
}
const submit = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/yjzxZhyj/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const addModelRef = ref(null)
const openAddModel = (row) => {
console.log(row);
addModelRef.value.init(row)
}
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds = ref()
const chooseJfFun = (val) => {
chooseJfBh.value = val.id
yjzxZhyjSelectList(val.id).then(res => {
roleIds.value = res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
yjRyxm: "姓名",
yjRysfzh: "身份证号",
yjRysjh: "电话",
xsd: "相似度",
yjJrcs: "预警次数",
yjLx: "预警类型",
yjLylx: "预警来源",
yjJb: " 预警级别",
yjbqmc: "预警标签",
yjSj: "预警时间",
czzt_cname: "处置状态",
ssbm: "所属部门",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
bqys_cname: getMultiDictVal(item.yjLx, D_BZ_YJLX),
czzt_cname: getMultiDictVal(item.yjLylx, D_BZ_YJLY),
bqys_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
}
})
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 paginationOpen = ref(false)
const dataPres = ref()
const openBox = (val) => {
dataPres.value = val
paginationOpen.value = true
}
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
</style>

View File

@ -2,59 +2,82 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #but>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</Searchs>
</QueryFormPanel>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<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"
:expand="true" @chooseData="handleChooseData">
<template #xsd="{ row }">
{{ `${row.xsd}%` }}
<div :style="{ height: (pageData.tableHeight + 40) + 'px' }" class="bgTable">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<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 #czzt="{ row }">
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_BZ_YJJB" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
<template #yjRyxm="{ row }">
{{ row.yjLx == 2 ? row.yjClcph : row.yjRyxm }}
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%; max-height: 400px; overflow-y: auto; padding: 10px;">
<Items :row="props || {}" :dict="dict" />
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #bkly="{ row }">
<DictTag :value="row.bkly" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #bkczyq="{ row }">
<DictTag :value="row.bkczyq" :tag="false" :options="D_GS_BK_CZYQ" />
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</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_BZ_YJLX" />
{{ row.yjLx == 2 ? '车辆' : '人员' }}
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
</MyTable>
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<!-- <span type="primary" @click="showDetail(row)">转合成</span> -->
<!-- <span type="danger" @click="delDictItem(row.id)">转会商</span> -->
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<!-- <span type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</span> -->
<span class="primary" @click="openBox(row)">详情</span>
<span class="primary" @click="pushWarning(row)">指派</span>
</div>
</template>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -74,8 +97,9 @@
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxZhyj/sjxspz"
:roleIds="roleIds" />
<!-- <Pagination v-model="paginationOpen" /> -->
<Pagination v-model="paginationOpen" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ}" />
<!-- <Pagination v-model="paginationOpen" /> -->
<Pagination v-model="paginationOpen" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_GS_BK_CZYQ }" />
</template>
<script setup>
@ -99,13 +123,16 @@ import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import emitter from "@/utils/eventBus.js";
import Pagination from "./components/particulars.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import { bqYs } from '@/utils/tools.js'
const permission_sfqs = ref(false)
const roleCode = ref(false)
const searchBox = ref();
const czjyRef = ref()
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, D_BZ_YJLY, D_BZ_YJLX, D_BZ_BKLYS, D_GS_CSZT, D_GS_BKZT, D_BZ_XB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ } =
proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ", "D_BZ_YJJB", "D_BZ_YJLY", "D_BZ_YJLX", "D_BZ_BKLYS", "D_GS_CSZT", "D_GS_BKZT", "D_BZ_XB","D_GS_QLZDRLX","D_GS_ZDR_RYJB","D_GS_ZDR_GJLB","D_GS_BK_CZYQ");
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, D_BZ_YJLY, D_BZ_YJLX, D_BZ_BKLYS, D_GS_CSZT, D_GS_BKZT, D_BZ_XB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_GS_BK_CZYQ, D_GS_QLZDRYXX } =
proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ", "D_BZ_YJJB", "D_BZ_YJLY", "D_BZ_YJLX", "D_BZ_BKLYS", "D_GS_CSZT", "D_GS_BKZT", "D_BZ_XB", "D_GS_QLZDRLX", "D_GS_ZDR_RYJB", "D_GS_ZDR_GJLB", "D_GS_BK_CZYQ", "D_GS_QLZDRYXX");
// 字典数据集合
const dict = ref({
@ -122,21 +149,20 @@ const searchConfiger = ref([
{ label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "比中项", prop: 'yjLx', showType: "checkbox", showSelectAll: true, options: [{ label: '人员', value: '1', }, { label: '车辆', value: '2', }] },
{ label: "比中项", prop: 'yjLx', showType: "select", options: [{ label: '人员', value: '1', }, { label: '车辆', value: '2', }], multiple: true },
{ label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "区域所属单位", prop: 'ssbmdm', placeholder: "请选择区域所属单位", showType: "department" },
{ label: "布控单位", prop: 'ssbmdm', placeholder: "请选择布控单位", showType: "department" },
{ label: "所属部门", prop: 'ssbmdm', placeholder: "请选择所属部门", showType: "department" },
{ label: "所属单位", prop: 'ssbmdm', showType: "department", placeholder: "请选择所属单位" },
{ label: "布控单位", prop: 'gkbmdm', showType: "department", placeholder: "请选择布控单位" },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "性别", prop: 'xbdm', showType: "select", options: D_BZ_XB, placeholder: "请选择性别" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "车牌号码", prop: 'clcph', placeholder: "请输入车牌号码", showType: "input" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
{ key: 'yjRyxm', label: '姓名', type: 'input', placeholder: '请输入姓名' },
{ key: 'xbdm', label: '性别', type: 'select', options: D_BZ_XB, placeholder: '请选择性别' },
{ key: 'yjRysfzh', label: '身份证号码', type: 'input', placeholder: '请输入身份证号码' },
{ key: 'ksnl', label: '开始年龄', type: 'number', placeholder: '请输入开始年龄' },
{ key: 'jsnl', label: '结束年龄', type: 'number', placeholder: '请输入结束年龄' },
{ key: 'clcph', label: '车牌号码', type: 'input', placeholder: '请输入车牌号码' },
{ key: 'yjNr', label: '预警内容', type: 'input', placeholder: '请输入预警内容' },
// { label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
// { label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
// { label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
@ -160,42 +186,31 @@ const pageData = reactive({
pageSize: 20,
pageCurrent: 1
},
controlsWidth:160,
controlsWidth: 160,
tableColumn: [
{ label: "状态", prop: "czzt", showOverflowTooltip: true, showSolt: true, width: 80 },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 50 },
{ label: "区域名称", prop: "bkqymc", showOverflowTooltip: true, width: 50 },
{ label: "区域范围", prop: "bkfw", showOverflowTooltip: true, width: 50},
// { label: "区域所属", prop: "gkbmmc", showOverflowTooltip: true, width: 50 },
{ label: "比中", prop: "yjLx", showOverflowTooltip: true, width: 60, showSolt: true },
{ label: "姓名", prop: "yjRyxm", showOverflowTooltip: true, width: 60 },
{ label: "身份证号", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "性别", prop: "xbdm", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "年龄", prop: "nl", showOverflowTooltip: true, width: 50 },
{ label: "预警级别", prop: "yjJb", showOverflowTooltip: true,showSolt: true, width: 60 },
{ label: "布控单位", prop: "gkbmmc", showOverflowTooltip: true, width: 60 },
{ label: "布控来源", prop: "bkly", showOverflowTooltip: true ,showSolt: true, width: 60 },
{ label: "布控范围", prop: "bkfw", showOverflowTooltip: true, width: 60 },
{ label: "布控开始时间", prop: "bkkssj", showOverflowTooltip: true },
{ label: "布控结束时间", prop: "bkjssj", showOverflowTooltip: true },
{ label: "处置要求", prop: "bkczyq",showSolt: true, showOverflowTooltip: true, width: 50 },
{ label: "相似度", prop: "xsd", showSolt: true, showOverflowTooltip: true, width:45 },
{ label: "预警内容", prop: "yjNr", showOverflowTooltip: true, width: 50 },
{ label: "所属单位", prop: "ssbm", showOverflowTooltip: true, width: 50 },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true,showSolt: true, width: 65 },
{ label: "超时状态", prop: "cszt", showOverflowTooltip: true,showSolt: true, width: 50 },
{ label: "在控状态", prop: "zkzt", showOverflowTooltip: true,showSolt: true, width: 50 },
// { label: "相似度", prop: "xsd", showSolt: true },
// { label: "处置状态", prop: "czzt", showSolt: true },
// { label: "预警时间", prop: "yjSj", width: 200 },
// { label: "预警标签", prop: "yjbqmc" },
// { label: "身份证号", prop: "yjRysfzh", width: 200 },
// { label: "预警来源", prop: "yjLylx", showSolt: true },
// { label: "预警级别", prop: "yjJb", showSolt: true },
// { label: "车牌号", prop: "yjClcph" },
// { label: "布控区域名称", prop: "bkqymc" },
// { label: "所属部门", prop: "ssbm" },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '预警状态', width: 80, align: 'center', slotName: 'czzt' },
{ prop: 'yjSj', label: '预警时间', width: 80, align: 'center' },
{ prop: 'bkqymc', label: '区域名称', width: 80, align: 'center' },
{ label: "比中", slotName: 'yjLx', width: 60, align: 'center' },
{ label: '人员姓名', slotName: 'yjRyxm', width: 80, align: 'center' },
{ prop: 'yjRysfzh', label: '身份证号', width: 80, align: 'center' },
{ label: '性别', width: 56, align: 'center', slotName: 'xbdm' },
{ prop: 'nl', label: '年龄', width: 56, align: 'center' },
{ label: '预警级别', width: 88, align: 'center', slotName: 'yjJb' },
{ label: "布控单位", prop: "gkbmmc", align: 'center' },
{ label: "布控来源", align: 'center', slotName: 'bkly', width: 70 },
{ prop: 'bkfw', label: "布控范围", align: 'center', width: 70 },
{ prop: 'bkkssj', label: "布控开始时间", align: 'center' },
{ prop: 'bkjssj', label: "布控结束时间", align: 'center' },
{ label: "处置要求", width: 70, slotName: 'bkczyq', align: 'center' },
{ label: "相似度", slotName: "xsd", align: 'center', width: 50 },
{ label: "预警内容", prop: "yjNr", align: 'center' },
{ label: "所属部门", prop: "ssbm", align: 'center' },
{ label: "数据来源", slotName: "yjLylx", align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' },
{ label: "在控状态", width: 70, align: 'center', slotName: "zkzt" },
]
});
@ -219,7 +234,7 @@ const handleCzjy = (row) => {
}
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value, ...val,sfglyj:val.sfglyj.join(',') };
queryFrom.value = { ...queryFrom.value, ...val, yjLx: val.yjLx.join(',') };
pageData.pageConfiger.pageCurrent = 1;
getList();
};
@ -255,17 +270,6 @@ const getList = () => {
pageData.tableConfiger.loading = false;
});
};
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#e6a23c'
} else if (val == '04') {
return '#0000ff'
}
}
const bqLbData = ref({
bqXl: []
})
@ -362,7 +366,7 @@ const chooseJfFun = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
@ -431,6 +435,7 @@ const openBox = (val) => {
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
@ -438,4 +443,8 @@ const openBox = (val) => {
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
.bgTable {
background-color: #fff;
}
</style>

View File

@ -0,0 +1,332 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</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>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</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 #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</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="primary" @click="handleQsSingle(row)">签收</el-link>
<el-link type="primary" @click="particularsOpen(row)">详情</el-link>
<el-link type="warning" @click="pushWarning(row)">指派</el-link>
<el-link type="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</el-link>
<el-link type="primary" @click="payAttention(row)">关注</el-link>
</template>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
</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" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
</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 Particulars from "./particulars.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";
import peopleConut from "./peopleConut.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT'); //获取字典数据
const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref(
[
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警级别", prop: 'yjJb', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB, multiple: true },
{ label: "接收单位", prop: 'ssbmdm', showType: "department" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX },
{ label: "预警次数", prop: 'yjCs', placeholder: "请输入预警次数", showType: "number" },
{ label: "人员级别", prop: 'yjJb', showType: "select", options: D_GS_ZDR_RYJB },
{ label: "轨迹类别", prop: 'yjLylx', showType: "select", options: D_GS_ZDR_GJLB },
{ label: "姓名", prop: 'yjRyxm', placeholder: "请输入姓名", showType: "input" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "活动发生地", prop: 'yjDz', placeholder: "请输入活动发生地", showType: "input" },
{ label: "人员细类", prop: 'yjbqmc', placeholder: "请输入人员细类", showType: "input" },
])
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: 200, //操作栏宽度
tableColumn: [
{ label: "预警状态", prop: "czzt", showSolt: true, width: 70 },
{ label: "预警时间", prop: "yjSj", width: 148 },
{ label: "人员姓名", prop: "yjRyxm", },
{ label: "身份证号", prop: "yjRysfzh", width: 148 },
{ label: "性别", prop: "xbdm", showSolt: true, width: 60 },
{ label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "级别", prop: "yjJb", showSolt: true, width: 50 },
{ label: "人员类别", prop: "bqdl", showSolt: true, width: 100 },
{ label: "人员细类", prop: "yjbqmc" },
{ label: "轨迹类别", prop: "yjLylx", showSolt: true },
{ label: "活动发生地", prop: "yjDz" },
{ label: "接收单位", prop: "ssbm", width: 148 },
{ label: "次数", prop: "yjCs", width: 50 },
{ label: "超时状态", prop: "cszt" },
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
queryFrom.value.sfgz = val.sfgz?.join(',') || ''
queryFrom.value.sfzp = val.sfzp?.join(',') || ''
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 dataPres = ref({})
const particularsShow = ref(false);
const particularsOpen = (row) => {
dataPres.value = row
particularsShow.value = true;
}
// 单条签收
const handleQsSingle = (row) => {
if (row.czzt == '02') return proxy.$message({ type: "warning", message: "数据已签收,无需重复签收" });
proxy.$confirm('确认要签收该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ ids: [row.id] }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 关注
const payAttention = (row) => {
let promes = {}
if (row.sfgz == '1') {
promes.sfgz = '0'
promes.msg = '取消关注'
} else {
promes.sfgz = '1'
promes.msg = '关注'
}
proxy.$confirm('确认要关注该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ sfgz: promes.sfgz, id: row.id }, '/mosty-gsxt/tbYjxx/yjgz').then(() => {
proxy.$message({ type: "success", message: `${promes.msg}成功` });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}).catch(() => { });
}
// 人数计算
const searchDom = ref(null)
const dataConut = ref(0)
const searchOpen = ref(false)
const countPeople = () => {
const promes = {
...searchDom.value.searchObj,
yjJb: searchDom.value.searchObj.yjJb?.join(',') || '',
startTime: searchDom.value.searchObj.startTime ? searchDom.value.searchObj.startTime[0] : '',
endTime: searchDom.value.searchObj.endTime ? searchDom.value.searchObj.endTime[1] : '',
sfglyj: searchDom.value.searchObj.sfglyj?.join(',') || '',
sfgz: searchDom.value.searchObj.sfgz?.join(',') || '',
sfzp: searchDom.value.searchObj.sfzp?.join(',') || '',
}
qcckPost(promes, '/mosty-gsxt/tbYjxx/bkyjQctj').then((res) => {
dataConut.value = res || 0
searchOpen.value = true
}).catch(() => {
// proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
</style>

View File

@ -0,0 +1,334 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<!-- <Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</Search> -->
<QueryFormPanel v-model="queryFrom" :fields="searchConfiger" ref="searchDom" @search='onSearch'>
<template #but>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</QueryFormPanel>
</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>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</PageTitle> -->
<!-- 表格 -->
<div style="background-color: #fff;">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #status="{ row }">
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</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 #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="primary" @click="handleQsSingle(row)">签收</span>
<span class="primary" @click="particularsOpen(row)">详情</span>
<span class="warning" @click="pushWarning(row)">指派</span>
<span class="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</span>
<span class="primary" @click="payAttention(row)">关注</span>
</div>
</template>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<ZpForm v-model="warningShow" :dataList="dataList" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
</template>
<script setup>
import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js"
import ZpForm from "./zpForm.vue";
import { bqYs } from '@/utils/tools.js'
import Particulars from "./particulars.vue";
import Search from "@/components/aboutTable/Search.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.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";
import peopleConut from "./peopleConut.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB, D_BZ_SF } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT', "D_BZ_SF"); //获取字典数据
const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref(
[
{ key: 'startTime', label: '预警时间', type: 'datetimerange', placeholder: '请选择预警时间' },
{ key: 'yjJb', label: '预警级别', type: 'select', options: D_BZ_YJJB, multiple: true, placeholder: '请选择预警级别' },
{ key: 'ssbmdm', label: '接收单位', type: 'department', placeholder: '请选择接收单位' },
{ key: 'sfglyj', label: '关联预警', type: 'select', options: D_BZ_SF, placeholder: '请选择关联预警' },
{ key: 'yjRyxm', label: '姓名', type: 'input', placeholder: '请输入姓名' },
{ key: 'xbdm', label: '性别', type: 'select', options: D_BZ_XB, placeholder: '请选择性别' },
{ key: 'cszt', label: '超时状态', type: 'select', options: D_GS_CSZT, placeholder: '请选择超时状态' },
{ key: 'bqdl', label: '人员类别', type: 'select', options: D_GS_QLZDRLX, placeholder: '请选择人员类别' },
{ key: 'sfgz', label: '重点关注', type: 'select', options: D_BZ_SF, placeholder: '请选择重点关注' },
{ key: 'sfzp', label: '二次指派', type: 'select', options: D_BZ_SF, placeholder: '请选择二次指派' },
{ key: 'yjRysfzh', label: '身份证号码', type: 'input', placeholder: '请输入身份证号码' },
{ key: 'ksnl', label: '开始年龄', type: 'input', placeholder: '请输入开始年龄' },
{ key: 'jsnl', label: '结束年龄', type: 'input', placeholder: '请输入结束年龄' },
{ key: 'yjCs', label: '预警次数', type: 'input', placeholder: '请输入预警次数' },
{ key: 'bqdl', label: '人员级别', type: 'select', options: D_GS_ZDR_RYJB },
{ key: 'yjLylx', label: '轨迹类别', type: 'select', options: D_GS_ZDR_GJLB },
{ key: 'yjDz', label: '活动发生地', type: 'input', placeholder: '请输入活动发生地' },
{ key: 'yjbqmc', label: '人员细类', type: 'input', placeholder: '请输入人员细类' }
])
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableHeight: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 200, //操作栏宽度
tableColumn: [
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '预警状态', width: 86, align: 'center', slotName: 'status' },
{ prop: 'yjSj', label: '预警时间', width: 150 },
{ prop: 'yjRyxm', label: '人员姓名', width: 80 },
{ prop: 'yjRysfzh', label: '身份证号', width: 158 },
{ label: '性别', width: 56, align: 'center', slotName: 'xbdm' },
{ prop: 'nl', label: '年龄', width: 56, align: 'center' },
{ label: '预警级别', width: 88, align: 'center', slotName: 'yjJb' },
{ label: '人员类别', width: 90, align: 'center', slotName: 'bqdl' },
{ prop: 'yjbqmc', label: '人员细类', width: 92 },
{ label: '轨迹类别', width: 92, align: 'center', slotName: 'yjLylx' },
{ prop: 'yjDz', label: '活动发生地' },
{ prop: 'ssbm', label: '接收单位' },
{ prop: 'yjCs', label: '次数', width: 60, align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' }
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
// queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
// queryFrom.value.sfgz = val.sfgz?.join(',') || ''
// queryFrom.value.sfzp = val.sfzp?.join(',') || ''
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 dataPres = ref({})
const particularsShow = ref(false);
const particularsOpen = (row) => {
dataPres.value = row
particularsShow.value = true;
}
// 单条签收
const handleQsSingle = (row) => {
if (row.czzt == '02') return proxy.$message({ type: "warning", message: "数据已签收,无需重复签收" });
proxy.$confirm('确认要签收该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ ids: [row.id] }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 关注
const payAttention = (row) => {
let promes = {}
if (row.sfgz == '1') {
promes.sfgz = '0'
promes.msg = '取消关注'
} else {
promes.sfgz = '1'
promes.msg = '关注'
}
proxy.$confirm('确认要关注该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ sfgz: promes.sfgz, id: row.id }, '/mosty-gsxt/tbYjxx/yjgz').then(() => {
proxy.$message({ type: "success", message: `${promes.msg}成功` });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}).catch(() => { });
}
// 人数计算
const searchDom = ref(null)
const dataConut = ref(0)
const searchOpen = ref(false)
const countPeople = () => {
const promes = {
...searchDom.value.formState,
yjJb: searchDom.value.formState.yjJb?.join(',') || '',
startTime: searchDom.value.formState.startTime ? searchDom.value.formState.startTime[0] : '',
endTime: searchDom.value.formState.endTime ? searchDom.value.formState.endTime[1] : '',
}
qcckPost(promes, '/mosty-gsxt/tbYjxx/bkyjQctj').then((res) => {
dataConut.value = res || 0
searchOpen.value = true
}).catch(() => {
// proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}
// 表格高度计算
const tabHeightFn = () => {
console.log("xxxxxxx");
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style lang="scss" scoped>
.danger {
color: #ff2424;
}
.ok {
color: #1d72e8;
}
</style>

View File

@ -0,0 +1,472 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container" v-loading="loading">
<div class="three-column-layout">
<!-- 重点人员基本信息页 -->
<div class="column">
<div class="column-header">重点人员基本信息页</div>
<div class="info-section">
<div class="info-row">
<div class="info-item">
<span class="info-label">人员姓名</span>
<span class="info-value">{{ dataForm.yjRyxm }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">性别</span>
<span class="info-value">
<DictTag :value="dataForm.xbdm" :tag="false" :options="dict.D_BZ_XB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">年龄</span>
<span class="info-value">{{ dataForm.nl }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">身份证号码</span>
<span class="info-value">{{ dataForm.yjRysfzh }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">户籍地</span>
<span class="info-value">{{ dataForm.hjdXz }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">现住地址</span>
<span class="info-value">{{ dataForm.xzdXz }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">入库时间</span>
<span class="info-value">{{ dataForm.zdrRkkssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">预警级别</span>
<span class="info-value warning-level" :class="ys()">
<DictTag :value="dataForm.yjJb" :tag="false" :options="dict.D_BZ_YJJB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">人员类别</span>
<span class="info-value">
<DictTag :value="dataForm.bqdl" :tag="false" :options="dict.D_GS_QLZDRLX" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">人员级别</span>
<span class="info-value">
<DictTag :value="dataForm.yjJb" :tag="false" :options="dict.D_GS_ZDR_RYJB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">人员细类</span>
<span class="info-value">{{ dataForm.yjbqmc }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">立案单位</span>
<span class="info-value"></span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">简要案情</span>
<span class="info-value text-area"></span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">一标三实</span>
<span class="info-value text-area"></span>
</div>
</div>
</div>
</div>
<!-- 重点人员活动信息页 -->
<div class="column">
<div class="column-header">重点人员活动信息页</div>
<div class="info-section blue-bg">
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">轨迹类别</span>
<span class="info-value">
<DictTag :value="dataForm.yjLylx" :tag="false" :options="dict.D_GS_ZDR_GJLB" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">核查时间</span>
<span class="info-value">
<span v-if="dataForm.fkList && dataForm.fkList.length > 0">{{ dataForm.fkList[0].czsj }}</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">比对时间</span>
<span class="info-value">{{ dataForm.yjSj }}</span>
</div>
</div>
<!-- <div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动发生地</span>
<span class="info-value">{{ dataForm.xxdz }}</span>
</div>
</div> -->
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动场所</span>
<span class="info-value">
<span v-if="dataForm.fkList && dataForm.fkList.length > 0">{{ dataForm.fkList[0].xxdz }}</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">活动信息</span>
<span class="info-value">{{ dataForm.yjNr }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">信息提供单位</span>
<span class="info-value">{{ dataForm.jczmc }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">信息接收单位</span>
<span class="info-value">{{ dataForm.ssbm }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">二次指派单位</span>
<span class="info-value">
<div v-if="dataForm.zpList && dataForm.zpList.length > 0">
<span v-for="(item, index) in dataForm.zpList" :key="item.id">
{{ item.zpbm }}<span v-if="index < dataForm.zpList.length - 1">,</span>
</span>
</div>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">签收时限</span>
<span class="info-value">{{ dataForm.qssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">反馈时限</span>
<span class="info-value">{{ dataForm.fksj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">处置建议</span>
<span class="info-value">
<div v-if="dataForm.czjyList && dataForm.czjyList.length > 0">
<div v-for="(item, index) in dataForm.czjyList" :key="item.id">
<span>{{ `${index + 1}` + item.jynr }}</span>
</div>
</div>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">反馈内容</span>
<span class="info-value">
<div v-if="dataForm.fkList && dataForm.fkList.length > 0">
<div v-for="(item, index) in dataForm.fkList" :key="item.id">
<span v-if="item.ckczbcxx">{{ `${index + 1}` + item.ckczbcxx }}</span>
</div>
</div>
</span>
</div>
</div>
</div>
</div>
<!-- 历史预警信息页 -->
<div class="column">
<div class="column-header">历史预警信息页</div>
<div class="info-section">
<div class="history-item" v-for="(item, index) in dataForm.yjgjList" :key="item.id">
<span class="history-index">{{ `${index + 1}` }}</span>
<span class="history-content">{{ item.yjNr }}</span>
</div>
</div>
</div>
</div>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button @click="close">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { defineProps, getCurrentInstance, watch, ref } from 'vue';
import { qcckGet } from '@/api/qcckApi.js'
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '预警详情'
},
width: {
type: String,
default: '90%'
}, dataList: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({})
}
});
// 定义事件
const emit = defineEmits(['update:modelValue']);
const loading = ref(false)
let abortController = null
const close = () => {
if (abortController) {
abortController.abort()
abortController = null
}
loading.value = false
emit('update:modelValue', false);
};
const dataForm = ref({});
watch(() => props.modelValue, (newVal) => {
if (newVal) {
getPart(props.dataList.id)
}
}, { deep: true });
const getPart = (id) => {
if (abortController) {
abortController.abort()
}
abortController = new AbortController()
loading.value = true
qcckGet({}, `/mosty-gsxt/tbYjxx/getInfo/${id}`, { signal: abortController.signal }).then(res => {
if (res) {
dataForm.value = res
} else {
dataForm.value = {}
}
}).catch(err => {
if (err.name !== 'AbortError') {
console.error('请求失败:', err)
}
}).finally(() => {
loading.value = false
})
}
const ys = () => {
switch (dataForm.value.yjJb) {
case '01':
return 'red';
case '02':
return 'orange';
case '03':
return 'yellow';
case '04':
return 'blue';
default:
return '';
}
}
</script>
<style scoped>
.archive-container {
padding: 20px;
height: 600px;
overflow-y: auto;
}
.three-column-layout {
display: flex;
gap: 20px;
height: 100%;
}
.column {
flex: 1;
display: flex;
flex-direction: column;
min-width: 300px;
}
.column-header {
font-size: 16px;
font-weight: bold;
margin-bottom: 15px;
padding: 10px;
background: #f0f2f5;
border: 1px solid #e4e7ed;
border-radius: 4px 4px 0 0;
text-align: center;
color: #303133;
}
.column .info-section {
flex: 1;
border-radius: 0 0 4px 4px;
overflow-y: auto;
}
.info-section {
border: 1px solid #e4e7ed;
border-radius: 4px;
padding: 15px;
background: #ffffff;
}
.info-section.blue-bg {
background: #e6f0f8;
border-color: #9ed7ff;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 12px;
}
.info-item {
flex: 1;
min-width: 300px;
display: flex;
align-items: center;
}
.info-item.full-width {
flex: 100%;
min-width: 100%;
}
.info-label {
width: 80px;
font-weight: bold;
margin-right: 10px;
white-space: nowrap;
color: #333;
}
.info-value {
flex: 1;
padding: 4px 8px;
border: 1px solid #dcdfe6;
border-radius: 4px;
background: #ffffff;
min-height: 28px;
display: flex;
align-items: center;
}
.info-value.text-area {
min-height: 80px;
align-items: flex-start;
padding: 8px;
resize: vertical;
}
/* 红 */
.warning-level.red {
background: #fef0f0;
border-color: #ffccc7;
color: #f56c6c !important;
font-weight: bold;
}
/* 橙 */
.warning-level.orange {
background: #fffbe6;
border-color: #ffe58f;
color: #d48806 !important;
font-weight: bold;
}
/* 黄 */
.warning-level.yellow {
background: #fdf6ec;
border-color: #faecd8;
color: #e6a23c !important;
font-weight: bold;
}
/* 蓝 */
.warning-level.blue {
background: #ecf5ff;
border-color: #d9ecff;
color: #409eff !important;
font-weight: bold;
}
.history-item {
margin-bottom: 10px;
padding: 8px 12px;
border: 1px solid #e4e7ed;
border-radius: 4px;
background: #ffffff;
display: flex;
/* align-items: center; */
}
.history-index {
font-weight: bold;
margin-right: 10px;
color: #409eff;
}
.history-content {
flex: 1;
color: #606266;
}
.demo-tabs {
margin-bottom: 20px;
}
::v-deep .el-tabs__header {
margin-bottom: 20px;
}
::v-deep .el-tabs__content {
min-height: 400px;
}
</style>

View File

@ -0,0 +1,80 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="count-container">
<div class="count-number">{{dataConut}}</div>
<div class="count-label">预警人数</div>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button @click="close">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { defineProps,getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '人数查询'
},
dataConut: {
type: Number,
default: 0
},width: {
type: String,
default: '20%'
},
});
// 定义事件
const emit = defineEmits(['update:modelValue']);
const close = () => {
emit('update:modelValue', false);
};
</script>
<style scoped>
.count-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 40px 0;
text-align: center;
}
.count-number {
font-size: 48px;
font-weight: bold;
color: #409eff;
margin-bottom: 16px;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
animation: pulse 2s infinite;
}
.count-label {
font-size: 18px;
color: #606266;
font-weight: 500;
}
@keyframes pulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
transform: scale(1);
}
}
</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

@ -0,0 +1,332 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</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>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</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 #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</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="primary" @click="handleQsSingle(row)">签收</el-link>
<el-link type="primary" @click="particularsOpen(row)">详情</el-link>
<el-link type="warning" @click="pushWarning(row)">指派</el-link>
<el-link type="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</el-link>
<el-link type="primary" @click="payAttention(row)">关注</el-link>
</template>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
</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" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
</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 Particulars from "./particulars.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";
import peopleConut from "./peopleConut.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT'); //获取字典数据
const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref(
[
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警级别", prop: 'yjJb', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB, multiple: true },
{ label: "接收单位", prop: 'ssbmdm', showType: "department" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX },
{ label: "预警次数", prop: 'yjCs', placeholder: "请输入预警次数", showType: "number" },
{ label: "人员级别", prop: 'yjJb', showType: "select", options: D_GS_ZDR_RYJB },
{ label: "轨迹类别", prop: 'yjLylx', showType: "select", options: D_GS_ZDR_GJLB },
{ label: "姓名", prop: 'yjRyxm', placeholder: "请输入姓名", showType: "input" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "活动发生地", prop: 'yjDz', placeholder: "请输入活动发生地", showType: "input" },
{ label: "人员细类", prop: 'yjbqmc', placeholder: "请输入人员细类", showType: "input" },
])
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: 200, //操作栏宽度
tableColumn: [
{ label: "预警状态", prop: "czzt", showSolt: true, width: 70 },
{ label: "预警时间", prop: "yjSj", width: 148 },
{ label: "人员姓名", prop: "yjRyxm", },
{ label: "身份证号", prop: "yjRysfzh", width: 148 },
{ label: "性别", prop: "xbdm", showSolt: true, width: 60 },
{ label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "级别", prop: "yjJb", showSolt: true, width: 50 },
{ label: "人员类别", prop: "bqdl", showSolt: true, width: 100 },
{ label: "人员细类", prop: "yjbqmc" },
{ label: "轨迹类别", prop: "yjLylx", showSolt: true },
{ label: "活动发生地", prop: "yjDz" },
{ label: "接收单位", prop: "ssbm", width: 148 },
{ label: "次数", prop: "yjCs", width: 50 },
{ label: "超时状态", prop: "cszt" },
]
});
onMounted(() => {
tabHeightFn();
getList()
});
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
queryFrom.value.sfgz = val.sfgz?.join(',') || ''
queryFrom.value.sfzp = val.sfzp?.join(',') || ''
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 dataPres = ref({})
const particularsShow = ref(false);
const particularsOpen = (row) => {
dataPres.value = row
particularsShow.value = true;
}
// 单条签收
const handleQsSingle = (row) => {
if (row.czzt == '02') return proxy.$message({ type: "warning", message: "数据已签收,无需重复签收" });
proxy.$confirm('确认要签收该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ ids: [row.id] }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: "失败" });
});
}).catch(() => { });
}
// 关注
const payAttention = (row) => {
let promes = {}
if (row.sfgz == '1') {
promes.sfgz = '0'
promes.msg = '取消关注'
} else {
promes.sfgz = '1'
promes.msg = '关注'
}
proxy.$confirm('确认要关注该条预警数据吗?', "警告", { type: "warning" }).then(() => {
qcckPost({ sfgz: promes.sfgz, id: row.id }, '/mosty-gsxt/tbYjxx/yjgz').then(() => {
proxy.$message({ type: "success", message: `${promes.msg}成功` });
getList();
}).catch(() => {
proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}).catch(() => { });
}
// 人数计算
const searchDom = ref(null)
const dataConut = ref(0)
const searchOpen = ref(false)
const countPeople = () => {
const promes = {
...searchDom.value.searchObj,
yjJb: searchDom.value.searchObj.yjJb?.join(',') || '',
startTime: searchDom.value.searchObj.startTime ? searchDom.value.searchObj.startTime[0] : '',
endTime: searchDom.value.searchObj.endTime ? searchDom.value.searchObj.endTime[1] : '',
sfglyj: searchDom.value.searchObj.sfglyj?.join(',') || '',
sfgz: searchDom.value.searchObj.sfgz?.join(',') || '',
sfzp: searchDom.value.searchObj.sfzp?.join(',') || '',
}
qcckPost(promes, '/mosty-gsxt/tbYjxx/bkyjQctj').then((res) => {
dataConut.value = res || 0
searchOpen.value = true
}).catch(() => {
// proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
</style>

View File

@ -2,38 +2,41 @@
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</Search>
<!-- <Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
</Search> -->
<QueryFormPanel v-model="queryFrom" :fields="searchConfiger" ref="searchDom" @search='onSearch'>
<template #but>
<el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</QueryFormPanel>
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<!-- <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>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template>
</PageTitle>
</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" />
<div style="background-color: #fff;">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #status="{ row }">
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</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" />
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
@ -41,21 +44,19 @@
<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="primary" @click="handleQsSingle(row)">签收</el-link>
<el-link type="primary" @click="particularsOpen(row)">详情</el-link>
<el-link type="warning" @click="pushWarning(row)">指派</el-link>
<el-link type="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</el-link>
<el-link type="primary" @click="payAttention(row)">关注</el-link>
</template>
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
</MyTable>
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="primary" @click="handleQsSingle(row)">签收</span>
<span class="primary" @click="particularsOpen(row)">详情</span>
<span class="warning" @click="pushWarning(row)">指派</span>
<span class="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</span>
<span class="primary" @click="payAttention(row)">关注</span>
</div>
</template>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
@ -63,54 +64,58 @@
</div>
</div>
<ZpForm v-model="warningShow" :dataList="dataList" />
<Particulars v-model="particularsShow" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB}" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
<peopleConut v-model="searchOpen" :dataConut="dataConut" />
</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 { bqYs } from '@/utils/tools.js'
import Particulars from "./particulars.vue";
import { IdCard } from '@/utils/validate.js'
import Search from "@/components/aboutTable/Search.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.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 { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, } from "vue";
import peopleConut from "./peopleConut.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT'); //获取字典数据
const { D_BZ_YJLY, D_GS_QLZDRLX, D_GS_ZDR_GJLB, D_BZ_YJJB, D_GS_CSZT, D_GS_QLZDRYXX, D_BZ_XB, D_GSXT_YJXX_CZZT, D_GS_ZDR_RYJB, D_BZ_SF } = proxy.$dict('D_BZ_YJLY', 'D_GS_QLZDRLX', "D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB", "D_GSXT_YJXX_CZZT", "D_GS_ZDR_RYJB", 'D_GS_ZDR_GJLB', 'D_GS_CSZT', "D_BZ_SF"); //获取字典数据
const searchBox = ref(); //搜索框
const warningShow = ref(false);
const dataList = ref([]);
const searchConfiger = ref(
[
{ label: "预警时间xx", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警级别", prop: 'yjJb', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB, multiple: true },
{ label: "接收单位", prop: 'ssbmdm', showType: "department" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT},
{ label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX },
{ label: "预警次数", prop: 'yjCs', placeholder: "请输入预警次数", showType: "number" },
{ label: "人员级别", prop: 'yjJb', showType: "select", options: D_GS_ZDR_RYJB },
{ label: "轨迹类别", prop: 'yjLylx', showType: "select", options: D_GS_ZDR_GJLB },
{ label: "姓名", prop: 'yjRyxm', placeholder: "请输入姓名", showType: "input" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "活动发生地", prop: 'yjDz', placeholder: "请输入活动发生地", showType: "input" },
{ label: "人员细类", prop: 'yjbqmc', placeholder: "请输入人员细类", showType: "input" },
{ key: 'startTime', label: '预警时间', type: 'datetimerange', placeholder: '请选择预警时间' },
{ key: 'yjJb', label: '预警级别', type: 'select', options: D_BZ_YJJB, multiple: true, placeholder: '请选择预警级别' },
{ key: 'ssbmdm', label: '接收单位', type: 'department', placeholder: '请选择接收单位' },
{ key: 'sfglyj', label: '关联预警', type: 'select', options: D_BZ_SF, placeholder: '请选择关联预警' },
{ key: 'yjRyxm', label: '姓名', type: 'input', placeholder: '请输入姓名' },
{ key: 'xbdm', label: '性别', type: 'select', options: D_BZ_XB, placeholder: '请选择性别' },
{ key: 'cszt', label: '超时状态', type: 'select', options: D_GS_CSZT, placeholder: '请选择超时状态' },
{ key: 'bqdl', label: '人员类别', type: 'select', options: D_GS_QLZDRLX, placeholder: '请选择人员类别' },
{ key: 'sfgz', label: '重点关注', type: 'select', options: D_BZ_SF, placeholder: '请选择重点关注' },
{ key: 'sfzp', label: '二次指派', type: 'select', options: D_BZ_SF, placeholder: '请选择二次指派' },
{ key: 'yjRysfzh', label: '身份证号码', type: 'input', placeholder: '请输入身份证号码' },
{ key: 'ksnl', label: '开始年龄', type: 'input', placeholder: '请输入开始年龄' },
{ key: 'jsnl', label: '结束年龄', type: 'input', placeholder: '请输入结束年龄' },
{ key: 'yjCs', label: '预警次数', type: 'input', placeholder: '请输入预警次数' },
{ key: 'bqdl', label: '人员级别', type: 'select', options: D_GS_ZDR_RYJB },
{ key: 'yjLylx', label: '轨迹类别', type: 'select', options: D_GS_ZDR_GJLB },
{ key: 'yjDz', label: '活动发生地', type: 'input', placeholder: '请输入活动发生地' },
{ key: 'yjbqmc', label: '人员细类', type: 'input', placeholder: '请输入人员细类' }
])
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableHeight: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
@ -124,20 +129,23 @@ const pageData = reactive({
}, //分页
controlsWidth: 200, //操作栏宽度
tableColumn: [
{ label: "预警状态", prop: "czzt", showSolt: true, width: 70 },
{ label: "预警时间", prop: "yjSj", width: 148 },
{ label: "人员姓名", prop: "yjRyxm", },
{ label: "身份证号", prop: "yjRysfzh", width: 148 },
{ label: "性别", prop: "xbdm", showSolt: true, width: 60 },
{ label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "级别", prop: "yjJb", showSolt: true, width: 50 },
{ label: "人员类别", prop: "bqdl", showSolt: true, width: 100 },
{ label: "人员细类", prop: "yjbqmc" },
{ label: "轨迹类别", prop: "yjLylx", showSolt: true },
{ label: "活动发生地", prop: "yjDz" },
{ label: "接收单位", prop: "ssbm", width: 148 },
{ label: "次数", prop: "yjCs", width: 50 },
{ label: "超时状态", prop: "cszt" },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '预警状态', width: 86, align: 'center', slotName: 'status' },
{ prop: 'yjSj', label: '预警时间', width: 150 },
{ prop: 'yjRyxm', label: '人员姓名', width: 80 },
{ prop: 'yjRysfzh', label: '身份证号', width: 158 },
{ label: '性别', width: 56, align: 'center', slotName: 'xbdm' },
{ prop: 'nl', label: '年龄', width: 56, align: 'center' },
{ label: '预警级别', width: 88, align: 'center', slotName: 'yjJb' },
{ label: '人员类别', width: 90, align: 'center', slotName: 'bqdl' },
{ prop: 'yjbqmc', label: '人员细类', width: 92 },
{ label: '轨迹类别', width: 92, align: 'center', slotName: 'yjLylx' },
{ prop: 'yjDz', label: '活动发生地' },
{ prop: 'ssbm', label: '接收单位' },
{ prop: 'yjCs', label: '次数', width: 60, align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' }
]
});
@ -151,9 +159,9 @@ const onSearch = (val) => {
queryFrom.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.startTime ? val.startTime[1] : ''
queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
queryFrom.value.sfgz = val.sfgz?.join(',') || ''
queryFrom.value.sfzp = val.sfzp?.join(',') || ''
// queryFrom.value.sfglyj = val.sfglyj?.join(',') || ''
// queryFrom.value.sfgz = val.sfgz?.join(',') || ''
// queryFrom.value.sfzp = val.sfzp?.join(',') || ''
pageData.pageConfiger.pageCurrent = 1;
getList()
}
@ -171,6 +179,7 @@ const getList = () => {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
}
delete promes.times;
qcckPost(promes, '/mosty-gsxt/tbYjxx/getQlzdrPageList').then((res) => {
@ -248,7 +257,7 @@ const handleQs = () => {
}).catch(() => { });
}
// 详情
const dataPres=ref({})
const dataPres = ref({})
const particularsShow = ref(false);
const particularsOpen = (row) => {
dataPres.value = row
@ -290,42 +299,37 @@ const payAttention = (row) => {
// 人数计算
const searchDom = ref(null)
const dataConut = ref(0)
const searchOpen=ref(false)
const searchOpen = ref(false)
const countPeople = () => {
const promes = {
...searchDom.value.searchObj,
yjJb: searchDom.value.searchObj.yjJb?.join(',') || '',
startTime: searchDom.value.searchObj.startTime ? searchDom.value.searchObj.startTime[0] : '',
endTime: searchDom.value.searchObj.endTime ? searchDom.value.searchObj.endTime[1] : '',
sfglyj: searchDom.value.searchObj.sfglyj?.join(',') || '',
sfgz: searchDom.value.searchObj.sfgz?.join(',') || '',
sfzp: searchDom.value.searchObj.sfzp?.join(',') || '',
...searchDom.value.formState,
yjJb: searchDom.value.formState.yjJb?.join(',') || '',
startTime: searchDom.value.formState.startTime ? searchDom.value.formState.startTime[0] : '',
endTime: searchDom.value.formState.endTime ? searchDom.value.formState.endTime[1] : '',
}
qcckPost(promes, '/mosty-gsxt/tbYjxx/bkyjQctj').then((res) => {
dataConut.value = res || 0
searchOpen.value=true
searchOpen.value = true
}).catch(() => {
// proxy.$message({ type: "error", message: `${promes.msg}失败` });
});
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
console.log("xxxxxxx");
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
.danger {
color: #ff2424;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
.ok {
color: #1d72e8;
}
</style>

View File

@ -0,0 +1,471 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create default-first-optionreserve-keyword placeholder="请输入布控人员" :remote-method="remoteMethod" :loading="loading" style="width: 240px">
<el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" />
</el-select>
</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" v-if="permission_sfqs">签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
expand
@chooseData="handleChooseData"
:rowClassName="getRowClassName"
>
<template #expand="{ props }">
<Items :row="props"/>
</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 #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
</template>
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
</div>
</div>
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" :tacitly="tacitly" />
</Information>
<!-- 详情 -->
<AddFromz ref="addFromRefs" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<!-- 指派 -->
<ZpForm v-model="warningShow" :dataList="dataList"/>
<!-- 反馈 -->
<FkDialog @change="getList" />
<Pagination v-model="paginationOpen" />
</template>
<script setup>
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { getItem, setItem } from '@/utils/storage'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import { holographicProfileJump } from "@/utils/tools.js"
import Items from './item/items.vue'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue';
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import Pagination from "./components/particulars.vue";
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT,D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB ,D_GS_CSZT} = proxy.$dict("D_GSXT_YJXX_CZZT",'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB","D_GS_CSZT")
const searchBox = ref(); //搜索框
const roleCode = ref(false)
const czjyRef = ref()
const itemData = ref()
const semdFqzlRef = ref()
const warningShow = ref(false)
const dataList = ref([])
const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案
const searchConfiger = ref(
[
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "比中项", prop: 'yjLx', showType: "checkbox", showSelectAll: true, options: [{ label: '人员', value: '1', }, { label: '车辆', value: '2', }] },
{ label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "人员类别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "接收单位", prop: 'ssbmdm', placeholder: "请选择接收单位", showType: "department" },
{ label: "放飞开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择放飞开始时间" },
{ label: "放飞结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择放飞结束时间" },
{ label: "无人机型号", prop: 'xm', placeholder: "请输入无人机型号", showType: "input" },
{ label: "手机号码", prop: 'mobile', placeholder: "请输入手机号码", showType: "input" },
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "放飞区域", prop: 'xm', placeholder: "请输入放飞区域", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
// { label: "布控人员", prop: 'yjRyxms', 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: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
// { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
// { label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
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: "yjRyxm" },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
{ label: "比重类别", prop: "yjTp", showSolt: true, width: 100 },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "细类", prop: "czzt", showSolt: true },
{ label: "开始放飞时间", prop: "czzt", showSolt: true },
{ label: "结束放飞时间", prop: "czzt", showSolt: true },
{ label: "飞行时间", prop: "czzt", showSolt: true },
{ label: "放飞区域", prop: "czzt", showSolt: true },
{ label: "无人机类型", prop: "czzt", showSolt: true },
{ label: "手机号", prop: "czzt", showSolt: true },
{ label: "所属单位", prop: "czzt", showSolt: true },
{ label: "超时状态", prop: "czzt", showSolt: true },
// { label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
// { label: "处置状态", prop: "czzt", showSolt: true },
// { label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 },
// { label: "姓名", prop: "yjRyxm" },
// { label: "性别", prop: "xb", showSolt: true, width: 80 },
// { label: "年龄", prop: "nl", showSolt: true, width: 80 },
// { label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
// { label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
// { label: "预警级别", prop: "yjJb", showSolt: true },
// { label: "相似度", prop: "xsd", showSolt: true },
// { label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
]
});
const addFromRefs = ref()
const listQuery = ref({})
const opentions = ref([])
const loading = ref(false)
const selectRows = ref([])
const permission_sfqs = ref(false)
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList'):[]
let obj = rols.find(item => {
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn();
getList()
});
// 搜索
const onReset = () => {
listQuery.value.yjRyxm = ''
}
const onSearch = (val) => {
listQuery.value = { ...listQuery.value,...val };
listQuery.value.startTime = val.times ? val.times[0] : ''
listQuery.value.endTime = val.times ? val.times[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 = {
...listQuery.value,
yjLx: '14', // 无人机预警
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
tbYjxxGetPageList(promes).then((res) => {
pageData.tableData = res.records.map(item => {
return {
...item,
yjTp: item.yjlx == '01' ? item.yjTpreplace(ORDIMG, IMGYM) : item.yjTp
}
}) || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const remoteMethod = (query) => {
if (!query) return opentions.value = [];
loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || [];
loading.value = false;
}).catch(() => {
loading.value = false
})
}
const getRowClassName = (row) => {
if (!row.row.yjJb) return '';
const level = String(row.row.yjJb);
if (level === '01' || level.includes('红') || level.includes('高')) return 'warning-level-01';
if (level === '02' || level.includes('橙') || level.includes('中')) return 'warning-level-02';
if (level === '03' || level.includes('黄') || level.includes('低')) return 'warning-level-03';
if (level === '04' || level.includes('蓝')) return 'warning-level-04';
return '';
};
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/tbYjxx/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
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, D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
}
})
exportExlByObj(titleObj, data, '无人机预警.xlsx')
}
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 pushAssess = (val) => {
return holographicProfileJump(val.yjLx,val)
}
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const submitSendZl = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处置建议
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
// 详情
const openAddFrom = (val) => {
addFromRefs.value.init('add', val)
}
// 指派
const pushWarning = (val) => {
warningShow.value = true
dataList.value = val;
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () {
tabHeightFn();
};
};
// 详情
const paginationOpen=ref(false)
const openBox = (val) => {
paginationOpen.value = true
}
</script>
<style lang="scss">
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
/* 预警级别行样式 */
.warning-level-01 {
background-color: rgba(255, 2, 2, 0.1) !important;
}
.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;
}
.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;
}
.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;
}
.warning-level-04:hover {
background-color: rgba(0, 0, 255, 0.15) !important;
}
/* 确保行样式应用到所有单元格 */
.warning-level-01 td,
.warning-level-02 td,
.warning-level-03 td,
.warning-level-04 td {
background-color: transparent !important;
}
.tabBox_zdy{
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -1,87 +1,39 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create default-first-optionreserve-keyword placeholder="请输入布控人员" :remote-method="remoteMethod" :loading="loading" style="width: 240px">
<el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" />
</el-select>
</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" v-if="permission_sfqs">签收</el-button>
</template>
</PageTitle>
<div ref="searchBox">
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #but>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">签收</el-button>
</template>
</QueryFormPanel>
</div>
<!-- 表格 -->
<div class="tabBox tabBox_zdy">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
expand
@chooseData="handleChooseData"
:rowClassName="getRowClassName"
>
<template #expand="{ props }">
<Items :row="props"/>
</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 #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
</template>
<div class="tabBox_zdy">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<!-- <span type="primary" @click="showDetail(row)">转合成</span> -->
<!-- <span type="danger" @click="delDictItem(row.id)">转会商</span> -->
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<!-- <span type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</span> -->
<span class="primary" @click="openBox(row)">详情</span>
<span class="primary" @click="pushWarning(row)">指派</span>
</div>
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
</div>
@ -91,7 +43,8 @@
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" :tacitly="tacitly" />
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<!-- 详情 -->
@ -99,7 +52,7 @@
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<!-- 指派 -->
<ZpForm v-model="warningShow" :dataList="dataList"/>
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- 反馈 -->
<FkDialog @change="getList" />
<Pagination v-model="paginationOpen" />
@ -111,6 +64,7 @@ import emitter from "@/utils/eventBus.js";
import { getItem, setItem } from '@/utils/storage'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
@ -128,10 +82,12 @@ import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import Pagination from "./components/particulars.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT,D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB ,D_GS_CSZT} = proxy.$dict("D_GSXT_YJXX_CZZT",'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB","D_GS_CSZT")
const { D_GSXT_YJXX_CZZT, D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB, D_GS_CSZT } = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB", "D_GS_CSZT")
const searchBox = ref(); //搜索框
const roleCode = ref(false)
const czjyRef = ref()
@ -143,28 +99,28 @@ const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案
const searchConfiger = ref(
[
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "比中项", prop: 'yjLx', showType: "checkbox", showSelectAll: true, options: [{ label: '人员', value: '1', }, { label: '车辆', value: '2', }] },
{ label: "比中项", prop: 'bzx', showType: "select", options: [{ label: '人员', value: '1', }, { label: '车辆', value: '2', }] },
{ label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "人员类别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "接收单位", prop: 'ssbmdm', placeholder: "请选择接收单位", showType: "department" },
{ label: "放飞开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择放飞开始时间" },
{ label: "放飞结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择放飞结束时间" },
{ label: "无人机型号", prop: 'xm', placeholder: "请输入无人机型号", showType: "input" },
{ label: "手机号码", prop: 'mobile', placeholder: "请输入手机号码", showType: "input" },
{ label: "人员类别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "接收单位", prop: 'ssbmdm', placeholder: "请选择接收单位", showType: "department" },
{ label: "放飞开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择放飞开始时间" },
{ label: "放飞结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择放飞结束时间" },
{ label: "无人机型号", prop: 'xm', placeholder: "请输入无人机型号", showType: "input" },
{ label: "手机号码", prop: 'mobile', placeholder: "请输入手机号码", showType: "input" },
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "放飞区域", prop: 'xm', placeholder: "请输入放飞区域", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "放飞区域", prop: 'xm', placeholder: "请输入放飞区域", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
// { label: "布控人员", prop: 'yjRyxms', 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: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
// { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
// { label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
// { 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: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
// { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
// { label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
@ -182,31 +138,23 @@ const pageData = reactive({
}, //分页
controlsWidth: 160, //操作栏宽度
tableColumn: [
{ label: "处置状态", prop: "czzt", showSolt: true },
{ label: "姓名", prop: "yjRyxm" },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
{ label: "比重类别", prop: "yjTp", showSolt: true, width: 100 },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "细类", prop: "czzt", showSolt: true },
{ label: "开始放飞时间", prop: "czzt", showSolt: true },
{ label: "结束放飞时间", prop: "czzt", showSolt: true },
{ label: "飞行时间", prop: "czzt", showSolt: true },
{ label: "放飞区域", prop: "czzt", showSolt: true },
{ label: "无人机类型", prop: "czzt", showSolt: true },
{ label: "手机号", prop: "czzt", showSolt: true },
{ label: "所属单位", prop: "czzt", showSolt: true },
{ label: "超时状态", prop: "czzt", showSolt: true },
// { label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
// { label: "处置状态", prop: "czzt", showSolt: true },
// { label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 },
// { label: "姓名", prop: "yjRyxm" },
// { label: "性别", prop: "xb", showSolt: true, width: 80 },
// { label: "年龄", prop: "nl", showSolt: true, width: 80 },
// { label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
// { label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
// { label: "预警级别", prop: "yjJb", showSolt: true },
// { label: "相似度", prop: "xsd", showSolt: true },
// { label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: "处置状态", align: 'center', width: 80, slotName: 'czzt' },
{ prop: 'yjRyxm', label: '人员姓名', align: 'center' },
{ prop: 'yjRysfzh', label: '身份证号', width: 80, align: 'center' },
{ label: '预警级别', width: 80, align: 'center', slotName: 'yjJb' },
{ label: '比重类别', width: 80, align: 'center', slotName: 'bzlb' },
{ prop: 'xl', label: '细类', width: 80, align: 'center' },
{ prop: 'ksffsj', label: '开始放飞时间', align: 'center' },
{ prop: 'jsffsj', label: '结束放飞时间', align: 'center' },
{ label: "所属部门", prop: "ssbm", align: 'center' },
{ label: "数据来源", slotName: "yjLylx", align: 'center' },
{ prop: 'mobile', label: '手机号', width: 80, align: 'center' },
{ prop: 'wrjlx', label: '无人机类型', align: 'center' },
{ prop: 'ffsj', label: '飞行时间', width: 80, align: 'center' },
{ prop: 'ffqy', label: '放飞区域', width: 80, align: 'center' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' },
]
});
const addFromRefs = ref()
@ -218,11 +166,11 @@ const permission_sfqs = ref(false)
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList'):[]
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
@ -234,7 +182,7 @@ const onReset = () => {
listQuery.value.yjRyxm = ''
}
const onSearch = (val) => {
listQuery.value = { ...listQuery.value,...val };
listQuery.value = { ...listQuery.value, ...val };
listQuery.value.startTime = val.times ? val.times[0] : ''
listQuery.value.endTime = val.times ? val.times[1] : ''
getList()
@ -255,7 +203,8 @@ const getList = () => {
...listQuery.value,
yjLx: '14', // 无人机预警
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
pageSize: pageData.pageConfiger.pageSize,
bzx: listQuery.value.bzx?.join(',') || '',
}
delete promes.times;
tbYjxxGetPageList(promes).then((res) => {
@ -276,13 +225,13 @@ const getList = () => {
const remoteMethod = (query) => {
if (!query) return opentions.value = [];
loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || [];
loading.value = false;
}).catch(() => {
loading.value = false
})
loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || [];
loading.value = false;
}).catch(() => {
loading.value = false
})
}
const getRowClassName = (row) => {
@ -351,14 +300,14 @@ const exportExl = () => {
}
const handleQs = () => {
if (selectRows.value?.length === 0) return proxy.$message({ type: "warning", message: "请选择要签收的预警" });
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(() => {
qcckPost({ ids }, '/mosty-gsxt/tbYjxx/batchQs').then(() => {
proxy.$message({ type: "success", message: "成功" });
getList();
}).catch(() => {
@ -369,7 +318,7 @@ const handleQs = () => {
// 全息档案跳转
const pushAssess = (val) => {
return holographicProfileJump(val.yjLx,val)
return holographicProfileJump(val.yjLx, val)
}
const showDetail = (item) => {
@ -405,13 +354,13 @@ const pushWarning = (val) => {
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
};
// 详情
const paginationOpen=ref(false)
const paginationOpen = ref(false)
const openBox = (val) => {
paginationOpen.value = true
}
@ -463,9 +412,7 @@ const openBox = (val) => {
background-color: transparent !important;
}
.tabBox_zdy{
.el-table--fit {
overflow: unset !important;
}
.tabBox_zdy {
background-color: #ffff;
}
</style>

View File

@ -0,0 +1,484 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<!-- <template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create
default-first-optionreserve-keyword placeholder="请输入布控人员" :remote-method="remoteMethod" :loading="loading"
style="width: 240px">
<el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" />
</el-select>
</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>xxxx
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">批量签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
@chooseData="handleChooseData" :rowClassName="getRowClassName">
<template #expand="{ props }">
<Items :row="props" />
</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 #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
</template>
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<!-- <el-link type="primary" @click="openAddFrom(row)">详情</el-link> -->
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
</div>
</div>
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<!-- 详情 -->
<AddFromz ref="addFromRefs" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<!-- 指派 -->
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- 反馈 -->
<FkDialog @change="getList" />
<Particulars v-model="paginationOpen" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB}" />
</template>
<script setup>
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { getItem, setItem } from '@/utils/storage'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import { holographicProfileJump } from "@/utils/tools.js"
import Items from './item/items.vue'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue';
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import Particulars from "./components/particulars.vue";
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_QLZDRLX, D_GS_BKZT, D_GS_CSZT, D_BZ_BKLYS, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB, D_BZ_SF,D_GS_ZDR_RYJB, D_GS_ZDR_GJLB} = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB", "D_BZ_BKLYS", "D_GS_BKZT", "D_GS_CSZT", "D_BZ_SF","D_GS_ZDR_RYJB","D_GS_ZDR_GJLB")
const searchBox = ref(); //搜索框
const roleCode = ref(false)
const czjyRef = ref()
const itemData = ref()
const semdFqzlRef = ref()
const warningShow = ref(false)
const dataList = ref([])
const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案
const searchConfiger = ref(
[
{ label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
// { label: "预警名称", prop: 'yjBt', showType: "input", placeholder: "请输入预警名称" },
{ label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "布控范围", prop: 'bkfw', showType: "input", placeholder: "请输入布控范围" },
{ label: "布控单位", prop: 'gkbmdm', showType: "department", placeholder: "请选择布控单位" },
{ label: "所属单位", prop: 'ssbmdm', showType: "department", placeholder: "请选择所属单位" },
{ label: "相似度", prop: 'xsd', showType: "input", placeholder: "请输入相似度" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "姓名", prop: 'yjRyxm', showType: "input", placeholder: "请输入姓名" },
{ label: "性别", prop: 'xbdm', showType: "select", options: D_BZ_XB, placeholder: "请选择性别" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "跨地区", prop: 'sflksd', showType: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "身份证号", prop: 'yjRysfzh', showType: "input", placeholder: "请输入身份证号" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "布控人员", prop: 'yjRyxms', 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 pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 150, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 50 },
{ label: "处置状态", prop: "czzt", showOverflowTooltip: true, width: 50 },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "姓名", prop: "yjRyxm", width: 50 },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "性别", prop: "xbdm", showSolt: true, width: 50 },
{ label: "年龄", prop: "nl", showSolt: true, width: 50 },
{ label: "预警级别", prop: "yjJb", showSolt: true, width: 50 },
{ label: "布控单位", prop: "gkbmdm", showSolt: true, width: 50 },
{ label: "布控来源", prop: "bkly", showSolt: true, width: 50 },
{ label: "布控范围", prop: "bkfw", showSolt: true, width: 50 },
{ label: "布控开始时间", showOverflowTooltip: true, prop: "bkkssj", showSolt: true, width: 50 },
{ label: "布控结束时间", showOverflowTooltip: true, prop: "bkjssj", showSolt: true, width: 50 },
{ label: "处置要求", prop: "bkczyq", showSolt: true, showOverflowTooltip: true, width: 50 },
{ label: "相似度", prop: "xsd", showSolt: true, width: 50 },
{ label: "预警内容", prop: "yjNr", showOverflowTooltip: true, showSolt: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
{ label: "超时状态", prop: "cszt", showOverflowTooltip: true, showSolt: true, width: 50, },
{ label: "在控状态", prop: "zkzt", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
]
});
const addFromRefs = ref()
const listQuery = ref({})
const opentions = ref([])
const loading = ref(false)
const selectRows = ref([])
const permission_sfqs = ref(false)
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn();
getList()
});
// 搜索
const onReset = () => {
listQuery.value.yjRyxm = ''
}
const onSearch = (val) => {
listQuery.value = { ...listQuery.value, ...val, yjJb: val.yjJb?.join(',') || '' };
listQuery.value.startTime = val.startTime ? val.startTime[0] : ''
listQuery.value.endTime = val.startTime ? val.startTime[1] : ''
listQuery.value.sfglyj = val.sfglyj?.join(',') || ''
listQuery.value.sfgz = val.sfgz?.join(',') || ''
listQuery.value.sfzp = val.sfzp?.join(',') || ''
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 = {
...listQuery.value,
yjLx: '1', // 人员预警
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
tbYjxxGetPageList(promes).then((res) => {
pageData.tableData = res.records.map(item => {
return {
...item,
yjTp: item.yjlx == '01' ? item.yjTp.replace(ORDIMG, IMGYM) : item.yjTp
}
}) || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const remoteMethod = (query) => {
if (!query) return opentions.value = [];
loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || [];
loading.value = false;
}).catch(() => {
loading.value = false
})
}
const getRowClassName = (row) => {
if (!row.row.yjJb) return '';
const level = String(row.row.yjJb);
if (level === '01' || level.includes('红') || level.includes('高')) return 'warning-level-01';
if (level === '02' || level.includes('橙') || level.includes('中')) return 'warning-level-02';
if (level === '03' || level.includes('黄') || level.includes('低')) return 'warning-level-03';
if (level === '04' || level.includes('蓝')) return 'warning-level-04';
return '';
};
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/tbYjxx/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
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, D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
}
})
exportExlByObj(titleObj, data, '人像预警.xlsx')
}
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 pushAssess = (val) => {
return holographicProfileJump(val.yjLx, val)
}
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const submitSendZl = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处置建议
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
// 详情
const openAddFrom = (val) => {
addFromRefs.value.init('add', val)
}
// 指派
const pushWarning = (val) => {
warningShow.value = true
dataList.value = val;
}
// 详情
const paginationOpen = ref(false)
const dataPres = ref({})
const openBox = (val) => {
dataPres.value = val
paginationOpen.value = true
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
/* 预警级别行样式 */
.warning-level-01 {
background-color: rgba(255, 2, 2, 0.1) !important;
}
.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;
}
.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;
}
.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;
}
.warning-level-04:hover {
background-color: rgba(0, 0, 255, 0.15) !important;
}
/* 确保行样式应用到所有单元格 */
.warning-level-01 td,
.warning-level-02 td,
.warning-level-03 td,
.warning-level-04 td {
background-color: transparent !important;
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -2,31 +2,34 @@
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<!-- <template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create
default-first-optionreserve-keyword placeholder="请输入布控人员" :remote-method="remoteMethod" :loading="loading"
style="width: 240px">
<el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" />
</el-select>
</template> -->
</Search>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #but>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">批量签收</el-button>
<!-- <el-button type="primary" size="small" @click="exportExl">批量导出</el-button>
<el-button type="primary" size="small" @click="handleQs">批量签收</el-button>
<el-button type="primary" size="small" @click="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button> -->
</template>
</QueryFormPanel>
<!-- <Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
</Search> -->
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<!-- <PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>xxxx
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">批量签收</el-button>
</template>
</PageTitle>
</PageTitle> -->
<!-- 表格 -->
<div class="tabBox tabBox_zdy">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
@chooseData="handleChooseData" :rowClassName="getRowClassName">
<template #expand="{ props }">
<Items :row="props" />
</template>
<div class=" tabBox_zdy">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<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" />
@ -42,38 +45,58 @@
</template>
</el-image>
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
<template #czzt="{ row }">
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #bkly="{ row }">
<DictTag :value="row.bkly" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #bkczyq="{ row }">
<DictTag :value="row.bkczyq" :tag="false" :options="D_GS_BK_CZYQ" />
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
<template #cszt="{ row }">
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
<template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
<!-- <template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<!-- <el-link type="primary" @click="openAddFrom(row)">详情</el-link> -->
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
-->
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<!-- <span type="primary" @click="showDetail(row)">转合成</span> -->
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<!-- <span type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</span> -->
<!-- <span type="primary" @click="openAddFrom(row)">详情</span> -->
<span class="primary" @click="pushWarning(row)">指派</span>
<span class="primary" @click="openBox(row)">详情</span>
<!-- <span class="primary" @click="handleQsSingle(row)">签收</span>
<span class="primary" @click="particularsOpen(row)">详情</span>
<span class="warning" @click="pushWarning(row)">指派</span>
<span class="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</span>
<span class="primary" @click="payAttention(row)">关注</span> -->
</div>
</template>
</MyTable>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
@ -96,7 +119,8 @@
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- 反馈 -->
<FkDialog @change="getList" />
<Particulars v-model="paginationOpen" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB}" />
<Particulars v-model="paginationOpen" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB }" />
</template>
<script setup>
@ -109,24 +133,27 @@ import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import { holographicProfileJump } from "@/utils/tools.js"
import Items from './item/items.vue'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue';
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import Particulars from "./components/particulars.vue";
import { bqYs } from '@/utils/tools.js'
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_QLZDRLX, D_GS_BKZT, D_GS_CSZT, D_BZ_BKLYS, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB, D_BZ_SF,D_GS_ZDR_RYJB, D_GS_ZDR_GJLB} = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB", "D_BZ_BKLYS", "D_GS_BKZT", "D_GS_CSZT", "D_BZ_SF","D_GS_ZDR_RYJB","D_GS_ZDR_GJLB")
const { D_GSXT_YJXX_CZZT, D_GS_QLZDRLX, D_GS_BKZT, D_GS_CSZT, D_BZ_BKLYS, D_BZ_YJJB, D_BZ_YJLYXT,
D_BZ_YJLY, D_BZ_XB, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_BZ_SF, D_GS_BK_CZYQ } = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX ',
"D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB", "D_BZ_BKLYS", "D_GS_BKZT",
"D_GS_CSZT", "D_BZ_SF", "D_GS_ZDR_RYJB", "D_GS_ZDR_GJLB", "D_GS_BK_CZYQ")
const searchBox = ref(); //搜索框
const roleCode = ref(false)
const czjyRef = ref()
@ -138,38 +165,29 @@ const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案
const searchConfiger = ref(
[
{ label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
// { label: "预警名称", prop: 'yjBt', showType: "input", placeholder: "请输入预警名称" },
{ label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "布控范围", prop: 'bkfw', showType: "input", placeholder: "请输入布控范围" },
{ label: "布控单位", prop: 'gkbmdm', showType: "department", placeholder: "请选择布控单位" },
{ label: "所属单位", prop: 'ssbmdm', showType: "department", placeholder: "请选择所属单位" },
{ label: "相似度", prop: 'xsd', showType: "input", placeholder: "请输入相似度" },
{ prop: 'sfglyj', showType: "checkbox", showSelectAll: false, options: [{ label: '关联预警', value: '1' }] },
{ prop: 'sfgz', showType: "checkbox", showSelectAll: false, options: [{ label: '重点关注', value: '1' }] },
{ prop: 'sfzp', showType: "checkbox", showSelectAll: false, options: [{ label: '二次指派', value: '1' }] },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "姓名", prop: 'yjRyxm', showType: "input", placeholder: "请输入姓名" },
{ label: "性别", prop: 'xbdm', showType: "select", options: D_BZ_XB, placeholder: "请选择性别" },
{ label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "跨地区", prop: 'sflksd', showType: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "身份证号", prop: 'yjRysfzh', showType: "input", placeholder: "请输入身份证号" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "布控人员", prop: 'yjRyxms', 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" },
{ label: "布控开始时间", key: 'bkkssj', type: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", key: 'bkjssj', type: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", key: 'startTime', type: "datetimerange", placeholder: "请选择预警时间" },
// { label: "预警名称", prop: 'yjBt', type: "input", placeholder: "请输入预警名称" },
{ label: "预警级别", key: 'yjJb', type: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "布控来源", key: 'bkly', type: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "布控范围", key: 'bkfw', type: "input", placeholder: "请输入布控范围" },
{ label: "布控单位", key: 'gkbmdm', type: "department", placeholder: "请选择布控单位" },
{ label: "所属单位", key: 'ssbmdm', type: "department", placeholder: "请选择所属单位" },
{ label: "相似度", key: 'xsd', type: "input", placeholder: "请输入相似度" },
{ key: 'sfgz', label: '重点关注', type: 'select', options: D_BZ_SF, placeholder: '请选择重点关注' },
{ key: 'sfzp', label: '二次指派', type: 'select', options: D_BZ_SF, placeholder: '请选择二次指派' },
{ key: 'sfgz', label: '重点关注', type: 'select', options: D_BZ_SF, placeholder: '请选择重点关注' },
{ label: "签收状态", key: 'czzt', type: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", key: 'cszt', placeholder: "请选择超时状态", type: "select", options: D_GS_CSZT },
{ label: "布控状态", key: 'zkzt', type: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "姓名", key: 'yjRyxm', type: "input", placeholder: "请输入姓名" },
{ label: "性别", key: 'xbdm', type: "select", options: D_BZ_XB, placeholder: "请选择性别" },
{ label: "开始年龄", key: 'ksnl', placeholder: "请输入年龄", type: "number" },
{ label: "结束年龄", key: 'jsnl', placeholder: "请输入年龄", type: "number" },
{ label: "跨地区", key: 'sflksd', type: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "身份证号", key: 'yjRysfzh', type: "input", placeholder: "请输入身份证号" },
{ label: "预警内容", key: 'yjNr', type: "input", placeholder: "请输入预警内容" },
]);
const pageData = reactive({
tableData: [], //表格数据
@ -188,26 +206,28 @@ const pageData = reactive({
}, //分页
controlsWidth: 150, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 50 },
{ label: "处置状态", prop: "czzt", showOverflowTooltip: true, width: 50 },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "姓名", prop: "yjRyxm", width: 50 },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "性别", prop: "xbdm", showSolt: true, width: 50 },
{ label: "年龄", prop: "nl", showSolt: true, width: 50 },
{ label: "预警级别", prop: "yjJb", showSolt: true, width: 50 },
{ label: "布控单位", prop: "gkbmdm", showSolt: true, width: 50 },
{ label: "布控来源", prop: "bkly", showSolt: true, width: 50 },
{ label: "布控范围", prop: "bkfw", showSolt: true, width: 50 },
{ label: "布控开始时间", showOverflowTooltip: true, prop: "bkkssj", showSolt: true, width: 50 },
{ label: "布控结束时间", showOverflowTooltip: true, prop: "bkjssj", showSolt: true, width: 50 },
{ label: "处置要求", prop: "bkczyq", showSolt: true, showOverflowTooltip: true, width: 50 },
{ label: "相似度", prop: "xsd", showSolt: true, width: 50 },
{ label: "预警内容", prop: "yjNr", showOverflowTooltip: true, showSolt: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
{ label: "超时状态", prop: "cszt", showOverflowTooltip: true, showSolt: true, width: 50, },
{ label: "在控状态", prop: "zkzt", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '照片', width: 50, align: 'center', slotName: 'yjTp' },
{ label: "处置状态", align: 'center', width: 70, slotName: 'czzt' },
{ prop: 'yjSj', label: '预警时间', width: 80, align: 'center' },
{ prop: 'yjRyxm', label: '姓名', width: 50, align: 'center' },
{ prop: 'yjRysfzh', label: '身份证号', align: 'center' },
{ label: '性别', width: 56, align: 'center', slotName: 'xbdm' },
{ prop: 'nl', label: '年龄', width: 56, align: 'center' },
{ label: '预警级别', width: 70, align: 'center', slotName: 'yjJb' },
{ label: "布控单位", prop: "gkbmmc", width: 70, align: 'center' },
{ label: "布控来源", align: 'center', slotName: 'bkly', width: 70 },
{ prop: 'bkfw', label: "布控范围", align: 'center', width: 70 },
{ prop: 'bkkssj', label: "布控开始时间", width: 80, align: 'center' },
{ prop: 'bkjssj', label: "布控结束时间", width: 80, align: 'center' },
{ label: "处置要求", width: 70, slotName: 'bkczyq', align: 'center' },
{ label: "相似度", width: 50, align: 'center', slotName: 'xsd' },
{ label: "预警内容", prop: "yjNr", width: 70, align: 'center' },
{ label: "所属部门", prop: "ssbm", width: 70, align: 'center'},
{ label: "数据来源", width: 70, align: 'center', slotName: 'yjLylx' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' },
{ label: "在控状态", width: 70, align: 'center', slotName: "zkzt" },
]
});
const addFromRefs = ref()
@ -237,9 +257,9 @@ const onSearch = (val) => {
listQuery.value = { ...listQuery.value, ...val, yjJb: val.yjJb?.join(',') || '' };
listQuery.value.startTime = val.startTime ? val.startTime[0] : ''
listQuery.value.endTime = val.startTime ? val.startTime[1] : ''
listQuery.value.sfglyj = val.sfglyj?.join(',') || ''
listQuery.value.sfgz = val.sfgz?.join(',') || ''
listQuery.value.sfzp = val.sfzp?.join(',') || ''
// listQuery.value.sfglyj = val.sfglyj?.join(',') || ''
// listQuery.value.sfgz = val.sfgz?.join(',') || ''
// listQuery.value.sfzp = val.sfzp?.join(',') || ''
getList()
}
@ -416,7 +436,7 @@ const openBox = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
@ -477,8 +497,6 @@ const tabHeightFn = () => {
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
background-color: #fff;
}
</style>

View File

@ -0,0 +1,491 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create
default-first-optionreserve-keyword placeholder="请输入布控人员" :remote-method="remoteMethod" :loading="loading"
style="width: 240px">
<el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" />
</el-select>
</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" v-if="permission_sfqs">批量签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
@chooseData="handleChooseData" :rowClassName="getRowClassName">
<template #expand="{ props }">
<Items :row="props" />
</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 #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
</template>
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
</template>
<template #bkly="{ row }">
<DictTag v-model:value="row.bkly" :options="D_BZ_BKLYS" />
</template>
<template #bkczyq="{ row }">
<DictTag v-model:value="row.bkczyq" :options="D_GS_BK_CZYQ" />
</template>
<template #xtSjly="{ row }">
<span>{{ row.xtSjly==1?'PC':row.xtSjly==2?'移动端':'一张网' }}</span>
</template>
<template #cszt="{ row }">
<DictTag v-model:value="row.cszt" :options="D_GS_CSZT" />
</template>
<template #zkzt="{ row }">
<DictTag v-model:value="row.zkzt" :options="D_GS_BKZT" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<!-- <el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openBox(row)">详情</el-link>
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
</div>
</div>
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<!-- 详情 -->
<AddFromz ref="addFromRefs" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<!-- 指派 -->
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- 反馈 -->
<FkDialog @change="getList" />
<Particulars v-model="particularsShow" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ}" />
</template>
<script setup>
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { getItem, setItem } from '@/utils/storage'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import { holographicProfileJump } from "@/utils/tools.js"
import Items from './item/items.vue'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue';
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import Particulars from './components/particulars.vue'
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_QLZDRLX,
D_BZ_XB,
D_BZ_BKLYS, D_BZ_YJJB, D_BZ_YJLYXT, D_GS_BKZT, D_BZ_SF,
D_BZ_YJLY, D_GS_CSZT, D_GS_BK_CZYQ } = proxy.$dict("D_GSXT_YJXX_CZZT", 'D_GS_QLZDRLX ', "D_GS_BKZT", "D_BZ_SF",
"D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB", "D_BZ_BKLYS", "D_GS_CSZT", "D_GS_BK_CZYQ")
const searchBox = ref(); //搜索框
const roleCode = ref(false)
const czjyRef = ref()
const itemData = ref()
const semdFqzlRef = ref()
const warningShow = ref(false)
const dataList = ref([])
const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案
const searchConfiger = ref(
[
{ label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "布控范围", prop: 'bkfw', showType: "input", placeholder: "请输入布控范围" },
{ label: "布控单位", prop: 'gkbmdm', showType: "department", placeholder: "请选择布控单位" },
{ label: "所属单位", prop: 'ssbmdm', showType: "department", placeholder: "请选择所属单位" },
{ label: "签收状态", prop: 'czzt', showType: "select", options: D_GSXT_YJXX_CZZT },
{ label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "布控状态", prop: 'zkzt', showType: "select", options: D_GS_BKZT, placeholder: "请选择布控状态" },
{ label: "跨地区", prop: 'sflksd', showType: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "车牌号", prop: 'yjClcph', showType: "input", placeholder: "请输入车牌号" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "车牌号", prop: 'yjClcph', showType: "input", placeholder: "请输入车牌号", },
// { label: "预警时间", prop: 'times', showType: "datetimerange" },
// { label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT },
// { label: "预警级别", prop: 'yjJb', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB },
// { label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
// { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
// { label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 180, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
{ label: "状态", prop: "czzt", showSolt: true, width: 80 },
{ label: "车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "布控单位", prop: "gkbmmc", showOverflowTooltip: true },
{ label: "布控来源", prop: "bkly", showOverflowTooltip: true, showSolt: true },
{ label: "布控范围", prop: "bkfw", showOverflowTooltip: true },
{ label: "布控开始时间", prop: "bkkssj", showOverflowTooltip: true },
{ label: "布控结束时间", prop: "bkjssj", showOverflowTooltip: true },
{ label: "处置要求", prop: "bkczyq", showOverflowTooltip: true, showSolt: true },
{ label: "内容", prop: "yjNr", showOverflowTooltip: true },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ label: "数据来源", prop: "xtSjly", showSolt: true },
{ label: "超时状态", prop: "cszt", showSolt: true },
{ label: "在控状态", prop: "zkzt", showSolt: true},
]
});
const addFromRefs = ref()
const listQuery = ref({})
const opentions = ref([])
const loading = ref(false)
const selectRows = ref([])
const permission_sfqs = ref(false)
onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
permission_sfqs.value = str.startsWith('2' || '3') ? false : true;
let rols = getItem('roleList') ? getItem('roleList') : []
let obj = rols.find(item => {
return ['JS_666666', 'JS_777777', 'JS_888888'].includes(item.roleCode)
})
roleCode.value = obj ? true : false;
tabHeightFn();
getList()
});
// 搜索
const onReset = () => {
listQuery.value.yjRyxm = ''
}
const onSearch = (val) => {
listQuery.value = { ...listQuery.value, ...val };
listQuery.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
listQuery.value.startTime = val.startTime ? val.startTime[0] : ''
listQuery.value.endTime = val.startTime ? val.startTime[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 = {
...listQuery.value,
yjLx: '2', // 车辆预警
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
delete promes.times;
tbYjxxGetPageList(promes).then((res) => {
pageData.tableData = res.records.map(item => {
return {
...item,
yjTp: item.yjlx == '01' ? item.yjTpreplace(ORDIMG, IMGYM) : item.yjTp
}
}) || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const remoteMethod = (query) => {
if (!query) return opentions.value = [];
loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || [];
loading.value = false;
}).catch(() => {
loading.value = false
})
}
// 根据预警级别设置行样式
const getRowClassName = (row) => {
if (!row.row.yjJb) return '';
const level = String(row.row.yjJb);
if (level === '01' || level.includes('红') || level.includes('高')) return 'warning-level-01';
if (level === '02' || level.includes('橙') || level.includes('中')) return 'warning-level-02';
if (level === '03' || level.includes('黄') || level.includes('低')) return 'warning-level-03';
if (level === '04' || level.includes('蓝')) return 'warning-level-04';
return '';
};
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/tbYjxx/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
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, D_GSXT_YJXX_CZZT),
yjJb_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
}
})
exportExlByObj(titleObj, data, '人像预警.xlsx')
}
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 pushAssess = (val) => {
return holographicProfileJump(val.yjLx, val)
}
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const submitSendZl = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处置建议
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
// 详情
const openAddFrom = (val) => {
addFromRefs.value.init('add', val)
}
// 指派
const pushWarning = (val) => {
warningShow.value = true
dataList.value = val;
}
// 详情
const particularsShow = ref(false)
const dataPres = ref()
const openBox = (val) => {
particularsShow.value = true
dataPres.value = val
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
/* 预警级别行样式 */
.warning-level-01 {
background-color: rgba(255, 2, 2, 0.1) !important;
}
.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;
}
.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;
}
.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;
}
.warning-level-04:hover {
background-color: rgba(0, 0, 255, 0.15) !important;
}
/* 确保行样式应用到所有单元格 */
.warning-level-01 td,
.warning-level-02 td,
.warning-level-03 td,
.warning-level-04 td {
background-color: transparent !important;
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
}
</style>

View File

@ -2,31 +2,20 @@
<div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<template #yjRyxms>
<el-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create
default-first-optionreserve-keyword placeholder="请输入布控人员" :remote-method="remoteMethod" :loading="loading"
style="width: 240px">
<el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" />
</el-select>
<QueryFormPanel v-model="listQuery" :fields="searchConfiger" @search='onSearch'>
<template #but>
<el-button type="primary" size="small" @click="exportExl">导出</el-button>
<el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">批量签收</el-button>
</template>
</Search>
</QueryFormPanel>
</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" v-if="permission_sfqs">批量签收</el-button>
</template>
</PageTitle>
<!-- 表格 -->
<div class="tabBox tabBox_zdy">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
@chooseData="handleChooseData" :rowClassName="getRowClassName">
<template #expand="{ props }">
<Items :row="props" />
</template>
<div class=" tabBox_zdy">
<WarnDataTable :loading="pageData.tableConfiger.loading" :tableHeight="pageData.tableHeight"
:data="pageData.tableData" :columns="pageData.tableColumn" table-class="warn-table"
@selectionChange="handleChooseData">
<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" />
@ -42,55 +31,48 @@
</template>
</el-image>
</template>
<template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }}
<template #czzt="{ row }">
<DictTag :value="row.czzt" :color="row.czzt === '01' ? '#ff2424' : '#1d72e8'" :tag="false"
:options="D_GSXT_YJXX_CZZT" />
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #yjJb="{ row }">
<div :style="{ 'background-color': bqYs(row.yjJb) }">
<DictTag :value="row.yjJb" color="#fff" :tag="false" :options="D_BZ_YJJB" />
</div>
</template>
<template #bkly="{ row }">
<DictTag :value="row.bkly" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #bkczyq="{ row }">
<DictTag :value="row.bkczyq" :tag="false" :options="D_GS_BK_CZYQ" />
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template>
<template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
</template>
<template #bkly="{ row }">
<DictTag v-model:value="row.bkly" :options="D_BZ_BKLYS" />
</template>
<template #bkczyq="{ row }">
<DictTag v-model:value="row.bkczyq" :options="D_GS_BK_CZYQ" />
</template>
<template #xtSjly="{ row }">
<span>{{ row.xtSjly==1?'PC':row.xtSjly==2?'移动端':'一张网' }}</span>
</template>
<template #cszt="{ row }">
<DictTag v-model:value="row.cszt" :options="D_GS_CSZT" />
<DictTag :value="row.cszt" :tag="false" :options="D_GS_CSZT" />
</template>
<template #zkzt="{ row }">
<DictTag v-model:value="row.zkzt" :options="D_GS_BKZT" />
<template #operation="{ row }">
<div style="display: flex;justify-content: space-between;">
<span class="warning" @click="pushAssess(row)">全息档案</span>
<span class="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</span>
<!-- <span type="primary" @click="showDetail(row)">转合成</span> -->
<!-- <span type="danger" @click="delDictItem(row.id)">转会商</span> -->
<span class="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</span>
<span class="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</span>
<!-- <span type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</span> -->
<span class="primary" @click="openBox(row)">详情</span>
<span class="primary" @click="pushWarning(row)">指派</span>
</div>
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
<!-- <el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<el-link type="primary" @click="openBox(row)">详情</el-link>
<el-link type="primary" @click="pushWarning(row)">指派</el-link>
</template>
</MyTable>
</WarnDataTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages>
@ -113,7 +95,8 @@
<ZpForm v-model="warningShow" :dataList="dataList" />
<!-- 反馈 -->
<FkDialog @change="getList" />
<Particulars v-model="particularsShow" :dataList="dataPres" :dict="{D_BZ_XB,D_BZ_YJJB,D_GS_QLZDRLX,D_GS_ZDR_RYJB,D_GS_ZDR_GJLB,D_GS_BK_CZYQ}" />
<Particulars v-model="particularsShow" :dataList="dataPres"
:dict="{ D_BZ_XB, D_BZ_YJJB, D_GS_QLZDRLX, D_GS_ZDR_RYJB, D_GS_ZDR_GJLB, D_GS_BK_CZYQ }" />
</template>
<script setup>
@ -125,20 +108,20 @@ import { getMultiDictVal } from "@/utils/dict.js"
import { tbYjxxGetPageList } from '@/api/yj.js'
import { IdCard } from '@/utils/validate.js'
import { tbGsxtZdrySelectList } from "@/api/zdr.js"
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import { holographicProfileJump } from "@/utils/tools.js"
import Items from './item/items.vue'
import WarnDataTable from '@/views/backOfficeSystem/ces/components/WarnDataTable.vue'
import QueryFormPanel from "@/views/backOfficeSystem/ces/components/QueryFormPanel.vue";
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import ZpForm from "@/views/backOfficeSystem/fourColorManage/warningControl/sevenWarning/zpForm.vue";
import Czjy from './components/czjy.vue';
import AddFromz from './components/addFrom.vue';
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import Particulars from './components/particulars.vue'
import { bqYs } from '@/utils/tools.js'
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance();
@ -172,46 +155,37 @@ const searchConfiger = ref(
{ label: "跨地区", prop: 'sflksd', showType: "select", options: D_BZ_SF, placeholder: "请选择是否跨地区" },
{ label: "车牌号", prop: 'yjClcph', showType: "input", placeholder: "请输入车牌号" },
{ label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
// { label: "车牌号", prop: 'yjClcph', showType: "input", placeholder: "请输入车牌号", },
// { label: "预警时间", prop: 'times', showType: "datetimerange" },
// { label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT },
// { label: "预警级别", prop: 'yjJb', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB },
// { label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" },
// { label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" },
// { label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: true
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 180, //操作栏宽度
tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
{ label: "状态", prop: "czzt", showSolt: true, width: 80 },
{ label: "车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "布控单位", prop: "gkbmmc", showOverflowTooltip: true },
{ label: "布控来源", prop: "bkly", showOverflowTooltip: true, showSolt: true },
{ label: "布控范围", prop: "bkfw", showOverflowTooltip: true },
{ label: "布控开始时间", prop: "bkkssj", showOverflowTooltip: true },
{ label: "布控结束时间", prop: "bkjssj", showOverflowTooltip: true },
{ label: "处置要求", prop: "bkczyq", showOverflowTooltip: true, showSolt: true },
{ label: "内容", prop: "yjNr", showOverflowTooltip: true },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
{ label: "数据来源", prop: "xtSjly", showSolt: true },
{ label: "超时状态", prop: "cszt", showSolt: true },
{ label: "在控状态", prop: "zkzt", showSolt: true},
{ type: 'index', label: '序号', width: 55, align: 'center' },
{ label: '照片', width: 50, align: 'center', slotName: 'yjTp' },
{ label: "处置状态", align: 'center', width: 70, slotName: 'czzt' },
{ label: "车牌号", prop: "yjClcph", align: 'center', width: 80 },
{ label: '预警级别', width: 70, align: 'center', slotName: 'yjJb' },
{ label: "布控单位", prop: "gkbmmc", align: 'center' },
{ label: "布控来源", align: 'center', slotName: 'bkly', width: 70 },
{ prop: 'bkfw', label: "布控范围", align: 'center', width: 70 },
{ prop: 'bkkssj', label: "布控开始时间", align: 'center' },
{ prop: 'bkjssj', label: "布控结束时间", align: 'center' },
{ label: "处置要求", width: 70, slotName: 'bkczyq', align: 'center' },
{ label: "预警内容", prop: "yjNr", align: 'center' },
{ label: "数据来源", width: 70, align: 'center', slotName: 'yjLylx' },
{ label: '操作', width: 180, slotName: 'operation' },
{ label: '超时状态', width: 80, align: 'center', slotName: 'cszt' },
{ label: "在控状态", width: 70, align: 'center', slotName: "zkzt" },
]
});
const addFromRefs = ref()
@ -414,7 +388,7 @@ const pushWarning = (val) => {
const particularsShow = ref(false)
const dataPres = ref()
const openBox = (val) => {
particularsShow.value = true
particularsShow.value = true
dataPres.value = val
}
@ -422,7 +396,7 @@ const openBox = (val) => {
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 230;
window.onresize = function () {
tabHeightFn();
};
@ -484,8 +458,6 @@ const tabHeightFn = () => {
}
.tabBox_zdy {
.el-table--fit {
overflow: unset !important;
}
background-color: #fff;
}
</style>

View File

@ -0,0 +1,256 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">{{ title }}完成情况</span>
<div>
<el-button type="primary" size="small" v-if="!disabled" :loading="loading" @click="submit">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage ref="elform" :disabled="disabled" v-model="listQuery" :formList="formData" :rules="rules">
</FormMessage>
<div>
<div class="btn_box">
<el-button :disabled="disabled" type="primary" size="small" @click="openZdsjLod">打开今日完成情况列表</el-button>
</div>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="300"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger">
<template #controls="{ row }">
<el-link type="primary" :disabled="disabled" size="small" @click="openZdsjLod('edit', row)">编辑</el-link>
<el-link type="danger" :disabled="disabled" size="small" @click="deleteZdsjLodList(row.id)">删除</el-link>
</template>
</MyTable>
</div>
<div>
<div class="btn_box">
<el-button :disabled="disabled" type="primary" size="small" @click="openToDayContent">明日值班工作列表</el-button>
</div>
<MyTable :tableData="toDayJobList.tableData" :tableColumn="toDayJobList.tableColumn" :tableHeight="300"
:key="toDayJobList.keyCount" :tableConfiger="toDayJobList.tableConfiger">
<template #controls="{ row }">
<el-link type="primary" :disabled="disabled" size="small"
@click="openToDayContent('edit', row)">编辑</el-link>
<el-link type="danger" :disabled="disabled" size="small" @click="deleteToDayContent(row.id)">删除</el-link>
</template>
</MyTable>
</div>
</div>
</div>
<ZdsjLod v-model="zdsjLodShow" @addZdsjLodList="addZdsjLodList" :zdsjLod="zdsjLod" />
<ToDayContent v-model="toDayContentShow" @addZdsjLodList="addToDayLodList" :toDayContent="toDayContent" />
</template>
<script setup>
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, watch, onUnmounted } from "vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import ZdsjLod from "./zdsjLod.vue";
import ToDayContent from "./toDayContent.vue";
const emit = defineEmits(["getList"]);
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const rules = reactive({
jrzbrXm: [{ required: true, message: "请输入今日值班人", trigger: "blur" }],
jrzbrLxdh: [{ required: true, message: "请输入今日值班电话", trigger: "blur" }],
mrzbrXm: [{ required: true, message: "请输入明日值班人", trigger: "blur" }],
mrzbrLxdh: [{ required: true, message: "请输入明日值班电话", trigger: "blur" }],
kssj: [{ required: true, message: "请选择开始时间", trigger: "blur" }],
jssj: [{ required: true, message: "请选择结束时间", trigger: "blur" }],
gzrq: [{ required: true, message: "请选择工作日期", trigger: "blur" }],
});
const listQuery = ref({}); //表单
const formData = ref([
{ label: "今日值班人", prop: "jrzbrXm", type: "input" },
{ label: "今日值班电话", prop: "jrzbrLxdh", type: "input" },
{ label: "明日值班人", prop: "mrzbrXm", type: "input" },
{ label: "明日值班电话", prop: "mrzbrLxdh", type: "input" },
{ label: "开始时间", prop: "kssj", type: "datetime" },
{ label: "结束时间", prop: "jssj", type: "datetime" },
{ label: "工作日期", prop: "gzrq", type: "date" },
{ label: "备注", prop: "bz", type: "textarea", width: "100%" },
]);
const pageData = reactive({
tableData: [], //表格数据
tableConfiger: {
rowHieght: 61,
showSelectType: "null", //选择类型
},
tableColumn: [
{ label: "工作任务", prop: "grw", showOverflowTooltip: true },
{ label: "完成情况", prop: "wcqk", showOverflowTooltip: true },
{ label: " 来源", prop: "ly", showOverflowTooltip: true },
// { label: "序号", prop: "index", showOverflowTooltip: true },
]
});
const toDayJobList = reactive({
tableData: [], //表格数据
tableConfiger: {
rowHieght: 61,
showSelectType: "null", //选择类型
},
tableColumn: [
{ label: "工作内容", prop: "gznr", showOverflowTooltip: true },
]
});
const loading = ref(false);
const elform = ref();
const title = ref("");
const disabled = ref(false);
// 初始化数据
const init = (type, row) => {
title.value = type == 'edit' ? '编辑' : type == 'add' ? '新增' : '详情'
dialogForm.value = true;
if (type != 'add') {
qcckGet({}, '/mosty-gsxt/gzqk/' + row.id).then(res => {
listQuery.value = res;
pageData.tableData = res.wcqkList || [];
toDayJobList.tableData = res.zbgzList || [];
});
if (type == 'detail') {
disabled.value = true;
} else {
disabled.value = false;
}
}
};
// 提交
const submit = () => {
const promes = {
...listQuery.value,
wcqkList: pageData.tableData,
zbgzList: toDayJobList.tableData,
}
elform.value.submit((data) => {
loading.value = true;
if (title.value == "新增") {
qcckPost(promes, '/mosty-gsxt/gzqk/addEntity').then(() => {
proxy.$message({ type: "success", message: title.value + "成功" });
emit("getList");
close();
}).catch(() => {
}).finally(() => {
loading.value = false;
});
} else {
qcckPut(promes, '/mosty-gsxt/gzqk/editEntity').then(() => {
proxy.$message({ type: "success", message: title.value + "成功" });
emit("getList");
close();
}).catch(() => {
}).finally(() => {
loading.value = false;
});
}
});
};
//打开今日完成情况列表
const zdsjLodShow = ref();
const zdsjLod = ref();
const openZdsjLod = (type, row) => {
if (type == 'edit') {
console.log(row);
zdsjLod.value = { ...row };
}
zdsjLodShow.value = true;
}
const addZdsjLodList = (val) => {
const index = pageData.tableData.findIndex(v => v.id == val.id);
if (index != -1) {
pageData.tableData[index] = val;
} else {
pageData.tableData.push(val);
}
}
const deleteZdsjLodList = (id) => {
const index = pageData.tableData.findIndex(v => v.id == id);
if (index != -1) {
pageData.tableData.splice(index, 1);
}
}
// 打开明日值日列表
const toDayContentShow = ref();
const toDayContent = ref();
const openToDayContent = (type, row) => {
if (type == 'edit') {
toDayContent.value = { ...row };
}
toDayContentShow.value = true;
}
const addToDayLodList = (val) => {
const index = toDayJobList.tableData.findIndex(v => v.id == val.id);
if (index != -1) {
toDayJobList.tableData[index] = val;
} else {
toDayJobList.tableData.push(val);
}
}
const deleteToDayContent = (id) => {
const index = toDayJobList.tableData.findIndex(v => v.id == id);
if (index != -1) {
toDayJobList.tableData.splice(index, 1);
}
}
// 关闭
const close = () => {
listQuery.value = {};
dialogForm.value = false;
loading.value = false;
};
onMounted(() => {
});
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep .el-tabs--card>.el-tabs__header .el-tabs__item.is-active {
color: #0072ff;
background: rgba(0, 114, 255, 0.3);
}
.boxlist {
width: calc(99% - 50px);
margin-top: 10px;
overflow: hidden;
}
.depBox {
border: 1px solid #e9e9e9;
padding: 0 0 0 4px;
border-radius: 4px;
width: 100%;
.coolor {
color: #d3d3d3;
}
}
.zdy-taf {
width: 100%;
width: 100%;
min-height: 32px;
border: 1px solid #e9e9e9;
border-radius: 4px;
padding: 0px 5px;
box-sizing: border-box;
}
.map {
height: 520px;
margin-top: 10px;
}
.btn_box {
margin: 10px 0;
}
</style>

View File

@ -0,0 +1,175 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="handleAdd('add', null)">添加完成情况</el-button>
<el-button type="danger" size="small" @click="handleRow()">批量删除</el-button>
</template>
</PageTitle>
<!-- 按钮组 -->
<div class="content">
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="handleChooseData">
<!-- 操作 -->
<template #sjzt="{ row }">
<DictTag :tag="false" :value="row.sjzt" :options="D_BZ_ZDSJCZJG" />
</template>
<template #controls="{ row }">
<el-link type="primary" size="small" @click="handleAdd('edit', row)">编辑</el-link>
<el-link type="primary" size="small" @click="handleAdd('detail', row)">详情</el-link>
<el-link type="danger" size="small" @click="handleRow(row.id)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
</div>
<AddForm ref="addForm" @getList="getList" :dict="{ D_BZ_ZDSJCZJG }" />
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import AddForm from "./addForm.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_ZDSJCZJG } = proxy.$dict("D_BZ_ZDSJCZJG"); //获取字典数据
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{
label: "今日值班人",
prop: "jrzbrXm",
placeholder: "请输入今日值班人",
showType: "input",
},
{
label: "明日值班人",
prop: "mrzbrXm",
placeholder: "请输入明日值班人",
showType: "input",
}, {
label: "开始时间",
prop: "startTime",
placeholder: "请选择开始时间",
showType: "datetimerange",
},
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkbox", //选择类型
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 250, //操作栏宽度
tableColumn: [
{ label: "今日值班人", prop: "jrzbrXm", showOverflowTooltip: true },
{ label: "今日值班电话", prop: "jrzbrLxdh", showOverflowTooltip: true },
{ label: "明日值班人", prop: "mrzbrXm", showOverflowTooltip: true },
{ label: "明日值班电话", prop: "mrzbrLxdh", showOverflowTooltip: true },
{ label: "开始时间", prop: "kssj", showOverflowTooltip: true },
{ label: "结束时间", prop: "jssj" },
{ label: "工作日期", prop: "gzrq" },
{ label: "所属部门", prop: "ssbm" },
]
});
onMounted(() => {
getList();
tabHeightFn();
});
// 搜索
const onSearch = (val) => {
queryFrom.value = {
...val,
startTime: val.startTime ? val.startTime[0] : '',
endTime: val.startTime ? val.startTime[1] : ''
};
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
// 获取列表
const getList = () => {
const promes = {
...pageData.pageConfiger,
...queryFrom.value,
}
qcckGet(promes, "/mosty-gsxt/gzqk/getPageList").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 删除
const ids = ref([])
const handleChooseData = (val) => {
ids.value = val.map(item => item.id)
}
const handleRow = (id) => {
const promes = {
ids: id ? [id] : ids.value
}
proxy.$confirm("确定要删除?", "警告", { type: "warning" }).then(() => {
qcckDelete(promes, "/mosty-gsxt/gzqk/deleteEntity").then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
});
})
};
const addForm = ref(null);
const handleAdd = (type, row) => {
addForm.value.init(type, row);
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -0,0 +1,62 @@
<template>
<el-dialog :model-value="modelValue" :title="title" width="40%" @close="closeDialog" destroy-on-close append-to-body
:close-on-click-modal="false">
<div style="width: 100%;height:150px;">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
</FormMessage>
</div>
<template #footer>
<div class="flex just-center">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="submitForm">确认</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { ref, reactive, onMounted, watch, onUnmounted, getCurrentInstance } from 'vue'
import {generateRandom10Digits} from "@/utils/tools";
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
toDayContent: {
type: Object,
default: () => ({})
}
});
const listQuery = ref({})
const elform = ref()
const emit = defineEmits(["update:modelValue", "addZdsjLodList"]);
const title = ref("明日工作内容");
const formData = ref([
{ label: "工作内容", prop: "gznr", type: "textarea" ,width: "100%" },
]);
const rules = reactive({
gznr: [{ required: true, message: "请输入工作内容", trigger: "blur" }],
});
const closeDialog = () => {
elform.value.reset()
// 关闭对话框时移除事件监听器
emit("update:modelValue", false);
};
watch(() => props.modelValue, (newVal) => {
if (newVal) {
listQuery.value = { ...props.toDayContent }
}
})
const submitForm = () => {
elform.value.submit((val) => {
emit("addZdsjLodList", {...listQuery.value,id:listQuery.value.id?listQuery.value.id:generateRandom10Digits()})
closeDialog()
})
};
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,66 @@
<template>
<el-dialog :model-value="modelValue" :title="title" width="40%" @close="closeDialog" destroy-on-close append-to-body
:close-on-click-modal="false">
<div style="width: 100%;height: 300px;">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
</FormMessage>
</div>
<template #footer>
<div class="flex just-center">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="submitForm">确认</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { ref, reactive, onMounted, watch, onUnmounted, getCurrentInstance } from 'vue'
import {generateRandom10Digits} from "@/utils/tools";
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},zdsjLod: {
type: Object,
default: () => ({})
}
});
const listQuery = ref({})
const elform = ref()
const emit = defineEmits(["update:modelValue", "addZdsjLodList"]);
const title = ref("今日完成情况列表");
const formData = ref([{ label: "工作任务", prop: "grw", type: "input" },
{ label: "来源", prop: "ly", type: "textarea", width: "100%" },
{ label: "完成情况", prop: "wcqk", type: "textarea", width: "100%" },]);
const rules = reactive({
// xh: [{ required: true, message: "请输入序号", trigger: "blur" }],
grw: [{ required: true, message: "请输入工作任务", trigger: "blur" }],
ly: [{ required: true, message: "请输入工作来源", trigger: "blur" }],
wcqk: [{ required: true, message: "请输入完成情况", trigger: "blur" }],
});
watch(() => props.modelValue, (newVal) => {
if (newVal) {
listQuery.value = { ...props.zdsjLod }
}
})
const closeDialog = () => {
elform.value.reset()
// 关闭对话框时移除事件监听器
emit("update:modelValue", false);
};
const submitForm = () => {
elform.value.submit((val) => {
emit("addZdsjLodList", {...listQuery.value,id:listQuery.value.id?listQuery.value.id:generateRandom10Digits()})
closeDialog()
})
};
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,178 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">{{ title }}事件</span>
<div>
<el-button type="primary" size="small" v-if="!disabled" :loading="loading" @click="submit">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage ref="elform" :disabled="disabled" v-model="listQuery" :formList="formData" labelWidth="100px"
:rules="rules">
</FormMessage>
<div style="display: flex;justify-content: flex-end;margin-bottom: 10px;">
<el-button type="primary" style="margin-left: 10px;" @click="drawShape()">选择坐标</el-button>
</div>
<div style="height: 400px;width: 100%; position: absolute;">
<GdMap :mapid="'map-92'"></GdMap>
</div>
</div>
</div>
</template>
<script setup>
import * as rule from "@/utils/rules.js";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, watch, onUnmounted } from "vue";
import GdMap from "@/components/GdMap/index.vue";
import emitter from "@/utils/eventBus.js";
const emit = defineEmits(["getList"]);
const props = defineProps({
dict: {
type: Object,
default: () => ({})
}
});
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const rules = reactive({
sjbt: [{ required: true, message: "请输入事件标题", trigger: "blur" }],
shms: [{ required: true, message: "请输入事件描述", trigger: "blur" }],
jd: [{ required: true, message: "请输入经度", trigger: "blur" }],
wd: [{ required: true, message: "请输入纬度", trigger: "blur" }],
});
const listQuery = ref({
bqdlList: [],
bqxlList: [],
}); //表单
const formData = ref();
watch(() => props.dict.D_BZ_ZDSJCZJG, (newVal) => {
if (newVal) {
formData.value = [
{ label: "事件标题", prop: "sjbt", type: "input" },
// { label: "事件描述", prop: "shms", type: "input" },
{ label: "事件性质", prop: "sjxz", type: "input" },
{ label: "事件地址", prop: "sjdz", type: "input" },
// { label: "事件状态", prop: "sjzt", type: "select", options: props.dict.D_BZ_ZDSJCZJG },
{ label: "事发时间", prop: "fssj", type: "datetime" },
{ label: "事件描述", prop: "shms", type: "textarea", width: "100%" },
{ label: "处置结果", prop: "czjg", type: "textarea", width: "100%" },
{ label: "经度", prop: "jd", type: "input", disabled: true },
{ label: "纬度", prop: "wd", type: "input", disabled: true },
]
}
}, { deep: true });
const loading = ref(false);
const elform = ref();
const title = ref("");
const disabled = ref(false);
// 初始化数据
const init = (type, row) => {
title.value = type == 'edit' ? '编辑' : type == 'add' ? '新增' : '详情'
dialogForm.value = true;
if (type != 'add') {
listQuery.value = row;
emitter.emit('addPointArea', { coords: [{ jd: row.jd, wd: row.wd }], icon: require("@/assets/point/zl.png"), flag: "zdsj" })
}
if (type == 'detail') {
disabled.value = true;
}
};
// 提交
const submit = () => {
const promes = {
...listQuery.value
}
elform.value.submit((data) => {
let url = title.value == "新增" ? "/mosty-gsxt/zdsj/addEntity" : "/mosty-gsxt/zdsj/updateEntity";
loading.value = true;
qcckPost(promes, url).then(() => {
loading.value = false;
proxy.$message({ type: "success", message: title.value + "成功" });
emit("getList");
close();
}).catch(() => {
loading.value = false;
});
});
};
// 关闭
const close = () => {
listQuery.value = {};
dialogForm.value = false;
loading.value = false;
};
onMounted(() => {
emitter.on("coordString", coordStringHandler);
});
const coordStringHandler = (res) => {
if (res.type === "point") {
listQuery.value.jd = res.coord[0];
listQuery.value.wd = res.coord[1];
emitter.emit('addPointArea', { coords: [{ jd: res.coord[0], wd: res.coord[1] }], icon: require("@/assets/point/zl.png"), flag: "zdsj" })
emitter.emit('setMapCenter', { location: [res.coord[0], res.coord[1]], zoomLevel: 15 })
}
};
const drawShape = () => {
emitter.emit("drawShape", {
flag: "zdsj",
type: "point",
isclear: true
});
}
onUnmounted(() => {
emitter.off("coordString", coordStringHandler);
})
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep .el-tabs--card>.el-tabs__header .el-tabs__item.is-active {
color: #0072ff;
background: rgba(0, 114, 255, 0.3);
}
.boxlist {
width: calc(99% - 50px);
margin-top: 10px;
overflow: hidden;
}
.depBox {
border: 1px solid #e9e9e9;
padding: 0 0 0 4px;
border-radius: 4px;
width: 100%;
.coolor {
color: #d3d3d3;
}
}
.zdy-taf {
width: 100%;
width: 100%;
min-height: 32px;
border: 1px solid #e9e9e9;
border-radius: 4px;
padding: 0px 5px;
box-sizing: border-box;
}
.map {
height: 520px;
margin-top: 10px;
}
</style>

View File

@ -0,0 +1,177 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="handleAdd('add', null)">添加事件</el-button>
<el-button type="danger" size="small" @click="handleRow()">批量删除</el-button>
</template>
</PageTitle>
<!-- 按钮组 -->
<div class="content">
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="handleChooseData">
<!-- 操作 -->
<template #sjzt="{ row }">
<DictTag :tag="false" :value="row.sjzt" :options="D_BZ_ZDSJCZJG" />
</template>
<template #controls="{ row }">
<el-link type="primary" size="small" @click="handleAdd('edit', row)">编辑</el-link>
<el-link type="primary" size="small" @click="handleAdd('detail', row)">详情</el-link>
<el-link type="danger" size="small" @click="handleRow(row.id)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
</div>
<AddForm ref="addForm" @getList="getList" :dict="{D_BZ_ZDSJCZJG}" />
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import AddForm from "./addForm.vue";
const { proxy } = getCurrentInstance();
const { D_BZ_ZDSJCZJG } = proxy.$dict("D_BZ_ZDSJCZJG"); //获取字典数据
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{
label: "事件标题",
prop: "sjbt",
placeholder: "请输入事件标题",
showType: "input",
},
{
label: "事件状态",
prop: "sjzt",
placeholder: "请选择事件状态",
showType: "select",
options: D_BZ_ZDSJCZJG
}, {
label: "开始时间",
prop: "startTime",
placeholder: "请选择开始时间",
showType: "datetimerange",
},
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkbox", //选择类型
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 250, //操作栏宽度
tableColumn: [
{ label: "事件标题", prop: "sjbt", showOverflowTooltip: true },
{ label: "事件地址", prop: "sjdz", showOverflowTooltip: true },
{ label: "事件性质", prop: "sjxz", showOverflowTooltip: true },
{ label: "事件描述", prop: "shms", showOverflowTooltip: true },
{ label: "发生时间", prop: "fssj" },
{ label: "处置结果", prop: "czjg", showOverflowTooltip: true },
{ label: "事件状态", prop: "sjzt", showSolt: true },
{ label: "所属部门", prop: "ssbm" },
]
});
onMounted(() => {
getList();
tabHeightFn();
});
// 搜索
const onSearch = (val) => {
queryFrom.value = {
...val,
startTime: val.startTime ? val.startTime[0] : '',
endTime: val.startTime ? val.startTime[1] : ''
};
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
// 获取列表
const getList = () => {
const promes = {
...pageData.pageConfiger,
...queryFrom.value,
}
qcckGet(promes, "/mosty-gsxt/zdsj/selectPage").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 删除
const ids = ref([])
const handleChooseData = (val) => {
ids.value = val.map(item => item.id)
}
const handleRow = (id) => {
const promes = {
ids: id ? [id] : ids.value
}
proxy.$confirm("确定要删除?", "警告", { type: "warning" }).then(() => {
qcckPost(promes, "/mosty-gsxt/zdsj/deletes").then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
});
})
};
// 事件操作
const addForm = ref(null);
const handleAdd = (type, row) => {
addForm.value.init(type, row);
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -21,14 +21,13 @@ const emit = defineEmits(["updateDate"]);
const props = defineProps({
dic: {
type: Object,
default: () => {}
default: () => { }
}
});
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const formData = ref( [
const formData = ref([
{ label: "报警电话", prop: "bjdh", type: "input" },
{ label: "报警电话用户地址", prop: "bjdhyhdz", type: "input" },
{ label: "报警电话用户名", prop: "bjdhyhm", type: "input" },
@ -36,7 +35,7 @@ const formData = ref( [
{ label: "报警人名称", prop: "bjrmc", type: "input" },
{ label: "报警人证件号码", prop: "bjrzjhm", type: "input" },
{ label: "报警时间", prop: "bjsj", type: "input" },
{ label: "警情颜色", prop: "color", type: "select",options: props.dic.D_GS_SSYJ },
{ label: "警情颜色", prop: "color", type: "select", options: props.dic.D_GS_SSYJ },
{ label: "管辖单位名称", prop: "gxdwmc", type: "input" },
{ label: "单位名称", prop: "jcjxtjsdwmc", type: "input" },
{ label: "接警单编号", prop: "jjdbh", type: "input" },
@ -46,13 +45,13 @@ const formData = ref( [
{ label: "接警完成时间", prop: "jjwcsj", type: "input" },
{ label: "接警员编号", prop: "jjybh", type: "input" },
{ label: "接警员姓名", prop: "jjyxm", type: "input" },
{ label: "警情标签", prop: "jqbq", type: "select",options: props.dic.D_BZ_JQBQ},
{ label: "警情标签", prop: "jqbq", type: "select", options: props.dic.D_BZ_JQBQ },
{ label: "警情地址", prop: "jqdz", type: "input" },
{ label: "警情类别代码", prop: "jqlbdm", type: "select", options: props.dic.JQLB },
{ label: "警情类型代码", prop: "jqlxdm", type: "select",options: props.dic.JQLX},
{ label: "警情来源", prop: "jqly", type: "select",options: props.dic.D_BZ_JQLY},
{ label: "警情细类代码", prop: "jqxldm", type: "select" ,options: props.dic.JQXL},
{ label: "警情子类代码", prop: "jqzldm", type: "select" ,options: props.dic.JQZL},
{ label: "警情类型代码", prop: "jqlxdm", type: "select", options: props.dic.JQLX },
{ label: "警情来源", prop: "jqly", type: "select", options: props.dic.D_BZ_JQLY },
{ label: "警情细类代码", prop: "jqxldm", type: "select", options: props.dic.JQXL },
{ label: "警情子类代码", prop: "jqzldm", type: "select", options: props.dic.JQZL },
{ label: "报警内容", prop: "bjnr", type: "textarea", width: "100%" },
{ label: "补充接警内容", prop: "bcjjnr", type: "textarea", width: "100%" },
{ label: "被困人员情况说明", prop: "bkryqksm", type: "textarea", width: "100%" },

View File

@ -0,0 +1,147 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">{{ title }}值班</span>
<div>
<el-button type="primary" size="small" v-if="!disabled" :loading="loading" @click="submit">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage ref="elform" :disabled="disabled" v-model="listQuery" :formList="formData" labelWidth="100px"
:rules="rules">
</FormMessage>
</div>
</div>
</template>
<script setup>
import * as rule from "@/utils/rules.js";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, watch, onUnmounted } from "vue";
const emit = defineEmits(["getList"]);
const props = defineProps({
dict: {
type: Object,
default: () => ({})
}
});
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const rules = reactive({
zbrxm: [{ required: true, message: "请输入值班人姓名", trigger: "blur" }],
zbrq: [{ required: true, message: "请输入值班日期", trigger: "blur" }],
lxdh: [{ required: true, message: "请输入值班人联系电话", trigger: "blur" }],
});
const listQuery = ref({}); //表单
const formData = ref([{ label: "值班人姓名", prop: "zbrxm", type: "input" },
{ label: "值班日期", prop: "zbrq", type: "date" },
{ label: "联系电话", prop: "lxdh", type: "input" },
{ label: "备注", prop: "bz", type: "textarea", width: '100%' },]);
const loading = ref(false);
const elform = ref();
const title = ref("");
const disabled = ref(false);
// 初始化数据
const init = (type, row) => {
title.value = type == 'edit' ? '编辑' : type == 'add' ? '新增' : '详情'
dialogForm.value = true;
if (type != 'add') {
listQuery.value = row;
if (type == 'detail') {
disabled.value = true;
} else {
disabled.value = false;
}
}
};
// 提交
const submit = () => {
const promes = {
...listQuery.value,
}
elform.value.submit((data) => {
loading.value = true;
if (title.value == "新增") {
qcckPost(promes, '/mosty-gsxt/gzzbxx/addEntity').then(() => {
proxy.$message({ type: "success", message: title.value + "成功" });
emit("getList");
close();
}).catch(() => {
}).finally(() => {
loading.value = false;
});
} else {
qcckPut(promes, '/mosty-gsxt/gzzbxx/editEntity').then(() => {
proxy.$message({ type: "success", message: title.value + "成功" });
emit("getList");
close();
}).catch(() => {
}).finally(() => {
loading.value = false;
});
}
});
};
// 关闭
const close = () => {
listQuery.value = {};
dialogForm.value = false;
loading.value = false;
};
onUnmounted(() => {
})
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep .el-tabs--card>.el-tabs__header .el-tabs__item.is-active {
color: #0072ff;
background: rgba(0, 114, 255, 0.3);
}
.boxlist {
width: calc(99% - 50px);
margin-top: 10px;
overflow: hidden;
}
.depBox {
border: 1px solid #e9e9e9;
padding: 0 0 0 4px;
border-radius: 4px;
width: 100%;
.coolor {
color: #d3d3d3;
}
}
.zdy-taf {
width: 100%;
width: 100%;
min-height: 32px;
border: 1px solid #e9e9e9;
border-radius: 4px;
padding: 0px 5px;
box-sizing: border-box;
}
.map {
height: 520px;
margin-top: 10px;
}
</style>

View File

@ -0,0 +1,164 @@
<template>
<div>
<!-- 搜索 -->
<div ref="searchBox" class="mt10">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<PageTitle :malginLeft="10" :height="35" backgroundColor="#ffff" :marginBottom="5" :marginTop="5">
<template #left>
<el-button type="primary" size="small" @click="handleAdd('add', null)">添加值班</el-button>
<el-button type="danger" size="small" @click="handleRow()">批量删除</el-button>
</template>
</PageTitle>
<!-- 按钮组 -->
<div class="content">
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="handleChooseData">
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" size="small" @click="handleAdd('edit', row)">编辑</el-link>
<el-link type="primary" size="small" @click="handleAdd('detail', row)">详情</el-link>
<el-link type="danger" size="small" @click="handleRow(row.id)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
</div>
<AddForm ref="addForm" @getList="getList" />
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import AddForm from "./addForm.vue";
const { proxy } = getCurrentInstance();
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{
label: "值班人姓名",
prop: "zbrxm",
placeholder: "请输入值班人姓名",
showType: "input",
},
{
label: "值班日期",
prop: "zbrq",
placeholder: "请选择值班日期",
showType: "daterange",
},
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkbox", //选择类型
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 250, //操作栏宽度
tableColumn: [
{ label: "值班人姓名", prop: "zbrxm", showOverflowTooltip: true },
{ label: "值班日期", prop: "zbrq", showOverflowTooltip: true },
{ label: "值班人联系电话", prop: "lxdh", showOverflowTooltip: true },
{ label: "录入人姓名", prop: "lrrXm", showOverflowTooltip: true },
{ label: "录入日期", prop: "xtCjsj" },
{ label: "所属部门", prop: "ssbm" },
]
});
onMounted(() => {
getList();
tabHeightFn();
});
// 搜索
const onSearch = (val) => {
queryFrom.value = {
...val,
startTime: val.startTime ? val.startTime[0] : '',
endTime: val.startTime ? val.startTime[1] : ''
};
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
// 获取列表
const getList = () => {
const promes = {
...pageData.pageConfiger,
...queryFrom.value,
}
qcckGet(promes, "/mosty-gsxt/gzzbxx/getPageList").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 删除
const ids = ref([])
const handleChooseData = (val) => {
ids.value = val.map(item => item.id)
}
const handleRow = (id) => {
const promes = {
ids: id ? [id] : ids.value
}
proxy.$confirm("确定要删除?", "警告", { type: "warning" }).then(() => {
qcckDelete(promes, "/mosty-gsxt/gzzbxx/deleteEntity").then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
});
})
};
// 值班操作
const addForm = ref(null);
const handleAdd = (type, row) => {
addForm.value.init(type, row);
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>