shish 1 ngày trước cách đây
mục cha
commit
7e82ebc60b
1 tập tin đã thay đổi với 43 bổ sung13 xóa
  1. 43 13
      hdApp/src/admin/billing/affirmSh.vue

+ 43 - 13
hdApp/src/admin/billing/affirmSh.vue

@@ -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 = []