| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- import { Modal } from 'antd';
- import { useMemo, useRef, useState } from 'react';
- import { createForm, Field, onFieldReact, onFieldValueChange } from '@formily/core';
- import { createSchemaField, observer } from '@formily/react';
- import {
- ArrayTable,
- DatePicker,
- Form,
- FormItem,
- Input,
- NumberPicker,
- PreviewText,
- Select,
- } from '@formily/antd';
- import { ISchema } from '@formily/json-schema';
- import { service, state } from '@/pages/notice/Config';
- import { service as TemplateService } from '@/pages/notice/Template';
- // import { useLocation } from 'umi';
- import { onlyMessage, useAsyncDataSource } from '@/utils/util';
- import { Store } from 'jetlinks-store';
- import FUpload from '@/components/Upload';
- import { FDatePicker } from '@/components';
- const Debug = observer(() => {
- // const location = useLocation<{ id: string }>();
- const id = state.current?.type; // (location as any).query?.id;
- const variableRef = useRef<any>([]);
- const [loading, setLoading] = useState(false);
- const form = useMemo(
- () =>
- createForm({
- validateFirst: true,
- effects() {
- onFieldValueChange('templateId', (field, form1) => {
- const value = field.value;
- // 找到模版详情;
- // const list = Store.get('notice-template-list');
- TemplateService.getVariableDefinitions(value).then((resp) => {
- const _template = resp.result;
- if (_template?.variableDefinitions?.length > 0) {
- variableRef.current = _template?.variableDefinitions;
- form1.setFieldState('variableDefinitions', (state1) => {
- state1.visible = true;
- state1.value = _template?.variableDefinitions;
- });
- } else {
- variableRef.current = [];
- form1.setFieldState('variableDefinitions', (state1) => {
- state1.visible = true;
- state1.value = undefined;
- });
- }
- });
- // const _template = list.find((item: any) => item.id === value);
- // console.log(_template)
- // form1.setFieldState('variableDefinitions', (_state) => {
- // _state.visible = _template?.variableDefinitions?.length > 0;
- // _state.value = _template.variableDefinitions;
- // });
- });
- onFieldReact('variableDefinitions.*.type', async (field) => {
- const value = (field as Field).value;
- const format = field.query('.value').take() as any;
- const _id = field.query('.id').take() as Field;
- switch (value) {
- case 'date':
- // const a = variableRef.current?.find((i: any) => i.id === _id.value);
- let dateFormat = 'yyyy-MM-dd HH:mm:ss';
- if (variableRef.current) {
- const a = variableRef.current?.find((i: any) => i.id === _id.value);
- dateFormat = a?.format;
- }
- format.setComponent(FDatePicker, {
- showTime: true,
- format: dateFormat === 'timestamp' ? 'X' : dateFormat.replace('dd', 'DD'),
- });
- format.setComponent(DatePicker);
- break;
- case 'string':
- format.setComponent(Input);
- break;
- case 'number':
- format.setComponent(NumberPicker);
- break;
- case 'file':
- format.setComponent(FUpload, {
- type: 'file',
- });
- break;
- case 'other':
- format.setComponent(Input);
- break;
- }
- if (variableRef.current) {
- const a = variableRef.current?.find((i: any) => i.id === _id.value);
- const businessType = a?.expands?.businessType;
- if (id === 'dingTalk' || id === 'weixin') {
- switch (businessType) {
- case 'org':
- // 获取org
- const orgList = await TemplateService[id].getDepartments(
- state.current?.id || '',
- );
- format.setComponent(Select);
- format.setDataSource(orgList);
- break;
- case 'user':
- // 获取user
- const userList = await TemplateService[id].getUser(state.current?.id || '');
- format.setComponent(Select);
- format.setDataSource(userList);
- break;
- case 'tag':
- // 获取user
- const tagList = await TemplateService[id]?.getTags(state.current?.id || '');
- format.setComponent(Select);
- format.setDataSource(tagList);
- break;
- }
- }
- }
- });
- },
- }),
- [state.debug],
- );
- const SchemaField = createSchemaField({
- components: {
- FormItem,
- Input,
- Select,
- ArrayTable,
- PreviewText,
- },
- });
- const getTemplate = () =>
- service
- .getTemplate(state.current?.id || '', {
- terms: [
- { column: 'type', value: id },
- { column: 'provider', value: state.current?.provider },
- ],
- })
- .then((resp) => {
- Store.set('notice-template-list', resp.result);
- return resp.result?.map((item: any) => ({
- label: item.name,
- value: item.id,
- }));
- });
- const schema: ISchema = {
- type: 'object',
- properties: {
- templateId: {
- title: '通知模版',
- type: 'string',
- 'x-decorator': 'FormItem',
- required: true,
- 'x-component': 'Select',
- 'x-reactions': '{{useAsyncDataSource(getTemplate)}}',
- 'x-component-props': {
- showSearch: true,
- allowClear: true,
- showArrow: true,
- filterOption: (input: string, option: any) =>
- option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0,
- },
- },
- variableDefinitions: {
- title: '变量',
- type: 'string',
- required: true,
- 'x-decorator': 'FormItem',
- 'x-component': 'ArrayTable',
- 'x-component-props': {
- pagination: { pageSize: 9999 },
- scroll: { x: '100%' },
- },
- 'x-visible': false,
- items: {
- type: 'object',
- properties: {
- column1: {
- type: 'void',
- 'x-component': 'ArrayTable.Column',
- 'x-component-props': { title: '变量', width: '120px' },
- properties: {
- id: {
- type: 'string',
- 'x-decorator': 'FormItem',
- 'x-component': 'PreviewText.Input',
- 'x-disabled': true,
- },
- },
- },
- column2: {
- type: 'void',
- 'x-component': 'ArrayTable.Column',
- 'x-component-props': { title: '名称', width: '120px' },
- properties: {
- name: {
- type: 'string',
- 'x-decorator': 'FormItem',
- 'x-component': 'PreviewText.Input',
- 'x-disabled': true,
- },
- },
- },
- column3: {
- type: 'void',
- 'x-component': 'ArrayTable.Column',
- 'x-component-props': { title: '值', width: '120px' },
- properties: {
- value: {
- required: true,
- type: 'string',
- 'x-decorator': 'FormItem',
- 'x-component': 'Input',
- },
- type: {
- 'x-hidden': true,
- type: 'string',
- 'x-decorator': 'FormItem',
- 'x-component': 'Input',
- },
- },
- },
- },
- },
- },
- },
- };
- const start = async () => {
- const data: { templateId: string; variableDefinitions: any } = await form.submit();
- // 应该取选择的配置信息
- if (!state.current) return;
- const templateId = data.templateId;
- // const list = Store.get('notice-template-list');
- // const _template = list.find((item: any) => item.id === templateId);
- setLoading(true);
- const resp = await service.debug(
- state?.current.id,
- templateId,
- data.variableDefinitions
- ? data.variableDefinitions?.reduce(
- (previousValue: any, currentValue: { id: any; value: any }) => {
- return {
- ...previousValue,
- [currentValue.id]: currentValue.value,
- };
- },
- {},
- )
- : {},
- );
- if (resp.status === 200) {
- onlyMessage('操作成功!');
- }
- state.debug = false;
- setLoading(false);
- };
- return (
- <Modal
- title="调试"
- width="40vw"
- visible={state.debug}
- onCancel={() => (state.debug = false)}
- onOk={start}
- confirmLoading={loading}
- >
- <Form form={form} layout={'vertical'}>
- <SchemaField schema={schema} scope={{ getTemplate, useAsyncDataSource }} />
- </Form>
- </Modal>
- );
- });
- export default Debug;
|