Auth.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. import React, { useState, useEffect, useRef } from 'react';
  2. import {
  3. message,
  4. InputNumber,
  5. Table,
  6. Divider,
  7. Modal,
  8. Button,
  9. Input,
  10. Row,
  11. Col,
  12. Calendar,
  13. Spin,
  14. } from 'antd';
  15. // import SearchForm from './SearchForm';
  16. import RejectModal from './RejectModal';
  17. import AuthWorkList from './AuthWorkList';
  18. import { connect } from 'dva';
  19. import styles from './index.less';
  20. import moment from 'moment';
  21. function List(props) {
  22. const { dispatch, loading, list, project, currentUser, allType, user } = props;
  23. const [visible, setVisible] = useState(false);
  24. const [filter, setFilter] = useState({});
  25. const [current, setCurrent] = useState({
  26. date: moment(),
  27. list: [],
  28. });
  29. const rejectRef = useRef({});
  30. const onAgree = records => {
  31. Modal.confirm({
  32. title: '提示',
  33. content: '是否确认通过审批?',
  34. okText: '通过',
  35. cancelText: '取消',
  36. onOk() {
  37. let params = records.map(item => ({
  38. id: item.id,
  39. status: 2,
  40. desc: '',
  41. }));
  42. let time = current.date.format('YYYY-MM-DD');
  43. dispatch({
  44. type: 'workload/authWorkload',
  45. payload: params,
  46. callback: list => {
  47. setCurrent({
  48. ...current,
  49. list: list.filter(item => item.time == time),
  50. });
  51. },
  52. });
  53. },
  54. });
  55. };
  56. const onReject = data => {
  57. let items = rejectRef.current;
  58. let params = items.map(item => ({
  59. id: item.id,
  60. ts: item.ts,
  61. user_id: item.User.ID,
  62. workload: item.workload,
  63. status: 3,
  64. desc: data.desc || '',
  65. }));
  66. let time = current.date.format('YYYY-MM-DD');
  67. dispatch({
  68. type: 'workload/authWorkload',
  69. payload: params,
  70. callback: list => {
  71. setVisible(false);
  72. setCurrent({
  73. ...current,
  74. list: list.filter(item => item.time == time),
  75. });
  76. },
  77. });
  78. };
  79. const dateCellRender = value => {
  80. let current = value.format('YYYY-MM-DD');
  81. let timeList = list.filter(item => item.time == current);
  82. let total = timeList.reduce((total, item) => {
  83. if (item.audit_state != 1) return total;
  84. return total + item.workload;
  85. }, 0);
  86. if (timeList.length == 0 || total == 0) return;
  87. return <span style={{ color: '#1890ff' }}>{total} 小时</span>;
  88. };
  89. const onChangeDate = value => {
  90. let time = value.format('YYYY-MM-DD');
  91. if (current.date.format('YYYY-MM') != value.format('YYYY-MM')) {
  92. const s_date = value.format('YYYY-MM') + '-01';
  93. const e_date = moment(s_date)
  94. .add('month', 1)
  95. .add('days', -1)
  96. .format('YYYY-MM-DD');
  97. dispatch({
  98. type: 'workload/queryAuthWorkHours',
  99. payload: {
  100. pageSize: 9999,
  101. s_time: s_date + ' 00:00:00',
  102. e_time: e_date + ' 23:59:59',
  103. },
  104. callback: list => {
  105. setCurrent({
  106. date: value,
  107. list: list.filter(item => item.time == time),
  108. });
  109. },
  110. });
  111. } else {
  112. setCurrent({
  113. date: value,
  114. list: list.filter(item => item.time == time),
  115. });
  116. }
  117. };
  118. const getList = () => {
  119. return current.list.filter(item => {
  120. if (filter.userId && item.User.ID != filter.userId) return false;
  121. if (filter.projectId && item.project_id != filter.projectId) return false;
  122. return true;
  123. });
  124. };
  125. useEffect(() => {
  126. if (!currentUser.ID) return;
  127. // 查询分类以及工时
  128. dispatch({
  129. type: 'workload/queryWorkType',
  130. callback: () => {
  131. const s_date = current.date.format('YYYY-MM') + '-01';
  132. const e_date = moment(s_date)
  133. .add('month', 1)
  134. .add('days', -1)
  135. .format('YYYY-MM-DD');
  136. dispatch({
  137. type: 'workload/queryAuthWorkHours',
  138. payload: {
  139. pageSize: 9999,
  140. s_time: s_date + ' 00:00:00',
  141. e_time: e_date + ' 23:59:59',
  142. },
  143. callback: list => {
  144. let time = current.date.format('YYYY-MM-DD');
  145. setCurrent({
  146. ...current,
  147. list: list.filter(item => item.time == time),
  148. });
  149. },
  150. });
  151. },
  152. });
  153. // 查询项目列表
  154. dispatch({
  155. type: 'workload/queryProject',
  156. });
  157. dispatch({
  158. type: 'user/fetch',
  159. });
  160. return () => {
  161. // 清空查询数据
  162. dispatch({
  163. type: 'workload/save',
  164. payload: {
  165. filter: {},
  166. list: [],
  167. },
  168. });
  169. };
  170. }, [currentUser.ID]);
  171. // useEffect(() => {
  172. // onChangeDate(current.date);
  173. // }, [list]);
  174. return (
  175. <div>
  176. <Spin spinning={loading}>
  177. <Row gutter={8}>
  178. <Col span={12}>
  179. <Calendar
  180. value={current.date}
  181. dateCellRender={dateCellRender}
  182. onChange={onChangeDate}
  183. />
  184. </Col>
  185. <Col span={12}>
  186. <AuthWorkList
  187. allType={allType}
  188. project={project}
  189. list={getList()}
  190. onAgree={onAgree}
  191. onSearch={setFilter}
  192. user={user}
  193. onReject={records => {
  194. setVisible(true);
  195. rejectRef.current = records;
  196. }}
  197. />
  198. </Col>
  199. </Row>
  200. </Spin>
  201. <RejectModal visible={visible} onOk={onReject} onCancel={() => setVisible(false)} />
  202. </div>
  203. );
  204. }
  205. export default connect(({ workload, user, loading }) => ({
  206. list: workload.list,
  207. user: user.list,
  208. allType: workload.allType,
  209. project: workload.project,
  210. currentUser: user.currentUser,
  211. loading: loading.models.workload,
  212. }))(List);