|
|
@@ -168,7 +168,8 @@
|
|
|
<view>
|
|
|
<text :class="isFreePt ? 'delivery-price-free' : 'delivery-price-normal'">¥{{ form.sendCost }}</text>
|
|
|
<text v-if="isFreePt" class="free-delivery-tag">¥0</text>
|
|
|
- <text class="delivery-policy-link" @click="showDeliveryPolicyModal">免运费条件</text>
|
|
|
+ <!-- 展示相对当前订单最接近的一条免运费条件,点击仍可看全部 -->
|
|
|
+ <text class="delivery-policy-link" @click="showDeliveryPolicyModal">{{ nearestDeliveryPolicyText }}</text>
|
|
|
</view>
|
|
|
</tui-list-cell>
|
|
|
|
|
|
@@ -539,6 +540,65 @@ export default {
|
|
|
|
|
|
return false
|
|
|
},
|
|
|
+ /**
|
|
|
+ * 跑腿费旁展示文案:相对当前扎数/金额/距离,选一条最接近的免运费条件
|
|
|
+ * 已满足优先;距离可达时按差额最小;都超距则选公里门槛最接近的
|
|
|
+ */
|
|
|
+ nearestDeliveryPolicyText() {
|
|
|
+ const method = this.currentShMethod
|
|
|
+ let rules = method && method.reduceRules
|
|
|
+ if (typeof rules === "string") {
|
|
|
+ try {
|
|
|
+ rules = JSON.parse(rules)
|
|
|
+ } catch (e) {
|
|
|
+ rules = []
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!Array.isArray(rules) || rules.length === 0) {
|
|
|
+ return "免运费条件"
|
|
|
+ }
|
|
|
+
|
|
|
+ const flowerCount = Number(this.allCountFun.bigLength) || 0
|
|
|
+ const flowerPrice = Number(this.allPriceFun) || 0
|
|
|
+ const distanceInMeters = Number(this.showDistance) || 0
|
|
|
+
|
|
|
+ let bestText = ""
|
|
|
+ let bestScore = Infinity
|
|
|
+
|
|
|
+ rules.forEach(rule => {
|
|
|
+ const meetNum = Number(rule.meetNum) || 0
|
|
|
+ const meetAmount = Number(rule.meetAmount) || 0
|
|
|
+ const freeKm = Number(rule.freeKm) || 0
|
|
|
+ const freeKmInMeters = freeKm * 1000
|
|
|
+ const text = this.formatReduceRuleText(rule)
|
|
|
+ if (!text) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ const numGap = Math.max(0, meetNum - flowerCount)
|
|
|
+ const amountGap = Math.max(0, meetAmount - flowerPrice)
|
|
|
+ const distanceOk = freeKmInMeters > 0 && distanceInMeters <= freeKmInMeters
|
|
|
+
|
|
|
+ let score = 0
|
|
|
+ if (numGap === 0 && amountGap === 0 && distanceOk) {
|
|
|
+ // 已满足该规则,最优先展示
|
|
|
+ score = 0
|
|
|
+ } else if (distanceOk || freeKmInMeters <= 0) {
|
|
|
+ // 距离可达:金额差 + 扎数差(1 扎按 50 元折算,便于同量纲比较接近程度)
|
|
|
+ score = 1 + amountGap + numGap * 50
|
|
|
+ } else {
|
|
|
+ // 距离超限:排在可达规则之后,按超出米数再比差额
|
|
|
+ score = 1000000 + (distanceInMeters - freeKmInMeters) + amountGap + numGap * 50
|
|
|
+ }
|
|
|
+
|
|
|
+ if (score < bestScore) {
|
|
|
+ bestScore = score
|
|
|
+ bestText = text
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ return bestText || "免运费条件"
|
|
|
+ },
|
|
|
/**
|
|
|
* 计算总金额
|
|
|
* @returns {number}
|
|
|
@@ -640,6 +700,32 @@ export default {
|
|
|
uni.showToast({ title: '获取自定义运费失败', icon: 'none' })
|
|
|
})
|
|
|
},
|
|
|
+ /**
|
|
|
+ * 将单条满减规则格式化为提示文案
|
|
|
+ * @param {Object} rule - meetNum/meetAmount/freeKm
|
|
|
+ * @returns {string}
|
|
|
+ */
|
|
|
+ formatReduceRuleText(rule) {
|
|
|
+ if (!rule) {
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+ const meetNum = Number(rule.meetNum) || 0
|
|
|
+ const meetAmount = Number(rule.meetAmount) || 0
|
|
|
+ const freeKm = Number(rule.freeKm) || 0
|
|
|
+ if (meetNum > 0 && meetAmount > 0) {
|
|
|
+ return `满${meetNum}扎${meetAmount}元,${freeKm}公里免运费`
|
|
|
+ }
|
|
|
+ if (meetNum > 0) {
|
|
|
+ return `满${meetNum}扎,${freeKm}公里内免运费`
|
|
|
+ }
|
|
|
+ if (meetAmount > 0) {
|
|
|
+ return `满${meetAmount}元,${freeKm}公里内免运费`
|
|
|
+ }
|
|
|
+ if (freeKm > 0) {
|
|
|
+ return `${freeKm}公里内免跑腿费`
|
|
|
+ }
|
|
|
+ return ""
|
|
|
+ },
|
|
|
// 展示包配送政策弹窗
|
|
|
showDeliveryPolicyModal() {
|
|
|
this.deliveryPolicyList = []
|
|
|
@@ -655,20 +741,7 @@ export default {
|
|
|
}
|
|
|
if (Array.isArray(rules) && rules.length > 0) {
|
|
|
rules.forEach(rule => {
|
|
|
- const meetNum = Number(rule.meetNum) || 0
|
|
|
- const meetAmount = Number(rule.meetAmount) || 0
|
|
|
- const freeKm = Number(rule.freeKm) || 0
|
|
|
-
|
|
|
- let text = ''
|
|
|
- if (meetNum > 0 && meetAmount > 0) {
|
|
|
- text = `满${meetNum}扎和${meetAmount}元,${freeKm}公里内免跑腿费`
|
|
|
- } else if (meetNum > 0) {
|
|
|
- text = `满${meetNum}扎,${freeKm}公里内免跑腿费`
|
|
|
- } else if (meetAmount > 0) {
|
|
|
- text = `满${meetAmount}元,${freeKm}公里内免跑腿费`
|
|
|
- } else if (freeKm > 0) {
|
|
|
- text = `${freeKm}公里内免跑腿费`
|
|
|
- }
|
|
|
+ const text = this.formatReduceRuleText(rule)
|
|
|
if (text) {
|
|
|
this.deliveryPolicyList.push(text)
|
|
|
}
|
|
|
@@ -1586,7 +1659,7 @@ export default {
|
|
|
|
|
|
.delivery-policy-link {
|
|
|
color: rgb(201, 52, 52);
|
|
|
- font-size: 30upx;
|
|
|
+ font-size: 28upx;
|
|
|
margin-left: 20upx;
|
|
|
font-weight: bold;
|
|
|
text-decoration: underline;
|