/** * 徐立 * 2019年9月25日 * 自定义表单表格 */ import React, { Component } from 'react'; import { Form, Row, Col, Input, message } from 'antd'; import UUID from 'react-native-uuid'; import { Toast } from 'antd-mobile'; import router from 'umi/router'; import moment from 'moment'; import { HyperFormula } from 'hyperformula'; import TableCom from '../tableCompon'; import IsNewTable from './isNewMobileTable'; import maintain from '../assets/maintain.png'; export default class ZdyTable extends Component { constructor(props) { super(props); this.state = { objRealTime:{}, isChange: false, selects: new Map(), left: 0, top: 0, max: 4, formId: null, formCode: null, width: 100, mapData: {}, defaultBinds: {}, sqlData: {}, defaultValues: {}, currentFormKey: null, currentFormTitle: null, items: [], init: this.props.init || {}, datas: {}, isEdit: true, isRowCol: false, isReady: false, formConfig: {}, }; } componentDidMount() { const { postData, // 数据源 isCg, // 用户点击草稿页面进入 isForm, isPreview, // 是否为预览模式 isChild, // 是否为子表单 isQRCode = false, // 是否为二维码快捷发起 formDeafault = '', // 为二维码快捷发起默认值 } = this.props; if (isPreview || isChild) { this.initExcel({ datas: this.props.datas, trees: this.props.trees }, () => { this.setState( { ...this.state, ...this.props, formConfig: { ...this.state.formConfig, style: this.props.style }, isReady: true, }); }); return; } const val = postData; try { /** * 数据源不同进行以下区别处理 * this.props.table有传入值表明需要渲染流程中最新表单 */ if (isForm) { // 由表格的操作按钮进入 const mapData = {}; const sqlData = {}; const dataObjs = val.form.dataObjModels; for (var i = 0; i < dataObjs.length; i++) { const dob = dataObjs[i]; for (var j = 0; j < dob.columnModels.length; j++) { mapData[dob.columnModels[j].base52] = dob.columnModels[j]; } } const sqls = val.form.sqlModels; for (var i = 0; i < sqls.length; i++) { const dob = sqls[i].dataObjModel; for (var j = 0; j < dob.columnModels.length; j++) { sqlData[dob.columnModels[j].base52] = dob.columnModels[j]; } } const obj = JSON.parse(val.form.content); const xxx = obj.datas[obj.init]; const fk = this.props.table ? val.formKey : obj.init; this.initExcel(obj,()=>{ this.setState({ datas: obj.datas, width: this.props.table ? obj.datas[val.formKey].width : xxx.width, isBorder: this.props.table ? obj.datas[val.formKey].isBorder : xxx.isBorder, isRowCol: this.props.table ? obj.datas[val.formKey].isRowCol : xxx.isRowCol, mapData, currentFormKey: fk, currentFormTitle: this.getCurrentFormTitle(obj, fk), sqlData, isEdit: !this.props.formKey, items: this.props.table ? obj.datas[val.formKey].items : xxx.items, defaultValues: val.form.defaultValues, appId: val.appId, isReady: true, formConfig: xxx, }) }) return; } if (isCg === 'yes') { // 用户从编辑按钮进入 if ( val.unifiedServicePatternModel.isDefaultError != null && val.unifiedServicePatternModel.isDefaultError ) { if (this.props.get == 'web') { message.error('当前办理人数较多,服务繁忙,请稍后再试!'); } else { Toast.fail('当前办理人数较多,服务繁忙,请稍后再试!'); } router.goBack(); return; } const mapData = {}; const sqlData = {}; const sqls = val.unifiedServicePatternModel.sqlModels; for (var i = 0; i < sqls.length; i++) { const dob = sqls[i].dataObjModel; for (var j = 0; j < dob.columnModels.length; j++) { sqlData[dob.columnModels[j].base52] = dob.columnModels[j]; } } const dataObjs = val.unifiedServicePatternModel.dataObjModels; for (var i = 0; i < dataObjs.length; i++) { const dob = dataObjs[i]; for (var j = 0; j < dob.columnModels.length; j++) { mapData[dob.columnModels[j].base52] = dob.columnModels[j]; } } const obj = JSON.parse(val.unifiedServicePatternModel.content); const xxx = obj.datas[obj.init]; this.initExcel(obj,()=>{ this.setState({ items: xxx.items, init: { ...this.state.init, ...JSON.parse(val.content) }, datas: obj.datas, isEdit: !this.props.formKey, currentFormKey: obj.init, currentFormTitle: this.getCurrentFormTitle(obj, obj.init), width: xxx.width, isBorder: xxx.isBorder, isRowCol: xxx.isRowCol, mapData, sqlData, defaultValues: val.unifiedServicePatternModel.defaultValues, appId: val.appId, isReady: true, formConfig: xxx, defaultBinds: this.props.table ? obj.datas[val.taskFormKey].defaultBinds : xxx.defaultBinds, }) }) return; } if ( val.unifiedServicePatternModel.isDefaultError != null && val.unifiedServicePatternModel.isDefaultError ) { if (this.props.get == 'web') { message.error('当前办理人数较多,服务繁忙,请稍后再试!'); } else { Toast.fail('当前办理人数较多,服务繁忙,请稍后再试!'); } router.goBack(); return; } const mapData = {}; const sqlData = {}; const sqls = val.unifiedServicePatternModel.sqlModels; for (var i = 0; i < sqls.length; i++) { const dob = sqls[i].dataObjModel; for (var j = 0; j < dob.columnModels.length; j++) { sqlData[dob.columnModels[j].base52] = dob.columnModels[j]; } } const dataObjs = val.unifiedServicePatternModel.dataObjModels; for (var i = 0; i < dataObjs.length; i++) { const dob = dataObjs[i]; for (var j = 0; j < dob.columnModels.length; j++) { mapData[dob.columnModels[j].base52] = dob.columnModels[j]; } } const obj = JSON.parse(val.unifiedServicePatternModel.content); const xxx = obj.datas[this.props.formKey ? this.props.formKey : obj.init]; // 是否是存在历史表单传入值 const fk = this.props.formKey ? this.props.formKey : val.taskFormKey ? val.taskFormKey : obj.init; this.initExcel(obj,()=> this.setState( { appId: val.id, formId: val.id, formCode: val.code, datas: obj.datas, mapData, sqlData, defaultValues: val.unifiedServicePatternModel.defaultValues, isEdit: !this.props.formKey, currentFormKey: fk, currentFormTitle: this.getCurrentFormTitle(obj, fk), defaultBinds: this.props.table ? obj.datas[val.taskFormKey].defaultBinds : xxx.defaultBinds, width: this.props.table ? obj.datas[val.taskFormKey].width : xxx.width, isBorder: this.props.table ? obj.datas[val.taskFormKey].isBorder : xxx.isBorder, isRowCol: this.props.table ? obj.datas[val.taskFormKey].isRowCol : xxx.isRowCol, items: this.props.table ? obj.datas[val.taskFormKey].items : xxx.items, isReady: true, init: { ...this.state.init, ...(val.isSecond ? this.props.obj : {}) }, formConfig: xxx, // init:this.props.get==="mobile"?!!val.content?JSON.parse(val.content):'':{},// 移动端默认值设置 },() => { /** * 为二维码快捷发起时自动设置新默认值 */ if (isQRCode) { this.props.form.setFieldsValue(formDeafault); } this.initExcel(obj); } )); } catch (e) { console.log('公式配置有误', e); } } importExcel = (res) => { const { datas, trees } = this.configs; const sheets = res.sheets; for (var s = 0; s < sheets.length; s++) { const uuid = sheets[s].key; const items = []; const cc = sheets[s].cells; for (var i = 0; i < cc.length; i++) { const rows = []; const rr = cc[i]; for (var j = 0; j < rr.length; j++) { const c = rr[j]; if (c.value == null || c.value == '') { rows.push({ uuid: 'id_' + UUID.v4().replace(/-/g, '2'), row: c.rowSpan, col: c.colSpan, content: { comName: 'Excel', cwidth: c.width, cheight: c.height }, }); } else { rows.push({ uuid: 'id_' + UUID.v4().replace(/-/g, '2'), row: c.rowSpan, col: c.colSpan, content: { comName: 'Excel', initialValue: c.value, cwidth: c.width, cheight: c.height }, }); } } items.push(rows); } const charts = sheets[s].charts; if (charts && charts.length > 0) { const rows = []; for (var j = 0; j < charts.length; j++) { const chartModel = charts[j]; rows.push({ uuid: 'id_' + UUID.v4().replace(/-/g, '2'), content: { comName: 'Echart', columnIds: { c1: [] }, labelSpan: 24, wrapperSpan: 24, isLabel: false, formula: 'return ' + JSON.stringify(chartModel.option), }, }); items.push(rows); } } if (datas[uuid] == null) { trees.push({ title: sheets[s].name, key: uuid }); } datas[uuid] = { width: 400, max: 1, isBorder: true, items: items, }; } this.initExcel({ datas, trees }, () => this.setState({ isChange: !this.state.isChange })); console.log('公式导入excel成功'); }; hfInstance; childExcel = (sheetData, datas, tr) => { if (tr.children == null || tr.children.length == 0) { } else { for (var c = 0; c < tr.children.length; c++) { this.childExcel(sheetData, datas, tr.children[c]); } } const data = datas[tr.key]; const all = []; for (var i = 0; i < data.items.length; i++) { const row = data.items[i]; const r = []; for (var j = 0; j < row.length; j++) { const col = row[j]; if (col.content?.comName == 'Excel') { r.push(col.content.initialValue); } else { r.push(''); } } all.push(r); } sheetData[tr.title] = all; }; configs; initExcel = (configs, callback) => { if (configs == null || configs.trees == null){ if (callback) callback(); return ; } if (configs.trees != null) this.configs = configs; const sheetData = {}; for (var key in configs.trees) { const tr = configs.trees[key]; this.childExcel(sheetData, configs.datas, tr); } const hfInstance = HyperFormula.buildFromSheets(sheetData, {}); this.hfInstance = hfInstance; if (callback) callback(); }; getCellValue = (i, j, currentTitle) => { let hfInstance = this.props.hfInstance ? this.props.hfInstance : this.hfInstance; if (hfInstance && currentTitle) { let x = hfInstance.getCellValue({ col: j, row: i, sheet: hfInstance.getSheetId(currentTitle) }); if (x && x.value != null) { x = x.value; } return x; } }; componentWillReceiveProps(nextProps) { const { postData, // 数据源 isCg, // 用户点击草稿页面进入 isForm, isPreview, // 是否为预览模式 isChild, // 是否为子表单 } = nextProps; if (isPreview || isChild) { this.setState({ ...this.state, ...nextProps, isReady: true, formConfig: { ...this.state.formConfig, style: nextProps.style }, }, () => this.initExcel({ datas: nextProps.datas, trees: nextProps.trees })); return; } try { const val = postData; /** * 数据源不同进行以下区别处理 * this.props.table有传入值表明需要渲染流程中最新表单 */ if (isForm) { // 由表格的操作按钮进入 const mapData = {}; const sqlData = {}; const dataObjs = val.form.dataObjModels; for (var i = 0; i < dataObjs.length; i++) { const dob = dataObjs[i]; for (var j = 0; j < dob.columnModels.length; j++) { mapData[dob.columnModels[j].base52] = dob.columnModels[j]; } } const sqls = val.form.sqlModels; for (var i = 0; i < sqls.length; i++) { const dob = sqls[i].dataObjModel; for (var j = 0; j < dob.columnModels.length; j++) { sqlData[dob.columnModels[j].base52] = dob.columnModels[j]; } } const obj = JSON.parse(val.form.content); const xxx = obj.datas[obj.init]; this.initExcel(obj,()=>{ this.setState({ datas: obj.datas, width: this.props.table ? obj.datas[val.formKey].width : xxx.width, isRowCol: this.props.table ? obj.datas[val.formKey].isRowCol : xxx.isRowCol, isBorder: this.props.table ? obj.datas[val.formKey].isBorder : xxx.isBorder, mapData, currentFormKey: this.props.table ? val.formKey : obj.init, currentFormTitle: this.getCurrentFormTitle(obj, fk), sqlData, isEdit: !this.props.formKey, items: this.props.table ? obj.datas[val.formKey].items : xxx.items, defaultValues: val.form.defaultValues, appId: val.appId, isReady: true, formConfig: xxx, }) }) return; } if (isCg === 'yes') { // 用户从编辑按钮进入 const mapData = {}; const sqlData = {}; const sqls = val.unifiedServicePatternModel.sqlModels; for (var i = 0; i < sqls.length; i++) { const dob = sqls[i].dataObjModel; for (var j = 0; j < dob.columnModels.length; j++) { sqlData[dob.columnModels[j].base52] = dob.columnModels[j]; } } const dataObjs = val.unifiedServicePatternModel.dataObjModels; for (var i = 0; i < dataObjs.length; i++) { const dob = dataObjs[i]; for (var j = 0; j < dob.columnModels.length; j++) { mapData[dob.columnModels[j].base52] = dob.columnModels[j]; } } const obj = JSON.parse(val.unifiedServicePatternModel.content); const xxx = obj.datas[obj.init]; this.initExcel(obj,()=>{ this.setState({ items: xxx.items, init: { ...this.state.init, ...JSON.parse(val.content) }, datas: obj.datas, isEdit: !this.props.formKey, currentFormKey: obj.init, currentFormTitle: this.getCurrentFormTitle(obj, obj.init), width: xxx.width, isBorder: xxx.isBorder, isRowCol: xxx.isRowCol, mapData, sqlData, defaultValues: val.unifiedServicePatternModel.defaultValues, appId: val.appId, isReady: true, formConfig: xxx, defaultBinds: this.props.table ? obj.datas[val.taskFormKey].defaultBinds : xxx.defaultBinds, }) }) return; } const mapData = {}; const sqlData = {}; const sqls = val.unifiedServicePatternModel.sqlModels; for (var i = 0; i < sqls.length; i++) { const dob = sqls[i].dataObjModel; for (var j = 0; j < dob.columnModels.length; j++) { sqlData[dob.columnModels[j].base52] = dob.columnModels[j]; } } const dataObjs = val.unifiedServicePatternModel.dataObjModels; for (var i = 0; i < dataObjs.length; i++) { const dob = dataObjs[i]; for (var j = 0; j < dob.columnModels.length; j++) { mapData[dob.columnModels[j].base52] = dob.columnModels[j]; } } const obj = JSON.parse(val.unifiedServicePatternModel.content); const xxx = obj.datas[this.props.formKey ? this.props.formKey : obj.init]; // 是否是存在历史表单传入值 const fk = this.props.formKey ? this.props.formKey : val.taskFormKey ? val.taskFormKey : obj.init; this.initExcel(obj,()=>{ this.setState({ appId: val.id, datas: obj.datas, mapData, sqlData, defaultValues: val.unifiedServicePatternModel.defaultValues, isEdit: !this.props.formKey, currentFormKey: fk, currentFormTitle: this.getCurrentFormTitle(obj, fk), defaultBinds: this.props.table ? obj.datas[val.taskFormKey].defaultBinds : xxx.defaultBinds, width: this.props.table ? obj.datas[val.taskFormKey].width : xxx.width, isBorder: this.props.table ? obj.datas[val.taskFormKey].isBorder : xxx.isBorder, isRowCol: this.props.table ? obj.datas[val.taskFormKey].isRowCol : xxx.isRowCol, items: this.props.table ? obj.datas[val.taskFormKey].items : xxx.items, isReady: true, init: { ...this.state.init, ...(val.isSecond ? this.props.obj : {}) }, formConfig: xxx, // init:this.props.get==="mobile"?!!val.content?JSON.parse(val.content):'':{},// 移动端默认值设置 }) }) } catch (e) { console.log('公式配置有误', e); } } checkAllHidden = row => { for (var i = 0; i < row.length; i++) { if (row[i].hidden == null || !row[i].hidden) { return false; } } for (var i = 0; i < row.length; i++) { delete row[i].hidden; } return true; }; countMax = items => { let max = 0; items.forEach(r => { if (r.length > max) { max = r.length; } }); return max; }; getCurrentFormTitle = (obj, key) => { if (obj == null) return; const { trees } = obj; if (trees == null) return; return this.getT(trees, key); }; getCurrentFormTitle2 = (key) => { if (this.configs == null) return; const { trees } = this.configs; if (trees == null) return; return this.getT(trees, key); }; setRealTimeValues=(obj)=>{ this.setState({objRealTime:obj}) } getT = (trees, key) => { for (var i = 0; i < trees.length; i++) { if (trees[i].children == null || trees[i].children.length == 0) { if (trees[i].key == key) { return trees[i].title; } } else { return this.getT(trees[i].children, key); } } }; render() { const { width, isRowCol, isBorder, sqlData, mapData, defaultBinds, defaultValues, items, init, modalTitle, currentFormKey, currentFormTitle, isEdit, datas, isReady, formConfig, formCode, formId, } = this.state; const { border, get, obj, index, fatherCode, routerState, // 场景设计器共享路由参数 messageData, // 场景设计器共享变量参数 设计器监听到参数发生变化后会重新渲染组件 postData, modalInit, concealModel, // 场景设计器内置跳转函数 paddingBottom, taskAssignee, userId, isDynamic, // 是否为大数据页面 isWebPrint, // 打印界面 isWebPrintEnd, isPreview, trees, } = this.props; let style = {}; if (formConfig.style != null) { try { style = JSON.parse(formConfig.style); } catch (e) { //console.log(e); style = {}; } } const formItemLayout = { labelCol: { xs: { span: 24 }, sm: { span: 24 }, }, wrapperCol: { xs: { span: 24 }, sm: { span: 24 }, }, }; const max = this.countMax(items); const borderStyle = { borderRight: '1px solid gray', borderTop: '1px solid gray', borderLeft: '1px solid gray', borderBottom: '1px solid gray', }; const borderStyleTwo = { // 处理隐藏组件边框样式问题 borderRight: '1px solid gray', borderLeft: '1px solid gray', borderTop: '1px solid gray', }; let updateTime; const styleDiv = this.props.height ? { overflow: isDynamic ? 'hidden' : 'auto', // overflowY: isDynamic && 'auto', width: '100%', height: this.props.height, paddingBottom: paddingBottom != null ? paddingBottom : isWebPrint ? 0 : '10px', } : { overflow: isDynamic ? 'hidden' : 'auto', // overflowY: isDynamic && 'auto', width: '100%', paddingBottom: paddingBottom != null ? paddingBottom : isWebPrint ? 0 : '10px', }; if (!isReady) return <></>; if (this.props.postData?.isUpdate) { updateTime = moment(+this.props.postData?.updateTime).format('llll'); } switch (get) { case 'web': return ( <> {this.props.postData?.isUpdate ? ( <div style={{ margin: '100px 24px 24px' }}> <div style={{ textAlign: 'center' }}> <img style={{ marginRight: 30 }} src={maintain}></img> </div> <p style={{ textAlign: 'center', width: '100%', fontSize: '16px', fontWeight: 'bold', color: '#666666', }} > {updateTime !== 'Invalid date' ? `升级维护中,预计${updateTime ?? '一万年'}恢复使用,请耐心等待。` : '请耐心等待'} </p> </div> ) : ( <div id="web_table"> <Form className="login-form"> {isEdit && defaultBinds ? Object.keys(defaultBinds).map(k => { const r = defaultBinds[k]; if ( r.columnIds == null || r.columnIds.length < 2 || r.sqls == null || r.sqls.length < 2 ) { return ''; } const name = r.columnIds[r.columnIds.length - 1]; const key = r.sqls[r.sqls.length - 1]; const value = defaultValues[key]; if (value == null) { return ''; } return this.props.form.getFieldDecorator(name, { initialValue: value, })(<Input type="hidden"/>); }) : ''} <Row> <Col span={24}> <div style={styleDiv} ref={ref => { this.root = ref; }} > <table style={{ overflow: 'auto', margin: max * width > 550 ? 'auto' : '', marginBottom: isWebPrint ? (isWebPrintEnd ? '5px' : 0) : '1px', ...style, }} border={border} cellSpacing="0" cellPadding="0" > <tbody> {items.map((row, i) => { const allhidden = this.checkAllHidden(row); return ( <tr key={i}> {row.map((cell, j) => { if (!cell.content) { return; } let styles = {}; if (cell.content && cell.content.styles) { try { styles = JSON.parse(cell.content.styles); } catch (e) { console.log(`第${i}行第${j}列样式配置有误,${e}`); } } return !allhidden && cell.hidden ? ( '' ) : ( <td width={ i == 0 ? (cell.content != null && cell.content.cwidth != null ? cell.content.cwidth : width) * (cell.col ? cell.col : 1) : width * (cell.col ? cell.col : 1) } rowSpan={cell.row} colSpan={cell.col} key={j} style={{ overflow: 'auto', textAlign: cell.content && cell.content.calign ? cell.content.calign : 'left', ...(isBorder ? cell?.content?.comName == 'InputHidden' || !cell?.content?.comName ? {} : borderStyle : {}), // position: cell.content&&cell.content.comName ==="InputHidden"&&'absolute', ...styles, display: cell.content && (cell.content.comName === 'InputHidden' || cell.content.isHidden) && 'none', }} > <TableCom importExcel={this.importExcel} getCellValue={this.getCellValue} getCurrentFormTitle={this.getCurrentFormTitle2} hfInstance={this.hfInstance} isWebPrintEnd={isWebPrintEnd} isWebPrint={isWebPrint} isPrint={this.props.isPrint} formCode={formCode} // 当前表单code modalInit={modalInit} taskAssignee={taskAssignee} // 提交人 userId={userId} formId={formId} // 当前表单Id i={i} // 当前组件下标 j={j} // 当前行数下班 isPreview={isPreview} fatherCode={fatherCode} index={index} fatherObj={this.props.fatherObj} datas={datas} uuid={cell.uuid} setRealTimeValues={this.setRealTimeValues} isEdit={isEdit} formKey={currentFormKey} currentFormTitle={currentFormTitle} init={init} get={get} // 区分移动端或wen端 json={cell.content} obj={{...obj,...this.state.objRealTime} || {}} // 是否存在默认值 mapData={mapData} form={this.props.form} // antd form控件 sqlData={sqlData} defaultValues={defaultValues || {}} // 接口中的默认值 routerState={routerState} // 兼容表单设计器路由传参 messageData={messageData} // 场景设计器共享变量参数 concealModel={concealModel || {}} // 场景设计器内置路由跳转函数 isDynamic={isDynamic} // 是否为场景配置器调用 trees={trees} /> </td> ); })} </tr> ); })} </tbody> </table> {style.pageBreakAfter != null ? ( <div style={{ pageBreakAfter: style.pageBreakAfter }}></div> ) : ( '' )} </div> </Col> </Row> </Form> </div> )} </> ); case 'mobile': return ( <> {this.props.postData?.isUpdate ? ( <div style={{ margin: '100px 24px 24px' }}> <div style={{ textAlign: 'center' }}> <img style={{ width: '100%' }} src={maintain}></img> </div> <p style={{ textAlign: 'center', width: '100%', fontSize: '16px', fontWeight: 'bold', color: '#666666', }} > {updateTime !== 'Invalid date' ? `升级维护中,预计${updateTime ?? '一万年'}恢复使用,请耐心等待。` : '请耐心等待'} </p> </div> ) : ( <Form {...formItemLayout} id="mobile_table" className="login-form"> {defaultBinds ? Object.keys(defaultBinds).map(k => { const r = defaultBinds[k]; if ( r.columnIds == null || r.columnIds.length < 2 || r.sqls == null || r.sqls.length < 2 ) { return ''; } const name = r.columnIds[r.columnIds.length - 1]; const key = r.sqls[r.sqls.length - 1]; const value = defaultValues[key]; if (value == null) { return ''; } return this.props.form.getFieldDecorator(name, { initialValue: value, })(<Input type="hidden"/>); }) : ''} <IsNewTable getCellValue={this.getCellValue} hfInstance={this.hfInstance} getCurrentFormTitle={this.getCurrentFormTitle2} taskAssignee={taskAssignee} // 提交人 userId={userId} importExcel={this.importExcel} isPreview={isPreview} trees={trees} setRealTimeValues={this.setRealTimeValues} isRowCol={isRowCol} modalInit={modalInit} items={items} checkAllHidden={this.checkAllHidden} isBorder={isBorder} borderStyle={borderStyle} fatherCode={fatherCode} index={index} datas={datas} isEdit={isEdit} currentFormKey={currentFormKey} currentFormTitle={currentFormTitle} init={init} get={get} obj={{...obj,...this.state.objRealTime}} mapData={mapData} form={this.props.form} sqlData={sqlData} defaultValues={defaultValues} width={width} formCode={formCode} style={style} routerState={routerState} // 兼容表单设计器路由传参 messageData={messageData} // 场景设计器共享变量参数 formId={formId} fatherObj={this.props.fatherObj} concealModel={concealModel || {}} // 场景设计器内置路由跳转函数 isDynamic={isDynamic} // 是否为场景配置器调用 /> </Form> )} </> ); } } }