index.tsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import { Modal } from 'antd';
  2. import { useMemo } from 'react';
  3. import { createForm, Field, onFieldReact, onFieldValueChange } from '@formily/core';
  4. import { createSchemaField, observer } from '@formily/react';
  5. import {
  6. ArrayTable,
  7. DatePicker,
  8. Form,
  9. FormItem,
  10. Input,
  11. NumberPicker,
  12. PreviewText,
  13. Select,
  14. } from '@formily/antd';
  15. import { ISchema } from '@formily/json-schema';
  16. import { service, state } from '@/pages/notice/Config';
  17. import { useLocation } from 'umi';
  18. import { onlyMessage, useAsyncDataSource } from '@/utils/util';
  19. import { Store } from 'jetlinks-store';
  20. import FUpload from '@/components/Upload';
  21. const Debug = observer(() => {
  22. const location = useLocation<{ id: string }>();
  23. const id = (location as any).query?.id;
  24. const form = useMemo(
  25. () =>
  26. createForm({
  27. validateFirst: true,
  28. effects() {
  29. onFieldValueChange('templateId', (field, form1) => {
  30. const value = field.value;
  31. // 找到模版详情;
  32. const list = Store.get('notice-template-list');
  33. const _template = list.find((item: any) => item.id === value);
  34. form1.setFieldState('variableDefinitions', (_state) => {
  35. _state.visible = _template?.variableDefinitions?.length > 0;
  36. _state.value = _template.variableDefinitions;
  37. });
  38. });
  39. onFieldReact('variableDefinitions.*.type', (field) => {
  40. const value = (field as Field).value;
  41. const format = field.query('.value').take() as any;
  42. switch (value) {
  43. case 'date':
  44. format.setComponent(DatePicker);
  45. break;
  46. case 'string':
  47. format.setComponent(Input);
  48. break;
  49. case 'number':
  50. format.setComponent(NumberPicker);
  51. break;
  52. case 'file':
  53. format.setComponent(FUpload, {
  54. type: 'file',
  55. });
  56. break;
  57. case 'other':
  58. format.setComponent(Input);
  59. break;
  60. }
  61. });
  62. },
  63. }),
  64. [state.debug],
  65. );
  66. const SchemaField = createSchemaField({
  67. components: {
  68. FormItem,
  69. Input,
  70. Select,
  71. ArrayTable,
  72. PreviewText,
  73. },
  74. });
  75. const getTemplate = () =>
  76. service
  77. .getTemplate(state.current?.id || '', {
  78. terms: [
  79. { column: 'type', value: id },
  80. { column: 'provider', value: state.current?.provider },
  81. ],
  82. })
  83. .then((resp) => {
  84. Store.set('notice-template-list', resp.result);
  85. return resp.result?.map((item: any) => ({
  86. label: item.name,
  87. value: item.id,
  88. }));
  89. });
  90. const schema: ISchema = {
  91. type: 'object',
  92. properties: {
  93. templateId: {
  94. title: '通知模版',
  95. type: 'string',
  96. 'x-decorator': 'FormItem',
  97. 'x-component': 'Select',
  98. 'x-reactions': '{{useAsyncDataSource(getTemplate)}}',
  99. },
  100. variableDefinitions: {
  101. title: '变量',
  102. type: 'string',
  103. 'x-decorator': 'FormItem',
  104. 'x-component': 'ArrayTable',
  105. 'x-component-props': {
  106. pagination: { pageSize: 9999 },
  107. scroll: { x: '100%' },
  108. },
  109. 'x-visible': false,
  110. items: {
  111. type: 'object',
  112. properties: {
  113. column1: {
  114. type: 'void',
  115. 'x-component': 'ArrayTable.Column',
  116. 'x-component-props': { title: '变量', width: '120px' },
  117. properties: {
  118. id: {
  119. type: 'string',
  120. 'x-decorator': 'FormItem',
  121. 'x-component': 'PreviewText.Input',
  122. 'x-disabled': true,
  123. },
  124. },
  125. },
  126. column2: {
  127. type: 'void',
  128. 'x-component': 'ArrayTable.Column',
  129. 'x-component-props': { title: '名称', width: '120px' },
  130. properties: {
  131. name: {
  132. type: 'string',
  133. 'x-decorator': 'FormItem',
  134. 'x-component': 'PreviewText.Input',
  135. 'x-disabled': true,
  136. },
  137. },
  138. },
  139. column3: {
  140. type: 'void',
  141. 'x-component': 'ArrayTable.Column',
  142. 'x-component-props': { title: '值', width: '120px' },
  143. properties: {
  144. value: {
  145. type: 'string',
  146. 'x-decorator': 'FormItem',
  147. 'x-component': 'Input',
  148. },
  149. },
  150. },
  151. },
  152. },
  153. },
  154. },
  155. };
  156. const start = async () => {
  157. const data: { templateId: string; variableDefinitions: any } = await form.submit();
  158. // 应该取选择的配置信息
  159. if (!state.current) return;
  160. const templateId = data.templateId;
  161. const list = Store.get('notice-template-list');
  162. const _template = list.find((item: any) => item.id === templateId);
  163. const resp = await service.debug(state?.current.id, templateId, {
  164. template: _template,
  165. context: data.variableDefinitions?.reduce(
  166. (previousValue: any, currentValue: { id: any; value: any }) => {
  167. return {
  168. ...previousValue,
  169. [currentValue.id]: currentValue.value,
  170. };
  171. },
  172. {},
  173. ),
  174. });
  175. if (resp.status === 200) {
  176. onlyMessage('操作成功!');
  177. }
  178. };
  179. return (
  180. <Modal
  181. title="调试"
  182. width="40vw"
  183. visible={state.debug}
  184. onCancel={() => (state.debug = false)}
  185. onOk={start}
  186. >
  187. <Form form={form} layout={'vertical'}>
  188. <SchemaField schema={schema} scope={{ getTemplate, useAsyncDataSource }} />
  189. </Form>
  190. </Modal>
  191. );
  192. });
  193. export default Debug;