|
|
@@ -133,7 +133,7 @@
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<!-- 经纬度查询 -->
|
|
|
- <el-form-item label="经纬度查询" prop="address">
|
|
|
+ <!-- <el-form-item label="经纬度查询" prop="address">
|
|
|
<el-select
|
|
|
v-model="formData.storePosition"
|
|
|
filterable
|
|
|
@@ -148,7 +148,7 @@
|
|
|
<span style="float: right; font-size: 13px; color: var(--el-text-color-secondary)">{{ item.district }}</span>
|
|
|
</el-option>
|
|
|
</el-select>
|
|
|
- </el-form-item>
|
|
|
+ </el-form-item> -->
|
|
|
<!-- 经纬度展示 -->
|
|
|
<el-form-item label="经纬度展示">
|
|
|
<el-input v-model="formData.storePosition" disabled class="readonly-input">
|
|
|
@@ -159,9 +159,22 @@
|
|
|
</template>
|
|
|
</el-input>
|
|
|
</el-form-item>
|
|
|
+ <!-- 店铺评价 -->
|
|
|
+ <el-form-item label="店铺评价" prop="storeEvaluate">
|
|
|
+ <el-input v-model="storeEvaluate1" type="text" :rows="1" placeholder="请输入评价1" show-word-limit />
|
|
|
+ <el-input
|
|
|
+ style="margin: 10px 0"
|
|
|
+ v-model="storeEvaluate2"
|
|
|
+ type="text"
|
|
|
+ :rows="1"
|
|
|
+ placeholder="请输入评价2"
|
|
|
+ show-word-limit
|
|
|
+ />
|
|
|
+ <el-input v-model="storeEvaluate3" type="text" :rows="1" placeholder="请输入评价3" show-word-limit />
|
|
|
+ </el-form-item>
|
|
|
<!-- 经营板块 -->
|
|
|
<el-form-item label="经营板块" prop="businessSection">
|
|
|
- <el-radio-group v-model="formData.businessSection" class="business-section-radio-group">
|
|
|
+ <el-radio-group v-model="formData.businessSection" class="business-section-radio-group" disabled>
|
|
|
<div v-for="section in businessSectionList" :key="section.dictId" class="businessSection-item">
|
|
|
<el-radio :value="section.dictId" :label="section.dictDetail">
|
|
|
{{ section.dictDetail }}
|
|
|
@@ -170,6 +183,14 @@
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
|
|
|
+ <!-- 标签选择(仅当经营板块为生活服务时显示) -->
|
|
|
+ <el-form-item v-if="formData.businessSection === 3" label="标签选择" prop="storeTickets" required>
|
|
|
+ <el-radio-group v-model="formData.storeTickets" disabled>
|
|
|
+ <el-radio :value="1"> 装修公司 </el-radio>
|
|
|
+ <el-radio :value="0"> 其他 </el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
<!-- 经营种类 -->
|
|
|
<el-form-item label="经营种类" prop="businessTypeName">
|
|
|
<el-input v-model="formData.businessTypeName" placeholder="请输入经营种类" clearable maxlength="50" />
|
|
|
@@ -179,7 +200,12 @@
|
|
|
<el-form-item label="经营类目" prop="businessCategoryName">
|
|
|
<el-input v-model="formData.businessCategoryName" placeholder="请输入经营类目" clearable maxlength="50" />
|
|
|
</el-form-item>
|
|
|
-
|
|
|
+ <el-form-item label="设置收款账号">
|
|
|
+ <div style="color: #6c8ff8; cursor: pointer" @click="handleViewPayAccount">查看</div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="营业时间">
|
|
|
+ <div style="color: #6c8ff8; cursor: pointer" @click="handleViewBusinessHours">查看</div>
|
|
|
+ </el-form-item>
|
|
|
<!-- 到期时间(只读) -->
|
|
|
<!-- <el-form-item label="到期时间">-->
|
|
|
<!-- <el-input v-model="formData.expirationTime" disabled class="readonly-input">-->
|
|
|
@@ -209,17 +235,599 @@
|
|
|
<el-button type="primary" size="large" :loading="loading" @click="handleSubmit"> 保存 </el-button>
|
|
|
</div>
|
|
|
</el-form>
|
|
|
+ <!-- 收款账号弹窗(查看/编辑) -->
|
|
|
+ <GoReceivingAccount v-model="payAccountDialogVisible" />
|
|
|
+ <!-- 营业时间弹窗(查看/编辑) -->
|
|
|
+ <el-dialog
|
|
|
+ v-model="businessHoursDialogVisible"
|
|
|
+ title="营业时间"
|
|
|
+ width="560px"
|
|
|
+ destroy-on-close
|
|
|
+ append-to-body
|
|
|
+ @open="onBusinessHoursDialogOpen"
|
|
|
+ >
|
|
|
+ <p class="business-hours-tip">
|
|
|
+ 特殊营业时间适用于特殊日期(如:春节/国庆/其他指定日期),设置成功后会在指定日期调整前台营业时间时显示
|
|
|
+ </p>
|
|
|
+ <div v-if="businessHoursDisplayList.length > 0" class="business-hours-list">
|
|
|
+ <div v-for="(item, index) in businessHoursDisplayList" :key="item.key" class="business-hours-item">
|
|
|
+ <div class="business-hours-item-header">
|
|
|
+ <span class="item-title">{{ item.title }}</span>
|
|
|
+ <el-tag :type="item.businessType === 1 ? 'success' : 'danger'" size="small">
|
|
|
+ {{ item.businessType === 1 ? "正常" : "特殊" }}
|
|
|
+ </el-tag>
|
|
|
+ </div>
|
|
|
+ <div class="business-hours-item-time">
|
|
|
+ {{ item.timeText }}
|
|
|
+ </div>
|
|
|
+ <div class="business-hours-item-actions">
|
|
|
+ <el-button type="primary" link @click="handleEditBusinessHours(item, index)"> 编辑 </el-button>
|
|
|
+ <el-button type="primary" link @click="handleDeleteBusinessHours(item, index)"> 删除 </el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <el-empty v-else description="暂未添加营业时间" :image-size="80" />
|
|
|
+ <template #footer>
|
|
|
+ <div class="business-hours-dialog-footer">
|
|
|
+ <el-button @click="openAddNormalBusinessHours"> 添加正常营业时间 </el-button>
|
|
|
+ <el-button @click="openAddSpecialBusinessHours"> 添加特殊营业时间 </el-button>
|
|
|
+ <el-button type="primary" :loading="businessHoursSaving" @click="handleSaveBusinessHours"> 保存 </el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+ <!-- 添加/编辑 正常营业时间 -->
|
|
|
+ <el-dialog
|
|
|
+ v-model="normalBusinessHoursDialogVisible"
|
|
|
+ title="正常营业时间"
|
|
|
+ width="500px"
|
|
|
+ append-to-body
|
|
|
+ @close="resetNormalBusinessHoursForm"
|
|
|
+ >
|
|
|
+ <el-form label-width="120px">
|
|
|
+ <el-form-item label="请选择营业日">
|
|
|
+ <div class="day-buttons">
|
|
|
+ <el-button
|
|
|
+ v-for="day in weekDays"
|
|
|
+ :key="day.value"
|
|
|
+ :type="normalBusinessHoursForm.selectedDays.includes(day.value) ? 'primary' : 'default'"
|
|
|
+ @click="toggleNormalDay(day.value)"
|
|
|
+ >
|
|
|
+ {{ day.label }}
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="营业时间段">
|
|
|
+ <el-radio-group v-model="normalBusinessHoursForm.timeType">
|
|
|
+ <el-radio :value="'custom'"> 自定义 </el-radio>
|
|
|
+ <el-radio :value="'24hours'"> 24小时 </el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ <div v-if="normalBusinessHoursForm.timeType === 'custom'" class="time-picker-row">
|
|
|
+ <el-time-picker
|
|
|
+ v-model="normalBusinessHoursForm.startTime"
|
|
|
+ format="HH:mm"
|
|
|
+ value-format="HH:mm"
|
|
|
+ placeholder="开始时间"
|
|
|
+ style="width: 140px"
|
|
|
+ />
|
|
|
+ <span class="time-sep">至</span>
|
|
|
+ <el-time-picker
|
|
|
+ v-model="normalBusinessHoursForm.endTime"
|
|
|
+ format="HH:mm"
|
|
|
+ value-format="HH:mm"
|
|
|
+ placeholder="结束时间"
|
|
|
+ style="width: 140px"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <el-button @click="normalBusinessHoursDialogVisible = false"> 取消 </el-button>
|
|
|
+ <el-button type="primary" @click="confirmNormalBusinessHours"> 确定 </el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+ <!-- 添加/编辑 特殊营业时间 -->
|
|
|
+ <el-dialog
|
|
|
+ v-model="specialBusinessHoursDialogVisible"
|
|
|
+ title="特殊营业时间"
|
|
|
+ width="500px"
|
|
|
+ append-to-body
|
|
|
+ @close="resetSpecialBusinessHoursForm"
|
|
|
+ >
|
|
|
+ <el-form label-width="120px">
|
|
|
+ <el-form-item label="请选择营业日">
|
|
|
+ <div class="day-buttons holiday-buttons">
|
|
|
+ <el-button
|
|
|
+ v-for="h in holidays"
|
|
|
+ :key="h.value"
|
|
|
+ :type="specialBusinessHoursForm.selectedHolidays.includes(h.value) ? 'primary' : 'default'"
|
|
|
+ @click="toggleSpecialHoliday(h.value)"
|
|
|
+ >
|
|
|
+ {{ h.label }}
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="营业时间段">
|
|
|
+ <el-radio-group v-model="specialBusinessHoursForm.timeType">
|
|
|
+ <el-radio :value="'custom'"> 自定义 </el-radio>
|
|
|
+ <el-radio :value="'24hours'"> 24小时 </el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ <div v-if="specialBusinessHoursForm.timeType === 'custom'" class="time-picker-row">
|
|
|
+ <el-time-picker
|
|
|
+ v-model="specialBusinessHoursForm.startTime"
|
|
|
+ format="HH:mm"
|
|
|
+ value-format="HH:mm"
|
|
|
+ placeholder="开始时间"
|
|
|
+ style="width: 140px"
|
|
|
+ />
|
|
|
+ <span class="time-sep">至</span>
|
|
|
+ <el-time-picker
|
|
|
+ v-model="specialBusinessHoursForm.endTime"
|
|
|
+ format="HH:mm"
|
|
|
+ value-format="HH:mm"
|
|
|
+ placeholder="结束时间"
|
|
|
+ style="width: 140px"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <el-button @click="specialBusinessHoursDialogVisible = false"> 取消 </el-button>
|
|
|
+ <el-button type="primary" @click="confirmSpecialBusinessHours"> 确定 </el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script setup lang="ts">
|
|
|
-import { ref, reactive, onMounted, watch, nextTick } from "vue";
|
|
|
-import { ElMessage, ElNotification } from "element-plus";
|
|
|
+import { ref, reactive, computed, onMounted, watch, nextTick } from "vue";
|
|
|
+import { ElMessage, ElNotification, ElMessageBox } from "element-plus";
|
|
|
import type { FormInstance, FormRules } from "element-plus";
|
|
|
import { Search, Lock } from "@element-plus/icons-vue";
|
|
|
-import { getDistrict, getStoreDetail, saveStoreInfo, editStoreInfo } from "@/api/modules/storeDecoration";
|
|
|
+import {
|
|
|
+ getDistrict,
|
|
|
+ getStoreDetail,
|
|
|
+ saveStoreInfo,
|
|
|
+ editStoreInfo,
|
|
|
+ getStoreInfoBusinessHours,
|
|
|
+ addOrEditBusinessTime,
|
|
|
+ getHolidayList
|
|
|
+} from "@/api/modules/storeDecoration";
|
|
|
import { getInputPrompt } from "@/api/modules/newLoginApi";
|
|
|
import { useRoute } from "vue-router";
|
|
|
import { localGet } from "@/utils";
|
|
|
+import GoReceivingAccount from "@/views/home/components/go-receivingAccount.vue";
|
|
|
+
|
|
|
+// 收款账号弹窗显隐
|
|
|
+const payAccountDialogVisible = ref(false);
|
|
|
+const handleViewPayAccount = () => {
|
|
|
+ payAccountDialogVisible.value = true;
|
|
|
+};
|
|
|
+
|
|
|
+// ========== 营业时间弹窗(参考 1.vue + businessHours 页) ==========
|
|
|
+const weekDays = [
|
|
|
+ { label: "周一", value: 1 },
|
|
|
+ { label: "周二", value: 2 },
|
|
|
+ { label: "周三", value: 3 },
|
|
|
+ { label: "周四", value: 4 },
|
|
|
+ { label: "周五", value: 5 },
|
|
|
+ { label: "周六", value: 6 },
|
|
|
+ { label: "周日", value: 7 }
|
|
|
+];
|
|
|
+const holidays = ref<{ label: string; value: string }[]>([]);
|
|
|
+const fetchHolidayList = async () => {
|
|
|
+ try {
|
|
|
+ let params = {
|
|
|
+ year: new Date().getFullYear(),
|
|
|
+ page: 1,
|
|
|
+ size: 500,
|
|
|
+ openFlag: 1,
|
|
|
+ holidayName: ""
|
|
|
+ };
|
|
|
+ const res: any = await getHolidayList(params);
|
|
|
+ const list = res?.data?.records ?? res?.data ?? (Array.isArray(res?.data) ? res.data : []);
|
|
|
+ holidays.value = (Array.isArray(list) ? list : []).map((item: any) => ({
|
|
|
+ label: item.festivalName ?? item.name ?? item.label ?? String(item.id ?? ""),
|
|
|
+ value: item.festivalName ?? item.name ?? item.label ?? String(item.id ?? "")
|
|
|
+ }));
|
|
|
+ } catch {
|
|
|
+ holidays.value = [];
|
|
|
+ }
|
|
|
+};
|
|
|
+interface NormalHoursItem {
|
|
|
+ id?: number | null;
|
|
|
+ days: number[];
|
|
|
+ timeType: "custom" | "24hours";
|
|
|
+ startTime?: string;
|
|
|
+ endTime?: string;
|
|
|
+}
|
|
|
+interface SpecialHoursItem {
|
|
|
+ id?: number | null;
|
|
|
+ holidays: string[];
|
|
|
+ timeType: "custom" | "24hours";
|
|
|
+ startTime?: string;
|
|
|
+ endTime?: string;
|
|
|
+ /** 接口返回的节日名称,用于回显 */
|
|
|
+ festivalName?: string;
|
|
|
+}
|
|
|
+const businessHoursDialogVisible = ref(false);
|
|
|
+const normalHours = ref<NormalHoursItem[]>([]);
|
|
|
+const specialHours = ref<SpecialHoursItem[]>([]);
|
|
|
+const businessHoursSaving = ref(false);
|
|
|
+
|
|
|
+const formatTimeRange = (startTime?: string, endTime?: string) => {
|
|
|
+ if (!startTime || !endTime) return "";
|
|
|
+ if (endTime <= startTime) return `${startTime}-次日${endTime}`;
|
|
|
+ return `${startTime}-${endTime}`;
|
|
|
+};
|
|
|
+
|
|
|
+const getBusinessHoursDisplayTitle = (item: NormalHoursItem | SpecialHoursItem, type: 1 | 2) => {
|
|
|
+ if (type === 1) {
|
|
|
+ const normal = item as NormalHoursItem;
|
|
|
+ const sorted = [...normal.days].sort((a, b) => a - b);
|
|
|
+ if (sorted.length === 7) return "全年";
|
|
|
+ const labels = sorted.map(d => weekDays.find(w => w.value === d)?.label).filter(Boolean);
|
|
|
+ return labels.join("、");
|
|
|
+ }
|
|
|
+ const special = item as SpecialHoursItem;
|
|
|
+ return special.festivalName || special.holidays.join("、");
|
|
|
+};
|
|
|
+
|
|
|
+const getBusinessHoursTimeText = (item: NormalHoursItem | SpecialHoursItem) => {
|
|
|
+ if (item.timeType === "24hours") return "24小时";
|
|
|
+ const start = item.startTime || "00:00";
|
|
|
+ const end = item.endTime || "00:00";
|
|
|
+ return formatTimeRange(start, end);
|
|
|
+};
|
|
|
+
|
|
|
+const businessHoursDisplayList = computed(() => {
|
|
|
+ const list: {
|
|
|
+ key: string;
|
|
|
+ title: string;
|
|
|
+ businessType: 1 | 2;
|
|
|
+ timeText: string;
|
|
|
+ source: "normal" | "special";
|
|
|
+ index: number;
|
|
|
+ }[] = [];
|
|
|
+ normalHours.value.forEach((item, i) => {
|
|
|
+ list.push({
|
|
|
+ key: `normal-${i}`,
|
|
|
+ title: getBusinessHoursDisplayTitle(item, 1),
|
|
|
+ businessType: 1,
|
|
|
+ timeText: getBusinessHoursTimeText(item),
|
|
|
+ source: "normal",
|
|
|
+ index: i
|
|
|
+ });
|
|
|
+ });
|
|
|
+ specialHours.value.forEach((item, i) => {
|
|
|
+ list.push({
|
|
|
+ key: `special-${i}`,
|
|
|
+ title: getBusinessHoursDisplayTitle(item, 2),
|
|
|
+ businessType: 2,
|
|
|
+ timeText: getBusinessHoursTimeText(item),
|
|
|
+ source: "special",
|
|
|
+ index: i
|
|
|
+ });
|
|
|
+ });
|
|
|
+ return list;
|
|
|
+});
|
|
|
+
|
|
|
+const convertApiDataToDisplay = (apiData: any[]) => {
|
|
|
+ const normalList: NormalHoursItem[] = [];
|
|
|
+ const specialList: SpecialHoursItem[] = [];
|
|
|
+ apiData.forEach((item: any) => {
|
|
|
+ if (item.businessType === 1) {
|
|
|
+ const businessDate = item.businessDate || "";
|
|
|
+ const dayLabels = businessDate.split("、");
|
|
|
+ const days: number[] = [];
|
|
|
+ dayLabels.forEach((label: string) => {
|
|
|
+ const day = weekDays.find(d => d.label === label.trim());
|
|
|
+ if (day) days.push(day.value);
|
|
|
+ });
|
|
|
+ const is24Hours = item.startTime === "00:00" && (item.endTime === "23:59" || item.endTime === "02:00");
|
|
|
+ normalList.push({
|
|
|
+ id: item.id,
|
|
|
+ days,
|
|
|
+ timeType: is24Hours ? "24hours" : "custom",
|
|
|
+ startTime: is24Hours ? undefined : item.startTime,
|
|
|
+ endTime: is24Hours ? undefined : item.endTime
|
|
|
+ });
|
|
|
+ } else if (item.businessType === 2) {
|
|
|
+ const businessDate = item.businessDate || "";
|
|
|
+ const holidayLabels = businessDate.split("、").map((h: string) => h.trim());
|
|
|
+ const is24Hours = item.startTime === "00:00" && (item.endTime === "23:59" || item.endTime === "02:00");
|
|
|
+ const festivalName = item.festivalName ?? item.holidayInfo?.festivalName ?? "";
|
|
|
+ specialList.push({
|
|
|
+ id: item.id,
|
|
|
+ holidays: holidayLabels,
|
|
|
+ timeType: is24Hours ? "24hours" : "custom",
|
|
|
+ startTime: is24Hours ? undefined : item.startTime,
|
|
|
+ endTime: is24Hours ? undefined : item.endTime,
|
|
|
+ festivalName: festivalName || undefined
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return { normalList, specialList };
|
|
|
+};
|
|
|
+
|
|
|
+const convertDisplayDataToApi = () => {
|
|
|
+ const apiDataList: any[] = [];
|
|
|
+ const storeId = localGet("geeker-user")?.userInfo?.storeId || localGet("createdId");
|
|
|
+ if (!storeId) return apiDataList;
|
|
|
+ normalHours.value.forEach(item => {
|
|
|
+ const sortedDays = [...item.days].sort((a, b) => a - b);
|
|
|
+ const dayLabels = sortedDays.map(day => weekDays.find(d => d.value === day)?.label).filter(Boolean);
|
|
|
+ const businessDate = dayLabels.join("、");
|
|
|
+ const startTime = item.timeType === "24hours" ? "00:00" : item.startTime || "00:00";
|
|
|
+ const endTime = item.timeType === "24hours" ? "23:59" : item.endTime || "23:59";
|
|
|
+ apiDataList.push({
|
|
|
+ storeId: Number(storeId),
|
|
|
+ businessType: 1,
|
|
|
+ businessDate,
|
|
|
+ startTime,
|
|
|
+ endTime,
|
|
|
+ deleteFlag: 0,
|
|
|
+ createdTime: "",
|
|
|
+ createdUserId: 0,
|
|
|
+ updatedTime: "",
|
|
|
+ updatedUserId: 0
|
|
|
+ });
|
|
|
+ });
|
|
|
+ specialHours.value.forEach(item => {
|
|
|
+ const businessDate = item.holidays.join("、");
|
|
|
+ const startTime = item.timeType === "24hours" ? "00:00" : item.startTime || "00:00";
|
|
|
+ const endTime = item.timeType === "24hours" ? "23:59" : item.endTime || "23:59";
|
|
|
+ apiDataList.push({
|
|
|
+ storeId: Number(storeId),
|
|
|
+ businessType: 2,
|
|
|
+ businessDate,
|
|
|
+ startTime,
|
|
|
+ endTime,
|
|
|
+ deleteFlag: 0,
|
|
|
+ createdTime: "",
|
|
|
+ createdUserId: 0,
|
|
|
+ updatedTime: "",
|
|
|
+ updatedUserId: 0
|
|
|
+ });
|
|
|
+ });
|
|
|
+ return apiDataList;
|
|
|
+};
|
|
|
+
|
|
|
+const handleViewBusinessHours = () => {
|
|
|
+ businessHoursDialogVisible.value = true;
|
|
|
+};
|
|
|
+
|
|
|
+const onBusinessHoursDialogOpen = () => {
|
|
|
+ fetchBusinessTimeList();
|
|
|
+ fetchHolidayList();
|
|
|
+};
|
|
|
+
|
|
|
+const fetchBusinessTimeList = async () => {
|
|
|
+ const storeId = localGet("geeker-user")?.userInfo?.storeId || localGet("createdId");
|
|
|
+ if (!storeId) {
|
|
|
+ ElMessage.warning("未找到店铺信息");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ const res: any = await getStoreInfoBusinessHours({ id: storeId });
|
|
|
+ const ok = res && (res.code === 200 || res.code === "200" || res.success) && res.data != null;
|
|
|
+ if (ok) {
|
|
|
+ const dataList = Array.isArray(res.data) ? res.data : res.data.list || [];
|
|
|
+ const { normalList, specialList } = convertApiDataToDisplay(dataList);
|
|
|
+ normalHours.value = normalList;
|
|
|
+ specialHours.value = specialList;
|
|
|
+ } else {
|
|
|
+ normalHours.value = [];
|
|
|
+ specialHours.value = [];
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ normalHours.value = [];
|
|
|
+ specialHours.value = [];
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const normalBusinessHoursDialogVisible = ref(false);
|
|
|
+const normalBusinessHoursEditIndex = ref<number | null>(null);
|
|
|
+const normalBusinessHoursForm = reactive({
|
|
|
+ selectedDays: [] as number[],
|
|
|
+ timeType: "custom" as "custom" | "24hours",
|
|
|
+ startTime: "",
|
|
|
+ endTime: ""
|
|
|
+});
|
|
|
+
|
|
|
+const specialBusinessHoursDialogVisible = ref(false);
|
|
|
+const specialBusinessHoursEditIndex = ref<number | null>(null);
|
|
|
+const specialBusinessHoursForm = reactive({
|
|
|
+ selectedHolidays: [] as string[],
|
|
|
+ timeType: "custom" as "custom" | "24hours",
|
|
|
+ startTime: "",
|
|
|
+ endTime: ""
|
|
|
+});
|
|
|
+
|
|
|
+const resetNormalBusinessHoursForm = () => {
|
|
|
+ normalBusinessHoursForm.selectedDays = [];
|
|
|
+ normalBusinessHoursForm.timeType = "custom";
|
|
|
+ normalBusinessHoursForm.startTime = "";
|
|
|
+ normalBusinessHoursForm.endTime = "";
|
|
|
+ normalBusinessHoursEditIndex.value = null;
|
|
|
+};
|
|
|
+
|
|
|
+const resetSpecialBusinessHoursForm = () => {
|
|
|
+ specialBusinessHoursForm.selectedHolidays = [];
|
|
|
+ specialBusinessHoursForm.timeType = "custom";
|
|
|
+ specialBusinessHoursForm.startTime = "";
|
|
|
+ specialBusinessHoursForm.endTime = "";
|
|
|
+ specialBusinessHoursEditIndex.value = null;
|
|
|
+};
|
|
|
+
|
|
|
+const toggleNormalDay = (day: number) => {
|
|
|
+ const idx = normalBusinessHoursForm.selectedDays.indexOf(day);
|
|
|
+ if (idx > -1) normalBusinessHoursForm.selectedDays.splice(idx, 1);
|
|
|
+ else normalBusinessHoursForm.selectedDays.push(day);
|
|
|
+};
|
|
|
+
|
|
|
+const toggleSpecialHoliday = (holiday: string) => {
|
|
|
+ const idx = specialBusinessHoursForm.selectedHolidays.indexOf(holiday);
|
|
|
+ if (idx > -1) specialBusinessHoursForm.selectedHolidays.splice(idx, 1);
|
|
|
+ else specialBusinessHoursForm.selectedHolidays.push(holiday);
|
|
|
+};
|
|
|
+
|
|
|
+const openAddNormalBusinessHours = () => {
|
|
|
+ if (normalHours.value.length > 0) {
|
|
|
+ ElMessage.warning("已有正常营业时间");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ normalBusinessHoursEditIndex.value = null;
|
|
|
+ resetNormalBusinessHoursForm();
|
|
|
+ normalBusinessHoursDialogVisible.value = true;
|
|
|
+};
|
|
|
+
|
|
|
+const openAddSpecialBusinessHours = () => {
|
|
|
+ if (specialHours.value.length >= 5) {
|
|
|
+ ElMessage.warning("最多添加5个特殊营业时间");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ specialBusinessHoursEditIndex.value = null;
|
|
|
+ resetSpecialBusinessHoursForm();
|
|
|
+ specialBusinessHoursDialogVisible.value = true;
|
|
|
+};
|
|
|
+
|
|
|
+const handleEditBusinessHours = (row: { source: "normal" | "special"; index: number }, _listIndex: number) => {
|
|
|
+ if (row.source === "normal") {
|
|
|
+ const item = normalHours.value[row.index];
|
|
|
+ normalBusinessHoursEditIndex.value = row.index;
|
|
|
+ normalBusinessHoursForm.selectedDays = [...item.days];
|
|
|
+ normalBusinessHoursForm.timeType = item.timeType;
|
|
|
+ normalBusinessHoursForm.startTime = item.startTime || "";
|
|
|
+ normalBusinessHoursForm.endTime = item.endTime || "";
|
|
|
+ normalBusinessHoursDialogVisible.value = true;
|
|
|
+ } else {
|
|
|
+ const item = specialHours.value[row.index];
|
|
|
+ specialBusinessHoursEditIndex.value = row.index;
|
|
|
+ specialBusinessHoursForm.selectedHolidays = [...item.holidays];
|
|
|
+ specialBusinessHoursForm.timeType = item.timeType;
|
|
|
+ specialBusinessHoursForm.startTime = item.startTime || "";
|
|
|
+ specialBusinessHoursForm.endTime = item.endTime || "";
|
|
|
+ specialBusinessHoursDialogVisible.value = true;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const confirmNormalBusinessHours = () => {
|
|
|
+ if (normalBusinessHoursForm.selectedDays.length === 0) {
|
|
|
+ ElMessage.warning("请选择营业日");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (normalBusinessHoursForm.timeType === "custom" && (!normalBusinessHoursForm.startTime || !normalBusinessHoursForm.endTime)) {
|
|
|
+ ElMessage.warning("请选择营业时间段");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const newItem: NormalHoursItem = {
|
|
|
+ days: [...normalBusinessHoursForm.selectedDays],
|
|
|
+ timeType: normalBusinessHoursForm.timeType,
|
|
|
+ startTime: normalBusinessHoursForm.timeType === "custom" ? normalBusinessHoursForm.startTime : "00:00",
|
|
|
+ endTime: normalBusinessHoursForm.timeType === "custom" ? normalBusinessHoursForm.endTime : "23:59"
|
|
|
+ };
|
|
|
+ if (normalBusinessHoursEditIndex.value !== null) {
|
|
|
+ newItem.id = normalHours.value[normalBusinessHoursEditIndex.value].id;
|
|
|
+ normalHours.value[normalBusinessHoursEditIndex.value] = newItem;
|
|
|
+ ElMessage.success("编辑成功");
|
|
|
+ } else {
|
|
|
+ normalHours.value.push(newItem);
|
|
|
+ ElMessage.success("添加成功");
|
|
|
+ }
|
|
|
+ normalBusinessHoursDialogVisible.value = false;
|
|
|
+ resetNormalBusinessHoursForm();
|
|
|
+};
|
|
|
+
|
|
|
+const checkSpecialDateDuplicate = (holidays: string[]): boolean => {
|
|
|
+ const other = specialHours.value.filter((_, i) => i !== specialBusinessHoursEditIndex.value);
|
|
|
+ return other.some(item => holidays.some(h => item.holidays.includes(h)));
|
|
|
+};
|
|
|
+
|
|
|
+const confirmSpecialBusinessHours = () => {
|
|
|
+ if (specialBusinessHoursForm.selectedHolidays.length === 0) {
|
|
|
+ ElMessage.warning("请选择营业日");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ specialBusinessHoursForm.timeType === "custom" &&
|
|
|
+ (!specialBusinessHoursForm.startTime || !specialBusinessHoursForm.endTime)
|
|
|
+ ) {
|
|
|
+ ElMessage.warning("请选择营业时间段");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (checkSpecialDateDuplicate(specialBusinessHoursForm.selectedHolidays)) {
|
|
|
+ ElMessage.warning("特殊营业时间的日期不能重复");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const newItem: SpecialHoursItem = {
|
|
|
+ holidays: [...specialBusinessHoursForm.selectedHolidays],
|
|
|
+ timeType: specialBusinessHoursForm.timeType,
|
|
|
+ startTime: specialBusinessHoursForm.timeType === "custom" ? specialBusinessHoursForm.startTime : "00:00",
|
|
|
+ endTime: specialBusinessHoursForm.timeType === "custom" ? specialBusinessHoursForm.endTime : "23:59"
|
|
|
+ };
|
|
|
+ if (specialBusinessHoursEditIndex.value !== null) {
|
|
|
+ newItem.id = specialHours.value[specialBusinessHoursEditIndex.value].id;
|
|
|
+ specialHours.value[specialBusinessHoursEditIndex.value] = newItem;
|
|
|
+ ElMessage.success("编辑成功");
|
|
|
+ } else {
|
|
|
+ specialHours.value.push(newItem);
|
|
|
+ ElMessage.success("添加成功");
|
|
|
+ }
|
|
|
+ specialBusinessHoursDialogVisible.value = false;
|
|
|
+ resetSpecialBusinessHoursForm();
|
|
|
+};
|
|
|
+
|
|
|
+const handleDeleteBusinessHours = (row: { source: "normal" | "special"; index: number }, _listIndex: number) => {
|
|
|
+ const isNormal = row.source === "normal";
|
|
|
+ const doDelete = () => {
|
|
|
+ if (isNormal) {
|
|
|
+ if (normalHours.value.length <= 1) {
|
|
|
+ ElMessage.warning("至少存在一条营业时间");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ normalHours.value.splice(row.index, 1);
|
|
|
+ } else {
|
|
|
+ specialHours.value.splice(row.index, 1);
|
|
|
+ }
|
|
|
+ ElMessage.success("删除成功");
|
|
|
+ };
|
|
|
+ ElMessageBox.confirm("确认要删除当前营业时间吗?", "提示", {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ type: "warning"
|
|
|
+ })
|
|
|
+ .then(doDelete)
|
|
|
+ .catch(() => {});
|
|
|
+};
|
|
|
+
|
|
|
+const handleSaveBusinessHours = async () => {
|
|
|
+ if (normalHours.value.length === 0) {
|
|
|
+ ElMessage.warning("至少添加一条营业时间");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const storeId = localGet("geeker-user")?.userInfo?.storeId || localGet("createdId");
|
|
|
+ if (!storeId) {
|
|
|
+ ElMessage.warning("未找到店铺信息");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ businessHoursSaving.value = true;
|
|
|
+ try {
|
|
|
+ const apiDataList = convertDisplayDataToApi();
|
|
|
+ const result: any = await addOrEditBusinessTime(apiDataList);
|
|
|
+ if (result && (result.code === 200 || result.code === "200")) {
|
|
|
+ ElMessage.success("保存成功");
|
|
|
+ await fetchBusinessTimeList();
|
|
|
+ businessHoursDialogVisible.value = false;
|
|
|
+ } else {
|
|
|
+ ElMessage.error(result?.msg || "保存失败");
|
|
|
+ businessHoursDialogVisible.value = false;
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ ElMessage.error("保存失败");
|
|
|
+ businessHoursDialogVisible.value = false;
|
|
|
+ } finally {
|
|
|
+ businessHoursSaving.value = false;
|
|
|
+ }
|
|
|
+};
|
|
|
|
|
|
//地址集合
|
|
|
const addressList = ref<any[]>([]);
|
|
|
@@ -231,6 +839,11 @@ const loading = ref(false);
|
|
|
// 标记是否正在加载详情数据,用于防止触发 watch
|
|
|
const isLoadingDetail = ref(false);
|
|
|
|
|
|
+// 店铺评价三个输入框的独立变量
|
|
|
+const storeEvaluate1 = ref("");
|
|
|
+const storeEvaluate2 = ref("");
|
|
|
+const storeEvaluate3 = ref("");
|
|
|
+
|
|
|
// 表单数据
|
|
|
const formData = reactive({
|
|
|
id: "",
|
|
|
@@ -244,6 +857,7 @@ const formData = reactive({
|
|
|
administrativeRegionDistrictAdcode: "",
|
|
|
storeAddress: "",
|
|
|
storeBlurb: "",
|
|
|
+ storeEvaluate: "",
|
|
|
queryAddress: "",
|
|
|
businessSection: "" as number | "",
|
|
|
businessSectionName: "",
|
|
|
@@ -254,7 +868,8 @@ const formData = reactive({
|
|
|
storePosition: "",
|
|
|
storePositionLongitude: "",
|
|
|
storePositionLatitude: "",
|
|
|
- isChain: 0
|
|
|
+ isChain: 0,
|
|
|
+ storeTickets: "" as number | ""
|
|
|
});
|
|
|
|
|
|
// 经纬度查询
|
|
|
@@ -328,8 +943,38 @@ const rules = reactive<FormRules>({
|
|
|
administrativeRegionDistrictAdcode: [{ required: true, message: "请选择区", trigger: "change" }],
|
|
|
storeAddress: [{ required: true, message: "请输入详细地址", trigger: "blur" }],
|
|
|
storeBlurb: [{ required: true, message: "请输入门店简介", trigger: "blur" }],
|
|
|
+ storeEvaluate: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ validator: (rule: any, value: any, callback: any) => {
|
|
|
+ if (!storeEvaluate1.value || !storeEvaluate2.value || !storeEvaluate3.value) {
|
|
|
+ callback(new Error("请填写完整的店铺评价(三个评价都需要填写)"));
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ trigger: "blur"
|
|
|
+ }
|
|
|
+ ],
|
|
|
queryAddress: [{ required: true, message: "请输入地址进行经纬度查询", trigger: "blur" }],
|
|
|
businessSection: [{ required: true, message: "请选择经营板块", trigger: "change" }],
|
|
|
+ storeTickets: [
|
|
|
+ {
|
|
|
+ validator: (rule: any, value: any, callback: any) => {
|
|
|
+ // 仅当经营板块为生活服务(值为3)时,storeTickets为必填
|
|
|
+ if (formData.businessSection === 3) {
|
|
|
+ if (value === "" || value === null || value === undefined) {
|
|
|
+ callback(new Error("请选择标签"));
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ trigger: "change"
|
|
|
+ }
|
|
|
+ ],
|
|
|
businessTypeName: [{ required: true, message: "请输入经营种类", trigger: "blur" }],
|
|
|
businessCategoryName: [{ required: true, message: "请输入经营类目", trigger: "blur" }]
|
|
|
});
|
|
|
@@ -469,6 +1114,23 @@ const businessStatusReverseMap: Record<number, string> = {
|
|
|
const handleSubmit = async () => {
|
|
|
if (!formRef.value) return;
|
|
|
|
|
|
+ // 先验证三个店铺评价字段是否都填写
|
|
|
+ if (!storeEvaluate1.value || !storeEvaluate2.value || !storeEvaluate3.value) {
|
|
|
+ ElMessage.warning("请填写完整的店铺评价(三个评价都需要填写)");
|
|
|
+ // 手动触发验证,显示错误提示
|
|
|
+ formRef.value.validateField("storeEvaluate", () => {});
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证标签选择(当经营板块为生活服务时)
|
|
|
+ if (formData.businessSection === 3) {
|
|
|
+ if (formData.storeTickets === "" || formData.storeTickets === null || formData.storeTickets === undefined) {
|
|
|
+ ElMessage.warning("请选择标签");
|
|
|
+ formRef.value.validateField("storeTickets", () => {});
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
await formRef.value.validate(async valid => {
|
|
|
if (!valid) {
|
|
|
ElMessage.warning("请完善表单信息");
|
|
|
@@ -493,6 +1155,11 @@ const handleSubmit = async () => {
|
|
|
// 获取经营板块名称
|
|
|
const selectedSection = businessSectionList.value.find(item => item.dictId === formData.businessSection);
|
|
|
|
|
|
+ // 将三个店铺评价用逗号拼接
|
|
|
+ formData.storeEvaluate = [storeEvaluate1.value, storeEvaluate2.value, storeEvaluate3.value]
|
|
|
+ .filter(item => item && item.trim())
|
|
|
+ .join(",");
|
|
|
+
|
|
|
const submitData = {
|
|
|
id: formData.id ? Number(formData.id) : undefined,
|
|
|
isChain: formData.isChain,
|
|
|
@@ -502,6 +1169,7 @@ const handleSubmit = async () => {
|
|
|
storeAddress: formData.storeAddress,
|
|
|
storeArea: formData.storeArea,
|
|
|
storeBlurb: formData.storeBlurb,
|
|
|
+ storeEvaluate: formData.storeEvaluate,
|
|
|
queryAddress: formData.queryAddress,
|
|
|
administrativeRegionProvinceAdcode: formData.administrativeRegionProvinceAdcode ?? "",
|
|
|
administrativeRegionCityAdcode: formData.administrativeRegionCityAdcode ?? "",
|
|
|
@@ -514,7 +1182,10 @@ const handleSubmit = async () => {
|
|
|
businessSection: formData.businessSection,
|
|
|
businessSectionName: selectedSection ? selectedSection.dictDetail : "",
|
|
|
businessTypeName: formData.businessTypeName,
|
|
|
- businessCategoryName: formData.businessCategoryName
|
|
|
+ businessCategoryName: formData.businessCategoryName,
|
|
|
+ // 标签选择(仅当经营板块为生活服务时)
|
|
|
+ storeTickets:
|
|
|
+ formData.businessSection === 3 ? (formData.storeTickets !== "" ? formData.storeTickets : undefined) : undefined
|
|
|
};
|
|
|
|
|
|
let result;
|
|
|
@@ -567,6 +1238,19 @@ const getStoreDetailData = async () => {
|
|
|
formData.businessStatus = storeData.businessStatus ?? "";
|
|
|
formData.storeAddress = storeData.storeAddress ?? "";
|
|
|
formData.storeBlurb = storeData.storeBlurb ?? "";
|
|
|
+ // 处理店铺评价:用逗号切割并分别赋值给三个输入框
|
|
|
+ if (storeData.storeEvaluate) {
|
|
|
+ const evaluateArray = storeData.storeEvaluate.split(",");
|
|
|
+ storeEvaluate1.value = evaluateArray[0]?.trim() || "";
|
|
|
+ storeEvaluate2.value = evaluateArray[1]?.trim() || "";
|
|
|
+ storeEvaluate3.value = evaluateArray[2]?.trim() || "";
|
|
|
+ formData.storeEvaluate = storeData.storeEvaluate;
|
|
|
+ } else {
|
|
|
+ storeEvaluate1.value = "";
|
|
|
+ storeEvaluate2.value = "";
|
|
|
+ storeEvaluate3.value = "";
|
|
|
+ formData.storeEvaluate = "";
|
|
|
+ }
|
|
|
formData.expirationTime = storeData.expirationTime ?? "";
|
|
|
formData.foodLicenceExpirationTime = storeData.foodLicenceExpirationTime ?? "";
|
|
|
formData.storePosition = storeData.storePosition ?? "";
|
|
|
@@ -597,6 +1281,13 @@ const getStoreDetailData = async () => {
|
|
|
formData.businessSection = storeData.businessSection;
|
|
|
formData.businessSectionName = storeData.businessSectionName ?? "";
|
|
|
}
|
|
|
+ // 设置标签选择(仅当经营板块为生活服务时)
|
|
|
+ if (storeData.businessSection === 3) {
|
|
|
+ formData.storeTickets =
|
|
|
+ storeData.storeTickets !== undefined && storeData.storeTickets !== null ? Number(storeData.storeTickets) : "";
|
|
|
+ } else {
|
|
|
+ formData.storeTickets = "";
|
|
|
+ }
|
|
|
formData.businessTypeName = storeData.businessTypeName ?? "";
|
|
|
// 如果 businessCategoryName 是 0,转换为空字符串
|
|
|
const categoryName = storeData.businessCategoryName;
|
|
|
@@ -609,7 +1300,7 @@ const getStoreDetailData = async () => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-// 监听经营板块变化,更新经营板块名称
|
|
|
+// 监听经营板块变化,更新经营板块名称(由于已禁用,此 watch 主要用于初始化)
|
|
|
watch(
|
|
|
() => formData.businessSection,
|
|
|
newValue => {
|
|
|
@@ -617,6 +1308,8 @@ watch(
|
|
|
if (isLoadingDetail.value) {
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
+ // 更新经营板块名称
|
|
|
if (newValue) {
|
|
|
const selectedSection = businessSectionList.value.find(item => item.dictId === newValue);
|
|
|
formData.businessSectionName = selectedSection ? selectedSection.dictDetail : "";
|
|
|
@@ -624,6 +1317,13 @@ watch(
|
|
|
if (newValue === 3 && formData.businessCategoryName === "0") {
|
|
|
formData.businessCategoryName = "";
|
|
|
}
|
|
|
+ // 当切换到非生活服务时,清空标签选择
|
|
|
+ if (newValue !== 3) {
|
|
|
+ formData.storeTickets = "";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 如果经营板块为空,也清空标签选择
|
|
|
+ formData.storeTickets = "";
|
|
|
}
|
|
|
}
|
|
|
);
|
|
|
@@ -697,7 +1397,7 @@ onMounted(async () => {
|
|
|
}
|
|
|
|
|
|
// 响应式布局
|
|
|
-@media (width <= 1200px) {
|
|
|
+@media (width <=1200px) {
|
|
|
.store-info-container {
|
|
|
.store-form {
|
|
|
.form-content {
|
|
|
@@ -716,4 +1416,75 @@ onMounted(async () => {
|
|
|
flex: 0 0 auto;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+// 营业时间弹窗
|
|
|
+.business-hours-tip {
|
|
|
+ margin: 0 0 16px;
|
|
|
+ font-size: 13px;
|
|
|
+ line-height: 1.5;
|
|
|
+ color: #334154;
|
|
|
+}
|
|
|
+.business-hours-list {
|
|
|
+ max-height: 400px;
|
|
|
+ overflow-y: auto;
|
|
|
+}
|
|
|
+.business-hours-item {
|
|
|
+ padding: 14px 16px;
|
|
|
+ margin-bottom: 12px;
|
|
|
+ background: #fafafa;
|
|
|
+ border: 1px solid #f2f2f2;
|
|
|
+ border-radius: 8px;
|
|
|
+ .business-hours-item-header {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ .item-title {
|
|
|
+ max-width: 75%;
|
|
|
+ overflow: hidden;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #334154;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .business-hours-item-time {
|
|
|
+ margin-top: 8px;
|
|
|
+ font-size: 13px;
|
|
|
+ color: #334154;
|
|
|
+ }
|
|
|
+ .business-hours-item-actions {
|
|
|
+ padding-top: 8px;
|
|
|
+ margin-top: 8px;
|
|
|
+ border-top: 1px solid #f2f2f2;
|
|
|
+ .el-button {
|
|
|
+ padding-left: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+.business-hours-dialog-footer {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 8px;
|
|
|
+ justify-content: flex-end;
|
|
|
+}
|
|
|
+.day-buttons,
|
|
|
+.holiday-buttons {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 8px;
|
|
|
+ .el-button {
|
|
|
+ margin: 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+.time-picker-row {
|
|
|
+ display: flex;
|
|
|
+ gap: 8px;
|
|
|
+ align-items: center;
|
|
|
+ margin-top: 8px;
|
|
|
+}
|
|
|
+.time-sep {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #606266;
|
|
|
+}
|
|
|
</style>
|