From 58826d6f4eab9f8c9acf9fa8696f60039c645cfe Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期二, 20 八月 2024 18:18:00 +0800 Subject: [PATCH] 2024-08-20 --- src/menu/datasource/verifycard/index.jsx | 363 ++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 297 insertions(+), 66 deletions(-) diff --git a/src/menu/datasource/verifycard/index.jsx b/src/menu/datasource/verifycard/index.jsx index 9554a5b..c7c6806 100644 --- a/src/menu/datasource/verifycard/index.jsx +++ b/src/menu/datasource/verifycard/index.jsx @@ -2,9 +2,8 @@ import PropTypes from 'prop-types' import { fromJS } from 'immutable' import { Form, Tabs, Popconfirm, notification, Modal, Typography, Spin, message, Button, Input } from 'antd' -import { StopOutlined, CheckCircleOutlined, EditOutlined, SwapOutlined, DeleteOutlined, CopyOutlined, BorderOutlined, SnippetsOutlined } from '@ant-design/icons' +import { StopOutlined, CheckCircleOutlined, TableOutlined, EditOutlined, SwapOutlined, DeleteOutlined, CopyOutlined, BorderOutlined, SnippetsOutlined } from '@ant-design/icons' import moment from 'moment' -import md5 from 'md5' import Api from '@/api' import Utils from '@/utils/utils.js' @@ -42,15 +41,16 @@ loading: false, colLoading: false, searchKey: '', - initsql: '', // sql楠岃瘉鏃跺彉閲忓0鏄庡強璧嬪�� usefulfields: '', - defaultsql: '', // 榛樿Sql + defaultsql: '', systemScripts: [], median: {}, visible: false, + editLineId: '', pvisible: false, reload: false, script: null, + oriConfig: null, scriptValue: '', cols: null, colColumns: [ @@ -59,6 +59,7 @@ dataIndex: 'label', inputType: 'input', editable: true, + searchable: true, width: '28%' }, { @@ -68,6 +69,7 @@ editable: true, unique: true, strict: true, + searchable: true, copy: true, rules: [{ pattern: /^[\u4E00-\u9FA50-9a-zA-Z_]*$/ig, @@ -198,23 +200,46 @@ 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$`) - }) - }) - } + // 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$`) + // }) + // }) + // } let columns = config.columns ? fromJS(config.columns).toJS() : [] let subColumns = config.subColumns ? fromJS(config.subColumns).toJS() : [] - columns.reverse() + if (!config.fixedCol) { + columns.reverse() + } subColumns.reverse() + + columns.forEach(col => { + if (!col.datatype) return + if (/^nvarchar/.test(col.datatype)) { + col.datatype = col.datatype.replace(/^nvarchar/, 'Nvarchar') + } else if (/^decimal/.test(col.datatype)) { + col.datatype = col.datatype.replace(/^decimal/, 'Decimal') + } else if (/^int/.test(col.datatype)) { + col.datatype = col.datatype.replace(/^int/, 'Int') + } + }) + subColumns.forEach(col => { + if (!col.datatype) return + if (/^nvarchar/.test(col.datatype)) { + col.datatype = col.datatype.replace(/^nvarchar/, 'Nvarchar') + } else if (/^decimal/.test(col.datatype)) { + col.datatype = col.datatype.replace(/^decimal/, 'Decimal') + } else if (/^int/.test(col.datatype)) { + col.datatype = col.datatype.replace(/^int/, 'Int') + } + }) this.setState({ scripts, @@ -224,7 +249,13 @@ median: _setting, searches: formatSearch(search), searchKey: '', - debugId: _setting.debugId || '' + debugId: _setting.debugId || '', + oriConfig: fromJS({ + scripts, + columns: columns, + subColumns: subColumns, + setting: _setting + }).toJS() }) this.getsysScript() @@ -240,18 +271,18 @@ let _scriptSql = `Select distinct func+Remark as funcname,longparam, s.Sort from聽 s_custom_script s inner join (select OpenID from sapp where ID=@Appkey@) p on s.openid = case when s.appkey='' then s.openid else p.OpenID end order by s.Sort` - _scriptSql = Utils.formatOptions(_scriptSql) + _scriptSql = Utils.formatOptions(_scriptSql, 'x') let _sParam = { func: 'sPC_Get_SelectedList', LText: _scriptSql, obj_name: 'data', - arr_field: 'funcname,longparam' + arr_field: 'funcname,longparam', + exec_type: 'x' } _sParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') - _sParam.secretkey = Utils.encrypt(_sParam.LText, _sParam.timestamp) - + _sParam.secretkey = Utils.encrypt('', _sParam.timestamp) _sParam.open_key = Utils.encryptOpenKey(_sParam.secretkey, _sParam.timestamp) // 浜戠鏁版嵁楠岃瘉 Api.getCloudConfig(_sParam).then(res => { @@ -369,6 +400,7 @@ if (values.uuid) { scripts = scripts.map(item => { if (item.uuid === values.uuid) { + values.$index = item.$index || '' return values } else { return item @@ -521,7 +553,7 @@ submitDataSource = () => { const { config, mainSearch } = this.props - const { activeKey, setting, columns, subColumns, scripts, cols } = this.state + const { activeKey, setting, columns, subColumns, scripts, cols, median, searches } = this.state if (config.subtype === 'dualdatacard') { let arr = columns.map(col => col.field.toLowerCase()) @@ -540,6 +572,42 @@ }) return Promise.reject() } + } else if (config.subtype === 'editable') { + let _arr = [] + columns.forEach(col => { + let key = col.field.toLowerCase() + if (['jskey', 'data_type', 'bid'].includes(key)) { + _arr.push(col.field) + } + }) + + if (_arr.length > 0) { + notification.warning({ + top: 92, + message: '瀛楁闆嗕腑涓嶅彲浣跨敤' + _arr.join('銆�') + '锛佹敞锛氭瀛楁涓烘彁浜ゆ椂鐨勭郴缁熷瓧娈点��', + duration: 5 + }) + return Promise.reject() + } + } + + if (median.interType === 'system') { + let _loading = false + if (this.scriptsForm && this.scriptsForm.state.editItem) { + _loading = true + } else if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) { + _loading = true + } + + if (_loading) { + notification.warning({ + top: 92, + message: '瀛樺湪鏈繚瀛樿剼鏈紝璇风偣鍑荤‘瀹氫繚瀛橈紝鎴栫偣鍑诲彇娑堟斁寮冧慨鏀癸紒', + duration: 5 + }) + this.setState({activeKey: 'scripts'}) + return Promise.reject() + } } return new Promise((resolve, reject) => { @@ -550,12 +618,13 @@ if (res.useMSearch === 'true') { // 浣跨敤涓绘悳绱㈡潯浠� search = [...search, ...mainSearch] } + let _searches = formatSearch(search) this.setState({ - searches: formatSearch(search), + searches: _searches, setting: res }, () => { - this.sqlverify(() => { resolve({setting: res, columns, subColumns, scripts, cols }) }, reject, 'submit') + this.sqlverify(() => { resolve({setting: res, columns, subColumns, scripts, cols, searches: _searches }) }, reject, 'submit') }) }, () => { reject() @@ -570,7 +639,7 @@ reject() return } - this.sqlverify(() => { resolve({setting, columns, subColumns, scripts, cols }) }, reject, 'submit') + this.sqlverify(() => { resolve({setting, columns, subColumns, scripts, cols, searches }) }, reject, 'submit') } else if (activeKey === 'subcolumns') { if (this.subdatasource && this.subdatasource.state.editingKey) { notification.warning({ @@ -581,28 +650,37 @@ reject() return } - this.sqlverify(() => { resolve({setting, columns, subColumns, scripts, cols }) }, reject, 'submit') + this.sqlverify(() => { resolve({setting, columns, subColumns, scripts, cols, searches }) }, reject, 'submit') } else if (activeKey === 'scripts') { - let _loading = false - if (this.scriptsForm && this.scriptsForm.state.editItem) { - _loading = true - } else if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) { - _loading = true - } - - if (_loading) { - notification.warning({ - top: 92, - message: '瀛樺湪鏈繚瀛樿剼鏈紝璇风偣鍑荤‘瀹氫繚瀛橈紝鎴栫偣鍑诲彇娑堟斁寮冧慨鏀癸紒', - duration: 5 - }) - reject() - return - } - - this.sqlverify(() => { resolve({setting, columns, subColumns, scripts, cols }) }, reject, 'submit') + this.sqlverify(() => { resolve({setting, columns, subColumns, scripts, cols, searches }) }, reject, 'submit') } }) + } + + closeDataSource = (callback) => { + const { setting, columns, subColumns, scripts, oriConfig } = this.state + + let line = scripts.map(item => item.sql).join('') + line += columns.map(item => item.field + item.datatype).join('') + line += subColumns.map(item => item.field + item.datatype).join('') + line += setting.interType + (setting.dataresource || '') + (setting.order || '') + (setting.primaryKey || '') + + let _line = oriConfig.scripts.map(item => item.sql).join('') + _line += oriConfig.columns.map(item => item.field + item.datatype).join('') + _line += oriConfig.subColumns.map(item => item.field + item.datatype).join('') + _line += oriConfig.setting.interType + (oriConfig.setting.dataresource || '') + (oriConfig.setting.order || '') + (oriConfig.setting.primaryKey || '') + + if (line !== _line) { + confirm({ + content: '鏁版嵁婧愬凡淇敼锛岀‘瀹氬彇娑堝悧锛�', + onOk() { + callback() + }, + onCancel() {} + }) + } else { + callback() + } } sqlverify = (resolve, reject, type, testScripts) => { @@ -634,11 +712,29 @@ if (config.subtype === 'dualdatacard') { _columns = [...columns, ...subColumns] } - let r = SettingUtils.getDebugSql(setting, _scripts, _columns, searches, config.type) - let _debugId = md5(r.sql) + let r = SettingUtils.getDebugSql(setting, _scripts, _columns, searches, config.subtype, config.hasExtend) - if (debugId === _debugId) { + if (r.custompage && setting.laypage === 'true' && _columns.findIndex(col => col.field === 'mk_total') === -1) { + if (config.subtype !== 'basetable') { + Modal.warning({ + title: `鏁版嵁婧愭垨鑷畾涔夎剼鏈腑浣跨敤鑷畾涔夊垎椤垫帓搴忔椂锛岃鍦ㄥ瓧娈甸泦涓坊鍔� mk_total銆俙, + okText: '鐭ラ亾浜�', + onOk: () => { + reject() + } + }) + return + } else { + notification.warning({ + top: 92, + message: '鏁版嵁婧愭垨鑷畾涔夎剼鏈腑浣跨敤鑷畾涔夊垎椤垫帓搴忔椂锛岃鍦ㄦ樉绀哄垪涓坊鍔� mk_total銆�', + duration: 5 + }) + } + } + + if (debugId === r.debugId) { resolve() return } @@ -653,10 +749,61 @@ Api.sDebug(r.sql).then(result => { if (result.status || result.ErrCode === '-2') { - this.setState({debugId: _debugId}, () => { + this.setState({debugId: r.debugId}, () => { resolve() }) } else { + if (/鍒楀悕\s*'[a-zA-Z0-9_-]+'\s*鏃犳晥/.test(result.message)) { + let tail = '' + let type = '' + if (setting.execute !== 'false' && setting.queryType !== 'statistics') { + searches.forEach(item => { + if (item.forbid) return + item.key.split(',').forEach(field => { + if (new RegExp(`'${field}'`).test(result.message)) { + tail = field + type = '鎼滅储鏉′欢' + } + }) + }) + } + + if (!tail && setting.order) { + let keys = setting.order.replace(/\s+(asc|desc)/ig, '').replace(/\s+/g, '') + keys.split(',').forEach(field => { + if (new RegExp(`'${field}'`).test(result.message)) { + tail = field + type = '鎺掑簭' + } + }) + } + + if (!tail) { + columns.forEach(item => { + if (new RegExp(`'${item.field}'`).test(result.message)) { + tail = item.field + if (config.subtype === 'basetable') { + type = '鏄剧ず鍒�' + } else { + type = '瀛楁闆�' + } + } + }) + if (!tail && config.subtype === 'dualdatacard') { + subColumns.forEach(item => { + if (new RegExp(`'${item.field}'`).test(result.message)) { + tail = item.field + type = '瀛愯〃瀛楁闆�' + } + }) + } + } + + if (tail) { + result.message = result.message.replace(/ROLLBACK TRANSACTION 璇锋眰娌℃湁瀵瑰簲鐨� BEGIN TRANSACTION銆�/, '') + result.message = <>{result.message}<span style={{color: 'red'}}>娉細{type}涓瓨鍦ㄥ瓧娈祘tail}</span></> + } + } if (type === 'submit') { Modal.confirm({ title: result.message, @@ -696,7 +843,9 @@ return } + let editLineId = '' if (script) { + editLineId = script.uuid _scripts = _scripts.map(item => { if (script.uuid === item.uuid) { item.sql = scriptValue @@ -711,10 +860,11 @@ status: 'true' } + editLineId = _script.uuid _scripts.push(_script) } - this.setState({loading: true}) + this.setState({loading: true, editLineId}) this.sqlverify(() => {this.setState({scripts: _scripts, script: null, scriptValue: '', loading: false})}, () => {this.setState({loading: false})}, 'script', _scripts) } @@ -841,18 +991,87 @@ } copyColumns = () => { - const { columns } = this.state + const { config } = this.props + const { columns, subColumns, setting } = this.state + + let _columns = columns let m = [] let n = [] + let s = [] - columns.forEach(col => { - m.push(`${col.field} ${col.datatype}`) - n.push(col.field) + if (subColumns && subColumns.length) { + _columns = [...columns, ...subColumns] + } + + _columns.forEach(col => { + m.unshift(`${col.field} ${col.datatype}`) + n.unshift(col.field) + if (/decimal|int/ig.test(col.datatype)) { + s.unshift(`${Math.round(Math.random() * 10)} as ${col.field}`) + } else if (/datetime/.test(col.datatype)) { + s.unshift(`'${moment().format('YYYY-MM-DD HH:mm:ss')}' as ${col.field}`) + } else if (/date/.test(col.datatype)) { + s.unshift(`'${moment().format('YYYY-MM-DD')}' as ${col.field}`) + } else { + s.unshift(`'${col.label}' as ${col.field}`) + } }) + if (window.debugger) { + window.mkInfo('select ' + s.join(', ')) + } + + let extend = '' + if (config.hasExtend) { + extend = [] + let mapCol = (cols) => { + cols.forEach(col => { + if (col.type === 'extend') { + let datatype = 'Nvarchar(50)' + _columns.forEach(c => { + if (c.field === col.field) { + datatype = c.datatype + } + }) + for (let i = 1; i < col.quota; i++) { + extend.push(`${col.field}${i} ${datatype}`) + } + } else if (col.type === 'colspan' && col.subcols) { + mapCol(col.subcols) + } + }) + } + mapCol(config.cols) + extend = ` + /* 鎵╁睍鍒楀瓧娈� */ + /* ${extend.join(',')} */ + ` + } + let oInput = document.createElement('input') - oInput.value = `/*${m.join(',')}*/ - ${n.join(',')}` + oInput.value = `create table #${setting.tableName || 'tb'} + (${m.join(',')},sort_id INT IDENTITY(1,1)) + insert into #${setting.tableName || 'tb'} + (${n.join(',')}) + select ${n.join(',')} + from ${setting.dataresource ? `(${setting.dataresource.replace(/\n/g, ' ')}) tb` : setting.tableName || 'tb'} + order by @orderBy@ + + declare @mk_total int + set @mk_total = 0 + + select @mk_total = count(1) from #${setting.tableName || 'tb'} + declare @pageIndex_top int + set @pageIndex_top=(@pageIndex@-1)*@pageSize@ + + if @mk_total > @pageIndex@*@pageSize@ + delete #${setting.tableName || 'tb'} where sort_id > @pageIndex@*@pageSize@ + + if @pageIndex_top > 0 + delete #${setting.tableName || 'tb'} where sort_id <= @pageIndex_top + + drop table #${setting.tableName || 'tb'}${extend}` + document.body.appendChild(oInput) oInput.select() document.execCommand('Copy') @@ -885,8 +1104,6 @@ addProcess = () => { const { config } = this.props const { columns } = this.state - - if (config.subtype === 'dualdatacard') return let fields = [] let cols = [] @@ -951,7 +1168,7 @@ if (item.f_type !== 0) return if (/nvarchar|int|decimal/ig.test(item.FieldType) || item.FieldType === 'date' || item.FieldType === 'datetime') { - fields.push({ + fields.unshift({ uuid: Utils.getuuid(), label: item.FieldDec, field: item.FieldName, @@ -979,7 +1196,7 @@ render() { const { config } = this.props - const { columns, subColumns, median, setting, scripts, colColumns, scriptsColumns, activeKey, loading, searches, defaultsql, visible, pvisible, reload, script, scriptValue, searchKey } = this.state + const { columns, subColumns, median, setting, scripts, colColumns, scriptsColumns, activeKey, loading, searches, defaultsql, visible, pvisible, reload, script, scriptValue, searchKey, editLineId } = this.state return ( <div className="model-data-source-wrap"> @@ -1003,7 +1220,7 @@ wrappedComponentRef={(inst) => this.settingForm = inst} /> : null} </TabPane> - {config.subtype !== 'basetable' ? <TabPane tab={ + {!['basetable', 'invoice', 'invTable'].includes(config.subtype) ? <TabPane tab={ <span> 瀛楁闆� {columns.length ? <span className="count-tip">{columns.length}</span> : null} @@ -1016,7 +1233,15 @@ updatefield={this.updatefields} /> <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} searchKey={searchKey} type="datasourcefield" wrappedComponentRef={(inst) => this.datasource = inst} data={columns} columns={colColumns} onChange={(columns) => this.setState({columns})}/> - </TabPane> : null} + </TabPane> : <TabPane tab={ + <span> + 瀛楁闆�<TableOutlined style={{marginLeft: '5px', fontSize: '12px'}} /> + {columns.length ? <span className="count-tip">{columns.length}</span> : null} + </span> + } key="columns"> + <div className="base-table-columns"></div> + <EditTable actions={[]} searchKey={searchKey} type="datasourcefield" data={columns} columns={colColumns}/> + </TabPane>} {config.subtype === 'dualdatacard' ? <TabPane tab={ <span> 瀛愯〃瀛楁闆� @@ -1035,8 +1260,8 @@ <span> 鑷畾涔夎剼鏈� {scripts.length ? <span className="count-tip">{scripts.length}</span> : null} - {config.type !== 'interface' && activeKey === 'setting' ? <CopyOutlined title="澶嶅埗鏁版嵁婧�" className="mk-copy-datasource" onClick={(e) => {e.stopPropagation();this.copyDatasource()}}/> : null} - {config.type !== 'interface' && activeKey === 'setting' ? <SnippetsOutlined title="瀵煎叆鏁版嵁婧�" className="mk-paste-datasource" onClick={(e) => {e.stopPropagation();this.setState({pvisible: true})}}/> : null} + {activeKey === 'setting' ? <CopyOutlined title="澶嶅埗鏁版嵁婧�" className="mk-copy-datasource" onClick={(e) => {e.stopPropagation();this.copyDatasource()}}/> : null} + {activeKey === 'setting' ? <SnippetsOutlined title="瀵煎叆鏁版嵁婧�" className="mk-paste-datasource" onClick={(e) => {e.stopPropagation();this.setState({pvisible: true})}}/> : null} {activeKey === 'columns' ? <CopyOutlined title="浠ラ�楀彿鎷兼帴褰㈠紡澶嶅埗瀛楁" className="mk-copy-fields" onClick={(e) => {e.stopPropagation();this.copyColumns()}}/> : null} {activeKey === 'subcolumns' ? <CopyOutlined title="浠ラ�楀彿鎷兼帴褰㈠紡澶嶅埗瀛楁" className="mk-copy-fields" onClick={(e) => {e.stopPropagation();this.copySubColumns()}}/> : null} {activeKey === 'subcolumns' || activeKey === 'columns' ? <span onClick={(e) => {e.stopPropagation()}}><Search className="mk-search-fields" defaultValue={searchKey} allowClear onSearch={(val, e) => {e.stopPropagation();this.setState({searchKey: val})}} /></span> : null} @@ -1051,14 +1276,14 @@ }) return } - this.setState({visible: true, script: null, scriptValue: ''}) + this.setState({visible: true, script: null, scriptValue: '', editLineId: ''}) }}/> : null} <CustomScriptsForm type={config.type} + hasExtend={config.hasExtend} setting={setting} searches={searches} defaultsql={defaultsql} - initsql={this.state.initsql} customScripts={scripts} systemScripts={this.state.systemScripts} scriptsChange={this.scriptsChange} @@ -1101,8 +1326,14 @@ </div> ) } else { + let sign = '' + if (script && script.uuid === item.uuid) { + sign = 'active' + } else if (editLineId === item.uuid) { + sign = 'edited' + } return ( - <div className={'script-item ' + (script && script.uuid === item.uuid ? 'active' : '') } key={item.uuid}> + <div className={'script-item ' + sign} key={item.uuid}> <div style={{cursor: 'pointer'}} onClick={() => { this.setState({script: item, scriptValue: item.sql}) }}> -- Gitblit v1.8.0