From 70ea0911ce7519ca802266078624e9fed3559a2c Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期五, 18 九月 2026 14:05:13 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/main'

---
 talent-card-server/src/main/java/com/talentcard/server/business/portal/ParkingMerchantPortalService.java |   32 +++++++++++++++++++++++++++-----
 1 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/talent-card-server/src/main/java/com/talentcard/server/business/portal/ParkingMerchantPortalService.java b/talent-card-server/src/main/java/com/talentcard/server/business/portal/ParkingMerchantPortalService.java
index e7b2407..bc04cd5 100644
--- a/talent-card-server/src/main/java/com/talentcard/server/business/portal/ParkingMerchantPortalService.java
+++ b/talent-card-server/src/main/java/com/talentcard/server/business/portal/ParkingMerchantPortalService.java
@@ -65,8 +65,11 @@
 		String parkingType = text(right == null ? null : right.get("parkingType"), "paid");
 		// 付费权益到店出示人才码,免费权益先登记车牌。
 		result.put("actionMode", "paid".equalsIgnoreCase(parkingType) ? "talentCode" : "plate");
-		result.put("plateFormMode", text(benefit.get("plateFormMode"), "simple"));
-		result.put("benefit", benefitView(benefit));
+		// 车牌表单模式以商家权益里配的「停车场选择范围」为准:
+		// 全部可选(all)只要填车牌;只选其一(selected)才需要挑停车场。
+		String plateFormMode = effectivePlateFormMode(right, benefit);
+		result.put("plateFormMode", plateFormMode);
+		result.put("benefit", benefitView(benefit, plateFormMode));
 		result.put("applicableStores", parkingStores(merchant.get("usageInstructions")));
 		result.put("merchantRightsConfig", rights);
 		result.put("merchantRight", right == null ? Map.of() : right);
@@ -127,7 +130,7 @@
 			throw new BusinessException(ErrorCode.CONFLICT, "付费停车权益无需登记车牌");
 		}
 		Map<String, Object> selectedParkingLot = null;
-		if ("withParking".equals(benefit.get("plateFormMode"))) {
+		if (requiresParkingLotSelection(right, benefit)) {
 			if (request.parkingLotId() == null) throw new BusinessException(ErrorCode.BAD_REQUEST, "请选择停车场");
 			selectedParkingLot = parkingStores(merchant.get("usageInstructions")).stream()
 					.filter(item -> String.valueOf(request.parkingLotId()).equals(String.valueOf(item.get("id"))))
@@ -254,15 +257,34 @@
 				text(parkingLot.get("storeName"), text(parkingLot.get("name"), "")));
 	}
 
-	private Map<String, Object> benefitView(Map<String, Object> benefit) {
+	private Map<String, Object> benefitView(Map<String, Object> benefit, String plateFormMode) {
 		Map<String, Object> result = new LinkedHashMap<>();
 		result.put("benefitId", benefit.get("id"));
 		result.put("actionMode", text(benefit.get("actionMode"), "plate"));
-		result.put("plateFormMode", text(benefit.get("plateFormMode"), "simple"));
+		result.put("plateFormMode", plateFormMode);
 		result.put("validEnd", benefit.get("validEnd"));
 		return result;
 	}
 
+	/**
+	 * 是否需要小程序里挑一个停车场。
+	 * 以商家权益(merchant_rights_config)里的 parkingScope 为准:selected/ONE=只选其一,all=全部可选;
+	 * 权益里没配范围的旧数据,继续沿用停车权益表的 plate_form_mode。
+	 */
+	private boolean requiresParkingLotSelection(Map<String, Object> right, Map<String, Object> benefit) {
+		if (right != null) {
+			String scope = text(right.get("parkingScope"), "").trim().toUpperCase(Locale.ROOT);
+			if (!scope.isBlank()) {
+				return "SELECTED".equals(scope) || "ONE".equals(scope) || scope.contains("只选") || scope.contains("其一");
+			}
+		}
+		return "withParking".equalsIgnoreCase(text(benefit.get("plateFormMode"), ""));
+	}
+
+	private String effectivePlateFormMode(Map<String, Object> right, Map<String, Object> benefit) {
+		return requiresParkingLotSelection(right, benefit) ? "withParking" : "simple";
+	}
+
 	private Map<String, Object> registrationView(Map<String, Object> row) {
 		Map<String, Object> result = new LinkedHashMap<>();
 		result.put("registrationId", row.get("id"));

--
Gitblit v1.7.1