import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import styles from './index.module.scss' import { useDispatch, useSelector } from 'react-redux' import { B4FromDataType } from './data' import { B4_APIgetlist, B4_APIgetlistAll } from '@/store/action/B4JsonPush' import { RootState } from '@/store' import { B4tableType } from '@/types' import { B1options2, B1options2Obj } from '../B1Plan/data' import { Button, Cascader, Input, Select, Table, Tooltip } from 'antd' import { QuestionCircleOutlined } from '@ant-design/icons' import { MessageFu } from '@/utils/message' import dayjs from 'dayjs' import ExportJsonExcel from 'js-export-excel' import { mapDataAll1 } from '../C1User/AddUser/city' function B4JsonPush() { const dispatch = useDispatch() // 筛选和分页 const [tableSelect, setTableSelect] = useState({ siteArr: undefined, province: '', city: '', region: '', pmUser: '', jsonStatus: '', linkStatus: '', searchKey: '', pageSize: 10, pageNum: 1 }) const tableSelectRef = useRef({} as B4FromDataType) useEffect(() => { tableSelectRef.current = { ...tableSelect } }, [tableSelect]) // 点击搜索的 时间戳 const [timeKey, setTimeKey] = useState(-1) // 发送接口的函数 const getListFu = useCallback(() => { const objTemp: any = {} if (tableSelectRef.current.siteArr) { const temp = tableSelectRef.current.siteArr objTemp.province = temp[0] || '' objTemp.city = temp[1] || '' objTemp.region = temp[2] || '' } const obj = { ...tableSelectRef.current, ...objTemp } dispatch(B4_APIgetlist(obj)) }, [dispatch]) useEffect(() => { getListFu() }, [getListFu, timeKey]) // 输入框的改变 const txtChangeFu = useCallback( (txt: string, key: 'pmUser' | 'searchKey') => { setTableSelect({ ...tableSelect, [key]: txt }) }, [tableSelect] ) // 点击搜索 const clickSearch = useCallback(() => { setTableSelect({ ...tableSelect, pageNum: 1 }) setTimeout(() => { setTimeKey(Date.now()) }, 50) }, [tableSelect]) // 点击重置 const [inputKey, setInputKey] = useState(1) const resetSelectFu = useCallback(() => { // 把2个输入框和时间选择器清空 setInputKey(Date.now()) setTableSelect({ siteArr: undefined, province: '', city: '', region: '', pmUser: '', jsonStatus: '', linkStatus: '', searchKey: '', pageSize: 10, pageNum: 1 }) setTimeout(() => { setTimeKey(Date.now()) }, 50) }, []) // 从仓库获取列表 const B4TableList = useSelector((state: RootState) => state.B4JsonPush.B4TableList) // 页码变化 const paginationChange = useCallback( () => (pageNum: number, pageSize: number) => { setTableSelect({ ...tableSelect, pageNum, pageSize }) setTimeout(() => { setTimeKey(Date.now()) }, 50) }, [tableSelect] ) const columns = useMemo(() => { return [ { title: '机房编码', render: (item: B4tableType) => item.roomNum || '(空)' }, { title: '站址地区', render: (item: B4tableType) => !item.province && !item.city && !item.region ? '(空)' : `${item.province}${item.city ? '-' + item.city : ''}${ item.region ? '-' + item.region : '' }` }, { title: '项目经理', render: (item: B4tableType) => { if (item.creatorId === 1) return '管理员' else { return item.pmName || '(空)' } } }, { title: '场景码', render: (item: B4tableType) => item.sceneCode || '(空)' }, { title: '链接推送状态', render: (item: B4tableType) => ( <> {Reflect.get(B1options2Obj, item.pushLinkStatus) || '(空)'} ) }, { title: '状态更新时间', render: (item: B4tableType) => item.pushLinkTime || '(空)' }, { title: 'Json推送状态', render: (item: B4tableType) => ( <> {Reflect.get(B1options2Obj, item.jsonStatus) || '(空)'} ) }, { title: '状态更新时间', render: (item: B4tableType) => item.jsonUpdateTime || '(空)' } ] }, []) // 点击导出 const deriveFu = useCallback(async () => { if (B4TableList.total > 30000) return MessageFu.warning('只支持导出最多30000条数据。请增加筛选条件,并重新尝试') if (B4TableList.list.length === 0) return MessageFu.warning('当前搜索条件没有数据!') const name = 'Json推送' + dayjs(new Date()).format('YYYY-MM-DD HH:mm') const objTemp: any = {} if (tableSelectRef.current.siteArr) { const temp = tableSelectRef.current.siteArr objTemp.province = temp[0] || '' objTemp.city = temp[1] || '' objTemp.region = temp[2] || '' } const res = await B4_APIgetlistAll({ ...tableSelect, ...objTemp, pageNum: 1, pageSize: 99999 }) if (res.code === 0) { if (res.data.records.length <= 0) return MessageFu.warning('当前搜索条件没有数据!') const option = { fileName: name, datas: [ { sheetData: res.data.records.map((v: B4tableType) => ({ roomNum: v.roomNum || '(空)', myCity: !v.province && !v.city && !v.region ? '(空)' : `${v.province}${v.city ? '-' + v.city : ''}${v.region ? '-' + v.region : ''}`, pmName: v.creatorId === 1 ? '管理员' : v.pmName || '(空)', sceneCode: v.sceneCode || '(空)', pushLinkStatus: Reflect.get(B1options2Obj, v.pushLinkStatus) || '(空)', pushLinkDesc: v.pushLinkDesc || '(空)', pushLinkTime: v.pushLinkTime || '(空)', jsonStatus: Reflect.get(B1options2Obj, v.jsonStatus) || '(空)', jsonDesc: v.jsonDesc || '(空)', jsonUpdateTime: v.jsonUpdateTime || '(空)' })), sheetName: name, sheetFilter: [ 'roomNum', 'myCity', 'pmName', 'sceneCode', 'pushLinkStatus', 'pushLinkDesc', 'pushLinkTime', 'jsonStatus', 'jsonDesc', 'jsonUpdateTime' ], sheetHeader: [ '机房编码', '站址地区', '项目经理', '场景码', '链接推送状态', '链接推送状态描述', '状态更新时间', 'Json推送状态', 'Json推送状态描述', '状态更新时间' ], columnWidths: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10] } ] } const toExcel = new ExportJsonExcel(option) //new toExcel.saveExcel() //保存 } }, [B4TableList.list.length, B4TableList.total, tableSelect]) return (
Json推送
{/*顶部筛选 */}
搜索项: txtChangeFu(e.target.value, 'searchKey')} />
站址地区: setTableSelect({ ...tableSelect, siteArr: e as string[] })} />
项目经理: txtChangeFu(e.target.value, 'pmUser')} />
链接推送状态: setTableSelect({ ...tableSelect, jsonStatus: e })} options={B1options2} />
{/* 表格主体 */}
{/* 右下角的列表数量 */}
{B4TableList.total} 条数据
) } const MemoB4JsonPush = React.memo(B4JsonPush) export default MemoB4JsonPush