wangfukang 2 weeks ago
parent
commit
be2d5e65a3
  1. 165
      package1/address/addressList.vue
  2. 291
      package1/buyFood/buyFood.vue
  3. 247
      package1/goods/goodsDetail.vue
  4. 631
      package1/order/orderDetail.vue
  5. 6
      package1/order/orderList.vue
  6. 202
      package1/order/returnOrder.vue
  7. 182
      package1/runErrand/runErrand.vue

165
package1/address/addressList.vue

@ -37,40 +37,26 @@
</view>
<!-- 新增地址弹出层 -->
<uni-popup ref="addBookPopup" background-color="#fff">
<view class="book-popup-content" :style="{'height':isComboxFocused?'2400rpx':'auto'}" style="padding-top:40rpx;">
<view class="book-popup-content">
<view style="height: 80rpx;line-height: 80rpx;font-size: 36rpx;font-weight: 700;text-align: center;">
{{addressForm.id ? '编辑地址' : '填写地址'}}
</view>
<view style="margin-bottom: 20rpx;background: rgba(247, 248, 248, 0.6);border-radius: 20rpx;">
<uni-combox :candidates="areaTitleList" placeholder="请搜索选择楼座区域" :border="false" v-model="areaTitleInput" emptyTips="未找到匹配的楼座" @focus="isComboxFocused = true" @blur="isComboxFocused = false"></uni-combox>
<view class="area-select" @tap="openAreaPopup">
<text v-if="areaTitleInput">{{areaTitleInput}}</text>
<text v-else class="area-select__placeholder">请搜索选择楼座区域</text>
<uni-icons type="right" size="16" color="#999"></uni-icons>
</view>
<view style="margin-bottom: 20rpx;display: flex;padding: 20rpx;background: rgba(247, 248, 248, 0.6);border-radius: 20rpx;">
<input :disabled="isComboxFocused" type="number" v-model="addressForm.floor" placeholder="请填写所在楼层(仅限整数)" style="width: 100%;" />
<view v-show="isComboxFocused" style="width: 100%; height: 42rpx; line-height: 42rpx;">
<text v-if="addressForm.floor">{{addressForm.floor}}</text>
<text v-else style="color: grey;">请填写所在楼层(仅限整数)</text>
</view>
<input type="number" v-model="addressForm.floor" placeholder="请填写所在楼层(仅限整数)" style="width: 100%;" />
</view>
<view style="margin-bottom: 20rpx;display: flex;padding: 20rpx;background: rgba(247, 248, 248, 0.6);border-radius: 20rpx;">
<input :disabled="isComboxFocused" type="text" v-model="addressForm.roomNum" placeholder="请填写门牌号或所在机构科室" style="width: 100%;" />
<view v-show="isComboxFocused" style="width: 100%; height: 42rpx; line-height: 42rpx;">
<text v-if="addressForm.roomNum">{{addressForm.roomNum}}</text>
<text v-else style="color: grey;">请填写门牌号或所在机构科室</text>
</view>
<input type="text" v-model="addressForm.roomNum" placeholder="请填写门牌号或所在机构科室" style="width: 100%;" />
</view>
<view style="margin-bottom: 20rpx;display: flex;padding: 20rpx;background: rgba(247, 248, 248, 0.6);border-radius: 20rpx;">
<input :disabled="isComboxFocused" type="text" v-model="addressForm.receiverName" placeholder="收货人名字" style="width: 100%;" />
<view v-show="isComboxFocused" style="width: 100%; height: 42rpx; line-height: 42rpx;">
<text v-if="addressForm.receiverName">{{addressForm.receiverName}}</text>
<text v-else style="color: grey;">收货人名字</text>
</view>
<input type="text" v-model="addressForm.receiverName" placeholder="收货人名字" style="width: 100%;" />
</view>
<view style="margin-bottom: 20rpx;display: flex;padding: 20rpx;background: rgba(247, 248, 248, 0.6);border-radius: 20rpx;">
<input :disabled="isComboxFocused" type="number" maxlength="11" v-model="addressForm.receiverPhone" placeholder="联系电话" style="width: 100%;" />
<view v-show="isComboxFocused" style="width: 100%; height: 42rpx; line-height: 42rpx;">
<text v-if="addressForm.receiverPhone">{{addressForm.receiverPhone}}</text>
<text v-else style="color: grey;">联系电话</text>
</view>
<input type="number" maxlength="11" v-model="addressForm.receiverPhone" placeholder="联系电话" style="width: 100%;" />
</view>
<view style="margin-bottom: 20rpx;display: flex;padding: 20rpx;justify-content: space-between;align-items: center;">
<text>设为默认地址</text>
@ -81,6 +67,38 @@
</view>
</view>
</uni-popup>
<uni-popup ref="areaPopup" type="center" background-color="#fff">
<view class="area-popup-content">
<view class="area-popup-title">
<text>选择楼座区域</text>
<uni-icons type="closeempty" size="22" color="#333" @tap="closeAreaPopup"></uni-icons>
</view>
<view class="area-search-box">
<input
class="area-search-input"
type="text"
v-model="areaSearchInput"
placeholder="请输入楼座名称搜索"
placeholder-class="area-search-placeholder"
confirm-type="search"
:cursor-spacing="160"
/>
</view>
<scroll-view scroll-y class="area-result-list">
<view v-if="filteredAreaTitleList.length === 0" class="area-result-empty">
未找到匹配的楼座
</view>
<view
v-for="(item, index) in filteredAreaTitleList"
:key="index"
class="area-result-item"
@tap="selectAreaTitle(item)"
>
{{item}}
</view>
</scroll-view>
</view>
</uni-popup>
</view>
</template>
@ -88,11 +106,11 @@
export default {
data() {
return {
isComboxFocused: false,
addressList: [],
areaList: [],
areaTitleList: [],
areaTitleInput: '',
areaSearchInput: '',
addressForm: {
id: '',
areaId: '',
@ -109,6 +127,13 @@
this.getAddressList();
this.getAreaList();
},
computed: {
filteredAreaTitleList() {
const keyword = (this.areaSearchInput || '').toString();
if (!keyword) return this.areaTitleList;
return this.areaTitleList.filter(item => item.toString().indexOf(keyword) > -1);
}
},
methods: {
getAddressList() {
let that = this;
@ -165,6 +190,7 @@
isDefault: 0
};
this.areaTitleInput = '';
this.areaSearchInput = '';
this.$refs.addBookPopup.open('bottom');
},
openEdit(item) {
@ -180,8 +206,21 @@
};
let match = this.areaList.find(a => a.id === item.areaId);
this.areaTitleInput = match ? match.title : (item.areaName || '');
this.areaSearchInput = '';
this.$refs.addBookPopup.open('bottom');
},
openAreaPopup() {
this.areaSearchInput = this.areaTitleInput;
this.$refs.areaPopup.open();
},
closeAreaPopup() {
this.$refs.areaPopup.close();
},
selectAreaTitle(title) {
this.areaTitleInput = title;
this.areaSearchInput = title;
this.closeAreaPopup();
},
submitAddress() {
if(this.areaTitleInput) {
let match = this.areaList.find(a => a.title === this.areaTitleInput);
@ -256,13 +295,81 @@
}
.book-popup-content{
height: auto;
padding-top: 40rpx;
}
</style>
<style>
.uni-combox{
border: 0 !important;
padding: 20rpx 20rpx !important;
.area-select {
margin-bottom: 20rpx;
display: flex;
align-items: center;
justify-content: space-between;
padding: 20rpx;
background: rgba(247, 248, 248, 0.6);
border-radius: 20rpx;
font-size: 28rpx;
color: #333;
}
.area-select__placeholder {
color: #999;
}
.area-popup-content {
width: 640rpx;
max-height: 820rpx;
box-sizing: border-box;
padding: 30rpx;
background: #fff;
border-radius: 24rpx;
overflow: hidden;
}
.area-popup-title {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 24rpx;
font-size: 34rpx;
font-weight: 700;
color: #333;
}
.area-search-box {
margin-bottom: 20rpx;
padding: 18rpx 22rpx;
background: rgba(247, 248, 248, 0.9);
border-radius: 16rpx;
}
.area-search-input {
width: 100%;
height: 44rpx;
line-height: 44rpx;
font-size: 28rpx;
}
.area-search-placeholder {
color: #999;
}
.area-result-list {
height: 560rpx;
}
.area-result-empty,
.area-result-item {
min-height: 84rpx;
line-height: 84rpx;
padding: 0 24rpx;
font-size: 28rpx;
color: #333;
background: #fff;
border-bottom: 1rpx solid #f2f2f2;
}
.area-result-empty {
color: #999;
text-align: center;
}
</style>

291
package1/buyFood/buyFood.vue

@ -119,9 +119,10 @@
<view class="radio-no-check" @tap="checkVoucher('buzhiding')" v-else></view>
不指定
</view>
<view class="commission-input" v-if="selected === 'buzhiding'">
<view class="commission-input" v-if="selected === 'buzhiding'" @tap="openCommissionPopup">
<text>佣金 </text>
<input type="digit" v-model="customCommission" placeholder="金额" />
<view class="commission-value">{{customCommission || '0.1'}}</view>
<uni-icons type="right" size="12" color="#8b9993"></uni-icons>
</view>
</view>
<view class="delivery-option">
@ -281,8 +282,10 @@
<view class="fee-label">
备注
</view>
<view class="remark-box">
<input type="text" v-model="remark" placeholder="口味、餐具等备注" />
<view class="remark-box" @tap="openRemarkPopup">
<view class="remark-value" :class="{'remark-placeholder': !remark}">
{{remark || '口味、餐具等备注'}}
</view>
</view>
</view>
</view>
@ -313,7 +316,7 @@
<view class="buy-bottom">
<view class="bottom-btn" @tap="submitPay">
<image class="pay-btn-gif" src="/static/images/img/loading.gif" mode="aspectFit"></image>
<text>{{isStoreGroupOrder ? '立即支付-到店核销' : ('立即支付' + (nowMake && isPaotui == false ? '-即刻出餐' : ''))}}</text>
<text>{{isStoreGroupOrder ? '立即支付-到店核销' : ('立即支付' + (nowMake && isPaotui == false ? '-即刻出餐' : ''))}} {{totalAmountCalc.toFixed(2)}}</text>
</view>
</view>
</view>
@ -324,6 +327,35 @@
@close="closeAddressBook"></address-list>
</view>
</uni-popup>
<uni-popup ref="commissionPopup" type="center" background-color="transparent">
<view class="commission-popup">
<view class="commission-popup-title">填写配送佣金</view>
<view class="commission-popup-desc">最低 0.1 最多输入 2 位小数</view>
<view class="commission-popup-input">
<text></text>
<input type="digit" :value="commissionInputValue" placeholder="请输入佣金"
focus @input="onCommissionPopupInput" />
</view>
<view class="commission-popup-actions">
<view class="commission-popup-cancel" @tap="$refs.commissionPopup.close()">取消</view>
<view class="commission-popup-confirm" @tap="confirmCommission">确定</view>
</view>
</view>
</uni-popup>
<uni-popup ref="remarkPopup" type="center" background-color="transparent">
<view class="remark-popup">
<view class="remark-popup-title">填写备注</view>
<view class="remark-popup-desc">最多输入 100 </view>
<view class="remark-popup-input">
<textarea v-model="remarkInputValue" maxlength="100" placeholder="口味、餐具等备注" />
<view class="remark-popup-count">{{remarkInputValue.length}}/100</view>
</view>
<view class="remark-popup-actions">
<view class="remark-popup-cancel" @tap="$refs.remarkPopup.close()">取消</view>
<view class="remark-popup-confirm" @tap="confirmRemark">确定</view>
</view>
</view>
</uni-popup>
<!-- 警告弹出层 -->
<uni-popup ref="warnPopup" background-color="#fff">
<view class="warnImg">
@ -508,8 +540,10 @@
nowMake:true,
content: [],
remark:'',
remarkInputValue: '',
selected: 'buzhiding',
customCommission: '0',
customCommission: '0.1',
commissionInputValue: '',
shopItem: {},
cartItems: [],
groupItem: null,
@ -521,6 +555,7 @@
totalPackageFee: 0,
backendTotalAmount: 0,
currentOrderId: '',
isCreatingOrder: false,
createdOrderInfo: null,
isPaymentSuccessGroupInitiate: false,
availableCoupons: [],
@ -655,13 +690,7 @@
}
}
},
watch: {
preDiscountTotal(newVal, oldVal) {
if (newVal !== oldVal) {
this.fetchCoupons();
}
}
},
watch: {},
onShow() {
this.menuButtonInfo = uni.getMenuButtonBoundingClientRect()
this.initAddress()
@ -711,6 +740,63 @@
nowMakeMethod(){
this.nowMake = !this.nowMake
},
formatCommissionValue(value) {
let amount = parseFloat(value);
if (isNaN(amount) || amount < 0.1) {
return '0.1';
}
amount = Math.floor(amount * 100) / 100;
return amount.toFixed(2).replace(/\.?0+$/, '');
},
filterCommissionInput(value) {
value = String(value || '');
value = value.replace(/[^\d.]/g, '');
const dotIndex = value.indexOf('.');
if (dotIndex !== -1) {
value = value.slice(0, dotIndex + 1) + value.slice(dotIndex + 1).replace(/\./g, '');
const parts = value.split('.');
value = parts[0] + '.' + parts[1].slice(0, 2);
}
return value;
},
openCommissionPopup() {
this.commissionInputValue = '';
this.$refs.commissionPopup.open('center');
},
onCommissionPopupInput(e) {
const value = this.filterCommissionInput(e.detail.value);
this.commissionInputValue = value;
return value;
},
confirmCommission() {
const value = this.formatCommissionValue(this.commissionInputValue);
this.customCommission = value;
this.$refs.commissionPopup.close();
this.fetchCoupons();
},
openRemarkPopup() {
this.remarkInputValue = this.remark;
this.$refs.remarkPopup.open('center');
},
confirmRemark() {
this.remark = this.remarkInputValue.slice(0, 100);
this.$refs.remarkPopup.close();
},
onCustomCommissionInput(e) {
let value = String(e.detail.value || '');
value = value.replace(/[^\d.]/g, '');
const dotIndex = value.indexOf('.');
if (dotIndex !== -1) {
value = value.slice(0, dotIndex + 1) + value.slice(dotIndex + 1).replace(/\./g, '');
const parts = value.split('.');
value = parts[0] + '.' + parts[1].slice(0, 2);
}
this.customCommission = value;
return value;
},
normalizeCustomCommission() {
this.customCommission = this.formatCommissionValue(this.customCommission);
},
initAddress() {
let cachedAddress = uni.getStorageSync('selectedAddress');
if (cachedAddress) {
@ -749,6 +835,11 @@
return arr.join(',');
},
submitPay() {
if (this.currentOrderId && this.backendTotalAmount) {
this.$refs.payPopup.open('bottom');
return;
}
if (this.isCreatingOrder) return;
let isJoiningFaceToFace = this.isGroupBuy && this.groupItem && this.groupItem.groupId && this.groupItem
.isFaceToFace;
if (this.isPaotui && !this.formData.address && !isJoiningFaceToFace) {
@ -758,8 +849,9 @@
}
if (this.isPaotui && this.selected === 'buzhiding' && !isJoiningFaceToFace) {
this.normalizeCustomCommission();
let comm = parseFloat(this.customCommission);
if (isNaN(comm) || comm <= 0) {
if (isNaN(comm) || comm < 0.1) {
this.warnPopup = 'psyj';
this.$refs.warnPopup.open();
return;
@ -979,6 +1071,8 @@
return name;
},
submitOrderToBackend() {
if (this.isCreatingOrder) return;
this.isCreatingOrder = true;
let isJoiningFaceToFace = this.isGroupBuy && this.groupItem && this.groupItem.groupId && this.groupItem
.isFaceToFace;
@ -1084,6 +1178,7 @@
payload.regionId = JSON.parse(uni.getStorageSync('area')).id
this.tui.request("/mall/order/create", "POST", payload, false, false).then(res => {
uni.hideLoading();
this.isCreatingOrder = false;
if (res.success && res.result) {
let orderId = res.result.id;
let totalAmount = res.result.totalAmount;
@ -1102,6 +1197,7 @@
}
}).catch(err => {
uni.hideLoading();
this.isCreatingOrder = false;
});
},
showFreeOrderEffect(orderInfo) {
@ -1631,19 +1727,96 @@
margin-right: 10rpx;
}
input {
.commission-value {
width: 132rpx;
height: 52rpx;
min-height: 52rpx;
text-align: center;
font-size: 28rpx;
font-weight: normal;
line-height: 52rpx;
border-radius: 16rpx;
background: #f6faf8;
border: 1rpx solid #e5efeb;
}
}
.commission-popup {
width: 620rpx;
padding: 44rpx 36rpx 34rpx;
box-sizing: border-box;
border-radius: 32rpx;
background: #fff;
box-shadow: 0 28rpx 70rpx rgba(0, 35, 28, 0.18);
}
.commission-popup-title {
color: $primary;
font-size: 34rpx;
font-weight: 900;
text-align: center;
}
.commission-popup-desc {
margin-top: 12rpx;
color: $muted;
font-size: 24rpx;
text-align: center;
}
.commission-popup-input {
display: flex;
align-items: center;
height: 88rpx;
margin-top: 34rpx;
padding: 0 26rpx;
border-radius: 24rpx;
background: #f6faf8;
border: 1rpx solid #e5efeb;
text {
margin-right: 12rpx;
color: #ff7043;
font-size: 34rpx;
font-weight: 900;
}
input {
flex: 1;
height: 88rpx;
min-height: 88rpx;
font-size: 34rpx;
font-weight: 800;
}
}
.commission-popup-actions {
display: flex;
margin-top: 34rpx;
gap: 18rpx;
}
.commission-popup-cancel,
.commission-popup-confirm {
flex: 1;
height: 76rpx;
border-radius: 999rpx;
font-size: 28rpx;
font-weight: 800;
line-height: 76rpx;
text-align: center;
}
.commission-popup-cancel {
background: #f3f6f4;
color: $muted;
}
.commission-popup-confirm {
background: linear-gradient(135deg, #0b9b73, #20d6a4);
color: #fff;
box-shadow: 0 12rpx 26rpx rgba(11, 155, 115, 0.2);
}
.worker-entry {
width: 50%;
color: $muted;
@ -1745,7 +1918,7 @@
.remark-box {
flex: 1;
input {
.remark-value {
width: 100%;
box-sizing: border-box;
text-align: right;
@ -1753,10 +1926,94 @@
font-weight: normal;
min-height: 56rpx;
height: 56rpx;
line-height: 56rpx;
padding: 0 18rpx;
border-radius: 18rpx;
background: #f6faf8;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.remark-placeholder {
color: #9aa6a2;
}
.remark-popup {
width: 620rpx;
padding: 44rpx 36rpx 34rpx;
box-sizing: border-box;
border-radius: 32rpx;
background: #fff;
box-shadow: 0 28rpx 70rpx rgba(0, 35, 28, 0.18);
}
.remark-popup-title {
color: $primary;
font-size: 34rpx;
font-weight: 900;
text-align: center;
}
.remark-popup-desc {
margin-top: 12rpx;
color: $muted;
font-size: 24rpx;
text-align: center;
}
.remark-popup-input {
position: relative;
margin-top: 34rpx;
padding: 22rpx 24rpx 44rpx;
border-radius: 24rpx;
background: #f6faf8;
border: 1rpx solid #e5efeb;
textarea {
width: 100%;
height: 180rpx;
font-size: 28rpx;
line-height: 40rpx;
}
}
.remark-popup-count {
position: absolute;
right: 24rpx;
bottom: 14rpx;
color: #9aa6a2;
font-size: 20rpx;
line-height: 24rpx;
}
.remark-popup-actions {
display: flex;
margin-top: 34rpx;
gap: 18rpx;
}
.remark-popup-cancel,
.remark-popup-confirm {
flex: 1;
height: 76rpx;
border-radius: 999rpx;
font-size: 28rpx;
font-weight: 800;
line-height: 76rpx;
text-align: center;
}
.remark-popup-cancel {
background: #f3f6f4;
color: $muted;
}
.remark-popup-confirm {
background: linear-gradient(135deg, #0b9b73, #20d6a4);
color: #fff;
box-shadow: 0 12rpx 26rpx rgba(11, 155, 115, 0.2);
}
.coupon-row {

247
package1/goods/goodsDetail.vue

@ -1,6 +1,6 @@
<template>
<view class="page1">
<view class="title">
<view class="title" :style="{'background-image': productImage ? 'url(' + productImage + ')' : ''}">
<view class="title-sreach">
<view class="back-btn" @tap="back" :style="{'padding-top': menuButtonInfo.top +'px'}">
<uni-icons type="left" size="28" color="#fff"></uni-icons>
@ -11,68 +11,35 @@
<view class="goods-top">
<view class="goods-content">
<view class="goods-name">
牛仔农庄(医专店)
{{goodsItem.productName || ''}}
</view>
<view class="goods-content-center">
<view class="goods-deal1">
<view style="font-size: 28rpx;line-height: 54rpx;margin-right: 20rpx;">
90.00
{{soloPrice}}
</view>
<view class="pintuan-left-price">
拼团<text style="color: red;">59.90</text>
<view class="pintuan-left-price" v-if="groupPrice">
拼团<text style="color: red;">{{groupPrice}}</text>
</view>
</view>
<view class="goods-tag">
月售 <text> 100+</text>
销量 <text>{{goodsItem.tailWarn != null ? goodsItem.tailWarn : 0}}</text>
</view>
</view>
<view class="goods-fee" v-if="packageFeeNumber > 0">
餐盒费 {{packageFee}}
</view>
</view>
<view class="goods-center">
<view class="pintuan-right">
<view class="pintuan-right-img">
<img src="/static/images/img/songshu.png"
alt="" />
<view class="weipincheng">+</view>
</view>
<view class="pintuan-right-cha">
<text style="color: red;">1</text>拼成
</view>
</view>
<view class="goods-btn">
拼团
</view>
</view>
<view class="goods-bottom">
<view class="detail1">
商品详情
</view>
<view class="detail2">
老北京鸡肉卷是一款融合传统京味与现代快餐便捷性的经典美食以薄韧面饼包裹鲜嫩鸡肉与清爽配菜搭配浓郁甜面酱层次丰富咸香适口是早餐午餐下午茶及宵夜的理想选择肯德基原创经典款已成为国民记忆市面亦有众多速冻即食版本满足不同消费场景需求
门店现制款
单份重量 170g
参考价格15-17 /
套餐搭配OK 三件套含鸡肉卷 + 中薯条 + 中可乐 19.9 工作日特惠
供应时间9:15-22:44具体以门店为准
</view>
<view class="detail2" v-if="productIntro">
<rich-text :nodes="productIntro"></rich-text>
</view>
</view>
<view class="bottom">
<view class="bottom-left">
<view style="position: relative;width: 60rpx;height: 80rpx;margin-top: 20rpx;">
<img src="https://jewel-shop.oss-cn-beijing.aliyuncs.com/60db52398a65459e9541881c926986a4.png"
alt="" />
<view class="bottom-dot">1</view>
</view>
<view class="bottom-price">18.00</view>
</view>
<view class="bottom-right">
<view class="bottom-btn" style="border-bottom-left-radius: 100rpx;border-top-left-radius: 100rpx;">
直接购买
</view>
<view class="bottom-btn"
style="border-bottom-right-radius: 100rpx;border-top-right-radius: 100rpx;background: rgba(0, 35, 28, 1);color: rgba(166, 255, 234, 1);">
拼团买15.00
<view class="detail2 detail-empty" v-else>
暂无商品详情
</view>
</view>
</view>
@ -83,21 +50,78 @@
export default {
data() {
return {
menuButtonInfo: {}
menuButtonInfo: {},
goodsItem: {},
shopItem: {}
}
},
components: {
},
onLoad() {
onLoad(option) {
if (option.item) {
this.goodsItem = JSON.parse(decodeURIComponent(option.item));
}
if (option.shopItem) {
this.shopItem = JSON.parse(decodeURIComponent(option.shopItem));
}
},
onShow() {
this.menuButtonInfo = uni.getMenuButtonBoundingClientRect()
},
computed: {
productImage() {
return this.goodsItem.productPicture || '';
},
productIntro() {
if (this.goodsItem.productIntro == undefined || this.goodsItem.productIntro == null) return '';
if (typeof this.goodsItem.productIntro === 'object') {
return this.goodsItem.productIntro.html || this.goodsItem.productIntro.text || '';
}
return this.goodsItem.productIntro;
},
groupRules() {
return Array.isArray(this.goodsItem.productGroupBuyPrices) ? this.goodsItem.productGroupBuyPrices : [];
},
soloPrice() {
return this.formatMoney(this.getAttributePrice(this.goodsItem));
},
groupPrice() {
if (!this.groupRules.length || this.goodsItem.isMoreBuy == 1) return '';
let rule = this.groupRules[0];
return rule && rule.groupPrice ? this.formatMoney(rule.groupPrice) : '';
},
packageFeeNumber() {
let fee = parseFloat(this.goodsItem.lunchBox || 0);
return isNaN(fee) ? 0 : fee;
},
packageFee() {
return this.formatMoney(this.packageFeeNumber);
}
},
methods: {
back() {
uni.navigateBack()
},
getAttributePrice(item) {
let price = 0;
if (!item || !item.attributeListPrice) return price;
try {
let pObj = typeof item.attributeListPrice === 'string' ? JSON.parse(item.attributeListPrice) : item.attributeListPrice;
if (Array.isArray(pObj) && pObj.length > 0) {
price = parseFloat(pObj[0].specPrice);
} else {
for (let k in pObj) {
price = parseFloat(pObj[k].specPrice);
break;
}
}
} catch (e) {}
return isNaN(price) ? 0 : price;
},
formatMoney(value) {
let amount = parseFloat(value);
return (isNaN(amount) ? 0 : amount).toFixed(2);
}
}
}
@ -123,7 +147,8 @@
background: url('https://jewel-shop.oss-cn-beijing.aliyuncs.com/9362dfb66c0f426789584cabb3977ccc.png') no-repeat;
width: 100%;
height: 700rpx;
background-size: 100%;
background-size: cover;
background-position: center;
position: fixed;
top: 0;
z-index: -1;
@ -177,6 +202,17 @@
text-align: right;
}
.goods-fee {
display: inline-block;
padding: 8rpx 18rpx;
border-radius: 999rpx;
background: rgba(255, 244, 232, 0.92);
border: 1rpx solid rgba(255, 180, 118, 0.54);
color: #b4572d;
font-size: 22rpx;
font-weight: 800;
}
.pintuan-left-price {
display: inline;
padding: 10rpx;
@ -196,53 +232,6 @@
margin: 40rpx;
}
.pintuan-right {
display: flex;
width: 30%;
padding: 30rpx;
flex: 1;
}
.pintuan-right-img {
height: 80rpx;
display: flex;
img {
width: 80rpx;
height: 80rpx;
z-index: 98;
background-size: 100%;
}
}
.weipincheng {
width: 80rpx;
height: 80rpx;
background: #a6ffea;
border-radius: 80rpx;
text-align: center;
font-size: 28rpx;
font-weight: 700;
margin-left: -6rpx;
z-index: 97;
line-height: 80rpx;
}
.goods-center {
width: 95%;
margin: 0 auto 20rpx;
background: #f5f8f5;
height: 140rpx;
border-radius: 20rpx;
overflow: hidden;
display: flex;
}
.pintuan-right-cha {
line-height: 80rpx;
margin-left: 20rpx;
}
.goods-bottom {
width: 95%;
margin: 0 auto;
@ -260,70 +249,8 @@
padding-bottom: 80rpx;
}
.bottom {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 160rpx;
display: flex;
background: #fff;
z-index: 99;
box-shadow: 0 -20rpx 30rpx rgba(0, 0, 0, 0.3);
}
.bottom-left {
flex: 1;
display: flex;
padding: 20rpx;
img {
width: 60rpx;
height: 80rpx;
background-size: 100%;
}
}
.bottom-price {
margin-left: 40rpx;
font-size: 40rpx;
color: red;
font-weight: 700;
line-height: 110rpx;
}
.bottom-right {
padding-top: 20rpx;
flex: 1;
display: flex;
img {
width: 360rpx;
height: 100rpx;
background-size: 100%;
}
}
.bottom-dot {
position: absolute;
top: 0;
right: -20rpx;
background: red;
color: #fff;
width: 32rpx;
height: 32rpx;
border-radius: 32rpx;
text-align: center;
line-height: 32rpx;
.detail-empty {
color: #999;
}
.bottom-btn {
width: 240rpx;
height: 100rpx;
background: linear-gradient(90deg, rgba(227, 255, 150, 1), rgba(166, 255, 234, 1));
font-size: 26rpx;
font-weight: 700;
line-height: 100rpx;
text-align: center;
}
</style>

631
package1/order/orderDetail.vue

@ -1,6 +1,6 @@
<template>
<!-- 订单详情 -->
<view class="page1">
<view class="page1" :style="popupPageStyle">
<view class="pintuan-page" v-if="pintuan">
<view class="title1">
<view class="title-sreach1">
@ -16,12 +16,12 @@
<view style="width: 100%;line-height: 70rpx;font-size: 28rpx;font-weight: 700;">
{{orderDetail.shopName}}
</view>
<view class="pintuan-goods-card">
<view class="pintuan-goods-card" v-for="(item1,index1) in orderDetail.goodsList" :key="index1"
v-if="orderDetail.goodsList != null && orderDetail.goodsList.length > 0">
<view class="goods-img1">
<img src="/static/images/img/shangpintu.png" alt="">
<img :src="item1.productPicture" alt="">
</view>
<view class="goods-content1" v-for="(item1,index1) in orderDetail.goodsList" :key="index1"
v-if="orderDetail.goodsList != null && orderDetail.goodsList.length > 0">
<view class="goods-content1">
<view class="goods-name1">
{{item1.productName}}
</view>
@ -54,6 +54,9 @@
<view class="kaituan1-title11">
快呼唤小伙伴参加吧
</view>
<view class="kaituan-refresh-btn" @tap="refreah(orderDetail)">
{{isRefreshing ? '刷新中' : '刷新'}}
</view>
</view>
<view class="kaituan21">
<view class="kaituan221">
@ -160,7 +163,7 @@
申请售后
</view>
<view class="status-btn" style="top: 70rpx;" @tap="refreah(orderDetail)">
刷新
{{isRefreshing ? '刷新中' : '刷新'}}
</view>
<!-- <view class="status-btn">
去评价
@ -228,7 +231,7 @@
<view style="width: 100%;line-height: 70rpx;font-size: 30rpx;font-weight: 700;">
退款/售后
</view>
<view style="display: flex;margin-top:10px;padding: 20rpx;background: rgba(247, 248, 248, 0.6);border-radius: 20rpx;"
<view class="refund-card"
v-for="(item2,index2) in orderDetail.mallRefundRecord" :key="index2">
<view style="width: 100%;">
@ -248,70 +251,63 @@
{{item2.refundAmount}}
</view>
</view>
<view v-for="(item3,index3) in item2.items" :key="index3"
v-if="item2.items != null && item2.items.length > 0"
style="display: flex;padding: 20rpx;background: rgba(247, 248, 248, 0.6);border-radius: 20rpx;">
<view class="goods-img">
<img :src="item3.productPicture" alt="" style="border-radius: 20rpx;">
<view class="refund-goods-card" v-for="(item3,index3) in item2.items" :key="index3"
v-if="item2.items != null && item2.items.length > 0">
<view class="refund-goods-img">
<img :src="item3.productPicture" alt="">
</view>
<view class="goods-content">
<view class="goods-name">
{{item3.productName}}
</view>
<view class="goods-content-center">
{{item3.specs | delNode}}
</view>
<view class="goods-content-bottom">
<view style="width: 50%;">
X{{item3.quantity}}
</view>
<view class="pintuan-left-price">
{{item3.price}}
<view class="refund-goods-content">
<view class="refund-goods-name">{{item3.productName}}</view>
<view class="refund-goods-spec">{{item3.specs | delNode}}</view>
<view class="refund-goods-bottom">
<text>X{{item3.quantity}}</text>
<text>{{item3.price}}</text>
</view>
</view>
</view>
</view>
<view style="height: 80rpx;line-height: 80rpx;display: flex;">
<view style="flex: 1;color: #777;font-weight: 700;">
<view class="refund-info-row">
<view class="refund-info-label">
原因
</view>
<view style="color: #000;font-weight:700;">
<view class="refund-info-value">
{{item2.reason != null ? item2.reason : ''}}
</view>
</view>
<view style="height: 80rpx;line-height: 80rpx;display: flex;">
<view style="flex: 1;color: #777;font-weight: 700;">
<view class="refund-info-row" v-if="item2.pictures != null && item2.pictures != ''">
<view class="refund-info-label">
图片
</view>
<view style="color: #000;font-weight:700;">
<image v-if="item2.pictures != null" :src="item2.pictures"></image>
<view class="refund-info-value">
<image class="refund-image" :src="item2.pictures" mode="aspectFill"></image>
</view>
</view>
<view style="height: 80rpx;line-height: 80rpx;display: flex;">
<view style="flex: 1;color: #777;font-weight: 700;">
<view class="refund-info-row">
<view class="refund-info-label">
退款/售后类型
</view>
<view style="color: #000;font-weight:700;">
<view class="refund-info-value">
{{item2.refundType == 1 ? '退商品 ' : item2.refundType == 2 ? '退配送费 ' : '全额退款 ' }}
<text v-if="item2.refundTypeStatus != null">
| {{item2.refundTypeStatus == 1 ? '商家原因' : item2.refundTypeStatus == 2 ? '配送员原因' : item2.refundTypeStatus == 3 ? '商家/配送员都有原因' : '平台退款' }}
</text>
</view>
</view>
<view style="height: 80rpx;line-height: 80rpx;display: flex;">
<view style="flex: 1;color: #777;font-weight: 700;">
<view class="refund-info-row">
<view class="refund-info-label">
退款/售后状态
</view>
<view style="color: #000;font-weight:700;">
<view class="refund-info-value">
{{item2.status == 0 ? '处理退款中' : item2.status == 1 ? '同意退款' : item2.status == 2 ? '拒绝退款' : item2.status == 3 ? '处理售后中' : item2.status == 4 ? '同意售后' : '拒绝售后' }}
</view>
</view>
<view style="height: 80rpx;line-height: 80rpx;display: flex;"
v-if="item2.successTime != null">
<view style="flex: 1;color: #777;font-weight: 700;">
<view class="auto-refund-tip" v-if="isRefundPending(item2)">
{{getAutoRefundTime(item2.createTime)}} 之前对方未处理系统会自动退款
</view>
<view class="refund-info-row" v-if="item2.successTime != null">
<view class="refund-info-label">
处理退款/售后时间
</view>
<view style="color: #000;font-weight:700;">
<view class="refund-info-value">
{{item2.successTime | formatTime}}
</view>
</view>
@ -591,98 +587,100 @@
</view>
</uni-popup>
<uni-popup ref="returnPopup" background-color="#fff">
<view class="car-content" style="height: auto;padding: 20rpx 20rpx 0;" v-if="orderDetail.status != 10">
<uni-popup ref="returnPopup" background-color="#fff" @change="onCancelPopupChange">
<view class="car-content cancel-popup" v-if="orderDetail.status != 10">
<view class="car-close" @tap="$refs.returnPopup.close()">
<uni-icons type="close" size="30" color="#fff"></uni-icons>
</view>
<view class="car-title" style="padding: 0 20rpx;">
选择退款原因
</view>
<view class="" style="padding: 0 20rpx;">
<view style="height:80rpx;" v-if="orderDetail.otherOrder != 1">
<scroll-view scroll-y class="cancel-scroll" @touchmove.stop>
<view style="padding: 0 20rpx;">
<view class="cancel-type-item" v-if="orderDetail.otherOrder != 1">
<radio :checked="sellTime==2" name="sellTime" @click="checkSellTime(2)" />
全额退款商家原因
</view>
<view style="height:80rpx;" v-if="payData.deliveryType ==1">
<view class="cancel-type-item" v-if="payData.deliveryType ==1">
<radio :checked="sellTime==3" name="sellTime" @click="checkSellTime(3)" />
全额退款配送员原因
</view>
<view style="height:80rpx;" v-if="payData.deliveryType ==1 && orderDetail.otherOrder != 1">
<view class="cancel-type-item" v-if="payData.deliveryType ==1 && orderDetail.otherOrder != 1">
<radio :checked="sellTime==4" name="sellTime" @click="checkSellTime(4)" />
全额退款商家+配送员原因
</view>
<view style="height:80rpx;">
<!-- <view class="cancel-type-item">
<radio :checked="sellTime==5" name="sellTime" @click="checkSellTime(5)" />
其他
</view> -->
</view>
<view class="cancel-section">
<view class="cancel-section-title">具体原因可多选</view>
<view class="cancel-option-list">
<view :class="selectedCancelReasonOptions.indexOf(item) !== -1 ? 'cancel-option checked' : 'cancel-option'"
v-for="(item,index) in cancelReasonOptions" :key="index" @tap="toggleCancelReasonOption(item)">
{{item}}
</view>
<view class="guize-list">
<view style="border-bottom: 10rpx solid #eee;border-top: 10rpx solid #eee;padding: 20rpx 0;">
<view style="flex: 1;color: #777;font-weight: 700;">
申请说明
</view>
<view style="">
<textarea name="" id="" cols="30" rows="10" placeholder="请填写备注" v-model="returnData.reason"
style="width: 100%;height: 100rpx;padding: 10rpx;margin-top: 20rpx;"></textarea>
<view
style="width: 120rpx;height: 120rpx;border: 1px solid #eee;text-align: center;line-height: 60px;">
<view class="upload-img" @tap="pictureAdd" style="">
<uni-icons type="camera" size="28" color="#777"></uni-icons>
</view>
<view v-if="returnData.pictures !=''" style="">
<img :src="returnData.pictures" alt="" class="upload-img">
<view class="cancel-section">
<view class="cancel-section-title">取消原因</view>
<textarea class="cancel-textarea" placeholder="请选择或填写取消原因" v-model="returnData.reason"></textarea>
</view>
<view class="cancel-section">
<view class="cancel-section-title">上传图片</view>
<view class="cancel-upload-row">
<view class="cancel-upload-img cancel-upload-btn" @tap="pictureAdd">
<uni-icons type="camera" size="28" color="#777"></uni-icons>
</view>
<view v-if="returnData.pictures !=''" class="cancel-upload-preview">
<img :src="returnData.pictures" alt="" class="cancel-upload-img">
</view>
</view>
<view
style="margin-top: 20rpx; color: #ff5722; font-size: 24rpx; background: #fff5f5; padding: 10rpx 20rpx; border-radius: 10rpx;">
</view>
<view class="guize-list">
<view class="cancel-warning-card">
<view class="cancel-warning-line">
<uni-icons type="info" size="14" color="#ff5722"></uni-icons>
<text
v-if="(((payData.orderType == 2 || payData.orderType == 3) && payData.status == 2) || ((payData.orderType == 2 || payData.orderType == 3) && payData.status == 3) || (payData.deliveryType == 1 && payData.status == 3) || payData.status == 4) && payData.otherOrder == null">
取消订单需要商家同意
</text>
<text v-else>请选择退款原因</text>
<view v-if="(payData.status == 3 && payData.deliveryType ==1) || payData.status == 4"
style="line-height: 50rpx;margin-top: 16rpx;">
<view v-if="payData.shopMakeTime == null && payData.otherOrder == null"
style="text-align: right;">
</view>
<view class="cancel-time-tips" v-if="(payData.status == 3 && payData.deliveryType ==1) || payData.status == 4">
<view class="cancel-warning-line" v-if="payData.shopMakeTime == null && payData.otherOrder == null">
<uni-icons type="info" size="14" color="#ff5722"></uni-icons>
<text style="display:inline-block;padding-left:5px;">
<text>
商家还未出餐
</text>
</view>
<view v-if="payData.shopMakeTime == null && payData.otherOrder == null">
<view style="color: #ff5722;">
<view class="cancel-warning-line" v-if="payData.shopMakeTime == null && payData.otherOrder == null">
<uni-icons type="info" size="14" color="#ff5722"></uni-icons>
<text style="display:inline-block;padding-left:5px;">
<text>
配送员到店时间{{shopTime}}
</text>
</view>
</view>
<view v-if="payData.shopMakeTime != null && payData.otherOrder == null">
<view style="color: #ff5722;">
<view class="cancel-warning-line" v-if="payData.shopMakeTime != null && payData.otherOrder == null">
<uni-icons type="info" size="14" color="#ff5722"></uni-icons>
<text style="display:inline-block;padding-left:5px;">
<text>
本单商家备餐时长{{shopTime}}
</text>
</view>
</view>
<view v-if="payData.shopMakeTime != null && payData.otherOrder == null">
<view style="color: #ff5722;">
<view class="cancel-warning-line" v-if="payData.shopMakeTime != null && payData.otherOrder == null">
<uni-icons type="info" size="14" color="#ff5722"></uni-icons>
<text style="display:inline-block;padding-left:5px;">
<text>
配送员配送时长{{peisongTime}}
</text>
</view>
</view>
</view>
</view>
<view class="btn" @tap="returnOrder()" style="margin-top: 20px;">
</scroll-view>
<view class="btn cancel-confirm-btn" @tap="returnOrder()">
确认取消
</view>
</view>
</view>
</uni-popup>
<uni-popup ref="returnPopupBuy" background-color="#fff" style="height: 1600rpx !important;">
@ -697,18 +695,18 @@
</view>
</uni-popup>
<uni-popup ref="addFeePopup" background-color="#fff" style="height: 1600rpx !important;">
<view class="guize-list">
<view style="height: 80rpx;line-height: 80rpx;font-size: 36rpx;font-weight: 700;text-align: center;">
增加配送佣金
</view>
<view style="padding: 20rpx 40rpx;">
<view style="font-size: 28rpx;color: #777;margin-bottom: 20rpx;">请输入要增加的佣金金额</view>
<input type="digit" v-model="additionalFee" placeholder="请输入金额"
style="border: 1px solid #ccc;border-radius: 16rpx;height: 80rpx;line-height: 80rpx;padding: 0 20rpx;font-size: 32rpx;text-align: center;" />
<uni-popup ref="addFeePopup" type="center" background-color="transparent">
<view class="commission-popup">
<view class="commission-popup-title">增加配送佣金</view>
<view class="commission-popup-desc">最低 0.1 最多输入 2 位小数</view>
<view class="commission-popup-input">
<text></text>
<input type="digit" :value="additionalFee" placeholder="请输入金额"
focus @input="onAdditionalFeeInput" />
</view>
<view class="btn" @tap="submitAddFee()">
去支付
<view class="commission-popup-actions">
<view class="commission-popup-cancel" @tap="$refs.addFeePopup.close()">取消</view>
<view class="commission-popup-confirm" @tap="submitAddFee">去支付</view>
</view>
</view>
</uni-popup>
@ -765,6 +763,13 @@
menuButtonInfo: {},
refundType: 3,
refundTypeStatus: 1,
returnData: {
reason: '',
pictures: ''
},
cancelReasonOptions: ['配送超时', '收到的商品少了', '骑手送错地址', '收到的商品错了', '商家出餐超时', '餐品损坏或撒了', '商品质量问题'],
selectedCancelReasonOptions: [],
popupPageStyle: '',
shopTime: '',
hasRefund: false,
peisongTime: '',
@ -776,7 +781,8 @@
},
codeImg: 'https://jewel-shop.oss-cn-beijing.aliyuncs.com/3a4e68eb14d7417cbb4f15fa85907c64.jpg',
additionalFee: '',
addFeeTradeNo: ''
addFeeTradeNo: '',
isRefreshing: false
}
},
components: {
@ -886,6 +892,22 @@
},
methods: {
isRefundPending(item) {
return item && (item.status == 0 || item.status == 3);
},
getAutoRefundTime(value) {
if (!value) return '';
const date = new Date(value);
if (isNaN(date.getTime())) return '';
date.setHours(date.getHours() + 1);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hour = String(date.getHours()).padStart(2, '0');
const minute = String(date.getMinutes()).padStart(2, '0');
const second = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
},
openCode() {
let that = this
this.$refs.imgPopup.open()
@ -983,6 +1005,18 @@
this.refundTypeStatus = 3
}
},
onCancelPopupChange(e) {
this.popupPageStyle = e.show ? 'height:100vh;overflow:hidden;' : '';
},
toggleCancelReasonOption(item) {
let index = this.selectedCancelReasonOptions.indexOf(item);
if (index === -1) {
this.selectedCancelReasonOptions.push(item);
} else {
this.selectedCancelReasonOptions.splice(index, 1);
}
this.returnData.reason = this.selectedCancelReasonOptions.join('、');
},
makeCall(phone) {
uni.makePhoneCall({
phoneNumber: phone
@ -1103,16 +1137,19 @@
refundType: this.refundType,
refundTypeStatus: this.refundTypeStatus,
orderId: item.id,
userId: uni.getStorageSync('id')
userId: uni.getStorageSync('id'),
reason: this.returnData.reason,
pictures: this.returnData.pictures
}, false, true).then((res) => {
uni.hideLoading();
if (res.code == 200) {
that.tui.toast("取消订单成功");
that.getOrderDetail(item.id)
that.$forceUpdate();
} else {
that.tui.toast(res.message);
that.tui.toast(res.message,2000);
}
uni.hideLoading();
}).catch((res) => {});
},
returnOrderBuy() {
@ -1178,7 +1215,7 @@
that.payData.packageFee
});
} else {
that.tui.toast(res.message);
that.tui.toast(res.message,2000);
return;
}
uni.hideLoading();
@ -1191,8 +1228,18 @@
}).catch((res) => {});
},
refreah(item) {
if (this.isRefreshing) return;
this.isRefreshing = true;
uni.showLoading({
title: '刷新中...',
mask: true
});
this.getOrderDetail(item.id)
this.$forceUpdate();
setTimeout(() => {
uni.hideLoading();
this.isRefreshing = false;
}, 1000);
},
returnProducts(item) {
uni.redirectTo({
@ -1245,7 +1292,9 @@
return
}
}).catch((res) => {})
if (!this.isRefreshing) {
uni.hideLoading();
}
},
goAssignWorker() {
let shopAreaId = this.orderDetail.getAreaId || '';
@ -1291,11 +1340,35 @@
},
openAddFeePopup() {
this.additionalFee = '';
this.$refs.addFeePopup.open('bottom');
this.$refs.addFeePopup.open('center');
},
formatMoneyInput(value) {
value = String(value || '');
value = value.replace(/[^\d.]/g, '');
const dotIndex = value.indexOf('.');
if (dotIndex !== -1) {
value = value.slice(0, dotIndex + 1) + value.slice(dotIndex + 1).replace(/\./g, '');
const parts = value.split('.');
value = parts[0] + '.' + parts[1].slice(0, 2);
}
return value;
},
formatAdditionalFee(value) {
let fee = parseFloat(this.formatMoneyInput(value));
if (isNaN(fee) || fee < 0.1) {
return '';
}
return (Math.floor(fee * 100) / 100).toFixed(2).replace(/\.?0+$/, '');
},
onAdditionalFeeInput(e) {
const value = this.formatMoneyInput(e.detail.value);
this.additionalFee = value;
return value;
},
submitAddFee() {
this.additionalFee = this.formatAdditionalFee(this.additionalFee);
let fee = parseFloat(this.additionalFee);
if (isNaN(fee) || fee <= 0) {
if (isNaN(fee) || fee < 0.1) {
this.tui.toast('请输入有效的金额');
return;
}
@ -1310,8 +1383,9 @@
},
addFeeWxPayment() {
let that = this;
this.additionalFee = this.formatAdditionalFee(this.additionalFee);
let fee = parseFloat(this.additionalFee);
if (!fee || fee <= 0) return;
if (!fee || fee < 0.1) return;
let amountInCents = Math.round(fee * 100);
this.tui.request("/api/wechat/pay/unified-order", "POST", {
@ -1379,7 +1453,12 @@
});
},
back() {
uni.navigateBack()
const pages = getCurrentPages()
if (pages.length > 1) {
uni.navigateBack({ delta: 1 })
} else {
uni.switchTab({ url: '/pages/index/index' })
}
}
}
@ -1453,6 +1532,120 @@
overflow: hidden;
}
.auto-refund-tip {
margin: 8rpx 0 18rpx;
padding: 18rpx 20rpx;
border-radius: 18rpx;
background: rgba(255, 244, 232, 0.9);
border: 1rpx solid rgba(255, 180, 118, 0.48);
color: #b4572d;
font-size: 24rpx;
font-weight: 700;
line-height: 34rpx;
}
.refund-card {
margin-top: 10px;
padding: 20rpx;
background: rgba(247, 248, 248, 0.6);
border-radius: 20rpx;
}
.refund-goods-card {
display: flex;
padding: 18rpx;
margin: 12rpx 0;
background: rgba(255, 255, 255, 0.72);
border-radius: 22rpx;
border: 1rpx solid rgba(166, 255, 234, 0.28);
box-sizing: border-box;
}
.refund-goods-img {
width: 132rpx;
height: 132rpx;
flex-shrink: 0;
border-radius: 20rpx;
overflow: hidden;
background: #f4f7f6;
}
.refund-goods-img img {
width: 100%;
height: 100%;
border-radius: 20rpx;
object-fit: cover;
}
.refund-goods-content {
flex: 1;
min-width: 0;
padding-left: 18rpx;
}
.refund-goods-name {
color: #243f38;
font-size: 28rpx;
font-weight: 900;
line-height: 38rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.refund-goods-spec {
margin-top: 8rpx;
color: #7b8883;
font-size: 22rpx;
line-height: 32rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.refund-goods-bottom {
display: flex;
justify-content: space-between;
margin-top: 14rpx;
color: #243f38;
font-size: 24rpx;
font-weight: 800;
line-height: 34rpx;
}
.refund-info-row {
display: flex;
align-items: flex-start;
padding: 18rpx 0;
border-bottom: 1rpx solid rgba(0, 35, 28, 0.045);
}
.refund-info-label {
width: 160rpx;
flex-shrink: 0;
color: #87938f;
font-weight: 700;
line-height: 38rpx;
}
.refund-info-value {
flex: 1;
min-width: 0;
color: #243f38;
font-weight: 700;
line-height: 38rpx;
word-break: break-all;
text-align: right;
}
.refund-image {
width: 180rpx;
height: 180rpx;
border-radius: 20rpx;
display: block;
margin-left: auto;
}
.content > .box1:first-child {
background:
radial-gradient(circle at 94% 4%, rgba(255, 221, 176, 0.2) 0, rgba(255, 221, 176, 0) 170rpx),
@ -1683,6 +1876,143 @@
box-shadow: 0 -18rpx 44rpx rgba(0, 35, 28, 0.12);
}
.cancel-popup {
max-height: 86vh;
padding: 20rpx 20rpx 0 !important;
overflow: hidden;
box-sizing: border-box;
background: #fff;
}
.cancel-scroll {
height: 62vh;
overflow: hidden;
}
.cancel-type-item {
min-height: 76rpx;
line-height: 76rpx;
color: #243f38;
font-size: 28rpx;
font-weight: 700;
}
.cancel-section {
padding: 0 20rpx 24rpx;
}
.cancel-section-title {
margin: 10rpx 0 18rpx;
color: #243f38;
font-size: 28rpx;
font-weight: 900;
}
.cancel-option-list {
display: flex;
flex-wrap: wrap;
gap: 16rpx;
}
.cancel-option {
padding: 0 22rpx;
height: 64rpx;
line-height: 64rpx;
border-radius: 999rpx;
background: rgba(247, 248, 248, 0.78);
border: 1rpx solid rgba(0, 35, 28, 0.06);
color: #65736f;
font-size: 24rpx;
font-weight: 700;
}
.cancel-option.checked {
background: linear-gradient(90deg, rgba(227, 255, 150, 1), rgba(166, 255, 234, 1));
color: #00231C;
border-color: rgba(166, 255, 234, 0.78);
}
.cancel-textarea {
width: 100%;
height: 180rpx;
padding: 20rpx;
box-sizing: border-box;
border-radius: 24rpx;
background: rgba(247, 248, 248, 0.8);
color: #243f38;
font-size: 26rpx;
line-height: 38rpx;
}
.cancel-upload-row {
display: flex;
align-items: center;
gap: 18rpx;
flex-wrap: wrap;
}
.cancel-upload-img {
width: 150rpx;
height: 150rpx;
border-radius: 20rpx;
object-fit: cover;
}
.cancel-upload-btn {
display: flex;
align-items: center;
justify-content: center;
background: rgba(247, 248, 248, 0.8);
border: 1rpx dashed rgba(0, 35, 28, 0.18);
}
.cancel-upload-preview {
width: 150rpx;
height: 150rpx;
border-radius: 20rpx;
overflow: hidden;
}
.cancel-warning-card {
margin-top: 20rpx;
padding: 18rpx 20rpx;
border-radius: 18rpx;
background: #fff5f5;
color: #ff5722;
font-size: 24rpx;
line-height: 36rpx;
box-sizing: border-box;
}
.cancel-time-tips {
margin-top: 14rpx;
display: flex;
flex-direction: column;
gap: 10rpx;
}
.cancel-warning-line {
display: flex;
align-items: flex-start;
width: 100%;
min-height: 36rpx;
line-height: 36rpx;
text-align: left;
word-break: break-all;
}
.cancel-warning-line text {
flex: 1;
min-width: 0;
padding-left: 10rpx;
white-space: normal;
}
.cancel-confirm-btn {
width: 95%;
margin: 18rpx auto 20rpx;
}
.evaluate-content {
background: linear-gradient(180deg, #ffffff 0%, #f7fffb 100%);
}
@ -1700,6 +2030,83 @@
background-size: 100%;
}
.commission-popup {
width: 620rpx;
padding: 44rpx 36rpx 34rpx;
box-sizing: border-box;
border-radius: 32rpx;
background: #fff;
box-shadow: 0 28rpx 70rpx rgba(0, 35, 28, 0.18);
}
.commission-popup-title {
color: #243f38;
font-size: 34rpx;
font-weight: 900;
text-align: center;
}
.commission-popup-desc {
margin-top: 12rpx;
color: #87938f;
font-size: 24rpx;
text-align: center;
}
.commission-popup-input {
display: flex;
align-items: center;
height: 88rpx;
margin-top: 34rpx;
padding: 0 26rpx;
border-radius: 24rpx;
background: #f6faf8;
border: 1rpx solid #e5efeb;
text {
margin-right: 12rpx;
color: #ff7043;
font-size: 34rpx;
font-weight: 900;
}
input {
flex: 1;
height: 88rpx;
min-height: 88rpx;
font-size: 34rpx;
font-weight: 800;
}
}
.commission-popup-actions {
display: flex;
margin-top: 34rpx;
gap: 18rpx;
}
.commission-popup-cancel,
.commission-popup-confirm {
flex: 1;
height: 76rpx;
border-radius: 999rpx;
font-size: 28rpx;
font-weight: 800;
line-height: 76rpx;
text-align: center;
}
.commission-popup-cancel {
background: #f3f6f4;
color: #87938f;
}
.commission-popup-confirm {
background: linear-gradient(135deg, #fff7d7 0%, #a6ffea 100%);
color: #243f38;
box-shadow: 0 12rpx 26rpx rgba(0, 191, 160, 0.12);
}
.evaluate-content {
width: 600rpx;
height: 800rpx;
@ -1879,6 +2286,20 @@
box-sizing: border-box;
}
.kaituan-refresh-btn {
height: 44rpx;
line-height: 44rpx;
padding: 0 22rpx;
margin: 10rpx 0 0 16rpx;
border-radius: 999rpx;
background: rgba(255, 255, 255, 0.86);
border: 1rpx solid rgba(166, 255, 234, 0.7);
color: #0f806d;
font-size: 22rpx;
font-weight: 800;
box-shadow: 0 8rpx 18rpx rgba(0, 35, 28, 0.06);
}
.kaituan21 {
display: flex;
align-items: center;

6
package1/order/orderList.vue

@ -168,7 +168,7 @@
</view>
</view>
</view>
<view style="display: flex;background: rgba(247, 248, 248, 0.6);border-radius: 10px;align-items: center;">
<view style="display: flex;background: rgba(247, 248, 248, 0.6);border-radius: 10px;align-items: center;" @tap.stop="orderDetail(item.id)">
<view v-else style="width: 80%;overflow: scroll;display: flex;padding: 20rpx;background: rgba(247, 248, 248, 0.6);border-radius: 20rpx;" v-for="(item1,index1) in item.goodsList" :key="index1" v-if="item.goodsList != null && item.goodsList.length > 0">
<view class="goods-img">
<img :src="item1.productPicture" alt="">
@ -454,7 +454,7 @@
that.tui.toast("订单创建失败,请联系客服处理");
}
}) */
uni.redirectTo({
uni.navigateTo({
url: '/package1/order/orderDetail?id=' + that.payData.id
});
},
@ -472,7 +472,7 @@
return false;
},
orderDetail(id){
uni.redirectTo({
uni.navigateTo({
url: '/package1/order/orderDetail?id=' + id
});
},

202
package1/order/returnOrder.vue

@ -1,6 +1,6 @@
<template>
<!-- 订单详情 -->
<view class="page1">
<view class="page1" :style="popupPageStyle">
<view class="">
<view class="title">
@ -190,37 +190,7 @@
{{orderDetail.deliveryInfo.finishTime ? orderDetail.deliveryInfo.finishTime : '尽快送达' | formatTime}}
</view>
</view>
<view style="height: 160rpx;line-height: 160rpx;display: flex;"
v-if="orderDetail.deliveryType == 1">
<view style="flex: 1;color: #777;font-weight: 700;">
上传图片
</view>
<view style="color: #000;font-weight: 700;width: 160rpx;">
<view class="upload-img" @tap="pictureAdd"
style="background: rgba(247, 248, 248, 0.6);text-align: center;line-height: 160rpx;">
<uni-icons type="camera" size="28" color="#777"></uni-icons>
</view>
<view style="overflow-x: scroll;display: flex;width: 350rpx;">
<view v-if="returnData.pictures !=''"
style="width: 160rpx;height: 160rpx;margin-left: 20rpx;">
<img :src="returnData.pictures" alt="" class="upload-img">
</view>
</view>
</view>
</view>
<view style="height: 170rpx;line-height: 170rpx;display: flex;margin-top: 40rpx;"
v-if="orderDetail.deliveryType == 1">
<view style="flex: 1;color: #777;font-weight: 700;">
订单备注
</view>
<view
style="height: 200rpx;background: rgba(247, 248, 248, 0.6);border-radius: 40rpx;padding: 20rpx;width: 70%;">
<textarea name="" id="" cols="30" rows="10" placeholder="请填写备注"
v-model="returnData.reason" style="height: 160rpx;width: 100%;"></textarea>
</view>
</view>
<view class="btn" @tap.stop="$refs.carPopup.open()">
<view class="btn" @tap.stop="openReasonPopup">
售后原因
</view>
<view class="btn" @tap.stop="submit()">
@ -231,38 +201,64 @@
</view>
</view>
<!-- 退款原因弹窗 -->
<uni-popup ref="carPopup" background-color="#fff" :mask-click="false">
<view class="car-content">
<view class="car-close">
<!-- 售后原因弹窗 -->
<uni-popup ref="carPopup" background-color="#fff" @change="onReasonPopupChange">
<view class="car-content reason-popup">
<view class="car-close" @tap="$refs.carPopup.close()">
<uni-icons type="close" size="30" color="#fff"></uni-icons>
</view>
<view class="car-title" style="padding: 0 20rpx;">
选择退款原因
选择售后原因
</view>
<scroll-view scroll-y class="reason-scroll" @touchmove.stop>
<view style="padding: 0 20rpx;">
<view style="height:80rpx;" v-if="orderDetail.deliveryType ==1 && orderDetail.otherOrder != 1">
<view class="reason-type-item" v-if="orderDetail.deliveryType ==1 && orderDetail.otherOrder != 1">
<radio :checked="sellTime==0" name="sellTime" @click="checkSellTime(0)" />
商品退款
</view>
<view style="height:80rpx;" v-if="orderDetail.deliveryType ==1 && orderDetail.otherOrder != 1">
<view class="reason-type-item" v-if="orderDetail.deliveryType ==1 && orderDetail.otherOrder != 1">
<radio :checked="sellTime==1" name="sellTime" @click="checkSellTime(1)" />
退配送费
</view>
<view style="height:80rpx;" v-if="orderDetail.otherOrder != 1">
<view class="reason-type-item" v-if="orderDetail.otherOrder != 1">
<radio :checked="sellTime==2" name="sellTime" @click="checkSellTime(2)" />
全额退款商家原因
</view>
<view style="height:80rpx;" v-if="orderDetail.deliveryType ==1">
<view class="reason-type-item" v-if="orderDetail.deliveryType ==1">
<radio :checked="sellTime==3" name="sellTime" @click="checkSellTime(3)" />
全额退款配送员原因
</view>
<view style="height:80rpx;" v-if="orderDetail.deliveryType ==1 && orderDetail.otherOrder != 1">
<view class="reason-type-item" v-if="orderDetail.deliveryType ==1 && orderDetail.otherOrder != 1">
<radio :checked="sellTime==4" name="sellTime" @click="checkSellTime(4)" />
全额退款商家+配送员原因
</view>
</view>
<view class="reason-section">
<view class="reason-section-title">具体原因可多选</view>
<view class="reason-option-list">
<view :class="selectedReasonOptions.indexOf(item) !== -1 ? 'reason-option checked' : 'reason-option'"
v-for="(item,index) in reasonOptions" :key="index" @tap="toggleReasonOption(item)">
{{item}}
</view>
</view>
</view>
<view class="reason-section">
<view class="reason-section-title">售后原因</view>
<textarea class="reason-textarea" placeholder="请选择或填写售后原因" v-model="returnData.reason"></textarea>
</view>
<view class="reason-section">
<view class="reason-section-title">上传图片</view>
<view class="upload-row">
<view class="upload-img upload-btn" @tap="pictureAdd">
<uni-icons type="camera" size="28" color="#777"></uni-icons>
</view>
<view v-if="returnData.pictures !=''" class="upload-preview">
<img :src="returnData.pictures" alt="" class="upload-img">
</view>
</view>
</view>
</scroll-view>
<view class="btn" @tap="chooseReturnType()">确认</view>
</view>
</uni-popup>
@ -293,8 +289,13 @@
orderId: '',
vModelValue: 0,
returnData: {
reason: '',
pictures: '',
refundAmount: 0
},
reasonOptions: ['配送超时', '收到的商品少了', '骑手送错地址', '收到的商品错了', '商家出餐超时', '餐品损坏或撒了', '商品质量问题'],
selectedReasonOptions: [],
popupPageStyle: '',
payData: {},
orderDetail: {},
codeImg: 'https://jewel-shop.oss-cn-beijing.aliyuncs.com/3a4e68eb14d7417cbb4f15fa85907c64.jpg'
@ -372,9 +373,15 @@
},
onShow() {
this.menuButtonInfo = uni.getMenuButtonBoundingClientRect()
this.$refs.carPopup.open();
this.openReasonPopup();
},
methods: {
onReasonPopupChange(e) {
this.popupPageStyle = e.show ? 'height:100vh;overflow:hidden;' : '';
},
openReasonPopup() {
this.$refs.carPopup.open('bottom');
},
chooseReturnType() {
this.$refs.carPopup.close()
if (this.sellTime == 0) {
@ -398,6 +405,18 @@
}
this.changeProduct()
},
toggleReasonOption(item) {
let index = this.selectedReasonOptions.indexOf(item);
if (index === -1) {
this.selectedReasonOptions.push(item);
} else {
this.selectedReasonOptions.splice(index, 1);
}
this.syncReasonText();
},
syncReasonText() {
this.returnData.reason = this.selectedReasonOptions.join('、');
},
changeProduct() {
for (let i = 0; i < this.orderDetail.goodsList.length; i++) {
if (this.orderDetail.goodsList[i].returnCount) {
@ -967,7 +986,7 @@
width: 100%;
border-radius: 20rpx;
padding: 20rpx;
overflow: scroll;
overflow: hidden;
}
.car-close {
@ -986,6 +1005,101 @@
font-weight: 700;
}
.reason-popup {
border-radius: 36rpx 36rpx 0 0;
max-height: 86vh;
box-sizing: border-box;
}
.reason-scroll {
height: 62vh;
overflow: hidden;
}
.reason-type-item {
min-height: 76rpx;
line-height: 76rpx;
color: #243f38;
font-size: 28rpx;
font-weight: 700;
}
.reason-section {
padding: 0 20rpx 24rpx;
}
.reason-section-title {
margin: 10rpx 0 18rpx;
color: #243f38;
font-size: 28rpx;
font-weight: 900;
}
.reason-option-list {
display: flex;
flex-wrap: wrap;
gap: 16rpx;
}
.reason-option {
padding: 0 22rpx;
height: 64rpx;
line-height: 64rpx;
border-radius: 999rpx;
background: rgba(247, 248, 248, 0.78);
border: 1rpx solid rgba(0, 35, 28, 0.06);
color: #65736f;
font-size: 24rpx;
font-weight: 700;
}
.reason-option.checked {
background: linear-gradient(90deg, rgba(227, 255, 150, 1), rgba(166, 255, 234, 1));
color: #00231C;
border-color: rgba(166, 255, 234, 0.78);
}
.reason-textarea {
width: 100%;
height: 180rpx;
padding: 20rpx;
box-sizing: border-box;
border-radius: 24rpx;
background: rgba(247, 248, 248, 0.8);
color: #243f38;
font-size: 26rpx;
line-height: 38rpx;
}
.upload-row {
display: flex;
align-items: center;
gap: 18rpx;
flex-wrap: wrap;
}
.upload-img {
width: 150rpx;
height: 150rpx;
border-radius: 20rpx;
object-fit: cover;
}
.upload-btn {
display: flex;
align-items: center;
justify-content: center;
background: rgba(247, 248, 248, 0.8);
border: 1rpx dashed rgba(0, 35, 28, 0.18);
}
.upload-preview {
width: 150rpx;
height: 150rpx;
border-radius: 20rpx;
overflow: hidden;
}
.btn {
width: 95%;
height: 100rpx;

182
package1/runErrand/runErrand.vue

@ -116,11 +116,10 @@
<view class="radio-no-check" @tap="checkWorker('buzhiding')" v-else></view>
不指定
</view>
<view style="width: 50%;display: flex;justify-content: flex-end;align-items: center;" v-if="selectedWorker === 'buzhiding'">
<view style="width: 50%;display: flex;justify-content: flex-end;align-items: center;" v-if="selectedWorker === 'buzhiding'" @tap="openCommissionPopup">
<text style="color: #777; font-weight: normal; margin-right: 10rpx; font-size: 24rpx;">佣金 </text>
<input type="digit" v-model="customCommission"
style="width: 140rpx; border-bottom: 1px solid #ccc; text-align: center; font-size: 28rpx; font-weight: normal; height: 50rpx; min-height: 50rpx;"
placeholder="金额" />
<view class="commission-value">{{customCommission || '0.1'}}</view>
<uni-icons type="right" size="12" color="#999"></uni-icons>
</view>
</view>
<view style="display: flex;font-size: 28rpx;font-weight: bold;line-height: 50rpx;">
@ -243,15 +242,15 @@
<view style="width: 100%;height: 520rpx;"></view>
</view>
<view class="buy-bottom">
<view class="bottom-btn" @tap="submitPay">
<view v-if="!isBookPopupOpen" class="buy-bottom" @tap.stop>
<view class="bottom-btn" @tap.stop="submitPay">
<image class="pay-btn-gif" src="/static/images/img/loading.gif" mode="aspectFit"></image>
<text>立即支付{{backendTotalAmount ? backendTotalAmount.toFixed(2) : totalAmountCalc.toFixed(2)}}</text>
</view>
</view>
<!-- 收货/取货地址簿弹出层 -->
<uni-popup ref="bookPopup" background-color="#fff">
<uni-popup ref="bookPopup" background-color="#fff" @change="onBookPopupChange">
<view class="book-popup-content">
<address-list @selectAddress="handleSelectAddress" @syncAddress="handleSyncAddress" @shopAreaList="updateArea" @close="$refs.bookPopup.close()"></address-list>
</view>
@ -312,6 +311,22 @@
</view>
</uni-popup>
<uni-popup ref="commissionPopup" type="center" background-color="transparent">
<view class="commission-popup">
<view class="commission-popup-title">填写配送佣金</view>
<view class="commission-popup-desc">最低 0.1 最多输入 2 位小数</view>
<view class="commission-popup-input">
<text></text>
<input type="digit" :value="commissionInputValue" placeholder="请输入佣金"
focus @input="onCommissionPopupInput" />
</view>
<view class="commission-popup-actions">
<view class="commission-popup-cancel" @tap="$refs.commissionPopup.close()">取消</view>
<view class="commission-popup-confirm" @tap="confirmCommission">确定</view>
</view>
</view>
</uni-popup>
<uni-popup ref="warnPopup" background-color="#fff">
<view style="width:600rpx;height:740rpx;">
<img v-if="warnPopup === 'shdz'" @tap="$refs.warnPopup.close()" src="https://jewel-shop.oss-cn-beijing.aliyuncs.com/4996043b3987401794b974d359429b8e.png" alt="填写收货地址" style="width:100%;height:100%;" />
@ -368,11 +383,13 @@
menuButtonInfo: {},
selectedWorker:'buzhiding',
assignedWorker:null,
customCommission:'0',
customCommission:'0.1',
commissionInputValue: '',
shopArea: [],
kuaidiAreaList: [],
selectedPickupArea: null,
addressSelectMode: 'put', // 'put' | 'get'
isBookPopupOpen: false,
formData: {
address: null, // putArea
pickupAddress: null, // getArea ()
@ -392,6 +409,7 @@
immediateTimeStr: '',
backendTotalAmount: 0,
currentOrderId: '',
isCreatingOrder: false,
warnPopup: '',
availableCoupons: [],
selectedCoupon: null
@ -431,13 +449,7 @@
return total > 0 ? total : 0.01;
}
},
watch: {
deliveryFeeCalc(newVal, oldVal) {
if (newVal !== oldVal) {
this.fetchCoupons();
}
}
},
watch: {},
onLoad() {
//this.getShopArea()
},
@ -465,6 +477,39 @@
uni.removeStorageSync('pendingAssignWorker');
},
methods: {
formatCommissionValue(value) {
let amount = parseFloat(value);
if (isNaN(amount) || amount < 0.1) {
return '0.1';
}
amount = Math.floor(amount * 100) / 100;
return amount.toFixed(2).replace(/\.?0+$/, '');
},
filterCommissionInput(value) {
value = String(value || '');
value = value.replace(/[^\d.]/g, '');
const dotIndex = value.indexOf('.');
if (dotIndex !== -1) {
value = value.slice(0, dotIndex + 1) + value.slice(dotIndex + 1).replace(/\./g, '');
const parts = value.split('.');
value = parts[0] + '.' + parts[1].slice(0, 2);
}
return value;
},
openCommissionPopup() {
this.commissionInputValue = '';
this.$refs.commissionPopup.open('center');
},
onCommissionPopupInput(e) {
const value = this.filterCommissionInput(e.detail.value);
this.commissionInputValue = value;
return value;
},
confirmCommission() {
this.customCommission = this.formatCommissionValue(this.commissionInputValue);
this.$refs.commissionPopup.close();
this.fetchCoupons();
},
openCouponPopup() {
this.fetchCoupons();
this.$refs.couponPopup.open('bottom');
@ -530,8 +575,12 @@
},
openAddressBook(mode) {
this.addressSelectMode = mode;
this.isBookPopupOpen = true;
this.$refs.bookPopup.open('bottom');
},
onBookPopupChange(e) {
this.isBookPopupOpen = !!e.show;
},
handleSelectAddress(address) {
if (this.addressSelectMode === 'put') {
this.formData.address = address;
@ -539,6 +588,7 @@
} else {
this.formData.pickupAddress = address;
}
this.isBookPopupOpen = false;
this.$refs.bookPopup.close();
},
updateArea(v){
@ -745,6 +795,12 @@
return null;
},
submitPay() {
uni.hideKeyboard();
if (this.currentOrderId && this.backendTotalAmount) {
this.$refs.payPopup.open('bottom');
return;
}
if (this.isCreatingOrder) return;
if (this.isKuaidi && !this.selectedPickupArea) {
uni.showToast({ title: '请选择代取点', icon: 'none' });
return;
@ -759,8 +815,9 @@
return;
}
if (this.selectedWorker === 'buzhiding') {
this.customCommission = this.formatCommissionValue(this.customCommission);
let comm = parseFloat(this.customCommission);
if (isNaN(comm) || comm <= 0) {
if (isNaN(comm) || comm < 0.1) {
this.warnPopup = 'psyj';
this.$refs.warnPopup.open();
return;
@ -779,6 +836,8 @@
this.submitOrderToBackend();
},
submitOrderToBackend() {
if (this.isCreatingOrder) return;
this.isCreatingOrder = true;
let deliveryType = this.isKuaidi ? 2 : 3;
let putAddressStr = (this.formData.address.areaName || '') + (this.formData.address.floor ? this.formData.address.floor + '层' : '') + (this.formData.address.roomNum || '');
@ -846,6 +905,7 @@
this.tui.request("/mall/delivery/insert", "POST", payload, false, false).then(res => {
uni.hideLoading();
this.isCreatingOrder = false;
if (res.success && res.result) {
this.currentOrderId = res.result.id;
this.backendTotalAmount = res.result.deliveryFee || this.deliveryFeeCalc;
@ -855,6 +915,7 @@
}
}).catch(err => {
uni.hideLoading();
this.isCreatingOrder = false;
});
},
wxPayment() {
@ -1051,6 +1112,93 @@
margin: 0 20rpx 0 0;
}
.commission-value {
width: 140rpx;
height: 50rpx;
border-bottom: 1px solid #ccc;
text-align: center;
font-size: 28rpx;
font-weight: normal;
line-height: 50rpx;
}
.commission-popup {
width: 620rpx;
padding: 44rpx 36rpx 34rpx;
box-sizing: border-box;
border-radius: 32rpx;
background: #fff;
box-shadow: 0 28rpx 70rpx rgba(0, 35, 28, 0.18);
}
.commission-popup-title {
color: #00231C;
font-size: 34rpx;
font-weight: 900;
text-align: center;
}
.commission-popup-desc {
margin-top: 12rpx;
color: #777;
font-size: 24rpx;
text-align: center;
}
.commission-popup-input {
display: flex;
align-items: center;
height: 88rpx;
margin-top: 34rpx;
padding: 0 26rpx;
border-radius: 24rpx;
background: #f6faf8;
border: 1rpx solid #e5efeb;
text {
margin-right: 12rpx;
color: #ff7043;
font-size: 34rpx;
font-weight: 900;
}
input {
flex: 1;
height: 88rpx;
min-height: 88rpx;
font-size: 34rpx;
font-weight: 800;
}
}
.commission-popup-actions {
display: flex;
margin-top: 34rpx;
gap: 18rpx;
}
.commission-popup-cancel,
.commission-popup-confirm {
flex: 1;
height: 76rpx;
border-radius: 999rpx;
font-size: 28rpx;
font-weight: 800;
line-height: 76rpx;
text-align: center;
}
.commission-popup-cancel {
background: #f3f6f4;
color: #777;
}
.commission-popup-confirm {
background: linear-gradient(90deg, #e3ff96, #a6ffea);
color: #00231C;
box-shadow: 0 12rpx 26rpx rgba(11, 155, 115, 0.12);
}
.check-input {
height: 70rpx;
width: 100%;
@ -1090,7 +1238,7 @@
height: 150rpx;
display: flex;
background: #fff;
z-index: 99;
z-index: 9999;
box-shadow: 0 -20rpx 30rpx rgba(0, 0, 0, 0.3);
}

Loading…
Cancel
Save