zhzf/client/src/views/zfjgl/zfrygl.vue

272 lines
8.7 KiB
Vue
Raw Normal View History

<template>
<browser
:component-loading="componentLoading"
:api-config="apiConfig"
:table-config="tableConfig"
:permissions="permissions"
:dialog-config="dialogConfig"
:actions="actions"
:default-query-params="queryParams"
@update:query-params="queryParams = $event"
@update:actions="actions = $event"
@update:dialog-config="dialogConfig = $event"
>
<template #queryPanel="{ queryParams: qp }">
<el-form :model="qp" label-width="100px">
<el-row class="query-condition">
<el-col :span="6">
<el-form-item label="姓名" prop="officerName">
<el-input v-model="qp.officerName" placeholder="请输入姓名" clearable />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="执法号" prop="lawNo">
<el-input v-model="qp.lawNo" placeholder="请输入执法号" clearable />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="联系电话" prop="contactPhone">
<el-input v-model="qp.contactPhone" placeholder="请输入联系电话" clearable />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="系统用户ID" prop="certificateNo">
<el-input v-model="qp.certificateNo" placeholder="请输入系统用户ID" clearable />
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<el-table-column prop="officerName" label="姓名" min-width="140" show-overflow-tooltip />
<el-table-column prop="lawNo" label="执法号" min-width="140" />
<el-table-column prop="contactPhone" label="联系电话" min-width="140" />
<el-table-column prop="agencyName" label="机构名称" min-width="180" />
<el-table-column prop="certificateNo" label="系统用户ID" min-width="160" />
<template #dialogContent="{ dialogConfig: dc }">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="姓名" prop="officerName">
<el-input :disabled="dc.mode === 'detail'" v-model="dc.data.officerName" placeholder="请输入姓名" maxlength="100" show-word-limit />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="执法号" prop="lawNo">
<el-input :disabled="dc.mode === 'detail'" v-model="dc.data.lawNo" placeholder="请输入执法号" maxlength="50" show-word-limit />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="contactPhone">
<el-input :disabled="dc.mode === 'detail'" v-model="dc.data.contactPhone" placeholder="请输入联系电话" maxlength="20" show-word-limit />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="系统用户ID" prop="certificateNo">
<el-input :disabled="dc.mode === 'detail'" v-model="dc.data.certificateNo" placeholder="请输入系统用户ID" maxlength="50" show-word-limit />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="所属机构" prop="agency">
<AgencySelector v-model="dc.data.agency" :disabled="dc.mode === 'detail'" placeholder="请选择机构" :lazy-load="true" />
</el-form-item>
</el-col>
</el-row>
</template>
</browser>
</template>
<script setup>
import { reactive, toRefs, ref } from 'vue'
import Browser from '@/components/Browser.vue'
import BusinessTable from '@/components/BusinessTable.vue'
import AgencySelector from '@/components/AgencySelector.vue'
import { ElMessage } from 'element-plus'
import officers from '@/api/lawenforcement/Officer.js'
import agencies from '@/api/lawenforcement/Agency.js'
const busiTable = ref(null)
const phoneValidator = (rule, value, callback) => {
if (!value) return callback()
const mobile = /^(?:\+?86)?1[3-9]\d{9}$/
const landline = /^(\d{3,4}-?)?\d{7,8}$/
if (mobile.test(value) || landline.test(value)) return callback()
callback(new Error('联系电话格式不正确'))
}
async function handleDialogOk(formRef) {
const doValidate = () => new Promise((resolve) => {
if (!formRef) return resolve(true)
formRef.validate((valid) => resolve(valid))
})
const valid = await doValidate()
if (!valid) return
dialogConfig.value.loading = true
let res
try {
const payload = { ...dialogConfig.value.data }
payload.agencyId = payload.agency?.agencyId || payload.agencyId || null
delete payload.agency
if (dialogConfig.value.mode === 'add') {
res = await officers.add(payload)
} else if (dialogConfig.value.mode === 'modify') {
res = await officers.modify(payload[apiConfig.value.modelId], payload)
}
if (res?.success) {
dialogConfig.value.loading = false
dialogConfig.value.show = false
actions.value.query()
return
}
throw new Error('操作失败')
} catch (e) {
ElMessage.error(e.message || '操作失败')
} finally {
dialogConfig.value.loading = false
}
}
const state = reactive({
componentLoading: false,
permissions: {
query: true,
add: true,
modify: true,
detail: true,
delete: true,
deleteAll: true,
importFile: false,
exportFile: false,
exportSelectFile: false,
downloadTemp: false,
canDeleteCustom: () => true,
canModifyCustom: () => true,
canDetailCustom: () => true,
},
tableConfig: {
hasControlColumn: true,
controlWidth: '220',
tableLoading: false,
multipleSelect: true,
},
apiConfig: {
api: officers,
modelId: 'officerId',
},
dialogConfig: {
type: 'min',
show: false,
mode: 'detail',
formLabelWidth: '120px',
baseTitle: '执法人员',
loading: false,
rules: {
officerName: [
{ required: true, message: '姓名不能为空', trigger: 'blur' },
{ min: 1, max: 100, message: '姓名长度为1-100个字符', trigger: 'blur' }
],
lawNo: [
{ required: true, message: '执法号不能为空', trigger: 'blur' },
{ min: 1, max: 50, message: '执法号长度为1-50个字符', trigger: 'blur' }
],
contactPhone: [
{ validator: phoneValidator, trigger: 'blur' },
{ min: 0, max: 20, message: '联系电话长度不能超过20个字符', trigger: 'blur' }
],
certificateNo: [
{ min: 0, max: 50, message: '系统用户ID长度不能超过50个字符', trigger: 'blur' }
],
agency: [
{ required: true, message: '所属机构不能为空', trigger: 'change' }
]
},
data: {},
actions: { handleDialogOk }
},
actions: {
add: handleAdd,
detail: handleDetail,
modify: handleModify,
},
queryParams: {}
})
const {
componentLoading,
permissions,
tableConfig,
apiConfig,
dialogConfig,
actions,
queryParams,
} = toRefs(state)
async function handleAdd() {
dialogConfig.value.mode = 'add'
dialogConfig.value.title = '新增执法人员'
dialogConfig.value.data = {
officerId: null,
officerName: '',
lawNo: '',
contactPhone: '',
certificateNo: '',
agencyId: null,
agency: null,
}
dialogConfig.value.show = true
}
async function handleDetail(row) {
dialogConfig.value.data = {}
dialogConfig.value.title = '详情执法人员'
dialogConfig.value.show = true
dialogConfig.value.mode = 'detail'
dialogConfig.value.showFooter = false
dialogConfig.value.loading = true
try {
const res = await officers.findOne(row[apiConfig.value.modelId])
if (!res?.success) throw new Error('接口返回数据异常')
const data = res.data || {}
if (!data.agency && data.agencyId) {
try {
const a = await agencies.findOne(data.agencyId)
if (a?.success) data.agency = a.data
} catch (_) {}
}
dialogConfig.value.data = data
} catch (e) {
ElMessage.error(e.message || '详情加载失败')
} finally {
dialogConfig.value.loading = false
}
}
async function handleModify(row) {
dialogConfig.value.data = {}
dialogConfig.value.title = '修改执法人员'
dialogConfig.value.show = true
dialogConfig.value.mode = 'modify'
dialogConfig.value.loading = true
try {
const res = await officers.findOne(row[apiConfig.value.modelId])
if (!res?.success) throw new Error('接口返回数据异常')
const data = res.data || {}
if (!data.agency && data.agencyId) {
try {
const a = await agencies.findOne(data.agencyId)
if (a?.success) data.agency = a.data
} catch (_) {}
}
dialogConfig.value.data = data
} catch (e) {
ElMessage.error(e.message || '详情加载失败')
} finally {
dialogConfig.value.loading = false
}
}
</script>
<style lang="scss" scoped>
</style>