浏览代码

feat:gdt交互操作加锁

pudongliang 4 月之前
父节点
当前提交
8fa9f43f0f

+ 1 - 1
portal/dist/assets/accountGroup-N5vZ5puV.js → portal/dist/assets/accountGroup-DxOjQLAv.js

@@ -1 +1 @@
-import{r as u}from"./request-BQ8lBDVA.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-Bs8wJWrL.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-MEn3Hq5o.js → portal/dist/assets/adPlanConf-3SBq-6df.js

@@ -1 +1 @@
-import{r as a}from"./request-BQ8lBDVA.js";function r(n){return a({url:"/api/ad-plan-conf/reCreate",method:"post",data:n})}function d(n){return a({url:"/api/ad-plan-conf/generate-plan",method:"post",data:n})}function o(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 u(n){return a({url:"/api/ad-plan-conf/create",method:"post",data:n})}function p(n){return a({url:"/api/ad-plan-conf/update",method:"post",data:n})}function s(n=1,t=10){return a({url:"/api/ad-plan-conf/list",method:"get",params:{pageNum:n,pageSize:t}})}function f(n){return a({url:`/api/ad-plan-conf/${n}`,method:"get"})}function i(n){return a({url:"/api/ad-plan/list",method:"get",params:n})}function c(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 g(n){return a({url:"/api/ad-plan-conf/gdtDeleteByConfId",params:{confId:n},method:"get"})}function h(n,t){return a({url:`/api/ad-plan-conf/gdtSuspendByPlanIds/${n}`,method:"post",data:t})}function P(n,t){return a({url:`/api/ad-plan-conf/gdtDeleteByPlanIds/${n}`,method:"post",data:t})}export{d as a,f as b,u as c,i as d,g as e,h as f,s as g,P as h,l as i,o as j,c as k,r,m as s,p as u};
+import{r as a}from"./request-Bs8wJWrL.js";function r(n){return a({url:"/api/ad-plan-conf/reCreate",method:"post",data:n})}function d(n){return a({url:"/api/ad-plan-conf/generate-plan",method:"post",data:n})}function o(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 u(n){return a({url:"/api/ad-plan-conf/create",method:"post",data:n})}function p(n){return a({url:"/api/ad-plan-conf/update",method:"post",data:n})}function s(n=1,t=10){return a({url:"/api/ad-plan-conf/list",method:"get",params:{pageNum:n,pageSize:t}})}function f(n){return a({url:`/api/ad-plan-conf/${n}`,method:"get"})}function i(n){return a({url:"/api/ad-plan/list",method:"get",params:n})}function c(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 g(n){return a({url:"/api/ad-plan-conf/gdtDeleteByConfId",params:{confId:n},method:"get"})}function h(n,t){return a({url:`/api/ad-plan-conf/gdtSuspendByPlanIds/${n}`,method:"post",data:t})}function P(n,t){return a({url:`/api/ad-plan-conf/gdtDeleteByPlanIds/${n}`,method:"post",data:t})}export{d as a,f as b,u as c,i as d,g as e,h as f,s as g,P as h,l as i,o as j,c as k,r,m as s,p as u};

+ 1 - 1
portal/dist/assets/auth-BI_nGEEP.js → portal/dist/assets/auth-CUYLa5jV.js

@@ -1 +1 @@
-import{r as t}from"./request-BQ8lBDVA.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-Bs8wJWrL.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-nBGFaTMc.js → portal/dist/assets/conversion-zkvyWa5u.js

@@ -1 +1 @@
-import{r as t}from"./request-BQ8lBDVA.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-Bs8wJWrL.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-DJd7pifX.js


文件差异内容过多而无法显示
+ 0 - 0
portal/dist/assets/detail-DuxO4Vsp.js


+ 1 - 1
portal/dist/assets/drama-hiEb51_B.js → portal/dist/assets/drama-Dsb4mXGZ.js

@@ -1 +1 @@
-import{r as t}from"./request-BQ8lBDVA.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-Bs8wJWrL.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/index-BGn61ZZ8.css


文件差异内容过多而无法显示
+ 1 - 1
portal/dist/assets/index-Bdo89sOG.js


文件差异内容过多而无法显示
+ 0 - 0
portal/dist/assets/index-BfIvAyzw.js


文件差异内容过多而无法显示
+ 0 - 0
portal/dist/assets/index-BjZF9eqL.js


文件差异内容过多而无法显示
+ 0 - 0
portal/dist/assets/index-C1HwLC_N.js


文件差异内容过多而无法显示
+ 0 - 0
portal/dist/assets/index-CCAFUjUC.js


文件差异内容过多而无法显示
+ 0 - 0
portal/dist/assets/index-CWH-sBiO.js


文件差异内容过多而无法显示
+ 0 - 0
portal/dist/assets/index-Ciklf1mZ.js


文件差异内容过多而无法显示
+ 0 - 0
portal/dist/assets/index-CsLemFkn.css


文件差异内容过多而无法显示
+ 0 - 0
portal/dist/assets/index-DAiCazT9.js


文件差异内容过多而无法显示
+ 0 - 0
portal/dist/assets/index-DLIyT1hW.js


文件差异内容过多而无法显示
+ 0 - 0
portal/dist/assets/index-Dl-DX3tn.js


文件差异内容过多而无法显示
+ 0 - 0
portal/dist/assets/index-DugZTHgk.js


文件差异内容过多而无法显示
+ 0 - 0
portal/dist/assets/index-oHia1mP-.js


+ 1 - 1
portal/dist/assets/ossFile-CQMV4lyF.js → portal/dist/assets/ossFile-BLdRPvRB.js

@@ -1 +1 @@
-import{r as t}from"./request-BQ8lBDVA.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-Bs8wJWrL.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-Bs8wJWrL.js


+ 1 - 1
portal/dist/assets/user-INf7jG3f.js → portal/dist/assets/user-CWwWL1qI.js

@@ -1 +1 @@
-import{r as e}from"./request-BQ8lBDVA.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-Bs8wJWrL.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};

+ 2 - 2
portal/dist/index.html

@@ -5,8 +5,8 @@
     <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-BU9f2rGa.js"></script>
-    <link rel="stylesheet" crossorigin href="/assets/index-BGn61ZZ8.css">
+    <script type="module" crossorigin src="/assets/index-Bdo89sOG.js"></script>
+    <link rel="stylesheet" crossorigin href="/assets/index-CsLemFkn.css">
   </head>
   <body>
     <div id="app"></div>

+ 5 - 4
portal/src/views/ad-plan-conf/detail.vue

@@ -754,7 +754,7 @@ const handleDeletePlans = async (confId) => {
 const handleSystemStatusSync = async (confId) => {
   try {
     await ElMessageBox.confirm(
-      `确定要同步"${confDetail.value.name}"计划的广告平台状态吗?`,
+      `确定要同步"${confDetail.value.name}"的全部计划的广告平台状态吗?`,
       '提示',
       {
         confirmButtonText: '确定',
@@ -764,13 +764,14 @@ const handleSystemStatusSync = async (confId) => {
     )
     const res = await syncSystemStatus(confId)
     if (res.success) {
+      ElMessage.success(res.msg || '同步平台状态中。。。')
       handleRefresh()
     } else {
-      ElMessage.error(res.msg || '刷新计划平台状态失败')
+      ElMessage.error(res.msg || '同步平台状态失败')
     }
   } catch (error) {
-    console.error('刷新计划平台状态失败:', error)
-    ElMessage.error('刷新计划平台状态失败')
+    console.error('同步平台状态失败:', error)
+    ElMessage.error('同步平台状态失败')
   }
 }
 

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

@@ -34,6 +34,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -54,6 +55,7 @@ import java.time.format.DateTimeFormatter;
 @RequiredArgsConstructor
 public class AdPlanConfController {
 
+    private final RedisTemplate<String, String> redisTemplate;
     private final AdPlanConfService adPlanConfService;
     private final AdPlanService adPlanService;
     private final AdPlanDailyReportService adPlanDailyReportService;
@@ -70,6 +72,11 @@ public class AdPlanConfController {
         if (adPlanConf == null) {
             return Result.fail("广告计划配置不存在");
         }
+        String lockKey = "ad_plan_conf_suspend_all_lock_" + confId;
+        Boolean isLocked = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 1, TimeUnit.MINUTES);
+        if (!isLocked) {
+            return Result.fail("请勿重复操作");
+        }
         adPlanConfService.gdtSuspendByConf(adPlanConf);
         adPlanConfService.lambdaUpdate()
         .eq(AdPlanConf::getId, confId)
@@ -87,6 +94,11 @@ public class AdPlanConfController {
         if (adPlanConf == null) {
             return Result.fail("广告计划配置不存在");
         }
+        String lockKey = "ad_plan_conf_suspend_selected_lock_" + confId;
+        Boolean isLocked = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 1, TimeUnit.MINUTES);
+        if (!isLocked) {
+            return Result.fail("请勿重复操作");
+        }
         adPlanConfService.gdtSuspendByPlanIds(adPlanConf, planIds);
         adPlanConfService.lambdaUpdate()
         .eq(AdPlanConf::getId, confId)
@@ -101,6 +113,11 @@ public class AdPlanConfController {
         if (adPlanConf == null) {
             return Result.fail("广告计划配置不存在");
         }
+        String lockKey = "ad_plan_conf_delete_all_lock_" + confId;
+        Boolean isLocked = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 1, TimeUnit.MINUTES);
+        if (!isLocked) {
+            return Result.fail("请勿重复操作");
+        }
         adPlanConfService.gdtDeleteByConf(adPlanConf);
         adPlanConfService.lambdaUpdate()
         .eq(AdPlanConf::getId, confId)
@@ -118,6 +135,11 @@ public class AdPlanConfController {
         if (adPlanConf == null) {
             return Result.fail("广告计划配置不存在");
         }
+        String lockKey = "ad_plan_conf_delete_selected_lock_" + confId;
+        Boolean isLocked = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 1, TimeUnit.MINUTES);
+        if (!isLocked) {
+            return Result.fail("请勿重复操作");
+        }
         adPlanConfService.gdtDeleteByPlanIds(adPlanConf, planIds);
         adPlanConfService.lambdaUpdate()
         .eq(AdPlanConf::getId, confId)
@@ -298,6 +320,12 @@ public class AdPlanConfController {
 
     @GetMapping("/syncSystemStatus/{id}")
     public Result<Void> syncSystemStatus(@PathVariable Long id, @AuthUser SysUser sysUser) {
+        //redis锁 1分钟
+        String lockKey = "ad_plan_conf_sync_system_status_lock_" + id;
+        Boolean isLocked = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 1, TimeUnit.MINUTES);
+        if (!isLocked) {
+            return Result.fail("请勿重复操作");
+        }
         adPlanService.syncAdPlanStatus(id);
         adPlanCreativeService.syncAdPlanCreativeStatus(id);
         adPlanDailyReportService.syncDailyReport(id);

部分文件因为文件数量过多而无法显示