update event status

This commit is contained in:
Timi
2026-08-31 12:20:38 +08:00
parent a527d6685e
commit 9fb43a648f
5 changed files with 53 additions and 6 deletions
+9
View File
@@ -69,6 +69,14 @@ async function listValid(): Promise<EventItem[]> {
return sortEventList(list);
}
/**
* 查询登记记录筛选使用的事件,包含已删除事件。
* 该接口由后端使用 event.create 权限保护,仅用于历史记录回溯。
*/
async function listHistory(): Promise<PageResult<EventItem>> {
return await axios.post(`${BASE_URI}/list/history`, withCurrentStorePage(withEventOrder({ index: 0, size: 1000 })));
}
async function detail(id: string): Promise<EventItem> {
return await axios.post(`${BASE_URI}/detail`, undefined, {
params: { id }
@@ -102,6 +110,7 @@ async function remove(id: string): Promise<void> {
export default {
list,
listValid,
listHistory,
detail,
create,
update,
+10 -2
View File
@@ -133,8 +133,9 @@ const defaultColor = "#2f88ff";
// ---------- 权限与门店 ----------
const canUpdate = computed(() => userStore.hasPermissions(permissionCodes.event.update));
const canDeleteEvent = computed(() => userStore.hasPermissions(permissionCodes.event.delete));
const isDeletedEvent = computed(() => event.value?.status === "DELETED");
const canUpdate = computed(() => !isDeletedEvent.value && userStore.hasPermissions(permissionCodes.event.update));
const canDeleteEvent = computed(() => !isDeletedEvent.value && userStore.hasPermissions(permissionCodes.event.delete));
const canReadEventRecord = computed(() => userStore.hasPermissions(permissionCodes.eventRecord.read));
const isGlobalManager = computed(() => userStore.hasRoles(gaoRoleCodes.globalManager));
const storeName = computed(() => {
@@ -354,6 +355,13 @@ onMounted(() => {
}
});
watch(canUpdate, value => {
navBarStore.clearRight();
if (value) {
navBarStore.setRightText("编辑", "var(--td-brand-color)", toEdit);
}
});
onUnmounted(() => {
navBarStore.clearRight();
});
+27
View File
@@ -85,6 +85,22 @@
<t-form-item label="状态" arrow @click="openStatusPicker">
<div class="picker-text" v-text="getStatusText(formModel.status)" />
</t-form-item>
<t-form-item label-width="0">
<div class="status-tips">
<div class="status">
<span class="orange">草稿:</span>
<span class="gray">普通店员角色不可见,不可登记、查询</span>
</div>
<div class="status">
<span class="orange">可登记:</span>
<span class="gray">正常状态,可登记、可查询</span>
</div>
<div class="status">
<span class="orange">不可登记:</span>
<span class="gray">登记时不会出现在事件列表,但仍可在登记事件记录列表中可以查找,标记为“不可登记”,所有店员角色可见。店长角色可进入详情和编辑,可恢复为“可登记”</span>
</div>
</div>
</t-form-item>
</t-form>
<event-option-editor v-model="optionGroupList" />
<section class="roles" v-entrance-transition="70">
@@ -674,6 +690,11 @@ async function fillForm(): Promise<void> {
return;
}
const current = await EventAPI.detail(routeId.value);
if (current.status === "DELETED") {
Message.error("已删除登记事件不可编辑");
await router.replace({ name: "EventDetail", params: { id: routeId.value } });
return;
}
Object.assign(formModel, {
id: current.id || "",
storeId: current.storeId || formModel.storeId,
@@ -735,6 +756,12 @@ onUnmounted(() => navBarStore.clearRight());
align-items: center;
justify-content: end;
}
.status-tips {
display: flex;
font-size: .875rem;
flex-direction: column;
}
}
.picker-text {
+3 -3
View File
@@ -54,7 +54,7 @@
</div>
</template>
</t-cell>
<template v-if="canDeleteEvent" #right>
<template v-if="canDeleteEvent && item.status !== 'DELETED'" #right>
<t-button
class="delete"
theme="danger"
@@ -186,7 +186,7 @@ async function toEventItem(item: EventItem): Promise<void> {
function openRemoveDialog(eventItem: EventItem): void {
const eventId = eventItem.id;
if (!eventId || isRemoving.value) {
if (!eventId || eventItem.status === "DELETED" || isRemoving.value) {
return;
}
@@ -196,7 +196,7 @@ function openRemoveDialog(eventItem: EventItem): void {
async function removeEvent(eventItem: EventItem): Promise<void> {
const eventId = eventItem.id;
if (!eventId || isRemoving.value) {
if (!eventId || eventItem.status === "DELETED" || isRemoving.value) {
return;
}
+4 -1
View File
@@ -180,6 +180,7 @@ const isExporting = ref(false);
let suppressOptionFilterReload = false;
const canCreateRecord = computed(() => userStore.hasPermissions(permissionCodes.eventRecord.create));
const canCreateEvent = computed(() => userStore.hasPermissions(permissionCodes.event.create));
const dateFilterLabel = computed(() => dateOptions.find(item => item.value === dateFilterType.value)?.label || "今天");
const actionOptions = computed(() => eventList.value.map(item => ({
label: getEventDisplayName(item),
@@ -394,7 +395,9 @@ async function loadRecords(): Promise<void> {
async function loadActions(): Promise<void> {
// 历史登记记录需要关联已停用或已删除的事件,不能使用只返回 ACTIVE 事件的 listValid。
const result = await EventAPI.list({ index: 0, size: 1000 });
const result = canCreateEvent.value
? await EventAPI.listHistory()
: await EventAPI.list({ index: 0, size: 1000 });
eventList.value = result.list || [];
const eventIdList = eventList.value.map(item => item.id).filter((item): item is string => Boolean(item));
const eventIdSet = new Set(eventIdList);