pudongliang 4 месяцев назад
Родитель
Сommit
b42eb7abe2

+ 1 - 1
portal/dist/assets/accountGroup-BpScnSRd.js → portal/dist/assets/accountGroup-BfdacBPh.js

@@ -1 +1 @@
-import{r as u}from"./request-CrRlK8aV.js";function c(t){return u({url:"/api/account-group/create",method:"post",data:t})}function e(t){return u({url:"/api/account-group/update",method:"post",data:t})}function n(t){return u({url:`/api/account-group/${t}`,method:"delete"})}function a(t=1,o=10){return u({url:"/api/account-group/list",method:"get",params:{pageNum:t,pageSize:o}})}function p(){return u({url:"/api/account-group/all",method:"get"})}function i(t){return u({url:`/api/account-group/${t}/accounts`,method:"get"})}export{i as a,p as b,c,n as d,a as g,e as u};
+import{r as u}from"./request-BkI0Euub.js";function c(t){return u({url:"/api/account-group/create",method:"post",data:t})}function e(t){return u({url:"/api/account-group/update",method:"post",data:t})}function n(t){return u({url:`/api/account-group/${t}`,method:"delete"})}function a(t=1,o=10){return u({url:"/api/account-group/list",method:"get",params:{pageNum:t,pageSize:o}})}function p(){return u({url:"/api/account-group/all",method:"get"})}function i(t){return u({url:`/api/account-group/${t}/accounts`,method:"get"})}export{i as a,p as b,c,n as d,a as g,e as u};

+ 1 - 1
portal/dist/assets/adPlanConf-BUAYV9DO.js → portal/dist/assets/adPlanConf-qFH883So.js

@@ -1 +1 @@
-import{r as a}from"./request-CrRlK8aV.js";function r(n){return a({url:"/api/ad-plan-conf/reCreate",method:"post",data:n})}function o(n){return a({url:"/api/ad-plan-conf/generate-plan",method:"post",data:n})}function l(n){return a({url:`/api/ad-plan-conf/reGeneratePlan/${n}`,method:"get"})}function d(n){return a({url:"/api/ad-plan-conf/create",method:"post",data:n})}function u(n){return a({url:"/api/ad-plan-conf/update",method:"post",data:n})}function p(n){return a({url:`/api/ad-plan-conf/${n}`,method:"delete"})}function i(n=1,e=10){return a({url:"/api/ad-plan-conf/list",method:"get",params:{pageNum:n,pageSize:e}})}function f(n){return a({url:`/api/ad-plan-conf/${n}`,method:"get"})}function c(n){return a({url:"/api/ad-plan/list",method:"get",params:n})}function s(n){return a({url:`/api/ad-plan-creative/plan/${n}`,method:"get"})}export{o as a,f as b,d as c,p as d,c as e,l as f,i as g,s as h,r,u};
+import{r as a}from"./request-BkI0Euub.js";function r(n){return a({url:"/api/ad-plan-conf/reCreate",method:"post",data:n})}function o(n){return a({url:"/api/ad-plan-conf/generate-plan",method:"post",data:n})}function l(n){return a({url:`/api/ad-plan-conf/reGeneratePlan/${n}`,method:"get"})}function d(n){return a({url:"/api/ad-plan-conf/create",method:"post",data:n})}function u(n){return a({url:"/api/ad-plan-conf/update",method:"post",data:n})}function p(n){return a({url:`/api/ad-plan-conf/${n}`,method:"delete"})}function i(n=1,e=10){return a({url:"/api/ad-plan-conf/list",method:"get",params:{pageNum:n,pageSize:e}})}function f(n){return a({url:`/api/ad-plan-conf/${n}`,method:"get"})}function c(n){return a({url:"/api/ad-plan/list",method:"get",params:n})}function s(n){return a({url:`/api/ad-plan-creative/plan/${n}`,method:"get"})}export{o as a,f as b,d as c,p as d,c as e,l as f,i as g,s as h,r,u};

+ 1 - 1
portal/dist/assets/auth-wiTtxIb7.js → portal/dist/assets/auth-B_F01qmU.js

@@ -1 +1 @@
-import{r as t}from"./request-CrRlK8aV.js";function i(){return t({url:"/api/gdt/auth/authorize-url",method:"get"})}function n(r){return t({url:"/api/gdt/auth/refresh",method:"post",params:r})}function u(){return t({url:"/api/gdt/auth/list",method:"get"})}function a(){return u()}function o(){return t({url:"/api/gdt/auth/expiring",method:"get"})}export{o as a,a as b,i as g,u as l,n as r};
+import{r as t}from"./request-BkI0Euub.js";function i(){return t({url:"/api/gdt/auth/authorize-url",method:"get"})}function n(r){return t({url:"/api/gdt/auth/refresh",method:"post",params:r})}function u(){return t({url:"/api/gdt/auth/list",method:"get"})}function a(){return u()}function o(){return t({url:"/api/gdt/auth/expiring",method:"get"})}export{o as a,a as b,i as g,u as l,n as r};

+ 1 - 1
portal/dist/assets/conversion-DIOPx0rE.js → portal/dist/assets/conversion-BrJTQhOm.js

@@ -1 +1 @@
-import{r as t}from"./request-CrRlK8aV.js";function e(n,o){return t({url:"/api/gdt/conversion/sync",method:"post",params:{orgAccountId:n,accountId:o}})}function s(n=1,o=20){return t({url:"/api/gdt/conversion/list",method:"get",params:{page:n,pageSize:o}})}function i(n){return t({url:"/api/gdt/conversion/detail",method:"get",params:{conversionId:n}})}function a(){return t({url:"/api/gdt/conversion/all",method:"get"})}export{s as a,i as b,a as g,e as s};
+import{r as t}from"./request-BkI0Euub.js";function e(n,o){return t({url:"/api/gdt/conversion/sync",method:"post",params:{orgAccountId:n,accountId:o}})}function s(n=1,o=20){return t({url:"/api/gdt/conversion/list",method:"get",params:{page:n,pageSize:o}})}function i(n){return t({url:"/api/gdt/conversion/detail",method:"get",params:{conversionId:n}})}function a(){return t({url:"/api/gdt/conversion/all",method:"get"})}export{s as a,i as b,a as g,e as s};

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/detail-B6no62Oo.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/detail-BcRMltE-.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-B4ZZhn5u.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-BWxzchyX.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-ChG6-zTv.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-D6EcllRU.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-DGGqU8VW.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-DK05p_BP.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-DLDbNhdW.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
portal/dist/assets/index-Ddl5MZpq.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-cVLQ4JcQ.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-dBFII1ff.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-gMZsJSyN.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-hN3Jm3CD.js


+ 1 - 1
portal/dist/assets/ossFile-Ci9KIYZE.js → portal/dist/assets/ossFile-BC37tBA0.js

@@ -1 +1 @@
-import{r as t}from"./request-CrRlK8aV.js";function i(e){return t({timeout:3e5,url:"/api/oss-file/upload",method:"post",data:e,headers:{"Content-Type":"multipart/form-data"}})}function o(e){return t({url:"/api/oss-file/list",method:"get",params:e})}function r(e){return t({url:`/api/oss-file/${e}`,method:"delete"})}function l(e){return t({url:"/api/oss-file/batch",method:"delete",params:{fileIds:e}})}export{l as b,r as d,o as g,i as u};
+import{r as t}from"./request-BkI0Euub.js";function i(e){return t({timeout:3e5,url:"/api/oss-file/upload",method:"post",data:e,headers:{"Content-Type":"multipart/form-data"}})}function o(e){return t({url:"/api/oss-file/list",method:"get",params:e})}function r(e){return t({url:`/api/oss-file/${e}`,method:"delete"})}function l(e){return t({url:"/api/oss-file/batch",method:"delete",params:{fileIds:e}})}export{l as b,r as d,o as g,i as u};

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/request-BkI0Euub.js


+ 1 - 1
portal/dist/assets/user-iUG43jf5.js → portal/dist/assets/user-D20ylrAd.js

@@ -1 +1 @@
-import{r as e}from"./request-CrRlK8aV.js";function s(){return e({url:"/api/user/list",method:"get"})}function u(r){return e({url:"/api/user/info",method:"get",params:r})}function n(r){return e({url:"/api/user/user-token-url",method:"get",params:r})}function o(r){return e({url:"/api/user/login",method:"post",params:r})}function a(r){return e({url:"/api/user/change-password",method:"post",params:r})}export{u as a,s as b,a as c,n as g,o as l};
+import{r as e}from"./request-BkI0Euub.js";function s(){return e({url:"/api/user/list",method:"get"})}function u(r){return e({url:"/api/user/info",method:"get",params:r})}function n(r){return e({url:"/api/user/user-token-url",method:"get",params:r})}function o(r){return e({url:"/api/user/login",method:"post",params:r})}function a(r){return e({url:"/api/user/change-password",method:"post",params:r})}export{u as a,s as b,a as c,n as g,o as l};

+ 1 - 1
portal/dist/index.html

@@ -5,7 +5,7 @@
     <link rel="icon" type="image/svg+xml" href="/vite.svg" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>腾讯广告自动化管理后台</title>
-    <script type="module" crossorigin src="/assets/index-DEnlFJ9V.js"></script>
+    <script type="module" crossorigin src="/assets/index-Ddl5MZpq.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-Cqptlhyz.css">
   </head>
   <body>

+ 11 - 1
portal/src/views/ad-plan-conf/detail.vue

@@ -223,7 +223,17 @@
               >
                 <el-table-column prop="id" label="创意ID" width="100" />
                 <el-table-column prop="creativeName" label="创意名称" min-width="200" show-overflow-tooltip />
-                <el-table-column prop="creativeId" label="腾讯创意ID" width="150" />
+                <el-table-column prop="creativeId" label="腾讯创意ID" width="150">
+                  <template #default="{ row: creative }">
+                    <el-button
+                      v-if="creative.creativeId"
+                      type="primary"
+                      link
+                      @click="router.push({ path: '/daily-report', query: { dynamicCreativeId: creative.creativeId } })"
+                    >{{ creative.creativeId }}</el-button>
+                    <span v-else>-</span>
+                  </template>
+                </el-table-column>
                 <el-table-column label="创意图片/视频" width="120">
                   <template #default="{ row: creative }">
                     <el-image

+ 69 - 46
portal/src/views/daily-report/index.vue

@@ -43,57 +43,71 @@
       </div>
 
       <!-- 查询条件 -->
-      <div class="flex flex-wrap items-center gap-4 mb-6">
-        <!-- 时间口径 radio -->
-        <div class="flex items-center gap-2">
-          <span class="text-sm text-gray-600 font-medium">时间口径:</span>
-          <el-radio-group v-model="queryForm.timeLine" @change="handleTimeLineChange">
-            <el-radio-button value="REQUEST_TIME">请求时间</el-radio-button>
-            <el-radio-button value="REPORTING_TIME">上报时间</el-radio-button>
-          </el-radio-group>
-        </div>
+      <div class="flex flex-col gap-3 mb-6">
+        <!-- 第一行:筛选控件 -->
+        <div class="flex flex-wrap items-center gap-4">
+          <!-- 时间口径 radio -->
+          <div class="flex items-center gap-2">
+            <span class="text-sm text-gray-600 font-medium">时间口径:</span>
+            <el-radio-group v-model="queryForm.timeLine" @change="handleTimeLineChange">
+              <el-radio-button value="REQUEST_TIME">请求时间</el-radio-button>
+              <el-radio-button value="REPORTING_TIME">上报时间</el-radio-button>
+            </el-radio-group>
+          </div>
+
+          <el-select
+            v-model="queryForm.groupId"
+            placeholder="账号组筛选"
+            clearable
+            filterable
+            style="width: 180px"
+            @change="handleSearch"
+          >
+            <el-option
+              v-for="g in groupOptions"
+              :key="g.id"
+              :label="g.groupName"
+              :value="g.id"
+            />
+          </el-select>
 
-        <el-select
-          v-model="queryForm.groupId"
-          placeholder="账号组筛选"
-          clearable
-          filterable
-          style="width: 180px"
-          @change="handleSearch"
-        >
-          <el-option
-            v-for="g in groupOptions"
-            :key="g.id"
-            :label="g.groupName"
-            :value="g.id"
+          <el-input
+            v-model="queryForm.accountId"
+            placeholder="账户ID筛选"
+            clearable
+            style="width: 160px"
+            @clear="handleSearch"
           />
-        </el-select>
 
-        <el-input
-          v-model="queryForm.accountId"
-          placeholder="账户ID筛选"
-          clearable
-          style="width: 160px"
-          @clear="handleSearch"
-        />
+          <el-input
+            v-model="queryForm.dynamicCreativeId"
+            placeholder="动态创意ID筛选"
+            clearable
+            style="width: 180px"
+            @clear="handleSearch"
+          />
 
-        <el-date-picker
-          v-model="queryDateRange"
-          type="daterange"
-          range-separator="~"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
-          format="YYYY-MM-DD"
-          value-format="YYYY-MM-DD"
-          style="width: 240px"
-          @change="handleSearch"
-        />
+          <el-date-picker
+            v-model="queryDateRange"
+            type="daterange"
+            range-separator="~"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            style="width: 240px"
+            @change="handleSearch"
+          />
+        </div>
 
-        <el-button type="primary" @click="handleSearch">
-          <el-icon><Search /></el-icon>
-          查询
-        </el-button>
-        <el-button @click="handleReset">重置</el-button>
+        <!-- 第二行:按钮右对齐 -->
+        <div class="flex justify-end gap-2">
+          <el-button type="primary" @click="handleSearch">
+            <el-icon><Search /></el-icon>
+            查询
+          </el-button>
+          <el-button @click="handleReset">重置</el-button>
+        </div>
       </div>
 
       <!-- 数据统计卡片 -->
@@ -233,9 +247,12 @@
 import { ref, reactive, computed, onMounted } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import { Refresh, Search } from '@element-plus/icons-vue'
+import { useRoute } from 'vue-router'
 import { syncDailyReport, getDailyReportList } from '@/api/dailyReport'
 import { getAccountGroupListAll } from '@/api/accountGroup'
 
+const route = useRoute()
+
 // ─── 响应式状态 ───────────────────────────────────────────────────────────────
 const loading = ref(false)
 const syncing = ref(false)
@@ -251,6 +268,7 @@ const queryForm = reactive({
   timeLine: 'REQUEST_TIME',
   accountId: '',
   groupId: null,
+  dynamicCreativeId: '',
 })
 const getDefaultDateRange = () => {
   const end = new Date()
@@ -284,6 +302,7 @@ const loadList = async () => {
     }
     if (queryForm.accountId) params.accountId = queryForm.accountId
     if (queryForm.groupId) params.groupId = queryForm.groupId
+    if (queryForm.dynamicCreativeId) params.dynamicCreativeId = queryForm.dynamicCreativeId
     if (queryDateRange.value && queryDateRange.value.length === 2) {
       params.startDate = queryDateRange.value[0]
       params.endDate = queryDateRange.value[1]
@@ -317,6 +336,7 @@ const handleSearch = () => {
 const handleReset = () => {
   queryForm.accountId = ''
   queryForm.groupId = null
+  queryForm.dynamicCreativeId = ''
   queryDateRange.value = getDefaultDateRange()
   pagination.page = 1
   loadList()
@@ -407,6 +427,9 @@ const loadGroupOptions = async () => {
 // ─── 初始化 ───────────────────────────────────────────────────────────────────
 onMounted(() => {
   loadGroupOptions()
+  if (route.query.dynamicCreativeId) {
+    queryForm.dynamicCreativeId = String(route.query.dynamicCreativeId)
+  }
   loadList()
 })
 </script>

+ 3 - 2
src/main/java/com/moka/gdtauto/controller/DailyReportController.java

@@ -64,17 +64,18 @@ public class DailyReportController {
             @RequestParam(defaultValue = "REQUEST_TIME") String timeLine,
             @Parameter(description = "账号组ID(可选)") @RequestParam(required = false) Long groupId,
             @Parameter(description = "广告账户ID(可选)") @RequestParam(required = false) Long accountId,
+            @Parameter(description = "动态创意ID(可选)") @RequestParam(required = false) Long dynamicCreativeId,
             @Parameter(description = "开始日期 yyyy-MM-dd(可选)") @RequestParam(required = false) String startDate,
             @Parameter(description = "结束日期 yyyy-MM-dd(可选)") @RequestParam(required = false) String endDate,
             @Parameter(description = "页码") @RequestParam(defaultValue = "1") long page,
             @Parameter(description = "每页数量") @RequestParam(defaultValue = "20") long pageSize) {
         try {
             Page<? extends BaseDailyCreativeReport> result =
-                    dailyReportService.listReports(timeLine, groupId, accountId, startDate, endDate, page, pageSize);
+                    dailyReportService.listReports(timeLine, groupId, accountId, dynamicCreativeId, startDate, endDate, page, pageSize);
             return Result.success(result.getRecords(), "查询成功")
                     .withPage(page, pageSize, result.getTotal());
         } catch (Exception e) {
-            log.error("查询日报表失败 timeLine={} groupId={} accountId={}", timeLine, groupId, accountId, e);
+            log.error("查询日报表失败 timeLine={} groupId={} accountId={} dynamicCreativeId={}", timeLine, groupId, accountId, dynamicCreativeId, e);
             return Result.fail("查询失败:" + e.getMessage());
         }
     }

+ 12 - 6
src/main/java/com/moka/gdtauto/service/DailyReportService.java

@@ -230,20 +230,20 @@ public class DailyReportService {
      * @return 分页结果
      */
     public Page<? extends BaseDailyCreativeReport> listReports(
-            String timeLine, Long groupId, Long accountId, String startDate, String endDate,
-            long pageNum, long pageSize) {
+            String timeLine, Long groupId, Long accountId, Long dynamicCreativeId,
+            String startDate, String endDate, long pageNum, long pageSize) {
 
         if ("REPORTING_TIME".equals(timeLine)) {
-            LambdaQueryWrapper<RepDailyCreativeReport> wrapper = buildRepWrapper(groupId, accountId, startDate, endDate);
+            LambdaQueryWrapper<RepDailyCreativeReport> wrapper = buildRepWrapper(groupId, accountId, dynamicCreativeId, startDate, endDate);
             return repMapper.selectPage(new Page<>(pageNum, pageSize), wrapper);
         } else {
-            LambdaQueryWrapper<ReqDailyCreativeReport> wrapper = buildReqWrapper(groupId, accountId, startDate, endDate);
+            LambdaQueryWrapper<ReqDailyCreativeReport> wrapper = buildReqWrapper(groupId, accountId, dynamicCreativeId, startDate, endDate);
             return reqMapper.selectPage(new Page<>(pageNum, pageSize), wrapper);
         }
     }
 
     private LambdaQueryWrapper<ReqDailyCreativeReport> buildReqWrapper(
-            Long groupId, Long accountId, String startDate, String endDate) {
+            Long groupId, Long accountId, Long dynamicCreativeId, String startDate, String endDate) {
         LambdaQueryWrapper<ReqDailyCreativeReport> wrapper = new LambdaQueryWrapper<>();
         if (groupId != null) {
             wrapper.eq(ReqDailyCreativeReport::getGroupId, groupId);
@@ -251,6 +251,9 @@ public class DailyReportService {
         if (accountId != null) {
             wrapper.eq(ReqDailyCreativeReport::getAccountId, accountId);
         }
+        if (dynamicCreativeId != null) {
+            wrapper.eq(ReqDailyCreativeReport::getDynamicCreativeId, dynamicCreativeId);
+        }
         if (StringUtils.hasText(startDate)) {
             wrapper.ge(ReqDailyCreativeReport::getDate, LocalDate.parse(startDate));
         }
@@ -262,7 +265,7 @@ public class DailyReportService {
     }
 
     private LambdaQueryWrapper<RepDailyCreativeReport> buildRepWrapper(
-            Long groupId, Long accountId, String startDate, String endDate) {
+            Long groupId, Long accountId, Long dynamicCreativeId, String startDate, String endDate) {
         LambdaQueryWrapper<RepDailyCreativeReport> wrapper = new LambdaQueryWrapper<>();
         if (groupId != null) {
             wrapper.eq(RepDailyCreativeReport::getGroupId, groupId);
@@ -270,6 +273,9 @@ public class DailyReportService {
         if (accountId != null) {
             wrapper.eq(RepDailyCreativeReport::getAccountId, accountId);
         }
+        if (dynamicCreativeId != null) {
+            wrapper.eq(RepDailyCreativeReport::getDynamicCreativeId, dynamicCreativeId);
+        }
         if (StringUtils.hasText(startDate)) {
             wrapper.ge(RepDailyCreativeReport::getDate, LocalDate.parse(startDate));
         }

Некоторые файлы не были показаны из-за большого количества измененных файлов