TaskDetail.tsx 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. import PageContent from '@/components/PageContent';
  2. import PageTitle from '@/components/PageTitle';
  3. import {
  4. IColumn,
  5. IMandateChildTypes,
  6. } from '@/pages/TaskManage/Detail/TaskDetail/taskDetail.types';
  7. import {
  8. IMandateDetailType,
  9. IUserType,
  10. IWorkOrderType,
  11. } from '@/pages/TaskManage/Detail/TaskList/taskList.types';
  12. import {
  13. MandateClass,
  14. MandateStatus,
  15. MandateType,
  16. OrderStatus,
  17. OrderType,
  18. } from '@/pages/TaskManage/constent';
  19. import { getDiagnosticDetail, getMandateDetail } from '@/services/TaskManage';
  20. import { useLocation } from '@@/exports';
  21. import { UpOutlined } from '@ant-design/icons';
  22. import { connect, useRequest } from '@umijs/max';
  23. import { Col, Collapse, CollapseProps, Divider, Row, Table } from 'antd';
  24. import type { ColumnsType } from 'antd/es/table';
  25. import dayjs from 'dayjs';
  26. import { useEffect, useState } from 'react';
  27. // @ts-ignore
  28. import ReactZmage from 'react-zmage';
  29. import { useNavigate } from 'umi';
  30. import styles from './taskDetail.less';
  31. interface IPropsType {
  32. userList: IUserType[];
  33. dispatch: (args: { type: string; payload: object }) => void;
  34. }
  35. function TaskDetail(props: IPropsType) {
  36. const { userList, dispatch } = props;
  37. const location = useLocation();
  38. const queryParams = new URLSearchParams(location.search);
  39. const project_id = Number(queryParams.get('project_id'));
  40. const mandate_id = Number(queryParams.get('mandate_id'));
  41. const navigate = useNavigate();
  42. const [mandateDetail, setMandateDetail] = useState<IMandateDetailType>();
  43. const [mandateChild, setMandateChild] = useState<IMandateChildTypes[]>([]);
  44. const [handledWorkOrder, setHandledWorkOrder] = useState<
  45. CollapseProps['items']
  46. >([]);
  47. const [mandateTable, setMandateTable] = useState<IColumn[]>([]);
  48. const columnDef: ColumnsType<IColumn> = [
  49. {
  50. title: '详情',
  51. dataIndex: 'detail',
  52. key: 'key',
  53. render: (value, record) => {
  54. return (
  55. <div style={{ display: 'flex', alignItems: 'center' }}>
  56. <div style={{ width: '100%' }}>{value.text}</div>
  57. </div>
  58. );
  59. },
  60. },
  61. ];
  62. const base64ToImageUrl = (base64String: string) => {
  63. const byteCharacters = atob(base64String);
  64. const byteArrays = [];
  65. for (let i = 0; i < byteCharacters.length; i++) {
  66. byteArrays.push(byteCharacters.charCodeAt(i));
  67. }
  68. const byteArray = new Uint8Array(byteArrays);
  69. const blob = new Blob([byteArray], { type: 'image/png' });
  70. return URL.createObjectURL(blob);
  71. };
  72. const { refresh: refreshDetail } = useRequest(getMandateDetail, {
  73. defaultParams: [
  74. {
  75. mandate_id,
  76. project_id,
  77. },
  78. ],
  79. formatResult: async (result) => {
  80. const tempMandate: IMandateDetailType = {
  81. ...result.data,
  82. Status: MandateStatus.find((item) => item.value === result.data.Status),
  83. MandateClass: MandateClass.find(
  84. (item) => item.value === result.data.MandateClass,
  85. ),
  86. MandateType: MandateType.find(
  87. (item) => item.value === result.data.MandateType,
  88. ),
  89. ResponsiblePeople: userList.find(
  90. (item) => item.ID === result.data.ResponsiblePeople,
  91. ),
  92. CreateTime: dayjs(result.data.CreateTime).format('YYYY-MM-DD HH:mm'),
  93. };
  94. const workOrder = result.data.Records.map((item: IWorkOrderType) => {
  95. return {
  96. ...item,
  97. CreateTime: dayjs(item.CreateTime).format('YYYY-MM-DD HH:mm'),
  98. Status: OrderStatus.find((status) => status.value === item.Status),
  99. RecordType: OrderType.find((type) => type.value === item.RecordType),
  100. Responsible: userList.find((user) => user.ID === item.Responsible),
  101. };
  102. });
  103. const children = result.data.MandateChild;
  104. const tempOrder = [
  105. {
  106. key: '1',
  107. label: (
  108. <span style={{ color: '#5697e4' }}>
  109. 关联工单({workOrder.length})
  110. </span>
  111. ),
  112. children: workOrder.map((record: IWorkOrderType) => {
  113. return (
  114. <div key={record.Id} className={styles.workOrderCard}>
  115. <div className={styles.leftInfo}>
  116. <Row style={{ marginBottom: '15px' }}>
  117. <Col className={styles.fontS24} span={12}>
  118. <>
  119. 工单类型:
  120. {record.RecordType?.label?.replace('工单', '')}
  121. </>
  122. </Col>
  123. <Col className={styles.fontS24} span={12}>
  124. 时间:{record.CreateTime || '-'}
  125. </Col>
  126. </Row>
  127. <Row>
  128. <Col className={styles.fontS24} span={12}>
  129. 工单状态:
  130. <span style={{ color: '#5697e4' }}>
  131. {typeof record.Status === 'number'
  132. ? '-'
  133. : record.Status?.label}
  134. </span>
  135. </Col>
  136. <Col className={styles.fontS24} span={12}>
  137. 工单负责人:
  138. {typeof record.Responsible === 'number'
  139. ? '-'
  140. : record.Responsible?.CName}
  141. </Col>
  142. </Row>
  143. </div>
  144. <Divider type="vertical" style={{ height: '40px' }} />
  145. <div
  146. className={styles.rightButton}
  147. style={{ color: '#5697e4' }}
  148. onClick={() => {
  149. if (typeof record.RecordType === 'number') {
  150. return;
  151. }
  152. // @ts-ignore
  153. goTaskOrder(
  154. record.Id,
  155. record.RecordType?.value,
  156. tempMandate?.MandateClass.value,
  157. );
  158. }}
  159. >
  160. 查看工单
  161. </div>
  162. </div>
  163. );
  164. }),
  165. },
  166. ];
  167. if (
  168. tempMandate.MandateClass &&
  169. tempMandate.ExtendId &&
  170. /* @ts-ignore */
  171. tempMandate.MandateClass.value === 7
  172. ) {
  173. const image = await getDiagnosticDetail(tempMandate.ExtendId);
  174. tempMandate.img = image.path;
  175. }
  176. setMandateDetail(tempMandate);
  177. setHandledWorkOrder(tempOrder);
  178. if (children && children.length) {
  179. setMandateChild(children);
  180. }
  181. },
  182. });
  183. useEffect(() => {
  184. if (userList.length === 0) {
  185. dispatch({
  186. type: 'taskUser/fetchUserList',
  187. payload: { project_id },
  188. });
  189. }
  190. }, []);
  191. useEffect(() => {
  192. if (!mandateChild.length) {
  193. return;
  194. }
  195. if (mandateDetail?.MandateClass?.value === 2) {
  196. const dataSource = [];
  197. dataSource.push({
  198. detail: {
  199. text: mandateChild[0].Title,
  200. key: 'title',
  201. },
  202. });
  203. dataSource.push(
  204. ...Object.entries(JSON.parse(mandateChild[0].Content)).map(
  205. (item: any) => {
  206. const [key, value] = item;
  207. return {
  208. detail: {
  209. text:
  210. value['item_alias'] +
  211. ' 现有数值:' +
  212. value['old_value'] +
  213. ' 建议调整数值' +
  214. value['new_value'],
  215. key: key,
  216. },
  217. };
  218. },
  219. ),
  220. );
  221. setMandateTable(dataSource);
  222. return;
  223. }
  224. const dataSource = mandateChild.map((item, index) => {
  225. if (item.MandateClass === 2) {
  226. }
  227. return {
  228. detail: {
  229. text: item.Title + item.Content,
  230. key: item.Title + index + item.Content,
  231. },
  232. };
  233. });
  234. setMandateTable(dataSource);
  235. }, [mandateChild]);
  236. const goTaskOrder = (
  237. orderID: number,
  238. orderType: number,
  239. mandateClass: number,
  240. ) => {
  241. navigate(
  242. `/task-manage/list/order-detail?project_id=${project_id}&order_id=${orderID}&order_type=${orderType}&mandate_class=${mandateClass}`,
  243. );
  244. };
  245. return (
  246. <PageContent closeable={false}>
  247. <PageTitle returnable>任务详情</PageTitle>
  248. <div className=" content-title">
  249. <div className={`${styles.cardContainer} card-box`}>
  250. <div className={styles.normalInfo}>
  251. <Row className={styles.infoRow} justify="space-between">
  252. <Col className={styles.fontS24}>
  253. 时间:{mandateDetail?.CreateTime}
  254. </Col>
  255. {/*// @ts-ignore*/}
  256. <Col className={styles.fontS24}>
  257. {/*//@ts-ignore*/}
  258. 任务类别:{mandateDetail?.MandateClass?.label}
  259. </Col>
  260. </Row>
  261. <Row justify="space-between">
  262. <Col className={styles.fontS24}>
  263. {/*//@ts-ignore*/}
  264. 任务状态:{mandateDetail?.Status?.label}
  265. </Col>
  266. <Col className={styles.fontS24}>
  267. {/*// @ts-ignore*/}
  268. 任务负责人:{mandateDetail?.ResponsiblePeople?.CName}
  269. </Col>
  270. </Row>
  271. </div>
  272. <div className={styles.detailInfo}>
  273. <Row className={styles.infoRow}>
  274. <Col className={styles.fontS24} span={4}>
  275. 任务总结
  276. </Col>
  277. <Col className={styles.fontS24}>
  278. {mandateDetail?.Summary ||
  279. '根据水质相关数据.建议您调节以下参数,水厂运行可达较优状态'}
  280. </Col>
  281. </Row>
  282. {mandateDetail?.img && (
  283. <Row className={styles.infoRow}>
  284. <Col className={styles.fontS24} span={4}>
  285. 预警图片
  286. </Col>
  287. <Col className={styles.fontS24}>
  288. <ReactZmage
  289. controller={{
  290. // 关闭按钮
  291. close: true,
  292. // 缩放按钮
  293. zoom: false,
  294. // 下载按钮
  295. download: false,
  296. // 翻页按钮
  297. flip: false,
  298. // 多页指示
  299. pagination: false,
  300. }}
  301. backdrop="rgba(255,255,255,0.5)"
  302. style={{ width: '350px' }}
  303. src={mandateDetail?.img}
  304. />
  305. </Col>
  306. </Row>
  307. )}
  308. {mandateDetail?.Files.length > 0 && (
  309. <Row className={styles.infoRow}>
  310. <Col className={styles.fontS24} span={4}>
  311. 截图
  312. </Col>
  313. <Col className={styles.fontS24}>
  314. <ReactZmage
  315. controller={{
  316. // 关闭按钮
  317. close: true,
  318. // 缩放按钮
  319. zoom: false,
  320. // 下载按钮
  321. download: false,
  322. // 翻页按钮
  323. flip: true,
  324. // 多页指示
  325. pagination: true,
  326. }}
  327. backdrop="rgba(255,255,255,0.5)"
  328. style={{ width: '350px' }}
  329. src={mandateDetail?.Files[0].url}
  330. set={mandateDetail?.Files.map((item) => {
  331. if (item) {
  332. return {
  333. src: item.url,
  334. };
  335. }
  336. return {};
  337. })}
  338. />
  339. </Col>
  340. </Row>
  341. )}
  342. <Row>
  343. <Col className={styles.fontS24} span={4}>
  344. 任务内容
  345. </Col>
  346. <Col className={styles.fontS24} span={20}>
  347. {/*{mandateDetail?.Detail}*/}
  348. <Table
  349. rowKey="key"
  350. columns={columnDef}
  351. dataSource={mandateTable}
  352. pagination={false}
  353. />
  354. </Col>
  355. </Row>
  356. </div>
  357. <div className={styles.relatedOrder}>
  358. <Collapse
  359. className={styles.collapseLabel}
  360. ghost
  361. expandIcon={({ isActive }) => (
  362. <UpOutlined
  363. style={{ color: '#5697e4' }}
  364. rotate={isActive ? 180 : 0}
  365. />
  366. )}
  367. items={handledWorkOrder}
  368. />
  369. </div>
  370. </div>
  371. </div>
  372. </PageContent>
  373. );
  374. }
  375. export default connect(
  376. ({
  377. taskUser,
  378. }: any): {
  379. userList: IUserType[];
  380. } => {
  381. return {
  382. userList: taskUser.userList,
  383. };
  384. },
  385. )(TaskDetail);