Department.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import React, { useEffect, useState, useRef } from 'react';
  2. import { connect } from 'dva';
  3. import { Form, Table, DatePicker, Input, Button } from 'antd';
  4. import styles from './report.less';
  5. import UserRptModal from './UserRptModal';
  6. import DepCompareModal from './DepCompareModal';
  7. import moment from 'moment';
  8. import { downloadFile, getToken } from '@/utils/utils.js';
  9. const { RangePicker } = DatePicker;
  10. function Department(props) {
  11. const { dispatch, loading, dep } = props;
  12. const [form] = Form.useForm();
  13. const [visible, setVisible] = useState(false);
  14. const [modalFilter, setModalFilter] = useState({});
  15. const columns = [
  16. {
  17. title: '部门名称',
  18. // render: record => <a onClick={() => showUserModal(record)}>{record.dep_name}</a>,
  19. render: record => <a onClick={() => showDepCompare(record)}>{record.dep_name}</a>,
  20. },
  21. {
  22. title: '执行项目人日',
  23. dataIndex: 'type_project_cnt',
  24. },
  25. {
  26. title: '售前支持',
  27. dataIndex: 'type_sale_cnt',
  28. },
  29. {
  30. title: '市场品牌',
  31. dataIndex: 'type_market_cnt',
  32. },
  33. {
  34. title: '日常',
  35. dataIndex: 'type_normal_cnt',
  36. },
  37. {
  38. title: '标准化',
  39. dataIndex: 'type_standardize_cnt',
  40. },
  41. {
  42. title: '研发',
  43. dataIndex: 'type_rd_cnt',
  44. },
  45. {
  46. title: '漏填工时',
  47. dataIndex: 'type_lost_cnt',
  48. },
  49. {
  50. title: '总计',
  51. dataIndex: 'total_cnt',
  52. },
  53. {
  54. title: '有效利用率',
  55. dataIndex: 'usage_percent',
  56. render: percent => (percent * 100).toFixed(2) + '%',
  57. },
  58. // {
  59. // title: '付费工时数',
  60. // dataIndex: 'pay_workload_cnt',
  61. // },
  62. // {
  63. // title: '付费工时率',
  64. // dataIndex: 'pay_workload_percent',
  65. // render: percent => (percent * 100).toFixed(2) + '%',
  66. // },
  67. ];
  68. const filterRef = useRef({ pageSize: 99999 });
  69. const handleSearch = () => {
  70. const { time } = form.getFieldsValue();
  71. filterRef.current.s_time = time[0] ? moment(time[0]).format('YYYY-MM-DD') : null;
  72. filterRef.current.e_time = time[1] ? moment(time[1]).format('YYYY-MM-DD') : null;
  73. dispatch({
  74. type: 'report/queryDepReport',
  75. payload: {
  76. filter: filterRef.current,
  77. },
  78. });
  79. };
  80. const handleDownload = () => {
  81. const token = getToken();
  82. const s_time = !filterRef.current.s_time ? '' : filterRef.current.s_time;
  83. const e_time = !filterRef.current.e_time ? '' : filterRef.current.e_time;
  84. downloadFile(
  85. `/api/v2/workload/rpt/dep/export2excel?JWT-TOKEN=${token}&s_time=${s_time}&e_time=${e_time}`,
  86. `项目报表${moment().format('YYYYMMDDHHMMSS')}.xlsx`
  87. );
  88. };
  89. const renderSearch = () => {
  90. return (
  91. <Form layout="inline" form={form}>
  92. <Form.Item label="时间" name="time" initialValue={[moment().startOf('years'), moment()]}>
  93. <RangePicker placeholder="选择时间" allowClear={false} />
  94. </Form.Item>
  95. <Form.Item>
  96. <Button type="primary" loading={loading} onClick={handleSearch}>
  97. 查询
  98. </Button>
  99. </Form.Item>
  100. </Form>
  101. );
  102. };
  103. const onExpand = (expanded, record) => {
  104. if (expanded && !record.isLoad) {
  105. dispatch({
  106. type: 'report/queryDepReport',
  107. payload: {
  108. filter: filterRef.current,
  109. record: record,
  110. },
  111. });
  112. }
  113. };
  114. // const showUserModal = item => {
  115. const showDepCompare = item => {
  116. const { s_time, e_time } = filterRef.current;
  117. setModalFilter({
  118. s_time: s_time,
  119. e_time: e_time,
  120. dep_id: item.dep_id,
  121. });
  122. setVisible(true);
  123. };
  124. useEffect(() => {
  125. // dispatch({
  126. // type: 'report/queryUserReport',
  127. // });
  128. handleSearch();
  129. }, []);
  130. return (
  131. <div>
  132. <div className={styles.topPart}>
  133. {renderSearch()}
  134. <Button type="primary" onClick={handleDownload}>
  135. 导出
  136. </Button>
  137. </div>
  138. <Table
  139. loading={loading}
  140. rowKey="dep_id"
  141. style={{ marginTop: 20 }}
  142. columns={columns}
  143. dataSource={dep.list}
  144. pagination={false}
  145. onExpand={onExpand}
  146. />
  147. {/* <UserRptModal filter={modalFilter} visible={visible} onCancel={() => setVisible(false)} /> */}
  148. <DepCompareModal filter={modalFilter} visible={visible} onCancel={() => setVisible(false)} />
  149. </div>
  150. );
  151. }
  152. export default connect(({ report, loading }) => ({
  153. dep: report.dep,
  154. loading: loading.models.report,
  155. }))(Department);