add store auto closed day

This commit is contained in:
Timi
2026-08-12 12:03:47 +08:00
parent 171aee1602
commit 2a64f2ad72
6 changed files with 95 additions and 93 deletions
+58 -75
View File
@@ -2,26 +2,39 @@
<div v-can="savePermissionCode" class="store-edit">
<t-form class="form" label-align="left">
<t-form-item v-if="!isStoreManagerScope" label="编码">
<t-input v-model.trim="formModel.code" placeholder="门店编码" borderless />
<t-input v-model.trim="formData.code" placeholder="门店编码" borderless />
</t-form-item>
<t-form-item label="名称">
<t-input v-model.trim="formModel.name" placeholder="门店名称" borderless />
<t-input v-model.trim="formData.name" placeholder="门店名称" borderless />
</t-form-item>
<t-form-item v-if="!isStoreManagerScope" label="启用" content-align="right">
<t-switch v-model="formModel.status" :custom-value="['ACTIVE', 'INACTIVE']" />
<t-switch v-model="formData.status" :custom-value="['ACTIVE', 'INACTIVE']" />
</t-form-item>
<t-form-item label="电话">
<t-input v-model.trim="formModel.telephone" type="tel" placeholder="联系电话" borderless />
<t-input v-model.trim="formData.telephone" type="tel" placeholder="联系电话" borderless />
</t-form-item>
<t-form-item label="地址">
<t-input v-model.trim="formModel.address" placeholder="门店地址" borderless />
<t-input v-model.trim="formData.address" placeholder="门店地址" borderless />
</t-form-item>
<t-form-item label="备注">
<t-textarea v-model.trim="formModel.remark" class="textarea" placeholder="备注" autosize borderless />
<t-textarea v-model.trim="formData.remark" class="textarea" placeholder="备注" autosize borderless />
</t-form-item>
</t-form>
<t-cell-group v-if="!isCreateMode" theme="card">
<t-cell title="营业日管理" note="配置营业或休息日期" arrow hover @click="router.push(`/management/stores/${routeId}/business-days`)" />
<t-cell
title="营业日管理"
note="配置营业或休息日期"
arrow
@click="router.push(`/management/stores/${routeId}/business-days`)"
/>
<t-cell
title="自动休息日"
description="全天无任何登记记录时自动判定为休息日,休息日不视为中断连续登记事件"
>
<template #right-icon>
<t-switch v-model="formData.autoClosedDay" />
</template>
</t-cell>
</t-cell-group>
<div class="actions">
<t-button
@@ -36,7 +49,7 @@
class="action"
theme="primary"
:loading="isSaving"
@click="saveStore"
@click="doSave"
>保存</t-button>
</div>
</div>
@@ -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<void> {
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<void> {
async function doSave(): Promise<void> {
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<void> {
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<void> {
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<void> {
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("门店数据加载失败");
}
});
</script>
<style scoped lang="less">