index.js 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. import React, { useState, useEffect, useRef } from 'react';
  2. import { Modal, Button, Calendar, Popover, Spin, Row, Col } from 'antd';
  3. import AddModal from './AddModal';
  4. import WorkList from './WorkList';
  5. import { connect } from 'dva';
  6. import moment from 'moment';
  7. function List(props) {
  8. const { typeList, dispatch, loading, dataList, projectList, currentUser, allType } = props;
  9. const [visible, setVisible] = useState(false);
  10. const [current, setCurrent] = useState({
  11. date: moment(),
  12. list: [],
  13. });
  14. const onAuth = (item, workload) => {
  15. console.log(workload);
  16. Modal.confirm({
  17. title: '提示',
  18. content: '是否上报审批?',
  19. okText: '确认',
  20. cancelText: '取消',
  21. onOk() {
  22. console.log(item);
  23. let params = [
  24. {
  25. type_id: Number(item.type_id),
  26. // 父级id
  27. parent_type_id: allType[item.type_id].parent_id,
  28. data: [
  29. {
  30. id: item.id,
  31. project_id: item.project_id,
  32. workload: workload,
  33. day: item.time,
  34. },
  35. ],
  36. },
  37. ];
  38. dispatch({
  39. type: 'workload/addAuthWorkHours',
  40. payload: params,
  41. callback: list => {
  42. let time = current.date.format('YYYY-MM-DD');
  43. setCurrent({
  44. ...current,
  45. list: list.filter(item => item.time == time),
  46. });
  47. },
  48. });
  49. },
  50. });
  51. };
  52. const MultiAuth = () => {
  53. Modal.confirm({
  54. title: '提示',
  55. content: '是否上报全部审批?',
  56. okText: '确认',
  57. cancelText: '取消',
  58. onOk() {
  59. let params = [];
  60. for (let i = 0; i < dataList.length; i++) {
  61. const element = dataList[i];
  62. if (element.audit_state != 0) continue;
  63. var arr = params.find(arr => arr.type_id == element.type_id);
  64. if (arr) {
  65. console.log(arr);
  66. arr.parent_type_id = allType[element.type_id].parent_id;
  67. arr.data.push({
  68. id: element.id,
  69. project_id: element.project_id,
  70. workload: element.workload,
  71. day: element.time,
  72. });
  73. } else {
  74. let data = [];
  75. data.push({
  76. id: element.id,
  77. project_id: element.project_id,
  78. workload: element.workload,
  79. day: element.time,
  80. });
  81. params.push({
  82. type_id: Number(element.type_id),
  83. // 父级id
  84. parent_type_id: allType[element.type_id].parent_id,
  85. data: data,
  86. });
  87. }
  88. }
  89. console.log(params);
  90. dispatch({
  91. type: 'workload/addAuthWorkHours',
  92. payload: params,
  93. });
  94. },
  95. });
  96. };
  97. const currentDayAuth = () => {
  98. var list = current.list;
  99. Modal.confirm({
  100. title: '提示',
  101. content: '是否上报本日审批?',
  102. okText: '确认',
  103. cancelText: '取消',
  104. onOk() {
  105. let params = [];
  106. for (let i = 0; i < list.length; i++) {
  107. const element = list[i];
  108. if (element.audit_state != 0) continue;
  109. var arr = params.find(arr => arr.type_id == element.type_id);
  110. if (arr) {
  111. console.log(arr);
  112. arr.parent_type_id = allType[element.type_id].parent_id;
  113. arr.data.push({
  114. id: element.id,
  115. project_id: element.project_id,
  116. workload: element.workload,
  117. day: element.time,
  118. });
  119. } else {
  120. let data = [];
  121. data.push({
  122. id: element.id,
  123. project_id: element.project_id,
  124. workload: element.workload,
  125. day: element.time,
  126. });
  127. params.push({
  128. type_id: Number(element.type_id),
  129. // 父级id
  130. parent_type_id: allType[element.type_id].parent_id,
  131. data: data,
  132. });
  133. }
  134. }
  135. console.log(params);
  136. dispatch({
  137. type: 'workload/addAuthWorkHours',
  138. payload: params,
  139. });
  140. },
  141. });
  142. };
  143. const onSave = (item, workload) => {
  144. let params = [
  145. {
  146. type_id: Number(item.type_id),
  147. comment: '',
  148. // 父级id
  149. parent_type_id: allType[item.type_id].parent_id,
  150. data: [
  151. {
  152. id: item.id,
  153. project_id: Number(item.project_id),
  154. workload: workload,
  155. day: item.time,
  156. },
  157. ],
  158. },
  159. ];
  160. dispatch({
  161. type: 'workload/addWorkHours',
  162. payload: params,
  163. callback: list => {
  164. let time = current.date.format('YYYY-MM-DD');
  165. setCurrent({
  166. ...current,
  167. list: list.filter(item => item.time == time),
  168. });
  169. },
  170. });
  171. };
  172. const onAddWork = data => {
  173. dispatch({
  174. type: 'workload/addWorkHours',
  175. payload: data,
  176. callback: list => {
  177. setVisible(false);
  178. let time = current.date.format('YYYY-MM-DD');
  179. setCurrent({
  180. ...current,
  181. list: list.filter(item => item.time == time),
  182. });
  183. },
  184. });
  185. };
  186. const dateCellRender = value => {
  187. let current = value.format('YYYY-MM-DD');
  188. let list = dataList.filter(item => item.time == current);
  189. // let total = list.reduce((total, item) => total + item.workload, 0);
  190. let waitTotal = 0,
  191. successTotal = 0;
  192. list.forEach(item => {
  193. if (item.audit_state == 2) {
  194. successTotal += item.workload;
  195. } else {
  196. waitTotal += item.workload;
  197. }
  198. });
  199. if (list.length == 0) return;
  200. let content = (
  201. <div>
  202. {list.map(item => (
  203. <div key={item.type_id}>
  204. {getName(item)}-{item.TypeInfo?.name}:{item.workload}小时
  205. </div>
  206. ))}
  207. </div>
  208. );
  209. return (
  210. <Popover content={content}>
  211. {successTotal !== 0 && <div>已审批: {successTotal}</div>}
  212. {waitTotal !== 0 && <div style={{ color: '#e43d33' }}>待处理: {waitTotal}</div>}
  213. </Popover>
  214. );
  215. };
  216. const onChangeDate = value => {
  217. let time = value.format('YYYY-MM-DD');
  218. if (current.date.format('YYYY-MM') != value.format('YYYY-MM')) {
  219. const s_date = value.format('YYYY-MM') + '-01';
  220. const e_date = moment(s_date)
  221. .add('month', 1)
  222. .add('days', -1)
  223. .format('YYYY-MM-DD');
  224. dispatch({
  225. type: 'workload/queryWorkHours',
  226. payload: {
  227. pageSize: 9999,
  228. user_id: currentUser.ID,
  229. s_time: s_date + ' 00:00:00',
  230. e_time: e_date + ' 23:59:59',
  231. },
  232. callback: list => {
  233. setCurrent({
  234. date: value,
  235. list: list.filter(item => item.time == time),
  236. });
  237. },
  238. });
  239. } else {
  240. setCurrent({
  241. date: value,
  242. list: dataList.filter(item => item.time == time),
  243. });
  244. }
  245. };
  246. const getName = item => {
  247. let name;
  248. if (item.project_id == '0') {
  249. let pid = allType[item.type_id]?.parent_id;
  250. if (!pid) return '';
  251. name = allType[pid].name;
  252. } else {
  253. name = item.Project.Name;
  254. }
  255. return name;
  256. };
  257. useEffect(() => {
  258. if (!currentUser.ID) return;
  259. // 查询分类以及工时
  260. dispatch({
  261. type: 'workload/queryWorkType',
  262. callback: () => {
  263. const s_date = current.date.format('YYYY-MM') + '-01';
  264. const e_date = moment(s_date)
  265. .add('month', 1)
  266. .add('days', -1)
  267. .format('YYYY-MM-DD');
  268. dispatch({
  269. type: 'workload/queryWorkHours',
  270. payload: {
  271. pageSize: 9999,
  272. user_id: currentUser.ID,
  273. s_time: s_date + ' 00:00:00',
  274. e_time: e_date + ' 23:59:59',
  275. },
  276. callback: list => {
  277. let time = current.date.format('YYYY-MM-DD');
  278. setCurrent({
  279. ...current,
  280. list: list.filter(item => item.time == time),
  281. });
  282. },
  283. });
  284. },
  285. });
  286. // 查询项目列表
  287. // dispatch({
  288. // type: 'workload/queryProject',
  289. // });
  290. return () => {
  291. // 清空查询数据
  292. dispatch({
  293. type: 'workload/save',
  294. payload: {
  295. filter: {},
  296. list: [],
  297. },
  298. });
  299. };
  300. }, [currentUser.ID]);
  301. // useEffect(() => {
  302. // onChangeDate(current.date);
  303. // }, [dataList]);
  304. return (
  305. <div>
  306. <Spin spinning={loading}>
  307. <Row gutter={8}>
  308. <Col span={10}>
  309. <Calendar
  310. value={current.date}
  311. dateCellRender={dateCellRender}
  312. onChange={onChangeDate}
  313. />
  314. </Col>
  315. <Col span={14}>
  316. <div>
  317. <Button type="primary" style={{ marginBottom: 20 }} onClick={() => setVisible(true)}>
  318. 新增
  319. </Button>
  320. <Button
  321. type="primary"
  322. style={{ marginBottom: 20, marginLeft: 20 }}
  323. onClick={() => MultiAuth()}
  324. >
  325. 上报所有工时
  326. </Button>
  327. {current.list.length > 0 && (
  328. <Button
  329. type="primary"
  330. style={{ marginBottom: 20, marginLeft: 20, float: 'right' }}
  331. onClick={() => currentDayAuth()}
  332. >
  333. 上报今日工时
  334. </Button>
  335. )}
  336. </div>
  337. <WorkList allType={allType} list={current.list} onAuth={onAuth} onSave={onSave} />
  338. </Col>
  339. </Row>
  340. </Spin>
  341. <AddModal
  342. typeList={typeList}
  343. visible={visible}
  344. onOk={onAddWork}
  345. time={current.date?.format('YYYY-MM-DD')}
  346. onCancel={() => setVisible(false)}
  347. />
  348. </div>
  349. );
  350. }
  351. export default connect(({ workload, user, loading }) => ({
  352. dataList: workload.dataList,
  353. typeList: workload.typeList,
  354. allType: workload.allType,
  355. currentUser: user.currentUser,
  356. loading: loading.models.workload,
  357. }))(List);