mapServe.tsx 8.8 KB

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