update customer package

This commit is contained in:
Timi
2026-09-07 16:42:12 +08:00
parent d56719df1c
commit ab47086ed7
3 changed files with 67 additions and 10 deletions
+42
View File
@@ -44,6 +44,15 @@
:customer="selectedCustomer" :customer="selectedCustomer"
v-entrance-transition v-entrance-transition
/> />
<t-form-item v-if="isCustomerPackageCreate" label="套餐" required-mark>
<t-input
:model-value="config?.name || ''"
readonly
borderless
placeholder="请选择套餐"
@click="configSelectorVisible = true"
/>
</t-form-item>
<div v-if="config && !isSaleable" class="saleable-tip red">套餐当前不可购买,请检查套餐状态和有效期</div> <div v-if="config && !isSaleable" class="saleable-tip red">套餐当前不可购买,请检查套餐状态和有效期</div>
<section class="package-purchase-form"> <section class="package-purchase-form">
<div v-if="config" class="config-summary"> <div v-if="config" class="config-summary">
@@ -156,6 +165,26 @@
selection-mode="single" selection-mode="single"
@change="handleCustomerChange" @change="handleCustomerChange"
/> />
<t-popup v-model="configSelectorVisible" placement="bottom">
<div class="config-selector bg-white">
<div class="popup-header">
<t-button variant="text" size="small" @click="configSelectorVisible = false">关闭</t-button>
<h3>选择套餐</h3>
<span />
</div>
<t-cell-group v-if="configList.length">
<t-cell
v-for="item in configList"
:key="item.id"
:title="item.name || '未命名套餐'"
:note="`标准价:${formatPackageAmount(item.standardAmount)}`"
arrow
@click="selectConfig(item)"
/>
</t-cell-group>
<div v-else class="center-tips" v-text="'暂无可购买套餐'" />
</div>
</t-popup>
<t-popup v-model="selectedCustomerListVisible" placement="bottom"> <t-popup v-model="selectedCustomerListVisible" placement="bottom">
<div class="selected-customer-popup bg-white"> <div class="selected-customer-popup bg-white">
<div class="popup-header"> <div class="popup-header">
@@ -223,7 +252,10 @@ const userStore = useUserStore();
// ---------- 套餐配置 ---------- // ---------- 套餐配置 ----------
const configId = computed(() => String(route.params.id || "")); const configId = computed(() => String(route.params.id || ""));
const isCustomerPackageCreate = computed(() => route.name === "CustomerPackageCreate");
const config = ref<GaoPackageConfig>(); const config = ref<GaoPackageConfig>();
const configList = ref<GaoPackageConfig[]>([]);
const configSelectorVisible = ref(false);
// ---------- 客户 ---------- // ---------- 客户 ----------
@@ -431,12 +463,21 @@ async function submitRecord(): Promise<void> {
async function loadPageData(): Promise<void> { async function loadPageData(): Promise<void> {
if (!configId.value) { if (!configId.value) {
configList.value = await PackageAPI.configListValid();
return; return;
} }
config.value = await PackageAPI.configDetail(configId.value); config.value = await PackageAPI.configDetail(configId.value);
applyConfig(config.value); applyConfig(config.value);
} }
async function selectConfig(item: GaoPackageConfig): Promise<void> {
if (!item.id) {
return;
}
config.value = await PackageAPI.configDetail(item.id);
configSelectorVisible.value = false;
}
onMounted(async () => { onMounted(async () => {
navBarStore.clearRight(); navBarStore.clearRight();
if (userStore.hasPermissions(permissionCodes.customerPackage.create)) { if (userStore.hasPermissions(permissionCodes.customerPackage.create)) {
@@ -596,6 +637,7 @@ watch(config, value => {
border-radius: inherit; border-radius: inherit;
} }
.config-selector,
.selected-customer-popup { .selected-customer-popup {
height: 70vh; height: 70vh;
overflow: auto; overflow: auto;
+18 -4
View File
@@ -59,7 +59,7 @@
<div class="center-tips" v-text="loading ? '正在加载' : noMore ? '已经到底了' : '上拉加载更多'" /> <div class="center-tips" v-text="loading ? '正在加载' : noMore ? '已经到底了' : '上拉加载更多'" />
</t-pull-down-refresh> </t-pull-down-refresh>
</div> </div>
<nav-bar-action-menu v-if="canCreate" :actions="actions" /> <nav-bar-action-menu v-if="actions.length" :actions="actions" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@@ -81,16 +81,26 @@ const router = useRouter();
const navBarStore = useNavBarStore(); const navBarStore = useNavBarStore();
const userStore = useUserStore(); const userStore = useUserStore();
const canCreate = computed(() => userStore.hasPermissions(permissionCodes.salesOrder.create)); const canCreate = computed(() => userStore.hasPermissions(permissionCodes.salesOrder.create));
const canCreatePackageOrder = computed(() => userStore.hasPermissions(permissionCodes.customerPackage.create));
const canReceive = computed(() => userStore.hasPermissions(permissionCodes.fundReceive.create)); const canReceive = computed(() => userStore.hasPermissions(permissionCodes.fundReceive.create));
const canCreateFulfillment = computed(() => userStore.hasPermissions(permissionCodes.orderFulfillment.create)); const canCreateFulfillment = computed(() => userStore.hasPermissions(permissionCodes.orderFulfillment.create));
const canOperateStock = computed(() => userStore.hasPermissions(permissionCodes.productStock.create)); const canOperateStock = computed(() => userStore.hasPermissions(permissionCodes.productStock.create));
const actions = computed(() => canCreate.value ? [{ const actions = computed(() => [
...(canCreate.value ? [{
key: "create", key: "create",
text: "直接产品下单", text: "直接产品下单",
icon: "add", icon: "add",
theme: "primary" as const, theme: "primary" as const,
action: toCreate action: toCreate
}] : []); }] : []),
...(canCreatePackageOrder.value ? [{
key: "create-package-order",
text: "创建客户套餐",
icon: "add-circle",
theme: "primary" as const,
action: toCreatePackageOrder
}] : [])
]);
const keyword = ref(""); const keyword = ref("");
const customerId = ref(""); const customerId = ref("");
const orderType = ref("ALL"); const orderType = ref("ALL");
@@ -225,6 +235,10 @@ async function toCreate(): Promise<void> {
await router.push("/management/sales-orders/create"); await router.push("/management/sales-orders/create");
} }
async function toCreatePackageOrder(): Promise<void> {
await router.push("/management/customer-packages/create");
}
const search = Toolkit.debounce(async () => { const search = Toolkit.debounce(async () => {
try { try {
await fetchList(true); await fetchList(true);
@@ -239,7 +253,7 @@ watch(routeFilterKey, async () => {
}); });
onMounted(async () => { onMounted(async () => {
navBarStore.clearRight(); navBarStore.clearRight();
navBarStore.setCustomRightVisible(canCreate.value); navBarStore.setCustomRightVisible(!!actions.value.length);
applyRouteFilters(); applyRouteFilters();
try { await fetchList(true); } catch (error) { Message.error(getErrorMessage(error, "销售订单加载失败")); } try { await fetchList(true); } catch (error) { Message.error(getErrorMessage(error, "销售订单加载失败")); }
}); });
+2 -1
View File
@@ -13,5 +13,6 @@ export default [
{ path: "/management/package-configs/create", name: "PackageConfigCreate", component: PackageConfigEdit, meta: pageMeta("新增套餐配置", 4) }, { path: "/management/package-configs/create", name: "PackageConfigCreate", component: PackageConfigEdit, meta: pageMeta("新增套餐配置", 4) },
{ path: "/management/package-configs/:id", name: "PackageConfigDetail", component: PackageConfigDetail, meta: pageMeta("套餐配置详情", 4) }, { path: "/management/package-configs/:id", name: "PackageConfigDetail", component: PackageConfigDetail, meta: pageMeta("套餐配置详情", 4) },
{ path: "/management/package-configs/:id/edit", name: "PackageConfigEdit", component: PackageConfigEdit, meta: pageMeta("编辑套餐配置", 5) }, { path: "/management/package-configs/:id/edit", name: "PackageConfigEdit", component: PackageConfigEdit, meta: pageMeta("编辑套餐配置", 5) },
{ path: "/management/package-configs/:id/purchase", name: "PackagePurchase", component: PackagePurchase, meta: pageMeta("购买套餐", 5) } { path: "/management/package-configs/:id/purchase", name: "PackagePurchase", component: PackagePurchase, meta: pageMeta("购买套餐", 5) },
{ path: "/management/customer-packages/create", name: "CustomerPackageCreate", component: PackagePurchase, meta: pageMeta("创建客户套餐", 4) }
] as RouteRecordRaw[]; ] as RouteRecordRaw[];