Result.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import SystemConst from '@/utils/const';
  2. import Token from '@/utils/token';
  3. import { downloadObject } from '@/utils/util';
  4. import { Col, Input, Modal, Row } from 'antd';
  5. import { EventSourcePolyfill } from 'event-source-polyfill';
  6. import { useEffect, useState } from 'react';
  7. import { DeviceInstance } from '@/pages/device/Instance/typings';
  8. interface Props {
  9. list: Partial<DeviceInstance>[];
  10. data: Partial<ResourceItem>;
  11. close: () => void;
  12. }
  13. const Publish = (props: Props) => {
  14. const [count, setCount] = useState<number>(0);
  15. const [countErr, setCountErr] = useState<number>(0);
  16. const [flag, setFlag] = useState<boolean>(true);
  17. const [errMessage, setErrMessage] = useState<any[]>([]);
  18. const getData = () => {
  19. let dt = 0;
  20. let et = 0;
  21. const errMessages: any[] = [];
  22. const _terms = {
  23. deviceId: (props.list || []).map((item) => item.id),
  24. // params: {
  25. name: props.data.name,
  26. targetId: props.data.targetId,
  27. targetType: props.data.targetType,
  28. category: props.data.category,
  29. metadata: encodeURIComponent(props.data?.metadata || ''),
  30. // }
  31. };
  32. const url = new URLSearchParams();
  33. Object.keys(_terms).forEach((key) => {
  34. if (Array.isArray(_terms[key]) && _terms[key].length) {
  35. _terms[key].map((item: string) => {
  36. url.append(key, item);
  37. });
  38. } else {
  39. url.append(key, _terms[key]);
  40. }
  41. });
  42. const source = new EventSourcePolyfill(
  43. `/${
  44. SystemConst.API_BASE
  45. }/edge/operations/entity-template-save/invoke/_batch?:X_Access_Token=${Token.get()}&${url.toString()}`,
  46. );
  47. source.onmessage = (e: any) => {
  48. const res = JSON.parse(e.data);
  49. if (res.successful) {
  50. dt += 1;
  51. setCount(dt);
  52. } else {
  53. et += 1;
  54. setCountErr(et);
  55. setFlag(false);
  56. if (errMessages.length <= 5) {
  57. errMessages.push({ ...res });
  58. setErrMessage([...errMessages]);
  59. }
  60. }
  61. };
  62. source.onerror = () => {
  63. source.close();
  64. };
  65. source.onopen = () => {};
  66. };
  67. useEffect(() => {
  68. getData();
  69. }, []);
  70. return (
  71. <Modal
  72. title={'下发结果'}
  73. maskClosable={false}
  74. open
  75. onCancel={props.close}
  76. onOk={props.close}
  77. width={900}
  78. >
  79. <Row gutter={24} style={{ marginBottom: 20 }}>
  80. <Col span={8}>
  81. <div>成功: {count}</div>
  82. <div>
  83. 失败: {countErr}
  84. {errMessage.length > 0 && (
  85. <a
  86. style={{ marginLeft: 20 }}
  87. onClick={() => {
  88. downloadObject(errMessage || '', '下发失败原因');
  89. }}
  90. >
  91. 下载
  92. </a>
  93. )}
  94. </div>
  95. </Col>
  96. <Col span={8}>下发设备数量: {props.list?.length || 0}</Col>
  97. <Col span={8}>已下发数量: {countErr + count}</Col>
  98. </Row>
  99. {!flag && (
  100. <div>
  101. <Input.TextArea rows={10} value={JSON.stringify(errMessage)} />
  102. </div>
  103. )}
  104. </Modal>
  105. );
  106. };
  107. export default Publish;