|
|
- <template>
- <van-list v-if="technicianList.length > 0" v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
- <view v-for="item in list" :key="item.id" class="technician-item"
- @click="select(item)">
- <view class="technician-img-and-status">
- <view class="img-box">
- <image :src="item.image" mode="widthFix"></image>
- </view>
- <view v-if="item.bookable == 'Y'" class="technician-status">
- 可服务
- </view>
- </view>
- <view class="technician-server-info">
- <view class="technician-server-top">
- <view class="technician-name">
- <text class="name">{{ item.title }}</text>
- <text class="btn">更多照片</text>
- </view>
- <view class="appointed-time">
- <view class="capsule">
- <view class="earliest-reducible">最早可约</view>
- <view class="today">今天{{ item.useTime}}</view>
- </view>
- </view>
- </view>
- <view class="technician-server-center">
- <view class="server-num">
- 已服务{{ item.isFw }}单
- </view>
- <view class="position">
- <view class="position-icon">
- <image src="@/static/technician/position.png" mode="aspectFill"></image>
- </view>
- <view class="distance">
- {{ item.setKmOpen ? item.setKm || 0 : item.km || 0 }}km
- </view>
- </view>
- </view>
- <view class="technician-server-bottom">
- <view class="evaluate">
- <view class="evaluate-icon">
- <image src="@/static/technician/evaluate-icon.png"></image>
- </view>
- <view class="evaluate-title">
- 评价
- </view>
- </view>
- <view class="book-now" :class="{ notAvailable : item.bookable != 'Y'}">
- {{ item.bookable != 'Y' ? '不可预约' : '立即预约' }}
- </view>
- </view>
- </view>
- </view>
- </van-list>
-
- <van-empty v-else image="/static/empty/data.png" image-size="400rpx" description="此项目暂无技师服务" />
-
- </template>
-
- <script>
- import Position from '@/utils/position.js'
- export default {
- name: "selectTechnicianCompoents",
- props: ['technicianList', "select"],
- data() {
- return {
- loading : false,
- finished : false,
- list : [],
- queryParams : {
- pageNo : 0,
- pageSize : 10
- },
- position : null
- }
- },
- created() {
- this.paging()
- },
- methods: {
- catch(index) { //缓存用户位置
- if(this.position,index){
- this.calculatedDistance(this.position,index)
- }else{
- Position.getLocation(result => {
- this.position = result
- this.calculatedDistance(result,index)
- })
- }
- },
-
- //计算距离
- calculatedDistance(result,index){
- console.log(index);
- for(let i = index || 0 ; i < this.list.length ; i++){
- let distance = Position.calculateDistance(result.latitude, result.longitude, this.list[i]
- .latitude, this.list[i].longitude)
- this.list[i].km = distance;
- }
- },
-
- //滑动到屏幕底部触发
- onLoad(){
- this.queryParams.pageNo += 1
- this.paging()
- },
-
- //分页
- paging(){
- this.loading = true
- let { pageNo , pageSize } = this.queryParams
- let startPostion = pageNo * pageSize
- this.list.push(...this.technicianList.slice( startPostion , startPostion + pageSize))
- this.catch(startPostion)
-
- if(this.list.length >= this.technicianList.length){
- this.finished = true
- }
- this.loading = false
- }
- }
- }
- </script>
-
- <style scoped lang="scss">
- .technician-item {
- display: flex;
- background: white;
- padding: 20rpx;
- margin-bottom: 20rpx;
-
- .technician-img-and-status {
- position: relative;
- height: 150rpx;
- display: flex;
- flex-direction: column;
- justify-content: space-between;
-
- .img-box {
- width: 150rpx;
- height: 150rpx;
- background: #ccc;
- border-radius: 10rpx;
- overflow: hidden;
-
- image {
- width: 150rpx;
- }
- }
-
- .technician-status {
- display: flex;
- justify-content: center;
- align-items: center;
- position: absolute;
- left: 10%;
- bottom: -15rpx;
- background: #55CCA7;
- width: 80%;
- color: white;
- font-size: 22rpx;
- height: 35rpx;
- border-radius: 5rpx;
- }
- }
-
- .technician-server-info {
- display: flex;
- width: calc(100% - 150rpx);
- padding: 0rpx 20rpx;
- flex-direction: column;
- justify-content: space-between;
-
- .technician-server-top {
- display: flex;
- justify-content: space-between;
- align-items: center;
- font-size: 26rpx;
-
- .technician-name {
- .name {
- font-weight: 600;
- margin-right: 10rpx;
- }
-
- .btn {
- border: 1px solid #55CCA7;
- color: #55CCA7;
- font-size: 20rpx;
- padding: 5rpx;
- border-radius: 5rpx;
- }
- }
-
- .appointed-time {
- width: 40%;
- background: #E7FDF7;
- height: 40rpx;
- border-radius: 22.5rpx;
- font-size: 20rpx;
- color: #5DB9A3;
-
- .capsule {
- display: flex;
- height: 100%;
- align-items: center;
-
- .earliest-reducible {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 50%;
- height: 100%;
- color: white;
- border-radius: 20rpx;
- background: #52CFB0;
- }
-
- .today {
- width: 50%;
- text-align: center;
- }
- }
- }
- }
-
- .technician-server-center {
- display: flex;
- align-items: center;
- font-size: 26rpx;
- color: #888;
-
- .position {
- display: flex;
- margin-left: 10rpx;
- }
-
-
- image {
- width: 25rpx;
- height: 25rpx;
- }
- }
-
- .technician-server-bottom {
- display: flex;
- justify-content: space-between;
-
- .evaluate {
- display: flex;
- align-items: center;
- color: #333;
- font-size: 20rpx;
-
- .evaluate-icon {
- margin-right: 10rpx;
- }
- }
-
- .book-now {
- display: flex;
- align-items: center;
- justify-content: center;
- height: 50rpx;
- width: 160rpx;
- border-radius: 40rpx;
- color: white;
- background: linear-gradient(170deg, #53CEAC, #5AC796);
- font-size: 24rpx;
- }
-
- .notAvailable {
- background: #ccc;
- }
-
- image {
- width: 25rpx;
- height: 25rpx;
- }
- }
- }
- }
- </style>
|