diff --git a/src/pages/package/PackageOrderConfigList.vue b/src/pages/package/PackageOrderConfigList.vue new file mode 100644 index 0000000..1e42f38 --- /dev/null +++ b/src/pages/package/PackageOrderConfigList.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/src/pages/salesOrder/SalesOrderList.vue b/src/pages/salesOrder/SalesOrderList.vue index a6eb537..e1efdc2 100644 --- a/src/pages/salesOrder/SalesOrderList.vue +++ b/src/pages/salesOrder/SalesOrderList.vue @@ -32,6 +32,7 @@
+ + + + + (); const customerSelectorVisible = ref(false); let customerKeyword = ""; +const selectedPackage = ref(); const orderType = ref("ALL"); type PaymentFilter = "ALL" | GaoSalesPaymentStatus | "PENDING_RECEIVE"; type RefundFilter = "ALL" | GaoSalesRefundStatus; @@ -180,6 +191,8 @@ const refundOptions = [ const routeFilterKey = computed(() => [ route.query.customerId, + route.query.packageConfigId, + route.query.packageConfigName, route.query.orderType, route.query.status, route.query.paymentStatus, @@ -191,15 +204,30 @@ function queryValue(value: unknown): string { return Array.isArray(value) ? "" : typeof value === "string" ? value : ""; } +const packageConfigId = computed(() => queryValue(route.query.packageConfigId)); +const selectedPackageName = computed(() => selectedPackage.value?.name || queryValue(route.query.packageConfigName) || "未命名套餐"); + function applyRouteFilters(): void { const pendingReceive = queryValue(route.query.pendingReceive) === "true"; customerId.value = queryValue(route.query.customerId); - orderType.value = queryValue(route.query.orderType) || "ALL"; + orderType.value = packageConfigId.value ? "PACKAGE" : queryValue(route.query.orderType) || "ALL"; status.value = queryValue(route.query.status) || "ALL"; paymentStatus.value = pendingReceive ? "PENDING_RECEIVE" : queryValue(route.query.paymentStatus) as PaymentFilter || "ALL"; refundStatus.value = queryValue(route.query.refundStatus) as RefundFilter || "ALL"; } +async function loadRoutePackage(): Promise { + selectedPackage.value = undefined; + if (!packageConfigId.value) { + return; + } + try { + selectedPackage.value = await PackageAPI.configDetail(packageConfigId.value); + } catch { + return; + } +} + function setCustomerKeyword(customer: Customer): void { const value = customer.name?.trim() || customer.code?.trim() || ""; customerId.value = customer.id || ""; @@ -232,6 +260,7 @@ function buildPageFilter(): SalesOrderPage { const pendingReceive = paymentStatus.value === "PENDING_RECEIVE"; return { customerId: customerId.value || undefined, + packageConfigId: packageConfigId.value || undefined, keyword: keyword.value || undefined, orderType: orderType.value === "ALL" ? undefined : orderType.value as GaoSalesOrderType, status: status.value === "ALL" ? undefined : status.value as GaoSalesOrderStatus, @@ -351,6 +380,7 @@ watch(routeFilterKey, async () => { } catch { selectedCustomer.value = undefined; } + await loadRoutePackage(); await fetchList(true); }); onMounted(async () => { @@ -359,6 +389,7 @@ onMounted(async () => { applyRouteFilters(); try { await loadRouteCustomer(); + await loadRoutePackage(); await fetchList(true); } catch (error) { Message.error(getErrorMessage(error, "销售订单加载失败")); @@ -444,6 +475,13 @@ onUnmounted(() => { navBarStore.clearRight(); search.cancel(); }); padding: 0 1rem; flex-direction: column; + .selected-package { + + :deep(.t-cell-group) { + margin: 0; + } + } + .item { border-radius: 1rem; } diff --git a/src/pages/tabs/ProductTab.vue b/src/pages/tabs/ProductTab.vue index 2ef7b71..696583a 100644 --- a/src/pages/tabs/ProductTab.vue +++ b/src/pages/tabs/ProductTab.vue @@ -116,6 +116,13 @@ const menuGroupList = computed(() => [ path: "/management/package-configs", title: "套餐配置", visible: userStore.hasPermissions(permissionCodes.packageConfig.read) + }, + { + icon: "task", + path: "/management/package-orders", + title: "套餐订单", + visible: userStore.hasPermissions(permissionCodes.packageConfig.read) + && userStore.hasPermissions(permissionCodes.salesOrder.read) } ] }, diff --git a/src/router/routes/packageRoutes.ts b/src/router/routes/packageRoutes.ts index dcf8373..cf92f0b 100644 --- a/src/router/routes/packageRoutes.ts +++ b/src/router/routes/packageRoutes.ts @@ -6,6 +6,7 @@ function pageMeta(title: string, depth = 3, background = "#F5F5F8"): RouteRecord export default [ { path: "/management/package-configs", name: "PackageConfigList", component: () => import("@/pages/package/PackageConfigList.vue"), meta: pageMeta("套餐配置") }, + { path: "/management/package-orders", name: "PackageOrderConfigList", component: () => import("@/pages/package/PackageOrderConfigList.vue"), meta: pageMeta("选择套餐") }, { path: "/management/package-configs/create", name: "PackageConfigCreate", component: () => import("@/pages/package/PackageConfigEdit.vue"), meta: pageMeta("新增套餐配置", 4) }, { path: "/management/package-configs/:id", name: "PackageConfigDetail", component: () => import("@/pages/package/PackageConfigDetail.vue"), meta: pageMeta("套餐配置详情", 4) }, { path: "/management/package-configs/:id/edit", name: "PackageConfigEdit", component: () => import("@/pages/package/PackageConfigEdit.vue"), meta: pageMeta("编辑套餐配置", 5) }, diff --git a/src/types/SalesOrder.ts b/src/types/SalesOrder.ts index 0b76948..f62e39b 100644 --- a/src/types/SalesOrder.ts +++ b/src/types/SalesOrder.ts @@ -76,6 +76,7 @@ export type SalesOrder = { export type SalesOrderPage = { storeId?: string; customerId?: string; + packageConfigId?: string; orderType?: GaoSalesOrderType; status?: GaoSalesOrderStatus; paymentStatus?: GaoSalesPaymentStatus;