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

448 lines
15 KiB
Vue

<template>
<browser :component-loading="componentLoading"
class="enterpriseInfo"
ref="broTable"
:api-config="apiConfig"
:table-config="tableConfig"
:permissions="permissions"
:dialog-config="dialogConfig"
:default-query-params="queryParams"
:actions="actions"
:customQuery="true"
@custom-query="handleQuery"
@update:actions="actions = $event"
@update:selection="selection = $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="属地" prop="agency">
<AgencySelector :filterable="true" v-model="queryParams.agency" :lazy-load="true" :multiple="false"
placeholder="请选择"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="行业类型" prop="industryType">
<el-select v-model="queryParams.industryType" placeholder="请选择" clearable>
<el-option v-for="item in DICTITEMS.HYLB_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="巡查类型" prop="xclx">
<el-select v-model="queryParams.xclx" placeholder="请选择" clearable>
<el-option v-for="item in DICTITEMS.XCLX_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="巡查数量" prop="insNum">
<el-input v-model="queryParams.insNum" clearable/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<template #extraButton>
<el-button class="extra-button" type="warning" @click="handleSelectData">随机巡查</el-button>
</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">
</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 #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="'100px'">
<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" :model="dialogConfig1.data" :rules="dialogConfig1.rules" ref="formRef">
<el-row>
<el-col :span="24" class="padding-bottom-10">
<el-table :data="dialogConfig1.data.enterprise" height="300" border>
<el-table-column header-align="center" align="center" label="属地" prop="agency.agencyName"
min-width="250"/>
<el-table-column header-align="center" align="center" label="企业名称" prop="unitName" min-width="250"/>
</el-table>
</el-col>
<el-col :span="24">
<el-form-item label="录入人" prop="createUserName">
<el-input v-model="dialogConfig1.data.createUserName" readonly/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="录入时间" prop="createTime">
<el-input v-model="dialogConfig1.data.createTime" readonly/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="有效期" prop="validTime">
<el-date-picker v-model="dialogConfig1.data.validTime"
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-col>
</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">确定</el-button>
</div>
</template>
</el-dialog>
</template>
</browser>
</template>
<script setup>
import {reactive, toRefs, computed, ref, nextTick, watch} from 'vue'
import {useUserStore} from '@/stores/modules/user'
import enterprises from '@/api/lawenforcement/Enterprise.js'
import {DEFAULT_ENTERPRISE_DETAIL, DICTDISPLAYS, DICTITEMS} from '@/utils/Constants.js'
import {ElMessage} from 'element-plus'
import moment from 'moment'
import {AREA_DICT} from '@/utils/bigdict.js'
import Browser from '@/components/Browser.vue'
import enterpriseInfo from '@pages/dtsjygl/enterpriseInfo.vue'
import AgencySelector from '@/components/AgencySelector.vue'
let userInfo
useUserStore().getUserInfo().then(data => userInfo = data)
const state = reactive({
queryParams: {
insNum: 20
},
componentLoading: false,
permissions: {
query: true,
add: false,
modify: false,
detail: true,
delete: false,
importFile: false,
exportFile: false,
exportSelectFile: false,
downloadTemp: false,
},
tableConfig: {
controlWidth: '80',
hasControlColumn: true,
multipleSelect: true,
defaultSort: {
prop: 'dynamicRiskLevel',
order: 'descending'
},
usePage: false,
},
apiConfig: {
api: enterprises,
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: 'detail',
title: '待巡查企业',
loading: false,
data: {},
actions: {
handleClose: handleClose1,
handleDialogOk: handleDialogOk
},
rules: {
validTime: [{required: true, message: '有效期不能为空', trigger: 'change'}],
},
},
actions: {
detail: handleDetail
},
selection: [],
})
const {
queryParams,
componentLoading,
permissions,
tableConfig,
apiConfig,
dialogConfig,
dialogConfig1,
actions,
selection,
} = toRefs(state)
let page = 0
let totalPages = 0
// 分页查询
function handleQuery(queryParams) {
page += 1
if (totalPages != 0 && page > totalPages) {
page = 1
}
queryParams.page = page
queryParams.pageSize = queryParams.insNum
queryParams.pagesize = queryParams.insNum
tableConfig.value.tableLoading = true
apiConfig.value.api.queryIns(queryParams).then(res => {
tableConfig.value.tableLoading = false
if (res.success) {
totalPages = res.totalPages
tableConfig.value.tableData = res
} else {
ElMessage.error('执法信息查询失败')
}
})
}
// 重置参数
watch(
() => queryParams.value.agency,
() => {
page = 0
totalPages = 0
}
)
watch(
() => queryParams.value.industryType,
() => {
page = 0
totalPages = 0
}
)
watch(
() => queryParams.value.dynamicRiskLevel,
() => {
page = 0
totalPages = 0
}
)
watch(
() => queryParams.value.insNum,
() => {
page = 0
totalPages = 0
}
)
// 详情查询
const defaultValues = reactive(DEFAULT_ENTERPRISE_DETAIL)
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 handleSelectData() {
let arr = selection.value
let data = Array.from(new Map(arr.map(item => [item.enterpriseId, item])).values())
if (data.length < 1) {
ElMessage.error('请选择待巡查企业')
return
}
dialogConfig1.value.data = Object.assign({}, {
'enterprise': data,
'createUserId': userInfo.yhwybs,
'createUserName': userInfo.xm,
'createTime': moment().format('YYYY-MM-DD HH:mm:ss'),
})
dialogConfig1.value.show = true
}
function handleClose1() {
dialogConfig1.value.show = false
}
const formRef = ref()
function handleDialogOk() {
let _event = actions.value
formRef.value.validate(valid => {
if (valid) {
dialogConfig1.value.data.validStartTime = dialogConfig1.value.data.validTime[0]
dialogConfig1.value.data.validEndTime = dialogConfig1.value.data.validTime[1]
dialogConfig1.value.data.enterpriseIds = dialogConfig1.value.data.enterprise.map(item => item.enterpriseId)
dialogConfig.value.loading = true
apiConfig.value.api.addIns(dialogConfig1.value.data).then(res => {
dialogConfig.value.loading = false
if (res.success) {
dialogConfig1.value.show = false
ElMessage.success('操作成功')
_event.query()
} else {
ElMessage.error('操作失败')
}
})
}
})
}
</script>
<style lang="scss" scoped>
:deep(.el-col-21) {
display: flex;
flex-direction: row-reverse;
}
.extra-button {
margin-left: unset !important;
margin-right: 12px;
}
.el-dialog {
margin-bottom: 0;
border: 0.0625rem solid rgba(255, 255, 255, 1);
border-radius: 1rem !important;
}
.el-dialog__body {
height: unset !important;
}
.padding-bottom-10 {
padding-bottom: 10px;
}
</style>