TaskDetail.tsx 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965
  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 [flodWorkOrder, setFlodWorkOrder] = useState(true);
  315. const [ignoreModalOpen, setIgnoreModalOpen] = useState(false);
  316. const [autoHandleModalOpen, setAutoHandleModalOpen] = useState(false);
  317. const [mandateSelectModalOpen, setMandateSelectModalOpen] = useState(false);
  318. const [selectedTask, setSelectedTask] = useState([]);
  319. const [dispatchModalOpen, setDispatchModalOpen] = useState(false);
  320. const columnDef: ColumnsType<IColumn> = [
  321. {
  322. title: '详情',
  323. dataIndex: 'detail',
  324. key: 'key',
  325. render: (value, _record, index) => {
  326. return (
  327. <div style={{ display: 'flex', alignItems: 'center' }}>
  328. <div style={{ width: '100%' }}>
  329. {index + 1}、{value.text}
  330. </div>
  331. </div>
  332. );
  333. },
  334. },
  335. ];
  336. const { refresh: refreshDetail } = useRequest(getMandateDetail, {
  337. defaultParams: [
  338. {
  339. mandate_id,
  340. project_id,
  341. },
  342. ],
  343. formatResult: async (result) => {
  344. const tempMandate: IMandateDetailType = {
  345. ...result.data,
  346. Status: MandateStatus.find((item) => item.value === result.data.Status),
  347. MandateClass: MandateClass.find(
  348. (item) => item.value === result.data.MandateClass,
  349. ),
  350. MandateType: MandateType.find(
  351. (item) => item.value === result.data.MandateType,
  352. ),
  353. ResponsiblePeople: userList.find(
  354. (item) => item.ID === result.data.ResponsiblePeople,
  355. ),
  356. CreateTime: dayjs(result.data.CreateTime).format('YYYY-MM-DD HH:mm'),
  357. };
  358. const workOrder = result.data.Records.map((item: IWorkOrderType) => {
  359. return {
  360. ...item,
  361. CreateTime: dayjs(item.CreateTime).format('YYYY-MM-DD HH:mm'),
  362. Status: OrderStatus.find((status) => status.value === item.Status),
  363. RecordType: OrderType.find((type) => type.value === item.RecordType),
  364. Responsible: userList.find((user) => user.ID === item.Responsible),
  365. };
  366. });
  367. const children = result.data.MandateChild;
  368. const tempOrder = [
  369. {
  370. key: '1',
  371. label: (
  372. <span style={{ color: '#ffffff', marginRight: '0.05rem' }}>
  373. 关联工单({workOrder.length})
  374. </span>
  375. ),
  376. children: workOrder.map((record: IWorkOrderType) => {
  377. return (
  378. <div key={record.Id} className={styles.workOrderCard}>
  379. <div className={styles.leftInfo}>
  380. <Row style={{ marginBottom: '0.15rem' }}>
  381. <Col className={styles.fontS30} span={10}>
  382. <>
  383. 工单类型:
  384. {record.RecordType?.label?.replace('工单', '')}
  385. </>
  386. </Col>
  387. <Col className={styles.fontS30} span={14}>
  388. 时间:{record.CreateTime || '-'}
  389. </Col>
  390. </Row>
  391. <Row>
  392. <Col className={styles.fontS30} span={10}>
  393. 工单状态:
  394. <span style={{ color: '#5697e4' }}>
  395. {typeof record.Status === 'number'
  396. ? '-'
  397. : record.Status?.label}
  398. </span>
  399. </Col>
  400. <Col className={styles.fontS30} span={14}>
  401. 工单负责人:
  402. {typeof record.Responsible === 'number'
  403. ? '-'
  404. : record.Responsible?.CName}
  405. </Col>
  406. </Row>
  407. </div>
  408. <Divider type="vertical" style={{ height: '0.4rem' }} />
  409. <div className={styles.rightButtonContainer}>
  410. <div
  411. className={styles.rightButton}
  412. style={{
  413. marginBottom: `${
  414. record.Status.value === 0 ? '0.15rem' : '0'
  415. }`,
  416. }}
  417. onClick={() => {
  418. if (typeof record.RecordType === 'number') {
  419. return;
  420. }
  421. // @ts-ignore
  422. goTaskOrder(
  423. record.Id,
  424. record.RecordType?.value,
  425. tempMandate?.MandateClass.value,
  426. );
  427. }}
  428. >
  429. 查看
  430. </div>
  431. {record?.Status?.value === 0 && (
  432. <div
  433. className={styles.rightButton}
  434. onClick={() => {
  435. setWithdrawOrderOpen(true);
  436. setClickedOrder(record);
  437. }}
  438. >
  439. 关闭
  440. </div>
  441. )}
  442. </div>
  443. </div>
  444. );
  445. }),
  446. },
  447. ];
  448. if (
  449. tempMandate.MandateClass &&
  450. tempMandate.ExtendId &&
  451. /* @ts-ignore */
  452. tempMandate.MandateClass.value === 7
  453. ) {
  454. const image = await getDiagnosticDetail(tempMandate.ExtendId);
  455. tempMandate.img = image.path;
  456. }
  457. setMandateDetail(tempMandate);
  458. setHandledWorkOrder(tempOrder);
  459. if (children && children.length) {
  460. setMandateChild(children);
  461. }
  462. },
  463. });
  464. const { run: runIgnore } = useRequest(ignoreTaskRequest, {
  465. manual: true,
  466. });
  467. const { run: runDispatch } = useRequest(dispatchOrder, {
  468. manual: true,
  469. });
  470. const { run: runAutomate } = useRequest(setTaskAutomation, {
  471. manual: true,
  472. });
  473. // 忽略
  474. const onIgnoreTaskConfirm = async (id: any, reason: string) => {
  475. const params = {
  476. Id: id,
  477. Status: 4,
  478. note: reason,
  479. };
  480. const result = await runIgnore(params);
  481. if (result) {
  482. return true;
  483. }
  484. };
  485. // 派单
  486. const onDispatchTaskConfirm = async (params: any) => {
  487. const result = await runDispatch(params);
  488. if (result) {
  489. return true;
  490. }
  491. };
  492. // 自动处理
  493. const onAutoHandleTaskConfirm = async (pw: any, mandate: any) => {
  494. const params = {
  495. mandate_id: mandate.Id,
  496. pw,
  497. };
  498. const result = runAutomate(params, mandate);
  499. if (result) {
  500. return true;
  501. }
  502. };
  503. // 打开指定弹窗
  504. const openSpecifiedModal = (type: any) => {
  505. switch (type) {
  506. case 'ignore':
  507. setIgnoreModalOpen(true);
  508. break;
  509. case 'manual':
  510. UnityAction.sendMsg('menuItem', '工艺监控');
  511. break;
  512. case 'auto':
  513. setAutoHandleModalOpen(true);
  514. break;
  515. case 'dispatch':
  516. setMandateSelectModalOpen(true);
  517. break;
  518. }
  519. };
  520. // 忽略
  521. const onIgnoreModalOk = async (reason: any) => {
  522. const result = await onIgnoreTaskConfirm(mandate_id, reason);
  523. if (result) {
  524. setIgnoreModalOpen(false);
  525. refreshDetail();
  526. }
  527. };
  528. const onAutoHandleModalOk = async (pw: any) => {
  529. const result = await onAutoHandleTaskConfirm(pw, mandateDetail);
  530. if (result) {
  531. setAutoHandleModalOpen(false);
  532. refreshDetail();
  533. }
  534. };
  535. const onMandateSelected = (records: any) => {
  536. // 打开派单Form弹窗将选中的任务进行派遣
  537. if (records?.length === 0) {
  538. message.warning('请先选择要派遣的任务');
  539. return;
  540. }
  541. setSelectedTask(records);
  542. setDispatchModalOpen(true);
  543. };
  544. const onDispatchModalOk = async (value: any) => {
  545. const params = {
  546. ...value,
  547. m_id: Number(mandate_id),
  548. mc_id: selectedTask.join(),
  549. plan_end_time: dayjs(value.plan_end_time).format('YYYY-MM-DD HH:mm:ss'),
  550. };
  551. if (params.type === 5) {
  552. if (params.mc_id.split(',').length > 1) {
  553. message.warning('加药工单不可批量派遣');
  554. return;
  555. }
  556. params.note = `${
  557. mandateChild
  558. .find((mandate) => mandate.Id === Number(params.mc_id))
  559. ?.Title?.split(':')[1] + ',请及时加药'
  560. }`;
  561. } else {
  562. params.note = mandateDetail?.Summary;
  563. }
  564. const result = await onDispatchTaskConfirm(params);
  565. if (result) {
  566. setMandateSelectModalOpen(false);
  567. setDispatchModalOpen(false);
  568. setFlodWorkOrder(false);
  569. refreshDetail();
  570. }
  571. };
  572. useEffect(() => {
  573. if (userList.length === 0) {
  574. dispatch({
  575. type: 'taskUser/fetchUserList',
  576. payload: { project_id },
  577. });
  578. }
  579. }, []);
  580. useEffect(() => {
  581. if (!mandateChild.length) {
  582. return;
  583. }
  584. if (mandateDetail?.MandateClass?.value === 2) {
  585. const dataSource = [];
  586. dataSource.push({
  587. detail: {
  588. text: `${mandateChild[0].Content}: ${mandateChild[0].Content}`,
  589. key: 'title',
  590. },
  591. });
  592. console.log(mandateChild[0]);
  593. setMandateTable(dataSource);
  594. return;
  595. }
  596. const dataSource = mandateChild.map((item, index) => {
  597. if (item.MandateClass === 3 || item.MandateClass === 6) {
  598. return {
  599. detail: {
  600. text: item.Content,
  601. key: item.Title + index + item.Content,
  602. },
  603. };
  604. }
  605. return {
  606. detail: {
  607. text: item.Title + item.Content,
  608. key: item.Title + index + item.Content,
  609. },
  610. };
  611. });
  612. setMandateTable(dataSource);
  613. }, [mandateChild]);
  614. const goTaskOrder = (
  615. orderID: number,
  616. orderType: number,
  617. mandateClass: number,
  618. ) => {
  619. navigate(
  620. `/task-manage/list/order-detail?project_id=${project_id}&order_id=${orderID}&order_type=${orderType}&mandate_class=${mandateClass}`,
  621. );
  622. };
  623. const withdrawOrderConfirm = async () => {
  624. if (!withdrawReason) {
  625. message.warning('请输入关闭理由');
  626. return;
  627. }
  628. const res = await withdrawOrderRequest({
  629. record_id: clickedOrder?.Id,
  630. note: withdrawReason,
  631. type: clickedOrder?.RecordType?.value,
  632. });
  633. if (res.code === 200) {
  634. message.success('关闭工单成功');
  635. setClickedOrder({});
  636. setWithdrawOrderOpen(false);
  637. refreshDetail();
  638. }
  639. };
  640. return (
  641. <PageContent closeable={false}>
  642. <PageTitle returnable>任务详情</PageTitle>
  643. <div className=" content-title">
  644. <div className={`${styles.cardContainer}`}>
  645. <div className={styles.normalInfo}>
  646. <Row className={styles.infoRow}>
  647. <Col span={14} className={styles.fontS30}>
  648. 时间:{mandateDetail?.CreateTime}
  649. </Col>
  650. {/*// @ts-ignore*/}
  651. <Col className={styles.fontS30}>
  652. {/*//@ts-ignore*/}
  653. 任务类别:{mandateDetail?.MandateClass?.label}
  654. </Col>
  655. </Row>
  656. <Row>
  657. <Col span={14} className={styles.fontS30}>
  658. {/*//@ts-ignore*/}
  659. 任务状态:{mandateDetail?.Status?.label}
  660. </Col>
  661. <Col className={styles.fontS30}>
  662. {/*// @ts-ignore*/}
  663. 任务负责人:{mandateDetail?.ResponsiblePeople?.CName}
  664. </Col>
  665. </Row>
  666. </div>
  667. <div className={styles.detailInfo}>
  668. <Row className={styles.infoRow}>
  669. <Col
  670. className={styles.fontS30}
  671. span={4}
  672. style={{ fontWeight: 600 }}
  673. >
  674. 任务总结
  675. </Col>
  676. <Col
  677. span={20}
  678. className={styles.fontS30}
  679. style={{ color: 'rgba(97, 93, 93, 1)' }}
  680. >
  681. {mandateDetail?.Summary ||
  682. '根据水质相关数据.建议您调节以下参数,水厂运行可达较优状态'}
  683. </Col>
  684. </Row>
  685. {mandateDetail?.img && (
  686. <Row className={styles.infoRow}>
  687. <Col
  688. className={styles.fontS30}
  689. span={4}
  690. style={{ fontWeight: 600 }}
  691. >
  692. 预警图片
  693. </Col>
  694. <Col className={styles.fontS30}>
  695. <ReactZmage
  696. controller={{
  697. // 关闭按钮
  698. close: true,
  699. // 缩放按钮
  700. zoom: false,
  701. // 下载按钮
  702. download: false,
  703. // 翻页按钮
  704. flip: false,
  705. // 多页指示
  706. pagination: false,
  707. }}
  708. backdrop="rgba(255,255,255,0.5)"
  709. style={{ width: '3.5rem' }}
  710. src={mandateDetail?.img}
  711. />
  712. </Col>
  713. </Row>
  714. )}
  715. {mandateDetail?.Files !== undefined &&
  716. mandateDetail?.Files?.length > 0 && (
  717. <Row className={styles.infoRow}>
  718. <Col
  719. className={styles.fontS30}
  720. span={4}
  721. style={{ fontWeight: 600 }}
  722. >
  723. 截图
  724. </Col>
  725. <Col className={styles.fontS30}>
  726. <ReactZmage
  727. controller={{
  728. // 关闭按钮
  729. close: true,
  730. // 缩放按钮
  731. zoom: false,
  732. // 下载按钮
  733. download: false,
  734. // 翻页按钮
  735. flip: true,
  736. // 多页指示
  737. pagination: true,
  738. }}
  739. backdrop="rgba(255,255,255,0.5)"
  740. style={{ width: '3.5rem' }}
  741. src={mandateDetail?.Files[0].url}
  742. set={mandateDetail?.Files.map((item) => {
  743. if (item) {
  744. return {
  745. src: item.url,
  746. };
  747. }
  748. return {};
  749. })}
  750. />
  751. </Col>
  752. </Row>
  753. )}
  754. <Row className={styles.infoRow}>
  755. <Col
  756. className={styles.fontS30}
  757. span={4}
  758. style={{ fontWeight: 600 }}
  759. >
  760. 任务内容
  761. </Col>
  762. <Col className={styles.fontS30} span={20}>
  763. {/*{mandateDetail?.Detail}*/}
  764. <Table
  765. className={styles.taskTable}
  766. rowKey="key"
  767. columns={columnDef}
  768. dataSource={mandateTable}
  769. pagination={false}
  770. />
  771. </Col>
  772. </Row>
  773. <Row justify="end" gutter={10}>
  774. <Col>
  775. {mandateDetail?.Status?.value === 0 && (
  776. <Button
  777. className={styles.footerBtn}
  778. shape="round"
  779. onClick={() => {
  780. openSpecifiedModal('ignore');
  781. }}
  782. >
  783. 忽略
  784. </Button>
  785. )}
  786. </Col>
  787. <Col>
  788. {(mandateDetail?.MandateClass?.value === 1 ||
  789. mandateDetail?.MandateClass?.value === 2) &&
  790. mandateDetail?.Status?.value === 0 && (
  791. <Button
  792. className={styles.footerBtn}
  793. shape="round"
  794. onClick={() => {
  795. openSpecifiedModal('manual');
  796. }}
  797. >
  798. 手动处理
  799. </Button>
  800. )}
  801. </Col>
  802. <Col>
  803. {(mandateDetail?.MandateClass?.value === 1 ||
  804. mandateDetail?.MandateClass?.value === 2) &&
  805. mandateDetail?.Status?.value === 0 && (
  806. <Button
  807. className={styles.footerBtn}
  808. shape="round"
  809. onClick={() => {
  810. openSpecifiedModal('auto');
  811. }}
  812. >
  813. 自动处理
  814. </Button>
  815. )}
  816. </Col>
  817. <Col>
  818. {mandateChild?.filter((item) => item.Status === 0)?.length >
  819. 0 && (
  820. <Button
  821. className={styles.footerBtn}
  822. shape="round"
  823. onClick={() => {
  824. openSpecifiedModal('dispatch');
  825. }}
  826. >
  827. 派单
  828. </Button>
  829. )}
  830. </Col>
  831. </Row>
  832. </div>
  833. <div className={styles.relatedOrder}>
  834. <Collapse
  835. className={styles.collapseLabel}
  836. activeKey={flodWorkOrder ? '' : '1'}
  837. ghost
  838. expandIcon={({ isActive }) => (
  839. <CaretDownFilled
  840. style={{ color: '#ffffff' }}
  841. rotate={isActive ? 180 : 0}
  842. />
  843. )}
  844. items={handledWorkOrder}
  845. onChange={() => {
  846. setFlodWorkOrder(!flodWorkOrder);
  847. }}
  848. />
  849. </div>
  850. </div>
  851. </div>
  852. <Modal
  853. className={styles.handleModal}
  854. title="关闭工单"
  855. open={withdrawOrderOpen}
  856. onCancel={() => {
  857. setWithdrawOrderOpen(false);
  858. }}
  859. onOk={withdrawOrderConfirm}
  860. >
  861. <Form>
  862. <Form.Item label="关闭原因">
  863. <Input
  864. onChange={(e) => {
  865. setWithdrawReason(e.target.value);
  866. }}
  867. />
  868. </Form.Item>
  869. </Form>
  870. </Modal>
  871. <ConfigProvider locale={zhCN}>
  872. <IgnoreTaskModal
  873. open={ignoreModalOpen}
  874. onCancel={() => setIgnoreModalOpen(false)}
  875. onOk={onIgnoreModalOk}
  876. />
  877. <AutoHandleModal
  878. open={autoHandleModalOpen}
  879. onCancel={() => setAutoHandleModalOpen(false)}
  880. onOk={onAutoHandleModalOk}
  881. />
  882. <MandateSelectModal
  883. open={mandateSelectModalOpen}
  884. onCancel={() => setMandateSelectModalOpen(false)}
  885. selectedTask={selectedTask}
  886. setSelectedTask={setSelectedTask}
  887. onOk={onMandateSelected}
  888. list={mandateChild}
  889. />
  890. <DispatchTaskModal
  891. open={dispatchModalOpen}
  892. userList={userList}
  893. onCancel={() => {
  894. setDispatchModalOpen(false);
  895. }}
  896. onOK={onDispatchModalOk}
  897. />
  898. </ConfigProvider>
  899. </PageContent>
  900. );
  901. }
  902. export default connect(
  903. ({
  904. taskUser,
  905. }: any): {
  906. userList: IUserType[];
  907. } => {
  908. return {
  909. userList: taskUser.userList,
  910. };
  911. },
  912. )(TaskDetail);