添加:分销功能模块

添加:分销  - 分销配置
This commit is contained in:
wuhui_zzw 2023-11-15 15:57:39 +08:00
parent 60efd770ae
commit 0c4abfe1d1
8 changed files with 498 additions and 8 deletions

14
src/api/promoter.js Normal file
View File

@ -0,0 +1,14 @@
import request from './request'
// 配置 - 获取配置
export function getPromoterConfig() {
return request.get('promoter/get_config')
}
// 配置 - 编辑配置
export function setPromoterConfig(data) {
return request.get('promoter/set_config',data)
}

View File

@ -1,8 +1,8 @@
<template>
<div class="ivu-global-footer i-copyright" v-if="openVersion !== '0'">
<div v-if="version.status == -1" class="ivu-global-footer-copyright">{{ `Copyright ${version.year} ` }}<a :href="`${version.url}`" target="_blank">{{ version.version }}</a></div>
<div v-else class="ivu-global-footer-copyright">{{ version.Copyright }}</div>
</div>
<!--<div class="ivu-global-footer i-copyright" v-if="openVersion !== '0'">-->
<!-- <div v-if="version.status == -1" class="ivu-global-footer-copyright">{{ `Copyright ${version.year} ` }}<a :href="`${version.url}`" target="_blank">{{ version.version }}</a></div>-->
<!-- <div v-else class="ivu-global-footer-copyright">{{ version.Copyright }}</div>-->
<!-- </div>-->
</template>
<script>

View File

@ -301,7 +301,7 @@ export default {
},
//
pathCompute(data) {
console.log(this.$route)
// console.log(this.$route)
const loop = child => {
//
for (let i = 0; i < child.length; i++) {

View File

@ -16,6 +16,7 @@ import productRouter from './modules/product'
import marketingRouter from './modules/marketing'
import orderRouter from './modules/order'
import accountsRouter from './modules/accounts'
import promoterRouter from './modules/promoter'
import userRouter from './modules/user'
import stationRouter from './modules/station'
import exprotFileRouter from './modules/exportFile'
@ -57,6 +58,7 @@ export const constantRoutes = [
marketingRouter,
orderRouter,
accountsRouter,
promoterRouter,
userRouter,
stationRouter,
exprotFileRouter,

View File

@ -69,8 +69,7 @@ const productRouter =
name: 'ProductSpecs',
meta: {
title: '商品参数',
noCache: true,
noCache: true
},
component: () => import('@/views/product/specs/list.vue')
},
@ -83,7 +82,7 @@ const productRouter =
activeMenu: `${roterPre}/product/specs`
},
component: () => import('@/views/product/specs/create.vue')
},
}
]
}

View File

@ -0,0 +1,35 @@
import Layout from '@/layout'
import { roterPre } from '@/settings'
const promoterRouter =
{
path: `${roterPre}/promoter`,
name: 'promoter',
meta: {
icon: '',
title: '设置'
},
alwaysShow: true,
component: Layout,
children: [
{
path: 'config',
name: 'PromoterConfig',
meta: {
title: '分销配置',
noCache: true
},
component: () => import('@/views/promoter/config/index')
},
{
path: 'orderList',
name: 'OrderList',
meta: {
title: '分销订单',
noCache: true
},
component: () => import('@/views/promoter/order/index')
}
]
}
export default promoterRouter

View File

@ -0,0 +1,149 @@
<template>
<div class="divBox">
<el-card class="box-card">
<el-form ref="promoterForm" :model="promoterForm" :rules="rules" label-width="200px" class="demo-promoterForm">
<el-form-item prop="extension_status">
<span slot="label">
<span>分销启用</span>
<el-tooltip class="item" effect="dark" content="商户是否开启分销功能" placement="top-start">
<i class="el-icon-warning-outline" />
</el-tooltip>
</span>
<el-radio-group v-model="promoterForm.extension_status">
<el-radio :label="1">开启</el-radio>
<el-radio :label="0">关闭</el-radio>
</el-radio-group>
</el-form-item>
<div v-if="promoterForm.extension_status == 1">
<el-form-item prop="extension_one_rate">
<span slot="label">
<span>一级返佣比例</span>
<el-tooltip class="item" effect="dark" content="订单交易成功后给上级返佣的比例0 - 100,例:5 = 反订单金额的5%" placement="top-start">
<i class="el-icon-warning-outline" />
</el-tooltip>
</span>
<el-input-number v-model="promoterForm.extension_one_rate" :precision="2" :step="0.1" :min="0" class="selWidth"></el-input-number>
<span>%</span>
</el-form-item>
<el-form-item prop="extension_two_rate">
<span slot="label">
<span>二级返佣比例</span>
<el-tooltip class="item" effect="dark" content="订单交易成功后给上级返佣的比例0 ~ 100,例:5 = 反订单金额的5%" placement="top-start">
<i class="el-icon-warning-outline" />
</el-tooltip>
</span>
<el-input-number v-model="promoterForm.extension_two_rate" :precision="2" :step="0.1" :min="0" class="selWidth"></el-input-number>
<span>%</span>
</el-form-item>
<el-form-item prop="extension_level_set">
<span slot="label">
<span>等级上浮比例</span>
<el-tooltip class="item" effect="dark" content="在分销佣金基础上浮0-100百分比" placement="top-start">
<i class="el-icon-warning-outline" />
</el-tooltip>
</span>
<div class="level_list">
<div class="level-list-line" v-for="(item,index) in promoterForm.extension_level_set" :key="index">
<span>{{ item.brokerage_name }} 一级返佣上浮比例 </span>
<el-input-number v-model="item.one_rate" :precision="2" :step="0.1" :min="0" class="selWidth"></el-input-number>
<span>%二级返佣上浮比例 </span>
<el-input-number v-model="item.two_rate" :precision="2" :step="0.1" :min="0" class="selWidth"></el-input-number>
<span>%</span>
</div>
</div>
</el-form-item>
</div>
<el-form-item>
<el-button type="primary" :loading="loading" @click="submitForm('promoterForm')">保存</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</template>
<script>
import { getPromoterConfig, setPromoterConfig } from '@/api/promoter'
export default {
name: 'Index',
data() {
return {
//
promoterForm: {},
//
loading: false,
rules: {
extension_status: [
{ required: true, message: '请选择是否启用分销', trigger: 'change'}
],
extension_one_rate: [
{ required: true, message: '请输入一级返佣比例', trigger: 'blur'}
],
extension_two_rate: [
{ required: true, message: '请输入二级返佣比例', trigger: 'blur'}
]
}
}
},
mounted() {
this.getConfig()
},
methods: {
// -
getConfig() {
getPromoterConfig().then(res => {
this.promoterForm = res.data
}).catch((res) => {
this.$message.error(res.message)
})
},
//
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
this.loading = true
setPromoterConfig(this.promoterForm).then(message => {
this.loading = false
this.$message.success(message)
}).catch((res) => {
this.loading = false
this.$message.error(res.message)
})
} else {
return false
}
})
}
}
}
</script>
<style scoped lang="scss">
.selWidth{
width: 300px;
}
.item-text{
display: inline-block;
margin-left: 30px;
color: #606266;
.title{
font-weight: bold;
}
}
.font-red{
color: #ff4949;
}
.level_list{
width: 100%;
display: inline-flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: center;
align-items: flex-start;
overflow: auto;
.level-list-line{
width: 100%;
margin-bottom: 10px;
min-width: 900px;
}
}
</style>

View File

@ -0,0 +1,291 @@
<template>
<div class="divBox">
分销订单
</div>
</template>
<script>
export default {
components: { },
data() {
return {
orderId: 0,
tableData: {
data: [],
total: 0,
},
activity: [
{name: "普通订单",type: 0},
{name: "秒杀订单",type: 1},
{name: "预售订单",type: 2},
{name: "助力订单",type: 3},
{name: "拼团订单",type: 4}
],
listLoading: true,
tableFrom: {
order_sn: this.$route.query.order_sn ? this.$route.query.order_sn : "",
group_order_sn: '',
keywords: "",
username: "",
store_name: "",
status: "",
date: "",
mer_id: "",
page: 1,
limit: 20,
is_trader: '',
pay_type: "",
filter_delivery: '',
filter_product : '',
activity_type: ''
},
dliveryWayList: [
{ value: 1, label: '快递订单' },
{ value: 2, label: '配送订单' },
{ value: 4, label: '核销订单' },
{ value: 3, label: '虚拟发货' },
{ value: 6, label: '自动发货' }
], //
productTypeList: [
{ value: 1, label: '实物商品' },
{ value: 2, label: '虚拟商品' },
{ value: 3, label: '卡密商品' }
], //
orderChartType: {},
timeVal: [],
fromList: fromList,
selectionList: [],
ids: "",
uid: "",
cancel_time: "",
visibleDetail: false,
tableFromLog: {
page: 1,
limit: 10,
},
tableDataLog: {
data: [],
total: 0,
},
LogLoading: false,
dialogVisible: false,
cardLists: [],
orderDatalist: null,
merSelect: [],
drawer: false,
userDrawer: false,
};
},
mounted() {
if (this.$route.query.hasOwnProperty("order_sn")) {
this.tableFrom.order_sn = this.$route.query.order_sn;
} else {
this.tableFrom.order_sn = "";
}
this.headerList();
this.getMerSelect();
this.getList('');
},
//
activated() {
// if (this.$route.query.hasOwnProperty("order_sn")) {
// this.tableFrom.order_sn = this.$route.query.order_sn;
// } else {
// this.tableFrom.order_sn = "";
// }
// this.headerList();
// this.getMerSelect();
// this.getList('');
},
methods: {
//
orderFilter(item) {
let status = false;
item.orderProduct.forEach((el) => {
if (el.refund_num > 0 && el.refund_num < el.product_num) {
status = true;
}
});
return status;
},
//
addTdClass(val) {
if (val.row.status > 0 && val.row.paid == 1) {
for (let i = 0; i < val.row.orderProduct.length; i++) {
if (val.row.orderProduct[i].refund_num > 0 && val.row.orderProduct[i].refund_num < val.row.orderProduct[i].product_num) {
return "row-bg";
}
}
} else {
return " ";
}
},
//
getMerSelect() {
merSelectApi()
.then((res) => {
this.merSelect = res.data;
})
.catch((res) => {
this.$message.error(res.message);
});
},
//
onUserDetails(uid) {
this.uid = uid
this.userDrawer = true
this.$refs.userDetails.getData(uid);
},
closeDrawer() {
this.drawer = false
this.userDrawer = false
},
changeDrawer(v) {
this.drawer = v;
this.userDrawer = v;
},
async exports() {
let excelData = JSON.parse(JSON.stringify(this.tableFrom)), data = []
excelData.page = 1
let pageCount = 1
let lebData = {};
for (let i = 0; i < pageCount; i++) {
lebData = await this.downData(excelData)
pageCount = Math.ceil(lebData.count/excelData.limit)
if (lebData.export.length) {
data = data.concat(lebData.export)
excelData.page++
}
}
createWorkBook(lebData.header, lebData.title, data, lebData.foot,lebData.filename);
return
},
/**订单列表 */
downData(excelData) {
return new Promise((resolve, reject) => {
exportOrderApi(excelData).then((res) => {
return resolve(res.data)
})
})
},
//
exportRecord() {
exportOrderApi(this.tableFrom)
.then((res) => {
const h = this.$createElement;
this.$msgbox({
title: '提示',
message: h('p', null, [
h('span', null, '文件正在生成中,请稍后点击"'),
h('span', { style: 'color: teal' }, '导出记录'),
h('span', null, '"查看~ '),
]),
confirmButtonText: '我知道了',
}).then(action => {
});
})
.catch((res) => {
this.$message.error(res.message)
})
},
//
onOrderDetails(id) {
this.orderId = id;
this.$refs.orderDetail.getInfo(id);
this.drawer = true;
// this.$refs.orderDetail.onOrderDetails(id);
// this.$refs.orderDetail.onOrderLog(id);
},
pageChangeLog(page) {
this.tableFromLog.page = page;
this.getList('');
},
handleSizeChangeLog(val) {
this.tableFromLog.limit = val;
this.getList('');
},
//
selectChange(tab) {
this.tableFrom.date = tab;
this.tableFrom.page = 1;
this.timeVal = [];
this.getList(1);
},
//
onchangeTime(e) {
this.timeVal = e;
this.tableFrom.date = e ? this.timeVal.join("-") : "";
this.tableFrom.page = 1;
this.getList(1);
},
//
getList(num) {
this.listLoading = true;
this.tableFrom.page = num ? num : this.tableFrom.page;
spreadOrderLst(this.tableFrom)
.then((res) => {
this.tableData.data = res.data.list;
this.tableData.total = res.data.count;
this.listLoading = false;
})
.catch((res) => {
this.$message.error(res.message);
this.listLoading = false;
});
},
pageChange(page) {
this.tableFrom.page = page;
this.getList('');
},
handleSizeChange(val) {
this.tableFrom.limit = val;
this.getList('');
},
headerList() {
spreadChartApi()
.then((res) => {
this.orderChartType = res.data;
})
.catch((res) => {
this.$message.error(res.message);
});
},
},
};
</script>
<style lang="scss" scoped>
.demo-table-expand {
/deep/ label {
width: 83px !important;
}
}
.selWidth {
width: 300px;
}
.el-dropdown-link {
cursor: pointer;
color: #409eff;
font-size: 12px;
}
.el-icon-arrow-down {
font-size: 12px;
}
.tabBox_tit {
max-width: 60%;
font-size: 12px !important;
margin: 0 2px 0 10px;
letter-spacing: 1px;
padding: 5px 0;
box-sizing: border-box;
}
/deep/.row-bg {
.cell {
color: red !important;
}
}
</style>