zhzf/client/src/views/fxczfgl/zxxcxx.vue

1195 lines
43 KiB
Vue

<template>
<browser :component-loading="componentLoading"
class="enterpriseInfo"
ref="broTable"
:api-config="apiConfig"
:table-config="tableConfig"
:permissions="permissions"
:dialog-config="dialogConfig"
:actions="actions"
:customQuery="true"
@custom-query="handleQuery"
@update:actions="actions = $event"
@update:query-params="queryParams = $event"
@update:dialog-config="dialogConfig = $event">
<template #queryPanel="{ queryParams: queryParams }">
<el-form ref="queryForm" :model="queryParams" label-width="80px">
<el-row class="query-condition">
<el-col :span="6">
<el-form-item label="视频接入">
<el-select v-model="queryParams.videoAccess" placeholder="请选择视频接入" clearable>
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="感知设备">
<el-select v-model="queryParams.perceptionAccess" placeholder="请选择感知设备" clearable>
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="资料上报">
<el-select v-model="queryParams.infoAccess" placeholder="请选择资料上报" clearable>
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</el-form-item>
</el-col>
<!-- <el-col :span="6">-->
<!-- <el-form-item label="许可信息">-->
<!-- <el-select v-model="queryParams.permitAccess" placeholder="请选择许可信息" clearable>-->
<!-- <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"/>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
</el-row>
</el-form>
</template>
<el-table-column prop="agency.agencyName" label="属地" min-width="250"/>
<el-table-column prop="unitName" label="企业" min-width="350"/>
<el-table-column prop="industryType" label="行业类型" min-width="200">
<template #default="{row}">
<el-span>{{ DICTDISPLAYS.HYLB_MAP[row.industryType] || row.industryType }}</el-span>
</template>
</el-table-column>
<el-table-column prop="videoAccessMsg" label="视频接入" min-width="100"/>
<el-table-column prop="perceptionAccessMsg" label="感知设备" min-width="100"/>
<el-table-column prop="infoAccessMsg" label="资料上报" min-width="100"/>
<el-table-column prop="permitAccessMsg" label="许可信息" min-width="100"/>
<template #tableControlColumn="{ data: r }">
<el-link type="primary" @click="handDistribution(r.data.row)" title="在线巡查">在线巡查</el-link>
</template>
<template #dialog>
<el-dialog class="business-dialog" v-model="dialogConfig.show" :show-close="false" :append-to-body="true"
fullscreen>
<template #header>
<div class="cvi-dialog-header">
<div class="cvi-dialog-header-title">
<div class="dialog-line"></div>
{{ dialogConfig.title }}
</div>
<i class="iconfont icon-zyyy_tcgb" @click="dialogConfig.actions.handleClose"></i>
</div>
</template>
<el-form :label-width="dialogConfig.formLabelWidth" :model="dialogConfig.data" :rules="dialogConfig.rules">
<enterpriseInfo :dc="dialogConfig"/>
</el-form>
</el-dialog>
<el-dialog class="business-dialog" v-model="dialogConfig1.show" :show-close="false" :append-to-body="true"
:top="'0px'" width="1200px">
<template #header>
<div class="cvi-dialog-header">
<div class="cvi-dialog-header-title">
<div class="dialog-line"></div>
{{ dialogConfig1.title }}
</div>
<i class="iconfont icon-zyyy_tcgb" @click="dialogConfig1.actions.handleClose"></i>
</div>
</template>
<el-form label-width="100px" class="browser-businesss-table-dialog-form" :model="dialogConfig1.data"
:rules="dialogConfig1.rules">
<el-divider content-position="left">企业基本信息</el-divider>
<el-row>
<el-col :span="8">
<el-form-item label="属地" prop="orgCode">
<el-input v-model="dialogConfig1.data.agency.agencyName" readonly/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="企业" prop="unitName">
<el-input v-model="dialogConfig1.data.unitName" readonly/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="统一信用代码" prop="unifiedSocialCode">
<el-input v-model="dialogConfig1.data.unifiedSocialCode" readonly/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="营业状态" prop="businessStatus">
<el-input v-model="DICTDISPLAYS.YYZT_MAP[dialogConfig1.data.businessStatus]" readonly/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="行业类型" prop="industryType">
<el-input v-model="DICTDISPLAYS.HYLB_MAP[dialogConfig1.data.industryType]" readonly/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="详细地址" prop="detailedAddress">
<el-input v-model="dialogConfig1.data.detailedAddress" readonly/>
</el-form-item>
</el-col>
</el-row>
<el-divider content-position="left">视频设备</el-divider>
<el-row>
<BusinessTable ref="busiTable"
:config="spsbTableConfig"
:data-res="dialogConfig1.data.spsblist"
:permissions="spsbPermissions">
<el-table-column align="center" header-align="center" prop="cameraName" label="设备名称"/>
<el-table-column align="center" header-align="center" prop="parentCode" label="父组织编码"/>
<el-table-column align="center" header-align="center" prop="cameraIndexCode" label="监控点唯一标识"/>
<template #otherControlButtons="{ data: scope }">
<el-link type="primary" @click="handleVideo(scope.row)" title="查看">查看</el-link>
</template>
</BusinessTable>
</el-row>
<el-divider content-position="left">预警信息</el-divider>
<el-row v-if="dialogConfig1.show">
<BusinessTable ref="busiTable"
v-loading="yjxxTableConfig.tableLoading"
:config="yjxxTableConfig"
:query-params="yjxxQueryParams"
:data-res="dialogConfig1.data.yjxxlist"
:permissions="yjxxPermissions"
@query-params="handleYjxxQueryParams">
<el-table-column align="center" header-align="center" prop="cameraName" label="摄像头名称" min-width="150"/>
<el-table-column align="center" header-align="center" prop="address" label="摄像头地址" min-width="150"/>
<el-table-column align="center" header-align="center" prop="time" label="抓拍时间" min-width="150"/>
<el-table-column align="center" header-align="center" prop="eventDesc" label="事件描述" min-width="350"/>
<template #otherControlButtons="{ data: scope }">
<el-link type="primary" @click="handleYjxxDetail(scope.row)" title="查看">查看</el-link>
</template>
</BusinessTable>
</el-row>
<el-divider content-position="left">感知设备</el-divider>
<el-row>
<BusinessTable ref="busiTable"
:config="gzsbTableConfig"
:data-res="dialogConfig1.data.gzsblist">
<el-table-column align="center" header-align="center" prop="code" label="探测器编码" min-width="150"/>
<el-table-column align="center" header-align="center" prop="recordHandleStatus" label="有无未处置的探测器报警记录"
min-width="150"/>
<el-table-column align="center" header-align="center" prop="status" label="探测器状态" min-width="150"/>
<el-table-column align="center" header-align="center" prop="subStatusName" label="探测器子状态名称"
min-width="150"/>
<el-table-column align="center" header-align="center" prop="arrivalTime" label="数据到达时间" min-width="150"/>
<el-table-column align="center" header-align="center" prop="value" label="实时值" min-width="150"/>
</BusinessTable>
</el-row>
<el-divider content-position="left">自报自查</el-divider>
<el-row v-if="dialogConfig1.show">
<BusinessTable ref="busiTable"
v-loading="zczbTableConfig.tableLoading"
:config="zczbTableConfig"
:query-params="zczbQueryParams"
:data-res="dialogConfig1.data.zczblist"
@query-params="handleZczbQueryParams">
<el-table-column align="center" header-align="center" prop="unitname" label="单位名称" min-width="150"/>
<el-table-column align="center" header-align="center" prop="checkusername" label="检查人" min-width="150"/>
<el-table-column align="center" header-align="center" prop="checktime" label="检查时间" min-width="150"/>
<el-table-column align="center" header-align="center" prop="checkcontent" label="检查内容" min-width="350"/>
</BusinessTable>
<!-- @show-modify="mergeActions.modify"-->
<!-- @show-detail="mergeActions.detail"-->
</el-row>
<!-- <el-divider content-position="left">行政许可</el-divider>-->
<!-- <el-row>-->
<!-- <BusinessTable ref="busiTable"-->
<!-- v-loading="zczbTableConfig.tableLoading"-->
<!-- :config="zczbTableConfig"-->
<!-- :query-params="zczbQueryParams"-->
<!-- :data-res="dialogConfig1.data.zczblist"-->
<!-- @query-params="handleZczbQueryParams">-->
<!-- <el-table-column align="center" header-align="center" prop="unitname" label="单位名称" min-width="150"/>-->
<!-- <el-table-column align="center" header-align="center" prop="checkusername" label="检查人" min-width="150"/>-->
<!-- <el-table-column align="center" header-align="center" prop="checktime" label="检查时间" min-width="150"/>-->
<!-- <el-table-column align="center" header-align="center" prop="checkcontent" label="检查内容" min-width="350"/>-->
<!-- </BusinessTable>-->
<!-- @show-modify="mergeActions.modify"-->
<!-- @show-detail="mergeActions.detail"-->
<!-- </el-row>-->
</el-form>
<template #footer>
<div class="cvi-dialog-footer">
<el-button @click="dialogConfig1.actions.handleClose">取消</el-button>
<el-button type="primary" @click="dialogConfig1.actions.handleDialogOk(dialogConfig1.data)">完成</el-button>
<el-button type="success" @click="dialogConfig1.actions.handleSubmitForApproval(dialogConfig1.data)"
title="报送审批">报送审批
</el-button>
</div>
</template>
</el-dialog>
<el-dialog class="business-dialog" v-model="dialogConfig2.show" :show-close="false" :append-to-body="true"
:top="'60px'" width="1200px">
<template #header>
<div class="cvi-dialog-header">
<div class="cvi-dialog-header-title">
<div class="dialog-line"></div>
{{ dialogConfig2.title }}
</div>
<i class="iconfont icon-zyyy_tcgb" @click="dialogConfig2.actions.handleClose"></i>
</div>
</template>
<el-row style="padding: 20px">
<el-col :span="14">
<div id="camerasPlayer" style="width:100%;height: 100%"></div>
</el-col>
<el-col :span="10">
<el-form ref="form" :model="videoData" label-width="140px">
<el-form-item label="实时视频监控:">
<el-button size='default' @click="realPlay(videoData.camera)">开始监控</el-button>
<el-button size='default' @click="stopPlay(videoData.camera)">停止监控</el-button>
</el-form-item>
<el-form-item label="历史监控时间:">
<el-date-picker size='default'
v-model="videoConfig.fallBackTime"
type="datetimerange"
start-placeholder="开始时间"
end-placeholder="结束时间"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
:default-time="[new Date(2000, 2, 1, 0, 0, 0),new Date(2000, 2, 1, 23, 59, 59)]"/>
</el-form-item>
<el-form-item label="历史监控回放:">
<div>
<el-button size='default' @click="playbackStart(videoData.camera)">开始回放</el-button>
<el-button size='default' @click="stopPlay">停止回放</el-button>
<el-button size='default' @click="frameForward">单 帧</el-button>
</div>
<div>
<el-button size='default' @click="playbackFast" :disabled="videoConfig.single">快 放</el-button>
<el-button size='default' @click="playbackSlow" v-show="flowType === 'decoder'">慢 放</el-button>
</div>
</el-form-item>
<el-form-item label="当前倍速:">
<el-input size='default' readonly v-model="videoConfig.rate"></el-input>
</el-form-item>
<el-form-item label="声音:">
<el-button size='default' @click="openSound">开 启</el-button>
<el-button size='default' @click="closeSound">关 闭</el-button>
</el-form-item>
<el-form-item label="音量条:">
<el-slider size='small' v-model="videoConfig.volume" @change="setVolume"
:disabled="videoConfig.muted"></el-slider>
</el-form-item>
<el-form-item label="抓图&录像:">
<el-button size='default' @click="capture('JPEG')">抓取JPEG</el-button>
<el-button size='default' @click="recordStart('MP4')">录制MP4</el-button>
<el-button size='default' @click="recordStop">停止录制</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
</el-dialog>
<el-dialog class="business-dialog" v-model="dialogConfig3.show" :show-close="false" :append-to-body="true"
:top="'60px'" width="1200px">
<template #header>
<div class="cvi-dialog-header">
<div class="cvi-dialog-header-title">
<div class="dialog-line"></div>
{{ dialogConfig3.title }}
</div>
<i class="iconfont icon-zyyy_tcgb" @click="dialogConfig3.actions.handleClose"></i>
</div>
</template>
<el-form label-width="100px" class="browser-businesss-table-dialog-form" :model="dialogConfig3.data"
:rules="dialogConfig3.rules" ref="formRef">
<el-col :span="24">
<el-form-item label="巡查人" prop="createUserName">
<el-input v-model="dialogConfig3.data.createUserName" readonly/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="巡查时间" prop="createTime">
<el-input v-model="dialogConfig3.data.createTime" readonly/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="管辖机构" prop="agency">
<agency-selector :lazyLoad="true" v-model="dialogConfig3.data.agency"></agency-selector>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="简述" prop="description">
<el-input type="textarea" v-model="dialogConfig3.data.description"/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="annex">
<MultipleFile :parameters="fileParameters"
:files-data="dialogConfig3.data.annexs"
@on-change="onChange"
@on-remove="onRemove"/>
</el-form-item>
</el-col>
</el-form>
<template #footer>
<div class="cvi-dialog-footer">
<el-button @click="dialogConfig3.actions.handleClose">取消</el-button>
<el-button type="primary" @click="dialogConfig3.actions.handleDialogOk">确定</el-button>
</div>
</template>
</el-dialog>
<el-dialog class="business-dialog" v-model="dialogConfig4.show" :show-close="false" :append-to-body="true"
:top="'60px'" width="1200px">
<template #header>
<div class="cvi-dialog-header">
<div class="cvi-dialog-header-title">
<div class="dialog-line"></div>
{{ dialogConfig4.title }}
</div>
<i class="iconfont icon-zyyy_tcgb" @click="dialogConfig4.actions.handleClose"></i>
</div>
</template>
<el-form :model="dialogConfig4.data" label-width="100px" ref="formRef">
<el-row>
<el-col :span="12">
<el-form-item label="事件描述" prop="eventDesc">
<el-input v-model="dialogConfig4.data.eventDesc" readonly/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="摄像头名称" prop="cameraName">
<el-input v-model="dialogConfig4.data.cameraName" readonly/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="摄像头地址" prop="address">
<el-input v-model="dialogConfig4.data.address" readonly/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="摄像头国标码" prop="internationalCode">
<el-input v-model="dialogConfig4.data.internationalCode" readonly/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经度" prop="lat">
<el-input v-model="dialogConfig4.data.lat" readonly/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="纬度" prop="lng">
<el-input v-model="dialogConfig4.data.lng" readonly/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="街道" prop="street">
<el-input v-model="dialogConfig4.data.street" readonly/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="置信度" prop="confidence">
<el-input v-model="dialogConfig4.data.confidence" readonly/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="抓拍时间" prop="time">
<el-input v-model="dialogConfig4.data.time" readonly/>
</el-form-item>
</el-col>
<el-col :span="12"></el-col>
<el-col :span="12">
<el-form-item label="抓拍图片" prop="imageUrl">
<el-image
style="width: 300px; height: 200px"
:src="dialogConfig4.data.imageUrl"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="[dialogConfig4.data.imageUrl]"
show-progress
:initial-index="4"
fit="cover"/>
</el-form-item>
</el-col>
<el-col :span="12" v-if="dialogConfig4.data.videoUrl !== null">
<el-form-item label="前后10s视频" prop="videoUrl">
<video width="300" height="200" controls>
<source :src="dialogConfig4.data.videoUrl" type="video/mp4">
</video>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
</browser>
</template>
<script setup>
import {reactive, toRefs, computed, ref, nextTick} from 'vue'
import {useUserStore} from '@/stores/modules/user'
import enterprises from '@/api/lawenforcement/Enterprise'
import hikVision from '@/api/lawenforcement/HikVision'
import onlinePatrol from '@/api/lawenforcement/OnlinePatrol'
import {DEFAULT_ENTERPRISE_DETAIL, DICTDISPLAYS, DICTITEMS} from '@/utils/Constants.js'
import {AREA_DICT} from '@/utils/bigdict.js'
import {ElMessage} from 'element-plus'
import moment from 'moment'
import BusinessTable from '@/components/BusinessTable.vue'
import DictSelector from '@/components/DictSelector.vue'
import enterpriseInfo from '@pages/dtsjygl/enterpriseInfo.vue'
import Browser from '@/components/Browser.vue'
import AgencySelector from '@/components/AgencySelector.vue'
import MultipleFile from '@pages/common/MultipleFile.vue'
import axios from 'axios'
let userInfo
useUserStore().getUserInfo().then(data => userInfo = data)
const state = reactive({
queryParams: {},
componentLoading: false,
permissions: {
query: true,
add: false,
modify: false,
detail: true,
delete: false,
importFile: false,
exportFile: false,
exportSelectFile: false,
downloadTemp: false,
},
tableConfig: {
hasControlColumn: true,
controlWidth: '150',
multipleSelect: false,
defaultSort: {
prop: 'dynamicRiskLevel',
order: 'descending'
}
},
apiConfig: {
api: enterprises,
api2: hikVision,
api3: onlinePatrol,
modelId: 'enterpriseId'
},
dialogConfig: {
title: '企业详情',
show: false,
mode: 'detail',
loading: false,
formLabelWidth: '90px',
rules: {
industryType: [{required: true, message: '监管行业不能为空', trigger: 'blur'}],
unitName: [{required: true, message: '生产经营单位名称不能为空', trigger: 'blur'}],
shortName: [{required: true, message: '单位简称不能为空', trigger: 'blur'}],
unifiedSocialCode: [{required: true, message: '社会统一信用代码不能为空', trigger: 'blur'}],
businessStatus: [{required: true, message: '营业状态不能为空', trigger: 'blur'}],
orgCode: [{required: false, message: '所属机构不能为空', trigger: 'blur'}],
legalRepresentative: [{required: true, message: '法定代表人(经营者)姓名不能为空', trigger: 'blur'}],
contactPhone: [{required: true, message: '联系电话不能为空', trigger: 'blur'}],
agency: [{required: true, message: '属地不能为空', trigger: 'blur'}],
legalPhone: [{required: true, message: '联系电话不能为空', trigger: 'blur'}],
legalDuty: [{required: true, message: '法定代表人(经营者)职位不能为空', trigger: 'blur'}],
regulatedIndustry: [{required: true, message: '国民经济行业分类不能为空', trigger: 'blur'}],
affiliation: [{required: true, message: '行政隶属关系不能为空', trigger: 'blur'}],
oilExtract: [{required: true, message: '是否石油开采不能为空', trigger: 'blur'}],
safetyFocus: [{required: true, message: '列入安全生产监管重点企业不能为空', trigger: 'blur'}],
largeScale: [{required: true, message: '规模以上生产经营单位不能为空', trigger: 'blur'}],
safetyLic: [{required: true, message: '企业是否有安全生产许可证不能为空', trigger: 'blur'}],
opScope: [{required: true, message: '主营业务不能为空', trigger: 'blur'}],
areaComb: [{required: true, message: '注册地址不能为空', trigger: 'blur'}],
detailedAddress: [{required: true, message: '注册详细地址不能为空', trigger: 'blur'}],
opLocAreaComb: [{required: true, message: '经营地址不能为空', trigger: 'blur'}],
opLocAddress: [{required: true, message: '经营详细地址不能为空', trigger: 'blur'}],
dynamicRiskLevel: [{required: true, message: '动态风险等级不能为空', trigger: 'blur'}],
isScaleEnterprise: [{required: true, message: '规模以上生产经营单位不能为空', trigger: 'blur'}]
},
data: {},
actions: {
handleClose: handleClose,
}
},
dialogConfig1: {
show: false,
mode: 'add',
title: '在线巡查',
loading: false,
data: {},
actions: {
handleClose: handleClose1,
handleDialogOk: handleDialog1Ok,
handleSubmitForApproval: handleSubmitForApproval,
},
},
dialogConfig2: {
show: false,
mode: 'detail',
title: '视频监控',
loading: false,
data: {},
actions: {
handleClose: handleClose2,
},
},
dialogConfig3: {
show: false,
mode: 'add',
title: '报送审批',
loading: false,
data: {
annexs: []
},
actions: {
handleClose: handleClose3,
handleDialogOk: handleDialog3Ok,
},
rules: {
createUserName: [{required: true, message: '录入人不能为空', trigger: 'blur'}],
createTime: [{required: true, message: '录入时间不能为空', trigger: 'blur'}],
agency: [{required: true, message: '管辖机构不能为空', trigger: 'blur'}],
description: [{required: true, message: '简述不能为空', trigger: 'blur'}],
// annex: [{required: true, message: '附件不能为空', trigger: 'change'}],
},
},
dialogConfig4: {
title: '监控预警详情',
show: false,
mode: 'detail',
loading: false,
data: {},
actions: {
handleClose: handleClose4,
}
},
actions: {
detail: handleDetail
},
videoData: {
camera: {}
},
spsbTableConfig: {
hasControlColumn: true,
controlWidth: '80',
multipleSelect: false,
usePage: false,
},
spsbPermissions: {
detail: false
},
gzsbTableConfig: {
hasControlColumn: false,
controlWidth: '80',
multipleSelect: false,
usePage: false,
},
yjxxQueryParams: {},
yjxxTableConfig: {
hasControlColumn: true,
controlWidth: '80',
multipleSelect: false,
tableLoading: false,
pageSizes: [10, 20, 50, 100],
pagerLayout: '->, slot, prev, pager, next',
},
yjxxPermissions: {
detail: false
},
zczbQueryParams: {},
zczbTableConfig: {
hasControlColumn: false,
controlWidth: '80',
multipleSelect: false,
tableLoading: false,
pageSizes: [10, 20, 50, 100],
pagerLayout: '->, slot, prev, pager, next',
},
})
const {
queryParams,
componentLoading,
permissions,
tableConfig,
apiConfig,
dialogConfig,
dialogConfig1,
dialogConfig2,
dialogConfig3,
dialogConfig4,
actions,
videoData,
spsbPermissions,
spsbTableConfig,
yjxxQueryParams,
yjxxTableConfig,
yjxxPermissions,
gzsbTableConfig,
zczbQueryParams,
zczbTableConfig,
} = toRefs(state)
const options = [{value: '1', label: '是'}, {value: '0', label: '否'}]
// 分页查询
function handleQuery(queryParams) {
tableConfig.value.tableLoading = true
apiConfig.value.api.queryInsStart(queryParams).then(res => {
tableConfig.value.tableLoading = false
if (res.success) {
tableConfig.value.tableData = res
} else {
ElMessage.error('执法信息查询失败')
}
})
}
// 详情查询
const defaultValues = reactive(DEFAULT_ENTERPRISE_DETAIL)
const districts = computed(() => {
if (!queryParams.value.opLocCity) return []
const city = cities.value.find(c => c.value === queryParams.value.opLocCity)
return city?.children || []
})
const cities = computed(() => {
if (!queryParams.value.opLocProvince) return []
const province = AREA_DICT.find(p => p.value === queryParams.value.opLocProvince)
return province?.children || []
})
async function handleDetail(row) {
dialogConfig.value.show = true
dialogConfig.value.mode = 'detail'
dialogConfig.value.title = '详情企业信息'
findOne(row)
}
function findOne(row) {
dialogConfig.value.loading = true
let defaultVals = {
//安全基础管理信息
productionManageInfoExp: {productionManageSystems: [{systemName: '', systemCompileDate: ''}], productionManagePlans: [{planName: '', planCompileDate: '', planType: ''}]},
//生产设备设施及公用辅助用房
productionEquipmentExp: {productionFacilities: [{equipName: '', equipType: '', commissioningDate: ''}], auxiliaryBuildings: [{auxiliaryName: '', floorArea: '', commissioningDate: ''}]},
//煤行业扩展信息
coalIndustryExpansion: {},
//非煤行业扩展信息
nocoalIndustryExpansion: {},
//危化行业扩展信息
dangerFeatureInfo: {majorDangerInfos: {}, majorDangerCraftInfos: {}, dangerInfos: {}},
//烟花爆竹行业扩展信息
fireworksAddInfo: {},
//工贸行业扩展信息
industryExpandInfos: {}
}
dialogConfig.value.data = Object.assign({}, defaultVals)
apiConfig.value.api.findOne(row[apiConfig.value.modelId]).then(res => {
if (res.success) {
const data = res.data || {}
// 调用字段解析函数
const fieldsToDeserialize = Object.keys(defaultVals)
deserializeFields(data, fieldsToDeserialize)
// 调用默认值设置函数
Object.keys(defaultVals).forEach(key => {
if (!data[key]) {
data[key] = defaultVals[key]
}
})
data.regulatedIndustry = data.regulatedIndustry ? data.regulatedIndustry.split("/") : []
data.areaComb = data.areaComb ? data.areaComb.split("/") : []
data.opLocAreaComb = data.opLocAreaComb ? data.opLocAreaComb.split("/") : []
dialogConfig.value.data = Object.assign({}, data)
}
dialogConfig.value.loading = false
})
}
function deserializeFields(data, fields) {
fields.forEach(field => {
if (data[field]) {
try {
data[field] = JSON.parse(data[field])
} catch (e) {
console.error(`Failed to parse ${field}:`, e)
}
}
})
}
function handleClose() {
dialogConfig.value.show = false
}
//-----------------------在线巡查-----------------------
function handDistribution(row) {
dialogConfig1.value.show = true
dialogConfig1.value.mode = 'add'
dialogConfig1.value.title = '在线巡查'
dialogConfig1.value.loading = false
dialogConfig1.value.formLabelWidth = '200px'
row.spsblist = {}
row.gzsblist = {}
row.yjxxlist = {}
row.zczblist = {}
dialogConfig1.value.data = row
findRegionsCameras(row)
handleYjxx(row)
handleGzsb(row)
handleSelfInsAndSelfReportInfo(row)
}
function handleClose1() {
dialogConfig1.value.show = false
}
function handleDialog1Ok(row) {
let params = new FormData()
params.append('enterpriseId', row.enterpriseId)
params.append('agencyId', row.agency.agencyId)
params.append('isNormal', '0')
params.append('description', '在线巡查无异常')
params.append('createUserId', userInfo.yhwybs)
params.append('createUserName', userInfo.xm)
params.append('createTime', moment().format('YYYY-MM-DD HH:mm:ss'))
dialogConfig.value.loading = true
let _event = actions.value
apiConfig.value.api3.addOnlinePatrolAndFileData(params).then(res => {
if (res.success) {
dialogConfig.value.loading = false
dialogConfig1.value.show = false
ElMessage.success('操作成功')
_event.query()
} else {
dialogConfig.value.loading = false
throw new Error('操作失败')
}
})
}
//-----------------------视频相关信息--------------------
function findRegionsCameras(row) {
let qyxx = JSON.parse(JSON.stringify(row))
let params = {
uscc: qyxx.unifiedSocialCode,
}
apiConfig.value.api.camera(params).then(res => {
if (res.code === 0) {
dialogConfig1.value.data.spsblist = {
"code": 0,
"success": true,
"data": res.data
}
}
})
}
//-----------------------预警信息-----------------------
function handleYjxx(row) {
yjxxQueryParams.value.unifiedSocialCode = row.unifiedSocialCode
yjxxQueryParams.value.pageSize = 10
yjxxQueryParams.value.pagesize = 10
yjxxQueryParams.value.page = 1
// findYjxx()
}
function handleYjxxQueryParams(val) {
Object.assign(yjxxQueryParams.value, val)
findYjxx()
}
function findYjxx() {
apiConfig.value.api.warn(yjxxQueryParams.value).then(res => {
if (res.code === 0) {
dialogConfig1.value.data.yjxxlist = res
console.log(dialogConfig1.value.data.yjxxlist)
}
})
}
function handleYjxxDetail(val) {
dialogConfig4.value.show = true
dialogConfig4.value.data = Object.assign({}, val)
}
function handleClose4() {
dialogConfig4.value.show = false
}
//-----------------------感知设备-----------------------
function handleGzsb(row) {
findGzsb(row)
}
function findGzsb(row) {
axios.get('/public/authenticated/monitor/unit/pulling/prober-status', {
params: {
socialCode: row.unifiedSocialCode
}
}).then(res => {
if (res.data.code === 200) {
dialogConfig1.value.data.gzsblist = {
"code": 0,
"success": true,
"data": res.data.data
}
}
})
}
//-----------------------自报自查------------------------
function handleSelfInsAndSelfReportInfo(row) {
zczbQueryParams.value.unifiedSocialCode = row.unifiedSocialCode
zczbQueryParams.value.pageSize = 10
zczbQueryParams.value.pagesize = 10
zczbQueryParams.value.page = 1
//findSelfInsAndSelfReportInfo()
}
function handleZczbQueryParams(val) {
Object.assign(zczbQueryParams.value, val)
findSelfInsAndSelfReportInfo()
}
function findSelfInsAndSelfReportInfo() {
apiConfig.value.api.selfInsAndSelfReport(zczbQueryParams.value).then(res => {
if (res.code === 0) {
let data = JSON.parse(res.data)
if (data.code === '200') {
let currentPage = 1
if (data.data.totalCount > data.data.limit) {
let result = data.data.offset / data.data.limit;
if (result % 1 !== 0) { // 检查是否有小数部分
currentPage = Math.ceil(result)
}
}
let res = {
"code": 0,
"success": true,
"data": data.data.list,
"total": Number(data.data.totalCount),
"page": currentPage,
"limit": data.data.limit,
"totalPages": data.data.totalPage,
"relation": "eq"
}
dialogConfig1.value.data.zczblist = res
}
}
})
}
//-----------------------视频相关信息---------------------
function handleVideo(row) {
dialogConfig2.value.show = true
dialogConfig2.value.mode = 'detail'
dialogConfig2.value.title = '视频监控'
dialogConfig2.value.loading = false
dialogConfig2.value.data = {}
videoData.value.camera = row
nextTick(() => createPlayer())
}
function handleClose2() {
dialogConfig2.value.show = false
}
//-----------------------海康视频监控-----------------------
// 创建播放器实例
let videoConfig = reactive({fallBackTime: [], single: false, rate: 1, volume: 50, muted: true})
let player
function createPlayer() {
player = new window.JSPlugin({szId: 'camerasPlayer', szBasePath: '/js'})
window.addEventListener('resize', () => player.JS_Resize())
}
let videoFlowType = !!window.MediaSource ? 'mse' : 'decoder'
let flowType = ref(videoFlowType)
let token = ''
function realPlay(data) {
let params = {
cameraIndexCode: data.cameraIndexCode,
streamType: 0,
protocol: 'wss',
transMode: 1,
}
apiConfig.value.api2.getCamerasPreview(params).then(res => {
if (res.code === 0) {
let data = JSON.parse(res.data)
console.log("播放流信息")
console.log(data)
if (data === null) return
if (data.code === '0') {
videoData.value.realplay = data.data.url
let playURL = videoData.value.realplay
let index = player.currentWindowIndex
let playMode = videoFlowType === 'mse' ? 0 : 1
player.JS_Play(playURL, {playURL, playMode, keepDecoder:0, token}, index).then(
() => {
videoConfig.single = true
console.log('realPlay success')
},
e => {
console.error(e)
}
)
}
}
})
}
function stopPlay() {
player.JS_Stop().then(
() => {
videoConfig.rate = 0
},
e => {
console.error(e)
}
)
}
function playbackStart(data) {
if (videoConfig.fallBackTime === null || videoConfig.fallBackTime.length !== 2) {
ElMessage.error('请选择回放时间')
return
}
let params = {
cameraIndexCode: data.cameraIndexCode,
protocol: 'wss',
transMode: 1,
fallBackTime: videoConfig.fallBackTime
}
apiConfig.value.api2.getCamerasPlayback(params).then(res => {
if (res.code === 0) {
let data = JSON.parse(res.data)
console.log("回放流信息")
console.log(data)
if (data === null) return
if (data.code === '0') {
videoData.value.playback = data.data.url
let playURL = videoData.value.playback
let index = player.currentWindowIndex
let playMode = videoFlowType === 'mse' ? 0 : 1
// let startTime = data.data.list[0].beginTime
// let endTime = data.data.list[0].endTime
let s = videoConfig.fallBackTime[0].split(' ')
let e = videoConfig.fallBackTime[1].split(' ')
let startTime = s[0] + 'T' + s[1] + 'Z'
let endTime = e[0] + 'T' + e[1] + 'Z'
player.JS_Play(playURL, {playURL, playMode, keepDecoder:0, token}, index, startTime, endTime).then(
() => {
videoConfig.single = false
videoConfig.rate = 1
console.log('playback success')
},
e => {
console.error(e)
}
)
}
}
})
}
function playbackFast() {
player.JS_Fast().then(
rate => {
videoConfig.rate = rate
},
e => {
console.error(e)
}
)
}
function playbackSlow() {
player.JS_Slow().then(
rate => {
videoConfig.rate = rate
},
e => {
console.error(e)
}
)
}
function frameForward() {
player.JS_FrameForward(player.currentWindowIndex).then(
() => {
videoConfig.rate = 1
},
e => {
ElMessage.warning(videoFlowType + '模式暂不支持单帧播放!')
console.error(e)
}
)
}
function openSound() {
player.JS_OpenSound().then(
() => {
videoConfig.muted = false
},
e => {
console.error(e)
}
)
}
function closeSound() {
player.JS_CloseSound().then(
() => {
videoConfig.muted = false
},
e => {
console.error(e)
}
)
}
function setVolume(value) {
let index = player.currentWindowIndex
player.JS_SetVolume(index, value).then(
() => {
console.log('setVolume success', value)
},
e => {
console.error(e)
}
)
}
function capture(imageType) {
let index = player.currentWindowIndex
player.JS_CapturePicture(index, 'img', imageType).then(
() => {
console.log('capture success', imageType)
},
e => {
console.error(e)
}
)
}
function recordStart() {
let index = player.currentWindowIndex
let fileName = `${moment().format('YYYYMMDDHHmm')}.mp4`
let typeCode = 5
player.JS_StartSaveEx(index, fileName, typeCode).then(
() => {
console.log('record start ...')
},
e => {
console.error(e)
}
)
}
function recordStop() {
let index = player.currentWindowIndex
player.JS_StopSave(index).then(
() => {
console.log('record stoped, saving ...')
},
e => {
console.error(e)
}
)
}
//-----------------------报送审批-----------------------
function handleSubmitForApproval(row) {
dialogConfig3.value.show = true
dialogConfig3.value.mode = 'add'
dialogConfig3.value.title = '报送审批'
dialogConfig3.value.loading = false
dialogConfig3.value.formLabelWidth = '200px'
// 材料信息
row.annexs = []
// 录入人
row.createUserId = userInfo.yhwybs
row.createUserName = userInfo.xm
// 录入时间
row.createTime = moment().format('YYYY-MM-DD HH:mm:ss')
dialogConfig3.value.data = row
}
// 文件组件上传成功回调
function onChange(data) {
let tablezjcl = {
uid: data.uid,
name: data.name,
type: data.name.split('.')[1],
file: data.raw
}
dialogConfig3.value.data.annexs.push(tablezjcl)
}
// 文件组件删除文件回调
function onRemove(fileList, id) {
dialogConfig3.value.data.annexs = fileList
}
const formRef = ref()
function handleDialog3Ok() {
if (dialogConfig3.value.data.annexs.length <= 0) {
ElMessage.error('附件不能为空')
return
}
let _event = actions.value
let params = new FormData()
params.append('enterpriseId', dialogConfig3.value.data.enterpriseId)
params.append('agencyId', dialogConfig3.value.data.agency.agencyId)
params.append('isNormal', '1')
params.append('description', dialogConfig3.value.data.description)
params.append('createUserId', dialogConfig3.value.data.createUserId)
params.append('createUserName', dialogConfig3.value.data.createUserName)
params.append('createTime', dialogConfig3.value.data.createTime)
dialogConfig3.value.data.annexs.forEach(item => params.append('files', item.file))
formRef.value.validate(valid => {
if (valid) {
dialogConfig.value.loading = true
apiConfig.value.api3.addOnlinePatrolAndFileData(params).then(res => {
if (res.success) {
dialogConfig.value.loading = false
dialogConfig3.value.show = false
dialogConfig1.value.show = false
ElMessage.success('操作成功')
_event.query()
} else {
dialogConfig.value.loading = false
throw new Error('操作失败')
}
})
}
})
}
function handleClose3() {
dialogConfig3.value.show = false
}
</script>
<style lang="scss">
.el-dialog {
margin-bottom: 0;
border: 0.0625rem solid rgba(255, 255, 255, 1);
border-radius: 1rem !important;
}
.el-dialog__body {
height: unset !important;
}
</style>