daoji_h5/technician/pages/level.vue

443 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="pages-technician-level" v-if="isLoad">
<swiper class="image-container" :indicator-dots="false" @change="swiperChange" :current="currentIndex"
v-if="levelList && levelList.length > 0">
<swiper-item class="swiper-item" v-for="(item, index) in levelList" :key="index">
<view class="level-line-info flex-center mt-lg ml-md mr-md rel">
<view class="space-lg"></view>
<i class="iconfont icon-level-line icon-font-color abs" :style="{
backgroundImage: `-webkit-linear-gradient(0deg, #000 0%, ${primaryColor} 50%, #000 100%)`}"></i>
<view class="list-item flex-center flex-column" v-for="(aitem,aindex) in 3" :key="aindex">
<view class="line-tag" :class="[{'left':aindex==0},{'center':aindex==1},{'right':aindex==2}]"
v-if="(aindex==0 && index>0) || aindex == 1 || (aindex ==2 && index!=levelList.length-1)">
<view class="tag-lg flex-center">
<view class="tag-md flex-center">
<view class="tag-sm flex-center" :style="{background:primaryColor}"
v-if="aindex==1">
</view>
</view>
</view>
</view>
<view class="line-text mt-sm"
v-if="(aindex==0 && index>0) ||(aindex ==2 && index!=levelList.length-1)">
{{aindex==0?levelList[index-1].title : levelList[index+1].title}}
</view>
<view class="text-tag flex-center mt-sm rel" :style="{background:primaryColor}"
v-if="aindex===1">
<view class="square-tag flex-center abs"
:style="{background:primaryColor,background:`linear-gradient(-45deg, transparent 12rpx,${primaryColor} 0)`}">
<view class="square-mini fill-base"></view>
</view>
<view class="tag-text fill-base flex-center pl-sm pr-sm" :style="{color:primaryColor}">
{{item.title}}
</view>
</view>
</view>
</view>
<view class="technician-level pd-lg ml-md mr-md mt-md rel"
:style="{border:`1rpx solid ${primaryColor}`}">
<i class="iconfont icon-level-icon icon-font-color abs" :style="{left:'60rpx',
backgroundImage: `-webkit-linear-gradient(0deg, #000 36%, ${primaryColor} 100%)`}"></i>
<image mode="aspectFill" class="level-icon-img abs"
src="https://lbqny.migugu.com/admin/anmo/technician/level-icon.png">
</image>
<view class="space-md"></view>
<view class="flex-y-baseline level-title text-bold">{{item.title}}
<view class="ml-sm f-desc">
{{ index < curLevelInd ? '已解锁': index == curLevelInd ? '当前等级' : '未解锁' }}
</view>
</view>
<view style="height: 55rpx;"></view>
<view class="level-line radius rel">
<view class="level-line cur radius abs" :style="{width:`35%`,background:primaryColor}"></view>
</view>
<view style="height: 25rpx;"></view>
<view class="flex-between f-paragraph c-base text-bold">
<view>{{item.data.title}}</view>
<view>{{item.data.next_level_title}}</view>
</view>
<view class="flex-warp f-icontext mt-sm">
<text v-for="(aitem,aindex) in item.data.differ_text"
:key="aindex">{{aindex<2 || aindex==item.data.differ_text.length-1? aitem: `、${aitem}` }}</text>
</view>
</view>
</swiper-item>
</swiper>
<scroll-view scroll-x class="count-list mt-lg ml-md mr-md" v-if="coach_level.id">
<view class="list-item flex-column" v-for="(item,index) in countList" :key="index">
<view class="flex-center num text-bold" :style="{color:primaryColor}">
{{coach_level[item.key]}}{{item.unit||''}}
</view>
<view class="flex-center text">{{item.text}}</view>
</view>
</scroll-view>
<view @tap.stop="$refs.show_rule_item.open()" class="flex-y-center ml-md pt-lg pb-lg f-title c-base">
<view class="text-bold">规则说明</view> <i class="iconfont iconshuyi_shuoming ml-sm"></i>
</view>
<scroll-view scroll-x class="rule-list flex-column ml-md mr-md pl-md pr-md"
v-if="ruleList && ruleList.length > 0">
<view class="list-item flex-warp" v-for="(item,index) in ruleList" :key="index">
<view class="flex-center" :class="[{'title':bindex==0},{'text':bindex>0}]"
:style="{borderTop: bindex!==0?`1rpx solid #19212C`:''}" v-for="(bitem,bindex) in item"
:key="bindex">
{{index==1 && bindex > 0?'¥':''}}{{bitem}}{{bindex > 0 ?unitArr[index] : ''}}
</view>
</view>
</scroll-view>
<view class="space-footer"></view>
<uni-popup ref="show_rule_item" type="center" :maskClick="false">
<view class="common-popup-content fill-base pd-lg radius-34">
<view class="title">规则说明</view>
<view class="f-desc c-title mt-lg">
在折算周期T{{$t('action.attendantName')}}完成以下维度的考核指标后{{$t('action.attendantName')}}可以在T+1个周期按照该等级算提成比例例如折算周期为每月{{$t('action.attendantName')}}在这个月内完成了多少会在月底30号系统核算满足某个等级标准之后会在下一个月的1号生效
<view class="mt-sm flex-1">
最低业绩{{$t('action.attendantName')}}服务的所有服务订单和加钟订单不包含车费
</view>
<view class="mt-sm flex-1">
加钟率加钟订单金额/最低业绩
</view>
<view class="mt-sm flex-1">
服务时长{{$t('action.attendantName')}}接单服务的时间
</view>
<view class="mt-sm flex-1">
在线时长{{$t('action.attendantName')}}在线工作的时间
</view>
<view class="mt-sm flex-1">
积分若储值返佣设置勾选了返积分{{$t('action.attendantName')}}邀请用户充值将获得积分积分和金额按照1:1比例换算
</view>
</view>
<view class="button">
<view @tap.stop="$refs.show_rule_item.close()" class="item-child c-base"
:style="{background: primaryColor,color:'#fff'}">知道了</view>
</view>
</view>
</uni-popup>
</view>
</template>
<script>
import {
mapState,
mapActions,
mapMutations
} from "vuex"
export default {
components: {},
data() {
return {
isLoad: false,
options: {},
currentIndex: 0,
curLevelInd: 0,
levelList: [],
countList: [{
key: 'coach_price',
text: '本期业绩'
}, {
key: 'coach_integral',
text: '本期积分'
}, {
key: 'coach_add_balance',
text: '本期加钟率',
unit: '%'
}, {
key: 'coach_time_long',
text: '本期服务时长(分钟)'
}, {
key: 'online_time',
text: '本期在线时长(小时)'
}],
ruleList: [],
unitArr: [],
coach_level: {}
}
},
computed: mapState({
primaryColor: state => state.config.configInfo.primaryColor,
subColor: state => state.config.configInfo.subColor,
userInfo: state => state.user.userInfo,
location: state => state.user.location,
}),
async onLoad(options) {
this.$util.showLoading()
await this.initIndex()
this.isLoad = true
},
methods: {
...mapActions(['getUserInfo']),
...mapMutations(['updateUserItem']),
async initIndex(refresh = false) {
// #ifdef H5
if (!refresh && this.$jweixin.isWechat()) {
await this.$jweixin.initJssdk();
this.$jweixin.wxReady(() => {
this.$jweixin.hideOptionMenu()
})
}
// #endif
this.$util.setNavigationBarColor({
bg: this.primaryColor
})
let data = await this.$api.technician.coachLevel()
let {
coach_level,
level_list,
coach_level_show = 1
} = data
level_list.map(item => {
let {
differ_time_long,
differ_online_time,
differ_price,
differ_add_price,
differ_integral
} = item.data
let differ_text = []
if (differ_time_long || differ_online_time || differ_price || differ_add_price ||
differ_integral) {
differ_text = [`还差`]
if (differ_time_long) {
differ_text.push(`${differ_time_long}分钟服务时长`)
}
if (differ_online_time) {
differ_text.push(`${differ_online_time}小时在线时长`)
}
if (differ_price) {
differ_text.push(`${differ_price}业绩`)
}
if (differ_add_price) {
differ_text.push(`${differ_add_price}元加钟订单额`)
}
if (differ_integral) {
differ_text.push(`${differ_integral}积分`)
}
differ_text.push(`可升级`)
}
item.data.differ_text = differ_text
})
let ruleList = [
['等级'],
['最低业绩'],
['加钟率'],
['服务时长'],
['在线时长'],
['积分'],
]
let arr = ['title', 'price', 'add_balance', 'time_long', 'online_time', 'integral']
let unitArr = ['', '', '%', '分钟', '小时', '']
if (coach_level_show == 1) {
ruleList.push(['分成比例'])
arr.push('balance')
unitArr.push('%')
}
arr.map((item, index) => {
level_list.map(aitem => {
let datas = item === 'time_long' ? `${aitem.lower}${aitem[item]}` : aitem[
item]
ruleList[index].push(datas)
})
})
let {
id = 0
} = coach_level
let ind = level_list.findIndex(item => {
return item.id == id
})
this.currentIndex = ind
this.curLevelInd = ind
this.ruleList = ruleList
this.levelList = level_list
this.unitArr = unitArr
this.coach_level = coach_level
this.isLoad = true
this.$util.hideAll()
},
initRefresh() {
this.initIndex(true)
},
swiperChange(e) {
this.currentIndex = e.detail.current
},
}
}
</script>
<style lang="scss">
page {
background: #19212C;
}
.pages-technician-level {
.image-container {
width: 750rpx;
height: 504rpx;
.swiper-item {
width: 750rpx;
height: 504rpx;
.level-line-info {
height: 120rpx;
.icon-level-line {
top: 30rpx;
left: 0;
font-size: 94rpx;
z-index: -1;
}
.list-item {
width: 33.33%;
.line-tag {
.tag-lg {
width: 16px;
height: 16px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.3);
.tag-md {
width: 10px;
height: 10px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.7);
}
}
}
.line-tag.left,
.line-tag.right {
margin-top: 48rpx;
}
.line-tag.center {
margin-top: 4rpx;
}
.line-tag.center {
.tag-lg {
width: 26px;
height: 26px;
border-radius: 50%;
.tag-md {
width: 18px;
height: 18px;
border-radius: 50%;
.tag-sm {
width: 14px;
height: 14px;
border-radius: 50%;
}
}
}
}
.line-text {
font-size: 20rpx;
color: #E5F4F5;
}
.text-tag {
margin-top: 16rpx;
min-width: 70rpx;
height: 38rpx;
padding: 4rpx;
border-radius: 8rpx;
.square-tag {
top: -4rpx;
left: 50%;
margin-left: -8rpx;
width: 16rpx;
height: 16rpx;
transform: rotate(45deg);
.square-mini {
width: 8rpx;
height: 8rpx;
}
}
.tag-text {
font-size: 20rpx;
height: 30rpx;
border-radius: 6rpx;
}
}
}
}
}
}
.count-list {
white-space: nowrap;
width: 710rpx;
height: 160rpx;
background: rgba(255, 255, 255, 0.05);
border-radius: 16rpx;
.list-item {
display: inline-block;
width: 30%;
margin-top: 34rpx;
.num {
font-size: 38rpx;
}
.text {
font-size: 22rpx;
color: #7E8DA3;
margin-top: 5rpx;
}
}
}
.rule-list {
white-space: nowrap;
width: 670rpx;
background: rgba(255, 255, 255, 0.05);
border-radius: 16rpx;
.list-item {
display: inline-block;
font-size: 26rpx;
.title {
width: 190rpx;
height: 108rpx;
color: #E5EBF5;
}
.text {
width: 190rpx;
height: 95rpx;
color: #7E8DA3;
}
}
}
.iconshuyi_shuoming {
font-size: 34rpx;
}
}
</style>