Skip to content

Commit de615c2

Browse files
YunaiVgitee-org
authored andcommitted
!241 完善分销功能
Merge pull request !241 from 疯狂的世界/brokerage
2 parents 8b65a28 + 2e830d1 commit de615c2

File tree

8 files changed

+559
-33
lines changed

8 files changed

+559
-33
lines changed

src/api/mall/trade/brokerage/user/index.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ export interface BrokerageUserVO {
88
brokerageTime: Date
99
price: number
1010
frozenPrice: number
11+
12+
nickname: string
13+
avatar: string
1114
}
1215

1316
// 查询分销用户列表
@@ -19,3 +22,18 @@ export const getBrokerageUserPage = async (params: any) => {
1922
export const getBrokerageUser = async (id: number) => {
2023
return await request.get({ url: `/trade/brokerage-user/get?id=` + id })
2124
}
25+
26+
// 修改推广员
27+
export const updateBindUser = async (data: any) => {
28+
return await request.put({ url: `/trade/brokerage-user/update-bind-user`, data })
29+
}
30+
31+
// 清除推广员
32+
export const clearBindUser = async (data: any) => {
33+
return await request.put({ url: `/trade/brokerage-user/clear-bind-user`, data })
34+
}
35+
36+
// 修改推广资格
37+
export const updateBrokerageEnabled = async (data: any) => {
38+
return await request.put({ url: `/trade/brokerage-user/update-brokerage-enable`, data })
39+
}

src/utils/constants.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,3 +299,33 @@ export const BrokerageEnabledConditionEnum = {
299299
name: '指定分销'
300300
}
301301
}
302+
/**
303+
* 分销用户类型枚举
304+
*/
305+
export const BrokerageUserTypeEnum = {
306+
ALL: {
307+
type: 0,
308+
name: '全部'
309+
},
310+
FIRST: {
311+
type: 1,
312+
name: '一级推广人'
313+
},
314+
SECOND: {
315+
type: 2,
316+
name: '二级推广人'
317+
}
318+
}
319+
/**
320+
* 佣金记录业务类型枚举
321+
*/
322+
export const BrokerageRecordBizTypeEnum = {
323+
ORDER: {
324+
type: 1,
325+
name: '获得推广佣金'
326+
},
327+
WITHDRAW: {
328+
type: 2,
329+
name: '提现申请'
330+
}
331+
}

src/utils/dict.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,13 +151,6 @@ export enum DICT_TYPE {
151151
// ========== MALL - 会员模块 ==========
152152
MEMBER_POINT_BIZ_TYPE = 'member_point_biz_type', // 积分的业务类型
153153
MEMBER_EXPERIENCE_BIZ_TYPE = 'member_experience_biz_type', // 会员经验业务类型
154-
// TODO @疯狂:这块的枚举,是不是要挪到 TRADE 那啦
155-
BROKERAGE_ENABLED_CONDITION = 'brokerage_enabled_condition', // 分佣模式
156-
BROKERAGE_BIND_MODE = 'brokerage_bind_mode', // 分销关系绑定模式
157-
BROKERAGE_BANK_NAME = 'brokerage_bank_name', // 佣金提现银行
158-
BROKERAGE_WITHDRAW_TYPE = 'brokerage_withdraw_type', // 佣金冻结时间
159-
BROKERAGE_RECORD_BIZ_TYPE = 'brokerage_record_biz_type', // 佣金业务类型
160-
BROKERAGE_RECORD_STATUS = 'brokerage_record_status', // 佣金状态
161154

162155
// ========== MALL - 商品模块 ==========
163156
PRODUCT_UNIT = 'product_unit', // 商品单位
@@ -172,6 +165,12 @@ export enum DICT_TYPE {
172165
TRADE_ORDER_STATUS = 'trade_order_status', // 订单 - 状态
173166
TRADE_ORDER_ITEM_AFTER_SALE_STATUS = 'trade_order_item_after_sale_status', // 订单项 - 售后状态
174167
TRADE_DELIVERY_TYPE = 'trade_delivery_type', // 配送方式
168+
BROKERAGE_ENABLED_CONDITION = 'brokerage_enabled_condition', // 分佣模式
169+
BROKERAGE_BIND_MODE = 'brokerage_bind_mode', // 分销关系绑定模式
170+
BROKERAGE_BANK_NAME = 'brokerage_bank_name', // 佣金提现银行
171+
BROKERAGE_WITHDRAW_TYPE = 'brokerage_withdraw_type', // 佣金冻结时间
172+
BROKERAGE_RECORD_BIZ_TYPE = 'brokerage_record_biz_type', // 佣金业务类型
173+
BROKERAGE_RECORD_STATUS = 'brokerage_record_status', // 佣金状态
175174

176175
// ========== MALL - 营销模块 ==========
177176
PROMOTION_DISCOUNT_TYPE = 'promotion_discount_type', // 优惠类型

src/views/mall/trade/brokerage/record/index.vue

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,26 @@
6565
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
6666
<el-table-column label="编号" align="center" prop="id" min-width="60" />
6767
<el-table-column label="用户编号" align="center" prop="userId" min-width="80" />
68+
<el-table-column label="头像" align="center" prop="userAvatar" width="70px">
69+
<template #default="scope">
70+
<el-avatar :src="scope.row.userAvatar" />
71+
</template>
72+
</el-table-column>
73+
<el-table-column label="昵称" align="center" prop="userNickname" min-width="80px" />
6874
<el-table-column label="业务类型" align="center" prop="bizType" min-width="85">
6975
<template #default="scope">
7076
<dict-tag :type="DICT_TYPE.BROKERAGE_RECORD_BIZ_TYPE" :value="scope.row.bizType" />
7177
</template>
7278
</el-table-column>
7379
<el-table-column label="业务编号" align="center" prop="bizId" min-width="80" />
7480
<el-table-column label="标题" align="center" prop="title" min-width="110" />
75-
<el-table-column label="金额" align="center" prop="price" min-width="60" />
81+
<el-table-column
82+
label="金额"
83+
align="center"
84+
prop="price"
85+
min-width="60"
86+
:formatter="fenToYuanFormat"
87+
/>
7688
<el-table-column label="说明" align="center" prop="description" min-width="120" />
7789
<el-table-column label="状态" align="center" prop="status" min-width="85">
7890
<template #default="scope">
@@ -108,6 +120,7 @@
108120
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
109121
import { dateFormatter } from '@/utils/formatTime'
110122
import * as BrokerageRecordApi from '@/api/mall/trade/brokerage/record'
123+
import { fenToYuanFormat } from '@/utils/formatter'
111124
112125
defineOptions({ name: 'TradeBrokerageRecord' })
113126
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
<template>
2+
<Dialog v-model="dialogVisible" title="推广人列表" width="75%">
3+
<ContentWrap>
4+
<!-- 搜索工作栏 -->
5+
<el-form
6+
class="-mb-15px"
7+
:model="queryParams"
8+
ref="queryFormRef"
9+
:inline="true"
10+
label-width="85px"
11+
>
12+
<el-form-item label="用户类型" prop="userType">
13+
<el-radio-group v-model="queryParams.userType" @change="handleQuery">
14+
<el-radio-button
15+
v-for="item in BrokerageUserTypeEnum"
16+
:key="item.type"
17+
:label="item.type"
18+
>
19+
{{ item.name }}
20+
</el-radio-button>
21+
</el-radio-group>
22+
</el-form-item>
23+
<el-form-item label="状态" prop="status">
24+
<el-select
25+
v-model="queryParams.status"
26+
placeholder="请选择状态"
27+
clearable
28+
class="!w-240px"
29+
>
30+
<el-option
31+
v-for="dict in getIntDictOptions(DICT_TYPE.BROKERAGE_RECORD_STATUS)"
32+
:key="dict.value"
33+
:label="dict.label"
34+
:value="dict.value"
35+
/>
36+
</el-select>
37+
</el-form-item>
38+
<el-form-item label="绑定时间" prop="createTime">
39+
<el-date-picker
40+
v-model="queryParams.createTime"
41+
value-format="YYYY-MM-DD HH:mm:ss"
42+
type="daterange"
43+
start-placeholder="开始日期"
44+
end-placeholder="结束日期"
45+
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
46+
class="!w-240px"
47+
/>
48+
</el-form-item>
49+
<el-form-item>
50+
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
51+
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
52+
</el-form-item>
53+
</el-form>
54+
</ContentWrap>
55+
56+
<!-- 列表 -->
57+
<ContentWrap>
58+
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
59+
<el-table-column label="订单编号" align="center" prop="bizId" min-width="80px" />
60+
<el-table-column label="用户编号" align="center" prop="sourceUserId" min-width="80px" />
61+
<el-table-column label="头像" align="center" prop="sourceUserAvatar" width="70px">
62+
<template #default="scope">
63+
<el-avatar :src="scope.row.sourceUserAvatar" />
64+
</template>
65+
</el-table-column>
66+
<el-table-column label="昵称" align="center" prop="sourceUserNickname" min-width="80px" />
67+
<el-table-column
68+
label="佣金"
69+
align="center"
70+
prop="price"
71+
min-width="100px"
72+
:formatter="fenToYuanFormat"
73+
/>
74+
<el-table-column label="状态" align="center" prop="status" min-width="85">
75+
<template #default="scope">
76+
<dict-tag :type="DICT_TYPE.BROKERAGE_RECORD_STATUS" :value="scope.row.status" />
77+
</template>
78+
</el-table-column>
79+
<el-table-column
80+
label="创建时间"
81+
align="center"
82+
prop="createTime"
83+
:formatter="dateFormatter"
84+
width="170px"
85+
/>
86+
</el-table>
87+
<!-- 分页 -->
88+
<Pagination
89+
:total="total"
90+
v-model:page="queryParams.pageNo"
91+
v-model:limit="queryParams.pageSize"
92+
@pagination="getList"
93+
/>
94+
</ContentWrap>
95+
</Dialog>
96+
</template>
97+
98+
<script setup lang="ts">
99+
import { dateFormatter } from '@/utils/formatTime'
100+
import * as BrokerageRecordApi from '@/api/mall/trade/brokerage/record'
101+
import { BrokerageRecordBizTypeEnum, BrokerageUserTypeEnum } from '@/utils/constants'
102+
import { fenToYuanFormat } from '@/utils/formatter'
103+
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
104+
105+
/** 推广订单列表 */
106+
defineOptions({ name: 'BrokerageOrderListDialog' })
107+
108+
const message = useMessage() // 消息弹窗
109+
110+
const loading = ref(true) // 列表的加载中
111+
const total = ref(0) // 列表的总页数
112+
const list = ref([]) // 列表的数据
113+
const queryParams = reactive({
114+
pageNo: 1,
115+
pageSize: 10,
116+
userId: null,
117+
bizType: BrokerageRecordBizTypeEnum.ORDER.type,
118+
userType: BrokerageUserTypeEnum.ALL.type,
119+
createTime: []
120+
})
121+
const queryFormRef = ref() // 搜索的表单
122+
123+
/** 打开弹窗 */
124+
const dialogVisible = ref(false) // 弹窗的是否展示
125+
const open = async (userId: number) => {
126+
dialogVisible.value = true
127+
queryParams.userId = userId
128+
resetQuery()
129+
}
130+
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
131+
132+
/** 查询列表 */
133+
const getList = async () => {
134+
loading.value = true
135+
try {
136+
const data = await BrokerageRecordApi.getBrokerageRecordPage(queryParams)
137+
list.value = data.list
138+
total.value = data.total
139+
} finally {
140+
loading.value = false
141+
}
142+
}
143+
144+
/** 搜索按钮操作 */
145+
const handleQuery = () => {
146+
queryParams.pageNo = 1
147+
getList()
148+
}
149+
150+
/** 重置按钮操作 */
151+
const resetQuery = () => {
152+
queryFormRef.value?.resetFields()
153+
handleQuery()
154+
}
155+
</script>

0 commit comments

Comments
 (0)