index.tsx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /*
  2. * @Author: code4eat awesomedema@gmail.com
  3. * @Date: 2023-01-04 14:12:31
  4. * @LastEditors: code4eat awesomedema@gmail.com
  5. * @LastEditTime: 2023-05-25 14:59:18
  6. * @FilePath: /BudgetManaSystem/src/pages/budgetMana/oneBatch/index.tsx
  7. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  8. */
  9. import BMSPagecontainer from '@/components/BMSPageContainer'
  10. import { BMSTable } from '@/components/BMSTable';
  11. import { getComputeDate } from '@/pages/Home/service';
  12. import { ActionType, ProColumns } from '@ant-design/pro-components';
  13. import { Space, Dropdown, MenuProps } from 'antd';
  14. import { useEffect, useRef, useState } from 'react';
  15. import { getData, getRedirReportData } from './service';
  16. import './style.less';
  17. import { useParams } from '@umijs/max';
  18. import { DownOutlined } from '@ant-design/icons';
  19. import { useLocation } from '@umijs/max';
  20. // const {search} = locatio
  21. const ReportTemplate = () => {
  22. const { reportCode: urlReportCode } = useParams();
  23. // const location = useLocation();
  24. // console.log({location});
  25. // const menuName = location.pathname.replace('/', '');
  26. const [tableColumn, set_tableColumn] = useState<ProColumns[] | any[]>([]);
  27. const [currentComputeDate, set_currentComputeDate] = useState<string | undefined>();
  28. const [breadCrumbList, set_breadCrumbList] = useState<any[]>([]);
  29. const [tableDataFilterParams, set_tableDataFilterParams] = useState<any | undefined>({ reportCode: urlReportCode });
  30. const tableRef = useRef<ActionType>();
  31. const [tableH, set_tableH] = useState(0);
  32. const [step, set_step] = useState(0);
  33. const reportJumphandle = (reportData: any) => {
  34. let parameter: { [key: string]: any } = {};
  35. const { redirectParameter = undefined } = reportData;
  36. const _step = step + 1;
  37. if (redirectParameter) {
  38. const tempArr = redirectParameter.split('|');
  39. tempArr.forEach((element: string) => {
  40. parameter[`${element}`] = reportData[`${element}`]
  41. });
  42. }
  43. set_breadCrumbList(
  44. [...breadCrumbList,
  45. {
  46. index: _step,
  47. name: reportData[`report_name`]||reportData[`redirectReportName`],
  48. params: {
  49. reportCode: reportData.redirectReportCode,
  50. parameter:{
  51. compute_date:currentComputeDate,
  52. ...parameter
  53. }
  54. }
  55. }
  56. ]
  57. );
  58. set_step(_step);
  59. set_tableDataFilterParams({ ...tableDataFilterParams, reportCode: reportData.redirectReportCode, parameter:{
  60. compute_date:currentComputeDate,
  61. ...parameter
  62. } })
  63. }
  64. const getTableData = async (params: any, sort: any, filter: any) => {
  65. const { reportCode, parameter } = params;
  66. let resp: any = undefined;
  67. if (step != 0) {
  68. //报表跳转
  69. resp = await getRedirReportData(
  70. reportCode,
  71. parameter
  72. );
  73. }
  74. if (step == 0) {
  75. //首次获取表格数据
  76. resp = await getData(
  77. reportCode,
  78. parameter
  79. );
  80. }
  81. if (resp) {
  82. const { title, data: assignmentData } = resp;
  83. const columns = title.map((item: any, index: number) => {
  84. return {
  85. title: item.name,
  86. dataIndex: `${item.columnName}`,
  87. key: `${item.columnName}`,
  88. width: 100,
  89. hideInTable:item.hide,
  90. render: (_: any, record: any) => {
  91. if(item.redirect){
  92. if (item.redirectData&&item.redirectData.length > 1) {
  93. const items:MenuProps['items'] = [
  94. ...(item.redirectData.map((a:any,index:number)=>({
  95. key:index,
  96. label: (
  97. <a onClick={() => reportJumphandle({ ...item,...record, ...a })}>
  98. {a.redirectReportName}
  99. </a>
  100. ),
  101. })))
  102. ];
  103. return <Dropdown menu={{ items }}>
  104. <a onClick={(e) => e.preventDefault()}>
  105. <Space>
  106. {_}
  107. <DownOutlined />
  108. </Space>
  109. </a>
  110. </Dropdown>
  111. }else {
  112. return <a className='active' onClick={() => reportJumphandle({ ...item.redirectData[0], ...record })}>{_}</a>
  113. }
  114. }
  115. return <span >{_}</span>
  116. }
  117. }
  118. });
  119. set_tableColumn([...columns]);
  120. const data = assignmentData.map((item: any) => {
  121. let rowData: { [key: string]: any } = {};
  122. item.forEach((b:any) => {
  123. const needTitle = title.filter((a:any)=>a.code == b.code);
  124. if(needTitle.length>0){
  125. rowData[`${needTitle[0].columnName}`] = b.value
  126. }
  127. });
  128. return { ...item, ...rowData, id: Math.random(), columns }
  129. });
  130. return {
  131. data,
  132. success: true
  133. }
  134. }
  135. return []
  136. }
  137. const getCurrentComputeDate = async () => {
  138. const resp = await getComputeDate();
  139. set_tableDataFilterParams({ ...tableDataFilterParams, parameter: { ...tableDataFilterParams.parameter, compute_date: resp } });
  140. set_currentComputeDate(resp);
  141. }
  142. const handleResize = (e: any) => {
  143. const wH = e.target.innerHeight;
  144. const tableHeight = wH - 290;
  145. set_tableH(tableHeight);
  146. }
  147. function doResize() {
  148. setTimeout(() => {
  149. const ev: any = new Event('resize');
  150. window.dispatchEvent(ev);
  151. }, 0)
  152. }
  153. //面包屑跳转
  154. const switchHandle = (data: any) => {
  155. set_step(data.index);
  156. const _breadCrumbList = breadCrumbList.filter((a: any) => a.index <= data.index);
  157. set_breadCrumbList([..._breadCrumbList]);
  158. set_tableDataFilterParams({ ...tableDataFilterParams, ...data.params });
  159. }
  160. useEffect(() => {
  161. // 在这里处理路由参数变化的逻辑
  162. set_tableDataFilterParams({ reportCode: urlReportCode, parameter: { compute_date: currentComputeDate } });
  163. set_breadCrumbList([{
  164. name:'首页',
  165. index:0,
  166. params: { reportCode: urlReportCode, parameter: { compute_date: currentComputeDate } }
  167. }])
  168. }, [urlReportCode]);
  169. useEffect(() => {
  170. getCurrentComputeDate();
  171. window.addEventListener('resize', (e) => handleResize(e)) //监听窗口大小改变
  172. doResize();
  173. return () => {
  174. window.removeEventListener('resize', (e) => handleResize(e))
  175. }
  176. }, [])
  177. return (
  178. <BMSPagecontainer className='ReportTemplate' title={`核算年月:${currentComputeDate}`}>
  179. <div className='breadcrumb'>
  180. {
  181. breadCrumbList.length > 1 && breadCrumbList.map((item: any, index: number) => {
  182. return (
  183. <span className={index != step ? 'tab' : 'tab actived'} key={index} onClick={() => { index != step && switchHandle(item) }}>{item.name}{index == breadCrumbList.length - 1 ? '' : ' / '}</span>
  184. )
  185. })
  186. }
  187. </div>
  188. <div className='content'>
  189. {currentComputeDate && <BMSTable actionRef={tableRef} rowKey='id' pagination={false} columns={tableColumn as ProColumns[]}
  190. params={tableDataFilterParams}
  191. scroll={{ x: 100 * tableColumn.length, y: tableH }}
  192. request={(params, sort, filter) => getTableData(params, sort, filter)}
  193. />}
  194. </div>
  195. </BMSPagecontainer>
  196. )
  197. }
  198. export default ReportTemplate