TaskList.tsx 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. import PageContent from '@/components/PageContent';
  2. import PageTitle from '@/components/PageTitle';
  3. import {
  4. IPropsType,
  5. ITopFilter,
  6. IUserType,
  7. } from '@/pages/TaskManage/Detail/TaskList/taskList.types';
  8. import {
  9. MandateClass,
  10. MandateStatus,
  11. MandateType,
  12. OrderStatus,
  13. OrderType,
  14. } from '@/pages/TaskManage/constent';
  15. import { connect, useLocation } from '@umijs/max';
  16. import TopFilter from '@/pages/TaskManage/components/TopFilter';
  17. import { IMandateType } from '@/pages/TaskManage/index.types';
  18. import { useNavigate } from '@@/exports';
  19. import { Col, Collapse, CollapseProps, Divider, List, Row, Spin } from 'antd';
  20. import React, { useEffect, useState } from 'react';
  21. import styles from './taskList.less';
  22. const TaskList: React.FC<IPropsType> = (props) => {
  23. const { userList, mandateList, loading, dispatch } = props;
  24. // const md5 = require('md5');
  25. const location = useLocation();
  26. const queryParams = new URLSearchParams(location.search);
  27. const project_id = Number(queryParams.get('project_id'));
  28. const mandateType = Number(queryParams.get('mandateType'));
  29. const navigate = useNavigate();
  30. // 用于展示的任务列表
  31. const [mandateListShow, setMandateListShow] = useState<IMandateType[]>([
  32. ...mandateList.filter((item) => item.MandateType === mandateType),
  33. ]);
  34. // 顶部选择器配置
  35. const [topFilters, setTopFilters] = useState<ITopFilter[]>([]);
  36. /**
  37. * 处理选择器变化
  38. * @param value 选择的值,当清空时等于null
  39. */
  40. const onTopFilterChange = (value: any) => {
  41. if (topFilters.length === 0) {
  42. return;
  43. }
  44. let tempList = mandateList.filter(
  45. (item) => item.MandateType === mandateType,
  46. );
  47. for (let i = 0; i < value.length; i++) {
  48. if (value[i] !== null) {
  49. tempList = tempList.filter(
  50. // @ts-ignore
  51. (item) => item[topFilters[i].key] === value[i],
  52. );
  53. console.log(tempList.length);
  54. }
  55. }
  56. setMandateListShow(tempList);
  57. };
  58. // 获取用户
  59. useEffect(() => {
  60. if (userList.length === 0) {
  61. dispatch({
  62. type: 'taskUser/fetchUserList',
  63. payload: { project_id },
  64. });
  65. }
  66. if (mandateList.length === 0) {
  67. dispatch({
  68. type: 'mandate/fetchMandateList',
  69. payload: { project_id, mandate_type: mandateType, pageSize: 9999 },
  70. });
  71. }
  72. }, []);
  73. // 获取列表
  74. useEffect(() => {
  75. setMandateListShow(
  76. mandateList.filter((item) => item.MandateType === mandateType),
  77. );
  78. }, [mandateList]);
  79. // 顶部下拉过滤器
  80. useEffect(() => {
  81. const filters: ITopFilter[] = [];
  82. filters.push({
  83. key: 'MandateClass',
  84. placeholder: '任务类别',
  85. // @ts-ignore
  86. options: MandateClass.map((item) => {
  87. if (item.MandateType === mandateType) {
  88. return {
  89. value: item.value,
  90. label: item.label,
  91. key: item.value + '任务类别',
  92. };
  93. }
  94. return undefined;
  95. }).filter((item) => item),
  96. });
  97. filters.push({
  98. key: 'Status',
  99. placeholder: '任务状态',
  100. options: MandateStatus.map((item) => {
  101. return {
  102. ...item,
  103. };
  104. }),
  105. });
  106. setTopFilters(filters);
  107. setMandateListShow(
  108. mandateList.filter((item) => item.MandateType === mandateType),
  109. );
  110. }, [mandateType]);
  111. const goTaskDetail = (mandate: IMandateType) => {
  112. navigate(
  113. `/task-manage/list/detail?project_id=${project_id}&mandate_id=${mandate.Id}`,
  114. );
  115. };
  116. const goTaskOrder = (orderID: number, orderType: number | undefined) => {
  117. if (orderType === undefined) {
  118. return;
  119. }
  120. navigate(
  121. `/task-manage/list/order-detail?project_id=${project_id}&order_id=${orderID}&order_type=${orderType}`,
  122. );
  123. };
  124. const buildTaskList = (item: IMandateType) => {
  125. const formatItem = {
  126. ...item,
  127. Status: MandateStatus.find((status) => status.value === item.Status),
  128. MandateType: MandateType.find((type) => type.value === item.MandateType),
  129. MandateClass: MandateClass.find(
  130. (itemClass) => itemClass.value === item.MandateClass,
  131. ),
  132. ResponsiblePeople: userList.find(
  133. (user) => user.ID === item.ResponsiblePeople,
  134. ),
  135. };
  136. const workOrder = item.Records.map((record) => {
  137. return {
  138. ...record,
  139. key: record.Id,
  140. Status: OrderStatus.find((status) => status.value === record.Status),
  141. RecordType: OrderType.find((type) => type.value === record.RecordType),
  142. Responsible: userList.find((user) => user.ID === record.Responsible),
  143. };
  144. });
  145. const collapseData: CollapseProps['items'] = [
  146. {
  147. key: '1',
  148. label: (
  149. <span style={{ color: '#5697e4' }}>关联工单({workOrder.length})</span>
  150. ),
  151. children: workOrder.map((order) => {
  152. return (
  153. <div key={order.Id} className={styles.workOrderCard}>
  154. <div className={styles.leftInfo}>
  155. <Row style={{ marginBottom: '15px' }}>
  156. <Col className={styles.fontS24} span={12}>
  157. 工单编号:{order.Id}
  158. </Col>
  159. <Col className={styles.fontS24} span={12}>
  160. 时间:{order.CreateTime}
  161. </Col>
  162. </Row>
  163. <Row>
  164. <Col className={styles.fontS24} span={12}>
  165. 工单状态:
  166. <span style={{ color: '#5697e4' }}>
  167. {order.Status?.label}
  168. </span>
  169. </Col>
  170. <Col className={styles.fontS24} span={12}>
  171. 工单负责人:{order.Responsible?.CName}
  172. </Col>
  173. </Row>
  174. </div>
  175. <Divider type="vertical" style={{ height: '40px' }} />
  176. <div
  177. className={styles.rightButton}
  178. style={{ color: '#5697e4' }}
  179. onClick={() => {
  180. goTaskOrder(order.Id, order.RecordType?.value);
  181. }}
  182. >
  183. 查看工单
  184. </div>
  185. </div>
  186. );
  187. }),
  188. },
  189. ];
  190. return (
  191. <List.Item>
  192. <div className={`${styles.cardContainer} card-box`}>
  193. <Row justify="space-between" style={{ marginBottom: '20px' }}>
  194. <Col className={styles.fontS24}>时间:{formatItem.CreateTime}</Col>
  195. <Col className={styles.fontS24}>
  196. 任务类别:{formatItem.MandateClass?.label}
  197. </Col>
  198. <Col className={styles.fontS24}>
  199. 任务负责人:{formatItem.ResponsiblePeople?.CName || '-'}
  200. </Col>
  201. </Row>
  202. <Row
  203. justify="space-between"
  204. style={{ paddingBottom: '10px', borderBottom: '1px solid gray' }}
  205. >
  206. <Col className={styles.fontS24}>
  207. 任务状态:{formatItem.Status?.label || '-'}
  208. </Col>
  209. <Col>
  210. <div
  211. className={styles.fontS24}
  212. style={{
  213. backgroundColor: '#f5a623',
  214. color: 'white',
  215. width: '150px',
  216. height: '50px',
  217. display: 'flex',
  218. justifyContent: 'center',
  219. alignItems: 'center',
  220. }}
  221. onClick={() => {
  222. goTaskDetail(item);
  223. }}
  224. >
  225. 任务详情
  226. </div>
  227. </Col>
  228. </Row>
  229. <Row>
  230. <Collapse
  231. className={styles.collapseLabel}
  232. ghost
  233. items={collapseData}
  234. />
  235. </Row>
  236. </div>
  237. </List.Item>
  238. );
  239. };
  240. return (
  241. <PageContent>
  242. <PageTitle returnable>
  243. {MandateType.find((item) => item.value === mandateType)?.label}
  244. </PageTitle>
  245. <TopFilter filters={topFilters} onChange={onTopFilterChange} />
  246. <Spin spinning={loading}>
  247. <List
  248. itemLayout="horizontal"
  249. dataSource={mandateListShow}
  250. renderItem={buildTaskList}
  251. />
  252. </Spin>
  253. </PageContent>
  254. );
  255. };
  256. export default connect(
  257. ({
  258. taskUser,
  259. mandate,
  260. loading,
  261. }: any): {
  262. userList: IUserType[];
  263. mandateList: IMandateType[];
  264. loading: boolean;
  265. } => {
  266. return {
  267. userList: taskUser.userList,
  268. mandateList: mandate.mandateList,
  269. loading: loading.models['taskUser'] || loading.models['mandate'],
  270. };
  271. },
  272. )(TaskList);