TaskDetail.tsx 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945
  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. ignoreReason,
  19. } from '@/pages/TaskManage/constent';
  20. import {
  21. dispatchOrder,
  22. getDiagnosticDetail,
  23. getMandateDetail,
  24. ignoreTaskRequest,
  25. setTaskAutomation,
  26. withdrawOrderRequest,
  27. } from '@/services/TaskManage';
  28. import { useLocation } from '@@/exports';
  29. import { CaretDownFilled } from '@ant-design/icons';
  30. import { connect, useRequest } from '@umijs/max';
  31. import {
  32. Button,
  33. Checkbox,
  34. Col,
  35. Collapse,
  36. CollapseProps,
  37. ConfigProvider,
  38. DatePicker,
  39. Divider,
  40. Form,
  41. Input,
  42. Modal,
  43. Row,
  44. Select,
  45. Table,
  46. message,
  47. } from 'antd';
  48. import type { ColumnsType } from 'antd/es/table';
  49. import dayjs from 'dayjs';
  50. import { useEffect, useState } from 'react';
  51. // @ts-ignore
  52. import ReactZmage from 'react-zmage';
  53. import { useNavigate } from 'umi';
  54. import zhCN from 'antd/es/locale/zh_CN';
  55. import { UnityAction } from '@/utils/utils';
  56. import styles from './taskDetail.less';
  57. const IgnoreTaskModal = (params: any) => {
  58. const { open, onCancel, onOk } = params;
  59. const [ignoreReasonText, setIgnoreReasonText] = useState('');
  60. const [selectedReason, setSelectedReason] = useState<any>({});
  61. const [showInput, setShowInput] = useState(false);
  62. const onReasonChange = (reason: any, option: any) => {
  63. if (reason !== 4) {
  64. setSelectedReason(option);
  65. setShowInput(false);
  66. } else {
  67. setShowInput(true);
  68. }
  69. };
  70. const onReasonTextChange = (e: any) => {
  71. setIgnoreReasonText(e.target.value);
  72. };
  73. const handleCancle = () => {
  74. setSelectedReason({});
  75. setIgnoreReasonText('');
  76. setShowInput(false);
  77. onCancel();
  78. };
  79. const confirmIgnore = () => {
  80. if (showInput) {
  81. if (!ignoreReasonText.length) {
  82. message.warning('请输入忽略理由');
  83. } else {
  84. onOk(ignoreReasonText);
  85. }
  86. } else {
  87. if (selectedReason?.label) {
  88. onOk(selectedReason.label);
  89. } else {
  90. message.warning('请选择忽略理由');
  91. }
  92. }
  93. };
  94. return (
  95. <Modal
  96. className={styles.handleModal}
  97. title="忽略"
  98. maskStyle={{ borderRadius: 0 }}
  99. open={open}
  100. onCancel={handleCancle}
  101. onOk={confirmIgnore}
  102. width="60%"
  103. destroyOnClose
  104. >
  105. <div style={{ padding: '0.15rem' }}>
  106. <Form>
  107. <Form.Item label="忽略理由:">
  108. <Select
  109. className={styles.fontS28}
  110. options={ignoreReason}
  111. onChange={onReasonChange}
  112. allowClear
  113. />
  114. </Form.Item>
  115. {showInput && (
  116. <Form.Item label="输入理由:">
  117. <Input placeholder="请输入理由" onChange={onReasonTextChange} />
  118. </Form.Item>
  119. )}
  120. </Form>
  121. </div>
  122. </Modal>
  123. );
  124. };
  125. const AutoHandleModal = (props: any) => {
  126. const { open, onCancel, onOk } = props;
  127. const [automation, setAutomation] = useState<string>();
  128. const confirmAutoHandle = () => {
  129. if (automation && automation.length) {
  130. onOk(automation);
  131. } else {
  132. message.warning('请输入口令');
  133. }
  134. };
  135. return (
  136. <Modal
  137. className={styles.handleModal}
  138. title="自动处理"
  139. maskStyle={{ borderRadius: 0 }}
  140. open={open}
  141. onCancel={onCancel}
  142. onOk={confirmAutoHandle}
  143. width="60%"
  144. destroyOnClose
  145. >
  146. <div style={{ padding: '0.15rem' }}>
  147. <Form>
  148. <Form.Item label="用户口令:">
  149. {
  150. <Input
  151. autoFocus
  152. style={{ width: '100%' }}
  153. placeholder="请输入口令"
  154. onChange={(e) => {
  155. setAutomation(e.target.value);
  156. }}
  157. />
  158. }
  159. </Form.Item>
  160. </Form>
  161. </div>
  162. </Modal>
  163. );
  164. };
  165. const MandateSelectModal = (props: any) => {
  166. const { open, onCancel, list, onOk, selectedTask, setSelectedTask } = props;
  167. const [checkOptions, setCheckOptions] = useState([]);
  168. useEffect(() => {
  169. setCheckOptions(
  170. list.map((mandate: any, index: number) => {
  171. return {
  172. label: (
  173. <Row className={styles.taskCheckItem}>
  174. <span
  175. style={{
  176. textDecoration: `${
  177. mandate.Status === 0 ? '' : 'line-through'
  178. }`,
  179. }}
  180. >
  181. {`${index + 1}. ${mandate.Title}为${mandate.Content}`}
  182. </span>
  183. </Row>
  184. ),
  185. value: mandate.Id,
  186. disabled: mandate.Status !== 0,
  187. };
  188. }),
  189. );
  190. }, [list]);
  191. const onDispatchClick = () => {
  192. onOk(selectedTask);
  193. };
  194. const handleCheckChange = (checkedValue: any) => {
  195. setSelectedTask(checkedValue);
  196. };
  197. return (
  198. <Modal
  199. className={styles.handleModal}
  200. title="选择任务"
  201. open={open}
  202. onCancel={onCancel}
  203. width={'80%'}
  204. destroyOnClose
  205. footer={[
  206. <Button key="back" onClick={onCancel}>
  207. 取消
  208. </Button>,
  209. <Button key="dispatch" type="primary" onClick={onDispatchClick}>
  210. 派单
  211. </Button>,
  212. ]}
  213. >
  214. <Checkbox.Group
  215. className={styles.taskCheckBox}
  216. options={checkOptions}
  217. onChange={handleCheckChange}
  218. />
  219. </Modal>
  220. );
  221. };
  222. const DispatchTaskModal = (props: any) => {
  223. const { open, onCancel, onOK, userList } = props;
  224. const [form] = Form.useForm();
  225. useEffect(() => {
  226. if (!open) {
  227. form.resetFields();
  228. }
  229. }, [open]);
  230. const handleDispatchConfirm = async () => {
  231. const value = await form.validateFields().catch((err) =>
  232. err.errorFields.forEach((item) => {
  233. message.error(item.errors);
  234. }),
  235. );
  236. if (!value) {
  237. return;
  238. }
  239. onOK(value);
  240. };
  241. return (
  242. <Modal
  243. className={styles.handleModal}
  244. title="派遣任务"
  245. onCancel={onCancel}
  246. open={open}
  247. destroyOnClose
  248. width="65%"
  249. onOk={handleDispatchConfirm}
  250. >
  251. <Form
  252. form={form}
  253. layout="horizontal"
  254. labelCol={{ span: 8 }}
  255. wrapperCol={{ span: 14 }}
  256. >
  257. <Form.Item
  258. label="工单类型"
  259. name="type"
  260. rules={[{ required: true, message: '请选择工单类型' }]}
  261. >
  262. <Select options={OrderType} placeholder="请选择工单类型" />
  263. </Form.Item>
  264. <Form.Item
  265. label="操作人"
  266. name="operator_id"
  267. rules={[{ required: true, message: '请选择操作人' }]}
  268. >
  269. <Select
  270. options={userList.map((item) => {
  271. return {
  272. label: item.CName,
  273. value: item.ID,
  274. };
  275. })}
  276. placeholder="请选择操作人"
  277. />
  278. </Form.Item>
  279. <Form.Item
  280. label="计划完成时间"
  281. name="plan_end_time"
  282. rules={[{ required: true, message: '请选择完成时间' }]}
  283. >
  284. <DatePicker
  285. inputReadOnly
  286. style={{ width: '100%' }}
  287. placeholder="请选择完成时间"
  288. />
  289. </Form.Item>
  290. </Form>
  291. </Modal>
  292. );
  293. };
  294. interface IPropsType {
  295. userList: IUserType[];
  296. dispatch: (args: { type: string; payload: object }) => void;
  297. }
  298. function TaskDetail(props: IPropsType) {
  299. const { userList, dispatch } = props;
  300. const location = useLocation();
  301. const queryParams = new URLSearchParams(location.search);
  302. const project_id = Number(queryParams.get('project_id'));
  303. const mandate_id = Number(queryParams.get('mandate_id'));
  304. const navigate = useNavigate();
  305. const [mandateDetail, setMandateDetail] = useState<IMandateDetailType>();
  306. const [mandateChild, setMandateChild] = useState<IMandateChildTypes[]>([]);
  307. const [handledWorkOrder, setHandledWorkOrder] = useState<
  308. CollapseProps['items']
  309. >([]);
  310. const [mandateTable, setMandateTable] = useState<IColumn[]>([]);
  311. const [withdrawReason, setWithdrawReason] = useState('');
  312. const [withdrawOrderOpen, setWithdrawOrderOpen] = useState(false);
  313. const [clickedOrder, setClickedOrder] = useState<any>({});
  314. const [ignoreModalOpen, setIgnoreModalOpen] = useState(false);
  315. const [autoHandleModalOpen, setAutoHandleModalOpen] = useState(false);
  316. const [mandateSelectModalOpen, setMandateSelectModalOpen] = useState(false);
  317. const [selectedTask, setSelectedTask] = useState([]);
  318. const [dispatchModalOpen, setDispatchModalOpen] = useState(false);
  319. const columnDef: ColumnsType<IColumn> = [
  320. {
  321. title: '详情',
  322. dataIndex: 'detail',
  323. key: 'key',
  324. render: (value, _record, index) => {
  325. return (
  326. <div style={{ display: 'flex', alignItems: 'center' }}>
  327. <div style={{ width: '100%' }}>
  328. {index + 1}、{value.text}
  329. </div>
  330. </div>
  331. );
  332. },
  333. },
  334. ];
  335. const { refresh: refreshDetail } = useRequest(getMandateDetail, {
  336. defaultParams: [
  337. {
  338. mandate_id,
  339. project_id,
  340. },
  341. ],
  342. formatResult: async (result) => {
  343. const tempMandate: IMandateDetailType = {
  344. ...result.data,
  345. Status: MandateStatus.find((item) => item.value === result.data.Status),
  346. MandateClass: MandateClass.find(
  347. (item) => item.value === result.data.MandateClass,
  348. ),
  349. MandateType: MandateType.find(
  350. (item) => item.value === result.data.MandateType,
  351. ),
  352. ResponsiblePeople: userList.find(
  353. (item) => item.ID === result.data.ResponsiblePeople,
  354. ),
  355. CreateTime: dayjs(result.data.CreateTime).format('YYYY-MM-DD HH:mm'),
  356. };
  357. const workOrder = result.data.Records.map((item: IWorkOrderType) => {
  358. return {
  359. ...item,
  360. CreateTime: dayjs(item.CreateTime).format('YYYY-MM-DD HH:mm'),
  361. Status: OrderStatus.find((status) => status.value === item.Status),
  362. RecordType: OrderType.find((type) => type.value === item.RecordType),
  363. Responsible: userList.find((user) => user.ID === item.Responsible),
  364. };
  365. });
  366. const children = result.data.MandateChild;
  367. const tempOrder = [
  368. {
  369. key: '1',
  370. label: (
  371. <span style={{ color: '#ffffff', marginRight: '0.05rem' }}>
  372. 关联工单({workOrder.length})
  373. </span>
  374. ),
  375. children: workOrder.map((record: IWorkOrderType) => {
  376. return (
  377. <div key={record.Id} className={styles.workOrderCard}>
  378. <div className={styles.leftInfo}>
  379. <Row style={{ marginBottom: '0.15rem' }}>
  380. <Col className={styles.fontS30} span={10}>
  381. <>
  382. 工单类型:
  383. {record.RecordType?.label?.replace('工单', '')}
  384. </>
  385. </Col>
  386. <Col className={styles.fontS30} span={14}>
  387. 时间:{record.CreateTime || '-'}
  388. </Col>
  389. </Row>
  390. <Row>
  391. <Col className={styles.fontS30} span={10}>
  392. 工单状态:
  393. <span style={{ color: '#5697e4' }}>
  394. {typeof record.Status === 'number'
  395. ? '-'
  396. : record.Status?.label}
  397. </span>
  398. </Col>
  399. <Col className={styles.fontS30} span={14}>
  400. 工单负责人:
  401. {typeof record.Responsible === 'number'
  402. ? '-'
  403. : record.Responsible?.CName}
  404. </Col>
  405. </Row>
  406. </div>
  407. <Divider type="vertical" style={{ height: '0.4rem' }} />
  408. <div className={styles.rightButtonContainer}>
  409. <div
  410. className={styles.rightButton}
  411. style={{
  412. marginBottom: `${
  413. record.Status.value === 0 ? '0.15rem' : '0'
  414. }`,
  415. }}
  416. onClick={() => {
  417. if (typeof record.RecordType === 'number') {
  418. return;
  419. }
  420. // @ts-ignore
  421. goTaskOrder(
  422. record.Id,
  423. record.RecordType?.value,
  424. tempMandate?.MandateClass.value,
  425. );
  426. }}
  427. >
  428. 查看
  429. </div>
  430. {record?.Status?.value === 0 && (
  431. <div
  432. className={styles.rightButton}
  433. onClick={() => {
  434. setWithdrawOrderOpen(true);
  435. setClickedOrder(record);
  436. }}
  437. >
  438. 关闭
  439. </div>
  440. )}
  441. </div>
  442. </div>
  443. );
  444. }),
  445. },
  446. ];
  447. if (
  448. tempMandate.MandateClass &&
  449. tempMandate.ExtendId &&
  450. /* @ts-ignore */
  451. tempMandate.MandateClass.value === 7
  452. ) {
  453. const image = await getDiagnosticDetail(tempMandate.ExtendId);
  454. tempMandate.img = image.path;
  455. }
  456. setMandateDetail(tempMandate);
  457. setHandledWorkOrder(tempOrder);
  458. if (children && children.length) {
  459. setMandateChild(children);
  460. }
  461. },
  462. });
  463. const { run: runIgnore } = useRequest(ignoreTaskRequest, {
  464. manual: true,
  465. });
  466. const { run: runDispatch } = useRequest(dispatchOrder, {
  467. manual: true,
  468. });
  469. const { run: runAutomate } = useRequest(setTaskAutomation, {
  470. manual: true,
  471. });
  472. // 忽略
  473. const onIgnoreTaskConfirm = async (id: any, reason: string) => {
  474. const params = {
  475. Id: id,
  476. Status: 4,
  477. note: reason,
  478. };
  479. const result = await runIgnore(params);
  480. if (result) {
  481. return true;
  482. }
  483. };
  484. // 派单
  485. const onDispatchTaskConfirm = async (params: any) => {
  486. const result = await runDispatch(params);
  487. if (result) {
  488. return true;
  489. }
  490. };
  491. // 自动处理
  492. const onAutoHandleTaskConfirm = async (pw: any, mandate: any) => {
  493. const params = {
  494. mandate_id: mandate.Id,
  495. pw,
  496. };
  497. const result = runAutomate(params, mandate);
  498. if (result) {
  499. return true;
  500. }
  501. };
  502. // 打开指定弹窗
  503. const openSpecifiedModal = (type: any) => {
  504. switch (type) {
  505. case 'ignore':
  506. setIgnoreModalOpen(true);
  507. break;
  508. case 'manual':
  509. UnityAction.sendMsg('menuItem', '工艺监控');
  510. break;
  511. case 'auto':
  512. setAutoHandleModalOpen(true);
  513. break;
  514. case 'dispatch':
  515. setMandateSelectModalOpen(true);
  516. break;
  517. }
  518. };
  519. // 忽略
  520. const onIgnoreModalOk = async (reason: any) => {
  521. const result = await onIgnoreTaskConfirm(mandate_id, reason);
  522. if (result) {
  523. setIgnoreModalOpen(false);
  524. refreshDetail();
  525. }
  526. };
  527. const onAutoHandleModalOk = async (pw: any) => {
  528. const result = await onAutoHandleTaskConfirm(pw, mandateDetail);
  529. if (result) {
  530. setAutoHandleModalOpen(false);
  531. refreshDetail();
  532. }
  533. };
  534. const onMandateSelected = (records: any) => {
  535. // 打开派单Form弹窗将选中的任务进行派遣
  536. if (records?.length === 0) {
  537. message.warning('请先选择要派遣的任务');
  538. return;
  539. }
  540. setSelectedTask(records);
  541. setDispatchModalOpen(true);
  542. };
  543. const onDispatchModalOk = async (value: any) => {
  544. const params = {
  545. ...value,
  546. m_id: Number(mandate_id),
  547. mc_id: selectedTask.join(),
  548. plan_end_time: dayjs(value.plan_end_time).format('YYYY-MM-DD HH:mm:ss'),
  549. };
  550. if (params.type === 5) {
  551. if (params.mc_id.split(',').length > 1) {
  552. message.warning('加药工单不可批量派遣');
  553. return;
  554. }
  555. params.note = `${
  556. mandateChild
  557. .find((mandate) => mandate.Id === Number(params.mc_id))
  558. ?.Title?.split(':')[1] + ',请及时加药'
  559. }`;
  560. } else {
  561. params.note = mandateDetail?.Summary;
  562. }
  563. const result = await onDispatchTaskConfirm(params);
  564. if (result) {
  565. setDispatchModalOpen(false);
  566. refreshDetail();
  567. }
  568. };
  569. useEffect(() => {
  570. if (userList.length === 0) {
  571. dispatch({
  572. type: 'taskUser/fetchUserList',
  573. payload: { project_id },
  574. });
  575. }
  576. }, []);
  577. useEffect(() => {
  578. if (!mandateChild.length) {
  579. return;
  580. }
  581. if (mandateDetail?.MandateClass?.value === 2) {
  582. const dataSource = [];
  583. dataSource.push({
  584. detail: {
  585. text: `${mandateChild[0].Content}: ${mandateChild[0].Content}`,
  586. key: 'title',
  587. },
  588. });
  589. console.log(mandateChild[0]);
  590. setMandateTable(dataSource);
  591. return;
  592. }
  593. const dataSource = mandateChild.map((item, index) => {
  594. if (item.MandateClass === 3 || item.MandateClass === 6) {
  595. return {
  596. detail: {
  597. text: item.Content,
  598. key: item.Title + index + item.Content,
  599. },
  600. };
  601. }
  602. return {
  603. detail: {
  604. text: item.Title + item.Content,
  605. key: item.Title + index + item.Content,
  606. },
  607. };
  608. });
  609. setMandateTable(dataSource);
  610. }, [mandateChild]);
  611. const goTaskOrder = (
  612. orderID: number,
  613. orderType: number,
  614. mandateClass: number,
  615. ) => {
  616. navigate(
  617. `/task-manage/list/order-detail?project_id=${project_id}&order_id=${orderID}&order_type=${orderType}&mandate_class=${mandateClass}`,
  618. );
  619. };
  620. const withdrawOrderConfirm = async () => {
  621. if (!withdrawReason) {
  622. message.warning('请输入关闭理由');
  623. return;
  624. }
  625. const res = await withdrawOrderRequest({
  626. record_id: clickedOrder?.Id,
  627. note: withdrawReason,
  628. type: clickedOrder?.RecordType?.value,
  629. });
  630. if (res.code === 200) {
  631. message.success('关闭工单成功');
  632. setClickedOrder({});
  633. setWithdrawOrderOpen(false);
  634. refreshDetail();
  635. }
  636. };
  637. return (
  638. <PageContent closeable={false}>
  639. <PageTitle returnable>任务详情</PageTitle>
  640. <div className=" content-title">
  641. <div className={`${styles.cardContainer}`}>
  642. <div className={styles.normalInfo}>
  643. <Row className={styles.infoRow}>
  644. <Col span={14} className={styles.fontS30}>
  645. 时间:{mandateDetail?.CreateTime}
  646. </Col>
  647. {/*// @ts-ignore*/}
  648. <Col className={styles.fontS30}>
  649. {/*//@ts-ignore*/}
  650. 任务类别:{mandateDetail?.MandateClass?.label}
  651. </Col>
  652. </Row>
  653. <Row>
  654. <Col span={14} className={styles.fontS30}>
  655. {/*//@ts-ignore*/}
  656. 任务状态:{mandateDetail?.Status?.label}
  657. </Col>
  658. <Col className={styles.fontS30}>
  659. {/*// @ts-ignore*/}
  660. 任务负责人:{mandateDetail?.ResponsiblePeople?.CName}
  661. </Col>
  662. </Row>
  663. </div>
  664. <div className={styles.detailInfo}>
  665. <Row className={styles.infoRow}>
  666. <Col
  667. className={styles.fontS30}
  668. span={4}
  669. style={{ fontWeight: 600 }}
  670. >
  671. 任务总结
  672. </Col>
  673. <Col
  674. span={20}
  675. className={styles.fontS30}
  676. style={{ color: 'rgba(97, 93, 93, 1)' }}
  677. >
  678. {mandateDetail?.Summary ||
  679. '根据水质相关数据.建议您调节以下参数,水厂运行可达较优状态'}
  680. </Col>
  681. </Row>
  682. {mandateDetail?.img && (
  683. <Row className={styles.infoRow}>
  684. <Col
  685. className={styles.fontS30}
  686. span={4}
  687. style={{ fontWeight: 600 }}
  688. >
  689. 预警图片
  690. </Col>
  691. <Col className={styles.fontS30}>
  692. <ReactZmage
  693. controller={{
  694. // 关闭按钮
  695. close: true,
  696. // 缩放按钮
  697. zoom: false,
  698. // 下载按钮
  699. download: false,
  700. // 翻页按钮
  701. flip: false,
  702. // 多页指示
  703. pagination: false,
  704. }}
  705. backdrop="rgba(255,255,255,0.5)"
  706. style={{ width: '3.5rem' }}
  707. src={mandateDetail?.img}
  708. />
  709. </Col>
  710. </Row>
  711. )}
  712. {mandateDetail?.Files !== undefined &&
  713. mandateDetail?.Files?.length > 0 && (
  714. <Row className={styles.infoRow}>
  715. <Col
  716. className={styles.fontS30}
  717. span={4}
  718. style={{ fontWeight: 600 }}
  719. >
  720. 截图
  721. </Col>
  722. <Col className={styles.fontS30}>
  723. <ReactZmage
  724. controller={{
  725. // 关闭按钮
  726. close: true,
  727. // 缩放按钮
  728. zoom: false,
  729. // 下载按钮
  730. download: false,
  731. // 翻页按钮
  732. flip: true,
  733. // 多页指示
  734. pagination: true,
  735. }}
  736. backdrop="rgba(255,255,255,0.5)"
  737. style={{ width: '3.5rem' }}
  738. src={mandateDetail?.Files[0].url}
  739. set={mandateDetail?.Files.map((item) => {
  740. if (item) {
  741. return {
  742. src: item.url,
  743. };
  744. }
  745. return {};
  746. })}
  747. />
  748. </Col>
  749. </Row>
  750. )}
  751. <Row className={styles.infoRow}>
  752. <Col
  753. className={styles.fontS30}
  754. span={4}
  755. style={{ fontWeight: 600 }}
  756. >
  757. 任务内容
  758. </Col>
  759. <Col className={styles.fontS30} span={20}>
  760. {/*{mandateDetail?.Detail}*/}
  761. <Table
  762. className={styles.taskTable}
  763. rowKey="key"
  764. columns={columnDef}
  765. dataSource={mandateTable}
  766. pagination={false}
  767. />
  768. </Col>
  769. </Row>
  770. <Row justify="end" gutter={10}>
  771. <Col>
  772. <Button
  773. className={styles.footerBtn}
  774. shape="round"
  775. onClick={() => {
  776. openSpecifiedModal('ignore');
  777. }}
  778. >
  779. 忽略
  780. </Button>
  781. </Col>
  782. <Col>
  783. <Button
  784. className={styles.footerBtn}
  785. shape="round"
  786. onClick={() => {
  787. openSpecifiedModal('manual');
  788. }}
  789. >
  790. 手动处理
  791. </Button>
  792. </Col>
  793. <Col>
  794. <Button
  795. className={styles.footerBtn}
  796. shape="round"
  797. onClick={() => {
  798. openSpecifiedModal('auto');
  799. }}
  800. >
  801. 自动处理
  802. </Button>
  803. </Col>
  804. <Col>
  805. <Button
  806. className={styles.footerBtn}
  807. shape="round"
  808. onClick={() => {
  809. openSpecifiedModal('dispatch');
  810. }}
  811. >
  812. 派单
  813. </Button>
  814. </Col>
  815. </Row>
  816. </div>
  817. <div className={styles.relatedOrder}>
  818. <Collapse
  819. className={styles.collapseLabel}
  820. ghost
  821. expandIcon={({ isActive }) => (
  822. <CaretDownFilled
  823. style={{ color: '#ffffff' }}
  824. rotate={isActive ? 180 : 0}
  825. />
  826. )}
  827. items={handledWorkOrder}
  828. />
  829. </div>
  830. </div>
  831. </div>
  832. <Modal
  833. className={styles.handleModal}
  834. title="关闭工单"
  835. open={withdrawOrderOpen}
  836. onCancel={() => {
  837. setWithdrawOrderOpen(false);
  838. }}
  839. onOk={withdrawOrderConfirm}
  840. >
  841. <Form>
  842. <Form.Item label="关闭原因">
  843. <Input
  844. onChange={(e) => {
  845. setWithdrawReason(e.target.value);
  846. }}
  847. />
  848. </Form.Item>
  849. </Form>
  850. </Modal>
  851. <ConfigProvider locale={zhCN}>
  852. <IgnoreTaskModal
  853. open={ignoreModalOpen}
  854. onCancel={() => setIgnoreModalOpen(false)}
  855. onOk={onIgnoreModalOk}
  856. />
  857. <AutoHandleModal
  858. open={autoHandleModalOpen}
  859. onCancel={() => setAutoHandleModalOpen(false)}
  860. onOk={onAutoHandleModalOk}
  861. />
  862. <MandateSelectModal
  863. open={mandateSelectModalOpen}
  864. onCancel={() => setMandateSelectModalOpen(false)}
  865. selectedTask={selectedTask}
  866. setSelectedTask={setSelectedTask}
  867. onOk={onMandateSelected}
  868. list={mandateChild}
  869. />
  870. <DispatchTaskModal
  871. open={dispatchModalOpen}
  872. userList={userList}
  873. onCancel={() => {
  874. setDispatchModalOpen(false);
  875. }}
  876. onOK={onDispatchModalOk}
  877. />
  878. </ConfigProvider>
  879. </PageContent>
  880. );
  881. }
  882. export default connect(
  883. ({
  884. taskUser,
  885. }: any): {
  886. userList: IUserType[];
  887. } => {
  888. return {
  889. userList: taskUser.userList,
  890. };
  891. },
  892. )(TaskDetail);