index.tsx 12 KB

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