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