pudongliang 4 месяцев назад
Родитель
Сommit
b70f07a913
36 измененных файлов с 109 добавлено и 44 удалено
  1. 1 1
      portal/dist/assets/accountGroup-BAd0fCyF.js
  2. 1 1
      portal/dist/assets/adAutoConf-BhPvHLV_.js
  3. 1 1
      portal/dist/assets/adPlanConf-BIdL5i6e.js
  4. 1 1
      portal/dist/assets/auth-B0Kx0M2i.js
  5. 1 1
      portal/dist/assets/conversion-B3dT7e3W.js
  6. 0 0
      portal/dist/assets/detail-Dvh-vKj5.js
  7. 1 1
      portal/dist/assets/drama-Ddgnj-xL.js
  8. 0 0
      portal/dist/assets/edit-CCyIEORk.js
  9. 0 0
      portal/dist/assets/index-B3iNzB9X.js
  10. 0 0
      portal/dist/assets/index-BGE0yj7F.js
  11. 0 0
      portal/dist/assets/index-BbZhaLoC.js
  12. 0 0
      portal/dist/assets/index-BnXorNQ4.js
  13. 1 0
      portal/dist/assets/index-BytCFd6m.css
  14. 0 0
      portal/dist/assets/index-C1eYw-wB.js
  15. 0 0
      portal/dist/assets/index-C9ifGIBO.js
  16. 0 0
      portal/dist/assets/index-CHjWWGm5.js
  17. 0 0
      portal/dist/assets/index-CatNEh8u.js
  18. 1 1
      portal/dist/assets/index-CuXvLoqi.js
  19. 0 0
      portal/dist/assets/index-CzDsQAlx.js
  20. 0 0
      portal/dist/assets/index-DEXbXPMs.js
  21. 0 0
      portal/dist/assets/index-DM9GTrnu.js
  22. 0 0
      portal/dist/assets/index-DOkJHAav.js
  23. 0 0
      portal/dist/assets/index-DWe8FYqV.js
  24. 0 1
      portal/dist/assets/index-cmer5d5F.css
  25. 0 0
      portal/dist/assets/index-fxutBkjh.js
  26. 0 0
      portal/dist/assets/index-ug-KRrVQ.js
  27. 0 0
      portal/dist/assets/index-w6GTBm0G.js
  28. 1 1
      portal/dist/assets/loadPageConf-B5lFTQ7D.js
  29. 1 1
      portal/dist/assets/ossFile-95Zaqtch.js
  30. 0 0
      portal/dist/assets/request-C2tRORoz.js
  31. 1 1
      portal/dist/assets/user-D6Z2QdJK.js
  32. 1 1
      portal/dist/index.html
  33. 3 2
      portal/src/views/oss-file/index.vue
  34. 28 29
      src/main/java/com/moka/gdtauto/controller/AdPlanConfController.java
  35. 23 1
      src/main/java/com/moka/gdtauto/mapper/OssFileMapper.java
  36. 43 0
      src/main/resources/mapper/OssFileMapper.xml

+ 1 - 1
portal/dist/assets/accountGroup-2OvOnCg-.js → portal/dist/assets/accountGroup-BAd0fCyF.js

@@ -1 +1 @@
-import{r as u}from"./request-CgdhMl9O.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-C2tRORoz.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/adAutoConf-CpVJ1VSG.js → portal/dist/assets/adAutoConf-BhPvHLV_.js

@@ -1 +1 @@
-import{r as e}from"./request-CgdhMl9O.js";function u(t){return e({url:"/api/ad-auto-conf/list",method:"get",params:t})}function n(t){return e({url:`/api/ad-auto-conf/${t}`,method:"get"})}function a(t){return e({url:"/api/ad-auto-conf",method:"post",data:t})}function r(t){return e({url:"/api/ad-auto-conf/update",method:"post",data:t})}function i(t){return e({url:`/api/ad-auto-conf/execute?id=${t}`,method:"post"})}function d(t){return e({url:"/api/execute-log/list",method:"get",params:t})}function c(t){return e({url:"/api/execute-log/getChildLog",method:"get",params:t})}export{c as a,d as b,n as c,i as e,u as g,a as s,r as u};
+import{r as e}from"./request-C2tRORoz.js";function u(t){return e({url:"/api/ad-auto-conf/list",method:"get",params:t})}function n(t){return e({url:`/api/ad-auto-conf/${t}`,method:"get"})}function a(t){return e({url:"/api/ad-auto-conf",method:"post",data:t})}function r(t){return e({url:"/api/ad-auto-conf/update",method:"post",data:t})}function i(t){return e({url:`/api/ad-auto-conf/execute?id=${t}`,method:"post"})}function d(t){return e({url:"/api/execute-log/list",method:"get",params:t})}function c(t){return e({url:"/api/execute-log/getChildLog",method:"get",params:t})}export{c as a,d as b,n as c,i as e,u as g,a as s,r as u};

+ 1 - 1
portal/dist/assets/adPlanConf-C-V5pcFH.js → portal/dist/assets/adPlanConf-BIdL5i6e.js

@@ -1 +1 @@
-import{r as a}from"./request-CgdhMl9O.js";function d(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 u(n){return a({url:`/api/ad-plan-conf/reGeneratePlan/${n}`,method:"get"})}function l(n){return a({url:`/api/ad-plan-conf/syncSystemStatus/${n}`,method:"get"})}function p(n){return a({url:"/api/ad-plan-conf/create",method:"post",data:n})}function s(n){return a({url:"/api/ad-plan-conf/update",method:"post",data:n})}function i(n=1,e=10,t={}){return a({url:"/api/ad-plan-conf/list",method:"get",params:{pageNum:n,pageSize:e,...t}})}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 g(n){return a({url:`/api/ad-plan-creative/plan/${n}`,method:"get"})}function m(n){return a({url:"/api/ad-plan-conf/gdtSuspendByConfId",params:{confId:n},method:"get"})}function h(n){return a({url:"/api/ad-plan-conf/gdtDeleteByConfId",params:{confId:n},method:"get"})}function C(n,e){return a({url:`/api/ad-plan-conf/gdtSuspendByPlanIds/${n}`,method:"post",data:e})}function P(n,e){return a({url:`/api/ad-plan-conf/gdtDeleteByPlanIds/${n}`,method:"post",data:e})}function y(n=[]){return a({url:"/api/ad-plan-conf/getOneCreativeImage",method:"post",data:n})}function I(){return a({url:"/api/ad-plan-conf/getOneBrandImage",method:"get"})}function B(n=[]){return a({url:"/api/ad-plan-conf/getOneCreativeVideo",method:"post",data:n})}export{y as a,I as b,B as c,o as d,p as e,f,i as g,c as h,h as i,C as j,P as k,l,u as m,g as n,d as r,m as s,s as u};
+import{r as a}from"./request-C2tRORoz.js";function d(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 u(n){return a({url:`/api/ad-plan-conf/reGeneratePlan/${n}`,method:"get"})}function l(n){return a({url:`/api/ad-plan-conf/syncSystemStatus/${n}`,method:"get"})}function p(n){return a({url:"/api/ad-plan-conf/create",method:"post",data:n})}function s(n){return a({url:"/api/ad-plan-conf/update",method:"post",data:n})}function i(n=1,e=10,t={}){return a({url:"/api/ad-plan-conf/list",method:"get",params:{pageNum:n,pageSize:e,...t}})}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 g(n){return a({url:`/api/ad-plan-creative/plan/${n}`,method:"get"})}function m(n){return a({url:"/api/ad-plan-conf/gdtSuspendByConfId",params:{confId:n},method:"get"})}function h(n){return a({url:"/api/ad-plan-conf/gdtDeleteByConfId",params:{confId:n},method:"get"})}function C(n,e){return a({url:`/api/ad-plan-conf/gdtSuspendByPlanIds/${n}`,method:"post",data:e})}function P(n,e){return a({url:`/api/ad-plan-conf/gdtDeleteByPlanIds/${n}`,method:"post",data:e})}function y(n=[]){return a({url:"/api/ad-plan-conf/getOneCreativeImage",method:"post",data:n})}function I(){return a({url:"/api/ad-plan-conf/getOneBrandImage",method:"get"})}function B(n=[]){return a({url:"/api/ad-plan-conf/getOneCreativeVideo",method:"post",data:n})}export{y as a,I as b,B as c,o as d,p as e,f,i as g,c as h,h as i,C as j,P as k,l,u as m,g as n,d as r,m as s,s as u};

+ 1 - 1
portal/dist/assets/auth-DxAtOt9T.js → portal/dist/assets/auth-B0Kx0M2i.js

@@ -1 +1 @@
-import{r as t}from"./request-CgdhMl9O.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-C2tRORoz.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-nqk9Ow0a.js → portal/dist/assets/conversion-B3dT7e3W.js

@@ -1 +1 @@
-import{r as t}from"./request-CgdhMl9O.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-C2tRORoz.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-Dvh-vKj5.js


+ 1 - 1
portal/dist/assets/drama-CFOfZF5N.js → portal/dist/assets/drama-Ddgnj-xL.js

@@ -1 +1 @@
-import{r as t}from"./request-CgdhMl9O.js";function n(a){return t({url:"/api/gdt/asset/drama/sync",method:"post",params:{accountId:a}})}function m(a=1,s=20,r=""){return t({url:"/api/gdt/asset/drama/list",method:"get",params:{dramaName:r,page:a,pageSize:s}})}function d(a){return t({url:"/api/gdt/asset/drama/myDramaAssets",method:"get",params:{dramaName:a}})}function o(){return t({url:"/api/gdt/asset/drama/sync/conf/myConf",method:"get"})}function u(a){return t({url:"/api/gdt/asset/drama/sync/conf/add",method:"post",data:a})}function i(a){return t({url:"/api/gdt/asset/drama/sync/conf/delete",method:"post",params:{id:a}})}export{o as a,u as b,i as d,m as g,d as m,n as s};
+import{r as t}from"./request-C2tRORoz.js";function n(a){return t({url:"/api/gdt/asset/drama/sync",method:"post",params:{accountId:a}})}function m(a=1,s=20,r=""){return t({url:"/api/gdt/asset/drama/list",method:"get",params:{dramaName:r,page:a,pageSize:s}})}function d(a){return t({url:"/api/gdt/asset/drama/myDramaAssets",method:"get",params:{dramaName:a}})}function o(){return t({url:"/api/gdt/asset/drama/sync/conf/myConf",method:"get"})}function u(a){return t({url:"/api/gdt/asset/drama/sync/conf/add",method:"post",data:a})}function i(a){return t({url:"/api/gdt/asset/drama/sync/conf/delete",method:"post",params:{id:a}})}export{o as a,u as b,i as d,m as g,d as m,n as s};

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


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


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


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


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


+ 1 - 0
portal/dist/assets/index-BytCFd6m.css

@@ -0,0 +1 @@
+.btn-primary[data-v-dfb828c0]{background:linear-gradient(135deg,#667eea,#764ba2);border:none;color:#fff}.btn-primary[data-v-dfb828c0]:hover{background:linear-gradient(135deg,#764ba2,#667eea)}.btn-secondary[data-v-dfb828c0]{border-color:#e5e7eb;color:#6b7280}.btn-secondary[data-v-dfb828c0]:hover{background-color:#f9fafb}[data-v-dfb828c0] .el-upload-dragger{border:2px dashed #d1d5db;border-radius:8px;background-color:#f9fafb;transition:all .3s}[data-v-dfb828c0] .el-upload-dragger:hover{border-color:#667eea;background-color:#f3f4f6}

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


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


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


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


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


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


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


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


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


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


+ 0 - 1
portal/dist/assets/index-cmer5d5F.css

@@ -1 +0,0 @@
-.btn-primary[data-v-68b802a8]{background:linear-gradient(135deg,#667eea,#764ba2);border:none;color:#fff}.btn-primary[data-v-68b802a8]:hover{background:linear-gradient(135deg,#764ba2,#667eea)}.btn-secondary[data-v-68b802a8]{border-color:#e5e7eb;color:#6b7280}.btn-secondary[data-v-68b802a8]:hover{background-color:#f9fafb}[data-v-68b802a8] .el-upload-dragger{border:2px dashed #d1d5db;border-radius:8px;background-color:#f9fafb;transition:all .3s}[data-v-68b802a8] .el-upload-dragger:hover{border-color:#667eea;background-color:#f3f4f6}

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


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


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


+ 1 - 1
portal/dist/assets/loadPageConf-CAQ9FTkb.js → portal/dist/assets/loadPageConf-B5lFTQ7D.js

@@ -1 +1 @@
-import{r as o}from"./request-CgdhMl9O.js";function t(a){return o({url:"/api/load-page-conf/list",method:"get",params:a})}function n(a){return o({url:`/api/load-page-conf/${a}`,method:"get"})}function r(a){return o({url:"/api/load-page-conf",method:"post",data:a})}function u(a){return o({url:"/api/load-page-conf",method:"put",data:a})}function d(){return o({url:"/api/load-page-conf/all",method:"get"})}export{t as a,n as b,r as c,d as g,u};
+import{r as o}from"./request-C2tRORoz.js";function t(a){return o({url:"/api/load-page-conf/list",method:"get",params:a})}function n(a){return o({url:`/api/load-page-conf/${a}`,method:"get"})}function r(a){return o({url:"/api/load-page-conf",method:"post",data:a})}function u(a){return o({url:"/api/load-page-conf",method:"put",data:a})}function d(){return o({url:"/api/load-page-conf/all",method:"get"})}export{t as a,n as b,r as c,d as g,u};

+ 1 - 1
portal/dist/assets/ossFile-CfVewPzV.js → portal/dist/assets/ossFile-95Zaqtch.js

@@ -1 +1 @@
-import{r as t}from"./request-CgdhMl9O.js";function i(e){return t({timeout:12e5,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-C2tRORoz.js";function i(e){return t({timeout:12e5,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-C2tRORoz.js


+ 1 - 1
portal/dist/assets/user-Czh6CS-e.js → portal/dist/assets/user-D6Z2QdJK.js

@@ -1 +1 @@
-import{r as e}from"./request-CgdhMl9O.js";function t(){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})}function i(r){return e({url:"/api/user/save",method:"post",params:r})}export{u as a,t as b,a as c,n as g,o as l,i as s};
+import{r as e}from"./request-C2tRORoz.js";function t(){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})}function i(r){return e({url:"/api/user/save",method:"post",params:r})}export{u as a,t as b,a as c,n as g,o as l,i as s};

+ 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-sSt_Bee6.js"></script>
+    <script type="module" crossorigin src="/assets/index-CuXvLoqi.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-5iqyiYFJ.css">
   </head>
   <body>

+ 3 - 2
portal/src/views/oss-file/index.vue

@@ -124,6 +124,7 @@
         :data="fileList" 
         v-loading="loading"
         @sort-change="handleSortChange"
+        :default-sort="{ prop: 'normalCnt', order: 'descending' }"
         style="width: 100%"
         :header-cell-style="{ background: '#f9fafb', color: '#374151', fontWeight: '600' }">
         <el-table-column prop="id" label="ID" width="80"></el-table-column>
@@ -329,8 +330,8 @@ const pagination = reactive({
 
 // 排序
 const sortParams = reactive({
-  sortField: '',
-  sortOrder: ''
+  sortField: 'normalCnt',
+  sortOrder: 'descending'
 })
 
 // 预览

+ 28 - 29
src/main/java/com/moka/gdtauto/controller/AdPlanConfController.java

@@ -1,5 +1,25 @@
 package com.moka.gdtauto.controller;
 
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.springaicommunity.mcp.annotation.McpTool;
+import org.springaicommunity.mcp.annotation.McpToolParam;
+import org.springframework.beans.BeanUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -9,16 +29,15 @@ import com.moka.gdtauto.controller.vo.CreateAdPlanConfRequest;
 import com.moka.gdtauto.controller.vo.UpdateAdPlanConfRequest;
 import com.moka.gdtauto.entity.AccountGroup;
 import com.moka.gdtauto.entity.AccountGroupAccountRelationship;
+import com.moka.gdtauto.entity.AdPlan;
 import com.moka.gdtauto.entity.AdPlanConf;
+import com.moka.gdtauto.entity.AdPlanCreative;
+import com.moka.gdtauto.entity.OssFile;
 import com.moka.gdtauto.entity.SysUser;
 import com.moka.gdtauto.entity.TencentAssetDrama;
 import com.moka.gdtauto.entity.TencentAssetFiction;
-import com.moka.gdtauto.entity.AdPlan;
-import com.moka.gdtauto.entity.AdPlanCreative;
-import com.moka.gdtauto.entity.OssFile;
-import com.moka.gdtauto.service.SysUserService;
-
 import com.moka.gdtauto.mapper.AccountGroupAccountRelationshipMapper;
+import com.moka.gdtauto.mapper.OssFileMapper;
 import com.moka.gdtauto.mapper.TencentAssetDramaMapper;
 import com.moka.gdtauto.mapper.TencentAssetFictionMapper;
 import com.moka.gdtauto.service.AccountGroupService;
@@ -28,6 +47,7 @@ import com.moka.gdtauto.service.AdPlanCreativeService;
 import com.moka.gdtauto.service.AdPlanDailyReportService;
 import com.moka.gdtauto.service.AdPlanService;
 import com.moka.gdtauto.service.OssFileService;
+import com.moka.gdtauto.service.SysUserService;
 
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -36,20 +56,6 @@ import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springaicommunity.mcp.annotation.McpTool;
-import org.springaicommunity.mcp.annotation.McpToolParam;
-import org.springframework.beans.BeanUtils;
-import org.springframework.web.bind.annotation.*;
-
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-
 /**
  * 广告计划配置管理控制器
  *
@@ -75,6 +81,7 @@ public class AdPlanConfController {
     private final TencentAssetDramaMapper tencentAssetDramaMapper;
     private final TencentAssetFictionMapper tencentAssetFictionMapper;
     private final OssFileService ossFileService;
+    private final OssFileMapper ossFileMapper;
 
     @GetMapping("/gdtSuspendByConfId")
     public Result<Void> gdtSuspendByConfId(@NotNull Long confId) {
@@ -690,11 +697,7 @@ public class AdPlanConfController {
     @PostMapping("/getOneCreativeImage")
     public Result<OssFile> getOneCreativeImage(@RequestBody List<Long> ids) {
         try {
-            OssFile ossFile = ossFileService.lambdaQuery()
-                    .notIn(ids != null && !ids.isEmpty(), OssFile::getId, ids)
-                    .eq(OssFile::getBusinessType, 1)
-                    .eq(OssFile::getFileType, "image")
-                    .last("order by rand() limit 1").one();
+            OssFile ossFile = ossFileMapper.selectOneCreativeImage(ids);
             return Result.success(ossFile, "查询成功");
         } catch (Exception e) {
             log.error("查询创意图片失败", e);
@@ -705,11 +708,7 @@ public class AdPlanConfController {
     @PostMapping("/getOneCreativeVideo")
     public Result<OssFile> getOneCreativeVideo(@RequestBody List<Long> ids) {
         try {
-            OssFile ossFile = ossFileService.lambdaQuery()
-                    .notIn(ids != null && !ids.isEmpty(), OssFile::getId, ids)
-                    .eq(OssFile::getBusinessType, 1)
-                    .eq(OssFile::getFileType, "video")
-                    .last("order by rand() limit 1").one();
+            OssFile ossFile = ossFileMapper.selectOneCreativeVideo(ids);
             return Result.success(ossFile, "查询成功");
         } catch (Exception e) {
             log.error("查询创意视频失败", e);

+ 23 - 1
src/main/java/com/moka/gdtauto/mapper/OssFileMapper.java

@@ -1,8 +1,12 @@
 package com.moka.gdtauto.mapper;
 
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.moka.gdtauto.entity.OssFile;
-import org.apache.ibatis.annotations.Mapper;
 
 /**
  * OSS文件Mapper
@@ -12,4 +16,22 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface OssFileMapper extends BaseMapper<OssFile> {
+
+    /**
+     * 随机获取一个创意图片
+     * 按normalCnt降序取前100,再随机取1个
+     *
+     * @param excludeIds 排除的ID列表
+     * @return 随机一个创意图片
+     */
+    OssFile selectOneCreativeImage(@Param("excludeIds") List<Long> excludeIds);
+
+    /**
+     * 随机获取一个创意视频
+     * 按normalCnt降序取前100,再随机取1个
+     *
+     * @param excludeIds 排除的ID列表
+     * @return 随机一个创意视频
+     */
+    OssFile selectOneCreativeVideo(@Param("excludeIds") List<Long> excludeIds);
 }

+ 43 - 0
src/main/resources/mapper/OssFileMapper.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.moka.gdtauto.mapper.OssFileMapper">
+
+    <!-- 随机获取一个创意图片:按normalCnt降序取前100,再随机取1个 -->
+    <select id="selectOneCreativeImage" resultType="com.moka.gdtauto.entity.OssFile">
+        SELECT * FROM (
+            SELECT * FROM oss_file
+            WHERE business_type = 1
+              AND file_type = 'image'
+            <if test="excludeIds != null and excludeIds.size() > 0">
+              AND id NOT IN
+              <foreach collection="excludeIds" item="id" open="(" separator="," close=")">
+                  #{id}
+              </foreach>
+            </if>
+            ORDER BY normal_cnt DESC
+            LIMIT 100
+        ) t
+        ORDER BY RAND()
+        LIMIT 1
+    </select>
+
+    <!-- 随机获取一个创意视频:按normalCnt降序取前100,再随机取1个 -->
+    <select id="selectOneCreativeVideo" resultType="com.moka.gdtauto.entity.OssFile">
+        SELECT * FROM (
+            SELECT * FROM oss_file
+            WHERE business_type = 1
+              AND file_type = 'video'
+            <if test="excludeIds != null and excludeIds.size() > 0">
+              AND id NOT IN
+              <foreach collection="excludeIds" item="id" open="(" separator="," close=")">
+                  #{id}
+              </foreach>
+            </if>
+            ORDER BY normal_cnt DESC
+            LIMIT 100
+        ) t
+        ORDER BY RAND()
+        LIMIT 1
+    </select>
+
+</mapper>

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