/** * 徐立 * 2019年9月25日 * 自定义表单表格 */ import React, { Component } from 'react'; import { Form } from 'antd'; import { Row, Col, Input, message } from 'antd'; import TableCom from '../tableCompon'; import { Toast } from 'antd-mobile'; import router from 'umi/router'; import IsNewTable from './isNewMobileTable'; import NewWebTable from './isNewWebTable'; import maintain from '../assets/maintain.png'; import moment from 'moment'; export default class ZdyTable extends Component { constructor(props) { super(props); this.state = { selects: new Map(), left: 0, top: 0, max: 4, formId: null, formCode: null, width: 100, mapData: {}, defaultBinds: {}, sqlData: {}, defaultValues: {}, currentFormKey: null, items: [], init: this.props.init || {}, datas: {}, isEdit: true, isRowCol:false, isReady: false, formConfig: {}, }; } componentDidMount() { let { postData, // 数据源 isCg, // 用户点击草稿页面进入 isForm, isPreview, // 是否为预览模式 isChild, // 是否为子表单 isQRCode = false, // 是否为二维码快捷发起 formDeafault = '', // 为二维码快捷发起默认值 } = this.props; if (isPreview || isChild) { this.setState({ ...this.state, ...this.props, isReady: true, formConfig: { ...this.state.formConfig, style: this.props.style }, }); return; } let 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]; 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: this.props.table ? val.formKey : obj.init, sqlData, isEdit: this.props.formKey ? false : true, 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.setState({ items: xxx.items, init: { ...this.state.init, ...JSON.parse(val.content) }, datas: obj.datas, isEdit: this.props.formKey ? false : true, currentFormKey: 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]; // 是否是存在历史表单传入值 this.setState( { appId: val.id, formId: val.id, formCode: val.code, datas: obj.datas, mapData, sqlData, defaultValues: val.unifiedServicePatternModel.defaultValues, isEdit: this.props.formKey ? false : true, currentFormKey: this.props.formKey ? this.props.formKey : val.taskFormKey ? val.taskFormKey : obj.init, 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); } }, ); } catch (e) { console.log(`公式配置有误`, e); } } componentWillReceiveProps(nextProps) { let { postData, // 数据源 isCg, // 用户点击草稿页面进入 isForm, isPreview, // 是否为预览模式 isChild, // 是否为子表单 } = nextProps; if (isPreview || isChild) { this.setState({ ...this.state, ...this.props, isReady: true, formConfig: { ...this.state.formConfig, style: this.props.style }, }); return; } try { let 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.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, sqlData, isEdit: this.props.formKey ? false : true, 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.setState({ items: xxx.items, init: { ...this.state.init, ...JSON.parse(val.content) }, datas: obj.datas, isEdit: this.props.formKey ? false : true, currentFormKey: 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]; // 是否是存在历史表单传入值 this.setState({ appId: val.id, datas: obj.datas, mapData, sqlData, defaultValues: val.unifiedServicePatternModel.defaultValues, isEdit: this.props.formKey ? false : true, currentFormKey: this.props.formKey ? this.props.formKey : val.taskFormKey ? val.taskFormKey : obj.init, 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 => { var max = 0; items.forEach(r => { if (r.length > max) { max = r.length; } }); return max; }; render() { let { width, isRowCol, isBorder, sqlData, mapData, defaultBinds, defaultValues, items, init, modalTitle, currentFormKey, isEdit, datas, isReady, formConfig, formCode, formId, } = this.state; let { border, get, obj, index, fatherCode, routerState, // 场景设计器共享路由参数 messageData, // 场景设计器共享变量参数 设计器监听到参数发生变化后会重新渲染组件 postData, modalInit, concealModel, // 场景设计器内置跳转函数 paddingBottom, } = 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: 5 }, }, wrapperCol: { xs: { span: 24 }, sm: { span: 16 }, }, }; 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: 'auto', width: '100%', height: this.props.height, paddingBottom: paddingBottom != null ? paddingBottom : '10px', } : { overflow: 'auto', width: '100%', paddingBottom: paddingBottom != null ? paddingBottom : '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; }} > {/* <NewWebTable items={items} checkAllHidden={this.checkAllHidden} border={border} isBorder={isBorder} borderStyle={borderStyle} fatherCode={fatherCode} index={index} datas={datas} isEdit={isEdit} currentFormKey={currentFormKey} init={init} get={get} obj={obj} 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} max={max} /> */} <table style={{ overflow: 'auto', margin: max * width > 550 ? 'auto' : '', ...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' && 'none', }} > <TableCom formCode={formCode} // 当前表单code modalInit={modalInit} formId={formId} // 当前表单Id i={i} // 当前组件下标 j={j} // 当前行数下班 fatherCode={fatherCode} index={index} fatherObj={this.props.fatherObj} datas={datas} uuid={cell.uuid} isEdit={isEdit} formKey={currentFormKey} init={init} get={get} // 区分移动端或wen端 json={cell.content} obj={obj || {}} // 是否存在默认值 mapData={mapData} form={this.props.form} // antd form控件 sqlData={sqlData} defaultValues={defaultValues || {}} // 接口中的默认值 routerState={routerState} // 兼容表单设计器路由传参 messageData={messageData} // 场景设计器共享变量参数 concealModel={concealModel || {}} // 场景设计器内置路由跳转函数 /> </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 isRowCol={isRowCol} modalInit={modalInit} items={items} checkAllHidden={this.checkAllHidden} isBorder={isBorder} borderStyle={borderStyle} fatherCode={fatherCode} index={index} datas={datas} isEdit={isEdit} currentFormKey={currentFormKey} init={init} get={get} obj={obj} 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 || {}} // 场景设计器内置路由跳转函数 /> {/* { items.map((item, i) => { const allhidden = this.checkAllHidden(items) return (<div key={i} style={{ marginTop: 0, background: '#ffffff', paddingLeft: 12, width: '100%', flexWrap: 'wrap', ...style }}> { item.map((ary, j) => { return !allhidden && ary.hidden ? "" : <><TableCom formCode={formCode} formId={formId} i={i} j={j} index={index} fatherCode={fatherCode} datas={datas} isEdit={isEdit} fatherObj={this.props.fatherObj} formKey={currentFormKey} init={init} get={get} key={j} sqlData={sqlData} obj={obj || {}} form={this.props.form} mapData={mapData} json={ary.content} uuid={ary.uuid} routerState={routerState} // 兼容表单设计器路由传参 defaultValues={defaultValues || {}} messageData={messageData} // 场景设计器共享变量参数 /></> }) } </div>) }) } */} </Form> )} </> ); } } }