wjx 9 meses atrás
pai
commit
c86fed812f

+ 3 - 1
src/pages/launchSystemV3/components/TargetingTooltip/index.tsx

@@ -21,6 +21,7 @@ interface Props {
     data: any,
     geoLocationList: any // 所有地域
     modelList: any  // 所有品牌手机
+    targetingName?: string
 }
 interface ContentProps {
     unlimited?: string,         // 不限
@@ -54,7 +55,7 @@ interface ContentProps {
 const TargetingTooltip: React.FC<Props> = (props) => {
 
     /**********************/
-    const { data, geoLocationList, modelList } = props
+    const { data, geoLocationList, modelList, targetingName } = props
     const [content, setContent] = useState<ContentProps>({})
     /**********************/
     useEffect(() => {
@@ -133,6 +134,7 @@ const TargetingTooltip: React.FC<Props> = (props) => {
 
 
     return <div className='targetingTooltip'>
+        {targetingName && <div style={{ fontWeight: 'bold', marginBottom: 4 }}>{targetingName}</div>}
         {content?.geoLocation && <div>
             <strong>地域:</strong><span>{(content?.location && content?.location?.length > 0) && `(${content?.location?.map((key: string) => LOCATION_TYPES_ENUM[key]).toString()})`}{content?.geoLocation?.toString()}</span>
         </div>}

+ 1 - 0
src/pages/launchSystemV3/tencentAdPutIn/create/Target/dataItem.tsx

@@ -20,6 +20,7 @@ const DataItem: React.FC<Props> = ({ targeting, onModify, onClear, onCopy, geoLo
         overlayInnerStyle={{ maxWidth: 350, maxHeight: 350, overflow: 'hidden', overflowY: 'auto' }}
         mouseEnterDelay={0.5}
         content={<TargetingTooltip
+            targetingName={targeting?.targetingName}
             data={targeting}
             geoLocationList={geoLocationList}
             modelList={modelList}

+ 79 - 61
src/pages/launchSystemV3/tencentAdPutIn/create/Target/generateTarget.tsx

@@ -2,6 +2,7 @@ import { Button, Card, Form, InputNumber, Modal, Select, Space, message } from "
 import React from "react"
 import '../../index.less'
 import { getRandomElements } from "@/utils/utils"
+import { REGION_DATA } from "./const"
 
 interface Props {
     target: any
@@ -17,47 +18,79 @@ const GenerateTarget: React.FC<Props> = ({ target, visible, onChange, onClose })
     /*********************************/
 
     const handleOk = (values: any) => {
-        console.log(values)
-        /**
-         * 上海 310000
-         * "上海市未知" 319900 "黄浦区" 310101 "徐汇区" 310104 "长宁区" 310105 "静安区" 310106 "普陀区" 310107 "虹口区" 310109
-         * "杨浦区" 310110 "闵行区" 310112  "宝山区" 310113 "嘉定区" 310114 "浦东新区" 310115 "金山区" 310116 "松江区" 310117
-         * "青浦区" 310118 "奉贤区" 310120 "崇明区" 310230
-         * "北京市" 110000
-         * "北京市未知" 119900  "东城区" 110101 "西城区" 110102 "朝阳区" 110105 "丰台区" 110106 "石景山区" 110107 "海淀区" 110108
-         * "门头沟区" 110109 "房山区" 110111 "通州区" 110112 "顺义区" 110113 "昌平区" 110114 "大兴区" 110115 "怀柔区" 110116
-         * "平谷区" 110117 "密云区" 110228 "延庆区" 110229
-         */
-        const shanghai = [319900, 310101, 310104, 310105, 310106, 310107, 310109, 310110, 310112, 310113, 310114, 310115, 310116, 310117, 310118, 310120, 310230]
-        const shanghaiDto = {
-            319900: '上海市未知', 310101: '黄浦区', 310104: '徐汇区', 310105: '长宁区', 310106: '静安区', 310107: '普陀区', 310109: '虹口区', 310110: '杨浦区', 310112: '闵行区',
-            310113: '宝山区', 310114: '嘉定区', 310115: '浦东新区', 310116: '金山区', 310117: '松江区', 310118: '青浦区', 310120: '奉贤区', 310230: '崇明区'
-        }
-        const beijin = [119900, 110101, 110102, 110105, 110106, 110107, 110108, 110109, 110111, 110112, 110113, 110114, 110115, 110116, 110117, 110228, 110229]
-        const beijinDto = {
-            119900: '北京市未知', 110101: '东城区', 110102: '西城区', 110105: '朝阳区', 110106: '丰台区', 110107: '石景山区', 110108: '海淀区', 110109: '门头沟区', 110111: '房山区',
-            110112: '通州区', 110113: '顺义区', 110114: '昌平区', 110115: '大兴区', 110116: '怀柔区', 110117: '平谷区', 110228: '密云区', 110229: '延庆区'
-        }
         const zhongguo = [156, 540000, 630000, 510000, 450000, 320000, 220000, 370000, 340000, 150000, 140000, 420000, 130000, 360000, 310000, 330000, 650000, 350000, 120000, 110000, 640000, 530000, 210000, 610000, 520000, 230000, 460000, 440000, 500000, 410000, 620000, 430000]
         const locationTypes = ["LIVE_IN"]
         const { regions, count } = values
-        let regionsList = regions === 310000 ? shanghai : regions === 110000 ? beijin : []
-        let regionsNameList = regions === 310000 ? shanghaiDto : regions === 110000 ? beijinDto : []
+
+        let regionsData = REGION_DATA.find(item => item.value === regions)
+        let children = regionsData?.children || []
+
+        interface Region {
+            title: string;
+            value: number;
+            key: number;
+            parentId?: number;
+            disabled?: boolean;
+            children?: Region[];
+        }
+
+        function getRegionPaths(region: Region, parentPath: string = ''): string[] {
+            const currentPath = parentPath ? `${parentPath},${region.value}` : `${region.value}`;
+            const paths = [];
+            if (region?.children?.length) {
+                for (const child of region.children) {
+                    paths.push(...getRegionPaths(child, currentPath));
+                }
+            } else {
+                paths.push(currentPath)
+            }
+            return paths;
+        }
+
+        function getAllPaths(regions: Region[]): string[] {
+            let allPaths: string[] = [];
+            for (const region of regions) {
+                allPaths = allPaths.concat(getRegionPaths(region));
+            }
+            return allPaths;
+        }
+
+        let regionsList: string[] = getAllPaths(children);
         if (regionsList.length === 0) {
             message.error('请联系管理员')
             return
         }
-        const getTarget = (count: number, regionsList: number[]): any => {
+        const getTarget = (count: number, regionsList: string[], targeting: any): any => {
             let dataRandom = getRandomElements(regionsList, count)
-            return dataRandom.map(r => {
-                let rName = regionsNameList[r]
-                return {
-                    targetingName: `${regions === 310000 ? '上海' : regions === 110000 ? '北京' : ''}无${rName}+` + target.targetingName,
-                    targeting: {
-                        ...target?.targeting || {},
-                        geoLocation: {
-                            locationTypes,
-                            regions: [...zhongguo.filter(item => item !== regions), ...regionsList.filter(item => item !== r)]
+            return dataRandom.map(item => {
+                let r = item.split(',')
+                let rData = children.find(c => c.value.toString() === r[0])
+                let rName = rData?.title
+                let regionsL = children.map(item => item.value)
+                if (r.length > 1) {
+                    let lChildren = rData?.children || []
+                    let lData = lChildren.find(item => item.value.toString() === r[1])
+                    let lName = lData?.title
+                    let lRegionsL = lChildren.map(item => item.value)
+                    return {
+                        targetingName: `${regionsData?.title}无${rName}${lName}+` + target.targetingName,
+                        targeting: {
+                            ...targeting || {},
+                            geoLocation: {
+                                locationTypes: targeting?.locationTypes || locationTypes,
+                                regions: [...((targeting?.regions || zhongguo) as number[]).filter(item => item !== regions), ...regionsL.filter(item => item.toString() !== r[0]), ...lRegionsL.filter(item => item.toString() !== r[1])]
+                            }
+                        }
+                    }
+                } else {
+                    return {
+                        targetingName: `${regionsData?.title}无${rName}+` + target.targetingName,
+                        targeting: {
+                            ...targeting || {},
+                            geoLocation: {
+                                locationTypes: targeting?.locationTypes || locationTypes,
+                                regions: [...((targeting?.regions || zhongguo) as number[]).filter(item => item !== regions), ...regionsL.filter(item => item.toString() !== r[0])]
+                            }
                         }
                     }
                 }
@@ -67,33 +100,13 @@ const GenerateTarget: React.FC<Props> = ({ target, visible, onChange, onClose })
         if (target?.targeting?.geoLocation) {
             let oldregions: number[] = target.targeting.geoLocation.regions
             if (oldregions.includes(regions)) {
-                data = data.concat(getTarget(count, regionsList))
+                data = data.concat(getTarget(count, regionsList, target?.targeting))
             } else { // 不包含 regionsList
-                let ooregions = oldregions.filter(r => regionsList.toString().includes(r.toString()))
-                if (ooregions.length > 0) {
-                    if (count > ooregions.length) {
-                        message.error(`区县不够,生成数量太多,剩余区县:${ooregions.length}`)
-                        return
-                    }
-                    data = data.concat(getTarget(count, ooregions))
-                } else {
-                    message.error('当前地域已经全部排除了该城市')
-                    return
-                }
+                message.error('当前地域已经排除了该省下的某个区或者县')
+                return
             }
         } else {
-            // data.push({
-            //     ...target,
-            //     targetingName: target.targetingName + '+全国',
-            //     targeting: {
-            //         ...target?.targeting || {},
-            //         geoLocation: {
-            //             locationTypes,
-            //             regions: zhongguo
-            //         }
-            //     }
-            // })
-            data = data.concat(getTarget(count, regionsList))
+            data = data.concat(getTarget(count, regionsList, {}))
         }
         onChange?.(data)
     }
@@ -119,7 +132,7 @@ const GenerateTarget: React.FC<Props> = ({ target, visible, onChange, onClose })
             }}
             onFinish={handleOk}
             initialValues={{
-                regions: 310000,
+                regions: 540000,
                 count: 3
             }}
         >
@@ -134,9 +147,14 @@ const GenerateTarget: React.FC<Props> = ({ target, visible, onChange, onClose })
                         { required: true, message: '请选择' }
                     ]}
                 >
-                    <Select placeholder="请选择">
-                        <Select.Option value={310000}>上海</Select.Option>
-                        <Select.Option value={110000}>北京</Select.Option>
+                    <Select
+                        placeholder="请选择"
+                        showSearch
+                        filterOption={(input, option) =>
+                            ((option?.children ?? '') as any).toLowerCase().includes(input.toLowerCase())
+                        }
+                    >
+                        {REGION_DATA.map(item => <Select.Option value={item.value} key={item.key}>{item.title}</Select.Option>)}
                     </Select>
                 </Form.Item>
                 <Form.Item