import React, { useEffect, useRef, useState } from "react" import style from './index.less' import { Button, Card, Checkbox, Divider, Empty, Form, message, Pagination, Popover, Radio, Result, Select, Space, Spin, Typography, Image } from "antd" import { useAjax } from "@/Hook/useAjax" import { getPageRemoteImageDataListApi } from "@/services/adqV3/cloudNew" import { useModel } from "umi" import { formatBytes, formatSecondsToTime, groupBy } from "@/utils/utils" import SelectGroupSearch from "./selectGroupSearch" import './global.less' import '../../tencentAdPutIn/index.less' import { showFieldList } from "./const" import { EyeOutlined, SortAscendingOutlined } from "@ant-design/icons" import PlayVideo from "./playVideo" import Lazyimg from "react-lazyimg-component" const { Text, Paragraph } = Typography; /** * 选择账户组媒体素材 * @param param0 * @returns */ const SelectGroupCloudNew: React.FC = ({ num, defaultParams, checkedFolderList, setCheckedFolderList, sortData, setSortData, showField, setShowField, accountCreateLogs }) => { /*****************************************/ const { getAllUserAccount } = useModel('useLaunchAdq.useAdAuthorize') const [rowNum, setRowNum] = useState(0) const [checkFolderAll, setCheckFolderAll] = useState(false); const [indeterminateFolder, setIndeterminateFolder] = useState(false); const [queryParams, setQueryParams] = useState>({ pageNum: 1, pageSize: 20 }) const [searchParams, setSearchParams] = useState>>({}) const [ownerAccountId, setOwnerAccountId] = useState() const [previewData, setPreviewData] = useState<{ visible: boolean, url?: string }>({ visible: false }) const getPageRemoteImageDataList = useAjax((params) => getPageRemoteImageDataListApi(params)) /*****************************************/ // 根据内容宽度计算列数 useEffect(() => { let rowNum = Math.floor(1350 / 220) setRowNum(rowNum || 1) }, []) // 处理全选按钮状态 useEffect(() => { let data: any[] = getPageRemoteImageDataList?.data?.records || [] let dataIds = data.map(item => item.image_id || item.video_id) let selectIds = checkedFolderList.map(item => item.id) if (selectIds.length === 0 || dataIds.length === 0) { setCheckFolderAll(false) setIndeterminateFolder(false); } else if (dataIds.every((element) => selectIds.includes(element))) { setCheckFolderAll(true) setIndeterminateFolder(false); } else if (dataIds.some((element) => selectIds.includes(element))) { setCheckFolderAll(false) setIndeterminateFolder(true); } else { setCheckFolderAll(false) setIndeterminateFolder(false); } }, [checkedFolderList, getPageRemoteImageDataList?.data?.records]) useEffect(() => { if (accountCreateLogs?.length) { getAllUserAccount.run().then(res => { if (res?.data?.length) { const list = accountCreateLogs.map(item => item.accountId) const selectAccountList = res.data.filter((item: { accountId: any }) => list.includes(item.accountId)) const groupAccount = groupBy(selectAccountList, (item) => item.groupId, true) const GrounpArray = Object.keys(groupAccount).map(function (group) { return groupAccount[group]; }) if (GrounpArray.length === 1 && !groupAccount['undefined']) { setOwnerAccountId(GrounpArray?.[0]?.[0]?.authMainAccountId || GrounpArray?.[0]?.[0]?.accountId) } else if (GrounpArray.length === 2 && groupAccount?.['undefined']?.length === 1 && groupAccount?.['undefined']?.[0]?.isGroupMainAccount) { const undefinedAccount = groupAccount?.['undefined'][0].accountId let authMainAccountId: any Object.keys(groupAccount).forEach(key => { if (key !== 'undefined') { authMainAccountId = groupAccount[key][0].authMainAccountId } }) if (undefinedAccount === authMainAccountId) { setOwnerAccountId(authMainAccountId) } else { setOwnerAccountId(-1) } } else if (groupAccount?.['undefined']?.length === 1 && groupAccount?.['undefined']?.[0]?.isGroupMainAccount) { setOwnerAccountId(groupAccount?.['undefined']?.[0]?.accountId) } else { setOwnerAccountId(-1) } } }) } }, [accountCreateLogs]) useEffect(() => { if (ownerAccountId) { let params = { ...searchParams, ...defaultParams, ...queryParams, ownerAccountId } if (sortData?.sortField) { params = { ...params, ...sortData } } getPageRemoteImageDataList.run(params) } }, [queryParams, defaultParams, searchParams, sortData, showField, ownerAccountId]) // 选择 const onCheckboxChange = (checked: boolean, item: any) => { let newCheckedFolderList: any[] = JSON.parse(JSON.stringify(checkedFolderList)) if (checked) { // 选中 newCheckedFolderList.push({ ...item, id: item.image_id || item.video_id, material_type: defaultParams.materialType, oss_url: item.preview_url, materialType: 1 }) } else { // 取消 let id = item.image_id || item.video_id newCheckedFolderList = newCheckedFolderList.filter(i => i.id !== id) } setCheckedFolderList(newCheckedFolderList) }; return
{ownerAccountId && ownerAccountId !== -1 ? <> {/* 搜索 */} { setSearchParams(value) }} />
{ let newCheckedFolderList: any[] = JSON.parse(JSON.stringify(checkedFolderList)) const data: any[] = getPageRemoteImageDataList?.data?.records if (e.target.checked) { // 全选 const selectIds = newCheckedFolderList.map(item => item.id) const remainData = data.filter(item => { const id = item.image_id || item.video_id return !selectIds.includes(id) }) const remainDataLength = remainData.length const remainNum = num - newCheckedFolderList.length if (remainNum > remainDataLength) { newCheckedFolderList.push(...remainData.map(i => ({ ...i, material_type: defaultParams.materialType, id: i.image_id || i.video_id, oss_url: i.preview_url, materialType: 1 }))) } else { newCheckedFolderList.push(...remainData.splice(0, remainNum).map(i => ({ ...i, material_type: defaultParams.materialType, id: i.image_id || i.video_id, oss_url: i.preview_url, materialType: 1 }))) } newCheckedFolderList = Array.from(new Set(newCheckedFolderList.map(item => JSON.stringify(item)))).map(item => JSON.parse(item)); } else { // 取消全选 const dataIds = data.map(item => item.image_id || item.video_id) newCheckedFolderList = newCheckedFolderList.filter(i => !dataIds.includes(i.id)) } setCheckedFolderList(newCheckedFolderList) }} disabled={checkedFolderList?.length >= num} indeterminate={indeterminateFolder} checked={checkFolderAll} >全选 已选 {checkedFolderList?.length || 0}/{num} 个素材 {checkedFolderList.length > 0 && setCheckedFolderList([])}>清除所有} {sortData?.sortField && 「排序-{showFieldList.find(item => item.value === sortData.sortField)?.label}-{sortData.sortType ? '正序' : '倒序'}」}
展示指标}> (option?.label as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0 } options={showFieldList.filter(item => showField.includes(item.value) && item.value !== 'description')} value={sortData.sortField} allowClear onChange={(value) => { setSortData({ ...sortData, sortField: value as any }) }} /> setSortData({ ...sortData, sortType: e.target.value })} buttonStyle="solid"> 正序 倒序
} trigger={['click']} title={自定义展示指标与排序} placement="bottomRight" >
{getPageRemoteImageDataList?.data?.records?.length > 0 ? item.id)} style={{ width: '100%' }}>
{getPageRemoteImageDataList?.data?.records.map((item: any) => { let id = defaultParams.materialType === 'image' ? item.image_id : item.video_id const isSelect = checkedFolderList?.map(item => item.id).includes(id) const disabled = checkedFolderList.length >= num && !isSelect return
onCheckboxChange(e.target.checked, item)} />
{defaultParams.materialType === 'video' ?
{(onPlay) => { e.stopPropagation(); e.preventDefault() onPlay() }} src={require('../../../../../public/image/play.png')} alt="" />}
:
{ e.stopPropagation() setPreviewData({ visible: true, url: item.preview_url }) }}> 预览
}
{item.width}*{item.height}
{defaultParams.materialType === 'video' && item.image_duration_millisecond &&
{formatSecondsToTime(Math.floor(item.image_duration_millisecond / 1000))}
}
} onClick={() => !disabled && onCheckboxChange(!isSelect, item)} >
{item?.material_name} {formatBytes(item?.file_size)}
{showField.map(field => { switch (field) { case 'material.create_time': return 创建时间:{item?.create_time} case 'material_data_day.cost': return 消耗:{(item?.cost === null || item?.cost === undefined) ? '--' : item?.cost} case 'material_data_day.order_pv': return 下单次数:{(item?.order_pv === null || item?.order_pv === undefined) ? '--' : item?.order_pv} case 'material_data_day.order_cost': return 下单成本:{(item?.order_cost === null || item?.order_cost === undefined) ? '--' : item?.order_cost} case 'material_data_day.ctr': return 点击率:{(item?.ctr === null || item?.ctr === undefined) ? '--' : (item?.ctr * 100).toFixed(2) + '%'} case 'material_data_day.conversions_rate': return 目标转化率:{(item?.conversions_rate === null || item?.conversions_rate === undefined) ? '--' : (item?.conversions_rate * 100).toFixed(2) + '%'} case 'material_data_day.adgroup_count': return 广告关联数:{(item?.adgroup_count === null || item?.adgroup_count === undefined) ? '--' : item?.adgroup_count} case 'material_data_day.dynamic_creative_count': return 创意关联数:{(item?.dynamic_creative_count === null || item?.dynamic_creative_count === undefined) ? '--' : item?.dynamic_creative_count} default: return null } })} {showField.includes('description') && 备注:{item.description || '--'}}
})}
:
}
{ setQueryParams({ ...queryParams, pageNum: page, pageSize }) }} />
: ownerAccountId === -1 ?
: undefined} {/* 预览 */} {previewData.visible && { setPreviewData({ visible: false }) }, }} />}
} export default React.memo(SelectGroupCloudNew)