index.tsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import Tables from "@/components/Tables"
  2. import { useAjax } from "@/Hook/useAjax"
  3. import { getCrowdPackApi, sysCrowdPackApi } from "@/services/launchAdq/createAd"
  4. import { CheckOutlined, SyncOutlined } from "@ant-design/icons"
  5. import { Button, Input, Modal, Space } from "antd"
  6. import React, { useEffect, useState } from "react"
  7. import style from '../goodsModal/index.less'
  8. import columns from "./tableConfig"
  9. const crowdpackData = [
  10. {
  11. id: 1,
  12. name: '定向用户群'
  13. },
  14. {
  15. id: 2,
  16. name: '排除用户群'
  17. }
  18. ]
  19. /**
  20. * 获取人群包列表
  21. * @returns
  22. */
  23. interface Props {
  24. visible?: boolean,
  25. onClose?: () => void,
  26. onChange?: (data: any) => void,
  27. data: any
  28. }
  29. const CrowdPackModal: React.FC<Props> = (props) => {
  30. /*****************/
  31. const { visible, onClose, data: data1, onChange } = props
  32. const [data, setData] = useState<any>(data1)
  33. const [tableData, setTableData] = useState<any[]>([])//table数据
  34. const [selectAdz, setSelectAdz] = useState<number>(1) // 选择账户
  35. const [selectCp, setSelectCp] = useState<number>(1) // 选择自定义
  36. const [name, setName] = useState<string>('')
  37. const getCrowdPack = useAjax((params) => getCrowdPackApi(params))
  38. const sysCrowdPack = useAjax((params) => sysCrowdPackApi(params))
  39. /*****************/
  40. useEffect(() => {
  41. // customAudienceList?: any, excludedCustomAudienceList?: any
  42. if (data?.length > 0) {
  43. getList([data[selectAdz - 1].adAccountId])
  44. } else {
  45. setTableData([])
  46. }
  47. }, [selectAdz])
  48. const getKey = (index: number, reverse?: boolean) => {
  49. if (reverse) {
  50. if (index === 1) return 'excludedCustomAudienceList'
  51. return 'customAudienceList'
  52. } else {
  53. if (index === 1) return 'customAudienceList'
  54. return 'excludedCustomAudienceList'
  55. }
  56. }
  57. // 获取人群包列表
  58. const getList = (params: number[]) => {
  59. getCrowdPack.run(params).then(res => {
  60. console.log('res===>', res)
  61. if (res && Object.keys(res)?.indexOf(params[0].toString()) !== -1) {
  62. setTableData(res[params[0]]?.map((item: { audienceId: string }) => ({ ...item, id: item.audienceId })))
  63. } else {
  64. setTableData([])
  65. }
  66. })
  67. }
  68. const handleOk = () => {
  69. onChange && onChange(data)
  70. }
  71. // 同步人群包
  72. const synGoodsList = () => {
  73. sysCrowdPack.run(data?.map((item: { id: number }) => item?.id)).then(res => {
  74. getList([data[selectAdz - 1].adAccountId])
  75. })
  76. }
  77. /** 设置选中广告主 */
  78. const handleSelectAdz = (value: number, item: any) => {
  79. if (value === selectAdz) {
  80. return
  81. }
  82. setSelectAdz(value)
  83. }
  84. const handleSelectCp = (value: number) => {
  85. if (value === selectCp) {
  86. return
  87. }
  88. setSelectCp(value)
  89. }
  90. /** 表格选折 */
  91. const onChangeTable = (selectedRowKeys: React.Key[], selectedRows: any) => {
  92. let newData = JSON.parse(JSON.stringify(data))
  93. newData[selectAdz - 1][getKey(selectCp)] = selectedRows
  94. setData([...newData])
  95. }
  96. return <Modal
  97. title={<Space>
  98. <span>人群包</span>
  99. <Button size="small" onClick={() => { synGoodsList() }} type="link" loading={sysCrowdPack.loading}>同步人群包</Button>
  100. </Space>}
  101. visible={visible}
  102. onCancel={() => { onClose && onClose() }}
  103. onOk={handleOk}
  104. width={1100}
  105. className={style.SelectPackage}
  106. bodyStyle={{ padding: '0 10px 0 10px' }}
  107. >
  108. <div className={style.content}>
  109. <div className={style.left} style={{ width: 140 }}>
  110. <h4 className={style.title}>人或目标场景</h4>
  111. {crowdpackData.map((item: { id: number, name: string }, index: number) => (
  112. <div key={index} onClick={() => { handleSelectCp(index + 1) }} className={`${style.accItem} ${selectCp === index + 1 && style.select} `}>
  113. {item?.name}
  114. {/* {orientPackage[selectAdz - 1]?.goods?.key === item?.catalogId && orientPackage[selectAdz - 1].goods?.data?.length > 0 && <CheckOutlined style={{ color: '#1890ff' }} />} */}
  115. </div>))
  116. }
  117. </div>
  118. <div className={style.left}>
  119. <h4 className={style.title}>媒体账户</h4>
  120. {data?.map((item: { adAccountId: number, id: number }, index: number) => (
  121. <div key={index} onClick={() => { handleSelectAdz(index + 1, item) }} className={`${style.accItem} ${selectAdz === index + 1 && style.select} `}>
  122. {item?.adAccountId}
  123. {data[index][getKey(selectCp)]?.length > 0 && <CheckOutlined style={{ color: '#1890ff' }} />}
  124. </div>))}
  125. </div>
  126. <div className={style.right}>
  127. <Space style={{ marginBottom: 10 }}>
  128. <Input placeholder="请输入用户群名称" allowClear value={name} onChange={(e) => setName(e.target.value)} />
  129. <Button icon={<SyncOutlined />} type='link' loading={getCrowdPack?.loading} onClick={() => { getList([data[selectAdz - 1].adAccountId]) }}></Button>
  130. </Space>
  131. <Tables
  132. columns={columns()}
  133. dataSource={tableData?.filter((item: { name: string }) => name ? item.name.indexOf(name) !== -1 : true)}
  134. size="small"
  135. loading={getCrowdPack?.loading}
  136. scroll={{ y: 300 }}
  137. bordered
  138. defaultPageSize={100}
  139. rowSelection={{
  140. type: 'checkbox',
  141. selectedRowKeys: data[selectAdz - 1][getKey(selectCp)]?.map((item: any) => item?.id?.toString()),
  142. onChange: onChangeTable,
  143. getCheckboxProps: (record: any) => ({
  144. disabled: data[selectAdz - 1][getKey(selectCp, true)]?.map((item: any) => item?.id)?.includes(record.id),
  145. id: record.id,
  146. })
  147. }}
  148. />
  149. </div>
  150. </div>
  151. </Modal>
  152. }
  153. export default React.memo(CrowdPackModal)