index.tsx 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. import React, { useEffect, useState } from "react"
  2. import { useAjax } from "@/Hook/useAjax"
  3. import { getDynamicListApi, getDynamicTotalApi, GetGDTListProps } from "@/services/iaaData"
  4. import TablePro from "@/components/TablePro"
  5. import columns12 from "./tableConfig"
  6. import QueryForm from "@/components/QueryForm"
  7. import moment from "moment"
  8. import { useModel } from "umi"
  9. import { Button, message, Modal, Space, Table } from "antd"
  10. import { updateBatchDynamicCreativesInfoApi } from "@/services/gameData"
  11. import { PauseCircleOutlined, PlayCircleOutlined } from "@ant-design/icons"
  12. import DayAd from "./dayAd"
  13. /**
  14. * 腾讯创意列表
  15. * @returns
  16. */
  17. const Dynamic: React.FC = () => {
  18. /****************************************/
  19. const { initialState } = useModel('@@initialState');
  20. const [selectedRows, setSelectedRows] = useState<any[]>([])
  21. const [queryForm, setQueryForm] = useState<GetGDTListProps>({
  22. pageNum: 1,
  23. pageSize: 30,
  24. costDayBegin: moment().format('YYYY-MM-DD'),
  25. costDayEnd: moment().format('YYYY-MM-DD'),
  26. })
  27. const [totalData, setTotalData] = useState<any[]>([{ dynamicCreativeId: 1, accountId: '总计' }])
  28. const [visible, setVisible] = useState<boolean>(false)
  29. const [promotionId, setPromotionId] = useState<number>()
  30. const [dynamicCreativeId, setDynamicCreativeId] = useState<number>()
  31. const [adName, setAdName] = useState<string>('')
  32. const [failIdList, setFailIdList] = useState<{ adgroupId: number, code: number, message: string, messageCn: string }[]>([])
  33. const [failVisible, setFailVisible] = useState<boolean>(false)
  34. const updateBatchDynamicCreativesInfo = useAjax((params) => updateBatchDynamicCreativesInfoApi(params))
  35. const getDynamicList = useAjax((params) => getDynamicListApi(params))
  36. const getDynamicTotal = useAjax((params) => getDynamicTotalApi(params))
  37. /****************************************/
  38. useEffect(() => {
  39. if (initialState?.iaaApp?.length && initialState?.productType) {
  40. getDynamicList.run({ ...queryForm, appId: initialState.iaaApp, productType: initialState.productType })
  41. getDynamicTotal.run({ ...queryForm, appId: initialState.iaaApp, productType: initialState.productType }).then((res: { data: { dynamicCreativeId: number; accountId: string } }) => {
  42. if (res?.data) {
  43. let data = res?.data
  44. data.dynamicCreativeId = 1
  45. data.accountId = '总计'
  46. setTotalData([data])
  47. } else {
  48. setTotalData([{ dynamicCreativeId: 1, accountId: '总计' }])
  49. }
  50. })
  51. } else {
  52. setTotalData([{ dynamicCreativeId: 1, accountId: '总计' }])
  53. getDynamicList.mutate({ data: undefined })
  54. }
  55. }, [queryForm, initialState?.iaaApp, initialState?.productType])
  56. const dayHandle = (data: any) => {
  57. setVisible(true)
  58. setAdName(data.promotionName)
  59. setPromotionId(data.promotionId)
  60. setDynamicCreativeId(data.dynamicCreativeId)
  61. }
  62. const dynamicHandle = (type: '删除' | '启动' | '暂停', data?: any) => {
  63. let accountAdgroupMaps = data ? [data.accountId + ',' + data.dynamicCreativeId] : [...new Set(selectedRows?.map(item => item.accountId + ',' + item.dynamicCreativeId))]
  64. let hide: any
  65. if (data) {
  66. hide = message.loading(`正在设置...`, 0, () => {
  67. message.success('设置成功');
  68. });
  69. }
  70. switch (type) {
  71. case '启动':
  72. case '暂停':
  73. updateBatchDynamicCreativesInfo.run({ accountAdgroupMaps, suspend: type === '暂停' }).then(res => {
  74. if (res?.failIdList?.length === 0) {
  75. message.success(`修改操作完成!`)
  76. getDynamicList.refresh()
  77. setSelectedRows([])
  78. } else {
  79. setFailIdList(res?.list || [])
  80. setFailVisible(true)
  81. }
  82. if (hide) {
  83. hide()
  84. }
  85. })
  86. break
  87. }
  88. }
  89. return <div>
  90. <TablePro
  91. czChild={<Space>
  92. {/* <Switch checkedChildren="开启全选" unCheckedChildren="关闭全选" checked={!isZj} onChange={(e) => { setIsZj(!e); }} /> */}
  93. <Button type='primary' size="small" style={{ background: '#67c23a', borderColor: '#67c23a' }} loading={updateBatchDynamicCreativesInfo.loading} icon={<PlayCircleOutlined />} disabled={selectedRows.length === 0} onClick={() => dynamicHandle('启动')}>启动</Button>
  94. <Button type='primary' size="small" style={{ background: '#e6a23c', borderColor: '#e6a23c' }} loading={updateBatchDynamicCreativesInfo.loading} icon={<PauseCircleOutlined />} disabled={selectedRows.length === 0} onClick={() => dynamicHandle('暂停')}>暂停</Button>
  95. <span style={{ color: 'red' }}>操作完数据结果延时5分钟之内,即时结果去腾讯后台查看</span>
  96. </Space>}
  97. leftChild={<QueryForm
  98. initialValues={{ day3: [moment(), moment()] }}
  99. isAccountId
  100. isPromotionName
  101. isCreativeName
  102. isDynamicCreativeId
  103. isPutUserIdList
  104. isCpaBid
  105. isDeleted
  106. isPricing
  107. isStatus
  108. isPromotionId
  109. day1={{ placeholder: ['广告创建日期开始', '广告创建日期结束'] }}
  110. day2={{ placeholder: ['投放日期开始', '投放日期结束'] }}
  111. day3={{ placeholder: ['消耗日期开始', '消耗日期结束'] }}
  112. day4={{ placeholder: ['创意创建时间开始', '创意创建时间结束'] }}
  113. onChange={(data: any) => {
  114. console.log(data)
  115. const { day1, day2, day3, day4, ...params } = data
  116. let newQueryForm = JSON.parse(JSON.stringify(queryForm))
  117. newQueryForm.pageNum = 1
  118. if (day1 && day1?.length === 2) {
  119. newQueryForm['adCreateBegin'] = moment(day1[0]).format('YYYY-MM-DD')
  120. newQueryForm['adCreateEnd'] = moment(day1[1]).format('YYYY-MM-DD')
  121. } else {
  122. delete newQueryForm['adCreateBegin']
  123. delete newQueryForm['adCreateEnd']
  124. }
  125. if (day2 && day2?.length === 2) {
  126. newQueryForm['putDayBegin'] = moment(day2[0]).format('YYYY-MM-DD')
  127. newQueryForm['putDayEnd'] = moment(day2[1]).format('YYYY-MM-DD')
  128. } else {
  129. delete newQueryForm['putDayBegin']
  130. delete newQueryForm['putDayEnd']
  131. }
  132. if (day3 && day3?.length === 2) {
  133. newQueryForm['costDayBegin'] = moment(day3[0]).format('YYYY-MM-DD')
  134. newQueryForm['costDayEnd'] = moment(day3[1]).format('YYYY-MM-DD')
  135. } else {
  136. delete newQueryForm['costDayBegin']
  137. delete newQueryForm['costDayEnd']
  138. }
  139. if (day4 && day4?.length === 2) {
  140. newQueryForm['creativeCreateBegin'] = moment(day4[0]).format('YYYY-MM-DD')
  141. newQueryForm['creativeCreateEnd'] = moment(day4[1]).format('YYYY-MM-DD')
  142. } else {
  143. delete newQueryForm['creativeCreateBegin']
  144. delete newQueryForm['creativeCreateEnd']
  145. }
  146. setQueryForm({ ...newQueryForm, ...params })
  147. }}
  148. />}
  149. isZj
  150. totalData={totalData}
  151. config={columns12(dayHandle, () => { getDynamicList.refresh() })}
  152. configName={'腾讯创意列表'}
  153. fixed={{ left: 4, right: 2 }}
  154. scroll={{ x: 1000, y: 620 }}
  155. title='腾讯创意列表'
  156. rowKey={'dynamicCreativeId'}
  157. loading={getDynamicList.loading}
  158. ajax={getDynamicList}
  159. page={getDynamicList?.data?.data?.current || 1}
  160. pageSize={getDynamicList?.data?.data?.size || 20}
  161. total={getDynamicList?.data?.data?.total || 0}
  162. dataSource={getDynamicList?.data?.data?.records?.map((item: any) => ({ ...item, id: item.promotionId }))}
  163. onChange={(pagination: any, _: any, sortData: any) => {
  164. let { current, pageSize } = pagination
  165. let newQueryForm = JSON.parse(JSON.stringify(queryForm))
  166. if (sortData && sortData?.order) {
  167. newQueryForm['sortAsc'] = sortData?.order === 'ascend' ? true : false
  168. newQueryForm['sortFiled'] = sortData?.field
  169. } else {
  170. delete newQueryForm['sortAsc']
  171. delete newQueryForm['sortFiled']
  172. }
  173. newQueryForm.pageNum = current || newQueryForm.pageNum
  174. newQueryForm.pageSize = pageSize || newQueryForm.pageSize
  175. setQueryForm({ ...newQueryForm })
  176. }}
  177. rowSelection={{
  178. selectedRowKeys: selectedRows.map(item => item.dynamicCreativeId),
  179. getCheckboxProps: (record: any) => ({
  180. disabled: record.dynamicCreativeIsDeleted == 1 || record?.accountId === '总计'
  181. }),
  182. onSelect: (record: { dynamicCreativeId: number }, selected: boolean) => {
  183. if (selected) {
  184. selectedRows.push({ ...record })
  185. setSelectedRows([...selectedRows])
  186. } else {
  187. let newSelectAccData = selectedRows.filter((item: { dynamicCreativeId: number }) => item.dynamicCreativeId !== record.dynamicCreativeId)
  188. setSelectedRows([...newSelectAccData])
  189. }
  190. },
  191. onSelectAll: (selected: boolean, selectedRowss: { dynamicCreativeId: number }[], changeRows: { dynamicCreativeId: number }[]) => {
  192. if (selected) {
  193. let newSelectAccData = [...selectedRows]
  194. changeRows.forEach((item: { dynamicCreativeId: number }) => {
  195. let index = newSelectAccData.findIndex((ite: { dynamicCreativeId: number }) => ite.dynamicCreativeId === item.dynamicCreativeId)
  196. if (index === -1) {
  197. newSelectAccData.push({ ...item })
  198. }
  199. })
  200. setSelectedRows([...newSelectAccData])
  201. } else {
  202. let newSelectAccData = selectedRows.filter((item: { dynamicCreativeId: number }) => {
  203. let index = changeRows.findIndex((ite: { dynamicCreativeId: number }) => ite.dynamicCreativeId === item.dynamicCreativeId)
  204. if (index !== -1) {
  205. return false
  206. } else {
  207. return true
  208. }
  209. })
  210. setSelectedRows([...newSelectAccData])
  211. }
  212. }
  213. }}
  214. />
  215. {visible && <DayAd
  216. appId={initialState?.iaaApp as number[]}
  217. productType={initialState?.productType as string}
  218. adName={adName}
  219. visible={visible}
  220. onClose={() => { setVisible(false); setPromotionId(undefined); setDynamicCreativeId(undefined) }}
  221. queryForm={queryForm}
  222. promotionId={promotionId}
  223. dynamicCreativeId={dynamicCreativeId}
  224. />}
  225. {failVisible && <Modal
  226. title={<strong>报错信息</strong>}
  227. open={failVisible}
  228. className='modalResetCss'
  229. width={650}
  230. onCancel={() => { setFailVisible(false); setFailIdList([]) }}
  231. footer={null}
  232. >
  233. <Table
  234. size="small"
  235. bordered
  236. rowKey={'adgroupId'}
  237. columns={[{
  238. title: '广告ID',
  239. dataIndex: 'adgroupId',
  240. key: 'adgroupId',
  241. width: 110,
  242. render: (value) => <span style={{ fontSize: 12 }}>{value}</span>,
  243. },
  244. {
  245. title: 'code',
  246. dataIndex: 'code',
  247. key: 'code',
  248. width: 70,
  249. align: 'center',
  250. render: (value) => <span style={{ fontSize: 12 }}>{value}</span>,
  251. },
  252. {
  253. title: '错误信息',
  254. dataIndex: 'messageCn',
  255. key: 'messageCn',
  256. render: (value) => <span style={{ fontSize: 12 }}>{value}</span>,
  257. }]}
  258. dataSource={failIdList}
  259. />
  260. </Modal>}
  261. </div>
  262. }
  263. export default Dynamic