| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- import { createSchemaField } from '@formily/react';
- import {
- ArrayCards,
- ArrayItems,
- DatePicker,
- Form,
- FormGrid,
- FormItem,
- Input,
- NumberPicker,
- Select,
- Space,
- Switch,
- TreeSelect,
- } from '@formily/antd';
- import { ISchema } from '@formily/json-schema';
- import { createForm, onFieldValueChange } from '@formily/core';
- import { forwardRef, useImperativeHandle, useMemo } from 'react';
- import FTermArrayCards from '@/components/FTermArrayCards';
- import FTermTypeSelect from '@/components/FTermTypeSelect';
- import styles from './index.less';
- import Service from '@/pages/rule-engine/Scene/service';
- import { useAsyncDataSource } from '@/utils/util';
- import { Store } from 'jetlinks-store';
- import { treeFilter } from '@/utils/tree';
- const service = new Service('scene');
- interface Props {
- // 查询下拉框的参数
- params: Record<string, any>;
- value?: Record<string, any>;
- onChange?: (value: any) => void;
- }
- const TriggerTerm = (props: Props, ref: any) => {
- const form = useMemo(
- () =>
- createForm({
- validateFirst: true,
- initialValues: props.value,
- effects() {
- onFieldValueChange('trigger.*.terms.*.column', (field, form1) => {
- const operator = field.query('.termType');
- // 找到选中的
- const _data = Store.get('trigger-parse-term');
- // 树形搜索
- const treeValue = treeFilter(_data, field.value, 'column');
- // 找到
- const target =
- treeValue && treeValue[0].children
- ? treeValue[0]?.children.find((item) => item.column === field.value)
- : treeValue[0];
- form1.setFieldState(operator, (state) => {
- state.dataSource = target?.termTypes?.map((item: any) => ({
- label: item.name,
- value: item.id,
- }));
- });
- form1.setFieldState(field.query('.source'), (state) => {
- state.dataSource =
- target && target.metrics && target.metrics.length > 0
- ? [
- { label: '手动输入', value: 'manual' },
- { label: '指标', value: 'metrics' },
- ]
- : [{ label: '手动输入', value: 'manual' }];
- });
- });
- onFieldValueChange('trigger.*.terms.*.source', (field, form1) => {
- const params = field.query('.column').value();
- const value = field.query('.value');
- // 找到选中的
- const _data = Store.get('trigger-parse-term');
- // 树形搜索
- const treeValue = treeFilter(_data, params, 'column');
- // 找到
- const target =
- treeValue && treeValue[0].children
- ? treeValue[0]?.children.find((item) => item.column === params)
- : treeValue[0];
- if (target) {
- if (field.value === 'manual') {
- // 手动输入
- const valueType = target.dataType;
- const valueTypeMap = {
- int: NumberPicker,
- float: NumberPicker,
- double: NumberPicker,
- long: NumberPicker,
- string: Input,
- date: DatePicker,
- boolean: Switch,
- };
- form1.setFieldState(value, (state) => {
- state.componentType = valueTypeMap[valueType];
- if (valueType === 'date') {
- state.componentProps = {
- showTime: true,
- };
- }
- });
- } else if (field.value === 'metrics') {
- // 指标
- form1.setFieldState(value, (state) => {
- state.componentType = Select;
- state.dataSource = target?.metrics.map((item: any) => ({
- label: item.name,
- value: item.id,
- }));
- });
- }
- }
- });
- },
- }),
- [props.value],
- );
- useImperativeHandle(ref, () => ({
- getTriggerForm: () => form.submit(),
- }));
- const SchemaField = createSchemaField({
- components: {
- FormItem,
- Input,
- Select,
- ArrayCards,
- FTermArrayCards,
- ArrayItems,
- Space,
- FormGrid,
- FTermTypeSelect,
- TreeSelect,
- },
- });
- const getParseTerm = () =>
- service.getParseTerm(props.params).then((data) => {
- Store.set('trigger-parse-term', data);
- return data.map((item: any) => ({
- column: item.column,
- name: item.name,
- children: item.children,
- }));
- });
- const schema: ISchema = {
- type: 'object',
- properties: {
- trigger: {
- type: 'array',
- 'x-component': 'FTermArrayCards',
- 'x-decorator': 'FormItem',
- 'x-component-props': {
- title: '分组',
- },
- items: {
- type: 'object',
- properties: {
- index: {
- type: 'void',
- 'x-component': 'FTermArrayCards.Index',
- },
- terms: {
- type: 'array',
- 'x-component': 'ArrayItems',
- 'x-decorator': 'FormItem',
- items: {
- type: 'object',
- properties: {
- // 关联类型
- type: {
- type: 'string',
- // "x-decorator": 'FormItem',
- 'x-component': 'FTermTypeSelect',
- },
- layout: {
- type: 'void',
- 'x-component': 'FormGrid',
- 'x-decorator-props': {
- maxColumns: 24,
- minColumns: 24,
- },
- properties: {
- // columns
- column: {
- type: 'string',
- // title: '日期',
- 'x-decorator': 'FormItem',
- 'x-component': 'TreeSelect',
- 'x-decorator-props': {
- gridSpan: 4,
- },
- 'x-component-props': {
- placeholder: '请选择参数',
- fieldNames: { value: 'column', label: 'name', options: 'children' },
- },
- 'x-reactions': '{{useAsyncDataSource(getParseTerm)}}',
- },
- termType: {
- type: 'string',
- // title: '输入框',
- 'x-decorator': 'FormItem',
- 'x-component': 'Select',
- 'x-decorator-props': {
- gridSpan: 1,
- },
- 'x-component-props': {
- placeholder: '操作符',
- },
- },
- source: {
- type: 'string',
- 'x-decorator': 'FormItem',
- 'x-component': 'Select',
- 'x-decorator-props': {
- gridSpan: 1,
- },
- },
- value: {
- type: 'string',
- 'x-decorator': 'FormItem',
- 'x-component': 'Input',
- 'x-component-props': {},
- 'x-decorator-props': {
- gridSpan: 3,
- },
- },
- remove: {
- type: 'void',
- 'x-decorator': 'FormItem',
- 'x-component': 'ArrayItems.Remove',
- 'x-decorator-props': {
- gridSpan: 1,
- },
- },
- },
- },
- },
- },
- properties: {
- add: {
- type: 'void',
- title: '添加条件',
- 'x-component': 'ArrayItems.Addition',
- },
- },
- },
- remove: {
- type: 'void',
- 'x-component': 'FTermArrayCards.Remove',
- },
- },
- },
- properties: {
- addition: {
- type: 'void',
- title: '添加分组',
- 'x-component': 'FTermArrayCards.Addition',
- },
- },
- },
- },
- };
- return (
- <Form form={form} layout="vertical" className={styles.form}>
- <SchemaField schema={schema} scope={{ useAsyncDataSource, getParseTerm }} />
- </Form>
- );
- };
- export default forwardRef(TriggerTerm);
|