Przeglądaj źródła

Merge branch 'develop' of http://git.zanxiangnet.com/wjx/ad-manage

wjx 8 miesięcy temu
rodzic
commit
248f474d67

+ 4 - 3
src/components/InputName/index.tsx

@@ -7,7 +7,7 @@ import './index.less'
 
 interface Props extends TextAreaProps {
     length?: number
-    isCurrent?: Array<'素材名称'>
+    isCurrent?: Array<'素材名称' | '落地页名' | '文案'>
 }
 /**
  * 广告名称 设置 组件
@@ -82,8 +82,9 @@ const InputName: React.FC<Props> = ({ isCurrent, value, onChange, length, ...pro
             <Space>
                 {/* <Button type="link" onClick={() => insertMatching('<定向名>')} style={{ padding: 0 }} disabled={value?.toString()?.includes('<定向名>')}>+定向名</Button> */}
                 {isCurrent.includes('素材名称') && <Button type="link" onClick={() => insertMatching('<素材名称>')} style={{ padding: 0 }} disabled={value?.toString()?.includes('<素材名称>')}>+素材名称</Button>}
-                {/* <Button type="link" onClick={() => insertMatching('<落地页名>')} style={{ padding: 0 }} disabled={value?.toString()?.includes('<落地页名>')}>+落地页名</Button>
-                <Button type="link" onClick={() => insertMatching('<优化目标>')} style={{ padding: 0 }} disabled={value?.toString()?.includes('<优化目标>')}>+优化目标</Button>
+                {isCurrent.includes('落地页名') && <Button type="link" onClick={() => insertMatching('<落地页名>')} style={{ padding: 0 }} disabled={value?.toString()?.includes('<落地页名>')}>+落地页名</Button>}
+                {isCurrent.includes('文案') && <Button type="link" onClick={() => insertMatching('<文案>')} style={{ padding: 0 }} disabled={value?.toString()?.includes('<文案>')}>+文案(前5个文字)</Button>}
+                {/* <Button type="link" onClick={() => insertMatching('<优化目标>')} style={{ padding: 0 }} disabled={value?.toString()?.includes('<优化目标>')}>+优化目标</Button>
 
                 <Dropdown overlay={menu} trigger={['click']}>
                     <a style={{ marginLeft: 50 }} onClick={e => e.preventDefault()}><DiffOutlined /> 插入更多</a>

+ 63 - 0
src/pages/launchSystemV3/tencenTasset/corpWechat/index.tsx

@@ -158,6 +158,69 @@ export const SelectCorpWechat: React.FC<{ value?: number, onChange?: (value?: nu
     </>
 }
 
+/**
+ * 选择企微
+ * @param param0 
+ * @returns 
+ */
+export const SelectCorpWechatCorpId: React.FC<{ value?: string[], onChange?: (value?: string[]) => void }> = ({ value, onChange }) => {
+
+    /*******************************/
+    const [visible, setVisible] = useState<boolean>(false)
+    const getCorpWechatAll = useAjax((params) => getCorpWechatAllApi(params))
+    /*******************************/
+
+    // 获取列表
+    useEffect(() => {
+        getCorpWechatAll.run({})
+    }, [])
+
+    return <>
+        <Select
+            showSearch
+            allowClear
+            placeholder="请选择小程序"
+            filterOption={(input: any, option: any) => {
+                return option!.name?.toString().toLowerCase().includes(input.toLowerCase())
+            }}
+            mode="multiple"
+            style={{ width: 480 }}
+            dropdownRender={menu => <>
+                {menu}
+                <Divider style={{ margin: '8px 0' }} />
+                <div>
+                    <Button type="link" onClick={() => {
+                        window.location.href = '/#/launchSystemV3/tencenTasset/corpWechat'
+                    }}>前往管理</Button>
+                    <Button type="link" style={{ paddingLeft: 0, paddingRight: 0 }} onClick={() => {
+                        setVisible(true)
+                    }}>新增</Button>
+                    {/* <Link href="/#/launchSystemV3/tencenTasset/miniProgramWechat" target="_blank">
+                    前往管理
+                </Link> */}
+                </div>
+            </>}
+            value={value}
+            onChange={(e) => onChange?.(e)}
+        >
+            {getCorpWechatAll?.data?.map((item: { id: number, wechatId: string, wechatName: string }) => {
+                return <Select.Option value={item.wechatId} disabled={value && value?.length > 0 && !value.includes(item.wechatId)} key={item.id} name={item.wechatName + `(${item.wechatId})`}><Text strong>{item.wechatName}</Text><Text type="secondary">{`(${item.wechatId})`}</Text></Select.Option>
+            })}
+        </Select>
+        {/* 新增修改 */}
+        {visible && <Modify
+            visible={visible}
+            onClose={() => {
+                setVisible(false)
+            }}
+            onChange={() => {
+                setVisible(false)
+                getCorpWechatAll.refresh()
+            }}
+        />}
+    </>
+}
+
 
 /**
  * 展示企微

+ 2 - 1
src/pages/launchSystemV3/tencentAdPutIn/const.ts

@@ -470,7 +470,8 @@ export enum WECHAT_AD_NEHAVIOR_ENUM {
 	WECHAT_MOMENTS_AD_LIKE = '曾对你的朋友圈广告感兴趣',
 	// WECHAT_OFFICIAL_ACCOUNT_FOLLOWED = '已关注过你的公众号',
 	GDT_WECHAT_OFFICIAL_ACCOUNT_FOLLOWED = '已关注过你的公众号',
-	// WECHAT_WORK_CONTACTS_ADDED = '已经添加过企业微信'
+	WE_COM_CORP_ID_ADDED = '已经添加过企业微信',
+	// WECHAT_WORK_CONTACTS_ADDED = '已经添加过企业微信',
 }
 
 /** 投放模式 */

+ 6 - 4
src/pages/launchSystemV3/tencentAdPutIn/create/Dynamic/creativeConversionAssistant.tsx

@@ -251,18 +251,20 @@ const CreativeConversionAssistant: React.FC<{ automaticSiteEnabled?: boolean }>
 
     /** 标签 */
     const labelContent = useMemo(() => {
+        // 卡片广告用卡片组件控制
+        if ([1707, 1708].includes(creativeTemplateId) && !cardType?.includes('label')) {
+            return null
+        }
         let label = creativeComponents?.label;
         if (label) {
             const list = label.children.list
-            // const content = list.children.content
-            // const type = list.children.type
 
             return <Form.Item name={'creativeLabelDTOS'} style={{ marginTop: 16, marginBottom: 0 }} label={<strong>&nbsp;&nbsp;&nbsp;标签{label.required ? '' : '(选填)'}</strong>}>
                 <SelectLabel arrayProperty={list.arrayProperty}/>
             </Form.Item>
         }
         return null
-    }, [creativeComponents?.label])
+    }, [creativeComponents?.label, cardType])
 
     /** 数据外显 */
     const showDataContent = useMemo(() => {
@@ -531,7 +533,7 @@ const CreativeConversionAssistant: React.FC<{ automaticSiteEnabled?: boolean }>
             { label: '行动按钮', value: 'action_button', disabled: cardType?.some(item => ['chosen_button', 'shop_imag'].includes(item)) },
             // { label: '选择按钮', value: 'chosen_button', disabled: cardType?.some(item => ['label', 'action_button', 'shop_imag'].includes(item)) },
             // { label: '卖点图', value: 'shop_imag', disabled: cardType?.some(item => ['chosen_button'].includes(item)) },
-            // { label: '标签', value: 'label', disabled: cardType?.some(item => ['chosen_button', 'count_down'].includes(item)) },
+            { label: '标签', value: 'label', disabled: cardType?.some(item => ['chosen_button', 'count_down'].includes(item)) },
             // { label: '倒计时', value: 'count_down', disabled: cardType?.some(item => ['living_desc', 'label'].includes(item)) },
             // { label: '轮播文案', value: 'living_desc', disabled: cardType?.some(item => ['count_down'].includes(item)) }
         ]

+ 31 - 3
src/pages/launchSystemV3/tencentAdPutIn/create/Dynamic/creativeTemplateSetup.tsx

@@ -12,6 +12,35 @@ import { AD_STATUS_ENUM } from "../../const";
  */
 const CreativeTemplateSetup: React.FC = () => {
 
+    const validateString = (str: string) => {
+        // 检查是否包含 '<' 或 '>'
+        const hasAngleBrackets = str.includes('<') || str.includes('>');
+        
+        // 如果没有 '<' 和 '>',直接返回 true
+        if (!hasAngleBrackets) {
+            return true;
+        }
+        // 正则表达式匹配成对的 <...>
+        const pattern = /<([^<>]*)>/g;
+        let match;
+        const validValues = ["素材名称", "落地页名", "文案"];
+
+        // 匹配是否成对
+        let strR = str.replaceAll(pattern, '')
+        if (strR.includes('<') || strR.includes('>')) {
+            return false
+        }
+        
+        while ((match = pattern.exec(str)) !== null) {
+            const content = match[1]; // 获取 <...> 内的内容
+            // 检查内容是否为 "素材名称" 或 "落地页名"
+            if (!validValues.includes(content)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     return <Card
         title={< strong style={{ fontSize: 18 }}>创意设置</strong >}
         className="cardResetCss"
@@ -30,8 +59,7 @@ const CreativeTemplateSetup: React.FC = () => {
                         if (value && reg.test(value)) {
                             return Promise.reject()
                         }
-                        let regL = /[<>]/ig
-                        if (regL.test(value) && !value.includes('<素材名称>')) {
+                        if (!validateString(value)) {
                             return Promise.reject()
                         }
                         return Promise.resolve()
@@ -47,7 +75,7 @@ const CreativeTemplateSetup: React.FC = () => {
                 }
             ]}
         >
-            <InputName placeholder='请输入创意名称' style={{ width: 480 }} length={50} isCurrent={['素材名称']}/>
+            <InputName placeholder='请输入创意名称' style={{ width: 480 }} length={50} isCurrent={['素材名称']} />
         </Form.Item>
     </Card>
 }

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

@@ -4,7 +4,7 @@ import { Button, Space, Tag } from "antd"
 import { EditOutlined } from "@ant-design/icons"
 import { DispatchAddelivery } from ".."
 import NewDynamic from "./newDynamic"
-import { AD_STATUS_ENUM, CONVERSION_DATA_ENUM, CONVERSION_TARGET_ENUM, DELIVERY_MODE_ENUM, FLOATING_ZONE_TYPE_ENUM, PAGE_TYPE_ENUM, TEXT_LINK_TYPE_ENUM, pageSpecFieldConVertUn } from "../../const"
+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 "../../const"
 import { getProfilesApi } from "@/services/adqV3/global"
 import { useAjax } from "@/Hook/useAjax"
 import { arraysHaveSameValues } from "@/utils/utils"

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

@@ -3,7 +3,7 @@ import React, { useContext, useEffect, useState } from "react"
 import '../../index.less'
 import { getCreativeDetailsApi, getCreativeTemplateListApi } from "@/services/adqV3/global";
 import { useAjax } from "@/Hook/useAjax";
-import { DELIVERY_MODE_ENUM, pageSpecFieldConVert, pageSpecFieldConVertUn } from "../../const";
+import { DELIVERY_MODE_ENUM, pageSpecFieldConVert } from "../../const";
 import New2Radio from "@/pages/launchSystemV3/components/New2Radio";
 import New1Radio from "@/pages/launchSystemV3/components/New1Radio";
 import { outAdcreativeTemplateIdFun } from "@/pages/launchSystemNew/launchManage/localAd/adenum";

+ 4 - 4
src/pages/launchSystemV3/tencentAdPutIn/create/Target/addTarget.tsx

@@ -11,7 +11,7 @@ import moment from "moment"
 import { txtLength } from "@/utils/utils"
 import { addTargetingApi, checkTargetingApi, updateTargetingApi } from "@/services/adqV3"
 import { useModel } from "umi"
-import { SelectCorpWechat } from "@/pages/launchSystemV3/tencenTasset/corpWechat"
+import { SelectCorpWechatCorpId } from "@/pages/launchSystemV3/tencenTasset/corpWechat"
 const { Title, Paragraph } = Typography;
 
 interface Props {
@@ -764,7 +764,7 @@ const AddTarget: React.FC<Props> = ({ isBackVal, value, visible, onChange, onClo
                         {wechatAdBehaviorType.includes('actions') && <>
                             <Title level={5} style={{ fontSize: 14 }}>再营销</Title>
                             <Form.Item style={{ marginBottom: 10 }} name={['wechatAdBehavior', 'actions']}>
-                                <Checkbox.Group options={Object.keys(WECHAT_AD_NEHAVIOR_ENUM).filter(item => item !== 'WECHAT_WORK_CONTACTS_ADDED').map(key => ({ label: WECHAT_AD_NEHAVIOR_ENUM[key as keyof typeof WECHAT_AD_NEHAVIOR_ENUM], value: key, disabled: excludedActions?.some((k: string) => k === key) }))} />
+                                <Checkbox.Group options={Object.keys(WECHAT_AD_NEHAVIOR_ENUM).filter(item => !['WE_COM_CORP_ID_ADDED', 'WECHAT_WORK_CONTACTS_ADDED'].includes(item)).map(key => ({ label: WECHAT_AD_NEHAVIOR_ENUM[key as keyof typeof WECHAT_AD_NEHAVIOR_ENUM], value: key, disabled: excludedActions?.some((k: string) => k === key) }))} />
                             </Form.Item>
                         </>}
                         {wechatAdBehaviorType.includes('excludedActions') && <>
@@ -773,9 +773,9 @@ const AddTarget: React.FC<Props> = ({ isBackVal, value, visible, onChange, onClo
                                 <Checkbox.Group options={Object.keys(WECHAT_AD_NEHAVIOR_ENUM).map(key => ({ label: WECHAT_AD_NEHAVIOR_ENUM[key as keyof typeof WECHAT_AD_NEHAVIOR_ENUM], value: key, disabled: actions?.some((k: string) => k === key) }))} />
                             </Form.Item>
                         </>}
-                        {excludedActions?.includes('WECHAT_WORK_CONTACTS_ADDED') && <>
+                        {excludedActions?.includes('WE_COM_CORP_ID_ADDED') && <>
                             <Form.Item label={<strong>企业微信</strong>} name={['wechatAdBehavior', 'corpId']} rules={[{ required: true, message: '请选择微信小程序' }]}>
-                                <SelectCorpWechat />
+                                <SelectCorpWechatCorpId />
                             </Form.Item>
                         </>}
                     </div>}