wangfukang 4 weeks ago
parent
commit
0795aa1f52
  1. 13
      package1/buyFood/buyFood.vue
  2. 41
      package1/ieBrowser/chat.vue
  3. 15
      package1/index/deliveryPersonList.vue
  4. 215
      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>
<view class="commission-input" v-if="selected === 'buzhiding'" @tap="openCommissionPopup"> <view class="commission-input" v-if="selected === 'buzhiding'" @tap="openCommissionPopup">
<text>佣金 </text> <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> <uni-icons type="right" size="12" color="#8b9993"></uni-icons>
</view> </view>
</view> </view>
@ -580,7 +580,7 @@
remark:'', remark:'',
remarkInputValue: '', remarkInputValue: '',
selected: 'buzhiding', selected: 'buzhiding',
customCommission: '0.1', customCommission: '',
commissionInputValue: '', commissionInputValue: '',
shopItem: {}, shopItem: {},
cartItems: [], cartItems: [],
@ -831,7 +831,7 @@
formatCommissionValue(value) { formatCommissionValue(value) {
let amount = parseFloat(value); let amount = parseFloat(value);
if (isNaN(amount) || amount < 0.1) { if (isNaN(amount) || amount < 0.1) {
return '0.1'; return '';
} }
amount = Math.floor(amount * 100) / 100; amount = Math.floor(amount * 100) / 100;
return amount.toFixed(2).replace(/\.?0+$/, ''); return amount.toFixed(2).replace(/\.?0+$/, '');
@ -876,6 +876,11 @@
}, },
confirmCommission() { confirmCommission() {
let commission = parseFloat(this.commissionInputValue); let commission = parseFloat(this.commissionInputValue);
if (isNaN(commission) || commission < 0.1) {
this.warnPopup = 'psyj';
this.$refs.warnPopup.open();
return;
}
if (commission > 200) { if (commission > 200) {
this.tui.toast('配送佣金不得超过200元'); this.tui.toast('配送佣金不得超过200元');
return; return;
@ -1001,7 +1006,6 @@
} }
if (this.isPaotui && this.selected === 'buzhiding' && !isJoiningFaceToFace) { if (this.isPaotui && this.selected === 'buzhiding' && !isJoiningFaceToFace) {
this.normalizeCustomCommission();
let comm = parseFloat(this.customCommission); let comm = parseFloat(this.customCommission);
if (isNaN(comm) || comm < 0.1) { if (isNaN(comm) || comm < 0.1) {
this.warnPopup = 'psyj'; this.warnPopup = 'psyj';
@ -1012,6 +1016,7 @@
this.tui.toast('配送佣金不得超过200元'); this.tui.toast('配送佣金不得超过200元');
return; return;
} }
this.normalizeCustomCommission();
} }
if (this.isPaotui && this.selected === 'zhiding' && !this.assignedWorker && !isJoiningFaceToFace) { if (this.isPaotui && this.selected === 'zhiding' && !this.assignedWorker && !isJoiningFaceToFace) {

41
package1/ieBrowser/chat.vue

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

15
package1/index/deliveryPersonList.vue

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

215
package1/order/orderDetail.vue

@ -635,7 +635,15 @@
</view> </view>
<!-- 评价弹出层 --> <!-- 评价弹出层 -->
<uni-popup ref="evaluatePopup" background-color="#fff"> <uni-popup ref="evaluatePopup" background-color="#fff">
<view class="evaluate-content" @tap="$refs.evaluatePopup.close()"> <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="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="evaluate-list" v-for="(item,index) in orderDetail.comments" :key="index">
<view class="eval-title"> <view class="eval-title">
<view class="eval-icon"> <view class="eval-icon">
@ -643,35 +651,36 @@
</view> </view>
<view class="eval-name"> <view class="eval-name">
<view class="name1"> <view class="name1">
{{item.createByName}} {{item.createByName || '微信用户'}}
</view> </view>
<view class="eval-time"> <view class="eval-time">
{{item.createTime}} {{formatTimeText(item.createTime)}}
</view>
</view> </view>
<view class="eval-target-tag" :class="{'worker': isWorkerEvaluate(item)}">
{{getEvaluateTargetText(item)}}
</view> </view>
</view> </view>
<view class="eval-content"> <view class="eval-content">
<view style="display: flex;height: 50rpx;line-height: 50rpx;font-size: 24rpx;"> <view class="eval-rate-row">
商品 <text>{{getEvaluateTargetText(item)}}</text>
<view style="padding: 12rpx 0 0 10rpx;"> <view class="eval-rate">
<uni-rate v-model="item.score" size="12" /> <uni-rate :value="Number(item.score || 0)" size="14" readonly />
</view> </view>
</view> </view>
<view class="eval-text"> <view class="eval-text">
{{item.remark}} {{item.remark || '暂无文字评价'}}
</view> </view>
<view class="eval-img"> <view class="eval-img" v-if="item.picture">
<img @tap="largeImg" :src="item.picture" alt=""> <img @tap.stop="previewImage(item.picture)" :src="item.picture" alt="">
</view> </view>
<view class="reply-card" :class="{'expanded': isExpanded}" <view class="reply-card" :class="{'expanded': isExpanded}"
v-for="(item1,index1) in item.comments" :key="index1"> v-for="(item1,index1) in item.comments" :key="index1">
<!-- 标题行商家回复 + 展开/收起按钮 -->
<view class="reply-header"> <view class="reply-header">
<!-- 回复内容区域动态类控制展开/折叠 -->
<view class="reply-content" :class="{ collapsed: !isExpanded, expanded: isExpanded }"> <view class="reply-content" :class="{ collapsed: !isExpanded, expanded: isExpanded }">
<text>{{item1.createByName}} : {{ item1.remark }}</text> <text>{{item1.createByName}} : {{ item1.remark }}</text>
</view> </view>
<view class="reply-expand-btn" @click="toggleReply"> <view class="reply-expand-btn" @tap.stop="toggleReply">
<text v-if="!isExpanded">展开</text> <text v-if="!isExpanded">展开</text>
<text v-else>收起</text> <text v-else>收起</text>
</view> </view>
@ -679,6 +688,7 @@
</view> </view>
</view> </view>
</view> </view>
</scroll-view>
</view> </view>
</uni-popup> </uni-popup>
<!-- 核销二维码弹出层 --> <!-- 核销二维码弹出层 -->
@ -969,7 +979,8 @@
assignWorkerSelectionKey: '', assignWorkerSelectionKey: '',
payCountdownText: '60:00', payCountdownText: '60:00',
payCountdownSeconds: 0, payCountdownSeconds: 0,
payCountdownTimer: null payCountdownTimer: null,
isExpanded: false
} }
}, },
computed: { computed: {
@ -1175,6 +1186,13 @@
const second = String(date.getSeconds()).padStart(2, '0'); const second = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hour}:${minute}:${second}`; 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) { previewImage(url) {
if (!url) return; if (!url) return;
uni.previewImage({ uni.previewImage({
@ -1361,6 +1379,9 @@
this.tui.toast("暂无评价"); this.tui.toast("暂无评价");
} }
}, },
toggleReply() {
this.isExpanded = !this.isExpanded;
},
orderStatus(item) { orderStatus(item) {
if (item.status == 0 || item.status == 10 || item.status == 2 || (item.status == 3 && item.deliveryType == 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) { 1) || (item.status == 3 && item.deliveryType == 2) || item.status == 4) {
@ -2231,7 +2252,13 @@
top: 0; top: 0;
left: 0; left: 0;
right: 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 { .order-detail-header-content {
@ -2239,6 +2266,7 @@
top: 190rpx; top: 190rpx;
left: 0; left: 0;
width: 100%; width: 100%;
z-index: 2;
} }
.content { .content {
@ -2248,12 +2276,13 @@
} }
.order-detail-content { .order-detail-content {
padding-top: 396rpx; padding-top: 430rpx;
box-sizing: border-box; box-sizing: border-box;
z-index: 1;
} }
.order-detail-content-address-long { .order-detail-content-address-long {
padding-top: 456rpx; padding-top: 490rpx;
} }
.title-sreach { .title-sreach {
@ -2425,8 +2454,10 @@
.order-status-card { .order-status-card {
background: background:
radial-gradient(circle at 94% 4%, rgba(255, 221, 176, 0.2) 0, rgba(255, 221, 176, 0) 170rpx), 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; border-radius: 36rpx;
position: relative;
z-index: 3;
} }
.goods-img { .goods-img {
@ -2886,6 +2917,48 @@
.evaluate-content { .evaluate-content {
background: linear-gradient(180deg, #ffffff 0%, #f7fffb 100%); 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 { .evaluate-list {
@ -3353,15 +3426,23 @@
margin-top: 40rpx; margin-top: 40rpx;
} }
.evaluate-list:first-child {
margin-top: 0;
}
.eval-title { .eval-title {
width: 100%; width: 100%;
height: 80rpx; min-height: 80rpx;
display: flex; display: flex;
align-items: center;
} }
.eval-icon { .eval-icon {
height: 80rpx; height: 80rpx;
width: 80rpx; width: 80rpx;
flex-shrink: 0;
border-radius: 50%;
overflow: hidden;
img { img {
width: 100%; width: 100%;
@ -3372,28 +3453,71 @@
.eval-name { .eval-name {
margin-left: 20rpx; margin-left: 20rpx;
flex: 1;
min-width: 0;
} }
.name1 { .name1 {
font-size: 28rpx; font-size: 28rpx;
line-height: 50rpx; line-height: 50rpx;
font-weight: 700; 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 { .eval-rate {
display: flex; display: flex;
margin: 20rpx 0 0 100rpx; margin-left: 14rpx;
height: 48rpx; padding-top: 4rpx;
line-height: 40rpx;
} }
.eval-content { .eval-content {
margin-left: 100rpx; margin: 22rpx 0 0 100rpx;
font-size: 28rpx; font-size: 28rpx;
color: #777; color: #777;
line-height: 48rpx; 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 { .eval-img {
display: flex; display: flex;
width: 100%; width: 100%;
@ -3401,11 +3525,52 @@
margin-top: 20rpx; margin-top: 20rpx;
img { img {
width: 100rpx; width: 132rpx;
height: 100rpx; height: 132rpx;
background-size: 100%; background-size: 100%;
margin-right: 20rpx; 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 { .car-close {

92
package1/order/orderEvaluate.vue

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

114
package1/planet/index.vue

@ -194,6 +194,17 @@
</view> </view>
</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 v-if="taskDrawerVisible" class="task-drawer-mask" @tap="taskDrawerVisible=false">
<view class="task-drawer" @tap.stop> <view class="task-drawer" @tap.stop>
<view class="drawer-handle"></view> <view class="drawer-handle"></view>
@ -349,6 +360,13 @@
data: {}, data: {},
receiving: false receiving: false
}, },
rankTopRewardModal: {
show: false,
data: {}
},
winningFallbackLoading: false,
winningReadMarked: {},
rankTopReminderReadMarked: false,
poolRuleVisible: false, poolRuleVisible: false,
guideVisible: false, guideVisible: false,
taskDrawerVisible: false, taskDrawerVisible: false,
@ -624,7 +642,10 @@
if (res.code == 200 && res.result) { if (res.code == 200 && res.result) {
this.home = res.result this.home = res.result
this.loadedOnce = true this.loadedOnce = true
this.showUnreadWinning() if (!this.showUnreadWinning()) {
this.loadUnreadWinningFallback()
}
this.showRankTopRewardIfNeeded()
this.showGuideTaskIfNeeded() this.showGuideTaskIfNeeded()
} else if (res.message) { } else if (res.message) {
this.tui.toast(res.message) this.tui.toast(res.message)
@ -674,14 +695,88 @@
}, },
showUnreadWinning() { showUnreadWinning() {
const win = this.home && this.home.unreadWinning const win = this.home && this.home.unreadWinning
return this.showWinningModal(win)
},
showWinningModal(win) {
const winnerId = this.getWinnerId(win) const winnerId = this.getWinnerId(win)
if (!win || !winnerId) return if (!win || !winnerId) return false
if (this.winningModal.show && this.getWinnerId(this.winningModal.data) === winnerId) return if (this.winningModal.show && this.getWinnerId(this.winningModal.data) === winnerId) return true
this.winningModal = { this.winningModal = {
show: true, show: true,
data: win, data: win,
receiving: false 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) { getWinnerId(win) {
if (!win) return '' if (!win) return ''
@ -697,6 +792,7 @@
} }
if (win.isReceived === 1) { if (win.isReceived === 1) {
this.winningModal.show = false this.winningModal.show = false
this.showRankTopRewardIfNeeded()
return return
} }
this.winningModal.receiving = true this.winningModal.receiving = true
@ -709,6 +805,7 @@
this.tui.toast(res.message, 1500, res.code == 200) this.tui.toast(res.message, 1500, res.code == 200)
if (res.code == 200) { if (res.code == 200) {
this.winningModal.show = false this.winningModal.show = false
this.showRankTopRewardIfNeeded()
this.loadHome(true) this.loadHome(true)
} }
}).catch(() => { }).catch(() => {
@ -2420,6 +2517,17 @@
animation: bounce 1s ease infinite; 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 { .win-title {
position: relative; position: relative;
margin-top: 24rpx; margin-top: 24rpx;

13
package1/runErrand/runErrand.vue

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

Loading…
Cancel
Save