Skip to content

Commit dd5a1f2

Browse files
author
puhui999
committed
Merge remote-tracking branch 'yudao/dev' into dev-to-dev
2 parents 8778f57 + df6a384 commit dd5a1f2

File tree

14 files changed

+964
-35
lines changed

14 files changed

+964
-35
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+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import request from '@/config/axios'
2+
3+
export interface BrokerageWithdrawVO {
4+
id: number
5+
userId: number
6+
price: number
7+
feePrice: number
8+
totalPrice: number
9+
type: number
10+
name: string
11+
accountNo: string
12+
bankName: string
13+
bankAddress: string
14+
accountQrCodeUrl: string
15+
status: number
16+
auditReason: string
17+
auditTime: Date
18+
remark: string
19+
}
20+
21+
// 查询佣金提现列表
22+
export const getBrokerageWithdrawPage = async (params: any) => {
23+
return await request.get({ url: `/trade/brokerage-withdraw/page`, params })
24+
}
25+
26+
// 查询佣金提现详情
27+
export const getBrokerageWithdraw = async (id: number) => {
28+
return await request.get({ url: `/trade/brokerage-withdraw/get?id=` + id })
29+
}
30+
31+
// 佣金提现 - 通过申请
32+
export const approveBrokerageWithdraw = async (id: number) => {
33+
return await request.put({ url: `/trade/brokerage-withdraw/approve?id=` + id })
34+
}
35+
36+
// 审核佣金提现 - 驳回申请
37+
export const rejectBrokerageWithdraw = async (data: BrokerageWithdrawVO) => {
38+
return await request.put({ url: `/trade/brokerage-withdraw/reject`, data })
39+
}

src/utils/constants.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,3 +299,62 @@ export const BrokerageEnabledConditionEnum = {
299299
name: '指定分销'
300300
}
301301
}
302+
/**
303+
* 佣金记录业务类型枚举
304+
*/
305+
export const BrokerageRecordBizTypeEnum = {
306+
ORDER: {
307+
type: 1,
308+
name: '获得推广佣金'
309+
},
310+
WITHDRAW: {
311+
type: 2,
312+
name: '提现申请'
313+
}
314+
}
315+
/**
316+
* 佣金提现状态枚举
317+
*/
318+
export const BrokerageWithdrawStatusEnum = {
319+
AUDITING: {
320+
status: 0,
321+
name: '审核中'
322+
},
323+
AUDIT_SUCCESS: {
324+
status: 10,
325+
name: '审核通过'
326+
},
327+
AUDIT_FAIL: {
328+
status: 20,
329+
name: '审核不通过'
330+
},
331+
WITHDRAW_SUCCESS: {
332+
status: 11,
333+
name: '提现成功'
334+
},
335+
WITHDRAW_FAIL: {
336+
status: 21,
337+
name: '提现失败'
338+
}
339+
}
340+
/**
341+
* 佣金提现类型枚举
342+
*/
343+
export const BrokerageWithdrawTypeEnum = {
344+
WALLET: {
345+
type: 1,
346+
name: '钱包'
347+
},
348+
BANK: {
349+
type: 2,
350+
name: '银行卡'
351+
},
352+
WECHAT: {
353+
type: 3,
354+
name: '微信'
355+
},
356+
ALIPAY: {
357+
type: 4,
358+
name: '支付宝'
359+
}
360+
}

src/utils/dict.ts

Lines changed: 7 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,13 @@ 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', // 佣金状态
174+
BROKERAGE_WITHDRAW_STATUS = 'brokerage_withdraw_status', // 佣金提现状态
175175

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

src/views/infra/server/index.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ const src = ref(import.meta.env.VITE_BASE_URL + '/admin/applications')
1616
/** 初始化 */
1717
onMounted(async () => {
1818
try {
19+
// 友情提示:如果访问出现 404 问题:
20+
// 1)boot 参考 https://doc.iocoder.cn/server-monitor/ 解决;
21+
// 2)cloud 参考 https://cloud.iocoder.cn/server-monitor/ 解决
1922
const data = await ConfigApi.getConfigKey('url.spring-boot-admin')
2023
if (data && data.length > 0) {
2124
src.value = data

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

0 commit comments

Comments
 (0)