This commit is contained in:
2026-05-20 12:43:30 +08:00
parent 08b3326438
commit 39c848c1cc
5 changed files with 208 additions and 28 deletions

View File

@@ -50,6 +50,17 @@ export namespace AgentApi {
success: boolean;
}
/** 代理等级降级 */
export interface DowngradeAgentParams {
agent_id: string;
to_level: number;
remark?: string;
}
export interface DowngradeAgentResp {
success: boolean;
}
export interface AgentLinkListItem {
agent_id: number;
product_id: number;
@@ -597,8 +608,19 @@ async function updateAgentMobile(params: AgentApi.UpdateAgentMobileParams) {
);
}
/**
* 代理等级降级(管理端)
*/
async function downgradeAgent(params: AgentApi.DowngradeAgentParams) {
return requestClient.post<AgentApi.DowngradeAgentResp>(
'/agent/level/downgrade',
params,
);
}
export {
auditWithdrawal,
downgradeAgent,
generateDiamondInviteCode,
getAgentCommissionList,
getAgentConfig,

View File

@@ -29,6 +29,7 @@ export function getUpgradeTypeName(type: number): string {
const map: Record<number, string> = {
1: '自主付费',
2: '钻石升级下级',
4: '管理端降级',
};
return map[type] || '未知';
}

View File

@@ -23,6 +23,7 @@ import LinkModal from './modules/link-modal.vue';
import MobileEditModal from './modules/mobile-edit-modal.vue';
import OrderModal from './modules/order-modal.vue';
import RebateModal from './modules/rebate-modal.vue';
import DowngradeModal from './modules/downgrade-modal.vue';
import UpgradeModal from './modules/upgrade-modal.vue';
import WithdrawalModal from './modules/withdrawal-modal.vue';
@@ -77,6 +78,12 @@ const [MobileEditModalComponent, mobileEditModalApi] = useVbenModal({
destroyOnClose: true,
});
// 代理降级弹窗
const [DowngradeModalComponent, downgradeModalApi] = useVbenModal({
connectedComponent: DowngradeModal,
destroyOnClose: true,
});
// 表格配置
const [Grid, gridApi] = useVbenVxeGrid({
formOptions: {
@@ -147,33 +154,23 @@ const [Grid, gridApi] = useVbenVxeGrid({
} as VxeTableGridOptions<AgentApi.AgentListItem>,
});
// 更多操作菜单项
const moreMenuItems = [
{
key: 'edit-mobile',
label: '修改手机号',
},
{
key: 'links',
label: '推广链接',
},
{
key: 'rebate',
label: '返佣记录',
},
{
key: 'upgrade',
label: '升级记录',
},
{
key: 'order',
label: '订单记录',
},
{
key: 'withdrawal',
label: '提现记录',
},
];
// 更多操作菜单项(降级仅黄金代理展示)
const baseMoreMenuItems = [
{ key: 'edit-mobile', label: '修改手机号' },
{ key: 'links', label: '推广链接' },
{ key: 'rebate', label: '返佣记录' },
{ key: 'upgrade', label: '升级记录' },
{ key: 'order', label: '订单记录' },
{ key: 'withdrawal', label: '提现记录' },
] as const;
function getMoreMenuItems(row: AgentApi.AgentListItem) {
const items = [...baseMoreMenuItems];
if (row.level === 2) {
items.push({ key: 'downgrade', label: '降级为普通代理' });
}
return items;
}
// 团队首领信息
const teamLeaderId = computed(() => route.query.team_leader_id);
@@ -236,6 +233,10 @@ function onActionClick(
onViewWithdrawal(e.row);
break;
}
case 'downgrade': {
onDowngrade(e.row);
break;
}
}
}
@@ -249,6 +250,11 @@ function onEditMobile(row: AgentApi.AgentListItem) {
mobileEditModalApi.setData(row).open();
}
// 代理降级
function onDowngrade(row: AgentApi.AgentListItem) {
downgradeModalApi.setData(row).open();
}
// 查看推广链接
function onViewLinks(row: AgentApi.AgentListItem) {
linkModalApi.setData({ agentId: row.id }).open();
@@ -290,6 +296,7 @@ function onRefresh() {
<FormDrawer @success="onRefresh" />
<LinkModalComponent />
<MobileEditModalComponent @success="onRefresh" />
<DowngradeModalComponent @success="onRefresh" />
<CommissionModalComponent />
<RebateModalComponent />
<UpgradeModalComponent />
@@ -322,7 +329,10 @@ function onRefresh() {
<Dropdown>
<Button type="link">更多操作</Button>
<template #overlay>
<Menu :items="moreMenuItems" @click="(e) => onActionClick({ code: String(e.key), row })" />
<Menu
:items="getMoreMenuItems(row)"
@click="(e) => onActionClick({ code: String(e.key), row })"
/>
</template>
</Dropdown>
</div>

View File

@@ -0,0 +1,146 @@
<script lang="ts" setup>
import type { AgentApi } from '#/api/agent';
import { ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import {
Alert,
Button,
Form,
Input,
Modal as AntModal,
message,
} from 'ant-design-vue';
import { downgradeAgent } from '#/api/agent';
import { getLevelName } from '#/utils/agent';
const { TextArea } = Input;
/** 黄金代理仅能降为普通 */
const targetLevel = 1;
const rowData = ref<AgentApi.AgentListItem>();
const remark = ref('');
const loading = ref(false);
const [Modal, modalApi] = useVbenModal({
title: '代理降级',
destroyOnClose: true,
onOpenChange(isOpen) {
if (isOpen) {
const data = modalApi.getData<AgentApi.AgentListItem>();
if (data?.id != null) {
rowData.value = {
...data,
level: Number(data.level),
};
} else {
rowData.value = undefined;
}
remark.value = '';
}
},
});
const emit = defineEmits<{
success: [];
}>();
const impactTips = [
'仅降低代理等级,不会自动退还历史升级费用或收回已发返佣。',
'若存在等级高于目标等级的直接下级,将无法降级。',
'钻石代理不允许降级。',
];
async function handleSubmit() {
const row = rowData.value;
if (!row?.id) {
message.warning('未获取到代理信息,请关闭后重试');
return;
}
const level = Number(row.level);
if (level === 3) {
message.warning('钻石代理不允许降级');
return;
}
if (level !== 2) {
message.warning('当前等级不支持降级');
return;
}
AntModal.confirm({
title: '确认降级',
content: `确定将「${row.mobile || row.id}」从${getLevelName(level)}降为${getLevelName(targetLevel)}吗?`,
okText: '确认降级',
okType: 'danger',
cancelText: '取消',
async onOk() {
loading.value = true;
try {
await downgradeAgent({
agent_id: String(row.id),
to_level: targetLevel,
remark: remark.value?.trim() || undefined,
});
message.success('降级成功');
emit('success');
modalApi.close();
} finally {
loading.value = false;
}
},
});
}
</script>
<template>
<Modal width="480px">
<div class="py-2">
<Alert
type="warning"
show-icon
class="mb-4"
message="降级说明"
>
<template #description>
<ul class="mb-0 list-disc pl-4">
<li v-for="(tip, index) in impactTips" :key="index">
{{ tip }}
</li>
</ul>
</template>
</Alert>
<Form layout="vertical">
<Form.Item label="代理ID">
<Input :value="rowData?.id" disabled />
</Form.Item>
<Form.Item label="当前等级">
<Input
:value="rowData ? getLevelName(Number(rowData.level)) : ''"
disabled
/>
</Form.Item>
<Form.Item label="目标等级">
<Input :value="getLevelName(targetLevel)" disabled />
</Form.Item>
<Form.Item label="备注">
<TextArea
v-model:value="remark"
placeholder="选填,将写入等级变更记录"
:rows="3"
allow-clear
/>
</Form.Item>
</Form>
</div>
<template #footer>
<Button @click="modalApi.close()">取消</Button>
<Button type="primary" danger :loading="loading" @click="handleSubmit">
确认降级
</Button>
</template>
</Modal>
</template>

View File

@@ -95,6 +95,7 @@ export function useUpgradeFormSchema(): VbenFormSchema[] {
options: [
{ label: '自主付费', value: 1 },
{ label: '钻石升级下级', value: 2 },
{ label: '管理端降级', value: 4 },
],
},
},