Compare commits

...

2 Commits

Author SHA1 Message Date
lcw
18b09bcc2a lcw 2026-01-20 17:07:25 +08:00
lcw
96283c3a0e lcw 2026-01-20 17:06:37 +08:00
35 changed files with 4304 additions and 419 deletions

View File

@ -47,3 +47,57 @@ export const xsasjxsajqxajqk = (params) => {
params
})
}
// /asj/xzaj/ztgs 治安案件区域分析
export const xsasjxsajztgs = (params) => {
return request({
url: api + `/asj/xzaj/ztgs`,
method: "get",
params
})
}
// /asj/xzaj/ccajlbfx 治安案件类别分析
export const xsasjxsajccajlbfx = (params) => {
return request({
url: api + `/asj/xzaj/ccajlbfx`,
method: "get",
params
})
}
// /asj/xzaj/ajxsfx 治安案件线索分析
export const xsasjxsajajxsfx = (params) => {
return request({
url: api + `/asj/xzaj/ajxsfx`,
method: "get",
params
})
}
export const xsasjxsajxsfx = (params) => {
return request({
url: api + `/asj/xzaj/xsfx`,
method: "get",
params
})
}
export const xsasjxsajnldtj = (params) => {
return request({
url: api + `/asj/xzaj/nldtj`,
method: "get",
params
})
}
export const xsasjxsajajfsqy = (params) => {
return request({
url: api + `/asj/xzaj/ajfsqy`,
method: "get",
params
})
}
// /asj/xzaj/ajdyfx 治安案件发生区域分析
export const xsasjxsajajdyfx = (params) => {
return request({
url: api + `/asj/xzaj/ajdyfx`,
method: "get",
params
})
}

View File

@ -33,9 +33,9 @@ const chooseMarksVisible = ref(false)
const emit = defineEmits(['change'])
const listQuery = ref({})
const formData = ref([
{ label: "身份证号", prop: "rySfzh", type: "input" ,width:'45%'},
{ label: "人员姓名", prop: "ryXm", type: "input" ,width:'45%'},
{ label: "性别", prop: "ryXb", type: "select" ,width:'45%',options:D_BZ_XB},
{ label: "身份证号", prop: "rySfzh", type: "input" ,width:'45%'},
{ label: "手机号码", prop: "ryLxdh", type: "input",width:'45%' },
{ label: "户籍地址", prop: "hjdXz", type: "input", width: '100%' },
{ label: "户籍地派出所", prop: "hjdpcsdm", depMc: 'hjdpcs', type: "department", width: '48%' },
@ -49,11 +49,13 @@ const formData = ref([
])
const rules = reactive({
// fjZp: [{ required: true, message: "请上传人员照片", trigger: "blur" }],
ryXm: [{ required: true, message: "请输入姓名", trigger: "blur" }],
rySfzh: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
ryXb: [{ required: true, message: "请选择性别", trigger: "change" }],
yjdj: [{ required: true, message: "请选择预警等级", trigger: "change" }],
ssbmdm:[{ required: true, message: "请选择所属部门", trigger: "change" }]
fjZp: [{ required: true, message: "人员照片", trigger: "blur" }],
// ryXm: [{ required: true, message: "请输入姓名", trigger: "blur" }],
// ryXb: [{ required: true, message: "请选择性别", trigger: "change" }],
// yjdj: [{ required: true, message: "请选择预警等级", trigger: "change" }],
// ssbmdm:[{ required: true, message: "请选择所属部门", trigger: "change" }]
// ryLxdh: [{ required: true, message: "请输入手机号码", trigger: "blur" }],
// hjdXz: [{ required: true, message: "请输入户籍地", trigger: "blur" }],
// xzdXz: [{ required: true, message: "请输入现居住地址", trigger: "blur" }],

View File

@ -1,75 +1,37 @@
<template>
<div v-loading="loadingPage" class="pageSearch searchBox" :style="`margin-bottom: ${marginBottom}px;background-color: ${backgroundColor}`">
<div style="padding: 0" v-loading="loadingPage" class="pageSearch searchBox"
:style="`margin-bottom: ${marginBottom}px;background-color: ${backgroundColor}`">
<div class="filter-title">
<span class="filter-label"><el-icon><Filter /></el-icon>筛选条件</span>
</div>
<div class="box">
<div v-for="(item, index) in getArr" :key="index" class="item">
<div class="label" v-if="item.label">{{ item.label }}</div>
<!-- select -->
<el-select
v-if="item.showType === 'select'"
v-model="searchObj[item.prop]"
:multiple="item.multiple"
:clearable="item.clearable"
:filterable="item.filterable"
:placeholder="item.placeholder"
collapse-tags
collapse-tags-tooltip
>
<el-option
v-for="obj in getOptions[item.prop]"
:key="obj.value"
:label="obj.label || obj.lable"
:value="obj.value"
/>
<el-select v-if="item.showType === 'select'" v-model="searchObj[item.prop]" :multiple="item.multiple"
:clearable="item.clearable" :filterable="item.filterable" :placeholder="item.placeholder" collapse-tags
collapse-tags-tooltip>
<el-option v-for="obj in getOptions[item.prop]" :key="obj.value" :label="obj.label || obj.lable"
:value="obj.value" />
</el-select>
<!-- input -->
<el-input
v-else-if="item.showType === 'input'"
class="input"
v-model="searchObj[item.prop]"
:clearable="item.clearable"
:placeholder="item.placeholder"
/>
<el-input v-else-if="item.showType === 'input'" class="input" v-model="searchObj[item.prop]"
:clearable="item.clearable" :placeholder="item.placeholder" />
<!-- 日期段选择器 -->
<el-date-picker
v-else-if="item.showType === 'daterange'"
v-model="searchObj[item.prop]"
type="daterange"
unlink-panels
:range-separator="item.rangeSeparator"
:start-placeholder="item.startPlaceholder"
:end-placeholder="item.endPlaceholder"
:shortcuts="item.shortcuts"
:disabledDate="disabledDate"
value-format="YYYY-MM-DD"
/>
<el-date-picker
v-else-if="item.showType === 'datetimerange'"
v-model="searchObj[item.prop]"
type="datetimerange"
unlink-panels
:range-separator="item.rangeSeparator || ''"
:start-placeholder="item.startPlaceholder || '开始日期'"
:end-placeholder="item.endPlaceholder || '结束日期'"
:shortcuts="item.shortcuts"
value-format="YYYY-MM-DD HH:mm:ss"
/>
<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 v-else-if="item.showType === 'daterange'" v-model="searchObj[item.prop]" type="daterange"
unlink-panels :range-separator="item.rangeSeparator" :start-placeholder="item.startPlaceholder"
:end-placeholder="item.endPlaceholder" :shortcuts="item.shortcuts" :disabledDate="disabledDate"
value-format="YYYY-MM-DD" />
<el-date-picker v-else-if="item.showType === 'datetimerange'" v-model="searchObj[item.prop]"
type="datetimerange" unlink-panels :range-separator="item.rangeSeparator || ''"
:start-placeholder="item.startPlaceholder || '开始日期'" :end-placeholder="item.endPlaceholder || '结束日期'"
:shortcuts="item.shortcuts" value-format="YYYY-MM-DD HH:mm:ss" />
<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 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 -->
@ -78,60 +40,31 @@
</template>
<!-- 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="
">全选</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 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="
<el-radio-group v-else-if="item.showType === 'radio'" v-model="searchObj[item.prop]" @change="
(val) => {
handleRadioChange(val, item);
}
"
>
<el-radio
v-for="obj in item.options"
:key="obj.value"
:label="obj.value"
>{{ obj.label }}</el-radio
>
">
<el-radio v-for="obj in item.options" :key="obj.value" :label="obj.value">{{ obj.label }}</el-radio>
</el-radio-group>
<!-- 级联选择 -->
<el-cascader
v-else-if="item.showType === 'cascader'"
v-model="searchObj[item.prop]"
:props="item.props"
:show-all-levels="item.showAllLevels"
:clearable="item.clearable"
:options="getOptions[item.prop]"
:placeholder="item.placeholder"
/>
<el-cascader v-else-if="item.showType === 'cascader'" v-model="searchObj[item.prop]" :props="item.props"
:show-all-levels="item.showAllLevels" :clearable="item.clearable" :options="getOptions[item.prop]"
:placeholder="item.placeholder" />
<div v-if="item.showType === 'Slot'">
<slot :name="item.prop"></slot>
</div>
@ -242,6 +175,10 @@ const props = defineProps({
type: String,
default: "rgb(255, 255, 255, 1)"
},
bool: {
type: Boolean,
default: true
}
});
let loadingPage = ref(false);
const emit = defineEmits(["submit", "reset"]);
@ -532,14 +469,41 @@ watchEffect(() => {
<style lang="scss" scoped>
.pageSearch {
.filter-title {
display: flex;
align-items: center;
margin-bottom: 10px;
width: 100%;
background: linear-gradient(to right, #9ed7ff, #e6f0f8);
padding: 5px 15px;
.filter-label {
display: flex;
align-items: center;
font-weight: bold;
color: #000;
margin-right: 10px;
white-space: nowrap;
}
.filter-line {
flex: 1;
height: 1px;
background-color: #ccc;
}
}
.box {
padding: 0 15px;
display: flex;
flex-wrap: wrap;
.item {
display: flex;
margin-right: 12px;
margin-bottom: 15px;
}
.label {
margin: auto;
margin-right: 5px;
@ -549,7 +513,7 @@ watchEffect(() => {
}
}
::v-deep .el-date-editor .el-range-separator{
::v-deep .el-date-editor .el-range-separator {
color: #333;
}
</style>

View File

@ -590,6 +590,11 @@ const sendMessage = (gzlid) => {
qcckPost(promes, '/mosty-gsxt/ypbg/sjzl/updateBkgzl').then(res => {
console.log(res);
})
break;
case 'BQBK':
qcckPost(promes, '/mosty-gsxt/gsxt/bqbk/sendFqzl ').then(res => {
console.log(res);
})
break;
}
}

View File

@ -54,6 +54,12 @@ export const publicRoutes = [
name: "deploymentApproval",
component: () => import("@/views/backOfficeSystem/ApprovalInformation/deploycontrol/deploymentApproval.vue"),
},
// 标签布控审核
{
path: "/shym",
name: "shym",
component: () => import("@/views/backOfficeSystem/IntelligentControl/marksControl/components/shym.vue"),
},
// 布控审核信息
{
path: "/information",
@ -79,26 +85,26 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/fourColorManage/warningList/index"),
meta: {
title: "布控预警",
icon: "article"
icon: "article-create"
}
},
{
path: "/behaviorWarnings",
name: "behaviorWarnings",
meta: { title: "行为预警", icon: "article" },
meta: { title: "行为预警", icon: "article-create" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/behaviorWarning/index"),
},
{
path: "/identityWarnings",
name: "identityWarnings",
meta: { title: "身份预警", icon: "article" },
meta: { title: "身份预警", icon: "article-create" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/identityWarning/index"),
},
{
path: "/combinedWarnings",
name: "combinedWarnings",
meta: { title: "组合预警", icon: "article" },
meta: { title: "组合预警", icon: "article-create" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/combinedWarning/index"),
},
{
@ -107,7 +113,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/DeploymentDisposal/mpvPeo/index"),
meta: {
title: "重点人管理",
icon: "article"
icon: "article-create"
}
}, {
path: "/myControls",
@ -115,7 +121,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/IntelligentControl/myControl/index"),
meta: {
title: "我的布控",
icon: "article"
icon: "article-create"
}
}, {
path: "/DeploymentAreas",
@ -123,7 +129,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/IntelligentControl/DeploymentArea/index"),
meta: {
title: "布控区域",
icon: "article"
icon: "article-create"
}
},
{
@ -134,44 +140,44 @@ export const publicRoutes = [
{
path: "/FourColorWarning",
name: "FourColorWarning",
meta: { title: "预警中心", icon: "article" },
meta: { title: "预警中心", icon: "article-ranking" },
children: [
// {
// path: "/centerHome",
// name: "centerHome",
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/index"),
// meta: { title: "预警中心大屏", icon: "article" },
// meta: { title: "预警中心大屏", icon: "article-create" },
// },
// {
// path: "/warningBk",
// name: "warningBk",
// meta: { title: "布控预警", icon: "article" },
// meta: { title: "布控预警", icon: "article-create" },
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/warningBk/index"),
// },
{
path: "/fouColorWarning",
name: "fouColorWarning",
meta: { title: "预警数据整合", icon: "article" },
meta: { title: "预警数据整合", icon: "article-create" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/fouColorWarning/index"),
},
{
path: "/identityWarning",
name: "identityWarning",
meta: { title: "身份预警", icon: "article" },
meta: { title: "身份预警", icon: "article-create" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/identityWarning/index"),
},
{
path: "/behaviorWarning",
name: "behaviorWarning",
meta: { title: "行为预警", icon: "article" },
meta: { title: "行为预警", icon: "article-create" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/behaviorWarning/index"),
},
{
path: "/combinedWarning",
name: "combinedWarning",
meta: { title: "组合预警", icon: "article" },
meta: { title: "组合预警", icon: "article-create" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/combinedWarning/index"),
},
// {
@ -180,7 +186,7 @@ export const publicRoutes = [
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningList/index"),
// meta: {
// title: "布控预警",
// icon: "article"
// icon: "article-create"
// }
// },
{
@ -189,7 +195,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/fourColorManage/warningList/portraitWarning/index"),
meta: {
title: "人像预警",
icon: "article"
icon: "article-create"
}
},
@ -199,25 +205,31 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/fourColorManage/warningList/vehicleWarning/index"),
meta: {
title: "车辆预警",
icon: "article"
icon: "article-create"
}
},
{
path: "/controlWarning",
name: "controlWarning",
meta: { title: "布控预警", icon: "article" },
meta: { title: "布控预警", icon: "article-create" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/controlWarning/index"),
},
{
path: "/regionalControl",
name: "regionalControl",
meta: { title: "区域布控预警", icon: "article-create" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/regionalControl/index"),
},
// {
// path: "/fouColorWarning",
// name: "fouColorWarning",
// meta: { title: "四色预警", icon: "article" },
// meta: { title: "四色预警", icon: "article-create" },
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/fouColorWarning/index"),
// },
{
path: "/scoreRanking",
name: "scoreRanking",
meta: { title: "积分排名", icon: "article" },
meta: { title: "积分排名", icon: "article-create" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/scoreRanking/index"),
},
{
@ -235,7 +247,7 @@ export const publicRoutes = [
// {
// path: "/modelWarning",
// name: "modelWarning",
// meta: { title: "模型预警", icon: "article" },
// meta: { title: "模型预警", icon: "article-create" },
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/modelWarning/index"),
// },
@ -246,7 +258,7 @@ export const publicRoutes = [
{
path: "/IntelligentControl",
name: "IntelligentControl",
meta: { title: "智能布控", icon: "article" },
meta: { title: "智能布控", icon: "article-ranking" },
children: [
{
path: "/DeploymentArea",
@ -254,7 +266,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/IntelligentControl/DeploymentArea/index"),
meta: {
title: "布控区域",
icon: "article"
icon: "article-create"
}
},
{
@ -263,7 +275,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/IntelligentControl/myControl/index"),
meta: {
title: "常态布控",
icon: "article"
icon: "article-create"
}
},
{
@ -272,7 +284,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/IntelligentControl/myControl/index"),
meta: {
title: "临时布控",
icon: "article"
icon: "article-create"
}
},
{
@ -281,7 +293,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/IntelligentControl/marksControl/index"),
meta: {
title: "标签布控",
icon: "article"
icon: "article-create"
}
},
// {
@ -290,7 +302,7 @@ export const publicRoutes = [
// component: () => import("@/views/backOfficeSystem/IntelligentControl/DeploymentAudit/index"),
// meta: {
// title: "我的审核",
// icon: "article"
// icon: "article-create"
// }
// },
// {
@ -299,7 +311,7 @@ export const publicRoutes = [
// component: () => import("@/views/backOfficeSystem/IntelligentControl/ControlApproval/index"),
// meta: {
// title: "我的审批",
// icon: "article"
// icon: "article-create"
// }
// }
]
@ -307,36 +319,36 @@ export const publicRoutes = [
{
path: "/HumanIntelligence",
name: "HumanIntelligence",
meta: { title: "信息汇聚支撑", icon: "article" },
meta: { title: "信息汇聚支撑", icon: "article-ranking" },
children: [
{
path: "/InfoCollection",
name: "InfoCollection",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/infoCollection/index"),
meta: { title: "信息采集", icon: "article" },
meta: { title: "信息采集", icon: "article-create" },
},
{
path: "/InternalList",
name: "InternalList",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/listView/index"),
meta: { title: "内部列表", icon: "article", qbjbList: '02' },
meta: { title: "内部列表", icon: "article-create", qbjbList: '02' },
},
{
path: "/openSourceList",
name: "openSourceList",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/listView/index"),
meta: { title: "共享列表", icon: "article", qbjbList: '01' },
meta: { title: "共享列表", icon: "article-create", qbjbList: '01' },
}, {
path: "/socialInformationCrculated",
name: "changeTheClue",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/FollowLeads/index"),
meta: { title: "转线索列表", icon: "article" },
meta: { title: "转线索列表", icon: "article-create" },
},
{
path: "/socialInformationCrculatec",
name: "recombinantSynthesis",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/ConversionSynthesis/index"),
meta: { title: "转合成列表", icon: "article" },
meta: { title: "转合成列表", icon: "article-create" },
},
// {
// path: "/CollectPoints",
@ -344,7 +356,7 @@ export const publicRoutes = [
// component: () => import("@/views/backOfficeSystem/HumanIntelligence/CollectPoints/index"),
// meta: {
// title: "采集积分",
// icon: "article"
// icon: "article-create"
// }
// },
{
@ -353,7 +365,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/transferConsultationList/index.vue"),
meta: {
title: "转会商列表",
icon: "article"
icon: "article-create"
}
},
{
@ -362,7 +374,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/supplementReportList/index.vue"),
meta: {
title: "补充/续报列表",
icon: "article"
icon: "article-create"
}
},
{
@ -371,7 +383,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/integralList/index.vue"),
meta: {
title: "积分列表",
icon: "article"
icon: "article-create"
}
},
{
@ -380,7 +392,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/InformationReporting/index.vue"),
meta: {
title: "蜂群信息上报",
icon: "article"
icon: "article-create"
}
},
// {
@ -389,7 +401,7 @@ export const publicRoutes = [
// component: () => import("@/views/backOfficeSystem/MakeAcomment/index"),
// meta: {
// title: "情报评一评",
// icon: "article"
// icon: "article-create"
// }
// }
]
@ -397,7 +409,7 @@ export const publicRoutes = [
{
path: "/ResearchJudgment",
name: "ResearchJudgment",
meta: { title: "线索落核盯办", icon: "article" },
meta: { title: "线索落核盯办", icon: "article-ranking" },
children: [
{
path: "/DatAcquisition",
@ -405,7 +417,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/ResearchJudgment/DatAcquisition/index"),
meta: {
title: "线索数据采集",
icon: "article"
icon: "article-create"
}
},
@ -416,7 +428,7 @@ export const publicRoutes = [
// component: () => import("@/views/backOfficeSystem/ResearchJudgment/MoralAnalysis/index"),
// meta: {
// title: "情报语义分析",
// icon: "article"
// icon: "article-create"
// }
// },
{
@ -425,7 +437,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/ResearchJudgment/IntelligenceManagement/index"),
meta: {
title: "线索管理",
icon: "article"
icon: "article-create"
}
}, {
path: "/InstructionInformation",
@ -433,13 +445,13 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/ResearchJudgment/InformationFlows/InstructionInformation/index"),
meta: {
title: "线索下发管理",
icon: "article"
icon: "article-create"
}
},
// {
// path: "/InformationFlows",
// name: "InformationFlows",
// meta: { title: "情报流转", icon: "article" },
// meta: { title: "情报流转", icon: "article-create" },
// // redirect: "/InformationFlow",
// // children: [
@ -453,7 +465,7 @@ export const publicRoutes = [
{
path: "/ExcavationResearch",
name: "ExcavationResearch",
meta: { title: "重点人发掘", icon: "article" },
meta: { title: "重点人发掘", icon: "article-ranking" },
children: [
{
@ -465,7 +477,7 @@ export const publicRoutes = [
),
meta: {
title: "重点人员初步发掘",
icon: "article"
icon: "article-create"
}
},
{
@ -477,7 +489,7 @@ export const publicRoutes = [
),
meta: {
title: "重点人员深度发掘",
icon: "article"
icon: "article-create"
}
},
{
@ -489,7 +501,7 @@ export const publicRoutes = [
),
meta: {
title: "重点人员落地审核",
icon: "article"
icon: "article-create"
}
},
]
@ -500,7 +512,7 @@ export const publicRoutes = [
redirect: "/ResearchHome",
meta: {
title: "会商研判",
icon: "article"
icon: "article-ranking"
},
children: [
{
@ -509,7 +521,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/policeReport/index.vue"),
meta: {
title: "警情管理",
icon: "article"
icon: "article-create"
}
},
{
@ -518,7 +530,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/JudgmentHome/ResearchHome/index"),
meta: {
title: "智能研判",
icon: "article"
icon: "article-create"
}
},
{
@ -527,7 +539,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/JudgmentHome/dataReduction/index"),
meta: {
title: "数据整理",
icon: "article"
icon: "article-create"
}
},
// {
@ -536,7 +548,7 @@ export const publicRoutes = [
// component: () => import("@/views/backOfficeSystem/JudgmentHome/situationHome/index"),
// meta: {
// title: "战略研判",
// icon: "article"
// icon: "article-create"
// }
// },
// 后面写的研判
@ -546,7 +558,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/JudgmentHome/tacticalResearch/index.vue"),
meta: {
title: "战术研判",
icon: "article"
icon: "article-create"
}
},
{
@ -555,7 +567,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/JudgmentHome/strategicResearch/index.vue"),
meta: {
title: "战略研判",
icon: "article"
icon: "article-create"
}
},
{
@ -564,7 +576,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/JudgmentHome/judgmentCommand/index.vue"),
meta: {
title: "研判指令",
icon: "article"
icon: "article-create"
}
},
{
@ -573,7 +585,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/JudgmentHome/internalAuditor/index.vue"),
meta: {
title: "内部审核人员",
icon: "article"
icon: "article-create"
}
},
// {
@ -582,7 +594,7 @@ export const publicRoutes = [
// component: () => import("@/views/backOfficeSystem/AnalysisReport/index"),
// meta: {
// title: "研判报告",
// icon: "article"
// icon: "article-create"
// }
// },
{
@ -591,7 +603,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/JudgmentHome/MeetingRoom/index"),
meta: {
title: "网上会商室",
icon: "article"
icon: "article-create"
}
}
]
@ -602,7 +614,7 @@ export const publicRoutes = [
redirect: "/ResearchHome",
meta: {
title: "全域管控",
icon: "article"
icon: "article-ranking"
},
children: [
{
@ -611,7 +623,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/DeploymentDisposal/BaseLibrary/index"),
meta: {
title: "基础库",
icon: "article"
icon: "article-create"
}
},
{
@ -620,7 +632,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/DeploymentDisposal/mpvPeo/index"),
meta: {
title: "重点人管理",
icon: "article"
icon: "article-create"
}
},
{
@ -629,7 +641,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/DeploymentDisposal/mpvPeoSh/index"),
meta: {
title: "重点人审批",
icon: "article"
icon: "article-create"
}
},
{
@ -638,7 +650,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/DeploymentDisposal/mpvGroup/index"),
meta: {
title: "重点群体管理",
icon: "article"
icon: "article-create"
}
},
{
@ -647,7 +659,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/DeploymentDisposal/mpvGroupSh/index"),
meta: {
title: "重点群体审核",
icon: "article"
icon: "article-create"
}
},
{
@ -656,7 +668,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/DeploymentDisposal/mpvCar/index"),
meta: {
title: "重点车辆管理",
icon: "article"
icon: "article-create"
}
},
]
@ -664,7 +676,7 @@ export const publicRoutes = [
{
path: "/dataApplication",
name: "dataApplication",
meta: { title: "数据应用", icon: "article" },
meta: { title: "数据应用", icon: "article-ranking" },
children: [
{
path: "/IntegralCoefficient",
@ -675,7 +687,7 @@ export const publicRoutes = [
),
meta: {
title: "积分系数配置",
icon: "article"
icon: "article-create"
}
},
@ -688,7 +700,7 @@ export const publicRoutes = [
),
meta: {
title: "身份标签管理",
icon: "article"
icon: "article-create"
}
},
{
@ -700,7 +712,7 @@ export const publicRoutes = [
),
meta: {
title: "行为标签管理",
icon: "article"
icon: "article-create"
}
},
{
@ -712,7 +724,7 @@ export const publicRoutes = [
),
meta: {
title: "标签组合管理",
icon: "article"
icon: "article-create"
}
}, {
path: "/tsypHome",
@ -720,7 +732,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/JudgmentHome/tsypHome/index"),
meta: {
title: "模型管理",
icon: "article"
icon: "article-create"
}
},
@ -730,7 +742,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/HumanIntelligence/JobAppraisal/index"),
meta: {
title: "工作考核",
icon: "article"
icon: "article-create"
}
},
{
@ -739,7 +751,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/HumanIntelligence/fileTransfer/index"),
meta: {
title: "文件中转",
icon: "article"
icon: "article-create"
}
},
{
@ -748,7 +760,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/HumanIntelligence/fileOrientation/index"),
meta: {
title: "文件定向传输",
icon: "article"
icon: "article-create"
}
},
{
@ -757,7 +769,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/SemanticAnalysis/index.vue"),
meta: {
title: "语义分析",
icon: "article"
icon: "article-create"
}
},
{
@ -766,7 +778,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/ResearchJudgment/InformationFlows/ReportStatisticalAnalysis/index"),
meta: {
title: "情报统计分析",
icon: "article"
icon: "article-create"
}
},
{
@ -775,7 +787,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/ResearchJudgment/RecordsOperations/index"),
meta: {
title: "操作记录",
icon: "article"
icon: "article-create"
}
}
]
@ -785,7 +797,7 @@ export const publicRoutes = [
// name: "BasicManagement",
// meta: {
// title: "基础管理",
// icon: "article"
// icon: "article-create"
// },
// children: [
@ -798,7 +810,7 @@ export const publicRoutes = [
// // ),
// // meta: {
// // title: "布控监视",
// // icon: "article"
// // icon: "article-create"
// // }
// // },
// // {
@ -808,7 +820,7 @@ export const publicRoutes = [
// // import("@/views/backOfficeSystem/BasicManagement/experienceShare/index"),
// // meta: {
// // title: "经验分享",
// // icon: "article"
// // icon: "article-create"
// // }
// // },
@ -822,13 +834,13 @@ export const publicRoutes = [
component: () => import("@/views/forumPost/index.vue"),
meta: {
title: "情报论坛",
icon: "article"
icon: "article-ranking"
}
},
{
path: "/dataMonitor",
name: "dataMonitor",
meta: { title: "数据监控", icon: "article" },
meta: { title: "数据监控", icon: "article-ranking" },
children: [
{
path: "/resourceMonitoring",
@ -836,7 +848,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/dataMonitor/resourceMonitoring/index.vue"),
meta: {
title: "数据资源检测",
icon: "article"
icon: "article-create"
}
},
{
@ -845,7 +857,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/dataMonitor/onlineUserMonitoring/index.vue"),
meta: {
title: "在线用户监控",
icon: "article"
icon: "article-create"
}
}
]
@ -857,7 +869,7 @@ export const publicRoutes = [
// redirect: "/dict/index",
meta: {
title: "系统管理",
icon: "article"
icon: "article-ranking"
},
children: [
{
@ -866,7 +878,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/systemConfig/department-list/index"),
meta: {
title: "部门管理",
icon: "article-ranking"
icon: "article-create"
}
},
@ -877,7 +889,7 @@ export const publicRoutes = [
import("@/views/backOfficeSystem/systemConfig/user-list/index"),
meta: {
title: "用户管理",
icon: "article-ranking"
icon: "article-create"
}
},
{
@ -887,7 +899,7 @@ export const publicRoutes = [
import("@/views/backOfficeSystem/systemConfig/role-list/index"),
meta: {
title: "角色列表",
icon: "article-ranking"
icon: "article-create"
}
},
{
@ -897,7 +909,7 @@ export const publicRoutes = [
import("@/views/backOfficeSystem/systemConfig/menu-list/index"),
meta: {
title: "菜单管理",
icon: "article-ranking"
icon: "article-create"
}
},
@ -917,7 +929,7 @@ export const publicRoutes = [
import("@/views/backOfficeSystem/systemConfig/dict/index"),
meta: {
title: "字典列表",
icon: "article-ranking"
icon: "article-create"
}
},
@ -953,7 +965,7 @@ export const publicRoutes = [
),
meta: {
title: "系统配置",
icon: "article-ranking"
icon: "article-create"
}
}, {
path: "/calendar",
@ -961,7 +973,7 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/calendar/index.vue"),
meta: {
title: "敏感节点",
icon: "article"
icon: "article-create"
}
},
]
@ -971,14 +983,14 @@ export const publicRoutes = [
name: "rests",
meta: {
title: "其他",
icon: "article"
icon: "article-ranking"
},
children: [
{
path: "/CollectCrculate",
name: "CollectCrculate",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/CollectCrculate/index"),
meta: { title: "情报采集", icon: "article" },
meta: { title: "情报采集", icon: "article-create" },
}, {
path: "/RlStatisticalAnalysis",
name: "RlStatisticalAnalysis",
@ -988,7 +1000,7 @@ export const publicRoutes = [
),
meta: {
title: "上报统计分析",
icon: "article"
icon: "article-create"
}
},
@ -1001,7 +1013,7 @@ export const publicRoutes = [
),
meta: {
title: "上报任务调度",
icon: "article"
icon: "article-create"
}
},
{
@ -1013,7 +1025,7 @@ export const publicRoutes = [
),
meta: {
title: "力量建设管理",
icon: "article"
icon: "article-create"
}
},
{
@ -1022,7 +1034,34 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/ResearchJudgment/InformationFlows/StatisticalAnalysis/index"),
meta: {
title: "情报统计分析",
icon: "article"
icon: "article-create"
}
},
{
path: "/ysMyControl",
name: "ysMyControl",
component: () => import("@/views/backOfficeSystem/IntelligentControl/ysMyControl/index"),
meta: {
title: "常态布控",
icon: "article-create"
}
},
{
path: "/ysPrivateSurveillance",
name: "ysPrivateSurveillance",
component: () => import("@/views/backOfficeSystem/IntelligentControl/ysMyControl/index"),
meta: {
title: "临时布控",
icon: "article-create"
}
},
{
path: "/ysmarksControl",
name: "ysmarksControl",
component: () => import("@/views/backOfficeSystem/IntelligentControl/ysMarksControl/index"),
meta: {
title: "标签布控",
icon: "article-create"
}
},
// {
@ -1031,7 +1070,7 @@ export const publicRoutes = [
// component: () => import("@/views/backOfficeSystem/JudgmentHome/ResearchHome/index"),
// meta: {
// title: "战术研判",
// icon: "article"
// icon: "article-create"
// }
// },
// {
@ -1040,7 +1079,7 @@ export const publicRoutes = [
// component: () => import("@/views/backOfficeSystem/JudgmentHome/situationHome/index"),
// meta: {
// title: "战略研判",
// icon: "article"
// icon: "article-create"
// }
// },
]

View File

@ -8,83 +8,61 @@
</div>
</div>
<div class="form_cnt">
<FormMessage
ref="elform"
:disabled="disabled"
v-model="listQuery"
:formList="formData"
labelWidth="100px"
<FormMessage ref="elform" :disabled="disabled" v-model="listQuery" :formList="formData" labelWidth="100px"
:rules="rules">
<template #yjgz>
<div class="zdy-taf"></div>
<template #bqdlList>
<div @click="openBqdl" class="depBox" style="cursor: pointer;">
<el-tag class="ml4 mr4" v-for="(it, idx) in listQuery.bqdlList" :key="idx" closable
@close="deleDlbq(idx)">{{ it.bqMc }}</el-tag>
<span class="coolor" v-if="!listQuery.bqdlList || listQuery.bqdlList.length == 0">请选择标签大类</span>
</div>
</template>
<template #tjqy>
<div class="ww100">
<div class="ww100 flex align-center">
<div class="zdy-taf"></div>
<el-button type="primary">选择</el-button>
</div>
<div class="map relative">
<GdMap></GdMap>
</div>
<template #bqxlList>
<div @click="openBqxl" class="depBox" style="cursor: pointer;">
<el-tag class="ml4 mr4" v-for="(it, idx) in listQuery.bqxlList" :key="idx" closable
@close="deleXlbq(idx)">{{ it.bqMc }}</el-tag>
<span class="coolor" v-if="!listQuery.bqxlList || listQuery.bqxlList.length == 0">请选择标签小类</span>
</div>
</template>
</FormMessage>
</div>
</div>
<ChooseMarks v-model="chooseMarksVisible" @choosed="choosed" :roleIds="roleIds" />
<BqLb v-model="chooseBqdl" @choosed="choosedDlbq" :roleIds="dlIds" />
<MinBq v-model="chooseBqxl" @choosed="choosedXlbq" :roleIds="xlIds" />
</template>
<script setup>
import GdMap from "@/components/GdMap/index.vue";
import * as rule from "@/utils/rules.js";
import * as MOSTY from "@/components/MyComponents/index";
import ChooseMarks from "@/components/ChooseList/ChooseMarks/index.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, watch } from "vue";
import BqLb from "./index.vue"
import MinBq from "./minBq.vue"
const emit = defineEmits(["updateDate"]);
const props = defineProps({
dic: Object
});
const { proxy } = getCurrentInstance();
const roleIds = ref([]);
const chooseMarksVisible = ref(false);
const { D_GS_BQ_LB } = proxy.$dict("D_GS_BQ_LB");
const dialogForm = ref(false); //弹窗
const rules = reactive({
ryXm: [{ required: true, message: "请输入姓名", trigger: "blur" }],
...rule.identityCardRule({ validator: true },'rySfzh'), //身份证校验
...rule.identityCardRule({ validator: true }, 'rySfzh'), //身份证校验
...rule.phoneRule({ validator: true }, "ryLxdh"), // 是否必填 是否进行校验,
});
const obj = {
bqlist:[
{ label: "布控标签", value: "01" },
{ label: "历史标签", value: "02" },
{ label: "数据源", value: "03" },
],
sjy:[
{ label: "网吧", value: "01" },
{ label: "卡口", value: "02" },
{ label: "市综平台", value: "03" },
]
}
const listQuery = ref({}); //表单
const listQuery = ref({
bqdlList: [],
bqxlList: [],
}); //表单
const formData = ref([
{ label: "任务名称", prop: "rwmc", type: "input" },
{ label: "布控人电话", prop: "bkysDh", type: "input" },
{ label: "人员等级", prop: "ryJb", type: "input" },
{ label: "人员类型", prop: "ryJl", type: "input" },
{ label: "处置措施", prop: "czcs", type: "input" },
{ label: "布控事由", prop: "bksy", type: "input" },
{ label: "报警方式", prop: "bjfs", type: "input" },
{ label: "报警接收人", prop: "bjjsr", type: "input" },
{ label: "任务布控时限", prop: "rwBkzs", type: "datetimerange" },
{ label: "布控标签", prop: "bkbq", type: "select",options: obj.bqlist ,multiple:true},
{ label: "数据源", prop: "sjy", type: "select",options: obj.sjy },
{ label: "数据源", prop: "sjy", type: "select",options: obj.sjy },
{ label: "预警规则", prop: "yjgz", type: "slot" ,width:'100%'}, //选择多个标签
{ label: "添加区域", prop: "tjqy", type: "slot" ,width:'100%'}, //选择多个标签
{ label: "标签大类", prop: "bqdlList", type: "slot", width: '100%' }, //选择多个标签
{ label: "标签小类", prop: "bqxlList", type: "slot", width: '100%' },
{ label: "执法依据", prop: "zfyj", type: "textarea", width: '100%' }
]);
const loading = ref(false);
const elform = ref();
const title = ref("");
@ -93,9 +71,6 @@ const disabled = ref(false);
// 初始化数据
const init = (type, row) => {
dialogForm.value = true;
title.value = type == "add" ? "新增" : type == "detail" ? "详情" : "编辑";
disabled.value = type == "detail" ? true : false;
if (row) getDataById(row.id);
};
// 根据id查询详情
const getDataById = (id) => {
@ -108,22 +83,59 @@ const getDataById = (id) => {
// 提交
const submit = () => {
elform.value.submit((data) => {
const a = listQuery.value.bqdlList.map(item => {
return { bqdl: item.id, bqdm: item.bqDm, bqmc: item.bqMc, bqsm: item.bqSm, bqys: item.bqYs }
})
const b = listQuery.value.bqxlList.map(item => {
return { bqdl: listQuery.value.dlid, bqdm: item.bqDm, bqmc: item.bqMc, bqsm: item.bqSm, bqys: item.bqYs }
})
const promes = [...a, ...b]
// data.fjdz = data.fjdz?.join(",");
// let url = title.value == "新增" ? "/mosty-gsxt/tbGsxtZdcl/add" : "/mosty-gsxt/tbGsxtZdcl/update";
// let params = { ...data };
// loading.value = true;
// qcckPost(params, url).then(() => {
// loading.value = false;
// proxy.$message({ type: "success", message: title.value + "成功" });
// emit("updateDate");
// close();
// }).catch(() => {
// loading.value = false;
// });
let url = title.value == "新增" ? "/mosty-gsxt/gsxt/bqbk/saveList" : "/mosty-gsxt/tbGsxtZdcl/update";
loading.value = true;
qcckPost({list:promes}, url).then(() => {
loading.value = false;
proxy.$message({ type: "success", message: title.value + "成功" });
emit("updateDate");
close();
}).catch(() => {
loading.value = false;
});
});
};
//打卡大类弹窗
const chooseBqdl = ref(false)
const dlIds = ref()
const openBqdl = () => {
chooseBqdl.value = true
}
const choosedDlbq = (val) => {
listQuery.value.bqdlList = val
dlIds.value = val.map(item => item.id)
}
const deleDlbq = (val) => {
listQuery.value.bqdlList.splice(val, 1);
dlIds.value = listQuery.value.bqdlList.map(item => item.id);
}
// 打卡小类弹窗
const chooseBqxl = ref(false)
const xlIds = ref()
const openBqxl = () => {
chooseBqxl.value = true
}
const choosedXlbq = (val) => {
listQuery.value.dlid = val.bqDlid
listQuery.value.bqxlList = val.list
xlIds.value = val.list.map(item => item.id)
}
const deleXlbq = (val) => {
listQuery.value.bqxlList.splice(val, 1);
xlIds.value = listQuery.value.bqxlList.map(item => item.id);
}
// 关闭
const close = () => {
listQuery.value = {};
@ -151,27 +163,17 @@ defineExpose({ init });
.depBox {
border: 1px solid #e9e9e9;
width: 305px;
padding: 0 0 0 4px;
border-radius: 4px;
width: 100%;
::v-deep .el-input__inner {
border: none;
.coolor {
color: #d3d3d3;
}
::v-deep .el-cascader .el-input.is-focus .el-input__inner {
border-color: transparent !important;
}
::v-deep .el-input__inner:focus {
box-shadow: none;
}
::v-deep .el-input.is-disabled .el-input__inner {
border-color: transparent !important;
}
}
.zdy-taf{
.zdy-taf {
width: 100%;
width: 100%;
min-height: 32px;
@ -180,7 +182,8 @@ defineExpose({ init });
padding: 0px 5px;
box-sizing: border-box;
}
.map{
.map {
height: 520px;
margin-top: 10px;
}

View File

@ -0,0 +1,259 @@
<template>
<el-dialog
:title="titleValue"
width="1400px"
:model-value="modelValue"
append-to-body
@close="closed"
>
<div>
<el-form :model="listQuery" class="mosty-from-wrap" :inline="true">
<el-form-item label="标签名称">
<el-input
placeholder="请输入标签名称"
v-model="listQuery.bqMc"
clearable
></el-input>
</el-form-item>
<el-form-item>
<el-button type="success" @click="handleFilter">查询</el-button>
<el-button type="info" @click="reset"> 重置 </el-button>
</el-form-item>
</el-form>
<div
class="tabBox"
:class="props.Single ? 'tabBoxRadio' : ''"
:key="keyVal"
style="margin-top: 0px"
>
<el-table
ref="multipleUserRef"
@selection-change="handleSelectionChange"
:data="tableData"
v-loading="loading"
border
:row-key="keyid"
style="width: 100%"
height="450"
>
<el-table-column
type="selection"
width="55"
:reserve-selection="true"
/>
<el-table-column prop="bqMc" align="center" label="标签名称" />
<el-table-column prop="bqDm" align="center" label="标签代码" />
<el-table-column prop="bqDj" align="center" label="标签等级">
<template #default="{ row }">
<DictTag :tag="false" :value="row.bqDj" :options="D_GS_BQ_DJ" />
</template>
</el-table-column>
<el-table-column prop="bqYs" align="center" label="标签颜色">
<template #default="{ row }">
<DictTag :value="row.bqYs" :tag="false" :options="D_GS_SSYJ" />
</template>
</el-table-column>
</el-table>
</div>
<div class="fenye" :style="{ top: tableHeight + 'px' }">
<el-pagination
class="pagination"
@pageSize-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="listQuery.pageCurrent"
:page-sizes="[10, 20, 50, 100]"
:page-pageSize="listQuery.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
></el-pagination>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closed">取消</el-button>
<el-button type="primary" @click="onComfirm">确认</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { qcckGet } from "@/api/qcckApi.js";
import { defineProps, ref, getCurrentInstance, watch } 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 props = defineProps({
modelValue: {
type: Boolean,
default: false
},
titleValue: {
type: String,
default: "身份标签"
},
LeaderType: {
type: String,
default: ""
},
//是否单选
Single: {
type: Boolean,
default: false
},
roleIds: {
type: Array,
default: []
}
});
const loading = ref(false);
const total = ref(0);
const listQuery = ref({
pageCurrent: 1,
pageSize: 20
});
const keyVal = ref(0);
const multipleUserRef = ref(null);
const multipleSelectionUser = ref([]);
const tableData = ref([]);
const emits = defineEmits(["update:modelValue", "choosed"]);
const keyid = (row) => {
return row.id;
};
const closed = () => {
emits("update:modelValue", false);
};
const reset = () => {
listQuery.value = { pageCurrent: 1, pageSize: 20 };
getListData();
};
// 为用户分配角色
const onComfirm = () => {
const userList = multipleSelectionUser.value;
let list = [];
let listId = [];
userList.forEach((val) => {
if (listId.indexOf(val.id) == -1) {
list.push(val);
listId.push(val.id);
}
});
emits("choosed", list);
closed();
};
/**
* pageSize 改变触发
*/
const handleSizeChange = (currentSize) => {
listQuery.value.pageSize = currentSize;
getListData();
};
/**
* 页码改变触发
*/
const handleCurrentChange = (currentPage) => {
listQuery.value.pageCurrent = currentPage;
getListData();
};
const bqLb=ref('01')
const getListData = () => {
keyVal.value++;
loading.value = true;
const params = { ...listQuery.value, bqLb:bqLb.value,bqLx: "01" };
qcckGet(params, "/mosty-gsxt/tbGsxtBqgl/selectPage")
.then((res) => {
loading.value = false;
tableData.value = res.records || [];
total.value = res.total;
// 直接调用multipleUser 内部已处理延迟
multipleUser();
})
.catch(() => {
loading.value = false;
});
};
//列表回显 - 优化版,确保已选择数据正确回显
function multipleUser() {
// 确保表格引用和数据都存在
if (!multipleUserRef.value || !tableData.value || tableData.value.length === 0) {
return;
}
// 等待下一帧确保DOM更新完成
setTimeout(() => {
// 再次检查表格引用是否存在
if (!multipleUserRef.value) return;
// 先清除所有选中状态
multipleUserRef.value.clearSelection();
// 再根据roleIds重新设置选中状态
if (props.roleIds && Array.isArray(props.roleIds) && props.roleIds.length > 0) {
tableData.value.forEach((item) => {
// 使用严格比较确保ID类型匹配
if (props.roleIds.some((id) => String(id) === String(item.id))) {
multipleUserRef.value.toggleRowSelection(item, true);
}
});
}
}, 0);
}
const handleFilter = () => {
listQuery.value.pageCurrent = 1;
getListData();
};
const handleSelectionChange = (val) => {
if (props.Single) {
if (val.length > 1) {
let del_row = val.shift();
multipleUserRef.value.toggleRowSelection(del_row, false);
}
multipleSelectionUser.value = val;
} else {
multipleSelectionUser.value = val;
}
};
// 监听弹窗打开状态,打开时重新加载数据
watch(
() => props.modelValue,
(val) => {
if (val) {
handleFilter();
}
},
{ immediate: true }
);
// 监听roleIds变化确保数据回显正确
watch(
() => props.roleIds,
(newRoleIds) => {
// 使用setTimeout确保在表格数据加载完成后再进行选择
setTimeout(() => {
multipleUser();
}, 100);
},
{ deep: true }
);
</script>
<style lang="scss" scoped>
@import "@/assets/css/layout.scss";
@import "@/assets/css/element-plus.scss";
</style>
<style>
.tabBoxRadio .el-checkbox__inner {
border-radius: 50% !important;
}
.tabBoxRadio .el-table__header-wrapper .el-checkbox {
display: none;
}
</style>

View File

@ -0,0 +1,235 @@
<template>
<el-dialog :title="titleValue" width="1400px" :model-value="modelValue" append-to-body @close="closed">
<div>
<el-form :model="listQuery" class="mosty-from-wrap" :inline="true">
<el-form-item label="标签大类">
<el-select v-model="listQuery.bqDlId" placeholder="请选择标签大类" clearable>
<el-option v-for="item in DlList" :key="item.id" :label="item.bqMc" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="标签名称">
<el-input placeholder="请输入标签名称" v-model="listQuery.bqMc" clearable></el-input>
</el-form-item>
<el-form-item>
<el-button type="success" @click="handleFilter">查询</el-button>
<el-button type="info" @click="reset"> 重置 </el-button>
</el-form-item>
</el-form>
<div class="tabBox" :class="props.Single ? 'tabBoxRadio' : ''" :key="keyVal" style="margin-top: 0px">
<el-table ref="multipleUserRef" @selection-change="handleSelectionChange" :data="tableData" v-loading="loading"
border :row-key="keyid" style="width: 100%" height="450">
<el-table-column type="selection" width="55" :reserve-selection="true" />
<el-table-column prop="bqMc" align="center" label="标签名称" />
<el-table-column prop="bqDm" align="center" label="标签代码" />
<el-table-column prop="bqDj" align="center" label="标签等级">
<template #default="{ row }">
<DictTag :tag="false" :value="row.bqDj" :options="D_GS_BQ_DJ" />
</template>
</el-table-column>
<el-table-column prop="bqYs" align="center" label="标签颜色">
<template #default="{ row }">
<DictTag :value="row.bqYs" :tag="false" :options="D_GS_SSYJ" />
</template>
</el-table-column>
</el-table>
</div>
<div class="fenye" :style="{ top: tableHeight + 'px' }">
<el-pagination class="pagination" @pageSize-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page="listQuery.pageCurrent" :page-sizes="[10, 20, 50, 100]" :page-pageSize="listQuery.pageSize"
layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closed">取消</el-button>
<el-button type="primary" @click="onComfirm">确认</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { qcckGet } from "@/api/qcckApi.js";
import { defineProps, ref, getCurrentInstance, watch } 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 props = defineProps({
modelValue: {
type: Boolean,
default: false
},
titleValue: {
type: String,
default: "身份标签"
},
LeaderType: {
type: String,
default: ""
},
//是否单选
Single: {
type: Boolean,
default: false
},
roleIds: {
type: Array,
default: []
}
});
const loading = ref(false);
const total = ref(0);
const listQuery = ref({
pageCurrent: 1,
pageSize: 20
});
const keyVal = ref();
const multipleUserRef = ref(null);
const multipleSelectionUser = ref([]);
const tableData = ref([]);
const emits = defineEmits(["update:modelValue", "choosed"]);
const keyid = (row) => {
return row.id;
};
const closed = () => {
emits("update:modelValue", false);
};
const reset = () => {
listQuery.value = { pageCurrent: 1, pageSize: 20 };
getListData();
};
// 为用户分配角色
const onComfirm = () => {
const userList = multipleSelectionUser.value;
let list = [];
let listId = [];
userList.forEach((val) => {
if (listId.indexOf(val.id) == -1) {
list.push(val);
listId.push(val.id);
}
});
emits("choosed", { list, bqDlid: listQuery.value.bqDlId });
closed();
};
/**
* pageSize 改变触发
*/
const handleSizeChange = (currentSize) => {
listQuery.value.pageSize = currentSize;
getListData();
};
/**
* 页码改变触发
*/
const handleCurrentChange = (currentPage) => {
listQuery.value.pageCurrent = currentPage;
getListData();
};
const getListData = () => {
keyVal.value++;
loading.value = true;
const params = { ...listQuery.value, bqLb: '02', bqLx: "01" };
qcckGet(params, "/mosty-gsxt/tbGsxtBqgl/selectPage")
.then((res) => {
loading.value = false;
tableData.value = res.records || [];
total.value = res.total;
multipleUser();
})
.catch(() => {
loading.value = false;
});
};
const DlList = ref()
// 获取大类
const getDlBq = () => {
const params = { pageCurrent: 1, pageSize: 200, bqLb: '01', bqLx: "01" };
qcckGet(params, "/mosty-gsxt/tbGsxtBqgl/selectPage")
.then((res) => {
DlList.value = res.records || [];
listQuery.value.bqDlId = DlList.value[0].id
getListData()
})
}
//列表回显 - 优化版,确保已选择数据正确回显
function multipleUser() {
if (!multipleUserRef.value || !tableData.value || tableData.value.length === 0) {
return;
}
// 先清除所有选中状态
tableData.value.forEach((item) => {
multipleUserRef.value.toggleRowSelection(item, false);
});
// 再根据roleIds重新设置选中状态
if (props.roleIds && Array.isArray(props.roleIds) && props.roleIds.length > 0) {
tableData.value.forEach((item) => {
if (props.roleIds.some((id) => id == item.id)) {
multipleUserRef.value.toggleRowSelection(item, true);
}
});
}
}
const handleFilter = () => {
listQuery.value.pageCurrent = 1;
getListData();
};
const handleSelectionChange = (val) => {
if (props.Single) {
if (val.length > 1) {
let del_row = val.shift();
multipleUserRef.value.toggleRowSelection(del_row, false);
}
multipleSelectionUser.value = val;
} else {
multipleSelectionUser.value = val;
}
};
// 监听弹窗打开状态,打开时重新加载数据
watch(
() => props.modelValue,
(val) => {
if (val) {
getDlBq()
// handleFilter();
}
},
{ immediate: true }
);
// 监听roleIds变化确保数据回显正确
watch(
() => props.roleIds,
(newRoleIds) => {
// 使用setTimeout确保在表格数据加载完成后再进行选择
setTimeout(() => {
multipleUser();
}, 100);
},
{ deep: true }
);
</script>
<style lang="scss" scoped>
@import "@/assets/css/layout.scss";
@import "@/assets/css/element-plus.scss";
</style>
<style>
.tabBoxRadio .el-checkbox__inner {
border-radius: 50% !important;
}
.tabBoxRadio .el-table__header-wrapper .el-checkbox {
display: none;
}
</style>

View File

@ -0,0 +1,119 @@
<template>
<div class="information-container">
<h2 class="page-title">研判详情</h2>
<div class="info-section">
<div class="info-row">
<div class="info-item">
<span class="label">标签名称</span>
<span class="value">{{ detail.bqmc || '暂无' }}</span>
</div>
<div class="info-item">
<span class="label">标签代码</span>
<span class="value">
<span class="value">{{ detail.bqdm || '暂无' }}</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="label">标签颜色</span>
<span class="value">
<DictTag v-if="detail.bqys && D_GS_SSYJ" :tag="false" :value="detail.bqys" :options="D_GS_SSYJ" />
<span v-else>暂无</span>
</span>
</div>
<div class="info-item">
<span class="label">标签描述</span>
<span class="value">{{ detail.bqsm || '暂无' }}</span>
</div>
</div>
</div>
</div>
</template>
<script setup>
import DictTag from '@/components/DictTag/index.vue';
import { onMounted ,ref,getCurrentInstance} from 'vue';
import { useRoute } from 'vue-router'
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
const route = useRoute();
const { proxy } = getCurrentInstance();
const {D_GS_SSYJ}=proxy.$dict("D_GS_SSYJ");
const detail=ref({});
// 新增:存储用户提供的研判部门详情数据
onMounted(() => {
qcckGet({},`/mosty-gsxt/gsxt/bqbk/selectById/${route.query.id}`).then(res => {
detail.value=res;
})
});
</script>
<style lang="scss" scoped>
.information-container {
width: 100%;
padding: 20px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.page-title {
color: #303133;
font-size: 18px;
font-weight: bold;
margin-bottom: 20px;
padding-bottom: 10px;
border-bottom: 1px solid #e8e8e8;
}
.info-section {
width: 100%;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 15px;
}
.info-item {
flex: 1;
min-width: 300px;
margin-bottom: 10px;
display: flex;
align-items: flex-start;
}
.label {
font-weight: bold;
color: #606266;
margin-right: 12px;
width: 100px;
text-align: right;
line-height: 32px;
}
.value {
color: #303133;
flex: 1;
line-height: 32px;
word-break: break-word;
}
/* 新增:数据展示模块样式 */
.data-section {
margin-top: 30px;
padding-top: 20px;
border-top: 1px solid #e8e8e8;
}
.section-title {
color: #303133;
font-size: 16px;
font-weight: bold;
margin-bottom: 15px;
}
</style>

View File

@ -2,7 +2,7 @@
<div>
<div class="titleBox">
<PageTitle title="标签布控" >
<el-button type="primary" size="small" @click="handleItem('add', '')">
<el-button type="primary" size="small" @click="AddFrom('add', '')">
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon>
<span style="vertical-align: middle">新增</span>
</el-button>
@ -21,13 +21,14 @@
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="chooseData"
>
<template #bqys="{ row }">
<DictTag :tag="false" :value="row.bqys" :options="D_GS_SSYJ" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" size="small" @click="handleItem('edit',row)">编辑</el-link>
<el-link type="primary" size="small" @click="handleItem('detail',row)">详情</el-link>
<el-link type="danger" size="small" @click="handleItem('deleite',row)">删除</el-link>
<el-link type="primary" size="small" @click="createProcess(row)" v-if="row.shzt!= '03'">发起审批</el-link>
<el-link type="danger" size="small" @click="handleItem('deleite',row)" v-if="row.shzt == '03'">撤控</el-link>
</template>
</MyTable>
<Pages
@ -43,6 +44,8 @@
<!-- 新增 -->
<AddForm ref="addForm" @updateDate="getList"></AddForm>
</div>
<SubmissionProcess v-model="showSp" :data="rowData" :userData="{ ajmc: '布控审批', flowType: 'BQBK', modelName: '布控' }"
:path="fixedValue" @getList="getList" />
</template>
<script setup>
@ -51,19 +54,26 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import AddForm from './components/addForm.vue'
import SubmissionProcess from '@/components/flowPath/submissionProcess.vue'
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const { D_BZ_SF } = proxy.$dict("D_BZ_SF"); //获取字典数据
const {D_GS_SSYJ} = proxy.$dict("D_GS_SSYJ"); //获取字典数据
const searchBox = ref();
const addForm = ref()
const searchConfiger = ref([
{
label: "任务名称",
prop: "rwmc",
placeholder: "请输入任务名称",
label: "标签名称",
prop: "bqmc",
placeholder: "请输入标签名称",
showType: "input",
}, {
label: "时间",
prop: "startTime",
placeholder: "请输入时间",
showType: "datetimerange",
},
]);
const queryFrom = ref({});
const pageData = reactive({
@ -79,14 +89,13 @@ const pageData = reactive({
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 120, //操作栏宽度
controlsWidth: 240, //操作栏宽度
tableColumn: [
{ label: "任务名称", prop: "rwmc" },
{ label: "布控人电话", prop: "bkysDh" },
{ label: "人员等级", prop: "bkysDj" },
{ label: "处置措施", prop: "czcs" },
{ label: "布控事由", prop: "bksy" },
{ label: "布控标签", prop: "bqmc" },
{ label: "标签代码", prop: "bqdm" },
{ label: "标签颜色", prop: "bqys", showSolt: true },
{ label: "标签描述", prop: "bqsm" },
]
});
onMounted(() => {
@ -96,7 +105,11 @@ onMounted(() => {
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val };
queryFrom.value = {
...val,
startTime: val.startTime ? val.startTime[0] : '',
endTime: val.startTime ? val.startTime[1] : ''
};
pageData.pageConfiger.pageCurrent = 1;
getList();
};
@ -112,28 +125,53 @@ const changeSize = (val) => {
// 获取列表
const getList = () => {
// pageData.tableConfiger.loading = true;
// let data = {
// ...pageData.pageConfiger,
// ...queryFrom.value,
// };
// qcckGet(data, "/mosty-gsxt/tbGsxtBk/selectPage").then((res) => {
// pageData.tableData = res.records || [];
// pageData.total = res.total;
// pageData.tableConfiger.loading = false;
// }).catch(() => {
// pageData.tableConfiger.loading = false;
// });
pageData.tableConfiger.loading = true;
let data = {
...pageData.pageConfiger,
...queryFrom.value,
};
qcckGet(data, "/mosty-gsxt/gsxt/bqbk/getPageList").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
const AddFrom = () => {
addForm.value.init()
}
const handleItem = (type,row) => {
if(type == 'delete'){
proxy.$confirm('确认撤控吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
qcckPost({ ids: [row.id] }, "/mosty-gsxt/gsxt/bqbk/bqck").then((res) => {
proxy.$message({
message: '撤控成功',
type: 'success'
});
getList();
}else{
addForm.value.init(type,row);
}
}).catch(() => {
pageData.tableConfiger.loading = false;
});
})
};
// 固定值
const fixedValue = {
clueVerification: 'shym',
byMeansOf: 'gsxt/bqbk/callback ',
nobyMeansOf: 'gsxt/bqbk/callback ',
recycle: 'gsxt/bqbk/callback ',
}
const showSp = ref(false);
const rowData = ref()
const createProcess = (row) => {
showSp.value = true;
rowData.value = row
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 300;
@ -164,9 +202,9 @@ const tabHeightFn = () => {
background: none;
}
:deep(.el-table--fit) {
top: 52px !important;
}
// :deep(.el-table--fit) {
// top: 52px !important;
// }
.btns {
height: 52px;
padding: 10px;

View File

@ -14,7 +14,7 @@
label-position="left">
<div style="display: flex; align-items: center;margin-bottom: 10px;">
<el-radio-group v-model="listQuery.bkDx" size="large" fill="#6cf" @change="shangeDx">
<el-radio-button :label="item.dm" v-for="(item, index) in props.dic.D_GS_BK_DX" :key="index">{{
<el-radio-button :label="item.dm" v-for="(item, index) in props.dic.D_GS_BK_NEWDX" :key="index">{{
item.zdmc }}</el-radio-button>
</el-radio-group>
<el-button type="primary" @click="handleAddPeo" v-if="!disabled" style="margin-left: 10px;">
@ -53,20 +53,37 @@
</MyTable>
</div>
<div style="width: 100%;" class="mt25">
<el-form-item prop="bkSjKs" label="布控开始时间" label-width="120px">
<el-form-item prop="bkSjKs" label="布控开始时间">
<MOSTY.Date v-model="listQuery.bkSjKs" type="datetime" format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择布控开始时间" clearable />
</el-form-item>
<el-form-item prop="bkSjJs" label="布控结束时间" label-width="120px">
<el-form-item prop="bkSjJs" label="布控结束时间">
<MOSTY.Date v-model="listQuery.bkSjJs" type="datetime" format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择布控结束时间" clearable />
</el-form-item>
<el-form-item prop="czYq" label="处置要求" label-width="60px" style="width:18% ;">
<el-form-item prop="czYq" label="处置要求">
<MOSTY.Select v-model="listQuery.czYq" :dictEnum="props.dic.D_GS_BK_CZYQ" placeholder="请选择处置要求"
clearable />
</el-form-item>
<el-form-item prop="bkDj" label="布控等级" label-width="60px" style="width:18% ;">
<MOSTY.Select v-model="listQuery.bkDj" :dictEnum="props.dic.D_GS_BK_DJ" placeholder="请选择布控级别"
</div>
<div style="width: 100%;" class="mt10">
<el-form-item prop="bkDj" label="布控部门" v-if="props.name == 'myControl'">
<MOSTY.Select v-model="listQuery.bkDj" :dictEnum="props.dic.D_GS_SSYJ" placeholder="请选择布控级别"
clearable />
</el-form-item>
<el-form-item prop="bkDj" label="布控等级" v-else>
<MOSTY.Select v-model="listQuery.bkDj" :dictEnum="props.dic.D_BZ_JQDJ" placeholder="请选择布控级别"
clearable />
</el-form-item>
<el-form-item prop="bklylx" label="布控来源">
<MOSTY.Select v-model="listQuery.bklylx" :dictEnum="props.dic.D_BZ_BKLYS" placeholder="请选择布控来源"
clearable />
</el-form-item>
</div>
<div style="width: 100%;" class="mt10">
<el-form-item prop="zfyj" label="执法依据" style="width: 100%;">
<MOSTY.Other v-model="listQuery.zfyj" placeholder="请输入执法依据" type="textarea" style="width: 100%;"
clearable />
</el-form-item>
</div>
@ -88,7 +105,7 @@
<div class=" mapSearch flex">
<el-select v-model="hzfs" placeholder="请选择布控范围" clearable @change="qhhzfs">
<el-option label="区域选择" value="1"></el-option>
<el-option label="自定义范围" value="2"></el-option>
<!-- <el-option label="自定义范围" value="2"></el-option> -->
</el-select>
<el-select multiple style="margin-left: 10px;" v-model="bkqyList" placeholder="请选择布控范围" clearable
@change="hzfsChage" v-if="hzfs == '1'">
@ -97,17 +114,17 @@
}}</el-option>
</el-select>
<el-button type="primary" @click="drawQy" style="margin-left: 10px;" v-else>
<!-- <el-button type="primary" @click="drawQy" style="margin-left: 10px;" v-else>
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">自定义区域</span>
</el-button>
</el-button> -->
</div>
<div class="ww100 relative mb10"
<!-- <div class="ww100 relative mb10"
style="height: 60vh;border: 1px solid #dcdfe6;border-radius: 4px;overflow: hidden;">
<GdMap></GdMap>
</div>
</div> -->
</el-form>
</div>
</div>
@ -143,14 +160,14 @@ import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { tableColumnList, Zd } from '@/views/backOfficeSystem/ApprovalInformation/tableRow.js'
import emitter from "@/utils/eventBus.js";
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, nextTick, watch, onMounted } from "vue";
import { queryProcessNode, queryProcessNodeLog, queryProcess } from '@/api/spl'
import ApprovalEcho from "@/components/flowPath/ApprovalEcho.vue";
import { useRouter, useRoute } from 'vue-router'
import { setAddress } from '@/utils/tools.js'
import { tbGsxtBkId } from "@/api/commit.js";
const emit = defineEmits(["change"]);
const props = defineProps({
dic: Object
dic: Object,
name: String
});
const route = useRoute()
const elform = ref()
@ -222,7 +239,7 @@ const init = (type, row) => {
disabled.value = type == 'detail' ? true : false;
dialogForm.value = true;
if (row) tableDate.tableConfiger.haveControls = false;
Zd({ D_GS_BK_DJ: props.dic.D_GS_BK_DJ, BD_BK_CLYJBQ: props.dic.BD_BK_CLYJBQ })
Zd({ D_GS_SSYJ: props.dic.D_GS_SSYJ, BD_BK_CLYJBQ: props.dic.BD_BK_CLYJBQ })
get_bkqy_list(row)
};
@ -426,44 +443,44 @@ const close = () => {
// 选择身份证
const chooseVisible_SFZ = ref(false)
// 获取布控信息的工作流
const workflow = ref()
const getWorkflow = async (id) => {
const promes = {
processId: id
}
const proNode = await queryProcessNode(promes)
const proNodeLog = await queryProcessNodeLog(promes)
const process = await queryProcess(promes)
workflow.value = proNode.rows.map(item => {
const log = proNodeLog.rows.filter(items => item.nodeId == items.nodeId)
// const workflow = ref()
// const getWorkflow = async (id) => {
// const promes = {
// processId: id
// }
// const proNode = await queryProcessNode(promes)
// const proNodeLog = await queryProcessNodeLog(promes)
// const process = await queryProcess(promes)
// workflow.value = proNode.rows.map(item => {
// const log = proNodeLog.rows.filter(items => item.nodeId == items.nodeId)
if (item.eventType == '0') {
return {
...item,
log: {
userData: item.userData ? JSON.parse(item.userData) : JSON.parse(process.rows[0].processData).orgNameData,
userName: process.rows[0].userName,
xtLrsj: process.rows[0].xtLrsj,
processStatus: process.rows[0].processStatus,
}
}
} else {
return {
...item,
orgNameData: JSON.parse(log[0].userData),
log: log
}
}
})
// if (item.eventType == '0') {
// return {
// ...item,
// log: {
// userData: item.userData ? JSON.parse(item.userData) : JSON.parse(process.rows[0].processData).orgNameData,
// userName: process.rows[0].userName,
// xtLrsj: process.rows[0].xtLrsj,
// processStatus: process.rows[0].processStatus,
// }
// }
// } else {
// return {
// ...item,
// orgNameData: JSON.parse(log[0].userData),
// log: log
// }
// }
// })
};
const drawQy = () => {
emitter.emit("drawShape", {
flag: "select_point",
type: "polygon",
isclear: true
});
}
// };
// const drawQy = () => {
// emitter.emit("drawShape", {
// flag: "select_point",
// type: "polygon",
// isclear: true
// });
// }
const hzfs = ref('1')
const bkqyList = ref()
const qhhzfs = () => {

View File

@ -135,6 +135,9 @@ const rulesList = {
dh: [{ required: true, message: "请输入电话号码", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
},
'10': {
fjZp: [{ required: true, message: "请传人员照片", trigger: "blur" }],
}
}
watch(() => props.bkDx, (val, oldval) => {

View File

@ -20,10 +20,11 @@
<DictTag :tag="false" :value="row.bkZt" :options="D_GS_BK_ZT" />
</template>
<template #bkDj="{ row }">
<DictTag :tag="false" :value="row.bkDj" :options="D_GS_BK_DJ" />
<DictTag :tag="false" :value="row.bkDj" :options="D_GS_SSYJ" v-if="route.name=='myControl'" />
<DictTag :tag="false" :value="row.bkDj" :options="D_BZ_JQDJ" v-else/>
</template>
<template #bkDx="{ row }">
<DictTag :tag="false" :value="row.bkDx" :options="D_GS_BK_DX" />
<DictTag :tag="false" :value="row.bkDx" :options="D_GS_BK_NEWDX" />
</template>
<template #bkdxList="{ row }">
<span v-if="row.bkdxList"><span class="nowrap" v-for="(it, idx) in row.bkdxList" :key="idx">
@ -67,9 +68,9 @@
</div>
</div>
<!-- 布控类型 -->
<AddBkdx ref="addBkdxForm" @change="getList" :dic="{
D_GS_BK_DX, D_GS_BK_BKYS, D_BZ_XB, D_GS_BK_CZYQ,
D_GS_BK_DJ, BD_BK_CLYJBQ, D_GS_BK_CZJSDWLX, D_GS_BK_TJFS, D_GS_ZDR_YJDJ
<AddBkdx ref="addBkdxForm" @change="getList" :name="route.name" :dic="{
D_GS_BK_NEWDX, D_GS_BK_BKYS, D_BZ_XB, D_GS_BK_CZYQ,D_BZ_JQDJ,D_BZ_BKLYS,
D_GS_SSYJ, BD_BK_CLYJBQ, D_GS_BK_CZJSDWLX, D_GS_BK_TJFS, D_GS_ZDR_YJDJ,
}" />
<!-- 预警弹窗 -->
<YjDialog ref="warningkdxForm"></YjDialog>
@ -89,11 +90,15 @@ import SubmissionProcess from '@/components/flowPath/submissionProcess.vue'
import {tbGsxtBkQuash} from '@/api/zdr.js'
import { useRouter, useRoute } from 'vue-router'
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { rotate } from "ol/transform";
const router = useRouter()
const route = useRoute()
const { proxy } = getCurrentInstance();
const { D_GS_BK_BKYS, D_BZ_XB, D_GS_BK_SJLX, D_GS_BK_DJ, BD_BK_CLYJBQ, D_GS_ZDR_YJDJ,
D_GS_BK_DX, D_GS_BK_ZT, D_GS_BK_CZYQ, D_GS_BK_CZJSDWLX, D_GS_BK_TJFS } = proxy.$dict("D_GS_ZDR_YJDJ", "D_GS_BK_BKYS", "D_BZ_XB", "D_GS_BK_SJLX", "D_GS_BK_DJ", "D_GS_BK_DX", "D_GS_BK_ZT", "D_GS_BK_CZYQ", "D_GS_BK_CZJSDWLX", "D_GS_BK_TJFS", 'BD_BK_CLYJBQ'); //获取字典数据
const { D_GS_BK_BKYS, D_BZ_XB, D_GS_BK_SJLX, D_GS_SSYJ, BD_BK_CLYJBQ, D_GS_ZDR_YJDJ,
D_GS_BK_NEWDX, D_GS_BK_ZT, D_GS_BK_CZYQ, D_GS_BK_CZJSDWLX, D_GS_BK_TJFS,D_BZ_BKLYS,
D_BZ_JQDJ } = proxy.$dict("D_GS_ZDR_YJDJ", "D_GS_BK_BKYS", "D_BZ_XB", "D_GS_BK_SJLX",
"D_GS_SSYJ", "D_GS_BK_NEWDX", "D_GS_BK_ZT", "D_GS_BK_CZYQ", "D_GS_BK_CZJSDWLX", "D_GS_BK_TJFS",
'BD_BK_CLYJBQ', 'D_BZ_JQDJ',"D_BZ_BKLYS"); //获取字典数据
const addBkdxForm = ref(null); //布控对象组件
const warningkdxForm = ref(); //布控对象组件
const searchBox = ref(); //搜索框
@ -103,14 +108,14 @@ const searchConfiger = ref([
prop: "bkDj",
placeholder: "请选择布控等级",
showType: "select",
options: D_GS_BK_DJ
options: route.name == 'myControl' ? D_GS_SSYJ : D_BZ_JQDJ
},
{
label: "布控类型",
prop: "bkDx",
placeholder: "请选择布控类型",
showType: "select",
options: D_GS_BK_DX
options: D_GS_BK_NEWDX
},
{
label: "布控状态",
@ -119,6 +124,12 @@ const searchConfiger = ref([
showType: "select",
options: D_GS_BK_ZT
},
{
label: "布控时间",
prop: "startTime",
placeholder: "请选择布控时间",
showType: "datetimerange",
},
]);
const queryFrom = ref({});
const pageData = reactive({
@ -166,7 +177,11 @@ onMounted(() => {
// 搜索
const onSearch = (val) => {
queryFrom.value = { ...val };
queryFrom.value = {
...val,
startTime: val.startTime? val.startTime[0]: '',
endTime: val.startTime? val.startTime[1]: ''
};
pageData.pageConfiger.pageCurrent = 1;
getList();
};

View File

@ -0,0 +1,187 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">{{ title }}标签布控</span>
<div>
<el-button type="primary" size="small" v-if="!disabled" :loading="loading" @click="submit">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage
ref="elform"
:disabled="disabled"
v-model="listQuery"
:formList="formData"
labelWidth="100px"
:rules="rules">
<template #yjgz>
<div class="zdy-taf"></div>
</template>
<template #tjqy>
<div class="ww100">
<div class="ww100 flex align-center">
<div class="zdy-taf"></div>
<el-button type="primary">选择</el-button>
</div>
<div class="map relative">
<GdMap></GdMap>
</div>
</div>
</template>
</FormMessage>
</div>
</div>
<ChooseMarks v-model="chooseMarksVisible" @choosed="choosed" :roleIds="roleIds" />
</template>
<script setup>
import GdMap from "@/components/GdMap/index.vue";
import * as rule from "@/utils/rules.js";
import * as MOSTY from "@/components/MyComponents/index";
import ChooseMarks from "@/components/ChooseList/ChooseMarks/index.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, watch } from "vue";
const emit = defineEmits(["updateDate"]);
const props = defineProps({
dic: Object
});
const { proxy } = getCurrentInstance();
const roleIds = ref([]);
const chooseMarksVisible = ref(false);
const dialogForm = ref(false); //弹窗
const rules = reactive({
ryXm: [{ required: true, message: "请输入姓名", trigger: "blur" }],
...rule.identityCardRule({ validator: true },'rySfzh'), //身份证校验
...rule.phoneRule({ validator: true }, "ryLxdh"), // 是否必填 是否进行校验,
});
const obj = {
bqlist:[
{ label: "布控标签", value: "01" },
{ label: "历史标签", value: "02" },
{ label: "数据源", value: "03" },
],
sjy:[
{ label: "网吧", value: "01" },
{ label: "卡口", value: "02" },
{ label: "市综平台", value: "03" },
]
}
const listQuery = ref({}); //表单
const formData = ref([
{ label: "任务名称", prop: "rwmc", type: "input" },
{ label: "布控人电话", prop: "bkysDh", type: "input" },
{ label: "人员等级", prop: "ryJb", type: "input" },
{ label: "人员类型", prop: "ryJl", type: "input" },
{ label: "处置措施", prop: "czcs", type: "input" },
{ label: "布控事由", prop: "bksy", type: "input" },
{ label: "报警方式", prop: "bjfs", type: "input" },
{ label: "报警接收人", prop: "bjjsr", type: "input" },
{ label: "任务布控时限", prop: "rwBkzs", type: "datetimerange" },
{ label: "布控标签", prop: "bkbq", type: "select",options: obj.bqlist ,multiple:true},
{ label: "数据源", prop: "sjy", type: "select",options: obj.sjy },
{ label: "数据源", prop: "sjy", type: "select",options: obj.sjy },
{ label: "预警规则", prop: "yjgz", type: "slot" ,width:'100%'}, //选择多个标签
{ label: "添加区域", prop: "tjqy", type: "slot" ,width:'100%'}, //选择多个标签
]);
const loading = ref(false);
const elform = ref();
const title = ref("");
const disabled = ref(false);
// 初始化数据
const init = (type, row) => {
dialogForm.value = true;
title.value = type == "add" ? "新增" : type == "detail" ? "详情" : "编辑";
disabled.value = type == "detail" ? true : false;
if (row) getDataById(row.id);
};
// 根据id查询详情
const getDataById = (id) => {
// qcckGet({id}, "/mosty-gsxt/tbGsxtZdcl/selectByid").then((res) => {
// listQuery.value = res;
// listQuery.value.fjdz = listQuery.value.fjdz?.split(",");
// });
};
// 提交
const submit = () => {
elform.value.submit((data) => {
// data.fjdz = data.fjdz?.join(",");
// let url = title.value == "新增" ? "/mosty-gsxt/tbGsxtZdcl/add" : "/mosty-gsxt/tbGsxtZdcl/update";
// let params = { ...data };
// loading.value = true;
// qcckPost(params, url).then(() => {
// loading.value = false;
// proxy.$message({ type: "success", message: title.value + "成功" });
// emit("updateDate");
// close();
// }).catch(() => {
// loading.value = false;
// });
});
};
// 关闭
const close = () => {
listQuery.value = {};
dialogForm.value = false;
loading.value = false;
};
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep .el-tabs--card>.el-tabs__header .el-tabs__item.is-active {
color: #0072ff;
background: rgba(0, 114, 255, 0.3);
}
.boxlist {
width: calc(99% - 50px);
margin-top: 10px;
overflow: hidden;
}
.depBox {
border: 1px solid #e9e9e9;
width: 305px;
padding: 0 0 0 4px;
border-radius: 4px;
::v-deep .el-input__inner {
border: none;
}
::v-deep .el-cascader .el-input.is-focus .el-input__inner {
border-color: transparent !important;
}
::v-deep .el-input__inner:focus {
box-shadow: none;
}
::v-deep .el-input.is-disabled .el-input__inner {
border-color: transparent !important;
}
}
.zdy-taf{
width: 100%;
width: 100%;
min-height: 32px;
border: 1px solid #e9e9e9;
border-radius: 4px;
padding: 0px 5px;
box-sizing: border-box;
}
.map{
height: 520px;
margin-top: 10px;
}
</style>

View File

@ -0,0 +1,176 @@
<template>
<div>
<div class="titleBox">
<PageTitle title="标签布控" >
<el-button type="primary" size="small" @click="handleItem('add', '')">
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon>
<span style="vertical-align: middle">新增</span>
</el-button>
</PageTitle>
</div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch"></Search>
</div>
<!-- 表格 -->
<div class="tabBox">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="chooseData"
>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" size="small" @click="handleItem('edit',row)">编辑</el-link>
<el-link type="primary" size="small" @click="handleItem('detail',row)">详情</el-link>
<el-link type="danger" size="small" @click="handleItem('deleite',row)">删除</el-link>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight + 42"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
</div>
<!-- 新增 -->
<AddForm ref="addForm" @updateDate="getList"></AddForm>
</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 AddForm from './components/addForm.vue'
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const { D_BZ_SF } = proxy.$dict("D_BZ_SF"); //获取字典数据
const searchBox = ref();
const addForm = ref()
const searchConfiger = ref([
{
label: "任务名称",
prop: "rwmc",
placeholder: "请输入任务名称",
showType: "input",
},
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 120, //操作栏宽度
tableColumn: [
{ label: "任务名称", prop: "rwmc" },
{ label: "布控人电话", prop: "bkysDh" },
{ label: "人员等级", prop: "bkysDj" },
{ label: "处置措施", prop: "czcs" },
{ label: "布控事由", prop: "bksy" },
]
});
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;
// let data = {
// ...pageData.pageConfiger,
// ...queryFrom.value,
// };
// qcckGet(data, "/mosty-gsxt/tbGsxtBk/selectPage").then((res) => {
// pageData.tableData = res.records || [];
// pageData.total = res.total;
// pageData.tableConfiger.loading = false;
// }).catch(() => {
// pageData.tableConfiger.loading = false;
// });
};
const handleItem = (type,row) => {
if(type == 'delete'){
}else{
addForm.value.init(type,row);
}
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 300;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style lang="scss" scoped>
.main-nav {
padding: 16px;
background-color: #fff;
}
.sub-nav {
background-color: #fff;
padding: 0 16px;
}
:deep(.el-tabs__header) {
margin-bottom: 0;
}
:deep(.el-tabs__nav-wrap::after) {
height: 1px;
background: none;
}
:deep(.el-table--fit) {
top: 52px !important;
}
.btns {
height: 52px;
padding: 10px;
box-sizing: border-box;
}
</style>

View File

@ -0,0 +1,682 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">布控对象</span>
<div>
<el-button size="small" type="primary" v-if="!disabled" :loading="loading" @click="submit">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="flex">
<div :class="dataOrge.gzlid ? 'ww80' : 'ww100'">
<div class="form_cnt">
<el-form :model="listQuery" :rules="rules" :disabled="disabled" ref="elform" inline :label-width="100"
label-position="left">
<div style="display: flex; align-items: center;margin-bottom: 10px;">
<el-radio-group v-model="listQuery.bkDx" size="large" fill="#6cf" @change="shangeDx">
<el-radio-button :label="item.dm" v-for="(item, index) in props.dic.D_GS_BK_DX" :key="index">{{
item.zdmc }}</el-radio-button>
</el-radio-group>
<el-button type="primary" @click="handleAddPeo" v-if="!disabled" style="margin-left: 10px;">
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">新增</span>
</el-button>
</div>
<div class="relative ww100">
<MyTable :tableData="listQuery.bkdxList" :tableColumn="tableDate.tableColumn"
:tableHeight="tableDate.tableHeight" :key="tableDate.keyCount" :tableConfiger="tableDate.tableConfiger"
:controlsWidth="tableDate.controlsWidth">
<template #fjZp="{ row }">
<el-image :src="setAddress(row.fjZp)"></el-image>
</template>
<template #yjdj="{ row }">
<DictTag :tag="false" :value="row.yjdj" :options="props.dic.D_GS_ZDR_YJDJ" />
</template>
<template #yjbq="{ row }">
<DictTag :tag="false" :value="row.yjbq" :options="props.dic.BD_BK_CLYJBQ" />
</template>
<template #ryXb="{ row }">
<DictTag :tag="false" :value="row.ryXb" :options="props.dic.D_BZ_XB" />
</template>
<template #bqList="{ row }">
<span v-if="row.bqList">
<span v-for="(it, idx) in row.bqList" :key="idx"> {{ it.bqMc }}</span>
</span>
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary">查看档案</el-link>
<el-link type="danger" @click="deleteRow(row)">删除</el-link>
</template>
</MyTable>
</div>
<div style="width: 100%;" class="mt25">
<el-form-item prop="bkSjKs" label="布控开始时间" label-width="120px">
<MOSTY.Date v-model="listQuery.bkSjKs" type="datetime" format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择布控开始时间" clearable />
</el-form-item>
<el-form-item prop="bkSjJs" label="布控结束时间" label-width="120px">
<MOSTY.Date v-model="listQuery.bkSjJs" type="datetime" format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择布控结束时间" clearable />
</el-form-item>
<el-form-item prop="czYq" label="处置要求" label-width="60px" style="width:18% ;">
<MOSTY.Select v-model="listQuery.czYq" :dictEnum="props.dic.D_GS_BK_CZYQ" placeholder="请选择处置要求"
clearable />
</el-form-item>
<el-form-item prop="bkDj" label="布控等级" label-width="60px" style="width:18% ;">
<MOSTY.Select v-model="listQuery.bkDj" :dictEnum="props.dic.D_GS_SSYJ" placeholder="请选择布控级别"
clearable />
</el-form-item>
</div>
<div style="width: 100%;" class="mt10">
<el-form-item prop="bkSy" label="布控事由" style="width: 100%;">
<MOSTY.Other v-model="listQuery.bkSy" placeholder="请输入布控事由" type="textarea" style="width: 100%;"
clearable />
</el-form-item>
</div>
<div style="width: 100%;" class="mt10">
<el-form-item prop="bkfj" label="上传附件" style="width: 100%;">
<div>
<MOSTY.Upload :showBtn="true" :limit="10" :isImg="false" :isAll="true" v-model="listQuery.bkfj" />
<div>支持pngjpgpdf文件上传</div>
</div>
</el-form-item>
</div>
<div class="smallTitle">布控范围</div>
<div class=" mapSearch flex">
<el-select v-model="hzfs" placeholder="请选择布控范围" clearable @change="qhhzfs">
<el-option label="区域选择" value="1"></el-option>
<el-option label="自定义范围" value="2"></el-option>
</el-select>
<el-select multiple style="margin-left: 10px;" v-model="bkqyList" placeholder="请选择布控范围" clearable
@change="hzfsChage" v-if="hzfs == '1'">
<el-option :label="item.label" :value="item.value" v-for="(item, index) in bkqyArr" :key="index">{{
item.label
}}</el-option>
</el-select>
<el-button type="primary" @click="drawQy" style="margin-left: 10px;" v-else>
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">自定义区域</span>
</el-button>
</div>
<div class="ww100 relative mb10"
style="height: 60vh;border: 1px solid #dcdfe6;border-radius: 4px;overflow: hidden;">
<GdMap></GdMap>
</div>
</el-form>
</div>
</div>
<div class="ww20" v-if="dataOrge.gzlid">
<ApprovalEcho ref="approvalEcho" />
</div>
</div>
</div>
<!-- 选择布控人员 -->
<BkryDialod :modelValue="chooseVisible_RY" @update:modelValue="chooseVisible_RY = $event" @choosed="choosed"
@choosedAdd="choosedAdd" :roleIds="roleIds" />
<!-- 选择车辆布控 -->
<BkclDialod :modelValue="chooseVisible_CL" @update:modelValue="chooseVisible_CL = $event" @choosed="choosed"
@choosedAdd="choosedAdd" :roleIds="roleIds" />
<!-- 选择布控群体 -->
<BkqtDialod :modelValue="chooseVisible_QT" @update:modelValue="chooseVisible_QT = $event" @choosed="choosed"
:roleIds="roleIds" />
<BksfzDialod :modelValue="chooseVisible_SFZ" @update:modelValue="chooseVisible_SFZ = $event" @choosed="choosed"
:roleIds="roleIds" :bkDx="listQuery.bkDx" @choosedAdd="choosedAdd" />
</template>
<script setup>
import { getItem } from "@/utils/storage";
import BkryDialod from '@/components/ChooseList/ChooseZdr/index.vue';
import BkqtDialod from '@/components/ChooseList/ChooseQt/index.vue';
import BkclDialod from '@/components/ChooseList/ChooseCl/index.vue';
import BksfzDialod from './dolog/sfzLog.vue';
import GdMap from "@/components/GdMap/index.vue";
import * as MOSTY from "@/components/MyComponents/index";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { tableColumnList, Zd } from '@/views/backOfficeSystem/ApprovalInformation/tableRow.js'
import emitter from "@/utils/eventBus.js";
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, nextTick, watch, onMounted } from "vue";
import { queryProcessNode, queryProcessNodeLog, queryProcess } from '@/api/spl'
import ApprovalEcho from "@/components/flowPath/ApprovalEcho.vue";
import { useRouter, useRoute } from 'vue-router'
import { setAddress } from '@/utils/tools.js'
import { tbGsxtBkId } from "@/api/commit.js";
const emit = defineEmits(["change"]);
const props = defineProps({
dic: Object
});
const route = useRoute()
const elform = ref()
const roleIds = ref([]); //角色ID
const chooseVisible_RY = ref(false); //选择布控人员弹窗
const chooseVisible_QT = ref(false); //选择布控群体弹窗
const chooseVisible_CL = ref(false)
const bkqyArr = ref([]); //布控区域
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const loading = ref(false)
const addPerson = ref([]) //单独新增的数据
const listQuery = ref({
bkYz: '01',
bkdxList: [],
}); //表单数据
const rules = reactive({
bkBt: [{ required: true, message: "请输入布控标题", trigger: "blur" }],
bkDx: [{ required: true, message: "请选择布控对象", trigger: "change" }],
bkSjKs: [{ required: true, message: "请选择布控开始时间", trigger: "change" }],
bkSjJs: [{ required: true, message: "请选择布控结束时间", trigger: "change" }],
czJsdwdm: [{ required: true, message: "请选择处置接收单位", trigger: "change" }],
bkshrSsbmdm: [{ required: true, message: "请选择审核部门", trigger: "change" }],
bksprSsbmdm: [{ required: true, message: "请选择审批部门", trigger: "change" }],
})
let tableDate = reactive({
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 200, //操作栏宽度
tableColumn: [
{ label: "照片", prop: "fjZp", showSolt: true },
{ label: "姓名", prop: "ryXm" },
{ label: "性别", prop: "ryXb", showSolt: true },
{ label: "身份证号", prop: "rySfzh" },
{ label: "户籍地", prop: "ryHjd" },
{ label: "现居住地址", prop: "ryXjd" },
{ label: "手机号", prop: "rySjhm" },
{ label: "虚拟身份", prop: "qtXnsf" },
{ label: "车牌号", prop: "clCph" },
{ label: "车辆识别代码", prop: "clCjh" },
{ label: "特征描述", prop: "qtTzms" },
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
]
});
const title = ref('')
const disabled = ref(false)
// 初始化数据
const init = (type, row) => {
listQuery.value.bkfj = [];
if (type == 'add') {
tableDate.tableConfiger.haveControls = true;
disabled.value = false;
listQuery.value.bkfqrXm = getItem("USERNAME");
listQuery.value.bkfqrSfzh = getItem("idEntityCard");
listQuery.value.bkfqrSsbmmc = getItem("deptId")[0].deptName;;
listQuery.value.bkfqrSsbmdm = getItem("deptId")[0].deptCode;;
}
title.value = type == 'add' ? '新增' : type == 'detail' ? '详情' : '编辑';
disabled.value = type == 'detail' ? true : false;
dialogForm.value = true;
if (row) tableDate.tableConfiger.haveControls = false;
Zd({ D_GS_SSYJ: props.dic.D_GS_SSYJ, BD_BK_CLYJBQ: props.dic.BD_BK_CLYJBQ })
get_bkqy_list(row)
};
// 获取布控区域
const get_bkqy_list = (row) => {
qcckGet({}, '/mosty-gsxt/tbGsxtBkQy/selectList').then(res => {
let arr = res || [];
bkqyArr.value = arr.map(item => {
return { ...item, label: item.qymc, value: item.id }
})
if (row) getDataById(row.id);
})
}
const dataOrge = ref({})
const approvalEcho = ref()
watch(() => approvalEcho.value, (val) => {
if (val) {
approvalEcho.value.getWorkflow(dataOrge.value.gzlid)
}
}, { deep: true })
watch(() => approvalEcho.value, (val) => {
if (val) {
console.log(approvalEcho.value);
approvalEcho.value.getWorkflow(dataOrge.value.gzlid)
}
}, { deep: true })
const shangeDx = () => {
tableDate.tableColumn = tableColumnList[listQuery.value.bkDx]
listQuery.value.bkDxxx = '';
listQuery.value.bkdxList = [];
roleIds.value = [];
addPerson.value = []
}
// 删除数据
const deleteRow = (row) => {
roleIds.value = roleIds.value.filter(id => id != row.id);
addPerson.value = addPerson.value.filter(it => it.id != row.id);
listQuery.value.bkdxList = listQuery.value.bkdxList.filter(it => it.id != row.id);
}
// 单独新增的数据
const choosedAdd = (item) => {
let obj = {}
if (listQuery.value.bkDx !== '02') {
obj = { id: item.id, fjZp: item.fjZp, ryXm: item.ryXm, ryXb: item.ryXb, rySfzh: item.rySfzh, ryHjd: item.hjdXz, ryXjd: item.xzdXz, rySjhm: item.ryLxdh, qtXnsf: item.qtXnsf, clCjh: item.clCjh, clCph: item.clCph, qtTzms: item.qtTzms, bqList: item.bqList }
} else {
obj = {
clCph: item.hphm, clCjh: item.clCjh, clSyr: item.clSyr, clSyrsfzh: item.clSyrsfzh,
clYs: item.clYs, gxSsbmmc: item.gxSsbmmc, bqList: item.bqList
}
}
switch (listQuery.value.bkDx) {
default:
obj = { ...item }
break;
}
addPerson.value.push(obj);//缓存的数据
if (!listQuery.value.bkdxList) listQuery.value.bkdxList = [];
listQuery.value.bkdxList.unshift(obj);
console.log(listQuery.value.bkdxList);
}
// 选择重点人
const choosed = (val) => {
tableDate.tableColumn = tableColumnList[listQuery.value.bkDx]
if (listQuery.value.bkDx == '01') {// 人员
roleIds.value = val.map(it => it.id);
let arr = val.map(item => {
let bqArr = item.bqList || [];
let bqs = bqArr.map(v => {
return { bqZl: v.bqZl, bqId: v.bqId, bqLx: v.bqLx, bqLb: v.bqLb, bqMc: v.bqMc, bqDm: v.bqDm }
})
return {
id: item.id, fjZp: item.fjZp, ryXm: item.ryXm, ryXb: item.ryXb,
rySfzh: item.rySfzh, ryHjd: item.hjdXz, ryXjd: item.xzdXz,
rySjhm: item.ryLxdh, qtXnsf: item.qtXnsf, clCjh: item.clCjh,
clCph: item.clCph, qtTzms: item.qtTzms, bqList: bqs, yjdj: item.zdrYjdj, ssbmdm: item.zrSsbmdm
}
})
listQuery.value.bkdxList = [...addPerson.value, ...arr];
} else if (listQuery.value.bkDx == '03') {
roleIds.value = val.map(it => it.id);
let arr = val.map(item => {
return {
clCph: item.hphm, clCjh: item.clCjh, clSyr: item.clSyr, clSyrsfzh: item.clSyrsfzh,
clYs: item.clYs, gxSsbmmc: item.gxSsbmmc, yjbq: item.yjbq, yjdj: item.yjdj, ssbmdm: item.zrSsbmdm
}
})
listQuery.value.bkdxList = [...addPerson.value, ...arr];
}
else {// 群体
listQuery.value.bkDxxx = (val.map(it => it.id)).join(',');
let peolist = []
val.forEach(item => {
if (item.zdryList) peolist = peolist.concat(item.zdryList)
})
let brrPeo = peolist.map(item => {
let bqArr = item.bqList || [];
let bqs = bqArr.map(v => {
return { bqZl: v.bqZl, bqId: v.bqId, bqLx: v.bqLx, bqLb: v.bqLb, bqMc: v.bqMc, bqDm: v.bqDm }
})
return {
id: item.id, fjZp: item.fjZp, ryXm: item.ryXm, ryXb: item.ryXb,
rySfzh: item.rySfzh, ryHjd: item.hjdXz, ryXjd: item.xzdXz,
rySjhm: item.ryLxdh, qtXnsf: item.qtXnsf, clCjh: item.clCjh,
clCph: item.clCph, qtTzms: item.qtTzms, bqList: bqs,
yjdj: item.zdrYjdj, ssbmdm: item.zrSsbmdm
}
})
listQuery.value.bkdxList = brrPeo;
}
};
// 选择人员
const handleAddPeo = () => {
if (!listQuery.value.bkDx) return proxy.$message({ type: "warning", message: '请选择布控对象' });
switch (listQuery.value.bkDx) {
case '01':
chooseVisible_RY.value = true
break;
case '04':
case '05':
case '06':
case '07':
case '08':
case '09':
case '10':
chooseVisible_SFZ.value = true
break;
case '03':
chooseVisible_CL.value = true
break;
case '02':
chooseVisible_QT.value = true
break;
}
}
// 提交
const submit = () => {
elform.value.validate((validate) => {
if (!validate) return;
let bklx = ''
if (route.name == 'myControl') {
bklx = '01'
} else {
bklx = '02'
}
let params = { ...listQuery.value, bklx: bklx };
params.bkfj = params.bkfj ? params.bkfj.join(',') : '';
params.bkdxList = params.bkdxList ? params.bkdxList : [];
params.bkdxList.forEach(item => {
if (Array.isArray(item.fjZp)) {
item.fjZp = item.fjZp ? item.fjZp.join(',') : ''
} else {
item.fjZp = item.fjZp
}
})
loading.value = true;
let url = title.value == '新增' ? "/mosty-gsxt/tbGsxtBk/save" : "/mosty-gsxt/tbGsxtBk/update";
qcckPost(params, url).then((res) => {
proxy.$message({ type: "success", message: "布控成功" });
emit("change");
loading.value = false;
close();
}).catch(() => {
loading.value = false;
});
});
};
onMounted(() => {
emitter.on("coordString", (res) => {
listQuery.value.bkqyList = [{
pgis: res.coord[0],
}]
});
});
// 关闭
const close = () => {
listQuery.value = {};
dialogForm.value = false;
loading.value = false;
addPerson.value = [];
roleIds.value = []
dataOrge.value = {}
};
// 选择身份证
const chooseVisible_SFZ = ref(false)
// 获取布控信息的工作流
const workflow = ref()
const getWorkflow = async (id) => {
const promes = {
processId: id
}
const proNode = await queryProcessNode(promes)
const proNodeLog = await queryProcessNodeLog(promes)
const process = await queryProcess(promes)
workflow.value = proNode.rows.map(item => {
const log = proNodeLog.rows.filter(items => item.nodeId == items.nodeId)
if (item.eventType == '0') {
return {
...item,
log: {
userData: item.userData ? JSON.parse(item.userData) : JSON.parse(process.rows[0].processData).orgNameData,
userName: process.rows[0].userName,
xtLrsj: process.rows[0].xtLrsj,
processStatus: process.rows[0].processStatus,
}
}
} else {
return {
...item,
orgNameData: JSON.parse(log[0].userData),
log: log
}
}
})
};
const drawQy = () => {
emitter.emit("drawShape", {
flag: "select_point",
type: "polygon",
isclear: true
});
}
const hzfs = ref('1')
const bkqyList = ref()
const qhhzfs = () => {
listQuery.value.bkqyList = []
bkqyList.value = []
emitter.emit('removeBj')
emitter.emit('removeEara', "select_point")
}
const hzfsChage = (val) => {
const qyList = []
console.log(val);
listQuery.value.bkqyList = val.map((item, index) => {
const data = bkqyArr.value.filter(items => items.id == item)[0]
console.log(data);
if (data) {
qyList.push(data.pgis)
}
console.log(item);
return {
bkQyid: data.id,
pgis: data.pgis
}
})
setTimeout(() => {
changeXzqh(qyList)
}, 2000)
}
const changeXzqh = (val) => {
// 先移除已有的边界
emitter.emit('removeBj')
// 如果传入的是多个区域数据(二维数组)
const features = val.map((area, index) => ({
geometry: {
type: "Polygon",
coordinates: [area] // 确保格式正确
},
properties: {
},
type: "Feature"
}))
// 循环为每个区域创建单独的多边形,这样可以设置不同的样式
features.forEach((feature, index) => {
emitter.emit('setBoundarys', {
data: {
type: "FeatureCollection",
features: [feature]
},
color: '#cf1010',
fillColor: 'rgba(255, 255, 255,0)',
})
})
}
// 根据id获取详情
const getDataById = (id) => {
qcckGet({}, '/mosty-gsxt/tbGsxtBk/selectVoById/' + id).then(res => {
res.bkfj = res.ossList || [];
listQuery.value = res || {}
dataOrge.value = res
if (res.bkqyList) {
bkqyList.value = res.bkqyList ? res.bkqyList.map(v => {
{
if (v.bkQyid) {
hzfs.value = '1'
} else {
hzfs.value = '2'
}
return v.bkQyid
}
}) : [];
const data = res.bkqyList.map(item => {
return item.pgis
})
setTimeout(() => {
console.log(data);
changeXzqh(data)
// listQuery.value.bkDxxx = data.join(',')
}, 2000);
}
tableDate.tableColumn = tableColumnList[res.bkDx ? res.bkDx : '01']
})
}
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
.smallTitle {
width: 100%;
font-size: 15px;
line-height: 50px;
font-weight: 550;
color: #606266;
}
.mapSearch {
margin-bottom: 10px;
}
.dialog {
::v-deep .el-form-item--default {
margin: 0 1% 0 0 !important;
padding-bottom: 0 !important;
}
}
::v-deep .avatar-uploader {
display: flex;
}
::v-deep .el-upload--picture-card i {
width: 156px;
}
.depBox {
border: 1px solid #e9e9e9;
width: 305px;
padding: 0 0 0 4px;
border-radius: 4px;
::v-deep .el-input__inner {
border: none;
}
::v-deep .el-cascader .el-input.is-focus .el-input__inner {
border-color: transparent !important;
}
::v-deep .el-input__inner:focus {
box-shadow: none;
}
::v-deep .el-input.is-disabled .el-input__inner {
border-color: transparent !important;
}
}
/* 使用深度选择器覆盖子组件样式 */
::v-deep .el-step.is-vertical .el-step__title {
color: #000000 !important;
border-color: #000000 !important;
}
::v-deep .el-step__description {
padding: 0 !important;
}
::v-deep .el-step__description.is-wait {
color: #000000 !important;
border-color: #000000 !important;
}
.el-step__title.is-wait {
color: #000000 !important;
border-color: #000000 !important;
}
::v-deep .el-step__head.is-wait {
color: #000000 !important;
border-color: #000000 !important;
}
::v-deep .el-step__line {
background-color: #000000 !important;
}
.nodeBox {
width: 80%;
text-align: center;
line-height: 30px;
border-radius: 10px;
overflow: hidden;
background-color: aliceblue;
.nodeorgNameTg {
background-color: #1abe20;
}
.nameTag {
line-height: 30px;
padding: 0 10px;
}
.nodeorgNameDd {
background-color: #18a2dd;
}
.fontColor {
color: #1abe20;
}
.fontColorDd {
color: #18a2dd;
}
}
::v-deep .el-form-item__label {
padding: 0;
}
::v-deep .el-radio-button__inner {
color: #000 !important;
}
</style>

View File

@ -0,0 +1,185 @@
<template>
<el-dialog :model-value="modelValue" :destroy-on-close="true" title="新增布控" @close="close" :close-on-click-modal="false">
<FormMessage v-model="listQuery" :formList="formData" labelWidth="120px" ref="elform" :rules="rules">
<template #bqList>
<div class="marks pointer" @click="chooseMarksVisible = true">
<span style="color: rgb(175 178 184);padding-left: 10px;"
v-if="!listQuery.bqList || listQuery.bqList.length == 0">请选择标签</span>
<span v-else>
<el-tag @close.stop="closeTag(idx)" type="success" closable v-for="(it, idx) in listQuery.bqList"
:key="idx">{{ it.bqMc }}</el-tag>
</span>
</div>
</template>
</FormMessage>
<template #footer>
<div class="flex just-center">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="submitForm">确认</el-button>
</div>
</template>
</el-dialog>
<ChooseMarks v-model="chooseMarksVisible" @choosed="choosed" :roleIds="roleIds" />
</template>
<script setup>
import ChooseMarks from "@/components/ChooseList/ChooseMarks/index.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { reactive, ref, getCurrentInstance, watch } from 'vue';
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
bkDx: {
type: String,
default: '01'
}
})
const emits = defineEmits(["update:modelValue", "choosed", "choosedAdd"]);
const { proxy } = getCurrentInstance();
const { D_BZ_XB, D_GS_ZDR_YJDJ } = proxy.$dict("D_BZ_XB", "D_GS_ZDR_YJDJ"); // 获取字典数据
const elform = ref()
const roleIds = ref([])
const chooseMarksVisible = ref(false)
const listQuery = ref({})
const formData = ref()
const rules = ref()
const tableColumnList = {
'04': [
{ label: "身份证号", prop: "rySfzh", type: "input" },
{ label: "姓名", prop: "ryXm", type: "input", },
{ label: "性别", prop: "ryXb", type: "select", options: D_BZ_XB },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
],
'05': [
{ label: "车辆识别代码", prop: "clCjh", type: "input" },
{ label: "车牌号", prop: "clCph", type: "input", },
{ label: "姓名", prop: "ryXm", type: "input", },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
],
'06': [
{ label: "Mac地址", prop: "mac", type: "input" },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
],
'07': [
{ label: "IMEI", prop: "imei", type: "input" },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
],
'08': [
{ label: "IMSI", prop: "imsi", type: "input" },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
],
'09': [
{ label: "电话", prop: "rySjhm", type: "input" },
{ label: "姓名", prop: "ryXm", type: "input", },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "性别", prop: "ryXb", type: "select", options: D_BZ_XB },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
],
'10': [{ label: "姓名", prop: "ryXm", type: "input", },
{ label: "身份证号", prop: "rySfzh", type: "input" },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "性别", prop: "ryXb", type: "select", options: D_BZ_XB },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "人员照片", prop: "fjZp", type: "upload", width: '100%' },
],
}
const rulesList = {
'04': {
rySfzh: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
},
'03': {
fjZp: [{ required: true, message: "请选择附件", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
},
'05': {
clCjh: [{ required: true, message: "请输入车辆识别代码", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
},
'06': {
mac: [{ required: true, message: "请输入Mac地址", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
},
'07': {
imei: [{ required: true, message: "请输入IMEI", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
},
'08': {
imsi: [{ required: true, message: "请输入IMSI", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
},
'09': {
dh: [{ required: true, message: "请输入电话号码", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
}
}
watch(() => props.bkDx, (val, oldval) => {
formData.value = tableColumnList[val]
rules.value = rulesList[val]
}, { immediate: true })
// 选择标签
const choosed = (val) => {
listQuery.value.bqList = val.map(v => {
return { bqZl: v.bqLb, bqId: v.id, bqLx: v.bqLx, bqLb: v.bqLb, bqMc: v.bqMc, bqDm: v.bqDm }
});
roleIds.value = val.map(v => v.id)
}
// 删除数据
const closeTag = (idx) => {
listQuery.value.bqList.splice(idx, 1)
roleIds.value.splice(idx, 1)
}
const submitForm = () => {
elform.value.submit((val) => {
val.id = new Date().getTime()
emits('choosedAdd', val)
close()
})
}
const close = async () => {
roleIds.value = []
listQuery.value = {}
listQuery.value.fjZp = []
await emits("update:modelValue", false);
}
</script>
<style lang="scss" scoped>
.marks {
width: 100%;
min-height: 32px;
border: 1px solid #e9e9e9;
border-radius: 4px;
}
</style>

View File

@ -0,0 +1,120 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">预警详情</span>
<div>
<el-button @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<div class="left">
<div class="lh30">轨迹信息</div>
<div class="flex item mr15">
<img :src="person" alt="">
<div class="ml10">
<div>姓名张三51018319954544454</div>
<div>预警次数<span>6</span></div>
<div>预警来源布控预警</div>
<div>预警标签社区戒毒</div>
<div><span class="marks">轨迹上图</span></div>
</div>
</div>
<ul class="cntBox">
<li class="li-item" v-for="idx in 10" :key="idx">
<div class="mb10">预警时间2024-05-21 10:10:05</div>
<div class="item flex info">
<img :src="person" alt="" style="width:99px;height: 92px;">
<div class="ml10">预警内容预警内容:5月21日20.41.14人像抓拍数据测到 马志强(510502199506168718)出现在024000050迎库路大世界石梯人行道2L4-SPL</div>
</div>
</li>
</ul>
</div>
<div class="right">
<GdMap></GdMap>
</div>
</div>
</div>
</template>
<script setup>
import GdMap from "@/components/GdMap/index.vue";
import { ref, defineExpose,defineEmits } from "vue";
const emit = defineEmits(["change"]);
const props = defineProps({
dic: Object
});
const person = require('@/assets/images/person.png')
const dialogForm = ref(false); //弹窗
// 初始化数据
const init = (row) => {
dialogForm.value = true;
};
// 关闭
const close = () => {
dialogForm.value = false;
};
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
.form_cnt{
display: flex;
.left{
width: 400px;
height: 100%;
margin-right: 10px;
.item{
background: rgb(248, 248, 248);
padding: 4px;
}
.info{
padding: 10px;
box-sizing: border-box;
margin-left: 10px;
}
.marks{
font-size: 12px;
display: inline-block;
padding: 2px 6px;
background: #0072ff;
border-radius: 4px;
color: #fff;
}
.cntBox{
margin-top: 6px;
height: calc(100% - 140px);
overflow: hidden;
overflow-y: auto;
.li-item{
border-left:1px solid #0072ff ;
padding-left:10px;
box-sizing: border-box;
position: relative;
margin-left: 10px;
margin-right: 10px;
&::before{
position: absolute;
content: '';
top: 0;
left: -5px;
width: 10px;
height: 10px;
background: #0072ff;
border-radius: 50%;
}
}
}
}
.right{
position: relative;
width: calc(100% - 410px);
height: 100%;
}
}
</style>

View File

@ -0,0 +1,252 @@
<template>
<div>
<div class="titleBox">
<PageTitle :title=" route.meta.title ">
<el-button type="primary" @click="handleAdd('add', null)">发起布控</el-button>
</PageTitle>
</div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<!-- 按钮组 -->
<div class="content">
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #bkZt="{ row }">
<DictTag :tag="false" :value="row.bkZt" :options="D_GS_BK_ZT" />
</template>
<template #bkDj="{ row }">
<DictTag :tag="false" :value="row.bkDj" :options="D_GS_SSYJ" />
</template>
<template #bkDx="{ row }">
<DictTag :tag="false" :value="row.bkDx" :options="D_GS_BK_DX" />
</template>
<template #bkdxList="{ row }">
<span v-if="row.bkdxList"><span class="nowrap" v-for="(it, idx) in row.bkdxList" :key="idx">
{{ it.ryXm ? it.ryXm : it.imei ? it.imei : it.imsi ? it.imsi : '' }}
<!-- :it.ryXm?it.mac:it.imsi?it.imsi:'xxxx' -->
<span v-if="idx < row.bkdxList.length - 1"></span></span></span>
<span v-else>暂无</span>
</template>
<!-- <template #sjrs="{ row }">
<span v-if="row.bkdxList"> {{ row.bkdxList.length }} </span>
<span v-else>0</span>
</template> -->
<!-- <template #qyList="{ row }">
<span v-for="(it,idx) in row.qyList" :key="idx"> {{ it.qymc }} <span v-if="idx < row.qyList.length-1"></span></span>
</template> -->
<!-- <template #yjcs="{row}">
<span @click="openWarning(row)" style="color: #00ffff;" class="mr5 pointer">{{ row.yjcs || 0}}</span>
</template> -->
<!-- 操作 -->
<template #controls="{ row }">
<template v-if="!row.gzlid">
<el-link type="primary" v-if="['01', '03', '06'].includes(row.bkZt)" size="small"
@click="createProcess(row)">送审</el-link>
<el-link type="primary" size="small" @click="tbGsxtBkQuashList( row)" v-else>撤控</el-link>
<el-link type="primary" v-if="['01', '03', '06'].includes(row.bkZt)" size="small"
@click="handleAdd('edit', row)">编辑</el-link>
</template>
<!-- 审核通过后才有轨迹 -->
<el-link type="primary" size="small" @click="handleAdd('detail', row)">详情</el-link>
<el-link type="danger" size="small" @click="handleRow(row.id)"
v-if="['01', '03', '06'].includes(row.bkZt)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
</div>
<!-- 布控类型 -->
<AddBkdx ref="addBkdxForm" @change="getList" :dic="{
D_GS_BK_DX, D_GS_BK_BKYS, D_BZ_XB, D_GS_BK_CZYQ,
D_GS_SSYJ, BD_BK_CLYJBQ, D_GS_BK_CZJSDWLX, D_GS_BK_TJFS, D_GS_ZDR_YJDJ
}" />
<!-- 预警弹窗 -->
<YjDialog ref="warningkdxForm"></YjDialog>
<SubmissionProcess v-model="showSp" :data="rowData" :userData="{ ajmc: '布控审批', flowType: 'BKSP', modelName: '布控' }"
:path="fixedValue" @getList="getList" />
</template>
<script setup>
import AddBkdx from "./components/addBkdx.vue";
import YjDialog from "./components/yjDialog.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import SubmissionProcess from '@/components/flowPath/submissionProcess.vue'
import {tbGsxtBkQuash} from '@/api/zdr.js'
import { useRouter, useRoute } from 'vue-router'
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const router = useRouter()
const route = useRoute()
const { proxy } = getCurrentInstance();
const { D_GS_BK_BKYS, D_BZ_XB, D_GS_BK_SJLX, D_GS_SSYJ, BD_BK_CLYJBQ, D_GS_ZDR_YJDJ,
D_GS_BK_DX, D_GS_BK_ZT, D_GS_BK_CZYQ, D_GS_BK_CZJSDWLX, D_GS_BK_TJFS } = proxy.$dict("D_GS_ZDR_YJDJ", "D_GS_BK_BKYS", "D_BZ_XB", "D_GS_BK_SJLX", "D_GS_SSYJ", "D_GS_BK_DX", "D_GS_BK_ZT", "D_GS_BK_CZYQ", "D_GS_BK_CZJSDWLX", "D_GS_BK_TJFS", 'BD_BK_CLYJBQ'); //获取字典数据
const addBkdxForm = ref(null); //布控对象组件
const warningkdxForm = ref(); //布控对象组件
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{
label: "布控等级",
prop: "bkDj",
placeholder: "请选择布控等级",
showType: "select",
options: D_GS_SSYJ
},
{
label: "布控类型",
prop: "bkDx",
placeholder: "请选择布控类型",
showType: "select",
options: D_GS_BK_DX
},
{
label: "布控状态",
prop: "bkZt",
placeholder: "请选择布控状态",
showType: "select",
options: D_GS_BK_ZT
},
{
label: "布控时间",
prop: "startTime",
placeholder: "请选择布控时间",
showType: "datetimerange",
},
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null", //选择类型
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 250, //操作栏宽度
tableColumn: [
{ label: "布控对象", prop: "bkdxList", showSolt: true, showOverflowTooltip: true },
{ label: "布控类型", prop: "bkDx", showSolt: true, showOverflowTooltip: true },
{ label: "布控等级", prop: "bkDj", showSolt: true },
{ label: "开始时间", prop: "bkSjKs", showOverflowTooltip: true },
{ label: "结束时间", prop: "bkSjJs", showOverflowTooltip: true },
{ label: "申请人", prop: "bkfqrXm" },
{ label: "布控状态", prop: "bkZt", showSolt: true },
]
});
// 固定值
const fixedValue = {
clueVerification: 'deploymentApproval',
byMeansOf: 'tbGsxtBk/gsbkCallback',
nobyMeansOf: 'tbGsxtBk/gsbkCallback',
recycle: 'tbGsxtBk/gsbkCallback',
}
const showSp = ref(false);
const rowData = ref()
const createProcess = (row) => {
showSp.value = true;
rowData.value = row
}
onMounted(() => {
getList();
tabHeightFn();
});
// 搜索
const onSearch = (val) => {
queryFrom.value = {
...val,
startTime: val.startTime? val.startTime[0]: '',
endTime: val.startTime? val.startTime[1]: ''
};
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
// 获取列表
const getList = () => {
pageData.tableConfiger.loading = true;
let bklx = ''
console.log();
if (route.name == 'myControl') {
bklx = '01'
} else {
bklx = '02'
}
let data = {
...pageData.pageConfiger,
...queryFrom.value,
bkcxlx: '01',
bklx: bklx
};
qcckGet(data, "/mosty-gsxt/tbGsxtBk/selectPage").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
const handleAdd = (type, row) => {
addBkdxForm.value.init(type, row);
};
// 删除
const handleRow = (id) => {
proxy.$confirm("确定要删除?", "警告", { type: "warning" }).then(() => {
qcckDelete({}, "/mosty-gsxt/tbGsxtBk/" + id).then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
});
})
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 270;
window.onresize = function () {
tabHeightFn();
};
};
const tbGsxtBkQuashList = (item) => {
tbGsxtBkQuash({id:item.id}).then(res=>{
proxy.$message({ type: "success", message: "操作成功" });
getList();
})
}
</script>
<style lang="scss" scoped>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -0,0 +1,185 @@
<template>
<div style="height:100%;width:100%" :id="echartsId"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { onMounted, ref, reactive, defineProps, onUnmounted, watch, nextTick } from "vue";
const props = defineProps({
echartsId:{
type:String,
default:'barId'
},
data:{
type:Object,
default:{
title:'', // 图表标题
color:[], //['#EB00FF','#F57100']
list:[], //[{label:'总数',val:[80,70,60,50]}, {label:'已处置',val:[70,40,30,80]}, ]
xData:[] ,//['09-01','09-02','09-03','09-04']
labelColor:'#000', //横坐标颜色 - 纵坐标颜色 - 标题颜色
rotate:0, //横坐标旋转角度
interval:0, //横坐标间隔
isVertical:false,//是否竖排垂直展示
}
},
dataZoom:{
type:Boolean,
default:false
},
rotate:{
type:Number,
default:0
}
});
watch(()=>props.data,val=>{
nextTick(()=>{
init(val)
})
},{immediate:true,deep:true})
// 初始化
function init (val) {
let color = val.color;
let list = val.list
let series = list.map((item ,idx)=>{
return {
type: "bar",
name:item.label,
data:item.val,
itemStyle:{normal: { color: color[idx] }},
showSymbol:false,
barWidth: '30%', // 柱状图宽度
}
})
chartFn(series)
}
function chartFn(series) {
var myChart = echarts.init(document.getElementById(props.echartsId));
var option = {
title: {
text: props.data.title || '',
left: 'center',
textStyle: {
color: props.data.color[0] || "#000",
fontSize: 14
}
},
grid: {
top: "25%",
right: "0%",
left: "0%",
bottom: "0%", // 增加底部空间为两行X轴标签留出空间
containLabel: true
},
legend: {
data: props.data.list.map(v => { return v.label }),
textStyle: {
color: props.data.color[0] || "#409EFF",
fontSize: 12
},
right: "5%",
top: "10%"
},
tooltip: {
trigger: "axis",
axisPointer: {
type: 'shadow'
},
backgroundColor: "rgba(255,255,255,1)",
padding: [5, 10],
textStyle: { color: "#7588E4" },
extraCssText: "box-shadow: 0 0 5px rgba(0,0,0,0.3)"
},
xAxis: {
type: "category",
data: props.data.xData,
axisTick: { alignWithLabel: true },
axisLine: {
show: true,
lineStyle: {
color: props.data.color[0] || "#409EFF"
}
},
axisLabel: {
rotate: props.rotate, // 设置标签旋转角度
show: true,
color: props.data.color[0] || "#409EFF",
fontSize: 10,
interval: props.data.interval || 0, // 强制显示所有标签
formatter: function(value, index) {
// 组合显示数量和年龄范围,数量在上,范围在下
const bottomValues = props.data.bottomValues || [];
const bottomValue = bottomValues[index] || '';
return `${bottomValue}\n${value}`;
},
margin: 10 // 调整边距
}
},
yAxis: {
type: "value",
axisLabel: {
color: props.data.color[0] || "#409EFF",
fontSize: 10,
formatter: '{value}%' // 显示百分比
},
splitLine: {
show: true,
lineStyle: {
type: 'solid',
color: props.data.color[0] || "#409EFF"
}
},
axisTick: { show: false },
axisLine: {
show: true,
lineStyle: {
color: props.data.color[0] || "#409EFF"
}
}
},
series: series.map((item, index) => ({
...item,
label: {
show: true,
position: 'top',
formatter: function(params) {
// 显示顶部百分比标签
return `占比 ${params.value}%`;
},
color: props.data.color[0] || "#409EFF",
fontSize: 10
},
itemStyle: {
normal: {
color: item.itemStyle.normal.color
}
}
})),
// // 底部数值标签
// graphic: props.data.bottomValues ? props.data.bottomValues.map((value, idx) => {
// const percent = (idx + 0.5) / props.data.xData.length * 100;
// return {
// type: 'text',
// left: `${percent}%`,
// bottom: '5%', // 调整到底部显示在x轴标签下方
// style: {
// text: value,
// fill: '#000',
// fontSize: 12
// }
// };
// }) : []
};
option && myChart.setOption(option);
window.addEventListener('resize', function() {
myChart.resize();
})
}
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,70 @@
<template>
<div class="table-data">
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<tr style="text-align: center;font-size: 12pt;">
<th colspan="6">{{ title }}</th>
</tr>
<tr style="text-align: center;font-size: 12pt;font-weight: normal;">
<th v-if="lx == '0' || lx == '1'"></th>
<th v-for="item in titleList" :key="item">{{ item }}</th>
</tr>
<tr style="text-align: center;font-size: 12pt;font-family: 'Times New Roman';" v-for="value in condition"
:key="value">
<template v-if="lx == '0'">
<td>{{ value.tjlx }}</td>
<td>{{ value.ajsls }}</td>
<td>{{ value.ccs }}</td>
<td>{{ value.wfry }}</td>
</template>
<template v-if="lx == '1'">
<td>{{ value.tjlx }}</td>
<td>{{ value.rlggcx }}</td>
<td>{{ value.qhrsaq }}</td>
<td>{{ value.fhshglcx }}</td>
<td>{{ value.fhggaq }}</td>
</template>
<template v-if="lx == '2'">
<td>{{ value.ajlx }}</td>
<td>{{ value.sl }}</td>
<td>{{ value.zb }}</td>
</template>
<template v-if="lx == '3'">
<td>{{ value.afqy }}</td>
<td>{{ value.sl }}</td>
</template>
<template v-if="lx == '4'">
<td>{{ value.ssbm }}</td>
<td>{{ value.las }}</td>
<td>{{ value.pas }}</td>
<td>{{ value.ccl }}</td>
<td>{{ value.xyrs }}</td>
<td>{{ value.bz }}</td>
</template>
</tr>
</table>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
const props = defineProps({
title: {
type: String,
default: ''
},
listData: {
type: Array,
default: () => []
},
titleList: {
type: Array,
default: () => []
}, lx: {
type: String,
default: '0'
}
})
const condition = computed(() => {
const data = props.listData.map(item => item)
return data
})
</script>

View File

@ -0,0 +1,464 @@
<template>
<div class="report-container" ref="tableBox">
<div ref="ajReport">
<div class="main-title">{{ wdValue.date }}份全市治安案件形势分析</div>
<div class="section-title">治安案件总体概述</div>
<div class="body-text" v-if="wdValue.zaajZtgsList">
{{ wdValue.ym }}月份全市各级公安机关治安部门受理行政案件{{ wdValue.zaajZtgsList.ajsls }}查处案件{{ wdValue.zaajZtgsList.ccs }}查处率{{
wdValue.zaajZtgsList.ccl }}%查处违法人员{{ wdValue.zaajZtgsList.wfry }}
<TableData title="全市治安案件总体情况表" :listData="wdValue.zaajZtgsList.ztqk" :titleList="['受理治安案件数', '查处数', '查处违法人员数']"
lx="0" />
</div>
<div class="section-title">治安案件形势分析</div>
<div>
<div class="body-text" v-if="wdValue.zaajList.length > 0">
受理案件类别分析{{ wdValue.ym }}月受理的{{ wdValue.zaajZtgsList.ajsls }}起行政案件中<span
v-for="(item, index) in wdValue.zaajList" :key="index">{{ item.label }}{{ item.sy }}起环比{{ item.sySj }}{{
item.hb }}同比{{ item.bySj }}{{ item.tb }}<span v-if="index == wdValue.zaajList.length - 1"></span> <span
v-else></span></span>
<TableData title="全市治安案件总体情况表" :listData="wdValue.ajxsfxList"
:titleList="['扰乱公共秩序', '侵害人身安全和财产权利', '妨害社会管理秩序', '妨害公共安全']" lx="1" />
</div>
<div class="body-text">
查处案件类别分析{{ wdValue.ym }}月份的查处63起行政案件中<span v-for="(item, index) in wdValue.zaajFbqktj" :key="index">
{{ item.ajlx }}{{ item.sl }}占查处案件总数的{{ item.zb }}<span
v-if="index == wdValue.zaajFbqktj.length - 1"></span>
<span v-else></span></span>
<TableData title="全市查处主要治安案件情况" :listData="wdValue.zaajFbqktj" :titleList="['案件类型', '查处数', '占查处总数的百分比']"
lx="2" />
</div>
<div class="body-text">
查处违法犯罪人员年龄分析{{ wdValue.ym }}月份共查处违法人员{{ wdValue.nldtjOnj.ccxyr }}其中<span
v-for="value in wdValue.nldtjOnj.nldtj.data" :key="value.agegroup">
{{ value.agegroup }} {{ value.count }}占查处违法人员总数的{{ value.zb }}<span
v-if="index == wdValue.nldtjOnj.nldtj.data.length - 1"></span><span v-else></span>
</span>
</div>
<div style="height:250px; width:280px;margin: 0 auto;">
<bar v-if="wdValue.nldtjOnj.nldtj" :echartsId="'myBarChart'" :data="{
title: '图一',
color: ['#FF6B6B'],
...wdValue.nldtjOnj.nldtj
}" />
</div>
<div class="body-text">
案件发生区域分析{{wdValue.sajajfsqy.qyfx }}
<TableData title="受理治安案件发生区域" :listData="wdValue.sajajfsqy.xxsj" :titleList="['案件发生区域', '案件数量']" lx="3" />
</div>
<div class="body-text">
治安案件地域分析{{ wdValue.ym }}月份全市治安案件平均查处率为{{ wdValue.zaajZtgsList.ccl }}%<span v-if="parseFloat(wdValue.zaajZtgsList.ccl) > 0"> <span v-for="value in wdValue.jxsajajdyfx.greaterThan" :key="value.ssbm">{{ value.ssbm }}、</span>查处率高,分别为<span v-for="value in wdValue.jxsajajdyfx.lessThan" :key="value.ssbm">{{ value.ccl }}</span><span v-for="value in wdValue.jxsajajdyfx.lessThan" :key="value.ssbm">{{ value.ccl }}</span></span><span></span>
<TableData title="各县(市)公安(分)局治安案件统计表" :listData="wdValue.jxsajajdyfx.res"
:titleList="['部门、(市)公安(分)局', '受理数', '查处数','查处率','查处违法人员数','备注']" lx="4" />
</div>
</div>
<div class="section-title">对策建议</div>
<div class="body-text">
{{ wdValue.xzjyL }}
</div>
</div>
</div>
<div style="display: flex;justify-content: center;align-items: center;">
<el-button type="primary" @click="downloadWithStyles">导出WORD</el-button>
</div>
</template>
<script setup>
import * as echarts from "echarts";
import { xsasjxsajztgs, xsasjxsajccajlbfx, xsasjxsajajxsfx, xsasjxsajnldtj, xsasjxsajajfsqy, xsasjxsajajdyfx, xsasjxsajaltdtj, xsasjxsajfbqktj, xsasjxsajFatdtj, xsasjxsajxyrQkfx, xsasjxsajypbgZttj, xsasjxsajqxajqk } from '@/api/fileapi'
import { ref, onMounted, watch } from 'vue'
import { connectSSEWithPost } from '@/utils/sse'
import { timeValidate } from '@/utils/tools'
import { downloadDocWithStyle, downloadPDF } from "@/utils/export.js"
import TableData from './tableData.vue'
import Bar from './bar.vue'
import Docxtemplater from 'docxtemplater';
import PizZip from 'pizzip';
import { saveAs } from 'file-saver';
const props = defineProps({
search: {
type: Object,
default: () => { }
},
xzlx: {
type: String,
default: ''
}
})
const params = ref({ ...props.search })
onMounted(async () => {
getxsasjxsajztgs()
getxsasjxsajccajlbfx()
getxsasjxsajajxsfx()
getxsasjxsajnldtj()
getxsasjxsajajfsqy()
getxsasjxsajajdyfx()
getconnectSSEWithPost()
})
// 值
const wdValue = ref({
date: timeValidate(new Date(), 'ny'),
ym: timeValidate((() => { const d = new Date(); d.setMonth(d.getMonth() - 1); return d; })(), 'ym'),
td: timeValidate(new Date(), 'td'),
zaajZtgsList: {},
ajxsfxList: [],
zaajList: [],
zaajFbqktj: [],
zaajFbqktjList: {},
nldtjOnj: {
ccxyr: 0,
nldtj: { list: [] }
},
jxsajajdyfx: {},
sajajfsqy: {},
xzjyL:""
})
const ajReport = ref(null)
// 获取报告所有文字内容
const getReportTextContent = () => {
if (!ajReport.value) {
return ''
}
// 提取元素内的所有文本内容
const textContent = ajReport.value.textContent || ''
// 处理空白字符,去除多余的换行和空格
return textContent
.replace(/\s+/g, ' ') // 将多个空白字符替换为单个空格
.trim() // 去除首尾空白
}
// 侦防建议
const getconnectSSEWithPost = () => {
const params = getReportTextContent()
connectSSEWithPost({ prompt: params }, {
onChunk: (content) => {
wdValue.value.xzjyL += content;
},
onComplete: () => {
console.log('SSE连接完成');
},
onError: (error) => {
console.error('SSE连接错误:', error);
}
})
}
// 区域分析
const getxsasjxsajztgs = () => {
// ...params.value
xsasjxsajztgs({ ...params.value }).then(res => {
wdValue.value.zaajZtgsList = res
}).catch(error => {
console.error('请求失败:', error)
})
}
// 治安案件类别分析
const getxsasjxsajccajlbfx = () => {
xsasjxsajccajlbfx({ ...params.value }).then(res => {
wdValue.value.zaajFbqktj = res
}).catch(error => {
console.error('请求失败:', error)
})
}
const xzlx = [
{
key: 'rlggcx',
label: '扰乱公共秩序类',
value: ''
}, {
key: 'qhrsaq',
label: '侵害人身安全和财产权利类',
value: ''
}, {
key: 'fhshglcx',
label: '妨害社会管理秩序类',
value: ''
}, {
key: 'fhggaq',
label: '妨害公共安全类',
value: ''
}
]
const strFun = (str) => {
const newStr = parseInt(str.slice(0, str.length - 1))
return newStr == 0 ? '持平' : newStr > 0 ? `上升${newStr}%` : `下降${Math.abs(newStr)}%`
}
// 治安案件线索分析
const getxsasjxsajajxsfx = () => {
xsasjxsajajxsfx({ ...params.value }).then(res => {
wdValue.value.ajxsfxList = res
const list = res.map(item => item.tjlx)
wdValue.value.zaajList = xzlx.map(item => {
return {
...item,
sySj: list[0],
bySj: list[2],
sy: res[1][item.key],
by: res[2][item.key],
hb: strFun(res[3][item.key]),
tb: strFun(res[4][item.key]),
}
})
console.log(wdValue.value.zaajList);
}).catch(error => {
console.error('请求失败:', error)
})
}
const getxsasjxsajnldtj = () => {
xsasjxsajnldtj({ ...params.value }).then(res => {
wdValue.value.nldtjOnj.ccxyr = res.ccxyr ? res.ccxyr : '0'
wdValue.value.nldtjOnj.nldtj.list = [
{ label: '占比', val: res.nldtj.map(item => (item.count / res.ccxyr * 100).toFixed(2)) },
]
wdValue.value.nldtjOnj.nldtj.xData = res.nldtj.map(item => item.agegroup)
wdValue.value.nldtjOnj.nldtj.bottomValues = res.nldtj.map(item => item.count)
wdValue.value.nldtjOnj.nldtj.data = res.nldtj
}).catch(error => {
console.error('请求失败:', error)
})
}
const getxsasjxsajajfsqy = () => {
xsasjxsajajfsqy({ ...params.value }).then(res => {
wdValue.value.sajajfsqy = res
}).catch(error => {
console.error('请求失败:', error)
})
}
const getxsasjxsajajdyfx = () => {
xsasjxsajajdyfx({ ...params.value }).then(res => {
const { greaterThan, lessThan } = compareCclValues(res);
wdValue.value.jxsajajdyfx = {
greaterThan, lessThan,
res
}
console.log(wdValue.value.jxsajajdyfx);
}).catch(error => {
console.error('请求失败:', error)
})
}
// 比较ccl值的方法
const compareCclValues = (data) => {
// 获取基准ccl值
const baseCcl = wdValue.value.zaajZtgsList.ccl || '0%';
const baseCclValue = parseFloat(baseCcl);
// 初始化结果数组
const greaterThan = [];
const lessThan = [];
// 遍历数据进行比较
data.forEach(item => {
const itemCcl = item.ccl || '0%';
const itemCclValue = parseFloat(itemCcl);
if (itemCclValue > baseCclValue) {
greaterThan.push(item);
} else if (itemCclValue < baseCclValue) {
lessThan.push(item);
}
});
return { greaterThan, lessThan };
}
// 导出word
const tableBox = ref(null);
const downloadWithStyles = async () => {
if (!tableBox.value?.innerHTML) return;
try {
// 将类样式转换为行内样式的函数
const convertClassesToInlineStyles = (html) => {
// 创建临时DOM元素
const tempDiv = document.createElement('div');
tempDiv.innerHTML = html;
// 定义样式映射
const styleMap = {
'.report-container': {
'padding': '20px',
'color': '#000'
},
'.main-title': {
'font-size': '22pt',
'font-family': '黑体, SimHei, Microsoft YaHei',
'text-align': 'center',
'font-weight': 'bold',
'line-height': '30pt'
},
'.section-title': {
'font-size': '16pt',
'font-family': '黑体, SimHei, Microsoft YaHei',
'line-height': '30pt',
'text-indent': '2em',
'font-weight': 'bold'
},
'.body-text': {
'font-size': '16pt',
'font-family': '仿宋_GB2312',
'line-height': '30pt',
'text-indent': '2em'
},
'.font-bold': {
'font-weight': '600'
},
'.right-align': {
'text-align': 'right',
'margin-left': 'auto',
'width': 'fit-content'
}
};
// 遍历所有元素,应用行内样式
const elements = tempDiv.querySelectorAll('*');
elements.forEach(element => {
// 获取元素的所有类名
const classes = element.className.split(' ').filter(c => c);
// 为每个类名应用对应的样式
classes.forEach(className => {
const styles = styleMap[`.${className}`];
if (styles) {
Object.entries(styles).forEach(([property, value]) => {
element.style[property] = value;
});
}
});
});
// 返回转换后的HTML
return tempDiv.innerHTML;
};
// 转换样式并构建导出内容
let inlineStyledContent = convertClassesToInlineStyles(tableBox.value.innerHTML);
// 处理图表转换为图片
const tempExportDiv = document.createElement('div');
tempExportDiv.innerHTML = inlineStyledContent;
// 直接在原始DOM中查找所有图表容器
const originalChartContainers = tableBox.value.querySelectorAll('div[id]');
for (const originalContainer of originalChartContainers) {
try {
// 获取图表实例
const chart = echarts.getInstanceByDom(originalContainer);
if (chart) {
// 确保图表已渲染并获取完整大小
const containerWidth = originalContainer.offsetWidth;
const containerHeight = originalContainer.offsetHeight;
// 调整图表大小以确保完整渲染
chart.resize({
width: containerWidth,
height: containerHeight
});
// 等待一小段时间确保图表渲染完成
await new Promise(resolve => setTimeout(resolve, 100));
// 获取图表的base64图片设置合适的尺寸
const imgSrc = chart.getDataURL({
pixelRatio: 2, // 提高图片清晰度
backgroundColor: '#fff',
width: containerWidth,
height: containerHeight
});
// 在临时DOM中查找对应的容器并替换
const tempContainer = tempExportDiv.querySelector(`div[id="${originalContainer.id}"]`);
if (tempContainer) {
// 创建图片元素替换图表容器
const img = document.createElement('img');
img.src = imgSrc;
// 使用内联样式确保在Word中占满宽度
img.setAttribute('style', 'width: 100%; height: auto; margin: 20px 0;');
// 替换容器
tempContainer.style.textIndent = '0em';
tempContainer.parentNode.replaceChild(img, tempContainer);
tempContainer.style.textIndent = '0em';
}
}
} catch (error) {
console.error('转换图表为图片失败:', error);
}
}
// 获取处理后的HTML
const processedContent = tempExportDiv.innerHTML;
const styledContent = `
<div style="padding: 20px; color: #000;">
${processedContent}
</div>
`;
downloadDocWithStyle(styledContent, `刑事案件分析报告_${timeValidate(new Date(), 'ny')}`);
} catch (error) {
console.error('导出Word失败:', error);
alert('导出Word失败请检查控制台错误信息');
}
}
</script>
<style lang="scss" scoped>
.report-container {
padding: 20px;
height: 90%;
overflow: auto;
color: #000;
}
.main-title {
font-size: 22pt;
font-family: '黑体, SimHei, Microsoft YaHei';
text-align: center;
font-weight: bold;
line-height: 30pt;
}
.section-title {
font-size: 16pt;
font-family: '黑体, SimHei, Microsoft YaHei';
line-height: 30pt;
text-indent: 2em;
font-weight: bold;
}
.body-text {
font-size: 16pt;
// font-family: ', FangSong, Microsoft YaHei';
font-family: '仿宋_GB2312';
line-height: 30pt;
text-indent: 2em;
}
.font-bold {
font-weight: 600;
}
.right-align {
text-align: right;
margin-left: auto;
width: fit-content;
}
</style>
<style lang="scss"></style>

View File

@ -4,6 +4,7 @@
<div class="xsaj">
<JudgmentReport :search="search" v-if="xzlx === '02'" />
<Xsaj :search="search" v-if="xzlx === '03'" />
<Zaaj :search="search" v-if="xzlx === '04'" />
</div>
</el-dialog>
</template>
@ -13,6 +14,8 @@
import { ref, reactive, watch } from 'vue'
import JudgmentReport from './AnalysisReport/index.vue'
import Xsaj from './caseFile/xsaj.vue'
import Zaaj from './caseFile/zaaj.vue'
const title = ref('详情')
const props = defineProps({
visible: {

View File

@ -318,6 +318,7 @@ const onSearch = () => {
let len = []
xzlx.value = Array.isArray(searchList.value.lx) ? searchList.value.lx[0][0] : ''
console.log(xzlx.value);
const bjlbs = Array.isArray(searchList.value.lx) ? searchList.value.lx.map(item => {
len.push(item[0])
return item[item.length - 1]
@ -512,7 +513,6 @@ const visible = ref(false)
const search = ref({})
const handleYP = () => {
visible.value = true
console.log(searchList.value.lx);
if (searchList.value.lx.length == 0) {
xzlx.value = '02'
@ -541,6 +541,10 @@ const handleYP = () => {
}
break;
case '04':
search.value = {
startTime: searchList.value.datetimes ? searchList.value.datetimes[0] : '',
endTime: searchList.value.datetimes ? searchList.value.datetimes[1] : '',
}
break;
default:
break;

View File

@ -0,0 +1,117 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">区域布控预警{{ title }} </span>
<div>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage :formList="formData" v-model="listQuery" ref="elform">
</FormMessage>
</div>
</div>
</template>
<script setup>
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { IdCard } from '@/utils/validate.js'
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, watch } from "vue";
import AddFrom from "../components/addFrom.vue";
const emit = defineEmits(["updateDate"]);
const props = defineProps({
dict: {
type: Object,
default: () => { }
}
});
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const formData = ref([])
watch(() => props.dict, (res) => {
if (res) {
formData.value = [
{ label: "预警人姓名", prop: "yjRyxm", type: "input" },
{ label: "身份证号", prop: "yjRysfzh", type: "input" },
{ label: "电话", prop: "yjRysjh", type: "input" },
{ label: "年龄", prop: "nl", type: "input" },
{ label: "性别", prop: "xb", type: "input" },
{ label: "相似度", prop: "xsd", type: "input" },
{ label: "预警时间", prop: "yjSj", type: "input" },
{ label: "籍贯", prop: "yjRyhjjg", type: "input" },
{ label: "预警次数", prop: "yjJrcs", type: "input" },
{ label: "预警标签", prop: "yjbqmc", type: "input" },
{ label: "所属部门", prop: "ssbm", type: "input" },
{ label: "所属县局", prop: "ssxgaj", type: "input" },
{ label: "所属市局", prop: "sssgaj", type: "input" },
{ label: "预警来源", prop: "yjLylx", type: "select", options: props.dict.D_BZ_YJLY },
{ label: "预警级别", prop: "yjJb", type: "select", options: props.dict.D_BZ_YJJB },
{ label: "预警类型", prop: "yjLx", type: "select", options: props.dict.D_BZ_YJLX },
{ label: "预警地址", prop: "yjDz", type: "input", type: "textarea" },
{ label: "预警内容", prop: "yjNr", type: "input", type: "textarea" },
// { label: "组合大类", prop: "sfdlmc", type: "input" },
// { label: "组合小类", prop: "sfzlmc", type: "input" },
// { label: "组合预警次数", prop: "sfcs", type: "input", lx: "number" },
// { label: "预警分值", prop: "sffz", type: "input", lx: "number" },
// { label: "处置状态", prop: "czzt", type: "select", options: props.dict.D_GSXT_YJXX_CZZT },
// { label: "接警员姓名", prop: "jjyxm", type: "input" },
// { label: "预警内容", prop: "yjNr", type: "textarea", width: "100%" },
]
}
}, { deep: true, immediate: true })
const listQuery = ref({}); //表单
const loading = ref(false);
const elform = ref();
const title = ref("详情");
const init = (row) => {
dialogForm.value = true;
qcckGet({}, `/mosty-gsxt/tbYjxx/getInfo/${row.id}`).then((res) => {
console.log(res);
listQuery.value = {
...res,
nl: IdCard(res.yjRysfzh, 3) || "",
xb: IdCard(res.yjRysfzh, 2) || "",
xsd: res.xsd + '%'
}
})
// yjzxZhyjSelectList(row.id).then(res => {
// listQuery.value = {
// ...res,
// // nl: IdCard(res.yjRysfzh, 3) || "",
// // xb: IdCard(res.yjRysfzh, 2) || "",
// xsd: res.xsd + '%'
// }
// })
};
// 关闭
const close = () => {
listQuery.value = {};
loading.value = false;
dialogForm.value = false;
listQuery.value = {}
};
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep {
.el-form-item__content {
align-items: normal;
}
}
</style>

View File

@ -0,0 +1,50 @@
<template>
<el-dialog title="处置建议" v-model="visible" width="50%" v-if="visible" @close="closeHndle">
<el-form :model="form" ref="formRef" :rules="rules" label-width="120px" >
<el-form-item label="处置建议" prop="jynr">
<el-input v-model="form.jynr" placeholder="请输入处置建议" type="textarea"></el-input>
</el-form-item>
<div class="flex just-center">
<el-button type="primary" @click="okSubmit">确定</el-button>
<el-button @click="closeHndle">返回</el-button>
</div>
</el-form>
</el-dialog>
</template>
<script setup>
import { qcckPost } from "@/api/qcckApi.js";
import { ref , defineExpose} from 'vue'
const emit = defineEmits(['okSubmit'])
const visible = ref(false)
const formRef = ref()
const form = ref({})
const rules = ref({
jynr: [
{ required: true, message: '请输入处置建议', trigger: 'blur' }
]
})
const init = (row) => {
visible.value = true;
form.value.yjid = row.id;
}
const closeHndle = () => {
visible.value = false;
form.value = {};
}
const okSubmit = async () => {
await formRef.value.validate((valid) => {
if (!valid) return;
let params = {...form.value , lylx:'04'}
qcckPost(params,'/mosty-gsxt/yjxx/czjy/insert').then((res) => {
emit('okSubmit', {...form.value})
closeHndle()
})
})
}
defineExpose({
init
})
</script>

View File

@ -0,0 +1,57 @@
<template>
<el-dialog :title="`组合预警次数详情(${pageData.tableData.length}`" v-model="dialogVisible" width="60%">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
>
</MyTable>
</el-dialog>
</template>
<script setup>
import { qcckGet } from "@/api/qcckApi.js";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { ref , reactive , defineExpose} from 'vue'
const dialogVisible = ref(false)
const pageData = reactive({
tableData: [{jqbh:'JQBH-43',bjr:'张三',bjrdh:'15665255545',bjrsfzh:'510156565656525565',yjnr:'xxxxxxxxx',jsj:'2023-08-24 15:00:00'}], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
loading: false,
haveControls: false,
},
tableHeight:600,
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
tableColumn: [
{ label: "警情编号", prop: "jjdbh"},
{ label: "报警人", prop: "bjrmc" },
{ label: "报警人电话", prop: "bjdh" },
{ label: "报警人身份证", prop: "bjrzjhm"},
{ label: "预警内容", prop: "bjnr", showOverflowTooltip: true },
{ label: "报警时间", prop: "bjsj", showOverflowTooltip: true },
]
});
const init = (row) => {
dialogVisible.value = true;
pageData.tableConfiger.loading = true;
pageData.tableData = []
qcckGet({yjid:row.id},'/mosty-gsxt/yjzxZhyjxq/getPageList').then((res)=>{
pageData.tableData = res || [];
pageData.tableConfiger.loading = false;
}).catch(()=>{
pageData.tableConfiger.loading = false;
})
}
defineExpose({
init
})
</script>

View File

@ -0,0 +1,376 @@
<template>
<div>
<div class="titleBox">
<PageTitle title="区域布控预警">
<!-- <el-button>
<span style="vertical-align: middle">导出</span>
</el-button> -->
<el-button type="success" @click="openSearch">
<Search style="width: 1em; height: 1em; margin-right: 8px" />
<span style="vertical-align: middle" v-if="!search">搜索</span>
<span style="vertical-align: middle" v-else>关闭搜索</span>
</el-button>
<el-button type="primary" @click="exportExl">导出</el-button>
</PageTitle>
</div>
<!-- 搜索 -->
<div ref="searchBox" v-if="search">
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
<template #jfd>
<div>
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
<span style="color: #333;margin: 0 4px;"></span>
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
</div>
</template>
</Searchs>
</div>
<!-- 表格 -->
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:expand="true" @chooseData="handleChooseData">
<template #xsd="{ row }">
{{ `${row.xsd}%` }}
</template>
<template #yjJb="{ row }">
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_BZ_YJJB" />
</template>
<template #yjLylx="{ row }">
<DictTag :value="row.yjLylx" :tag="false" :options="D_BZ_YJLY" />
</template>
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%; max-height: 400px; overflow-y: auto; padding: 10px;">
<Items :row="props || {}" :dict="dict" />
</div>
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')"
v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
<el-link type="primary" @click="openAddModel(row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<Detail ref="detailRef" />
<HolographicArchive v-model="assessShow" :dataList="dataList" />
<FkDialog @change="getList" lx="04" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='closeFszl'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
:tacitly="tacitly" />
</Information>
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
<!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false" :chooseJfBh="chooseJfBh" url="/yjzxZhyj/sjxspz"
:roleIds="roleIds" />
</template>
<script setup>
import Czjy from './components/czjy.vue'
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Items from "./item/items.vue";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { tbYjxxGetZbtj, tbGsxtBqzhSelectList, yjzxZhyjSelectList } from '@/api/yj.js'
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import AddFrom from "./components/addFrom.vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import Detail from './components/detail.vue'
import { exportExlByObj } from "@/utils/exportExcel.js"
import { getMultiDictVal } from "@/utils/dict.js"
import emitter from "@/utils/eventBus.js";
const permission_sfqs = ref(false)
const roleCode = ref(false)
const searchBox = ref();
const czjyRef = ref()
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB, 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 dict = ref({
D_GS_SSYJ,
D_GSXT_YJXX_CZZT,
D_BZ_YJLY,
D_BZ_YJJB,
D_BZ_YJLX
})
import { holographicProfileJump } from "@/utils/tools.js"
// 搜索配置
const searchConfiger = ref([
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select", options: D_BZ_YJJB },
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
]);
const queryFrom = ref({});
// 页面数据
const pageData = reactive({
tableData: [{ sfcs: 1 }],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false,
haveControls: true,
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 200,
tableColumn: [
{ label: "预警人姓名", prop: "yjRyxm" },
{ label: "相似度", prop: "xsd", showSolt: true },
{ label: "预警时间", prop: "yjSj", width: 200 },
{ label: "预警标签", prop: "yjbqmc" },
{ label: "身份证号", prop: "yjRysfzh", width: 200 },
{ label: "预警来源", prop: "yjLylx", showSolt: true },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "车牌号", prop: "yjClcph" },
{ label: "布控区域名称", prop: "bkqymc" },
{ label: "所属部门", prop: "ssbm" },
]
});
onMounted(() => {
// let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
// permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
// let rols = getItem('roleList') ? getItem('roleList'):[]
// let obj = rols.find(item => {
// return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
// })
// roleCode.value = obj ? true : false;
tabHeightFn();
getList();
gettbGsxtBqglSelectList()
});
const handleCzjy = (row) => {
czjyRef.value.init(row)
}
const onSearch = (val) => {
queryFrom.value = { ...queryFrom.value, ...val };
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const reset = () => {
delete queryFrom.value.ksfz
delete queryFrom.value.jsfz
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
const getList = () => {
pageData.tableConfiger.loading = true;
// TODO: 替换为实际的组合预警API接口
const promes = {
...queryFrom.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
qcckPost({ promes }, "/mosty-gsxt/tbYjxx/getQybkPageList").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#e6a23c'
} else if (val == '04') {
return '#0000ff'
}
}
const bqLbData = ref({
bqXl: []
})
const gettbGsxtBqglSelectList = (val) => {
tbGsxtBqzhSelectList({}).then((res) => {
bqLbData.value.bqXl = res.map(item => {
return {
label: item.bqMc,
value: item.bqDm
}
}) || []
})
}
// 查看详情
const detailRef = ref()
const handleClick = (row) => {
detailRef.value.init(row)
}
const assessShow = ref(false)
/** 选中项 */
const selectRows = ref([])
const dataList = ref()
const pushAssess = (val) => {
return holographicProfileJump(val.yjlx, val) // 全息档案跳转
// assessShow.value = true;
// dataList.value = val;
}
// 发送指令
const showDialog = ref(false)
const itemData = ref()
const showDetail = (item) => {
showDialog.value = true;
itemData.value = item
}
const handleClose = () => {
showDialog.value = false;
}
const semdFqzlRef = ref()
const tacitly = {
title: 'yjbt',
instructionContent: 'yjnr'
}
const submit = () => {
semdFqzlRef.value.getsendFqzl()
}
const closeFszl = () => {
semdFqzlRef.value.close()
}
// 处理签收
const handleQsFk = (val, type) => {
switch (type) {
case '签收':
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({ id: val.id }, "/mosty-gsxt/yjzxZhyj/yjqs").then(() => {
val.czzt = '02'
getList()
proxy.$message({ type: "success", message: "签收成功" });
});
})
break;
case '反馈':
case '查看反馈':
emitter.emit("openFkDialog", { id: val.id, type });
break;
}
}
const addModelRef = ref(null)
const openAddModel = (row) => {
console.log(row);
addModelRef.value.init(row)
}
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds = ref()
const chooseJfFun = (val) => {
chooseJfBh.value = val.id
yjzxZhyjSelectList(val.id).then(res => {
roleIds.value = res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 搜索栏
const search = ref(false)
const openSearch = () => {
search.value = !search.value
nextTick(() => {
tabHeightFn()
})
}
// 表格高度计算
const tabHeightFn = () => {
if (search.value) {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
} else {
pageData.tableHeight = window.innerHeight - 250;
}
window.onresize = function () {
tabHeightFn();
};
};
const handleChooseData = (val) => {
selectRows.value = val
}
const exportExl = () => {
const titleObj = {
yjRyxm: "姓名",
yjRysfzh: "身份证号",
yjRysjh: "电话",
xsd: "相似度",
yjJrcs: "预警次数",
yjLx: "预警类型",
yjLylx: "预警来源",
yjJb: " 预警级别",
yjbqmc: "预警标签",
yjSj: "预警时间",
czzt_cname: "处置状态",
ssbm: "所属部门",
}
/** 导出【选中】的数据 (没有就全部)*/
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
const data = needArr.map(item => {
return {
...item,
bqys_cname: getMultiDictVal(item.yjLx, D_BZ_YJLX),
czzt_cname: getMultiDictVal(item.yjLylx, D_BZ_YJLY),
bqys_cname: getMultiDictVal(item.yjJb, D_BZ_YJJB),
czzt_cname: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
}
})
exportExlByObj(titleObj, data, '组合预警')
}
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

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

View File

@ -0,0 +1,124 @@
<template>
<div class="warning-item">
<el-divider content-position="left">处置建议</el-divider>
<div class="item-row">
<div class="info-item">
<span class="text">预警人姓名{{ list.yjRyxm }}</span>
<span class="text"> 预警人员手机号{{ list.yjRysjh }}</span>
<span class="text"> 身份证号码{{ list.yjRysfzh }}</span>
</div>
<div class="info-item">
<span class="text">相似度{{ list.xsd }}%</span>
<span class="text">预警时间{{ list.yjSj }}</span>
<span class="text">籍贯{{ list.yjRyhjjg }}</span>
<span class="text">预警次数{{ list.yjJrcs }}</span>
<span class="text">预警标签{{ list.yjbqmc }}</span>
<span class="text">所属部门{{ list.ssbm }}</span>
</div>
<div class="info-item flex">
<span class="text flex">预警类型
<DictTag :value="list.yjLx" :options="dict.D_BZ_YJLX" />
</span>
<span class="text flex">预警来源
<DictTag :value="list.yjLylx" :options="dict.D_BZ_YJLY" />
</span>
<span class="text flex"> 预警级别
<DictTag :value="list.yjJb" :options="dict.D_BZ_YJJB" />
</span>
</div>
<div class="info-item">
<span class="text"> 预警地址{{ list.yjDz }}</span>
</div>
<div class="info-item">预警内容<span>{{ list.yjNr || '暂无' }}</span></div>
</div>
<el-divider content-position="left">反馈内容</el-divider>
<div class="item-row" v-for="(it, idx) in Fklist" :key="idx">
<div class="info-item">
<span class="text">处置地址{{ it.czdz }}</span>
<span class="text">处置时间{{ it.czsj }}</span>
</div>
<div class="info-item">
<span class="text">常控不尿检理由<span>{{ it.ckbnjly || '暂无' }}</span></span>
<span class="text">常控处置反馈补充信息<span>{{ it.ckczbcxx || '暂无' }}</span></span>
<span class="text">常控立线侦察评估<span>{{ it.cklxzcpg || '暂无' }}</span></span>
<span class="text">常控立线侦察评估依据<span>{{ it.cklxzcpgyj || '暂无' }}</span></span>
</div>
</div>
<div>
<el-empty v-if="Fklist.length === 0" description="暂无数据" />
</div>
</div>
</template>
<script setup>
import { ref, computed, onMounted } from 'vue'
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
const props = defineProps({
/** 表格行数据 */
row: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({
D_GS_SSYJ: [],
D_GSXT_YJXX_CZZT: []
})
},
})
const list = ref({})
const Fklist = ref([])
onMounted(() => {
if (!props.row.id) {
return
}
qcckGet({}, `/mosty-gsxt/tbYjxx/getInfo/${props.row.id}`).then((res) => {
list.value = res || {}
console.log('list: ', list.value);
})
qcckGet({}, '/mosty-gsxt/yjzxZhyj/' + props.row.id).then((res) => {
Fklist.value = res.fkList || []
})
})
// console.log('row😃: ', props.row);
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
border-radius: 8px;
background-color: #fafafa;
}
.item-row {
border-bottom: 1px dashed #e8e8e8;
line-height: 36px;
padding-bottom: 10px;
margin-bottom: 10px;
}
.info-item {
line-height: 36px;
width: 100%;
.text {
display: inline-block;
width: 25%;
margin-right: 10px;
}
.flex {
display: flex;
}
}
</style>

View File

@ -33,6 +33,9 @@
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="props.dict.D_BZ_YJLY" />
</template>
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
@ -140,7 +143,7 @@ const pageData = reactive({
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true, width: 200 },
{ label: "姓名", prop: "yjRyxm" },
{ label: "年龄", prop: "nl", showSolt: true, width: 80 },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true, showSolt: true },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true, width: 200 },
// { label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "相似度", prop: "xsd", showSolt: true },

View File

@ -45,7 +45,7 @@
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px', paddingTop: '10px' }">
<!-- <div style="padding:0 10px;"> <el-button type="primary" @click="exportExcel">导出</el-button></div> -->
<LocalWarning :maxHeight="search ? (pageData.tableHeight - 160) : (pageData.tableHeight - 110)"
ref="localWarningRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" :search="search" excelTitle="人像预警" />
ref="localWarningRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT,D_BZ_YJLY }" :search="search" excelTitle="人像预警" />
</div>
</div>
<el-dialog v-model="showDc" title="导出预警" width="80%">
@ -70,7 +70,7 @@
</template>
<template #sxd="{ row }"> {{ row.sxd }}% </template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLYXT" />
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
@ -112,7 +112,7 @@ import * as XLSX from "xlsx";
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_BZ_YJJB", "D_BZ_YJLYXT")
const { D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT,D_BZ_YJLY } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_BZ_YJJB", "D_BZ_YJLYXT","D_BZ_YJLY")
const searchBox = ref(); //搜索框
const shortcuts = [
{
@ -170,13 +170,13 @@ const pageData = reactive({
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "姓名", prop: "yjRyxm" },
{ label: "年龄", prop: "nl", showSolt: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true,showSolt:D_BZ_YJLY },
{ label: "性别", prop: "xb", showSolt: true },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "预警地点", prop: "yjDz", showOverflowTooltip: true },
{ label: "预警次数", prop: "yjCs", showOverflowTooltip: true },
{ label: "布控手机号", prop: "yjRysjh", showOverflowTooltip: true },
{ label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true },
// { label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
]
});

View File

@ -34,6 +34,9 @@
</template>
<template #xsd="{ row }">
{{ row.xsd }}%
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="props.dict.D_BZ_YJLY" />
</template>
<template #czzt="{ row }">
<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />

View File

@ -40,7 +40,7 @@
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px', paddingTop: '10px' }">
<!-- <div style="padding:0 10px;"> <el-button type="primary" @click="exportExcel">导出</el-button></div> -->
<LocalWarning :maxHeight="search ? (pageData.tableHeight - 160) : (pageData.tableHeight - 110)"
ref="localWarningRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT }" :search="search" excelTitle="车辆预警" />
ref="localWarningRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT ,D_BZ_YJLY}" :search="search" excelTitle="车辆预警" />
</div>
</div>
<el-dialog v-model="showDc" title="导出预警" width="80%">
@ -64,7 +64,7 @@
{{ IdCard(row.yjRysfzh, 3) }}
</template>
<template #yjLylx="{ row }">
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLYXT" />
<DictTag v-model:value="row.yjLylx" :options="D_BZ_YJLY" />
</template>
<template #xb="{ row }">
{{ IdCard(row.yjRysfzh, 2) }}
@ -107,7 +107,7 @@ import FileSaver from "file-saver";
import emitter from "@/utils/eventBus.js";
import * as XLSX from "xlsx";
const { proxy } = getCurrentInstance();
const { D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLYXT } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_BZ_YJJB", "D_BZ_YJLYXT")
const { D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_BZ_YJLY } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_BZ_YJJB", "D_BZ_YJLY")
const searchBox = ref(); //搜索框
const shortcuts = [
{
@ -162,7 +162,7 @@ const pageData = reactive({
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "姓名", prop: "yjRyxm" },
{ label: "年龄", prop: "nl", showSolt: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true , showSolt: true },
{ label: "性别", prop: "xb", showSolt: true },
{ label: "预警级别", prop: "yjJb", showSolt: true },
{ label: "相似度", prop: "xsd", showSolt: true },