| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626 |
- <template>
- <div class="formtDialog">
- <!-- 被监审单位表单弹窗组件 -->
- <CostAuditDialog
- :visible="dialogVisible"
- :title="dialogTitle"
- :width="dialogWidth"
- :close-on-click-modal="false"
- :disabled="isViewMode"
- :confirm-loading="submitting"
- @confirm="handleConfirm"
- @cancel="handleCancel"
- @close="handleCancel"
- >
- <div class="formtDialog-content">
- <!-- 使用Element表单直接实现 -->
- <el-form
- ref="formRef"
- :model="formData"
- :rules="formRules"
- label-width="140px"
- class="form-container"
- >
- <el-row :gutter="20">
- <!-- 被监审单位名称 -->
- <el-col :span="24">
- <el-form-item label="被监审单位名称:" prop="unitName">
- <el-input
- v-model="formData.unitName"
- placeholder="请输入被监审单位名称"
- :disabled="isViewMode"
- />
- </el-form-item>
- </el-col>
- <!-- 社会信用代码 和 所属区域 -->
- <el-col :span="12">
- <el-form-item label="社会信用代码:" prop="socialCreditCode">
- <el-input
- v-model="formData.socialCreditCode"
- placeholder="请输入社会信用代码"
- :disabled="isViewMode"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="所属区域:" prop="areaCode">
- <el-cascader
- v-model="formData.areaCode"
- :options="districtTree"
- :show-all-levels="false"
- :props="districtTreeCascaderProps"
- style="width: 100%"
- placeholder="请选择所属区域"
- :disabled="isViewMode"
- />
- </el-form-item>
- </el-col>
- <!-- 办公地址 -->
- <el-col :span="24">
- <el-form-item label="办公地址:" prop="address">
- <el-input
- v-model="formData.address"
- placeholder="请输入办公地址"
- :disabled="isViewMode"
- />
- </el-form-item>
- </el-col>
- <!-- 主体性质 和 关联子单位 -->
- <el-col :span="12">
- <el-form-item label="主体性质:" prop="entityType">
- <el-select
- v-model="formData.entityType"
- placeholder="请选择主体性质"
- style="width: 100%"
- :disabled="isViewMode"
- >
- <el-option
- v-for="item in entityTypeOptions"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col v-if="formData.entityType != '子公司'" :span="12">
- <el-form-item label="关联子单位:" prop="relatedUnits">
- <el-select
- v-model="formData.relatedUnits"
- placeholder="请选择关联子单位"
- multiple
- style="width: 100%"
- :disabled="isViewMode"
- >
- <el-option
- v-for="item in filteredUnits"
- :key="item.unitId"
- :label="item.unitName"
- :value="item.unitId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <!-- 关联监审项目 -->
- <el-col :span="24">
- <el-form-item label="关联监审项目:" prop="relatedItems">
- <el-cascader
- v-model="formData.relatedItems"
- :options="catalogListOptions"
- v-bind="catalogProps"
- style="width: 100%"
- placeholder="请选择关联监审项目"
- :disabled="isViewMode"
- />
- </el-form-item>
- </el-col>
- <!-- 联系人 和 联系手机 -->
- <el-col :span="12">
- <el-form-item label="联系人:" prop="contactName">
- <el-input
- v-model="formData.contactName"
- placeholder="请输入联系人"
- :disabled="isViewMode"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="联系手机:" prop="contactMobile">
- <el-input
- v-model="formData.contactMobile"
- placeholder="请输入手机号码或座机号码"
- :disabled="isViewMode"
- />
- </el-form-item>
- </el-col>
- <!-- 电子邮箱 和 邮政编码 -->
- <el-col :span="12">
- <el-form-item label="电子邮箱:" prop="email">
- <el-input
- v-model="formData.email"
- placeholder="请输入电子邮箱"
- :disabled="isViewMode"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="邮政编码:" prop="postalCode">
- <el-input
- v-model="formData.postalCode"
- placeholder="请输入邮政编码"
- :disabled="isViewMode"
- />
- </el-form-item>
- </el-col>
- <!-- 账号 和 状态 -->
- <el-col :span="12">
- <el-form-item label="账号:" prop="account">
- <el-select
- v-model="formData.account"
- placeholder="请选择账号"
- style="width: 100%"
- :disabled="isViewMode"
- @change="handleAccountChange"
- >
- <el-option
- v-for="(item, index) in userList"
- :key="index"
- :label="item.fullname"
- :value="item.userId"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="状态:" prop="status">
- <el-radio-group
- v-model="formData.status"
- :disabled="isViewMode"
- >
- <el-radio
- v-for="item in statusOptions"
- :key="item.value"
- :label="item.value"
- >
- {{ item.label }}
- </el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- </div>
- </CostAuditDialog>
- </div>
- </template>
- <script>
- // 引入API接口
- import {
- getAuditedUnitDetail,
- addAuditedUnit,
- editAuditedUnit,
- getAllUnitList,
- } from '@/api/auditEntityManage'
- // 引入地区选择混入
- import { regionMixin, catalogMixin, commonMixin } from '@/mixins/useDict'
- // 引入弹窗组件
- import CostAuditDialog from '@/components/costAudit/CostAuditDialog'
- import { getAllUserList } from '@/api/uc'
- export default {
- name: 'AuditEntityFormtDialog',
- // 注册组件
- components: {
- CostAuditDialog,
- },
- // 使用混入
- mixins: [regionMixin, catalogMixin, commonMixin],
- // 组件属性
- props: {
- // 弹窗可见状态
- dialogVisible: {
- type: Boolean,
- default: false,
- },
- // 弹窗标题
- dialogTitle: {
- type: String,
- default: '',
- },
- // 弹窗宽度
- dialogWidth: {
- type: String,
- default: '50%',
- },
- // 单位ID(编辑/查看模式下使用)
- unitId: {
- type: String,
- default: '',
- },
- // 是否为查看模式
- isViewMode: {
- type: Boolean,
- default: false,
- },
- },
- // 组件数据
- data() {
- return {
- // 提交状态
- submitting: false,
- // 所有单位列表
- allUnits: [],
- // 主体性质选项
- entityTypeOptions: [
- {
- label: '母公司',
- value: '母公司',
- },
- {
- label: '本部',
- value: '本部',
- },
- {
- label: '子公司',
- value: '子公司',
- },
- ],
- // 账号列表
- userList: [],
- // 状态选项
- statusOptions: [
- {
- label: '启用',
- value: 1,
- },
- {
- label: '停用',
- value: 0,
- },
- ],
- // 表单数据
- formData: {
- unitId: '', // 单位ID
- unitName: '', // 单位名称
- socialCreditCode: '', // 社会信用代码
- areaCode: [], // 区域代码
- address: '', // 办公地址
- entityType: '', // 主体性质
- relatedUnits: [], // 关联子单位
- relatedItems: [], // 关联监审项目
- contactName: '', // 联系人
- contactMobile: '', // 联系手机
- email: '', // 电子邮箱
- postalCode: '', // 邮政编码
- account: '', // 账号
- password: '', // 密码
- status: 1, // 状态(默认为启用)
- },
- // 表单验证规则
- formRules: {
- unitName: [
- {
- required: true,
- message: '请输入被监审单位名称',
- trigger: 'blur',
- },
- {
- min: 1,
- max: 30,
- message: '单位名称长度应在30个字符之间',
- trigger: 'blur',
- },
- {
- pattern: /^[\u4e00-\u9fa5a-zA-Z0-9()()\-\_\s]*$/,
- message: '单位名称只能包含中英文、数字、括号、横线、下划线和空格',
- trigger: 'blur',
- },
- ],
- socialCreditCode: [
- { required: true, message: '请输入社会信用代码', trigger: 'blur' },
- { len: 18, message: '社会信用代码应为18位', trigger: 'blur' },
- {
- pattern: /^[0-9A-Za-z]{18}$/,
- message: '社会信用代码只能包含大写字母和数字',
- trigger: 'blur',
- },
- // 社会信用代码校验规则
- {
- validator: (rule, value, callback) => {
- // 社会信用代码第1位:登记管理部门代码
- const firstChar = value.charAt(0)
- if (!/^[1-9A-Za-z]$/.test(firstChar)) {
- callback(new Error('社会信用代码格式不正确'))
- return
- }
- callback()
- },
- trigger: 'blur',
- },
- ],
- areaCode: [
- { required: true, message: '请选择所属区域', trigger: 'change' },
- ],
- address: [
- { required: true, message: '请输入办公地址', trigger: 'blur' },
- {
- min: 1,
- max: 200,
- message: '办公地址长度应在1-200个字符之间',
- trigger: 'blur',
- },
- {
- pattern: /^[\u4e00-\u9fa5a-zA-Z0-9\-\_\.\s\#\/\,\(\)()]*$/,
- message:
- '地址只能包含中英文、数字、横线、下划线、点、空格、井号、斜杠、逗号和括号',
- trigger: 'blur',
- },
- ],
- entityType: [
- { required: true, message: '请选择主体性质', trigger: 'change' },
- ],
- relatedItems: [
- {
- required: true,
- message: '请至少选择一个关联监审项目',
- trigger: 'change',
- },
- {
- type: 'array',
- min: 1,
- message: '请至少选择一个关联监审项目',
- trigger: 'change',
- },
- ],
- contactName: [
- { required: true, message: '请输入联系人', trigger: 'blur' },
- {
- min: 1,
- max: 50,
- message: '联系人长度应在1-50个字符之间',
- trigger: 'blur',
- },
- {
- pattern: /^[\u4e00-\u9fa5a-zA-Z\s]*$/,
- message: '联系人只能包含中英文和空格',
- trigger: 'blur',
- },
- ],
- contactMobile: [
- { required: true, message: '请输入联系手机', trigger: 'blur' },
- {
- pattern: /^(1[3-9]\d{9}|(0\d{2,3}-?\d{7,8}|\d{7,8}))$/,
- message: '请输入正确的手机号码或座机号码',
- trigger: 'blur',
- },
- ],
- email: [
- { required: true, message: '请输入电子邮箱', trigger: 'blur' },
- { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' },
- {
- min: 1,
- max: 100,
- message: '邮箱长度应在1-100个字符之间',
- trigger: 'blur',
- },
- ],
- postalCode: [
- { required: true, message: '请输入邮政编码', trigger: 'blur' },
- {
- pattern: /^\d{6}$/,
- message: '邮政编码应为6位数字',
- trigger: 'blur',
- },
- { len: 6, message: '邮政编码应为6位数字', trigger: 'blur' },
- ],
- account: [
- { required: true, message: '请选择账号', trigger: 'change' },
- ],
- status: [
- { required: true, message: '请选择状态', trigger: 'change' },
- ],
- },
- }
- },
- // 计算属性
- computed: {
- // 过滤后的单位列表 - 排除当前单位
- filteredUnits() {
- return this.formData.unitName
- ? this.allUnits.filter(
- (item) => item.unitName !== this.formData.unitName
- )
- : this.allUnits
- },
- },
- // 监听器
- watch: {
- // 监听弹窗可见状态变化
- dialogVisible(newVal) {
- if (newVal) {
- // 弹窗打开时加载选项数据
- this.loadOpts()
- // 根据是否有unitId判断是编辑模式还是新增模式
- if (this.unitId) {
- // 编辑模式:加载单位详情
- this.loadUnitDetail()
- } else {
- // 新增模式:重置表单
- this.resetForm()
- }
- }
- },
- },
- // 组件方法
- methods: {
- getUser() {
- getAllUserList()
- .then((res) => {
- this.userList = res.value || []
- })
- .catch(() => {})
- },
- // 重置表单
- resetForm() {
- this.formData = {
- unitId: '',
- unitName: '',
- socialCreditCode: '',
- areaCode: ['140000'], // 默认选择山西省
- address: '',
- entityType: '',
- relatedUnits: [],
- relatedItems: [],
- contactName: '',
- contactMobile: '',
- email: '',
- postalCode: '',
- account: '',
- password: '',
- status: 1,
- }
- // 确保表单重置生效
- this.$nextTick(() => {
- if (this.$refs.formRef) {
- this.$refs.formRef.resetFields()
- }
- })
- },
- // 加载选项数据
- loadOpts() {
- // 加载所有单位列表
- getAllUnitList({ unitId: this.formData.unitId }).then((res) => {
- this.allUnits = res.value || []
- // 过滤掉状态为停用的数据
- this.allUnits = this.allUnits.filter((item) => item.status == 1)
- })
- this.getUser()
- },
- // 加载单位详情
- loadUnitDetail() {
- getAuditedUnitDetail({ unitId: this.unitId }).then((res) => {
- // 处理级联选择器多选回显数据
- const result = this.formatRelatedItemsForDisplay({
- relatedItems: {
- value: res.value.relatedItems,
- options: this.catalogListOptions,
- id: 'id',
- parentId: 'parentId',
- },
- })
- // 格式化接口返回的数据
- this.formData = {
- ...res.value,
- // 将逗号分隔的字符串转换为数组
- relatedUnits: res.value.relatedUnits
- ? res.value.relatedUnits.split(',')
- : [],
- relatedItems: result.relatedItems,
- // 构建区域级联数据
- areaCode: [
- res.value.province,
- ...(res.value.areaLevel >= 1 ? [res.value.city] : []),
- ...(res.value.areaLevel === 2 ? [res.value.county] : []),
- ].filter(Boolean),
- }
- })
- },
- // 处理账号变更
- handleAccountChange(val) {
- if (val) {
- // 根据选择的账号自动填充密码
- const selectedAccount = this.userList.find(
- (item) => item.userId === val
- )
- if (selectedAccount) {
- this.$set(this.formData, 'password', selectedAccount.password)
- }
- }
- },
- // 处理确认提交
- async handleConfirm() {
- // 防止重复提交
- if (this.submitting) {
- this.$message.warning('提交中,请稍后...')
- return
- }
- try {
- // 调用表单验证
- await this.$refs.formRef.validate()
- this.submitting = true
- // 处理级联选择器多选数据
- const resultData = this.extractLastLevelValues({
- relatedItems: this.formData.relatedItems,
- })
- // 构建提交数据
- const submitData = {
- ...this.formData,
- // 将数组转换为逗号分隔的字符串
- relatedUnits: this.formData.relatedUnits
- ? this.formData.relatedUnits.join(',')
- : '',
- relatedItems: this.formData.relatedItems
- ? resultData.relatedItems
- : '',
- // 计算区域级别和区域代码
- areaLevel:
- this.formData.areaCode.length > 0
- ? this.formData.areaCode.length - 1
- : '',
- areaCode:
- this.formData.areaCode.length > 0
- ? this.formData.areaCode[this.formData.areaCode.length - 1]
- : '',
- }
- // 根据是否有unitId判断是添加还是修改操作
- let result
- if (!this.formData.unitId) {
- // 添加操作
- result = await addAuditedUnit(submitData)
- } else {
- // 修改操作
- result = await editAuditedUnit(submitData)
- }
- // 处理操作结果
- if (result.code === 200) {
- const action = this.formData.unitId ? '修改' : '添加'
- this.$message.success(`${action}成功`)
- // 成功后将表单数据传递给父组件
- this.$emit('confirm', this.formData, result.value)
- }
- } catch (error) {
- console.error('提交失败:', error)
- this.$message.error('表单验证失败,请检查输入')
- } finally {
- // 无论成功失败,都重置提交状态
- this.submitting = false
- }
- },
- // 处理取消/关闭
- handleCancel() {
- // 通知父组件关闭弹窗
- this.$emit('update:dialogVisible', false)
- },
- },
- }
- </script>
- <style scoped>
- .formtDialog-content {
- padding: 20px 0;
- }
- .form-container {
- width: 100%;
- }
- </style>
|