feat:0905优惠券多物流信息

This commit is contained in:
2026-09-05 16:11:42 +08:00
parent b1d3ec9b2f
commit 75060faa39
14 changed files with 825 additions and 233 deletions
+2 -1
View File
@@ -13,8 +13,9 @@
</view> </view>
<view class="product_item_price"> <view class="product_item_price">
<view class="price_"> <view class="price_">
<text v-if="item.couponPrice">券后</text>
<text>¥</text> <text>¥</text>
<text style="color: 36rpx">{{ item.price }}</text> <text style="color: 36rpx">{{ item.couponPrice || item.price }}</text>
</view> </view>
<view class="price_sell">全网销量{{ limit999(item.sales) }}件</view> <view class="price_sell">全网销量{{ limit999(item.sales) }}件</view>
</view> </view>
+4 -4
View File
@@ -2,8 +2,8 @@
<view class="seckill_card_container" @click="onSelectProct(item)"> <view class="seckill_card_container" @click="onSelectProct(item)">
<!-- Left side image with optional countdown overlay --> <!-- Left side image with optional countdown overlay -->
<view class="seckill_card_left"> <view class="seckill_card_left">
<up-image :lazy-load="true" :src="item.url || item.image || item.accessUrl" width="220rpx" height="220rpx" bgColor="#f1f6ff00" <up-image :lazy-load="true" :src="item.url || item.image || item.accessUrl" width="220rpx" height="220rpx"
shape="square" radius="16rpx"></up-image> bgColor="#f1f6ff00" shape="square" radius="16rpx"></up-image>
<view class="countdown_bar" v-if="showCountdown && countdownText"> <view class="countdown_bar" v-if="showCountdown && countdownText">
<text class="countdown_text">{{ countdownText }}</text> <text class="countdown_text">{{ countdownText }}</text>
</view> </view>
@@ -37,11 +37,11 @@
<!-- Price and action card row --> <!-- Price and action card row -->
<view class="price_action_row"> <view class="price_action_row">
<view class="price_section"> <view class="price_section">
<text class="price_symbol" v-if="item.couponPrice">券后</text>
<text class="price_symbol">¥</text> <text class="price_symbol">¥</text>
<text class="price_integer">{{ item.price }}</text> <text class="price_integer">{{ item.couponPrice || item.price }}</text>
<text class="original_price seckill">{{ `${attributes.leftTime ? <text class="original_price seckill">{{ `${attributes.leftTime ?
`只剩${attributes.leftTime}` : ''}` }}</text> `只剩${attributes.leftTime}` : ''}` }}</text>
<!-- <text class="original_price" v-else>¥{{ formatOriginalPrice }}</text> -->
</view> </view>
<!-- Alarm clock button --> <!-- Alarm clock button -->
<view class="alarm_btn_wrapper"> <view class="alarm_btn_wrapper">
+12 -1
View File
@@ -33,7 +33,18 @@
<!-- 无优惠券/现金价格 --> <!-- 无优惠券/现金价格 -->
<view class="price-action-row" v-else> <view class="price-action-row" v-else>
<view class="price-left"> <view class="price-left" v-if="obj.couponPrice">
<view class="price-main">
<text class="price-symbol">券后¥</text>
<text class="price-num">{{ obj.couponPrice }}</text>
</view>
<view class="price-sub">
<text class="sales-text" v-if="hasSales">全网销量{{ limit999(obj.sales) }}</text>
</view>
</view>
<view class="price-left" v-else>
<view class="price-main"> <view class="price-main">
<text class="price-symbol">¥</text> <text class="price-symbol">¥</text>
<text class="price-num">{{ obj.price }}</text> <text class="price-num">{{ obj.price }}</text>
+88 -75
View File
@@ -5,105 +5,118 @@
</view> </view>
<view class="shop-right-view"> <view class="shop-right-view">
<view class="shop-top-img"> <view class="shop-top-img">
<image src="https://static.tbmall.xin/static/home/xyx.png" style="width: 122rpx;height: 28rpx;margin-right: 12rpx;"></image> <image src="https://static.tbmall.xin/static/home/xyx.png"
<image src="https://static.tbmall.xin/static/home/xs.png" v-if="obj.limitedTime " style="width: 52rpx;height: 28rpx;margin-right: 12rpx;"></image> style="width: 122rpx;height: 28rpx;margin-right: 12rpx;"></image>
<image src="https://static.tbmall.xin/static/home/tg.png" v-if="obj.tag" style="width: 80rpx;height: 28rpx;"></image> <image src="https://static.tbmall.xin/static/home/xs.png" v-if="obj.limitedTime"
style="width: 52rpx;height: 28rpx;margin-right: 12rpx;"></image>
<image src="https://static.tbmall.xin/static/home/tg.png" v-if="obj.tag"
style="width: 80rpx;height: 28rpx;"></image>
</view> </view>
<view class="right-top-view text-overflow1"> <view class="right-top-view text-overflow1">
<text class="text-32 text-bold text-zu text-overflow1">{{obj.title}}</text> <text class="text-32 text-bold text-zu text-overflow1">{{ obj.title }}</text>
</view> </view>
<view class="shop-price" @ok.stop="onClick" > <view class="shop-price" @ok.stop="onClick">
<view class="price-left"><text style="font-size: 24rpx;">¥</text>{{obj.price}}</view> <view class="price-left"><text style="font-size: 24rpx;">¥</text>{{ obj.couponPrice || obj.price }}
<view class="price-center">专区立省{{ Number(obj.adPrice) - Number(obj.price) }}元</view> </view>
<image src="https://static.tbmall.xin/static/home/qiang.png" style="width: 80rpx;height: 80rpx;"></image> <view class="price-center">专区立省{{ Number(obj.adPrice) - Number(obj.price) }}元</view>
<image src="https://static.tbmall.xin/static/home/qiang.png" style="width: 80rpx;height: 80rpx;">
</image>
</view> </view>
</view> </view>
</view> </view>
</template> </template>
<script> <script>
import MyBtn from '@/components/common/my-btn.vue' import MyBtn from '@/components/common/my-btn.vue'
export default { export default {
components:{MyBtn}, components: { MyBtn },
props:{ props: {
obj:{ obj: {
type:Object, type: Object,
default:()=>{} default: () => { }
},
}, },
mounted(){ },
}, mounted() {
methods: { },
onClick(){ methods: {
this.$emit('ok',this.obj.id); onClick() {
} this.$emit('ok', this.obj.id);
} }
} }
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.shop-view{ .shop-view {
width: 700rpx; width: 700rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: 20rpx;
box-sizing: border-box;
background-color: #fff;
border-radius: 16rpx;
.shop-left-view {
min-width: 216rpx;
min-height: 216rpx;
display: flex; display: flex;
flex-direction: row;
align-items: center; align-items: center;
justify-content: space-between; justify-content: center;
padding: 20rpx;
box-sizing: border-box; image {
background-color: #fff; width: 220rpx;
border-radius: 16rpx; height: 220rpx;
.shop-left-view{ border-radius: 8rpx;
min-width:216rpx; }
min-height:216rpx; }
.shop-right-view {
width: 100%;
display: flex;
min-height: 216rpx;
margin-left: 24rpx;
flex-direction: column;
justify-content: space-around;
.shop-top-img {
width: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: flex-start;
image{
width:220rpx; image {
height:220rpx; width: 100%;
border-radius: 8rpx; height: 100%;
} }
} }
.shop-right-view{
width:100%; .right-top-view {
width: 100%;
display: flex; display: flex;
min-height:216rpx;
margin-left:24rpx; }
flex-direction: column;
justify-content: space-around; .shop-price {
.shop-top-img{ background: linear-gradient(270deg, #F0E7FE 0%, rgba(240, 231, 254, 0) 100%);
width: 100%; width: 100%;
display: flex; height: 80rpx;
align-items: center; display: flex;
justify-content: flex-start; justify-content: space-between;
image{ align-items: center;
width: 100%;
height: 100%; .price-left {
} font-weight: bold;
font-size: 28rpx;
color: #7934F6;
} }
.right-top-view{
width:100%; .price-center {
display: flex; font-size: 20rpx;
color: #7934F6;
}
.shop-price{
background: linear-gradient( 270deg, #F0E7FE 0%, rgba(240,231,254,0) 100%);
width: 100%;
height: 80rpx;
display: flex;
justify-content: space-between;
align-items: center;
.price-left{
font-weight: bold;
font-size: 28rpx;
color: #7934F6;
}
.price-center{
font-size: 20rpx;
color: #7934F6;
}
} }
} }
} }
}
</style> </style>
+4 -2
View File
@@ -49,7 +49,8 @@
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>", "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>", "<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>"
], ],
"abiFilters" : [ "armeabi-v7a", "arm64-v8a" ], "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ],
"targetSdkVersion" : 30, "targetSdkVersion" : 30,
@@ -74,7 +75,8 @@
"privacyDescription" : { "privacyDescription" : {
"NSPhotoLibraryUsageDescription" : "App需要您的同意才能访问相册,以便您选择本地图片上传头像或发布商品评价。例如:当您修改个人头像或发布带图评价时,需要从相册选择图片。", "NSPhotoLibraryUsageDescription" : "App需要您的同意才能访问相册,以便您选择本地图片上传头像或发布商品评价。例如:当您修改个人头像或发布带图评价时,需要从相册选择图片。",
"NSPhotoLibraryAddUsageDescription" : "App需要您的同意才能添加图片到相册,以便您保存商品海报或图片到本地。例如:当您点击保存商品分享海报时,需要写入相册权限。", "NSPhotoLibraryAddUsageDescription" : "App需要您的同意才能添加图片到相册,以便您保存商品海报或图片到本地。例如:当您点击保存商品分享海报时,需要写入相册权限。",
"NSCameraUsageDescription" : "App需要您的同意才能访问相机,以便您拍摄图片上传头像或发布商品评价。例如:当您修改个人头像或发布带图评价时,需要使用相机拍摄照片。" "NSCameraUsageDescription" : "App需要您的同意才能访问相机,以便您拍摄图片上传头像或发布商品评价。例如:当您修改个人头像或发布带图评价时,需要使用相机拍摄照片。",
"NSMicrophoneUsageDescription" : "App需要您的同意才能访问麦克风,用于快速语音输入,实时语音记录等服务。例如:当您使用语音输入或发送语音消息时,需要调用麦克风权限。"
} }
}, },
/* SDK配置 */ /* SDK配置 */
@@ -92,17 +92,49 @@
<view class="content_right_quantity">x{{ pItem.buyNum }}</view> <view class="content_right_quantity">x{{ pItem.buyNum }}</view>
</view> </view>
</view> </view>
<view class="content_other_item"> <view class="express_card_box">
<view class="data_item data_item_yd" v-if="pItem.expressNo"> <template v-if="orderInfo.orderPackages && orderInfo.orderPackages.length > 0">
<view class="item_title">运单号:</view> <view class="express_header_row">
<view class="item_value"> <view class="express_title">运单号</view>
<view>{{ pItem.expressNo }} </view> <view
<view style="margin-left: 10rpx"> class="express_toggle_btn"
<up-image src="/static/common/copy.png" width="14" height="14" v-if="orderInfo.orderPackages.length > 1"
bgColor="#f1f6ff00" @click="copyData(pItem.expressNo)"></up-image> @click="isExpandExpress = !isExpandExpress"
>
<text>{{ isExpandExpress ? '收起' : `展开全部(${orderInfo.orderPackages.length})` }}</text>
<u-icon :name="isExpandExpress ? 'arrow-up' : 'arrow-down'" color="#7934F6" size="12" style="margin-left: 4rpx;"></u-icon>
</view> </view>
</view> </view>
</view> <view
class="express_item_row"
v-for="(pkg, pkgIdx) in (isExpandExpress ? orderInfo.orderPackages : orderInfo.orderPackages.slice(0, 1))"
:key="pkg.id || pkgIdx"
>
<view class="express_info_text">
<text class="express_name_tag" v-if="pkg.expressName">{{ pkg.expressName }}</text>
<text class="express_no_num">{{ pkg.expressNo }}</text>
</view>
<view class="express_copy_btn" @click="copyData(pkg.expressNo)">
<up-image src="/static/common/copy.png" width="12" height="12" bgColor="#f1f6ff00"></up-image>
<text class="copy_text">复制</text>
</view>
</view>
</template>
<template v-else-if="pItem.expressNo">
<view class="express_header_row">
<view class="express_title">运单号</view>
</view>
<view class="express_item_row">
<view class="express_info_text">
<text class="express_no_num">{{ pItem.expressNo }}</text>
</view>
<view class="express_copy_btn" @click="copyData(pItem.expressNo)">
<up-image src="/static/common/copy.png" width="12" height="12" bgColor="#f1f6ff00"></up-image>
<text class="copy_text">复制</text>
</view>
</view>
</template>
</view> </view>
</view> </view>
</view> </view>
@@ -193,6 +225,10 @@
<view class="operate_comm operate_but_2" v-if="orderInfo.status === ORDER_TYPE.UNPAID" @click="goPay">去付款 <view class="operate_comm operate_but_2" v-if="orderInfo.status === ORDER_TYPE.UNPAID" @click="goPay">去付款
</view> </view>
<!-- <view class="operate_comm operate_but_1" v-if="orderInfo.status === ORDER_TYPE.COMPLETED">申请退款</view> --> <!-- <view class="operate_comm operate_but_1" v-if="orderInfo.status === ORDER_TYPE.COMPLETED">申请退款</view> -->
<view class="operate_comm operate_but_1" style="border-color: #7732ff" v-if="orderInfo.status === ORDER_TYPE.NOT_RECEIVE"
@click="onExpress(orderInfo.id)">
<text class="text-zi">查看物流</text>
</view>
<view class="operate_comm operate_but_2" v-if="orderInfo.status === ORDER_TYPE.NOT_RECEIVE" <view class="operate_comm operate_but_2" v-if="orderInfo.status === ORDER_TYPE.NOT_RECEIVE"
@click="confirmReceiptOk(orderInfo)">确认收货</view> @click="confirmReceiptOk(orderInfo)">确认收货</view>
<!-- <view class="operate_comm operate_but_3" v-if="orderInfo.status === ORDER_TYPE.UNSHIPPED">提醒发货</view> --> <!-- <view class="operate_comm operate_but_3" v-if="orderInfo.status === ORDER_TYPE.UNSHIPPED">提醒发货</view> -->
@@ -282,7 +318,8 @@ export default {
height: "100vh", height: "100vh",
isShowBalance: false, isShowBalance: false,
qrcodeVal: '', qrcodeVal: '',
returnType: 1 returnType: 1,
isExpandExpress: false
}; };
}, },
onLoad(options) { onLoad(options) {
@@ -431,6 +468,11 @@ export default {
// 处理支付失败后的逻辑,如提示用户等 // 处理支付失败后的逻辑,如提示用户等
} }
}, },
onExpress(itemId) {
uni.navigateTo({
url: `/pages/rwa_package/express/express?id=${itemId}`,
});
},
/** /**
* 确认收货 * 确认收货
*/ */
@@ -742,4 +784,87 @@ export default {
display: flex; display: flex;
justify-content: left; justify-content: left;
} }
.express_card_box {
background-color: #F8F9FB;
border-radius: 16rpx;
padding: 20rpx 24rpx;
margin-top: 24rpx;
.express_header_row {
display: flex;
align-items: center;
justify-content: space-between;
padding-bottom: 14rpx;
.express_title {
font-size: 26rpx;
font-weight: 600;
color: #333333;
}
.express_toggle_btn {
display: flex;
align-items: center;
background-color: #F2E9FF;
padding: 6rpx 20rpx;
border-radius: 24rpx;
font-size: 22rpx;
color: #7934F6;
font-weight: 500;
}
}
.express_item_row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16rpx 0 4rpx 0;
border-top: 1rpx dashed #E5E7EB;
&:first-of-type {
border-top: none;
padding-top: 0;
}
.express_info_text {
font-size: 26rpx;
color: #333333;
display: flex;
align-items: center;
.express_name_tag {
font-size: 22rpx;
color: #7934F6;
background-color: #F2E9FF;
padding: 2rpx 12rpx;
border-radius: 6rpx;
margin-right: 12rpx;
font-weight: 500;
}
.express_no_num {
font-weight: 500;
color: #333333;
letter-spacing: 0.5rpx;
}
}
.express_copy_btn {
display: flex;
align-items: center;
padding: 6rpx 16rpx;
border-radius: 20rpx;
background-color: #FFFFFF;
border: 1rpx solid #E2E4E8;
cursor: pointer;
.copy_text {
font-size: 22rpx;
color: #666666;
margin-left: 6rpx;
}
}
}
}
</style> </style>
@@ -29,7 +29,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5: WRITE_EXTERNAL_STORAGE / READ_EXTERNAL_STORAGE / 相册权限:读写外部存储及相册。用于缓存应用数据、保存图片至本地或读取上传所需的图片/文件。例如:当您发布评价或更换头像时,需要访问相册选择图片;当您分享商品海报时,需要将海报保存到您的手机相册。<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5: WRITE_EXTERNAL_STORAGE / READ_EXTERNAL_STORAGE / 相册权限:读写外部存储及相册。用于缓存应用数据、保存图片至本地或读取上传所需的图片/文件。例如:当您发布评价或更换头像时,需要访问相册选择图片;当您分享商品海报时,需要将海报保存到您的手机相册。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6: VIBRATE:允许手机震动。用于在接收到重要通知或特定交互时提供震动反馈。<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6: VIBRATE:允许手机震动。用于在接收到重要通知或特定交互时提供震动反馈。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7: WAKE_LOCK:唤醒锁定。用于在执行重要后台任务(如文件下载、数据同步)时防止手机进入休眠状态。<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7: WAKE_LOCK:唤醒锁定。用于在执行重要后台任务(如文件下载、数据同步)时防止手机进入休眠状态。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8: RECORD_AUDIO / 麦克风(录音)权限:允许应用访问麦克风进行音频录制。用于在您使用在线客服发送语音消息、语音搜索或按键语音开单等功能时录制您的声音信息。例如:当您在全媒体智能客服页面按住“按住说话”按钮发送语音消息时,我们需要调用麦克风权限采集音频。<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8: RECORD_AUDIO / 麦克风(录音)权限:允许应用访问麦克风进行音频录制。用于快速语音输入,实时语音记录等服务。例如:当您使用语音输入或在线客服发送语音消息时,我们需要调用麦克风权限采集音频。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;哪些信息会被收集以及我们如何使用这些信息?<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;哪些信息会被收集以及我们如何使用这些信息?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;收集的信息类别<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;收集的信息类别<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了向您提供我们的服务,我们会要求您提供服务所必需的个人信息。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了向您提供我们的服务,我们会要求您提供服务所必需的个人信息。
@@ -6,7 +6,8 @@
<view class="info_warp"> <view class="info_warp">
<view v-if="form.category !== 'redpacket' && infoList.length > 1"> <view v-if="form.category !== 'redpacket' && infoList.length > 1">
<view class="info_title_warp"> <view class="info_title_warp">
<view :class="selInfo === item.key ? 'info_title_item_warp info_title_item_sel_warp' : 'info_title_item_warp'" <view
:class="selInfo === item.key ? 'info_title_item_warp info_title_item_sel_warp' : 'info_title_item_warp'"
v-for="item in infoList" :key="item.key" @click="selectInfo(item)"> v-for="item in infoList" :key="item.key" @click="selectInfo(item)">
<text>{{ item.name }}</text> <text>{{ item.name }}</text>
<view class="info_title_item_sel_but_warp" v-if="selInfo === item.key"></view> <view class="info_title_item_sel_but_warp" v-if="selInfo === item.key"></view>
@@ -27,32 +28,35 @@
</view> </view>
<view class="line"></view> <view class="line"></view>
</view> </view>
<view v-if="source.length "> <view v-if="source.length">
<view class="icon-top-view" v-if="form.category == 'expend' || form.category == 'balance'"> <view class="icon-top-view" v-if="form.category == 'expend' || form.category == 'balance'">
<view class="top-view"> <view class="top-view">
<view class="top-left-view"> <view class="top-left-view">
<text class="text-36 text-gray text-bold">{{headerData[source[0].key]}}</text> <text class="text-36 text-gray text-bold">{{ headerData[source[0].key] }}</text>
<text class="text-24 text-fu1">{{source[0].name}}</text> <text class="text-24 text-fu1">{{ source[0].name }}</text>
<text class="text-36 text-gray text-bold" style="margin-top:40rpx">{{headerData[source[2].key]}}</text> <text class="text-36 text-gray text-bold"
<text class="text-24 text-fu1">{{source[2].name}}</text> style="margin-top:40rpx">{{ headerData[source[2].key] }}</text>
<text class="text-24 text-fu1">{{ source[2].name }}</text>
</view> </view>
<view class="top-left-view" style="border-width: 0;"> <view class="top-left-view" style="border-width: 0;">
<text class="text-36 text-gray text-bold">{{headerData[source[1].key]}}</text> <text class="text-36 text-gray text-bold">{{ headerData[source[1].key] }}</text>
<text class="text-24 text-fu1">{{source[1].name}}</text> <text class="text-24 text-fu1">{{ source[1].name }}</text>
<text class="text-36 text-gray text-bold" style="margin-top:40rpx">{{headerData[source[3].key]}}</text> <text class="text-36 text-gray text-bold"
<text class="text-24 text-fu1">{{source[3].name}}</text> style="margin-top:40rpx">{{ headerData[source[3].key] }}</text>
<text class="text-24 text-fu1">{{ source[3].name }}</text>
</view> </view>
</view> </view>
</view> </view>
<view class="icon-top-view" style="height:178rpx;min-height:178rpx;margin-top:24rpx" v-if="form.category == 'vcoin'"> <view class="icon-top-view" style="height:178rpx;min-height:178rpx;margin-top:24rpx"
v-if="form.category == 'vcoin'">
<view class="top-view"> <view class="top-view">
<view class="top-left-view"> <view class="top-left-view">
<text class="text-36 text-gray text-bold">{{headerData[source[0].key]}}</text> <text class="text-36 text-gray text-bold">{{ headerData[source[0].key] }}</text>
<text class="text-24 text-fu1">{{source[0].name}}</text> <text class="text-24 text-fu1">{{ source[0].name }}</text>
</view> </view>
<view class="top-left-view" style="border-width: 0;"> <view class="top-left-view" style="border-width: 0;">
<text class="text-36 text-gray text-bold">{{headerData[source[1].key]}}</text> <text class="text-36 text-gray text-bold">{{ headerData[source[1].key] }}</text>
<text class="text-24 text-fu1">{{source[1].name}}</text> <text class="text-24 text-fu1">{{ source[1].name }}</text>
</view> </view>
</view> </view>
</view> </view>
@@ -67,15 +71,18 @@
v-if="orderList && orderList.length !== 0"> v-if="orderList && orderList.length !== 0">
<view class="purse_info_left"> <view class="purse_info_left">
<!-- <up-image :src="item.type === 1? 'https://static.tbmall.xin/static/mine/purse_sf.png' : 'https://static.tbmall.xin/static/mine/purse_xf.png'" width="40" height="40" bgColor="#f1f6ff00"></up-image> --> <!-- <up-image :src="item.type === 1? 'https://static.tbmall.xin/static/mine/purse_sf.png' : 'https://static.tbmall.xin/static/mine/purse_xf.png'" width="40" height="40" bgColor="#f1f6ff00"></up-image> -->
<up-image :src="item.amount > 0 ? 'https://static.tbmall.xin/static/mine/zhen.png' : 'https://static.tbmall.xin/static/mine/fu.png'" width="32" height="32" bgColor="#f1f6ff00"></up-image> <up-image
:src="item.amount > 0 ? 'https://static.tbmall.xin/static/mine/zhen.png' : 'https://static.tbmall.xin/static/mine/fu.png'"
width="32" height="32" bgColor="#f1f6ff00"></up-image>
<view class="purse_data_warp"> <view class="purse_data_warp">
<view class="purse_info_name">{{ getValue(BALANCE_TYPE, item.type) }}</view> <view class="purse_info_name">{{ getValue(BALANCE_TYPE, item.type) }}</view>
<view class="purse_info_value">{{ formatDate(item.ctdate) }}</view> <view class="purse_info_value">{{ formatDate(item.ctdate) }}</view>
</view> </view>
</view> </view>
<view class="ipurse_nfo_right"> <view class="ipurse_nfo_right">
<view class="purse_info_title" style="text-align: end;">{{ handleAmount(item.amount) }}</view> <view class="purse_info_title" style="text-align: end;">{{ handleAmount(item.amount) }}
</view>
<view class="purse_info_value">{{ item.remark }}</view> <view class="purse_info_value">{{ item.remark }}</view>
</view> </view>
</view> </view>
@@ -169,8 +176,8 @@ export default {
name: "总分享金额", name: "总分享金额",
key: "totalBonus" key: "totalBonus"
}, },
]; ];
} }
@@ -187,7 +194,7 @@ export default {
key: "lockAmount" key: "lockAmount"
}, },
{ {
name: "分红", name: "消费者权益",
key: "bonusAmount" key: "bonusAmount"
}, },
@@ -381,7 +388,7 @@ export default {
this.form.page = 1; this.form.page = 1;
this.selInfo = item.key; this.selInfo = item.key;
let id = 0; let id = 0;
if (item.key === "cur") { if (item.key === "cur") {
id = this.curId; id = this.curId;
} }
@@ -453,33 +460,36 @@ export default {
</script> </script>
<style lang="scss"> <style lang="scss">
.icon-top-view{ .icon-top-view {
width:100%; width: 100%;
height:298rpx; height: 298rpx;
min-height:298rpx; min-height: 298rpx;
box-sizing: border-box; box-sizing: border-box;
padding: 0 32rpx; padding: 0 32rpx;
display: flex;
.top-view {
width: 100%;
height: 100%;
display: flex; display: flex;
.top-view{ border-radius: 12rpx;
width:100%; border: 2rpx solid rgba(121, 52, 246, 0.08);
height:100%; flex-direction: row;
justify-content: space-between;
align-items: center;
padding: 52rpx 0;
box-sizing: border-box;
.top-left-view {
flex: 1;
display: flex; display: flex;
border-radius: 12rpx; flex-direction: column;
border: 2rpx solid rgba(121,52,246,0.08);
flex-direction: row;
justify-content: space-between;
align-items: center; align-items: center;
padding: 52rpx 0; border-right: 2px solid #F5F5F5;
box-sizing: border-box;
.top-left-view{
flex:1;
display: flex;
flex-direction: column;
align-items: center;
border-right: 2px solid #F5F5F5;
}
} }
} }
}
.mine_purse_log_warp { .mine_purse_log_warp {
height: calc(100vh - var(--status-bar-height)); height: calc(100vh - var(--status-bar-height));
overflow-y: hidden; overflow-y: hidden;
@@ -60,7 +60,7 @@
<view class="content_right_total"> <view class="content_right_total">
<view>¥<text style="font-size: 36rpx">{{ <view>¥<text style="font-size: 36rpx">{{
pItem.totalPrice pItem.totalPrice
}}</text></view> }}</text></view>
<view>每件到手价¥{{ pItem.unitPrice }}</view> <view>每件到手价¥{{ pItem.unitPrice }}</view>
</view> </view>
<view class="shopping_info_quantity"> <view class="shopping_info_quantity">
@@ -84,7 +84,7 @@
<view class="content_right_total"> <view class="content_right_total">
<view>¥<text style="font-size: 36rpx">{{ <view>¥<text style="font-size: 36rpx">{{
pItem.totalPrice pItem.totalPrice
}}</text></view> }}</text></view>
<view>每件到手价¥{{ pItem.unitPrice }}</view> <view>每件到手价¥{{ pItem.unitPrice }}</view>
</view> </view>
<view class="shopping_info_quantity"> <view class="shopping_info_quantity">
@@ -108,7 +108,7 @@
<view class="order_freight_item"> <view class="order_freight_item">
<view>运费<text style="color: #c0c3c6; margin-left: 20rpx">{{ <view>运费<text style="color: #c0c3c6; margin-left: 20rpx">{{
getValue(PRODUCT_DELIVERY_TIME, addItem.deliveryTime) getValue(PRODUCT_DELIVERY_TIME, addItem.deliveryTime)
}}</text></view> }}</text></view>
<view class="value_"> <view class="value_">
{{ orderInfo.postage ? "¥" + orderInfo.postage : "包邮" }} {{ orderInfo.postage ? "¥" + orderInfo.postage : "包邮" }}
</view> </view>
@@ -1192,6 +1192,7 @@ export default {
specsId: this.sed.specsId.id, specsId: this.sed.specsId.id,
goodsNum: this.orderInfo.shops?.[0]?.addrTimes?.[0]?.goods?.[0]?.num || this.sed.goodsNum || 1, goodsNum: this.orderInfo.shops?.[0]?.addrTimes?.[0]?.goods?.[0]?.num || this.sed.goodsNum || 1,
couponUserId: couponUserId || undefined, couponUserId: couponUserId || undefined,
payway2: this.isCoupon ? 'vcion' : null
}); });
if (!resp || resp.bizcode !== 100) { if (!resp || resp.bizcode !== 100) {
this.$refs.uToastRef.show({ this.$refs.uToastRef.show({
+124 -8
View File
@@ -35,7 +35,20 @@
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
"> ">
<view class="content_data_price buy_deduction" v-if="orderInfo.buyDeductionValue"> <!-- 优惠券 -->
<view class="content_data_price coupon_price_box" v-if="orderInfo.couponPrice">
<text class="coupon_label">券后</text>
<text class="coupon_symbol">¥</text>
<text class="coupon_int">{{ String(orderInfo.couponPrice).split('.')[0] }}</text>
<text class="coupon_dec" v-if="String(orderInfo.couponPrice).split('.')[1]">.{{
String(orderInfo.couponPrice).split('.')[1] }}</text>
<text class="coupon_split">|</text>
<text class="coupon_origin">优惠前¥<template v-if="orderInfo.minPrice && orderInfo.maxPrice">{{
orderInfo.minPrice }} - {{ orderInfo.maxPrice }}</template><template v-else>{{ orderInfo.minPrice
}}</template></text>
</view>
<!-- 数字积分 -->
<view class="content_data_price buy_deduction" v-else-if="orderInfo.buyDeductionValue">
<view class="buy_deduction_value"> <view class="buy_deduction_value">
<text class="text-38 text-bold mr-10">{{ orderInfo.buyDeductionValue }}数字积分</text> <text class="text-38 text-bold mr-10">{{ orderInfo.buyDeductionValue }}数字积分</text>
<text class="text-24">+{{ orderInfo.minPrice }}元</text> <text class="text-24">+{{ orderInfo.minPrice }}元</text>
@@ -44,18 +57,22 @@
兑后数字积分不退 兑后数字积分不退
</view> </view>
</view> </view>
<!-- 正常 -->
<view class="content_data_price" v-else> <view class="content_data_price" v-else>
<text>¥</text> <text>¥</text>
<text style="font-size: 60rpx" v-if="orderInfo.minPrice && orderInfo.maxPrice">{{ orderInfo.minPrice }} - {{ <text style="font-size: 60rpx" v-if="orderInfo.minPrice && orderInfo.maxPrice">{{ orderInfo.minPrice }} -
orderInfo.maxPrice }}</text> {{
orderInfo.maxPrice }}</text>
<text style="font-size: 60rpx" v-else>{{ <text style="font-size: 60rpx" v-else>{{
orderInfo.minPrice orderInfo.minPrice
}}</text> }}</text>
<text class="price_o">¥{{ orderInfo.adPrice }}</text> <text class="price_o">¥{{ orderInfo.adPrice }}</text>
</view> </view>
<view class="text-24" style="color: #ff5a5a; height: 38rpx; display: flex; align-items: center; gap: 5rpx" <view class="text-24" style="color: #ff5a5a; height: 38rpx; display: flex; align-items: center; gap: 5rpx"
v-if="orderInfo?.goodsTagList"> v-if="orderInfo?.goodsTagList">
<image v-for="val in orderInfo.goodsTagList" :src="val.icon" mode="heightFix" style="height: 38rpx"> <image v-for="val in orderInfo.goodsTagList" :key="val" :src="val.icon" mode="heightFix"
style="height: 38rpx">
</image> </image>
</view> </view>
</view> </view>
@@ -220,13 +237,33 @@
<view class="product_content"> <view class="product_content">
<view class="price_warp"> <view class="price_warp">
<!-- 优惠券价格 --> <!-- 优惠券价格 -->
<view class="price_content_warp" v-if="isCoupon"> <view class="price_content_warp coupon_price_box"
v-if="(selectSpecificationTempl && selectSpecificationTempl.couponPrice) || orderInfo.couponPrice">
<text class="coupon_label">券后</text>
<text class="coupon_symbol">¥</text>
<text class="coupon_int">{{ String((selectSpecificationTempl && selectSpecificationTempl.couponPrice) ||
orderInfo.couponPrice).split('.')[0] }}</text>
<text class="coupon_dec"
v-if="String((selectSpecificationTempl && selectSpecificationTempl.couponPrice) || orderInfo.couponPrice).split('.')[1]">.{{
String((selectSpecificationTempl && selectSpecificationTempl.couponPrice) ||
orderInfo.couponPrice).split('.')[1] }}</text>
<text class="coupon_origin">优惠前¥<template
v-if="selectSpecificationTempl && selectSpecificationTempl.price">{{ selectSpecificationTempl.price
}}</template><template v-else-if="skuBySpecInfo.originalPrice">{{ skuBySpecInfo.originalPrice
}}<template v-if="skuBySpecInfo.price">- {{ skuBySpecInfo.price }}</template></template><template
v-else>{{ orderInfo.minPrice }}</template></text>
</view>
<!-- 数字积分 -->
<view class="price_content_warp" v-else-if="isCoupon">
<text class="text-38 text-bold mr-10">{{ orderInfo.buyDeductionValue }}数字积分</text> <text class="text-38 text-bold mr-10">{{ orderInfo.buyDeductionValue }}数字积分</text>
<text class="text-24" v-if=" <text class="text-24" v-if="
selectSpecificationTempl && selectSpecificationTempl &&
Object.keys(selectSpecificationTempl).length !== 0">+{{ selectSpecificationTempl.price }}元</text> Object.keys(selectSpecificationTempl).length !== 0">+{{ selectSpecificationTempl.price }}元</text>
<text v-else>+{{ orderInfo.minPrice }}元</text> <text v-else>+{{ orderInfo.minPrice }}元</text>
</view> </view>
<!-- 正常价格 -->
<view class="price_content_warp" v-else> <view class="price_content_warp" v-else>
<view>¥</view> <view>¥</view>
<text style="font-size: 50rpx" v-if=" <text style="font-size: 50rpx" v-if="
@@ -243,7 +280,10 @@
优惠券{{ 优惠券{{
orderInfo.couponPrice }}</view> orderInfo.couponPrice }}</view>
</view> </view>
<view class="oOrice_content_warp" v-if="!isCoupon">¥{{ skuBySpecInfo.originalPrice }}</view>
<view class="oOrice_content_warp"
v-if="!isCoupon && !((selectSpecificationTempl && selectSpecificationTempl.couponPrice) || orderInfo.couponPrice)">
¥{{ skuBySpecInfo.originalPrice }}</view>
<view class="coupon_content_warp" v-if="orderInfo.couponPrice && orderInfo.couponPrice !== 0"> <view class="coupon_content_warp" v-if="orderInfo.couponPrice && orderInfo.couponPrice !== 0">
优惠券已优惠¥{{ 优惠券已优惠¥{{
orderInfo.couponPrice }}</view> orderInfo.couponPrice }}</view>
@@ -1498,7 +1538,7 @@ export default {
async fetchGoodsCouponList() { async fetchGoodsCouponList() {
if (!this.id) return; if (!this.id) return;
try { try {
const res = await getGoodsCouponList({ goodsId: this.id }); const res = await getGoodsCouponList({ goodsId: this.id, payway2: this.orderInfo.buyDeductionValue ? 'vcion' : null });
if (res && res.bizcode === 100) { if (res && res.bizcode === 100) {
this.goodsCouponList = res.data || []; this.goodsCouponList = res.data || [];
} }
@@ -1663,6 +1703,47 @@ export default {
font-size: 36rpx; font-size: 36rpx;
color: $app-bt-bj; color: $app-bt-bj;
&.coupon_price_box {
display: flex;
align-items: baseline;
.coupon_label {
font-size: 28rpx;
font-weight: normal;
margin-right: 6rpx;
}
.coupon_symbol {
font-size: 28rpx;
font-weight: 500;
margin-right: 4rpx;
}
.coupon_int {
font-size: 56rpx;
font-weight: bold;
line-height: 1;
}
.coupon_dec {
font-size: 32rpx;
font-weight: bold;
line-height: 1;
}
.coupon_split {
font-size: 28rpx;
margin: 0 16rpx;
font-weight: normal;
opacity: 0.7;
}
.coupon_origin {
font-size: 28rpx;
font-weight: normal;
}
}
.price_o { .price_o {
font-weight: 500; font-weight: 500;
font-size: 26rpx; font-size: 26rpx;
@@ -1964,7 +2045,42 @@ export default {
font-size: 36rpx; font-size: 36rpx;
color: $app-bt-bj; color: $app-bt-bj;
display: flex; display: flex;
align-items: center; align-items: baseline;
&.coupon_price_box {
display: flex;
align-items: baseline;
.coupon_label {
font-size: 26rpx;
font-weight: normal;
margin-right: 6rpx;
}
.coupon_symbol {
font-size: 26rpx;
font-weight: 500;
margin-right: 4rpx;
}
.coupon_int {
font-size: 50rpx;
font-weight: bold;
line-height: 1;
}
.coupon_dec {
font-size: 30rpx;
font-weight: bold;
line-height: 1;
}
.coupon_origin {
font-size: 26rpx;
font-weight: normal;
margin-left: 20rpx;
}
}
} }
.price_content_coupon_warp { .price_content_coupon_warp {
+389 -81
View File
@@ -2,131 +2,439 @@
<view class="content"> <view class="content">
<TopSafe></TopSafe> <TopSafe></TopSafe>
<Header title="物流信息" /> <Header title="物流信息" />
<view class="setting-view">
<view class="main-body">
<!-- 多物流 Tab 切换 (数据源:this.expressList) -->
<view class="tabs-bar" v-if="expressList && expressList.length > 0">
<scroll-view class="tabs-scroll" scroll-x :show-scrollbar="false">
<view class="tabs-wrapper">
<view
v-for="(item, index) in expressList"
:key="index"
:class="['tab-item', { active: currentTab === index }]"
@click="onSelectTab(index)"
>
{{ getTabName(index) }}
</view>
</view>
</scroll-view>
</view>
<!-- 物流详情面板 -->
<view class="express-panel"> <view class="express-panel">
<view class="top-one" style="margin-top:12rpx"> <!-- 快递单号行 -->
<u-icon name="email" color="#333" size="20"></u-icon> <view class="info-row">
<text class="text-24 text-fu text-space" style="margin-left:10rpx;line-height: 1.4;margin-right:12rpx">{{curData && `${curData.items[0].expressName}:`}}</text> <view class="icon-wrap">
<text class="text-24 text-gray text-space" style="margin-left:10rpx;line-height: 1.4;margin-right:12rpx">{{curData && `${curData.items[0].expressNo}`}}</text> <u-icon name="bag" color="#333333" size="20"></u-icon>
<up-image src="/static/common/copy.png" width="14" height="14" bgColor="#f1f6ff00" </view>
@click="copyData(curData ? curData.items[0].expressNo :'')"></up-image> <text class="info-label" v-if="displayExpressName">{{ displayExpressName }}:</text>
<text class="info-label" v-else>快递单号:</text>
<text class="info-val">{{ displayExpressNo || '--' }}</text>
<view class="copy-btn" v-if="displayExpressNo" @click="copyData(displayExpressNo)">
<up-image src="/static/common/copy.png" width="14" height="14" bgColor="#f1f6ff00"></up-image>
</view>
</view> </view>
<view class="top-one" style="border-bottom:2rpx solid #eee">
<u-icon name="map" color="#333" size="20"></u-icon> <!-- 收货地址行 -->
<text class="text-24 text-fu text-space" style="margin-left:10rpx;line-height: 1.4;margin-right:12rpx">收货地址</text> <view class="info-row align-start" style="margin-top: 24rpx;" v-if="displayAddress">
<text class="text-24 text-zu text-space" style="margin-left:10rpx;line-height: 1.4;margin-right:12rpx">{{curData && `${curData.countryName} ${curData.cityName} ${curData.areaName} ${curData.address}`}}</text> <view class="icon-wrap" style="margin-top: 4rpx;">
<u-icon name="map" color="#333333" size="20"></u-icon>
</view>
<text class="info-label">收货地址:</text>
<text class="info-val address-text">{{ displayAddress }}</text>
</view> </view>
<u-steps current="0" direction="column" dot activeColor="#7934F6" style="margin-top:20rpx">
<u-steps-item :style="`width:calc(100vw - 48rpx)`" <!-- 分割线 -->
:title="item.areaName + ' ' + item.curTime" :desc="item.desc" v-for="(item,index) in express.logisticsTraceDetailList" :key="index"></u-steps-item> <view class="divider"></view>
</u-steps>
<!-- 物流轨迹时间轴 -->
<view class="trace-list" v-if="express && express.logisticsTraceDetailList && express.logisticsTraceDetailList.length > 0">
<view
class="trace-item"
v-for="(item, index) in express.logisticsTraceDetailList"
:key="index"
>
<!-- 左侧时间轴 (点 + 连接线) -->
<view class="axis-col">
<view :class="['dot', { 'is-latest': index === 0 }]"></view>
<view class="line" v-if="index < express.logisticsTraceDetailList.length - 1"></view>
</view>
<!-- 右侧轨迹内容 -->
<view class="content-col">
<view class="trace-header">
<text :class="['trace-status', { 'is-latest': index === 0 }]">
{{ getTraceTitle(item, index) }}
</text>
<text class="trace-time">{{ item.curTime || item.time }}</text>
</view>
<view class="trace-desc" v-if="item.desc">
{{ item.desc }}
</view>
</view>
</view>
</view>
<!-- 空数据提示 -->
<view class="empty-box" v-else>
<text class="empty-text">暂无物流轨迹信息</text>
</view>
</view> </view>
</view> </view>
<up-toast ref="uToastRef"></up-toast> <up-toast ref="uToastRef"></up-toast>
<!-- 腾讯电子签H5 → 集成到UniApp --> <!-- 腾讯电子签H5 → 集成到UniApp -->
<qiaobao-assistant page-key="pages/rwa_package/express/express" title="物流详情" /> <qiaobao-assistant page-key="pages/rwa_package/express/express" title="物流详情" />
</view> </view>
</template> </template>
<script> <script>
import { getUserInfo,uploadAvatar } from '@/api/auth.js';
import { uploadImage, uploadImg } from '@/api/common.js';
import { IMG_TYPE } from '@/utils/enumUtils.js';
import { BASE_URL, Authorization } from '@/utils/config.js';
import { getStorageFun, TOKEN_NAME,clear } from '@/utils/auth.js';
import Header from '@/components/common/header.vue'; import Header from '@/components/common/header.vue';
import TopSafe from '@/components/common/top-safe.nvue' import TopSafe from '@/components/common/top-safe.nvue';
import MyBtn from '@/components/common/my-btn.vue' import MyBtn from '@/components/common/my-btn.vue';
import func from '@/utils/func.js'; import func from '@/utils/func.js';
import { copyData } from '@/utils/index.js'; import { copyData } from '@/utils/index.js';
import { getDetail, orderLogistics } from "@/api/order.js";
import {
getDetail,
orderLogistics
} from "@/api/order.js";
export default { export default {
components: { Header, TopSafe,MyBtn }, components: { Header, TopSafe, MyBtn },
data() { data() {
return { return {
express:null, express: null,
curData:null, curData: null,
id:0 id: 0,
expressList: [],
expressId: '',
currentTab: 0,
}; };
}, },
computed: {
currentPackage() {
return this.expressList[this.currentTab] || {};
},
displayExpressName() {
return this.currentPackage.expressName || this.curData?.items?.[0]?.expressName || this.express?.expressName || '';
},
displayExpressNo() {
return this.currentPackage.expressNo || this.expressId || this.curData?.items?.[0]?.expressNo || '';
},
displayAddress() {
if (!this.curData) return '';
const parts = [
this.curData.countryName,
this.curData.cityName,
this.curData.areaName,
this.curData.address
].filter(Boolean);
return parts.join(' ');
}
},
onLoad(option) { onLoad(option) {
// this.userinfo(); if (option) {
if(option && option.id){ if (option.id) {
this.id = Number(option.id); this.id = Number(option.id);
this.init(); this.detail();
} else if (option.expressNo) {
this.expressId = option.expressNo;
this.expressList = [{ expressNo: option.expressNo }];
this.getOrderLogistics();
}
} }
}, },
methods: { methods: {
copyData, copyData,
init() {
this.detail(); getTabName(index) {
const zhNums = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十'];
return `物流${zhNums[index] || (index + 1)}`;
}, },
detail(){
let params = { getTraceTitle(item, index) {
id:this.id if (item.areaName) return item.areaName;
if (item.statusName) return item.statusName;
if (item.logisticsStatusDesc) return item.logisticsStatusDesc;
if (item.action) return item.action;
if (item.status) return item.status;
return index === 0 ? '已签收' : '运输中';
},
onSelectTab(index) {
this.currentTab = index;
const pkg = this.expressList[index];
if (pkg && pkg.expressNo) {
this.expressId = pkg.expressNo;
this.getOrderLogistics();
} }
getDetail(params).then(res=>{ },
if(res.bizcode == 100){
detail() {
let params = {
id: this.id
};
getDetail(params).then(res => {
if (res.bizcode == 100) {
this.curData = res.data; this.curData = res.data;
if(this.curData.items[0].expressNo){ this.expressList = this.curData?.orderPackages || [];
this.getOrderLogistics(); if (this.expressList.length > 0) {
this.onSelectTab(0);
} else if (this.curData?.items?.[0]?.expressNo) {
this.expressList = [{
expressName: this.curData.items[0].expressName,
expressNo: this.curData.items[0].expressNo
}];
this.onSelectTab(0);
} }
} }
console.log('id',res) });
})
}, },
getOrderLogistics(){
getOrderLogistics() {
if (!this.expressId) return;
let params = { let params = {
mailNo:this.curData.items[0].expressNo mailNo: this.expressId
} };
orderLogistics(params).then(res=>{ orderLogistics(params).then(res => {
if(res.bizcode == 100){ if (res.bizcode == 100 && res.data) {
this.express = res.data; this.express = res.data;
this.express.logisticsTraceDetailList.forEach(item=>{ if (Array.isArray(this.express.logisticsTraceDetailList)) {
item.curTime = func.formatDate(new Date(item.time), 2); this.express.logisticsTraceDetailList.forEach(item => {
}) if (item.time) {
try {
item.curTime = func.formatDate(new Date(item.time), 2);
} catch (e) {
item.curTime = item.time;
}
}
});
}
} else {
this.express = null;
} }
}) });
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.setting-view { .content {
width: 100%; width: 100vw;
height: calc(100% - 88rpx - var(--status-bar-height)); min-height: 100vh;
background-color: #ffffff;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; }
.express-panel{
width:100%; .main-body {
margin-top:24rpx; width: 100%;
height: calc(100% - 24rpx); flex: 1;
padding: 0 32rpx; display: flex;
box-sizing: border-box; flex-direction: column;
overflow-y: auto; }
display: flex;
flex-direction: column; .tabs-bar {
background-color: #fff; width: 100%;
.top-one{ padding: 24rpx 32rpx 16rpx 32rpx;
width:100%; box-sizing: border-box;
display: flex; background-color: #ffffff;
.tabs-scroll {
width: 100%;
white-space: nowrap;
.tabs-wrapper {
display: inline-flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
min-height:70rpx; }
.tab-item {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 12rpx 36rpx;
border-radius: 32rpx;
font-size: 28rpx;
color: #333333;
background-color: #F5F5F5;
margin-right: 24rpx;
transition: all 0.2s ease;
&.active {
background-color: #F2E9FF;
color: #7934F6;
font-weight: 600;
}
}
}
}
.express-panel {
width: 100%;
flex: 1;
padding: 20rpx 32rpx 40rpx 32rpx;
box-sizing: border-box;
display: flex;
flex-direction: column;
.info-row {
display: flex;
flex-direction: row;
align-items: center;
&.align-start {
align-items: flex-start;
}
.icon-wrap {
display: flex;
align-items: center;
justify-content: center;
margin-right: 12rpx;
flex-shrink: 0;
}
.info-label {
font-size: 28rpx;
color: #333333;
margin-right: 12rpx;
flex-shrink: 0;
}
.info-val {
font-size: 28rpx;
color: #333333;
font-weight: 500;
&.address-text {
font-weight: normal;
line-height: 1.5;
word-break: break-all;
}
}
.copy-btn {
margin-left: 16rpx;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
}
.divider {
width: 100%;
height: 1rpx;
background-color: #F5F5F5;
margin: 32rpx 0 40rpx 0;
}
.trace-list {
width: 100%;
display: flex;
flex-direction: column;
.trace-item {
display: flex;
flex-direction: row;
position: relative;
padding-bottom: 44rpx;
&:last-child {
padding-bottom: 0;
}
.axis-col {
width: 36rpx;
display: flex;
flex-direction: column;
align-items: center;
position: relative;
flex-shrink: 0;
.dot {
width: 16rpx;
height: 16rpx;
border-radius: 50%;
border: 3rpx solid #CCCCCC;
background-color: #FFFFFF;
z-index: 2;
margin-top: 8rpx;
box-sizing: border-box;
&.is-latest {
width: 20rpx;
height: 20rpx;
background-color: #7934F6;
border: none;
margin-top: 6rpx;
}
}
.line {
position: absolute;
top: 24rpx;
bottom: -10rpx;
left: 50%;
transform: translateX(-50%);
width: 2rpx;
background-color: #EEEEEE;
z-index: 1;
}
}
.content-col {
flex: 1;
margin-left: 20rpx;
display: flex;
flex-direction: column;
.trace-header {
display: flex;
flex-direction: row;
align-items: center;
.trace-status {
font-size: 28rpx;
color: #333333;
font-weight: 500;
&.is-latest {
color: #7934F6;
font-weight: 600;
}
}
.trace-time {
font-size: 24rpx;
color: #999999;
margin-left: 20rpx;
}
}
.trace-desc {
font-size: 26rpx;
color: #666666;
line-height: 1.5;
margin-top: 12rpx;
word-break: break-all;
}
}
}
}
.empty-box {
width: 100%;
padding: 60rpx 0;
display: flex;
justify-content: center;
align-items: center;
.empty-text {
font-size: 28rpx;
color: #999999;
} }
} }
} }
</style> </style>
+3 -1
View File
@@ -75,8 +75,10 @@
</view> </view>
<view class="price-sales-row"> <view class="price-sales-row">
<view class="price-box"> <view class="price-box">
<text class="currency" v-if="item.couponPrice">券后</text>
<text class="currency">¥</text> <text class="currency">¥</text>
<text class="price-val">{{ formatPrice(item.price || item.adPrice) }}</text> <text class="price-val">{{ item.couponPrice || formatPrice(item.price || item.adPrice)
}}</text>
</view> </view>
<text class="sales-val" <text class="sales-val"
v-if="item.sales !== undefined && item.sales !== null && item.sales !== ''"> v-if="item.sales !== undefined && item.sales !== null && item.sales !== ''">
+4 -1
View File
@@ -45,9 +45,10 @@
<view class="shopping_info_amount"> <view class="shopping_info_amount">
<view> <view>
<view style="color: #7934f6"> <view style="color: #7934f6">
<text style="font-size: 22rpx" v-if="pItem.couponPrice">券后</text>
<text style="font-size: 22rpx">¥</text> <text style="font-size: 22rpx">¥</text>
<text style="font-size: 32rpx">{{ <text style="font-size: 32rpx">{{
pItem.unitPrice pItem.couponPrice || pItem.unitPrice
}}</text> }}</text>
</view> </view>
<view class="shopping_info_amount_original" v-if="pItem.originalPrice"> <view class="shopping_info_amount_original" v-if="pItem.originalPrice">
@@ -191,6 +192,7 @@ export default {
specsId: curr.specsId, // 规格Id specsId: curr.specsId, // 规格Id
isCheck: false, // 用作于全选 isCheck: false, // 用作于全选
originalPrice: curr.originalPrice, originalPrice: curr.originalPrice,
couponPrice: curr.couponPrice,
goodsStatus: curr.goodsStatus, //商品状态:0-可下单,1-库存不够,2-商品已下架 goodsStatus: curr.goodsStatus, //商品状态:0-可下单,1-库存不够,2-商品已下架
}); });
} else { } else {
@@ -213,6 +215,7 @@ export default {
specsId: curr.specsId, // 规格Id specsId: curr.specsId, // 规格Id
isCheck: false, // 用作于全选 isCheck: false, // 用作于全选
originalPrice: curr.originalPrice, originalPrice: curr.originalPrice,
couponPrice: curr.couponPrice,
goodsStatus: curr.goodsStatus, //商品状态:0-可下单,1-库存不够,2-商品已下架 goodsStatus: curr.goodsStatus, //商品状态:0-可下单,1-库存不够,2-商品已下架
}, },
], ],
+1 -1
View File
@@ -136,7 +136,7 @@
<view class="product_price_row"> <view class="product_price_row">
<view class="price_box"> <view class="price_box">
<text class="price_symbol">¥</text> <text class="price_symbol">¥</text>
<text class="price_val">{{ item.price }}</text> <text class="price_val">{{ item.couponPrice || item.price }}</text>
</view> </view>
<text class="sales_val">全网销量{{ limit999(item.sales) }}</text> <text class="sales_val">全网销量{{ limit999(item.sales) }}</text>
</view> </view>