增加非现场执法管理
This commit is contained in:
parent
90133da606
commit
3c10d50f5c
|
|
@ -0,0 +1,436 @@
|
|||
<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: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-row>
|
||||
</el-form>
|
||||
</template>
|
||||
|
||||
<template #extraButton>
|
||||
<el-button class="ins-button" type="warning" @click="handleSelectData">定制巡查</el-button>
|
||||
<div class="extra-button" v-for="(item, index) in shopCarts" :key="index" @click="handleShopCart(item)">
|
||||
<span class="qys">{{ item.enterprise.length }}</span>
|
||||
<img src="../../assets/bigscreen/01.svg" style="width: 100%;height: 100%">
|
||||
<!-- <font-awesome-icon icon="fa-shopping-cart" style="color: #2063fc; width: 100%;height: 100%"/>-->
|
||||
</div>
|
||||
</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 #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 { v4 as uuid } from 'uuid'
|
||||
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: {},
|
||||
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'
|
||||
},
|
||||
},
|
||||
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)
|
||||
|
||||
// 分页查询
|
||||
function handleQuery(queryParam) {
|
||||
tableConfig.value.tableLoading = true
|
||||
apiConfig.value.api.queryIns(queryParam).then(res => {
|
||||
tableConfig.value.tableLoading = false
|
||||
if (res.success) {
|
||||
tableConfig.value.tableData = res
|
||||
} else {
|
||||
ElMessage.error('执法信息查询失败')
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 详情查询
|
||||
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
|
||||
}
|
||||
|
||||
// 定制巡查
|
||||
let shopCarts = ref([])
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
shopCarts.value.push({
|
||||
'id': uuid(),
|
||||
'enterprise': data,
|
||||
'createUserId': userInfo.yhwybs,
|
||||
'createUserName': userInfo.xm,
|
||||
'createTime': moment().format('YYYY-MM-DD HH:mm:ss')
|
||||
})
|
||||
}
|
||||
|
||||
function handleShopCart(data) {
|
||||
dialogConfig1.value.data = Object.assign({}, data)
|
||||
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) {
|
||||
// 移除购物车
|
||||
shopCarts.value = shopCarts.value.filter(item => item.id !== dialogConfig1.value.data.id)
|
||||
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;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.ins-button {
|
||||
margin-left: unset !important;
|
||||
margin-right: 12px;
|
||||
}
|
||||
|
||||
.extra-button {
|
||||
width: 24px !important;
|
||||
height: 24px !important;
|
||||
margin: 0px 12px 0px 0px !important;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
|
||||
.qys {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background: red;
|
||||
border-radius: 50%;
|
||||
position: absolute;
|
||||
top: -6px;
|
||||
right: -6px;
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
vertical-align: center;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.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>
|
||||
|
|
@ -0,0 +1,216 @@
|
|||
<template>
|
||||
<browser class="browser-businesss-table"
|
||||
ref="broTable"
|
||||
:component-loading="componentLoading"
|
||||
:api-config="apiConfig"
|
||||
:table-config="tableConfig"
|
||||
:permissions="permissions"
|
||||
:actions="actions"
|
||||
:custom-reset="true"
|
||||
@custom-reset="reset"
|
||||
:customQuery="true"
|
||||
@custom-query="handleQuery"
|
||||
@update:actions="actions = $event">
|
||||
<template #queryPanel>
|
||||
<el-form ref="queryForm" :model="queryParams" label-width="100px">
|
||||
<el-row class="query-condition">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="统计时间" prop="statisticsTime">
|
||||
<el-date-picker v-model="queryParams.statisticsTime"
|
||||
type="datetimerange"
|
||||
start-placeholder="开始时间"
|
||||
end-placeholder="结束时间"
|
||||
format="YYYY-MM-DD HH:mm:ss"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</template>
|
||||
<el-table-column header-align="center" align="center" prop="agency_name" label="属地" min-width="150"/>
|
||||
<el-table-column header-align="center" align="center" prop="xccs" label="巡查次数" min-width="150"
|
||||
class-name="can-click"/>
|
||||
<el-table-column header-align="center" align="center" prop="fxwts" label="发现问题" min-width="150"
|
||||
class-name="can-click"/>
|
||||
<el-table-column header-align="center" align="center" prop="jjwts" label="解决问题" min-width="150"
|
||||
class-name="can-click"/>
|
||||
<el-table-column header-align="center" align="center" prop="las" label="立案数" min-width="150"
|
||||
class-name="can-click"/>
|
||||
<el-table-column header-align="center" align="center" prop="cfs" label="处罚数" min-width="150"
|
||||
class-name="can-click"/>
|
||||
<template>
|
||||
<el-dialog :open="dialogConfig.show" :title="dialogConfig.title" v-if="dialogConfig.show" :show-footer="false"
|
||||
@update:open="dialogConfig.show = false">
|
||||
<fxczftjxcdetail :dialog-data="dialogConfig.data" :tag="tag"/>
|
||||
</el-dialog>
|
||||
</template>
|
||||
<template>
|
||||
<el-dialog :open="dialogConfig2.show" :title="dialogConfig2.title" v-if="dialogConfig2.show" :show-footer="false"
|
||||
@update:open="dialogConfig2.show = false">
|
||||
<fxczftjlacftail :dialog-data="dialogConfig2.data" :tag="tag"/>
|
||||
</el-dialog>
|
||||
</template>
|
||||
</browser>
|
||||
</template>
|
||||
<script setup>
|
||||
import {reactive, ref, toRefs} from 'vue'
|
||||
import browser from '@/components/Browser.vue'
|
||||
import lawEnfPenaltyStat from '@/api/lawenforcement/LawEnfPenaltyStat'
|
||||
import Browser from "@/components/Browser.vue";
|
||||
import ElDialog from "@/components/ElDialog/index.vue";
|
||||
import fxczftjxcdetail from "@pages/dtsjygl/fxczftjxcdetail.vue";
|
||||
import fxczftjlacftail from "@pages/dtsjygl/fxczftjlacftail.vue";
|
||||
import moment from "moment/moment.js";
|
||||
import {ElMessage, ElMessageBox} from "element-plus";
|
||||
|
||||
const state = reactive({
|
||||
componentLoading: false,
|
||||
queryParams: {
|
||||
statisticsTime: [moment().subtract(1, 'months').format('YYYY-MM-DD') + ' 00:00:00', moment().format('YYYY-MM-DD') + ' 23:59:59']
|
||||
},
|
||||
permissions: {
|
||||
query: true,
|
||||
add: false,
|
||||
modify: false,
|
||||
detail: false,
|
||||
delete: false,
|
||||
importFile: false,
|
||||
exportFile: true,
|
||||
exportSelectFile: false,
|
||||
downloadTemp: false,
|
||||
},
|
||||
tableConfig: {
|
||||
tableId: 'fxczftjTableId',
|
||||
hasControlColumn: false,
|
||||
tableData: [],
|
||||
tableLoading: false,
|
||||
usePage: false,
|
||||
multipleSelect: false,
|
||||
cellClick: caseEventClick,
|
||||
// lazy: true,
|
||||
// rowKey: 'agencyCode',
|
||||
// treeProps: { children: 'children', hasChildren: 'hasChildren' },
|
||||
// load: loadTree
|
||||
},
|
||||
dialogConfig: {
|
||||
show: false,
|
||||
mode: 'detail',
|
||||
loading: false,
|
||||
data: {},
|
||||
actions: {},
|
||||
},
|
||||
dialogConfig2: {
|
||||
show: false,
|
||||
mode: 'detail',
|
||||
loading: false,
|
||||
data: {},
|
||||
actions: {},
|
||||
},
|
||||
apiConfig: {
|
||||
api: lawEnfPenaltyStat,
|
||||
modelId: 'enforcementId',
|
||||
},
|
||||
actions: {
|
||||
exportData: handleExport
|
||||
},
|
||||
tag: ''
|
||||
})
|
||||
|
||||
const {
|
||||
componentLoading,
|
||||
queryParams,
|
||||
permissions,
|
||||
tableConfig,
|
||||
apiConfig,
|
||||
actions,
|
||||
dialogConfig,
|
||||
dialogConfig2,
|
||||
tag
|
||||
} = toRefs(state)
|
||||
|
||||
function handleQuery() {
|
||||
if (queryParams.value.statisticsTime === null) {
|
||||
ElMessage.error('请选择统计时间')
|
||||
return
|
||||
}
|
||||
tableConfig.value.tableLoading = true
|
||||
apiConfig.value.api.statistics(queryParams.value).then(res => {
|
||||
tableConfig.value.tableLoading = false
|
||||
if (res.success) {
|
||||
tableConfig.value.tableData = res
|
||||
}
|
||||
}).finally(() => {
|
||||
tableConfig.value.tableLoading = false
|
||||
})
|
||||
}
|
||||
|
||||
function reset(query) {
|
||||
queryParams.value.statisticsTime = [moment().subtract(1, 'months').format('YYYY-MM-DD') + ' 00:00:00', moment().format('YYYY-MM-DD') + ' 23:59:59']
|
||||
handleQuery()
|
||||
}
|
||||
|
||||
function caseEventClick(row, column, cell, event) {
|
||||
const colProp = column.property
|
||||
if (colProp === "xccs" && row[colProp] > 0) {
|
||||
tag.value = 'xccs'
|
||||
let query = Object.assign(queryParams.value, {agencyCode: row.agency_code})
|
||||
dialogConfig.value.data = query
|
||||
dialogConfig.value.show = true
|
||||
dialogConfig.value.mode = 'detail'
|
||||
dialogConfig.value.title = '巡查次数详情'
|
||||
|
||||
}
|
||||
if (colProp === "fxwts" && row[colProp] > 0) {
|
||||
tag.value = 'fxwts'
|
||||
let query = Object.assign(queryParams.value, {agencyCode: row.agency_code})
|
||||
dialogConfig.value.data = query
|
||||
dialogConfig.value.show = true
|
||||
dialogConfig.value.mode = 'detail'
|
||||
dialogConfig.value.title = '发现问题数详情'
|
||||
}
|
||||
if (colProp === "jjwts" && row[colProp] > 0) {
|
||||
tag.value = 'jjwts'
|
||||
let query = Object.assign(queryParams.value, {agencyCode: row.agency_code})
|
||||
dialogConfig.value.data = query
|
||||
dialogConfig.value.show = true
|
||||
dialogConfig.value.mode = 'detail'
|
||||
dialogConfig.value.title = '解决问题数详情'
|
||||
}
|
||||
if (colProp === "las" && row[colProp] > 0) {
|
||||
tag.value = 'las'
|
||||
let query = Object.assign(queryParams.value, {agencyCode: row.agency_code})
|
||||
dialogConfig2.value.data = query
|
||||
dialogConfig2.value.show = true
|
||||
dialogConfig2.value.mode = 'detail'
|
||||
dialogConfig2.value.title = '立案数详情'
|
||||
}
|
||||
if (colProp === "cfs" && row[colProp] > 0) {
|
||||
tag.value = 'cfs'
|
||||
let query = Object.assign(queryParams.value, {agencyCode: row.agency_code})
|
||||
dialogConfig2.value.data = query
|
||||
dialogConfig2.value.show = true
|
||||
dialogConfig2.value.mode = 'detail'
|
||||
dialogConfig2.value.title = '处罚数详情'
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const broTable = ref(null)
|
||||
|
||||
function handleExport() {
|
||||
broTable.value.busiTable.exportExcelFileForCurrentPage(tableConfig.value.tableId, '非现场执法统计')
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.browser-businesss-table {
|
||||
.browser-businesss-table-dialog-form {
|
||||
padding: 10px 20px 10px 20px;
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-table) {
|
||||
.can-click {
|
||||
cursor: pointer;
|
||||
color: #126eee;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,204 @@
|
|||
<template>
|
||||
<div v-loading="exporting" id="ajysspb" ref="pdfTemplate" class="ws-container">
|
||||
<div class="ws-title"><span class="ws-title-text">安全生产行政执法文书</span></div>
|
||||
<div class="ws-document-name"><span class="ws-document-name-text">{{documentName}}</span></div>
|
||||
<div class="ws-document-code"><span class="ws-document-code-text">{{documentCode}}</span></div>
|
||||
<p class="MsoNormal" style="margin-top: 15px"><span class="MsoNormal-span">案件名称:<span class="font-underline"> {{documenContent.ajmc}} </span></span></p>
|
||||
<table class="case-table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td rowspan="5" class="title-cell">当事人基本情况</td>
|
||||
<td class="title-cell">被处罚单位</td>
|
||||
<td colspan="2" class="content-cell">{{documenContent.qymc}}</td>
|
||||
<td colspan="2" class="title-cell">地址</td>
|
||||
<td colspan="3" class="content-cell">{{documenContent.dz}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="title-cell">法定代表人/负责人</td>
|
||||
<td colspan="2" class="content-cell">{{documenContent.fddbr}}</td>
|
||||
<td colspan="2" class="title-cell">职务</td>
|
||||
<td class="content-cell">{{documenContent.zw}}</td>
|
||||
<td class="title-cell">邮编 </td>
|
||||
<td class="content-cell">{{documenContent.yzbm}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="title-cell">被处罚人</td>
|
||||
<td colspan="2" class="content-cell">{{documenContent.xm}}</td>
|
||||
<td colspan="2" class="title-cell">年龄</td>
|
||||
<td class="content-cell">{{documenContent.nl}}</td>
|
||||
<td class="title-cell">性别</td>
|
||||
<td class="content-cell">{{documenContent.xb}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="title-cell">所在单位</td>
|
||||
<td colspan="2" class="content-cell">{{documenContent.szdw}}</td>
|
||||
<td colspan="2" class="title-cell">单位地址</td>
|
||||
<td colspan="3" class="content-cell">{{documenContent.dwdz}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="title-cell">家庭住址</td>
|
||||
<td colspan="2" class="content-cell">{{documenContent.jtzz}}</td>
|
||||
<td colspan="2" class="title-cell">联系电话</td>
|
||||
<td class="content-cell">{{documenContent.phone}}</td>
|
||||
<td class="title-cell">邮编</td>
|
||||
<td class="content-cell">{{documenContent.yb}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="title-cell">违法事实及处罚依据</td>
|
||||
<td colspan="8" class="content-cell">{{documenContent.wfsscfyj}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="title-cell">当事人申辩意见</td>
|
||||
<td colspan="8" class="content-cell">{{documenContent.dsrsbyj}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="title-cell">承办人意见</td>
|
||||
<td colspan="8" class="content-cell">{{documenContent.cbryj}}<br>
|
||||
<div style="float: right">承办人(签名): <br> {{formattedDate}}</div></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="title-cell">审核意见</td>
|
||||
<td colspan="2" class="content-cell">{{documenContent.shyj}}<br>
|
||||
<div style="float: right">审核人(签名): <br> {{formattedDate}}</div></td>
|
||||
<td colspan="2" class="title-cell">审批意见</td>
|
||||
<td colspan="4" class="content-cell">{{documenContent.spyj}}<br>
|
||||
<div style="float: right">审批人(签名): <br> {{formattedDate}}</div></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div style="margin-bottom: 10px;text-align: center">
|
||||
<el-button :disabled="exporting" type="primary" @click="printInfo">打印</el-button>
|
||||
<el-button :disabled="exporting" type="danger" @click="generatePDF">导出pdf</el-button>
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import {defineProps, ref,} from 'vue'
|
||||
import {ElButton, ElMessage} from "element-plus";
|
||||
import Print from 'print-js'
|
||||
import { exportPDF } from "@/utils/ExportPdf.js";
|
||||
import moment from 'moment/moment.js';
|
||||
defineProps({
|
||||
documentCode: String,
|
||||
documentNo: Number,
|
||||
documentName: String,
|
||||
caseInfo: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
documenContent: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
})
|
||||
const printInfo = (e) =>{
|
||||
Print({
|
||||
printable: document.getElementById('ajysspb'),
|
||||
type: 'html',
|
||||
honorMarginPadding: false,
|
||||
targetStyles: ['*']
|
||||
})
|
||||
}
|
||||
const formattedDate = moment().format('YYYY年MM月DD日');
|
||||
const pdfTemplate = ref(null)
|
||||
const exporting = ref(false)
|
||||
const generatePDF = async () => {
|
||||
exporting.value = true
|
||||
try {
|
||||
const result = await exportPDF(pdfTemplate,"案件处理呈批表.pdf");
|
||||
if(result.success)
|
||||
exporting.value = false
|
||||
} catch (error) {
|
||||
exporting.value = false
|
||||
ElMessage.error(error.message)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.ws-container {
|
||||
width: 21cm; /* A4纸宽度 */
|
||||
min-height: 29.7cm; /* A4纸高度 */
|
||||
padding: 2cm;
|
||||
font-family: "仿宋", SimSun;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.ws-title {
|
||||
text-align: center;
|
||||
border-bottom-style: double;
|
||||
border-bottom-color: #111111;
|
||||
border-bottom-width: 2px;
|
||||
color: #111111;
|
||||
|
||||
.ws-title-text {
|
||||
font-size: 40px;
|
||||
font-family: 华文中宋;
|
||||
font-weight: bold
|
||||
}
|
||||
}
|
||||
|
||||
.ws-document-name {
|
||||
text-align: center;
|
||||
border-top-style: double;
|
||||
border-top-color: #111111;
|
||||
border-top-width: 2px;
|
||||
margin-top: 2px;
|
||||
color: #111111;
|
||||
|
||||
.ws-document-name-text {
|
||||
font-size: 40px;
|
||||
font-family: 华文中宋;
|
||||
font-weight: bold
|
||||
}
|
||||
}
|
||||
.ws-document-code {
|
||||
text-align: center;
|
||||
margin-top: 10px;
|
||||
.ws-document-code-text {
|
||||
font-size: 18px;
|
||||
font-family: 仿宋
|
||||
}
|
||||
}
|
||||
.case-table {
|
||||
margin-top: 10px;
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border: 1px solid black;
|
||||
}
|
||||
.title-cell {
|
||||
width: 110px;
|
||||
font-size: 18px;
|
||||
font-family: 仿宋;
|
||||
border: 1px solid black;
|
||||
vertical-align: center;
|
||||
text-align: center;
|
||||
line-height: 2;
|
||||
}
|
||||
|
||||
.content-cell {
|
||||
font-size: 18px;
|
||||
font-family: 仿宋;
|
||||
padding-top: 5px;
|
||||
padding-left: 5px;
|
||||
border: 1px solid black;
|
||||
text-align: left;
|
||||
line-height: 2;
|
||||
}
|
||||
.MsoNormal {
|
||||
margin-bottom:10px;
|
||||
mso-para-margin-bottom:2.0gd;
|
||||
text-align:left;
|
||||
text-indent:24.0pt;
|
||||
line-height:22.0pt;
|
||||
mso-line-height-rule:exactly;
|
||||
text-autospace:ideograph-numeric;
|
||||
|
||||
.MsoNormal-span {
|
||||
font-size: 18px;
|
||||
font-family:仿宋;
|
||||
}
|
||||
.font-underline {
|
||||
text-decoration:underline;text-underline-position: under;text-underline-offset: 1px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,447 @@
|
|||
<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">
|
||||
<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 #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>
|
||||
|
|
@ -0,0 +1,337 @@
|
|||
<template>
|
||||
<browser class="browser-businesss-table"
|
||||
:component-loading="componentLoading"
|
||||
:api-config="apiConfig"
|
||||
:table-config="tableConfig"
|
||||
:permissions="permissions"
|
||||
:dialog-config="dialogConfig"
|
||||
:actions="actions"
|
||||
@update:query-params="queryParams = $event"
|
||||
@update:dialog-config="dialogConfig = $event"
|
||||
@update:actions="actions = $event">
|
||||
<template #queryPanel="{ queryParams: queryParams }">
|
||||
<el-form ref="queryForm" :model="queryParams" label-width="100px">
|
||||
<el-row class="query-condition">
|
||||
<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="unitName">
|
||||
<el-input v-model="queryParams.unitName" clearable/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="统一信用代码" prop="unifiedSocialCode">
|
||||
<el-input v-model="queryParams.unifiedSocialCode" clearable/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</template>
|
||||
|
||||
<el-table-column prop="enterprise.unitName" label="企业" min-width="250"/>
|
||||
<el-table-column prop="enterprise.industryType" label="行业类型" min-width="200">
|
||||
<template #default="{row}">
|
||||
<el-span>{{ DICTDISPLAYS.HYLB_MAP[row.enterprise.industryType] }}</el-span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="enterprise.unifiedSocialCode" label="统一信用代码" min-width="200"/>
|
||||
<el-table-column prop="createUserName" label="巡查人" min-width="200"/>
|
||||
<el-table-column prop="createTime" label="巡查时间" min-width="200"/>
|
||||
|
||||
<template #tableControlColumn="{ data: r }">
|
||||
<el-link
|
||||
v-if="r.data.row.isNormal === '1' && ( r.data.row.approvalStatus === '0' || r.data.row.approvalStatus === '2')"
|
||||
type="primary" @click="handOnlinePatrol(r.data.row)" title="在线审批">在线审批
|
||||
</el-link>
|
||||
</template>
|
||||
|
||||
<template #dialog>
|
||||
<el-dialog class="business-dialog" width="1200px" v-model="dialogConfig.show" :show-close="false"
|
||||
:append-to-body="true" :top="'0px'">
|
||||
<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="150px" class="browser-businesss-table-dialog-form" :model="dialogConfig.data"
|
||||
:rules="dialogConfig.rules" ref="formRef">
|
||||
<el-divider content-position="left">基本信息</el-divider>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="企业名称" prop="unitName">
|
||||
<el-input v-model="dialogConfig.data.enterprise.unitName" readonly/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="统一信用代码" prop="unifiedSocialCode">
|
||||
<el-input v-model="dialogConfig.data.enterprise.unifiedSocialCode" readonly/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="行业类型" prop="industryTypeMsg">
|
||||
<el-input v-model="dialogConfig.data.enterprise.industryTypeMsg" readonly/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="巡查人" prop="createUserName">
|
||||
<el-input v-model="dialogConfig.data.createUserName" readonly/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="巡查时间" prop="createTime">
|
||||
<el-input v-model="dialogConfig.data.createTime" readonly/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item :label="label" prop="description">
|
||||
<el-input type="textarea" v-model="dialogConfig.data.description" readonly/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row v-if="dialogConfig.mode !== 'detail'">
|
||||
<el-col :span="24">
|
||||
<el-form-item label="附件" prop="annex">
|
||||
<MultipleFile :parameters="fileParameters"
|
||||
:files-data="dialogConfig.data.annexs"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-divider content-position="left">审批信息</el-divider>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="审批人" prop="approvalUserName">
|
||||
<el-input v-model="dialogConfig.data.approvalUserName"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="是否审批通过" prop="approvalStatus">
|
||||
<el-select v-model="dialogConfig.data.approvalStatus" placeholder="请选择是否审批通过">
|
||||
<el-option v-for="item in DICTITEMS.SPZT_OPTIONS" :key="item.value" :label="item.label" :value="item.value"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="审批回执" prop="approvalReceipt">
|
||||
<el-input type="textarea" v-model="dialogConfig.data.approvalReceipt"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" v-if="dialogConfig.data.approvalStatus === '1'">
|
||||
<el-form-item label="检查类型" prop="checkType">
|
||||
<el-select v-model="dialogConfig.data.checkType" placeholder="请选择检查类型" clearable>
|
||||
<el-option v-for="item in DICTITEMS.JCLX_OPTIONS" :key="item.value" :label="item.label" :value="item.value"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" v-if="dialogConfig.data.approvalStatus === '1'">
|
||||
<el-form-item label="检查事项" prop="checkItemIds">
|
||||
<simple-check-item-selector v-model="dialogConfig.data.checkItemIds"
|
||||
:lazyLoad="true"
|
||||
multiple/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="cvi-dialog-footer">
|
||||
<el-button @click="dialogConfig.actions.handleClose">取消</el-button>
|
||||
<el-button type="primary" @click="dialogConfig.actions.handleDialogOk">确定</el-button>
|
||||
<!-- <el-button type="success" @click="dialogConfig.actions.handleDocument">在线巡查文书</el-button>-->
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog class="business-dialog" width="984px" v-model="dialogConfig1.show" :show-close="false"
|
||||
:append-to-body="true" :top="'0px'">
|
||||
<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>
|
||||
|
||||
<fxczfws></fxczfws>
|
||||
|
||||
</el-dialog>
|
||||
</template>
|
||||
</browser>
|
||||
</template>
|
||||
<script setup>
|
||||
import {reactive, toRefs, computed, ref} from 'vue'
|
||||
import {useUserStore} from '@/stores/modules/user'
|
||||
import onlinePatrol from '@/api/lawenforcement/OnlinePatrol'
|
||||
import {ElMessage} from 'element-plus'
|
||||
import {DICTDISPLAYS, DICTITEMS} from '@/utils/Constants.js'
|
||||
import SimpleCheckItemSelector from '@/components/SimpleCheckItemSelector.vue'
|
||||
import fxczfws from '@pages/fxczfgl/fxczfws.vue'
|
||||
import browser from '@/components/Browser.vue'
|
||||
import DictSelector from '@/components/DictSelector.vue'
|
||||
import MultipleFile from '@pages/common/MultipleFile.vue'
|
||||
import moment from 'moment'
|
||||
|
||||
let userInfo
|
||||
useUserStore().getUserInfo().then(data => userInfo = data)
|
||||
|
||||
const state = reactive({
|
||||
componentLoading: false,
|
||||
queryParams: {},
|
||||
permissions: {
|
||||
query: true,
|
||||
add: false,
|
||||
modify: false,
|
||||
detail: true,
|
||||
delete: false,
|
||||
deleteAll: false,
|
||||
importFile: false,
|
||||
exportFile: false,
|
||||
exportSelectFile: false,
|
||||
downloadTemp: false,
|
||||
canDetailCustom: (row) => row.isNormal === '0' || (row.isNormal === '1' && row.approvalStatus === '1'),
|
||||
},
|
||||
tableConfig: {
|
||||
controlWidth: '150',
|
||||
hasControlColumn: true,
|
||||
multipleSelect: false
|
||||
},
|
||||
apiConfig: {
|
||||
api: onlinePatrol,
|
||||
modelId: 'onlinePatrolId',
|
||||
},
|
||||
dialogConfig: {
|
||||
show: false,
|
||||
mode: 'detail',
|
||||
title: '在线审批',
|
||||
loading: false,
|
||||
data: {
|
||||
enterprise: {}
|
||||
},
|
||||
actions: {
|
||||
handleClose: handleClose,
|
||||
handleDialogOk: handOnlinePatrolApproval,
|
||||
handleDocument: handleDocument,
|
||||
},
|
||||
rules: {
|
||||
approvalUserName: [{required: true, message: '审批人不能为空', trigger: 'blur'}],
|
||||
approvalStatus: [{required: true, message: '审批状态不能为空', trigger: 'blur'}],
|
||||
approvalReceipt: [{required: true, message: '审批回执不能为空', trigger: 'blur'}],
|
||||
checkType: [{required: true, message: '审批回执不能为空', trigger: 'blur'}],
|
||||
checkItemIds: [{required: true, message: '审批回执不能为空', trigger: 'blur'}],
|
||||
},
|
||||
},
|
||||
dialogConfig1: {
|
||||
show: false,
|
||||
mode: 'detail',
|
||||
title: '文书信息',
|
||||
loading: false,
|
||||
data: {},
|
||||
actions: {
|
||||
handleClose: handleClose1,
|
||||
},
|
||||
},
|
||||
actions: {
|
||||
detail: handleDetail
|
||||
},
|
||||
fileParameters: {
|
||||
title: '相关材料',
|
||||
mode: 'detail',
|
||||
required: false,
|
||||
tableTitle: '证据材料'
|
||||
},
|
||||
})
|
||||
|
||||
const {
|
||||
componentLoading,
|
||||
queryParams,
|
||||
permissions,
|
||||
tableConfig,
|
||||
apiConfig,
|
||||
dialogConfig,
|
||||
dialogConfig1,
|
||||
actions,
|
||||
fileParameters
|
||||
} = toRefs(state)
|
||||
|
||||
let label = ref('简述')
|
||||
|
||||
function handleDetail(row) {
|
||||
label.value = '巡查结果'
|
||||
dialogConfig.value.show = true
|
||||
dialogConfig.value.mode = 'detail'
|
||||
dialogConfig.value.title = '在线审批详情'
|
||||
row.annexs.forEach(item => item.url = item.downloadUrl)
|
||||
// 审批人
|
||||
row.approvalUserId = userInfo.yhwybs
|
||||
row.approvalUserName = userInfo.xm
|
||||
// 行业类别
|
||||
row.enterprise.industryTypeMsg = DICTDISPLAYS.HYLB_MAP[row.enterprise.industryType]
|
||||
dialogConfig.value.data = row
|
||||
}
|
||||
|
||||
function handOnlinePatrol(row) {
|
||||
label.value = '简述'
|
||||
dialogConfig.value.show = true
|
||||
dialogConfig.value.mode = 'approve'
|
||||
dialogConfig.value.title = '在线审批'
|
||||
row.annexs.forEach(item => item.url = item.downloadUrl)
|
||||
// 审批人
|
||||
row.approvalUserId = userInfo.yhwybs
|
||||
row.approvalUserName = userInfo.xm
|
||||
// 行业类别
|
||||
row.enterprise.industryTypeMsg = DICTDISPLAYS.HYLB_MAP[row.enterprise.industryType]
|
||||
dialogConfig.value.data = row
|
||||
}
|
||||
|
||||
const formRef = ref()
|
||||
|
||||
function handOnlinePatrolApproval() {
|
||||
let _event = actions.value
|
||||
formRef.value.validate(valid => {
|
||||
if (valid) {
|
||||
dialogConfig.value.loading = true
|
||||
apiConfig.value.api.addOnlinePatrolApproval(dialogConfig.value.data).then(res => {
|
||||
if (res.success) {
|
||||
dialogConfig.value.loading = false
|
||||
dialogConfig.value.show = false
|
||||
ElMessage.success('操作成功')
|
||||
_event.query()
|
||||
} else {
|
||||
dialogConfig.value.loading = false
|
||||
throw new Error('操作失败')
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function handleClose() {
|
||||
dialogConfig.value.show = false
|
||||
}
|
||||
|
||||
// 文书信息
|
||||
function handleDocument() {
|
||||
dialogConfig1.value.show = true
|
||||
}
|
||||
|
||||
function handleClose1() {
|
||||
dialogConfig1.value.show = false
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.browser-businesss-table {
|
||||
.browser-businesss-table-dialog-form {
|
||||
padding: 10px 20px 10px 20px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue