|
|
@@ -1,6 +1,7 @@
|
|
|
<template>
|
|
|
<div class="p-2">
|
|
|
- <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
|
|
+ <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
|
|
|
+ :leave-active-class="proxy?.animate.searchAnimate.leave">
|
|
|
<div v-show="showSearch" class="mb-[10px]">
|
|
|
<el-card shadow="hover">
|
|
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
|
|
|
@@ -11,12 +12,8 @@
|
|
|
<el-input v-model="queryParams.contact" placeholder="请输入联系人" clearable @keyup.enter="handleQuery" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="有效期至" prop="validity">
|
|
|
- <el-date-picker clearable
|
|
|
- v-model="queryParams.validity"
|
|
|
- type="date"
|
|
|
- value-format="YYYY-MM-DD"
|
|
|
- placeholder="请选择有效期至"
|
|
|
- />
|
|
|
+ <el-date-picker clearable v-model="queryParams.validity" type="date" value-format="YYYY-MM-DD"
|
|
|
+ placeholder="请选择有效期至" />
|
|
|
</el-form-item>
|
|
|
<el-form-item>
|
|
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
|
|
@@ -31,16 +28,20 @@
|
|
|
<template #header>
|
|
|
<el-row :gutter="10" class="mb8">
|
|
|
<el-col :span="1.5">
|
|
|
- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:store:add']">新增</el-button>
|
|
|
+ <el-button type="primary" plain icon="Plus" @click="handleAdd"
|
|
|
+ v-hasPermi="['system:store:add']">新增</el-button>
|
|
|
</el-col>
|
|
|
<el-col :span="1.5">
|
|
|
- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:store:edit']">修改</el-button>
|
|
|
+ <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"
|
|
|
+ v-hasPermi="['system:store:edit']">修改</el-button>
|
|
|
</el-col>
|
|
|
<el-col :span="1.5">
|
|
|
- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:store:remove']">删除</el-button>
|
|
|
+ <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"
|
|
|
+ v-hasPermi="['system:store:remove']">删除</el-button>
|
|
|
</el-col>
|
|
|
<el-col :span="1.5">
|
|
|
- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:store:export']">导出</el-button>
|
|
|
+ <el-button type="warning" plain icon="Download" @click="handleExport"
|
|
|
+ v-hasPermi="['system:store:export']">导出</el-button>
|
|
|
</el-col>
|
|
|
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
|
|
</el-row>
|
|
|
@@ -51,12 +52,12 @@
|
|
|
<el-table-column label="序号" align="center" prop="id" v-if="true" />
|
|
|
<el-table-column label="LOGO" align="center" prop="logoUrl" width="100">
|
|
|
<template #default="scope">
|
|
|
- <image-preview :src="scope.row.logoUrl" :width="50" :height="50"/>
|
|
|
+ <image-preview :src="scope.row.logoUrl" :width="50" :height="50" />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column label="营业执照" align="center" prop="businessLicenseUrl" width="100">
|
|
|
<template #default="scope">
|
|
|
- <image-preview :src="scope.row.businessLicenseUrl" :width="50" :height="50"/>
|
|
|
+ <image-preview :src="scope.row.businessLicenseUrl" :width="50" :height="50" />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column label="门店名称" align="center" prop="name" />
|
|
|
@@ -84,44 +85,67 @@
|
|
|
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
|
|
|
<template #default="scope">
|
|
|
<el-tooltip content="修改" placement="top">
|
|
|
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:store:edit']"></el-button>
|
|
|
+ <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
|
|
|
+ v-hasPermi="['system:store:edit']"></el-button>
|
|
|
</el-tooltip>
|
|
|
<el-tooltip content="删除" placement="top">
|
|
|
- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:store:remove']"></el-button>
|
|
|
+ <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
|
|
|
+ v-hasPermi="['system:store:remove']"></el-button>
|
|
|
</el-tooltip>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
|
|
|
- <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
|
|
+ <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
|
|
|
+ v-model:limit="queryParams.pageSize" @pagination="getList" />
|
|
|
</el-card>
|
|
|
<!-- 添加或修改门店管理对话框 -->
|
|
|
- <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
|
|
|
- <el-form ref="storeFormRef" :model="form" :rules="rules" label-width="80px">
|
|
|
- <el-form-item label="LOGO" prop="logo">
|
|
|
- <image-upload v-model="form.logo"/>
|
|
|
+ <el-dialog :title="dialog.title" v-model="dialog.visible" width="600px" append-to-body>
|
|
|
+ <el-form ref="storeFormRef" :model="form" :rules="rules" label-width="120px">
|
|
|
+ <el-form-item label="门店Logo" prop="logo">
|
|
|
+ <image-upload v-model="form.logo" :limit="1" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="营业执照" prop="businessLicense">
|
|
|
- <image-upload v-model="form.businessLicense"/>
|
|
|
+ <image-upload v-model="form.businessLicense" :limit="1" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="门店名称" prop="name">
|
|
|
<el-input v-model="form.name" placeholder="请输入门店名称" />
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="开始营业时间" prop="startBusinessTime">
|
|
|
- <el-date-picker clearable
|
|
|
- v-model="form.startBusinessTime"
|
|
|
- type="datetime"
|
|
|
- value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
- placeholder="请选择开始营业时间">
|
|
|
- </el-date-picker>
|
|
|
+ <el-form-item label="服务项目" prop="services">
|
|
|
+ <el-checkbox-group v-model="form.services">
|
|
|
+ <el-checkbox v-for="service in serviceList" :key="service.id" :label="service.id" border>
|
|
|
+ {{ service.name }}
|
|
|
+ </el-checkbox>
|
|
|
+ </el-checkbox-group>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="结束营业时间" prop="endBusinessTime">
|
|
|
- <el-date-picker clearable
|
|
|
- v-model="form.endBusinessTime"
|
|
|
- type="datetime"
|
|
|
- value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
- placeholder="请选择结束营业时间">
|
|
|
- </el-date-picker>
|
|
|
+ <el-form-item label="商户分类" prop="tenantCatergories">
|
|
|
+ <PageSelect v-model="form.tenantCatergories"
|
|
|
+ :options="tenantCategoriesList.map(item => ({ value: item.id, label: item.name }))"
|
|
|
+ :total="tenantCategoriesTotal" :pageSize="10" placeholder="请选择商户分类"
|
|
|
+ @page-change="handleTenantCategoriesPageChange" @visible-change="handleTenantCategoriesVisibleChange" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="所属品牌" prop="tenantId">
|
|
|
+ <PageSelect v-model="form.tenantId"
|
|
|
+ :options="brandList.map(item => ({ value: item.tenantId, label: item.name }))" :total="brandTotal"
|
|
|
+ :pageSize="10" placeholder="请选择所属品牌" @page-change="handleBrandPageChange"
|
|
|
+ @visible-change="handleBrandSelectVisibleChange" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="营业时间" prop="startBusinessTime">
|
|
|
+ <el-row :gutter="10">
|
|
|
+ <el-col :span="10">
|
|
|
+ <el-date-picker clearable v-model="form.startBusinessTime" type="datetime"
|
|
|
+ value-format="YYYY-MM-DD HH:mm:ss" placeholder="开始时间" style="width: 100%">
|
|
|
+ </el-date-picker>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="4" style="text-align: center; line-height: 40px">
|
|
|
+ 至
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="10">
|
|
|
+ <el-date-picker clearable v-model="form.endBusinessTime" type="datetime"
|
|
|
+ value-format="YYYY-MM-DD HH:mm:ss" placeholder="结束时间" style="width: 100%">
|
|
|
+ </el-date-picker>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="联系人" prop="contact">
|
|
|
<el-input v-model="form.contact" placeholder="请输入联系人" />
|
|
|
@@ -130,22 +154,49 @@
|
|
|
<el-input v-model="form.contactNumber" placeholder="请输入联系电话" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="有效期至" prop="validity">
|
|
|
- <el-date-picker clearable
|
|
|
- v-model="form.validity"
|
|
|
- type="datetime"
|
|
|
- value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
- placeholder="请选择有效期至">
|
|
|
+ <el-date-picker clearable v-model="form.validity" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
+ placeholder="请选择有效期至" style="width: 100%">
|
|
|
</el-date-picker>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="详细地址" prop="detailAddress">
|
|
|
- <el-input v-model="form.detailAddress" placeholder="请输入详细地址" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="经度" prop="longitude">
|
|
|
- <el-input v-model="form.longitude" placeholder="请输入经度" />
|
|
|
+ <el-row :gutter="10">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="所在区域" prop="regionId">
|
|
|
+ <el-cascader v-model="regionValue" :options="areaOptions" placeholder="选择区域" style="width: 100%"
|
|
|
+ @change="handleAreaChange" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="归属站点" prop="site">
|
|
|
+ <el-select v-model="form.site" placeholder="选择站点" :disabled="!form.regionId">
|
|
|
+ <el-option v-for="site in siteOptions" :key="site.value" :label="site.label" :value="site.value" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-form-item label="详细地址">
|
|
|
+ <el-row :gutter="10" style="margin-bottom: 10px">
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-cascader v-model="addressCascaderValue" :options="regionData" placeholder="选择省市区"
|
|
|
+ style="width: 100%" />
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-input v-model="form.detailAddress" type="textarea" placeholder="输入详细地址" rows="3" style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="维度" prop="latitude">
|
|
|
- <el-input v-model="form.latitude" placeholder="请输入维度" />
|
|
|
+ <el-form-item>
|
|
|
+ <el-button type="primary" style="width: 100%" @click="getGeolocation">获取经纬度</el-button>
|
|
|
</el-form-item>
|
|
|
+ <el-row :gutter="10">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="经度" prop="longitude">
|
|
|
+ <el-input v-model="form.longitude" placeholder="请获取/输入位置经度" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="纬度" prop="latitude">
|
|
|
+ <el-input v-model="form.latitude" placeholder="请获取/输入位置纬度" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
<div class="dialog-footer">
|
|
|
@@ -160,6 +211,13 @@
|
|
|
<script setup name="Store" lang="ts">
|
|
|
import { listStore, getStore, delStore, addStore, updateStore } from '@/api/system/store';
|
|
|
import { StoreVO, StoreQuery, StoreForm } from '@/api/system/store/types';
|
|
|
+import { listOnStore } from '@/api/system/tenant';
|
|
|
+import { listOnStore as listTenantCategoriesOnStore } from '@/api/system/tenantCategories';
|
|
|
+import { listOnStore as listServiceOnStore } from '@/api/service/list';
|
|
|
+import { listOnStore as listAreaStationOnStore } from '@/api/system/areaStation';
|
|
|
+import { SysAreaStationOnStoreVo } from '@/api/system/areaStation/types';
|
|
|
+import { regionData, CodeToText, TextToCode } from 'element-china-area-data';
|
|
|
+import PageSelect from '@/components/PageSelect/index.vue';
|
|
|
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
|
|
|
@@ -174,6 +232,28 @@ const total = ref(0);
|
|
|
|
|
|
const queryFormRef = ref<ElFormInstance>();
|
|
|
const storeFormRef = ref<ElFormInstance>();
|
|
|
+const brandSelectRef = ref<any>(null);
|
|
|
+
|
|
|
+// 新增的响应式变量
|
|
|
+const regionValue = ref<any[]>([]);
|
|
|
+const province = ref('');
|
|
|
+const city = ref('');
|
|
|
+const district = ref('');
|
|
|
+const addressCascaderValue = ref<any[]>([]); // 省市区级联选择器值
|
|
|
+const brandList = ref<any[]>([]); // 品牌列表
|
|
|
+const brandLoading = ref(false); // 品牌加载状态
|
|
|
+const currentPage = ref(1); // 当前页码
|
|
|
+const brandKeyword = ref(''); // 搜索关键词
|
|
|
+const brandSelectVisible = ref(false); // 品牌选择框可见状态
|
|
|
+const brandTotal = ref(0); // 品牌总数
|
|
|
+const serviceList = ref<any[]>([]); // 服务项目列表
|
|
|
+const tenantCategoriesList = ref<any[]>([]); // 商户分类列表
|
|
|
+const tenantCategoriesTotal = ref(0); // 商户分类总数
|
|
|
+const areaStationList = ref<SysAreaStationOnStoreVo[]>([]); // 区域站点列表
|
|
|
+const areaOptions = ref<any[]>([]); // 所在区域树形选项
|
|
|
+const siteOptions = ref<any[]>([]); // 归属站点选项
|
|
|
+
|
|
|
+
|
|
|
|
|
|
const dialog = reactive<DialogOption>({
|
|
|
visible: false,
|
|
|
@@ -197,12 +277,14 @@ const initFormData: StoreForm = {
|
|
|
longitude: undefined,
|
|
|
latitude: undefined,
|
|
|
tenantId: undefined,
|
|
|
+ services: [],
|
|
|
+ regionId: undefined,
|
|
|
}
|
|
|
const data = reactive<PageData<StoreForm, StoreQuery>>({
|
|
|
- form: {...initFormData},
|
|
|
+ form: { ...initFormData },
|
|
|
queryParams: {
|
|
|
pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
+ pageSize: 1,
|
|
|
businessLicense: undefined,
|
|
|
name: undefined,
|
|
|
tenantCatergories: undefined,
|
|
|
@@ -244,6 +326,12 @@ const data = reactive<PageData<StoreForm, StoreQuery>>({
|
|
|
tenantId: [
|
|
|
{ required: true, message: "租户编号不能为空", trigger: "change" }
|
|
|
],
|
|
|
+ regionId: [
|
|
|
+ { required: true, message: "所在区域不能为空", trigger: "change" }
|
|
|
+ ],
|
|
|
+ site: [
|
|
|
+ { required: true, message: "归属站点不能为空", trigger: "change" }
|
|
|
+ ],
|
|
|
}
|
|
|
});
|
|
|
|
|
|
@@ -266,7 +354,13 @@ const cancel = () => {
|
|
|
|
|
|
/** 表单重置 */
|
|
|
const reset = () => {
|
|
|
- form.value = {...initFormData};
|
|
|
+ form.value = { ...initFormData };
|
|
|
+ // 重置新增的变量
|
|
|
+ regionValue.value = [];
|
|
|
+ province.value = '';
|
|
|
+ city.value = '';
|
|
|
+ district.value = '';
|
|
|
+ addressCascaderValue.value = [];
|
|
|
storeFormRef.value?.resetFields();
|
|
|
}
|
|
|
|
|
|
@@ -312,9 +406,9 @@ const submitForm = () => {
|
|
|
if (valid) {
|
|
|
buttonLoading.value = true;
|
|
|
if (form.value.id) {
|
|
|
- await updateStore(form.value).finally(() => buttonLoading.value = false);
|
|
|
+ await updateStore(form.value).finally(() => buttonLoading.value = false);
|
|
|
} else {
|
|
|
- await addStore(form.value).finally(() => buttonLoading.value = false);
|
|
|
+ await addStore(form.value).finally(() => buttonLoading.value = false);
|
|
|
}
|
|
|
proxy?.$modal.msgSuccess("操作成功");
|
|
|
dialog.visible = false;
|
|
|
@@ -339,7 +433,236 @@ const handleExport = () => {
|
|
|
}, `store_${new Date().getTime()}.xlsx`)
|
|
|
}
|
|
|
|
|
|
+/** 获取经纬度 */
|
|
|
+const getGeolocation = () => {
|
|
|
+ if ('geolocation' in navigator) {
|
|
|
+ navigator.geolocation.getCurrentPosition(
|
|
|
+ (position) => {
|
|
|
+ form.value.longitude = position.coords.longitude.toFixed(6);
|
|
|
+ form.value.latitude = position.coords.latitude.toFixed(6);
|
|
|
+ proxy?.$modal.msgSuccess('获取经纬度成功');
|
|
|
+ },
|
|
|
+ (error) => {
|
|
|
+ let errorMessage = '获取位置失败';
|
|
|
+ switch (error.code) {
|
|
|
+ case error.PERMISSION_DENIED:
|
|
|
+ errorMessage = '用户拒绝了地理定位请求';
|
|
|
+ break;
|
|
|
+ case error.POSITION_UNAVAILABLE:
|
|
|
+ errorMessage = '位置信息不可用';
|
|
|
+ break;
|
|
|
+ case error.TIMEOUT:
|
|
|
+ errorMessage = '获取位置超时';
|
|
|
+ break;
|
|
|
+ case error.UNKNOWN_ERROR:
|
|
|
+ errorMessage = '未知错误';
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ proxy?.$modal.msgError(errorMessage);
|
|
|
+ }
|
|
|
+ );
|
|
|
+ } else {
|
|
|
+ proxy?.$modal.msgError('您的浏览器不支持地理定位');
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/** 获取品牌列表 */
|
|
|
+const getBrandList = async (pageNum = 1, keyword = '', append = false) => {
|
|
|
+ brandLoading.value = true;
|
|
|
+ // 确保参数格式正确,直接传递数字类型的pageNum
|
|
|
+ const res = await listOnStore({ pageNum: pageNum, pageSize: 10 });
|
|
|
+ if (res.code === 200) {
|
|
|
+ if (append) {
|
|
|
+ // 追加模式,用于分页加载
|
|
|
+ brandList.value = [...brandList.value, ...res.rows];
|
|
|
+ } else {
|
|
|
+ // 替换模式,用于初始加载或搜索
|
|
|
+ brandList.value = res.rows;
|
|
|
+ }
|
|
|
+ // 存储总数
|
|
|
+ brandTotal.value = res.total || 0;
|
|
|
+ console.log('总数', brandTotal.value);
|
|
|
+ }
|
|
|
+ brandLoading.value = false;
|
|
|
+};
|
|
|
+
|
|
|
+/** 获取服务项目列表 */
|
|
|
+const getServiceList = async () => {
|
|
|
+ try {
|
|
|
+ const res = await listServiceOnStore();
|
|
|
+ // 转换数据格式,适配checkbox组件
|
|
|
+ serviceList.value = res.data || res;
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取服务项目列表失败:', error);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/** 获取区域站点列表 */
|
|
|
+const getAreaStationList = async () => {
|
|
|
+ try {
|
|
|
+ const res = await listAreaStationOnStore();
|
|
|
+ const data = res.data || res;
|
|
|
+ areaStationList.value = data;
|
|
|
+
|
|
|
+ // 分离所在区域数据(type为0或1)
|
|
|
+ const areaData = data.filter((item: any) => item.type === 0 || item.type === 1);
|
|
|
+ // 构建树形结构
|
|
|
+ areaOptions.value = buildTree(areaData, 0);
|
|
|
+
|
|
|
+ // 初始化站点数据为空
|
|
|
+ siteOptions.value = [];
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取区域站点列表失败:', error);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/** 构建树形结构 */
|
|
|
+const buildTree = (data: any[], parentId: any): any[] => {
|
|
|
+ return data
|
|
|
+ .filter(item => String(item.parentId) === String(parentId))
|
|
|
+ .map(item => ({
|
|
|
+ value: item.id,
|
|
|
+ label: item.name,
|
|
|
+ children: buildTree(data, item.id)
|
|
|
+ }));
|
|
|
+};
|
|
|
+
|
|
|
+/** 处理所在区域选择变化 */
|
|
|
+const handleAreaChange = (value: any[]) => {
|
|
|
+ // 清空归属站点选择
|
|
|
+ form.value.site = undefined;
|
|
|
+
|
|
|
+ if (value && value.length > 0) {
|
|
|
+ // 获取最后一级的id
|
|
|
+ const areaId = value[value.length - 1];
|
|
|
+ // 更新regionId
|
|
|
+ form.value.regionId = areaId;
|
|
|
+ // 过滤出parentId等于areaId的站点
|
|
|
+ siteOptions.value = areaStationList.value
|
|
|
+ .filter((item: any) => item.type === 2 && String(item.parentId) === String(areaId))
|
|
|
+ .map((item: any) => ({
|
|
|
+ value: item.id,
|
|
|
+ label: item.name
|
|
|
+ }));
|
|
|
+ } else {
|
|
|
+ // 如果没有选择区域,清空站点选项和regionId
|
|
|
+ form.value.regionId = undefined;
|
|
|
+ siteOptions.value = [];
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/** 获取商户分类列表 */
|
|
|
+const getTenantCategoriesList = async (pageNum = 1) => {
|
|
|
+ try {
|
|
|
+ const res = await listTenantCategoriesOnStore({ pageNum, pageSize: 10 });
|
|
|
+ if (res.code === 200) {
|
|
|
+ tenantCategoriesList.value = res.rows;
|
|
|
+ tenantCategoriesTotal.value = res.total || 0;
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取商户分类列表失败:', error);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/** 处理品牌页面切换 */
|
|
|
+const handleBrandPageChange = (page: number) => {
|
|
|
+ // 确保page是数字类型
|
|
|
+ const pageNum = Number(page);
|
|
|
+ currentPage.value = pageNum;
|
|
|
+ getBrandList(pageNum, brandKeyword.value, false);
|
|
|
+};
|
|
|
+
|
|
|
+/** 处理商户分类分页 */
|
|
|
+const handleTenantCategoriesPageChange = (page: number) => {
|
|
|
+ // 确保page是数字类型
|
|
|
+ const pageNum = Number(page);
|
|
|
+ getTenantCategoriesList(pageNum);
|
|
|
+};
|
|
|
+
|
|
|
+/** 处理商户分类选择框可见性变化 */
|
|
|
+const handleTenantCategoriesVisibleChange = (visible: boolean) => {
|
|
|
+ if (visible) {
|
|
|
+ getTenantCategoriesList(1);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/** 远程搜索方法 */
|
|
|
+const remoteMethod = (query: string) => {
|
|
|
+ brandKeyword.value = query;
|
|
|
+ currentPage.value = 1;
|
|
|
+ getBrandList(1, query, false);
|
|
|
+};
|
|
|
+
|
|
|
+/** 处理品牌选择框显示状态变化 */
|
|
|
+const handleBrandSelectVisibleChange = (visible: boolean) => {
|
|
|
+ brandSelectVisible.value = visible;
|
|
|
+ if (visible) {
|
|
|
+ // 选择框显示时,重置页码并重新加载数据
|
|
|
+ currentPage.value = 1;
|
|
|
+ getBrandList(1, brandKeyword.value, false);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
onMounted(() => {
|
|
|
getList();
|
|
|
+ getBrandList();
|
|
|
+ getServiceList();
|
|
|
+ getAreaStationList();
|
|
|
});
|
|
|
</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.brand-pagination {
|
|
|
+ margin-top: 10px;
|
|
|
+ padding-top: 10px;
|
|
|
+ border-top: 1px solid #ebeef5;
|
|
|
+ text-align: center;
|
|
|
+}
|
|
|
+
|
|
|
+.custom-pagination {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ gap: 10px;
|
|
|
+ font-size: 14px;
|
|
|
+}
|
|
|
+
|
|
|
+.page-arrow {
|
|
|
+ cursor: pointer;
|
|
|
+ color: #606266;
|
|
|
+ user-select: none;
|
|
|
+ padding: 2px 8px;
|
|
|
+ transition: color 0.3s;
|
|
|
+}
|
|
|
+
|
|
|
+.page-arrow:hover:not(.disabled) {
|
|
|
+ color: #409eff;
|
|
|
+}
|
|
|
+
|
|
|
+.page-arrow.disabled {
|
|
|
+ color: #c0c4cc;
|
|
|
+ cursor: not-allowed;
|
|
|
+}
|
|
|
+
|
|
|
+.page-number {
|
|
|
+ cursor: pointer;
|
|
|
+ color: #606266;
|
|
|
+ padding: 2px 8px;
|
|
|
+ transition: all 0.3s;
|
|
|
+}
|
|
|
+
|
|
|
+.page-number:hover {
|
|
|
+ color: #409eff;
|
|
|
+}
|
|
|
+
|
|
|
+.page-number.active {
|
|
|
+ color: #409eff;
|
|
|
+ font-weight: bold;
|
|
|
+}
|
|
|
+
|
|
|
+.total-text {
|
|
|
+ margin-left: 15px;
|
|
|
+ font-size: 12px;
|
|
|
+ color: #909399;
|
|
|
+}
|
|
|
+</style>
|