Files
pj_admin_cloud/src/views/mch/mch-manage/form.vue
T
2026-09-30 15:07:33 +08:00

321 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<el-dialog :title="form.id ? '编辑' : '新增'" width="50%" v-model="visible" :close-on-click-modal="false" draggable>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="140px" 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="types">
<el-radio-group v-model="form.types">
<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.types == '2'" :span="24" class="mb20">
<el-form-item label="合作商家类型:" prop="supType">
<el-radio-group v-model="form.supType" @change="(value: string) => form.supType = value">
<el-radio border :label="item.value" v-for="(item, index) in wallet_mch_sup_type"
:key="index">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col v-if="form.types == '2' && form.supType == '20'" :span="24" class="mb20">
<el-form-item label="合作状态:" prop="cooperationStatus">
<el-radio-group v-model="form.cooperationStatus">
<el-radio border :label="item.value" v-for="(item, index) in yes_no_type" :key="index">{{
item.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col v-if="form.types == '2' && form.supType == '20'" :span="24" class="mb20">
<el-form-item label="品牌:" prop="parentId">
<select-mch v-model="form.parentId" :apiParams="{ types: '2', supType: '10' }" />
</el-form-item>
</el-col>
<el-col v-if="form.types == '2'" :span="24" class="mb20">
<el-form-item label="分类:" prop="catgoryId">
<select-mch-catory v-model="form.catgoryId" :apiParams="{ bizType: form.types }" />
</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 v-if="form.types == '1'" :span="24" class="mb20">
<el-form-item prop="sort">
<template #label>
<span>是否对外开放:</span>
<tip content="食堂是否对外开放(对外开放非食堂人员可以在手机端看到食堂信息)" />
</template>
<el-radio-group v-model="form.canteenIsOpen">
<el-radio v-for="v in yes_no_type" :key="v.value" :label="v.value" border>
{{ v.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col v-if="form.types == '2'" :span="12" class="mb20">
<el-form-item label="优惠价格:" prop="discountsPrice">
<el-input v-model="form.discountsPrice" />
</el-form-item>
</el-col>
<el-col v-if="form.types == '2'" :span="12" class="mb20">
<el-form-item prop="discountsRate">
<template #label>
<span>优惠折扣:</span>
<tip content="范围1-99,填10表示1折;折扣越大(数值越小)的手机端排在越前面,留空表示无折扣" />
</template>
<div class="flex w-full items-center">
<el-input-number class="flex-1" v-model="form.discountsRate" :min="1" :max="99"
:value-on-clear="null" placeholder="如10表示1折" />
<span class="ml5">%</span>
</div>
</el-form-item>
</el-col>
<el-col :span="24" class="mb20">
<el-form-item prop="phone">
<template #label>
<span>联系电话:</span>
<tip content="多个联系电话用/分隔" />
</template>
<el-input v-model.trim="form.phone" placeholder="请输入联系电话" />
</el-form-item>
</el-col>
<el-col :span="24" class="mb20">
<el-form-item prop="platformRanke">
<template #label>
<span>平台抽成:</span>
<tip content="多个联系电话用/分隔" />
</template>
<el-input v-model.trim="form.platformRanke" placeholder="请输入平台抽成">
<template #append>
<span>%</span>
</template>
</el-input>
<el-alert style="margin-top: 10px;"
:title="`该商户的平台抽成是${form.platformRanke}%,即每一笔订单的抽成金额为${form.platformRanke}%的订单金额`"
type="success" :closable="false" />
</el-form-item>
</el-col>
<el-col v-if="form.types == '1'" :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 { getObj, addObj, putObj } from "/@/api/wallet/mch-manage"
const emit = defineEmits(["refresh"])
// 定义变量内容
const dataFormRef = ref()
const visible = ref(false)
const loading = ref(false)
// 定义字典
const { merchant_type, wallet_mch_sup_type, yes_no_type } = useDict("merchant_type", "wallet_mch_sup_type", "yes_no_type")
const defaultForm = {
id: "",
deptId: "",
name: "",
types: "",
canteenIsOpen: "0",
logoPic: "",
collectMoneyCode: "",
swiperPic: "",
isSyncZy: "0",
visibleMobile: "0",
phone: "",
businessTime: "",
addressDes: "",
sort: 0,
supType: "",
cooperationStatus: "1",
parentId: "",
catgoryId: "",
discountsPrice: "",
discountsRate: null as number | null,
platformRanke: '0',
}
// 提交表单数据
const form = reactive({ ...defaultForm })
const jobTime = reactive<{
[key: string]: string[]
}>({
morning: [],
noon: [],
evening: [],
})
const merchantTypeRadioDisabled = ref(false)
// 定义校验规则
const dataRules = {
name: [{ required: true, message: "商户名不能为空", trigger: "change" }],
types: [{ required: true, message: "请选择商户类型", trigger: "change" }],
logoPic: [{ required: true, message: "请上传商户logo", trigger: "change" }],
swiperPic: [{ required: true, message: "请上传商户轮播图", trigger: "change" }],
deptId: [{ required: true, message: "请选择部门", trigger: "change" }],
sort: [{ required: true, message: "请输入排序", trigger: "change" }],
catgoryId: [{ required: true, message: "请选择分类", trigger: "change" }],
supType: [{ required: true, message: "请选择合作商家类型", trigger: "change" }],
cooperationStatus: [{ required: true, message: "请选择合作状态", trigger: "change" }],
}
// 打开弹窗
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)
}
}
watch(
() => form.types,
(newVal) => {
if (newVal != "2") {
form.supType = ""
form.cooperationStatus = "1"
form.parentId = ""
form.discountsPrice = ""
form.discountsRate = null
}
},
)
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => { })
if (!valid) return false
const _pa = {
...form,
isSyncZy: form.isSyncZy ? "1" : "0",
jobTime: (jobTime.morning?.join("-") || "") + "," + (jobTime.noon?.join("-") || "") + "," + (jobTime.evening?.join("-") || ""),
cooperationStatus: form.types == "2" && form.supType == "10" ? null : form.cooperationStatus,
parentId: form.types == "2" && form.supType == "10" ? -1 : form.parentId,
}
if (_pa.parentId == "") {
_pa.parentId = -1
}
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, {
isSyncZy: res.data.isSyncZy == "1" ? true : false,
})
if (form.canteenIsOpen == undefined) {
form.canteenIsOpen = "0"
}
if (form.platformRanke == undefined) {
form.platformRanke = defaultForm.platformRanke
}
if (form.discountsRate == undefined) {
form.discountsRate = null
}
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.types) {
form.types = ""
merchantTypeRadioDisabled.value = true
setTimeout(() => {
merchantTypeRadioDisabled.value = false
}, 0)
}
}
// 暴露变量
defineExpose({
openDialog,
})
</script>