shish 1 dzień temu
rodzic
commit
8377d5ffc7
1 zmienionych plików z 89 dodań i 16 usunięć
  1. 89 16
      hdApp/src/admin/billing/affirmSh.vue

+ 89 - 16
hdApp/src/admin/billing/affirmSh.vue

@@ -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;