import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { Form, Row, Col, Input, Button, notification, Modal, Select, Radio } from 'antd'
|
import moment from 'moment'
|
|
import Utils from '@/utils/utils.js'
|
import Api from '@/api'
|
import './index.scss'
|
|
const { TextArea } = Input
|
|
class CustomForm extends Component {
|
static propTpyes = {
|
dict: PropTypes.object, // 字典项
|
setting: PropTypes.object, // 设置
|
searches: PropTypes.array, // 搜索条件
|
systemScripts: PropTypes.array, // 系统脚本
|
customScripts: PropTypes.array, // 自定义脚本
|
scriptsChange: PropTypes.func // 表单
|
}
|
|
state = {
|
editItem: null,
|
loading: false,
|
usefulFields: ''
|
}
|
|
UNSAFE_componentWillMount() {
|
const { searches } = this.props
|
|
let _usefulFields = []
|
searches.forEach(item => {
|
if (item.type === 'group') {
|
if (item.transfer === 'true') {
|
_usefulFields.push(item.field)
|
}
|
_usefulFields.push(item.datefield)
|
_usefulFields.push(item.datefield + '1')
|
} else if (['dateweek', 'datemonth', 'daterange'].includes(item.type)) {
|
_usefulFields.push(item.field)
|
_usefulFields.push(item.field + '1')
|
} else if (_usefulFields.includes(item.field)) {
|
_usefulFields.push(item.field + '1')
|
} else {
|
_usefulFields.push(item.field)
|
}
|
})
|
|
this.setState({
|
usefulFields: _usefulFields.join(', ')
|
})
|
}
|
|
edit = (record) => {
|
this.setState({
|
editItem: record
|
})
|
|
this.props.form.setFieldsValue({
|
sql: record.sql,
|
initsql: record.initsql || 'false'
|
})
|
}
|
|
handleCancel = () => {
|
this.setState({
|
editItem: null
|
})
|
this.props.form.setFieldsValue({
|
sql: ''
|
})
|
}
|
|
handleConfirm = () => {
|
const { searches, setting } = this.props
|
|
// 表单提交时检查输入值是否正确
|
this.props.form.validateFieldsAndScroll((err, values) => {
|
if (!err) {
|
values.uuid = this.state.editItem ? this.state.editItem.uuid : ''
|
|
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: '自定义sql语句中,不可出现字符 -- ,注释请用 /*内容*/',
|
duration: 5
|
})
|
return
|
}
|
|
let error = Utils.verifySql(values.sql, 'customscript')
|
|
if (error) {
|
notification.warning({
|
top: 92,
|
message: 'sql中不可使用' + error,
|
duration: 5
|
})
|
return
|
}
|
|
let tail = `
|
aaa:
|
`
|
|
let _initsql = ''
|
this.props.customScripts.forEach(script => {
|
if (this.state.editItem && this.state.editItem.uuid === script.uuid) return
|
if (script.status === 'false' || script.initsql !== 'true') return
|
|
_initsql += `
|
${script.sql}
|
`
|
})
|
|
let param = {
|
func: 's_debug_sql',
|
LText: _initsql + values.sql + tail
|
}
|
|
param.LText = param.LText.replace(/@\$|\$@/ig, '')
|
|
let allSearch = Utils.initMainSearch(searches)
|
allSearch = Utils.getAllSearchOptions(allSearch)
|
|
let regoptions = allSearch.map(item => {
|
return {
|
reg: new RegExp('@' + item.key + '@', 'ig'),
|
value: `'${item.value}'`
|
}
|
})
|
|
regoptions.push({
|
reg: new RegExp('@orderBy@', 'ig'),
|
value: setting.order
|
})
|
if (setting.laypage !== 'false') {
|
regoptions.push({
|
reg: new RegExp('@pageSize@', 'ig'),
|
value: 10
|
}, {
|
reg: new RegExp('@pageIndex@', 'ig'),
|
value: 1
|
})
|
}
|
|
regoptions.forEach(item => {
|
param.LText = param.LText.replace(item.reg, item.value)
|
})
|
|
param.LText = Utils.formatOptions(param.LText)
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
|
param.secretkey = Utils.encrypt(param.LText, param.timestamp)
|
|
this.setState({loading: true})
|
Api.getLocalConfig(param).then(res => {
|
if (res.status) {
|
this.setState({
|
loading: false,
|
editItem: null
|
}, () => {
|
this.props.scriptsChange(values)
|
})
|
this.props.form.setFieldsValue({
|
sql: ''
|
})
|
} else {
|
this.setState({loading: false})
|
|
Modal.error({
|
title: res.message
|
})
|
}
|
})
|
}
|
})
|
}
|
|
selectScript = (value, option) => {
|
let _sql = this.props.form.getFieldValue('sql')
|
if (_sql) {
|
_sql = _sql + `
|
|
`
|
}
|
|
_sql = _sql.replace(/\s{6}$/, '')
|
_sql = _sql + `/*${option.props.children}*/
|
`
|
_sql = _sql.replace(/\s{4}$/, '')
|
_sql = _sql + value
|
|
this.props.form.setFieldsValue({
|
sql: _sql
|
})
|
}
|
|
render() {
|
const { systemScripts, setting } = this.props
|
const { getFieldDecorator } = this.props.form
|
const { usefulFields } = this.state
|
const formItemLayout = {
|
labelCol: {
|
xs: { span: 24 },
|
sm: { span: 8 }
|
},
|
wrapperCol: {
|
xs: { span: 24 },
|
sm: { span: 16 }
|
}
|
}
|
|
return (
|
<Form {...formItemLayout} className="modal-menu-setting-script">
|
<Row gutter={24}>
|
{setting.tableName ? <Col span={8}>
|
<Form.Item label={'表名'} style={{whiteSpace: 'nowrap', margin: 0}}>
|
{setting.tableName}
|
</Form.Item>
|
</Col> : null}
|
<Col span={16}>
|
<Form.Item label={'报错字段'} style={{margin: 0}}>
|
ErrorCode, retmsg
|
</Form.Item>
|
</Col>
|
<Col span={24} className="sqlfield">
|
<Form.Item label={'可用字段'}>
|
id, bid, loginuid, sessionuid, userid, appkey, orderBy{setting.laypage !== 'false' ? ', pageSize, pageIndex': ''}{usefulFields ? ', ' + usefulFields : ''}
|
</Form.Item>
|
</Col>
|
<Col span={8} style={{whiteSpace: 'nowrap'}}>
|
<Form.Item style={{marginBottom: 0}} label="初始化sql">
|
{getFieldDecorator('initsql', {
|
initialValue: 'false'
|
})(
|
<Radio.Group>
|
<Radio value="true">是</Radio>
|
<Radio value="false">否</Radio>
|
</Radio.Group>
|
)}
|
</Form.Item>
|
</Col>
|
<Col span={10}>
|
<Form.Item label={'快捷添加'} style={{marginBottom: 0}}>
|
<Select
|
showSearch
|
filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
|
onChange={this.selectScript}
|
>
|
{systemScripts.map((option, i) =>
|
<Select.Option style={{whiteSpace: 'normal'}} key={i} value={option.value}>{option.name}</Select.Option>
|
)}
|
</Select>
|
</Form.Item>
|
</Col>
|
<Col span={6} className="add">
|
<Button onClick={this.handleConfirm} loading={this.state.loading} className="mk-green" style={{marginTop: 5, marginBottom: 15, marginLeft: 30}}>
|
保存
|
</Button>
|
<Button onClick={this.handleCancel} style={{marginTop: 5, marginBottom: 15, marginLeft: 10}}>
|
取消
|
</Button>
|
</Col>
|
<Col span={24} className="sql">
|
<Form.Item label={'sql'}>
|
{getFieldDecorator('sql', {
|
initialValue: '',
|
rules: [
|
{
|
required: true,
|
message: this.props.dict['form.required.input'] + 'sql!'
|
}
|
]
|
})(<TextArea rows={15} />)}
|
</Form.Item>
|
</Col>
|
</Row>
|
</Form>
|
)
|
}
|
}
|
|
export default Form.create()(CustomForm)
|