From 85bfb9351803d97a33329d507f30a2f78bf1fc75 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期一, 28 九月 2026 10:53:14 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/main'

---
 talent-card-server/src/main/java/com/talentcard/server/business/merchant/ManualConsumptionService.java |   23 ++++++++++++++++++-----
 1 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/talent-card-server/src/main/java/com/talentcard/server/business/merchant/ManualConsumptionService.java b/talent-card-server/src/main/java/com/talentcard/server/business/merchant/ManualConsumptionService.java
index 8c76f0f..ccc55e3 100644
--- a/talent-card-server/src/main/java/com/talentcard/server/business/merchant/ManualConsumptionService.java
+++ b/talent-card-server/src/main/java/com/talentcard/server/business/merchant/ManualConsumptionService.java
@@ -164,19 +164,32 @@
     }
 
     /**
-     * 免费入住券要显示「超过免费天数按门市价X折」:X 就是这家店给该人才卡配的到店消费折扣
-     * (走和到店消费页同一套解析,结构化配置和旧的门店规则表都能取到)。
+     * 免费入住券要显示「超过免费天数按门店配置的到店消费规则计算」:门店给该人才卡配了折扣就是
+     * 「门市价X折」,配的是立减就是「立减X元」(走和到店消费页同一套解析,结构化配置和旧的门店
+     * 规则表都能取到)。
      *
-     * <p>没配折扣、或配的是立减时返回空串,调用方据此不显示这段说明。
+     * <p>以前只认折扣,酒店把到店消费配成「优惠(立减)」时整段是空的——而酒店最常见的配法恰恰
+     * 是立减(见商家权益里的到店消费二选一),页面上就什么都不显示,看起来像功能没做。
+     *
+     * <p>都没有配时返回空串,调用方据此不显示这段说明。
      */
     String freeStayExceedDiscountText(Long merchantId, String cardLevel, String sourceAreaType) {
         for (Map<String, Object> rule : rules(merchantId, cardLevel, sourceAreaType)) {
-            BigDecimal rate = decimal(rule.get("discountRate"));
-            if (rate.signum() > 0) return "门市价" + rate.movePointRight(1).stripTrailingZeros().toPlainString() + "折";
+            String text = exceedDiscountText(rule);
+            if (!text.isBlank()) return text;
         }
         return "";
     }
 
+    /** 单条规则的「超过免费天数」文案:折扣优先,没配折扣(门店选的是立减)时用立减。 */
+    String exceedDiscountText(Map<String, Object> rule) {
+        BigDecimal rate = rule.get("discountRate") == null ? BigDecimal.ZERO : decimal(rule.get("discountRate"));
+        if (rate.signum() > 0) return "门市价" + rate.movePointRight(1).stripTrailingZeros().toPlainString() + "折";
+        BigDecimal reduction = rule.get("fixedReduction") == null ? BigDecimal.ZERO : decimal(rule.get("fixedReduction"));
+        if (reduction.signum() > 0) return "立减" + reduction.stripTrailingZeros().toPlainString() + "元";
+        return "";
+    }
+
     boolean hasApplicableRule(Long merchantId, String cardLevel, String sourceAreaType) {
         return !rules(merchantId, cardLevel, sourceAreaType).isEmpty();
     }

--
Gitblit v1.7.1