import { Card, Input, Radio, Select, Space, Spin, Tag, TimePicker, Tooltip, message } from "antd"; import React, { useCallback, useEffect, useState } from "react"; import { ColumnHeightOutlined, ColumnWidthOutlined, EyeInvisibleOutlined, EyeOutlined, RedoOutlined } from "@ant-design/icons"; import useEcharts from '@/Hook/useEcharts' import { useModel } from 'umi' import { ListHourProps, ListType } from '@/services/adMonitor/adMonitor' import '../../adMonitor/adMonitorList/table.less' import moment from "moment"; import TableData from "@/pages/launchSystemNew/components/TableData"; import RuleAccountLog from "@/components/EarlyWarning/ruleAccountLog"; import { LineField } from "@/pages/adMonitor/adMonitorList/config"; import FilterQuery from "@/pages/adMonitor/adMonitorList/components/FilterQuery"; import Details from "./Details"; import { columnsMonitor } from "./tableMonitorConfig"; import { qiliangpaihanghour } from "./config"; import { syncBatchApi } from "@/services/launchAdq/adqv3"; import { useAjax } from "@/Hook/useAjax"; interface newListType extends ListType { totalTimeUnit: 'total' | 'minute' | 'hour' | 'day', planTimeUnit: 'minute' | 'hour' | 'day' } /** * 今日起量监控 * @param props * @returns */ function Monitor(props: { onChange: () => void }) { const { onChange } = props const { getCostTrendV3List, getCostTopV3List, getListForHourV3, getAdqAccountList } = useModel('useAdMonitor.useMonitor') const { getPicherList } = useModel('useOperating.useWxGroupList') // 变量开始 const [queryForm, setQueryForm] = useState({ totalTimeUnit: 'day', planTimeUnit: 'hour', sysUserId: JSON.parse(sessionStorage.getItem('SYSUSERID') || '[]'), pageNum: 1, pageSize: 20 }) // 搜索变量//startTime: moment().format('YYYY-MM-DD'), endTime: moment().format('YYYY-MM-DD'), const { BarMonitor, LineMonitor } = useEcharts() const [barDis, setBarDis] = useState([]) const [lineDis, setLineDis] = useState([]) const [lineTitle, setLineTitle] = useState('广告总消耗趋势') const [px, setPx] = useState(false)//设置顶部图形的排列方式 const [visible, setVisible] = useState(false) // 详情弹窗控制 const [aId, setAId] = useState() const [showEacharts, setShowEacharts] = useState(true) const [queryForHour, setQueryForHour] = useState({ pageNum: 1, pageSize: 20 }) const [filterQuery, setFilterQuery] = useState({}) const [logVisible, setLogVisible] = useState(false) const [adgroupId, setAdgroupId] = useState('') const [adgroupName, setAdgroupName] = useState('') const [accountIdRule, setAccountIdRule] = useState('') const [trendColumns, setTrendColumns] = useState(['cost']) const { totalTimeUnit, planTimeUnit, adgroup, accountId, sysUserId, groupAccountIds } = queryForm const configName = '起量广告排行明细3.0' const { getGroupList, groupListInit } = useModel('useLaunchAdq.useAdAuthorize') const syncBatch = useAjax((params) => syncBatchApi(params)) useEffect(() => { groupListInit() }, []) useEffect(() => { getList() }, [queryForHour, filterQuery, queryForm?.sysUserId, queryForm?.accountId, queryForm?.adgroup, queryForm?.groupAccountIds]) const getList = () => { let message = localStorage.getItem(`myAdMonitorConfig1.0.1_${configName}`) if (message) { message = JSON.parse(message) } let isAccountId = true let isAdgroupId = true let isAdgroupName = true let columns: string[] = [] if (message && Array.isArray(message)) { message.forEach((item: { serverIndex: any; dataIndex: string; }) => { if (!['event'].includes(item.dataIndex)) { if (item.dataIndex === 'account_id') { isAccountId = false } else if (item.dataIndex === 'adgroup_id') { isAdgroupId = false } else if (item.dataIndex === 'adgroup_name') { isAdgroupName = false } columns.push(item?.serverIndex || 'adgroup_data.' + item.dataIndex) } }) } else { qiliangpaihanghour.forEach((item: any) => { item?.data?.forEach((d: { default: any, serverIndex: string, dataIndex: string }) => { if (d.default && !['event'].includes(d.dataIndex)) { if (d.dataIndex === 'account_id') { isAccountId = false } else if (d.dataIndex === 'adgroup_id') { isAdgroupId = false } else if (item.dataIndex === 'adgroup_name') { isAdgroupName = false } columns.push(d?.serverIndex || 'adgroup_data.' + d.dataIndex) } }) }) } if (isAccountId) { columns.push('adgroup_data.account_id') } if (isAdgroupId) { columns.push('adgroup_data.adgroup_id') } if (isAdgroupName) { columns.push('adgroup_data.adgroup_name') } let params = { ...queryForHour, ...filterQuery } if (queryForm?.sysUserId) { params.sysUserIds = queryForm?.sysUserId } if (queryForm?.accountId && queryForm?.accountId?.length > 0) { params.accountIdStr = queryForm?.accountId.toString() } if (queryForm?.adgroup) { params.adgroupIdStr = queryForm?.adgroup } if (queryForm?.groupAccountIds) { params.groupAccountIds = queryForm?.groupAccountIds } params.columns = columns getListForHourV3.run(params) } // 获取投手 useEffect(() => { !getPicherList.data && getPicherList.run() }, []) // 获取广告账号 useEffect(() => { !getAdqAccountList.data && getAdqAccountList.run() }, []) // // 获取排行数据,柱图 useEffect(() => { getPlanCostList() }, [totalTimeUnit, accountId, sysUserId, groupAccountIds]) // 获取今日计划总消耗图谱,折线 useEffect(() => { getTootalCostList() }, [planTimeUnit, adgroup, accountId, sysUserId, groupAccountIds, trendColumns]) /** 获取折线图 */ const getTootalCostList = useCallback(async () => { let { totalTimeUnit, planTimeUnit, pageNum, pageSize, adgroup, sysUserId, accountId, ...newQueryForm } = queryForm let params = adgroup ? { ...newQueryForm, adgroupIdStr: adgroup } : newQueryForm let res = await getCostTrendV3List.run({ ...params, timeUnit: planTimeUnit, sysUserIds: sysUserId, accountIdStr: accountId?.join(), trendColumns }) let data = trendColumns.map((field) => { let value: any = {} res?.data?.forEach((item: any, index: number) => { if (index === 0) value.legendName = LineField[field]; value[item?.trend_unit] = item?.[field] }); return value }) setLineDis(() => data) setLineTitle(() => `广告总${LineField[trendColumns[0]]}趋势`) }, [queryForm, lineDis, trendColumns]) /** 获取柱状图 */ const getPlanCostList = useCallback(async () => { let { totalTimeUnit, planTimeUnit, pageNum, pageSize, sysUserId, accountId, ...newQueryForm } = queryForm let { adgroup, ...planQueryFrom } = newQueryForm let res = await getCostTopV3List.run({ ...planQueryFrom, timeUnit: totalTimeUnit, sysUserIds: sysUserId, accountId: accountId?.join(), topN: 10 }) let data = res?.data?.map((item: { adgroupId: number, cost: number, adgroupName: string, accountId: number }) => { return { name: item.adgroupId.toString(), value: item.cost, adName: item.adgroupName, accountId: item.accountId } }) data = data?.sort((a: any, b: any) => { var value1 = a['value']; var value2 = b['value']; return value2 - value1; }) setBarDis(() => data) }, [queryForm, barDis]) // 详情 const details = (data: any) => { setAId(data) setVisible(true) } // 计划详情 const planDetail = (data: any) => { sessionStorage.setItem('ADIDORNAME', JSON.stringify(data)) onChange && onChange() } //全部接口刷新 const refresh = () => { getCostTrendV3List.refresh() getCostTopV3List.refresh() getListForHourV3.refresh() } // 接口自动刷新10分钟一次 useEffect(() => { let time = setInterval(() => { refresh() }, 1000 * 60 * 10) return () => { clearInterval(time) } }, []) //图形排列样式改变重新获取数据刷新图形 const set = useCallback((b) => { setPx(b) getCostTrendV3List.refresh() getCostTopV3List.refresh() }, [getCostTopV3List, getCostTrendV3List, trendColumns]) // 处理折线图数据 const timePickerHandle = async (values: any, formatString: [string, string]) => { let res = await getCostTrendV3List.data let data = trendColumns.map((field) => { let value: any = {} res?.data?.forEach((item: any, index: number) => { if (index === 0) value.legendName = LineField[field]; value[item?.trend_unit] = item?.[field] }); return value }) if (values) { let date = moment().format('YYYY-MM-DD') let strTime = formatString[0] let endTime = formatString[1] let dateTimeStr = `${date} ${strTime}:00` let dateTimeEnd = `${date} ${endTime}:00` let newData: any[] = data.map(item => { let { legendName, ...otherData } = item let newItem: any = { legendName } for (const key in otherData) { if (Object.prototype.hasOwnProperty.call(otherData, key)) { const value = otherData[key]; if (moment(dateTimeStr) <= moment(key) && moment(key) <= moment(dateTimeEnd)) { newItem[key] = value } } } return newItem }) setLineDis(() => newData) } else { setLineDis(() => data) } } const log = (value: any) => { setAccountIdRule(value.account_id) setAdgroupId(value.adgroup_id) setAdgroupName(value.adgroup_name) setLogVisible(true) } const sync = (data: any) => { const hide = message.loading(`${data?.adgroup_name}广告同步中`, 0, () => { message.success('修改成功'); }); let accountAdgroupMaps = [data.account_id + ',' + data.adgroup_id] syncBatch.run({ accountAdgroupMaps }).then(res => { hide() getListForHourV3.refresh() message.success('同步完成!') }).catch(() => hide()) } return
{ setQueryForm({ ...queryForm, accountId: e.target.value ? e.target.value?.split(/[,,\s\n]+/) : undefined }) }} allowClear /> { setQueryForm({ ...queryForm, adgroup: e.target.value }) }} allowClear /> setShowEacharts(!showEacharts)}>{showEacharts ? <> 隐藏 : <> 显示} 刷新
{showEacharts && {px ? { set(false) }}>左右排列 : { set(true) }} >上下排列 }
刷新时间:{getCostTopV3List?.data?.reqTime} { setQueryForm({ ...queryForm, totalTimeUnit: e.target.value }) }}> 小时 5min
{getCostTopV3List?.loading ? : { console.log(value, accountId); setQueryForm({ ...queryForm, adgroup: value }) }} planID={queryForm?.adgroup} />}
刷新时间:{getCostTrendV3List?.data?.reqTime} { setQueryForm({ ...queryForm, planTimeUnit: e.target.value }) }}> 小时 5min {queryForm.planTimeUnit === 'minute' && }
{getCostTrendV3List?.loading ? : 1 ? undefined : lineTitle} />}
}
{ setQueryForm({ ...queryForm, adgroup: value }); }, log, sync)} dataSource={getListForHourV3?.data?.data?.records} loading={getListForHourV3?.loading} ajax={getListForHourV3} leftChild={ { setFilterQuery(data) }} /> } myKey={'adgroup_id'} fixed={{ left: 0, right: 2 }} total={getListForHourV3?.data?.data?.total} onChange={(props: any) => { let { sortData, pagination } = props let { current, pageSize } = pagination let newQueryForm = JSON.parse(JSON.stringify(queryForHour)) newQueryForm.pageNum = current newQueryForm.pageSize = pageSize if (sortData && JSON.stringify('sortData') !== '{}') { let { field, order } = sortData // descend 降序 大到小 ascend 升序 小到大 if (order) { newQueryForm.sortColumn = field newQueryForm.sortAsc = order === 'ascend' } else { Object.keys(newQueryForm).forEach(key => { if (key === 'sortColumn' || key === 'sortAsc') { delete newQueryForm[key] } }) } } else { Object.keys(newQueryForm).forEach(key => { if (key === 'sortField' || key === 'sort') { delete newQueryForm[key] } }) } setQueryForHour({ ...newQueryForm }) }} page={queryForHour.pageNum} pageSize={queryForHour.pageSize} scroll={{ y: 750 }} config={qiliangpaihanghour} configName={configName} />
{visible &&
{ setVisible(false) }} data={aId} />} {logVisible && setLogVisible(false)} />} } export default React.memo(Monitor)