planList.tsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. import { allPlanProps, downLoadAllAdListApi } from "@/services/adMonitor/adMonitor"
  2. import React, { useState, useEffect, useCallback } from "react"
  3. import { useModel } from "umi"
  4. import moment from "moment"
  5. import { downloadFile1, formatDate } from "@/utils/downloadFile"
  6. import { Button, Card, DatePicker, Input, Select, Space } from "antd"
  7. import PlanDetail from "./components/planDetail"
  8. import { GUANGGAOZHUANGTAI } from "./enum"
  9. import TableData from "@/pages/launchSystemNew/components/TableData";
  10. import { CloudDownloadOutlined } from "@ant-design/icons"
  11. import { guanggao } from "./config"
  12. import columnsPlanList from './tablePlanListConfig'
  13. const PlanList: React.FC = () => {
  14. const { getAllPlanList, getBookListAll, getAdqAccountList } = useModel('useAdMonitor.useMonitor')
  15. const { getPicherList } = useModel('useOperating.useWxGroupList')
  16. // 变量开始
  17. const [queryForm, setQueryForm] = useState<allPlanProps>({ pageNum: 1, pageSize: 20, createStartTime: moment().subtract(3, 'days').format('YYYY-MM-DD'), createEndTime: moment().format('YYYY-MM-DD') }) // 搜索变量
  18. const [visible, setVisible] = useState<boolean>(false) // 详情弹窗控制
  19. const [adId, setAdId] = useState<any>()
  20. const [downLoadLoading, setDownLoadLoading] = useState<boolean>(false)
  21. // 变量结束
  22. // 获取广告账号
  23. useEffect(() => {
  24. getAdqAccountList.run()
  25. }, [])
  26. // 获取投手
  27. useEffect(() => {
  28. getPicherList.run()
  29. }, [])
  30. useEffect(() => {
  31. if (sessionStorage.getItem('ADIDORNAME')) {
  32. let data = JSON.parse(sessionStorage.getItem('ADIDORNAME') as any)
  33. setQueryForm({ ...queryForm, createStartTime: undefined, createEndTime: undefined, adgroup: data.adgroupId, campaign: data.campaignId, sysUserId: data.putUserId ? data.putUserId?.toString()?.split() : [], accountId: data?.accountId?.toString()?.split() })
  34. sessionStorage.removeItem('ADIDORNAME')
  35. }
  36. }, [])
  37. // 获取分组
  38. useEffect(() => {
  39. getList()
  40. }, [queryForm])
  41. const getList = useCallback(() => {
  42. getAllPlanList.run(queryForm)
  43. }, [queryForm])
  44. /** 获取书 */
  45. useEffect(() => {
  46. getBookListAll.run()
  47. }, [])
  48. // 设置创建时间
  49. const setUnix = ([str, end]: string[]) => {
  50. if (str && end) {
  51. setQueryForm({ ...queryForm, pageNum: 1, createStartTime: moment(str).format('YYYY-MM-DD'), createEndTime: moment(end).format('YYYY-MM-DD') })
  52. } else {
  53. const { createStartTime, createEndTime, ...newQueyFor } = queryForm
  54. setQueryForm({ ...newQueyFor, pageNum: 1 })
  55. }
  56. }
  57. // 详情
  58. const detail = (data: number) => {
  59. setAdId(data)
  60. setVisible(true)
  61. }
  62. // 接口自动刷新10分钟一次
  63. useEffect(() => {
  64. let time = setInterval(() => {
  65. console.log('广告列表10分钟刷新')
  66. getAllPlanList.refresh()
  67. }, 1000 * 60 * 10)
  68. return () => {
  69. clearInterval(time)
  70. }
  71. }, [getAllPlanList])
  72. // 下载
  73. const downLoadExcel = useCallback(() => {
  74. setDownLoadLoading(true)
  75. let newQueryForm = JSON.parse(JSON.stringify(queryForm))
  76. downLoadAllAdListApi(newQueryForm).then(res => {
  77. setDownLoadLoading(false)
  78. downloadFile1(res, 'octet-stream', formatDate(new Date()) + ".xlsx")
  79. }).catch(() => setDownLoadLoading(false))
  80. }, [queryForm, downLoadLoading])
  81. return <Space direction='vertical' style={{ width: '100%' }} className="planlist">
  82. {/* 详情弹窗 */}
  83. {visible && <PlanDetail visible={visible} onClose={() => { setVisible(false) }} data={adId} dataStartTime={queryForm?.dataStartTime} dataEndTime={queryForm?.dataEndTime} />}
  84. <Card hoverable bodyStyle={{ padding: '12px 16px' }}>
  85. <Space direction='vertical' style={{ width: '100%' }}>
  86. <Space wrap>
  87. <Select
  88. showSearch
  89. disabled={queryForm?.accountId?.length > 0}
  90. filterOption={(input, option) =>
  91. (option?.children as any).toLowerCase().indexOf(input.toLowerCase()) >= 0
  92. }
  93. value={queryForm?.sysUserId}
  94. mode='multiple'
  95. maxTagCount={1}
  96. style={{ minWidth: 150 }}
  97. allowClear
  98. placeholder="请选择投手"
  99. onChange={(value: any[]) => { setQueryForm({ ...queryForm, pageNum: 1, sysUserId: value }) }}
  100. >
  101. {getPicherList?.data?.map((item: { nickname: string, userId: number }, index: number) =>
  102. <Select.Option
  103. value={item.userId.toString()}
  104. key={item.userId + '' + index}
  105. >
  106. {item.nickname}
  107. </Select.Option>
  108. )}
  109. </Select>
  110. <Select
  111. showSearch
  112. mode='multiple'
  113. maxTagCount={1}
  114. value={queryForm.accountId}
  115. style={{ minWidth: 220 }}
  116. allowClear
  117. placeholder="请选择广告账号"
  118. onChange={(value: string) => {
  119. setQueryForm({ ...queryForm, accountId: value, pageNum: 1 })
  120. }}
  121. >
  122. {getAdqAccountList?.data?.data?.map((item: { id: number, accountId: number, wechatAccountName: string }) => <Select.Option
  123. value={item.accountId}
  124. key={item.id}
  125. >
  126. {item.accountId}
  127. </Select.Option>)}
  128. </Select>
  129. {/* <Select style={{ minWidth: 150 }} placeholder="请选择主投书" allowClear value={queryForm?.mainBookList} onChange={(e) => { setQueryForm({ ...queryForm, pageNum: 1, mainBookList: e }) }} mode="multiple" maxTagCount={1}>
  130. {getBookListAll?.data?.data?.map((item: { id: number, bookName: string }) => <Select.Option value={item.id} key={item?.id}>{item.bookName}</Select.Option>)}
  131. </Select> */}
  132. <Select style={{ width: 150 }} placeholder="请选择广告状态" value={queryForm.adStatus} onChange={(value: number) => {
  133. setQueryForm({ ...queryForm, pageNum: 1, adStatus: value })
  134. }} allowClear>
  135. {Object.keys(GUANGGAOZHUANGTAI).map(key => {
  136. return <Select.Option value={key} key={key}>{GUANGGAOZHUANGTAI[key]}</Select.Option>
  137. })}
  138. </Select>
  139. {/* <Select style={{ width: 150 }} placeholder="请选择创意状态" value={queryForm?.creativeStatus} onChange={(e) => { setQueryForm({ ...queryForm, pageNum: 1, creativeStatus: e }) }} allowClear>
  140. {
  141. Object.keys(CHUANGYIZHUANGTAI).map(key => {
  142. return <Select.Option value={key} key={key}>{CHUANGYIZHUANGTAI[key]}</Select.Option>
  143. })
  144. }
  145. </Select> */}
  146. {/* <Select style={{ width: 150 }} placeholder="请选择关注状态" value={queryForm?.followStatus} onChange={(e) => { setQueryForm({ ...queryForm, followStatus: e }) }} allowClear>
  147. <Select.Option value={1}>已关注</Select.Option>
  148. <Select.Option value={2}>未关注</Select.Option>
  149. </Select> */}
  150. <Input placeholder="请输入计划名称或ID" allowClear value={queryForm?.campaign} onChange={(e) => { setQueryForm({ ...queryForm, pageNum: 1, campaign: e.target.value }) }} />
  151. <Input placeholder="请输入广告名称或ID" allowClear value={queryForm?.adgroup} onChange={(e) => { setQueryForm({ ...queryForm, pageNum: 1, adgroup: e.target.value }) }} />
  152. <Input placeholder="请输入创意ID" allowClear value={queryForm?.creativeId} onChange={(e) => { setQueryForm({ ...queryForm, pageNum: 1, creativeId: e.target.value }) }} />
  153. </Space>
  154. <Space wrap>
  155. <DatePicker.RangePicker placeholder={['数据开始日期', '数据结束日期']} onChange={(mo: any, str: string[]) => { setQueryForm({ ...queryForm, pageNum: 1, dataStartTime: str[0], dataEndTime: str[1] }) }} value={(queryForm?.dataStartTime && queryForm?.dataEndTime ? [moment(queryForm?.dataStartTime), moment(queryForm?.dataEndTime)] : null) as any} />
  156. <DatePicker.RangePicker placeholder={['创建开始日期', '创建结束日期']} onChange={(mo: any, str: string[]) => { setUnix(str) }} value={(queryForm?.createStartTime && queryForm?.createEndTime ? [moment(queryForm?.createStartTime), moment(queryForm?.createEndTime)] : null) as any} />
  157. {/* <DatePicker onChange={(e) => { e ? setQueryForm({ ...queryForm, dataTime: moment(e).format('YYYY-MM-DD') }) : setQueryForm({ ...queryForm, dataTime: '' }) }} value={queryForm?.dataTime ? moment(queryForm?.dataTime) : null} /> */}
  158. <Button type="primary" onClick={() => { getList() }}>搜索</Button>
  159. </Space>
  160. </Space>
  161. </Card>
  162. <TableData
  163. bodyStyle={{ padding: '12px 16px' }}
  164. gutter={[0, 12]}
  165. columns={columnsPlanList(detail)}
  166. ajax={getAllPlanList}
  167. dataSource={getAllPlanList?.data?.data?.records}
  168. loading={getAllPlanList?.loading}
  169. scroll={{ y: 600 }}
  170. fixed={{ left: 0, right: 1 }}
  171. total={getAllPlanList?.data?.data?.total}
  172. page={queryForm.pageNum}
  173. pageSize={queryForm.pageSize}
  174. leftChild={<Button size="small" icon={<CloudDownloadOutlined />} loading={downLoadLoading} onClick={downLoadExcel}>下载</Button>}
  175. onChange={(props: any) => {
  176. let { sortData, pagination } = props
  177. let { current, pageSize } = pagination
  178. let newQueryForm = JSON.parse(JSON.stringify(queryForm))
  179. newQueryForm.pageNum = current
  180. newQueryForm.pageSize = pageSize
  181. if (sortData && JSON.stringify('sortData') !== '{}') {
  182. let { field, order } = sortData // descend 降序 大到小 ascend 升序 小到大
  183. if (order) {
  184. newQueryForm.sortField = field
  185. newQueryForm.sort = order === 'ascend' ? 'ASC' : 'DESC'
  186. } else {
  187. Object.keys(newQueryForm).forEach(key => {
  188. if (key === 'sortField' || key === 'sort') {
  189. delete newQueryForm[key]
  190. }
  191. })
  192. }
  193. } else {
  194. Object.keys(newQueryForm).forEach(key => {
  195. if (key === 'sortField' || key === 'sort') {
  196. delete newQueryForm[key]
  197. }
  198. })
  199. }
  200. setQueryForm({ ...newQueryForm })
  201. }}
  202. config={guanggao}
  203. configName={'广告列表'}
  204. />
  205. </Space>
  206. }
  207. export default React.memo(PlanList)