remove button in point rule detail

This commit is contained in:
Timi
2026-08-24 16:53:28 +08:00
parent 2764001f5a
commit 9b843fc921
2 changed files with 67 additions and 58 deletions
+67 -4
View File
@@ -59,11 +59,22 @@
<t-cell title="创建时间" :note="formatDate(rule.createdAt, '未知时间')" /> <t-cell title="创建时间" :note="formatDate(rule.createdAt, '未知时间')" />
<t-cell title="更新时间" :note="formatDate(rule.updatedAt, '未知时间')" /> <t-cell title="更新时间" :note="formatDate(rule.updatedAt, '未知时间')" />
</t-cell-group> </t-cell-group>
<t-empty v-else :description="isLoading ? '正在加载积分规则' : '积分规则不存在'" /> <t-button
v-if="rule && canDelete"
class="delete red bg-white cell-button"
:loading="isDeleting"
variant="text"
block
@click="confirmRemove"
>
删除
</t-button>
<t-empty v-if="!rule" :description="isLoading ? '正在加载积分规则' : '积分规则不存在'" />
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { DialogPlugin } from "tdesign-mobile-vue";
import { Text, Time, useUserStore } from "timi-web"; import { Text, Time, useUserStore } from "timi-web";
import EventAPI from "@/api/EventAPI"; import EventAPI from "@/api/EventAPI";
import PointAPI from "@/api/PointAPI"; import PointAPI from "@/api/PointAPI";
@@ -72,6 +83,7 @@ import { useNavBarStore } from "@/store/navBarStore";
import type { EventItem } from "@/types/EventItem"; import type { EventItem } from "@/types/EventItem";
import type { PointRule, PointRuleStatus, PointRuleMode, PointRuleTriggerType } from "@/types/Point"; import type { PointRule, PointRuleStatus, PointRuleMode, PointRuleTriggerType } from "@/types/Point";
import { formatEventNumberValue } from "@/utils/eventValue"; import { formatEventNumberValue } from "@/utils/eventValue";
import { getErrorMessage } from "@/utils/error";
import { Message } from "@/utils/message"; import { Message } from "@/utils/message";
import { gaoRoleCodes, permissionCodes } from "@/utils/permission"; import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
@@ -88,6 +100,7 @@ const currentStoreStore = useCurrentStoreStore();
// ---------- 权限与门店 ---------- // ---------- 权限与门店 ----------
const canUpdate = computed(() => userStore.hasPermissions(permissionCodes.pointRule.update)); const canUpdate = computed(() => userStore.hasPermissions(permissionCodes.pointRule.update));
const canDelete = computed(() => userStore.hasPermissions(permissionCodes.pointRule.delete));
const canReadEvent = computed(() => userStore.hasPermissions(permissionCodes.event.read)); const canReadEvent = computed(() => userStore.hasPermissions(permissionCodes.event.read));
const isGlobalManager = computed(() => userStore.hasRoles(gaoRoleCodes.globalManager)); const isGlobalManager = computed(() => userStore.hasRoles(gaoRoleCodes.globalManager));
const storeName = computed(() => { const storeName = computed(() => {
@@ -106,6 +119,7 @@ const rule = ref<PointRule>();
const event = ref<EventItem>(); const event = ref<EventItem>();
const sourceEvent = ref<EventItem>(); const sourceEvent = ref<EventItem>();
const isLoading = ref(false); const isLoading = ref(false);
const isDeleting = ref(false);
const condition = computed(() => rule.value?.conditionJson); const condition = computed(() => rule.value?.conditionJson);
const isConsumeRule = computed(() => (rule.value?.pointValue ?? 0) < 0); const isConsumeRule = computed(() => (rule.value?.pointValue ?? 0) < 0);
@@ -260,8 +274,55 @@ function formatDate(timestamp?: number, emptyText = "不限"): string {
return timestamp === undefined || timestamp === null ? emptyText : Time.toDateTime(timestamp); return timestamp === undefined || timestamp === null ? emptyText : Time.toDateTime(timestamp);
} }
// ---------- 删除 ----------
async function confirmRemove(): Promise<void> {
if (!rule.value?.id || isDeleting.value) {
return;
}
const dialog = DialogPlugin.confirm({
title: "删除积分规则",
content: `确定删除规则 ${rule.value.name || "未命名规则"} 吗?删除只影响后续登记,不会改变历史流水。`,
cancelBtn: "取消",
confirmBtn: "删除",
onCancel() {
dialog.destroy();
},
async onConfirm() {
dialog.destroy();
await removeRule();
}
});
}
async function removeRule(): Promise<void> {
const ruleId = rule.value?.id;
if (!ruleId || isDeleting.value) {
return;
}
isDeleting.value = true;
navBarStore.clearRight();
try {
await PointAPI.ruleRemove(ruleId);
Message.success("积分规则已删除");
await router.replace("/management/points/rules");
} catch (error) {
Message.error(getErrorMessage(error, "积分规则删除失败"));
setEditAction();
} finally {
isDeleting.value = false;
}
}
// ---------- 导航 ---------- // ---------- 导航 ----------
function setEditAction(): void {
if (canUpdate.value) {
navBarStore.setRightText("编辑", "var(--td-brand-color)", toEdit);
}
}
async function toEdit(): Promise<void> { async function toEdit(): Promise<void> {
const ruleId = String(route.params.id || ""); const ruleId = String(route.params.id || "");
if (!canUpdate.value || !ruleId) { if (!canUpdate.value || !ruleId) {
@@ -291,9 +352,7 @@ watch(() => route.params.id, async () => {
onMounted(() => { onMounted(() => {
navBarStore.clearRight(); navBarStore.clearRight();
if (canUpdate.value) { setEditAction();
navBarStore.setRightText("编辑", "var(--td-brand-color)", toEdit);
}
}); });
onUnmounted(() => { onUnmounted(() => {
@@ -309,6 +368,10 @@ onUnmounted(() => {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.delete {
margin: 0 1rem;
}
.rule-header { .rule-header {
gap: .75rem; gap: .75rem;
margin: 0 1rem; margin: 0 1rem;
-54
View File
@@ -88,17 +88,6 @@
</t-form-item> </t-form-item>
</card-container> </card-container>
</t-form> </t-form>
<t-button
v-if="!isCreateMode"
class="delete red bg-white cell-button"
v-can="permissionCodes.pointRule.delete"
:loading="isRemoving"
variant="text"
block
@click="confirmRemove"
>
删除
</t-button>
</div> </div>
<t-popup v-model="storePickerVisible" placement="bottom"> <t-popup v-model="storePickerVisible" placement="bottom">
<t-picker <t-picker
@@ -188,7 +177,6 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { DialogPlugin } from "tdesign-mobile-vue";
import { Time, useUserStore } from "timi-web"; import { Time, useUserStore } from "timi-web";
import EventAPI from "@/api/EventAPI"; import EventAPI from "@/api/EventAPI";
import PointAPI from "@/api/PointAPI"; import PointAPI from "@/api/PointAPI";
@@ -240,7 +228,6 @@ const pageAccess = computed(() => ({
// ---------- 基础表单 ---------- // ---------- 基础表单 ----------
const isSaving = ref(false); const isSaving = ref(false);
const isRemoving = ref(false);
const formModel = reactive({ const formModel = reactive({
id: "", id: "",
storeId: "", storeId: "",
@@ -745,43 +732,6 @@ async function saveRule(): Promise<void> {
} }
} }
// ---------- 删除 ----------
async function confirmRemove(): Promise<void> {
if (!formModel.id || isRemoving.value) {
return;
}
const dialog = DialogPlugin.confirm({
title: "删除积分规则",
content: `确定删除规则 ${formModel.name || "未命名规则"} 吗?删除只影响后续登记,不会改变历史流水。`,
cancelBtn: "取消",
confirmBtn: "删除",
onCancel() {
dialog.destroy();
},
async onConfirm() {
dialog.destroy();
await removeRule();
}
});
}
async function removeRule(): Promise<void> {
if (!formModel.id) {
return;
}
isRemoving.value = true;
try {
await PointAPI.ruleRemove(formModel.id);
Message.success("积分规则已删除");
await router.replace("/management/points/rules");
} catch (error) {
Message.error(getErrorMessage(error, "积分规则删除失败"));
} finally {
isRemoving.value = false;
}
}
// ---------- 页面数据 ---------- // ---------- 页面数据 ----------
async function fillForm(): Promise<void> { async function fillForm(): Promise<void> {
@@ -920,10 +870,6 @@ onUnmounted(() => navBarStore.clearRight());
line-height: 1.5; line-height: 1.5;
} }
} }
.delete {
margin-top: 1rem;
}
} }
:global(html.theme-dark) { :global(html.theme-dark) {