zhangqin 2 недель назад
Родитель
Сommit
d3da1af10f
20 измененных файлов с 225 добавлено и 772 удалено
  1. 2 11
      fs-ad-new-api/src/main/java/com/fs/app/controller/LandingPageController.java
  2. 1 1
      fs-ad-new-api/src/main/java/com/fs/app/controller/TestController.java
  3. 11 9
      fs-ad-new-api/src/main/java/com/fs/app/facade/ConversionServiceImpl.java
  4. 0 367
      fs-ad-new-api/src/main/resources/static/landing.html
  5. 17 41
      fs-company/src/main/java/com/fs/company/controller/newAdv/AdvertiserController.java
  6. 48 0
      fs-company/src/main/java/com/fs/company/controller/newAdv/ConversionLogController.java
  7. 70 206
      fs-company/src/main/java/com/fs/company/controller/newAdv/LandingPageTemplateController.java
  8. 2 0
      fs-company/src/main/java/com/fs/company/controller/newAdv/PromotionAccountController.java
  9. 12 0
      fs-company/src/main/java/com/fs/company/controller/newAdv/SiteController.java
  10. 1 1
      fs-service/src/main/java/com/fs/newAdv/domain/Advertiser.java
  11. 7 6
      fs-service/src/main/java/com/fs/newAdv/domain/ConversionLog.java
  12. 6 6
      fs-service/src/main/java/com/fs/newAdv/domain/LandingPageTemplate.java
  13. 4 0
      fs-service/src/main/java/com/fs/newAdv/domain/PromotionAccount.java
  14. 2 2
      fs-service/src/main/java/com/fs/newAdv/domain/Site.java
  15. 3 6
      fs-service/src/main/java/com/fs/newAdv/dto/req/LandingIndexReq.java
  16. 3 33
      fs-service/src/main/java/com/fs/newAdv/service/IAdvertiserService.java
  17. 16 0
      fs-service/src/main/java/com/fs/newAdv/service/IConversionLogService.java
  18. 2 82
      fs-service/src/main/java/com/fs/newAdv/service/impl/AdvertiserServiceImpl.java
  19. 17 0
      fs-service/src/main/java/com/fs/newAdv/service/impl/ConversionLogServiceImpl.java
  20. 1 1
      fs-service/src/main/java/com/fs/newAdv/service/impl/SiteServiceImpl.java

+ 2 - 11
fs-ad-new-api/src/main/java/com/fs/app/controller/LandingPageController.java

@@ -30,21 +30,12 @@ public class LandingPageController {
     /**
      * 落地页访问
      */
-    @GetMapping("/index")
+    @GetMapping("/home")
     public Result<LandingIndexRes> track(
             @RequestParam Map<String, String> allParams,
             @Valid @RequestBody LandingIndexReq req) {
         log.info("落地页访问追踪:req={},params={}", req, allParams);
-        Long siteId = req.getSiteId();
-        // 1. 验证站点ID
-        if (siteId == null) {
-            String siteIdStr = allParams.get("site_id");
-            if (StrUtil.isNotBlank(siteIdStr)) {
-                req.setSiteId(Long.parseLong(siteIdStr));
-            } else {
-                return Result.error(400, "缺少站点ID参数");
-            }
-        }
+        Long siteId = Long.valueOf(allParams.get("site_id"));
         // 保存落地页访问记录
         facadeService.saveLandingIndexTrace(siteId, allParams);
         // 查询落地页模板

+ 1 - 1
fs-ad-new-api/src/main/java/com/fs/app/controller/TestController.java

@@ -67,6 +67,6 @@ public class TestController {
     @GetMapping("/test7/{id}")
     public void test7(@PathVariable("id") String traceId) {
         log.info("模拟微信搜权且当日创建事件完成");
-        baiduApiClient.getDataReport(promotionAccountService.getById(traceId));
+        // baiduApiClient.getDataReport(promotionAccountService.getById(traceId));
     }
 }

+ 11 - 9
fs-ad-new-api/src/main/java/com/fs/app/facade/ConversionServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fs.app.facade;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.fs.app.integration.adapter.IAdvertiserAdapter;
@@ -79,13 +80,12 @@ public class ConversionServiceImpl implements IConversionService {
             return false;
         }
 
-        String advertiserEventType = conversionEventVo.stream()
+        ConversionEventVo advertiserEventType = conversionEventVo.stream()
                 .filter(item -> item.getSystemEventType().equals(systemEventTypeEnum.getCode()))
                 .findFirst()
-                .map(ConversionEventVo::getAdvertiserEventType)
                 .orElse(null);
 
-        if (StrUtil.isEmpty(advertiserEventType)) {
+        if (ObjectUtil.isEmpty(advertiserEventType)) {
             log.error("回传事件未匹配: {}", traceId);
             return false;
         }
@@ -108,7 +108,7 @@ public class ConversionServiceImpl implements IConversionService {
         conversionData.put("ip", lead.getIp());
         conversionData.put("scr_id", callbackAccount.getScrId());
         conversionData.put("traceId", traceId);
-        conversionData.put("eventType", advertiserEventType);
+        conversionData.put("eventType", advertiserEventType.getAdvertiserEventType());
         conversionData.put("timestamp", System.currentTimeMillis() / 1000);
         // 添加平台适应参数
         IAdvertiserAdapter adapter = advertiserHandlerFactory.getAdapter(AdvertiserTypeEnum.getByCode(callbackAccount.getAdvertiserId()));
@@ -121,8 +121,9 @@ public class ConversionServiceImpl implements IConversionService {
 
         // 保存转化日志(待回传状态)
         ConversionLog conversionLog = saveConversionLog(
+                site.getCallbackAccountId(),
                 site.getId(), site.getAdvertiserId(), site.getAdvertiserName(),
-                systemEventTypeEnum, traceId, conversionData, b);
+                advertiserEventType, traceId, conversionData, b);
         return b;
     }
 
@@ -147,18 +148,19 @@ public class ConversionServiceImpl implements IConversionService {
     /**
      * 保存转化日志
      */
-    private ConversionLog saveConversionLog(Long siteId, Long advertiserId,
-                                            String advertiserName, SystemEventTypeEnum eventType,
+    private ConversionLog saveConversionLog(Long callbackAccountId,Long siteId, Long advertiserId,
+                                            String advertiserName, ConversionEventVo eventType,
                                             String clickId,
                                             Map<String, Object> conversionData,
                                             boolean status) {
         ConversionLog log = new ConversionLog();
         log.setId(SnowflakeUtil.nextId());
+        log.setCallbackAccountId(callbackAccountId);
         log.setSiteId(siteId);
         log.setAdvertiserId(advertiserId);
         log.setAdvertiserName(advertiserName);
-        log.setConversionType(eventType.getCode());
-        log.setConversionEvent(eventType.getDescription());
+        log.setSysConversionEvent(eventType.getSystemEventTypeName());
+        log.setAdvConversionEvent(eventType.getAdvertiserEventName());
         log.setCallbackParams(JSONUtil.toJsonStr(conversionData));
         log.setCallbackStatus(status ? 1 : 2);
         log.setRetryCount(0);

+ 0 - 367
fs-ad-new-api/src/main/resources/static/landing.html

@@ -1,367 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh-CN">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>产品落地页 - CRM系统</title>
-    <style>
-        * {
-            margin: 0;
-            padding: 0;
-            box-sizing: border-box;
-        }
-
-        body {
-            font-family: 'Microsoft YaHei', Arial, sans-serif;
-            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-            min-height: 100vh;
-            display: flex;
-            justify-content: center;
-            align-items: center;
-            padding: 20px;
-        }
-
-        .container {
-            background: white;
-            border-radius: 20px;
-            box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
-            max-width: 500px;
-            width: 100%;
-            padding: 40px;
-        }
-
-        h1 {
-            color: #333;
-            text-align: center;
-            margin-bottom: 10px;
-            font-size: 28px;
-        }
-
-        .subtitle {
-            color: #666;
-            text-align: center;
-            margin-bottom: 30px;
-            font-size: 14px;
-        }
-
-        .form-group {
-            margin-bottom: 20px;
-        }
-
-        label {
-            display: block;
-            color: #555;
-            font-size: 14px;
-            margin-bottom: 8px;
-            font-weight: 500;
-        }
-
-        input[type="text"],
-        input[type="tel"],
-        input[type="email"] {
-            width: 100%;
-            padding: 12px 15px;
-            border: 2px solid #e0e0e0;
-            border-radius: 8px;
-            font-size: 16px;
-            transition: border-color 0.3s;
-        }
-
-        input:focus {
-            outline: none;
-            border-color: #667eea;
-        }
-
-        .submit-btn {
-            width: 100%;
-            padding: 14px;
-            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-            color: white;
-            border: none;
-            border-radius: 8px;
-            font-size: 16px;
-            font-weight: 600;
-            cursor: pointer;
-            transition: transform 0.2s;
-        }
-
-        .submit-btn:hover {
-            transform: translateY(-2px);
-        }
-
-        .submit-btn:active {
-            transform: translateY(0);
-        }
-
-        .success-message {
-            display: none;
-            background: #4caf50;
-            color: white;
-            padding: 15px;
-            border-radius: 8px;
-            text-align: center;
-            margin-top: 20px;
-        }
-
-        .error-message {
-            display: none;
-            background: #f44336;
-            color: white;
-            padding: 15px;
-            border-radius: 8px;
-            text-align: center;
-            margin-top: 20px;
-        }
-
-        .trace-info {
-            background: #f5f5f5;
-            padding: 10px;
-            border-radius: 5px;
-            font-size: 12px;
-            color: #666;
-            margin-bottom: 20px;
-            word-break: break-all;
-        }
-    </style>
-</head>
-<body>
-    <div class="container">
-        <h1>🚀 投流落地页</h1>
-        <p class="subtitle">填写信息,免费试用30天</p>
-
-        <div class="trace-info" id="traceInfo" style="display: none;">
-            <strong>追踪ID:</strong> <span id="traceIdDisplay">-</span>
-        </div>
-
-        <form id="registerForm">
-            <div class="form-group">
-                <label for="name">姓名 *</label>
-                <input type="text" id="name" name="name" required placeholder="请输入您的姓名">
-            </div>
-
-            <div class="form-group">
-                <label for="phone">手机号 *</label>
-                <input type="tel" id="phone" name="phone" required
-                       pattern="^1[3-9]\d{9}$" placeholder="请输入11位手机号">
-            </div>
-
-            <div class="form-group">
-                <label for="company">公司名称</label>
-                <input type="text" id="company" name="company" placeholder="请输入您的公司名称">
-            </div>
-
-            <div class="form-group">
-                <label for="email">邮箱</label>
-                <input type="email" id="email" name="email" placeholder="请输入您的邮箱">
-            </div>
-
-            <button type="submit" class="submit-btn">立即注册</button>
-        </form>
-
-        <div class="success-message" id="successMessage">
-            ✅ 注册成功!我们的工作人员会尽快与您联系。
-        </div>
-
-        <div class="error-message" id="errorMessage">
-            ❌ 注册失败,请稍后重试。
-        </div>
-    </div>
-
-    <script>
-        // API基础路径
-        const API_BASE = '';
-
-        // 页面加载时初始化
-        window.addEventListener('DOMContentLoaded', function() {
-            // 1. 从URL获取参数
-            const urlParams = new URLSearchParams(window.location.search);
-            const allParams = {};
-            for (const [key, value] of urlParams.entries()) {
-                allParams[key] = value;
-            }
-
-            // 2. 获取或生成traceId
-            let traceId = urlParams.get('trace_id') || localStorage.getItem('trace_id');
-
-            // 3. 如果URL中有广告参数,调用追踪接口
-            if (urlParams.has('site_id') || urlParams.has('clk_id') || urlParams.has('callback')) {
-                trackLanding(allParams);
-            } else if (traceId) {
-                // 显示已有的追踪ID
-                displayTraceId(traceId);
-            }
-        });
-
-        /**
-         * 调用落地页追踪接口
-         */
-        async function trackLanding(params) {
-            try {
-                const queryString = new URLSearchParams(params).toString();
-                const response = await fetch(`${API_BASE}/landing/track?${queryString}`, {
-                    method: 'GET',
-                    headers: {
-                        'Content-Type': 'application/json'
-                    }
-                });
-
-                const result = await response.json();
-
-                if (result.code === 200 && result.data) {
-                    const traceId = result.data.traceId;
-
-                    // 保存到localStorage
-                    localStorage.setItem('trace_id', traceId);
-                    localStorage.setItem('visitor_id', result.data.visitorId);
-
-                    // 显示追踪ID
-                    displayTraceId(traceId);
-
-                    console.log('落地页追踪成功:', result.data);
-                } else {
-                    console.error('落地页追踪失败:', result.message);
-                }
-            } catch (error) {
-                console.error('追踪接口调用失败:', error);
-            }
-        }
-
-        /**
-         * 显示追踪ID
-         */
-        function displayTraceId(traceId) {
-            document.getElementById('traceIdDisplay').textContent = traceId;
-            document.getElementById('traceInfo').style.display = 'block';
-        }
-
-        /**
-         * 表单提交处理
-         */
-        document.getElementById('registerForm').addEventListener('submit', async function(e) {
-            e.preventDefault();
-
-            // 1. 收集表单数据
-            const formData = {
-                name: document.getElementById('name').value,
-                phone: document.getElementById('phone').value,
-                company: document.getElementById('company').value,
-                email: document.getElementById('email').value
-            };
-
-            // 2. 从URL获取所有广告参数
-            const urlParams = new URLSearchParams(window.location.search);
-
-            // 2.1 收集所有URL参数(包括平台特定参数如 bd_vid)
-            const allRawParams = {};
-            for (const [key, value] of urlParams.entries()) {
-                allRawParams[key] = value;
-            }
-
-            // 2.2 提取点击ID(支持多种参数名)
-            const clickId = urlParams.get('click_id') ||
-                           urlParams.get('clickid') ||
-                           urlParams.get('clkid') ||
-                           urlParams.get('callback_param') ||
-                           urlParams.get('CLICK_ID') ||
-                           urlParams.get('bd_vid');  // 百度特殊参数
-
-            // 2.3 提取来源平台
-            const source = urlParams.get('source') ||
-                          urlParams.get('platform') ||
-                          urlParams.get('advertiser');
-
-            // 2.4 提取其他常用参数
-            const siteId = urlParams.get('site_id') || urlParams.get('siteId');
-            const campaignId = urlParams.get('campaign_id') || urlParams.get('cid');
-            const keyword = urlParams.get('keyword') || urlParams.get('kw');
-            const creativeId = urlParams.get('creative_id') || urlParams.get('creative');
-
-            // 3. 构建完整的请求数据
-            const submitData = {
-                ...formData,
-                siteId: siteId ? parseInt(siteId) : null,
-                viewUrl: window.location.href, // 添加完整的URL
-                clickId: clickId,
-                source: source ? source.toUpperCase() : null,
-                campaignId: campaignId,
-                keyword: keyword,
-                creativeId: creativeId,
-                rawParams: allRawParams  // 包含所有URL参数(包括bd_vid等平台特定参数)
-            };
-
-            try {
-                // 4. 提交到线索接口(会自动触发转化事件)
-                const response = await fetch(`${API_BASE}/landing/submit`, {
-                    method: 'POST',
-                    headers: {
-                        'Content-Type': 'application/json'
-                    },
-                    body: JSON.stringify(submitData)
-                });
-
-                const result = await response.json();
-
-                if (result.code === 200) {
-                    console.log('表单提交成功:', result.data);
-                    showSuccessMessage(result.data.message || '提交成功,我们会尽快与您联系');
-                } else {
-                    showErrorMessage(result.message || '提交失败');
-                }
-
-            } catch (error) {
-                console.error('表单提交失败:', error);
-                showErrorMessage('网络错误,请稍后重试');
-            }
-        });
-
-        /**
-         * 关联用户ID到追踪记录
-         */
-        async function bindUserToTrace(traceId, userId) {
-            try {
-                const response = await fetch(`${API_BASE}/landing/bind-user`, {
-                    method: 'POST',
-                    headers: {
-                        'Content-Type': 'application/x-www-form-urlencoded'
-                    },
-                    body: `traceId=${traceId}&userId=${userId}`
-                });
-
-                const result = await response.json();
-
-                if (result.code === 200) {
-                    console.log('用户ID关联成功');
-                } else {
-                    console.warn('用户ID关联失败:', result.message);
-                }
-            } catch (error) {
-                console.error('关联接口调用失败:', error);
-            }
-        }
-
-        /**
-         * 显示成功消息
-         */
-        function showSuccessMessage(message) {
-            const successDiv = document.getElementById('successMessage');
-            if (message) {
-                successDiv.innerHTML = '✅ ' + message;
-            }
-            successDiv.style.display = 'block';
-            document.getElementById('errorMessage').style.display = 'none';
-            document.getElementById('registerForm').style.display = 'none';
-        }
-
-        /**
-         * 显示错误消息
-         */
-        function showErrorMessage(message) {
-            const errorDiv = document.getElementById('errorMessage');
-            errorDiv.textContent = '❌ ' + message;
-            errorDiv.style.display = 'block';
-            document.getElementById('successMessage').style.display = 'none';
-        }
-    </script>
-</body>
-</html>
-

+ 17 - 41
fs-company/src/main/java/com/fs/company/controller/newAdv/AdvertiserController.java

@@ -1,8 +1,9 @@
 package com.fs.company.controller.newAdv;
 
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-
 import com.fs.common.result.Result;
 import com.fs.newAdv.domain.Advertiser;
 import com.fs.newAdv.service.IAdvertiserService;
@@ -11,9 +12,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-
-import javax.validation.constraints.NotNull;
-
 /**
  * 广告商管理控制器
  *
@@ -37,61 +35,39 @@ public class AdvertiserController {
             @RequestParam(defaultValue = "1") Long pageNum,
             @RequestParam(defaultValue = "10") Long pageSize,
             @RequestParam(required = false) String advertiserName,
-            @RequestParam(required = false) Integer type,
+            @RequestParam(required = false) Integer custom,
             @RequestParam(required = false) Integer enabled) {
 
         Page<Advertiser> page = new Page<>(pageNum, pageSize);
-        IPage<Advertiser> result = advertiserService.page(page, advertiserName, type, enabled);
+        LambdaQueryWrapper<Advertiser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(StrUtil.isNotBlank(advertiserName), Advertiser::getAdvertiserName, advertiserName);
+        wrapper.eq(custom != null, Advertiser::getCustom, custom);
+        wrapper.eq(enabled != null, Advertiser::getEnabled, enabled);
+        wrapper.orderByDesc(Advertiser::getCreateTime);
+        IPage<Advertiser> result = advertiserService.page(page, wrapper);
         return Result.success(result);
     }
 
-    /**
-     * 根据ID查询广告商详情
-     */
-    @GetMapping("/{id}")
-    public Result<Advertiser> getById(@PathVariable @NotNull(message = "广告商ID不能为空") Long id) {
-        Advertiser advertiser = advertiserService.getById(id);
-        return Result.success(advertiser);
-    }
-
     /**
      * 创建广告商
      */
     @PostMapping
     public Result<Void> create(@RequestBody @Validated Advertiser advertiser) {
-        boolean success = advertiserService.create(advertiser);
+        boolean success = advertiserService.save(advertiser);
         return success ? Result.success() : Result.error("创建失败");
     }
 
     /**
-     * 更新广告商
+     * 启用停用
      */
-    @PutMapping("/{id}")
-    public Result<Void> update(
-            @PathVariable @NotNull(message = "广告商ID不能为空") Long id,
-            @RequestBody @Validated Advertiser advertiser) {
-
-        advertiser.setId(id);
-        boolean success = advertiserService.update(advertiser);
-        return success ? Result.success() : Result.error("更新失败");
+    @PostMapping("/enable/{id}")
+    public Result<Void> enable(@PathVariable Long id) {
+        Advertiser byId = advertiserService.getById(id);
+        byId.setEnabled(byId.getEnabled() == 1 ? 0 : 1);
+        advertiserService.updateById(byId);
+        return Result.success();
     }
 
-    /**
-     * 删除广告商
-     */
-    @DeleteMapping("/{id}")
-    public Result<Void> delete(@PathVariable @NotNull(message = "广告商ID不能为空") Long id) {
-        boolean success = advertiserService.delete(id);
-        return success ? Result.success() : Result.error("删除失败");
-    }
 
-    /**
-     * 批量删除广告商
-     */
-    @DeleteMapping("/batch")
-    public Result<Void> batchDelete(@RequestBody Long[] ids) {
-        boolean success = advertiserService.batchDelete(ids);
-        return success ? Result.success() : Result.error("批量删除失败");
-    }
 }
 

+ 48 - 0
fs-company/src/main/java/com/fs/company/controller/newAdv/ConversionLogController.java

@@ -0,0 +1,48 @@
+package com.fs.company.controller.newAdv;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fs.common.result.Result;
+import com.fs.newAdv.domain.ConversionLog;
+import com.fs.newAdv.service.IConversionLogService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@Slf4j
+@RestController
+@RequestMapping("/conversion-log")
+@Validated
+public class ConversionLogController {
+
+    @Autowired
+    private IConversionLogService conversionLogService;
+
+    @GetMapping("/page")
+    public Result<IPage<ConversionLog>> page(
+            @RequestParam(defaultValue = "1") Integer pageNum,
+            @RequestParam(defaultValue = "10") Integer pageSize,
+            @RequestParam(required = false) String conversionType,
+            @RequestParam(required = false) String advertiserId,
+            @RequestParam(required = false) String callbackStatus,
+            @RequestParam(required = false) String callbackAccountId,
+            @RequestParam(required = false) String traceId) {
+        Page<ConversionLog> pageParam = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<ConversionLog> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ObjectUtil.isNotEmpty(conversionType), ConversionLog::getSysConversionEvent, conversionType);
+        queryWrapper.eq(ObjectUtil.isNotEmpty(advertiserId), ConversionLog::getAdvertiserId, advertiserId);
+        queryWrapper.eq(ObjectUtil.isNotEmpty(callbackStatus), ConversionLog::getCallbackStatus, callbackStatus);
+        queryWrapper.eq(ObjectUtil.isNotEmpty(traceId), ConversionLog::getTraceId, traceId);
+        queryWrapper.eq(ObjectUtil.isNotEmpty(callbackAccountId), ConversionLog::getCallbackAccountId, callbackAccountId);
+        queryWrapper.orderByDesc(ConversionLog::getCreateTime);
+
+        IPage<ConversionLog> result = conversionLogService.page(pageParam, queryWrapper);
+        return Result.success(result);
+    }
+}

+ 70 - 206
fs-company/src/main/java/com/fs/company/controller/newAdv/LandingPageTemplateController.java

@@ -1,5 +1,6 @@
 package com.fs.company.controller.newAdv;
 
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -7,16 +8,24 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fs.common.result.Result;
 import com.fs.newAdv.domain.LandingPageTemplate;
+import com.fs.newAdv.domain.Lead;
+import com.fs.newAdv.domain.Site;
+import com.fs.newAdv.dto.req.LandingIndexReq;
+import com.fs.newAdv.enums.AdvertiserTypeEnum;
 import com.fs.newAdv.service.ILandingPageTemplateService;
-import lombok.Data;
+import com.fs.newAdv.service.ILeadService;
+import com.fs.newAdv.service.ISiteService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.time.LocalDateTime;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 投放页面模板Controller
@@ -32,15 +41,16 @@ public class LandingPageTemplateController {
 
     @Autowired
     private ILandingPageTemplateService templateService;
+    @Autowired
+    private ISiteService siteService;
+    @Autowired
+    private ILeadService leadService;
 
     /**
      * 分页查询模板列表
      *
-     * @param page         当前页
-     * @param size         每页大小
      * @param templateName 模板名称(模糊查询)
      * @param templateType 模板类型
-     * @param domainId     关联域名ID
      * @param status       状态
      * @return 模板列表
      */
@@ -50,11 +60,8 @@ public class LandingPageTemplateController {
             @RequestParam(defaultValue = "10") Integer pageSize,
             @RequestParam(required = false) String templateName,
             @RequestParam(required = false) String templateType,
-            @RequestParam(required = false) Long domainId,
             @RequestParam(required = false) Integer status) {
 
-        log.info("分页查询模板列表 | page={}, size={}, templateName={}, templateType={}, domainId={}, status={}",
-                pageNum, pageSize, templateName, templateType, domainId, status);
 
         Page<LandingPageTemplate> pageParam = new Page<>(pageNum, pageSize);
         LambdaQueryWrapper<LandingPageTemplate> queryWrapper = new LambdaQueryWrapper<>();
@@ -65,9 +72,6 @@ public class LandingPageTemplateController {
         if (StrUtil.isNotBlank(templateType)) {
             queryWrapper.eq(LandingPageTemplate::getTemplateType, templateType);
         }
-        if (domainId != null) {
-            queryWrapper.eq(LandingPageTemplate::getDomainId, domainId);
-        }
         if (status != null) {
             queryWrapper.eq(LandingPageTemplate::getStatus, status);
         }
@@ -86,8 +90,6 @@ public class LandingPageTemplateController {
      */
     @GetMapping("/{id}")
     public Result<LandingPageTemplate> getById(@PathVariable String id) {
-        log.info("查询模板详情 | id={}", id);
-
         LandingPageTemplate template = templateService.getById(id);
         if (template == null) {
             return Result.error("模板不存在");
@@ -103,10 +105,9 @@ public class LandingPageTemplateController {
      * @return 操作结果
      */
     @PostMapping
-    public Result<LandingPageTemplate> create(@RequestBody @Validated TemplateCreateRequest request) {
+    public Result<Void> create(@RequestBody @Validated LandingPageTemplate request) {
         log.info("新增模板 | templateName={}, templateType={}",
-                 request.getTemplateName(), request.getTemplateType());
-
+                request.getTemplateName(), request.getTemplateType());
         // 验证JSON格式
         if (StrUtil.isNotBlank(request.getTemplateData())) {
             try {
@@ -115,209 +116,72 @@ public class LandingPageTemplateController {
                 return Result.error("模板数据格式不正确,必须是有效的JSON");
             }
         }
-
-        LandingPageTemplate template = new LandingPageTemplate();
-        template.setTemplateName(request.getTemplateName());
-        template.setTemplateData(request.getTemplateData());
-        template.setTemplateType(request.getTemplateType() != null ? request.getTemplateType() : "DEFAULT");
-        template.setDomainId(request.getDomainId());
-        template.setStatus(request.getStatus() != null ? request.getStatus() : 1);
-        template.setRemark(request.getRemark());
-
-        boolean success = templateService.save(template);
+        boolean success = templateService.save(request);
         if (!success) {
             return Result.error("新增模板失败");
         }
 
-        log.info("新增模板成功 | id={}", template.getId());
-        return Result.success(template);
-    }
-
-    /**
-     * 更新模板
-     *
-     * @param id      模板ID
-     * @param request 模板信息
-     * @return 操作结果
-     */
-    @PutMapping("/{id}")
-    public Result<String> update(@PathVariable String id,
-                                  @RequestBody @Validated TemplateUpdateRequest request) {
-        log.info("更新模板 | id={}, templateName={}", id, request.getTemplateName());
-
-        LandingPageTemplate template = templateService.getById(id);
-        if (template == null) {
-            return Result.error("模板不存在");
-        }
-
-        // 验证JSON格式
-        if (StrUtil.isNotBlank(request.getTemplateData())) {
-            try {
-                JSONUtil.parseObj(request.getTemplateData());
-            } catch (Exception e) {
-                return Result.error("模板数据格式不正确,必须是有效的JSON");
-            }
-        }
-
-        template.setTemplateName(request.getTemplateName());
-        template.setTemplateData(request.getTemplateData());
-        template.setTemplateType(request.getTemplateType());
-        template.setDomainId(request.getDomainId());
-        template.setStatus(request.getStatus());
-        template.setRemark(request.getRemark());
-
-        boolean success = templateService.updateById(template);
-        if (!success) {
-            return Result.error("更新模板失败");
-        }
-
-        log.info("更新模板成功 | id={}", id);
-        return Result.success("更新成功");
+        return Result.success();
     }
 
-    /**
-     * 删除模板
-     *
-     * @param id 模板ID
-     * @return 操作结果
-     */
-    @DeleteMapping("/{id}")
-    public Result<String> delete(@PathVariable String id) {
-        log.info("删除模板 | id={}", id);
-
-        LandingPageTemplate template = templateService.getById(id);
-        if (template == null) {
-            return Result.error("模板不存在");
-        }
-
-        boolean success = templateService.removeById(id);
-        if (!success) {
-            return Result.error("删除模板失败");
-        }
-
-        log.info("删除模板成功 | id={}", id);
-        return Result.success("删除成功");
-    }
 
     /**
-     * 批量删除模板
-     *
-     * @param ids 模板ID列表
-     * @return 操作结果
+     * 落地页访问
      */
-    @DeleteMapping("/batch")
-    public Result<String> batchDelete(@RequestBody List<String> ids) {
-        log.info("批量删除模板 | ids={}", ids);
-
-        if (ids == null || ids.isEmpty()) {
-            return Result.error("请选择要删除的模板");
-        }
-
-        boolean success = templateService.removeByIds(ids);
-        if (!success) {
-            return Result.error("批量删除模板失败");
-        }
-
-        log.info("批量删除模板成功 | count={}", ids.size());
-        return Result.success("删除成功");
+    @PostMapping("/index")
+    public Result<LandingPageTemplate> track(
+            @Valid @RequestBody LandingIndexReq req) {
+        log.info("落地页访问追踪:req={},params={}", req, req.getAllParams());
+        Long siteId = Long.valueOf(req.getAllParams().get("siteId"));
+        Site byId = siteService.getById(siteId);
+        // 保存落地页访问记录
+        saveLandingIndexTrace(siteId, req.getAllParams());
+        // 查询落地页模板
+        return Result.success(templateService.getById(byId.getLaunchPageId()));
     }
 
-    /**
-     * 启用/禁用模板
-     *
-     * @param id     模板ID
-     * @param status 状态(0禁用 1启用)
-     * @return 操作结果
-     */
-    @PutMapping("/{id}/status")
-    public Result<String> updateStatus(@PathVariable String id, @RequestParam Integer status) {
-        log.info("修改模板状态 | id={}, status={}", id, status);
-
-        LandingPageTemplate template = templateService.getById(id);
-        if (template == null) {
-            return Result.error("模板不存在");
-        }
-
-        template.setStatus(status);
-        boolean success = templateService.updateById(template);
-        if (!success) {
-            return Result.error("修改状态失败");
-        }
-
-        log.info("修改模板状态成功 | id={}, status={}", id, status);
-        return Result.success("修改成功");
+    public void saveLandingIndexTrace(Long siteId, Map<String, String> allParams) {
+        Site byId = siteService.getById(siteId);
+        Long advertiserId = byId.getAdvertiserId();
+        String traceId = getTraceIdByAdvertiser(Objects.requireNonNull(AdvertiserTypeEnum.getByCode(advertiserId)), allParams);
+        Lead byTraceId = leadService.getByTraceId(traceId);
+        if (ObjectUtil.isEmpty(byTraceId)) {
+            byTraceId = new Lead();
+            byTraceId.setAdvertiserId(advertiserId);
+            byTraceId.setSiteId(siteId);
+            leadService.save(byTraceId);
+        }
+        if (!Objects.equals(byTraceId.getSiteId(), siteId)) {
+            log.info("落地页站点信息异常:{}---{}", byTraceId.getSiteId(), siteId);
+        }
+        if (!Objects.equals(byTraceId.getAdvertiserId(), advertiserId)) {
+            log.info("落地页站点信息异常:{}---{}", byTraceId.getAdvertiserId(), advertiserId);
+        }
+        byTraceId.setLandingPageRawParams(JSONUtil.toJsonStr(allParams));
+        byTraceId.setLandingPageTrigger(1);
+        byTraceId.setLandingPageTs(LocalDateTime.now());
+        byTraceId.setUpdateTime(LocalDateTime.now());
+        leadService.updateById(byTraceId);
     }
 
-    /**
-     * 复制模板
-     *
-     * @param id 源模板ID
-     * @return 新模板
-     */
-    @PostMapping("/{id}/copy")
-    public Result<LandingPageTemplate> copyTemplate(@PathVariable String id) {
-        log.info("复制模板 | id={}", id);
-
-        LandingPageTemplate sourceTemplate = templateService.getById(id);
-        if (sourceTemplate == null) {
-            return Result.error("源模板不存在");
-        }
-
-        LandingPageTemplate newTemplate = new LandingPageTemplate();
-        newTemplate.setTemplateName(sourceTemplate.getTemplateName() + "_副本");
-        newTemplate.setTemplateData(sourceTemplate.getTemplateData());
-        newTemplate.setTemplateType(sourceTemplate.getTemplateType());
-        newTemplate.setDomainId(sourceTemplate.getDomainId());
-        newTemplate.setStatus(0); // 默认禁用
-        newTemplate.setRemark(sourceTemplate.getRemark());
 
-        boolean success = templateService.save(newTemplate);
-        if (!success) {
-            return Result.error("复制模板失败");
+    private String getTraceIdByAdvertiser(AdvertiserTypeEnum byCode, Map<String, String> allParams) {
+        switch (byCode) {
+            case OCEANENGINE:
+                return allParams.get("click_id");
+            case TENCENT:
+                return allParams.get("click_id");
+            case OPPO:
+                return allParams.get("traceId");
+            case BAIDU:
+                return allParams.get("bdVid");
+            case VIVO:
+                return allParams.get("requestId");
+            case IQIYI:
+                return allParams.get("traceId");
+            default:
+                return null;
         }
-
-        log.info("复制模板成功 | sourceId={}, newId={}", id, newTemplate.getId());
-        return Result.success(newTemplate);
-    }
-
-    /**
-     * 模板创建请求DTO
-     */
-    @Data
-    public static class TemplateCreateRequest {
-        @NotBlank(message = "模板名称不能为空")
-        private String templateName;
-
-        private String templateData;
-
-        private String templateType;
-
-        private Long domainId;
-
-        private Integer status;
-
-        private String remark;
-    }
-
-    /**
-     * 模板更新请求DTO
-     */
-    @Data
-    public static class TemplateUpdateRequest {
-        @NotBlank(message = "模板名称不能为空")
-        private String templateName;
-
-        private String templateData;
-
-        @NotBlank(message = "模板类型不能为空")
-        private String templateType;
-
-        private Long domainId;
-
-        @NotNull(message = "状态不能为空")
-        private Integer status;
-
-        private String remark;
     }
 }
 

+ 2 - 0
fs-company/src/main/java/com/fs/company/controller/newAdv/PromotionAccountController.java

@@ -42,12 +42,14 @@ public class PromotionAccountController {
             @RequestParam(defaultValue = "1") Long current,
             @RequestParam(defaultValue = "10") Long size,
             @RequestParam(required = false) String accountName,
+            @RequestParam(required = false) String custom,
             @RequestParam(required = false) Long advertiserId) {
 
         Page<PromotionAccount> page = new Page<>(current, size);
         LambdaQueryWrapper<PromotionAccount> wrapper = new LambdaQueryWrapper<>();
         wrapper.like(StrUtil.isNotBlank(accountName), PromotionAccount::getAccountName, accountName);
         wrapper.eq(advertiserId != null, PromotionAccount::getAdvertiserId, advertiserId);
+        wrapper.eq(custom != null, PromotionAccount::getCustom, custom);
         wrapper.orderByDesc(PromotionAccount::getCreateTime);
         IPage<PromotionAccount> page1 = promotionAccountService.page(page, wrapper);
         return Result.success(page1);

+ 12 - 0
fs-company/src/main/java/com/fs/company/controller/newAdv/SiteController.java

@@ -66,5 +66,17 @@ public class SiteController {
         siteService.removeById(id);
         return Result.success();
     }
+
+
+    /**
+     * 启用停用站点
+     */
+    @PostMapping("enable/{id}")
+    public Result<Void> enable(@PathVariable Long id) {
+        Site byId = siteService.getById(id);
+        byId.setStatus(byId.getStatus() == 1 ? 0 : 1);
+        siteService.updateById(byId);
+        return Result.success();
+    }
 }
 

+ 1 - 1
fs-service/src/main/java/com/fs/newAdv/domain/Advertiser.java

@@ -51,7 +51,7 @@ public class Advertiser implements Serializable {
     private Integer enabled;
 
     /**
-     * 是否自定义(0否 1是)
+     * 1线上广告商 2自定义广告商
      */
     private Integer custom;
 

+ 7 - 6
fs-service/src/main/java/com/fs/newAdv/domain/ConversionLog.java

@@ -39,21 +39,22 @@ public class ConversionLog implements Serializable {
      * 广告商名称
      */
     private String advertiserName;
+    private Long callbackAccountId;
 
     /**
-     * 转化类型
+     * 系统事件
      */
-    private String conversionType;
+    private String sysConversionEvent;
 
     /**
-     * 转化事件
+     * 广告商时间
      */
-    private String conversionEvent;
+    private String advConversionEvent;
 
     /**
-     * 回传URL
+     * 着陆页URL
      */
-    private String callbackUrl;
+    private String landingUrl;
 
     /**
      * 回传参数

+ 6 - 6
fs-service/src/main/java/com/fs/newAdv/domain/LandingPageTemplate.java

@@ -39,21 +39,21 @@ public class LandingPageTemplate implements Serializable {
      * 模板类型
      */
     private String templateType;
+    /**
+     * 预览图片URL
+     */
+    private String previewUrl;
 
     /**
-     * 关联域名ID
+     * 所属分组
      */
-    private Long domainId;
+    private String cmsGroupName;
 
     /**
      * 状态(0禁用 1启用)
      */
     private Integer status;
 
-    /**
-     * 备注
-     */
-    private String remark;
 
     /**
      * 创建时间

+ 4 - 0
fs-service/src/main/java/com/fs/newAdv/domain/PromotionAccount.java

@@ -74,6 +74,10 @@ public class PromotionAccount implements Serializable {
      * 推广账户密码(加密存储)
      */
     private String accountPassword;
+    /**
+     * 1线上 2线下
+     */
+    private Integer custom;
 
     /**
      * 广告主ID

+ 2 - 2
fs-service/src/main/java/com/fs/newAdv/domain/Site.java

@@ -31,9 +31,9 @@ public class Site implements Serializable {
     private String siteName;
 
     /**
-     * 投放类型
+     * 投放类型 1线上 2线下
      */
-    private String launchType;
+    private Integer launchType;
 
     /**
      * 运营部门

+ 3 - 6
fs-service/src/main/java/com/fs/newAdv/dto/req/LandingIndexReq.java

@@ -3,20 +3,17 @@ package com.fs.newAdv.dto.req;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
 import java.io.Serializable;
+import java.util.Map;
 
 @Data
 public class LandingIndexReq implements Serializable {
     private static final long serialVersionUID = 1L;
-    /**
-     * 站点Id
-     */
-    @NotNull(message = "站点Id不能为空")
-    private Long siteId;
     /**
      * 落地页地址
      */
     @NotBlank(message = "落地页地址不能为空")
     private String viewUrl;
+
+    private Map<String, String> allParams;
 }

+ 3 - 33
fs-service/src/main/java/com/fs/newAdv/service/IAdvertiserService.java

@@ -1,7 +1,7 @@
 package com.fs.newAdv.service;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.newAdv.domain.AdvEventType;
 import com.fs.newAdv.domain.Advertiser;
 
 
@@ -11,36 +11,6 @@ import com.fs.newAdv.domain.Advertiser;
  * @author zhangqin
  * @date 2025-11-03
  */
-public interface IAdvertiserService {
-
-    /**
-     * 分页查询广告商列表
-     */
-    IPage<Advertiser> page(Page<Advertiser> page, String advertiserName, Integer type, Integer enabled);
-
-    /**
-     * 根据ID查询广告商
-     */
-    Advertiser getById(Long id);
-
-    /**
-     * 创建广告商
-     */
-    boolean create(Advertiser advertiser);
-
-    /**
-     * 更新广告商
-     */
-    boolean update(Advertiser advertiser);
-
-    /**
-     * 删除广告商
-     */
-    boolean delete(Long id);
-
-    /**
-     * 批量删除广告商
-     */
-    boolean batchDelete(Long[] ids);
+public interface IAdvertiserService extends IService<Advertiser> {
 }
 

+ 16 - 0
fs-service/src/main/java/com/fs/newAdv/service/IConversionLogService.java

@@ -0,0 +1,16 @@
+package com.fs.newAdv.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.newAdv.domain.Advertiser;
+import com.fs.newAdv.domain.ConversionLog;
+
+
+/**
+ * 广告商服务接口
+ *
+ * @author zhangqin
+ * @date 2025-11-03
+ */
+public interface IConversionLogService extends IService<ConversionLog> {
+}
+

+ 2 - 82
fs-service/src/main/java/com/fs/newAdv/service/impl/AdvertiserServiceImpl.java

@@ -1,19 +1,11 @@
 package com.fs.newAdv.service.impl;
 
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fs.common.exception.base.BusinessException;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.newAdv.domain.Advertiser;
 import com.fs.newAdv.mapper.AdvertiserMapper;
 import com.fs.newAdv.service.IAdvertiserService;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.Arrays;
 
 /**
  * 广告商服务实现类
@@ -23,80 +15,8 @@ import java.util.Arrays;
  */
 @Slf4j
 @Service
-public class AdvertiserServiceImpl implements IAdvertiserService {
-
-    @Autowired
-    private AdvertiserMapper advertiserMapper;
-
-    @Override
-    public IPage<Advertiser> page(Page<Advertiser> page, String advertiserName, Integer type, Integer enabled) {
-        LambdaQueryWrapper<Advertiser> wrapper = new LambdaQueryWrapper<>();
-        wrapper.like(StrUtil.isNotBlank(advertiserName), Advertiser::getAdvertiserName, advertiserName);
-
-        wrapper.eq(enabled != null, Advertiser::getEnabled, enabled);
-        wrapper.orderByDesc(Advertiser::getCreateTime);
-
-        return advertiserMapper.selectPage(page, wrapper);
-    }
-
-    @Override
-    public Advertiser getById(Long id) {
-        Advertiser advertiser = advertiserMapper.selectById(id);
-        if (advertiser == null) {
-            throw new BusinessException("广告商不存在");
-        }
-        return advertiser;
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean create(Advertiser advertiser) {
-        // 校验广告商名称是否重复
-        LambdaQueryWrapper<Advertiser> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(Advertiser::getAdvertiserName, advertiser.getAdvertiserName());
-        Integer count = advertiserMapper.selectCount(wrapper);
-        if (count > 0) {
-            throw new BusinessException("广告商名称已存在");
-        }
-
-        return advertiserMapper.insert(advertiser) > 0;
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean update(Advertiser advertiser) {
-        Advertiser existAdvertiser = advertiserMapper.selectById(advertiser.getId());
-        if (existAdvertiser == null) {
-            throw new BusinessException("广告商不存在");
-        }
-
-        // 校验名称是否重复
-        LambdaQueryWrapper<Advertiser> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(Advertiser::getAdvertiserName, advertiser.getAdvertiserName());
-        wrapper.ne(Advertiser::getId, advertiser.getId());
-        Integer count = advertiserMapper.selectCount(wrapper);
-        if (count > 0) {
-            throw new BusinessException("广告商名称已存在");
-        }
-
-        return advertiserMapper.updateById(advertiser) > 0;
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean delete(Long id) {
-        Advertiser advertiser = advertiserMapper.selectById(id);
-        if (advertiser == null) {
-            throw new BusinessException("广告商不存在");
-        }
+public class AdvertiserServiceImpl extends ServiceImpl<AdvertiserMapper, Advertiser> implements IAdvertiserService {
 
-        return advertiserMapper.deleteById(id) > 0;
-    }
 
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean batchDelete(Long[] ids) {
-        return advertiserMapper.deleteBatchIds(Arrays.asList(ids)) > 0;
-    }
 }
 

+ 17 - 0
fs-service/src/main/java/com/fs/newAdv/service/impl/ConversionLogServiceImpl.java

@@ -0,0 +1,17 @@
+package com.fs.newAdv.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.newAdv.domain.ConversionLog;
+import com.fs.newAdv.mapper.ConversionLogMapper;
+import com.fs.newAdv.service.IConversionLogService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+
+@Slf4j
+@Service
+public class ConversionLogServiceImpl extends ServiceImpl<ConversionLogMapper, ConversionLog> implements IConversionLogService {
+
+
+}
+

+ 1 - 1
fs-service/src/main/java/com/fs/newAdv/service/impl/SiteServiceImpl.java

@@ -25,7 +25,7 @@ public class SiteServiceImpl extends ServiceImpl<SiteMapper, Site> implements IS
     @Transactional(rollbackFor = Exception.class)
     public void createSite(Site site) {
         this.save(site);
-        site.setSiteUrl("http://" + site.getLaunchDomain() + "site/home.html/?tid=" + site.getId());
+        site.setSiteUrl("https://" + site.getLaunchDomain() + "/landing/index.html/?siteId=" + site.getId());
         this.updateById(site);
     }