index.tsx 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. /*
  2. * @Author: code4eat awesomedema@gmail.com
  3. * @Date: 2023-01-04 14:12:31
  4. * @LastEditors: code4eat awesomedema@gmail.com
  5. * @LastEditTime: 2023-12-08 15:20:58
  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, DatePicker } 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. import exportTableToExcel from '@/utils/tableToExcel';
  21. import 'moment/locale/zh-cn';
  22. import locale from 'antd/es/date-picker/locale/zh_CN';
  23. import moment from 'moment';
  24. import { formatMoneyNumber } from '@/utils/format';
  25. import { number } from 'mathjs';
  26. // const {search} = locatio
  27. let computeDate:any = undefined;
  28. const ReportTemplate = () => {
  29. const { reportCode: urlReportCode } = useParams();
  30. const [tableColumn, set_tableColumn] = useState<ProColumns[] | any[]>([]);
  31. const [tableData, set_tableData] = useState<any[]>([]);
  32. const [currentComputeDate, set_currentComputeDate] = useState<string | undefined>();
  33. const [breadCrumbList, set_breadCrumbList] = useState<any[]>([]);
  34. const [tableDataFilterParams, set_tableDataFilterParams] = useState<any | undefined>({ reportCode: urlReportCode });
  35. const tableRef = useRef<ActionType>();
  36. const [tableH, set_tableH] = useState(0);
  37. const [step, set_step] = useState(0);
  38. const [reportName, set_reportName] = useState('')
  39. const reportJumphandle = (reportData: any) => {
  40. let parameter: { [key: string]: any } = {};
  41. const { redirectParameter = undefined } = reportData;
  42. const _step = step + 1;
  43. if (redirectParameter) {
  44. const tempArr = redirectParameter.split('|');
  45. tempArr.forEach((element: string) => {
  46. parameter[`${element}`] = reportData[`${element}`]
  47. });
  48. }
  49. set_breadCrumbList(
  50. [...breadCrumbList,
  51. {
  52. index: _step,
  53. name: reportData[`report_name`] || reportData[`redirectReportName`],
  54. params: {
  55. reportCode: reportData.redirectReportCode,
  56. parameter: {
  57. ...parameter,
  58. }
  59. }
  60. }
  61. ]
  62. );
  63. set_step(_step);
  64. set_tableDataFilterParams({
  65. ...tableDataFilterParams, reportCode: reportData.redirectReportCode, parameter: {
  66. compute_date: currentComputeDate,
  67. ...parameter
  68. }
  69. })
  70. }
  71. const getTableData = async (params: any, sort: any, filter: any) => {
  72. const { reportCode, parameter } = params;
  73. let resp: any = undefined;
  74. if (step != 0) {
  75. //报表跳转
  76. resp = await getRedirReportData(
  77. reportCode,
  78. {...parameter,compute_date:computeDate,}
  79. );
  80. }
  81. if (step == 0) {
  82. //首次获取表格数据
  83. resp = await getData(
  84. reportCode,
  85. {...parameter,compute_date: currentComputeDate,}
  86. );
  87. }
  88. if (resp) {
  89. const { title, data: assignmentData, reportName } = resp;
  90. set_reportName(reportName);
  91. const columns: ProColumns[] = title.map((item: any, index: number) => {
  92. return {
  93. title: item.name,
  94. dataIndex: `${item.columnName}`,
  95. key: `${item.columnName}`,
  96. width: item.name.length * 25,
  97. ellipsis: true,
  98. fixed: item.freeze?true:false,
  99. hideInTable: item.hide,
  100. renderText:(_:string|number, record:any) => {
  101. if (item.redirect) {
  102. if (item.redirectData && item.redirectData.length > 1) {
  103. const items: MenuProps['items'] = [
  104. ...(item.redirectData.map((a: any, index: number) => ({
  105. key: index,
  106. label: (
  107. <a onClick={() => reportJumphandle({ ...item, ...record, ...a })}>
  108. {a.redirectReportName}
  109. </a>
  110. ),
  111. })))
  112. ];
  113. return <Dropdown menu={{ items }}>
  114. <a onClick={(e) => e.preventDefault()}>
  115. <Space>
  116. {(item.dataType && item.dataType == 2 && _) ? formatMoneyNumber(Number(Number(_).toFixed(2))) : _}
  117. <DownOutlined />
  118. </Space>
  119. </a>
  120. </Dropdown>
  121. } else {
  122. return <a className='active' onClick={() => reportJumphandle({ ...item.redirectData[0], ...record })}>{(item.dataType && item.dataType == 2 && _) ? Number(Number(_).toFixed(2)) : _}</a>
  123. }
  124. }
  125. return <span >{(item.dataType && item.dataType == 2 && _) ? formatMoneyNumber(Number(Number(_).toFixed(2))) : _}</span>
  126. }
  127. }
  128. });
  129. set_tableColumn([...columns]);
  130. const data = assignmentData.map((item: any) => {
  131. let rowData: { [key: string]: any } = {};
  132. item.forEach((b: any) => {
  133. const needTitle = title.filter((a: any) => a.code == b.code);
  134. if (needTitle.length > 0) {
  135. rowData[`${needTitle[0].columnName}`] = b.value
  136. }
  137. });
  138. return { ...item, ...rowData, id: Math.random(), columns }
  139. });
  140. set_tableData(data);
  141. return {
  142. data,
  143. success: true
  144. }
  145. }
  146. return []
  147. }
  148. const getCurrentComputeDate = async () => {
  149. const resp = await getComputeDate();
  150. set_tableDataFilterParams({ ...tableDataFilterParams, parameter: { ...tableDataFilterParams.parameter, compute_date: resp } });
  151. set_currentComputeDate(resp);
  152. computeDate = resp;
  153. }
  154. const handleResize = (e: any) => {
  155. const wH = e.target.innerHeight;
  156. const tableHeight = wH - 290;
  157. set_tableH(tableHeight);
  158. }
  159. function doResize() {
  160. setTimeout(() => {
  161. const ev: any = new Event('resize');
  162. window.dispatchEvent(ev);
  163. }, 0)
  164. }
  165. const exportHandle = () => {
  166. //const headers = { name: '姓名', age: '年龄', city: '城市' };
  167. let headers: { [key: string]: any } = {};
  168. let data: any[] = [];
  169. tableColumn.forEach(a => {
  170. if (a.hideInTable != 1) {
  171. headers[`${a.dataIndex}`] = a.title;
  172. }
  173. });
  174. tableData.forEach(b => {
  175. let _temp: { [key: string]: any } = {};
  176. Object.keys(headers).forEach(key => {
  177. _temp[`${key}`] = b[`${key}`]
  178. });
  179. data.push(_temp);
  180. });
  181. //console.log({tableColumn,headers,tableData,data});
  182. const excelTableData = [
  183. ...data
  184. ];
  185. exportTableToExcel(excelTableData, tableColumn as any[], reportName);
  186. }
  187. //面包屑跳转
  188. const switchHandle = (data: any) => {
  189. set_step(data.index);
  190. const _breadCrumbList = breadCrumbList.filter((a: any) => a.index <= data.index);
  191. set_breadCrumbList([..._breadCrumbList]);
  192. set_tableDataFilterParams({ ...tableDataFilterParams, ...data.params });
  193. }
  194. useEffect(() => {
  195. // 在这里处理路由参数变化的逻辑
  196. set_tableDataFilterParams({ reportCode: urlReportCode, parameter: { compute_date: currentComputeDate } });
  197. set_breadCrumbList([{
  198. name: '首页',
  199. index: 0,
  200. params: { reportCode: urlReportCode, parameter: { compute_date: currentComputeDate } }
  201. }])
  202. }, [urlReportCode]);
  203. useEffect(()=>{
  204. set_tableDataFilterParams({ reportCode: urlReportCode, parameter: { compute_date: currentComputeDate } });
  205. },[currentComputeDate])
  206. useEffect(() => {
  207. getCurrentComputeDate();
  208. window.addEventListener('resize', (e) => handleResize(e)) //监听窗口大小改变
  209. doResize();
  210. return () => {
  211. window.removeEventListener('resize', (e) => handleResize(e))
  212. }
  213. }, [])
  214. return (
  215. <BMSPagecontainer className='ReportTemplate' title={false}>
  216. {
  217. breadCrumbList.length > 1 && <div className='breadcrumb'>
  218. {
  219. breadCrumbList.map((item: any, index: number) => {
  220. return (
  221. <>
  222. <span className={index != step ? 'tab' : 'tab actived'} key={index} onClick={() => { index != step && switchHandle(item) }}>{item.name}</span>{index == breadCrumbList.length - 1 ? '' : <span style={{ color: '#7A8599' }}> / </span>}
  223. </>
  224. )
  225. })
  226. }
  227. </div>
  228. }
  229. <div className='contentWrap'>
  230. {currentComputeDate && (<div className='search'>
  231. <span>核算年月:</span>
  232. <DatePicker
  233. onChange={(data, dateString) => {
  234. set_currentComputeDate(dateString);
  235. computeDate = dateString;
  236. }}
  237. allowClear={false}
  238. picker='month'
  239. locale={locale}
  240. defaultValue={moment(currentComputeDate, 'YYYY-MM')}
  241. format='YYYY-MM' placeholder="请选择核算年月" />
  242. </div>)}
  243. <div className='export' onClick={() => exportHandle()}>导出</div>
  244. <div className='content'>
  245. {currentComputeDate && <BMSTable actionRef={tableRef} rowKey='id' pagination={false} columns={tableColumn as ProColumns[]}
  246. params={tableDataFilterParams}
  247. scroll={{ x: 100 * tableColumn.length, y: tableH }}
  248. request={(params, sort, filter) => getTableData(params, sort, filter)}
  249. />}
  250. </div>
  251. </div>
  252. </BMSPagecontainer>
  253. )
  254. }
  255. export default ReportTemplate