admin-vue3/src/views/crm/stationsite/StationSiteForm.vue

282 lines
9.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="130px"
v-loading="formLoading"
>
<el-row>
<el-col :span="12">
<el-form-item label="场地名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入场地名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="场地状态" prop="siteStatus">
<el-select v-model="formData.siteStatus" placeholder="请选择场地状态" class="w-1/1">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_STATION_SITE_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="场地类型" prop="type">
<el-select v-model="formData.siteType" placeholder="请选择场地类型" class="w-1/1">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_STATION_SITE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="10">
<el-form-item label="可建充电桩数" prop="estimatedPiles" >
<el-input-number v-model="formData.estimatedPiles" :min="0" :max="255" :step="1"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="地区" prop="areaId">
<el-cascader
v-model="formData.areaId"
:options="areaList"
:props="defaultProps"
class="w-1/1"
clearable
filterable
placeholder="请选择地区"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="详细地址" prop="detailAddress">
<el-input v-model="formData.detailAddress" placeholder="请输入详细地址" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="停车位数" prop="parkingSpaces">
<el-input-number v-model="formData.parkingSpaces" :min="0" :max="255" :step="1" placeholder="0" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="租金或分成" prop="rentPrice">
<el-input v-model="formData.rentPrice" placeholder="请输入租金或分成" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="定位经度" prop="locationLng">
<el-input v-model="formData.locationLng" placeholder="请输入定位经度" />
</el-form-item>
<el-form-item label="定位纬度" prop="locationLat">
<el-input v-model="formData.locationLat" placeholder="请输入定位纬度" />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="关联的业主方" prop="ownerId">
<el-input v-model="formData.ownerId" placeholder="请输入关联的业主方" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="关联的物管方" prop="managementId">
<el-input v-model="formData.managementId" placeholder="请输入关联的物管方" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="推荐人姓名" prop="recommenderName">
<el-input v-model="formData.recommenderName" placeholder="请输入推荐人姓名" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="推荐人联系方式" prop="recommenderContact">
<el-input v-model="formData.recommenderContact" placeholder="请输入推荐人联系方式" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="交通情况" prop="params.traffic">
<el-input v-model="formData.params.traffic" type="textarea" placeholder="请输入交通情况" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="电力距离" prop="params.powerDistance">
<el-input v-model="formData.params.powerDistance" placeholder="请输入电力距离" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="道闸情况" prop="params.barrierGate">
<el-input v-model="formData.params.barrierGate" placeholder="请输入道闸情况" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="周边竞品" prop="params.competitor">
<el-input v-model="formData.params.competitor" placeholder="请输入周边竞品" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="附加图片" prop="picUrls">
<UploadImgs v-model="formData.picUrls" />
</el-form-item>
<el-form-item label="附件" prop="fileUrls">
<UploadFile v-model="formData.fileUrls" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { StationSiteApi, StationSiteVO } from '@/api/crm/stationsite'
import { defaultProps } from '@/utils/tree'
import * as AreaApi from '@/api/system/area'
import { ro } from 'element-plus/es/locale'
/** 场地信息 表单 */
defineOptions({ name: 'StationSiteForm' })
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 表单的加载中1修改时的数据加载2提交的按钮禁用
const formType = ref('') // 表单的类型create - 新增update - 修改
const formData = ref({
id: undefined,
name: undefined,
areaId: undefined,
detailAddress: undefined,
locationLng: undefined,
locationLat: undefined,
estimatedPiles: 0,
siteStatus: undefined,
siteType: undefined,
ownerId: undefined,
managementId: undefined,
recommenderName: undefined,
recommenderContact: undefined,
picUrls: undefined,
fileUrls: undefined,
parkingSpaces: 0,
rentPrice: '',
params: {
traffic: '',
powerDistance: '',
barrierGate: '',
competitor: ''
},
})
const areaList = ref([]) // 地区列表
const formRules = reactive({
name: [{ required: true, message: '场地名称不能为空', trigger: 'blur' }],
areaId: [{ required: true, message: '地区不能为空', trigger: 'blur' }],
locationLng: [{ required: true, message: '定位经度不能为空', trigger: 'blur' }],
locationLat: [{ required: true, message: '定位纬度不能为空', trigger: 'blur' }],
estimatedPiles: [{ required: true, message: '可建充电桩数不能为空', trigger: 'blur' }],
siteStatus: [{ required: true, message: '场地状态不能为空', trigger: 'blur' }],
recommenderName: [{ required: true, message: '推荐人姓名不能为空', trigger: 'blur' }],
recommenderContact: [{ required: true, message: '推荐人联系方式不能为空', trigger: 'blur' }],
})
const formRef = ref() // 表单 Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
// 修改时,设置数据
if (id) {
formLoading.value = true
try {
formData.value = await StationSiteApi.getStationSite(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const submitForm = async () => {
// 校验表单
await formRef.value.validate()
// 提交请求
formLoading.value = true
try {
const data = {
...formData.value,
params: JSON.stringify(formData.value.params)
} as unknown as StationSiteVO
if (formType.value === 'create') {
await StationSiteApi.createStationSite(data)
message.success(t('common.createSuccess'))
} else {
await StationSiteApi.updateStationSite(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
// 发送操作成功的事件
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
name: undefined,
areaId: undefined,
detailAddress: undefined,
locationLng: undefined,
locationLat: undefined,
estimatedPiles: 0,
siteStatus: undefined,
type: undefined,
ownerId: undefined,
managementId: undefined,
recommenderName: undefined,
recommenderContact: undefined,
planPicUrls: undefined,
picUrls: undefined,
fileUrls: undefined,
parkingSpaces: 0,
rentPrice: 0,
params: {
traffic: '',
powerDistance: '',
barrierGate: '',
competitor: ''
}
}
formRef.value?.resetFields()
}
/** 初始化 **/
onMounted(() => {
AreaApi.getAreaTree().then(res => {
areaList.value = res
})
})
</script>