123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- import { FC, useCallback, useEffect, useRef, useState } from 'react'
- import style from './index.module.scss'
- import MyTable from '@/components/MyTable'
- import { NUMBER_OF_COLLECTION_COLUMNS } from './constants'
- import { Button, Select, Table } from 'antd'
- import { A1_APIGetCheck } from '@/store/action/A1dataSta'
- import dayjs from 'dayjs'
- import { RelicModal } from '../RelicModal'
- import { exportTempExcel } from '@/utils/exportExcelUtils'
- export const A1Tab1: FC = () => {
- const [prevYearData, setPrevYearData] = useState<any[]>([])
- const [curYearData, setCurYearData] = useState<any[]>([])
- const [addData, setAddData] = useState<any[]>([])
- const [columns, setColumns] = useState<any[]>([])
- const [customData, setCustomData] = useState<any[]>([])
- const [relicModalOpen, setRelicModalOpen] = useState(false)
- const [checkedRelicIds, setCheckedRelicIds] = useState<string[][]>([
- ['12501', '12502', '12503', '12504', '12505'],
- [],
- []
- ])
- const getDetail = async (year: number) => {
- const res = await A1_APIGetCheck(year)
- return res.data && res.data.snap ? (JSON.parse(res.data.snap) as Record<string, number>) : null
- }
- const getYearList = () => {
- const currentYear = dayjs().year()
- const years = []
- for (let i = 0; i < 10; i++) {
- years.push(currentYear - i)
- }
- return years
- }
- const years = useRef(getYearList())
- const [curYear, setCurYear] = useState(years.current[0])
- const initData = useCallback(async () => {
- const curRes = await getDetail(curYear)
- const prevRes = await getDetail(curYear - 1)
- const _addData = {
- id: 1,
- totalIncrease: 0,
- totalDecrease: 0,
- level0Increase: 0,
- level0Decrease: 0,
- level1Increase: 0,
- level1Decrease: 0,
- level2Increase: 0,
- level2Decrease: 0,
- level3Increase: 0,
- level3Decrease: 0,
- level4Increase: 0,
- level4Decrease: 0
- }
- const levels = ['total', 'level0', 'level1', 'level2', 'level3', 'level4']
- levels.forEach(level => {
- if (!curRes || !prevRes) return
- const curProp =
- level === 'total' ? 'total' : `pcs${level.charAt(0).toUpperCase()}${level.slice(1)}`
- const diff = curRes[curProp] - prevRes[curProp]
- if (diff) {
- // @ts-ignore
- _addData[`${level}${diff > 0 ? 'Increase' : 'Decrease'}`] = Math.abs(diff)
- }
- })
- curRes &&
- setCurYearData([
- {
- ...curRes,
- id: 1
- }
- ])
- prevRes &&
- setPrevYearData([
- {
- ...prevRes,
- id: 1
- }
- ])
- setAddData([_addData])
- }, [curYear])
- const handleColumnChange = useCallback(
- (v: any[]) => {
- const flat = v.flat().map(i => [i.title, i.dataIndex])
- if (!flat.length || !curYearData.length) return
- const tempColumns: any[] = []
- const tempData: Record<string, number> = {
- id: 1
- }
- flat.forEach(arr => {
- const keys = Object.keys(curYearData[0])
- tempData[`${arr[1]}Increase`] = 0
- tempData[`${arr[1]}Decrease`] = 0
- if (keys.includes(`${arr[1]}`)) {
- const diff = (curYearData[0]?.[arr[1]] || 0) - (prevYearData[0]?.[arr[1]] || 0)
- tempData[`${arr[1]}${diff > 0 ? 'Increase' : 'Decrease'}`] = Math.abs(diff)
- }
- tempColumns.push({
- title: arr[0],
- children: [
- {
- title: '增',
- dataIndex: arr[1] + 'Increase',
- align: 'center'
- },
- {
- title: '减',
- dataIndex: arr[1] + 'Decrease',
- align: 'center'
- }
- ]
- })
- })
- setColumns(tempColumns)
- setCustomData([tempData])
- },
- [curYearData, prevYearData]
- )
- const handleExport = () => {
- exportTempExcel(
- curYear + '年度核查统计',
- worksheet => {
- const levels = ['total', 'level1', 'level2', 'level3', 'level0', 'level4']
- worksheet.addRow(['', ...NUMBER_OF_COLLECTION_COLUMNS.map(i => i[1])])
- worksheet.addRow(['', ...NUMBER_OF_COLLECTION_COLUMNS.map(i => prevYearData[0][i[2]] || 0)])
- worksheet.addRow(['', ...NUMBER_OF_COLLECTION_COLUMNS.map(i => i[1])])
- worksheet.addRow(['', ...NUMBER_OF_COLLECTION_COLUMNS.map(i => curYearData[0][i[2]] || 0)])
- worksheet.addRow(['', ...NUMBER_OF_COLLECTION_COLUMNS.map(i => i[1])])
- worksheet.addRow([
- '',
- ...levels.map(level => {
- const curProp =
- level === 'total' ? 'total' : `pcs${level.charAt(0).toUpperCase()}${level.slice(1)}`
- const diff = curYearData[0][curProp] - prevYearData[0][curProp]
- return !isNaN(diff) ? diff : 0
- })
- ])
- worksheet.addRow(['', ...columns.map(i => i.title)])
- worksheet.addRow([
- '',
- ...columns.map(
- // @ts-ignore
- i => (customData[`${i.id}Increase`] || 0) - (customData[`${i.id}Decrease`] || 0)
- )
- ])
- worksheet.mergeCells('A1:A2')
- worksheet.mergeCells('A3:A4')
- worksheet.mergeCells('A5:A6')
- worksheet.mergeCells('A7:A8')
- worksheet.getCell('A1').value = '上一年度馆藏数量'
- worksheet.getCell('A3').value = '核查年度馆藏数量'
- worksheet.getCell('A5').value = '馆藏数量增减情况'
- worksheet.getCell('A7').value = '馆藏文物增加类别明细'
- ;[20, 10, 10, 10, 10, 10, 10].forEach((width: number, index: number) => {
- worksheet.getColumn(index + 1).width = width
- })
- },
- [8, Math.max(columns.length, NUMBER_OF_COLLECTION_COLUMNS.length + 1)]
- )
- }
- useEffect(() => {
- initData()
- }, [initData])
- return (
- <>
- <div style={{ textAlign: 'right' }}>
- <Button onClick={handleExport}>导出表格</Button>
- </div>
- <div className={style.header}>
- <h3>上一年度馆藏数量</h3>
- </div>
- <MyTable
- size='small'
- bordered
- pagination={false}
- columnsTemp={NUMBER_OF_COLLECTION_COLUMNS}
- list={prevYearData}
- />
- <div className={style.header}>
- <h3>核查年度馆藏数量</h3>
- <Select
- value={curYear}
- placeholder='请选择核查年度'
- options={years.current.map(year => ({ label: year, value: year }))}
- onChange={v => setCurYear(v)}
- />
- </div>
- <MyTable
- size='small'
- bordered
- pagination={false}
- columnsTemp={NUMBER_OF_COLLECTION_COLUMNS}
- list={curYearData}
- />
- <div className={style.header}>
- <h3>馆藏数量增减情况</h3>
- </div>
- <Table
- size='small'
- rowKey='id'
- columns={[
- {
- title: '藏品总数',
- children: [
- {
- title: '增',
- dataIndex: 'totalIncrease',
- align: 'center'
- },
- {
- title: '减',
- dataIndex: 'totalDecrease',
- align: 'center'
- }
- ]
- },
- {
- title: '一级藏品',
- children: [
- {
- title: '增',
- dataIndex: 'level1Increase',
- align: 'center'
- },
- {
- title: '减',
- dataIndex: 'level1Decrease',
- align: 'center'
- }
- ]
- },
- {
- title: '二级藏品',
- children: [
- {
- title: '增',
- dataIndex: 'level2Increase',
- align: 'center'
- },
- {
- title: '减',
- dataIndex: 'level2Decrease',
- align: 'center'
- }
- ]
- },
- {
- title: '三级藏品',
- children: [
- {
- title: '增',
- dataIndex: 'level3Increase',
- align: 'center'
- },
- {
- title: '减',
- dataIndex: 'level3Decrease',
- align: 'center'
- }
- ]
- },
- {
- title: '未定级',
- children: [
- {
- title: '增',
- dataIndex: 'level0Increase',
- align: 'center'
- },
- {
- title: '减',
- dataIndex: 'level0Decrease',
- align: 'center'
- }
- ]
- },
- {
- title: '一般文物',
- children: [
- {
- title: '增',
- dataIndex: 'level4Increase',
- align: 'center'
- },
- {
- title: '减',
- dataIndex: 'level4Decrease',
- align: 'center'
- }
- ]
- }
- ]}
- dataSource={addData}
- bordered
- pagination={false}
- />
- <div className={style.header}>
- <h3>馆藏文物增加类别明细</h3>
- <Button type='primary' onClick={() => setRelicModalOpen(true)}>
- 设置统计分类
- </Button>
- </div>
- {columns.length ? (
- <Table
- rowKey='id'
- size='small'
- columns={columns}
- dataSource={customData}
- bordered
- pagination={false}
- />
- ) : undefined}
- <RelicModal
- checkedIds={checkedRelicIds}
- isModalOpen={relicModalOpen}
- setIsModalOpen={setRelicModalOpen}
- onChange={setCheckedRelicIds}
- onColumnChange={handleColumnChange}
- />
- </>
- )
- }
|