import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { is, fromJS } from 'immutable'
|
import { Form, Row, Col, Button, notification, Modal, Tooltip, Radio, Select, Switch } from 'antd'
|
import { QuestionCircleOutlined } from '@ant-design/icons'
|
|
import Api from '@/api'
|
import { checkSQL } from '@/utils/utils-custom.js'
|
import CodeMirror from '@/templates/zshare/codemirror'
|
// import './index.scss'
|
|
class CustomForm extends Component {
|
static propTpyes = {
|
btn: PropTypes.object, // 按钮信息
|
scripts: PropTypes.array, // 自定义脚本列表
|
usefulfields: PropTypes.any, // 可用字段
|
systemScripts: PropTypes.array, // 系统脚本
|
scriptsChange: PropTypes.func
|
}
|
|
state = {
|
editItem: null,
|
usefulfields: null,
|
loading: false,
|
skip: false,
|
verifySql: ''
|
}
|
|
UNSAFE_componentWillMount () {
|
this.resetfield(this.props.usefulfields)
|
}
|
|
UNSAFE_componentWillReceiveProps (nextProps) {
|
if (nextProps.usefulfields && !is(fromJS(this.props.usefulfields), fromJS(nextProps.usefulfields))) {
|
this.resetfield(nextProps.usefulfields)
|
}
|
}
|
|
resetfield = (columns) => {
|
const { btn } = this.props
|
columns = columns.filter(item => item.import !== 'false')
|
let fields = columns.map(item => item.Column)
|
|
fields.push('jskey')
|
|
let _dec = columns.map(item => item.Column + ' ' + item.type).join(',')
|
let sheet = btn.sheet.replace(/(.*)\.(.*)\.|@db@/ig, '')
|
|
if (_dec) {
|
_dec += ','
|
}
|
|
let _sql = `create table #${sheet} (${_dec}jskey nvarchar(50),BID nvarchar(50) )
|
Declare @UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100),@ErrorCode nvarchar(50), @retmsg nvarchar(4000),@tbid Nvarchar(512)
|
Select @ErrorCode='', @retmsg=''
|
`
|
|
this.setState({
|
verifySql: _sql,
|
usefulfields: fields.join(', ')
|
})
|
}
|
|
edit = (record) => {
|
const { type } = this.props
|
|
this.setState({
|
editItem: record
|
})
|
|
if (type === 'fullscreen') {
|
this.props.form.setFieldsValue({
|
sql: record.sql
|
})
|
} else {
|
this.props.form.setFieldsValue({
|
sql: record.sql,
|
position: record.position || 'back'
|
})
|
}
|
}
|
|
handleConfirm = () => {
|
const { type, btn, workFlow } = this.props
|
const { editItem, skip } = this.state
|
|
// 表单提交时检查输入值是否正确
|
this.props.form.validateFieldsAndScroll((err, values) => {
|
if (type === 'fullscreen' && err) {
|
notification.warning({
|
top: 92,
|
message: '请输入sql!',
|
duration: 5
|
})
|
return
|
}
|
|
if (!err) {
|
if (/^[\s\n]+$/.test(values.sql)) {
|
notification.warning({
|
top: 92,
|
message: '请输入sql!',
|
duration: 5
|
})
|
return
|
}
|
|
values.uuid = editItem ? editItem.uuid : ''
|
values.position = values.position || (editItem ? editItem.position : 'front')
|
|
if (type === 'fullscreen' && editItem) {
|
values.status = editItem.status || 'true'
|
}
|
|
let pass = checkSQL(values.sql, 'customscript')
|
|
if (!pass) return
|
|
let sheet = btn.sheet.replace(/(.*)\.(.*)\.|@db@/ig, '')
|
let tail = `
|
drop table #${sheet}
|
aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg
|
`
|
|
let _initCustomScript = '' // 初始化脚本
|
let _prevCustomScript = '' // 默认sql前执行脚本
|
let _backCustomScript = '' // 默认sql后执行脚本
|
|
this.props.scripts.forEach(item => {
|
if (item.status === 'false') return
|
|
if (item.position === 'init') {
|
_initCustomScript += `
|
/* 初始化脚本 */
|
${values.uuid === item.uuid ? values.sql : item.sql}
|
`
|
} else if (item.position === 'front') {
|
_prevCustomScript += `
|
/* 默认sql前脚本 */
|
${values.uuid === item.uuid ? values.sql : item.sql}
|
`
|
} else {
|
_backCustomScript += `
|
/* 默认sql后脚本 */
|
${values.uuid === item.uuid ? values.sql : item.sql}
|
`
|
}
|
})
|
|
if (!values.uuid) {
|
if (values.position === 'init') {
|
_initCustomScript += `
|
/* 初始化脚本 */
|
${values.sql}
|
`
|
} else if (values.position === 'front') {
|
_prevCustomScript += `
|
/* 默认sql前脚本 */
|
${values.sql}
|
`
|
} else {
|
_backCustomScript += `
|
/* 默认sql后脚本 */
|
${values.sql}
|
`
|
}
|
}
|
|
let sql = this.state.verifySql + _initCustomScript + _prevCustomScript + _backCustomScript + tail
|
sql = sql.replace(/@\$|\$@/ig, '').replace(/\$check@|@check\$/ig, '').replace(/@datam@/ig, `''`).replace(/@typename@/ig, `'debug'`)
|
|
if (workFlow === 'true') {
|
sql = sql.replace(/@works_flow_code@/ig, `'works_flow_code'`)
|
sql = sql.replace(/@works_flow_name@/ig, `'works_flow_name'`)
|
sql = sql.replace(/@works_flow_param@/ig, `'works_flow_param'`)
|
sql = sql.replace(/@works_flow_detail_id@/ig, `'works_flow_detail_id'`)
|
sql = sql.replace(/@status@/ig, `0`)
|
sql = sql.replace(/@statusname@/ig, `'开始'`)
|
sql = sql.replace(/@work_group@/ig, `'work_group'`)
|
sql = sql.replace(/@work_grade@/ig, '0')
|
sql = sql.replace(/@start_type@/ig, `'开始'`)
|
}
|
|
if (skip) {
|
this.setState({
|
skip: false,
|
editItem: null
|
}, () => {
|
this.props.scriptsChange(values)
|
})
|
this.props.form.setFieldsValue({
|
sql: ' '
|
})
|
} else {
|
this.setState({loading: true})
|
Api.sDebug(sql).then(res => {
|
if (res.status || res.ErrCode === '-2') {
|
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
|
})
|
}
|
})
|
}
|
}
|
})
|
}
|
|
handleCancel = () => {
|
this.setState({
|
editItem: null
|
})
|
|
this.props.form.setFieldsValue({
|
sql: ' '
|
})
|
}
|
|
selectScript = (value, option) => {
|
const { usefulfields, btn } = this.props
|
|
let _value = ''
|
if (value === 'default') {
|
let fields = usefulfields.filter(item => item.import !== 'false')
|
fields = fields.map(col => col.Column).join(',')
|
|
if (fields) {
|
fields = fields + ','
|
}
|
|
let database = btn.sheet.match(/(.*)\.(.*)\.|@db@/ig) || ''
|
let sheet = btn.sheet.replace(/(.*)\.(.*)\.|@db@/ig, '')
|
|
database = database ? (database[0] || '') : ''
|
|
_value = `Insert into ${database}${sheet} (${fields}createuserid,createuser,createstaff,bid)\nSelect ${fields}@userid@,@username,@fullname,@BID@ From #${sheet}`
|
} else if (value === 'flowSql') {
|
let sheet = btn.sheet.replace(/(.*)\.(.*)\.|@db@/ig, '')
|
|
_value = `insert into s_my_works_flow (works_flow_id,works_flow_code,works_flow_name,works_flow_param,status,statusname,work_group,works_flow_detail_id,work_grade,bid,createuserid,CreateUser,CreateStaff,upid)
|
select jskey,@works_flow_code@,@works_flow_name@,@works_flow_param@,@status@,@statusname@,@work_group@,@works_flow_detail_id@,@work_grade@,@bid@,@UserID@,@UserName,@FullName,@time_id@
|
from #${sheet}
|
|
insert into s_my_works_flow_log (works_flow_id,works_flow_code,works_flow_name,works_flow_param,status,statusname,works_flow_detail_id,work_group,work_grade,bid,createuserid,CreateUser,CreateStaff,upid)
|
select jskey,@works_flow_code@,@works_flow_name@ ,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@,@bid@,@UserID@,@UserName,@FullName,@time_id@
|
from #${sheet}
|
|
insert into s_my_works_flow_notice (works_flow_id,works_flow_code,works_flow_detail_id,userid,notice_type,createuserid,CreateUser,CreateStaff,upid)
|
select jskey,@works_flow_code@,@works_flow_detail_id@,@userid@,@start_type@,@userid@,@UserName,@FullName,@time_id@
|
from #${sheet}
|
|
insert into s_my_works_flow_role (works_flow_id,works_flow_code,userid,works_flow_detail_id,createuserid,CreateUser,CreateStaff,upid,typecharone)
|
select jskey,@works_flow_code@,@userid@,@works_flow_detail_id@,@userid@,@UserName,@FullName,@time_id@,'begin'
|
from #${sheet}`
|
} else {
|
_value = value
|
}
|
|
let _sql = this.props.form.getFieldValue('sql')
|
if (/^\s+$/.test(_sql)) {
|
_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, btn, type, workFlow } = this.props
|
const { usefulfields, editItem, skip } = this.state
|
const { getFieldDecorator } = this.props.form
|
const formItemLayout = {
|
labelCol: {
|
xs: { span: 24 },
|
sm: { span: 8 }
|
},
|
wrapperCol: {
|
xs: { span: 24 },
|
sm: { span: 16 }
|
}
|
}
|
|
return (
|
<Form {...formItemLayout} className="verify-form" id="verify-excelin-custom-scripts">
|
<Row gutter={24}>
|
{!type && btn.sheet ? <Col span={8}>
|
<Form.Item label="表名" style={{whiteSpace: 'nowrap', margin: 0}}>
|
{btn.sheet}(临时表请使用#{btn.sheet.replace(/(.*)\.(.*)\.|@db@/ig, '')})
|
</Form.Item>
|
</Col> : null}
|
{!type ? <Col span={10}>
|
<Form.Item label="报错字段" style={{margin: 0, whiteSpace: 'nowrap'}}>
|
errorcode(增加后缀NT表示数据不回滚,如ENT、NNT、FNT、NMNT、CNT、-2NT), retmsg
|
</Form.Item>
|
</Col> : null}
|
{!type ? <Col span={24} className="sqlfield">
|
<Form.Item label="可用字段">
|
<Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'公共值,请按照@xxx@格式使用。'}><span style={{color: '#1890ff'}}>BID, ID, LoginUID, SessionUid, UserID, Appkey, lang, time_id, typename</span></Tooltip>,
|
{workFlow === 'true' ? <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title="工作流变量,请按照@xxx@格式使用。"><span style={{color: '#26C281'}}>works_flow_code, works_flow_name, works_flow_param, works_flow_detail_id, status, statusname, work_group, work_grade, start_type, </span></Tooltip> : null}
|
<Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'系统变量,系统会定义变量并赋值。'}><span style={{color: '#fa8c16'}}>UserName, FullName, RoleID, mk_departmentcode, mk_organization, mk_user_type, mk_nation, mk_province, mk_city, mk_district, mk_address</span></Tooltip>,
|
{usefulfields}
|
</Form.Item>
|
</Col> : null}
|
{!type ? <Col span={8} style={{whiteSpace: 'nowrap'}}>
|
<Form.Item style={{marginBottom: 0}} label={
|
<Tooltip placement="bottomLeft" title="自定义脚本与默认sql位置关系。">
|
<QuestionCircleOutlined className="mk-form-tip" />
|
执行位置
|
</Tooltip>
|
}>
|
{getFieldDecorator('position', {
|
initialValue: 'front'
|
})(
|
<Radio.Group>
|
<Radio value="init">初始化</Radio>
|
<Radio value="front">sql前</Radio>
|
<Radio value="back">sql后</Radio>
|
</Radio.Group>
|
)}
|
</Form.Item>
|
</Col> : null}
|
{!type ? <Col span={8}>
|
<Form.Item style={{marginBottom: 0}} label="快捷添加">
|
<Select
|
showSearch
|
filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
|
onSelect={this.selectScript}
|
getPopupContainer={() => document.getElementById('verify-excelin-custom-scripts')}
|
>
|
<Select.Option key="default" value="default">默认sql</Select.Option>
|
{workFlow === 'true' ? <Select.Option key="flow" value="flowSql">默认sql(工作流)</Select.Option> : null}
|
<Select.Option key="debugger" value={`z_debug: select @ErrorCode='E',@retmsg='测试断点' goto aaa`}>
|
测试断点
|
</Select.Option>
|
{systemScripts.map((option, i) =>
|
<Select.Option key={i} value={option.value}>
|
{option.name}
|
</Select.Option>
|
)}
|
</Select>
|
</Form.Item>
|
</Col> : null}
|
<Col span={5} className="add" style={{paddingTop: '2px', whiteSpace: 'nowrap'}}>
|
<Button onClick={this.handleConfirm} loading={this.state.loading} className="mk-green" style={{marginBottom: 15, marginLeft: 40}}>
|
{type === 'fullscreen' && !editItem ? '添加' : '保存'}
|
</Button>
|
<Button onClick={this.handleCancel} style={{marginBottom: 15, marginLeft: 10}}>
|
取消
|
</Button>
|
</Col>
|
<Col span={3} className="forced" style={{paddingTop: '12px', fontSize: '12px', whiteSpace: 'nowrap'}}>
|
强制保存:
|
<Switch checked={skip} size="small" onChange={() => this.setState({skip: !skip})}/>
|
</Col>
|
<Col span={24} className="sql">
|
<Form.Item label="sql">
|
{getFieldDecorator('sql', {
|
initialValue: '',
|
rules: [
|
{
|
required: true,
|
message: '请输入sql!'
|
}
|
]
|
})(<CodeMirror />)}
|
</Form.Item>
|
</Col>
|
</Row>
|
</Form>
|
)
|
}
|
}
|
|
export default Form.create()(CustomForm)
|