daoji_h5/components/technician-list-popup.vue
2024-03-21 13:53:51 +08:00

331 lines
9.4 KiB
Vue
Raw Permalink 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="technician-list-popup">
<uni-popup ref="technician_item" type="bottom" style="height: 600px;">
<view class="technician-popup fill-base">
<view class="pd-lg rel"
:class="[{'flex-center': from=='technician-info'&&showType == 'message' || showType == 'technician'},{'flex-warp': showType == 'message'}]">
<image mode="aspectFill" class="item-avatar radius" :src="info.work_img"></image>
<i @tap.stop="$refs.technician_item.close()" class="iconfont icon-close abs"></i>
<view class="flex-1 ml-md">
<view class="flex-between">
<view class="flex-y-baseline f-caption c-caption">
<view class="f-title c-title text-bold mr-sm max-350 ellipsis">
{{info.coach_name}}
</view>从业{{info.work_time}}
</view>
</view>
<scroll-view scroll-y @touchmove.stop.prevent class="technician-text f-caption c-caption mt-sm"
v-if="from != 'technician-info' && showType == 'message'">
{{info.text}}
</scroll-view>
</view>
</view>
<view class="space-sm fill-body"></view>
<scroll-view scroll-y @touchmove.stop.prevent class="list-content">
<block v-if="showType == 'technician'">
<view class="list-item flex-center pd-lg fill-base radius-16" :class="[{'b-1px-t':index != 0}]"
v-for="(item,index) in serviceList" :key="index">
<image @tap.stop="goDetail(index)" mode="aspectFill" class="avatar lg radius-16"
:src="item.cover"></image>
<view class="flex-1 ml-md">
<view @tap.stop="goDetail(index)" class="f-sm-title c-title text-bold max-510 ellipsis">
{{item.title}}
</view>
<view class="f-caption c-caption mt-sm mb-sm ellipsis">超{{item.total_sale}}人选择</view>
<view class="flex-between">
<view class="flex-y-baseline flex-1">
<view class="flex-y-baseline f-icontext c-orange text-bold mr-sm">
<b class="f-paragraph c-orange">¥</b>
<view class="f-big-title">
{{item.price}}
</view>
</view>
<view class="text-delete mr-sm c-caption f-desc" v-if="item.init_price">
¥{{item.init_price}}</view>
<view class="flex-y-baseline flex-1 c-caption f-desc">
<i class="iconfont icon-shijian mr-sm" :style="{ color: primaryColor }"></i>
{{item.time_long}}分钟
</view>
</view>
<view class="flex-warp">
<block v-if="item.car_num">
<button @tap.stop="changeNum(-1,index)" class="reduce"
:style="{borderColor:primaryColor,color:primaryColor}"><i
class="iconfont icon-jian-bold"></i></button>
<button class="addreduce clear-btn">{{item.car_num || 0}}</button>
</block>
<button @tap.stop="changeNum(1,index)" class="add"
:style="{background:primaryColor,borderColor:primaryColor}"><i
class="iconfont icon-jia-bold"></i></button>
</view>
</view>
</view>
</view>
</block>
<block v-if="showType == 'message'">
<view class="list-message flex-warp pd-lg" :class="[{'b-1px-t':index!=0}]"
v-for="(item,index) in commentList.data" :key="index">
<image mode="aspectFill" class="item-avatar radius" :src="item.avatarUrl"></image>
<view class="flex-1 ml-md">
<view class="flex-between">
<view class="flex-y-center">
<view class="f-paragraph c-title mr-md">{{item.nickName}}</view>
<view class="flex-warp">
<i class="iconfont iconyduixingxingshixin icon-font-color"
:style="{backgroundImage: aindex< item.star?`-webkit-linear-gradient(270deg, #FAD961 0%, #F76B1C 100%)`:`-webkit-linear-gradient(270deg, #f4f6f8 0%, #ccc 100%)`}"
v-for="(aitem,aindex) in 5" :key="aindex"></i>
</view>
</view>
<view class="f-icontext c-caption">{{item.create_time}}</view>
</view>
<view class="flex-warp mt-sm">
<view class="pt-sm pb-sm pl-md pr-md mt-sm mr-sm radius fill-body f-caption c-desc"
v-for="(item,index) in item.lable_text" :key="index">{{item}}</view>
</view>
<view class="f-caption c-caption mt-md">
<text decode="emsp" style="word-break:break-all;">{{item.text}}</text>
</view>
</view>
</view>
</block>
</scroll-view>
<view style="margin: 0 100rpx;"
v-if="!loading&&((showType == 'technician' && serviceList&&serviceList.length<=0) || (showType == 'message' && commentList && commentList.data &&commentList.data.length<=0))">
<abnor></abnor>
</view>
<block v-if="showType == 'message' && commentList.last_page > 1">
<view class="space-lg b-1px-t"></view>
<view
@tap.stop="$refs.technician_item.close(),$util.goUrl({url:`/user/pages/comment?id=${info.id}`})"
class="more-btn flex-center f-paragraph c-base radius"
style="width:300rpx;height: 80rpx;margin:0 auto" :style="{background:primaryColor}">查看更多
</view>
<view class="space-lg"></view>
</block>
<view class="flex-between pd-lg b-1px-t" v-if="showType == 'technician' && car_info.car_count > 0">
<view class="flex-center">合计<view class="f-title c-warning text-bold ml-sm">¥{{car_info.car_price}}
</view>
</view>
<view @tap.stop="toOrder" class="order-btn flex-center f-desc c-base radius"
:style="{background: `linear-gradient(68deg, ${primaryColor}, ${subColor})`}">提交订单
</view>
</view>
<view class="space-safe"></view>
<view style="height: 98rpx;"></view>
</view>
</uni-popup>
</view>
</template>
<script>
import {
mapState,
mapActions,
mapMutations
} from "vuex"
export default {
components: {},
props: {
from: {
type: String,
default () {
return 'list'
}
},
sid: {
type: Number,
default () {
return 0
}
}
},
data() {
return {
info: {},
showType: '',
car_info: {},
serviceList: [],
commentList: [],
loading: true,
lockTap: false,
}
},
computed: mapState({
primaryColor: state => state.config.configInfo.primaryColor,
subColor: state => state.config.configInfo.subColor,
plugAuth: state => state.config.configInfo.plugAuth,
userInfo: state => state.user.userInfo,
}),
methods: {
...mapActions([]),
async toShowPopup(info, key) {
this.info = info
this.showType = key
if (key == 'technician') {
let {
is_work = 0,
} = this.info
if (!is_work) return
this.serviceList = []
await this.getServiceList()
} else {
await this.getCommentList()
}
this.$refs.technician_item.open()
},
async getCommentList() {
let {
id: coach_id
} = this.info
let param = {
coach_id,
page: 1,
}
this.commentList = await this.$api.service.commentList(param)
this.loading = false
},
async getServiceList(flag = false) {
let {
id: coach_id
} = this.info
let {
data,
car_count,
car_price
} = await this.$api.service.coachServiceList({
coach_id
})
if (!flag) {
this.serviceList = data
}
this.car_info = {
car_count,
car_price
}
this.loading = false
},
// 服务详情
goDetail(index) {
let {
id
} = this.serviceList[index]
let {
sid: store_id = 0
} = this
let url = `/user/pages/detail?id=${id}&store_id=${store_id}`
this.$util.goUrl({
url
})
},
// 加/减数量
async changeNum(mol, serInd) {
let {
id: coach_id
} = this.info
let {
id: service_id,
car_num = 0,
car_id = 0
} = this.serviceList[serInd]
if (this.lockTap) return;
this.lockTap = true;
let methodModel = mol > 0 ? 'addCar' : 'delCar'
let param = mol > 0 ? {
service_id,
coach_id,
num: 1
} : {
id: car_id,
num: 1
}
if (methodModel == 'delCar' && !param.id) {
this.lockTap = false
return
}
try {
let add_car_id = await this.$api.order[methodModel](param)
this.serviceList[serInd].car_num = car_num + mol
if (add_car_id && mol > 0 && !car_id) {
this.serviceList[serInd].car_id = add_car_id
}
if (this.serviceList[serInd].car_num < 1) {
this.serviceList[serInd].car_id = 0
}
await this.getServiceList(true)
this.lockTap = false
} catch (e) {
this.lockTap = false
}
},
// 下单
toOrder() {
if (this.car_info.car_count < 1) {
this.$util.showToast({
title: `请选择服务`
})
return
}
let {
id
} = this.info
this.$refs.technician_item.close()
this.$util.goUrl({
url: `/user/pages/order?id=${id}`
})
},
toEmit(key) {
this.$emit(key)
}
}
}
</script>
<style scoped lang="scss">
.technician-list-popup {
.technician-popup {
border-radius: 20rpx 20rpx 0 0;
.item-avatar {
width: 88rpx;
height: 88rpx;
background: #f4f6f8;
}
.icon-close {
font-size: 50rpx;
top: 30rpx;
right: 30rpx;
}
.technician-text {
max-height: 150rpx;
}
.list-content {
max-height: 50vh;
.list-message {
.item-avatar {
width: 52rpx;
height: 52rpx;
background: #f4f6f8;
}
.iconyduixingxingshixin {
font-size: 28rpx;
margin-right: 5rpx;
font-size: 28rpx;
}
}
}
.order-btn {
width: 200rpx;
height: 72rpx;
}
}
}
</style>