From 0c1a33a33b45fc3265cb7fef20beb48407cd6c98 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期四, 24 八月 2023 14:54:06 +0800
Subject: [PATCH] 2023-08-24

---
 src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx | 1001 ++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 723 insertions(+), 278 deletions(-)

diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
index bcb6274..ebce7e5 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
@@ -1,64 +1,210 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { fromJS } from 'immutable'
-import { Form, Tabs, Row, Col, Button, Table, Popconfirm, Icon, notification, Modal, message, InputNumber, Radio } from 'antd'
+import { Form, Tabs, Row, Col, Button, notification, Modal, message, InputNumber, Spin, Typography, Popconfirm } from 'antd'
+import { EditOutlined, StopOutlined, CheckCircleOutlined, SwapOutlined, DeleteOutlined } from '@ant-design/icons'
 import moment from 'moment'
+import md5 from 'md5'
 
 import Api from '@/api'
 import Utils from '@/utils/utils.js'
-
+import SettingUtils from './utils.jsx'
 import ColumnForm from './columnform'
-import CodeMirror from '@/templates/zshare/codemirror'
+import DataSource from './datasource'
+import CustomScript from './customscript'
+import asyncComponent from '@/utils/asyncComponent'
 import './index.scss'
 
 const { TabPane } = Tabs
 const { confirm } = Modal
+const { Paragraph } = Typography
+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: '', // 鑷畾涔夎剼鏈�
+    debugId: '',
+    activeKey: 'setting',
     excelColumns: [
       {
-        title: this.props.dict['model.form.field'],
+        title: '瀛楁',
         dataIndex: 'Column',
-        width: '25%'
+        inputType: 'input',
+        editable: true,
+        unique: true,
+        width: '16%'
       },
       {
-        title: this.props.dict['model.name'],
+        title: '鍚嶇О',
         dataIndex: 'Text',
-        width: '25%'
+        inputType: 'input',
+        editable: true,
+        unique: true,
+        width: '16%'
       },
       {
-        title: this.props.dict['model.form.columnWidth'],
+        title: '鍒楀',
         dataIndex: 'Width',
-        width: '25%'
+        inputType: 'number',
+        min: 5,
+        max: 200,
+        editable: true,
+        width: '10%',
+        render: (text) => text || 20
+      },
+      {
+        title: '绫诲瀷',
+        dataIndex: 'type',
+        inputType: 'select',
+        editable: true,
+        required: false,
+        width: '12%',
+        render: (text) => {
+          if (text === 'image') {
+            return '鍥剧墖'
+          } else if (text === 'number') {
+            return '鏁板��'
+          } else {
+            return '鏂囨湰'
+          }
+        },
+        options: [
+          {value: 'text', text: '鏂囨湰'},
+          {value: 'number', text: '鏁板��'},
+          {value: 'image', text: '鍥剧墖'}
+        ]
+      },
+      {
+        title: '鍙栫粷瀵瑰��',
+        dataIndex: 'abs',
+        inputType: 'radio',
+        editable: true,
+        required: false,
+        width: '12%',
+        render: (text) => {
+          if (text === 'true') {
+            return '鏄�'
+          } else {
+            return '鍚�'
+          }
+        },
+        options: [
+          {value: 'true', text: '鏄�'},
+          {value: 'false', text: '鍚�'}
+        ]
+      },
+      {
+        title: '灏忔暟浣�',
+        dataIndex: 'decimal',
+        inputType: 'number',
+        min: 0,
+        max: 18,
+        editable: true,
+        required: false,
+        width: '12%'
+      },
+      {
+        title: '瀵煎嚭',
+        dataIndex: 'output',
+        inputType: 'radio',
+        editable: true,
+        required: false,
+        width: '12%',
+        render: (text) => {
+          if (text !== 'false') {
+            return '鏄�'
+          } else {
+            return '鍚�'
+          }
+        },
+        options: [
+          {value: 'true', text: '鏄�'},
+          {value: 'false', text: '鍚�'}
+        ]
+      },
+      {
+        title: '绾㈣壊鏍囬',
+        dataIndex: 'required',
+        width: '10%',
+        editable: true,
+        inputType: 'radio',
+        render: (text, record) => record.required === 'true' ? <span style={{color: 'red'}}>鏄�</span> : '鍚�',
+        options: [
+          {value: 'true', text: '鏄�'},
+          {value: 'false', text: '鍚�'}
+        ]
+      },
+    ],
+    scriptsColumns: [
+      {
+        title: 'SQL',
+        dataIndex: 'sql',
+        width: '60%',
+        render: (text) => {
+          let title = text.match(/^\s*\/\*.+\*\//)
+          title = title && title[0] ? title[0] : ''
+          let _text = title ? text.replace(title, '') : text
+
+          return (
+            <div>
+              {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>
+          )
+        }
+      },
+      {
+        title: '鎵ц浣嶇疆',
+        dataIndex: 'position',
+        width: '10%',
+        render: (text, record) => {
+          if (record.position === 'back') {
+            return <span style={{color: '#1890ff'}}>鍚庣疆</span>
+          } else {
+            return <span style={{color: '#26C281'}}>鍓嶇疆</span>
+          }
+        }
+      },
+      {
+        title: '鐘舵��',
+        dataIndex: 'status',
+        width: '10%',
+        render: (text, record) => record.status === 'false' ?
+          (
+            <div style={{color: '#ff4d4f'}}>
+              绂佺敤
+              <StopOutlined style={{marginLeft: '5px'}} />
+            </div>
+          ) :
+          (
+            <div style={{color: '#26C281'}}>
+              鍚敤
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
+            </div>
+          )
       },
       {
         title: '鎿嶄綔',
         align: 'center',
+        width: '140px',
         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
-                overlayClassName="popover-confirm"
-                title={this.props.dict['model.query.delete']}
-                onConfirm={() => this.handleDelete(record, 'columns')
-              }>
-                <span style={{color: '#ff4d4f', cursor: 'pointer'}}><Icon type="delete" /></span>
-              </Popconfirm>
-            </div>
-          )
+          (<div style={{textAlign: 'center'}}>
+            <span className="operation-btn" title="缂栬緫" onClick={() => this.handleEdit(record, 'scripts')} style={{color: '#1890ff'}}><EditOutlined /></span>
+            <span className="operation-btn" title="鐘舵�佸垏鎹�" onClick={() => this.handleStatus(record, 'scripts')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
+            <Popconfirm
+              overlayClassName="popover-confirm"
+              title="纭畾鍒犻櫎鍚�?"
+              onConfirm={() => this.handleDelete(record, 'scripts')
+            }>
+              <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span>
+            </Popconfirm>
+          </div>)
       }
     ]
   }
@@ -71,131 +217,148 @@
       _verify = fromJS(card.verify).toJS()
     }
 
-    _verify.enable = _verify.enable || 'false'
+    _verify.dataType = _verify.dataType || 'default'
+    _verify.columns = _verify.columns || []
+    _verify.scripts = _verify.scripts || []
 
-    // 鍚屾鏄剧ず鍒�
-    if (!_verify.columns || _verify.columns.length === 0) {
-      _verify.columns = []
-      config.columns.forEach(item => {
-        if (!item.field) return
-  
-        _verify.columns.push({
-          Column: item.field,
-          Text: item.label,
-          Width: 20,
-          uuid: Utils.getuuid()
-        })
+    _verify.columns = _verify.columns.map(col => {
+      col.type = col.type || 'text'
+      col.output = col.output || 'true'
+      col.required = col.required || 'false'
+
+      if (!['text', 'image', 'number'].includes(col.type)) {
+        if (/^Decimal/ig.test(col.type)) {
+          col.type = 'number'
+        } else {
+          col.type = 'text'
+        }
+      }
+
+      return col
+    })
+
+    let appType = sessionStorage.getItem('appType')
+    let searches = []
+
+    if (appType === 'mob') {
+      let menu = fromJS(window.GLOB.customMenu).toJS()
+      let ms = null
+      let search = []
+      menu.components.forEach(item => {
+        if (item.type === 'topbar' && item.wrap.type !== 'navbar' && item.search) {
+          ms = item.search
+        } else if (item.type === 'search' && item.wrap.field) {
+          search.push({
+            type: 'text',
+            label: item.wrap.label,
+            field: item.wrap.field,
+            match: item.wrap.match,
+            required: item.wrap.required,
+            value: item.wrap.initval || ''
+          })
+        }
       })
-    }
 
-    if (card.intertype !== 'system') {
-      _verify.enable = 'false'
-    }
+      if (ms) {
+        if (ms.setting.type === 'search') {
+          search.push({
+            type: 'text',
+            label: '鎼滅储鏍�',
+            field: ms.setting.field,
+            match: ms.setting.match,
+            required: ms.setting.required,
+            value: ms.setting.initval || ''
+          })
+        }
+        ms.fields.forEach(item => {
+          if (item.type === 'range') {
+            item.initval = `${item.minValue},${item.maxValue}`
+          }
+          search.push(item)
+        })
 
-    let defaultscript = ''
-    if (!_verify.script && card.intertype === 'system') {
-      let search = this.formatSearch(config.search)
-      search = Utils.joinMainSearchkey(search)
-      search = search ? 'where ' + search : ''
-      
-      defaultscript = `update ${config.setting.tableName || ''} set idefine5= idefine5+1 ,modifydate=getdate(),cdefine5='宸插鍑�',modifyuserid=@userid@ ${search}`
-    }
+        ms.groups.forEach(group => {
+          if (group.setting.type === 'search') {
+            search.push({
+              type: 'text',
+              label: group.wrap.name,
+              field: group.setting.field,
+              match: group.setting.match,
+              required: group.setting.required,
+              value: group.setting.initval || ''
+            })
+          }
 
+          group.fields.forEach(item => {
+            if (item.type === 'range') {
+              item.initval = `${item.minValue},${item.maxValue}`
+            }
+            search.push(item)
+          })
+        })
+      }
+
+      searches = search
+    } else {
+      searches = fromJS(config.search || []).toJS()
+
+      if (config.setting && config.setting.useMSearch === 'true' && window.GLOB.customMenu) {
+        let menu = fromJS(window.GLOB.customMenu).toJS()
+        let filterComponent = (box, mainSearch) => {
+          box.components.forEach(item => {
+            if (item.type !== 'search') return
+            mainSearch = item.search
+          })
+          let has = false
+          box.components.forEach(item => {
+            if (item.uuid === config.uuid) {
+              has = true
+            } else if (item.type === 'group') {
+              item.components.forEach(m => {
+                if (m.uuid !== config.uuid) return
+                has = true
+              })
+            }
+          })
+
+          if (has) {
+            if (mainSearch) {
+              let keys = searches.map(item => (item.field ? item.field.toLowerCase() : ''))
+              mainSearch.forEach(item => {
+                if (item.field && !keys.includes(item.field.toLowerCase())) {
+                  searches.push(item)
+                }
+              })
+            }
+          } else {
+            box.components.forEach(item => {
+              if (item.type !== 'tabs') return
+
+              item.subtabs.forEach(tab => {
+                filterComponent(tab, mainSearch)
+              })
+            })
+          }
+        }
+        filterComponent(menu, null)
+      }
+    }
 
     this.setState({
       verify: _verify,
-      defaultscript: defaultscript
+      searches: searches,
+      activeKey: card.intertype === 'system' && _verify.dataType === 'custom' ? 'setting' : 'columns'
     })
-  }
-
-  /**
-   * @description 鑾峰彇鍏ㄩ儴鎼滅储鏉′欢
-   * @param {Array} searches 鎼滅储鏉′欢鏁扮粍
-   */
-  formatSearch (searches) {
-    if (!searches || searches.length === 0) return []
-
-    let newsearches = []
-    searches.forEach(search => {
-      let item = {
-        key: search.field,
-        match: search.match,
-        type: search.type,
-        label: search.label,
-        value: `@${search.field}@`,
-        required: search.required === 'true'
-      }
-      if (item.type === 'group') {
-        let copy = fromJS(item).toJS()
-        copy.key = search.datefield
-
-        item.value = `@${search.field}@`
-        item.match = '='
-        
-        copy.type = 'daterange'
-        copy.match = 'between'
-        copy.value = [`@${search.datefield}@`, `@${search.datefield}1@`]
-
-        if (search.transfer === 'true') {
-          newsearches.push(item)
-        }
-        newsearches.push(copy)
-        return
-      } else if (item.type === 'dateweek') {
-        item.value = [`@${search.field}@`, `@${search.field}1@`]
-      } else if (item.type === 'daterange') {
-        item.value = [`@${search.field}@`, `@${search.field}1@`]
-      } else if (item.type === 'multiselect') {
-        item.value = [`@${search.field}@`]
-      }
-      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
-        }
-      })
-    } else {
-      let fields = verify.columns.map(item => item.Column)
-      if (fields.includes(values.Column)) {
-        notification.warning({
-          top: 92,
-          message: values.Column + '瀛楁宸插瓨鍦紒',
-          duration: 5
-        })
-        return
-      }
-      values.uuid = Utils.getuuid()
-      verify.columns.push(values)
-    }
-
-    this.setState({
-      verify: verify
-    })
-  }
-
-  handleDelete = (record, type) => {
-    const { verify } = this.state
-
-    verify.columns = verify.columns.filter(item => item.uuid !== record.uuid)
-
-    this.setState({ verify: verify })
   }
 
   handleEdit = (record, type) => {
-    this.columnForm.edit(record)
+    let node = null
 
-    let node = document.getElementById('verify-excelout-box-tab').parentNode
+    if (type === 'scripts') {
+      this.scriptsForm.edit(record)
+      node = document.getElementById('mk-exout-script')
+    }
+
 
     if (node && node.scrollTop) {
       let inter = Math.ceil(node.scrollTop / 10)
@@ -209,6 +372,56 @@
         }
       }, 10)
     }
+  }
+
+  handleStatus = (record, type) => {
+    let verify = JSON.parse(JSON.stringify(this.state.verify))
+    record.status = record.status === 'false' ? 'true' : 'false'
+
+    if (type === 'scripts') {
+      verify.scripts = verify.scripts.map(item => {
+        if (item.uuid === record.uuid) {
+          return record
+        } else {
+          return item
+        }
+      })
+    }
+
+    this.setState({
+      verify: verify
+    })
+  }
+
+  columnChange = (values) => {
+    let verify = JSON.parse(JSON.stringify(this.state.verify))
+
+    let fields = verify.columns.map(item => item.Column)
+    if (fields.includes(values.Column)) {
+      notification.warning({
+        top: 92,
+        message: values.Column + '瀛楁宸插瓨鍦紒',
+        duration: 5
+      })
+      return
+    }
+    values.uuid = Utils.getuuid()
+    values.abs = 'false'
+    values.output = 'true'
+    values.required = 'false'
+    verify.columns.push(values)
+
+    this.setState({
+      verify: verify
+    })
+  }
+
+  handleDelete = (record, type) => {
+    const { verify } = this.state
+
+    verify.columns = verify.columns.filter(item => item.uuid !== record.uuid)
+
+    this.setState({ verify: verify })
   }
 
   handleUpDown = (record, type, direction) => {
@@ -279,7 +492,7 @@
   }
 
   handleConfirm = () => {
-    let verify = fromJS(this.state.verify).toJS()
+    const { activeKey, verify } = this.state
     
     // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
     return new Promise((resolve, reject) => {
@@ -296,92 +509,89 @@
         return
       }
 
-      if (verify.enable === 'true') {
-        this.props.form.validateFieldsAndScroll((err, values) => {
-          if (!err) {
-            values.sql = values.sql || ''
+      if (activeKey === 'setting') {
+        this.settingForm.handleConfirm().then(res => {
+          let _verify = {...verify, ...res}
 
-            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',
-              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.LText, 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
-            })
+          if (res.dataType !== 'custom') {
+            delete _verify.tableName
+            delete _verify.dataresource
+            delete _verify.queryType
+            delete _verify.defaultSql
+            delete _verify.order
+
+            _verify.scripts = []
           }
+          
+          this.setState({
+            verify: _verify
+          }, () => {
+            this.setState({loading: true})
+            this.sqlverify(() => { // 楠岃瘉鎴愬姛
+              this.setState({
+                loading: false
+              })
+              resolve(_verify)
+            }, () => {             // 楠岃瘉澶辫触
+              this.setState({
+                loading: false
+              })
+              reject()
+            }, verify.scripts)
+          })
         })
+      } else if (activeKey === 'columns') {
+        if (this.columnRef && this.columnRef.state.editingKey) {
+          notification.warning({
+            top: 92,
+            message: '瀛楁鏈繚瀛橈紒',
+            duration: 5
+          })
+          return
+        }
+
+        if (this.props.card.intertype !== 'system' || verify.dataType !== 'custom') {
+          resolve(verify)
+        } else {
+          this.setState({loading: true})
+    
+          this.sqlverify(() => { // 楠岃瘉鎴愬姛
+            this.setState({
+              loading: false
+            })
+            resolve(verify)
+          }, () => {             // 楠岃瘉澶辫触
+            this.setState({
+              loading: false
+            })
+            reject()
+          }, verify.scripts)
+        }
+      } else if (activeKey === 'scripts') {
+        if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) {
+          notification.warning({
+            top: 92,
+            message: '瀛樺湪鏈繚瀛樿剼鏈紝璇风偣鍑荤‘瀹氫繚瀛橈紝鎴栫偣鍑诲彇娑堟斁寮冧慨鏀癸紒',
+            duration: 5
+          })
+          return
+        }
+  
+        this.setState({loading: true})
+        this.sqlverify(() => { // 楠岃瘉鎴愬姛
+          this.setState({
+            loading: false
+          })
+          resolve(verify)
+        }, () => {             // 楠岃瘉澶辫触
+          this.setState({
+            loading: false
+          })
+          reject()
+        }, verify.scripts)
       } else {
         resolve(verify)
       }
-    })
-  }
-
-  changeEnable = (e) => {
-    const { verify } = this.state
-
-    this.setState({
-      verify: {...verify, enable: e.target.value}
     })
   }
 
@@ -396,13 +606,49 @@
       if (fields.includes(item.field) || !item.field) return
       fields.push(item.field)
 
-      columns.push({
+      let cell = {
         Column: item.field,
         Text: item.label,
         Width: 20,
+        abs: 'false',
+        output: 'true',
+        required: 'false',
+        type: 'text',
         uuid: Utils.getuuid()
-      })
+      }
+
+      if (item.type === 'number') {
+        cell.type = 'number'
+        cell.decimal = item.decimal
+      }
+
+      columns.push(cell)
     })
+
+    if (config.subtype === 'dualdatacard') {
+      config.subColumns.forEach(item => {
+        if (fields.includes(item.field) || !item.field) return
+        fields.push(item.field)
+  
+        let cell = {
+          Column: item.field,
+          Text: item.label,
+          Width: 20,
+          abs: 'false',
+          output: 'true',
+          required: 'false',
+          type: 'text',
+          uuid: Utils.getuuid()
+        }
+  
+        if (item.type === 'number') {
+          cell.type = 'number'
+          cell.decimal = item.decimal
+        }
+  
+        columns.push(cell)
+      })
+    }
 
     this.setState({
       verify: {...verify, columns: columns}
@@ -427,10 +673,223 @@
     })
   }
 
+  changeColumns = (columns) => {
+    const { verify } = this.state
+
+    columns = columns.map(col => {
+      col.type = col.type || 'text'
+      col.output = col.output || 'true'
+      col.required = col.required || 'false'
+
+      if (!['text', 'image', 'number'].includes(col.type)) {
+        if (/^Decimal/ig.test(col.type)) {
+          col.type = 'number'
+        } else {
+          col.type = 'text'
+        }
+      }
+
+      return col
+    })
+    // if (columns[0] && !['image', 'text', 'number'].includes(columns[0].type)) {
+    //   columns = columns.map(col => {
+    //     let _cell = {
+    //       uuid: Utils.getuuid(),
+    //       Column: col.Column,
+    //       Text: col.Text,
+    //       Width: 20,
+    //       abs: 'false',
+    //       output: col.output || 'true',
+    //       required: col.required || 'false',
+    //       type: 'text',
+    //     }
+
+    //     return _cell
+    //   })
+    // }
+
+    this.setState({verify: {...verify, columns}})
+  }
+
+  // 鏍囩鍒囨崲
+  tabchange = (val) => {
+    const { card } = this.props
+    const { activeKey, verify } = this.state
+
+    if (card.intertype !== 'system' || verify.dataType !== 'custom') {
+      this.setState({activeKey: val})
+      return
+    } else if (activeKey === 'setting') {
+      this.settingForm.handleConfirm().then(res => {
+        this.setState({
+          verify: {...verify, ...res}
+        }, () => {
+          this.setState({loading: true})
+          this.sqlverify(() => { // 楠岃瘉鎴愬姛
+            this.setState({
+              activeKey: val,
+              loading: false
+            })
+          }, () => {             // 楠岃瘉澶辫触
+            this.setState({
+              activeKey: val,
+              loading: false
+            })
+          }, verify.scripts)
+        })
+      })
+    } else if (activeKey === 'columns') {
+      if (this.columnRef && this.columnRef.state.editingKey) {
+        notification.warning({
+          top: 92,
+          message: '瀛楁鏈繚瀛橈紒',
+          duration: 5
+        })
+        return
+      }
+
+      this.setState({loading: true})
+
+      this.sqlverify(() => { // 楠岃瘉鎴愬姛
+        this.setState({
+          activeKey: val,
+          loading: false
+        })
+      }, () => {             // 楠岃瘉澶辫触
+        this.setState({
+          activeKey: val,
+          loading: false
+        })
+      }, verify.scripts)
+    } else if (activeKey === 'scripts') {
+      if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) {
+        notification.warning({
+          top: 92,
+          message: '瀛樺湪鏈繚瀛樿剼鏈紒',
+          duration: 5
+        })
+      }
+
+      this.setState({loading: true})
+      this.sqlverify(() => { // 楠岃瘉鎴愬姛
+        this.setState({
+          activeKey: val,
+          loading: false
+        })
+      }, () => {             // 楠岃瘉澶辫触
+        this.setState({
+          activeKey: val,
+          loading: false
+        })
+      }, verify.scripts)
+    } else {
+      this.setState({
+        activeKey: val
+      })
+    }
+  }
+
+  scriptsChange = (values, callback, skip) => {
+    let verify = JSON.parse(JSON.stringify(this.state.verify))
+
+    if (values.uuid) {
+      verify.scripts = verify.scripts.map(item => {
+        if (item.uuid === values.uuid) {
+          return values
+        } else {
+          return item
+        }
+      })
+    } else {
+      values.uuid = Utils.getuuid()
+      verify.scripts.push(values)
+    }
+
+    if (skip) {
+      this.setState({
+        verify: verify
+      })
+      callback(true)
+    } else {
+      this.setState({loading: true})
+  
+      this.sqlverify(() => { // 楠岃瘉鎴愬姛
+        this.setState({
+          loading: false,
+          verify: verify
+        })
+        callback(true)
+      }, () => {             // 楠岃瘉澶辫触
+        this.setState({
+          loading: false
+        })
+        callback(false)
+      }, verify.scripts)
+    }
+  }
+
+  sqlverify = (_resolve, _reject, scripts) => {
+    const { searches, verify, debugId } = this.state
+
+    if (verify.dataType !== 'custom') {
+      _resolve()
+      return
+    }
+
+    let timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    let sql = SettingUtils.getDebugSql(verify, scripts, (verify.useSearch === 'true' ? searches : []), Utils, '2023-04-20 15:29:37')
+
+    let _debugId = md5(sql)
+
+    if (debugId === _debugId) {
+      _resolve()
+      return
+    }
+
+    let param = {
+      func: 's_debug_sql',
+      exec_type: 'y',
+      LText: sql
+    }
+    param.LText = Utils.formatOptions(param.LText)
+    param.timestamp = timestamp
+    param.secretkey = Utils.encrypt('', timestamp)
+
+    Api.genericInterface(param).then(result => {
+      if (result.status) {
+        this.setState({debugId: _debugId})
+        _resolve()
+      } else {
+        _reject()
+        Modal.error({
+          title: result.message
+        })
+      }
+    })
+  }
+
+  updateDataType = (val) => {
+    const { config } = this.props
+
+    let verify = {...this.state.verify, dataType: val}
+    if (val === 'custom' && config.setting) {
+      verify.tableName = verify.tableName || config.setting.tableName || ''
+      verify.dataresource = verify.dataresource || config.setting.dataresource || ''
+      verify.queryType = verify.queryType || config.setting.queryType || ''
+      verify.defaultSql = verify.defaultSql || config.setting.execute || ''
+      verify.order = verify.order || config.setting.order || ''
+
+      if (verify.scripts.length === 0 && config.scripts && config.scripts.length > 0) {
+        verify.scripts = fromJS(config.scripts).toJS()
+      }
+    }
+
+    this.setState({verify: verify})
+  }
+
   render() {
     const { card } = this.props
-    const { verify, excelColumns, defaultscript } = this.state
-    const { getFieldDecorator } = this.props.form
+    const { verify, excelColumns, scriptsColumns, activeKey, loading, searches } = this.state
     const formItemLayout = {
       labelCol: {
         xs: { span: 24 },
@@ -443,71 +902,49 @@
     }
 
     return (
-      <div id="verify-excelout-box-tab">
-        <Tabs defaultActiveKey="1" className="verify-card-box" onChange={this.tabchange}>
+      <div className="verify-excelout-box-tab">
+        {card.label ? <div className="mk-com-name">{card.label} - 楠岃瘉淇℃伅</div> : null}
+        {loading && <Spin size="large" />}
+        <Tabs activeKey={activeKey} className="excelout-verify-card-box" onChange={this.tabchange}>
+          {card.intertype === 'system' ? <TabPane tab="鍩虹楠岃瘉" key="setting">
+            <DataSource setting={verify} updateDataType={this.updateDataType} wrappedComponentRef={(inst) => this.settingForm = inst}/>
+          </TabPane> : null}
           <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}
-              wrappedComponentRef={(inst) => this.columnForm = inst}
-            />
+          } key="columns">
+            <ColumnForm 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>
-            <Table
-              bordered
-              rowKey="uuid"
-              className="custom-table"
-              dataSource={verify.columns}
-              columns={excelColumns}
-              pagination={false}
-            />
+            <div style={{color: '#959595', fontSize: '13px', paddingLeft: '10px'}}>濡傞渶瀵煎嚭搴忓彿锛岃浣跨敤瀛楁 $Index锛涙暟鍊肩被鍨嬪鍑烘椂鍙繘琛屾暟鎹鐞嗭紙鍙栫粷瀵瑰�笺�佷繚鐣欏皬鏁颁綅锛夛紱绾㈣壊鏍囬瀵煎嚭鏃跺垪澶存枃瀛椾负绾㈣壊銆�</div>
+            <EditTable actions={['edit', 'move', 'copy', 'del']} type="excelcolumn" wrappedComponentRef={(inst) => this.columnRef = inst} 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}
+              {verify.scripts.length ? <span className="count-tip">{verify.scripts.length}</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>
-                <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>
+          } key="scripts" disabled={verify.dataType !== 'custom'} id="mk-exout-script">
+            <CustomScript
+              btn={card}
+              sheet={verify.tableName}
+              searches={verify.useSearch === 'true' ? searches : []}
+              scriptsChange={this.scriptsChange}
+              wrappedComponentRef={(inst) => this.scriptsForm = inst}
+            />
+            <EditTable actions={['move']} data={verify.scripts} columns={scriptsColumns} onChange={(scripts) => {this.setState({verify: {...verify, scripts}})}}/>
           </TabPane> : null}
-          <TabPane tab="淇℃伅鎻愮ず" key="7">
+          <TabPane tab="淇℃伅鎻愮ず" key="message">
             <Form {...formItemLayout}>
               <Row gutter={24}>
                 <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
+                  <Form.Item label="鎻愮ず缂栫爜">
                     <span className="errorval"> S </span>
                     <Button onClick={() => {this.showError('S')}} type="primary" size="small">
                       鏌ョ湅
@@ -515,14 +952,14 @@
                   </Form.Item>
                 </Col>
                 <Col span={8}>
-                  <Form.Item label={'鍋滅暀鏃堕棿'}>
+                  <Form.Item label="鍋滅暀鏃堕棿">
                     <InputNumber defaultValue={verify.stime || 2} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'stime')}} />
                   </Form.Item>
                 </Col>
               </Row>
               <Row gutter={24}>
                 <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
+                  <Form.Item label="鎻愮ず缂栫爜">
                     <span className="errorval"> Y </span>
                     <Button onClick={() => {this.showError('Y')}} type="primary" size="small">
                       鏌ョ湅
@@ -532,7 +969,15 @@
               </Row>
               <Row gutter={24}>
                 <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
+                  <Form.Item label="鎻愮ず缂栫爜">
+                    <span className="errorval"> -1 </span>
+                    鎵ц鎴愬姛鏃犳彁绀恒��
+                  </Form.Item>
+                </Col>
+              </Row>
+              <Row gutter={24}>
+                <Col offset={6} span={6}>
+                  <Form.Item label="鎻愮ず缂栫爜">
                     <span className="errorval"> N </span>
                     <Button onClick={() => {this.showError('N')}} type="primary" size="small">
                       鏌ョ湅
@@ -540,14 +985,14 @@
                   </Form.Item>
                 </Col>
                 <Col span={8}>
-                  <Form.Item label={'鍋滅暀鏃堕棿'}>
+                  <Form.Item label="鍋滅暀鏃堕棿">
                     <InputNumber defaultValue={verify.ntime || 10} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ntime')}} />
                   </Form.Item>
                 </Col>
               </Row>
               <Row gutter={24}>
                 <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
+                  <Form.Item label="鎻愮ず缂栫爜">
                     <span className="errorval"> F </span>
                     <Button onClick={() => {this.showError('F')}} type="primary" size="small">
                       鏌ョ湅
@@ -555,14 +1000,14 @@
                   </Form.Item>
                 </Col>
                 <Col span={8}>
-                  <Form.Item label={'鍋滅暀鏃堕棿'}>
+                  <Form.Item label="鍋滅暀鏃堕棿">
                     <InputNumber defaultValue={verify.ftime || 10} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ftime')}} />
                   </Form.Item>
                 </Col>
               </Row>
               <Row gutter={24}>
                 <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
+                  <Form.Item label="鎻愮ず缂栫爜">
                     <span className="errorval"> E </span>
                     <Button onClick={() => {this.showError('E')}} type="primary" size="small">
                       鏌ョ湅
@@ -572,7 +1017,7 @@
               </Row>
               <Row gutter={24}>
                 <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
+                  <Form.Item label="鎻愮ず缂栫爜">
                     <span className="errorval"> NM </span>
                     <Button onClick={() => {this.showError('NM')}} type="primary" size="small">
                       鏌ョ湅
@@ -582,9 +1027,9 @@
               </Row>
               <Row gutter={24}>
                 <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
-                    <span className="errorval"> -1 </span>
-                    涓嶆彁绀�
+                  <Form.Item label="鎻愮ず缂栫爜">
+                    <span className="errorval"> -2 </span>
+                    鎵ц澶辫触鏃犳彁绀�
                   </Form.Item>
                 </Col>
               </Row>

--
Gitblit v1.8.0