Procházet zdrojové kódy

feat:执行日志优化

pudongliang před 4 měsíci
rodič
revize
ec540da7dc
37 změnil soubory, kde provedl 83 přidání a 25 odebrání
  1. 1 1
      portal/dist/assets/accountGroup-C0V-RvXi.js
  2. 1 1
      portal/dist/assets/adAutoConf-Dl39a7n8.js
  3. 1 1
      portal/dist/assets/adPlanConf-BwIZJJ3f.js
  4. 1 1
      portal/dist/assets/auth-EsBVgL4h.js
  5. 1 1
      portal/dist/assets/conversion-BFR0pe9E.js
  6. 0 0
      portal/dist/assets/detail-B_nOioNP.js
  7. 1 1
      portal/dist/assets/drama-dq_EyCP1.js
  8. 0 0
      portal/dist/assets/edit-DzlQ_OpV.js
  9. 0 0
      portal/dist/assets/index-B8rgx9N0.js
  10. 0 0
      portal/dist/assets/index-BlGRZMWD.js
  11. 0 0
      portal/dist/assets/index-CSw1cUI0.js
  12. 0 0
      portal/dist/assets/index-CSzSjuPt.js
  13. 0 0
      portal/dist/assets/index-CcfekgJo.js
  14. 0 0
      portal/dist/assets/index-CiHLDthm.js
  15. 0 0
      portal/dist/assets/index-Co7EfRsG.js
  16. 0 0
      portal/dist/assets/index-D1vx8K8-.js
  17. 0 0
      portal/dist/assets/index-D99Qr_Ir.js
  18. 0 0
      portal/dist/assets/index-D_vsBv-o.js
  19. 1 1
      portal/dist/assets/index-DftAq06U.js
  20. 0 0
      portal/dist/assets/index-Dp8OvDTY.js
  21. 0 0
      portal/dist/assets/index-Dv8hNIv3.js
  22. 0 0
      portal/dist/assets/index-RxgeVgyX.js
  23. 0 0
      portal/dist/assets/index-dW0gqHWV.js
  24. 0 0
      portal/dist/assets/index-rY83tMFW.js
  25. 0 0
      portal/dist/assets/index-rse884Nk.js
  26. 1 1
      portal/dist/assets/loadPageConf-BWMxCPXo.js
  27. 1 1
      portal/dist/assets/ossFile-CO6YXkdy.js
  28. 0 0
      portal/dist/assets/request-CJOT2p1f.js
  29. 1 1
      portal/dist/assets/user-DAhWUiuy.js
  30. 1 1
      portal/dist/index.html
  31. 19 11
      portal/src/views/ad-auto-conf/index.vue
  32. 4 0
      src/main/java/com/moka/gdtauto/mapper/AdAutoExecuteLogMapper.java
  33. 3 1
      src/main/java/com/moka/gdtauto/service/AdAutoExecuteLogService.java
  34. 3 0
      src/main/java/com/moka/gdtauto/service/AdPlanAutoExecutor.java
  35. 2 0
      src/main/java/com/moka/gdtauto/service/AdPlanCreativeAutoExecutor.java
  36. 13 2
      src/main/java/com/moka/gdtauto/service/impl/AdAutoExecuteLogServiceImp.java
  37. 28 0
      src/main/resources/mapper/AdAutoExecuteLogMapper.xml

+ 1 - 1
portal/dist/assets/accountGroup-JFZ42HYU.js → portal/dist/assets/accountGroup-C0V-RvXi.js

@@ -1 +1 @@
-import{r as u}from"./request-BKkuewe8.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-CJOT2p1f.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-D_ylIUAH.js → portal/dist/assets/adAutoConf-Dl39a7n8.js

@@ -1 +1 @@
-import{r as e}from"./request-BKkuewe8.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-CJOT2p1f.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-BdqIvqWC.js → portal/dist/assets/adPlanConf-BwIZJJ3f.js

@@ -1 +1 @@
-import{r as a}from"./request-BKkuewe8.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-CJOT2p1f.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-R_tNEqX0.js → portal/dist/assets/auth-EsBVgL4h.js

@@ -1 +1 @@
-import{r as t}from"./request-BKkuewe8.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-CJOT2p1f.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-0rLECrbJ.js → portal/dist/assets/conversion-BFR0pe9E.js

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

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/detail-B_nOioNP.js


+ 1 - 1
portal/dist/assets/drama-B7d7Gjhk.js → portal/dist/assets/drama-dq_EyCP1.js

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

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/edit-DzlQ_OpV.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-B8rgx9N0.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-BlGRZMWD.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-CSw1cUI0.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-CSzSjuPt.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-CcfekgJo.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-CiHLDthm.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-Co7EfRsG.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-D1vx8K8-.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-D99Qr_Ir.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-D_vsBv-o.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 1
portal/dist/assets/index-DftAq06U.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-Dp8OvDTY.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-Dv8hNIv3.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-RxgeVgyX.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-dW0gqHWV.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-rY83tMFW.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/index-rse884Nk.js


+ 1 - 1
portal/dist/assets/loadPageConf-pJvEF9c7.js → portal/dist/assets/loadPageConf-BWMxCPXo.js

@@ -1 +1 @@
-import{r as o}from"./request-BKkuewe8.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-CJOT2p1f.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-B4ymCTR2.js → portal/dist/assets/ossFile-CO6YXkdy.js

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

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
portal/dist/assets/request-CJOT2p1f.js


+ 1 - 1
portal/dist/assets/user-CUoJe7SL.js → portal/dist/assets/user-DAhWUiuy.js

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

+ 19 - 11
portal/src/views/ad-auto-conf/index.vue

@@ -168,10 +168,11 @@
   <el-dialog
     v-model="logDialog.visible"
     title="执行日志"
-    width="860px"
+    width="80%"
     destroy-on-close
   >
     <el-table
+      ref="logTableRef"
       :data="logList"
       v-loading="logLoading"
       border
@@ -183,7 +184,7 @@
       :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
     >
       <el-table-column prop="id" label="ID" width="80" />
-      <el-table-column prop="parentLogId" label="父日志ID" width="80" />
+      <!-- <el-table-column prop="parentLogId" label="父日志ID" width="80" /> -->
       <el-table-column prop="logType" label="日志类型" width="80" />
       <el-table-column prop="adPlanConfId" label="广告配置ID" width="80" >
           <template #default="{ row }">
@@ -193,6 +194,15 @@
             <span v-else>-</span>
           </template>
         </el-table-column>
+      <el-table-column label="状态" width="90">
+        <template #default="{ row }">
+          <el-tag :type="getStatusTagType(row.executeStatus)" size="small">
+            {{ getStatusText(row.executeStatus) }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="总广告数" prop="adCount" width="90" />
+      <el-table-column label="执行数" prop="suspendCount" width="80" />
       <el-table-column label="执行时间" width="170">
         <template #default="{ row }">
           {{ formatDate(row.executeTime) }}
@@ -203,15 +213,6 @@
           {{ formatDate(row.successTime) }}
         </template>
       </el-table-column>
-      <el-table-column label="状态" width="90">
-        <template #default="{ row }">
-          <el-tag :type="getStatusTagType(row.executeStatus)" size="small">
-            {{ getStatusText(row.executeStatus) }}
-          </el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column label="总广告数" prop="adCount" width="90" />
-      <el-table-column label="暂停数" prop="suspendCount" width="80" />
       <el-table-column label="执行结果" prop="executeResult" min-width="160" show-overflow-tooltip />
       <el-table-column label="暂停的计划" prop="suspendAdGroupIds" width="120" show-overflow-tooltip/>
     </el-table>
@@ -462,6 +463,7 @@ const logDialog = reactive({ visible: false, confId: null })
 const logLoading = ref(false)
 const logList = ref([])
 const logPagination = reactive({ page: 1, pageSize: 10, total: 0 })
+const logTableRef = ref(null)
 
 // 懒加载子日志
 const loadChildLog = async (row, treeNode, resolve) => {
@@ -492,6 +494,12 @@ const loadLogList = async () => {
     if (response.success) {
       logList.value = (response.data.records || []).map(item => ({ ...item, hasChildren: true }))
       logPagination.total = response.data.total || 0
+      // 默认展开第一行
+      if (logList.value.length > 0 && logTableRef.value) {
+        setTimeout(() => {
+          logTableRef.value.toggleRowExpansion(logList.value[0], true)
+        }, 0)
+      }
     } else {
       ElMessage.error(response.message || '加载日志失败')
     }

+ 4 - 0
src/main/java/com/moka/gdtauto/mapper/AdAutoExecuteLogMapper.java

@@ -1,5 +1,7 @@
 package com.moka.gdtauto.mapper;
 
+import org.apache.ibatis.annotations.Param;
+
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.moka.gdtauto.entity.AdAutoExecuteLog;
 
@@ -13,4 +15,6 @@ import com.moka.gdtauto.entity.AdAutoExecuteLog;
  */
 public interface AdAutoExecuteLogMapper extends BaseMapper<AdAutoExecuteLog> {
 
+    void updateExecuteInfo(@Param("id") Long id);
+
 }

+ 3 - 1
src/main/java/com/moka/gdtauto/service/AdAutoExecuteLogService.java

@@ -1,7 +1,7 @@
 package com.moka.gdtauto.service;
 
-import com.moka.gdtauto.entity.AdAutoExecuteLog;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.moka.gdtauto.entity.AdAutoExecuteLog;
 
 /**
  * <p>
@@ -13,4 +13,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface AdAutoExecuteLogService extends IService<AdAutoExecuteLog> {
 
+    void updateExecuteInfo(Long id);
+
 }

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

@@ -65,6 +65,9 @@ public class AdPlanAutoExecutor {
             log.error("[AdAutoExecutor] 巡检执行异常,confId={}", conf.getId(), e);
             updateLogFailed(executeLog, "巡检异常: " + e.getMessage());
         }
+
+        adAutoExecuteLogService.updateExecuteInfo(executeLog.getId());
+        
     }
 
     private void doExecute(AdAutoConf autoConf, Long parentExecuteLogId) {

+ 2 - 0
src/main/java/com/moka/gdtauto/service/AdPlanCreativeAutoExecutor.java

@@ -64,6 +64,8 @@ public class AdPlanCreativeAutoExecutor {
             log.error("[AdPlanCreativeAutoExecutor] 巡检执行异常,confId={}", conf.getId(), e);
             updateLogFailed(executeLog, "巡检异常: " + e.getMessage());
         }
+
+        adAutoExecuteLogService.updateExecuteInfo(executeLog.getId());
     }
 
     private void doExecute(AdAutoConf autoConf, Long parentExecuteLogId) {

+ 13 - 2
src/main/java/com/moka/gdtauto/service/impl/AdAutoExecuteLogServiceImp.java

@@ -1,10 +1,13 @@
 package com.moka.gdtauto.service.impl;
 
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.moka.gdtauto.entity.AdAutoExecuteLog;
 import com.moka.gdtauto.mapper.AdAutoExecuteLogMapper;
 import com.moka.gdtauto.service.AdAutoExecuteLogService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
+
+import lombok.AllArgsConstructor;
 
 /**
  * <p>
@@ -15,6 +18,14 @@ import org.springframework.stereotype.Service;
  * @since 2026-03-12
  */
 @Service
+@AllArgsConstructor
 public class AdAutoExecuteLogServiceImp extends ServiceImpl<AdAutoExecuteLogMapper, AdAutoExecuteLog> implements AdAutoExecuteLogService {
 
+	private final AdAutoExecuteLogMapper adAutoExecuteLogMapper;
+
+	@Override
+	public void updateExecuteInfo(Long id) {
+		adAutoExecuteLogMapper.updateExecuteInfo(id);
+	}
+
 }

+ 28 - 0
src/main/resources/mapper/AdAutoExecuteLogMapper.xml

@@ -2,4 +2,32 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.moka.gdtauto.mapper.AdAutoExecuteLogMapper">
 
+    <!-- updateExecuteInfo --> 
+
+    <update id="updateExecuteInfo">
+        UPDATE ad_auto_execute_log l
+        INNER JOIN (
+            SELECT 
+                parent_log_id,
+                SUM(ad_count) AS ad_count,
+                SUM(suspend_count) AS suspend_count,
+                COUNT(id) AS log_count,
+                SUM(CASE WHEN execute_status = 1 THEN 1 ELSE 0 END) AS success_cnt,
+                SUM(CASE WHEN execute_status = 2 THEN 1 ELSE 0 END) AS fail_cnt,
+                SUM(CASE WHEN execute_status = 0 THEN 1 ELSE 0 END) AS pending_cnt
+            FROM ad_auto_execute_log 
+            WHERE parent_log_id = #{id} 
+            GROUP BY parent_log_id
+        ) t
+        SET 
+            l.ad_count = t.ad_count,
+            l.suspend_count = t.suspend_count,
+            l.execute_status = CASE
+                WHEN t.pending_cnt &gt; 0 THEN 0                  
+                WHEN t.success_cnt = t.log_count THEN 1           
+                WHEN t.fail_cnt = t.log_count THEN 2              
+                ELSE 3
+            END
+        WHERE l.id = t.parent_log_id;
+    </update>
 </mapper>

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů