mrr.sj.front/pages/promotion/setUpServe.vue

442 lines
11 KiB
Vue
Raw Normal View History

2026-03-24 11:45:13 +08:00
<template>
<view class="select-serve">
<custom-navbar title="设置佣金" backgroundColor="#FFFFFF"></custom-navbar>
<view class="select-tip">
2026-06-02 11:39:23 +08:00
<text style="color: #FF4767;">温馨提示</text>支持 按1%~30%区间设置佣金比例订单成功成交后系统将按实付金额 × 佣金比例自动扣减
2026-03-24 11:45:13 +08:00
</view>
<view v-for="(item,index) in selectedItems" :key="index" class="serve-card">
<image :src="item.photo[0]" mode="aspectFill" class="serve-card__img"></image>
<view class="serve-card-right">
<view class="serve-card-right-text">{{item.title}}</view>
<view class="serve-card-right-price">¥<text style="font-size: 30rpx;">{{item.server_price}}</text> </view>
<view class="serve-card-right-number">
<text class="serve-card-right-number-text">设置佣金比例</text>
<!-- <numberBox v-model="item.numberValue" :price="item.server_price"></numberBox> -->
<view class="numberValue">
<view class="fuHao" @click="calculate(item,-1)">-</view>
<view class="numberValue-card">
<input type="number" v-model="item.numberValue" @input="changeInput(item,$event)" class="numberValue-input" placeholder="请输入比例" />
<text class="percentage">%</text>
</view>
<view class="fuHao" @click="calculate(item,1)">+</view>
</view>
</view>
<view class="serve-card-right-estimate" v-show="estimate(item.numberValue,item.server_price)">
预估佣金:{{ estimate(item.numberValue,item.server_price) }}
<image src="/static/images/recruit/tip.png" class="serve-card-right-estimate-img"
@click="openModal"></image>
</view>
</view>
</view>
<view class="select-serve-footer">
<view class="select-serve-footer__btn" @click="submit">确定</view>
</view>
<uv-modal ref="modal" title="提示" width="620rpx">
<view class="slot-content">
2026-06-02 11:39:23 +08:00
预估佣金按<text style="color: #FF4767;">订单实付金额 × 佣金比例</text>计算因服务实付金额受活动参与程度影响存在波动最终佣金以订单实际结算结果为准
2026-03-24 11:45:13 +08:00
</view>
<template v-slot:confirmButton>
<view type="default" @click="closeModal" class="closeModal">确定</view>
</template>
</uv-modal>
</view>
</template>
<script>
import request from "@/utils/request";
import numberBox from "@/components/number-box/number-box";
export default {
components: {
numberBox,
},
data() {
return {
clickType: false, //点击状态,防止连续点击
selectedItems: [], // 用于接收上一页传递的选中项
numberValue: null,
apiObj: {
add: {
2: "/sj/serversPromotion/batchAdd",
1: "/syr/serversPromotion/batchAdd"
},
edit: {
2: "/sj/serversPromotion/edit",
1: "/syr/serversPromotion/edit"
}
},
2026-03-25 13:29:04 +08:00
identityIndex: 2,
2026-03-24 11:45:13 +08:00
type: 1. //1为编辑。2为修改3为添加
};
},
onLoad(options) {
// 解析参数注意需先解码再转JSON
if (options.type) {
this.type = options.type
}
if (options.selectedItems) {
this.selectedItems = JSON.parse(decodeURIComponent(options.selectedItems));
this.selectedItems.forEach(item => {
this.$set(item, 'numberValue', Math.round(Number(item.commission_rate) * 100) || null);
})
console.log('接收的选中项:', this.selectedItems);
}
},
methods: {
calculate(item,value) {
let num = Number(item.numberValue) + value;
if (num > 30) {
if(num<31){
this.$nextTick(() => {
item.numberValue = 30
});
return
}
uni.showToast({
title: `不能大于30%`,
icon: "none",
});
} else if (num < 0) {
if(num>-1){
this.$nextTick(() => {
item.numberValue = 0
});
return
}
uni.showToast({
title: `不能小于0%`,
icon: "none",
});
}else{
this.$nextTick(() => {
item.numberValue = num
});
}
},
changeInput(item,event) {
let value = parseInt(event.detail.value);
// 将输入值转为数字(处理可能的字符串输入)
let num = Number(value);
// 处理非数字的情况如输入非数字字符时默认设为0
if (isNaN(num)) {
num = 0;
}
// 边界值处理
if (num > 30) {
num = 30;
} else if (num < 0) {
num = 0;
}
this.$nextTick(()=>{
item.numberValue = num
})
},
openModal() {
this.$refs.modal.open();
},
closeModal() {
this.$refs.modal.close();
},
estimate(a, b) {
if (a && b) {
console.log('计算结果:', a,b);
let product =Math.floor(a * b) / 100; // 先计算乘积
console.log('计算结果1', product);
console.log('计算结果2', product.toFixed(2));
return product.toFixed(2); // 保留 2 位小数(返回字符串)
} else {
return ""
}
},
submit() {
let list = []
for (let item of this.selectedItems) {
if (!item.numberValue) { // 检测到未设置的项
uni.showToast({
title: `请设置完成佣金比例`,
icon: "none",
});
return; // 直接退出整个 submit 函数,后续代码全不执行
}
if (this.estimate(item.numberValue, item.server_price) < 0.01) { // 检测到未设置的项
uni.showToast({
title: `预估佣金必须不得小于0.01`,
icon: "none",
});
return; // 直接退出整个 submit 函数,后续代码全不执行
}
// 处理有效项
let obj = {};
if (this.type == 2) {
obj.id = item.id;
}
obj.server_id = item.server_id || item.id;
obj.commission_rate = item.numberValue / 100;
list.push(obj); // 添加到数组
}
let data = {
data: JSON.stringify(list)
}
let url = this.apiObj.add[this.identityIndex]
if (this.type == 2) {
data = {
id: list[0].id,
commission_rate: list[0].commission_rate
}
url = this.apiObj.edit[this.identityIndex]
}
if (this.clickType) {
return
}
this.clickType = true
request.post(url, data).then((res) => {
console.log(res);
if (res.code == 200) {
// 修改上一页页面信息
const pages = getCurrentPages();
console.log(11111, pages)
const prevPage = this.type == 3 ? pages[pages.length - 3] : pages[pages.length - 2];
if (prevPage) {
if (prevPage.$vm && typeof prevPage.$vm.search === "function") {
prevPage.$vm.search(); // 存在则调用
}
let delta = this.type == 3 ? 2 : 1
uni.navigateBack({
delta
});
}
}else{
uni.showToast({
title: res.msg || '操作失败',
icon: "none",
});
}
}).finally(() => {
this.clickType = false
});
}
}
};
</script>
<style lang="scss">
.select-serve {
background-color: #f5f5f5;
min-height: 100vh;
padding-bottom: 160rpx;
.select-tip {
margin-top: 20rpx;
background: rgba(232, 16, 30, 0.1);
padding: 20rpx;
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 24rpx;
color: #333333;
line-height: 33rpx;
text-align: left;
font-style: normal;
}
.serve-card {
background: #FFFFFF;
border-radius: 20rpx;
padding: 20rpx;
margin: 20rpx;
display: flex;
gap: 20rpx;
.serve-card__img {
width: 150rpx;
height: 150rpx;
border-radius: 20rpx;
}
.serve-card-right {
flex: 1;
.serve-card-right-text {
font-weight: 500;
font-size: 30rpx;
color: #333333;
line-height: 34rpx;
text-align: left;
font-style: normal;
}
.serve-card-right-price {
margin-top: 15rpx;
font-family: DINPro, DINPro;
font-weight: 500;
font-size: 22rpx;
2026-06-02 11:39:23 +08:00
color: #FF4767;
2026-03-24 11:45:13 +08:00
line-height: 34rpx;
text-align: left;
font-style: normal;
}
.serve-card-right-number {
display: flex;
align-items: center;
margin-top: 23rpx;
.serve-card-right-number-text {
font-weight: 400;
font-size: 28rpx;
color: #333333;
text-align: left;
font-style: normal;
margin-right: 86rpx;
}
}
.serve-card-right-estimate {
display: flex;
align-items: center;
margin-top: 16rpx;
background-color: rgba(245, 191, 133, 0.10);
border-radius: 10rpx;
font-weight: 400;
font-size: 26rpx;
color: #B6732B;
text-align: left;
font-style: normal;
box-sizing: border-box;
width: 100%;
padding: 6rpx 10rpx;
.serve-card-right-estimate-img {
margin-left: 10rpx;
width: 24rpx;
height: 24rpx;
}
}
}
}
.select-serve-footer {
background-color: #fff;
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 40rpx 30rpx;
&__btn {
width: 690rpx;
height: 78rpx;
2026-06-02 11:39:23 +08:00
background: #FF4767;
2026-03-24 11:45:13 +08:00
border-radius: 798rpx;
display: flex;
align-items: center;
justify-content: center;
font-weight: 400;
font-size: 30rpx;
color: #ffffff;
line-height: 39rpx;
text-align: center;
font-style: normal;
}
}
}
.closeModal {
width: 556rpx;
height: 80rpx;
2026-06-02 11:39:23 +08:00
background: #FF4767;
2026-03-24 11:45:13 +08:00
border-radius: 40rpx;
font-weight: 500;
font-size: 28rpx;
color: #FFFFFF;
line-height: 40rpx;
text-align: left;
font-style: normal;
display: flex;
align-items: center;
justify-content: center;
margin: 0 32rpx 50rpx 32rpx;
}
::v-deep .uv-modal__title {
padding-top: 50rpx;
font-weight: 500;
font-size: 32rpx;
color: #333333!important;
line-height: 45rpx;
text-align: center;
font-style: normal;
}
::v-deep .uv-modal__content {
padding: 30rpx 32rpx 30rpx 30rpx;
font-weight: 400;
font-size: 30rpx;
color: #333333;
line-height: 40rpx;
text-align: left;
font-style: normal;
}
//
.numberValue {
display: flex;
gap: 12rpx;
.numberValue-card {
position: relative;
width: 140rpx;
padding-right: 40rpx;
height: 46rpx;
background: #F6F6F6;
.numberValue-input {
width: 140rpx;
height: 46rpx;
background: #F6F6F6;
border-radius: 6rpx;
text-align: center !important;
font-weight: 500;
font-size: 28rpx;
color: #333333;
line-height: 40rpx;
text-align: left;
font-style: normal;
}
.percentage {
position: absolute;
right: 9rpx;
top: 50%;
transform: translateY(-50%);
font-weight: 500;
font-size: 26rpx;
color: #333333;
line-height: 37rpx;
text-align: left;
font-style: normal;
}
}
.fuHao {
font-weight: 500;
font-size: 34rpx;
color: #333333;
line-height: 48rpx;
text-align: left;
font-style: normal;
}
}
.uni-input-placeholder{
font-weight: 400;
font-size: 24rpx;
color: #D1CCCC;
line-height: 33rpx;
text-align: center;
font-style: normal;
}
</style>