|  | @@ -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
 |