You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
salary-management-oneself/src/pages/calcTable/calcFixedTotal.tsx

64 lines
1.9 KiB
TypeScript

/*
* Author: 黎永顺
* name: 薪资核算-底部合计行
* Description:
* Date: 2023/9/18
*/
import React, { FunctionComponent, useCallback, useEffect, useMemo, useState } from "react";
import { Spin, Table, Typography } from "antd";
import { ColumnType } from "antd/lib/table";
import API from "@/api";
const { Text } = Typography;
interface OwnProps {
columns: ColumnType<any>[];
dataSourceUrl: string;
payload: any;
}
type Props = OwnProps;
const calcFixedTotal: FunctionComponent<Props> = (props) => {
const [sumRow, setSumRow] = useState<Partial<{}>>({});//薪资核算总计行数据
const [loading, setLoading] = useState<boolean>(false);
const flattenFn = (source: ColumnType<any>[]) => {
let res: ColumnType<any>[] = [];
source.forEach((el: any) => {
_.isEmpty(el.children) && res.push(el);
el.children && res.push(...flattenFn(el.children));
});
return res;
};
const columns = useMemo(() => {
return !_.isEmpty(props.columns) ? flattenFn(props.columns) : [];
}, [props.columns]);
const dataSourceUrl = useCallback((payload) => {
return API.CalculateService.getAcctResultsum(props.dataSourceUrl, payload);
}, [props.dataSourceUrl]);
useEffect(() => {
if (!_.isEmpty(props.payload)) {
setLoading(true);
dataSourceUrl(props.payload).then(({ data }) => {
setLoading(false);
const { data: result, status } = data;
if (status) setSumRow(result.sumRow || {});
});
}
}, [props.payload]);
return (<>
{
_.map(columns, (item: any, index) => {
return <Table.Summary.Cell index={index + 1} key={index + 1} align="center">
{
loading ? <Spin spinning={loading} size="small"></Spin> :
<Text type="danger">{sumRow[item.dataIndex] || "-"}</Text>
}
</Table.Summary.Cell>;
})
}
</>);
};
export default calcFixedTotal;