刘帅
2026-09-21 28adb7ab6d9c09f7ca0160d884dde41b7b4a8ebd
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/AppGuideManagementController.java
@@ -20,6 +20,7 @@
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -54,8 +55,17 @@
    public Map<String, Object> data() {
        Map<String, Object> r = new HashMap<>();
        r.put("config", appGuideConfigMapper.selectOne(new QueryWrapper<AppGuideConfig>().orderByDesc("id").last("limit 1")));
        r.put("banners", appGuideBannerMapper.selectList(new QueryWrapper<AppGuideBanner>().orderByAsc("sort").orderByDesc("id")));
        r.put("links", qrLinkMapper.selectList(new QueryWrapper<QrLink>().eq("type", "SITE_BOOKING").orderByDesc("id")));
        r.put("banners", appGuideBannerMapper.selectList(new QueryWrapper<AppGuideBanner>().orderByDesc("sort").orderByDesc("id")));
        List<QrLink> links = qrLinkMapper.selectList(new QueryWrapper<QrLink>().eq("type", "SITE_BOOKING").orderByDesc("id"));
        List<Map<String, Object>> linkData = new ArrayList<>();
        for (QrLink link : links) {
            Map<String, Object> item = new HashMap<>();
            // Map 不会触发实体的 @JsonSerialize;雪花 ID 必须转字符串,避免前端 Number 精度丢失。
            item.put("id", String.valueOf(link.getId())); item.put("name", link.getName()); item.put("pageName", link.getPageName());
            item.put("storeId", link.getStoreId()); item.put("siteId", link.getSiteId()); item.put("shortCode", link.getShortCode());
            item.put("enabled", link.getEnabled()); item.put("guideUrl", guideUrl(link)); linkData.add(item);
        }
        r.put("links", linkData);
        return r;
    }
@@ -88,7 +98,7 @@
    @ResponseBody
    @PostMapping("/siteQr")
    public Map<String, Object> createSiteQr(Integer storeId, Integer siteId, String name, String channel) {
    public Map<String, Object> createSiteQr(Integer storeId, Integer siteId, String name, String channel, String pageName) {
        if (storeId == null || siteId == null) return error("门店 ID 和场地 ID 必填");
        QrLink old = qrLinkMapper.selectOne(new QueryWrapper<QrLink>().eq("type", "SITE_BOOKING").eq("siteId", siteId).eq("enabled", 1).last("limit 1"));
        if (old != null) return error("该场地已有启用二维码,请先停用或使用现有二维码");
@@ -97,6 +107,7 @@
        link.setSiteId(siteId);
        link.setName(name);
        link.setChannel(channel);
        link.setPageName(pageName);
        link.setType("SITE_BOOKING");
        link.setEnabled(1);
        link.setShortCode(nextCode());
@@ -117,6 +128,14 @@
        return ok();
    }
    /** 逻辑删除场地订场二维码。 */
    @ResponseBody
    @PostMapping("/siteQr/delete")
    public Map<String, Object> deleteSiteQr(Long id) {
        qrLinkMapper.deleteById(id);
        return ok();
    }
    @GetMapping("/siteQr/{id}.png")
    public void qrImage(@PathVariable Long id, HttpServletResponse response) throws IOException {
        QrLink link = qrLinkMapper.selectById(id);
@@ -130,10 +149,7 @@
    }
    private String guideUrl(QrLink link) {
        AppGuideConfig c = appGuideConfigMapper.selectOne(new QueryWrapper<AppGuideConfig>().orderByDesc("id").last("limit 1"));
        String domain = c == null ? null : c.getGuideDomain();
        if (domain == null || domain.trim().isEmpty()) domain = "https://online.daowepark.com/other";
        return domain.replaceAll("/$", "") + "/q/" + link.getShortCode();
        return "https://www.weparklife.com/appdown?code=" + link.getShortCode();
    }
    private String nextCode() {