فهرست منبع

fix:广告创建短剧限制问题

pudongliang 4 ماه پیش
والد
کامیت
6216e98eff
34فایلهای تغییر یافته به همراه137 افزوده شده و 21 حذف شده
  1. 79 0
      .qoder/agents/unit-test-generator.md
  2. 1 1
      portal/dist/assets/accountGroup-B-vQyXki.js
  3. 1 1
      portal/dist/assets/adAutoConf-DBLX5QCB.js
  4. 1 1
      portal/dist/assets/adPlanConf-_rjFdyRr.js
  5. 1 1
      portal/dist/assets/auth-CLpMcTHT.js
  6. 1 1
      portal/dist/assets/conversion-DZHW9Rjw.js
  7. 0 0
      portal/dist/assets/detail-C4rvfPbG.js
  8. 1 1
      portal/dist/assets/drama-B69dl1gm.js
  9. 0 0
      portal/dist/assets/edit-DIhoYxW6.js
  10. 0 0
      portal/dist/assets/index-AaRPYx6z.js
  11. 0 0
      portal/dist/assets/index-B5n3EGGy.js
  12. 0 0
      portal/dist/assets/index-BKT3jHz0.js
  13. 0 0
      portal/dist/assets/index-BM4QTLRM.js
  14. 0 0
      portal/dist/assets/index-BRYcMOgw.js
  15. 0 0
      portal/dist/assets/index-BWerfd0Q.js
  16. 0 0
      portal/dist/assets/index-BYzwdRdb.js
  17. 0 0
      portal/dist/assets/index-BaQNTRDo.js
  18. 0 0
      portal/dist/assets/index-CLrUdIv7.js
  19. 0 0
      portal/dist/assets/index-C__koTXy.js
  20. 0 0
      portal/dist/assets/index-CdHeEA3A.js
  21. 0 0
      portal/dist/assets/index-ChTjjKbF.js
  22. 0 0
      portal/dist/assets/index-D9Jepjyo.js
  23. 1 1
      portal/dist/assets/index-DCWgfcxG.js
  24. 0 0
      portal/dist/assets/index-DymA4l2a.js
  25. 0 0
      portal/dist/assets/index-KJ94LpDh.js
  26. 1 1
      portal/dist/assets/loadPageConf-DXnCOpIX.js
  27. 1 1
      portal/dist/assets/ossFile-BVO7jqIA.js
  28. 0 0
      portal/dist/assets/request-CQk9FaZh.js
  29. 1 1
      portal/dist/assets/user-Ckcn-ZM2.js
  30. 1 1
      portal/dist/index.html
  31. 1 1
      portal/src/views/ad-plan-conf/detail.vue
  32. 0 7
      portal/src/views/ad-plan-conf/index.vue
  33. 3 2
      src/main/java/com/moka/gdtauto/service/AdAutoExecutor.java
  34. 43 0
      src/test/java/com/moka/gdtauto/service/AdAutoTest.java

+ 79 - 0
.qoder/agents/unit-test-generator.md

@@ -0,0 +1,79 @@
+---
+name: unit-test-generator
+description: 根据提供的方法生成单元测试,不使用mock,直接使用真实的Service或Mapper。在需要为方法编写测试用例时主动使用。
+tools: Read, Grep, Glob
+---
+
+# 角色定义
+
+你是一个专业的Java单元测试生成专家,专注于为Spring Boot项目生成集成测试。
+
+## 核心要求
+
+1. **不使用Mock**:直接使用@Autowired注入真实的Service或Mapper
+2. **使用@SpringBootTest**:加载完整的Spring上下文
+3. **使用@ActiveProfiles("test")**:使用测试环境配置
+4. **测试数据真实入库**:测试会操作真实数据库
+
+## 测试类模板
+
+```java
+package com.moka.gdtauto.[模块];
+
+import com.moka.gdtauto.GdtAutoApplication;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+
+/**
+ * [类名]测试
+ * @author moka
+ * @since [日期]
+ */
+@SpringBootTest(classes = GdtAutoApplication.class)
+@ActiveProfiles("test")
+class [类名]Test {
+
+    @Autowired
+    private [Service/Mapper类名] [变量名];
+
+    @Test
+    @DisplayName("[测试场景描述]")
+    void test[方法名]() {
+        // 测试代码
+    }
+}
+```
+
+## 工作流程
+
+1. 分析用户提供的方法签名和上下文
+2. 确定需要注入的Service或Mapper
+3. 构建测试数据(注意数据合法性)
+4. 生成完整的测试方法
+5. 包含清晰的输出和断言
+
+## 输出格式
+
+**生成的测试类代码**
+- 完整的Java代码
+- 包含必要的import语句
+- 包含测试数据构建方法(如需要)
+- 使用System.out.println输出关键信息
+- 异常处理完善
+
+## 约束
+
+**必须遵守:**
+- 必须使用@SpringBootTest(classes = GdtAutoApplication.class)
+- 必须使用@ActiveProfiles("test")
+- 必须使用@Autowired注入真实对象,禁止使用@Mock或@MockBean
+- 测试方法必须使用@DisplayName注解
+- 测试数据要符合业务逻辑
+
+**禁止:**
+- 禁止使用Mockito进行mock
+- 禁止使用@MockBean
+- 禁止生成纯单元测试(使用mock的测试)

+ 1 - 1
portal/dist/assets/accountGroup-Dg4y5ttA.js → portal/dist/assets/accountGroup-B-vQyXki.js

@@ -1 +1 @@
-import{r as u}from"./request-BUHrxqkC.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-CQk9FaZh.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-DhpT2CCS.js → portal/dist/assets/adAutoConf-DBLX5QCB.js

@@ -1 +1 @@
-import{r as e}from"./request-BUHrxqkC.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/execute?id=${t}`,method:"post"})}function i(t){return e({url:"/api/execute-log/list",method:"get",params:t})}function d(t){return e({url:"/api/execute-log/getChildLog",method:"get",params:t})}export{d as a,i as b,n as c,r as e,u as g,a as s};
+import{r as e}from"./request-CQk9FaZh.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/execute?id=${t}`,method:"post"})}function i(t){return e({url:"/api/execute-log/list",method:"get",params:t})}function d(t){return e({url:"/api/execute-log/getChildLog",method:"get",params:t})}export{d as a,i as b,n as c,r as e,u as g,a as s};

+ 1 - 1
portal/dist/assets/adPlanConf-CCCj9SxD.js → portal/dist/assets/adPlanConf-_rjFdyRr.js

@@ -1 +1 @@
-import{r as a}from"./request-BUHrxqkC.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-CQk9FaZh.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-DJCII9MD.js → portal/dist/assets/auth-CLpMcTHT.js

@@ -1 +1 @@
-import{r as t}from"./request-BUHrxqkC.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-CQk9FaZh.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-9ASQSamE.js → portal/dist/assets/conversion-DZHW9Rjw.js

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


+ 1 - 1
portal/dist/assets/drama-CKQmagZT.js → portal/dist/assets/drama-B69dl1gm.js

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


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-AaRPYx6z.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-B5n3EGGy.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-BKT3jHz0.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-BM4QTLRM.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-BRYcMOgw.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-BWerfd0Q.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-BYzwdRdb.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-BaQNTRDo.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-CLrUdIv7.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-C__koTXy.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-CdHeEA3A.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-ChTjjKbF.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-D9Jepjyo.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
portal/dist/assets/index-DCWgfcxG.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-DymA4l2a.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
portal/dist/assets/index-KJ94LpDh.js


+ 1 - 1
portal/dist/assets/loadPageConf-qVZhGbGI.js → portal/dist/assets/loadPageConf-DXnCOpIX.js

@@ -1 +1 @@
-import{r as o}from"./request-BUHrxqkC.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-CQk9FaZh.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-CVlgTKj2.js → portal/dist/assets/ossFile-BVO7jqIA.js

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


+ 1 - 1
portal/dist/assets/user-Bybf7LnX.js → portal/dist/assets/user-Ckcn-ZM2.js

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

+ 1 - 1
portal/dist/index.html

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

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

@@ -356,7 +356,7 @@
           </template>
         </el-table-column>
         <el-table-column label="花费" prop="cost" width="100"></el-table-column>
-        <el-table-column label="转化成本" prop="conversionsCost" width="100"></el-table-column>
+        <el-table-column label="目标转化成本" prop="conversionsCost" width="100"></el-table-column>
         <el-table-column label="曝光" prop="viewCount" width="100"></el-table-column>
         <el-table-column label="有效点击" prop="validClickCount" width="100"></el-table-column>
         <el-table-column label="点击率" prop="ctr" width="100"></el-table-column>

+ 0 - 7
portal/src/views/ad-plan-conf/index.vue

@@ -1011,13 +1011,6 @@ const handleReCreate = async () => {
   await formRef.value.validate()
   console.log(formData.value)
   const { adType, dramaId, dramaAmount } = formData.value
-  if (adType === 2) {
-    if (dramaId == null && dramaAmount < 1) {
-      ElMessage.warning('请设置短剧配置')
-      return
-    }
-  }
-
   const res = await reCreateAdPlanConf(formData.value)
   if (res.success) {
     ElMessage.success('预览成功')

+ 3 - 2
src/main/java/com/moka/gdtauto/service/AdAutoExecutor.java

@@ -163,7 +163,7 @@ public class AdAutoExecutor {
             executeLog.setAdCount(adCount);
             executeLog.setSuspendCount(plansToSuspend.size());
             executeLog.setExecuteStatus(1);
-            executeLog.setSuspendAdGroupIds(plansToSuspend.stream().map(x -> String.format("[%d-{%s}]", x.getAdgroupId(), x.getAdgroupName())).collect(Collectors.joining("\n")));
+            executeLog.setSuspendAdGroupIds(plansToSuspend.stream().map(x -> String.format("[%d-%d-{%s}]", x.getAdPlanConfId(), x.getAdgroupId(), x.getAdgroupName())).collect(Collectors.joining("\n")));
             executeLog.setExecuteResult("成功");
             executeLog.setSuccessTime(LocalDateTime.now());
             adAutoExecuteLogService.updateById(executeLog);
@@ -194,7 +194,7 @@ public class AdAutoExecutor {
      * rule.newAd: 1-新广告, 2-老广告
      * 
      */
-    private boolean matchRule(AdPlan plan, AutoPlanRule rule, Integer newAdDays) {
+    public boolean matchRule(AdPlan plan, AutoPlanRule rule, Integer newAdDays) {
         // 判断新老广告
         boolean isNewAd = isNewAd(plan, newAdDays);
         if (rule.getNewAd() == 1 && !isNewAd) {
@@ -216,6 +216,7 @@ public class AdAutoExecutor {
                     return true;
                 }
             } else {
+                // getReqIncomeRoi1 < minIor 关闭
                 if (constYuan > rule.getMinCost() && plan.getReqIncomeRoi1().compareTo(rule.getMinIor()) < 0) {
                     return true;
                 }

+ 43 - 0
src/test/java/com/moka/gdtauto/service/AdAutoTest.java

@@ -0,0 +1,43 @@
+package com.moka.gdtauto.service;
+
+import java.util.List;
+import java.util.Optional;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+
+import com.alibaba.fastjson2.JSON;
+import com.moka.gdtauto.GdtAutoApplication;
+import com.moka.gdtauto.common.AutoPlanRule;
+import com.moka.gdtauto.entity.AdAutoConf;
+import com.moka.gdtauto.entity.AdPlan;
+import com.tencent.ads.anno.AuthInfoAppend;
+
+@SpringBootTest(classes = GdtAutoApplication.class)
+@ActiveProfiles("test")
+public class AdAutoTest {
+    
+    @Autowired
+    private AdPlanService adPlanService;
+    @Autowired
+    private AdAutoConfService adAutoConfService;
+    @Autowired
+    private AdAutoExecutor adAutoExecutor;
+
+    @Test
+    public void testCompareTO() {
+        AdPlan plan = adPlanService.lambdaQuery()
+            .eq(AdPlan::getAdgroupId, 87878621549L).one();
+        AdAutoConf conf = adAutoConfService.getById(7L);
+        List<AutoPlanRule> rules = JSON.parseArray(conf.getRules(), AutoPlanRule.class);
+        for (AutoPlanRule rule : rules) {
+            if (adAutoExecutor.matchRule(plan, rule, 3)) {
+                System.out.println("匹配成功: " + JSON.toJSON(rule));
+            }
+        }
+    }
+
+
+}

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است