feat(M08-D): 补门店与房间管理

This commit is contained in:
Codex
2026-08-10 11:40:09 +08:00
parent 04afce4417
commit 1ca783e91b
9 changed files with 1017 additions and 14 deletions
+21 -5
View File
@@ -28,9 +28,14 @@
<Sparkles :size="18" />
<span>保洁运营</span>
</button>
<button class="nav-item" type="button" disabled>
<button
class="nav-item"
:class="{ active: activeModule === 'stores' }"
type="button"
@click="activeModule = 'stores'"
>
<Store :size="18" />
<span>门店</span>
<span>门店房间</span>
</button>
<button class="nav-item" type="button" disabled>
<RadioTower :size="18" />
@@ -46,8 +51,8 @@
<section class="workspace">
<header class="topbar">
<div>
<p class="eyebrow">{{ activeModule === 'overview' ? 'M08-D' : 'M08-B' }}</p>
<h2>{{ activeModule === 'overview' ? '平台运营总览' : '保洁任务与结算' }}</h2>
<p class="eyebrow">{{ activeModuleMeta.stage }}</p>
<h2>{{ activeModuleMeta.title }}</h2>
</div>
<div class="token-box">
<el-input
@@ -70,6 +75,11 @@
@open-cleaning="activeModule = 'cleaning'"
/>
<StoresRoomsPanel
v-else-if="activeModule === 'stores'"
:session="session"
/>
<template v-else>
<section class="metric-grid" aria-label="保洁概览">
<div class="metric">
@@ -247,6 +257,7 @@ import CleaningStatisticsPanel from './components/CleaningStatisticsPanel.vue';
import CleanersPanel from './components/CleanersPanel.vue';
import CleaningFieldHandoffPanel from './components/CleaningFieldHandoffPanel.vue';
import OperationsOverviewPanel from './components/OperationsOverviewPanel.vue';
import StoresRoomsPanel from './components/StoresRoomsPanel.vue';
import {
ApiError,
assignCleaningTask,
@@ -283,7 +294,7 @@ import { money } from './format';
const savedToken = ref(localStorage.getItem('qipai.admin.token') || '');
const tokenDraft = ref(savedToken.value);
const activeModule = ref<'overview' | 'cleaning'>('overview');
const activeModule = ref<'overview' | 'stores' | 'cleaning'>('overview');
const activeTab = ref('tasks');
const lastError = ref('');
const lastMessage = ref('');
@@ -292,6 +303,11 @@ const settlementStatus = ref<SettlementStatus | ''>('CONFIRMED');
const cleanerStatus = ref<UserStatus | ''>('ACTIVE');
const cleanerSearch = ref('');
const session = computed(() => ({ token: savedToken.value }));
const activeModuleMeta = computed(() => ({
overview: { stage: 'M08-D', title: '平台运营总览' },
stores: { stage: 'M08-D', title: '门店与房间管理' },
cleaning: { stage: 'M08-B', title: '保洁任务与结算' }
})[activeModule.value]);
const loading = reactive({ tasks: false, settlements: false, statistics: false, cleaners: false });
const tasks = reactive<PageResult<CleaningTask>>({ items: [], total: 0, page: 1, pageSize: 20 });
const settlements = reactive<PageResult<CleaningSettlement>>({