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); 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> { async function detail(id: string): Promise<EventItem> {
return await axios.post(`${BASE_URI}/detail`, undefined, { return await axios.post(`${BASE_URI}/detail`, undefined, {
params: { id } params: { id }
@@ -102,6 +110,7 @@ async function remove(id: string): Promise<void> {
export default { export default {
list, list,
listValid, listValid,
listHistory,
detail, detail,
create, create,
update, update,
+10 -2
View File
@@ -133,8 +133,9 @@ const defaultColor = "#2f88ff";
// ---------- 权限与门店 ---------- // ---------- 权限与门店 ----------
const canUpdate = computed(() => userStore.hasPermissions(permissionCodes.event.update)); const isDeletedEvent = computed(() => event.value?.status === "DELETED");
const canDeleteEvent = computed(() => userStore.hasPermissions(permissionCodes.event.delete)); 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 canReadEventRecord = computed(() => userStore.hasPermissions(permissionCodes.eventRecord.read));
const isGlobalManager = computed(() => userStore.hasRoles(gaoRoleCodes.globalManager)); const isGlobalManager = computed(() => userStore.hasRoles(gaoRoleCodes.globalManager));
const storeName = computed(() => { const storeName = computed(() => {
@@ -354,6 +355,13 @@ onMounted(() => {
} }
}); });
watch(canUpdate, value => {
navBarStore.clearRight();
if (value) {
navBarStore.setRightText("编辑", "var(--td-brand-color)", toEdit);
}
});
onUnmounted(() => { onUnmounted(() => {
navBarStore.clearRight(); navBarStore.clearRight();
}); });
+27
View File
@@ -85,6 +85,22 @@
<t-form-item label="状态" arrow @click="openStatusPicker"> <t-form-item label="状态" arrow @click="openStatusPicker">
<div class="picker-text" v-text="getStatusText(formModel.status)" /> <div class="picker-text" v-text="getStatusText(formModel.status)" />
</t-form-item> </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> </t-form>
<event-option-editor v-model="optionGroupList" /> <event-option-editor v-model="optionGroupList" />
<section class="roles" v-entrance-transition="70"> <section class="roles" v-entrance-transition="70">
@@ -674,6 +690,11 @@ async function fillForm(): Promise<void> {
return; return;
} }
const current = await EventAPI.detail(routeId.value); 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, { Object.assign(formModel, {
id: current.id || "", id: current.id || "",
storeId: current.storeId || formModel.storeId, storeId: current.storeId || formModel.storeId,
@@ -735,6 +756,12 @@ onUnmounted(() => navBarStore.clearRight());
align-items: center; align-items: center;
justify-content: end; justify-content: end;
} }
.status-tips {
display: flex;
font-size: .875rem;
flex-direction: column;
}
} }
.picker-text { .picker-text {
+3 -3
View File
@@ -54,7 +54,7 @@
</div> </div>
</template> </template>
</t-cell> </t-cell>
<template v-if="canDeleteEvent" #right> <template v-if="canDeleteEvent && item.status !== 'DELETED'" #right>
<t-button <t-button
class="delete" class="delete"
theme="danger" theme="danger"
@@ -186,7 +186,7 @@ async function toEventItem(item: EventItem): Promise<void> {
function openRemoveDialog(eventItem: EventItem): void { function openRemoveDialog(eventItem: EventItem): void {
const eventId = eventItem.id; const eventId = eventItem.id;
if (!eventId || isRemoving.value) { if (!eventId || eventItem.status === "DELETED" || isRemoving.value) {
return; return;
} }
@@ -196,7 +196,7 @@ function openRemoveDialog(eventItem: EventItem): void {
async function removeEvent(eventItem: EventItem): Promise<void> { async function removeEvent(eventItem: EventItem): Promise<void> {
const eventId = eventItem.id; const eventId = eventItem.id;
if (!eventId || isRemoving.value) { if (!eventId || eventItem.status === "DELETED" || isRemoving.value) {
return; return;
} }
+4 -1
View File
@@ -180,6 +180,7 @@ const isExporting = ref(false);
let suppressOptionFilterReload = false; let suppressOptionFilterReload = false;
const canCreateRecord = computed(() => userStore.hasPermissions(permissionCodes.eventRecord.create)); 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 dateFilterLabel = computed(() => dateOptions.find(item => item.value === dateFilterType.value)?.label || "今天");
const actionOptions = computed(() => eventList.value.map(item => ({ const actionOptions = computed(() => eventList.value.map(item => ({
label: getEventDisplayName(item), label: getEventDisplayName(item),
@@ -394,7 +395,9 @@ async function loadRecords(): Promise<void> {
async function loadActions(): Promise<void> { async function loadActions(): Promise<void> {
// 历史登记记录需要关联已停用或已删除的事件,不能使用只返回 ACTIVE 事件的 listValid。 // 历史登记记录需要关联已停用或已删除的事件,不能使用只返回 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 || []; eventList.value = result.list || [];
const eventIdList = eventList.value.map(item => item.id).filter((item): item is string => Boolean(item)); const eventIdList = eventList.value.map(item => item.id).filter((item): item is string => Boolean(item));
const eventIdSet = new Set(eventIdList); const eventIdSet = new Set(eventIdList);