| | |
| | | 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); |
| | |
| | | ? 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) { |