mapServe.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. import React, { useState, useEffect } from 'react';
  2. import { FlowchartFormWrapper } from '@antv/xflow';
  3. import { Button, message } 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. export interface IConfig {
  17. label?: string;
  18. x?: number;
  19. y?: number;
  20. width?: number;
  21. height?: number;
  22. fontSize?: number;
  23. count?: number;
  24. fontFill?: string;
  25. fill?: string;
  26. stroke?: string;
  27. muti_version?: string | number;
  28. is_start_node?: string | number;
  29. bom_template?: string;
  30. version_name?: string;
  31. data?: any;
  32. excel_info?: any;
  33. }
  34. const defaultConfig: IConfig = {
  35. muti_version: 1,
  36. is_start_node: 0,
  37. };
  38. const Component = (props: any) => {
  39. const { config, plugin = {} } = props;
  40. const { updateNode } = plugin;
  41. const [nodeConfig, setNodeConfig] = useState<IConfig>({
  42. ...defaultConfig,
  43. ...config,
  44. });
  45. const onNodeConfigChange = (key: string, value: number | string | object) => {
  46. if (key) {
  47. setNodeConfig({
  48. ...nodeConfig,
  49. [key]: value,
  50. });
  51. updateNode({
  52. [key]: value,
  53. });
  54. } else if (value instanceof Object) {
  55. setNodeConfig({
  56. ...nodeConfig,
  57. ...value,
  58. });
  59. updateNode({
  60. ...value,
  61. });
  62. }
  63. };
  64. const onSave = () => {
  65. UnityAction.emit('NODE_SAVE', nodeConfig);
  66. };
  67. const beforeUpload = (file: any) => {
  68. LuckyExcel.transformExcelToLucky(file, (exportJson, luckysheetfile) => {
  69. if (exportJson.sheets == null || exportJson.sheets.length == 0) {
  70. message.error('读取xlsx文件失败!');
  71. return;
  72. }
  73. console.log(exportJson);
  74. const sheet = exportJson.sheets[0];
  75. let titleCell = [];
  76. sheet.celldata.forEach(item => {
  77. if(item.r == 0) {
  78. // 标题头
  79. titleCell.push(item)
  80. }
  81. // 生成cid
  82. item.v.cid = `${item.r}-${item.c}`
  83. })
  84. let cell = titleCell.map(item => {
  85. let value = '';
  86. if (item.v?.v) {
  87. value = item.v?.v;
  88. } else if (item.v.ct?.s && item.v.ct?.s instanceof Array) {
  89. value = item.v.ct.s.map(item => item?.v).join?.('');
  90. }
  91. return { sheet_name: sheet.name, col_idx: item.r, col_axis: item.c, col_value: value };
  92. });
  93. onNodeConfigChange(null, {
  94. data: [sheet],
  95. excel_info: {
  96. file_name: file.name,
  97. excel_cols: cell,
  98. },
  99. });
  100. });
  101. };
  102. useEffect(() => {
  103. setNodeConfig({
  104. ...defaultConfig,
  105. ...config,
  106. });
  107. }, [config]);
  108. // console.log(nodeConfig, config)
  109. return (
  110. <div className={`${PREFIX}-panel-body`}>
  111. <div className={`${PREFIX}-panel-group`}>
  112. <h5>内容</h5>
  113. <InputFiled
  114. label="标题"
  115. value={nodeConfig.label}
  116. onChange={value => {
  117. onNodeConfigChange('label', value);
  118. }}
  119. />
  120. </div>
  121. <div className={`${PREFIX}-panel-group`}>
  122. <h5>数据</h5>
  123. <RadioField
  124. label="多个版本"
  125. value={nodeConfig.muti_version}
  126. onChange={value => {
  127. onNodeConfigChange('muti_version', value);
  128. }}
  129. options={[
  130. { label: '是', value: 1 },
  131. { label: '否', value: 0 },
  132. ]}
  133. />
  134. <RadioField
  135. label="起始起点"
  136. value={nodeConfig.is_start_node}
  137. onChange={value => {
  138. onNodeConfigChange('is_start_node', value);
  139. }}
  140. options={[
  141. { label: '是', value: 1 },
  142. { label: '否', value: 0 },
  143. ]}
  144. />
  145. {nodeConfig.is_start_node == 1 && (
  146. <>
  147. <InputFiled
  148. label="版本名称"
  149. value={nodeConfig.version_name}
  150. onChange={value => {
  151. onNodeConfigChange('version_name', value);
  152. }}
  153. />
  154. <UploadFiled
  155. label="模板"
  156. onChange={url => onNodeConfigChange('bom_template', url)}
  157. beforeUpload={beforeUpload}
  158. />
  159. </>
  160. )}
  161. </div>
  162. <div className={`${PREFIX}-panel-group`}>
  163. <h5>样式</h5>
  164. <Position
  165. x={nodeConfig.x}
  166. y={nodeConfig.y}
  167. onChange={(key, value) => {
  168. onNodeConfigChange(key, value);
  169. }}
  170. />
  171. <Size
  172. width={nodeConfig.width}
  173. height={nodeConfig.height}
  174. onChange={(key, value) => {
  175. onNodeConfigChange(key, value);
  176. }}
  177. />
  178. <ColorPicker
  179. label="填充"
  180. value={nodeConfig.fill}
  181. onChange={(value: string) => {
  182. onNodeConfigChange('fill', value);
  183. }}
  184. />
  185. <ColorPicker
  186. label="边框"
  187. value={nodeConfig.stroke}
  188. onChange={(value: string) => {
  189. onNodeConfigChange('stroke', value);
  190. }}
  191. />
  192. <InputNumberFiled
  193. label="消息数量"
  194. value={nodeConfig.count}
  195. onChange={value => {
  196. onNodeConfigChange('count', value);
  197. }}
  198. />
  199. <div style={{ display: 'flex' }}>
  200. <InputNumberFiled
  201. label="字号"
  202. value={nodeConfig.fontSize}
  203. width={68}
  204. onChange={value => {
  205. onNodeConfigChange('fontSize', value);
  206. }}
  207. style={{ marginRight: 10 }}
  208. />
  209. <ColorPicker
  210. value={nodeConfig.fontFill}
  211. onChange={(value: string) => {
  212. onNodeConfigChange('fontFill', value);
  213. }}
  214. />
  215. </div>
  216. </div>
  217. <Button type="primary" onClick={onSave}>
  218. 保存
  219. </Button>
  220. </div>
  221. );
  222. };
  223. export default function RecthServe(props: any) {
  224. return (
  225. <FlowchartFormWrapper {...props}>
  226. {(config, plugin) => <Component {...props} plugin={plugin} config={config} />}
  227. </FlowchartFormWrapper>
  228. );
  229. }