pudongliang 4 месяцев назад
Родитель
Сommit
a40012dcdc
32 измененных файлов с 126 добавлено и 35 удалено
  1. 1 1
      portal/dist/assets/accountGroup-Ct6whACj.js
  2. 1 1
      portal/dist/assets/adPlanConf-o0G-LN-w.js
  3. 1 1
      portal/dist/assets/auth-2IMFpoaH.js
  4. 1 1
      portal/dist/assets/conversion-D6YJYxL3.js
  5. 0 0
      portal/dist/assets/detail-CnOt9cv2.js
  6. 1 1
      portal/dist/assets/drama-DIdwagTc.js
  7. 0 0
      portal/dist/assets/index-B0iSzXCg.js
  8. 0 0
      portal/dist/assets/index-B4W9f1M0.js
  9. 0 0
      portal/dist/assets/index-B6aaO0H-.js
  10. 0 0
      portal/dist/assets/index-BX2Slyk2.js
  11. 1 1
      portal/dist/assets/index-BrR-FpFz.js
  12. 0 0
      portal/dist/assets/index-C47nPZpw.js
  13. 0 0
      portal/dist/assets/index-CBMRrX6p.js
  14. 0 0
      portal/dist/assets/index-CBlTxeET.js
  15. 0 0
      portal/dist/assets/index-CJBRGT6v.js
  16. 0 0
      portal/dist/assets/index-CRS8l1P9.js
  17. 0 0
      portal/dist/assets/index-Cp7QB4cl.js
  18. 0 0
      portal/dist/assets/index-DXonJVII.js
  19. 0 0
      portal/dist/assets/index-DmHqnYcX.js
  20. 0 0
      portal/dist/assets/index-Ds9VEFDF.js
  21. 0 0
      portal/dist/assets/index-Dy7Q8GYz.js
  22. 1 1
      portal/dist/assets/loadPageConf-CDuApO3_.js
  23. 1 1
      portal/dist/assets/ossFile-FOxJtoNH.js
  24. 0 0
      portal/dist/assets/request-CFNMzeL-.js
  25. 1 1
      portal/dist/assets/user-CFeBxWIn.js
  26. 1 1
      portal/dist/index.html
  27. 47 7
      portal/src/views/ad-plan-conf/index.vue
  28. 45 14
      src/main/java/com/moka/gdtauto/controller/AdPlanConfController.java
  29. 4 1
      src/main/java/com/moka/gdtauto/controller/vo/CreateAdPlanConfRequest.java
  30. 4 1
      src/main/java/com/moka/gdtauto/controller/vo/UpdateAdPlanConfRequest.java
  31. 15 1
      src/main/java/com/moka/gdtauto/entity/AdPlan.java
  32. 1 1
      src/main/java/com/moka/gdtauto/service/impl/AdPlanConfServiceImpl.java

+ 1 - 1
portal/dist/assets/accountGroup-CfkmfYfy.js → portal/dist/assets/accountGroup-Ct6whACj.js

@@ -1 +1 @@
-import{r as u}from"./request-MXC_vLnx.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-CFNMzeL-.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-DHZqplEG.js → portal/dist/assets/adPlanConf-o0G-LN-w.js

@@ -1 +1 @@
-import{r as a}from"./request-MXC_vLnx.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-CFNMzeL-.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-C0KREr5Z.js → portal/dist/assets/auth-2IMFpoaH.js

@@ -1 +1 @@
-import{r as t}from"./request-MXC_vLnx.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-CFNMzeL-.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-2g2_K6CE.js → portal/dist/assets/conversion-D6YJYxL3.js

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


+ 1 - 1
portal/dist/assets/drama-Cdr5zpmT.js → portal/dist/assets/drama-DIdwagTc.js

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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


+ 1 - 1
portal/dist/assets/loadPageConf-Chcvcnzl.js → portal/dist/assets/loadPageConf-CDuApO3_.js

@@ -1 +1 @@
-import{r as o}from"./request-MXC_vLnx.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-CFNMzeL-.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-Cjo0YZ75.js → portal/dist/assets/ossFile-FOxJtoNH.js

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


+ 1 - 1
portal/dist/assets/user-CMk06A8t.js → portal/dist/assets/user-CFeBxWIn.js

@@ -1 +1 @@
-import{r as e}from"./request-MXC_vLnx.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-CFNMzeL-.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-DBd_GChl.js"></script>
+    <script type="module" crossorigin src="/assets/index-BrR-FpFz.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-BMB56fl-.css">
   </head>
   <body>

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

@@ -249,7 +249,7 @@
           />
         </el-form-item>
 
-        <el-form-item label="短剧ID" prop="dramaId" v-if="formData.adType === 2">
+        <!-- <el-form-item label="短剧ID" prop="dramaId" v-if="formData.adType === 2">
           <el-radio-group v-model="dramaSort">
             <el-radio label="最新" :value="1" />
             <el-radio label="最老" :value="0" />
@@ -269,15 +269,35 @@
               :value="drama.marketingAssetId"
             />
           </el-select>
+        </el-form-item> -->
+        <el-form-item label="资产类型" prop="assetType" v-if="formData.adType === 2">
+          <el-radio-group v-model="formData.assetType">
+            <el-radio label="短剧" :value="1" />
+            <el-radio label="小说" :value="2" />
+            <el-radio label="混合" :value="3" />
+          </el-radio-group>
         </el-form-item>
-        <p style="color: red;font-size: 12px; padding-left: 120px;" v-if="formData.adType === 2">*请确保【短剧资产列表】已同步短剧资产</p>
-        <el-form-item label="每户几部剧" prop="dramaAmount" v-if="formData.adType === 2">
+        <p style="color: red;font-size: 12px; padding-left: 120px;" v-if="formData.adType === 2 && [1, 3].includes(formData.assetType)">*请确保【短剧资产列表】已同步短剧资产</p>
+        <el-form-item label="每户几部剧" prop="dramaAmount" v-if="formData.adType === 2 && [1, 3].includes(formData.assetType)">
           <el-input-number
             v-model="formData.dramaAmount"
             :min="0"
             :precision="0"
             :step="1"
-            placeholder="请输入短剧每户几部剧"
+            placeholder="请输入每户几部短剧"
+            style="width: 100%"
+            :controls="true"
+          />
+        </el-form-item>
+
+        <p style="color: red;font-size: 12px; padding-left: 120px;" v-if="formData.adType === 2 && [2, 3].includes(formData.assetType)">*请确保【小说资产列表】已同步短剧资产</p>
+        <el-form-item label="每户几部小说" prop="fictionAmount" v-if="formData.adType === 2 && [2, 3].includes(formData.assetType)">
+          <el-input-number
+            v-model="formData.fictionAmount"
+            :min="0"
+            :precision="0"
+            :step="1"
+            placeholder="请输入每户几部小说"
             style="width: 100%"
             :controls="true"
           />
@@ -459,8 +479,21 @@
             {{ row.deepConversionWorthRate }}
           </template>
         </el-table-column>
-          <el-table-column prop="dramaId" label="短剧ID" width="120" />
-        <el-table-column prop="dramaName" label="短剧名称" width="120" show-overflow-tooltip />
+        <el-table-column prop="assetType" label="资产类型" width="120" >
+          <template #default="{ row }">
+            {{ row.assetType === 1 ? '短剧' : row.assetType === 2 ? '小说' : '未知' }}
+          </template>
+        </el-table-column>
+          <el-table-column prop="dramaId" label="资产ID" width="120" >
+            <template #default="{ row }">
+              {{ row.assetType === 1 ? row.dramaId : row.fictionId }}
+            </template>
+            </el-table-column>  
+        <el-table-column prop="dramaName" label="资产名称" width="120" show-overflow-tooltip >
+          <template #default="{ row }">
+            {{ row.assetType === 1 ? row.dramaName : row.fictionName }}
+          </template>
+          </el-table-column>
         <el-table-column prop="conversionId" label="转化ID" width="120" />
         <el-table-column prop="wxCorpid" label="企微主体ID" width="150" show-overflow-tooltip />
       </el-table>
@@ -665,6 +698,9 @@ const formData = ref({
   wxCorpid: '',
   dramaId: null,
   imageIds: '',
+  assetType: 1,
+  dramaAmount: 0,
+  fictionAmount: 0,
   pageIds: '',
   pageIdArr: [],
   creativeFileArr: [],
@@ -832,6 +868,8 @@ const handleCreate = () => {
     wxCorpid: '',
     dramaId: null,
     dramaAmount: 0,
+    assetType: 1,
+    fictionAmount: 0,
     imageIds: '',
     pageIds: '',
     pageIdArr: [],
@@ -864,7 +902,9 @@ const handleEdit = (row) => {
     sites: row.sites,
     wxCorpid: row.wxCorpid || '',
     dramaId: row.dramaId,
-    dramaAmount: row.dramaAmount || 1,
+    dramaAmount: row.dramaAmount || 0,
+    assetType: row.assetType || 1,
+    fictionAmount: row.fictionAmount || 0,
     imageIds: row.imageIds || '',
     pageIds: row.pageIds || '',
     pageIdArr: row.pageIds ? row.pageIds.split(',').map(Number) : [],

+ 45 - 14
src/main/java/com/moka/gdtauto/controller/AdPlanConfController.java

@@ -12,6 +12,7 @@ import com.moka.gdtauto.entity.AccountGroupAccountRelationship;
 import com.moka.gdtauto.entity.AdPlanConf;
 import com.moka.gdtauto.entity.SysUser;
 import com.moka.gdtauto.entity.TencentAssetDrama;
+import com.moka.gdtauto.entity.TencentAssetFiction;
 import com.moka.gdtauto.entity.AdPlan;
 import com.moka.gdtauto.entity.AdPlanCreative;
 import com.moka.gdtauto.entity.OssFile;
@@ -19,6 +20,7 @@ import com.moka.gdtauto.service.SysUserService;
 
 import com.moka.gdtauto.mapper.AccountGroupAccountRelationshipMapper;
 import com.moka.gdtauto.mapper.TencentAssetDramaMapper;
+import com.moka.gdtauto.mapper.TencentAssetFictionMapper;
 import com.moka.gdtauto.service.AccountGroupService;
 import com.moka.gdtauto.service.AdPlanConfService;
 import com.moka.gdtauto.service.AdPlanCreativeService;
@@ -66,6 +68,7 @@ public class AdPlanConfController {
     private final SysUserService sysUserService;
     private final AccountGroupService accountGroupService;
     private final TencentAssetDramaMapper tencentAssetDramaMapper;
+    private final TencentAssetFictionMapper tencentAssetFictionMapper;
 
 
     @GetMapping("/gdtSuspendByConfId")
@@ -170,6 +173,8 @@ public class AdPlanConfController {
         }
     }
 
+    public record TencentAsset(Integer assetType, Long assetId, String assetName) {}
+
     private List<AdPlan> buildPlans(String jobNumber, UpdateAdPlanConfRequest request, AccountGroup accountGroup,
             List<AccountGroupAccountRelationship> relationships) {
         String dateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
@@ -177,20 +182,39 @@ public class AdPlanConfController {
         List<OssFile> creativeFileArr = request.getCreativeFileArr();
         List<AdPlan> plans = new ArrayList<>();
         Integer dramaAmount = request.getDramaAmount();
-        Long dramaId = request.getDramaId();
+        Integer fictionAmount = request.getFictionAmount();
         //获取短剧 relationships.size * dramaAmount
-        List<TencentAssetDrama> dramas = List.of();
-        if (dramaAmount > 0) {
-            // 随机获取短剧 order by RAND() limit dramaAmount
-            dramas = tencentAssetDramaMapper.selectList(new LambdaQueryWrapper<TencentAssetDrama>().eq(TencentAssetDrama::getJobNumber, jobNumber).last("order by rand() limit " + dramaAmount * relationships.size()));
+        Integer assetType = request.getAssetType();
+        List<TencentAsset> assets = new ArrayList<>();
+        if (assetType == 1 && dramaAmount > 0) {
+            List<TencentAssetDrama> dramas = tencentAssetDramaMapper.selectList(new LambdaQueryWrapper<TencentAssetDrama>().eq(TencentAssetDrama::getJobNumber, jobNumber).last("order by rand() limit " + dramaAmount * relationships.size()));
             if (dramas.size() < dramaAmount * relationships.size()) {
                 throw new IllegalArgumentException("短剧数量不足,请在短剧资产管理同步");
             }
-        } else {
-            if (dramaId != null) {
-                throw new IllegalArgumentException("请设置短剧相关配置");
+            assets = dramas.stream().map(drama -> new TencentAsset(1, drama.getMarketingAssetId(), drama.getMarketingAssetName())).toList();
+        }
+        if (assetType == 2 && fictionAmount > 0) {
+            List<TencentAssetFiction> fictions = tencentAssetFictionMapper.selectList(new LambdaQueryWrapper<TencentAssetFiction>().eq(TencentAssetFiction::getJobNumber, jobNumber).last("order by rand() limit " + dramaAmount * relationships.size()));
+            if (fictions.size() < dramaAmount * relationships.size()) {
+                throw new IllegalArgumentException("小说数量不足,请在小说资产管理同步");
+            }
+            assets = fictions.stream().map(fiction -> new TencentAsset(2, fiction.getMarketingAssetId(), fiction.getMarketingAssetName())).toList();
+        }
+        if (assetType == 3) {
+            if (dramaAmount > 0) {
+                List<TencentAssetDrama> dramas = tencentAssetDramaMapper.selectList(new LambdaQueryWrapper<TencentAssetDrama>().eq(TencentAssetDrama::getJobNumber, jobNumber).last("order by rand() limit " + dramaAmount * relationships.size()));
+                if (dramas.size() < dramaAmount * relationships.size()) {
+                    throw new IllegalArgumentException("短剧数量不足,请在短剧资产管理同步");
+                }
+                assets.addAll(dramas.stream().map(drama -> new TencentAsset(1, drama.getMarketingAssetId(), drama.getMarketingAssetName())).toList());
+            }
+            if (fictionAmount > 0) {
+                List<TencentAssetFiction> fictions = tencentAssetFictionMapper.selectList(new LambdaQueryWrapper<TencentAssetFiction>().eq(TencentAssetFiction::getJobNumber, jobNumber).last("order by rand() limit " + fictionAmount * relationships.size()));
+                if (fictions.size() < fictionAmount * relationships.size()) {
+                    throw new IllegalArgumentException("小说数量不足,请在小说资产管理同步");
+                }
+                assets.addAll(fictions.stream().map(fiction -> new TencentAsset(2, fiction.getMarketingAssetId(), fiction.getMarketingAssetName())).toList());
             }
-            dramas = tencentAssetDramaMapper.selectList(new LambdaQueryWrapper<TencentAssetDrama>().eq(TencentAssetDrama::getMarketingAssetId, dramaId).orderByDesc(TencentAssetDrama::getId).last("limit 1"));
         }
 
         String targets = request.getTargets();
@@ -200,9 +224,10 @@ public class AdPlanConfController {
         int dramaIndex = 0;
         for (AccountGroupAccountRelationship relationship : relationships) {
             Long accountId = relationship.getAccountId();
-            for (int k = 0; k < dramaAmount; k++) {
-                Long assetId = dramas.get(dramaIndex).getMarketingAssetId();
-                String dramaName = dramas.get(dramaIndex).getMarketingAssetName();
+            for (int k = 0; k < assets.size(); k++) {
+                Long assetId = assets.get(k).assetId();
+                String assetName = assets.get(k).assetName();
+                Integer asset_type = assets.get(k).assetType();
                 dramaIndex++;
                 for (String target : targetArray) {
                         for (String site : siteArray) {
@@ -218,8 +243,14 @@ public class AdPlanConfController {
                         adPlan.setTarget(target);
                         adPlan.setSite(site);
                         adPlan.setConversionId(request.getConversionId());
-                        adPlan.setDramaId(assetId);
-                        adPlan.setDramaName(dramaName);
+                        adPlan.setAssetType(asset_type);
+                        if (asset_type == 1) {
+                            adPlan.setDramaId(assetId);
+                            adPlan.setDramaName(assetName);
+                        } else if (asset_type == 2) {
+                            adPlan.setFictionId(assetId);
+                            adPlan.setFictionName(assetName);
+                        }
                         adPlan.setBidAmount(request.getBidAmount());
                         //adType=2-ROI
                         if (request.getAdType().equals(2)) {

+ 4 - 1
src/main/java/com/moka/gdtauto/controller/vo/CreateAdPlanConfRequest.java

@@ -44,11 +44,14 @@ public class CreateAdPlanConfRequest {
 
     @Schema(description = "企微主体ID", example = "wx123456")
     private String wxCorpid;
-
+    @Schema(description = "资产类型", example = "1")
+    private Integer assetType;
     @Schema(description = "短剧ID", example = "1")
     private Long dramaId;
     @Schema(description = "短剧每户几部剧", example = "1")
     private Integer dramaAmount;
+    @Schema(description = "小说每户几部剧", example = "1")
+    private Integer fictionAmount;
 
     @Schema(description = "图片IDs,多个用逗号分隔", example = "1,2,3")
     private String imageIds;

+ 4 - 1
src/main/java/com/moka/gdtauto/controller/vo/UpdateAdPlanConfRequest.java

@@ -45,11 +45,14 @@ public class UpdateAdPlanConfRequest {
     private String sites;
     private String targets;
 
+    @Schema(description = "资产类型", example = "1")
+    private Integer assetType;
     @Schema(description = "短剧ID", example = "1")
     private Long dramaId;
     @Schema(description = "短剧每户几部剧", example = "1")
     private Integer dramaAmount;
-
+    @Schema(description = "小说每户几部剧", example = "1")
+    private Integer fictionAmount;
     @Schema(description = "图片IDs,多个用逗号分隔", example = "1,2,3")
     private String imageIds;
 

+ 15 - 1
src/main/java/com/moka/gdtauto/entity/AdPlan.java

@@ -77,11 +77,25 @@ public class AdPlan {
     private String wxCorpid;
 
     /**
+     * 资产类型:1-短剧,2-小说
+     */
+    private Integer assetType;
+    /**
+     * 小说ID
+     */
+    private Long fictionId;
+    /**
+     * 小说名称
+     */
+    private String fictionName;
+    /**
      * 短剧ID
      */
     private Long dramaId;
+    /**
+     * 短剧名称
+     */
     private String dramaName;
-    
 
     /**
      * 图片ID

+ 1 - 1
src/main/java/com/moka/gdtauto/service/impl/AdPlanConfServiceImpl.java

@@ -749,7 +749,7 @@ public class AdPlanConfServiceImpl extends ServiceImpl<AdPlanConfMapper, AdPlanC
             return AdgroupsAddReqPool.getROIAdgroupsAddRequest(
                     plan.getAccountId(),
                     plan.getAdgroupName(),
-                    plan.getDramaId(),
+                    plan.getAssetType() == 1 ? plan.getDramaId() : plan.getFictionId(),
                     calculateBeginDate(),
                     "",
                     parseTargetConfId(plan.getTarget()),

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