From 92224e3d5e03f223bf2fb4b0eb88b74e790d8da9 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期一, 17 一月 2022 10:00:05 +0800 Subject: [PATCH] 2022-01-17 --- src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx | 429 +++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 350 insertions(+), 79 deletions(-) diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx index efe1b65..72cc3a2 100644 --- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx +++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx @@ -1,95 +1,198 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' -import { Form, Tabs, Row, Col, Button, Table, Popconfirm, Icon, notification, Modal, message, InputNumber } from 'antd' +import { fromJS } from 'immutable' +import { Form, Tabs, Row, Col, Button, notification, Modal, message, InputNumber, Radio } from 'antd' +import moment from 'moment' +import Api from '@/api' import Utils from '@/utils/utils.js' import ColumnForm from './columnform' +import CodeMirror from '@/templates/zshare/codemirror' +import asyncComponent from '@/utils/asyncComponent' import './index.scss' const { TabPane } = Tabs +const { confirm } = Modal +const EditTable = asyncComponent(() => import('@/templates/zshare/editTable')) class VerifyCard extends Component { static propTpyes = { dict: PropTypes.object, // 瀛楀吀椤� + config: PropTypes.object, card: PropTypes.object, } state = { verify: {}, + defaultscript: '', // 鑷畾涔夎剼鏈� excelColumns: [ { title: this.props.dict['model.form.field'], dataIndex: 'Column', - width: '25%' + inputType: 'input', + editable: true, + unique: true, + width: '20%' }, { title: this.props.dict['model.name'], dataIndex: 'Text', - width: '25%' + inputType: 'input', + editable: true, + width: '20%' }, { title: this.props.dict['model.form.columnWidth'], dataIndex: 'Width', - width: '25%' + inputType: 'number', + min: 5, + max: 200, + editable: true, + width: '20%', + render: (text) => text || 20 }, { - title: '鎿嶄綔', - align: 'center', - dataIndex: 'operation', - render: (text, record) => - ( - <div> - <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'columns')} style={{color: '#1890ff'}}><Icon type="edit" /></span> - <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'columns', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span> - <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'columns', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span> - <Popconfirm - title={this.props.dict['header.form.query.delete']} - okText={this.props.dict['model.confirm']} - cancelText={this.props.dict['model.cancel']} - onConfirm={() => this.handleDelete(record, 'columns') - }> - <span style={{color: '#1890ff', cursor: 'pointer'}}><Icon type="delete" /></span> - </Popconfirm> - </div> - ) + title: '绫诲瀷', + dataIndex: 'type', + inputType: 'select', + editable: true, + required: false, + width: '20%', + render: (text) => { + if (text === 'image') { + return '鍥剧墖' + } else { + return '鏂囨湰' + } + }, + options: [ + {value: 'text', text: '鏂囨湰'}, + {value: 'image', text: '鍥剧墖'} + ] + }, + { + title: '鍙栫粷瀵瑰��', + dataIndex: 'abs', + inputType: 'select', + editable: true, + required: false, + width: '20%', + render: (text) => { + if (text === 'true') { + return '鏄�' + } else { + return '鍚�' + } + }, + options: [ + {value: 'true', text: '鏄�'}, + {value: 'false', text: '鍚�'} + ] } ] } UNSAFE_componentWillMount() { - let _verify = this.props.card.verify || {} + const { config, card } = this.props + let _verify = {} - let _columns = _verify.columns || [] - _columns = _columns.map(col => { - col.Width = col.Width || 20 + if (card.verify) { + _verify = fromJS(card.verify).toJS() + } + + _verify.enable = _verify.enable || 'false' + _verify.columns = _verify.columns || [] + + if (card.intertype !== 'system') { + _verify.enable = 'false' + } + if (_verify.columns[0] && !_verify.columns[0].type) { + _verify.columns = _verify.columns.map(col => { + col.type = col.type || 'text' + return col + }) + } + + let defaultscript = '' + if (!_verify.script && card.intertype === 'system') { + let search = this.formatSearch(config.search) + search = Utils.joinMainSearchkey(search) + search = search.replace(/@\$@/ig, '') + search = search ? 'where ' + search : '' - return col - }) + defaultscript = `update ${config.setting.tableName || ''} set idefine5= idefine5+1 ,modifydate=getdate(),cdefine5='宸插鍑�',modifyuserid=@userid@ ${search}` + } + this.setState({ - verify: { - ..._verify, - columns: _columns, - } + verify: _verify, + defaultscript: defaultscript }) + } + + /** + * @description 鑾峰彇鍏ㄩ儴鎼滅储鏉′欢 + * @param {Array} searches 鎼滅储鏉′欢鏁扮粍 + */ + formatSearch (searches) { + if (!searches || searches.length === 0) return [] + + let newsearches = [] + searches.forEach(search => { + if (!search.field) return + + let item = { + key: search.field, + match: search.match, + type: search.type, + label: search.label, + value: search.initval, + required: search.required === 'true' + } + if (item.type === 'group') { + item.key = search.datefield + item.type = 'daterange' + item.match = 'between' + item.value = [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')].join(',') + + newsearches.push(item) + return + } else if (item.type === 'date') { + item.value = moment().format('YYYY-MM-DD') + } else if (item.type === 'datemonth') { + item.value = moment().format('YYYY-MM') + } else if (item.type === 'dateweek') { + item.value = moment().format('YYYY-MM-DD') + } else if (item.type === 'daterange') { + item.value = [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')].join(',') + } else if (item.type === 'multiselect' || (item.type === 'checkcard' && search.multiple === 'true')) { + item.type = 'multi' + item.value = '@$@' + } else { + item.value = '@$@' + } + newsearches.push(item) + }) + + return newsearches } columnChange = (values) => { let verify = JSON.parse(JSON.stringify(this.state.verify)) - if (values.uuid) { - verify.columns = verify.columns.map(item => { - if (item.uuid === values.uuid) { - return values - } else { - return item - } + let fields = verify.columns.map(item => item.Column) + if (fields.includes(values.Column)) { + notification.warning({ + top: 92, + message: values.Column + '瀛楁宸插瓨鍦紒', + duration: 5 }) - } else { - values.uuid = Utils.getuuid() - verify.columns.push(values) + return } + values.uuid = Utils.getuuid() + values.abs = 'false' + verify.columns.push(values) this.setState({ verify: verify @@ -102,25 +205,6 @@ verify.columns = verify.columns.filter(item => item.uuid !== record.uuid) this.setState({ verify: verify }) - } - - handleEdit = (record, type) => { - this.columnForm.edit(record) - - let node = document.getElementById('verify-excelout-box-tab').parentNode - - if (node && node.scrollTop) { - let inter = Math.ceil(node.scrollTop / 10) - - let timer = setInterval(() => { - if (node.scrollTop - inter > 0) { - node.scrollTop = node.scrollTop - inter - } else { - node.scrollTop = 0 - clearInterval(timer) - } - }, 10) - } } handleUpDown = (record, type, direction) => { @@ -191,7 +275,7 @@ } handleConfirm = () => { - let verify = JSON.parse(JSON.stringify(this.state.verify)) + let verify = fromJS(this.state.verify).toJS() // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭� return new Promise((resolve, reject) => { @@ -208,12 +292,165 @@ return } - resolve(verify) + if (verify.enable === 'true') { + this.props.form.validateFieldsAndScroll((err, values) => { + if (!err) { + values.sql = values.sql || '' + + let _quot = values.sql.match(/'{1}/g) + let _lparen = values.sql.match(/\({1}/g) + let _rparen = values.sql.match(/\){1}/g) + + _quot = _quot ? _quot.length : 0 + _lparen = _lparen ? _lparen.length : 0 + _rparen = _rparen ? _rparen.length : 0 + + if (_quot % 2 !== 0) { + notification.warning({ + top: 92, + message: 'sql涓璡'蹇呴』鎴愬鍑虹幇', + duration: 5 + }) + return + } else if (_lparen !== _rparen) { + notification.warning({ + top: 92, + message: 'sql涓�()蹇呴』鎴愬鍑虹幇', + duration: 5 + }) + return + } else if (/--/ig.test(values.sql)) { + notification.warning({ + top: 92, + message: '鑷畾涔塻ql璇彞涓紝涓嶅彲鍑虹幇瀛楃 -- 锛屾敞閲婅鐢� /*鍐呭*/', + duration: 5 + }) + return + } + + let error = Utils.verifySql(values.sql, 'customscript') + + if (error) { + notification.warning({ + top: 92, + message: 'sql涓笉鍙娇鐢�' + error, + duration: 5 + }) + return + } + + let param = { + func: 's_debug_sql', + exec_type: 'y', + LText: values.sql + } + + param.LText = param.LText.replace(/@\$|\$@/ig, '') + + param.LText = Utils.formatOptions(param.LText) + param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + param.secretkey = Utils.encrypt('', param.timestamp) + + Api.getLocalConfig(param).then(res => { + if (res.status) { + resolve({...verify, script: values.sql}) + } else { + Modal.error({ + title: res.message + }) + } + }) + } else { + notification.warning({ + top: 92, + message: '鑷畾涔夎剼鏈笉鍙负绌猴紒', + duration: 5 + }) + } + }) + } else { + resolve(verify) + } }) } + changeEnable = (e) => { + const { verify } = this.state + + this.setState({ + verify: {...verify, enable: e.target.value} + }) + } + + columnFieldInput = () => { + const { config } = this.props + const { verify } = this.state + + let columns = fromJS(verify.columns).toJS() + let fields = columns.map(item => item.Column) + + config.columns.forEach(item => { + if (fields.includes(item.field) || !item.field) return + fields.push(item.field) + + columns.push({ + Column: item.field, + Text: item.label, + Width: 20, + abs: 'false', + type: 'text', + uuid: Utils.getuuid() + }) + }) + + this.setState({ + verify: {...verify, columns: columns} + }) + } + + clearField = () => { + const { verify } = this.state + const _this = this + + confirm({ + content: `纭畾娓呯┖Excel鍒楀悧锛焋, + onOk() { + _this.setState({ + verify: { + ...verify, + columns: [] + } + }) + }, + onCancel() {} + }) + } + + changeColumns = (columns) => { + const { verify } = this.state + + if (columns[0] && (columns[0].type !== 'image' && columns[0].type !== 'text')) { + columns = columns.map(col => { + let _cell = { + uuid: Utils.getuuid(), + Column: col.Column, + Text: col.Text, + Width: 20, + abs: 'false', + type: 'text', + } + + return _cell + }) + } + + this.setState({verify: {...verify, columns}}) + } + render() { - const { verify, excelColumns } = this.state + const { card } = this.props + const { verify, excelColumns, defaultscript } = this.state + const { getFieldDecorator } = this.props.form const formItemLayout = { labelCol: { xs: { span: 24 }, @@ -228,21 +465,55 @@ return ( <div id="verify-excelout-box-tab"> <Tabs defaultActiveKey="1" className="verify-card-box" onChange={this.tabchange}> - <TabPane tab="Excel瀵煎嚭鍒�" key="1"> - <ColumnForm - dict={this.props.dict} - columnChange={this.columnChange} - wrappedComponentRef={(inst) => this.columnForm = inst} - /> - <Table - bordered - rowKey="uuid" - className="custom-table" - dataSource={verify.columns} - columns={excelColumns} - pagination={false} - /> + <TabPane tab={ + <span> + Excel瀵煎嚭鍒� + {verify.columns.length ? <span className="count-tip">{verify.columns.length}</span> : null} + </span> + } key="1"> + <ColumnForm dict={this.props.dict} columnChange={this.columnChange}/> + <Button className="excel-col-add mk-green" title="娣诲姞鏄剧ず鍒楀瓧娈�" onClick={this.columnFieldInput}> + 鍚屾鏄剧ず鍒� + </Button> + <Button className="excel-col-add mk-red" title="娓呯┖Excel鍒�" onClick={this.clearField}> + 娓呯┖Excel鍒� + </Button> + <div style={{color: '#959595', fontSize: '13px', paddingLeft: '10px'}}>濡傞渶瀵煎嚭搴忓彿锛岃浣跨敤瀛楁 $Index銆�</div> + <EditTable actions={['edit', 'move', 'copy', 'del']} type="excelcolumn" data={verify.columns} columns={excelColumns} onChange={this.changeColumns}/> </TabPane> + {card.intertype === 'system' ? <TabPane tab={ + <span> + 鑷畾涔夎剼鏈� + {verify.enable === 'true' ? <span className="count-tip">1</span> : null} + </span> + } key="6"> + <Form {...formItemLayout} className="verify-form"> + <Row gutter={24}> + <Col span={8}> + <Form.Item style={{marginBottom: 10}} label={'鍚敤'}> + <Radio.Group defaultValue={verify.enable || 'false'} onChange={this.changeEnable}> + <Radio value="true">鏄�</Radio> + <Radio value="false">鍚�</Radio> + </Radio.Group> + </Form.Item> + </Col> + <div style={{color: '#959595', fontSize: '13px', paddingTop: '30px', float: 'right'}}>鎵ц鎴愬姛鍚庣殑鍥炶皟鍑芥暟銆�</div> + <Col span={24} className="sql"> + <Form.Item label={'sql'}> + {getFieldDecorator('sql', { + initialValue: verify.script || defaultscript, + rules: [ + { + required: true, + message: this.props.dict['form.required.input'] + 'sql!' + } + ] + })(<CodeMirror />)} + </Form.Item> + </Col> + </Row> + </Form> + </TabPane> : null} <TabPane tab="淇℃伅鎻愮ず" key="7"> <Form {...formItemLayout}> <Row gutter={24}> -- Gitblit v1.8.0