309 lines
9.2 KiB
Vue
309 lines
9.2 KiB
Vue
<template>
|
|
<el-dialog :title="form.id ? '编辑' : '新增'" width="40%" v-model="visible" :close-on-click-modal="false" draggable>
|
|
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="110px" v-loading="loading">
|
|
<el-row :gutter="24">
|
|
<el-col :span="24" class="mb20">
|
|
<el-form-item label="商户名" prop="name">
|
|
<el-input v-model.trim="form.name" placeholder="请输入商户名" />
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="24" class="mb20">
|
|
<el-form-item label="部门" prop="deptId">
|
|
<select-dept v-model="form.deptId" placeholder="请选择部门" />
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="24" class="mb20">
|
|
<el-form-item label="商户类型" prop="merchantType">
|
|
<el-radio-group v-model="form.merchantType">
|
|
<el-radio
|
|
:label="item.value"
|
|
:disabled="merchantTypeRadioDisabled"
|
|
v-for="(item, index) in merchant_type"
|
|
border
|
|
:key="index"
|
|
@click="handleClickRadio(item.value)"
|
|
>
|
|
{{ item.label }}
|
|
</el-radio>
|
|
</el-radio-group>
|
|
</el-form-item>
|
|
</el-col>
|
|
|
|
<el-col v-if="form.merchantType == '2'" :span="24" class="mb20">
|
|
<el-form-item label="商户分店" prop="merchantBranch">
|
|
<el-radio-group v-model="form.merchantBranch" @change="(value:number) => form.merchantBranch = value">
|
|
<el-radio :label="1">总店</el-radio>
|
|
<el-radio :label="2">分店</el-radio>
|
|
</el-radio-group>
|
|
</el-form-item>
|
|
</el-col>
|
|
|
|
<el-col v-if="form.merchantType == '2' && form.merchantBranch == 2" :span="24" class="mb20">
|
|
<el-form-item label="合作状态" prop="cooperationStatus">
|
|
<el-switch v-model="form.cooperationStatus" />
|
|
</el-form-item>
|
|
</el-col>
|
|
|
|
<el-col v-if="form.merchantType == '2' && form.merchantBranch == 2" :span="24" class="mb20">
|
|
<el-form-item label="总店" prop="parentId">
|
|
<el-tree-select
|
|
v-model="form.parentId"
|
|
:data="merchantTree"
|
|
:props="{ value: 'id', label: 'name', children: 'children', disabled: 'isLock' }"
|
|
check-strictly
|
|
class="w100"
|
|
clearable
|
|
filterable
|
|
placeholder="请选择主店"
|
|
/>
|
|
</el-form-item>
|
|
</el-col>
|
|
|
|
<el-col v-if="form.merchantType == '2' && form.merchantBranch == 2" :span="12" class="mb20">
|
|
<el-form-item label="优惠价格" prop="discountsPrice">
|
|
<el-input-number v-model="form.discountsPrice" :min="0" :max="1000" :precision="0" />
|
|
</el-form-item>
|
|
</el-col>
|
|
|
|
<el-col :span="24" class="mb20">
|
|
<el-form-item label="商户logo" prop="logoPic">
|
|
<upload-img v-model:imageUrl="form.logoPic" />
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="24" class="mb20">
|
|
<el-form-item label="轮播图" prop="swiperPic">
|
|
<upload-imgs v-model="form.swiperPic" />
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="12" class="mb20">
|
|
<el-form-item prop="sort">
|
|
<template #label>
|
|
<span>排序</span>
|
|
<tip content="越大越在前" />
|
|
</template>
|
|
<el-input-number v-model="form.sort" placeholder="" />
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="24" class="mb20">
|
|
<el-form-item label="联系电话" prop="phone">
|
|
<el-input v-model.trim="form.phone" placeholder="请输入联系电话" />
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="24" class="mb20">
|
|
<el-form-item label="营业时间:" class="my-0" />
|
|
<el-form-item class="ml-2" label="早上" prop="jobTime">
|
|
<el-time-picker
|
|
v-model="jobTime.morning"
|
|
placeholder="请选择营业时间"
|
|
is-range
|
|
range-separator="至"
|
|
start-placeholder="开始日期"
|
|
end-placeholder="结束日期"
|
|
value-format="HH:mm"
|
|
format="HH:mm"
|
|
/>
|
|
</el-form-item>
|
|
<el-form-item class="ml-2" label="中午" prop="jobTime">
|
|
<el-time-picker
|
|
v-model="jobTime.noon"
|
|
placeholder="请选择营业时间"
|
|
is-range
|
|
range-separator="至"
|
|
start-placeholder="开始日期"
|
|
end-placeholder="结束日期"
|
|
value-format="HH:mm"
|
|
format="HH:mm"
|
|
/>
|
|
</el-form-item>
|
|
<el-form-item class="ml-2" label="晚上" prop="jobTime">
|
|
<el-time-picker
|
|
v-model="jobTime.evening"
|
|
placeholder="请选择营业时间"
|
|
is-range
|
|
range-separator="至"
|
|
start-placeholder="开始日期"
|
|
end-placeholder="结束日期"
|
|
value-format="HH:mm"
|
|
format="HH:mm"
|
|
/>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="24" class="mb20">
|
|
<el-form-item label="店铺地址" prop="addressDes">
|
|
<el-input type="textarea" v-model.trim="form.addressDes" placeholder="请输入店铺地址" />
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
</el-form>
|
|
<template #footer>
|
|
<el-button @click="visible = false">取消</el-button>
|
|
<el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
</template>
|
|
|
|
<script setup lang="ts" name="MerchantInfoDialog">
|
|
import { useDict } from "/@/hooks/dict"
|
|
import { useMessage } from "/@/hooks/message"
|
|
import { pageJoin, getObj, addObj, putObj } from "/@/api/wallet/mch-manage"
|
|
|
|
const emit = defineEmits(["refresh"])
|
|
|
|
// 定义变量内容
|
|
const dataFormRef = ref()
|
|
const visible = ref(false)
|
|
const loading = ref(false)
|
|
const merchantTree = ref<any[]>([])
|
|
|
|
// 定义字典
|
|
const { merchant_type } = useDict("merchant_type")
|
|
|
|
// 提交表单数据
|
|
const form = reactive({
|
|
id: "",
|
|
deptId: "",
|
|
name: "",
|
|
merchantType: "",
|
|
logoPic: "",
|
|
collectMoneyCode: "",
|
|
swiperPic: "",
|
|
isSyncZy: "0",
|
|
visibleMobile: "0",
|
|
phone: "",
|
|
businessTime: "",
|
|
addressDes: "",
|
|
sort: 0,
|
|
merchantBranch: 1,
|
|
cooperationStatus: "0",
|
|
parentId: "",
|
|
discountsPrice: null,
|
|
})
|
|
const jobTime = reactive<{
|
|
[key: string]: string[]
|
|
}>({
|
|
morning: [],
|
|
noon: [],
|
|
evening: [],
|
|
})
|
|
const merchantTypeRadioDisabled = ref(false)
|
|
|
|
// 定义校验规则
|
|
const dataRules = ref({
|
|
name: [{ required: true, message: "商户名不能为空", trigger: "blur" }],
|
|
types: [{ required: true, message: "请选择商户类型", trigger: "blur" }],
|
|
logoPic: [{ required: true, message: "请上传商户logo", trigger: "blur" }],
|
|
swiperPic: [{ required: true, message: "请上传商户轮播图", trigger: "blur" }],
|
|
rangeDate: [{ required: true, message: "请选择营业时间", trigger: "blur" }],
|
|
deptId: [{ required: true, message: "请选择部门", trigger: "blur" }],
|
|
merchantType: [{ required: true, message: "请选择商户类型", trigger: "blur" }],
|
|
sort: [{ required: true, message: "请输入排序", trigger: "blur" }],
|
|
// jobTime: [{ required: true, message: "请选择营业时间", trigger: "blur" }],
|
|
cooperationStatus:
|
|
form.merchantType == "2" && form.merchantBranch == 2 ? [{ required: true, message: "请选择合作状态", trigger: "blur" }] : [],
|
|
parentId: form.merchantType == "2" && form.merchantBranch == 2 ? [{ required: true, message: "请选择主店", trigger: "blur" }] : [],
|
|
})
|
|
|
|
// 打开弹窗
|
|
const openDialog = async (id: string) => {
|
|
visible.value = true
|
|
form.id = ""
|
|
|
|
// 重置表单数据
|
|
dataFormRef.value?.resetFields()
|
|
for (const key in jobTime) {
|
|
jobTime[key] = []
|
|
}
|
|
|
|
// 获取merchantInfo信息
|
|
if (id) {
|
|
form.id = id
|
|
await getmerchantInfoData(id)
|
|
}
|
|
|
|
await getMerchantTreeData()
|
|
}
|
|
|
|
// 获取商户树数据
|
|
const getMerchantTreeData = async () => {
|
|
const res = await pageJoin({ current: 1, size: 9999 })
|
|
if (res.code == 0) {
|
|
merchantTree.value = res.data.records
|
|
} else {
|
|
merchantTree.value = []
|
|
}
|
|
}
|
|
|
|
watch(
|
|
() => form.merchantType,
|
|
(newVal) => {
|
|
if (newVal != "2") {
|
|
form.merchantBranch = 1
|
|
form.cooperationStatus = "0"
|
|
form.parentId = ""
|
|
}
|
|
},
|
|
)
|
|
|
|
// 提交
|
|
const onSubmit = async () => {
|
|
const valid = await dataFormRef.value.validate().catch(() => {})
|
|
if (!valid) return false
|
|
const _pa = {
|
|
...form,
|
|
isSyncZy: form.isSyncZy ? "1" : "0",
|
|
types: form.merchantType,
|
|
jobTime: (jobTime.morning?.join("-") || "") + "," + (jobTime.noon?.join("-") || "") + "," + (jobTime.evening?.join("-") || ""),
|
|
}
|
|
try {
|
|
loading.value = true
|
|
form.id ? await putObj(_pa) : await addObj(_pa)
|
|
useMessage().success(form.id ? "修改成功" : "添加成功")
|
|
visible.value = false
|
|
emit("refresh")
|
|
} catch (err: any) {
|
|
useMessage().error(err.msg)
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
// 初始化表单数据
|
|
const getmerchantInfoData = async (id: string) => {
|
|
loading.value = true
|
|
try {
|
|
const res = await getObj(id)
|
|
if (res.code === 0) {
|
|
const regex = /^.*?,.*?,.*?$/
|
|
const resJobTime = res.data.jobTime && regex.test(res.data.jobTime) ? res.data.jobTime.split(",") : []
|
|
Object.assign(form, res.data, {
|
|
merchantType: res.data.types,
|
|
isSyncZy: res.data.isSyncZy == "1" ? true : false,
|
|
})
|
|
jobTime.morning = resJobTime[0]?.split("-") ?? []
|
|
jobTime.noon = resJobTime[1]?.split("-") ?? []
|
|
jobTime.evening = resJobTime[2]?.split("-") ?? []
|
|
}
|
|
} catch (error: any) {
|
|
useMessage().error(error.msg)
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
// 点击商户类型单选按钮
|
|
const handleClickRadio = (radioItemValue: string) => {
|
|
if (radioItemValue === form.merchantType) {
|
|
form.merchantType = ""
|
|
merchantTypeRadioDisabled.value = true
|
|
setTimeout(() => {
|
|
merchantTypeRadioDisabled.value = false
|
|
}, 0)
|
|
}
|
|
}
|
|
|
|
// 暴露变量
|
|
defineExpose({
|
|
openDialog,
|
|
})
|
|
</script>
|