|
|
@@ -169,7 +169,7 @@
|
|
|
<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">{{ nearestDeliveryPolicyText }}</text>
|
|
|
+ <text v-if="!isFreePt" class="delivery-policy-link" @click="showDeliveryPolicyModal">{{ nearestDeliveryPolicyText }}</text>
|
|
|
</view>
|
|
|
</tui-list-cell>
|
|
|
|
|
|
@@ -541,8 +541,9 @@ export default {
|
|
|
return false
|
|
|
},
|
|
|
/**
|
|
|
- * 跑腿费旁展示文案:相对当前扎数/金额/距离,选一条最接近的免运费条件
|
|
|
- * 已满足优先;距离可达时按差额最小;都超距则选公里门槛最接近的
|
|
|
+ * 跑腿费旁简短提示:筛出最接近规则后,只展示尚未满足的满扎/满额
|
|
|
+ * 已满足的条件不写;公里已在筛选范围内,不写「x公里内」,统一用「免运费」
|
|
|
+ * 完整规则仍在点击弹框中展示
|
|
|
*/
|
|
|
nearestDeliveryPolicyText() {
|
|
|
const method = this.currentShMethod
|
|
|
@@ -562,7 +563,7 @@ export default {
|
|
|
const flowerPrice = Number(this.allPriceFun) || 0
|
|
|
const distanceInMeters = Number(this.showDistance) || 0
|
|
|
|
|
|
- let bestText = ""
|
|
|
+ let bestRule = null
|
|
|
let bestScore = Infinity
|
|
|
|
|
|
rules.forEach(rule => {
|
|
|
@@ -570,8 +571,8 @@ export default {
|
|
|
const meetAmount = Number(rule.meetAmount) || 0
|
|
|
const freeKm = Number(rule.freeKm) || 0
|
|
|
const freeKmInMeters = freeKm * 1000
|
|
|
- const text = this.formatReduceRuleText(rule)
|
|
|
- if (!text) {
|
|
|
+ // 无有效门槛的规则跳过
|
|
|
+ if (meetNum <= 0 && meetAmount <= 0 && freeKm <= 0) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
@@ -581,23 +582,26 @@ export default {
|
|
|
|
|
|
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
|
|
|
+ bestRule = rule
|
|
|
}
|
|
|
})
|
|
|
|
|
|
- return bestText || "免运费条件"
|
|
|
+ if (!bestRule) {
|
|
|
+ return "免运费条件"
|
|
|
+ }
|
|
|
+ return this.formatNearestReduceRuleTip(bestRule, flowerCount, flowerPrice)
|
|
|
},
|
|
|
/**
|
|
|
* 计算总金额
|
|
|
@@ -701,7 +705,7 @@ export default {
|
|
|
})
|
|
|
},
|
|
|
/**
|
|
|
- * 将单条满减规则格式化为提示文案
|
|
|
+ * 将单条满减规则格式化为弹框完整文案(含公里)
|
|
|
* @param {Object} rule - meetNum/meetAmount/freeKm
|
|
|
* @returns {string}
|
|
|
*/
|
|
|
@@ -713,7 +717,7 @@ export default {
|
|
|
const meetAmount = Number(rule.meetAmount) || 0
|
|
|
const freeKm = Number(rule.freeKm) || 0
|
|
|
if (meetNum > 0 && meetAmount > 0) {
|
|
|
- return `满${meetNum}扎${meetAmount}元,${freeKm}公里免运费`
|
|
|
+ return `满${meetNum}扎并且满${meetAmount}元,${freeKm}公里免运费`
|
|
|
}
|
|
|
if (meetNum > 0) {
|
|
|
return `满${meetNum}扎,${freeKm}公里内免运费`
|
|
|
@@ -726,6 +730,32 @@ export default {
|
|
|
}
|
|
|
return ""
|
|
|
},
|
|
|
+ /**
|
|
|
+ * 跑腿费旁简短文案:用「还差」提示差额,已满足的不写;公里已在筛选内只写「免运费」
|
|
|
+ * @param {Object} rule - 筛出的最接近规则
|
|
|
+ * @param {number} flowerCount - 当前扎数
|
|
|
+ * @param {number} flowerPrice - 当前金额
|
|
|
+ * @returns {string}
|
|
|
+ */
|
|
|
+ formatNearestReduceRuleTip(rule, flowerCount, flowerPrice) {
|
|
|
+ const meetNum = Number(rule && rule.meetNum) || 0
|
|
|
+ const meetAmount = Number(rule && rule.meetAmount) || 0
|
|
|
+ const count = Number(flowerCount) || 0
|
|
|
+ const price = Number(flowerPrice) || 0
|
|
|
+ // 计算相对门槛还差多少扎/多少元
|
|
|
+ const lackNum = meetNum > 0 ? Math.max(0, meetNum - count) : 0
|
|
|
+ const lackAmount = meetAmount > 0 ? Math.max(0, parseFloat((meetAmount - price).toFixed(2))) : 0
|
|
|
+ if (lackNum <= 0 && lackAmount <= 0) {
|
|
|
+ return "免运费"
|
|
|
+ }
|
|
|
+ if (lackNum > 0 && lackAmount > 0) {
|
|
|
+ return `还差${lackNum}扎${lackAmount}元免运费`
|
|
|
+ }
|
|
|
+ if (lackNum > 0) {
|
|
|
+ return `还差${lackNum}扎免运费`
|
|
|
+ }
|
|
|
+ return `还差${lackAmount}元免运费`
|
|
|
+ },
|
|
|
// 展示包配送政策弹窗
|
|
|
showDeliveryPolicyModal() {
|
|
|
this.deliveryPolicyList = []
|