|
|
@@ -7,25 +7,13 @@
|
|
|
<span class="title">门店管理</span>
|
|
|
</div>
|
|
|
<div class="header-right">
|
|
|
- <el-input
|
|
|
- v-model="queryParams.storeOrContact"
|
|
|
- placeholder="搜索门店名称/联系人"
|
|
|
- class="search-input"
|
|
|
- prefix-icon="Search"
|
|
|
- clearable
|
|
|
- @keyup.enter="handleQuery"
|
|
|
- />
|
|
|
- <el-cascader
|
|
|
- v-model="searchRegionValue"
|
|
|
- :options="areaOptions"
|
|
|
- :props="{ value: 'id', label: 'name' }"
|
|
|
- placeholder="所属站点"
|
|
|
- class="station-select"
|
|
|
- style="width: 240px"
|
|
|
- clearable
|
|
|
- @change="handleSearchAreaChange"
|
|
|
- />
|
|
|
- <el-select v-model="queryParams.status" placeholder="状态" class="status-select" clearable @change="handleQuery">
|
|
|
+ <el-input v-model="queryParams.storeOrContact" placeholder="搜索门店名称/联系人" class="search-input"
|
|
|
+ prefix-icon="Search" clearable @keyup.enter="handleQuery" />
|
|
|
+ <el-cascader v-model="searchRegionValue" :options="areaOptions" :props="{ value: 'id', label: 'name' }"
|
|
|
+ placeholder="所属站点" class="station-select" style="width: 240px" clearable
|
|
|
+ @change="handleSearchAreaChange" />
|
|
|
+ <el-select v-model="queryParams.status" placeholder="状态" class="status-select" clearable
|
|
|
+ @change="handleQuery">
|
|
|
<el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
</el-select>
|
|
|
<el-button type="primary" icon="Plus" @click="handleAdd" v-hasPermi="['system:store:add']">新增门店</el-button>
|
|
|
@@ -33,7 +21,8 @@
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
- <el-table v-loading="loading" :data="storeList" style="width: 100%" :header-cell-style="{ background: '#f8f9fb', color: '#606266' }">
|
|
|
+ <el-table v-loading="loading" :data="storeList" style="width: 100%"
|
|
|
+ :header-cell-style="{ background: '#f8f9fb', color: '#606266' }">
|
|
|
<el-table-column label="门店信息" min-width="240">
|
|
|
<template #default="scope">
|
|
|
<div class="store-info-box">
|
|
|
@@ -41,8 +30,10 @@
|
|
|
<div class="store-desc">
|
|
|
<div class="name">{{ scope.row.name }}</div>
|
|
|
<div class="tags">
|
|
|
- <el-tag size="small" type="warning" effect="plain" v-if="scope.row.tenantName">{{ scope.row.tenantName }}</el-tag>
|
|
|
- <el-tag size="small" type="success" effect="plain" v-if="scope.row.tenantCatergoriesName">{{ scope.row.tenantCatergoriesName }}</el-tag>
|
|
|
+ <el-tag size="small" type="warning" effect="plain" v-if="scope.row.tenantName">{{ scope.row.tenantName
|
|
|
+ }}</el-tag>
|
|
|
+ <el-tag size="small" type="success" effect="plain" v-if="scope.row.tenantCatergoriesName">{{
|
|
|
+ scope.row.tenantCatergoriesName }}</el-tag>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -52,7 +43,8 @@
|
|
|
<el-table-column label="服务项目" min-width="180">
|
|
|
<template #default="scope">
|
|
|
<div class="service-tags">
|
|
|
- <el-tag v-for="service in scope.row.services" :key="service" size="small" effect="light" class="service-tag">
|
|
|
+ <el-tag v-for="service in scope.row.services" :key="service" size="small" effect="light"
|
|
|
+ class="service-tag">
|
|
|
{{ getServiceName(service) }}
|
|
|
</el-tag>
|
|
|
</div>
|
|
|
@@ -61,8 +53,7 @@
|
|
|
|
|
|
<el-table-column label="资质认证" align="center" width="100">
|
|
|
<template #default="scope">
|
|
|
- <image-preview v-if="scope.row.businessLicenseUrl" :src="scope.row.businessLicenseUrl" :width="40" :height="40" />
|
|
|
- <span v-else>-</span>
|
|
|
+ <image-preview :src="scope.row.businessLicenseUrl" :width="40" :height="40" />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
|
|
|
@@ -71,7 +62,9 @@
|
|
|
<div class="region-info">
|
|
|
<div class="region-name">{{ getRegionNameBySite(scope.row.site) }}</div>
|
|
|
<div class="site-name">
|
|
|
- <el-icon><Location /></el-icon>
|
|
|
+ <el-icon>
|
|
|
+ <Location />
|
|
|
+ </el-icon>
|
|
|
<span>{{ scope.row.siteName }}</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -82,7 +75,8 @@
|
|
|
|
|
|
<el-table-column label="营业时间" align="center" width="140">
|
|
|
<template #default="scope">
|
|
|
- <span class="time-text">{{ formatTime(scope.row.startBusinessTime) }},{{ formatTime(scope.row.endBusinessTime) }}</span>
|
|
|
+ <span class="time-text">{{ formatTime(scope.row.startBusinessTime) }},{{
|
|
|
+ formatTime(scope.row.endBusinessTime) }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
|
|
|
@@ -90,10 +84,14 @@
|
|
|
<template #default="scope">
|
|
|
<div class="contact-info">
|
|
|
<div class="contact-item">
|
|
|
- <el-icon><User /></el-icon><span>{{ scope.row.contact }}</span>
|
|
|
+ <el-icon>
|
|
|
+ <User />
|
|
|
+ </el-icon><span>{{ scope.row.contact }}</span>
|
|
|
</div>
|
|
|
<div class="contact-item phone">
|
|
|
- <el-icon><Phone /></el-icon><span>{{ scope.row.contactNumber }}</span>
|
|
|
+ <el-icon>
|
|
|
+ <Phone />
|
|
|
+ </el-icon><span>{{ scope.row.contactNumber }}</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
@@ -118,8 +116,10 @@
|
|
|
<el-table-column label="操作" align="right" width="180" fixed="right">
|
|
|
<template #default="scope">
|
|
|
<div class="op-btns">
|
|
|
- <el-button link type="primary" @click="handleDetail(scope.row)" v-hasPermi="['system:store:query']">详情</el-button>
|
|
|
- <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['system:store:edit']">编辑</el-button>
|
|
|
+ <el-button link type="primary" @click="handleDetail(scope.row)"
|
|
|
+ v-hasPermi="['system:store:query']">详情</el-button>
|
|
|
+ <el-button link type="primary" @click="handleUpdate(scope.row)"
|
|
|
+ v-hasPermi="['system:store:edit']">编辑</el-button>
|
|
|
<el-dropdown trigger="click" @command="(cmd) => handleCommand(cmd, scope.row)">
|
|
|
<el-button link type="primary" class="more-btn">
|
|
|
更多<el-icon class="el-icon--right"><arrow-down /></el-icon>
|
|
|
@@ -127,8 +127,10 @@
|
|
|
<template #dropdown>
|
|
|
<el-dropdown-menu>
|
|
|
<el-dropdown-item command="handleRenew" v-hasPermi="['system:store:renew']">续期</el-dropdown-item>
|
|
|
- <el-dropdown-item v-if="scope.row.status === 1 && checkPermi(['system:store:disable'])" command="handleBan" class="delete-item">禁用</el-dropdown-item>
|
|
|
- <el-dropdown-item v-if="scope.row.status === 3 && checkPermi(['system:store:enable'])" command="handleEnable">启用</el-dropdown-item>
|
|
|
+ <el-dropdown-item v-if="scope.row.status === 1 && checkPermi(['system:store:disable'])"
|
|
|
+ command="handleBan" class="delete-item">禁用</el-dropdown-item>
|
|
|
+ <el-dropdown-item v-if="scope.row.status === 3 && checkPermi(['system:store:enable'])"
|
|
|
+ command="handleEnable">启用</el-dropdown-item>
|
|
|
</el-dropdown-menu>
|
|
|
</template>
|
|
|
</el-dropdown>
|
|
|
@@ -138,13 +140,8 @@
|
|
|
</el-table>
|
|
|
|
|
|
<div class="pagination-container">
|
|
|
- <pagination
|
|
|
- v-show="total > 0"
|
|
|
- v-model:total="total"
|
|
|
- v-model:page="queryParams.pageNum"
|
|
|
- v-model:limit="queryParams.pageSize"
|
|
|
- @pagination="getList"
|
|
|
- />
|
|
|
+ <pagination v-show="total > 0" v-model:total="total" v-model:page="queryParams.pageNum"
|
|
|
+ v-model:limit="queryParams.pageSize" @pagination="getList" />
|
|
|
</div>
|
|
|
</el-card>
|
|
|
|
|
|
@@ -168,35 +165,27 @@
|
|
|
</el-checkbox-group>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="商户分类" prop="tenantCatergories">
|
|
|
- <PageSelect
|
|
|
- v-model="form.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"
|
|
|
- />
|
|
|
+ :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"
|
|
|
- />
|
|
|
+ <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-time-picker clearable v-model="form.startBusinessTime" format="HH:mm" value-format="HH:mm" placeholder="开始时间" style="width: 100%" />
|
|
|
+ <el-time-picker clearable v-model="form.startBusinessTime" format="HH:mm" value-format="HH:mm"
|
|
|
+ placeholder="开始时间" style="width: 100%" />
|
|
|
</el-col>
|
|
|
<el-col :span="4" style="text-align: center; line-height: 32px">至</el-col>
|
|
|
<el-col :span="10">
|
|
|
- <el-time-picker clearable v-model="form.endBusinessTime" format="HH:mm" value-format="HH:mm" placeholder="结束时间" style="width: 100%" />
|
|
|
+ <el-time-picker clearable v-model="form.endBusinessTime" format="HH:mm" value-format="HH:mm"
|
|
|
+ placeholder="结束时间" style="width: 100%" />
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
</el-form-item>
|
|
|
@@ -206,16 +195,19 @@
|
|
|
<el-form-item label="联系电话" prop="contactNumber">
|
|
|
<el-input v-model="form.contactNumber" placeholder="请输入联系电话" />
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="有效期至" prop="validity">
|
|
|
- <el-date-picker :disabled="!!form.id" clearable v-model="form.validity" type="date" value-format="YYYY-MM-DD" placeholder="请选择有效期至" style="width: 100%" />
|
|
|
+ <el-form-item label="合作有效期" prop="validity">
|
|
|
+ <el-date-picker :disabled="!!form.id" clearable v-model="form.validity" type="date" value-format="YYYY-MM-DD"
|
|
|
+ placeholder="请选择合作有效期" style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="所属站点" prop="site">
|
|
|
- <el-cascader v-model="regionValue" :options="areaOptions" :props="{ value: 'id', label: 'name' }" placeholder="选择站点" style="width: 100%" @change="handleAreaChange" />
|
|
|
+ <el-cascader v-model="regionValue" :options="areaOptions" :props="{ value: 'id', label: 'name' }"
|
|
|
+ placeholder="选择站点" style="width: 100%" @change="handleAreaChange" />
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="详细地址">
|
|
|
+ <el-form-item label="详细地址" prop="detailAddress">
|
|
|
<el-row :gutter="10" style="margin-bottom: 10px">
|
|
|
<el-col :span="24">
|
|
|
- <el-cascader v-model="addressCascaderValue" :options="regionData" placeholder="选择省市区" style="width: 100%" />
|
|
|
+ <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%" />
|
|
|
@@ -253,14 +245,17 @@
|
|
|
<el-descriptions-item label="门店名称">{{ detailData.name }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="商户分类">{{ detailData.tenantCatergoriesName || '-' }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="所属品牌">{{ detailData.tenantName || '-' }}</el-descriptions-item>
|
|
|
- <el-descriptions-item label="营业时间">{{ formatTime(detailData.startBusinessTime) }} - {{ formatTime(detailData.endBusinessTime) }}</el-descriptions-item>
|
|
|
- <el-descriptions-item label="有效期至">{{ parseTime(detailData.validity, '{y}-{m}-{d}') }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="营业时间">{{ formatTime(detailData.startBusinessTime) }} - {{
|
|
|
+ formatTime(detailData.endBusinessTime) }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="合作有效期">{{ parseTime(detailData.validity, '{y}-{m}-{d}')
|
|
|
+ }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="联系人">{{ detailData.contact }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="联系电话">{{ detailData.contactNumber }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="归属站点">{{ detailData.siteName }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="详细地址">{{ getFullAddress(detailData) }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="营业执照">
|
|
|
- <image-preview v-if="detailData.businessLicenseUrl" :src="detailData.businessLicenseUrl" :width="80" :height="60" />
|
|
|
+ <image-preview v-if="detailData.businessLicenseUrl" :src="detailData.businessLicenseUrl" :width="80"
|
|
|
+ :height="60" />
|
|
|
<span v-else>-</span>
|
|
|
</el-descriptions-item>
|
|
|
</el-descriptions>
|
|
|
@@ -282,7 +277,8 @@
|
|
|
<el-table-column label="下单时间" prop="createTime" min-width="160" />
|
|
|
<el-table-column label="状态" align="center" width="100">
|
|
|
<template #default="scope">
|
|
|
- <el-tag :type="getOrderStatusType(scope.row.status)" effect="plain" size="small">{{ getOrderStatusName(scope.row.status) }}</el-tag>
|
|
|
+ <el-tag :type="getOrderStatusType(scope.row.status)" effect="plain" size="small">{{
|
|
|
+ getOrderStatusName(scope.row.status) }}</el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
@@ -300,14 +296,9 @@
|
|
|
<!-- 门店续期对话框 -->
|
|
|
<el-dialog title="门店续期" v-model="renewDialog.visible" width="400px" append-to-body>
|
|
|
<el-form :model="renewForm" label-width="80px">
|
|
|
- <el-form-item label="有效期至">
|
|
|
- <el-date-picker
|
|
|
- v-model="renewForm.to"
|
|
|
- type="datetime"
|
|
|
- value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
- placeholder="选择日期时间"
|
|
|
- style="width: 100%"
|
|
|
- />
|
|
|
+ <el-form-item label="合作有效期">
|
|
|
+ <el-date-picker v-model="renewForm.to" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期时间"
|
|
|
+ style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
@@ -533,14 +524,14 @@ const data = reactive<PageData<StoreForm, SysStorePageBo>>({
|
|
|
params: {}
|
|
|
},
|
|
|
rules: {
|
|
|
- businessLicense: [{ required: true, message: "营业执照不能为空", trigger: "blur" }],
|
|
|
name: [{ required: true, message: "门店名称不能为空", trigger: "blur" }],
|
|
|
+ detailAddress: [{ required: true, message: "详细地址不能为空", trigger: "blur" }],
|
|
|
tenantCatergories: [{ required: true, message: "商户分类不能为空", trigger: "change" }],
|
|
|
startBusinessTime: [{ required: true, message: "开始营业时间不能为空", trigger: "blur" }],
|
|
|
endBusinessTime: [{ required: true, message: "结束营业时间不能为空", trigger: "blur" }],
|
|
|
contact: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
|
|
|
contactNumber: [{ required: true, message: "联系电话不能为空", trigger: "blur" }],
|
|
|
- validity: [{ required: true, message: "有效期至不能为空", trigger: "blur" }],
|
|
|
+ validity: [{ required: true, message: "合作有效期不能为空", trigger: "blur" }],
|
|
|
tenantId: [{ required: true, message: "所属品牌不能为空", trigger: "change" }],
|
|
|
regionId: [{ required: true, message: "所在区域不能为空", trigger: "change" }],
|
|
|
site: [{ required: true, message: "归属站点不能为空", trigger: "change" }],
|
|
|
@@ -664,6 +655,10 @@ const geoErrorMsg = ref('');
|
|
|
const submitForm = () => {
|
|
|
storeFormRef.value?.validate(async (valid: boolean) => {
|
|
|
if (valid) {
|
|
|
+ if (!form.value.areaCode) {
|
|
|
+ proxy?.$modal.msgError("请选择省市区");
|
|
|
+ return;
|
|
|
+ }
|
|
|
buttonLoading.value = true;
|
|
|
try {
|
|
|
if (form.value.id) {
|
|
|
@@ -740,7 +735,7 @@ const getGeolocation = async () => {
|
|
|
try {
|
|
|
// 确保高德地图脚本已加载
|
|
|
await loadAMapScript();
|
|
|
-
|
|
|
+
|
|
|
const AMap = (window as any).AMap;
|
|
|
if (!AMap) {
|
|
|
throw new Error('AMap is not defined');
|
|
|
@@ -967,7 +962,7 @@ onMounted(() => {
|
|
|
.table-card {
|
|
|
border: none;
|
|
|
border-radius: 8px;
|
|
|
-
|
|
|
+
|
|
|
:deep(.el-card__header) {
|
|
|
padding: 20px 24px;
|
|
|
border-bottom: 1px solid #f0f0f0;
|
|
|
@@ -991,17 +986,27 @@ onMounted(() => {
|
|
|
.header-right {
|
|
|
display: flex;
|
|
|
gap: 12px;
|
|
|
-
|
|
|
- .search-input { width: 200px; }
|
|
|
- .station-select { width: 420px; flex-shrink: 0; }
|
|
|
- .status-select { width: 140px; }
|
|
|
-
|
|
|
+
|
|
|
+ .search-input {
|
|
|
+ width: 200px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .station-select {
|
|
|
+ width: 420px;
|
|
|
+ flex-shrink: 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ .status-select {
|
|
|
+ width: 140px;
|
|
|
+ }
|
|
|
+
|
|
|
:deep(.el-input__wrapper) {
|
|
|
background-color: #f4f5f7;
|
|
|
box-shadow: none;
|
|
|
border: 1px solid transparent;
|
|
|
-
|
|
|
- &:hover, &.is-focus {
|
|
|
+
|
|
|
+ &:hover,
|
|
|
+ &.is-focus {
|
|
|
border-color: #409eff;
|
|
|
background-color: #fff;
|
|
|
}
|
|
|
@@ -1012,13 +1017,14 @@ onMounted(() => {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
gap: 12px;
|
|
|
-
|
|
|
+
|
|
|
.store-desc {
|
|
|
.name {
|
|
|
font-weight: 600;
|
|
|
color: #333;
|
|
|
margin-bottom: 4px;
|
|
|
}
|
|
|
+
|
|
|
.tags {
|
|
|
display: flex;
|
|
|
gap: 4px;
|
|
|
@@ -1037,6 +1043,7 @@ onMounted(() => {
|
|
|
font-weight: 500;
|
|
|
color: #333;
|
|
|
}
|
|
|
+
|
|
|
.site-name {
|
|
|
font-size: 12px;
|
|
|
color: #909399;
|
|
|
@@ -1054,17 +1061,20 @@ onMounted(() => {
|
|
|
gap: 4px;
|
|
|
font-size: 13px;
|
|
|
color: #606266;
|
|
|
-
|
|
|
+
|
|
|
&.phone {
|
|
|
color: #409eff;
|
|
|
margin-top: 2px;
|
|
|
}
|
|
|
-
|
|
|
- .el-icon { font-size: 14px; }
|
|
|
+
|
|
|
+ .el-icon {
|
|
|
+ font-size: 14px;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-.time-text, .count-text {
|
|
|
+.time-text,
|
|
|
+.count-text {
|
|
|
font-weight: 500;
|
|
|
color: #606266;
|
|
|
}
|
|
|
@@ -1090,6 +1100,7 @@ onMounted(() => {
|
|
|
|
|
|
.delete-item {
|
|
|
color: #f56c6c !important;
|
|
|
+
|
|
|
&:hover {
|
|
|
color: #f56c6c !important;
|
|
|
background-color: #fef0f0 !important;
|
|
|
@@ -1104,11 +1115,11 @@ onMounted(() => {
|
|
|
|
|
|
:deep(.el-table) {
|
|
|
--el-table-border-color: #f0f0f0;
|
|
|
-
|
|
|
+
|
|
|
th.el-table__cell {
|
|
|
font-weight: 600;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
td.el-table__cell {
|
|
|
padding: 12px 0;
|
|
|
}
|