selectTarget.tsx 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. import { Button, Card, Drawer, Input, Space, Typography, message } from "antd"
  2. import React, { useEffect, useState } from "react"
  3. import '../../index.less'
  4. import New1Radio from "@/pages/launchSystemV3/components/New1Radio";
  5. import style from '../index.less'
  6. import { CheckOutlined, CloseOutlined, PlusOutlined, SearchOutlined, UndoOutlined } from "@ant-design/icons";
  7. import AddTarget from "./addTarget";
  8. import { useAjax } from "@/Hook/useAjax";
  9. import { getTargetingListApi } from "@/services/adqV3";
  10. import Tables from "@/components/Tables";
  11. import { TableConfig } from "./tableConfig";
  12. import { getTargetingGagsApi } from "@/services/adqV3/global";
  13. import { randomString } from "@/utils/utils";
  14. const { Title, Text } = Typography;
  15. interface Props {
  16. value?: any,
  17. visible?: boolean
  18. onClose?: () => void
  19. onChange?: (value: any) => void
  20. }
  21. /**
  22. * 添加定向
  23. * @param param0
  24. * @returns
  25. */
  26. const SelectTarget: React.FC<Props> = ({ value = [], visible, onChange, onClose }) => {
  27. /*****************************/
  28. const [distributionRule, setDistributionRule] = useState<'1' | '2'>('1')
  29. const [addTemVisible, setAddTemVisible] = useState<boolean>(false)
  30. const [queryParams, setQueryParams] = useState<PULLIN.GetTargeting>({ pageNum: 1, pageSize: 20 })
  31. const [queryParamsNew, setQueryParamsNew] = useState<PULLIN.GetTargeting>({ pageNum: 1, pageSize: 20 })
  32. const [geoLocationList, setGeoLocationList] = useState<any>({}) // 所有地域列表
  33. const [modelList, setModelList] = useState<any>({}) // 所有品牌手机
  34. const [modifyDta, setModifyDta] = useState<any>()
  35. const [selectedTargetKeys, setSelectedTargetKeys] = useState<any[]>(value)
  36. const getTargetingGags = useAjax((params) => getTargetingGagsApi(params))
  37. const getTargetingList = useAjax((params) => getTargetingListApi(params))
  38. /*****************************/
  39. // 设置地域
  40. useEffect(() => {
  41. async function handle() {
  42. await getTargetingGags.run({ type: 'REGION' }).then(res => {
  43. if (res && Array.isArray(res)) {
  44. setGeoLocationList(() => (res as any[])?.reduce((prev: any, cur: { id: number }) => {
  45. prev[cur.id] = cur
  46. return prev
  47. }, {}))
  48. }
  49. })
  50. await getTargetingGags.run({ type: 'DEVICE_BRAND_MODEL' }).then(res => {
  51. if (res && Array.isArray(res)) {
  52. setModelList(() => (res as any[])?.reduce((prev: any, cur: { id: number }) => {
  53. prev[cur.id] = cur
  54. return prev
  55. }, {}))
  56. }
  57. })
  58. }
  59. handle()
  60. }, [])
  61. useEffect(() => {
  62. getTargetingList.run(queryParamsNew)
  63. }, [queryParamsNew])
  64. /** 编辑 复制 */
  65. const editHandle = (data: any, isCopy?: boolean) => {
  66. const { targetingName, targeting, description, id, accountId } = data
  67. let newModifyDta = {
  68. ...targeting,
  69. targetingName,
  70. description,
  71. accountId: accountId || undefined
  72. }
  73. if (!isCopy) {
  74. newModifyDta.id = id
  75. } else {
  76. newModifyDta.targetingName = newModifyDta.targetingName + `_副本${randomString(true, 3, 5)}`
  77. newModifyDta.isCopy = isCopy
  78. }
  79. setModifyDta(newModifyDta)
  80. setAddTemVisible(true)
  81. }
  82. const handleOk = () => {
  83. console.log(1111)
  84. if (selectedTargetKeys?.length > 0) {
  85. onChange?.(selectedTargetKeys)
  86. } else {
  87. message.error('请选择定向模板')
  88. }
  89. }
  90. return <Drawer
  91. title={<strong style={{ fontSize: 20 }}>定向模板</strong>}
  92. visible={visible}
  93. onClose={onClose}
  94. width={1200}
  95. headerStyle={{ padding: '10px 16px' }}
  96. maskClosable={false}
  97. className={`modalResetCss targetingSelect`}
  98. >
  99. <Card className="cardResetCss" bodyStyle={{ padding: 0, height: 'calc(100vh - 136px)', overflow: 'hidden', overflowY: 'auto' }}>
  100. <div className="flexColumnStart" style={{ height: '100%' }}>
  101. <div className="flexSpaceBetween" style={{ padding: 16 }}>
  102. <Space size={20}>
  103. <Text strong>定向模板分配规则</Text>
  104. <New1Radio
  105. // { label: '按账户选择', value: '2' }
  106. data={[{ label: '全部相同', value: '1' }]}
  107. value={distributionRule}
  108. onChange={(e) => setDistributionRule(e)}
  109. />
  110. </Space>
  111. </div>
  112. <div className={style.template}>
  113. {distributionRule === '2' && <div className={style.template_left}>
  114. <h4 className={style.title}>媒体账户</h4>
  115. <div onClick={() => { }} className={`${style.accItem}`}>
  116. 43151494
  117. <CheckOutlined style={{ color: '#1890ff' }} />
  118. </div>
  119. </div>}
  120. <div className={style.template_center}>
  121. <div className="flexSpaceBetween" style={{ marginBottom: 10 }}>
  122. <Space>
  123. <Input placeholder="请输入定向模板名称" value={queryParams?.targetingName} allowClear onChange={(e) => setQueryParams({ ...queryParams, targetingName: e.target.value, pageNum: 1 })} />
  124. <Button type="primary" icon={<SearchOutlined />} loading={getTargetingList.loading} onClick={() => setQueryParamsNew({ ...queryParams })}>搜索</Button>
  125. </Space>
  126. <Space>
  127. <Button type="primary" icon={<PlusOutlined />} onClick={() => setAddTemVisible(true)}>新增定向模板</Button>
  128. </Space>
  129. </div>
  130. <Tables
  131. columns={TableConfig(geoLocationList, modelList, editHandle)}
  132. dataSource={getTargetingList?.data?.records}
  133. size="small"
  134. loading={getTargetingList?.loading}
  135. scroll={{ y: 320 }}
  136. bordered
  137. rowSelection={{
  138. type: 'checkbox',
  139. selectedRowKeys: selectedTargetKeys?.map((item: any) => item?.id?.toString()),
  140. onChange: (_: React.Key[], selectedRows: any) => {
  141. setSelectedTargetKeys(selectedRows)
  142. }
  143. }}
  144. total={getTargetingList?.data?.total}
  145. defaultPageSize={20}
  146. current={getTargetingList?.data?.current}
  147. pageSize={getTargetingList?.data?.size}
  148. pageChange={(page: number, pageSize?: number) => {
  149. setQueryParamsNew({ ...queryParamsNew, pageNum: page, pageSize: pageSize as number || 20 })
  150. setQueryParams({ ...queryParams, pageNum: page, pageSize: pageSize as number || 20 })
  151. }}
  152. />
  153. </div>
  154. <div className={style.template_right}>
  155. <div className={`flexSpaceBetween ${style.header}`}>
  156. <Title level={5} style={{ marginBottom: 0 }}>已选:3</Title>
  157. <Button type="link" style={{ padding: 0, fontSize: 12, lineHeight: 'normal' }} onClick={() => setSelectedTargetKeys([])} icon={<UndoOutlined />}>清空</Button>
  158. </div>
  159. <div className={style.selectTarget}>
  160. {selectedTargetKeys?.map((item: any) => <div key={item.id} className={style.selectTarget__row}>
  161. <Text ellipsis={{ tooltip: true }}>{item.targetingName}</Text>
  162. <Button type="link" className={style.clear} onClick={() => setSelectedTargetKeys(selectedTargetKeys.filter(i => item.id !== i.id))} danger icon={<CloseOutlined />}></Button>
  163. </div>)}
  164. </div>
  165. </div>
  166. </div>
  167. </div>
  168. </Card>
  169. <Card className="cardResetCss" style={{ marginTop: 8 }} bodyStyle={{ display: 'flex', justifyContent: 'center', gap: 10 }}>
  170. <Button onClick={onClose}>取消</Button>
  171. <Button type="primary" onClick={() => handleOk()}>确定</Button>
  172. </Card>
  173. {/* 新增修改定向模板 */}
  174. {addTemVisible && <AddTarget
  175. value={modifyDta}
  176. visible={addTemVisible}
  177. onClose={() => {
  178. setAddTemVisible(false)
  179. setModifyDta(undefined)
  180. }}
  181. onChange={() => {
  182. setAddTemVisible(false)
  183. setModifyDta(undefined)
  184. }}
  185. />}
  186. </Drawer>
  187. }
  188. export default React.memo(SelectTarget)