完善订单详情部分功能

This commit is contained in:
TOP糯米 2023-03-11 22:46:06 +08:00
parent 54a93f9c5a
commit fcdc39e724
5 changed files with 160 additions and 124 deletions

View File

@ -1,8 +1,8 @@
<template> <template>
<view class="component-order-item"> <view class="component-order-item">
<view class="order-header"> <view class="order-header">
<view class="state-text" :style="{ color: titleColor }"> <view class="state-text" :style="{ color: stateTextColor }">
<text>{{ title }}</text> <text>{{ stateText }}</text>
</view> </view>
<view class="more"> <view class="more">
<text class="text">详情</text> <text class="text">详情</text>
@ -31,23 +31,41 @@
<text class="title">服务时间</text> <text class="title">服务时间</text>
<text class="text">{{ order.serviceTime }}</text> <text class="text">{{ order.serviceTime }}</text>
</view> </view>
<view class="order-worker-box"> <!-- 购买订单|/议价订单|货运订单 可展示师傅信息 -->
<view class="worker-item-box"> <block v-if="order.listType == listType.T1 || order.listType == listType.T2 || order.listType == listType.T3">
<worker-item :data="order.worker" /> <view class="order-worker-box">
</view> <!-- 报价订单未选择师傅 展示师傅列表 -->
<view class="worker-list-group"> <block
<view class="list-group"> v-if="order.listType == listType.T2 && order.orderType == 2 && order.state == state[order.listType].S1"
<view class="list-item" v-for="(item, index) in previewWorkerList" :key="index"> >
<image class="cover" :src="item.cover" mode="aspectFill" /> <view class="worker-list-group">
<text class="price">¥ {{ item.price }}</text> <view class="list-group">
<view class="list-item" v-for="(item, index) in previewWorkerList" :key="index">
<image class="cover" :src="item.cover" mode="aspectFill" />
<text class="price">¥ {{ item.price }}</text>
</view>
</view>
<view class="more-worker">
<text class="worker-num">{{ order.workerList.length }}位师傅已报价</text>
<text class="iconfont icon-jinru"></text>
</view>
</view> </view>
</view> </block>
<view class="more-worker"> <!-- 购买订单|/议价订单已选择师傅 展示师傅简介 -->
<text class="worker-num">{{ order.workerList.length }}位师傅已报价</text> <block
<text class="iconfont icon-jinru"></text> v-if="
</view> (order.listType == listType.T1 &&
order.state != state[order.listType].S1 &&
order.state != state[order.listType].S2) ||
(order.listType == listType.T2 && order.state != state[order.listType].S1)
"
>
<view class="worker-item-box">
<worker-item :data="order.worker" />
</view>
</block>
</view> </view>
</view> </block>
</view> </view>
<view class="order-footer"> <view class="order-footer">
<slot></slot> <slot></slot>
@ -81,13 +99,15 @@ export default {
for (let index = 0; index < 3; index++) { for (let index = 0; index < 3; index++) {
if (this.order.workerList[index]) { if (this.order.workerList[index]) {
this.previewWorkerList.push(this.order.workerList[index]); this.previewWorkerList.push(this.order.workerList[index]);
} else { } else break;
break;
}
} }
let [title, color] = this.$models.order.stateText(this.order.listType, this.order.orderType, this.order.state); let [stateText, stateDesc, stateTextColor] = this.$models.order.stateText(
this.title = title; this.order.listType,
this.titleColor = typeof color === "undefined" ? "#000000" : color; this.order.orderType,
this.order.state
);
this.stateText = stateText;
this.stateTextColor = stateTextColor || "#000000";
}, },
mounted() {}, mounted() {},
destroyed() {}, destroyed() {},

View File

@ -2,7 +2,7 @@
<view class="component-worker-item"> <view class="component-worker-item">
<view class="head"> <view class="head">
<image class="cover" :src="data.cover" mode="aspectFill" /> <image class="cover" :src="data.cover" mode="aspectFill" />
<text v-if="showPrice" class="price">¥ {{ data.price }}</text> <text v-if="showPrice" class="price">¥ {{ utils.formatNumber(data.price || 0, 2) }}</text>
</view> </view>
<view class="desc"> <view class="desc">
<view class="name"> <view class="name">
@ -12,9 +12,9 @@
<text>{{ models.worker.getWorkerTypeText(data.type) }}</text> <text>{{ models.worker.getWorkerTypeText(data.type) }}</text>
</view> </view>
<view class="detail"> <view class="detail">
<text class="section-text">服务{{ data.times }}</text> <text class="section-text">服务{{ data.times || 0 }}</text>
<text class="section-text">好评率{{ data.favorable_rate }}%</text> <text class="section-text">好评率{{ data.favorable_rate || 0 }}%</text>
<text class="section-text">评分{{ data.grade }}/5.0 </text> <text class="section-text">评分{{ data.grade || 0 }}/5.0 </text>
</view> </view>
</view> </view>
</view> </view>
@ -25,6 +25,7 @@ export default {
name: "component-worker-item", name: "component-worker-item",
data() { data() {
return { return {
utils: this.$utils,
models: this.$models, models: this.$models,
}; };
}, },

View File

@ -46,7 +46,7 @@ export default {
let current = this.state[listType]; let current = this.state[listType];
if (listType == this.listType.T1) { if (listType == this.listType.T1) {
switch (state) { switch (state) {
case current.S1: return ['待支付']; case current.S1: return ['待支付', '为保证师傅按时上门,建议尽快选择师傅并完成支付'];
case current.S2: return ['待师傅接单']; case current.S2: return ['待师傅接单'];
case current.S3: return ['服务中']; case current.S3: return ['服务中'];
case current.S4: return ['待支付尾款']; case current.S4: return ['待支付尾款'];
@ -59,12 +59,12 @@ export default {
if (orderType == 1) { if (orderType == 1) {
return ['待师傅接单']; return ['待师傅接单'];
} }
return ['待师傅报价']; return ['待选择师傅'];
case current.S2: case current.S2:
if (orderType == 1) { if (orderType == 1) {
return ['师傅已接单,待支付']; return ['师傅已接单,待支付'];
} }
return ['待支付']; return ['已选择师傅,待支付'];
case current.S3: return ['服务中']; case current.S3: return ['服务中'];
case current.S4: return ['待支付尾款']; case current.S4: return ['待支付尾款'];
case current.S5: return ['服务已完成,待确认']; case current.S5: return ['服务已完成,待确认'];
@ -120,13 +120,7 @@ export default {
*/ */
orderList(options) { orderList(options) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
prototype.$request({ prototype.$request(options.request).then(response => {
api: options.api,
data: {
page: options.page,
status: options.status,
},
}).then(response => {
if (response.code == 1) { if (response.code == 1) {
let list = []; let list = [];
response.data.forEach((item) => { response.data.forEach((item) => {
@ -140,7 +134,7 @@ export default {
serviceTime: item.times, serviceTime: item.times,
orderType: item.types, orderType: item.types,
state: item.status, state: item.status,
worker: item.shifu || {}, worker: item.shifu,
workerList: [], workerList: [],
}); });
}); });
@ -149,5 +143,31 @@ export default {
return reject(response.msg); return reject(response.msg);
}).catch(e => { }); }).catch(e => { });
}); });
},
/**
* 订单详情
*/
orderDetail(options) {
return new Promise((resolve, reject) => {
prototype.$request(options.request).then(response => {
if (response.code == 1) {
return resolve({
id: response.data.id,
address: response.data.address,
orderId: response.data.order,
cate: "待返数据",
content: response.data.desc,
createTime: response.data.time,
serviceTime: response.data.times,
orderType: response.data.types,
state: response.data.status,
images: [],
worker: [],
workerList: [],
});
}
return reject(response.msg);
}).catch(e => { });
});
} }
} }

View File

@ -1,15 +1,15 @@
<template> <template>
<app-layout title="订单详情"> <app-layout title="订单详情">
<view class="state-textbox"> <view class="state-textbox">
<text class="state-text">等待您选择师傅</text> <text class="state-text">{{ stateText }}</text>
<text class="state-desc">为保证师傅按时上门建议尽快选择师傅并完成支付 </text> <text class="state-desc" v-if="stateDesc">{{ stateDesc }}</text>
</view> </view>
<view class="order-detail-header"> <view class="order-detail-header">
<view class="select-group"> <view class="select-group">
<view class="select-item" :class="{ active: tabIndex == 0 }" @click="tabIndex = 0"> <view class="select-item" :class="{ active: tabIndex == 0 }" @click="switchTab(0)">
<text class="text">服务师傅</text> <text class="text">服务师傅</text>
</view> </view>
<view class="select-item" :class="{ active: tabIndex == 1 }" @click="tabIndex = 1"> <view class="select-item" :class="{ active: tabIndex == 1 }" @click="switchTab(1)">
<text class="text">订单详情</text> <text class="text">订单详情</text>
</view> </view>
</view> </view>
@ -19,7 +19,7 @@
class="list-tab-list" class="list-tab-list"
:current="tabIndex" :current="tabIndex"
:duration="300" :duration="300"
@change="changeTab" @change="switchTab($event.detail.current)"
:style="{ height: tabHeight + 'px' }" :style="{ height: tabHeight + 'px' }"
> >
<swiper-item> <swiper-item>
@ -132,72 +132,13 @@ export default {
pageConfig: {}, pageConfig: {},
tabIndex: 0, tabIndex: 0,
tabHeight: 0, tabHeight: 0,
order: { stateText: "",
id: 1, stateDesc: "",
orderId: "xxgfdkgn1223", stateTextColor: "",
cate: "家具安装", id: 0,
content: "我想要安装一个书柜,需要上墙啊啊啊啊", listType: "",
createTime: "2022-10-18 10:56:34", orderType: 0,
serviceTime: "2022-10-18 10:56:34", order: {},
images: [
{
src: require("@/static/temp/cate/1.png"),
},
{
src: require("@/static/temp/cate/1.png"),
},
{
src: require("@/static/temp/cate/1.png"),
},
{
src: require("@/static/temp/cate/1.png"),
},
],
orderType: 2,
state: 1,
worker: {
id: 1,
name: "张师傅",
cover: require("@/static/temp/order/1.png"),
price: 306.0,
type: 1,
times: 687,
favorable_rate: 99.8,
grade: 4.5,
},
workerList: [
{
id: 1,
name: "张师傅",
cover: require("@/static/temp/order/1.png"),
price: 306.0,
type: 1,
times: 687,
favorable_rate: 99.8,
grade: 4.5,
},
{
id: 2,
name: "王师傅",
cover: require("@/static/temp/order/1.png"),
price: 306.0,
type: 1,
times: 687,
favorable_rate: 99.8,
grade: 4.5,
},
{
id: 3,
name: "李师傅",
cover: require("@/static/temp/order/1.png"),
price: 306.0,
type: 1,
times: 687,
favorable_rate: 99.8,
grade: 4.5,
},
],
},
}; };
}, },
components: { components: {
@ -209,26 +150,38 @@ export default {
onLoad(e) { onLoad(e) {
this.pageConfig = getApp().globalData.pageConfig; this.pageConfig = getApp().globalData.pageConfig;
if (e.type && e.type == "detail") { if (e.id && e.id > 0) {
this.id = e.id;
} else {
return this.$utils.toast("参数错误").then(() => {
this.$utils.toPage("", {}, "back");
});
}
if (e.tab && e.tab == "detail") {
this.switchTab(1); this.switchTab(1);
} else { } else {
this.switchTab(0); this.switchTab(0);
} }
if (e.list) {
this.listType = e.list;
}
this.loadDetail();
}, },
onShow() {}, onShow() {},
onReady() {}, onReady() {},
onReachBottom() {}, onReachBottom() {},
onPullDownRefresh() {}, onPullDownRefresh() {},
methods: { methods: {
/**
* 切换Tab
*/
switchTab(index) { switchTab(index) {
this.tabIndex = index; this.tabIndex = index;
this.$nextTick(() => { this.$nextTick(() => {
this.setTabHeight(); this.setTabHeight();
}); });
}, },
changeTab(e) {
this.switchTab(e.detail.current);
},
setTabHeight() { setTabHeight() {
let element = ".tab" + this.tabIndex; let element = ".tab" + this.tabIndex;
let query = uni.createSelectorQuery().in(this); let query = uni.createSelectorQuery().in(this);
@ -239,6 +192,7 @@ export default {
} }
}); });
}, },
//
copyOrderId(orderId) { copyOrderId(orderId) {
const that = this; const that = this;
uni.setClipboardData({ uni.setClipboardData({
@ -251,9 +205,15 @@ export default {
}, },
}); });
}, },
/**
* 师傅详情
*/
workerDetail(id) { workerDetail(id) {
this.$utils.toPage("/pages/worker/detail?id=" + id); this.$utils.toPage("/pages/worker/detail?id=" + id);
}, },
/**
* 选择师傅
*/
chooseWorker(id) { chooseWorker(id) {
const that = this; const that = this;
uni.showModal({ uni.showModal({
@ -265,6 +225,36 @@ export default {
}, },
}); });
}, },
loadDetail() {
this.$models.order
.orderDetail({
request: {
api: "order.detail.t1",
data: {
id: this.id,
},
},
})
.then((detail) => {
let [stateText, stateDesc, stateTextColor] = this.$models.order.stateText(
this.listType,
detail.orderType,
detail.state
);
this.stateText = stateText;
this.stateDesc = stateDesc;
this.stateTextColor = stateTextColor;
this.order = {
...detail,
listType: this.listType,
};
})
.catch((e) => {
this.$utils.toast(e).then(() => {
this.$utils.toPage("", {}, "back");
});
});
},
}, },
}; };
</script> </script>
@ -282,12 +272,12 @@ export default {
font-size: 40rpx; font-size: 40rpx;
font-weight: bold; font-weight: bold;
line-height: 40rpx; line-height: 40rpx;
margin-bottom: 26rpx;
} }
.state-desc { .state-desc {
display: block; display: block;
font-size: 24rpx; font-size: 24rpx;
line-height: 24rpx; line-height: 24rpx;
margin-top: 26rpx;
} }
} }
.select-group { .select-group {

View File

@ -27,7 +27,7 @@
class="order-item" class="order-item"
v-for="(item, index) in tabItem.list" v-for="(item, index) in tabItem.list"
:key="index" :key="index"
@click="toDetail(item.id, item.state)" @click="toDetail(item.id, item.state, item.listType, item.orderType)"
> >
<order-item :order="item" :index="index"> <order-item :order="item" :index="index">
<view class="action-group"> <view class="action-group">
@ -89,7 +89,7 @@ export default {
{ {
listType: this.$models.order.listType.T4, listType: this.$models.order.listType.T4,
name: "退款记录", name: "退款记录",
api: "order.list.t1", api: "order.list.t4",
status: 1, status: 1,
page: 1, page: 1,
more: true, more: true,
@ -149,9 +149,13 @@ export default {
} }
this.$models.order this.$models.order
.orderList({ .orderList({
api: currentTab.api, request: {
page: currentTab.page, api: currentTab.api,
status: currentTab.status, data: {
page: currentTab.page,
status: currentTab.status,
},
},
listType: currentTab.listType, listType: currentTab.listType,
}) })
.then((orderList) => { .then((orderList) => {
@ -171,12 +175,13 @@ export default {
/** /**
* 跳转详情 * 跳转详情
*/ */
toDetail(id, state) { toDetail(id, state, listType, orderType) {
let type = "detail"; let tab = "detail";
if (state == this.$models.order.state.NO_SELECT_WORKER) { //
type = "worker"; if (listType == this.$models.order.listType.T2 && orderType == 2 && state == this.$models.order.state[listType].T1) {
tab = "worker";
} }
this.$utils.toPage("/pages/order/detail?type=" + type + "&id=" + id); this.$utils.toPage("/pages/order/detail?list=" + listType + "&tab=" + tab + "&id=" + id);
}, },
}, },
}; };