index.tsx 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. import { useAjax } from "@/Hook/useAjax"
  2. import { CheckOutlined, QuestionCircleOutlined, SyncOutlined } from "@ant-design/icons"
  3. import { Button, message, Modal, Space, Table, Tooltip } from "antd"
  4. import React, { useEffect, useState } from "react"
  5. import style from '../GoodsModal/index.less'
  6. import columns from './tableConfig'
  7. import { getVideoChannelInfoApi, getVideoChannelInfoBatchApi } from "@/services/adqV3/global"
  8. /**
  9. * 获取视频号列表
  10. * @returns
  11. */
  12. interface Props {
  13. visible?: boolean,
  14. onClose?: () => void,
  15. onChange?: (data: PULLIN.AccountCreateLogsProps[]) => void,
  16. data: PULLIN.AccountCreateLogsProps[]
  17. }
  18. const VideoChannel: React.FC<Props> = (props) => {
  19. /************************/
  20. const { visible, onClose, data: data1, onChange } = props
  21. const [tableData, setTableData] = useState<any[]>([])//table数据
  22. const [selectAdz, setSelectAdz] = useState<number>(1) // 选择广告主
  23. const [data, setData] = useState<PULLIN.AccountCreateLogsProps[]>(data1)
  24. const [loading, setLoading] = useState<boolean>(false)
  25. const getVideoChannelInfo = useAjax((params) => getVideoChannelInfoApi(params))
  26. const getVideoChannelInfoBatch = useAjax((params) => getVideoChannelInfoBatchApi(params))
  27. /************************/
  28. useEffect(() => {
  29. if (data?.length > 0) {
  30. getList(data[selectAdz - 1].accountId)
  31. } else {
  32. setTableData([])
  33. }
  34. }, [selectAdz])
  35. // 获取公众号列表
  36. const getList = (accountId: number) => {
  37. getVideoChannelInfo.run({ accountId }).then(res => {
  38. setTableData(res || [])
  39. })
  40. }
  41. const handleOk = () => {
  42. if (data.every(item => item?.videoChannelList?.length)) {
  43. onChange && onChange(data)
  44. } else {
  45. message.error('请完善所有账号视频号')
  46. }
  47. }
  48. /** 设置选中广告主 */
  49. const handleSelectAdz = (value: number) => {
  50. if (value === selectAdz) {
  51. return
  52. }
  53. setSelectAdz(value)
  54. }
  55. /** 表格选折 */
  56. const onChangeTable = (_: React.Key[], selectedRows: any) => {
  57. let newData = JSON.parse(JSON.stringify(data))
  58. newData[selectAdz - 1]['videoChannelList'] = selectedRows
  59. setData([...newData])
  60. }
  61. // 清空已选
  62. const clearGoods = () => {
  63. let newData = JSON.parse(JSON.stringify(data))
  64. newData[selectAdz - 1]['videoChannelList'] = []
  65. setData([...newData])
  66. }
  67. /** 一键设置 */
  68. const setOnekey = (isFirst?: boolean) => {
  69. let newData: PULLIN.AccountCreateLogsProps[] = JSON.parse(JSON.stringify(data))
  70. const hide = message.loading(`正在设置...`, 0, () => {
  71. message.success('设置成功');
  72. });
  73. if (isFirst) {
  74. setLoading(true)
  75. let ajax = data.map(item => getVideoChannelInfoApi({ accountId: item.accountId }))
  76. Promise.all(ajax).then(res => {
  77. if (res) {
  78. res.forEach(a => {
  79. let data = a?.data?.[0] || {}
  80. newData = newData.map(item => {
  81. if (item.accountId.toString() === data.accountId.toString()) {
  82. return { ...item, videoChannelList: [data] }
  83. }
  84. return item
  85. })
  86. })
  87. setData(newData)
  88. }
  89. message.success('设置完成');
  90. setLoading(false)
  91. hide()
  92. }).catch(() => {
  93. message.success('设置失败');
  94. setLoading(false)
  95. hide()
  96. })
  97. } else {
  98. let wechatChannelNames: string[] = data[selectAdz - 1]['videoChannelList']?.map((item: { wechatChannelsAccountName: string }) => item.wechatChannelsAccountName) || []
  99. getVideoChannelInfoBatch.run({ accountIdList: newData?.filter(item => item.accountId !== data[selectAdz - 1].accountId)?.map(item => item?.accountId) }).then(res => {
  100. if (res?.length > 0) {
  101. res.forEach((i: { accountId: number, wechatChannelsAccountName: string }) => {
  102. if (wechatChannelNames.includes(i.wechatChannelsAccountName)) {
  103. newData = newData.map(item => {
  104. if (item.accountId.toString() === i.accountId.toString()) {
  105. return { ...item, videoChannelList: [i] }
  106. }
  107. return item
  108. })
  109. }
  110. })
  111. setData(newData)
  112. }
  113. message.success('设置完成');
  114. hide()
  115. })
  116. }
  117. }
  118. return <Modal
  119. title={<Space>
  120. <strong>选择视频号</strong>
  121. <Button type="link" danger onClick={() => setOnekey(true)} loading={loading}>一键设置第一个视频号给账户</Button>
  122. </Space>}
  123. open={visible}
  124. onCancel={() => { onClose && onClose() }}
  125. onOk={handleOk}
  126. width={900}
  127. className={`${style.SelectPackage} modalResetCss`}
  128. bodyStyle={{ padding: '0 10px 0 10px' }}
  129. >
  130. <div className={style.content}>
  131. <div className={style.left}>
  132. <h4 className={style.title}>媒体账户</h4>
  133. <div className={style.accountIdList}>
  134. {data?.map((item, index) => {
  135. let videoChannelList = data[index].videoChannelList || []
  136. return <div key={index} onClick={() => { handleSelectAdz(index + 1) }} className={`${style.accItem} ${selectAdz === index + 1 && style.select} `}>
  137. {item?.accountId}
  138. {videoChannelList?.length > 0 && <CheckOutlined style={{ color: '#1890ff' }} />}
  139. </div>
  140. })}
  141. </div>
  142. </div>
  143. <div className={style.right}>
  144. <Space style={{ marginBottom: 10 }} align="end" size={0}>
  145. <Button icon={<SyncOutlined />} type='link' loading={getVideoChannelInfo?.loading} onClick={() => { getList(data[selectAdz - 1].accountId) }}>刷新</Button>
  146. {data?.length > 1 && <Button disabled={!data[selectAdz - 1]['videoChannelList']?.length} onClick={() => setOnekey()} type="link" loading={getVideoChannelInfo.loading}>
  147. <Space>
  148. <span>一键设置</span>
  149. <Tooltip color="#FFF" overlayInnerStyle={{ color: '#000' }} title="设置其它账号有相同名称的视频号为那个账号的视频号(注意需要用户视频号名称称相同,否则不设置)">
  150. <QuestionCircleOutlined />
  151. </Tooltip>
  152. </Space>
  153. </Button>}
  154. {(data[selectAdz - 1]?.videoChannelList || [])?.length > 0 && <Button type='link' onClick={() => { clearGoods() }}>清空</Button>}
  155. </Space>
  156. <Table
  157. columns={columns()}
  158. dataSource={tableData}
  159. size="small"
  160. loading={getVideoChannelInfo?.loading}
  161. scroll={{ y: 400 }}
  162. rowKey={'wechatChannelsAccountId'}
  163. rowSelection={{
  164. type: 'radio',
  165. selectedRowKeys: data[selectAdz - 1]?.videoChannelList?.map((item: any) => item?.wechatChannelsAccountId),
  166. onChange: onChangeTable
  167. }}
  168. onRow={(record) => ({
  169. onClick: () => {
  170. let newDatas = JSON.parse(JSON.stringify(data))
  171. let oldData = newDatas[selectAdz - 1]?.videoChannelList || []
  172. const selected = oldData?.some((item: any) => item?.wechatChannelsAccountId === record.wechatChannelsAccountId);
  173. const newSelectedRows = selected
  174. ? oldData?.filter((item: any) => item?.wechatChannelsAccountId !== record.wechatChannelsAccountId)
  175. : [...oldData, record];
  176. newDatas[selectAdz - 1]['videoChannelList'] = newSelectedRows;
  177. setData([...newDatas])
  178. },
  179. })}
  180. />
  181. </div>
  182. </div>
  183. </Modal>
  184. }
  185. export default React.memo(VideoChannel)