From f393af9623c26ae177a3f69b8676afc4e23bff8d Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期二, 08 二月 2022 14:48:51 +0800 Subject: [PATCH] 2022-02-08 --- src/menu/datasource/verifycard/index.jsx | 249 ++++++++++++++++++++++++++----------------------- 1 files changed, 134 insertions(+), 115 deletions(-) diff --git a/src/menu/datasource/verifycard/index.jsx b/src/menu/datasource/verifycard/index.jsx index 07dadb0..3c0b394 100644 --- a/src/menu/datasource/verifycard/index.jsx +++ b/src/menu/datasource/verifycard/index.jsx @@ -1,7 +1,8 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' import { fromJS } from 'immutable' -import { Form, Tabs, Popconfirm, Icon, notification, Modal, Typography, Spin } from 'antd' +import { Form, Tabs, Popconfirm, notification, Modal, Typography, Spin, message } from 'antd' +import { StopOutlined, CheckCircleOutlined, EditOutlined, SwapOutlined, DeleteOutlined, CopyOutlined } from '@ant-design/icons' import moment from 'moment' import Api from '@/api' @@ -23,7 +24,6 @@ class VerifyCard extends Component { static propTpyes = { dict: PropTypes.object, // 瀛楀吀椤� - menu: PropTypes.object, // 鑿滃崟閰嶇疆淇℃伅 config: PropTypes.object, // 缁勪欢閰嶇疆淇℃伅 } @@ -34,6 +34,7 @@ initsql: '', // sql楠岃瘉鏃跺彉閲忓0鏄庡強璧嬪�� usefulfields: '', defaultsql: '', // 榛樿Sql + defaultSearch: '', systemScripts: [], colColumns: [ { @@ -41,7 +42,7 @@ dataIndex: 'label', inputType: 'input', editable: true, - width: '28%' + width: '20%' }, { title: '瀛楁', @@ -49,13 +50,16 @@ inputType: 'input', editable: true, unique: true, - width: '28%' + copy: true, + width: '20%' }, { title: '鏁版嵁绫诲瀷', dataIndex: 'datatype', inputType: 'select', options: [ + { value: 'Nvarchar(10)', text: 'Nvarchar(10)' }, + { value: 'Nvarchar(20)', text: 'Nvarchar(20)' }, { value: 'Nvarchar(50)', text: 'Nvarchar(50)' }, { value: 'Nvarchar(100)', text: 'Nvarchar(100)' }, { value: 'Nvarchar(512)', text: 'Nvarchar(512)' }, @@ -82,10 +86,19 @@ { value: 'Decimal(18,16)', text: 'Decimal(18,16)' }, { value: 'Decimal(18,17)', text: 'Decimal(18,17)' }, { value: 'Decimal(18,18)', text: 'Decimal(18,18)' }, + { value: 'date', text: 'date' }, + { value: 'datetime', text: 'datetime' }, ], editable: true, - width: '25%', - } + width: '20%', + }, + { + title: '澶囨敞', + dataIndex: 'remark', + inputType: 'textarea', + editable: true, + width: '20%' + }, ], scriptsColumns: [ { @@ -95,12 +108,12 @@ render: (text) => { let title = text.match(/^\s*\/\*.+\*\//) title = title && title[0] ? title[0] : '' - text = title ? text.replace(title, '') : text + let _text = title ? text.replace(title, '') : text return ( <div> - {title ? <span style={{color: '#a50'}}>{title}</span> : null} - <Paragraph copyable ellipsis={{ rows: 4, expandable: true }}>{text}</Paragraph> + {title ? <span style={{color: '#a50'}}>{title}<span style={{fontSize: '12px', marginLeft: '5px'}}>{_text.length}</span></span> : null} + <Paragraph copyable={{ text: text }} ellipsis={{ rows: 4, expandable: true }}>{_text}</Paragraph> </div> ) } @@ -111,15 +124,15 @@ width: '13%', render: (text, record) => record.status === 'false' ? ( - <div> + <div style={{color: '#ff4d4f'}}> {this.props.dict['model.status.forbidden']} - <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" /> + <StopOutlined style={{marginLeft: '5px'}} /> </div> ) : ( - <div> + <div style={{color: '#26C281'}}> {this.props.dict['model.status.open']} - <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" /> + <CheckCircleOutlined style={{marginLeft: '5px'}}/> </div> ) }, @@ -130,14 +143,14 @@ dataIndex: 'operation', render: (text, record) => (<div style={{textAlign: 'center'}}> - <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record)} style={{color: '#1890ff'}}><Icon type="edit" /></span> - <span className="operation-btn" title={this.props.dict['model.status.change']} onClick={() => this.handleStatus(record)} style={{color: '#8E44AD'}}><Icon type="swap" /></span> + <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record)} style={{color: '#1890ff'}}><EditOutlined /></span> + <span className="operation-btn" title={this.props.dict['model.status.change']} onClick={() => this.handleStatus(record)} style={{color: '#8E44AD'}}><SwapOutlined /></span> <Popconfirm overlayClassName="popover-confirm" title={this.props.dict['model.query.delete']} onConfirm={() => this.deleteScript(record) }> - <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span> + <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span> </Popconfirm> </div>) } @@ -145,7 +158,7 @@ } UNSAFE_componentWillMount() { - const { config, mainSearch, menu } = this.props + const { config, mainSearch } = this.props let search = config.search || [] @@ -153,53 +166,33 @@ search = [...search, ...mainSearch] } - let Marks = [] - let getcomponentmarks = (box, conf) => { - if (!conf.parentId && box.Template === 'CustomPage') { - box.components.forEach(item => { - if (item.type === 'group') { - item.components.forEach(cell => { - if (cell.uuid !== conf.uuid && cell.setting && cell.setting.varMark) { - Marks.push(cell.setting.varMark.toLowerCase()) - } - }) - } else if (item.uuid !== conf.uuid && item.setting && item.setting.varMark) { - Marks.push(item.setting.varMark.toLowerCase()) - } + let _setting = fromJS(config.setting).toJS() + let scripts = config.scripts ? fromJS(config.scripts).toJS() : [] + + if (window.GLOB.funcs && window.GLOB.funcs.length > 0) { + window.GLOB.funcs.forEach(m => { + let reg = new RegExp(`\\/\\*\\$ex@${m.func_code}-begin\\*\\/[\\s\\S]+\\/\\*@ex\\$-end\\*\\/`, 'ig') + if (_setting.dataresource) { + _setting.dataresource = _setting.dataresource.replace(reg, `$ex@${m.func_code}@ex$`) + } + scripts && scripts.forEach(item => { + item.sql = item.sql.replace(reg, `$ex@${m.func_code}@ex$`) }) - } else if (conf.parentId === box.parentId && conf.tabId === box.uuid) { - box.components.forEach(item => { - if (item.type === 'group') { - item.components.forEach(cell => { - if (cell.uuid !== conf.uuid && cell.setting && cell.setting.varMark) { - Marks.push(cell.setting.varMark.toLowerCase()) - } - }) - } else if (item.uuid !== conf.uuid && item.setting && item.setting.varMark) { - Marks.push(item.setting.varMark.toLowerCase()) - } - }) - } else { - box.components.forEach(item => { - if (item.type !== 'tabs') return - - item.subtabs.forEach(tab => { - getcomponentmarks(tab, conf) - }) - }) - } + }) } - getcomponentmarks(menu, config) + let _search = this.formatSearch(search) + _search = Utils.joinMainSearchkey(_search) - let _setting = fromJS(config.setting).toJS() + _search = _search.replace(/@\$@/ig, '') + _search = _search ? 'where ' + _search : '' this.setState({ - columns: fromJS(config.columns).toJS(), + scripts, + columns: config.columns ? fromJS(config.columns).toJS() : [], setting: _setting, - scripts: fromJS(config.scripts).toJS(), searches: search, - varMarks: Marks + defaultSearch: _search }) this.getsysScript() @@ -349,7 +342,7 @@ changeTab = (val) => { const { config, mainSearch } = this.props - const { activeKey, varMarks } = this.state + const { activeKey } = this.state this.setState({loading: true}) if (activeKey === 'setting') { @@ -360,20 +353,15 @@ search = [...search, ...mainSearch] } - if (res.varMark && varMarks.includes(res.varMark.toLowerCase())) { - notification.warning({ - top: 92, - message: '鍙橀噺鏍囪瘑涓嶅彲閲嶅锛�', - duration: 5 - }) - this.setState({ - loading: false - }) - return - } + let _search = this.formatSearch(search) + _search = Utils.joinMainSearchkey(_search) + + _search = _search.replace(/@\$@/ig, '') + _search = _search ? 'where ' + _search : '' this.setState({ searches: search, + defaultSearch: _search, setting: res }, () => { this.sqlverify(() => { // 楠岃瘉鎴愬姛 @@ -427,15 +415,9 @@ } getdefaultSql = () => { - const { columns, searches, setting } = this.state + const { columns, setting, defaultSearch } = this.state let defaultsql = '' let arr_field = columns.map(col => col.field).join(',') - - let _search = this.formatSearch(searches) - _search = Utils.joinMainSearchkey(_search) - - _search = _search.replace(/@\$@/ig, '') - _search = _search ? 'where ' + _search : '' if (setting.dataresource) { let _dataresource = setting.dataresource @@ -444,7 +426,7 @@ _dataresource = '(' + _dataresource + ') tb' } - defaultsql = `select top @pageSize@ ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by @orderBy@) as rows from ${_dataresource} ${_search}) tmptable where rows > (@pageSize@ * (@pageIndex@ - 1)) order by tmptable.rows` + defaultsql = `select top @pageSize@ ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by @orderBy@) as rows from ${_dataresource} ${defaultSearch}) tmptable where rows > (@pageSize@ * (@pageIndex@ - 1)) order by tmptable.rows` } this.setState({defaultsql}) @@ -455,7 +437,7 @@ * @param {Array} searches 鎼滅储鏉′欢鏁扮粍 */ formatSearch (searches) { - if (!searches || searches.length === 0) return [] + if (!searches) return [] let newsearches = [] searches.forEach(search => { @@ -470,43 +452,38 @@ required: search.required === 'true' } if (item.type === 'group') { - let copy = fromJS(item).toJS() - copy.key = search.datefield + item.key = search.datefield + item.type = 'daterange' + item.match = 'between' + item.value = [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')].join(',') - item.value = search.initval && search.initval[0] ? search.initval[0] : '@$@' - item.match = '=' - - copy.type = 'daterange' - copy.match = 'between' - copy.value = [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')] - - if (search.transfer === 'true') { - newsearches.push(item) - } - newsearches.push(copy) + 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().startOf('week').format('YYYY-MM-DD'), moment().endOf('week').format('YYYY-MM-DD')] + item.value = moment().format('YYYY-MM-DD') } else if (item.type === 'daterange') { - item.value = [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')] - } else if (item.type === 'multiselect') { - item.value = ['@$@'] + item.value = [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')].join(',') + } else if (item.type === 'range') { + + } else if (item.type === 'multiselect' || (item.type === 'checkcard' && search.multiple === 'true')) { + item.type = 'multi' + item.value = '@$@' } else { item.value = '@$@' } newsearches.push(item) }) - + return newsearches } submitDataSource = () => { const { config, mainSearch } = this.props - const { activeKey, setting, columns, scripts, varMarks } = this.state + const { activeKey, setting, columns, scripts } = this.state return new Promise((resolve, reject) => { if (activeKey === 'setting') { @@ -517,18 +494,15 @@ search = [...search, ...mainSearch] } - if (res.varMark && varMarks.includes(res.varMark.toLowerCase())) { - notification.warning({ - top: 92, - message: '鍙橀噺鏍囪瘑涓嶅彲閲嶅锛�', - duration: 5 - }) - reject() - return - } + let _search = this.formatSearch(search) + _search = Utils.joinMainSearchkey(_search) + + _search = _search.replace(/@\$@/ig, '') + _search = _search ? 'where ' + _search : '' this.setState({ searches: search, + defaultSearch: _search, setting: res }, () => { this.sqlverify(() => { resolve({setting: res, columns, scripts }) }, reject, false) @@ -562,7 +536,7 @@ } sqlverify = (resolve, reject, change = false, testScripts) => { - const { columns, setting, scripts, searches } = this.state + const { columns, setting, scripts, searches, defaultSearch } = this.state let _scripts = scripts.filter(item => item.status !== 'false') @@ -580,12 +554,12 @@ } if ((setting.interType === 'system' && setting.execute !== 'false') || _scripts.length > 0) { - let result = SettingUtils.getDebugSql(setting, _scripts, columns, searches) + let r = SettingUtils.getDebugSql(setting, _scripts, columns, searches, defaultSearch) - if (result.error) { + if (r.error) { notification.warning({ top: 92, - message: result.error, + message: r.error, duration: 5 }) reject() @@ -595,15 +569,40 @@ let param = { func: 's_debug_sql', exec_type: 'y', - LText: result.sql + LText: r.sql } param.LText = Utils.formatOptions(param.LText) param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') param.secretkey = Utils.encrypt('', param.timestamp) + + let sumParam = null + if (r.sumSql) { + sumParam = { + func: 's_debug_sql', + exec_type: 'y', + LText: r.sumSql + } + sumParam.LText = Utils.formatOptions(sumParam.LText) + sumParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + sumParam.secretkey = Utils.encrypt('', sumParam.timestamp) + } Api.getLocalConfig(param).then(result => { if (result.status) { - resolve() + if (sumParam) { + Api.getLocalConfig(sumParam).then(res => { + if (res.status) { + resolve() + } else { + reject() + Modal.error({ + title: res.message + }) + } + }) + } else { + resolve() + } } else { reject() Modal.error({ @@ -622,6 +621,27 @@ }) } + copyColumns = () => { + const { columns } = this.state + let m = [] + let n = [] + + columns.forEach(col => { + m.push(`${col.field}(${col.label})`) + n.push(col.field) + }) + + let oInput = document.createElement('input') + oInput.value = `/*${m.join(',')}*/ + ${n.join(',')}` + document.body.appendChild(oInput) + oInput.select() + document.execCommand('Copy') + document.body.removeChild(oInput) + + message.success('澶嶅埗鎴愬姛銆�') + } + /** * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊 */ @@ -632,7 +652,7 @@ } render() { - const { menu, config } = this.props + const { config } = this.props const { columns, setting, scripts, colColumns, scriptsColumns, activeKey, loading, searches, defaultsql } = this.state return ( @@ -641,7 +661,6 @@ <Tabs activeKey={activeKey} className="data-source-card-box" onChange={this.changeTab}> <TabPane tab="鏁版嵁婧�" key="setting"> <SettingForm - menu={menu} dict={this.props.dict} config={config} columns={columns} @@ -655,10 +674,10 @@ <FieldsComponent config={{...config, columns}} type="fields" - tableFields={menu.tableFields} updatefield={this.updatefields} /> - <EditTable actions={['edit', 'move', 'copy', 'del']} type="datasourcefield" data={columns} columns={colColumns} onChange={(columns) => this.setState({columns})}/> + <CopyOutlined title="浠ラ�楀彿鎷兼帴褰㈠紡澶嶅埗瀛楁" onClick={this.copyColumns} style={{position: 'absolute', cursor: 'pointer', zIndex: 1, top: '-35px', right: '0px', color: '#1890ff'}} /> + <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} type="datasourcefield" data={columns} columns={colColumns} onChange={(columns) => this.setState({columns})}/> </TabPane> <TabPane tab={ <span> -- Gitblit v1.8.0