add package

This commit is contained in:
Timi
2026-09-01 01:14:54 +08:00
parent 100d4c4c44
commit 2d94abfb32
39 changed files with 4425 additions and 59 deletions
+35 -2
View File
@@ -46,11 +46,12 @@
/>
<div v-if="isEditMode" class="edit-point-tip red">涉及积分变动的数据不能修改,已产生积分流水的登记记录不会因修改客户、事件或时间而重算;如需修改这些事实,请删除后重新创建,删除会自动回流积分。</div>
<event-selector
v-model="selectedEventIdList"
:model-value="selectedEventIdList"
class="event-selector"
:event-list="eventList"
:disabled="isEditMode"
required-mark
@update:model-value="handleEventSelectionChange"
/>
<event-option-selector
class="option-selector"
@@ -219,6 +220,7 @@ import type { EventItem, EventOptionSelectionMap } from "@/types/EventItem";
import type { EventRecord } from "@/types/EventRecord";
import type { PointAction } from "@/types/Point";
import { getAttachmentReadURL } from "@/utils/attachment";
import { isPackagePurchaseEvent } from "@/utils/event";
import { buildEventOptionSelectionMap, resolveSelectedOptionGroupList, validateEventOptionSelection } from "@/utils/eventOption";
import { getEventRecordPhotoURL, hasPhotoAttachment } from "@/utils/eventRecord";
import { getEventNumberValuePlaceholder, resolveEventNumberValue } from "@/utils/eventValue";
@@ -434,6 +436,27 @@ const eventNameMap = computed(() => {
return map;
});
async function handleEventSelectionChange(eventIdList: string[]): Promise<void> {
const packageEvent = eventIdList
.map(eventId => eventList.value.find(item => item.id === eventId))
.find(item => isPackagePurchaseEvent(item));
if (!isEditMode.value && packageEvent?.id) {
if (!userStore.hasPermissions(permissionCodes.customerPackage.create)) {
Message.warning("当前账号没有套餐购买权限");
return;
}
await router.push({
name: "CustomerPackagePurchase",
query: {
eventId: packageEvent.id,
...(selectedCustomer.value?.id ? { customerId: selectedCustomer.value.id } : {})
}
});
return;
}
selectedEventIdList.value = eventIdList;
}
function appendRecordEvent(record: EventRecord): void {
if (!record.event?.id || eventList.value.some(item => item.id === record.event?.id)) {
return;
@@ -683,6 +706,10 @@ function validateForm(): boolean {
Message.warning("请至少选择一个登记事件");
return false;
}
if (selectedEventIdList.value.some(eventId => isPackagePurchaseEvent(eventList.value.find(item => item.id === eventId)))) {
Message.warning("套餐购买事件必须通过客户套餐购买页面登记");
return false;
}
for (const eventId of selectedEventIdList.value) {
const event = eventList.value.find(item => item.id === eventId);
if (!event) {
@@ -769,11 +796,17 @@ async function loadPageData(): Promise<void> {
return;
}
selectedEventIdList.value = eventList.value.slice(0, 1).map(item => item.id).filter((item): item is string => Boolean(item));
const defaultEvent = eventList.value.find(item => !isPackagePurchaseEvent(item));
selectedEventIdList.value = defaultEvent?.id ? [defaultEvent.id] : [];
}
async function loadRecordForEdit(): Promise<void> {
const record = await EventRecordAPI.detail(routeId.value);
if (isPackagePurchaseEvent(record.event)) {
Message.warning("套餐购买记录不能通过普通登记页编辑,请在客户套餐详情中查看");
await router.replace({ name: "EventRecordDetail", params: { id: routeId.value } });
return;
}
editingRecord.value = record;
appendRecordEvent(record);
selectedCustomerList.value = record.customer ? [record.customer] : [];