This commit is contained in:
lcw
2026-03-10 15:49:44 +08:00
parent e561ef9e6d
commit ab66f6d992
19 changed files with 4045 additions and 421 deletions

View File

@ -36,21 +36,19 @@ export const qcckFlvGet = (params = {}, url, cookie) => {
//get 请求 //get 请求
export const qcckGet = (params = {}, url, cookie) => { export const qcckGet = (params = {}, url, config = {}) => {
if (cookie) { const options = {
return request({ url: api + url,
withCredentials: true, method: "get",
url: api + url, params,
method: "get", ...config
params };
});
} else { if (config.cookie) {
return request({ options.withCredentials = true;
url: api + url,
method: "get",
params
});
} }
return request(options);
}; };
//post 请求 //post 请求
export const qcckPost = (data = {}, url, cookie) => { export const qcckPost = (data = {}, url, cookie) => {

View File

@ -1,86 +1,97 @@
<template> <template>
<div style="padding: 0" v-loading="loadingPage" class="pageSearch searchBox" <div v-loading="loadingPage" class="pageSearch searchBox main-container"
:style="`margin-bottom: ${marginBottom}px;background-color: ${backgroundColor}`"> :style="`margin-bottom: ${marginBottom}px;background-color: ${backgroundColor}`">
<div class="filter-title"> <div class="filter-title">
<span class="filter-label"><el-icon><Filter /></el-icon>筛选条件</span> <span class="filter-label"><el-icon>
</div> <Filter />
<div class="box"> </el-icon>筛选条件</span>
<div v-for="(item, index) in getArr" :key="index" class="item"> </div>
<div class="label" v-if="item.label">{{ item.label }}</div> <div class="content-container">
<!-- select --> <div class="box">
<el-select v-if="item.showType === 'select'" v-model="searchObj[item.prop]" :multiple="item.multiple" <div v-for="(item, index) in getArr" :key="index" class="item">
:clearable="item.clearable" :filterable="item.filterable" :placeholder="item.placeholder" collapse-tags <div class="label" v-if="item.label">{{ item.label }}</div>
collapse-tags-tooltip> <!-- select -->
<el-option v-for="obj in getOptions[item.prop]" :key="obj.value" :label="obj.label || obj.lable" <el-select v-if="item.showType === 'select'" v-model="searchObj[item.prop]" :multiple="item.multiple"
:value="obj.value" /> :clearable="item.clearable" :filterable="item.filterable" :placeholder="item.placeholder" collapse-tags
</el-select> collapse-tags-tooltip>
<!-- input --> <el-option v-for="obj in getOptions[item.prop]" :key="obj.value" :label="obj.label || obj.lable"
<el-input v-else-if="item.showType === 'input'" class="input" v-model="searchObj[item.prop]" :value="obj.value" />
:clearable="item.clearable" :placeholder="item.placeholder" /> </el-select>
<!-- 日期段选择器 --> <!-- input -->
<el-date-picker v-else-if="item.showType === 'daterange'" v-model="searchObj[item.prop]" type="daterange" <el-input v-else-if="item.showType === 'input'" class="input" v-model="searchObj[item.prop]"
unlink-panels :range-separator="item.rangeSeparator" :start-placeholder="item.startPlaceholder" :clearable="item.clearable" :placeholder="item.placeholder" />
:end-placeholder="item.endPlaceholder" :shortcuts="item.shortcuts" :disabledDate="disabledDate" <!-- input -->
value-format="YYYY-MM-DD" /> <el-input v-else-if="item.showType === 'number'" class="input" v-model="searchObj[item.prop]"
<el-date-picker v-else-if="item.showType === 'datetimerange'" v-model="searchObj[item.prop]" :clearable="item.clearable" :placeholder="item.placeholder" type="number" />
type="datetimerange" unlink-panels :range-separator="item.rangeSeparator || ''" <!-- 日期段选择器 -->
:start-placeholder="item.startPlaceholder || '开始日期'" :end-placeholder="item.endPlaceholder || '结束日期'" <el-date-picker v-else-if="item.showType === 'daterange'" v-model="searchObj[item.prop]" type="daterange"
:shortcuts="item.shortcuts" value-format="YYYY-MM-DD HH:mm:ss" /> unlink-panels :range-separator="item.rangeSeparator" :start-placeholder="item.startPlaceholder"
<el-date-picker v-else-if="item.showType === 'date'" v-model="searchObj[item.prop]" type="date" :end-placeholder="item.endPlaceholder" :shortcuts="item.shortcuts" :disabledDate="disabledDate"
:placeholder="item.placeholder" :disabled-date="disabledDate" :shortcuts="item.shortcuts" value-format="YYYY-MM-DD" />
value-format="YYYY-MM-DD"> <el-date-picker v-else-if="item.showType === 'datetimerange'" v-model="searchObj[item.prop]"
</el-date-picker> type="datetimerange" unlink-panels :range-separator="item.rangeSeparator || ''"
<el-date-picker v-else-if="item.showType === 'datetime'" v-model="searchObj[item.prop]" type="datetime" :start-placeholder="item.startPlaceholder || '开始日期'" :end-placeholder="item.endPlaceholder || '结束日期'"
:placeholder="item.placeholder" value-format="YYYY-MM-DD HH:mm:ss"> :shortcuts="item.shortcuts" value-format="YYYY-MM-DD HH:mm:ss" />
</el-date-picker> <el-date-picker v-else-if="item.showType === 'date'" v-model="searchObj[item.prop]" type="date"
:placeholder="item.placeholder" :disabled-date="disabledDate" :shortcuts="item.shortcuts"
value-format="YYYY-MM-DD">
</el-date-picker>
<el-date-picker v-else-if="item.showType === 'datetime'" v-model="searchObj[item.prop]" type="datetime"
:placeholder="item.placeholder" value-format="YYYY-MM-DD HH:mm:ss">
</el-date-picker>
<!-- checkbox --> <!-- checkbox -->
<template v-else-if="item.showType === 'department'"> <template v-else-if="item.showType === 'department'">
<MOSTY.Department clearable v-model="searchObj[item.prop]" /> <MOSTY.Department clearable v-model="searchObj[item.prop]" />
</template> </template>
<!-- checkbox --> <!-- checkbox -->
<template v-else-if="item.showType === 'checkbox'"> <template v-else-if="item.showType === 'checkbox'">
<el-checkbox v-if="item.showSelectAll" v-model="item.checkAll" :indeterminate="item.isIndeterminate" @change=" <el-checkbox v-if="item.showSelectAll" v-model="item.checkAll" :indeterminate="item.isIndeterminate"
@change="
(val) => {
handleCheckAllChange(val, item);
}
">全选</el-checkbox>
<el-checkbox-group v-model="searchObj[item.prop]" @change="
(val) => {
handleCheckedCitiesChange(val, item);
}
">
<el-checkbox v-for="obj in item.options" :key="obj.value" :label="obj.value">{{ obj.label }}</el-checkbox>
</el-checkbox-group>
</template>
<!-- radio -->
<el-radio-group v-else-if="item.showType === 'radio'" v-model="searchObj[item.prop]" @change="
(val) => { (val) => {
handleCheckAllChange(val, item); handleRadioChange(val, item);
}
">全选</el-checkbox>
<el-checkbox-group v-model="searchObj[item.prop]" @change="
(val) => {
handleCheckedCitiesChange(val, item);
} }
"> ">
<el-checkbox v-for="obj in item.options" :key="obj.value" :label="obj.value">{{ obj.label }}</el-checkbox> <el-radio v-for="obj in item.options" :key="obj.value" :label="obj.value">{{ obj.label }}</el-radio>
</el-checkbox-group> </el-radio-group>
</template> <!-- 级联选择 -->
<!-- radio --> <el-cascader v-else-if="item.showType === 'cascader'" v-model="searchObj[item.prop]" :props="item.props"
<el-radio-group v-else-if="item.showType === 'radio'" v-model="searchObj[item.prop]" @change=" :show-all-levels="item.showAllLevels" :clearable="item.clearable" :options="getOptions[item.prop]"
(val) => { :placeholder="item.placeholder" />
handleRadioChange(val, item); <div v-if="item.showType === 'Slot'">
} <slot :name="item.prop"></slot>
"> </div>
<el-radio v-for="obj in item.options" :key="obj.value" :label="obj.value">{{ obj.label }}</el-radio> <div v-if="item.showType === 'defaultSlot'">
</el-radio-group> <slot name="defaultSlot"></slot>
<!-- 级联选择 --> </div>
<el-cascader v-else-if="item.showType === 'cascader'" v-model="searchObj[item.prop]" :props="item.props" <div v-if="item.showType === 'nameSlot'">
:show-all-levels="item.showAllLevels" :clearable="item.clearable" :options="getOptions[item.prop]" <slot name="nameSlot"></slot>
:placeholder="item.placeholder" /> </div>
<div v-if="item.showType === 'Slot'">
<slot :name="item.prop"></slot>
</div> </div>
<div v-if="item.showType === 'defaultSlot'">
<slot name="defaultSlot"></slot> </div>
</div> <div class="button-container">
<div v-if="item.showType === 'nameSlot'"> <div class="flex">
<slot name="nameSlot"></slot> <el-button type="primary" @click="submit" size="small">确定</el-button>
<el-button type="" @click="reset" size="small">重置</el-button>
<slot> </slot>
</div> </div>
</div> </div>
<div class="flex">
<el-button type="primary" @click="submit">确定</el-button>
<el-button type="" @click="reset">重置</el-button>
<slot> </slot>
</div>
</div> </div>
</div> </div>
</template> </template>
@ -476,17 +487,32 @@ watchEffect(() => {
<style lang="scss" scoped> <style lang="scss" scoped>
.pageSearch { .pageSearch {
.main-container {
padding: 0;
}
.content-container {
display: flex;
padding: 0 15px;
}
.button-container {
display: flex;
flex-direction: column-reverse;
margin-bottom: 10px;
}
.filter-title { .filter-title {
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 10px; margin-bottom: 10px;
width: 100%; width: 100%;
background: linear-gradient(to right, #9ed7ff, #e6f0f8); background: linear-gradient(to right, #9ed7ff, #e6f0f8);
padding: 5px 15px; padding: 5px 15px;
.filter-label { .filter-label {
display: flex; display: flex;
align-items: center; align-items: center;
font-weight: bold; font-weight: bold;
color: #000; color: #000;
margin-right: 10px; margin-right: 10px;
@ -501,7 +527,8 @@ padding: 5px 15px;
} }
.box { .box {
padding: 0 15px; flex: 1;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;

View File

@ -57,7 +57,7 @@ import TestDiv from "@/components/common/TestDiv.vue";
.hideSidebar .fixed-header { .hideSidebar .fixed-header {
width: calc(100% - #{$hideSideBarWidth}); width: calc(100% - #{$hideSideBarWidth});
} }
::v-deep .el-scrollbar__view{ // ::v-deep .el-scrollbar__view{
border-right: 1px solid #07376d; // border-right: 1px solid #07376d;
} // }
</style> </style>

View File

@ -0,0 +1,324 @@
<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

@ -0,0 +1,178 @@
<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,478 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container">
<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 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 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 full-width">
<span class="info-label">处置要求</span>
<span class="info-value">
<DictTag :value="dataForm.bkczyq" :tag="false" :options="dict.D_GS_BK_CZYQ" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<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 full-width">
<span class="info-label">布控起始时间</span>
<span class="info-value">{{ dataForm.bkkssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">布控结束时间</span>
<span class="info-value">{{ dataForm.bkjssj }}</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">{{ dataForm.gkbmmc }}</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 v-if="dataForm.fkList && dataForm.fkList.length > 0">{{ dataForm.fkList[0].czsj }}</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 text-area">{{ 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 text-area">
<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 text-area">
<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: 0;
max-height: 500px;
overflow-y: auto;
}
.three-column-layout {
display: flex;
height: 100%;
}
.column {
flex: 1;
display: flex;
flex-direction: column;
min-width: 300px;
border: 1px solid #dcdfe6;
}
.column:not(:last-child) {
border-right: 1px solid #dcdfe6;
}
.column-header {
font-size: 16px;
font-weight: bold;
padding: 10px;
background: #f5f7fa;
color: #303133;
text-align: center;
border-bottom: 1px solid #dcdfe6;
}
.column .info-section {
flex: 1;
overflow-y: auto;
padding: 15px;
}
.info-section {
background: #ffffff;
}
.info-section.blue-bg {
background: #e6f7ff;
border: none;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 12px;
}
.info-item {
flex: 1;
min-width: 300px;
display: flex;
align-items: center;
margin-bottom: 10px;
}
.info-item.full-width {
flex: 100%;
min-width: 100%;
}
.info-label {
font-weight: 600;
margin-right: 10px;
white-space: nowrap;
color: #303133;
font-size: 14px;
width: 100px;
flex-shrink: 0;
}
.info-value {
flex: 1;
padding: 4px 8px;
border: 1px solid #dcdfe6;
background: #ffffff;
min-height: 28px;
display: flex;
align-items: center;
font-size: 14px;
color: #606266;
}
.info-value.text-area {
min-height: 80px;
align-items: flex-start;
padding: 8px;
resize: vertical;
line-height: 1.5;
}
.info-value.warning-level {
background: #fffbe6;
border-color: #ffe58f;
color: #d48806;
font-weight: 600;
padding: 2px 6px;
font-size: 12px;
width: fit-content;
}
.info-value.warning-level.red {
background: #fef0f0;
border-color: #ffccc7;
color: #f56c6c;
}
.info-value.warning-level.orange {
background: #fffbe6;
border-color: #ffe58f;
color: #d48806;
}
.info-value.warning-level.yellow {
background: #fdf6ec;
border-color: #faecd8;
color: #e6a23c;
}
.info-value.warning-level.blue {
background: #ecf5ff;
border-color: #d9ecff;
color: #409eff;
}
.history-item {
margin-bottom: 8px;
padding: 6px 10px;
border: none;
background: #ffffff;
display: flex;
}
.history-index {
font-weight: bold;
margin-right: 8px;
color: #303133;
font-size: 14px;
min-width: 40px;
}
.history-content {
flex: 1;
color: #606266;
font-size: 14px;
line-height: 1.4;
}
/* 滚动条样式 */
.archive-container::-webkit-scrollbar,
.info-section::-webkit-scrollbar {
width: 8px;
height: 8px;
}
.archive-container::-webkit-scrollbar-track,
.info-section::-webkit-scrollbar-track {
background: #f1f1f1;
}
.archive-container::-webkit-scrollbar-thumb,
.info-section::-webkit-scrollbar-thumb {
background: #c1c1c1;
}
.archive-container::-webkit-scrollbar-thumb:hover,
.info-section::-webkit-scrollbar-thumb:hover {
background: #a8a8a8;
}
/* 按钮样式 */
.dialog-footer {
padding: 15px;
background: #f9f9f9;
border-top: 1px solid #e4e7ed;
text-align: center;
}
</style>

View File

@ -12,24 +12,17 @@
</template> </template>
</Searchs> </Searchs>
</div> </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> <template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button> <el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button> <el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template> </template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }"> <div class="tabBox tabBox_zdy" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:tableData="pageData.tableData" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
:tableColumn="pageData.tableColumn" @chooseData="handleChooseData">
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
expand
@chooseData="handleChooseData"
>
<template #expand="{ props }"> <template #expand="{ props }">
<Items :row="props || {}" :dict="dict" /> <Items :row="props || {}" :dict="dict" />
</template> </template>
@ -55,18 +48,18 @@
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" /> <DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template> </template>
<template #sex="{ row }"> <template #sex="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh,2) }} </span> <span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh, 2) }} </span>
</template> </template>
<template #age="{ row }"> <template #age="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh,3) }} </span> <span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh, 3) }} </span>
</template> </template>
<template #yjLylx="{ row }"> <template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" /> <DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template> </template>
<template #bqdl="{ row }"> <template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" /> <DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template> </template>
<template #xsd="{ row }"> <template #xsd="{ row }">
{{ row.xsd }}% {{ row.xsd }}%
@ -76,9 +69,10 @@
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link> <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="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 == '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-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<el-link type="primary" @click="openAddFrom(row)">详情</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="pushWarning(row)">指派</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
</template> </template>
</MyTable> </MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{ <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -91,11 +85,13 @@
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" /> <AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
<!-- 处置建议 --> <!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy> <Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ZpForm v-model="warningShow" :dataList="dataList"/> <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> </template>
<script setup> <script setup>
import { IdCard } from '@/utils/validate.js' import { IdCard } from '@/utils/validate.js'
import Czjy from './components/czjy.vue' import Czjy from './components/czjy.vue'
import { getItem, setItem } from '@/utils/storage' import { getItem, setItem } from '@/utils/storage'
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
@ -112,20 +108,45 @@ import { holographicProfileJump } from "@/utils/tools.js"
import Items from "./item/items.vue" import Items from "./item/items.vue"
import { exportExlByObj } from "@/utils/exportExcel.js" import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js" import { getMultiDictVal } from "@/utils/dict.js"
import Pagination from "./components/particulars.vue";
const czjyRef = ref() const czjyRef = ref()
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const searchBox = ref(); const searchBox = ref();
const { D_GS_QLZDRLX,D_BZ_YJLY,D_GSXT_YJXX_CZZT, D_GS_SSYJ,D_BZ_YJJB } = proxy.$dict('D_GS_QLZDRLX','D_BZ_YJLY',"D_GSXT_YJXX_CZZT", "D_GS_SSYJ",'D_BZ_YJJB') 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 dict = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ })
// 搜索配置 // 搜索配置
const searchConfiger = ref([ const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" }, { label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" }, { label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" }, { label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" }, { label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "级别", prop: 'yjJb', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB}, { label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" }, { label: "布控范围", prop: 'bkfw', showType: "input", placeholder: "请输入布控范围" },
{ label: "布控时间", prop: 'startTime', placeholder: "请选择布控时间", showType: "datetimerange" }, { 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 ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage' const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
@ -151,26 +172,34 @@ const pageData = reactive({
}, },
controlsWidth: 180, //操作栏宽度 controlsWidth: 180, //操作栏宽度
tableColumn: [ tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 100 }, { label: "状态", prop: "czzt", showSolt: true, width: 80 },
{ label: "处置状态", prop: "czzt", showSolt: true }, { label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 }, { label: "姓名", prop: "yjRyxm" , width: 50},
{ label: "姓名", prop: "yjRyxm" }, { label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "性别", prop: "sex", showSolt: true, width: 80 }, { label: "性别", prop: "sex", showSolt: true , width: 50},
{ label: "年龄", prop: "age", showSolt: true, width: 80 }, { label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true }, { label: "预警级别", prop: "yjJb", showSolt: true , width: 50},
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 }, { label: "布控单位", prop: "gkbmdm", showSolt: true , width: 50},
{ label: "预警级别", prop: "yjJb", showSolt: true }, { label: "布控来源", prop: "bkly", showSolt: true , width: 50},
{ label: "相似度", prop: "xsd", showSolt: true }, { 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: "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(() => { onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : '' 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 => { 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; roleCode.value = obj ? true : false;
@ -183,7 +212,12 @@ const onSearch = (val) => {
...queryFrom.value, ...val, ...queryFrom.value, ...val,
startTime: val.startTime ? val.startTime[0] : '', startTime: val.startTime ? val.startTime[0] : '',
endTime: val.startTime ? val.startTime[1] : '', 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; pageData.pageConfiger.pageCurrent = 1;
getList(); getList();
}; };
@ -210,7 +244,7 @@ const getList = () => {
pageCurrent: pageData.pageConfiger.pageCurrent, pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize, pageSize: pageData.pageConfiger.pageSize,
} }
qcckPost(params,'/mosty-gsxt/tbYjxx/getBdbkPageList').then((res) => { qcckPost(params, '/mosty-gsxt/tbYjxx/getBdbkPageList').then((res) => {
pageData.tableData = res?.records || [] pageData.tableData = res?.records || []
pageData.total = res?.total || 0; pageData.total = res?.total || 0;
pageData.tableConfiger.loading = false; pageData.tableConfiger.loading = false;
@ -239,7 +273,7 @@ const handleQsFk = (val, type) => {
} }
const pushAssess = (val) => { const pushAssess = (val) => {
return holographicProfileJump(val?.yjLx,val) // 全息档案跳转 return holographicProfileJump(val?.yjLx, val) // 全息档案跳转
} }
@ -265,13 +299,13 @@ const openAddFrom = (row) => {
} }
const handleCzjy = (row) => { const handleCzjy = (row) => {
czjyRef.value.init( row) czjyRef.value.init(row)
} }
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270; pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function() { window.onresize = function () {
tabHeightFn(); tabHeightFn();
}; };
}; };
@ -324,14 +358,14 @@ const exportExl = () => {
} }
const handleQs = () => { 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'); let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" }); if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02'); let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?' let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => { proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id) 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: "成功" }); proxy.$message({ type: "success", message: "成功" });
getList(); getList();
}).catch(() => { }).catch(() => {
@ -340,17 +374,30 @@ const handleQs = () => {
}).catch(() => { }); }).catch(() => { });
} }
// 详情
const paginationOpen = ref(false)
const dataPres = ref({})
const openBox = (val) => {
paginationOpen.value = true
dataPres.value = val
}
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.el-loading-mask { .el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important; background: rgba(0, 0, 0, 0.5) !important;
} }
.tabBox_zdy{ .tabBox_zdy {
.el-table--fit { .el-table--fit {
overflow: unset !important; overflow: unset !important;
} }
} }
::v-deep .el-table .cell {
padding: 0;
}
::v-deep .el-table .el-table__cell {
padding: 4px 0;
}
</style> </style>

View File

@ -0,0 +1,455 @@
<!--预警指派展示组件 -->
<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 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 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">
<DictTag :value="dataForm.bkczyq" :tag="false" :options="dict.D_GS_BK_CZYQ" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<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 full-width">
<span class="info-label">布控起始时间</span>
<span class="info-value">{{ dataForm.bkkssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">布控结束时间</span>
<span class="info-value">{{ dataForm.bkjssj }}</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">{{ dataForm.gkbmmc }}</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">A29核查</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: 0;
max-height: 500px;
overflow-y: auto;
}
.three-column-layout {
display: flex;
height: 100%;
border: 1px solid #dcdfe6;
}
.column {
flex: 1;
display: flex;
flex-direction: column;
min-width: 300px;
border-right: 1px solid #dcdfe6;
}
.column:last-child {
border-right: none;
}
.column-header {
font-size: 16px;
font-weight: bold;
padding: 8px;
background: #f0f2f5;
color: #303133;
text-align: center;
border-bottom: 1px solid #dcdfe6;
}
.column .info-section {
flex: 1;
overflow-y: auto;
padding: 12px;
}
.info-section {
background: #ffffff;
}
.info-section.blue-bg {
background: #e6f7ff;
border: none;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 10px;
}
.info-item {
flex: 1;
min-width: 300px;
display: flex;
align-items: center;
margin-bottom: 8px;
}
.info-item.full-width {
flex: 100%;
min-width: 100%;
}
.info-label {
font-weight: 600;
margin-right: 8px;
white-space: nowrap;
color: #303133;
font-size: 13px;
width: 90px;
flex-shrink: 0;
}
.info-value {
flex: 1;
padding: 3px 6px;
border: 1px solid #dcdfe6;
background: #ffffff;
min-height: 26px;
display: flex;
align-items: center;
font-size: 13px;
color: #606266;
}
.info-value.text-area {
min-height: 70px;
align-items: flex-start;
padding: 6px;
resize: vertical;
line-height: 1.4;
}
.info-value.warning-level {
background: #fffbe6;
border-color: #ffe58f;
color: #d48806;
font-weight: 600;
padding: 2px 6px;
font-size: 12px;
width: fit-content;
}
.history-item {
margin-bottom: 6px;
padding: 4px 8px;
border: none;
background: #ffffff;
display: flex;
align-items: center;
}
.history-index {
font-weight: bold;
margin-right: 6px;
color: #303133;
font-size: 13px;
min-width: 35px;
}
.history-content {
flex: 1;
color: #606266;
font-size: 13px;
line-height: 1.4;
}
/* 滚动条样式 */
.archive-container::-webkit-scrollbar,
.info-section::-webkit-scrollbar {
width: 6px;
height: 6px;
}
.archive-container::-webkit-scrollbar-track,
.info-section::-webkit-scrollbar-track {
background: #f1f1f1;
}
.archive-container::-webkit-scrollbar-thumb,
.info-section::-webkit-scrollbar-thumb {
background: #c1c1c1;
}
.archive-container::-webkit-scrollbar-thumb:hover,
.info-section::-webkit-scrollbar-thumb:hover {
background: #a8a8a8;
}
/* 按钮样式 */
.dialog-footer {
padding: 12px;
background: #f9f9f9;
border-top: 1px solid #e4e7ed;
text-align: center;
}
</style>

View File

@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<!-- 搜索 --> <!-- 搜索 -->
<div ref="searchBox" class="mt10" > <div ref="searchBox" class="mt10">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount"> <Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd> <template #jfd>
<div> <div>
@ -12,12 +12,12 @@
</template> </template>
</Searchs> </Searchs>
</div> </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> <template #left>
<el-button type="primary" @click="exportExl" size="small">导出</el-button> <el-button type="primary" @click="exportExl" size="small">导出</el-button>
<el-button type="primary" size="small" @click="handleQs">签收</el-button> <el-button type="primary" size="small" @click="handleQs">签收</el-button>
</template> </template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }"> <div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
@ -35,16 +35,24 @@
<template #yjLylx="{ row }"> <template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" /> <DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template> </template>
<template #xbdm="{ row }">
<DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template>
<template #expand="{ props }"> <template #expand="{ props }">
<div class="expand-content" style="max-width: 100%; max-height: 400px; overflow-y: auto; padding: 10px;"> <div class="expand-content" style="max-width: 100%; max-height: 400px; overflow-y: auto; padding: 10px;">
<Items :row="props || {}" :dict="dict" /> <Items :row="props || {}" :dict="dict" />
</div> </div>
</template> </template>
<template #yjLx="{ row }">
<DictTag :value="row.yjLx" :tag="false" :options="D_BZ_YJLX" />
</template>
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link> <el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<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 == '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, '反馈')"
<el-link type="primary" @click="openAddModel(row)">详情</el-link> v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
</template> </template>
</MyTable> </MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{ <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -66,6 +74,8 @@
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxZhyj/sjxspz" <ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxZhyj/sjxspz"
:roleIds="roleIds" /> :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> </template>
<script setup> <script setup>
@ -88,12 +98,14 @@ import Detail from './components/detail.vue'
import { exportExlByObj } from "@/utils/exportExcel.js" import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js" import { getMultiDictVal } from "@/utils/dict.js"
import emitter from "@/utils/eventBus.js"; import emitter from "@/utils/eventBus.js";
import Pagination from "./components/particulars.vue";
const permission_sfqs = ref(false) const permission_sfqs = ref(false)
const roleCode = ref(false) const roleCode = ref(false)
const searchBox = ref(); const searchBox = ref();
const czjyRef = ref() const czjyRef = ref()
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, D_BZ_YJLY, D_BZ_YJLX } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ", "D_BZ_YJJB", "D_BZ_YJLY", "D_BZ_YJLX"); 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({ const dict = ref({
@ -107,12 +119,28 @@ import { holographicProfileJump } from "@/utils/tools.js"
// 搜索配置 // 搜索配置
const searchConfiger = ref([ 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: '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: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" }, { label: "车牌号码", prop: 'clcph', placeholder: "请输入车牌号码", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" }, { label: "预警内容", prop: 'yjNr', showType: "input", placeholder: "请输入预警内容" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB }, // { label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" }, // { 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 queryFrom = ref({});
@ -132,19 +160,42 @@ const pageData = reactive({
pageSize: 20, pageSize: 20,
pageCurrent: 1 pageCurrent: 1
}, },
controlsWidth: 200, controlsWidth:160,
tableColumn: [ tableColumn: [
{ label: "预警人姓名", prop: "yjRyxm" }, { label: "状态", prop: "czzt", showOverflowTooltip: true, showSolt: true, width: 80 },
{ label: "相似度", prop: "xsd", showSolt: true }, { label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 50 },
{ label: "处置状态", prop: "czzt", showSolt: true }, { label: "区域名称", prop: "bkqymc", showOverflowTooltip: true, width: 50 },
{ label: "预警时间", prop: "yjSj", width: 200 }, { label: "区域范围", prop: "bkfw", showOverflowTooltip: true, width: 50},
{ label: "预警标签", prop: "yjbqmc" }, // { label: "区域所属", prop: "gkbmmc", showOverflowTooltip: true, width: 50 },
{ label: "身份证号", prop: "yjRysfzh", width: 200 }, { label: "比中", prop: "yjLx", showOverflowTooltip: true, width: 60, showSolt: true },
{ label: "预警来源", prop: "yjLylx", showSolt: true }, { label: "姓名", prop: "yjRyxm", showOverflowTooltip: true, width: 60 },
{ label: "预警级别", prop: "yjJb", showSolt: true }, { label: "身份证号", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "车牌号", prop: "yjClcph" }, { label: "性别", prop: "xbdm", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "布控区域名称", prop: "bkqymc" }, { label: "年龄", prop: "nl", showOverflowTooltip: true, width: 50 },
{ label: "所属部门", prop: "ssbm" }, { 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" },
] ]
}); });
@ -168,7 +219,7 @@ const handleCzjy = (row) => {
} }
const onSearch = (val) => { const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value, ...val }; queryFrom.value = { ...queryFrom.value, ...val,sfglyj:val.sfglyj.join(',') };
pageData.pageConfiger.pageCurrent = 1; pageData.pageConfiger.pageCurrent = 1;
getList(); getList();
}; };
@ -311,7 +362,7 @@ const chooseJfFun = (val) => {
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270; pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () { window.onresize = function () {
tabHeightFn(); tabHeightFn();
}; };
@ -352,14 +403,14 @@ const exportExl = () => {
} }
const handleQs = () => { 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'); let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" }); if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02'); let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?' let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => { proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id) 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: "成功" }); proxy.$message({ type: "success", message: "成功" });
getList(); getList();
}).catch(() => { }).catch(() => {
@ -367,11 +418,24 @@ const handleQs = () => {
}); });
}).catch(() => { }); }).catch(() => { });
} }
// 详情
const paginationOpen = ref(false)
const dataPres = ref()
const openBox = (val) => {
dataPres.value = val
paginationOpen.value = true
}
</script> </script>
<style> <style lang="scss" scoped>
.el-loading-mask { .el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important; 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> </style>

View File

@ -1,34 +1,23 @@
<template> <template>
<div> <div>
<!-- 搜索 --> <!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10"> <div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"> <Search :searchArr="searchConfiger" @submit="onSearch" ref="searchDom" :key="pageData.keyCount">
<template #age="{ row }">
<div class="ageBox">
<el-input v-model="queryFrom.age_s" placeholder="开始年龄" type="number" :min="1" :max="100" style="width: 102px;"></el-input>
<span style="color: #333;" class="ml5 mr5"></span>
<el-input v-model="queryFrom.age_b" placeholder="结束年龄" type="number" :min="parseInt(queryFrom.age_s)+1" :max="100" style="width: 102px;"></el-input>
</div>
</template>
</Search> </Search>
</div> </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> <template #left>
<el-button type="primary" size="small" @click="exportExl">导出</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="handleQs">批量分析</el-button>
<el-button type="primary" size="small" @click="countPeople">计算人数</el-button>
</template> </template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox heightBox"> <div class="tabBox heightBox">
<MyTable expand <MyTable expand :tableData="pageData.tableData" :tableColumn="pageData.tableColumn"
:tableData="pageData.tableData" :tableHeight="pageData.tableHeight" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger"
:tableColumn="pageData.tableColumn" :controlsWidth="pageData.controlsWidth" @chooseData="handleChooseData">
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="handleChooseData"
>
<template #expand="{ props }"> <template #expand="{ props }">
<div style="max-width: 100%"> <div style="max-width: 100%">
<Items :row="props || {}" /> <Items :row="props || {}" />
@ -37,27 +26,34 @@
<template #czzt="{ row }"> <template #czzt="{ row }">
<DictTag :value="row.czzt" :tag="false" :options="D_GSXT_YJXX_CZZT" /> <DictTag :value="row.czzt" :tag="false" :options="D_GSXT_YJXX_CZZT" />
</template> </template>
<template #sex="{ row }"> <template #xbdm="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh,2) }} </span> <DictTag :value="row.xbdm" :tag="false" :options="D_BZ_XB" />
</template> </template>
<template #age="{ row }"> <template #age="{ row }">
<span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh,3) }} </span> <span v-if="row.yjRysfzh"> {{ IdCard(row.yjRysfzh, 3) }} </span>
</template> </template>
<template #yjJb="{ row }"> <template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :options="D_BZ_YJJB" /> <DictTag :value="row.yjJb" :tag="false" :options="D_BZ_YJJB" />
</template> </template>
<template #bqdl="{ row }"> <template #bqdl="{ row }">
<DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" /> <DictTag :value="row.bqdl" :tag="false" :options="D_GS_QLZDRLX" />
</template> </template>
<template #yjLylx="{ row }"> <template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" /> <DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template> </template>
<template #yjLx="{ row }"> <template #yjLx="{ row }">
<DictTag :value="row.yjLx" :tag="false" :options="D_GS_QLZDRYXX" /> <DictTag :value="row.yjLx" :tag="false" :options="D_GS_QLZDRYXX" />
</template> </template>
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="warning" v-if="row.sfbc != '1'" @click="failWarning(row)">报错</el-link> <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" @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> </template>
</MyTable> </MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{ <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -66,7 +62,9 @@
}"></Pages> }"></Pages>
</div> </div>
</div> </div>
<ZpForm v-model="warningShow" :dataList="dataList"/> <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> </template>
<script setup> <script setup>
@ -74,6 +72,7 @@ import { getMultiDictVal } from "@/utils/dict.js"
import { exportExlByObj } from "@/utils/exportExcel.js" import { exportExlByObj } from "@/utils/exportExcel.js"
import Items from '@/views/backOfficeSystem/fourColorManage/warningList/portraitWarning/item/items.vue' import Items from '@/views/backOfficeSystem/fourColorManage/warningList/portraitWarning/item/items.vue'
import ZpForm from "./zpForm.vue"; import ZpForm from "./zpForm.vue";
import Particulars from "./particulars.vue";
import { IdCard } from '@/utils/validate.js' import { IdCard } from '@/utils/validate.js'
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
@ -81,25 +80,33 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js"; import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, } from "vue";
import peopleConut from "./peopleConut.vue";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_BZ_YJLY,D_GS_QLZDRLX,D_BZ_YJJB, D_GS_QLZDRYXX,D_BZ_XB,D_GSXT_YJXX_CZZT } = proxy.$dict('D_BZ_YJLY','D_GS_QLZDRLX',"D_BZ_YJJB", "D_GS_QLZDRYXX", "D_BZ_XB","D_GSXT_YJXX_CZZT"); //获取字典数据 const { 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 searchBox = ref(); //搜索框
const warningShow = ref(false); const warningShow = ref(false);
const dataList = ref([]); const dataList = ref([]);
const searchConfiger = 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: 'yjRyxm', placeholder: "请输入姓名", showType: "input" },
// { label: "年龄段", prop: 'age', placeholder: "请输入身份证号码", showType: "Slot" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB }, { label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" }, { label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" }, { label: "开始年龄", prop: 'ksnl', placeholder: "请输入年龄", showType: "number" },
{ label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT }, { label: "结束年龄", prop: 'jsnl', placeholder: "请输入年龄", showType: "number" },
{ label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX }, { label: "活动发生地", prop: 'yjDz', placeholder: "请输入活动发生地", showType: "input" },
{ label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" }, { label: "人员细类", prop: 'yjbqmc', placeholder: "请输入人员细类", showType: "input" },
{ label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" }, ])
{ label: "接收单位", prop: 'ssbmdm',showType: "department" },
]);
const queryFrom = ref({}); const queryFrom = ref({});
const pageData = reactive({ const pageData = reactive({
tableData: [], //表格数据 tableData: [], //表格数据
@ -115,21 +122,22 @@ const pageData = reactive({
pageSize: 20, pageSize: 20,
pageCurrent: 1 pageCurrent: 1
}, //分页 }, //分页
controlsWidth: 160, //操作栏宽度 controlsWidth: 200, //操作栏宽度
tableColumn: [ tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true }, { label: "预警状态", prop: "czzt", showSolt: true, width: 70 },
{ label: "预警时间", prop: "yjSj" }, { label: "预警时间", prop: "yjSj", width: 148 },
{ label: "人员姓名", prop: "yjRyxm", }, { label: "人员姓名", prop: "yjRyxm", },
{ label: "身份证号", prop: "yjRysfzh", }, { label: "身份证号", prop: "yjRysfzh", width: 148 },
{ label: "性别", prop: "sex" ,showSolt: true }, { label: "性别", prop: "xbdm", showSolt: true, width: 60 },
{ label: "年龄", prop: "age", showSolt: true }, { label: "年龄", prop: "age", showSolt: true, width: 50 },
{ label: "预警级别", prop: "yjJb", showSolt: true }, { label: "级别", prop: "yjJb", showSolt: true, width: 50 },
{ label: "人员类别", prop: "bqdl", showSolt: true }, { label: "人员类别", prop: "bqdl", showSolt: true, width: 100 },
{ label: "细类", prop: "yjbqmc" }, { label: "人员细类", prop: "yjbqmc" },
{ label: "轨迹类别", prop: "yjLylx", showSolt: true }, { label: "轨迹类别", prop: "yjLylx", showSolt: true },
{ label: "活动发生地", prop: "yjDz" }, { label: "活动发生地", prop: "yjDz" },
{ label: "接收单位", prop: "ssbm" }, { label: "接收单位", prop: "ssbm", width: 148 },
{ label: "预警次数", prop: "yjCs" }, { label: "次数", prop: "yjCs", width: 50 },
{ label: "超时状态", prop: "cszt" },
] ]
}); });
@ -140,9 +148,12 @@ onMounted(() => {
// 搜索 // 搜索
const onSearch = (val) => { const onSearch = (val) => {
queryFrom.value = { ...val } queryFrom.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
queryFrom.value.startTime = val.times ? val.times[0] : '' queryFrom.value.startTime = val.startTime ? val.startTime[0] : ''
queryFrom.value.endTime = val.times ? val.times[1] : '' 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; pageData.pageConfiger.pageCurrent = 1;
getList() getList()
} }
@ -177,15 +188,14 @@ const pushWarning = (val) => {
} }
const failWarning = (val) => { const failWarning = (val) => {
let ids = [val.id] let ids = [val.id]
qcckPost({ids}, '/mosty-gsxt/tbYjxx/yjbc').then((res) => { qcckPost({ ids }, '/mosty-gsxt/tbYjxx/yjbc').then((res) => {
proxy.$message({ type: "success", message: "成功" }); proxy.$message({ type: "success", message: "成功" });
getList(); getList();
}).catch(() => { }).catch(() => {
proxy.$message({ type: "error", message: "失败" }); proxy.$message({ type: "error", message: "失败" });
}); });
} }
@ -220,16 +230,16 @@ const exportExl = () => {
}) })
exportExlByObj(titleObj, data, '七类重点') exportExlByObj(titleObj, data, '七类重点')
} }
// 批量签收
const handleQs = () => { 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'); let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" }); if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02'); let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?' let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => { proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id) 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: "成功" }); proxy.$message({ type: "success", message: "成功" });
getList(); getList();
}).catch(() => { }).catch(() => {
@ -237,7 +247,68 @@ const handleQs = () => {
}); });
}).catch(() => { }); }).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 = () => { const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290; pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
@ -245,8 +316,16 @@ const tabHeightFn = () => {
}; };
</script> </script>
<style> <style lang="scss" scoped>
.el-loading-mask { .el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important; 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> </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

@ -3,13 +3,7 @@
<!-- 搜索 --> <!-- 搜索 -->
<div ref="searchBox" class="mt10 mb10"> <div ref="searchBox" class="mt10 mb10">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount">
<template #age="{ row }">
<div class="ageBox">
<el-input v-model="queryFrom.age_s" placeholder="开始年龄" type="number" :min="1" :max="100" style="width: 102px;"></el-input>
<span style="color: #333;" class="ml5 mr5"></span>
<el-input v-model="queryFrom.age_b" placeholder="结束年龄" type="number" :min="parseInt(queryFrom.age_s)+1" :max="100" style="width: 102px;"></el-input>
</div>
</template>
</Search> </Search>
</div> </div>
<!-- 表格 --> <!-- 表格 -->
@ -64,7 +58,6 @@ const searchBox = ref(); //搜索框
const searchConfiger = ref( const searchConfiger = ref(
[ [
{ label: "姓名", prop: 'yjRyxm', placeholder: "请输入姓名", showType: "input" }, { label: "姓名", prop: 'yjRyxm', placeholder: "请输入姓名", showType: "input" },
// { label: "年龄段", prop: 'age', placeholder: "请输入身份证号码", showType: "Slot" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB }, { label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" }, { label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" }, { label: "预警时间", prop: 'times', showType: "datetimerange" },

View File

@ -0,0 +1,348 @@
<!--预警指派展示组件 -->
<template>
<el-dialog :draggable="true" :model-value="modelValue" :title="title" :width="width" @close="close" append-to-body>
<div class="archive-container">
<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">曾海峰</span>
</div>
<div class="info-item">
<span class="info-label">年龄</span>
<span class="info-value">32</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">身份证号码</span>
<span class="info-value">513701199606095613</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">户籍地</span>
<span class="info-value">四川省成都市xx县大坝村2组</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">户籍地</span>
<span class="info-value">四川省成都市xx县大坝村2组</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">现住地址</span>
<span class="info-value">四川省成都市xx县大坝村2组</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">入库时间</span>
<span class="info-value">2015年3月11日</span>
</div>
<div class="info-item">
<span class="info-label">预警级别</span>
<span class="info-value warning-level">黄色</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="info-label">人员类别</span>
<span class="info-value">刑事前科类</span>
</div>
<div class="info-item">
<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">盗窃案</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">立案单位</span>
<span class="info-value">四川省成都市xx县公安局</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">大疆</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"></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"></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"></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"></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">请波密县公安局与xxx预警一起研判排除xx风险</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">反馈内容</span>
<span class="info-value text-area">经核查已排除xxxxxxx风险</span>
</div>
</div>
</div>
</div>
<!-- 历史预警信息页 -->
<div class="column">
<div class="column-header">历史预警信息页</div>
<div class="info-section">
<div class="history-item">
<span class="history-index">01</span>
<span class="history-content">2026年2月19日 103402 预警内容</span>
</div>
<div class="history-item">
<span class="history-index">02</span>
<span class="history-content">2026年2月19日 103402 预警内容</span>
</div>
<div class="history-item">
<span class="history-index">03</span>
<span class="history-content">2026年2月19日 103402 预警内容</span>
</div>
</div>
</div>
</div>
</div>
<template #footer>
<div class="dialog-footer" style="text-align: center;">
<el-button type="primary">确定</el-button>
<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: '预警详情'
},
width: {
type: String,
default: '90%'
},
});
// 定义事件
const emit = defineEmits(['update:modelValue']);
const close = () => {
emit('update:modelValue', false);
};
</script>
<style scoped>
.archive-container {
padding: 0;
max-height: 600px;
overflow-y: auto;
}
.three-column-layout {
display: flex;
height: 100%;
border: 1px solid #dcdfe6;
}
.column {
flex: 1;
display: flex;
flex-direction: column;
min-width: 300px;
border-right: 1px solid #dcdfe6;
}
.column:last-child {
border-right: none;
}
.column-header {
font-size: 16px;
font-weight: bold;
padding: 8px;
background: #f0f2f5;
color: #303133;
text-align: center;
border-bottom: 1px solid #dcdfe6;
}
.column .info-section {
flex: 1;
overflow-y: auto;
padding: 10px;
}
.info-section {
background: #ffffff;
}
.info-section.blue-bg {
background: #e6f7ff;
border-right: 1px solid #dcdfe6;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 10px;
}
.info-item {
flex: 1;
min-width: 140px;
display: flex;
align-items: center;
margin-right: 10px;
}
.info-item.full-width {
flex: 100%;
min-width: 100%;
margin-right: 0;
}
.info-label {
font-weight: bold;
margin-right: 8px;
white-space: nowrap;
color: #333;
font-size: 14px;
}
.info-value {
flex: 1;
padding: 4px 8px;
border: 1px solid #dcdfe6;
border-radius: 4px;
background: #ffffff;
min-height: 28px;
display: flex;
align-items: center;
font-size: 14px;
}
.info-value.text-area {
min-height: 60px;
align-items: flex-start;
padding: 8px;
resize: vertical;
}
.info-value.warning-level {
background: #fffbe6;
border-color: #ffe58f;
color: #d48806;
font-weight: bold;
}
.history-item {
margin-bottom: 8px;
padding: 6px 10px;
border: 1px solid #e4e7ed;
border-radius: 4px;
background: #ffffff;
display: flex;
align-items: center;
font-size: 14px;
}
.history-index {
font-weight: bold;
margin-right: 8px;
color: #409eff;
}
.history-content {
flex: 1;
color: #606266;
}
</style>

View File

@ -102,6 +102,7 @@
<ZpForm v-model="warningShow" :dataList="dataList"/> <ZpForm v-model="warningShow" :dataList="dataList"/>
<!-- 反馈 --> <!-- 反馈 -->
<FkDialog @change="getList" /> <FkDialog @change="getList" />
<Pagination v-model="paginationOpen" />
</template> </template>
<script setup> <script setup>
@ -126,10 +127,11 @@ import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue"; import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import Pagination from "./components/particulars.vue";
const ORDIMG = 'https://89.40.7.122:38496/image' const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage' const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT,D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB } = proxy.$dict("D_GSXT_YJXX_CZZT",'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB") 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 searchBox = ref(); //搜索框
const roleCode = ref(false) const roleCode = ref(false)
const czjyRef = ref() const czjyRef = ref()
@ -140,16 +142,28 @@ const dataList = ref([])
const showDialog = ref(false)// 发送指令 const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案 const assessShow = ref(false)// 全息档案
const searchConfiger = ref( const searchConfiger = ref(
[ [
{ label: "布控人员", prop: 'yjRyxms', showType: "Slot" }, { label: "预警时间", prop: 'times', showType: "datetimerange" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB }, { label: "超时状态", prop: 'cszt', placeholder: "请选择超时状态", showType: "select", options: D_GS_CSZT },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" }, { label: "比中项", prop: 'yjLx', showType: "checkbox", showSelectAll: true, options: [{ label: '人员', value: '1', }, { label: '车辆', value: '2', }] },
{ label: "预警时间", prop: 'times', showType: "datetimerange" }, { label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT }, { label: "人员类别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
// { label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX }, { label: "接收单位", prop: 'ssbmdm', placeholder: "请选择接收单位", showType: "department" },
{ label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" }, { label: "放飞开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择放飞开始时间" },
{ label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" }, { label: "放飞结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择放飞结束时间" },
{ label: "接收单位", prop: 'ssbmdm',showType: "department" }, { 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({ const pageData = reactive({
tableData: [], //表格数据 tableData: [], //表格数据
@ -166,19 +180,33 @@ const pageData = reactive({
pageSize: 20, pageSize: 20,
pageCurrent: 1 pageCurrent: 1
}, //分页 }, //分页
controlsWidth: 250, //操作栏宽度 controlsWidth: 160, //操作栏宽度
tableColumn: [ tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
{ label: "处置状态", prop: "czzt", showSolt: true }, { label: "处置状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 },
{ label: "姓名", prop: "yjRyxm" }, { 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: "yjRysfzh", showOverflowTooltip: true, width: 200 },
{ label: "比重类别", prop: "yjTp", showSolt: true, width: 100 },
{ label: "预警级别", prop: "yjJb", showSolt: true }, { label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "相似度", prop: "xsd", showSolt: true }, { label: "细类", prop: "czzt", showSolt: true },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: 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 addFromRefs = ref()
@ -382,6 +410,11 @@ const tabHeightFn = () => {
tabHeightFn(); tabHeightFn();
}; };
}; };
// 详情
const paginationOpen=ref(false)
const openBox = (val) => {
paginationOpen.value = true
}
</script> </script>
<style lang="scss"> <style lang="scss">

View File

@ -0,0 +1,506 @@
<!--预警指派展示组件 -->
<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.dataList, (newVal) => {
if (newVal) {
getPart(newVal.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 => {
dataForm.value = res
}).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: 500px;
overflow-y: auto;
}
.three-column-layout {
display: flex;
gap: 20px;
height: 100%;
}
.column {
flex: 1;
display: flex;
flex-direction: column;
min-width: 300px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
border-radius: 8px;
overflow: hidden;
}
.column-header {
font-size: 16px;
font-weight: bold;
padding: 10px;
background: #f5f7fa;
color: #303133;
text-align: center;
border-bottom: 1px solid #dcdfe6;
}
.column .info-section {
flex: 1;
overflow-y: auto;
}
.info-section {
padding: 20px;
background: #ffffff;
}
.info-section.blue-bg {
background: #f0f9ff;
border-left: 4px solid #409eff;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 16px;
}
.info-item {
flex: 1;
min-width: 300px;
display: flex;
align-items: center;
}
.info-item.full-width {
flex: 100%;
min-width: 100%;
}
.info-label {
font-weight: 600;
margin-right: 12px;
white-space: nowrap;
color: #303133;
font-size: 14px;
width: 100px;
flex-shrink: 0;
}
.info-value {
flex: 1;
padding: 6px 12px;
border: 1px solid #e4e7ed;
border-radius: 4px;
background: #f8f9fa;
min-height: 32px;
display: flex;
align-items: center;
font-size: 14px;
color: #606266;
transition: all 0.3s ease;
}
.info-value:hover {
border-color: #409eff;
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
}
.info-value.text-area {
min-height: 100px;
align-items: flex-start;
padding: 10px 12px;
resize: vertical;
line-height: 1.5;
}
/* 红 */
.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: 12px;
padding: 12px 16px;
border: 1px solid #e4e7ed;
border-radius: 6px;
background: #f8f9fa;
display: flex;
transition: all 0.3s ease;
}
.history-item:hover {
border-color: #409eff;
box-shadow: 0 2px 8px rgba(64, 158, 255, 0.15);
}
.history-index {
font-weight: bold;
margin-right: 12px;
color: #409eff;
font-size: 14px;
min-width: 40px;
}
.history-content {
flex: 1;
color: #606266;
font-size: 14px;
line-height: 1.4;
}
/* 滚动条样式 */
.archive-container::-webkit-scrollbar,
.info-section::-webkit-scrollbar {
width: 8px;
height: 8px;
}
.archive-container::-webkit-scrollbar-track,
.info-section::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 4px;
}
.archive-container::-webkit-scrollbar-thumb,
.info-section::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 4px;
}
.archive-container::-webkit-scrollbar-thumb:hover,
.info-section::-webkit-scrollbar-thumb:hover {
background: #a8a8a8;
}
/* 按钮样式 */
.dialog-footer {
padding: 20px;
background: #f9f9f9;
border-top: 1px solid #e4e7ed;
margin-top: 20px;
border-radius: 0 0 8px 8px;
}
</style>

View File

@ -1,37 +1,31 @@
<template> <template>
<div> <div>
<!-- 搜索 --> <!-- 搜索 -->
<div ref="searchBox"> <div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount"> <Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<template #yjRyxms> <!-- <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-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create
<el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" /> default-first-optionreserve-keyword placeholder="请输入布控人员" :remote-method="remoteMethod" :loading="loading"
</el-select> style="width: 240px">
</template> <el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" />
</Search> </el-select>
</div> </template> -->
</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> <template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button> <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> <el-button type="primary" size="small" @click="handleQs" v-if="permission_sfqs">批量签收</el-button>
</template> </template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox tabBox_zdy"> <div class="tabBox tabBox_zdy">
<MyTable <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:tableData="pageData.tableData" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
:tableColumn="pageData.tableColumn" @chooseData="handleChooseData" :rowClassName="getRowClassName">
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
expand
@chooseData="handleChooseData"
:rowClassName="getRowClassName"
>
<template #expand="{ props }"> <template #expand="{ props }">
<Items :row="props"/> <Items :row="props" />
</template> </template>
<template #yjTp="{ row }"> <template #yjTp="{ row }">
<template v-if="!row.yjTp || row.yjTp.includes('baidu')"> <template v-if="!row.yjTp || row.yjTp.includes('baidu')">
@ -72,16 +66,15 @@
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</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="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-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-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</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="openAddFrom(row)">详情</el-link> -->
<el-link type="primary" @click="pushWarning(row)">指派</el-link> <el-link type="primary" @click="pushWarning(row)">指派</el-link>
<el-link type="primary" @click="openBox(row)">详情</el-link>
</template> </template>
</MyTable> </MyTable>
<Pages <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }"> :pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages> </Pages>
</div> </div>
@ -91,7 +84,8 @@
<HolographicArchive v-model="assessShow" :dataList="dataList" /> <HolographicArchive v-model="assessShow" :dataList="dataList" />
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'> <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> </Information>
<!-- 详情 --> <!-- 详情 -->
@ -99,9 +93,10 @@
<!-- 处置建议 --> <!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy> <Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<!-- 指派 --> <!-- 指派 -->
<ZpForm v-model="warningShow" :dataList="dataList"/> <ZpForm v-model="warningShow" :dataList="dataList" />
<!-- 反馈 --> <!-- 反馈 -->
<FkDialog @change="getList" /> <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> </template>
<script setup> <script setup>
@ -126,10 +121,12 @@ import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "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 ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage' const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT,D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB } = proxy.$dict("D_GSXT_YJXX_CZZT",'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB") 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 searchBox = ref(); //搜索框
const roleCode = ref(false) const roleCode = ref(false)
const czjyRef = ref() const czjyRef = ref()
@ -140,17 +137,40 @@ const dataList = ref([])
const showDialog = ref(false)// 发送指令 const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案 const assessShow = ref(false)// 全息档案
const searchConfiger = ref( const searchConfiger = ref(
[ [
{ label: "布控人员", prop: 'yjRyxms', showType: "Slot" }, { label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "性别", prop: 'xbdm', placeholder: "请选择性别", showType: "select", options: D_BZ_XB }, { label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "身份证", prop: 'yjRysfzh', placeholder: "请输入身份证号码", showType: "input" }, { label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" }, // { label: "预警名称", prop: 'yjBt', showType: "input", placeholder: "请输入预警名称" },
{ label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT }, { label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
// { label: "人员类别", prop: 'bqdl', placeholder: "请选择人员类别", showType: "select", options: D_GS_QLZDRLX }, { label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" }, { label: "布控范围", prop: 'bkfw', showType: "input", placeholder: "请输入布控范围" },
{ label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" }, { label: "布控单位", prop: 'gkbmdm', showType: "department", placeholder: "请选择布控单位" },
{ label: "接收单位", prop: 'ssbmdm',showType: "department" }, { 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({ const pageData = reactive({
tableData: [], //表格数据 tableData: [], //表格数据
keyCount: 0, keyCount: 0,
@ -166,18 +186,27 @@ const pageData = reactive({
pageSize: 20, pageSize: 20,
pageCurrent: 1 pageCurrent: 1
}, //分页 }, //分页
controlsWidth: 250, //操作栏宽度 controlsWidth: 150, //操作栏宽度
tableColumn: [ tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 100 }, { label: "预警图片", prop: "yjTp", showSolt: true, width: 50 },
{ label: "处置状态", prop: "czzt", showSolt: true }, { label: "处置状态", prop: "czzt", showOverflowTooltip: true, width: 50 },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 }, { label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "姓名", prop: "yjRyxm" }, { label: "姓名", prop: "yjRyxm", width: 50 },
{ label: "性别", prop: "xb", showSolt: true, width: 80 }, { label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
{ label: "年龄", prop: "nl", showSolt: true, width: 80 }, { 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: "yjLylx", showOverflowTooltip: true, showSolt: true },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 }, { label: "超时状态", prop: "cszt", showOverflowTooltip: true, showSolt: true, width: 50, },
{ label: "预警级别", prop: "yjJb", showSolt: true }, { label: "在控状态", prop: "zkzt", showOverflowTooltip: true, showSolt: true, width: 50 },
{ label: "相似度", prop: "xsd", showSolt: true },
{ label: "所属部门", prop: "ssbm", showOverflowTooltip: true }, { label: "所属部门", prop: "ssbm", showOverflowTooltip: true },
] ]
}); });
@ -190,11 +219,10 @@ const permission_sfqs = ref(false)
onMounted(() => { onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : '' 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 => { 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; roleCode.value = obj ? true : false;
@ -206,9 +234,12 @@ const onReset = () => {
listQuery.value.yjRyxm = '' listQuery.value.yjRyxm = ''
} }
const onSearch = (val) => { const onSearch = (val) => {
listQuery.value = { ...listQuery.value,...val }; listQuery.value = { ...listQuery.value, ...val, yjJb: val.yjJb?.join(',') || '' };
listQuery.value.startTime = val.times ? val.times[0] : '' listQuery.value.startTime = val.startTime ? val.startTime[0] : ''
listQuery.value.endTime = val.times ? val.times[1] : '' 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() getList()
} }
@ -248,13 +279,13 @@ const getList = () => {
const remoteMethod = (query) => { const remoteMethod = (query) => {
if (!query) return opentions.value = []; if (!query) return opentions.value = [];
loading.value = true loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => { tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || []; opentions.value = res || [];
loading.value = false; loading.value = false;
}).catch(() => { }).catch(() => {
loading.value = false loading.value = false
}) })
} }
const getRowClassName = (row) => { const getRowClassName = (row) => {
@ -323,14 +354,14 @@ const exportExl = () => {
} }
const handleQs = () => { 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'); let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" }); if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02'); let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?' let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => { proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id) 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: "成功" }); proxy.$message({ type: "success", message: "成功" });
getList(); getList();
}).catch(() => { }).catch(() => {
@ -341,7 +372,7 @@ const handleQs = () => {
// 全息档案跳转 // 全息档案跳转
const pushAssess = (val) => { const pushAssess = (val) => {
return holographicProfileJump(val.yjLx,val) return holographicProfileJump(val.yjLx, val)
} }
const showDetail = (item) => { const showDetail = (item) => {
@ -375,6 +406,14 @@ const pushWarning = (val) => {
warningShow.value = true warningShow.value = true
dataList.value = val; dataList.value = val;
} }
// 详情
const paginationOpen = ref(false)
const dataPres = ref({})
const openBox = (val) => {
dataPres.value = val
paginationOpen.value = true
}
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290; pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
@ -383,12 +422,19 @@ const tabHeightFn = () => {
}; };
}; };
</script> </script>
<style lang="scss" scoped>
<style lang="scss">
.el-loading-mask { .el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important; 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 { .warning-level-01 {
background-color: rgba(255, 2, 2, 0.1) !important; background-color: rgba(255, 2, 2, 0.1) !important;
@ -430,7 +476,7 @@ const tabHeightFn = () => {
background-color: transparent !important; background-color: transparent !important;
} }
.tabBox_zdy{ .tabBox_zdy {
.el-table--fit { .el-table--fit {
overflow: unset !important; overflow: unset !important;
} }

View File

@ -0,0 +1,443 @@
<!--预警指派展示组件 -->
<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 full-width">
<span class="info-label">车牌号</span>
<span class="info-value">{{ dataForm.yjClcph }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">车辆所有人</span>
<span class="info-value">{{ dataForm.yjRyxm }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">处置要求</span>
<span class="info-value">
<DictTag :value="dataForm.bkczyq" :tag="false" :options="dict.D_GS_BK_CZYQ" />
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<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 full-width">
<span class="info-label">布控起始时间</span>
<span class="info-value">{{ dataForm.bkkssj }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="info-label">布控结束时间</span>
<span class="info-value">{{ dataForm.bkjssj }}</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">{{ dataForm.gkbmmc }}</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
dataForm.value = {}
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 = {}
}
console.log(res);
}).catch(err => {
if (err.name !== 'AbortError') {
console.error('请求失败:', err)
}
}).finally(() => {
console.log("xxxxxx");
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: 0;
max-height: 600px;
overflow-y: auto;
}
.three-column-layout {
display: flex;
height: 100%;
border: 1px solid #dcdfe6;
}
.column {
flex: 1;
display: flex;
flex-direction: column;
min-width: 300px;
border-right: 1px solid #dcdfe6;
}
.column:last-child {
border-right: none;
}
.column-header {
font-size: 16px;
font-weight: bold;
padding: 8px;
background: #f0f2f5;
color: #303133;
text-align: center;
border-bottom: 1px solid #dcdfe6;
}
.column .info-section {
flex: 1;
overflow-y: auto;
padding: 10px;
}
.info-section {
background: #ffffff;
}
.info-section.blue-bg {
background: #e6f7ff;
border-right: 1px solid #dcdfe6;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 10px;
}
.info-item {
/* flex: 1; */
min-width: 140px;
display: flex;
align-items: center;
margin-right: 10px;
}
.info-item.full-width {
flex: 100%;
min-width: 100%;
margin-right: 0;
}
.info-label {
font-weight: bold;
margin-right: 8px;
width: 100px;
white-space: nowrap;
color: #333;
font-size: 14px;
}
.info-value {
flex: 1;
padding: 4px 8px;
border: 1px solid #dcdfe6;
border-radius: 4px;
background: #ffffff;
min-height: 28px;
display: flex;
align-items: center;
font-size: 14px;
}
.info-value.text-area {
min-height: 60px;
align-items: flex-start;
padding: 8px;
resize: vertical;
}
.info-value.warning-level {
background: #fffbe6;
border-color: #ffe58f;
color: #d48806;
font-weight: bold;
}
.info-value.warning-level.red {
background: #fef0f0;
border-color: #ffccc7;
color: #f56c6c;
}
.info-value.warning-level.orange {
background: #fffbe6;
border-color: #ffe58f;
color: #d48806;
}
.info-value.warning-level.yellow {
background: #fdf6ec;
border-color: #faecd8;
color: #e6a23c;
}
.info-value.warning-level.blue {
background: #ecf5ff;
border-color: #d9ecff;
color: #409eff;
}
.history-item {
margin-bottom: 8px;
padding: 6px 10px;
border: 1px solid #e4e7ed;
border-radius: 4px;
background: #ffffff;
display: flex;
align-items: center;
font-size: 14px;
}
.history-index {
font-weight: bold;
margin-right: 8px;
color: #409eff;
}
.history-content {
flex: 1;
color: #606266;
}
</style>

View File

@ -1,35 +1,29 @@
<template> <template>
<div> <div>
<!-- 搜索 --> <!-- 搜索 -->
<div ref="searchBox"> <div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount"> <Search :searchArr="searchConfiger" @submit="onSearch" @reset="onReset" :key="pageData.keyCount">
<template #yjRyxms> <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-select clearable v-model="listQuery.yjRyxm" filterable remote allow-create
<el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" /> default-first-optionreserve-keyword placeholder="请输入布控人员" :remote-method="remoteMethod" :loading="loading"
</el-select> style="width: 240px">
</template> <el-option v-for="item in opentions" :key="item.rySfzh" :label="item.ryXm" :value="item.rySfzh" />
</Search> </el-select>
</div> </template>
</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> <template #left>
<el-button type="primary" size="small" @click="exportExl">导出</el-button> <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="handleQs" v-if="permission_sfqs">批量签收</el-button>
</template> </template>
</PageTitle> </PageTitle>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox tabBox_zdy"> <div class="tabBox tabBox_zdy">
<MyTable <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:tableData="pageData.tableData" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
:tableColumn="pageData.tableColumn" @chooseData="handleChooseData" :rowClassName="getRowClassName">
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
expand
@chooseData="handleChooseData"
:rowClassName="getRowClassName"
>
<template #expand="{ props }"> <template #expand="{ props }">
<Items :row="props" /> <Items :row="props" />
</template> </template>
@ -58,15 +52,31 @@
<template #xsd="{ row }"> <template #xsd="{ row }">
{{ row.xsd }}% {{ row.xsd }}%
</template> </template>
<template #yjLylx="{ row }"> <template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" /> <DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
</template> </template>
<template #czzt="{ row }"> <template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" /> <DictTag v-model:value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template> </template>
<template #yjJb="{ row }"> <template #yjJb="{ row }">
<DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" /> <DictTag v-model:value="row.yjJb" :options="D_BZ_YJJB" />
</template> </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 }"> <template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link> <el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
@ -74,16 +84,14 @@
<!-- <el-link type="primary" @click="showDetail(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="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 == '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-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</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="openBox(row)">详情</el-link>
<el-link type="primary" @click="pushWarning(row)">指派</el-link> <el-link type="primary" @click="pushWarning(row)">指派</el-link>
</template> </template>
</MyTable> </MyTable>
<Pages <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight"
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }"> :pageConfiger="{ ...pageData.pageConfiger, total: pageData.total }">
</Pages> </Pages>
</div> </div>
@ -93,7 +101,8 @@
<HolographicArchive v-model="assessShow" :dataList="dataList" /> <HolographicArchive v-model="assessShow" :dataList="dataList" />
<Information v-model="showDialog" title="发送指令" @submit='submitSendZl' @close='closeFszl'> <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> </Information>
<!-- 详情 --> <!-- 详情 -->
@ -101,9 +110,10 @@
<!-- 处置建议 --> <!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy> <Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<!-- 指派 --> <!-- 指派 -->
<ZpForm v-model="warningShow" :dataList="dataList"/> <ZpForm v-model="warningShow" :dataList="dataList" />
<!-- 反馈 --> <!-- 反馈 -->
<FkDialog @change="getList" /> <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> </template>
<script setup> <script setup>
@ -128,10 +138,15 @@ import Pages from "@/components/aboutTable/Pages.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue"; import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import Particulars from './components/particulars.vue'
const ORDIMG = 'https://89.40.7.122:38496/image' const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage' const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT,D_GS_QLZDRLX, D_BZ_YJJB, D_BZ_YJLYXT, D_BZ_YJLY, D_BZ_XB } = proxy.$dict("D_GSXT_YJXX_CZZT",'D_GS_QLZDRLX ', "D_BZ_YJJB", "D_BZ_YJLYXT", "D_BZ_YJLY", "D_BZ_XB") 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 searchBox = ref(); //搜索框
const roleCode = ref(false) const roleCode = ref(false)
const czjyRef = ref() const czjyRef = ref()
@ -142,15 +157,29 @@ const dataList = ref([])
const showDialog = ref(false)// 发送指令 const showDialog = ref(false)// 发送指令
const assessShow = ref(false)// 全息档案 const assessShow = ref(false)// 全息档案
const searchConfiger = ref( const searchConfiger = ref(
[ [
{ label: "车牌号", prop: 'yjClcph', showType: "input", placeholder: "请输入车牌号", }, { label: "布控开始时间", prop: 'bkkssj', showType: "date", placeholder: "请选择布控开始时间" },
{ label: "预警时间", prop: 'times', showType: "datetimerange" }, { label: "布控结束时间", prop: 'bkjssj', showType: "date", placeholder: "请选择布控结束时间" },
{ label: "状态", prop: 'czzt', placeholder: "请选择状态", showType: "select", options: D_GSXT_YJXX_CZZT }, { label: "预警时间", prop: 'startTime', showType: "datetimerange", placeholder: "请选择预警时间" },
{ label: "预警级别", prop: 'yjJb', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB }, { label: "预警级别", prop: 'yjJb', showType: "select", options: D_BZ_YJJB, placeholder: "请选择预警级别", multiple: true },
{ label: "细类", prop: 'yjbqmc', placeholder: "请输入细类", showType: "input" }, { label: "布控来源", prop: 'bkly', showType: "select", options: D_BZ_BKLYS, placeholder: "请选择布控来源" },
{ label: "活动发生地址", prop: 'yjDz', placeholder: "请输入活动发生地址", showType: "input" }, { label: "布控范围", prop: 'bkfw', showType: "input", placeholder: "请输入布控范围" },
{ label: "接收单位", prop: 'ssbmdm',showType: "department" }, { 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({ const pageData = reactive({
tableData: [], //表格数据 tableData: [], //表格数据
keyCount: 0, keyCount: 0,
@ -166,18 +195,23 @@ const pageData = reactive({
pageSize: 20, pageSize: 20,
pageCurrent: 1 pageCurrent: 1
}, //分页 }, //分页
controlsWidth: 250, //操作栏宽度 controlsWidth: 180, //操作栏宽度
tableColumn: [ tableColumn: [
{ label: "状态", prop: "czzt", showSolt: true },
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 100 }, { label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
{ label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true }, { label: "状态", prop: "czzt", showSolt: true, width: 80 },
{ label: "处置状态", prop: "czzt", showSolt: true }, { label: "车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "预警级别", prop: "yjJb", showSolt: true }, { label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true }, { label: "布控单位", prop: "gkbmmc", showOverflowTooltip: true },
{ label: "标题", prop: "yjBt" }, { label: "布控来源", prop: "bkly", showOverflowTooltip: true, showSolt: true },
{ label: "预警地址", prop: "yjDz", showOverflowTooltip: true }, { label: "布控范围", prop: "bkfw", showOverflowTooltip: true },
{ label: "接收单位", prop: "ssbm", 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: "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 addFromRefs = ref()
@ -189,11 +223,11 @@ const permission_sfqs = ref(false)
onMounted(() => { onMounted(() => {
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : '' 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 => { 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; roleCode.value = obj ? true : false;
@ -205,9 +239,10 @@ const onReset = () => {
listQuery.value.yjRyxm = '' listQuery.value.yjRyxm = ''
} }
const onSearch = (val) => { const onSearch = (val) => {
listQuery.value = { ...listQuery.value,...val }; listQuery.value = { ...listQuery.value, ...val };
listQuery.value.startTime = val.times ? val.times[0] : '' listQuery.value = { ...val, yjJb: val.yjJb?.join(',') || '' }
listQuery.value.endTime = val.times ? val.times[1] : '' listQuery.value.startTime = val.startTime ? val.startTime[0] : ''
listQuery.value.endTime = val.startTime ? val.startTime[1] : ''
getList() getList()
} }
@ -247,13 +282,13 @@ const getList = () => {
const remoteMethod = (query) => { const remoteMethod = (query) => {
if (!query) return opentions.value = []; if (!query) return opentions.value = [];
loading.value = true loading.value = true
tbGsxtZdrySelectList({ ryXm: query }).then(res => { tbGsxtZdrySelectList({ ryXm: query }).then(res => {
opentions.value = res || []; opentions.value = res || [];
loading.value = false; loading.value = false;
}).catch(() => { }).catch(() => {
loading.value = false loading.value = false
}) })
} }
// 根据预警级别设置行样式 // 根据预警级别设置行样式
@ -323,14 +358,14 @@ const exportExl = () => {
} }
const handleQs = () => { 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'); let wqs = selectRows.value.filter(item => item.czzt == '01');
if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" }); if (wqs.length == 0) return proxy.$message({ type: "warning", message: "数据都已签收,请选择未签收的数据" });
let yqs = selectRows.value.filter(item => item.czzt == '02'); let yqs = selectRows.value.filter(item => item.czzt == '02');
let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?' let texy = yqs.length > 0 ? `${yqs.length}条已签收预警数据,确认要签收${wqs.length}条未签收预警数据吗?` : '确认要签收所有预警数据吗?'
proxy.$confirm(texy, "警告", { type: "warning" }).then(() => { proxy.$confirm(texy, "警告", { type: "warning" }).then(() => {
let ids = wqs.map(item => item.id) 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: "成功" }); proxy.$message({ type: "success", message: "成功" });
getList(); getList();
}).catch(() => { }).catch(() => {
@ -341,7 +376,7 @@ const handleQs = () => {
// 全息档案跳转 // 全息档案跳转
const pushAssess = (val) => { const pushAssess = (val) => {
return holographicProfileJump(val.yjLx,val) return holographicProfileJump(val.yjLx, val)
} }
const showDetail = (item) => { const showDetail = (item) => {
@ -375,6 +410,16 @@ const pushWarning = (val) => {
warningShow.value = true warningShow.value = true
dataList.value = val; dataList.value = val;
} }
// 详情
const particularsShow = ref(false)
const dataPres = ref()
const openBox = (val) => {
particularsShow.value = true
dataPres.value = val
}
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290; pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 290;
@ -384,11 +429,19 @@ const tabHeightFn = () => {
}; };
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.el-loading-mask { .el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important; 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 { .warning-level-01 {
background-color: rgba(255, 2, 2, 0.1) !important; background-color: rgba(255, 2, 2, 0.1) !important;
@ -430,7 +483,7 @@ const tabHeightFn = () => {
background-color: transparent !important; background-color: transparent !important;
} }
.tabBox_zdy{ .tabBox_zdy {
.el-table--fit { .el-table--fit {
overflow: unset !important; overflow: unset !important;
} }