You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

1439 lines
38 KiB

<template>
<!-- 兼职注册 -->
<page-meta :page-style="routePopupVisible ? 'overflow: hidden;' : 'overflow: visible;'"></page-meta>
<view class="page1">
<view class="title">
<view class="title-sreach">
<view class="back-btn" @tap="back" :style="{'top': menuButtonInfo.top +'px'}">
<uni-icons type="left" size="28"></uni-icons>
</view>
</view>
</view>
<view class="content">
<view class="box1">
<view class="reg-name">
<text style="color:red;">*</text> 姓名
</view>
<view class="reg-value">
<input type="text" v-model="formData.name" placeholder="请填写姓名"
style="background: rgba(247, 248, 248, 0.6);height: 80rpx;line-height: 80rpx;padding: 18rpx 20rpx;border-radius: 20rpx;">
</view>
</view>
<view class="box1">
<view class="reg-name">
<text style="color:red;">*</text> 学生证上传 <text
style="font-weight: 400;color: #777;font-size: 11px;">身份信息仅用于认证身份,平台会严格保密</text>
</view>
<view class="reg-value">
<img @tap="pictureAdd('mentou')"
src="https://jewel-shop.oss-cn-beijing.aliyuncs.com/89d37db7e34c490da24c5dd62183bf2d.png" alt=""
style="width: 160rpx;height: 160rpx;background-size: 100%;margin-right: 20rpx;" />
<img @tap="largeImg" :src="formData.studentCard" alt=""
style="width: 160rpx;height: 160rpx;background-size: 100%;" />
</view>
</view>
<view class="box1">
<view class="reg-name">
<text style="color:red;">*</text> 超出3楼以上额外收费
</view>
<view class="reg-value">
<input type="digit" v-model="formData.highFloorFee" placeholder="可设置金额"
:adjust-position="false"
@input="onHighFloorFeeInput"
style="background: rgba(247, 248, 248, 0.6);height: 80rpx;line-height: 80rpx;padding: 18rpx 20rpx;border-radius: 20rpx;">
</view>
</view>
<view class="box1">
<view class="reg-name">
<text style="color:red;">*</text> 送达地点
</view>
<view class="reg-value" style="display: flex;">
<view class="box-check-btn delivery-location-btn" @tap="selectDeliveryLocation(0)"
:style="{background:formData.deliveryLocation == 0?'rgba(180, 255, 238, 0.27)':'rgba(247, 248, 248, 0.6)',border:formData.deliveryLocation == 0?'1px solid rgba(180, 255, 238, 1)':'1px solid #777'}">
送上楼
</view>
<view class="box-check-btn delivery-location-btn" @tap="selectDeliveryLocation(1)"
:style="{background:formData.deliveryLocation == 1?'rgba(180, 255, 238, 0.27)':'rgba(247, 248, 248, 0.6)',border:formData.deliveryLocation == 1?'1px solid rgba(180, 255, 238, 1)':'1px solid #777'}">
送到宿舍门口
</view>
</view>
</view>
<view class="box1">
<view class="reg-name">
<text style="color:red;">*</text> 手机号
</view>
<view class="reg-value">
<input type="number" v-model="formData.mobile" placeholder="手机号"
style="background: rgba(247, 248, 248, 0.6);height: 80rpx;line-height: 80rpx;padding: 18rpx 20rpx;border-radius: 20rpx;">
</view>
</view>
<view class="box1">
<view class="reg-name">
<text style="color:red;">*</text> 兼职类型
</view>
<view class="reg-value" style="display: flex;">
<view class="box-check-btn" @tap="waimaOrpaotui('waima')"
:style="{background:formData.waima?'rgba(180, 255, 238, 0.27)':'rgba(247, 248, 248, 0.6)',border:formData.waima?'1px solid rgba(180, 255, 238, 1)':'1px solid #777'}">
外卖
</view>
<view class="box-check-btn" @tap="waimaOrpaotui('paotui')"
:style="{background:formData.paotui?'rgba(180, 255, 238, 0.27)':'rgba(247, 248, 248, 0.6)',border:formData.paotui?'1px solid rgba(180, 255, 238, 1)':'1px solid #777'}">
快递
</view>
</view>
</view>
<view class="box1" v-if="formData.waima != false || formData.paotui != false">
<view class="reg-name rule-section-title">
<text style="color:red;">*</text> 我的赚钱地盘
</view>
<view class="rule-section-desc">选择你愿意配送的取货点和楼栋,再设置最低配送费。系统只会按这些范围给你派单。</view>
<view class="reg-value">
<view class="value1" v-if="formData.waima">
<view class="value-title">
<view class="title-1">
外卖赚钱地盘
<text class="rule-summary">{{getRuleSummary(waimaRuleList)}}</text>
</view>
<view class="title-2" @tap="checkAddress('waima')">
选择路线
<uni-icons type="right" size="12"></uni-icons>
</view>
</view>
<view class="rule-empty-card" v-if="waimaRuleList.length == 0" @tap="checkAddress('waima')">
<view class="rule-empty-icon">地盘</view>
<view class="rule-empty-title">你还没有划定外卖赚钱地盘</view>
<view class="rule-empty-desc">点这里选择食堂和宿舍楼,设置后才能收到对应区域的指派单。</view>
</view>
<view class="guize-list">
<view class="guize1 route-card" v-for="(item, index) in waimaRuleList" :key="index">
<view class="route-main">
<view class="route-points">
<view class="route-point">
<text class="route-badge">取</text>
<text class="route-name">{{item.getAreaName}}</text>
</view>
<view class="route-point">
<text class="route-badge route-badge--send">送</text>
<text class="route-name route-name--send">{{item.putAreaName}}</text>
</view>
</view>
<view class="route-price">
<text>¥</text>
<input type="digit" :value="item.orderBkge" placeholder="最低价"
:adjust-position="false"
@input="onOrderBkgeInput($event, item)">
</view>
<view class="route-delete" @tap="removeRule('waima', index)">×</view>
</view>
<view class="route-remark">
<text>备注(选填)</text>
<input type="text" v-model="item.remark" placeholder="如:大件/限时可加钱">
</view>
</view>
</view>
</view>
<view class="value1" v-if="formData.paotui">
<view class="value-title">
<view class="title-1">
快递赚钱地盘
<text class="rule-summary">{{getRuleSummary(paotuiRuleList)}}</text>
</view>
<view class="title-2" @tap="checkAddress('paotui')">
选择路线
<uni-icons type="right" size="12"></uni-icons>
</view>
</view>
<view class="rule-empty-card" v-if="paotuiRuleList.length == 0" @tap="checkAddress('paotui')">
<view class="rule-empty-icon">地盘</view>
<view class="rule-empty-title">你还没有划定快递赚钱地盘</view>
<view class="rule-empty-desc">选择快递站和宿舍楼,系统才会把符合范围的快递单派给你。</view>
</view>
<view class="guize-list">
<view class="guize1 route-card" v-for="(item, index) in paotuiRuleList" :key="index">
<view class="route-main">
<view class="route-points">
<view class="route-point">
<text class="route-badge"></text>
<text class="route-name">{{item.getAreaName}}</text>
</view>
<view class="route-point">
<text class="route-badge route-badge--send"></text>
<text class="route-name route-name--send">{{item.putAreaName}}</text>
</view>
</view>
<view class="route-price">
<text></text>
<input type="digit" :value="item.orderBkge" placeholder="最低价"
:adjust-position="false"
@input="onOrderBkgeInput($event, item)">
</view>
<view class="route-delete" @tap="removeRule('paotui', index)">×</view>
</view>
<view class="route-remark">
<text>备注(选填)</text>
<input type="text" v-model="item.remark" placeholder="如:大件/限时可加钱">
</view>
</view>
</view>
</view>
</view>
<view class="earning-simulator">
<view class="earning-title">收益模拟</view>
<view class="earning-main">按当前设置,预计今日可接 {{earningEstimate.orderRange}} 单</view>
<view class="earning-money">预估收入 {{earningEstimate.incomeRange}}</view>
<view class="earning-tip">预估值仅供参考,实际以当天订单为准。</view>
</view>
</view>
<view class="official-card">
<img show-menu-by-longpress
src="https://jewel-shop.oss-cn-beijing.aliyuncs.com/d23a9043a8c24731831ec4db909fe3b4.jpg" alt=""
class="official-qr" />
<view class="official-info">
<view class="official-title">长按 关注公众号</view>
<view class="official-desc">关注后可提现佣金,有新订单会及时通知。下线后不再接收通知</view>
</view>
</view>
<view class="btn" @click="submit">
{{worker ? '保存规则' : '提交注册'}}
</view>
</view>
<!-- 查看大图弹出层 -->
<uni-popup ref="imgPopup" background-color="#fff">
<view class="img-popup-content">
<img :src="bigImg" alt="" style="width: 100%;height: 100%;">
</view>
</uni-popup>
<!-- 温馨提示弹出层 -->
<uni-popup ref="lianggePopup" background-color="#fff" @change="changePopup">
<view class="liangge-popup-content">
<view class="liangge-title">
温馨提示
</view>
<view class="liangge-text">
1.送单规则,需要在<text style="color:red">配送</text>页面开启才能生效
</view>
<view class="liangge-text">
2.您还没有关注公众号,关注公众号后可提现佣金
</view>
</view>
</uni-popup>
<!-- 新手引导弹窗 -->
<uni-popup ref="onboardingPopup" background-color="#fff">
<view class="onboarding-popup">
<view class="onboarding-title">三步开始接赚钱单</view>
<view class="onboarding-step">
<view class="onboarding-num">1</view>
<view>
<view class="onboarding-step-title">圈地盘</view>
<view class="onboarding-step-desc">选择你想送货的楼栋/区域。</view>
</view>
</view>
<view class="onboarding-step">
<view class="onboarding-num">2</view>
<view>
<view class="onboarding-step-title">定价格</view>
<view class="onboarding-step-desc">设置你愿意接受的最低配送费。</view>
</view>
</view>
<view class="onboarding-step">
<view class="onboarding-num">3</view>
<view>
<view class="onboarding-step-title">自动接单</view>
<view class="onboarding-step-desc">上线并开启派单后,只接符合要求的订单。</view>
</view>
</view>
<view class="onboarding-btn" @tap="closeOnboarding">去划定赚钱地盘</view>
</view>
</uni-popup>
<!-- 规则选择弹出层 -->
<uni-popup ref="guizePopup" type="bottom" background-color="transparent" @change="onRoutePopupChange">
<view class="guize-popup-content">
<view class="area-popup-title">{{currentConfigType == 'waima' ? '生成外卖接单路线' : '生成快递接单路线'}}</view>
<view class="area-popup-scroll">
<view class="area-popup-desc">选中的取货点和送达区域会两两组合生成路线,新路线默认使用本弹窗填写的最低配送费和备注。</view>
<view class="route-default-card">
<view class="route-default-row">
<view class="route-default-label">本次最低配送费</view>
<view class="route-default-input">
<text>¥</text>
<input type="digit" v-model="defaultRoutePrice" placeholder="如 1"
:adjust-position="false"
@input="onDefaultRoutePriceInput">
</view>
</view>
<view class="route-default-row route-default-row--remark">
<view class="route-default-label">统一备注</view>
<input class="route-default-remark" type="text" v-model="defaultRouteRemark"
placeholder="选填,如:大件不接/限时加钱">
</view>
</view>
<view class="area-section-title">
<text>选择取货点</text>
<view>
<text @tap="toggleAreaCheck('qucan', true)">全选</text>
<text class="area-action" @tap="toggleAreaCheck('qucan', false)">清空</text>
</view>
</view>
<view class="area-options">
<view class="box-check-btn" @tap="qucanOrsongcan('qucan',index)" v-for="(item,index) in qucan"
:key="index" style="float: left;padding: 0 20rpx;width: auto;margin-bottom:20rpx;"
:style="{background:item.checked?'rgba(180, 255, 238, 0.27)':'rgba(247, 248, 248, 0.6)',border:item.checked?'1px solid rgba(180, 255, 238, 1)':'1px solid #777'}">
{{item.title}}
</view>
<view v-if="qucan.length==0" style="color:#999;font-size:24rpx;margin:20rpx 0;">暂无可选取货区域</view>
</view>
<view class="area-section-title area-section-title--second">
<text>选择送达区域</text>
<view>
<text @tap="toggleAreaCheck('songcan', true)">全选</text>
<text class="area-action" @tap="toggleAreaCheck('songcan', false)">清空</text>
</view>
</view>
<view class="area-options">
<view class="box-check-btn" @tap="qucanOrsongcan('songcan',index)" v-for="(item,index) in songcan"
:key="index" style="float: left;padding: 0 20rpx;width: auto;margin-bottom:20rpx;"
:style="{background:item.checked?'rgba(180, 255, 238, 0.27)':'rgba(247, 248, 248, 0.6)',border:item.checked?'1px solid rgba(180, 255, 238, 1)':'1px solid #777'}">
{{item.title}}
</view>
<view v-if="songcan.length==0" style="color:#999;font-size:24rpx;margin:20rpx 0;">暂无可送货区域</view>
</view>
</view>
<view class="guize-btn area-fixed-btn" @tap="closeGuize">
生成接单路线
</view>
<view class="area-close" @tap.stop="$refs.guizePopup.close()">
<uni-icons type="close" size="26" color="#00231C"></uni-icons>
</view>
</view>
</uni-popup>
<common-loading />
</view>
</template>
<script>
export default {
data() {
return {
menuButtonInfo: {},
formData: {
name: '',
highFloorFee: 0,
deliveryLocation: 0,
paotui: false,
waima: false,
mobile: '',
studentCard: '',
},
bigImg: '',
qucan: [],
songcan: [],
shopArea: [],
waimaRuleList: [],
worker:{},
paotuiRuleList: [],
currentConfigType: '',
defaultRoutePrice: '1',
defaultRouteRemark: '',
routePopupVisible: false
}
},
components: {
},
computed: {
earningEstimate() {
const count = this.waimaRuleList.length + this.paotuiRuleList.length
const commissionPerOrder = 2
if (count == 0) {
return {
orderRange: '0',
incomeRange: '¥0'
}
}
const lowOrders = Math.max(1, Math.ceil(count * 2.5))
const highOrders = Math.max(lowOrders, Math.ceil(count * 6))
const lowIncome = Math.floor(lowOrders * commissionPerOrder * 100) / 100
const highIncome = Math.floor(highOrders * commissionPerOrder * 100) / 100
return {
orderRange: lowOrders + '-' + highOrders,
incomeRange: '¥' + this.formatDisplayMoney(lowIncome) + '-' + this.formatDisplayMoney(highIncome)
}
}
},
onLoad() {
this.getShopArea()
this.getWorkerMessage()
this.showOnboardingOnce()
this.worker = uni.getStorageSync('worker')
},
onShow() {
this.menuButtonInfo = uni.getMenuButtonBoundingClientRect()
},
methods: {
formatMoneyInput(value) {
value = String(value || '');
value = value.replace(/[^\d.]/g, '');
if (value.indexOf('.') == 0) {
value = '0' + value;
}
const dotIndex = value.indexOf('.');
if (dotIndex !== -1) {
value = value.slice(0, dotIndex + 1) + value.slice(dotIndex + 1).replace(/\./g, '');
const parts = value.split('.');
value = parts[0] + '.' + parts[1].slice(0, 2);
}
const amount = parseFloat(value);
if (!isNaN(amount) && amount > 200) {
return '200';
}
return value;
},
formatOneDecimalInput(value) {
value = String(value || '').replace(/[^\d.]/g, '');
const dotIndex = value.indexOf('.');
if (dotIndex !== -1) {
value = value.slice(0, dotIndex + 1) + value.slice(dotIndex + 1).replace(/\./g, '');
const parts = value.split('.');
value = parts[0] + '.' + parts[1].slice(0, 1);
}
return value;
},
onHighFloorFeeInput(e) {
const value = this.formatOneDecimalInput(e.detail.value);
this.formData.highFloorFee = value;
return value;
},
formatDisplayMoney(value) {
const amount = parseFloat(value)
if (isNaN(amount)) return '0'
return amount.toFixed(2).replace(/\.?0+$/, '')
},
getMinFee(list) {
const fees = (list || []).map(item => parseFloat(item.orderBkge)).filter(item => !isNaN(item) && item > 0)
if (fees.length == 0) return 0
return Math.min.apply(null, fees)
},
getRuleSummary(list) {
if (!list || list.length == 0) return '未设置'
const minFee = this.getMinFee(list)
return '已覆盖 ' + list.length + ' 条路线' + (minFee > 0 ? ',最低¥' + this.formatDisplayMoney(minFee) + '起' : '')
},
showOnboardingOnce() {
this.$nextTick(() => {
if (uni.getStorageSync('part_time_rule_onboarding_seen')) return
setTimeout(() => {
if (this.$refs.onboardingPopup) {
this.$refs.onboardingPopup.open()
}
}, 300)
})
},
closeOnboarding() {
uni.setStorageSync('part_time_rule_onboarding_seen', 1)
this.$refs.onboardingPopup.close()
},
onDefaultRoutePriceInput(e) {
const value = this.formatMoneyInput(e.detail.value)
this.defaultRoutePrice = value
return value
},
normalizeOrderBkge(item) {
const value = this.formatMoneyInput(item.orderBkge);
const amount = parseFloat(value);
item.orderBkge = isNaN(amount) ? '' : (Math.floor(amount * 100) / 100).toFixed(2).replace(/\.?0+$/, '');
return item.orderBkge;
},
isValidOrderBkge(value) {
const amount = parseFloat(value);
return !isNaN(amount) && amount > 0 && amount <= 200 && /^\d+(\.\d{1,2})?$/.test(String(value));
},
showOrderBkgeError(title) {
uni.showToast({
title,
icon: 'none'
});
},
onOrderBkgeInput(e, item) {
const value = this.formatMoneyInput(e.detail.value);
item.orderBkge = value;
return value;
},
getWorkerMessage() {
let that = this
that.tui.request("/app/workerRelaPrice/getByWorkerId?workerId=" + uni.getStorageSync('worker').workerId,
"GET", {}, false, true).then((res) => {
if (res.code == 200) {
if (res.result != null) {
let data = res.result;
if (data.workerName) that.formData.name = data.workerName;
if (data.cardPicture) that.formData.studentCard = data.cardPicture;
if (data.mobile) that.formData.mobile = data.mobile;
if (data.highFloorFee !== undefined && data.highFloorFee !== null) that.formData
.highFloorFee = data.highFloorFee;
if (data.deliveryLocation !== undefined && data.deliveryLocation !== null) that.formData
.deliveryLocation = data.deliveryLocation;
let list = data.workerRelaPriceList || [];
let waimaList = list.filter(item => item.orderType == 0);
let paotuiList = list.filter(item => item.orderType == 1);
if (waimaList.length > 0) {
that.formData.waima = true;
that.waimaRuleList = waimaList;
}
if (paotuiList.length > 0) {
that.formData.paotui = true;
that.paotuiRuleList = paotuiList;
}
that.$forceUpdate();
}
} else {
that.tui.toast(res.message)
return
}
}).catch((res) => {})
},
getShopArea() {
let that = this
that.tui.request("/app/shopArea/getByParentId/" + JSON.parse(uni.getStorageSync('area')).id, "GET", {},
false, true).then((res) => {
if (res.code == 200) {
if (res.result != null) {
for (let m = 0; m < res.result.length; m++) {
that.shopArea.push(res.result[m])
}
}
} else {
that.tui.toast(res.message)
return
}
}).catch((res) => {})
},
back() {
uni.navigateBack()
},
//查看大图
largeImg(img) {
this.bigImg = this.formData.studentCard;
this.$refs.imgPopup.open()
},
waimaOrpaotui(type) {
if (type == 'waima') {
this.formData.waima = !this.formData.waima
} else {
this.formData.paotui = !this.formData.paotui
}
this.$forceUpdate()
},
selectDeliveryLocation(value) {
this.formData.deliveryLocation = value
this.$forceUpdate()
},
qucanOrsongcan(type, index) {
if (type == 'qucan') {
this.qucan[index].checked = !this.qucan[index].checked
} else {
this.songcan[index].checked = !this.songcan[index].checked
}
this.$forceUpdate()
},
toggleAreaCheck(type, checked) {
const list = type == 'qucan' ? this.qucan : this.songcan
list.forEach(item => {
item.checked = checked
})
this.$forceUpdate()
},
closeGuize() {
let selectedQucan = this.qucan.filter(item => item.checked);
let selectedSongcan = this.songcan.filter(item => item.checked);
this.defaultRoutePrice = this.formatMoneyInput(this.defaultRoutePrice);
const defaultRouteAmount = parseFloat(this.defaultRoutePrice);
if (!isNaN(defaultRouteAmount)) {
this.defaultRoutePrice = (Math.floor(defaultRouteAmount * 100) / 100).toFixed(2).replace(/\.?0+$/, '');
}
if (selectedQucan.length == 0 || selectedSongcan.length == 0) {
uni.showToast({
title: '请至少选择一个取货地址和一个送货地址',
icon: 'none'
});
return;
}
if (!this.isValidOrderBkge(this.defaultRoutePrice)) {
this.showOrderBkgeError('最低配送费需大于0且不超过200');
return;
}
let currentRuleList = this.currentConfigType == 'waima' ? this.waimaRuleList : this.paotuiRuleList;
let newRules = [];
let userId = uni.getStorageSync('id') || '';
selectedQucan.forEach(q => {
selectedSongcan.forEach(s => {
let existing = currentRuleList.find(r => r.getAreaId == q.id && r.putAreaId == s
.id);
if (existing) {
newRules.push(existing);
} else {
newRules.push({
workerId: "W" + userId,
getAreaId: q.id,
getAreaName: q.title,
putAreaId: s.id,
putAreaName: s.title,
orderBkge: this.formatMoneyInput(this.defaultRoutePrice),
orderType: this.currentConfigType == 'waima' ? 0 : 1,
remark: this.defaultRouteRemark || ''
});
}
});
});
if (this.currentConfigType == 'waima') {
this.waimaRuleList = newRules;
} else {
this.paotuiRuleList = newRules;
}
uni.showToast({
title: '已生成' + newRules.length + '条路线',
icon: 'none'
});
this.$refs.guizePopup.close()
},
changePopup(e){
if(e.show == false){
uni.navigateBack()
}
},
onRoutePopupChange(e) {
this.routePopupVisible = !!e.show
},
checkAddress(type) {
let that = this
this.currentConfigType = type;
this.qucan = [];
this.songcan = [];
let currentRuleList = type == 'waima' ? this.waimaRuleList : this.paotuiRuleList;
let isCanteenVal = type == 'waima' ? 1 : 2;
this.shopArea.forEach(item => {
let isGetChecked = currentRuleList.some(r => r.getAreaId == item.id);
let isPutChecked = currentRuleList.some(r => r.putAreaId == item.id);
if (item.isCanteen == isCanteenVal) {
that.qucan.push({
...item,
checked: isGetChecked
});
} else {
that.songcan.push({
...item,
checked: isPutChecked
});
}
});
this.$refs.guizePopup.open()
},
removeRule(type, index) {
if (type == 'waima') {
this.waimaRuleList.splice(index, 1);
} else {
this.paotuiRuleList.splice(index, 1);
}
},
submit() {
if (!this.formData.name) return uni.showToast({
title: '请填写姓名',
icon: 'none'
});
if (!this.formData.studentCard) return uni.showToast({
title: '请上传学生证',
icon: 'none'
});
if (!this.formData.waima && !this.formData.paotui) return uni.showToast({
title: '请至少选择一种兼职类型',
icon: 'none'
});
if (this.formData.waima && this.waimaRuleList.length == 0) {
return uni.showToast({
title: '请先划定外卖赚钱地盘',
icon: 'none'
});
}
if (this.formData.paotui && this.paotuiRuleList.length == 0) {
return uni.showToast({
title: '请先划定快递赚钱地盘',
icon: 'none'
});
}
let workerRelaPriceList = [];
if (this.formData.waima) {
this.waimaRuleList.forEach(item => this.normalizeOrderBkge(item));
let invalid = this.waimaRuleList.find(item => !this.isValidOrderBkge(item.orderBkge));
if (invalid) return uni.showToast({
title: '外卖最低配送费需大于0且不超过200',
icon: 'none'
});
workerRelaPriceList = workerRelaPriceList.concat(this.waimaRuleList);
}
if (this.formData.paotui) {
this.paotuiRuleList.forEach(item => this.normalizeOrderBkge(item));
let invalid = this.paotuiRuleList.find(item => !this.isValidOrderBkge(item.orderBkge));
if (invalid) return uni.showToast({
title: '快递最低配送费需大于0且不超过200',
icon: 'none'
});
workerRelaPriceList = workerRelaPriceList.concat(this.paotuiRuleList);
}
let submitData = {
userId: uni.getStorageSync('id'),
workerName: this.formData.name,
cardPicture: this.formData.studentCard,
highFloorFee: this.formatOneDecimalInput(this.formData.highFloorFee),
deliveryLocation: this.formData.deliveryLocation,
mobile: this.formData.mobile,
workerRelaPriceList: workerRelaPriceList
};
uni.showLoading({
title: '提交中...',
mask: true
});
this.tui.request('/app/workerRelaPrice/batchAdd', 'post', submitData).then(res => {
uni.hideLoading();
if (res.code == 200) {
let user = res.result;
uni.setStorageSync('officialAccountOpenid', user.officialAccountOpenid)
if (user.officialAccountOpenid == null || user.officialAccountOpenid == '' || user
.officialAccountOpenid == undefined) {
this.$refs.lianggePopup.open()
} else {
uni.showToast({
title: '提交成功'
});
}
uni.reLaunch({
url: '/pages/index/index?tabIndex=1&deliveryRuleEdited=1'
})
} else {
uni.showToast({
title: res.message,
icon: 'none'
});
}
}).catch(err => {
uni.hideLoading();
});
},
pictureAdd() {
let that = this
uni.chooseMedia({
count: 1,
mediaType: ['image'],
sourceType: ['camera', 'album'],
success(res) {
uni.showLoading({
title: '加载中...',
mask: true
})
for (let i = 0; i < res.tempFiles.length; i++) {
that.upLoadFile(res.tempFiles[i].tempFilePath)
}
}
})
},
async upLoadFile(path) {
let that = this;
let hiver_token = uni.getStorageSync("hiver_token")
await uni.uploadFile({
url: that.tui.interfaceUrl() + '/upload/file',
filePath: path,
name: 'file',
header: {
"content-type": "multipart/form-data",
'accessToken': hiver_token
},
formData: {},
success: (uploadFileRes) => {
let pathData = JSON.parse(uploadFileRes.data)
that.formData.studentCard = pathData.result
that.$forceUpdate()
},
fail: (err) => {
uni.hideLoading();
uni.showToast({
title: JSON.stringify(err),
icon: 'none'
})
}
});
await setTimeout(res => {
uni.hideLoading();
}, 1000)
},
}
}
</script>
<style lang="scss">
page {
width: 100%;
height: 100%;
font-size: 24rpx;
background: #F5F8F5;
color: #00231C;
}
.page1 {
width: 100%;
height: 100%;
font-size: 24rpx;
position: relative;
}
.title {
background: url('https://jewel-shop.oss-cn-beijing.aliyuncs.com/461dd2d5ba1f462ca05da7e2379d1d90.png') no-repeat;
width: 100%;
height: 640rpx;
background-size: 100%;
}
.title-sreach {
width: 100%;
display: flex;
height: 200rpx;
position: relative;
}
.back-btn {
position: absolute;
bottom: 0;
left: 0;
}
.content {
position: absolute;
top: 450rpx;
width: 100%;
border-radius: 40rpx;
background: #fff;
padding: 16rpx 20rpx;
}
.reg-name {
font-size: 32rpx;
font-weight: 700;
height: 70rpx;
line-height: 70rpx;
margin-top: 20rpx;
}
.reg-value {
margin-top: 10rpx;
}
.img-popup-content {
width: 500rpx;
height: 500rpx;
}
.liangge-popup-content {
background: #fff;
border-radius: 10px;
padding: 10px;
height: 150px;
}
.liangge-title{
height: 50px;
line-height: 35px;
text-align: center;
font-size: 16px;
font-weight: 700;
}
.liangge-text{
height: 30px;
font-size: 14px;
font-weight: 700;
}
.box-check-btn {
width: 160rpx;
height: 70rpx;
background: rgba(180, 255, 238, 0.27);
text-align: center;
line-height: 70rpx;
border-radius: 70rpx;
font-weight: 700;
border: 1px solid rgba(180, 255, 238, 1);
margin-right: 20rpx;
}
.delivery-location-btn {
width: 240rpx;
}
.rule-section-title {
line-height: 48rpx;
height: auto;
}
.rule-section-desc {
margin-top: 8rpx;
color: #6f7d79;
font-size: 24rpx;
line-height: 36rpx;
}
.value1 {
background: #f8fffc;
border-radius: 28rpx;
padding: 24rpx;
margin-bottom: 22rpx;
border: 1px solid rgba(166, 255, 234, 0.45);
}
.value-title {
display: flex;
min-height: 70rpx;
line-height: 42rpx;
font-size: 30rpx;
font-weight: 400;
align-items: center;
}
.title-1 {
font-weight: 700;
flex: 1;
}
.title-2 {
width: 176rpx;
height: 58rpx;
line-height: 58rpx;
border-radius: 58rpx;
color: #00624f;
background: rgba(166, 255, 234, 0.42);
text-align: right;
padding-right: 16rpx;
font-weight: 800;
box-sizing: border-box;
}
.rule-summary {
display: block;
margin-top: 4rpx;
color: #0b6b5a;
font-size: 22rpx;
font-weight: 700;
line-height: 30rpx;
}
.rule-empty-card {
margin-top: 18rpx;
padding: 38rpx 24rpx;
border: 1px dashed rgba(0, 35, 28, 0.18);
border-radius: 24rpx;
background: rgba(255, 255, 255, 0.78);
text-align: center;
}
.rule-empty-icon {
width: 132rpx;
height: 132rpx;
line-height: 132rpx;
margin: 0 auto 20rpx;
border-radius: 50%;
background: linear-gradient(135deg, #e3ff96, #a6ffea);
color: #07372f;
font-size: 24rpx;
font-weight: 900;
}
.rule-empty-title {
color: #00231C;
font-size: 30rpx;
font-weight: 900;
}
.rule-empty-desc {
margin-top: 10rpx;
color: #7b8a85;
font-size: 24rpx;
line-height: 36rpx;
}
.guize1 {
margin-top: 18rpx;
}
.route-card {
padding: 20rpx 0;
border-bottom: 1px solid rgba(0, 35, 28, 0.08);
}
.route-main {
display: flex;
align-items: center;
}
.route-points {
flex: 1;
min-width: 0;
display: flex;
flex-wrap: wrap;
gap: 12rpx;
}
.route-point {
display: flex;
align-items: center;
max-width: 240rpx;
}
.route-badge {
width: 38rpx;
height: 38rpx;
line-height: 38rpx;
flex-shrink: 0;
border-radius: 50%;
background: #00231C;
color: #fff;
font-size: 20rpx;
font-weight: 900;
text-align: center;
}
.route-badge--send {
background: #005849;
}
.route-name {
height: 42rpx;
line-height: 42rpx;
padding: 0 16rpx;
margin-left: -8rpx;
border-radius: 0 42rpx 42rpx 0;
background: rgba(166, 255, 234, 0.58);
font-size: 24rpx;
font-weight: 800;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.route-name--send {
background: rgba(209, 206, 255, 0.78);
}
.route-price {
width: 120rpx;
height: 60rpx;
padding: 0 14rpx;
margin-left: 12rpx;
display: flex;
align-items: center;
border-radius: 18rpx;
background: #fff;
font-size: 26rpx;
font-weight: 900;
box-shadow: inset 0 0 0 1px rgba(0, 35, 28, 0.08);
box-sizing: border-box;
}
.route-price input {
flex: 1;
min-width: 0;
margin-left: 4rpx;
font-weight: 900;
}
.route-delete {
width: 48rpx;
height: 48rpx;
line-height: 44rpx;
margin-left: 10rpx;
border-radius: 50%;
color: #ff3b30;
font-size: 40rpx;
text-align: center;
}
.route-remark {
display: flex;
align-items: center;
margin-top: 16rpx;
padding: 0 16rpx;
height: 64rpx;
border-radius: 16rpx;
background: #fff;
box-sizing: border-box;
}
.route-remark text {
margin-right: 16rpx;
color: #6f7d79;
font-size: 24rpx;
font-weight: 800;
}
.route-remark input {
flex: 1;
min-width: 0;
font-size: 24rpx;
}
.qusong1 {
width: 40rpx;
height: 40rpx;
background: rgba(0, 35, 28, 1);
color: #fff;
border-radius: 40rpx;
text-align: center;
line-height: 40rpx;
font-size: 20rpx;
z-index: 80;
}
.qusong2 {
height: 40rpx;
font-size: 24rpx;
line-height: 38rpx;
text-align: center;
background: rgba(166, 255, 234, 0.5);
padding: 0 20rpx;
margin-left: -10rpx;
font-weight: 700;
border-top-right-radius: 40rpx;
border-bottom-right-radius: 40rpx;
}
.qusong3 {
width: 190rpx;
height: 70rpx;
background: #fff;
border-radius: 10rpx;
padding: 10rpx 20rpx;
flex: 1;
}
.earning-simulator {
margin: 24rpx 0 8rpx;
padding: 30rpx;
border-radius: 28rpx;
background:
radial-gradient(circle at 92% 10%, rgba(166, 255, 234, 0.58) 0, rgba(166, 255, 234, 0) 180rpx),
linear-gradient(135deg, #fffdf2, #f6fffb);
box-shadow: 0 12rpx 28rpx rgba(0, 35, 28, 0.06);
}
.earning-title {
color: #00231C;
font-size: 30rpx;
font-weight: 900;
}
.earning-main {
margin-top: 16rpx;
color: #304842;
font-size: 28rpx;
font-weight: 800;
}
.earning-money {
margin-top: 10rpx;
color: #0b6b5a;
font-size: 36rpx;
font-weight: 900;
}
.earning-tip {
margin-top: 10rpx;
color: #89948f;
font-size: 22rpx;
line-height: 32rpx;
}
.official-card {
width: 95%;
margin: 28rpx auto 10rpx;
padding: 24rpx;
display: flex;
align-items: center;
border-radius: 28rpx;
background: linear-gradient(135deg, rgba(227, 255, 150, 0.46), rgba(166, 255, 234, 0.42));
box-shadow: 0 12rpx 28rpx rgba(0, 35, 28, 0.06);
box-sizing: border-box;
}
.official-qr {
width: 150rpx;
height: 150rpx;
flex-shrink: 0;
border-radius: 22rpx;
background: #fff;
}
.official-info {
flex: 1;
min-width: 0;
margin-left: 24rpx;
}
.official-title {
color: #00231C;
font-size: 32rpx;
font-weight: 900;
}
.official-desc {
margin-top: 12rpx;
color: #526964;
font-size: 24rpx;
line-height: 36rpx;
font-weight: 700;
}
.btn {
width: 95%;
height: 100rpx;
font-size: 32rpx;
font-weight: 700;
background: linear-gradient(90deg, rgba(227, 255, 150, 1), rgba(166, 255, 234, 1));
border-radius: 100rpx;
line-height: 100rpx;
text-align: center;
margin: 40rpx auto;
}
.guize-popup-content {
width: 100%;
height: 66vh;
background: #fff;
padding: 40rpx 40rpx 28rpx;
border-radius: 40rpx 40rpx 0 0;
margin: 0 auto;
overflow: hidden;
position: relative;
display: flex;
flex-direction: column;
box-sizing: border-box;
}
.onboarding-popup {
width: 620rpx;
padding: 40rpx 34rpx;
box-sizing: border-box;
border-radius: 36rpx;
background: #fff;
}
.onboarding-title {
color: #00231C;
font-size: 36rpx;
font-weight: 900;
text-align: center;
margin-bottom: 26rpx;
}
.onboarding-step {
display: flex;
padding: 20rpx 0;
border-bottom: 1px solid rgba(0, 35, 28, 0.08);
}
.onboarding-num {
width: 52rpx;
height: 52rpx;
line-height: 52rpx;
margin-right: 18rpx;
flex-shrink: 0;
border-radius: 50%;
background: linear-gradient(135deg, #e3ff96, #a6ffea);
color: #00231C;
font-size: 26rpx;
font-weight: 900;
text-align: center;
}
.onboarding-step-title {
color: #00231C;
font-size: 28rpx;
font-weight: 900;
}
.onboarding-step-desc {
margin-top: 6rpx;
color: #7b8a85;
font-size: 24rpx;
line-height: 34rpx;
}
.onboarding-btn {
height: 88rpx;
line-height: 88rpx;
margin-top: 32rpx;
border-radius: 88rpx;
background: linear-gradient(90deg, rgba(227, 255, 150, 1), rgba(166, 255, 234, 1));
color: #00231C;
font-size: 30rpx;
font-weight: 900;
text-align: center;
}
.area-popup-title {
color: #00231C;
font-size: 34rpx;
font-weight: 900;
text-align: center;
}
.area-popup-desc {
margin-top: 14rpx;
padding: 18rpx;
border-radius: 18rpx;
background: rgba(166, 255, 234, 0.24);
color: #61736e;
font-size: 24rpx;
line-height: 36rpx;
}
.area-popup-scroll {
flex: 1;
min-height: 0;
height: auto;
overflow: scroll;
padding-bottom: 34rpx;
box-sizing: border-box;
}
.route-default-card {
margin-top: 18rpx;
padding: 20rpx;
border-radius: 22rpx;
background: linear-gradient(135deg, rgba(227, 255, 150, 0.52), rgba(166, 255, 234, 0.34));
}
.route-default-row {
display: flex;
align-items: center;
}
.route-default-row--remark {
margin-top: 16rpx;
}
.route-default-label {
width: 210rpx;
color: #00231C;
font-size: 26rpx;
font-weight: 900;
}
.route-default-input {
width: 190rpx;
height: 66rpx;
padding: 0 18rpx;
display: flex;
align-items: center;
border-radius: 18rpx;
background: #fff;
font-size: 28rpx;
font-weight: 900;
box-sizing: border-box;
}
.route-default-input input {
flex: 1;
min-width: 0;
margin-left: 6rpx;
font-weight: 900;
}
.route-default-remark {
flex: 1;
min-width: 0;
height: 66rpx;
line-height: 66rpx;
padding: 0 18rpx;
border-radius: 18rpx;
background: #fff;
font-size: 24rpx;
box-sizing: border-box;
}
.area-section-title {
margin-top: 28rpx;
display: flex;
justify-content: space-between;
align-items: center;
color: #00231C;
font-size: 28rpx;
font-weight: 900;
}
.area-section-title view {
color: #1E90FF;
font-size: 24rpx;
font-weight: 800;
}
.area-action {
margin-left: 24rpx;
}
.area-section-title--second {
margin-top: 42rpx;
}
.area-options {
margin-top: 20rpx;
min-height: 90rpx;
overflow: hidden;
}
.guize-btn {
background: #00231c;
border-radius: 100rpx;
height: 100rpx;
width: 100%;
margin: 120rpx auto 0;
color: #b4ffee;
clear: both;
text-align: center;
line-height: 100rpx;
font-size: 30rpx;
font-weight: 700
}
.area-fixed-btn {
width: 100%;
margin: 18rpx 0 0;
flex-shrink: 0;
box-shadow: 0 14rpx 28rpx rgba(0, 35, 28, 0.18);
}
.area-close {
position: absolute;
top: 24rpx;
right: 24rpx;
width: 56rpx;
height: 56rpx;
line-height: 56rpx;
border-radius: 50%;
background: rgba(247, 248, 248, 0.9);
text-align: center;
}
</style>