|
|
@@ -2,22 +2,128 @@ 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 } from '@formily/core';
|
|
|
-import { useMemo } from 'react';
|
|
|
+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 TriggerTerm = () => {
|
|
|
- const form = useMemo(() => createForm({}), []);
|
|
|
+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,
|
|
|
@@ -29,9 +135,20 @@ const TriggerTerm = () => {
|
|
|
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: {
|
|
|
@@ -56,7 +173,8 @@ const TriggerTerm = () => {
|
|
|
items: {
|
|
|
type: 'object',
|
|
|
properties: {
|
|
|
- termType: {
|
|
|
+ // 关联类型
|
|
|
+ type: {
|
|
|
type: 'string',
|
|
|
// "x-decorator": 'FormItem',
|
|
|
'x-component': 'FTermTypeSelect',
|
|
|
@@ -69,52 +187,45 @@ const TriggerTerm = () => {
|
|
|
minColumns: 24,
|
|
|
},
|
|
|
properties: {
|
|
|
- params: {
|
|
|
+ // columns
|
|
|
+ column: {
|
|
|
type: 'string',
|
|
|
// title: '日期',
|
|
|
'x-decorator': 'FormItem',
|
|
|
- 'x-component': 'Input',
|
|
|
+ 'x-component': 'TreeSelect',
|
|
|
'x-decorator-props': {
|
|
|
gridSpan: 4,
|
|
|
},
|
|
|
'x-component-props': {
|
|
|
placeholder: '请选择参数',
|
|
|
+ fieldNames: { value: 'column', label: 'name', options: 'children' },
|
|
|
},
|
|
|
+ 'x-reactions': '{{useAsyncDataSource(getParseTerm)}}',
|
|
|
},
|
|
|
- operator: {
|
|
|
+ termType: {
|
|
|
type: 'string',
|
|
|
// title: '输入框',
|
|
|
'x-decorator': 'FormItem',
|
|
|
'x-component': 'Select',
|
|
|
'x-decorator-props': {
|
|
|
- gridSpan: 3,
|
|
|
+ gridSpan: 1,
|
|
|
},
|
|
|
'x-component-props': {
|
|
|
placeholder: '操作符',
|
|
|
},
|
|
|
},
|
|
|
- type: {
|
|
|
+ source: {
|
|
|
type: 'string',
|
|
|
'x-decorator': 'FormItem',
|
|
|
'x-component': 'Select',
|
|
|
- enum: [
|
|
|
- { label: '手动输入', value: 'sd' },
|
|
|
- { label: '指标', value: 'metrics' },
|
|
|
- ],
|
|
|
'x-decorator-props': {
|
|
|
- gridSpan: 3,
|
|
|
+ gridSpan: 1,
|
|
|
},
|
|
|
},
|
|
|
value: {
|
|
|
type: 'string',
|
|
|
- enum: [
|
|
|
- { label: '高高值', value: 1 },
|
|
|
- { label: '低低值', value: 2 },
|
|
|
- { label: '高值', value: 3 },
|
|
|
- { label: '低值', value: 4 },
|
|
|
- ],
|
|
|
'x-decorator': 'FormItem',
|
|
|
- 'x-component': 'Select',
|
|
|
+ 'x-component': 'Input',
|
|
|
'x-component-props': {},
|
|
|
'x-decorator-props': {
|
|
|
gridSpan: 3,
|
|
|
@@ -158,8 +269,9 @@ const TriggerTerm = () => {
|
|
|
};
|
|
|
return (
|
|
|
<Form form={form} layout="vertical" className={styles.form}>
|
|
|
- <SchemaField schema={schema} />
|
|
|
+ <SchemaField schema={schema} scope={{ useAsyncDataSource, getParseTerm }} />
|
|
|
</Form>
|
|
|
);
|
|
|
};
|
|
|
-export default TriggerTerm;
|
|
|
+
|
|
|
+export default forwardRef(TriggerTerm);
|