From f40c2939c6f784fc6721554794154a336d12bc3a Mon Sep 17 00:00:00 2001
From: shinnosuke <tantao@1hoper.com>
Date: 星期三, 12 八月 2026 09:23:49 +0800
Subject: [PATCH] fix(ui): 移除返回图标旋转样式并优化商户页面功能

---
 talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantWorkService.java |   87 ++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 77 insertions(+), 10 deletions(-)

diff --git a/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantWorkService.java b/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantWorkService.java
index 54568a7..e95416b 100644
--- a/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantWorkService.java
+++ b/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantWorkService.java
@@ -4,6 +4,7 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.Duration;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -13,6 +14,7 @@
 import com.talentcard.server.business.DatabaseRows;
 import com.talentcard.server.business.PageResult;
 import com.talentcard.server.business.merchant.auth.MerchantPrincipal;
+import com.talentcard.server.business.portal.ProductPriceCalculator;
 import com.talentcard.server.common.BusinessException;
 import com.talentcard.server.common.ErrorCode;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -21,12 +23,14 @@
 
 @Service
 public class MerchantWorkService {
-	private static final long REVOCATION_HOURS = 24;
+	private static final long REVOCATION_HOURS = 3;
 
 	private final JdbcTemplate jdbcTemplate;
+	private final ManualConsumptionService manualConsumptionService;
 
-	public MerchantWorkService(JdbcTemplate jdbcTemplate) {
+	public MerchantWorkService(JdbcTemplate jdbcTemplate, ManualConsumptionService manualConsumptionService) {
 		this.jdbcTemplate = jdbcTemplate;
+		this.manualConsumptionService = manualConsumptionService;
 	}
 
 	@Transactional(readOnly = true)
@@ -41,8 +45,8 @@
 		arguments.addAll(filters.arguments());
 
 		String recordSql = """
-				select o.id, o.order_no, tu.name as talent_name, tu.mobile as talent_mobile, tc.card_level,
-				       b.benefit_name, o.order_type, o.order_amount, o.subsidy_amount, o.pay_amount,
+				select o.id, o.order_no, tu.name as talent_name, tu.mobile as talent_mobile, tu.gender, tc.card_level,
+				       b.benefit_name, o.product_name_snapshot, o.order_type, o.order_amount, o.subsidy_amount, o.pay_amount,
 				       o.order_status, o.verify_status, o.created_at, verified.verify_time
 				from benefit_order o
 				left join talent_user tu on tu.id = o.talent_id
@@ -65,9 +69,10 @@
 	@Transactional(readOnly = true)
 	public Map<String, Object> order(String orderNo, Long merchantId, Long storeId) {
 		List<Map<String, Object>> rows = query("""
-				select o.id, o.order_no, o.talent_id, tu.name as talent_name, tu.mobile as talent_mobile,
+				select o.id, o.order_no, o.talent_id, tu.name as talent_name, tu.mobile as talent_mobile, tu.gender,
 				       o.card_id, tc.card_no, tc.card_level, o.benefit_id, b.benefit_name,
-				       o.merchant_id, m.merchant_name, o.order_type, o.order_amount,
+				       o.merchant_id, m.merchant_name, o.product_id, o.product_name_snapshot, p.rights_config,
+				       o.order_type, o.order_amount, o.base_pay_amount, o.coupon_amount,
 				       o.subsidy_amount, o.pay_amount, o.order_status, o.verify_status, o.created_at,
 				       vr.verify_time, vr.status as verify_record_status
 				from benefit_order o
@@ -75,6 +80,7 @@
 				left join talent_card tc on tc.id = o.card_id
 				left join benefit b on b.id = o.benefit_id
 				left join merchant m on m.id = o.merchant_id
+				left join merchant_product p on p.id = o.product_id and p.deleted = 0
 				left join verify_record vr on vr.order_id = o.id and vr.status = 1
 				where o.deleted = 0 and o.order_no = ? and o.merchant_id = ? and (o.store_id is null or o.store_id = ?)
 				""", orderNo, merchantId, storeId);
@@ -206,9 +212,15 @@
 		result.put("category", category);
 		result.put("status", status);
 		result.put("statusText", "pending_payment".equals(status) ? "待支付" : ("completed".equals(status) ? "已完成" : "待核销"));
-		result.put("customerName", maskName(String.valueOf(order.get("talentName"))));
+		result.put("customerName", displayName(order.get("talentName"), number(order.get("gender"))));
 		result.put("customerMobile", maskMobile(String.valueOf(order.get("talentMobile"))));
-		result.put("title", order.get("benefitName") == null ? ("store".equals(category) ? "到店消费订单" : "团购订单") : String.valueOf(order.get("benefitName")));
+		result.put("title", orderTitle(order, category));
+		result.put("benefitName", currentBenefitText(order, category));
+		long orderAmount = number(order.get("orderAmount")) == null ? 0 : number(order.get("orderAmount"));
+		long basePayAmount = number(order.get("basePayAmount")) == null ? orderAmount : number(order.get("basePayAmount"));
+		long couponAmount = number(order.get("couponAmount")) == null ? 0 : number(order.get("couponAmount"));
+		result.put("talentDiscountAmount", Math.max(0, orderAmount - basePayAmount));
+		result.put("couponAmount", Math.max(0, couponAmount));
 		LocalDateTime verifyTime = time(order.get("verifyTime"));
 		boolean canRevoke = "GROUP_BUY".equals(orderType) && verifyTime != null && Duration.between(verifyTime, LocalDateTime.now()).toHours() < REVOCATION_HOURS && verifyStatus != null && verifyStatus == 1;
 		result.put("canRevoke", canRevoke);
@@ -268,10 +280,53 @@
 		result.put("category", category);
 		result.put("status", status);
 		result.put("statusText", statusText(status));
-		result.put("customerName", maskName(String.valueOf(order.get("talentName"))));
+		result.put("customerName", displayName(order.get("talentName"), number(order.get("gender"))));
 		result.put("customerMobile", maskMobile(String.valueOf(order.get("talentMobile"))));
-		result.put("title", order.get("benefitName") == null ? categoryTitle(category) : String.valueOf(order.get("benefitName")));
+		result.put("title", orderTitle(order, category));
 		return result;
+	}
+
+	private String orderTitle(Map<String, Object> order, String category) {
+		String snapshot = text(order.get("productNameSnapshot"));
+		if (!snapshot.isBlank()) return snapshot;
+		String benefit = text(order.get("benefitName"));
+		return benefit.isBlank() ? categoryTitle(category) : benefit;
+	}
+
+	private String currentBenefitText(Map<String, Object> order, String category) {
+		String cardLevel = text(order.get("cardLevel"));
+		if ("store".equals(category)) {
+			Long merchantId = number(order.get("merchantId"));
+			return merchantId == null ? "以当前商户到店消费规则为准" : manualConsumptionService.benefitTextForMerchant(merchantId, cardLevel);
+		}
+		if ("group".equals(category)) {
+			ProductPriceCalculator.ProductRight right = ProductPriceCalculator.productRight(order.get("rightsConfig"), cardLevel);
+			if (right != null) return productBenefitText(right);
+		}
+		String configured = text(order.get("benefitName"));
+		return configured.isBlank() ? "以当前订单权益规则为准" : configured;
+	}
+
+	private String productBenefitText(ProductPriceCalculator.ProductRight right) {
+		String discountText = discountText(right.discount());
+		if (!right.free()) return discountText.isBlank() ? "以商品配置为准" : "按市价" + discountText;
+		String freeText = right.limitCount() > 0 ? "免费" + right.limitCount() + "次/" + cycleText(right.resetCycle()) : "免费";
+		return discountText.isBlank() ? freeText : freeText + ",超出次数按市价" + discountText;
+	}
+
+	private String discountText(BigDecimal discount) {
+		if (discount == null || discount.signum() <= 0) return "";
+		return discount.stripTrailingZeros().toPlainString() + "折";
+	}
+
+	private String cycleText(String cycle) {
+		String value = normalize(cycle).toUpperCase();
+		return switch (value) {
+			case "DAY", "DAILY", "每天" -> "天";
+			case "WEEK", "WEEKLY", "每周" -> "周";
+			case "MONTH", "MONTHLY", "每月" -> "月";
+			default -> "年";
+		};
 	}
 
 	private String category(String orderType) {
@@ -304,6 +359,18 @@
 		return value.length() == 1 ? value + "*" : value.substring(0, 1) + "*".repeat(value.length() - 1);
 	}
 
+	private String displayName(Object rawName, Long gender) {
+		String name = text(rawName);
+		if (name.isBlank()) return "";
+		if (gender != null && gender == 1) return name.substring(0, 1) + "先生";
+		if (gender != null && gender == 2) return name.substring(0, 1) + "女士";
+		return maskName(name);
+	}
+
+	private String text(Object value) {
+		return value == null || "null".equals(String.valueOf(value)) ? "" : String.valueOf(value).trim();
+	}
+
 	private String maskMobile(String value) {
 		if (value == null || value.length() < 7 || "null".equals(value)) return "";
 		return value.substring(0, 3) + "****" + value.substring(value.length() - 4);

--
Gitblit v1.7.1