yeg
2026-09-18 70ea0911ce7519ca802266078624e9fed3559a2c
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"));