mapServe.tsx 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. import React, { useState, useEffect } from 'react';
  2. import { FlowchartFormWrapper, MODELS, useXFlowApp } from '@antv/xflow';
  3. import { Button, message, Select } from 'antd';
  4. import {
  5. Position,
  6. Size,
  7. ColorPicker,
  8. InputNumberField,
  9. InputField,
  10. UploadField,
  11. RadioField,
  12. } from '../fields';
  13. import { PREFIX } from '../constants';
  14. import { UnityAction } from '@/utils/utils';
  15. import { connect } from "umi";
  16. import { IProps } from '@/components/Flow/index';
  17. interface ExcelInfo {
  18. file_name?: string;
  19. excel_cols?: any;
  20. }
  21. export interface IConfig {
  22. id?: string;
  23. label?: string;
  24. x?: number;
  25. y?: number;
  26. width?: number;
  27. height?: number;
  28. fontSize?: number;
  29. count?: number;
  30. fontFill?: string;
  31. fill?: string;
  32. stroke?: string;
  33. muti_version?: string | number;
  34. is_start_node?: string | number;
  35. bom_template?: string;
  36. version_name?: string;
  37. data?: any;
  38. excel_info?: ExcelInfo;
  39. role_list?: string;
  40. is_seal?: string | number;
  41. }
  42. const defaultConfig: IConfig = {
  43. muti_version: 1,
  44. is_start_node: 0,
  45. is_seal: 0,
  46. excel_info: { file_name: '' },
  47. };
  48. const Component = (props: any) => {
  49. const { config, plugin = {}, roleList } = props;
  50. const { updateNode } = plugin;
  51. const [options, setOptions] = useState([]);
  52. const [fileName, setFileName] = useState('');
  53. const [nodeConfig, setNodeConfig] = useState<IConfig>({
  54. ...defaultConfig,
  55. ...config,
  56. });
  57. const app = useXFlowApp();
  58. const [meta, setMeta] = useState<IProps['meta']>(null);
  59. const onNodeConfigChange = (key: string, value: number | string | object) => {
  60. if (key) {
  61. setNodeConfig({
  62. ...nodeConfig,
  63. [key]: value,
  64. });
  65. updateNode({
  66. [key]: value,
  67. });
  68. } else if (value instanceof Object) {
  69. setNodeConfig({
  70. ...nodeConfig,
  71. ...value,
  72. });
  73. updateNode({
  74. ...value,
  75. });
  76. }
  77. };
  78. const onSave = () => {
  79. UnityAction.emit('NODE_SAVE', nodeConfig);
  80. };
  81. useEffect(() => {
  82. if(config.id != nodeConfig.id) {
  83. setNodeConfig({
  84. ...defaultConfig,
  85. ...config,
  86. });
  87. }
  88. }, [config]);
  89. useEffect(() => {
  90. MODELS.GRAPH_META.useValue(app.modelService).then((meta: IProps['meta']) => {
  91. setMeta(meta);
  92. });
  93. }, []);
  94. const updataFileName = (name: string) => {
  95. var idx = name?.lastIndexOf('/');
  96. let str = name.substring(idx + 1, name.length);
  97. setFileName(str);
  98. onNodeConfigChange('version_name', str);
  99. };
  100. useEffect(() => {
  101. if (config.bom_template) updataFileName(config.bom_template);
  102. if (nodeConfig.excel_info?.file_name) updataFileName(nodeConfig.excel_info.file_name);
  103. }, [nodeConfig.bom_template, nodeConfig.excel_info.file_name]);
  104. // console.log(nodeConfig, config)
  105. useEffect(() => {
  106. if (!roleList || roleList.length <= 0) return;
  107. let op = [];
  108. console.log(roleList);
  109. roleList
  110. .filter(cur => cur.RoleType == 4)
  111. .forEach(item => {
  112. op.push({ label: `${item.Name}(${item.ID})`, value: item.ID });
  113. });
  114. setOptions(op);
  115. console.log(op);
  116. }, [roleList]);
  117. // const handleFileNameClick = () => {
  118. // if (nodeConfig.bom_template) window.open(nodeConfig.bom_template);
  119. // };
  120. return (
  121. <div className={`${PREFIX}-panel-body`}>
  122. <div className={`${PREFIX}-panel-group`}>
  123. <h5>内容</h5>
  124. <InputField
  125. label="标题"
  126. value={nodeConfig.label}
  127. disabled={meta?.editMode == 2}
  128. onChange={value => {
  129. onNodeConfigChange('label', value);
  130. }}
  131. />
  132. </div>
  133. <div className={`${PREFIX}-panel-group`}>
  134. <h5>数据</h5>
  135. <RadioField
  136. label="多个版本"
  137. value={nodeConfig.muti_version}
  138. onChange={value => {
  139. onNodeConfigChange('muti_version', value);
  140. }}
  141. options={[
  142. { label: '是', value: 1 },
  143. { label: '否', value: 0 },
  144. ]}
  145. />
  146. <RadioField
  147. label="起始起点"
  148. value={nodeConfig.is_start_node}
  149. onChange={value => {
  150. onNodeConfigChange('is_start_node', value);
  151. }}
  152. options={[
  153. { label: '是', value: 1 },
  154. { label: '否', value: 0 },
  155. ]}
  156. />
  157. <RadioField
  158. label="是否用印"
  159. value={nodeConfig.is_seal}
  160. onChange={value => {
  161. onNodeConfigChange('is_seal', value);
  162. }}
  163. options={[
  164. { label: '是', value: 1 },
  165. { label: '否', value: 0 },
  166. ]}
  167. />
  168. {nodeConfig.is_start_node == 1 && (
  169. <>
  170. <InputField
  171. label="模板名称"
  172. value={nodeConfig.version_name}
  173. onChange={value => {
  174. onNodeConfigChange('version_name', value);
  175. }}
  176. />
  177. {/* <UploadField
  178. label="模板"
  179. onChange={url => onNodeConfigChange('bom_template', url)}
  180. beforeUpload={beforeUpload}
  181. /> */}
  182. {/* <div onClick={handleFileNameClick}>{fileName}</div> */}
  183. <a href={nodeConfig.bom_template}>{fileName}</a>
  184. </>
  185. )}
  186. <div className="group">
  187. <label>权限</label>
  188. <Select
  189. value={
  190. nodeConfig.role_list ? nodeConfig.role_list.split(',').map(item => Number(item)) : []
  191. }
  192. mode="multiple"
  193. allowClear
  194. style={{ width: '100%' }}
  195. placeholder="选择权限"
  196. onChange={(v: number[]) => {
  197. onNodeConfigChange('role_list', v.join(','));
  198. }}
  199. disabled={meta?.editMode == 2}
  200. options={options}
  201. />
  202. </div>
  203. </div>
  204. {meta?.editMode != 2 && (
  205. <div className={`${PREFIX}-panel-group`}>
  206. <h5>样式</h5>
  207. <Position
  208. x={nodeConfig.x}
  209. y={nodeConfig.y}
  210. onChange={(key, value) => {
  211. onNodeConfigChange(key, value);
  212. }}
  213. />
  214. <Size
  215. width={nodeConfig.width}
  216. height={nodeConfig.height}
  217. onChange={(key, value) => {
  218. onNodeConfigChange(key, value);
  219. }}
  220. />
  221. <ColorPicker
  222. label="填充"
  223. value={nodeConfig.fill}
  224. onChange={(value: string) => {
  225. onNodeConfigChange('fill', value);
  226. }}
  227. />
  228. <ColorPicker
  229. label="边框"
  230. value={nodeConfig.stroke}
  231. onChange={(value: string) => {
  232. onNodeConfigChange('stroke', value);
  233. }}
  234. />
  235. <InputNumberField
  236. label="消息数量"
  237. value={nodeConfig.count}
  238. onChange={value => {
  239. onNodeConfigChange('count', value);
  240. }}
  241. />
  242. <div style={{ display: 'flex' }}>
  243. <InputNumberField
  244. label="字号"
  245. value={nodeConfig.fontSize}
  246. width={68}
  247. onChange={value => {
  248. onNodeConfigChange('fontSize', value);
  249. }}
  250. style={{ marginRight: 10 }}
  251. />
  252. <ColorPicker
  253. value={nodeConfig.fontFill}
  254. onChange={(value: string) => {
  255. onNodeConfigChange('fontFill', value);
  256. }}
  257. />
  258. </div>
  259. </div>
  260. )}
  261. <Button type="primary" onClick={onSave}>
  262. 保存
  263. </Button>
  264. </div>
  265. );
  266. };
  267. function RecthServe(props: any) {
  268. return (
  269. <FlowchartFormWrapper {...props}>
  270. {(config, plugin) => <Component {...props} plugin={plugin} config={config} />}
  271. </FlowchartFormWrapper>
  272. );
  273. }
  274. export default connect(({ user }) => ({ roleList: user.roleList }))(RecthServe);