diff --git a/src/pages/store/StoreBusinessDayCalendar.vue b/src/pages/store/StoreBusinessDayCalendar.vue index 9fbdc09..68fed04 100644 --- a/src/pages/store/StoreBusinessDayCalendar.vue +++ b/src/pages/store/StoreBusinessDayCalendar.vue @@ -15,6 +15,7 @@
+ - + 营业 休息 @@ -84,7 +85,7 @@ import { DialogPlugin, Toast, type CalendarProps, type TDate } from "tdesign-mobile-vue"; import { useUserStore } from "timi-web"; import StoreAPI from "@/api/StoreAPI"; -import type { Store, StoreBusinessDay, StoreBusinessDayOpenStatus } from "@/types/Store"; +import type { Store, StoreBusinessDay, StoreBusinessDayStatus } from "@/types/Store"; import { gaoRoleCodes, permissionCodes } from "@/utils/permission"; defineOptions({ @@ -130,8 +131,8 @@ const calendarFormat = computed>(() => { } return { ...dateItem, - className: `business-day-${day.openStatus!.toLowerCase()}`, - suffix: day.openStatus === "OPEN" ? "营" : "休" + className: `business-day-${day.status!.toLowerCase()}`, + suffix: day.status === "OPEN" ? "营" : "休" }; }; }); @@ -176,7 +177,7 @@ const isDeleting = ref(false); const editingId = ref(""); const formModel = reactive({ dateText: "", - openStatus: "OPEN" as StoreBusinessDayOpenStatus, + status: "OPEN" as StoreBusinessDayStatus, reason: "正常休息" }); const savePermissionCode = computed(() => { @@ -192,7 +193,7 @@ function openDayEditor(day?: StoreBusinessDay, dateValue = toDateValue(new Date( editingId.value = day?.id || ""; Object.assign(formModel, { dateText: formatDateValue(day?.dateValue || dateValue), - openStatus: day?.openStatus || "OPEN", + status: day?.status || "OPEN", reason: day ? day.reason : "正常休息" }); editorVisible.value = true; @@ -215,8 +216,8 @@ async function saveDay(): Promise { id: editingId.value || undefined, storeId: storeId.value, dateValue: parseDateValue(formModel.dateText), - openStatus: formModel.openStatus, - reason: formModel.openStatus === "CLOSED" ? formModel.reason || undefined : undefined + status: formModel.status, + reason: formModel.status === "CLOSED" ? formModel.reason || undefined : undefined }; if (editingId.value) { await StoreAPI.updateBusinessDay(day); @@ -317,10 +318,11 @@ onMounted(async () => { .store-business-day-calendar { gap: .75rem; display: grid; - padding: calc(var(--app-nav-height) + 1rem) 1rem 6rem; + padding: calc(var(--app-nav-height) + 1rem) 0 6rem; .summary { gap: .75rem; + margin: 0 1rem; display: flex; padding: .75rem; border-radius: .75rem; @@ -350,6 +352,7 @@ onMounted(async () => { } :deep(.t-calendar) { + margin: 0 1rem; z-index: 1; overflow: hidden; border-radius: .75rem; diff --git a/src/pages/store/StoreEdit.vue b/src/pages/store/StoreEdit.vue index 8a43de2..3562b79 100644 --- a/src/pages/store/StoreEdit.vue +++ b/src/pages/store/StoreEdit.vue @@ -2,26 +2,39 @@
- + - + - + - + - + - + - + + + +
保存
@@ -46,7 +59,8 @@ import { DialogPlugin, Toast } from "tdesign-mobile-vue"; import { useUserStore } from "timi-web"; import StoreAPI from "@/api/StoreAPI"; -import type { Store, StoreStatus } from "@/types/Store"; +import { useCurrentStoreStore } from "@/store/currentStoreStore"; +import type { StoreStatus } from "@/types/Store"; import { gaoRoleCodes, permissionCodes } from "@/utils/permission"; defineOptions({ @@ -56,6 +70,7 @@ defineOptions({ const route = useRoute(); const router = useRouter(); const userStore = useUserStore(); +const currentStoreStore = useCurrentStoreStore(); const routeId = computed(() => String(route.params.id || "")); const isStoreManagerScope = computed(() => userStore.hasRoles(gaoRoleCodes.storeManager) && !userStore.hasRoles(gaoRoleCodes.globalManager)); @@ -68,105 +83,81 @@ const savePermissionCode = computed(() => isCreateMode.value ? permissionCodes.s const isSaving = ref(false); const isRemoving = ref(false); -const formModel = reactive({ +const formData = reactive({ id: "", code: "", name: "", status: "ACTIVE" as StoreStatus, telephone: "", address: "", - remark: "" + remark: "", + autoClosedDay: true }); -const sortValue = ref(0); -// ---------- 页面数据 ---------- - -async function fillForm(): Promise { - if (!routeId.value) { - return; - } - - const current = await StoreAPI.detail(routeId.value); - Object.assign(formModel, { - id: current.id || "", - code: current.code || "", - name: current.name || "", - status: current.status || "ACTIVE", - telephone: current.telephone || "", - address: current.address || "", - remark: current.remark || "" - }); - sortValue.value = current.sort ?? 0; -} - -// ---------- 保存 ---------- - -async function saveStore(): Promise { +async function doSave(): Promise { if (!validateForm()) { return; } - isSaving.value = true; try { - const store = buildStorePayload(); if (isCreateMode.value) { - await StoreAPI.create(store); + await StoreAPI.create(formData); } else { - await StoreAPI.update(store); + await StoreAPI.update(formData); + await refreshCurrentStore(); } Toast.success("门店已保存"); - if (isStoreManagerScope.value) { - return; + if (userStore.hasPermissions(permissionCodes.store.create)) { + await router.replace("/management/stores"); + } else { + await router.replace("/store"); } - await router.replace("/management/stores"); } finally { isSaving.value = false; } } -function buildStorePayload(): Store { - if (isStoreManagerScope.value) { - return { - id: formModel.id || undefined, - name: formModel.name, - telephone: formModel.telephone || undefined, - address: formModel.address || undefined, - remark: formModel.remark || undefined - }; +async function refreshCurrentStore(): Promise { + if (formData.id !== currentStoreStore.currentStoreId) { + return; } - return { - id: formModel.id || undefined, - code: formModel.code, - name: formModel.name, - status: formModel.status, - telephone: formModel.telephone || undefined, - address: formModel.address || undefined, - remark: formModel.remark || undefined, - sort: sortValue.value - }; + await currentStoreStore.refreshCurrentStore(formData.id); } function validateForm(): boolean { - if (!isStoreManagerScope.value && !formModel.code) { + if (!isStoreManagerScope.value && !formData.code) { Toast.warning("请填写门店编码"); return false; } - if (!formModel.name) { + if (!formData.name) { Toast.warning("请填写门店名称"); return false; } return true; } +onMounted(async () => { + try { + if (!routeId.value) { + return; + } + const current = await StoreAPI.detail(routeId.value); + Object.assign(formData, current); + } catch { + Toast.error("门店数据加载失败"); + } +}); + +// ---------- 删除 ---------- + async function confirmRemoveStore(): Promise { - if (!formModel.id) { + if (!formData.id) { return; } - const dialog = DialogPlugin.confirm({ title: "删除门店", - content: `确定删除 ${formModel.name} 吗?删除后无法恢复。`, + content: `确定删除 ${formData.name} 吗?删除后无法恢复。`, cancelBtn: "取消", confirmBtn: "删除", onCancel() { @@ -186,21 +177,13 @@ async function removeStore(): Promise { isRemoving.value = true; try { - await StoreAPI.remove(formModel.id); + await StoreAPI.remove(formData.id); Toast.success("门店已删除"); await router.replace("/management/stores"); } finally { isRemoving.value = false; } } - -onMounted(async () => { - try { - await fillForm(); - } catch { - Toast.error("门店数据加载失败"); - } -});