index.tsx 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. import { createSchemaField } from '@formily/react';
  2. import {
  3. ArrayCards,
  4. ArrayItems,
  5. DatePicker,
  6. Form,
  7. FormGrid,
  8. FormItem,
  9. Input,
  10. NumberPicker,
  11. Select,
  12. Space,
  13. Switch,
  14. TreeSelect,
  15. } from '@formily/antd';
  16. import { ISchema } from '@formily/json-schema';
  17. import { createForm, onFieldValueChange } from '@formily/core';
  18. import { forwardRef, useImperativeHandle, useMemo } from 'react';
  19. import FTermArrayCards from '@/components/FTermArrayCards';
  20. import FTermTypeSelect from '@/components/FTermTypeSelect';
  21. import styles from './index.less';
  22. import Service from '@/pages/rule-engine/Scene/service';
  23. import { useAsyncDataSource } from '@/utils/util';
  24. import { Store } from 'jetlinks-store';
  25. import { treeFilter } from '@/utils/tree';
  26. const service = new Service('scene');
  27. interface Props {
  28. // 查询下拉框的参数
  29. params: Record<string, any>;
  30. value?: Record<string, any>;
  31. onChange?: (value: any) => void;
  32. }
  33. const TriggerTerm = (props: Props, ref: any) => {
  34. const form = useMemo(
  35. () =>
  36. createForm({
  37. validateFirst: true,
  38. initialValues: props.value,
  39. effects() {
  40. onFieldValueChange('trigger.*.terms.*.column', (field, form1) => {
  41. const operator = field.query('.termType');
  42. // 找到选中的
  43. const _data = Store.get('trigger-parse-term');
  44. // 树形搜索
  45. const treeValue = treeFilter(_data, field.value, 'column');
  46. // 找到
  47. const target =
  48. treeValue && treeValue[0].children
  49. ? treeValue[0]?.children.find((item) => item.column === field.value)
  50. : treeValue[0];
  51. form1.setFieldState(operator, (state) => {
  52. state.dataSource = target?.termTypes?.map((item: any) => ({
  53. label: item.name,
  54. value: item.id,
  55. }));
  56. });
  57. form1.setFieldState(field.query('.source'), (state) => {
  58. state.dataSource =
  59. target && target.metrics && target.metrics.length > 0
  60. ? [
  61. { label: '手动输入', value: 'manual' },
  62. { label: '指标', value: 'metrics' },
  63. ]
  64. : [{ label: '手动输入', value: 'manual' }];
  65. });
  66. });
  67. onFieldValueChange('trigger.*.terms.*.source', (field, form1) => {
  68. const params = field.query('.column').value();
  69. const value = field.query('.value');
  70. // 找到选中的
  71. const _data = Store.get('trigger-parse-term');
  72. // 树形搜索
  73. const treeValue = treeFilter(_data, params, 'column');
  74. // 找到
  75. const target =
  76. treeValue && treeValue[0].children
  77. ? treeValue[0]?.children.find((item) => item.column === params)
  78. : treeValue[0];
  79. if (target) {
  80. if (field.value === 'manual') {
  81. // 手动输入
  82. const valueType = target.dataType;
  83. const valueTypeMap = {
  84. int: NumberPicker,
  85. float: NumberPicker,
  86. double: NumberPicker,
  87. long: NumberPicker,
  88. string: Input,
  89. date: DatePicker,
  90. boolean: Switch,
  91. };
  92. form1.setFieldState(value, (state) => {
  93. state.componentType = valueTypeMap[valueType];
  94. if (valueType === 'date') {
  95. state.componentProps = {
  96. showTime: true,
  97. };
  98. }
  99. });
  100. } else if (field.value === 'metrics') {
  101. // 指标
  102. form1.setFieldState(value, (state) => {
  103. state.componentType = Select;
  104. state.dataSource = target?.metrics.map((item: any) => ({
  105. label: item.name,
  106. value: item.id,
  107. }));
  108. });
  109. }
  110. }
  111. });
  112. },
  113. }),
  114. [props.value],
  115. );
  116. useImperativeHandle(ref, () => ({
  117. getTriggerForm: () => form.submit(),
  118. }));
  119. const SchemaField = createSchemaField({
  120. components: {
  121. FormItem,
  122. Input,
  123. Select,
  124. ArrayCards,
  125. FTermArrayCards,
  126. ArrayItems,
  127. Space,
  128. FormGrid,
  129. FTermTypeSelect,
  130. TreeSelect,
  131. },
  132. });
  133. const getParseTerm = () =>
  134. service.getParseTerm(props.params).then((data) => {
  135. Store.set('trigger-parse-term', data);
  136. return data.map((item: any) => ({
  137. column: item.column,
  138. name: item.name,
  139. children: item.children,
  140. }));
  141. });
  142. const schema: ISchema = {
  143. type: 'object',
  144. properties: {
  145. trigger: {
  146. type: 'array',
  147. 'x-component': 'FTermArrayCards',
  148. 'x-decorator': 'FormItem',
  149. 'x-component-props': {
  150. title: '分组',
  151. },
  152. items: {
  153. type: 'object',
  154. properties: {
  155. index: {
  156. type: 'void',
  157. 'x-component': 'FTermArrayCards.Index',
  158. },
  159. terms: {
  160. type: 'array',
  161. 'x-component': 'ArrayItems',
  162. 'x-decorator': 'FormItem',
  163. items: {
  164. type: 'object',
  165. properties: {
  166. // 关联类型
  167. type: {
  168. type: 'string',
  169. // "x-decorator": 'FormItem',
  170. 'x-component': 'FTermTypeSelect',
  171. },
  172. layout: {
  173. type: 'void',
  174. 'x-component': 'FormGrid',
  175. 'x-decorator-props': {
  176. maxColumns: 24,
  177. minColumns: 24,
  178. },
  179. properties: {
  180. // columns
  181. column: {
  182. type: 'string',
  183. // title: '日期',
  184. 'x-decorator': 'FormItem',
  185. 'x-component': 'TreeSelect',
  186. 'x-decorator-props': {
  187. gridSpan: 4,
  188. },
  189. 'x-component-props': {
  190. placeholder: '请选择参数',
  191. fieldNames: { value: 'column', label: 'name', options: 'children' },
  192. },
  193. 'x-reactions': '{{useAsyncDataSource(getParseTerm)}}',
  194. },
  195. termType: {
  196. type: 'string',
  197. // title: '输入框',
  198. 'x-decorator': 'FormItem',
  199. 'x-component': 'Select',
  200. 'x-decorator-props': {
  201. gridSpan: 1,
  202. },
  203. 'x-component-props': {
  204. placeholder: '操作符',
  205. },
  206. },
  207. source: {
  208. type: 'string',
  209. 'x-decorator': 'FormItem',
  210. 'x-component': 'Select',
  211. 'x-decorator-props': {
  212. gridSpan: 1,
  213. },
  214. },
  215. value: {
  216. type: 'string',
  217. 'x-decorator': 'FormItem',
  218. 'x-component': 'Input',
  219. 'x-component-props': {},
  220. 'x-decorator-props': {
  221. gridSpan: 3,
  222. },
  223. },
  224. remove: {
  225. type: 'void',
  226. 'x-decorator': 'FormItem',
  227. 'x-component': 'ArrayItems.Remove',
  228. 'x-decorator-props': {
  229. gridSpan: 1,
  230. },
  231. },
  232. },
  233. },
  234. },
  235. },
  236. properties: {
  237. add: {
  238. type: 'void',
  239. title: '添加条件',
  240. 'x-component': 'ArrayItems.Addition',
  241. },
  242. },
  243. },
  244. remove: {
  245. type: 'void',
  246. 'x-component': 'FTermArrayCards.Remove',
  247. },
  248. },
  249. },
  250. properties: {
  251. addition: {
  252. type: 'void',
  253. title: '添加分组',
  254. 'x-component': 'FTermArrayCards.Addition',
  255. },
  256. },
  257. },
  258. },
  259. };
  260. return (
  261. <Form form={form} layout="vertical" className={styles.form}>
  262. <SchemaField schema={schema} scope={{ useAsyncDataSource, getParseTerm }} />
  263. </Form>
  264. );
  265. };
  266. export default forwardRef(TriggerTerm);