|  | @@ -0,0 +1,164 @@
 | 
	
		
			
				|  |  | +import { Button, Card, Form, InputNumber, Modal, Select, Space, message } from "antd"
 | 
	
		
			
				|  |  | +import React from "react"
 | 
	
		
			
				|  |  | +import '../../index.less'
 | 
	
		
			
				|  |  | +import { getRandomElements } from "@/utils/utils"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +interface Props {
 | 
	
		
			
				|  |  | +    target: any
 | 
	
		
			
				|  |  | +    visible?: boolean,
 | 
	
		
			
				|  |  | +    onClose?: () => void
 | 
	
		
			
				|  |  | +    onChange?: (value: any) => void
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +const GenerateTarget: React.FC<Props> = ({ target, visible, onChange, onClose }) => {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /*********************************/
 | 
	
		
			
				|  |  | +    const [form] = Form.useForm();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /*********************************/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    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 : []
 | 
	
		
			
				|  |  | +        if (regionsList.length === 0) {
 | 
	
		
			
				|  |  | +            message.error('请联系管理员')
 | 
	
		
			
				|  |  | +            return
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        const getTarget = (count: number, regionsList: number[]): 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)]
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            })
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        let data: any[] = []
 | 
	
		
			
				|  |  | +        if (target?.targeting?.geoLocation) {
 | 
	
		
			
				|  |  | +            let oldregions: number[] = target.targeting.geoLocation.regions
 | 
	
		
			
				|  |  | +            if (oldregions.includes(regions)) {
 | 
	
		
			
				|  |  | +                data = data.concat(getTarget(count, regionsList))
 | 
	
		
			
				|  |  | +            } 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
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            data.push({
 | 
	
		
			
				|  |  | +                ...target,
 | 
	
		
			
				|  |  | +                targetingName: target.targetingName + '+全国',
 | 
	
		
			
				|  |  | +                targeting: {
 | 
	
		
			
				|  |  | +                    ...target?.targeting || {},
 | 
	
		
			
				|  |  | +                    geoLocation: {
 | 
	
		
			
				|  |  | +                        locationTypes,
 | 
	
		
			
				|  |  | +                        regions: zhongguo
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            })
 | 
	
		
			
				|  |  | +            data = data.concat(getTarget(count - 1, regionsList))
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        onChange?.(data)
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return <Modal
 | 
	
		
			
				|  |  | +        title={<strong>一键生成定向配置</strong>}
 | 
	
		
			
				|  |  | +        visible={visible}
 | 
	
		
			
				|  |  | +        className='modalResetCss'
 | 
	
		
			
				|  |  | +        onCancel={onClose}
 | 
	
		
			
				|  |  | +        bodyStyle={{ padding: '0 0 40px', position: 'relative', borderRadius: '0 0 8px 8px' }}
 | 
	
		
			
				|  |  | +        footer={null}
 | 
	
		
			
				|  |  | +    >
 | 
	
		
			
				|  |  | +        <Form
 | 
	
		
			
				|  |  | +            form={form}
 | 
	
		
			
				|  |  | +            name="generateTarget"
 | 
	
		
			
				|  |  | +            labelAlign='left'
 | 
	
		
			
				|  |  | +            labelCol={{ span: 4 }}
 | 
	
		
			
				|  |  | +            colon={false}
 | 
	
		
			
				|  |  | +            style={{ backgroundColor: '#f1f4fc', maxHeight: 600, overflow: 'hidden', overflowY: 'auto', padding: '10px 10px 10px', borderRadius: '0 0 8px 8px' }}
 | 
	
		
			
				|  |  | +            scrollToFirstError
 | 
	
		
			
				|  |  | +            onFinishFailed={({ errorFields }) => {
 | 
	
		
			
				|  |  | +                message.error(errorFields?.[0]?.errors?.[0])
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +            onFinish={handleOk}
 | 
	
		
			
				|  |  | +            initialValues={{
 | 
	
		
			
				|  |  | +                regions: 310000,
 | 
	
		
			
				|  |  | +                count: 3
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +        >
 | 
	
		
			
				|  |  | +            <Card
 | 
	
		
			
				|  |  | +                title={<strong style={{ fontSize: 18 }}>生成设置</strong>}
 | 
	
		
			
				|  |  | +                className="cardResetCss"
 | 
	
		
			
				|  |  | +            >
 | 
	
		
			
				|  |  | +                <Form.Item
 | 
	
		
			
				|  |  | +                    label={<strong>地域差异</strong>}
 | 
	
		
			
				|  |  | +                    name='regions'
 | 
	
		
			
				|  |  | +                    rules={[
 | 
	
		
			
				|  |  | +                        { required: true, message: '请选择' }
 | 
	
		
			
				|  |  | +                    ]}
 | 
	
		
			
				|  |  | +                >
 | 
	
		
			
				|  |  | +                    <Select placeholder="请选择">
 | 
	
		
			
				|  |  | +                        <Select.Option value={310000}>上海</Select.Option>
 | 
	
		
			
				|  |  | +                        <Select.Option value={110000}>北京</Select.Option>
 | 
	
		
			
				|  |  | +                    </Select>
 | 
	
		
			
				|  |  | +                </Form.Item>
 | 
	
		
			
				|  |  | +                <Form.Item
 | 
	
		
			
				|  |  | +                    label={<strong>生成数量</strong>}
 | 
	
		
			
				|  |  | +                    name='count'
 | 
	
		
			
				|  |  | +                    rules={[
 | 
	
		
			
				|  |  | +                        { required: true, message: '请输入生成数量' }
 | 
	
		
			
				|  |  | +                    ]}
 | 
	
		
			
				|  |  | +                >
 | 
	
		
			
				|  |  | +                    <InputNumber max={10} style={{ width: '100%' }} placeholder="请输入生成数量" />
 | 
	
		
			
				|  |  | +                </Form.Item>
 | 
	
		
			
				|  |  | +            </Card>
 | 
	
		
			
				|  |  | +            <Form.Item className="submit_pull">
 | 
	
		
			
				|  |  | +                <Space>
 | 
	
		
			
				|  |  | +                    <Button onClick={onClose}>取消</Button>
 | 
	
		
			
				|  |  | +                    <Button type="primary" htmlType="submit" className="modalResetCss">
 | 
	
		
			
				|  |  | +                        确定
 | 
	
		
			
				|  |  | +                    </Button>
 | 
	
		
			
				|  |  | +                </Space>
 | 
	
		
			
				|  |  | +            </Form.Item>
 | 
	
		
			
				|  |  | +        </Form>
 | 
	
		
			
				|  |  | +    </Modal>
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export default React.memo(GenerateTarget)
 |