shinnosuke
2026-09-21 7844f5af457ff3b7d3f8eeac8799e8d281e635a1
talent-card-server/src/main/java/com/talentcard/server/business/portal/AdminApprovalPortalService.java
@@ -34,9 +34,10 @@
        result.put("serviceId", serviceId);
        result.put("title", benefit.get("title"));
        result.put("freeLabel", benefit.get("freeLabel"));
        // 详情页图优先用该商家自己配置的轮播图,没配时先回落商家封面图,再回落服务权益里的全局图。
        result.put("heroImage", merchantHeroImage(serviceId, text(merchant.get("coverUrl"), text(benefit.get("heroImage")))));
        result.put("heroImages", merchantHeroImages(serviceId));
        // 行政审批详情页顶部直接用商家封面图(后台不再单独配置「详情页图片」);
        // 商家没配封面时再回落服务权益里的全局图。
        result.put("heroImage", text(merchant.get("coverUrl"), text(benefit.get("heroImage"))));
        result.put("heroImages", List.of());
        result.put("available", number(benefit.get("enabled")) == 1 && number(merchant.get("status")) == 1);
        result.put("unavailableReason", text(benefit.get("unavailableReason"), "该权益暂未开放"));
        List<Map<String, Object>> configuredOrganizations = configuredOrganizations(merchant);
@@ -44,23 +45,6 @@
                ? organizations(((Number) benefit.get("id")).longValue())
                : configuredOrganizations);
        return result;
    }
    private List<String> merchantHeroImages(Long merchantId) {
        return query("""
                select image_url
                from merchant_hero_image
                where merchant_id = ? and deleted = 0 and enabled = 1
                order by sort_no asc, id asc
                """, merchantId).stream()
                .map(row -> text(row.get("imageUrl")))
                .filter(url -> !url.isBlank())
                .toList();
    }
    private String merchantHeroImage(Long merchantId, String fallback) {
        List<String> images = merchantHeroImages(merchantId);
        return images.isEmpty() ? fallback : images.get(0);
    }
    private List<Map<String, Object>> configuredOrganizations(Map<String, Object> merchant) {