wangfukang 3 weeks ago
parent
commit
0795aa1f52
  1. 13
      package1/buyFood/buyFood.vue
  2. 41
      package1/ieBrowser/chat.vue
  3. 15
      package1/index/deliveryPersonList.vue
  4. 261
      package1/order/orderDetail.vue
  5. 92
      package1/order/orderEvaluate.vue
  6. 114
      package1/planet/index.vue
  7. 13
      package1/runErrand/runErrand.vue

13
package1/buyFood/buyFood.vue

@ -133,7 +133,7 @@
</view>
<view class="commission-input" v-if="selected === 'buzhiding'" @tap="openCommissionPopup">
<text>佣金 </text>
<view class="commission-value">{{customCommission || '0.1'}}</view>
<view class="commission-value">{{customCommission || '请输入'}}</view>
<uni-icons type="right" size="12" color="#8b9993"></uni-icons>
</view>
</view>
@ -580,7 +580,7 @@
remark:'',
remarkInputValue: '',
selected: 'buzhiding',
customCommission: '0.1',
customCommission: '',
commissionInputValue: '',
shopItem: {},
cartItems: [],
@ -831,7 +831,7 @@
formatCommissionValue(value) {
let amount = parseFloat(value);
if (isNaN(amount) || amount < 0.1) {
return '0.1';
return '';
}
amount = Math.floor(amount * 100) / 100;
return amount.toFixed(2).replace(/\.?0+$/, '');
@ -876,6 +876,11 @@
},
confirmCommission() {
let commission = parseFloat(this.commissionInputValue);
if (isNaN(commission) || commission < 0.1) {
this.warnPopup = 'psyj';
this.$refs.warnPopup.open();
return;
}
if (commission > 200) {
this.tui.toast('配送佣金不得超过200元');
return;
@ -1001,7 +1006,6 @@
}
if (this.isPaotui && this.selected === 'buzhiding' && !isJoiningFaceToFace) {
this.normalizeCustomCommission();
let comm = parseFloat(this.customCommission);
if (isNaN(comm) || comm < 0.1) {
this.warnPopup = 'psyj';
@ -1012,6 +1016,7 @@
this.tui.toast('配送佣金不得超过200元');
return;
}
this.normalizeCustomCommission();
}
if (this.isPaotui && this.selected === 'zhiding' && !this.assignedWorker && !isJoiningFaceToFace) {

41
package1/ieBrowser/chat.vue

@ -1,5 +1,5 @@
<template>
<view class="room-page">
<view class="room-page" @tap="handleBlankTap">
<view class="glow glow-a"></view>
<view class="glow glow-b"></view>
<view class="nav" :style="{ paddingTop: menuButtonInfo.top + 'px' }">
@ -87,7 +87,7 @@
<view id="message-bottom-anchor" class="message-bottom-spacer" :style="{ height: bottomSafePadding }"></view>
</scroll-view>
<view class="presence-row" :style="{ bottom: presenceBottom }">
<view class="presence-row" :style="{ bottom: presenceBottom }" @tap.stop>
<view class="presence-chip quiz-chip" @tap="openQuiz">🎯 {{ quizButtonText }}</view>
<view class="presence-chip" v-for="item in presenceActions" :key="item" @tap="sendPresence(item)">
{{ item }}
@ -103,7 +103,7 @@
</view>
<view class="emoji-close-mask" v-if="showEmoji" @tap="closeEmoji"></view>
<view class="input-bar" :style="{ bottom: inputBarBottom }">
<view class="input-bar" :style="{ bottom: inputBarBottom }" @tap.stop>
<view class="tool-btn" @tap="toggleEmoji"></view>
<view class="tool-btn voice-toggle" @tap="toggleVoiceMode">{{ voiceMode ? '' : '🎙' }}</view>
<input class="input" v-if="!voiceMode" v-model="draft" :focus="inputFocus" hold-keyboard="true" :confirm-hold="true" confirm-type="send" :disabled="isBlocked" :placeholder="isBlocked ? '已加入黑名单,无法继续发送' : '轻轻说一句,或保持安静'"
@ -271,6 +271,7 @@
messagePage: 1,
messagePageSize: 20,
hasMoreMessages: true,
hasPeerReply: false,
loadingMessages: false,
scrollIntoView: '',
scrollAnimation: true,
@ -469,6 +470,20 @@
this.scrollToBottom(false)
}, 120)
},
handleBlankTap() {
this.closeInput()
},
closeInput() {
this.inputFocus = false
this.showEmoji = false
if (uni.hideKeyboard) uni.hideKeyboard()
if (this.keyboardHeight > 0) {
this.keyboardHeight = 0
this.$nextTick(() => {
this.scrollToBottom(false)
})
}
},
localMessageKey() {
return this.roomId ? 'ie_chat_local_messages_' + this.roomId : ''
},
@ -590,6 +605,7 @@
mediaFormat: item.mediaFormat,
poster: item.poster || item.thumbTempFilePath || '',
mine,
hasPeerReply: !!item.hasPeerReply,
pending: item.mediaAuditStatus === 1,
blocked: item.isBlocked === 1,
blockTip: item.auditTip || (item.isBlocked === 1 ? '内容未通过审核,请换一个更合适的内容' : ''),
@ -725,6 +741,7 @@
!(item.clientMsgId && exists.has(item.clientMsgId)))
this.mergeMessageStatus(latest)
if (!appended.length) return
this.rememberPeerReply(appended)
this.messages = this.messages.concat(appended)
this.scrollToBottom()
},
@ -738,6 +755,7 @@
local.blocked = !!remote.blocked
local.blockTip = remote.blockTip || (local.blocked ? '内容未通过审核,请换一个更合适的内容' : '')
local.mediaAuditStatus = remote.mediaAuditStatus || local.mediaAuditStatus || 0
if (remote.hasPeerReply) this.hasPeerReply = true
local.messageId = remote.messageId || local.messageId
local.poster = remote.poster || local.poster || ''
local.localOnly = false
@ -756,6 +774,10 @@
const records = Array.isArray(page) ? page : (page.records || [])
return records.map(item => this.normalizeMessage(item)).reverse()
},
rememberPeerReply(list) {
if (this.hasPeerReply) return
this.hasPeerReply = (list || []).some(item => item && (item.hasPeerReply || (!item.mine && item.messageType && !item.blocked)))
},
async loadLatestMessages() {
if (!this.roomId) return
this.messagePage = 1
@ -768,6 +790,7 @@
}
const page = await pageIeMessages(this.roomId, this.messagePage, this.messagePageSize)
const latest = this.normalizePage(page)
this.rememberPeerReply(latest)
if (!latest.length && this.messages.length) {
this.hasMoreMessages = false
return
@ -787,6 +810,7 @@
try {
const page = await pageIeMessages(this.roomId, nextPage, this.messagePageSize)
const older = this.normalizePage(page)
this.rememberPeerReply(older)
const exists = new Set(this.messages.map(item => item.messageId || item.clientMsgId))
const deduped = older.filter(item => !exists.has(item.messageId || item.clientMsgId))
this.messages = deduped.concat(this.messages)
@ -974,8 +998,12 @@
return true
},
needWaitReply() {
if (this.hasPeerReply) return false
const delivered = this.messages.filter(item => item && !item.blocked && item.messageType)
if (delivered.some(item => !item.mine)) return false
if (delivered.some(item => !item.mine)) {
this.hasPeerReply = true
return false
}
return delivered.filter(item => item.mine).length >= 3
},
async persistMessage(payload) {
@ -1005,6 +1033,7 @@
msg.mediaFormat = ack.mediaFormat || msg.mediaFormat
msg.poster = ack.poster || msg.poster || ''
msg.mediaAuditStatus = ack.mediaAuditStatus || msg.mediaAuditStatus || 0
if (ack.hasPeerReply) this.hasPeerReply = true
msg.blocked = ack.isBlocked === 1
msg.localOnly = false
msg.localState = ''
@ -1628,7 +1657,9 @@
this.applyAck(msg)
return
}
this.messages.push(this.normalizeMessage(msg))
const normalized = this.normalizeMessage(msg)
this.rememberPeerReply([normalized])
this.messages.push(normalized)
this.scrollToBottom()
})
ieSocket.onPresence((event) => {

15
package1/index/deliveryPersonList.vue

@ -25,15 +25,11 @@
@tap="searchShop('area',item.id)">{{item.title}}</view>
</view>
</view>
<view @tap="searchShop('baozhang')" class="sort-member" style="border-radius: 60rpx"
:style="{'background':baozhang==true?'rgba(166, 255, 234, 0.16)':'#fff','border':baozhang==true?'1px solid rgba(166, 255, 234, 1)':'0'}">
交易保障
</view>
<view @tap="searchShop('xiangtong')" class="sort-member" style="border-radius: 60rpx"
:style="{'background':xiangtong==true?'rgba(138, 255, 67, 0.16)':'#fff','border':xiangtong==true?'1px solid rgba(138, 255, 67, 1)':'0'}">
相同地址
</view>
<view class="sort-member" style="display: flex;padding-left: 10rpx;">
<view class="sort-member search-member" style="display: flex;padding-left: 10rpx;">
<uni-icons type="search" size="12"></uni-icons>
<input type="text" placeholder="搜索" style="height: 60rpx;line-height: 60rpx;" v-model="keyword"
@confirm="getShopList">
@ -117,7 +113,6 @@
markers: [], //
polyline: [], // 线线
menuButtonInfo: {},
baozhang: false,
xiangtong: false,
shopArea: [{
id: 0,
@ -285,7 +280,6 @@
shopAreaId: this.shopAreaId,
orderType: this.orderType,
putAreaId: this.putAreaId,
baozhang: this.baozhang,
xiangtong: this.xiangtong,
sortField: this.sortField,
regionId: this.regionId,
@ -357,8 +351,6 @@
} else {
this.sortField = 'score'
}
} else if (type == 'baozhang') {
this.baozhang = !this.baozhang
} else if (type == 'xiangtong') {
this.xiangtong = !this.xiangtong
}
@ -473,6 +465,11 @@
border-radius: 10rpx;
}
.search-member {
width: 44%;
box-sizing: border-box;
}
.sort-value {
width: 160rpx;
height: auto;

261
package1/order/orderDetail.vue

@ -635,50 +635,60 @@
</view>
<!-- 评价弹出层 -->
<uni-popup ref="evaluatePopup" background-color="#fff">
<view class="evaluate-content" @tap="$refs.evaluatePopup.close()">
<view class="evaluate-list" v-for="(item,index) in orderDetail.comments" :key="index">
<view class="eval-title">
<view class="eval-icon">
<img :src="item.createByIcon" alt="" />
</view>
<view class="eval-name">
<view class="name1">
{{item.createByName}}
</view>
<view class="eval-time">
{{item.createTime}}
</view>
</view>
<view class="evaluate-content" @tap.stop>
<view class="evaluate-popup-header">
<view>
<view class="evaluate-popup-title">我的评价</view>
<view class="evaluate-popup-subtitle"> {{orderDetail.comments ? orderDetail.comments.length : 0}} 条评价</view>
</view>
<view class="eval-content">
<view style="display: flex;height: 50rpx;line-height: 50rpx;font-size: 24rpx;">
商品
<view style="padding: 12rpx 0 0 10rpx;">
<uni-rate v-model="item.score" size="12" />
<view class="evaluate-popup-close" @tap="$refs.evaluatePopup.close()">关闭</view>
</view>
<scroll-view scroll-y class="evaluate-scroll" @touchmove.stop>
<view class="evaluate-list" v-for="(item,index) in orderDetail.comments" :key="index">
<view class="eval-title">
<view class="eval-icon">
<img :src="item.createByIcon" alt="" />
</view>
<view class="eval-name">
<view class="name1">
{{item.createByName || '微信用户'}}
</view>
<view class="eval-time">
{{formatTimeText(item.createTime)}}
</view>
</view>
<view class="eval-target-tag" :class="{'worker': isWorkerEvaluate(item)}">
{{getEvaluateTargetText(item)}}
</view>
</view>
<view class="eval-text">
{{item.remark}}
</view>
<view class="eval-img">
<img @tap="largeImg" :src="item.picture" alt="">
</view>
<view class="reply-card" :class="{'expanded': isExpanded}"
v-for="(item1,index1) in item.comments" :key="index1">
<!-- 标题行商家回复 + 展开/收起按钮 -->
<view class="reply-header">
<!-- 回复内容区域动态类控制展开/折叠 -->
<view class="reply-content" :class="{ collapsed: !isExpanded, expanded: isExpanded }">
<text>{{item1.createByName}} : {{ item1.remark }}</text>
<view class="eval-content">
<view class="eval-rate-row">
<text>{{getEvaluateTargetText(item)}}</text>
<view class="eval-rate">
<uni-rate :value="Number(item.score || 0)" size="14" readonly />
</view>
<view class="reply-expand-btn" @click="toggleReply">
<text v-if="!isExpanded">展开</text>
<text v-else>收起</text>
</view>
<view class="eval-text">
{{item.remark || '暂无文字评价'}}
</view>
<view class="eval-img" v-if="item.picture">
<img @tap.stop="previewImage(item.picture)" :src="item.picture" alt="">
</view>
<view class="reply-card" :class="{'expanded': isExpanded}"
v-for="(item1,index1) in item.comments" :key="index1">
<view class="reply-header">
<view class="reply-content" :class="{ collapsed: !isExpanded, expanded: isExpanded }">
<text>{{item1.createByName}} : {{ item1.remark }}</text>
</view>
<view class="reply-expand-btn" @tap.stop="toggleReply">
<text v-if="!isExpanded">展开</text>
<text v-else>收起</text>
</view>
</view>
</view>
</view>
</view>
</view>
</scroll-view>
</view>
</uni-popup>
<!-- 核销二维码弹出层 -->
@ -969,7 +979,8 @@
assignWorkerSelectionKey: '',
payCountdownText: '60:00',
payCountdownSeconds: 0,
payCountdownTimer: null
payCountdownTimer: null,
isExpanded: false
}
},
computed: {
@ -1175,6 +1186,13 @@
const second = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
},
isWorkerEvaluate(item) {
const shopId = item && item.shopId ? String(item.shopId) : '';
return shopId.charAt(0).toUpperCase() == 'W';
},
getEvaluateTargetText(item) {
return this.isWorkerEvaluate(item) ? '配送员评价' : '商家评价';
},
previewImage(url) {
if (!url) return;
uni.previewImage({
@ -1361,6 +1379,9 @@
this.tui.toast("暂无评价");
}
},
toggleReply() {
this.isExpanded = !this.isExpanded;
},
orderStatus(item) {
if (item.status == 0 || item.status == 10 || item.status == 2 || (item.status == 3 && item.deliveryType ==
1) || (item.status == 3 && item.deliveryType == 2) || item.status == 4) {
@ -2231,7 +2252,13 @@
top: 0;
left: 0;
right: 0;
z-index: 50;
height: 430rpx;
z-index: 999;
background:
radial-gradient(circle at 12% 8%, rgba(166, 255, 234, 0.48) 0, rgba(166, 255, 234, 0) 260rpx),
radial-gradient(circle at 92% 18%, rgba(255, 221, 176, 0.26) 0, rgba(255, 221, 176, 0) 300rpx),
linear-gradient(180deg, #ecfff7 0%, #f7fbf6 100%);
overflow: visible;
}
.order-detail-header-content {
@ -2239,6 +2266,7 @@
top: 190rpx;
left: 0;
width: 100%;
z-index: 2;
}
.content {
@ -2248,12 +2276,13 @@
}
.order-detail-content {
padding-top: 396rpx;
padding-top: 430rpx;
box-sizing: border-box;
z-index: 1;
}
.order-detail-content-address-long {
padding-top: 456rpx;
padding-top: 490rpx;
}
.title-sreach {
@ -2425,8 +2454,10 @@
.order-status-card {
background:
radial-gradient(circle at 94% 4%, rgba(255, 221, 176, 0.2) 0, rgba(255, 221, 176, 0) 170rpx),
linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(244, 255, 251, 0.96) 100%);
linear-gradient(135deg, #ffffff 0%, #f4fffb 100%);
border-radius: 36rpx;
position: relative;
z-index: 3;
}
.goods-img {
@ -2886,6 +2917,48 @@
.evaluate-content {
background: linear-gradient(180deg, #ffffff 0%, #f7fffb 100%);
width: 100vw;
max-height: 78vh;
padding: 34rpx 28rpx calc(28rpx + env(safe-area-inset-bottom));
box-sizing: border-box;
overflow: hidden;
}
.evaluate-popup-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 8rpx 24rpx;
}
.evaluate-popup-title {
color: #243f38;
font-size: 34rpx;
font-weight: 900;
line-height: 48rpx;
}
.evaluate-popup-subtitle {
margin-top: 6rpx;
color: #7b8883;
font-size: 24rpx;
line-height: 34rpx;
}
.evaluate-popup-close {
height: 56rpx;
padding: 0 24rpx;
border-radius: 999rpx;
background: rgba(0, 35, 28, 0.06);
color: #243f38;
font-size: 24rpx;
font-weight: 700;
line-height: 56rpx;
}
.evaluate-scroll {
max-height: 62vh;
overflow: hidden;
}
.evaluate-list {
@ -3353,15 +3426,23 @@
margin-top: 40rpx;
}
.evaluate-list:first-child {
margin-top: 0;
}
.eval-title {
width: 100%;
height: 80rpx;
min-height: 80rpx;
display: flex;
align-items: center;
}
.eval-icon {
height: 80rpx;
width: 80rpx;
flex-shrink: 0;
border-radius: 50%;
overflow: hidden;
img {
width: 100%;
@ -3372,28 +3453,71 @@
.eval-name {
margin-left: 20rpx;
flex: 1;
min-width: 0;
}
.name1 {
font-size: 28rpx;
line-height: 50rpx;
font-weight: 700;
color: #243f38;
}
.eval-time {
color: #9aa6a2;
font-size: 22rpx;
line-height: 32rpx;
}
.eval-target-tag {
flex-shrink: 0;
height: 44rpx;
padding: 0 18rpx;
border-radius: 999rpx;
background: #f0fffa;
color: #0f806d;
font-size: 22rpx;
font-weight: 700;
line-height: 44rpx;
}
.eval-target-tag.worker {
background: #fff7e8;
color: #d87800;
}
.eval-rate {
display: flex;
margin: 20rpx 0 0 100rpx;
height: 48rpx;
line-height: 40rpx;
margin-left: 14rpx;
padding-top: 4rpx;
}
.eval-content {
margin-left: 100rpx;
margin: 22rpx 0 0 100rpx;
font-size: 28rpx;
color: #777;
line-height: 48rpx;
}
.eval-rate-row {
display: flex;
align-items: center;
min-height: 50rpx;
color: #243f38;
font-size: 24rpx;
font-weight: 700;
line-height: 50rpx;
}
.eval-text {
margin-top: 10rpx;
color: #4f5e59;
font-size: 26rpx;
line-height: 40rpx;
word-break: break-all;
}
.eval-img {
display: flex;
width: 100%;
@ -3401,13 +3525,54 @@
margin-top: 20rpx;
img {
width: 100rpx;
height: 100rpx;
width: 132rpx;
height: 132rpx;
background-size: 100%;
margin-right: 20rpx;
border-radius: 18rpx;
object-fit: cover;
}
}
.reply-card {
margin-top: 18rpx;
padding: 18rpx 20rpx;
border-radius: 18rpx;
background: rgba(255, 255, 255, 0.78);
border: 1rpx solid rgba(0, 35, 28, 0.06);
}
.reply-header {
display: flex;
align-items: flex-start;
}
.reply-content {
flex: 1;
min-width: 0;
color: #65736f;
font-size: 24rpx;
line-height: 36rpx;
word-break: break-all;
}
.reply-content.collapsed {
display: -webkit-box;
overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.reply-expand-btn {
flex-shrink: 0;
margin-left: 18rpx;
color: #0f806d;
font-size: 24rpx;
font-weight: 700;
line-height: 36rpx;
}
.car-close {
width: 60rpx;
height: 60rpx;

92
package1/order/orderEvaluate.vue

@ -16,7 +16,7 @@
<view style="width: 100%;line-height: 70rpx;font-size: 28rpx;font-weight: 700;">
{{shopData.shopName}}
</view>
<view v-for="(item,index) in shopData.goodsList" :key="index" style="display: flex;padding: 20rpx;background: rgba(247, 248, 248, 0.6);border-radius: 20rpx;">
<view v-for="(item,index) in shopData.goodsList" :key="index" style="display: flex;padding: 16rpx;background: rgba(247, 248, 248, 0.6);border-radius: 20rpx;">
<view class="goods-img">
<img :src="item.productPicture" alt="">
</view>
@ -50,7 +50,7 @@
</view>
<view class="eval-num">
<view class="eval-num1">
您对本次消费体验还满意吗
您对本单商家服务还满意吗
</view>
<view style="display: flex;">
<view v-for="(item,index) in evalNumList" :key="index" @tap="shopEvaluateNum = item.index" style="flex: 1;text-align: center;font-weight: 700;">
@ -61,19 +61,19 @@
</view>
</view>
<view class="eval-num" style="border: none;">
<textarea name="" v-model="shopRemark" id="" cols="30" rows="10" placeholder="有什么想说的吗?可以写下来,提交给我们" style="width: 100%;font-size: 28rpx;padding: 30rpx;height: 200rpx;"></textarea>
<textarea name="" v-model="shopRemark" id="" cols="30" rows="10" placeholder="有什么想说的吗?可以写下来,提交给我们" style="width: 100%;font-size: 26rpx;padding: 24rpx 30rpx;height: 150rpx;"></textarea>
</view>
<view class="eval-num" style="border: none;padding: 0 30rpx 20rpx;display: flex;border-bottom: 1px solid #eee;">
<view class="eval-num" style="border: none;padding: 0 30rpx 16rpx;display: flex;border-bottom: 1px solid #eee;">
<view class="upload-img" @tap="pictureAdd('shop')"
style="background: rgba(247, 248, 248, 0.6);text-align: center;line-height: 160rpx;">
style="background: rgba(247, 248, 248, 0.6);text-align: center;line-height: 120rpx;">
<uni-icons type="camera" size="28" color="#777"></uni-icons>
</view>
<view style="flex: 1;display: flex;">
<view v-if="shopPicture !=''"
:key="index" style="width: 160rpx;height: 160rpx;margin-left: 20rpx;">
:key="index" style="width: 120rpx;height: 120rpx;margin-left: 20rpx;">
<img :src="shopPicture" alt="" class="upload-img">
</view>
<view style="height: 160rpx;line-height: 40rpx;padding: 40rpx 0 0 20rpx;color: #777;">
<view style="height: 120rpx;line-height: 36rpx;padding: 24rpx 0 0 20rpx;color: #777;">
发图/发视频能更有效地帮助他人哦~
</view>
</view>
@ -81,7 +81,7 @@
<view v-if="shopData.deliveryType == 1">
<view class="eval-num">
<view class="eval-num1">
您对本次配送人员还满意吗
您对本单配送服务还满意吗
</view>
<view style="display: flex;">
<view v-for="(item,index) in evalNumList" :key="index" @tap="manEvaluateNum = item.index" style="flex: 1;text-align: center;font-weight: 700;">
@ -92,19 +92,19 @@
</view>
</view>
<view class="eval-num" style="border: none;">
<textarea name="" v-model="manRemark" id="" cols="30" rows="10" placeholder="有什么想说的吗?可以写下来,提交给我们" style="width: 100%;font-size: 28rpx;padding: 30rpx;height: 200rpx;"></textarea>
<textarea name="" v-model="manRemark" id="" cols="30" rows="10" placeholder="有什么想说的吗?可以写下来,提交给我们" style="width: 100%;font-size: 26rpx;padding: 24rpx 30rpx;height: 150rpx;"></textarea>
</view>
<view class="eval-num" style="border: none;padding: 0 30rpx;display: flex;">
<view class="upload-img" @tap="pictureAdd('man')"
style="background: rgba(247, 248, 248, 0.6);text-align: center;line-height: 160rpx;">
style="background: rgba(247, 248, 248, 0.6);text-align: center;line-height: 120rpx;">
<uni-icons type="camera" size="28" color="#777"></uni-icons>
</view>
<view style="flex: 1;display: flex;">
<view v-if="manPicture !=''"
:key="index" style="width: 160rpx;height: 160rpx;margin-left: 20rpx;">
:key="index" style="width: 120rpx;height: 120rpx;margin-left: 20rpx;">
<img :src="manPicture" alt="" class="upload-img">
</view>
<view style="height: 160rpx;line-height: 40rpx;padding: 40rpx 0 0 20rpx;color: #777;">
<view style="height: 120rpx;line-height: 36rpx;padding: 24rpx 0 0 20rpx;color: #777;">
发图/发视频能更有效地帮助他人哦~
</view>
</view>
@ -141,8 +141,8 @@
return {
selected:'niming',
menuButtonInfo: {},
shopEvaluateNum:5,
manEvaluateNum:5,
shopEvaluateNum:0,
manEvaluateNum:0,
shopRemark:'',
manRemark:'',
shopPicture:'',
@ -200,6 +200,14 @@
},
submit(){
let that = this;
if(!this.shopEvaluateNum){
that.tui.toast("请选择商家评分");
return;
}
if(this.shopData.deliveryType == 1 && !this.manEvaluateNum){
that.tui.toast("请选择配送评分");
return;
}
let data = [{ //
parentId:'',
leve:0,
@ -354,18 +362,20 @@
-webkit-overflow-scrolling: touch;
position: absolute;
top: 200rpx;
bottom: 0;
left: 2.5%;
padding-bottom: 20rpx;
}
.box1 {
width: 100%;
margin: 0 auto 20rpx;
margin: 0 auto 14rpx;
background: #fff;
border-radius: 20rpx;
padding: 20rpx;
padding: 16rpx;
}
.goods-img {
width: 160rpx;
height: 160rpx;
width: 128rpx;
height: 128rpx;
position: relative;
img {
@ -376,17 +386,17 @@
}
.goods-content {
flex: 1;
padding-left: 20rpx;
padding-left: 16rpx;
}
.goods-name {
font-size: 32rpx;
font-size: 28rpx;
font-weight: 900;
}
.goods-content-center {
display: flex;
margin: 16rpx 0;
margin: 10rpx 0;
color: #777;
}
.goods-deal1 {
@ -394,7 +404,7 @@
}
.goods-content-bottom {
display: flex;
line-height: 56rpx;
line-height: 44rpx;
color: #777;
}
.pintuan-left-price {
@ -404,13 +414,13 @@
color: #000;
}
.eval-img{
width: 92rpx;
height: 92rpx;
width: 72rpx;
height: 72rpx;
background-size: 100%;
}
.eval-title{
height: 108rpx;
font-size: 28rpx;
height: 88rpx;
font-size: 26rpx;
text-align: center;
background: rgba(235, 255, 243, 1);
border-top-left-radius: 20rpx;
@ -419,7 +429,7 @@
border-left: 1px solid rgba(178, 255, 208, 1);
border-right: 1px solid rgba(178, 255, 208, 1);
z-index: 77;
line-height: 88rpx;
line-height: 72rpx;
}
.eval-name{
margin-top: -20rpx;
@ -431,30 +441,30 @@
background: #fff;
}
.eval-name1{
height: 108rpx;
font-size: 40rpx;
height: 88rpx;
font-size: 34rpx;
font-weight: 700;
text-align: center;
border-bottom: 1px solid #eee;
border-top-left-radius: 20rpx;
border-top-right-radius: 20rpx;
line-height: 108rpx;
line-height: 88rpx;
overflow: hidden;
display: block;
}
.eval-num{
padding-bottom: 30rpx;
padding-bottom: 20rpx;
border-bottom: 1px solid #eee;
}
.eval-num1{
height: 40rpx;
font-size: 28rpx;
margin: 30rpx;
height: 36rpx;
font-size: 26rpx;
margin: 22rpx 30rpx;
font-weight: 700;
}
.upload-img {
width: 160rpx;
height: 160rpx;
width: 120rpx;
height: 120rpx;
}
.radio-check {
background: linear-gradient(90deg, #e3ff96, #a6ffea);
@ -474,18 +484,18 @@
}
.bottom-btn{
width: 95%;
height: 100rpx;
line-height: 100rpx;
height: 84rpx;
line-height: 84rpx;
text-align: center;
margin: 22rpx auto;
margin: 16rpx auto;
border-radius: 100rpx;
background: linear-gradient(90deg, rgba(227, 255, 150, 1), rgba(166, 255, 234, 1));
font-size: 32rpx;
font-size: 30rpx;
font-weight: 700;
}
.bottom{
overflow: hidden;
height: 152rpx;
height: 116rpx;
background:#fff;
}
</style>

114
package1/planet/index.vue

@ -194,6 +194,17 @@
</view>
</view>
<view v-if="rankTopRewardModal.show" class="win-mask" @tap.stop>
<view class="win-card rank-reward-card" @tap.stop>
<view class="win-burst"></view>
<view class="win-medal rank-reward-medal">TOP</view>
<view class="win-title">学院排位赛获奖啦</view>
<view class="win-sub">{{rankTopRewardModal.data.title || '学院排位赛荣耀榜奖励'}}</view>
<view class="win-tip">奖励已发放到账户余额继续为学院冲榜吧</view>
<view class="win-btn" @tap.stop="closeRankTopReward">知道了</view>
</view>
</view>
<view v-if="taskDrawerVisible" class="task-drawer-mask" @tap="taskDrawerVisible=false">
<view class="task-drawer" @tap.stop>
<view class="drawer-handle"></view>
@ -349,6 +360,13 @@
data: {},
receiving: false
},
rankTopRewardModal: {
show: false,
data: {}
},
winningFallbackLoading: false,
winningReadMarked: {},
rankTopReminderReadMarked: false,
poolRuleVisible: false,
guideVisible: false,
taskDrawerVisible: false,
@ -624,7 +642,10 @@
if (res.code == 200 && res.result) {
this.home = res.result
this.loadedOnce = true
this.showUnreadWinning()
if (!this.showUnreadWinning()) {
this.loadUnreadWinningFallback()
}
this.showRankTopRewardIfNeeded()
this.showGuideTaskIfNeeded()
} else if (res.message) {
this.tui.toast(res.message)
@ -674,14 +695,88 @@
},
showUnreadWinning() {
const win = this.home && this.home.unreadWinning
return this.showWinningModal(win)
},
showWinningModal(win) {
const winnerId = this.getWinnerId(win)
if (!win || !winnerId) return
if (this.winningModal.show && this.getWinnerId(this.winningModal.data) === winnerId) return
if (!win || !winnerId) return false
if (this.winningModal.show && this.getWinnerId(this.winningModal.data) === winnerId) return true
this.winningModal = {
show: true,
data: win,
receiving: false
}
this.markWinningRead(win)
return true
},
loadUnreadWinningFallback() {
if (this.winningFallbackLoading || this.winningModal.show) return
this.winningFallbackLoading = true
this.tui.request('/app/planet/draw/myWinning', 'POST', {
userId: this.userId,
regionId: this.regionId
}, false, false, true).then((res) => {
this.winningFallbackLoading = false
if (res.code != 200) return
const list = Array.isArray(res.result) ? res.result : []
for (let i = 0; i < list.length; i++) {
const item = list[i]
if (this.getWinnerId(item) && Number(item.isRead || 0) !== 1) {
this.showWinningModal(item)
return
}
}
}).catch(() => {
this.winningFallbackLoading = false
})
},
markWinningRead(win) {
const winnerId = this.getWinnerId(win)
if (!winnerId || Number((win && win.isRead) || 0) === 1 || this.winningReadMarked[winnerId]) return
this.winningReadMarked[winnerId] = true
this.tui.request('/app/planet/draw/read', 'POST', {
userId: this.userId,
regionId: this.regionId,
winnerId
}, false, false, true).then((res) => {
if (res.code == 200) {
win.isRead = 1
if (this.home && this.home.unreadWinning && this.getWinnerId(this.home.unreadWinning) === winnerId) {
this.home.unreadWinning.isRead = 1
}
} else {
this.winningReadMarked[winnerId] = false
}
}).catch(() => {
this.winningReadMarked[winnerId] = false
})
},
showRankTopRewardIfNeeded() {
const reminders = (this.home && this.home.homeReminders) || {}
const reward = reminders.planetRankTop
if (!reward || this.rankTopRewardModal.show || this.rankTopReminderReadMarked) return false
if (this.winningModal.show) return false
this.rankTopRewardModal = {
show: true,
data: reward
}
this.markRankTopRewardRead()
return true
},
closeRankTopReward() {
this.rankTopRewardModal.show = false
},
markRankTopRewardRead() {
if (this.rankTopReminderReadMarked) return
this.rankTopReminderReadMarked = true
this.tui.request('/app/planet/rankTop/read', 'POST', {
userId: this.userId,
regionId: this.regionId
}, false, false, true).then((res) => {
if (res.code != 200) this.rankTopReminderReadMarked = false
}).catch(() => {
this.rankTopReminderReadMarked = false
})
},
getWinnerId(win) {
if (!win) return ''
@ -697,6 +792,7 @@
}
if (win.isReceived === 1) {
this.winningModal.show = false
this.showRankTopRewardIfNeeded()
return
}
this.winningModal.receiving = true
@ -709,6 +805,7 @@
this.tui.toast(res.message, 1500, res.code == 200)
if (res.code == 200) {
this.winningModal.show = false
this.showRankTopRewardIfNeeded()
this.loadHome(true)
}
}).catch(() => {
@ -2420,6 +2517,17 @@
animation: bounce 1s ease infinite;
}
.rank-reward-card {
background: linear-gradient(155deg, rgba(255,255,255,0.96), rgba(232,246,255,0.9) 54%, rgba(244,255,250,0.9));
box-shadow: 0 38rpx 90rpx rgba(79,183,255,0.22);
}
.rank-reward-medal {
background: linear-gradient(145deg, #E8F6FF, #4FB7FF);
color: #0B6D9F;
box-shadow: inset -12rpx -16rpx 28rpx rgba(11,109,159,0.12), 0 22rpx 48rpx rgba(79,183,255,0.26);
}
.win-title {
position: relative;
margin-top: 24rpx;

13
package1/runErrand/runErrand.vue

@ -118,7 +118,7 @@
</view>
<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>
<view class="commission-value">{{customCommission || '0.1'}}</view>
<view class="commission-value">{{customCommission || '请输入'}}</view>
<uni-icons type="right" size="12" color="#999"></uni-icons>
</view>
</view>
@ -401,7 +401,7 @@
menuButtonInfo: {},
selectedWorker:'buzhiding',
assignedWorker:null,
customCommission:'0.1',
customCommission:'',
commissionInputValue: '',
remarkInputValue: '',
shopArea: [],
@ -509,7 +509,7 @@
formatCommissionValue(value) {
let amount = parseFloat(value);
if (isNaN(amount) || amount < 0.1) {
return '0.1';
return '';
}
amount = Math.floor(amount * 100) / 100;
return amount.toFixed(2).replace(/\.?0+$/, '');
@ -536,6 +536,11 @@
},
confirmCommission() {
let commission = parseFloat(this.commissionInputValue);
if (isNaN(commission) || commission < 0.1) {
this.warnPopup = 'psyj';
this.$refs.warnPopup.open();
return;
}
if (commission > 200) {
this.tui.toast('配送佣金不得超过200元');
return;
@ -892,7 +897,6 @@
return;
}
if (this.selectedWorker === 'buzhiding') {
this.customCommission = this.formatCommissionValue(this.customCommission);
let comm = parseFloat(this.customCommission);
if (isNaN(comm) || comm < 0.1) {
this.warnPopup = 'psyj';
@ -903,6 +907,7 @@
this.tui.toast('配送佣金不得超过200元');
return;
}
this.customCommission = this.formatCommissionValue(this.customCommission);
}
if (this.selectedWorker === 'zhiding' && !this.assignedWorker) {
this.warnPopup = 'psy';

Loading…
Cancel
Save