Kaynağa Gözat

feat:oss统计信息

pudongliang 3 ay önce
ebeveyn
işleme
7ac3f62809
44 değiştirilmiş dosya ile 446 ekleme ve 14 silme
  1. 1 1
      portal/dist/assets/accountGroup-DvnOG9za.js
  2. 1 1
      portal/dist/assets/adAutoConf-C8lV-SLM.js
  3. 1 1
      portal/dist/assets/adPlanConf-BE1hGncb.js
  4. 1 1
      portal/dist/assets/auth-DDSJpyNG.js
  5. 1 1
      portal/dist/assets/conversion-D6UGbBAA.js
  6. 0 0
      portal/dist/assets/detail-63zmLdqK.js
  7. 1 1
      portal/dist/assets/drama-CvYjeuS2.js
  8. 0 0
      portal/dist/assets/edit-Bhkk9QS6.js
  9. 0 0
      portal/dist/assets/index-BEtcxoYh.js
  10. 0 0
      portal/dist/assets/index-BMaRQxpE.js
  11. 0 0
      portal/dist/assets/index-BXjw3Jkk.js
  12. 0 0
      portal/dist/assets/index-C-eJ30vf.js
  13. 0 0
      portal/dist/assets/index-CLaYrYO6.js
  14. 0 0
      portal/dist/assets/index-CSKmCQ2E.js
  15. 0 0
      portal/dist/assets/index-CXM1wOXi.js
  16. 0 0
      portal/dist/assets/index-C_eHbfdO.js
  17. 0 0
      portal/dist/assets/index-Ci8mi7xk.js
  18. 0 0
      portal/dist/assets/index-CyX2_mWc.js
  19. 0 0
      portal/dist/assets/index-DM7VrY0Z.js
  20. 0 0
      portal/dist/assets/index-Dd8ZcZGQ.js
  21. 0 1
      portal/dist/assets/index-DrYVoRf5.css
  22. 0 0
      portal/dist/assets/index-DsFW5L6c.js
  23. 0 0
      portal/dist/assets/index-DxzMOL2u.js
  24. 1 0
      portal/dist/assets/index-Fe6AY40M.css
  25. 0 0
      portal/dist/assets/index-Jycq3T02.js
  26. 1 1
      portal/dist/assets/index-mkWMdM4q.js
  27. 0 0
      portal/dist/assets/index-n1MTDYBJ.js
  28. 0 0
      portal/dist/assets/index-pTyNgjj5.js
  29. 0 0
      portal/dist/assets/index-vc1Xg7fG.js
  30. 1 1
      portal/dist/assets/loadPageConf-D_J2idzf.js
  31. 1 1
      portal/dist/assets/ossFile-DibOdEnt.js
  32. 0 0
      portal/dist/assets/request-CsOIWPcO.js
  33. 1 1
      portal/dist/assets/user-B3m_EdnO.js
  34. 1 1
      portal/dist/index.html
  35. 18 0
      portal/src/api/ossFileStatistics.js
  36. 178 1
      portal/src/views/oss-file/index.vue
  37. 1 1
      src/main/java/com/moka/gdtauto/BaseCodeGenerator.java
  38. 55 0
      src/main/java/com/moka/gdtauto/controller/OssFileStatisticsController.java
  39. 59 0
      src/main/java/com/moka/gdtauto/entity/OssFileStatistics.java
  40. 19 0
      src/main/java/com/moka/gdtauto/mapper/OssFileStatisticsMapper.java
  41. 3 0
      src/main/java/com/moka/gdtauto/service/DailyCreativeReportService.java
  42. 28 0
      src/main/java/com/moka/gdtauto/service/OssFileStatisticsService.java
  43. 47 0
      src/main/java/com/moka/gdtauto/service/impl/OssFileStatisticsServiceImp.java
  44. 26 0
      src/main/resources/mapper/OssFileStatisticsMapper.xml

+ 1 - 1
portal/dist/assets/accountGroup-DDCIkMjo.js → portal/dist/assets/accountGroup-DvnOG9za.js

@@ -1 +1 @@
-import{r as u}from"./request-BM46Io-o.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-CsOIWPcO.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-CRCvAD5I.js → portal/dist/assets/adAutoConf-C8lV-SLM.js

@@ -1 +1 @@
-import{r as e}from"./request-BM46Io-o.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 d(t){return e({url:`/api/ad-auto-conf/${t}`,method:"delete"})}function i(t){return e({url:`/api/ad-auto-conf/execute?id=${t}`,method:"post"})}function f(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,f as b,n as c,d,i as e,u as g,a as s,r as u};
+import{r as e}from"./request-CsOIWPcO.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 d(t){return e({url:`/api/ad-auto-conf/${t}`,method:"delete"})}function i(t){return e({url:`/api/ad-auto-conf/execute?id=${t}`,method:"post"})}function f(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,f as b,n as c,d,i as e,u as g,a as s,r as u};

+ 1 - 1
portal/dist/assets/adPlanConf-DN-584PS.js → portal/dist/assets/adPlanConf-BE1hGncb.js

@@ -1 +1 @@
-import{r as a}from"./request-BM46Io-o.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-CsOIWPcO.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-IuMEyWYV.js → portal/dist/assets/auth-DDSJpyNG.js

@@ -1 +1 @@
-import{r as t}from"./request-BM46Io-o.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-CsOIWPcO.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-BODC77PG.js → portal/dist/assets/conversion-D6UGbBAA.js

@@ -1 +1 @@
-import{r as t}from"./request-BM46Io-o.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-CsOIWPcO.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};

Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/detail-63zmLdqK.js


+ 1 - 1
portal/dist/assets/drama-jl25vPkl.js → portal/dist/assets/drama-CvYjeuS2.js

@@ -1 +1 @@
-import{r as t}from"./request-BM46Io-o.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-CsOIWPcO.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};

Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/edit-Bhkk9QS6.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-BEtcxoYh.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-BMaRQxpE.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-BXjw3Jkk.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-C-eJ30vf.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-CLaYrYO6.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-CSKmCQ2E.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-CXM1wOXi.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-C_eHbfdO.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-Ci8mi7xk.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-CyX2_mWc.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-DM7VrY0Z.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-Dd8ZcZGQ.js


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

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

Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-DsFW5L6c.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-DxzMOL2u.js


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

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

Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-Jycq3T02.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 1 - 1
portal/dist/assets/index-mkWMdM4q.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-n1MTDYBJ.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-pTyNgjj5.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/index-vc1Xg7fG.js


+ 1 - 1
portal/dist/assets/loadPageConf-tW7gTqRx.js → portal/dist/assets/loadPageConf-D_J2idzf.js

@@ -1 +1 @@
-import{r as o}from"./request-BM46Io-o.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-CsOIWPcO.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-DvzFArb5.js → portal/dist/assets/ossFile-DibOdEnt.js

@@ -1 +1 @@
-import{r as t}from"./request-BM46Io-o.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-CsOIWPcO.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};

Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
portal/dist/assets/request-CsOIWPcO.js


+ 1 - 1
portal/dist/assets/user-BiSodnLp.js → portal/dist/assets/user-B3m_EdnO.js

@@ -1 +1 @@
-import{r as e}from"./request-BM46Io-o.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-CsOIWPcO.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-BKDPOEyM.js"></script>
+    <script type="module" crossorigin src="/assets/index-mkWMdM4q.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-5iqyiYFJ.css">
   </head>
   <body>

+ 18 - 0
portal/src/api/ossFileStatistics.js

@@ -0,0 +1,18 @@
+import request from '../utils/request'
+
+/**
+ * 获取文件统计列表
+ * @param {Object} params - 查询参数
+ * @param {number} params.page - 页码
+ * @param {number} params.size - 每页数量
+ * @param {string} params.fileMd5 - 文件MD5
+ * @param {string} params.startDate - 开始日期
+ * @param {string} params.endDate - 结束日期
+ */
+export function getFileStatisticsList(params) {
+  return request({
+    url: '/api/oss-file-statistics/list',
+    method: 'get',
+    params
+  })
+}

+ 178 - 1
portal/src/views/oss-file/index.vue

@@ -183,12 +183,13 @@
           </template>
         </el-table-column>
         
-        <el-table-column label="操作" width="200" fixed="right">
+        <el-table-column label="操作" width="250" fixed="right">
           <template #default="{ row }">
             <div class="flex gap-2">
               <el-button type="primary" size="small" link @click="copyUrl(row)">复制链接</el-button>
               <el-button type="primary" size="small" link @click="downloadFile(row)">下载</el-button>
               <el-button type="danger" size="small" link @click="handleDelete(row)">删除</el-button>
+              <el-button type="danger" size="small" link @click="handleStatistics(row)">统计</el-button>
             </div>
           </template>
         </el-table-column>
@@ -214,6 +215,78 @@
         <img :src="previewUrl" alt="预览" style="max-width: 100%; max-height: 600px;">
       </div>
     </el-dialog>
+
+    <!-- 统计信息弹窗 -->
+    <el-dialog v-model="statisticsDialogVisible" :title="`文件统计 - ${currentFileName}`" width="900px">
+      <div class="space-y-4">
+        <!-- 日期筛选 -->
+        <div class="bg-gray-50 p-4 rounded-lg">
+          <el-form :inline="true" :model="statisticsQuery" class="flex flex-wrap gap-4">
+            <el-form-item label="日期范围">
+              <el-date-picker
+                v-model="statisticsQuery.dateRange"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="YYYY-MM-DD"
+                style="width: 280px">
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="handleStatisticsQuery">查询</el-button>
+              <el-button @click="handleStatisticsReset">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+
+        <!-- 统计表格 -->
+        <el-table
+          :data="statisticsList"
+          v-loading="statisticsLoading"
+          style="width: 100%"
+          :header-cell-style="{ background: '#f9fafb', color: '#374151', fontWeight: '600' }">
+          <el-table-column prop="date" label="日期" width="120">
+            <template #default="{ row }">
+              {{ row.date.substring(0, 10) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="viewCount" label="曝光次数" width="120">
+            <template #default="{ row }">
+              {{ formatNumber(row.viewCount) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="validClickCount" label="点击次数" width="120">
+            <template #default="{ row }">
+              {{ formatNumber(row.validClickCount) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="ctr" label="点击率" width="120">
+            <template #default="{ row }">
+              <el-tag :type="getCtrTagType(row.ctr)" size="small">{{ formatCtr(row.ctr) }}</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column prop="cost" label="花费(元)" min-width="120">
+            <template #default="{ row }">
+              {{ formatCost(row.cost) }}
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <!-- 分页 -->
+        <div class="flex justify-end">
+          <el-pagination
+            v-model:current-page="statisticsPagination.page"
+            v-model:page-size="statisticsPagination.size"
+            :page-sizes="[10, 20, 50, 100]"
+            :total="statisticsPagination.total"
+            layout="total, sizes, prev, pager, next, jumper"
+            @size-change="handleStatisticsSizeChange"
+            @current-change="handleStatisticsPageChange">
+          </el-pagination>
+        </div>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -227,6 +300,7 @@ import { useRouter } from 'vue-router'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import { UploadFilled } from '@element-plus/icons-vue'
 import { uploadFile, getFileList, deleteFile, batchDeleteFiles } from '@/api/ossFile'
+import { getFileStatisticsList } from '@/api/ossFileStatistics'
 
 const router = useRouter()
 
@@ -347,6 +421,21 @@ const sortParams = reactive({
 const previewVisible = ref(false)
 const previewUrl = ref('')
 
+// 统计弹窗相关
+const statisticsDialogVisible = ref(false)
+const currentFileMd5 = ref('')
+const currentFileName = ref('')
+const statisticsList = ref([])
+const statisticsLoading = ref(false)
+const statisticsQuery = reactive({
+  dateRange: []
+})
+const statisticsPagination = reactive({
+  page: 1,
+  size: 10,
+  total: 0
+})
+
 // 验证普通图片
 const validateNormalImage = (file) => {
   return new Promise((resolve, reject) => {
@@ -529,6 +618,17 @@ const handleSelectionChange = (selection) => {
   selectedFiles.value = selection
 }
 
+const handleStatistics = (row) => {
+  currentFileMd5.value = row.fileMd5
+  currentFileName.value = row.originalFileName
+  statisticsDialogVisible.value = true
+  // 重置查询条件并加载数据
+  statisticsQuery.dateRange = []
+  statisticsPagination.page = 1
+  loadStatisticsList()
+}
+
+
 // 删除文件
 const handleDelete = (row) => {
   ElMessageBox.confirm('确定要删除该文件吗?', '提示', {
@@ -649,6 +749,83 @@ const goToCreativeList = (md5) => {
 onMounted(() => {
   loadFileList()
 })
+
+// 加载统计列表
+const loadStatisticsList = async () => {
+  if (!currentFileMd5.value) {
+    return
+  }
+  statisticsLoading.value = true
+  try {
+    const res = await getFileStatisticsList({
+      page: statisticsPagination.page,
+      size: statisticsPagination.size,
+      fileMd5: currentFileMd5.value,
+      startDate: statisticsQuery.dateRange && statisticsQuery.dateRange.length > 0 ? statisticsQuery.dateRange[0] : '',
+      endDate: statisticsQuery.dateRange && statisticsQuery.dateRange.length > 0 ? statisticsQuery.dateRange[1] : ''
+    })
+    if (res.success) {
+      statisticsList.value = res.data.records
+      statisticsPagination.total = res.data.total
+    } else {
+      ElMessage.error(res.message || '查询统计失败')
+    }
+  } catch (error) {
+    console.error('查询统计失败:', error)
+    ElMessage.error('查询统计失败')
+  } finally {
+    statisticsLoading.value = false
+  }
+}
+
+// 统计查询
+const handleStatisticsQuery = () => {
+  statisticsPagination.page = 1
+  loadStatisticsList()
+}
+
+// 统计重置
+const handleStatisticsReset = () => {
+  statisticsQuery.dateRange = []
+  handleStatisticsQuery()
+}
+
+// 统计分页变化
+const handleStatisticsSizeChange = (size) => {
+  statisticsPagination.size = size
+  loadStatisticsList()
+}
+
+const handleStatisticsPageChange = (page) => {
+  statisticsPagination.page = page
+  loadStatisticsList()
+}
+
+// 格式化数字
+const formatNumber = (num) => {
+  if (num === null || num === undefined) return '-'
+  return num.toLocaleString('zh-CN')
+}
+
+// 格式化点击率
+const formatCtr = (ctr) => {
+  if (ctr === null || ctr === undefined) return '-'
+  return (ctr * 100).toFixed(2) + '%'
+}
+
+// 根据点击率获取标签类型
+const getCtrTagType = (ctr) => {
+  if (ctr === null || ctr === undefined) return 'info'
+  if (ctr >= 0.05) return 'success'
+  if (ctr >= 0.02) return 'warning'
+  return 'danger'
+}
+
+// 格式化花费(分转元)
+const formatCost = (cost) => {
+  if (cost === null || cost === undefined) return '-'
+  return '¥' + (cost / 100).toFixed(2)
+}
 </script>
 
 <style scoped>

+ 1 - 1
src/main/java/com/moka/gdtauto/BaseCodeGenerator.java

@@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
 
 public class BaseCodeGenerator {
 
-    public final static String TABLE_NAMES = "rep_daily_adgroup_report,req_daily_adgroup_report";
+    public final static String TABLE_NAMES = "oss_file_statistics";
     public static void main(String[] args) {
         String url = "jdbc:mysql://rm-uf65d6xsxrp743w3aio.mysql.rds.aliyuncs.com:3306/gdt_auto?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true";
         FastAutoGenerator.create(url, "gdt_auto", "QA_GDT_AUTO%$PDL")

+ 55 - 0
src/main/java/com/moka/gdtauto/controller/OssFileStatisticsController.java

@@ -0,0 +1,55 @@
+package com.moka.gdtauto.controller;
+
+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;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.moka.gdtauto.common.Result;
+import com.moka.gdtauto.entity.OssFileStatistics;
+import com.moka.gdtauto.service.OssFileStatisticsService;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * <p>
+ * OSS文件统计表 前端控制器
+ * </p>
+ *
+ * @author mokamvp
+ * @since 2026-03-25
+ */
+@Tag(name = "OSS文件统计", description = "OSS文件统计数据查询")
+@Slf4j
+@RestController
+@RequestMapping("/api/oss-file-statistics")
+@RequiredArgsConstructor
+public class OssFileStatisticsController {
+
+    private final OssFileStatisticsService ossFileStatisticsService;
+
+    /**
+     * 根据fileMd5和日期范围分页查询统计数据
+     */
+    @Operation(summary = "分页查询文件统计", description = "根据fileMd5和日期范围分页查询统计数据")
+    @GetMapping("/list")
+    public Result<Page<OssFileStatistics>> listStatistics(
+            @Parameter(description = "页码") @RequestParam(defaultValue = "1") Long page,
+            @Parameter(description = "每页数量") @RequestParam(defaultValue = "10") Long size,
+            @Parameter(description = "文件MD5", required = true) @RequestParam String fileMd5,
+            @Parameter(description = "开始日期,格式:yyyy-MM-dd") @RequestParam(required = false) String startDate,
+            @Parameter(description = "结束日期,格式:yyyy-MM-dd") @RequestParam(required = false) String endDate) {
+        try {
+            Page<OssFileStatistics> result = ossFileStatisticsService.listStatisticsByMd5AndDate(page, size, fileMd5, startDate, endDate);
+            return Result.success(result);
+        } catch (Exception e) {
+            log.error("查询文件统计失败", e);
+            return Result.fail("查询文件统计失败: " + e.getMessage());
+        }
+    }
+}

+ 59 - 0
src/main/java/com/moka/gdtauto/entity/OssFileStatistics.java

@@ -0,0 +1,59 @@
+package com.moka.gdtauto.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * OSS文件统计表
+ * </p>
+ *
+ * @author mokamvp
+ * @since 2026-03-25
+ */
+@Getter
+@Setter
+@ToString
+@TableName("oss_file_statistics")
+public class OssFileStatistics implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private String fileMd5;
+
+    /**
+     * 花费(分)
+     */
+    private Long cost;
+
+    /**
+     * 日期
+     */
+    private LocalDate date;
+
+    /**
+     * 曝光次数
+     */
+    private Long viewCount;
+
+    /**
+     * 点击次数
+     */
+    private Long validClickCount;
+
+    /**
+     * 点击率
+     */
+    private BigDecimal ctr;
+}

+ 19 - 0
src/main/java/com/moka/gdtauto/mapper/OssFileStatisticsMapper.java

@@ -0,0 +1,19 @@
+package com.moka.gdtauto.mapper;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.moka.gdtauto.entity.OssFileStatistics;
+
+/**
+ * <p>
+ * OSS文件统计表 Mapper 接口
+ * </p>
+ *
+ * @author mokamvp
+ * @since 2026-03-25
+ */
+public interface OssFileStatisticsMapper extends BaseMapper<OssFileStatistics> {
+
+    void updateStatistics(@Param("startDate") String startDate, @Param("endDate") String endDate);
+}

+ 3 - 0
src/main/java/com/moka/gdtauto/service/DailyCreativeReportService.java

@@ -25,6 +25,7 @@ import com.moka.gdtauto.entity.ReqDailyCreativeReport;
 import com.moka.gdtauto.mapper.AccountGroupAccountRelationshipMapper;
 import com.moka.gdtauto.mapper.AccountGroupMapper;
 import com.moka.gdtauto.mapper.AdPlanCreativeMapper;
+import com.moka.gdtauto.mapper.OssFileStatisticsMapper;
 import com.moka.gdtauto.mapper.RepDailyCreativeReportMapper;
 import com.moka.gdtauto.mapper.ReqDailyCreativeReportMapper;
 import com.tencent.ads.exception.TencentAdsResponseException;
@@ -58,6 +59,7 @@ public class DailyCreativeReportService {
     private final AdPlanConfService adPlanConfService;
     private final AdPlanCreativeService adPlanCreativeService;
     private final AdPlanCreativeMapper adPlanCreativeMapper;
+    private final OssFileStatisticsMapper ossFileStatisticsMapper;
 
     private static final DateTimeFormatter FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
@@ -258,6 +260,7 @@ public class DailyCreativeReportService {
         log.info("所有广告计划创意日报同步完成");
          if (TimeLine.REQUEST_TIME.getValue().equals(timeLine)) { 
             adPlanCreativeMapper.updateReqDailyReportConfId(startDate, endDate);
+            ossFileStatisticsMapper.updateStatistics(startDate, endDate);
          } else if (TimeLine.REPORTING_TIME.getValue().equals(timeLine)) {
             adPlanCreativeMapper.updateRepDailyReportConfId(startDate, endDate);
          }

+ 28 - 0
src/main/java/com/moka/gdtauto/service/OssFileStatisticsService.java

@@ -0,0 +1,28 @@
+package com.moka.gdtauto.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.moka.gdtauto.entity.OssFileStatistics;
+
+/**
+ * <p>
+ * OSS文件统计表 服务类
+ * </p>
+ *
+ * @author mokamvp
+ * @since 2026-03-25
+ */
+public interface OssFileStatisticsService extends IService<OssFileStatistics> {
+
+    /**
+     * 根据fileMd5和日期范围分页查询统计数据
+     *
+     * @param page      页码
+     * @param size      每页数量
+     * @param fileMd5   文件MD5
+     * @param startDate 开始日期
+     * @param endDate   结束日期
+     * @return 分页结果
+     */
+    Page<OssFileStatistics> listStatisticsByMd5AndDate(Long page, Long size, String fileMd5, String startDate, String endDate);
+}

+ 47 - 0
src/main/java/com/moka/gdtauto/service/impl/OssFileStatisticsServiceImp.java

@@ -0,0 +1,47 @@
+package com.moka.gdtauto.service.impl;
+
+import java.time.LocalDate;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moka.gdtauto.entity.OssFileStatistics;
+import com.moka.gdtauto.mapper.OssFileStatisticsMapper;
+import com.moka.gdtauto.service.OssFileStatisticsService;
+
+/**
+ * <p>
+ * OSS文件统计表 服务实现类
+ * </p>
+ *
+ * @author mokamvp
+ * @since 2026-03-25
+ */
+@Service
+public class OssFileStatisticsServiceImp extends ServiceImpl<OssFileStatisticsMapper, OssFileStatistics> implements OssFileStatisticsService {
+
+    @Override
+    public Page<OssFileStatistics> listStatisticsByMd5AndDate(Long page, Long size, String fileMd5, String startDate, String endDate) {
+        Page<OssFileStatistics> pageParam = new Page<>(page, size);
+        LambdaQueryWrapper<OssFileStatistics> wrapper = new LambdaQueryWrapper<>();
+
+        // 根据fileMd5精确查询
+        wrapper.eq(OssFileStatistics::getFileMd5, fileMd5);
+
+        // 根据日期范围查询
+        if (StringUtils.isNotBlank(startDate)) {
+            wrapper.ge(OssFileStatistics::getDate, LocalDate.parse(startDate));
+        }
+        if (StringUtils.isNotBlank(endDate)) {
+            wrapper.le(OssFileStatistics::getDate, LocalDate.parse(endDate));
+        }
+
+        // 按日期倒序排列
+        wrapper.orderByDesc(OssFileStatistics::getCost);
+
+        return page(pageParam, wrapper);
+    }
+}

+ 26 - 0
src/main/resources/mapper/OssFileStatisticsMapper.xml

@@ -0,0 +1,26 @@
+<?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.OssFileStatisticsMapper">
+
+    <!-- updateStatistics --> 
+
+    <update id="updateStatistics">
+    INSERT INTO oss_file_statistics
+    (file_md5, cost, date, view_count, valid_click_count,ctr)
+    SELECT
+        pc.creative_file_md5,
+        cr.cost,
+        cr.date,
+        cr.view_count,
+        cr.valid_click_count,
+        cr.ctr
+    FROM req_daily_creative_report cr
+            INNER JOIN ad_plan_creative pc ON cr.dynamic_creative_id = pc.creative_id
+    WHERE cr.date between #{startDate} and #{endDate}
+    ON DUPLICATE KEY UPDATE
+   cost = VALUES(cost),
+   view_count = VALUES(view_count),
+   valid_click_count = VALUES(valid_click_count),
+   ctr = VALUES(ctr)
+    </update>
+</mapper>

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor