wjx 6 місяців тому
батько
коміт
358fb46431

+ 20 - 3
src/pages/launchSystemV3/components/DynamicTooltip/index.tsx

@@ -1,7 +1,7 @@
 import React, { useEffect, useState } from "react"
 import style from '../../tencentAdPutIn/create/index.less'
-import { AD_STATUS_ENUM, CONVERSION_DATA_ENUM, CONVERSION_TARGET_ENUM, DELIVERY_MODE_ENUM, PAGE_TYPE_ENUM, TEXT_LINK_TYPE_ENUM, pageSpecFieldConVertUn } from "../../tencentAdPutIn/const"
-import { Space } from "antd"
+import { AD_STATUS_ENUM, CONVERSION_DATA_ENUM, CONVERSION_TARGET_ENUM, DELIVERY_MODE_ENUM, FLOATING_ZONE_TYPE_ENUM, PAGE_TYPE_ENUM, TEXT_LINK_TYPE_ENUM } from "../../tencentAdPutIn/const"
+import { Space, Tag } from "antd"
 import { getProfilesApi } from "@/services/adqV3/global"
 import { useAjax } from "@/Hook/useAjax"
 
@@ -19,7 +19,7 @@ const DynamicTooltip: React.FC<Props> = ({ data: dynamicData }) => {
 
     /************************************/
     const { deliveryMode, creativeTemplateId, dynamicCreativeName, creativeComponents, configuredStatus } = dynamicData
-    const { textLink, actionButton, showData, brand, mainJumpInfo } = creativeComponents || {}
+    const { textLink, actionButton, showData, brand, mainJumpInfo, creativeLabelDTOS, creativeBarrageDTOS, floatingZoneComponent } = creativeComponents || {}
 
     const [profileData, setprofileData] = useState<any>()
     const getProfiles = useAjax((params) => getProfilesApi(params))
@@ -72,11 +72,28 @@ const DynamicTooltip: React.FC<Props> = ({ data: dynamicData }) => {
                 <p>按钮文案:{actionButton?.[0]?.value?.buttonText}</p>
                 {actionButton?.[0]?.value?.jumpInfo?.pageType && <p>跳转落地页:{PAGE_TYPE_ENUM[actionButton?.[0]?.value?.jumpInfo?.pageType as keyof typeof PAGE_TYPE_ENUM]}</p>}
             </>}
+            {creativeLabelDTOS?.length > 0 && <>
+                <p style={{ fontWeight: 'bold', color: '#000' }}>标签:</p>
+                {creativeLabelDTOS.map((item: { content: string }, index: number) => <Tag key={index}>{item.content}</Tag>)}
+            </>}
+            {creativeBarrageDTOS?.length > 0 && <>
+                <p style={{ fontWeight: 'bold', color: '#000' }}>弹幕:</p>
+                {creativeBarrageDTOS.map((item: { text: string }, index: number) => <Tag key={index}>{item.text}</Tag>)}
+            </>}
             {showData?.length > 0 && <>
                 <p style={{ fontWeight: 'bold', color: '#000' }}>数据外显:开启</p>
                 <p>数据类型:{CONVERSION_DATA_ENUM[showData?.[0]?.value?.conversionDataType as keyof typeof CONVERSION_DATA_ENUM]}</p>
                 <p>转化行为:{CONVERSION_TARGET_ENUM[showData?.[0]?.value?.conversionTargetType as keyof typeof CONVERSION_TARGET_ENUM]}</p>
             </>}
+            {floatingZoneComponent && Object.keys(floatingZoneComponent).length > 0 && <>
+                <p style={{ fontWeight: 'bold', color: '#000' }}>浮层卡片:{floatingZoneComponent?.floatingZoneSwitch ? '开启' : '关闭'}</p>
+                {floatingZoneComponent?.floatingZoneType && <p>复层卡片类型:{FLOATING_ZONE_TYPE_ENUM[floatingZoneComponent.floatingZoneType as keyof typeof FLOATING_ZONE_TYPE_ENUM]}</p>}
+                {floatingZoneComponent?.floatingZoneImageUrl && <p style={{ display: 'flex', alignItems: 'flex-start' }}>创意图片:<img src={floatingZoneComponent?.floatingZoneImageUrl} width={40} /></p>}
+                {floatingZoneComponent?.floatingZoneSingleImageUrl && <p style={{ display: 'flex', alignItems: 'flex-start' }}>创意图片:<img src={floatingZoneComponent?.floatingZoneSingleImageUrl} width={40} /></p>}
+                {floatingZoneComponent?.floatingZoneName && <p>文案:{floatingZoneComponent.floatingZoneName}</p>}
+                {floatingZoneComponent?.floatingZoneDesc && <p>文案:{floatingZoneComponent.floatingZoneDesc}</p>}
+                {floatingZoneComponent?.floatingZoneButtonText && <p>按钮文案:{floatingZoneComponent.floatingZoneButtonText}</p>}
+            </>}
         </>}
     </div>
 }

+ 1 - 1
src/pages/launchSystemV3/material/cloudNew/selectCloudNew.tsx

@@ -231,7 +231,7 @@ const SelectCloudNew: React.FC<CLOUDNEW.SelectCloudNewProps> = ({ visible, defau
                                                         filterOption={(input, option) =>
                                                             (option?.label as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
                                                         }
-                                                        options={showFieldList}
+                                                        options={showFieldList.filter(item => item.value !== 'description')}
                                                         value={sortData.sortField}
                                                         onChange={(value) => {
                                                             setSortData({ ...sortData, sortField: value as any })

+ 9 - 10
src/pages/launchSystemV3/tencentAdPutIn/create/Dynamic/SelectBarrage.tsx

@@ -5,8 +5,8 @@ import React, { useEffect, useState } from "react"
 
 interface Props {
     arrayProperty: { maxNumber: number, minNumber: number }
-    value?: { text: string }[]
-    onChange?: (value?: { text: string }[]) => void
+    value?: { text: string, id: number }[]
+    onChange?: (value?: { text: string, id: number }[]) => void
     putInType?: 'NOVEL' | 'GAME'
 }
 
@@ -18,7 +18,7 @@ interface Props {
 const SelectBarrage: React.FC<Props> = ({ arrayProperty, value = [], onChange, putInType }) => {
 
     /****************************************/
-    const [barrageList, setBarrageList] = useState<string[]>([])
+    const [barrageList, setBarrageList] = useState<{ text: string, id: number }[]>([])
 
     const getBarrageRecommendList = useAjax((params) => getBarrageRecommendListApi(params))
     /****************************************/
@@ -26,16 +26,14 @@ const SelectBarrage: React.FC<Props> = ({ arrayProperty, value = [], onChange, p
     useEffect(() => {
         getBarrageRecommendList.run({ taskType: putInType }).then(res => {
             if (res?.list?.length) {
-                const setBarrage = new Set(res?.list.map((item: { text: string }) => item.text))
-                const arrayBarrage = [...setBarrage]
-                setBarrageList(arrayBarrage as string[])
+                setBarrageList(res?.list || [])
             } else {
                 setBarrageList([])
             }
         })
     }, [putInType])
 
-    let barrageValue = value?.map(item => item.text)
+    let barrageValue = value?.map(item => item.id)
     return <div
         style={{
             border: '1px solid #d9d9d9',
@@ -49,18 +47,19 @@ const SelectBarrage: React.FC<Props> = ({ arrayProperty, value = [], onChange, p
         <Select
             showSearch
             placeholder="请选择弹幕"
-            onChange={(e) => {
-                onChange?.(e?.length > 0 ? e.map(item => ({ text: item })) : [])
+            onChange={(_, options) => {
+                onChange?.(options?.length > 0 ? options.map((item: { text: any; value: any }) => ({ text: item.text, id: item.value })) : [])
             }}
             value={barrageValue}
             mode="multiple"
             filterOption={(input, option) =>
                 ((option?.label ?? '') as any).toLowerCase().includes(input.toLowerCase())
             }
+            allowClear
             loading={getBarrageRecommendList.loading}
             bordered={false}
         >
-            {barrageList.map((item: string, index: number) => <Select.Option key={index} value={item} disabled={barrageValue?.length > arrayProperty.maxNumber && !barrageValue.includes(item)}>{item}</Select.Option>)}
+            {barrageList.map((item: { text: string, id: number }) => <Select.Option key={item.id} value={item.id} text={item.text} disabled={barrageValue?.length > arrayProperty.maxNumber && !barrageValue.includes(item.id)}>{item.text}</Select.Option>)}
         </Select>
         <div
             style={{

+ 16 - 2
src/pages/launchSystemV3/tencentAdPutIn/create/Dynamic/creativeConversionAssistant.tsx

@@ -136,7 +136,7 @@ const CreativeConversionAssistant: React.FC<{ automaticSiteEnabled?: boolean, pu
             linkNameEnumeration = (linkNameType.enumProperty.enumeration as { value: string, description: string }[]).map(item => ({ label: item.description, value: item.value }))
             linkNamePageType = textLink?.children?.page_type
             if (linkNamePageType) {
-                linkNamePageTypeEnumeration = (linkNamePageType?.enumProperty?.enumeration as { value: string, description: string }[]).filter(item => item.value === pageSpecPageType).map(item => ({ label: item.description, value: item.value }))
+                linkNamePageTypeEnumeration = (linkNamePageType?.enumProperty?.enumeration as { value: string, description: string }[]).filter(item => item.value === pageSpecPageType || item.value === 'PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL').map(item => ({ label: item.description, value: item.value }))
             }
             if (putInType === 'GAME') {
                 let jumpInfoPageType = creativeComponents?.jump_info?.children?.page_type?.enumProperty?.enumeration
@@ -287,7 +287,21 @@ const CreativeConversionAssistant: React.FC<{ automaticSiteEnabled?: boolean, pu
     const barrageContent = useMemo(() => {
         let barrage = creativeComponents?.barrage;
         if (barrage) {
-            return <Form.Item name={'creativeBarrageDTOS'} style={{ marginTop: 16, marginBottom: 0 }} label={<strong>&nbsp;&nbsp;&nbsp;弹幕{barrage.required ? '' : '(选填)'}</strong>}>
+            return <Form.Item 
+                name={'creativeBarrageDTOS'} 
+                style={{ marginTop: 16, marginBottom: 0 }} 
+                label={<strong>&nbsp;&nbsp;&nbsp;弹幕{barrage.required ? '' : '(选填)'}</strong>}
+                rules={[
+                    {
+                        required: barrage.required, validator(_, value) {
+                            if (value && (value?.length < 3 || value?.length > 20)) {
+                                return Promise.reject('弹幕数量须为3-20条')
+                            }
+                            return Promise.resolve()
+                        }
+                    }
+                ]}
+            >
                 <SelectBarrage arrayProperty={{ minNumber: 0, maxNumber: 20 }} putInType={putInType} />
             </Form.Item>
         }

+ 5 - 1
src/pages/launchSystemV3/tencentAdPutIn/create/Dynamic/index.tsx

@@ -18,7 +18,7 @@ const Dynamic: React.FC<{ creativeTemplateAppellation?: string, creativeTemplate
     const { addelivery, setAddelivery, clearData, setAccountCreateLogs, accountCreateLogs, putInType } = useContext(DispatchAddelivery)!;
     const { adgroups, dynamic: dynamicData } = addelivery;
     const { deliveryMode, creativeTemplateId, dynamicCreativeName, creativeComponents, configuredStatus } = dynamicData
-    const { textLink, actionButton, showData, brand, mainJumpInfo, floatingZoneComponent, creativeLabelDTOS } = creativeComponents || {}
+    const { textLink, actionButton, showData, brand, mainJumpInfo, floatingZoneComponent, creativeLabelDTOS, creativeBarrageDTOS } = creativeComponents || {}
     const [newVisible, setNewVisible] = useState<boolean>(false);
     const [profileData, setprofileData] = useState<any>()
 
@@ -79,6 +79,10 @@ const Dynamic: React.FC<{ creativeTemplateAppellation?: string, creativeTemplate
                         <p style={{ fontWeight: 'bold', color: '#000' }}>标签:</p>
                         {creativeLabelDTOS.map((item: { content: string }, index: number) => <Tag key={index}>{item.content}</Tag>)}
                     </>}
+                    {creativeBarrageDTOS?.length > 0 && <>
+                        <p style={{ fontWeight: 'bold', color: '#000' }}>弹幕:</p>
+                        {creativeBarrageDTOS.map((item: { text: string }, index: number) => <Tag key={index}>{item.text}</Tag>)}
+                    </>}
                     {showData?.length > 0 && <>
                         <p style={{ fontWeight: 'bold', color: '#000' }}>数据外显:开启</p>
                         <p>数据类型:{CONVERSION_DATA_ENUM[showData?.[0]?.value?.conversionDataType as keyof typeof CONVERSION_DATA_ENUM]}</p>

+ 10 - 2
src/pages/launchSystemV3/tencentAdPutIn/create/Dynamic/newDynamic.tsx

@@ -333,6 +333,7 @@ const NewDynamic: React.FC<Props> = ({ putInType, value: newValue, visible, onCl
             showData,
             floatingZone,
             creativeLabelDTOS,
+            creativeBarrageDTOS,
             ...surplusValues
         } = values
 
@@ -445,6 +446,11 @@ const NewDynamic: React.FC<Props> = ({ putInType, value: newValue, visible, onCl
             creativeComponents.creativeLabelDTOS = creativeLabelDTOS
         }
 
+        // 弹幕
+        if (creativeBarrageDTOS?.length) {
+            creativeComponents.creativeBarrageDTOS = creativeBarrageDTOS
+        }
+
         // 数据外显
         if (showDataShow) {
             creativeComponents.showData = [showData]
@@ -488,13 +494,15 @@ const NewDynamic: React.FC<Props> = ({ putInType, value: newValue, visible, onCl
                     showData,
                     mainJumpInfo,
                     floatingZoneComponent,
-                    creativeLabelDTOS
+                    creativeLabelDTOS,
+                    creativeBarrageDTOS
                 },
                 ...surplusValues
             } = JSON.parse(JSON.stringify(value))
             let dynamicValues: any = {
                 ...surplusValues,
-                creativeLabelDTOS
+                creativeLabelDTOS,
+                creativeBarrageDTOS
             }
             // if (value.deliveryMode === 'DELIVERY_MODE_CUSTOMIZE') {
             //     getTemplate(value.creativeTemplateId)

+ 1 - 1
src/services/adqV3/global.ts

@@ -679,7 +679,7 @@ export async function getGameLibraryAppIdDetailApi(wxGameAppId: number) {
  * @returns 
  */
 export async function getBarrageRecommendListApi(params: { adAccountId?: number, taskType?: 'GAME' | 'NOVEL' }) {
-    return request(api + `/adq/v3/launch/tools/creative/tools/barrageRecommend`, {
+    return request(api + `/adq/v3/launch/tools//creative/tools/barrage`, {
         method: 'GET',
         params
     })