selectTarget.tsx 9.4 KB

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