From 971e637c2eebe93011a485ddfa99d4f19289811d Mon Sep 17 00:00:00 2001
From: shinnosuke <tantao@1hoper.com>
Date: 星期三, 05 八月 2026 16:06:36 +0800
Subject: [PATCH] feat(admin): 添加优惠券人才等级数量配置功能并完善商户入驻流程

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

diff --git a/talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminBusinessService.java b/talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminBusinessService.java
index 186a531..4329c7d 100644
--- a/talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminBusinessService.java
+++ b/talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminBusinessService.java
@@ -10,6 +10,7 @@
 import java.util.Map;
 
 import com.talentcard.server.business.BusinessIdGenerator;
+import com.alibaba.fastjson.JSON;
 import com.talentcard.server.business.DatabaseRows;
 import com.talentcard.server.business.PageResult;
 import com.talentcard.server.business.merchant.auth.MerchantPasswordHasher;
@@ -714,7 +715,7 @@
 	) {
 		StringBuilder sql = new StringBuilder("""
 				select c.id, c.merchant_id, m.merchant_name, c.coupon_name, c.condition_type,
-				       c.condition_amount, c.coupon_amount, c.talent_levels, c.valid_start, c.valid_end,
+				       c.condition_amount, c.coupon_amount, c.talent_levels, c.talent_level_quantities, c.valid_start, c.valid_end,
 				       c.product_scope, c.store_consume, c.government_subsidy, c.use_count, c.status,
 				       c.created_at, c.updated_at,
 				       (select count(*) from merchant_coupon_product cp where cp.coupon_id = c.id) as product_count,
@@ -766,7 +767,7 @@
 	public Map<String, Object> coupon(Long id) {
 		Map<String, Object> result = one("""
 				select c.id, c.merchant_id, m.merchant_name, c.coupon_name, c.condition_type,
-				       c.condition_amount, c.coupon_amount, c.talent_levels, c.valid_start, c.valid_end,
+				       c.condition_amount, c.coupon_amount, c.talent_levels, c.talent_level_quantities, c.valid_start, c.valid_end,
 				       c.product_scope, c.store_consume, c.government_subsidy, c.use_count, c.status,
 				       c.created_at, c.updated_at
 				from merchant_coupon c
@@ -782,11 +783,13 @@
 	public Map<String, Object> createCoupon(CouponCreateRequest request) {
 		ensureMerchantExists(request.merchantId());
 		validateCouponConfiguration(request.validStart(), request.validEnd(), request.productScope(), request.productIds());
+		validateCouponAmount(request.couponAmount());
+		validateTalentLevelQuantities(request.talentLevelQuantities());
 		jdbcTemplate.update("""
 				insert into merchant_coupon(merchant_id, coupon_name, condition_type, condition_amount,
-				                            coupon_amount, talent_levels, valid_start, valid_end,
+				                            coupon_amount, talent_levels, talent_level_quantities, valid_start, valid_end,
 				                            product_scope, store_consume, government_subsidy, status)
-				values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)
+				values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)
 				""",
 				request.merchantId(),
 				request.couponName(),
@@ -794,6 +797,7 @@
 				request.conditionAmount(),
 				valueOrZero(request.couponAmount()),
 				joinTalentLevels(request.talentLevels()),
+				levelQuantitiesJson(request.talentLevelQuantities()),
 				blankToNull(request.validStart()),
 				blankToNull(request.validEnd()),
 				normalizeProductScope(request.productScope()),
@@ -808,10 +812,12 @@
 	public Map<String, Object> updateCoupon(Long id, CouponUpdateRequest request) {
 		ensureMerchantExists(request.merchantId());
 		validateCouponConfiguration(request.validStart(), request.validEnd(), request.productScope(), request.productIds());
+		validateCouponAmount(request.couponAmount());
+		validateTalentLevelQuantities(request.talentLevelQuantities());
 		int updated = jdbcTemplate.update("""
 				update merchant_coupon
 				set merchant_id = ?, coupon_name = ?, condition_type = ?, condition_amount = ?,
-				    coupon_amount = ?, talent_levels = ?, valid_start = ?, valid_end = ?,
+				    coupon_amount = ?, talent_levels = ?, talent_level_quantities = ?, valid_start = ?, valid_end = ?,
 				    product_scope = ?, store_consume = ?, government_subsidy = ?, status = ?
 				where deleted = 0 and id = ?
 				""",
@@ -821,6 +827,7 @@
 				request.conditionAmount(),
 				valueOrZero(request.couponAmount()),
 				joinTalentLevels(request.talentLevels()),
+				levelQuantitiesJson(request.talentLevelQuantities()),
 				blankToNull(request.validStart()),
 				blankToNull(request.validEnd()),
 				normalizeProductScope(request.productScope()),
@@ -893,6 +900,17 @@
 		return value == null ? BigDecimal.ZERO : value;
 	}
 
+	private void validateCouponAmount(BigDecimal value) {
+		if (value == null || value.compareTo(new BigDecimal("0.1")) < 0 || value.compareTo(new BigDecimal("9999.9")) > 0) {
+			throw new BusinessException(ErrorCode.BAD_REQUEST, "优惠券金额必须在0.1-9999.9元之间");
+		}
+	}
+	private void validateTalentLevelQuantities(Map<String, Integer> values) {
+		if (values == null) return;
+		values.values().forEach(value -> { if (value == null || value < 1 || value > 99) throw new BusinessException(ErrorCode.BAD_REQUEST, "人才卡发放数量必须为1-99"); });
+	}
+	private String levelQuantitiesJson(Map<String, Integer> values) { return values == null || values.isEmpty() ? null : JSON.toJSONString(values); }
+
 	private String toJson(Object value) {
 		if (value == null) {
 			return null;

--
Gitblit v1.7.1