index.tsx 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. import { PageContainer } from '@ant-design/pro-layout';
  2. import SearchComponent from '@/components/SearchComponent';
  3. import type { ActionType, ProColumns } from '@jetlinks/pro-table';
  4. import { PermissionButton } from '@/components';
  5. import {
  6. CloseCircleOutlined,
  7. DeleteOutlined,
  8. EditOutlined,
  9. LikeOutlined,
  10. PlayCircleOutlined,
  11. PlusOutlined,
  12. } from '@ant-design/icons';
  13. import { useIntl } from '@@/plugin-locale/localeExports';
  14. import { useEffect, useRef, useState } from 'react';
  15. import { Badge, Space, Tooltip } from 'antd';
  16. import ProTableCard from '@/components/ProTableCard';
  17. import Save from './Save';
  18. import Service from '@/pages/rule-engine/Alarm/Configuration/service';
  19. import AlarmConfig from '@/components/ProTableCard/CardItems/AlarmConfig';
  20. import { Store } from 'jetlinks-store';
  21. import { getMenuPathByCode, MENUS_CODE } from '@/utils/menu';
  22. import { useHistory } from 'umi';
  23. import { onlyMessage } from '@/utils/util';
  24. import encodeQuery from '@/utils/encodeQuery';
  25. const service = new Service('alarm/config');
  26. const Configuration = () => {
  27. const intl = useIntl();
  28. const history = useHistory();
  29. const [visible, setVisible] = useState<boolean>(false);
  30. const actionRef = useRef<ActionType>();
  31. const { permission } = PermissionButton.usePermission('rule-engine/Alarm/Configuration');
  32. const [current, setCurrent] = useState<any>();
  33. const columns: ProColumns<ConfigurationItem>[] = [
  34. {
  35. dataIndex: 'name',
  36. title: '名称',
  37. ellipsis: true,
  38. fixed: 'left',
  39. },
  40. {
  41. title: '类型',
  42. dataIndex: 'targetType',
  43. renderText: (text: string) => {
  44. const map = {
  45. product: '产品',
  46. device: '设备',
  47. org: '部门',
  48. other: '其他',
  49. };
  50. return map[text];
  51. },
  52. valueType: 'select',
  53. valueEnum: {
  54. product: {
  55. text: '产品',
  56. status: 'product',
  57. },
  58. device: {
  59. text: '设备',
  60. status: 'device',
  61. },
  62. org: {
  63. text: '部门',
  64. status: 'org',
  65. },
  66. other: {
  67. text: '其他',
  68. status: 'other',
  69. },
  70. },
  71. },
  72. {
  73. title: '告警级别',
  74. dataIndex: 'level',
  75. render: (text: any) => (
  76. <Tooltip
  77. placement="topLeft"
  78. title={
  79. (Store.get('default-level') || []).find((item: any) => item?.level === text)?.title ||
  80. text
  81. }
  82. >
  83. <div className="ellipsis">
  84. {(Store.get('default-level') || []).find((item: any) => item?.level === text)?.title ||
  85. text}
  86. </div>
  87. </Tooltip>
  88. ),
  89. valueType: 'select',
  90. request: async () => {
  91. const res = await service.queryDefaultLevel();
  92. if (res.status === 200) {
  93. return (res?.result?.levels || [])
  94. .filter((i: any) => i?.level && i?.title)
  95. .map((item: any) => ({
  96. label: item.title,
  97. value: item.level,
  98. }));
  99. }
  100. return [];
  101. },
  102. },
  103. {
  104. title: '关联场景联动',
  105. dataIndex: 'sceneName',
  106. width: 250,
  107. render: (text: any, record: any) => (
  108. <PermissionButton
  109. type={'link'}
  110. isPermission={!!getMenuPathByCode(MENUS_CODE['rule-engine/Scene'])}
  111. style={{ padding: 0, height: 'auto' }}
  112. tooltip={{
  113. title: !!getMenuPathByCode(MENUS_CODE['rule-engine/Scene'])
  114. ? text
  115. : '没有权限,请联系管理员',
  116. }}
  117. onClick={() => {
  118. const url = getMenuPathByCode('rule-engine/Scene/Save');
  119. history.push(`${url}?id=${record.sceneId}`);
  120. }}
  121. >
  122. <span
  123. style={{
  124. width: '200px',
  125. overflow: 'hidden',
  126. textAlign: 'left',
  127. textOverflow: 'ellipsis',
  128. }}
  129. >
  130. {text}
  131. </span>
  132. </PermissionButton>
  133. ),
  134. valueType: 'select',
  135. request: async () => {
  136. const res: any = await service.getScene(
  137. encodeQuery({
  138. sorts: { createTime: 'desc' },
  139. }),
  140. );
  141. if (res.status === 200) {
  142. return res.result.map((item: any) => ({ label: item.name, value: item.name }));
  143. }
  144. return [];
  145. },
  146. },
  147. {
  148. title: '状态',
  149. dataIndex: 'state',
  150. valueType: 'select',
  151. renderText: (state) => (
  152. <Badge text={state?.text} status={state?.value === 'disabled' ? 'error' : 'success'} />
  153. ),
  154. valueEnum: {
  155. disabled: {
  156. text: intl.formatMessage({
  157. id: 'pages.device.product.status.disabled',
  158. defaultMessage: '禁用',
  159. }),
  160. status: 'disabled',
  161. },
  162. enabled: {
  163. text: intl.formatMessage({
  164. id: 'pages.device.product.status.enabled',
  165. defaultMessage: '正常',
  166. }),
  167. status: 'enabled',
  168. },
  169. },
  170. },
  171. {
  172. title: '说明',
  173. dataIndex: 'description',
  174. ellipsis: true,
  175. },
  176. {
  177. title: '操作',
  178. valueType: 'option',
  179. align: 'left',
  180. fixed: 'right',
  181. width: 150,
  182. render: (_, record) => [
  183. record.sceneTriggerType === 'manual' && (
  184. <PermissionButton
  185. key="trigger"
  186. type="link"
  187. style={{ padding: 0 }}
  188. isPermission={permission.tigger}
  189. tooltip={{
  190. title: record.state?.value === 'disabled' ? '未启用,不能手动触发' : '手动触发',
  191. }}
  192. disabled={record.state?.value === 'disabled'}
  193. popConfirm={{
  194. disabled: record.state?.value === 'disabled',
  195. title: '确认手动触发?',
  196. onConfirm: async () => {
  197. await service._execute(record.sceneId);
  198. onlyMessage(
  199. intl.formatMessage({
  200. id: 'pages.data.option.success',
  201. defaultMessage: '操作成功!',
  202. }),
  203. );
  204. actionRef.current?.reload();
  205. },
  206. }}
  207. >
  208. <LikeOutlined />
  209. </PermissionButton>
  210. ),
  211. <PermissionButton
  212. isPermission={permission.update}
  213. key="edit"
  214. style={{ padding: 0 }}
  215. tooltip={{
  216. title: intl.formatMessage({
  217. id: 'pages.data.option.edit',
  218. defaultMessage: '编辑',
  219. }),
  220. }}
  221. type="link"
  222. onClick={() => {
  223. setVisible(true);
  224. setCurrent(record);
  225. }}
  226. >
  227. <EditOutlined />
  228. </PermissionButton>,
  229. <PermissionButton
  230. isPermission={permission.action}
  231. key="action"
  232. style={{ padding: 0 }}
  233. popConfirm={{
  234. title: `${
  235. record.state?.value !== 'disabled'
  236. ? '禁用告警不会影响关联的场景状态,确定要禁用吗'
  237. : '确认启用'
  238. }?`,
  239. onConfirm: async () => {
  240. if (record.state?.value === 'disabled') {
  241. await service._enable(record.id);
  242. } else {
  243. await service._disable(record.id);
  244. }
  245. onlyMessage(
  246. intl.formatMessage({
  247. id: 'pages.data.option.success',
  248. defaultMessage: '操作成功!',
  249. }),
  250. );
  251. actionRef.current?.reload();
  252. },
  253. }}
  254. tooltip={{
  255. title: intl.formatMessage({
  256. id: `pages.data.option.${
  257. record.state?.value !== 'disabled' ? 'disabled' : 'enabled'
  258. }`,
  259. defaultMessage: record.state?.value !== 'disabled' ? '禁用' : '启用',
  260. }),
  261. }}
  262. type="link"
  263. >
  264. {record.state?.value === 'disabled' ? <PlayCircleOutlined /> : <CloseCircleOutlined />}
  265. </PermissionButton>,
  266. <PermissionButton
  267. type="link"
  268. isPermission={permission.delete}
  269. key="delete"
  270. disabled={record.state?.value !== 'disabled'}
  271. style={{ padding: 0 }}
  272. popConfirm={{
  273. disabled: record.state?.value !== 'disabled',
  274. title: '确认删除?',
  275. onConfirm: () => service.remove(record.id),
  276. }}
  277. tooltip={{
  278. title: record.state?.value === 'disabled' ? '删除' : '已启用,不能删除',
  279. }}
  280. >
  281. <DeleteOutlined />
  282. </PermissionButton>,
  283. ],
  284. },
  285. ];
  286. const [param, setParam] = useState({});
  287. useEffect(() => {
  288. service.queryDefaultLevel().then((resp) => {
  289. if (resp.status === 200) {
  290. Store.set('default-level', resp.result?.levels || []);
  291. }
  292. });
  293. }, []);
  294. return (
  295. <PageContainer>
  296. <SearchComponent
  297. field={columns}
  298. onSearch={(data) => {
  299. actionRef.current?.reset?.();
  300. setParam(data);
  301. }}
  302. />
  303. <ProTableCard<any>
  304. actionRef={actionRef}
  305. rowKey="id"
  306. search={false}
  307. scroll={{ x: 1366 }}
  308. params={param}
  309. columns={columns}
  310. columnEmptyText={''}
  311. request={(params) =>
  312. service.query({ ...params, sorts: [{ name: 'createTime', order: 'desc' }] })
  313. }
  314. gridColumn={3}
  315. cardRender={(record) => (
  316. <AlarmConfig
  317. {...record}
  318. actions={[
  319. record.sceneTriggerType === 'manual' ? (
  320. <PermissionButton
  321. key="trigger"
  322. type="link"
  323. tooltip={{
  324. title: record.state?.value === 'disabled' ? '未启用,不能手动触发' : '',
  325. }}
  326. disabled={record.state?.value === 'disabled'}
  327. isPermission={permission.tigger}
  328. popConfirm={{
  329. title: '确认手动触发?',
  330. disabled: record.state?.value === 'disabled',
  331. onConfirm: async () => {
  332. await service._execute(record.sceneId);
  333. onlyMessage(
  334. intl.formatMessage({
  335. id: 'pages.data.option.success',
  336. defaultMessage: '操作成功!',
  337. }),
  338. );
  339. actionRef.current?.reload();
  340. },
  341. }}
  342. >
  343. <LikeOutlined />
  344. 手动触发
  345. </PermissionButton>
  346. ) : null,
  347. <PermissionButton
  348. isPermission={permission.update}
  349. key="edit"
  350. type="link"
  351. onClick={() => {
  352. setCurrent(record);
  353. setVisible(true);
  354. }}
  355. >
  356. <EditOutlined />
  357. 编辑
  358. </PermissionButton>,
  359. <PermissionButton
  360. isPermission={permission.action}
  361. style={{ padding: 0 }}
  362. popConfirm={{
  363. title: `${
  364. record.state?.value !== 'disabled'
  365. ? '禁用告警不会影响关联的场景状态,确定要禁用吗'
  366. : '确认启用'
  367. }?`,
  368. onConfirm: async () => {
  369. if (record.state?.value === 'disabled') {
  370. await service._enable(record.id);
  371. } else {
  372. await service._disable(record.id);
  373. }
  374. onlyMessage(
  375. intl.formatMessage({
  376. id: 'pages.data.option.success',
  377. defaultMessage: '操作成功!',
  378. }),
  379. );
  380. actionRef.current?.reload();
  381. },
  382. }}
  383. tooltip={{
  384. title: intl.formatMessage({
  385. id: `pages.data.option.${
  386. record.state?.value !== 'disabled' ? 'disabled' : 'enabled'
  387. }`,
  388. defaultMessage: record.state?.value !== 'disabled' ? '禁用' : '启用',
  389. }),
  390. }}
  391. key="action"
  392. type="link"
  393. >
  394. {record.state?.value !== 'disabled' ? (
  395. <CloseCircleOutlined />
  396. ) : (
  397. <PlayCircleOutlined />
  398. )}
  399. {record.state?.value !== 'disabled' ? '禁用' : '启用'}
  400. </PermissionButton>,
  401. <PermissionButton
  402. type="link"
  403. tooltip={{
  404. title: record.state?.value === 'disabled' ? '删除' : '已启用,不能删除',
  405. }}
  406. disabled={record.state?.value !== 'disabled'}
  407. popConfirm={{
  408. disabled: record.state?.value !== 'disabled',
  409. title: '确认删除?',
  410. onConfirm: async () => {
  411. await service.remove(record.id);
  412. actionRef.current?.reset?.();
  413. },
  414. }}
  415. isPermission={permission.delete}
  416. key="delete"
  417. >
  418. <DeleteOutlined />
  419. </PermissionButton>,
  420. ]}
  421. />
  422. )}
  423. headerTitle={
  424. <Space>
  425. <PermissionButton
  426. isPermission={permission.add}
  427. onClick={() => {
  428. setCurrent(undefined);
  429. setVisible(true);
  430. }}
  431. key="button"
  432. icon={<PlusOutlined />}
  433. type="primary"
  434. >
  435. {intl.formatMessage({
  436. id: 'pages.data.option.add',
  437. defaultMessage: '新增',
  438. })}
  439. </PermissionButton>
  440. </Space>
  441. }
  442. />
  443. <Save
  444. data={current}
  445. visible={visible}
  446. close={() => {
  447. setVisible(false);
  448. actionRef.current?.reset?.();
  449. }}
  450. />
  451. </PageContainer>
  452. );
  453. };
  454. export default Configuration;