index.tsx 5.8 KB

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