index.tsx 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. import { FC, useCallback, useEffect, useRef, useState } from 'react'
  2. import style from './index.module.scss'
  3. import MyTable from '@/components/MyTable'
  4. import { NUMBER_OF_COLLECTION_COLUMNS } from './constants'
  5. import { Button, Select, Table } from 'antd'
  6. import { A1_APIGetCheck } from '@/store/action/A1dataSta'
  7. import dayjs from 'dayjs'
  8. import { RelicModal } from '../RelicModal'
  9. import { exportTempExcel } from '@/utils/exportExcelUtils'
  10. export const A1Tab1: FC = () => {
  11. const [prevYearData, setPrevYearData] = useState<any[]>([])
  12. const [curYearData, setCurYearData] = useState<any[]>([])
  13. const [addData, setAddData] = useState<any[]>([])
  14. const [columns, setColumns] = useState<any[]>([])
  15. const [customData, setCustomData] = useState<any[]>([])
  16. const [relicModalOpen, setRelicModalOpen] = useState(false)
  17. const [checkedRelicIds, setCheckedRelicIds] = useState<string[][]>([
  18. ['12501', '12502', '12503', '12504', '12505'],
  19. [],
  20. []
  21. ])
  22. const getDetail = async (year: number) => {
  23. const res = await A1_APIGetCheck(year)
  24. return res.data && res.data.snap ? (JSON.parse(res.data.snap) as Record<string, number>) : null
  25. }
  26. const getYearList = () => {
  27. const currentYear = dayjs().year()
  28. const years = []
  29. for (let i = 0; i < 10; i++) {
  30. years.push(currentYear - i)
  31. }
  32. return years
  33. }
  34. const years = useRef(getYearList())
  35. const [curYear, setCurYear] = useState(years.current[0])
  36. const initData = useCallback(async () => {
  37. const curRes = await getDetail(curYear)
  38. const prevRes = await getDetail(curYear - 1)
  39. const _addData = {
  40. id: 1,
  41. totalIncrease: 0,
  42. totalDecrease: 0,
  43. level0Increase: 0,
  44. level0Decrease: 0,
  45. level1Increase: 0,
  46. level1Decrease: 0,
  47. level2Increase: 0,
  48. level2Decrease: 0,
  49. level3Increase: 0,
  50. level3Decrease: 0,
  51. level4Increase: 0,
  52. level4Decrease: 0
  53. }
  54. const levels = ['total', 'level0', 'level1', 'level2', 'level3', 'level4']
  55. levels.forEach(level => {
  56. if (!curRes || !prevRes) return
  57. const curProp =
  58. level === 'total' ? 'total' : `pcs${level.charAt(0).toUpperCase()}${level.slice(1)}`
  59. const diff = curRes[curProp] - prevRes[curProp]
  60. if (diff) {
  61. // @ts-ignore
  62. _addData[`${level}${diff > 0 ? 'Increase' : 'Decrease'}`] = Math.abs(diff)
  63. }
  64. })
  65. curRes &&
  66. setCurYearData([
  67. {
  68. ...curRes,
  69. id: 1
  70. }
  71. ])
  72. prevRes &&
  73. setPrevYearData([
  74. {
  75. ...prevRes,
  76. id: 1
  77. }
  78. ])
  79. setAddData([_addData])
  80. }, [curYear])
  81. const handleColumnChange = useCallback(
  82. (v: any[]) => {
  83. const flat = v.flat().map(i => [i.title, i.dataIndex])
  84. if (!flat.length || !curYearData.length) return
  85. const tempColumns: any[] = []
  86. const tempData: Record<string, number> = {
  87. id: 1
  88. }
  89. flat.forEach(arr => {
  90. const keys = Object.keys(curYearData[0])
  91. tempData[`${arr[1]}Increase`] = 0
  92. tempData[`${arr[1]}Decrease`] = 0
  93. if (keys.includes(`${arr[1]}`)) {
  94. const diff = (curYearData[0]?.[arr[1]] || 0) - (prevYearData[0]?.[arr[1]] || 0)
  95. tempData[`${arr[1]}${diff > 0 ? 'Increase' : 'Decrease'}`] = Math.abs(diff)
  96. }
  97. tempColumns.push({
  98. title: arr[0],
  99. children: [
  100. {
  101. title: '增',
  102. dataIndex: arr[1] + 'Increase',
  103. align: 'center'
  104. },
  105. {
  106. title: '减',
  107. dataIndex: arr[1] + 'Decrease',
  108. align: 'center'
  109. }
  110. ]
  111. })
  112. })
  113. setColumns(tempColumns)
  114. setCustomData([tempData])
  115. },
  116. [curYearData, prevYearData]
  117. )
  118. const handleExport = () => {
  119. exportTempExcel(
  120. curYear + '年度核查统计',
  121. worksheet => {
  122. const levels = ['total', 'level1', 'level2', 'level3', 'level0', 'level4']
  123. worksheet.addRow(['', ...NUMBER_OF_COLLECTION_COLUMNS.map(i => i[1])])
  124. worksheet.addRow(['', ...NUMBER_OF_COLLECTION_COLUMNS.map(i => prevYearData[0][i[2]] || 0)])
  125. worksheet.addRow(['', ...NUMBER_OF_COLLECTION_COLUMNS.map(i => i[1])])
  126. worksheet.addRow(['', ...NUMBER_OF_COLLECTION_COLUMNS.map(i => curYearData[0][i[2]] || 0)])
  127. worksheet.addRow(['', ...NUMBER_OF_COLLECTION_COLUMNS.map(i => i[1])])
  128. worksheet.addRow([
  129. '',
  130. ...levels.map(level => {
  131. const curProp =
  132. level === 'total' ? 'total' : `pcs${level.charAt(0).toUpperCase()}${level.slice(1)}`
  133. const diff = curYearData[0][curProp] - prevYearData[0][curProp]
  134. return !isNaN(diff) ? diff : 0
  135. })
  136. ])
  137. worksheet.addRow(['', ...columns.map(i => i.title)])
  138. worksheet.addRow([
  139. '',
  140. ...columns.map(
  141. // @ts-ignore
  142. i => (customData[`${i.id}Increase`] || 0) - (customData[`${i.id}Decrease`] || 0)
  143. )
  144. ])
  145. worksheet.mergeCells('A1:A2')
  146. worksheet.mergeCells('A3:A4')
  147. worksheet.mergeCells('A5:A6')
  148. worksheet.mergeCells('A7:A8')
  149. worksheet.getCell('A1').value = '上一年度馆藏数量'
  150. worksheet.getCell('A3').value = '核查年度馆藏数量'
  151. worksheet.getCell('A5').value = '馆藏数量增减情况'
  152. worksheet.getCell('A7').value = '馆藏文物增加类别明细'
  153. ;[20, 10, 10, 10, 10, 10, 10].forEach((width: number, index: number) => {
  154. worksheet.getColumn(index + 1).width = width
  155. })
  156. },
  157. [8, Math.max(columns.length, NUMBER_OF_COLLECTION_COLUMNS.length + 1)]
  158. )
  159. }
  160. useEffect(() => {
  161. initData()
  162. }, [initData])
  163. return (
  164. <>
  165. <div style={{ textAlign: 'right' }}>
  166. <Button onClick={handleExport}>导出表格</Button>
  167. </div>
  168. <div className={style.header}>
  169. <h3>上一年度馆藏数量</h3>
  170. </div>
  171. <MyTable
  172. size='small'
  173. bordered
  174. pagination={false}
  175. columnsTemp={NUMBER_OF_COLLECTION_COLUMNS}
  176. list={prevYearData}
  177. />
  178. <div className={style.header}>
  179. <h3>核查年度馆藏数量</h3>
  180. <Select
  181. value={curYear}
  182. placeholder='请选择核查年度'
  183. options={years.current.map(year => ({ label: year, value: year }))}
  184. onChange={v => setCurYear(v)}
  185. />
  186. </div>
  187. <MyTable
  188. size='small'
  189. bordered
  190. pagination={false}
  191. columnsTemp={NUMBER_OF_COLLECTION_COLUMNS}
  192. list={curYearData}
  193. />
  194. <div className={style.header}>
  195. <h3>馆藏数量增减情况</h3>
  196. </div>
  197. <Table
  198. size='small'
  199. rowKey='id'
  200. columns={[
  201. {
  202. title: '藏品总数',
  203. children: [
  204. {
  205. title: '增',
  206. dataIndex: 'totalIncrease',
  207. align: 'center'
  208. },
  209. {
  210. title: '减',
  211. dataIndex: 'totalDecrease',
  212. align: 'center'
  213. }
  214. ]
  215. },
  216. {
  217. title: '一级藏品',
  218. children: [
  219. {
  220. title: '增',
  221. dataIndex: 'level1Increase',
  222. align: 'center'
  223. },
  224. {
  225. title: '减',
  226. dataIndex: 'level1Decrease',
  227. align: 'center'
  228. }
  229. ]
  230. },
  231. {
  232. title: '二级藏品',
  233. children: [
  234. {
  235. title: '增',
  236. dataIndex: 'level2Increase',
  237. align: 'center'
  238. },
  239. {
  240. title: '减',
  241. dataIndex: 'level2Decrease',
  242. align: 'center'
  243. }
  244. ]
  245. },
  246. {
  247. title: '三级藏品',
  248. children: [
  249. {
  250. title: '增',
  251. dataIndex: 'level3Increase',
  252. align: 'center'
  253. },
  254. {
  255. title: '减',
  256. dataIndex: 'level3Decrease',
  257. align: 'center'
  258. }
  259. ]
  260. },
  261. {
  262. title: '未定级',
  263. children: [
  264. {
  265. title: '增',
  266. dataIndex: 'level0Increase',
  267. align: 'center'
  268. },
  269. {
  270. title: '减',
  271. dataIndex: 'level0Decrease',
  272. align: 'center'
  273. }
  274. ]
  275. },
  276. {
  277. title: '一般文物',
  278. children: [
  279. {
  280. title: '增',
  281. dataIndex: 'level4Increase',
  282. align: 'center'
  283. },
  284. {
  285. title: '减',
  286. dataIndex: 'level4Decrease',
  287. align: 'center'
  288. }
  289. ]
  290. }
  291. ]}
  292. dataSource={addData}
  293. bordered
  294. pagination={false}
  295. />
  296. <div className={style.header}>
  297. <h3>馆藏文物增加类别明细</h3>
  298. <Button type='primary' onClick={() => setRelicModalOpen(true)}>
  299. 设置统计分类
  300. </Button>
  301. </div>
  302. {columns.length ? (
  303. <Table
  304. rowKey='id'
  305. size='small'
  306. columns={columns}
  307. dataSource={customData}
  308. bordered
  309. pagination={false}
  310. />
  311. ) : undefined}
  312. <RelicModal
  313. checkedIds={checkedRelicIds}
  314. isModalOpen={relicModalOpen}
  315. setIsModalOpen={setRelicModalOpen}
  316. onChange={setCheckedRelicIds}
  317. onColumnChange={handleColumnChange}
  318. />
  319. </>
  320. )
  321. }