From 901c0e31eda7d69da5c8230a5b3a8ddc88b36a1a Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期日, 01 十月 2023 18:48:41 +0800
Subject: [PATCH] Merge branch 'positec' into bms

---
 src/menu/debug/index.scss                                                          |  109 +
 src/templates/zshare/modalform/index.jsx                                           |    2 
 src/tabviews/custom/components/chart/antv-X6/nodeupdate/nodeform.jsx               |   25 
 src/menu/components/group/paste/index.jsx                                          |    7 
 src/utils/utils-custom.js                                                          |  172 ++
 src/templates/sharecomponent/fieldscomponent/editcard/index.jsx                    |   20 
 src/templates/zshare/verifycard/customscript/index.jsx                             |   81 
 src/menu/datasource/index.jsx                                                      |   16 
 src/tabviews/custom/popview/index.jsx                                              |    4 
 src/templates/sharecomponent/actioncomponent/verifyexcelout/utils.jsx              |  134 -
 src/views/design/sidemenu/menuelement/index.scss                                   |   14 
 src/tabviews/basetable/index.jsx                                                   |    3 
 src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx  |   19 
 src/templates/sharecomponent/tablecomponent/index.jsx                              |    4 
 src/templates/sharecomponent/settingcomponent/settingform/index.jsx                |  156 --
 src/tabviews/zshare/actionList/normalbutton/index.jsx                              |   37 
 src/views/mobdesign/index.jsx                                                      |    2 
 src/views/menudesign/index.jsx                                                     |    4 
 src/menu/datasource/verifycard/index.jsx                                           |  186 +-
 src/tabviews/custom/components/card/cardcellList/index.jsx                         |    2 
 src/menu/components/search/main-search/dragsearch/card.jsx                         |    2 
 src/tabviews/zshare/mutilform/index.jsx                                            |   86 
 src/mob/searchconfig/settingform/index.jsx                                         |    7 
 src/tabviews/custom/components/chart/antv-X6/index.jsx                             |   64 
 src/tabviews/custom/index.jsx                                                      |    4 
 src/menu/components/table/base-table/columns/index.jsx                             |   38 
 src/menu/debug/index.jsx                                                           | 1995 ++++++++++++++++++++++++++--
 src/templates/zshare/customscript/index.jsx                                        |   46 
 src/menu/components/table/normal-table/index.jsx                                   |    2 
 src/templates/sharecomponent/searchcomponent/index.scss                            |    5 
 src/menu/components/tabs/paste/index.jsx                                           |    7 
 src/menu/datasource/verifycard/settingform/index.scss                              |   29 
 src/menu/datasource/verifycard/utils.jsx                                           |   84 
 src/templates/sharecomponent/actioncomponent/verifyexcelout/customscript/index.jsx |   19 
 src/menu/datasource/verifycard/index.scss                                          |    8 
 src/templates/zshare/verifycard/callbackcustomscript/index.jsx                     |   19 
 src/menu/datasource/verifycard/customscript/index.jsx                              |  113 
 src/templates/sharecomponent/searchcomponent/dragsearch/card.jsx                   |    2 
 src/tabviews/zshare/actionList/exceloutbutton/index.jsx                            |   24 
 src/menu/components/form/simple-form/index.jsx                                     |    1 
 src/templates/sharecomponent/fieldscomponent/index.jsx                             |   20 
 src/views/tabledesign/index.jsx                                                    |    4 
 src/templates/zshare/verifycard/customform/index.jsx                               |   19 
 src/api/index.js                                                                   |   30 
 src/menu/components/search/main-search/index.scss                                  |    5 
 src/templates/sharecomponent/settingcomponent/settingform/utils.jsx                |  109 -
 src/utils/utils.js                                                                 |  144 +
 src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.jsx                  |    1 
 src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx              |   16 
 src/templates/sharecomponent/fieldscomponent/editcard/index.scss                   |   10 
 src/mob/components/search/single-search/options.jsx                                |    1 
 src/views/pcdesign/index.jsx                                                       |    2 
 src/templates/zshare/formconfig.jsx                                                |    7 
 src/menu/datasource/verifycard/settingform/index.jsx                               |   76 
 /dev/null                                                                          |   45 
 src/menu/components/table/edit-table/columns/tableIn/customscript/index.jsx        |   19 
 src/tabviews/zshare/fileupload/index.jsx                                           |   37 
 src/menu/components/table/base-table/index.jsx                                     |   15 
 58 files changed, 3,146 insertions(+), 966 deletions(-)

diff --git a/src/api/index.js b/src/api/index.js
index 8804daa..c539795 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -759,7 +759,7 @@
     }
   }
 
-  visitOuterSystem (param, _resolve) {
+  visitOuterSystem (param, _resolve, _reject) {
     let token = param.$token
     delete param.$token
 
@@ -815,6 +815,8 @@
         data: JSON.stringify(param)
       }).then(res => {
         _resolve(res)
+      }, () => {
+        _reject()
       })
     } else {
       let _param = {
@@ -862,9 +864,22 @@
             data: JSON.stringify(param)
           }).then(res => {
             _resolve(res)
+          }, () => {
+            _reject()
           })
         } else {
           _resolve(result)
+        }
+      }, (e) => {
+        if (!e || !e.status) {
+          let msg = '缃戠粶杩炴帴涓嶆甯搞��'
+
+          if (/^http:/.test(token.interface) && /https:/.test(window.location.protocol)) {
+            msg = '缃戠粶杩炴帴涓嶆甯革紝鎺ュ彛鍦板潃鍙兘涓嶆敮鎸乭ttps銆�'
+          }
+          _resolve({status: false, ErrCode: 'E', message: msg})
+        } else {
+          _reject()
         }
       })
     }
@@ -884,7 +899,7 @@
     if (param.$token === '') {
       return Promise.resolve({status: false, ErrCode: 'token_error', message: '鎺ュ彛鍦板潃灏氭湭璁剧疆锛�'})
     } else if (param.$token) {
-      return new Promise(resolve => this.visitOuterSystem(param, resolve))
+      return new Promise((resolve, reject) => this.visitOuterSystem(param, resolve, reject))
     }
 
     if (['sPC_TableData_InUpDe', 'sPC_TableData_InUpDe_debug'].includes(param.func)) {
@@ -944,6 +959,17 @@
           } else {
             resolve(res)
           }
+        }, (e) => {
+          if (!e || !e.status) {
+            let msg = '缃戠粶杩炴帴涓嶆甯搞��'
+
+            if (/^http:/.test(rduri) && /https:/.test(window.location.protocol)) {
+              msg = '缃戠粶杩炴帴涓嶆甯革紝鎺ュ彛鍦板潃鍙兘涓嶆敮鎸乭ttps銆�'
+            }
+            resolve({status: false, ErrCode: 'E', message: msg})
+          } else {
+            reject()
+          }
         })
       })
     } else {
diff --git a/src/menu/components/form/simple-form/index.jsx b/src/menu/components/form/simple-form/index.jsx
index de1c0ca..15527e3 100644
--- a/src/menu/components/form/simple-form/index.jsx
+++ b/src/menu/components/form/simple-form/index.jsx
@@ -539,6 +539,7 @@
     _card.subcards[0].setting.align = _card.wrap.align
     _card.subcards[0].setting.enable = _card.wrap.enable
     _card.subcards[0].setting.verticalSpace = _card.wrap.verticalSpace
+    _card.subcards[0].subButton.enable = _card.wrap.enable
 
     if (_card.wrap.closeEnable === 'true' && !_card.subcards[0].closeButton) {
       _card.subcards[0].closeButton = {label: '鍏抽棴', enable: 'true', type: 'close', style: {backgroundColor: '#ffffff', color: 'rgba(0,0,0,0.65)', borderColor: '#d9d9d9', borderWidth: '1px', paddingLeft: '25px', paddingRight: '25px', paddingTop: '5px', paddingBottom: '5px', marginLeft: '10px'}}
diff --git a/src/menu/components/group/paste/index.jsx b/src/menu/components/group/paste/index.jsx
index fb491f3..8a9b436 100644
--- a/src/menu/components/group/paste/index.jsx
+++ b/src/menu/components/group/paste/index.jsx
@@ -20,7 +20,7 @@
 
   pasteSubmit = () => {
     let appType = sessionStorage.getItem('appType')
-    let options = ['datacard', 'propcard', 'balcony', 'timeline', 'simpleform', 'stepform', 'tabform', 'normaltable', 'tablecard', 'editor', 'line', 'bar', 'pie', 'scatter', 'sandbox']
+    let options = ['datacard', 'propcard', 'balcony', 'timeline', 'simpleform', 'stepform', 'tabform', 'basetable', 'normaltable', 'tablecard', 'editor', 'line', 'bar', 'pie', 'scatter', 'sandbox']
     let types = {
       login: '鐧诲綍',
       navbar: '瀵艰埅鏍�',
@@ -53,6 +53,11 @@
         return
       }
 
+      if (res.copyType === 'basetable') {
+        res.copyType = 'normaltable'
+        res.subtype = 'normaltable'
+      }
+
       res = MenuUtils.resetComponentConfig(res, appType)
 
       delete res.copyType
diff --git a/src/menu/components/search/main-search/dragsearch/card.jsx b/src/menu/components/search/main-search/dragsearch/card.jsx
index f439493..1b4f6a0 100644
--- a/src/menu/components/search/main-search/dragsearch/card.jsx
+++ b/src/menu/components/search/main-search/dragsearch/card.jsx
@@ -133,7 +133,7 @@
         <CloseOutlined className="close" onClick={() => delCard(id)} />
       </div>
     } trigger="hover">
-      <div className={'page-card ' + (card.labelShow === 'false' ? 'label-hide ' : '') + card.type + (card.advanced === 'true' ? ' advanced' : '')} style={{ opacity: opacity}}>
+      <div className={'page-card ' + (card.labelShow === 'false' ? 'label-hide ' : '') + card.type + (card.advanced === 'true' ? ' advanced' : '') + (card.query === 'false' ? ' no-query' : '')} style={{ opacity: opacity}}>
         <div ref={node => drag(drop(node))}>
           <Form.Item
             labelCol={{xs: { span: 24 }, sm: { span: 8 }}}
diff --git a/src/menu/components/search/main-search/index.scss b/src/menu/components/search/main-search/index.scss
index 6aff673..3411db9 100644
--- a/src/menu/components/search/main-search/index.scss
+++ b/src/menu/components/search/main-search/index.scss
@@ -89,6 +89,11 @@
       color: orange;
     }
   }
+  .page-card.no-query {
+    .ant-form-explain {
+      color: #13c2c2;
+    }
+  }
   .mk-search-item-wrap.action {
     .ant-form-item {
       white-space: nowrap;
diff --git a/src/menu/components/table/base-table/columns/index.jsx b/src/menu/components/table/base-table/columns/index.jsx
index 5b6a30a..1205028 100644
--- a/src/menu/components/table/base-table/columns/index.jsx
+++ b/src/menu/components/table/base-table/columns/index.jsx
@@ -3,7 +3,7 @@
 import { is, fromJS } from 'immutable'
 import { DndProvider, DragSource, DropTarget } from 'react-dnd'
 import { Table, Popover, Modal, message, notification } from 'antd'
-import { PlusOutlined, PlusSquareOutlined, EditOutlined, CopyOutlined, DeleteOutlined, FontColorsOutlined, CloseCircleOutlined, AntDesignOutlined, InfoOutlined } from '@ant-design/icons'
+import { PlusOutlined, PlusSquareOutlined, EditOutlined, CopyOutlined, DeleteOutlined, FontColorsOutlined, CloseCircleOutlined, AntDesignOutlined } from '@ant-design/icons'
 
 import asyncComponent from '@/utils/asyncComponent'
 import asyncIconComponent from '@/utils/asyncIconComponent'
@@ -615,26 +615,26 @@
     })
   }
 
-  copyFields = () => {
-    const { config } = this.props
-    let m = []
-    let n = []
+  // copyFields = () => {
+  //   const { config } = this.props
+  //   let m = []
+  //   let n = []
 
-    config.columns.forEach(col => {
-      m.push(`${col.field} ${col.datatype}`)
-      n.push(col.field)
-    })
+  //   config.columns.forEach(col => {
+  //     m.push(`${col.field} ${col.datatype}`)
+  //     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)
+  //   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('澶嶅埗鎴愬姛銆�')
-  }
+  //   message.success('澶嶅埗鎴愬姛銆�')
+  // }
 
   componentDidMount () {
     MKEmitter.addListener('plusColumns', this.plusColumns)
@@ -680,7 +680,7 @@
           <FieldsComponent config={config} type="columns" />
           <CopyOutlined title="澶嶅埗鏄剧ず鍒�" onClick={this.copycolumn} />
           <MarkColumn columns={fields} type="line" marks={lineMarks} onSubmit={this.updateLineMarks} />
-          <InfoOutlined title="澶嶅埗瀛楁" style={{color: 'orange'}} onClick={this.copyFields}/>
+          {/* <InfoOutlined title="澶嶅埗瀛楁" style={{color: 'orange'}} onClick={this.copyFields}/> */}
         </div>
         <DndProvider>
           {groups ? groups.map((group, i) => {
diff --git a/src/menu/components/table/base-table/index.jsx b/src/menu/components/table/base-table/index.jsx
index 653881d..95759e2 100644
--- a/src/menu/components/table/base-table/index.jsx
+++ b/src/menu/components/table/base-table/index.jsx
@@ -259,12 +259,23 @@
     config.cols.forEach(col => {
       if (!col.field) return
       if (['text', 'picture', 'video', 'textarea'].includes(col.type)) {
+        let datatype = `Nvarchar(${col.fieldlength || 50})`
+        let type = 'text'
+
+        if (col.type === 'text') {
+          if (col.textFormat === 'YYYY-MM-DD') {
+            datatype = 'date'
+          } else if (col.textFormat === 'YYYY-MM-DD HH:mm:ss') {
+            datatype = 'datetime'
+          }
+        }
+
         config.columns.push({
-          datatype: `Nvarchar(${col.fieldlength || 50})`,
+          datatype: datatype,
           field: col.field,
           fieldlength: col.fieldlength || 50,
           label: col.label,
-          type: 'text',
+          type: type,
           uuid: col.uuid
         })
       } else if (col.type === 'link') {
diff --git a/src/menu/components/table/edit-table/columns/tableIn/customscript/index.jsx b/src/menu/components/table/edit-table/columns/tableIn/customscript/index.jsx
index 216d0fe..180e506 100644
--- a/src/menu/components/table/edit-table/columns/tableIn/customscript/index.jsx
+++ b/src/menu/components/table/edit-table/columns/tableIn/customscript/index.jsx
@@ -131,6 +131,25 @@
             duration: 5
           })
           return
+        } else if (/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig.test(values.sql)) {
+          let list = values.sql.match(/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig)
+          let errors = []
+          list.forEach(str => {
+            str = str.replace(/^\s/, '')
+            let strs = str.match(/(\s|=)[a-z0-9_]+\./ig)
+            if (strs.length === 2 && (strs[0].replace(/\s|\./g, '') === strs[1].replace(/\s|\./g, ''))) {
+              errors.push(str)
+            }
+          })
+
+          if (errors.length > 0) {
+            notification.warning({
+              top: 92,
+              message: '涓嶅彲浣跨敤鍚屼竴涓〃瀛楁杩涜鍏宠仈锛�' + errors.join('銆�'),
+              duration: 5
+            })
+            return
+          }
         }
 
         let error = Utils.verifySql(values.sql, 'customscript')
diff --git a/src/menu/components/table/normal-table/index.jsx b/src/menu/components/table/normal-table/index.jsx
index 613f54c..4b011c7 100644
--- a/src/menu/components/table/normal-table/index.jsx
+++ b/src/menu/components/table/normal-table/index.jsx
@@ -381,7 +381,7 @@
         } trigger="hover">
           <ToolOutlined />
         </Popover>
-        <SearchComponent config={card} updatesearch={this.updateComponent}/>
+        {appType !== 'mob' ? <SearchComponent config={card} updatesearch={this.updateComponent}/> : null}
         <ActionComponent config={card} setSubConfig={this.setSubConfig} updateaction={this.updateComponent}/>
         <ColumnComponent config={card} updatecolumn={this.updateComponent}/>
         <div className="component-name">
diff --git a/src/menu/components/tabs/paste/index.jsx b/src/menu/components/tabs/paste/index.jsx
index 733653d..db15490 100644
--- a/src/menu/components/tabs/paste/index.jsx
+++ b/src/menu/components/tabs/paste/index.jsx
@@ -53,7 +53,7 @@
   pasteSubmit = () => {
     const { Tab } = this.props
     let appType = sessionStorage.getItem('appType')
-    let options = ['tabs', 'group', 'datacard', 'propcard', 'timeline', 'balcony', 'normaltable', 'mainsearch', 'simpleform', 'stepform', 'tabform', 'editor', 'tablecard', 'line', 'bar', 'pie', 'scatter', 'sandbox']
+    let options = ['tabs', 'group', 'datacard', 'propcard', 'timeline', 'balcony', 'basetable', 'normaltable', 'mainsearch', 'simpleform', 'stepform', 'tabform', 'editor', 'tablecard', 'line', 'bar', 'pie', 'scatter', 'sandbox']
     let types = {
       login: '鐧诲綍',
       navbar: '瀵艰埅鏍�',
@@ -83,6 +83,11 @@
         return
       }
 
+      if (res.copyType === 'basetable') {
+        res.copyType = 'normaltable'
+        res.subtype = 'normaltable'
+      }
+
       res = this.resetconfig(res, appType)
 
       delete res.copyType
diff --git a/src/menu/datasource/index.jsx b/src/menu/datasource/index.jsx
index eda176e..759e84e 100644
--- a/src/menu/datasource/index.jsx
+++ b/src/menu/datasource/index.jsx
@@ -6,6 +6,7 @@
 
 import VerifyCard from './verifycard'
 import CreateFunc from '@/templates/zshare/createfunc'
+import MKEmitter from '@/utils/events.js'
 import './index.scss'
 
 class DataSource extends Component {
@@ -146,6 +147,14 @@
         res.setting.supModule = ['empty']
       }
 
+      if (!res.setting.primaryKey && res.columns && res.columns.length > 0) {
+        res.columns.forEach(col => {
+          if (col.field.toLowerCase() === 'id') {
+            res.setting.primaryKey = col.field
+          }
+        })
+      }
+
       if (res.columns) {
         res.columns = res.columns.map(item => {
     
@@ -226,8 +235,13 @@
       } else {
         delete res.cols
       }
-
       this.props.updateConfig({...config, ...res})
+
+      if (res.setting && res.setting.tableName && config.setting && !config.setting.tableName) {
+        setTimeout(() => {
+          MKEmitter.emit('publicTableChange', res.setting.tableName, 'init')
+        }, 150)
+      }
     }, () => {
       this.setState({loading: false})
     })
diff --git a/src/menu/datasource/verifycard/customscript/index.jsx b/src/menu/datasource/verifycard/customscript/index.jsx
index 5babfa1..8f28de4 100644
--- a/src/menu/datasource/verifycard/customscript/index.jsx
+++ b/src/menu/datasource/verifycard/customscript/index.jsx
@@ -33,74 +33,41 @@
   UNSAFE_componentWillMount() {
     const { searches } = this.props
 
+    this.getSearchField(searches)
+  }
+
+  UNSAFE_componentWillReceiveProps (nextProps) {
+    if (!is(fromJS(this.props.searches), fromJS(nextProps.searches))) {
+      this.getSearchField(nextProps.searches)
+    }
+  }
+
+  getSearchField = (searches) => {
     let _usefulFields = []
     searches.forEach(item => {
-      if (!item.field) return
-
-      if (item.type === 'group') {
-        _usefulFields.push(item.field)
-        _usefulFields.push(item.datefield)
-        _usefulFields.push(item.datefield + '1')
-      } else if (['dateweek', 'datemonth'].includes(item.type)) {
-        _usefulFields.push(item.field)
-        _usefulFields.push(item.field + '1')
+      if (['dateweek', 'datemonth'].includes(item.type)) {
+        _usefulFields.push(item.key)
+        _usefulFields.push(item.key + '1')
       } else if (item.type === 'daterange') {
-        let _skey = item.field
-        let _ekey = item.field + '1'
+        let _skey = item.key
+        let _ekey = item.key + '1'
 
-        if (/,/.test(item.field)) {
-          _skey = item.field.split(',')[0]
-          _ekey = item.field.split(',')[1]
+        if (/,/.test(item.key)) {
+          _skey = item.key.split(',')[0]
+          _ekey = item.key.split(',')[1]
         }
         _usefulFields.push(_skey)
         _usefulFields.push(_ekey)
-      } else if (item.type === 'date' && _usefulFields.includes(item.field)) {
-        _usefulFields.push(item.field + '1')
+      } else if (item.type === 'date' && _usefulFields.includes(item.key)) {
+        _usefulFields.push(item.key + '1')
       } else {
-        _usefulFields.push(item.field)
+        _usefulFields.push(item.key)
       }
     })
 
     this.setState({
       usefulFields: _usefulFields.join(', ')
     })
-  }
-
-  UNSAFE_componentWillReceiveProps (nextProps) {
-    if (!is(fromJS(this.props.searches), fromJS(nextProps.searches))) {
-      
-      let _usefulFields = []
-      nextProps.searches.forEach(item => {
-        if (!item.field) return
-
-        if (item.type === 'group') {
-          _usefulFields.push(item.field)
-          _usefulFields.push(item.datefield)
-          _usefulFields.push(item.datefield + '1')
-        } else if (['dateweek', 'datemonth'].includes(item.type)) {
-          _usefulFields.push(item.field)
-          _usefulFields.push(item.field + '1')
-        } else if (item.type === 'daterange') {
-          let _skey = item.field
-          let _ekey = item.field + '1'
-
-          if (/,/.test(item.field)) {
-            _skey = item.field.split(',')[0]
-            _ekey = item.field.split(',')[1]
-          }
-          _usefulFields.push(_skey)
-          _usefulFields.push(_ekey)
-        } else if (item.type === 'date' && _usefulFields.includes(item.field)) {
-          _usefulFields.push(item.field + '1')
-        } else {
-          _usefulFields.push(item.field)
-        }
-      })
-
-      this.setState({
-        usefulFields: _usefulFields.join(', ')
-      })
-    }
   }
 
   edit = (record) => {
@@ -176,6 +143,25 @@
             duration: 5
           })
           return
+        } else if (/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig.test(values.sql)) {
+          let list = values.sql.match(/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig)
+          let errors = []
+          list.forEach(str => {
+            str = str.replace(/^\s/, '')
+            let strs = str.match(/(\s|=)[a-z0-9_]+\./ig)
+            if (strs.length === 2 && (strs[0].replace(/\s|\./g, '') === strs[1].replace(/\s|\./g, ''))) {
+              errors.push(str)
+            }
+          })
+
+          if (errors.length > 0) {
+            notification.warning({
+              top: 92,
+              message: '涓嶅彲浣跨敤鍚屼竴涓〃瀛楁杩涜鍏宠仈锛�' + errors.join('銆�'),
+              duration: 5
+            })
+            return
+          }
         }
 
         let error = Utils.verifySql(values.sql, 'customscript')
@@ -230,6 +216,8 @@
   }
 
   selectScript = (value, option) => {
+    const { setting } = this.props
+
     let _sql = this.props.form.getFieldValue('sql')
     if (_sql === ' ') {
       _sql = ''
@@ -241,8 +229,17 @@
 
     if (value === 'defaultsql') {
       value = this.props.defaultsql
-    } else if (value === 'flowsql') {
-      value = `/* select a.*,w.remark as remark_w,w.statusname as statusname_w,w.status as status_w,w.works_flow_param from (鏁版嵁婧�) a inner join (select * from  s_my_works_flow  where works_flow_code=@works_flow_code@ and status=0 and deleted=0) w on a.id=w.works_flow_id */`
+    } else if (value === 'flowstart') {
+      value = `/* select a.*, w.remark as remark_w, w.statusname  as statusname_w,w.status as status_w,w.works_flow_param,w.modifydate as modifydate_w  from (select * from ${setting.tableName} where status=0 and deleted=0 $@ and createuserid=@userid@ @$) a
+      inner join (select * from  s_my_works_flow  where works_flow_code=@works_flow_code@ and status=0 and deleted=0) w on a.id=w.works_flow_id */`
+      this.props.addProcess()
+    } else if (value === 'flowcheck') {
+      value = `/* select a.*, w.remark as remark_w, w.statusname  as statusname_w,w.status as status_w,w.works_flow_param,w.modifydate as modifydate_w  
+      from (select * from ${setting.tableName} where status=0 and deleted=0 ) a
+      inner join (select * from  s_my_works_flow  where works_flow_code=@works_flow_code@ and status>0 and status<888 and deleted=0) w 
+      on a.id=w.works_flow_id 
+      $@ inner join (select works_flow_id  from s_my_works_flow_role where userid=@userid@ and  works_flow_code=@works_flow_code@ and deleted=0 ) r
+      on r.works_flow_id=w.works_flow_id @$ */`
       this.props.addProcess()
     }
 
@@ -338,6 +335,7 @@
               <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>,&nbsp;
               <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'鎺掑簭銆佸垎椤典互鍙婃悳绱㈡潯浠跺彉閲忥紝璇锋寜鐓xxx@鏍煎紡浣跨敤銆備娇鐢ˊpageSize@鎴朄orderBy@浠h〃鑷畾涔夊垎椤碉紝鎬绘暟璇蜂互mk_total杩斿洖銆�'}>orderBy, pageSize, pageIndex{usefulFields ? ', ' + usefulFields : ''}{type === 'calendar' ? ', mk_year' : ''}</Tooltip>
               <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'url鍙橀噺锛岃鎸夌収@xxx@鏍煎紡浣跨敤銆�'}>{urlFields ? ', ' : ''}<span style={{color: '#13c2c2'}}>{urlFields}</span></Tooltip>
+              {window.GLOB.process ? <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'宸ヤ綔娴佸彉閲忥紝璇锋寜鐓xxx@鏍煎紡浣跨敤銆�'}>, <span style={{color: 'purple'}}>works_flow_code</span></Tooltip> : null}
             </Form.Item>
           </Col>
           <Col span={8} style={{whiteSpace: 'nowrap'}}>
@@ -365,7 +363,8 @@
                 onSelect={this.selectScript}
               >
                 <Select.Option style={{whiteSpace: 'normal'}} key="default" value="defaultsql">榛樿sql</Select.Option>
-                {window.GLOB.process ? <Select.Option style={{whiteSpace: 'normal'}} key="default" value="flowsql">榛樿sql锛堝伐浣滄祦锛�</Select.Option> : null}
+                {window.GLOB.process ? <Select.Option style={{whiteSpace: 'normal'}} key="flowstart" value="flowstart">榛樿sql锛堝伐浣滄祦-鍙戣捣锛�</Select.Option> : null}
+                {window.GLOB.process ? <Select.Option style={{whiteSpace: 'normal'}} key="flowcheck" value="flowcheck">榛樿sql锛堝伐浣滄祦-瀹℃牳锛�</Select.Option> : null}
                 <Select.Option key="debugger" value={`z_debug: select @ErrorCode='E',@retmsg='娴嬭瘯鏂偣' goto aaa`}>
                   娴嬭瘯鏂偣
                 </Select.Option>
diff --git a/src/menu/datasource/verifycard/index.jsx b/src/menu/datasource/verifycard/index.jsx
index 266395c..7519b71 100644
--- a/src/menu/datasource/verifycard/index.jsx
+++ b/src/menu/datasource/verifycard/index.jsx
@@ -8,7 +8,7 @@
 
 import Api from '@/api'
 import Utils from '@/utils/utils.js'
-
+import { formatSearch, joinMainSearchkey } from '@/utils/utils-custom.js'
 import asyncComponent from '@/utils/asyncComponent'
 import ColForm from './columnform'
 import CustomScriptsForm from './customscript'
@@ -40,11 +40,11 @@
     subColumns: [],
     activeKey: 'setting',
     loading: false,
+    colLoading: false,
     searchKey: '',
     initsql: '',          // sql楠岃瘉鏃跺彉閲忓0鏄庡強璧嬪��
     usefulfields: '',
     defaultsql: '',       // 榛樿Sql
-    defaultSearch: '',
     systemScripts: [],
     median: {},
     visible: false,
@@ -210,16 +210,32 @@
       })
     }
 
-    let _search = this.formatSearch(search)
-    _search = Utils.joinMainSearchkey(_search)
-
-    _search = _search.replace(/@\$@/ig, '')
-    _search = _search ? 'where ' + _search : ''
     let columns = config.columns ? fromJS(config.columns).toJS() : []
     let subColumns = config.subColumns ? fromJS(config.subColumns).toJS() : []
 
     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,
@@ -227,8 +243,7 @@
       subColumns: subColumns,
       setting: _setting,
       median: _setting,
-      searches: search,
-      defaultSearch: _search,
+      searches: formatSearch(search),
       searchKey: '',
       debugId: _setting.debugId || ''
     })
@@ -426,15 +441,8 @@
           search = [...search, ...mainSearch]
         }
 
-        let _search = this.formatSearch(search)
-        _search = Utils.joinMainSearchkey(_search)
-
-        _search = _search.replace(/@\$@/ig, '')
-        _search = _search ? 'where ' + _search : ''
-
         this.setState({
-          searches: search,
-          defaultSearch: _search,
+          searches: formatSearch(search),
           setting: res
         }, () => {
           this.sqlverify(() => { // 楠岃瘉鎴愬姛
@@ -513,9 +521,11 @@
   }
 
   getdefaultSql = () => {
-    const { columns, setting, defaultSearch } = this.state
+    const { columns, setting, searches } = this.state
     let defaultsql = ''
     let arr_field = columns.map(col => col.field).join(',')
+
+    let _search = joinMainSearchkey(searches)
 
     if (setting.dataresource) {
       let _dataresource = setting.dataresource
@@ -524,59 +534,10 @@
         _dataresource = '(' + _dataresource + ') tb'
       }
 
-      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`
+      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`
     }
 
     this.setState({defaultsql})
-  }
-
-  /**
-   * @description 鑾峰彇鍏ㄩ儴鎼滅储鏉′欢
-   * @param {Array} searches 鎼滅储鏉′欢鏁扮粍
-   */
-  formatSearch (searches) {
-    if (!searches) return []
-
-    let newsearches = []
-    searches.forEach(search => {
-      if (!search.field) return
-      
-      let item = {
-        key: search.field,
-        match: search.match,
-        type: search.type,
-        label: search.label,
-        value: search.initval,
-        required: search.required === 'true'
-      }
-      if (item.type === 'group') {
-        item.key = search.datefield
-        item.type = 'daterange'
-        item.match = 'between'
-        item.value = [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')].join(',')
-
-        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().format('YYYY-MM-DD')
-      } else if (item.type === 'daterange') {
-        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 = () => {
@@ -611,15 +572,8 @@
             search = [...search, ...mainSearch]
           }
 
-          let _search = this.formatSearch(search)
-          _search = Utils.joinMainSearchkey(_search)
-
-          _search = _search.replace(/@\$@/ig, '')
-          _search = _search ? 'where ' + _search : ''
-
           this.setState({
-            searches: search,
-            defaultSearch: _search,
+            searches: formatSearch(search),
             setting: res
           }, () => {
             this.sqlverify(() => { resolve({setting: res, columns, subColumns, scripts, cols }) }, reject, 'submit')
@@ -674,7 +628,7 @@
 
   sqlverify = (resolve, reject, type, testScripts) => {
     const { config } = this.props
-    const { columns, setting, scripts, searches, defaultSearch, debugId } = this.state
+    const { columns, setting, scripts, searches, debugId, subColumns } = this.state
 
     let _scripts = scripts.filter(item => item.status !== 'false')
 
@@ -697,7 +651,11 @@
     }
 
     if ((setting.interType === 'system' && setting.execute !== 'false') || _scripts.length > 0) {
-      let r = SettingUtils.getDebugSql(setting, _scripts, columns, searches, defaultSearch, config.type)
+      let _columns = columns
+      if (config.subtype === 'dualdatacard') {
+        _columns = [...columns, ...subColumns]
+      }
+      let r = SettingUtils.getDebugSql(setting, _scripts, _columns, searches, config.type)
 
       let _debugId = md5(r.sql)
 
@@ -907,11 +865,25 @@
     const { columns } = this.state
     let m = []
     let n = []
+    let s = []
 
     columns.forEach(col => {
-      m.push(`${col.field} ${col.datatype}`)
-      n.push(col.field)
+      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) {
+      console.info('select ' + s.join(', '))
+    }
 
     let oInput = document.createElement('input')
     oInput.value = `/*${m.join(',')}*/
@@ -988,6 +960,49 @@
     })
   }
 
+  updateColumns = (tableName) => {
+    const { config } = this.props
+    const { colLoading, columns } = this.state
+
+    if (colLoading || columns.length > 0) return
+
+    if (config.subtype === 'basetable') return
+
+    let param = {func: 'sPC_Get_FieldName', TBName: tableName}
+    if (window.GLOB.cloudServiceApi) { // 涓斿瓨鍦ㄤ簯绔湴鍧�
+      param.rduri = window.GLOB.cloudServiceApi
+      param.userid = sessionStorage.getItem('CloudUserID') || ''
+      param.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
+    }
+
+    this.setState({colLoading: true})
+
+    Api.getSystemCacheConfig(param).then(result => {
+      this.setState({colLoading: false})
+      if (!result.status) return
+
+      let fields = []
+      result.FDName.forEach(item => {
+        if (item.f_type !== 0) return
+
+        if (/nvarchar|int|decimal/ig.test(item.FieldType) || item.FieldType === 'date' || item.FieldType === 'datetime') {
+          fields.unshift({
+            uuid: Utils.getuuid(),
+            label: item.FieldDec,
+            field: item.FieldName,
+            datatype: item.FieldType.toLowerCase()
+          })
+        }
+      })
+
+      if (fields.length === 0) return
+
+      this.setState({columns: fields})
+    }, () => {
+      this.setState({colLoading: false})
+    })
+  }
+
   /**
    * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊
    */
@@ -1018,6 +1033,7 @@
               setting={setting}
               scripts={scripts}
               updateStatus={this.updateStatus}
+              updateColumns={this.updateColumns}
               addProcess={this.addProcess}
               wrappedComponentRef={(inst) => this.settingForm = inst}
             /> : null}
@@ -1035,7 +1051,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>
+              瀛楁闆�
+              {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>
               瀛愯〃瀛楁闆�
diff --git a/src/menu/datasource/verifycard/index.scss b/src/menu/datasource/verifycard/index.scss
index c8e00e8..e791cda 100644
--- a/src/menu/datasource/verifycard/index.scss
+++ b/src/menu/datasource/verifycard/index.scss
@@ -5,6 +5,14 @@
     top: 220px;
     z-index: 1;
   }
+  .base-table-columns {
+    height: 15px;
+  }
+  .base-table-columns + .modal-edit-table {
+    .editable-row > td:last-child {
+      padding: 14px 10px;
+    }
+  }
   .data-source-card-box {
     .ant-tabs-nav-scroll {
       text-align: center;
diff --git a/src/menu/datasource/verifycard/settingform/index.jsx b/src/menu/datasource/verifycard/settingform/index.jsx
index 612259d..805305e 100644
--- a/src/menu/datasource/verifycard/settingform/index.jsx
+++ b/src/menu/datasource/verifycard/settingform/index.jsx
@@ -1,8 +1,8 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { fromJS } from 'immutable'
-import { Form, Row, Col, Input, Radio, Tooltip, notification, Select, InputNumber, Cascader } from 'antd'
-import { QuestionCircleOutlined } from '@ant-design/icons'
+import { Form, Row, Col, Input, Radio, Tooltip, notification, Select, InputNumber, Cascader, Modal, Button } from 'antd'
+import { QuestionCircleOutlined, PlusOutlined } from '@ant-design/icons'
 
 import { formRule } from '@/utils/option.js'
 import Utils from '@/utils/utils.js'
@@ -16,6 +16,7 @@
 class SettingForm extends Component {
   static propTpyes = {
     updateStatus: PropTypes.func,
+    updateColumns: PropTypes.func,
     addProcess: PropTypes.func,
     config: PropTypes.object,     // 缁勪欢閰嶇疆
     setting: PropTypes.object,    // 鏁版嵁婧愰厤缃�
@@ -29,7 +30,8 @@
     innerRules: [],
     innertip: '',
     MenuType: sessionStorage.getItem('MenuType') || '',
-    ismain: false
+    ismain: false,
+    visible: false
   }
 
   UNSAFE_componentWillMount () {
@@ -182,21 +184,61 @@
   }
 
   addProcess = () => {
-    let _sql = this.props.form.getFieldValue('dataresource')
+    this.setState({visible: true})
+  }
 
-    _sql = _sql + `\n/* select a.*,w.remark as remark_w,w.statusname as statusname_w,w.status as status_w,w.works_flow_param from (鏁版嵁婧�) a inner join (select * from  s_my_works_flow  where works_flow_code=@works_flow_code@ and status=0 and deleted=0) w on a.id=w.works_flow_id */`
+  execAddProcess = (type) => {
+    let _sql = this.props.form.getFieldValue('dataresource')
+    let tableName = this.props.form.getFieldValue('tableName') || '琛ㄥ悕'
+
+    if (type === 'flowstart') {
+      _sql = _sql + `\n/* select a.*, w.remark as remark_w, w.statusname  as statusname_w,w.status as status_w,w.works_flow_param,w.modifydate as modifydate_w  from (select * from ${tableName} where status=0 and deleted=0 $@ and createuserid=@userid@ @$) a
+    inner join (select * from  s_my_works_flow  where works_flow_code=@works_flow_code@ and status=0 and deleted=0) w on a.id=w.works_flow_id */`
+    } else if (type === 'flowcheck') {
+      _sql = _sql + `\n/* select a.*, w.remark as remark_w, w.statusname  as statusname_w,w.status as status_w,w.works_flow_param,w.modifydate as modifydate_w  
+    from (select * from ${tableName} where status=0 and deleted=0 ) a
+    inner join (select * from  s_my_works_flow  where works_flow_code=@works_flow_code@ and status>0 and status<888 and deleted=0) w 
+    on a.id=w.works_flow_id 
+    $@ inner join (select works_flow_id  from s_my_works_flow_role where userid=@userid@ and  works_flow_code=@works_flow_code@ and deleted=0 ) r
+    on r.works_flow_id=w.works_flow_id @$ */`
+    }
 
     this.props.form.setFieldsValue({
       dataresource: _sql
     })
 
+    this.setState({visible: false})
+
     this.props.addProcess()
+  }
+
+  addSql = () => {
+    let tableName = this.props.form.getFieldValue('tableName')
+
+    if (!tableName) {
+      notification.warning({
+        top: 92,
+        message: '璇锋坊鍔犺〃鍚嶃��',
+        duration: 5
+      })
+      return
+    }
+
+    let _sql = this.props.form.getFieldValue('dataresource')
+
+    if (/^\s*$/.test(_sql)) {
+      this.props.form.setFieldsValue({
+        dataresource: `select * from ${tableName} where deleted=0`
+      })
+    }
+
+    this.props.updateColumns(tableName)
   }
 
   render() {
     const { columns, config } = this.props
     const { getFieldDecorator } = this.props.form
-    const { setting, modules, innerRules, innertip, MenuType } = this.state
+    const { setting, modules, innerRules, innertip, MenuType, visible } = this.state
 
     const formItemLayout = {
       labelCol: {
@@ -223,7 +265,7 @@
                       message: '璇疯緭鍏ユ暟鎹簮鍚嶇О!'
                     }
                   ]
-                })(<Input placeholder={''} autoComplete="off" />)}
+                })(<Input placeholder="" autoComplete="off" />)}
               </Form.Item>
             </Col> : null}
             <Col span={8}>
@@ -244,7 +286,11 @@
                       message: '琛ㄥ悕鍙彲浣跨敤瀛楁瘝銆佹暟瀛椾互鍙奯'
                     }
                   ]
-                })(<Input placeholder={''} autoComplete="off" />)}
+                })(
+                  setting.interType === 'system' && ((columns.length === 0 && config.subtype !== 'basetable') || !setting.dataresource) ?
+                  <Input placeholder="" autoComplete="off" addonAfter={<PlusOutlined onClick={this.addSql} />}/> :
+                  <Input placeholder="" autoComplete="off"/>
+                  )}
               </Form.Item>
             </Col>
             <Col span={8}>
@@ -672,6 +718,20 @@
             </Col> : null}
           </Row>
         </Form>
+        <Modal
+          wrapClassName="mk-flow-type"
+          visible={visible}
+          width={400}
+          maskClosable={false}
+          closable={false}
+          footer={[
+            <Button key="cancel" className="mk-green" onClick={() => this.execAddProcess('flowstart')}>鍙戣捣</Button>,
+            <Button key="confirm" className="mk-primary" onClick={() => this.execAddProcess('flowcheck')}>瀹℃壒</Button>
+          ]}
+          destroyOnClose
+        >
+          璇烽�夋嫨宸ヤ綔娴佺被鍨嬨��
+        </Modal>
       </div>
     )
   }
diff --git a/src/menu/datasource/verifycard/settingform/index.scss b/src/menu/datasource/verifycard/settingform/index.scss
index bc66156..bdd6da1 100644
--- a/src/menu/datasource/verifycard/settingform/index.scss
+++ b/src/menu/datasource/verifycard/settingform/index.scss
@@ -34,4 +34,33 @@
     color: #1890ff;
     cursor: pointer;
   }
+  .ant-input-group-addon {
+    padding: 0;
+    .anticon-plus {
+      cursor: pointer;
+      padding: 7px 9px;
+    }
+  }
+  .ant-form-item-control.has-error {
+    .ant-input-group-addon {
+      display: none;
+    }
+  }
+}
+.mk-flow-type {
+  .ant-modal-body {
+    font-size: 16px;
+    color: rgba(0, 0, 0, 0.85);
+    text-align: center;
+    padding: 40px 0 20px;
+  }
+  .ant-modal-footer {
+    border: 0;
+    text-align: center;
+    padding: 25px 16px;
+
+    button + button {
+      margin-left: 15px;
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/menu/datasource/verifycard/utils.jsx b/src/menu/datasource/verifycard/utils.jsx
index ad11e06..d2d224a 100644
--- a/src/menu/datasource/verifycard/utils.jsx
+++ b/src/menu/datasource/verifycard/utils.jsx
@@ -1,4 +1,6 @@
 
+import { getSearchRegs, joinMainSearchkey } from '@/utils/utils-custom.js'
+
 export default class SettingUtils {
   /**
    * @description 鐢熸垚椤甸潰鏌ヨ璇彞
@@ -7,7 +9,7 @@
    * @return {Object}  setting       椤甸潰璁剧疆
    * @return {Array}   columns       鏄剧ず瀛楁
    */
-  static getDebugSql (setting, scripts, columns, searches = [], defSearch, type) {
+  static getDebugSql (setting, scripts, columns, searches = [], type) {
     let sql = ''
     let error = ''
     let _dataresource = ''
@@ -95,85 +97,33 @@
     }
 
     // 姝e垯鏇挎崲
-    let _regoptions = []
-    let _fields = []
     let custompage = /@pageSize@|@orderBy@/i.test(_dataresource + _customScript)
+    let _regoptions = getSearchRegs(searches)
 
-    searches.forEach(item => {
-      if (!item.field) return
-      if (item.datefield) {
-        _regoptions.push({
-          reg: new RegExp('@' + item.datefield + '@', 'ig')
-        })
-        _regoptions.push({
-          reg: new RegExp('@' + item.datefield + '1@', 'ig')
-        })
-      }
-      if (['dateweek', 'datemonth', 'range'].includes(item.type)) {
-        _regoptions.push({
-          reg: new RegExp('@' + item.field + '@', 'ig')
-        })
-        _regoptions.push({
-          reg: new RegExp('@' + item.field + '1@', 'ig')
-        })
-      } else if (item.type === 'daterange') {
-        let _skey = item.field
-        let _ekey = item.field + '1'
-
-        if (/,/.test(item.field)) {
-          _skey = item.field.split(',')[0]
-          _ekey = item.field.split(',')[1]
-        }
-
-        _regoptions.push({
-          reg: new RegExp('@' + _skey + '@', 'ig')
-        })
-        _regoptions.push({
-          reg: new RegExp('@' + _ekey + '@', 'ig')
-        })
-      } else if (item.type === 'date') {
-        if (_fields.includes(item.field)) {
-          _regoptions.push({
-            reg: new RegExp('@' + item.field + '1@', 'ig')
-          })
-        } else {
-          _fields.push(item.field)
-          _regoptions.push({
-            reg: new RegExp('@' + item.field + '@', 'ig')
-          })
-        }
-      } else if (item.type === 'text' || item.type === 'select') {
-        item.field.split(',').forEach(field => {
-          _regoptions.push({
-            reg: new RegExp('@' + field + '@', 'ig')
-          })
-        })
-      } else {
-        _regoptions.push({
-          reg: new RegExp('@' + item.field + '@', 'ig')
-        })
-      }
-    })
+    let _search = joinMainSearchkey(searches)
 
     _regoptions.push({
+      reg: new RegExp('@userName@', 'ig'),
+      value: `'mk'`
+    }, {
+      reg: new RegExp('@fullName@', 'ig'),
+      value: `'mk'`
+    }, {
       reg: new RegExp('@orderBy@', 'ig'),
-    }, {
-      reg: new RegExp('@UserName@', 'ig'),
-    }, {
-      reg: new RegExp('@FullName@', 'ig'),
+      value: setting.order || ''
     }, {
       reg: new RegExp('@pageSize@', 'ig'),
+      value: 9999
     }, {
       reg: new RegExp('@pageIndex@', 'ig'),
+      value: 1
     })
 
     _regoptions.forEach(item => {
-      _dataresource = _dataresource.replace(item.reg, '0')
-      _customScript = _customScript.replace(item.reg, '0')
-      _tailScript = _tailScript.replace(item.reg, '0')
+      _dataresource = _dataresource.replace(item.reg, item.value || '0')
+      _customScript = _customScript.replace(item.reg, item.value || '0')
+      _tailScript = _tailScript.replace(item.reg, item.value || '0')
     })
-
-    let _search = defSearch
 
     if (setting.queryType === 'statistics') {
       _search = ''
diff --git a/src/menu/debug/index.jsx b/src/menu/debug/index.jsx
index 8e5849c..6e18351 100644
--- a/src/menu/debug/index.jsx
+++ b/src/menu/debug/index.jsx
@@ -1,11 +1,12 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
-// import { fromJS } from 'immutable'
-import { Modal, Button } from 'antd'
-// import moment from 'moment'
+import { fromJS } from 'immutable'
+import { Modal, Button, Drawer, Tooltip } from 'antd'
+import { ClockCircleOutlined, CheckCircleOutlined, CloseCircleOutlined, LoadingOutlined } from '@ant-design/icons'
 
-// import Api from '@/api'
-// import Utils from '@/utils/utils.js'
+import Api from '@/api'
+import Utils from '@/utils/utils.js'
+import { formatSearch, joinMainSearchkey, getSearchRegs } from '@/utils/utils-custom.js'
 import './index.scss'
 
 class DebugSql extends Component {
@@ -15,186 +16,1872 @@
 
   state = {
     visible: false,
-    confirming: false,
+    sqlList: [],
+    status: '',
+    successIds: [],
+    errorIds: [],
+    errorMsg: {},
+    execId: ''
   }
+
+  sqlList = []
+  verSqls = []
 
   trigger = () => {
-    // const { config } = this.props
+    let config = fromJS(this.props.config).toJS()
 
-    // let list = []
-    // let mainSearch = []
+    let error = ''
+
+    let check = (components) => {
+      components.forEach(item => {
+        if (error) return
+        
+        if (item.type === 'tabs') {
+          item.subtabs.forEach(tab => {
+            check(tab.components)
+          })
+          return
+        } else if (item.type === 'group') {
+          check(item.components)
+          return
+        } else if (!item.errors || item.errors.length === 0) {
+          return
+        }
+
+        item.errors.forEach(err => {
+          if (err.level !== 0 || error) return
+          error = `缁勪欢銆�${item.name}銆�${err.detail}`
+        })
+      })
+    }
+
+    check(config.components)
+
+    if (error) {
+      Modal.warning({
+        title: error,
+        okText: '鐭ラ亾浜�'
+      })
+      return
+    }
+
+    this.sqlList = []
+
+    let regs = [
+      { reg: /@userName@/ig, value: `'User_Name'` },
+      { reg: /@fullName@/ig, value: `'Full_Name'` },
+      { reg: /\$@/ig, value: '' },
+      { reg: /@\$/ig, value: '' },
+      { reg: /@datam@/ig, value: `''` },
+    ]
+    
+    if (window.GLOB.externalDatabase !== null) {
+      regs.push({
+        reg: /@db@/ig,
+        value: window.GLOB.externalDatabase
+      })
+    }
+    if (config.urlFields) {
+      config.urlFields.forEach(field => {
+        regs.push({
+          reg: new RegExp('@' + field + '@', 'ig'),
+          value: `'mk'`
+        })
+      })
+    }
+
+    let process = config.process === 'true'
+    if (process) {
+      regs.push({ reg: /@works_flow_code@/ig, value: `'1949-10-01 15:00:00'` })
+    }
+    
+    if (config.interfaces && config.interfaces.length > 0) {
+      config.interfaces.forEach(m => {
+        if (m.status !== 'true' || m.setting.interType !== 'system') return false
+  
+        let sql = this.formatDataSource(m, regs)
+  
+        this.sqlList.push({label: m.setting.name, children: [{label: '鏁版嵁婧�', sql: sql}]})
+      })
+    }
+
+    this.filterComponent(config.components, [], regs, process)
+
+    let sqls = []
+    let foreachSql = (list, name, tabName = '', supName = '') => {
+      list.forEach(item => {
+        if (item.children) {
+          if (item.tabName) {
+            item.children.forEach(cell => {
+              if (cell.children) {
+                foreachSql(cell.children, cell.label, item.tabName, name)
+              }
+            })
+          } else {
+            foreachSql(item.children, name, tabName, supName)
+          }
+        } else if (item.sql) {
+          sqls.push({uuid: Utils.getuuid() ,label: item.label, name: name, tabName: tabName, supName: supName, sql: item.sql})
+        }
+      })
+    }
+
+    this.sqlList.forEach(item => {
+      if (item.children) {
+        foreachSql(item.children, item.label)
+      }
+    })
+
+    if (sqls.length === 0) {
+      Modal.warning({
+        title: '褰撳墠鑿滃崟鏃犲彲楠岃瘉鑴氭湰銆�',
+        okText: '鐭ラ亾浜�'
+      })
+      return
+    }
+
+    this.verSqls = sqls
+    let that = this
+
+    Modal.confirm({
+      content: `褰撳墠鑿滃崟鍏�${this.sqlList.length}涓粍浠讹紝${sqls.length}椤硅剼鏈渶瑕佹楠�${sqls.length > 20 ? '锛屾椂闂村ぇ姒傞渶瑕�' + parseInt(sqls.length / 2) + '绉�' : ''}銆俙,
+      onOk() {
+        that.setState({visible: true, status: 'loading', sqlList: fromJS(sqls).toJS(), successIds: [], errorIds: [], errorMsg: {}, execId: ''}, () => {
+          that.roopSql()
+        })
+      },
+      onCancel() {}
+    })
+
+    this.sqlList = []
   }
 
-  // formatSearch (config) {
-  //   if (!config.search) return []
+  filterComponent = (components, mainSearch, regs, process, ispop = false) => {
+    let appType = sessionStorage.getItem('appType')
+    let _mainSearch = mainSearch || []
 
-  //   let values = []
+    if (appType === 'mob') {
+      let search = []
+      let ms = null
+      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 || ''
+          })
+        }
+      })
 
-  //   config.search.forEach(item => {
-  //     item.hidden = item.Hide === 'true'
-  //     item.required = !item.hidden && item.required === 'true'
-  //     item.advanced = item.advanced === 'true'
-  //     item.$forbid = item.query === 'false'
-  //     item.precision = item.precision || 'day'
+      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 || ''
+          })
+        }
+        search.push(...ms.fields)
 
-  //     if (item.type === 'date') { // 鏃堕棿鎼滅储
-  //       let format = 'YYYY-MM-DD'
-  //       if (item.precision === 'day') {
+        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 || ''
+            })
+          }
+          search.push(...group.fields)
+        })
+      }
 
-  //       } else if (item.precision === 'hour') {
-  //         format = 'YYYY-MM-DD HH'
-  //       } else if (item.precision === 'minute') {
-  //         format = 'YYYY-MM-DD HH:mm'
-  //       } else if (item.precision === 'second') {
-  //         format = 'YYYY-MM-DD HH:mm:ss'
-  //       }
+      if (search.length > 0) {
+        _mainSearch = search
+      }
+    } else {
+      components.forEach(component => {
+        if (component.type !== 'search') return
+  
+        _mainSearch = component.search || []
+      })
+    }
 
-  //       item.initval = item.initval ? moment().subtract(item.initval, 'days').format(format) : ''
-  //     } else if (item.type === 'datemonth') {
-  //       item.initval = item.initval ? moment().subtract(item.initval, 'month').format('YYYY-MM') : ''
-  //     } else if (item.type === 'dateweek') {
-  //       item.initval = item.initval ? moment().subtract(item.initval * 7, 'days').format('YYYY-MM-DD') : ''
-  //     } else if (item.type === 'daterange') {
-  //       let format = 'YYYY-MM-DD'
-  //       if (item.precision === 'day') {
+    components.forEach(item => {
+      if (item.type === 'tabs') {
+        item.subtabs.forEach(tab => {
+          this.filterComponent(tab.components, _mainSearch, regs, process)
+        })
+      } else if (item.type === 'group') {
+        this.filterComponent(item.components, _mainSearch, regs, process)
+      } else {
+        let children = []
+        if (item.wrap && item.setting) {
+          if (item.wrap.datatype === 'public' || item.wrap.datatype === 'static') {
+            item.setting.interType = 'other'
+          }
+        }
 
-  //       } else if (item.precision === 'hour') {
-  //         format = 'YYYY-MM-DD HH'
-  //       } else if (item.precision === 'minute') {
-  //         format = 'YYYY-MM-DD HH:mm'
-  //       } else if (item.precision === 'second') {
-  //         format = 'YYYY-MM-DD HH:mm:ss'
-  //       }
-  //       if (item.initval === 'week') {
-  //         item.initval = [moment().startOf('week').format(format), moment().endOf('week').format(format)].join(',')
-  //       } else if (item.initval === 'month') {
-  //         item.initval = [moment().startOf('month').format(format), moment().endOf('month').format(format)].join(',')
-  //       } else if (item.initval === 'lastMonth') {
-  //         item.initval = [moment().subtract(1, 'months').startOf('month').format(format), moment().subtract(1, 'months').endOf('month').format(format)].join(',')
-  //       } else if (item.initval) {
-  //         try {
-  //           let _initval = JSON.parse(item.initval)
-  //           let _vals = [moment().subtract(_initval[0], 'days').format(format), moment().subtract(_initval[1], 'days').format(format)]
-  //           item.initval = _vals.join(',')
-  //         } catch (e) {
-  //           item.initval = ''
-  //         }
-  //       }
-  //     } else if (item.type === 'group') {
-  //       if (item.initval && item.initval[0]) {
-  //         let _type = item.initval[0]
-  //         let _val = item.initval[1]
-  //         let _dateRange = ''
+        if (appType === 'mob' && item.type !== 'search' && item.type !== 'topbar' && item.search && item.search.length > 0) {
+          item.search = []
+        }
+
+        if (item.subtype === 'tablecard') { // 鍏煎
+          item.type = 'card'
+        }
+
+        if (item.setting && item.setting.interType === 'system') {
+          let sql = this.formatDataSource(item, regs, _mainSearch)
+  
+          children.push({label: '鏁版嵁婧�', sql: sql})
+        } else if (item.setting && item.setting.useMSearch === 'true') {
+          let searches = item.search || []
+          if (_mainSearch.length > 0) {
+            searches = [...searches, ..._mainSearch]
+          }
+          item.$searches = fromJS(searches).toJS()
+        }
+
+        item.action && item.action.forEach(cell => {
+          if (cell.hidden === 'true') return false
+          let sql = this.resetButton(item, cell, process)
+
+          if (sql) {
+            if (typeof(sql) === 'string') {
+              children.push({label: cell.label, sql: sql})
+            } else {
+              children.push({label: cell.label, tabName: cell.label, sql: '', children: sql})
+            }
+          }
+        })
+
+        if (item.type === 'table') {
+          let getCols = (cols) => {
+            cols.forEach(col => {
+              if (col.type === 'action') {
+                col.type = 'custom'
+              }
+              if (col.type === 'colspan') {
+                getCols(col.subcols || [])
+              } else if (col.type === 'custom') {
+                col.elements.forEach(cell => {
+                  if (cell.eleType !== 'button' || cell.hidden === 'true') return
+                  let sql = this.resetButton(item, cell, process)
+
+                  if (sql) {
+                    if (typeof(sql) === 'string') {
+                      children.push({label: cell.label, sql: sql})
+                    } else {
+                      children.push({label: cell.label, tabName: cell.label, sql: '', children: sql})
+                    }
+                  }
+                })
+              }
+            })
+          }
+          
+          getCols(item.cols)
+  
+          if (item.subtype === 'editable' && item.submit.intertype === 'system') {
+            let sql = this.getEditTableSql(item.submit, item.cols, item.columns)
+            children.push({label: '鎻愪氦', sql: sql})
+          }
+        } else if (item.type === 'card' || item.type === 'carousel' || item.type === 'timeline') {
+          item.subcards && item.subcards.forEach(card => {
+            card.elements && card.elements.forEach(cell => {
+              if (cell.eleType !== 'button' || cell.hidden === 'true') return
+              let sql = this.resetButton(item, cell, process)
+
+              if (sql) {
+                if (typeof(sql) === 'string') {
+                  children.push({label: cell.label, sql: sql})
+                } else {
+                  children.push({label: cell.label, tabName: cell.label, sql: '', children: sql})
+                }
+              }
+            })
+  
+            if (!card.backElements || card.backElements.length === 0) return
+  
+            card.backElements.forEach(cell => {
+              if (cell.eleType !== 'button' || cell.hidden === 'true') return
+              let sql = this.resetButton(item, cell, process)
+
+              if (sql) {
+                if (typeof(sql) === 'string') {
+                  children.push({label: cell.label, sql: sql})
+                } else {
+                  children.push({label: cell.label, tabName: cell.label, sql: '', children: sql})
+                }
+              }
+            })
+          })
+        } else if (item.type === 'balcony') {
+          item.elements.forEach(cell => {
+            if (cell.eleType !== 'button' || cell.hidden === 'true') return
+            let sql = this.resetButton(item, cell, process)
+
+            if (sql) {
+              if (typeof(sql) === 'string') {
+                children.push({label: cell.label, sql: sql})
+              } else {
+                children.push({label: cell.label, tabName: cell.label, sql: '', children: sql})
+              }
+            }
+          })
+        } else if (item.type === 'form') {
+          item.subcards.forEach(group => {
+            group.subButton.OpenType = 'formSubmit'
+            if (!group.subButton.Ot) {
+              group.subButton.Ot = item.wrap.datatype === 'static' ? 'notRequired' : 'requiredSgl'
+            }
+            let sql = this.resetButton(item, group.subButton, process, group)
+
+            if (sql) {
+              children.push({label: group.subButton.label, sql: sql})
+            }
+          })
+        }
+
+        if (children.length) {
+          if (ispop) {
+            this.sqlPopList.push({label: item.name, children: children})
+          } else {
+            this.sqlList.push({label: item.name, children: children})
+          }
+        }
+      }
+    })
+  }
+
+  resetButton = (item, cell, process, group) => {
+    let sql = ''
+    if (['exec', 'prompt', 'pop', 'form', 'formSubmit'].includes(cell.OpenType)) {
+      if (cell.intertype === 'system' || cell.procMode === 'system') { // 绯荤粺鎺ュ彛
+        sql = this.getSysDefaultSql(cell, item, process, group)
+      }
+    } else if (cell.OpenType === 'excelIn') {
+      if (cell.intertype === 'system') {
+        sql = this.getExcelInSql(cell)
+      }
+    } else if (cell.OpenType === 'excelOut') {
+      if (cell.intertype === 'system' && cell.verify && cell.verify.dataType === 'custom') {
+        sql = this.getExcelOutSql(cell, item)
+      }
+    } else if (cell.OpenType === 'funcbutton') {
+      if (cell.funcType === 'print') {
+
+      }
+    } else if (cell.OpenType === 'popview') {
+      if (cell.config && cell.config.components) {
+        this.sqlPopList = []
+        let regs = [
+          { reg: /@userName@/ig, value: `'User_Name'` },
+          { reg: /@fullName@/ig, value: `'Full_Name'` },
+          { reg: /\$@/ig, value: '' },
+          { reg: /@\$/ig, value: '' },
+          { reg: /@datam@/ig, value: `''` },
+        ]
+        
+        if (window.GLOB.externalDatabase !== null) {
+          regs.push({
+            reg: /@db@/ig,
+            value: window.GLOB.externalDatabase
+          })
+        }
     
-  //         if (_type === 'day') {
-  //           _dateRange = [moment().subtract(_val, 'days').format('YYYY-MM-DD'),
-  //             moment().subtract(_val, 'days').format('YYYY-MM-DD')]
-  //         } else if (_type === 'week') {
-  //           _dateRange = [moment().subtract(_val * 7, 'days').startOf('week').format('YYYY-MM-DD'),
-  //             moment().subtract(_val * 7, 'days').endOf('week').format('YYYY-MM-DD')]
-  //         } else if (_type === 'month') {
-  //           _dateRange = [moment().subtract(_val, 'month').startOf('month').format('YYYY-MM-DD'),
-  //             moment().subtract(_val, 'month').endOf('month').format('YYYY-MM-DD')]
-  //         } else if (_type === 'quarter') {
-  //           let _differ = parseInt(moment().format('MM')) % 3
-  //           let _pdiffer = 0
-  //           let _ndiffer = 0
-    
-  //           // 宸�艰绠�
-  //           switch(_differ) {
-  //             case 0:
-  //               _pdiffer = 2
-  //               _ndiffer = 0
-  //               break
-  //             case 1:
-  //               _pdiffer = 0
-  //               _ndiffer = -2
-  //               break
-  //             case 2:
-  //               _pdiffer = 1
-  //               _ndiffer = -1
-  //               break
-  //             default:
-  //           }
-  //           _dateRange = [moment().subtract(_pdiffer + _val * 3, 'month').startOf('month').format('YYYY-MM-DD'),
-  //             moment().subtract(_ndiffer + _val * 3, 'month').endOf('month').format('YYYY-MM-DD')]
-  //         } else if (_type === 'year') {
-  //           let _year = parseInt(moment().format('YYYY')) - _val
-  //           _dateRange = [_year + '-01-01', _year + '-12-31']
-  //         } else if (_type === 'customized') {
-  //           try {
-  //             _val = JSON.parse(_val)
-  //           } catch (e) {
-  //             _val = [0, 0]
-  //           }
-  //           _dateRange = [moment().subtract(_val[0], 'days').format('YYYY-MM-DD'),
-  //             moment().subtract(_val[1], 'days').format('YYYY-MM-DD')]
-  //         }
+        if (process) {
+          regs.push({ reg: /@works_flow_code@/ig, value: `'1949-10-01 15:00:00'` })
+        }
+        this.filterComponent(cell.config.components, [], regs, process, true)
 
-  //         item.initval = _dateRange.join(',')
-  //         item.initType = _type
-  //       } else {
-  //         item.initval = ''
-  //         item.initType = ''
-  //       }
-  //     }
+        if (this.sqlPopList.length) {
+          sql = fromJS(this.sqlPopList).toJS()
+        }
+      }
+    }
+
+    return sql
+  }
+
+  getSysDefaultSql = (btn, component, process, group) => {
+    let primaryId = 'id'
+    let BID = 'bid'
+    let verify = btn.verify || {}
+    let _actionType = null
+    let setting = component.setting
+    let columns = component.columns || []
+  
+    if (verify.default !== 'false') { // 鍒ゆ柇鏄惁浣跨敤榛樿sql
+      _actionType = btn.sqlType
+    }
+  
+    let _initCustomScript = '' // 鍒濆鍖栬剼鏈�
+    let _prevCustomScript = '' // 榛樿sql鍓嶆墽琛岃剼鏈�
+    let _backCustomScript = '' // 榛樿sql鍚庢墽琛岃剼鏈�
+  
+    verify.scripts && verify.scripts.forEach(item => {
+      if (item.status === 'false') return
+  
+      if (item.position === 'init') {
+        _initCustomScript += `
+        /* 鑷畾涔夎剼鏈� */
+        ${item.sql}
+        `
+      } else if (item.position === 'front') {
+        _prevCustomScript += `
+        /* 鑷畾涔夎剼鏈� */
+        ${item.sql}
+        `
+      } else {
+        _backCustomScript += `
+        /* 鑷畾涔夎剼鏈� */
+        ${item.sql}
+        `
+      }
+    })
+  
+    // 闇�瑕佸0鏄庣殑鍙橀噺闆�
+    let _vars = ['tbid', 'errorcode', 'retmsg', 'billcode', 'bvoucher', 'fibvoucherdate', 'fiyear', 'username', 'fullname', 'modulardetailcode', 'roleid', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'mk_deleted', 'bid']
+  
+    // 涓婚敭瀛楁
+    let primaryKey = setting.primaryKey || 'id'
+  
+    // sql璇彞
+    let _sql = ''
+  
+    let _initvars = [] // 宸茶祴鍊煎瓧娈甸泦
+    let _initFormfields = []
+    let _initColfields = []
+    let _declarefields = []
+
+    let formdata = null
+    if (btn.OpenType === 'pop') {
+      formdata = []
+      if (btn.modal && btn.modal.fields) {
+        btn.modal.fields.forEach(item => {
+          if (!item.field) return
+          
+          let _item = {
+            key: item.field,
+            fieldlen: item.fieldlength || 50,
+            writein: item.writein !== 'false',
+            type: item.type
+          }
+    
+          if (_item.type === 'datemonth') {
+            _item.type = 'text'
+          } else if (_item.type === 'number' || _item.type === 'rate') {
+            _item.fieldlen = item.decimal || 0
+          } else  if (_item.type === 'date') {
+            _item.type = item.declareType === 'nvarchar(50)' ? 'text' : 'date'
+          }
+    
+          formdata.push(_item)
+        })
+      }
+    } else if (btn.OpenType === 'form') {
+      formdata = []
+
+      let item = {
+        type: 'text',
+        readin: true,
+        writein: true,
+        fieldlen: 50,
+        key: btn.field
+      }
+      if (btn.formType === 'counter') {
+        item.type = 'number'
+        item.fieldlen = 0
+      } else if (btn.formType === 'switch' || btn.formType === 'radio') {
+        if (typeof(btn.openVal) === 'number') {
+          item.type = 'number'
+          item.fieldlen = 0
+        }
+      }
+      formdata.push(item)
+    } else if (btn.OpenType === 'formSubmit') {
+      formdata = []
+      if (group.fields) {
+        group.fields.forEach(item => {
+          if (!item.field) return
+          
+          let _item = {
+            key: item.field,
+            fieldlen: item.fieldlength || 50,
+            writein: item.writein !== 'false',
+            type: item.type
+          }
+    
+          if (_item.type === 'datemonth') {
+            _item.type = 'text'
+          } else if (_item.type === 'number' || _item.type === 'rate') {
+            _item.fieldlen = item.decimal || 0
+          } else  if (_item.type === 'date') {
+            _item.type = item.declareType === 'nvarchar(50)' ? 'text' : 'date'
+          }
+    
+          formdata.push(_item)
+        })
+      }
+    }
+    // 鑾峰彇瀛楁閿�煎
+    formdata && formdata.forEach(form => {
+      let _key = form.key.toLowerCase()
+      if (!_initvars.includes(_key)) {
+        _initvars.push(_key)
+        if (form.type === 'number' || form.type === 'rate') {
+          _initFormfields.push(`@${_key}=1`)
+        } else if (form.type === 'date') {
+          _initFormfields.push(`@${_key}='1949-10-01'`)
+        } else if (form.type === 'select' || form.type === 'link' || form.type === 'radio') {
+          _initFormfields.push(`@${_key}='1'`)
+        } else {
+          _initFormfields.push(`@${_key}='mk'`)
+        }
+      }
       
-  //     item.oriInitval = item.initval
+      if (!_vars.includes(_key)) {
+        _vars.push(_key)
+  
+        if (form.fieldlen && form.fieldlen > 4000) {
+          form.fieldlen = 'max'
+        }
+  
+        let _type = `nvarchar(${form.fieldlen})`
+  
+        if (form.type.match(/date/ig)) {
+          _type = 'datetime'
+        } else if (form.type === 'number') {
+          _type = `decimal(18,${form.fieldlen})`
+        } else if (form.type === 'rate') {
+          _type = `decimal(18,2)`
+        }
+  
+        _declarefields.push(`@${_key} ${_type}`)
+      }
+    })
+  
+    // 娣诲姞鏁版嵁涓瓧娈碉紝琛ㄥ崟鍊间紭鍏�(鎸夐挳涓嶉�夎鎴栧琛屾嫾鎺ユ椂璺宠繃)
+    if (btn.Ot !== 'notRequired' && columns && columns.length > 0) {
+      const setField = (col) => {
+        if (!col.field) return
+        let _key = col.field.toLowerCase()
+  
+        if (!_initvars.includes(_key)) {
+          _initvars.push(_key)
+  
+          if (col.datatype && /^date/ig.test(col.datatype)) {
+            _initColfields.push(`@${_key}='1949-10-01'`)
+          } else if (col.type === 'number') {
+            _initColfields.push(`@${_key}=1`)
+          } else {
+            _initColfields.push(`@${_key}='mk'`)
+          }
+        }
+        
+        if (!_vars.includes(_key)) {
+          _vars.push(_key)
+  
+          if (col.datatype) {
+            _declarefields.push(`@${_key} ${col.datatype}`)
+          } else {
+            if (col.fieldlength && col.fieldlength > 4000) {
+              col.fieldlength = 'max'
+            }
+  
+            let _type = `nvarchar(${col.fieldlength || 50})`
+  
+            if (col.type === 'number') {
+              let _length = col.decimal ? col.decimal : 0
+              _type = `decimal(18,${_length})`
+            } else if (col.type === 'picture' || col.type === 'textarea') {
+              _type = `nvarchar(${col.fieldlength || 512})`
+            }
+  
+            _declarefields.push(`@${_key} ${_type}`)
+          }
+        }
+      }
+  
+      columns.forEach(col => {
+        if (col.type === 'colspan' || col.type === 'old_colspan') {
+          col.subcols.forEach(cell => {
+            setField(cell)
+          })
+        } else {
+          setField(col)
+        }
+      })
+    }
+  
+    // 鍙橀噺澹版槑
+    _declarefields = _declarefields.join(',')
+    if (_declarefields) {
+      _declarefields = ',' + _declarefields
+    }
+    _sql = `Declare @tbid nvarchar(50),@ErrorCode nvarchar(50),@retmsg nvarchar(4000),@BillCode nvarchar(50),@BVoucher nvarchar(50),@FIBVoucherDate nvarchar(50), @FiYear nvarchar(50),@ModularDetailCode nvarchar(50), @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),@mk_deleted int,@bid nvarchar(50)${_declarefields}
+      `
+  
+    let userName = 'User_Name'
+    let fullName = 'Full_Name'
+    let RoleID = 'role_id'
+    let departmentcode = 'departmentcode'
+    let organization = 'organization'
+    let mk_user_type = 'mk_user_type'
+    let nation = 'nation'
+    let province = 'province'
+    let city = 'city'
+    let district = 'district'
+    let address = 'address'
+  
+    // 鍒濆鍖栧嚟璇佸強鐢ㄦ埛淇℃伅瀛楁
+    _sql += `
+        /* 鍑瘉鍙婄敤鎴蜂俊鎭垵濮嬪寲璧嬪�� */
+        select @BVoucher='',@FIBVoucherDate='',@FiYear='',@ErrorCode='',@retmsg='',@UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}', @mk_deleted=1, @bid='${BID}', @BillCode='', @ModularDetailCode=''
+        `
+  
+    // 琛ㄥ崟鍙橀噺璧嬪��
+    if (_initFormfields.length > 0) {
+      _sql += `
+        /* 琛ㄥ崟鍙橀噺璧嬪�� */
+        select ${_initFormfields.join(',')}
+        `
+    }
+    // 鏄剧ず鍒楀彉閲忚祴鍊�
+    if (_initColfields.length > 0) {
+      _sql += `
+        /* 鏄剧ず鍒楀彉閲忚祴鍊� */
+        select ${_initColfields.join(',')}
+        `
+    }
+  
+    // 鍘婚櫎绂佺敤鐨勯獙璇�
+    if (verify.contrasts) {
+      verify.contrasts = verify.contrasts.filter(item => item.status !== 'false')
+    }
+    if (verify.uniques) {
+      verify.uniques = verify.uniques.filter(item => item.status !== 'false')
+    }
+    if (verify.customverifys) {
+      verify.customverifys = verify.customverifys.filter(item => item.status !== 'false')
+    }
+    if (verify.billcodes) {
+      verify.billcodes = verify.billcodes.filter(item => item.status !== 'false')
+    }
+  
+    if (_initCustomScript) {
+      _sql += _initCustomScript
+    }
+  
+    // 鍚敤璐︽湡楠岃瘉
+    if (verify.accountdate === 'true') {
+      let orgcode = `''`
+      let date = `''`
+      if (verify.accountfield && _initvars.includes(verify.accountfield.toLowerCase())) {
+        orgcode = '@' + verify.accountfield
+      }
+      if (verify.voucherdate && _initvars.includes(verify.voucherdate.toLowerCase())) {
+        date = '@' + verify.voucherdate
+      }
+  
+      _sql += `
+        /* 璐︽湡楠岃瘉 */
+        exec s_FIBVoucherDateCheck @OrgCode=${orgcode},@FIBVoucherDate=${date},@ErrorCode=@ErrorCode OUTPUT,@retmsg=@retmsg OUTPUT
+        if @ErrorCode!=''
+          GOTO aaa
+        `
+    }
+  
+    // 澶辨晥楠岃瘉锛屾坊鍔犳暟鎹椂涓嶇敤
+    if (btn.sqlType !== 'insert' && btn.Ot !== 'notRequired' && verify.invalid === 'true' && setting.dataresource) {
+      let datasource = setting.dataresource
+      let customScript = setting.customScript || ''
+      let orderBy = setting.order
 
-  //     if (values) {
-  //       item.initval = values[item.field] || ''
-  //     }
+      if (setting.queryType === 'statistics' || customScript) {
+        let searches = formatSearch(component.$searches || [])
+        let regoptions = getSearchRegs(searches)
+  
+        regoptions.push({
+          reg: new RegExp('@userName@', 'ig'),
+          value: `'${userName}'`
+        }, {
+          reg: new RegExp('@fullName@', 'ig'),
+          value: `'${fullName}'`
+        }, {
+          reg: new RegExp('@orderBy@', 'ig'),
+          value: orderBy
+        }, {
+          reg: new RegExp('@pageSize@', 'ig'),
+          value: 999999
+        }, {
+          reg: new RegExp('@pageIndex@', 'ig'),
+          value: 1
+        })
+  
+        regoptions.forEach(item => {
+          datasource = datasource.replace(item.reg, item.value)
+          customScript = customScript.replace(item.reg, item.value)
+        })
+      }
+  
+      if (customScript) {
+        _sql += `
+        /* 鏁版嵁婧愯嚜瀹氫箟鑴氭湰锛岃娉ㄦ剰鍙橀噺瀹氫箟鏄惁閲嶅 */
+        ${customScript}
+        `
+      }
+  
+      if (btn.Ot === 'requiredOnce') {
+        _sql += `
+        /* 澶辨晥楠岃瘉 */
+        select @tbid='', @ErrorCode='',@retmsg=''
+        select @tbid='X' from ${datasource} right join (select ID from  dbo.SplitComma(@ID@)) sp
+        on tb.${primaryKey} =sp.id where tb.${primaryKey} is null
+  
+        If @tbid!=''
+        Begin
+          select @ErrorCode='E',@retmsg='鏁版嵁宸插け鏁�'
+          goto aaa
+        end
+        `
+      } else {
+        _sql += `
+        /* 澶辨晥楠岃瘉 */
+        select @tbid='', @ErrorCode='',@retmsg=''
+        select @tbid=${primaryKey} from ${datasource} where ${primaryKey}=@ID@
+        If @tbid=''
+        Begin
+          select @ErrorCode='E',@retmsg='鏁版嵁宸插け鏁�'
+          goto aaa
+        end
+        `
+      }
+    }
+  
+    // 姣旇緝楠岃瘉
+    if (verify.contrasts && verify.contrasts.length > 0) {
+      verify.contrasts.forEach(item => {
+        _sql += `
+        /* 姣旇緝楠岃瘉 */
+        If ${item.frontfield} ${item.operator} ${item.backfield}
+        Begin
+          select @ErrorCode='${item.errorCode}',@retmsg='${item.errmsg}'
+            goto aaa
+        end
+        `
+      })
+    }
+    
+    // 鑷畾涔夐獙璇�
+    verify.customverifys && verify.customverifys.forEach(item => {        
+      _sql += `
+        /* 鑷畾涔夐獙璇� */
+        select @tbid='', @ErrorCode='',@retmsg=''
+        select top 1 @tbid='X' from (${item.sql}) a
+        If @tbid ${item.result === 'true' ? '!=' : '='}''
+        Begin
+          select @ErrorCode='${item.errorCode}',@retmsg='${item.errmsg}'
+          goto aaa
+        end
+        `
+    })
+  
+    // 鍗曞彿鐢熸垚锛屼娇鐢ㄤ笂绾d锛圔ID锛夋垨鍒楄〃鏁版嵁锛屽0鏄庡彉閲忥紙妫�楠岋級
+    let _billcodesSql  = ''
+    if (formdata && verify.billcodes && verify.billcodes.length > 0) {
+      let keys = formdata.map(item => item.key.toLowerCase()) // 琛ㄥ崟瀛楁
+  
+      verify.billcodes.forEach(item => {
+        let _key = item.field.toLowerCase()
+        let _linkKey = item.linkField ? item.linkField.toLowerCase() : ''
+  
+        if (!keys.includes(_key)) return // 琛ㄥ崟涓笉鍚崟鍙风敓鎴愬瓧娈�
+  
+        let _ModularDetailCode = ''
+        let _lpline = ''
+        if (item.TypeCharOne === 'Lp') {
+          if (_linkKey === 'bid' && BID) { // 鏇挎崲bid
+            _lpline = `set @ModularDetailCode= 'Lp'+ right('${item.mark || btn.uuid}'+@BID@,48)`
+          } else {
+            _lpline = `set @ModularDetailCode= 'Lp'+ right('${item.mark || btn.uuid}'+@${_linkKey},48)`
+          }
+          _ModularDetailCode = '@ModularDetailCode'
+        } else if (item.TypeCharOne === 'BN') {
+          let _val = ''
+          if (_linkKey === 'bid' && BID) { // 鏇挎崲bid
+            _val = BID
+          } else {
+            _val = 0
+          }
+          _ModularDetailCode = `'${item.TypeCharOne + _val}'`
+        } else {
+          _ModularDetailCode = `'${item.ModularDetailCode}'`
+        }
+  
+        let _declare = ''
+  
+        if (!_vars.includes(_key)) {
+          _declare = `Declare @${_key} nvarchar(50)`
+          _vars.push(_key)
+        }
+  
+        _billcodesSql += `
+        /* 鍗曞彿鐢熸垚 */
+        ${_declare}
+        select @BillCode='', @${_key}='', @ModularDetailCode=''
+        ${_lpline}
+        exec s_get_BillCode
+          @ModularDetailCode=${_ModularDetailCode},
+          @Type=${item.Type},
+          @TypeCharOne='${item.TypeCharOne}',
+          @TypeCharTwo ='${item.TypeCharTwo}',
+          @BillCode =@BillCode output,
+          @ErrorCode =@ErrorCode output, 
+          @retmsg=@retmsg output
+        if @ErrorCode!=''
+          goto aaa
+        set @${_key}=@BillCode
+        `
+      })
+  
+      if (_actionType !== 'insertOrUpdate') {
+        _sql += _billcodesSql
+      }
+    }
+  
+    // 鍞竴鎬ч獙璇侊紝蹇呴』瀛樺湪琛ㄥ崟锛堣〃鍗曞瓨鍦ㄦ椂锛屼富閿潎涓哄崟鍊硷級,蹇呴』濉啓鏁版嵁婧愶紝澶氳鎷兼帴鏃朵笉鍙敤
+    if (formdata && verify.uniques && verify.uniques.length > 0 && btn.Ot !== 'requiredOnce') {
+      verify.uniques.forEach(item => {
+        let _fieldValue = []                     // 琛ㄥ崟閿�煎field=value
+        let _value = []                          // 琛ㄥ崟鍊硷紝鐢ㄤ簬閿欒鎻愮ず
+        let _labels = item.fieldlabel.split(',') // 琛ㄥ崟鎻愮ず鏂囧瓧
+        let arr = [] // 楠岃瘉涓婚敭
+  
+        item.field.split(',').forEach((_field, index) => {
+          let _key = _field.toLowerCase()
+          let _val = ''
+          let _fval = `'${_val}'`
+  
+          if (_key === 'bid') { // 琛ㄥ崟涓病鏈塨id鍒欎娇鐢ㄧ郴缁焍id鍙橀噺
+            _fval = '@BID@'
+          }
 
-  //     if (item.blacklist && item.blacklist.length > 0 && !item.hidden) {
-  //       if (item.blacklist.filter(v => roleId.indexOf(v) > -1).length > 0) {
-  //         item.hidden = true
-  //         item.required = false
-  //       }
-  //     }
+          arr.push(_key)
+          _fieldValue.push(`${_key}=${_fval}`)
+          
+          _value.push(`${_labels[index] || ''}锛�${_val || ''}`)
+        })
+  
+        let _verifyType = ''
+        if (item.verifyType === 'logic') {
+          _verifyType = ' and deleted=0'
+        }
+  
+        if (!arr.includes(primaryKey.toLowerCase())) {
+          _fieldValue.push(`${primaryKey} !='${primaryId}'`)
+        }
+  
+        _sql += `
+        /* 鍞竴鎬ч獙璇� */
+        select @tbid='', @ErrorCode='',@retmsg=''
+        select @tbid='X' from ${btn.sql} where ${_fieldValue.join(' and ')}${_verifyType}
+        If @tbid!=''
+        Begin
+          select @ErrorCode='${item.errorCode}',@retmsg='${_value.join(', ')} 宸插瓨鍦�'
+          goto aaa
+        end
+        `
+      })
+    } else if (verify.uniques && verify.uniques.length > 0 && btn.Ot === 'requiredOnce' && setting.dataresource) {
+      let datasource = setting.dataresource
+      if (/\s/.test(datasource)) { // 鎷兼帴鍒悕
+        if (!/tb$/.test(datasource)) {
+          datasource = '(' + datasource + ') tb'
+        }
+      } else {
+        datasource = datasource + ' tb'
+      }
+  
+      if (setting.customScript) {
+        _sql += `
+        /* 鏁版嵁婧愯嚜瀹氫箟鑴氭湰锛岃娉ㄦ剰鍙橀噺瀹氫箟鏄惁閲嶅 */
+        ${setting.customScript}
+        `
+      }
+  
+      verify.uniques.forEach(item => {
+        _sql += `
+        /* 鍚岀被鏁版嵁楠岃瘉 */
+        Set @tbid=''
+  
+        Select top 1 @tbid='X' from (select distinct ${item.field},1 as n from ${datasource} inner join (select ID from  dbo.SplitComma(@ID@)) sp on tb.${primaryKey}=sp.ID ) a having sum(n)>1
+        
+        If @tbid!=''
+        Begin
+          Set @ErrorCode='E' Set @retmsg='${item.fieldlabel} 鍊间笉鍞竴'
+          goto aaa
+        end
+        `
+      })
+    }
+  
+    let hasvoucher = false
+  
+    // 鍑瘉-鏄剧ず鍒椾腑閫夊彇,蹇呴』閫夎
+    if (verify.voucher && verify.voucher.enabled && btn.Ot !== 'requiredOnce') {
+      let _voucher = verify.voucher
+  
+      hasvoucher = true
+  
+      _sql += `
+        /* 鍒涘缓鍑瘉 */
+        exec s_BVoucher_Create
+          @Bill ='0',
+          @BVoucherType ='${_voucher.BVoucherType}',
+          @VoucherTypeOne ='${_voucher.VoucherTypeOne}',
+          @VoucherTypeTwo ='${_voucher.VoucherTypeTwo}',
+          @Type =${_voucher.Type},
+          @UserID=@UserID@,
+          @Username=@Username,
+          @FullName=@FullName,
+          @BVoucher =@BVoucher OUTPUT ,
+          @FIBVoucherDate =@FIBVoucherDate OUTPUT ,
+          @FiYear =@FiYear OUTPUT ,
+          @ErrorCode =@ErrorCode OUTPUT, 
+          @retmsg=@retmsg OUTPUT
+        if @ErrorCode!=''
+          GOTO aaa
+        `
+    }
+  
+    let _insertsql = ''
+    if (_actionType === 'insert' || _actionType === 'insertOrUpdate') { // 娣诲姞璇彞
+      let keys = []
+      let values = []
+  
+      formdata.forEach(item => {
+        if (item.writein === false) return
+        let _key = item.key.toLowerCase()
+  
+        keys.push(_key)
+        values.push('@' + _key)
+      })
+  
+      if (!keys.includes(primaryKey.toLowerCase())) {
+        keys.push(primaryKey.toLowerCase())
+        values.push('\'' + primaryId + '\'')
+      }
+      if (!keys.includes('createuserid')) {
+        keys.push('createuserid')
+        values.push('@userid@')
+      }
+      if (!keys.includes('createuser')) {
+        keys.push('createuser')
+        values.push('@username')
+      }
+      if (!keys.includes('createstaff')) {
+        keys.push('createstaff')
+        values.push('@fullname')
+      }
+      if (!keys.includes('bid')) {
+        keys.push('bid')
+        values.push('@BID@')
+      }
+  
+      if (!keys.includes('typename')) {
+        keys.push('typename')
+        values.push('@typename@')
+      }
+  
+      keys = keys.join(',')
+      values = values.join(',')
+      _insertsql = `insert into ${btn.sql} (${keys}) select ${values};`
+    }
+  
+    let _updatesql = ''
+    if (_actionType === 'update' || _actionType === 'audit' || _actionType === 'insertOrUpdate') { // 淇敼璇彞
+      let _form = []
+      let _arr = []
+  
+      formdata.forEach(item => {
+        if (item.writein === false) return
+        let _key = item.key.toLowerCase()
+        
+        _arr.push(_key)
+        _form.push(_key + '=@' + _key)
+      })
+  
+      if (_actionType === 'audit') {
+        if (!_arr.includes('submitdate')) {
+          _form.push('submitdate=getdate()')
+        }
+        if (!_arr.includes('submituser')) {
+          _form.push('submituser=@username')
+        }
+        if (!_arr.includes('submitstaff')) {
+          _form.push('submitstaff=@fullname')
+        }
+        if (!_arr.includes('submituserid')) {
+          _form.push('submituserid=@userid@')
+        }
+      } else {
+        if (!_arr.includes('modifydate')) {
+          _form.push('modifydate=getdate()')
+        }
+        if (!_arr.includes('modifyuser')) {
+          _form.push('modifyuser=@username')
+        }
+        if (!_arr.includes('modifystaff')) {
+          _form.push('modifystaff=@fullname')
+        }
+        if (!_arr.includes('modifyuserid')) {
+          _form.push('modifyuserid=@userid@')
+        }
+      }
+      
+      if (hasvoucher) {
+        if (!_arr.includes('bvoucher')) {
+          _form.push('BVoucher=@BVoucher')
+        }
+        if (!_arr.includes('fibvoucherdate')) {
+          _form.push('FIBVoucherDate=@FIBVoucherDate')
+        }
+        if (!_arr.includes('fiyear')) {
+          _form.push('FiYear=@FiYear')
+        }
+      }
+      if (!_arr.includes('typename')) {
+        _form.push('typename=@typename@')
+      }
+      _form = _form.join(',')
+  
+      let _ID = '=@ID@'
+      if (btn.Ot === 'requiredOnce') {
+        _ID = ' in (select ID from  dbo.SplitComma(@ID@))'
+      }
+  
+      _updatesql = `update ${btn.sql} set ${_form} where ${primaryKey}${_ID};`
+    }
+  
+    if (_prevCustomScript) {
+      _sql += _prevCustomScript
+    }
+  
+    // 娣诲姞銆佷慨鏀广�侀�昏緫鍒犻櫎銆佺墿鐞嗗垹闄�
+    if (_actionType === 'insert') {
+      _sql += `
+        /* 榛樿sql */
+        ${_insertsql}`
+    } else if (_actionType === 'update' || _actionType === 'audit') {
+      _sql += `
+        /* 榛樿sql */
+        ${_updatesql}`
+    } else if (_actionType === 'LogicDelete') { // 閫昏緫鍒犻櫎
+      let _ID = '=@ID@'
+      if (btn.Ot === 'requiredOnce') {
+        _ID = ' in (select ID from  dbo.SplitComma(@ID@))'
+      }
+  
+      _sql += `
+        /* 榛樿sql */
+        update ${btn.sql} set deleted=@mk_deleted,modifydate=getdate(),modifyuser=@username,modifystaff=@fullname,modifyuserid=@userid@ where ${primaryKey}${_ID};`
+    
+    } else if (_actionType === 'delete') {      // 鐗╃悊鍒犻櫎
+      let _msg = ''
+      if (columns && columns.length > 0 && btn.Ot !== 'notRequired') {
+        let _index = 0
+        columns.forEach(col => {
+          if (!col.field || col.Hide === 'true' || _index >= 4) return
+          _msg += col.label + '=0,'
+          _index++
+        })
+      }
+  
+      let _ID = '=@ID@'
+      if (btn.Ot === 'requiredOnce') {
+        _ID = ' in (select ID from  dbo.SplitComma(@ID@))'
+      }
+  
+      _sql += `
+        /* 榛樿sql */
+        insert into snote (remark,createuserid,CreateUser,CreateStaff,typename) select left('鍒犻櫎琛�:${btn.sql} 鏁版嵁: ${_msg}${primaryKey}='+@ID@,200),@userid@,@username,@fullname,@typename@
+        delete ${btn.sql} where ${primaryKey}${_ID};`
+    } else if (_actionType === 'insertOrUpdate') {
+      _sql += `
+        /* 榛樿sql */
+        select @tbid=''
+        select @tbid='X' from ${btn.sql} where ${primaryKey}=@ID@
+        if @tbid=''
+          begin
+          ${_billcodesSql}
+          ${_insertsql}
+          end
+        else
+          begin
+          ${_updatesql}
+          end
+      `
+    }
+  
+    if (verify.workFlow === 'true' && process) {
+      let status = 888
+      let statusName = '缁撴潫'
+      let detailId = '0'
+  
+      if (verify.flowSql === 'true') {
+        _sql += `
+        /* 宸ヤ綔娴侀粯璁ql */
+        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 @ID@,@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@
+        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,upid)
+        select @ID@,@works_flow_code@,@works_flow_name@ ,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@,@time_id@
+        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 @ID@,@works_flow_code@,@works_flow_detail_id@,@userid@,@start_type@,@userid@,@UserName,@FullName,@time_id@
+        `
+      }
+  
+      _sql = _sql.replace(/@start_type@/ig, `'寮�濮�'`)
+      _sql = _sql.replace(/@check_type@/ig, `'瀹℃牳'`)
+      _sql = _sql.replace(/@notice_type@/ig, `'鎶勯��'`)
+      _sql = _sql.replace(/@check_userids@/ig, `''`)
+      _sql = _sql.replace(/@notice_userids@/ig, `''`)
+      _sql = _sql.replace(/@works_flow_code@/ig, `'mk'`)
+      _sql = _sql.replace(/@works_flow_name@/ig, `'mk'`)
+      _sql = _sql.replace(/@works_flow_param@/ig, `''`)
+      _sql = _sql.replace(/@works_flow_detail_id@/ig, `'${detailId}'`)
+      _sql = _sql.replace(/@status@/ig, `'${status}'`)
+      _sql = _sql.replace(/@statusname@/ig, `'${statusName}'`)
+      _sql = _sql.replace(/@work_group@/ig, `'mk'`)
+      _sql = _sql.replace(/@work_grade@/ig, `'0'`)
+    }
+  
+    if (_backCustomScript) {
+      _sql += _backCustomScript
+    }
+  
+    if (btn.procMode === 'system') {
+      _sql += `
+        aaa: if @ErrorCode!=''
+        insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@`
+    } else if (btn.output) {
+      _sql += `
+        aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg,${btn.output} as mk_b_id`
+    } else {
+      _sql += `
+        aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
+    }
+  
+    _sql = _sql.replace(/@ID@/ig, `'${primaryId || ''}'`)
+    _sql = _sql.replace(/@BID@/ig, `'${BID}'`)
+    _sql = _sql.replace(/@LoginUID@/ig, `'LoginUID'`)
+    _sql = _sql.replace(/@SessionUid@/ig, `'SessionUid'`)
+    _sql = _sql.replace(/@UserID@/ig, `'UserID'`)
+    _sql = _sql.replace(/@Appkey@/ig, `'appkey'`)
+    _sql = _sql.replace(/@typename@/ig, `'typename'`)
+    _sql = _sql.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, `''`)
+  
+    return _sql
+  }
 
-  //     if (item.required) {
-  //       required = true
-  //     }
+  getExcelInSql = (item) => {
+    let btn = item.verify
+    let userName = 'User_Name'
+    let fullName = 'Full_Name'
+    let RoleID = 'role_id'
+    let departmentcode = 'departmentcode'
+    let organization = 'organization'
+    let mk_user_type = 'mk_user_type'
+    let nation = 'nation'
+    let province = 'province'
+    let city = 'city'
+    let district = 'district'
+    let address = 'address'
+    let _sheet = item.sheet
+  
+    if (window.GLOB.externalDatabase !== null) {
+      _sheet = _sheet.replace(/@db@/ig, window.GLOB.externalDatabase)
+    }
+  
+    let database = _sheet.match(/(.*)\.(.*)\./ig)
+    let sheet = _sheet.replace(/(.*)\.(.*)\./ig, '')
+    
+    database = database ? (database[0] || '') : ''
+  
+    let getuuid = () => {
+      let uuid = []
+      let timestamp = new Date().getTime()
+      let _options = '0123456789abcdefghigklmnopqrstuv'
+      for (let i = 0; i < 19; i++) {
+        uuid.push(_options.substr(Math.floor(Math.random() * 0x20), 1))
+      }
+      uuid = timestamp + uuid.join('')
+      return uuid
+    }
 
-  //     if (item.type === 'text' || item.type === 'select') {
-  //       if (/,/.test(item.field)) {
-  //         item.field.split(',').forEach(field => {
-  //           keys.push(field.toLowerCase())
-  //         })
-  //       } else {
-  //         keys.push(item.field.toLowerCase())
-  //       }
-  //     } else if (item.type === 'group') {
-  //       keys.push(item.field.toLowerCase())
-  //       keys.push(item.datefield.toLowerCase())
-  //     }
+    let upId = getuuid()
+  
+    let vals = []
+    btn.columns.forEach(col => {
+      if (col.import === 'false') return
 
-  //     return item
-  //   })
+      let val = ''
+      if (col.import === 'init') {
+        if (/^Nvarchar/ig.test(col.type)) {
+          val = ''
+        } else if (/^Decimal/ig.test(col.type) || /^int/ig.test(col.type)) {
+          val = 0
+        } else if (col.type === 'date') {
+          val = '1949-10-01'
+        } else if (col.type === 'datetime') {
+          val = '1949-10-01 00:00:00'
+        }
+      } else if (/^Nvarchar/ig.test(col.type)) {
+        val = 'mk'
+      } else if (/^Decimal/ig.test(col.type) || /^int/ig.test(col.type)) {
+        val = 1
+      } else if (col.type === 'date') {
+        val = '1949-10-01'
+      } else if (col.type === 'datetime') {
+        val = '1949-10-01 00:00:00'
+      }
 
-  //   config.$s_keys = keys
-  //   config.$s_req = required
-  // }
+      vals.push(`'${val}'`)
+    })
 
+    vals.push(`'${upId}000010'`)
+    vals.push(`'bid'`)
+
+    vals =  `Select ${vals.join(',')}`
+  
+    let sql = ''
+    
+    let _initCustomScript = '' // 鍒濆鍖栬剼鏈�
+    let _prevCustomScript = '' // 榛樿sql鍓嶆墽琛岃剼鏈�
+    let _backCustomScript = '' // 榛樿sql鍚庢墽琛岃剼鏈�
+    let regs = [
+      {reg: new RegExp('(^|\\s)@' + sheet + '(\\s|$)', 'ig'), value: ` #${sheet} `},
+      {reg: new RegExp('(^|\\s)@' + sheet + '\\(', 'ig'), value: ` #${sheet}(`},
+      {reg: new RegExp('(^|\\s)@' + sheet + '\\)', 'ig'), value: ` #${sheet})`},
+      {reg: /@ID@/ig, value: `'id'`},
+      {reg: /@BID@/ig, value: `'bid'`},
+      {reg: /@LoginUID@/ig, value: `'LoginUID'`},
+      {reg: /@SessionUid@/ig, value: `'SessionUid'`},
+      {reg: /@UserID@/ig, value: `'UserID'`},
+      {reg: /@Appkey@/ig, value: `'appkey'`},
+      {reg: /@typename@/ig, value: `'admin'`},
+      {reg: /\$@/ig, value: ''},
+      {reg: /@\$/ig, value: ''},
+      {reg: /@datam@/ig, value: `''`},
+    ]
+
+    if (window.GLOB.externalDatabase !== null) {
+      regs.push({reg: /@db@/ig, value: window.GLOB.externalDatabase})
+    }
+
+    btn.scripts && btn.scripts.forEach(script => {
+      if (script.status === 'false') return
+
+      let _sql = script.sql
+
+      regs.forEach(item => {
+        _sql = _sql.replace(item.reg, item.value)
+      })
+
+      if (script.position === 'init') {
+        _initCustomScript += `
+      /* 鑷畾涔夎剼鏈� */
+      ${_sql}
+      `
+      } else if (script.position === 'front') {
+        _prevCustomScript += `
+      /* 鑷畾涔夎剼鏈� */
+      ${_sql}
+      `
+      } else {
+        _backCustomScript += `
+      /* 鑷畾涔夎剼鏈� */
+      ${_sql}
+      `
+      }
+    })
+
+    let _uniquesql = ''
+    if (btn.uniques && btn.uniques.length > 0) {
+      btn.uniques.forEach(unique => {
+        if (unique.status === 'false' || !unique.verifyType) return
+
+        let _fields = unique.field.split(',')
+        let _fields_ = _fields.map(_field => `a.${_field}=b.${_field}`)
+        let _afields = _fields.map(_field => `a.${_field}`)
+        _fields_ = _fields_.join(' and ')
+
+        if (unique.verifyType === 'logic' || unique.verifyType === 'logic_temp') {
+          _fields_ += ' and b.deleted=0'
+        }
+
+        _uniquesql += `
+      /* 閲嶅鎬ч獙璇� */
+      Set @tbid=''
+      Select top 1 @tbid=${_fields.join('+\' \'+')} from (select 1 as n,${unique.field} from #${sheet} ) a group by ${unique.field} having sum(n)>1
+      
+      If @tbid!=''
+      Begin
+        select @ErrorCode='${unique.errorCode}',@retmsg=@tbid+' 閲嶅'
+        goto aaa
+      end
+      
+      ${unique.verifyType.indexOf('temp') === -1 ? `Set @tbid=''
+      Select top 1 @tbid=${_afields.join('+\' \'+')} from  #${sheet} a Inner join ${sheet} b on ${_fields_}
+      
+      If @tbid!=''
+      Begin
+        select @ErrorCode='${unique.errorCode}',@retmsg=@tbid+' 涓庡凡鏈夋暟鎹噸澶�'
+        goto aaa
+      end` : ''}
+      `
+      })
+    }
+
+    let declarefields = []
+    let fields = []
+
+    btn.columns.forEach(col => {
+      if (col.import === 'false') return
+      
+      if (col.type === 'date') {
+        declarefields.push(`${col.Column} Nvarchar(50)`)
+      } else {
+        declarefields.push(`${col.Column} ${col.type}`)
+      }
+      fields.push(col.Column)
+    })
+
+    fields = fields.join(',')
+
+    let _insert = ''
+    if (btn.default !== 'false') {
+      _insert = `
+      /* 榛樿sql */
+      Insert into ${database}${sheet} (${fields},createuserid,createuser,createstaff,bid) 
+      Select ${fields},'${sessionStorage.getItem('UserID') || ''}',@username,@fullname,'bid' From #${sheet}
+      `
+    }
+
+    sql = `create table #${sheet} (${declarefields.join(',')},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='', @UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}'
+      ${_initCustomScript}
+      
+      Insert into #${sheet} (${fields},jskey,BID)
+
+      /* excel鏁版嵁*/
+      ${vals}
+
+      ${_uniquesql}
+      ${_prevCustomScript}
+      ${_insert}
+      ${_backCustomScript}
+
+      drop table #${sheet}
+      
+      aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
+
+    return sql
+  }
+
+  getEditTableSql = (verify, cols, columns) => {
+    let btn = verify
+    let userName = sessionStorage.getItem('User_Name') || ''
+    let fullName = sessionStorage.getItem('Full_Name') || ''
+    let RoleID = sessionStorage.getItem('role_id') || ''
+    let departmentcode = sessionStorage.getItem('departmentcode') || ''
+    let organization = sessionStorage.getItem('organization') || ''
+    let mk_user_type = sessionStorage.getItem('mk_user_type') || ''
+    let nation = sessionStorage.getItem('nation') || ''
+    let province = sessionStorage.getItem('province') || ''
+    let city = sessionStorage.getItem('city') || ''
+    let district = sessionStorage.getItem('district') || ''
+    let address = sessionStorage.getItem('address') || ''
+  
+    let _sheet = btn.sheet
+    let BID = 'bid'
+  
+    if (window.GLOB.externalDatabase !== null) {
+      _sheet = _sheet.replace(/@db@/ig, window.GLOB.externalDatabase)
+    }
+  
+    let database = _sheet.match(/(.*)\.(.*)\./ig)
+    let sheet = _sheet.replace(/(.*)\.(.*)\./ig, '')
+    
+    database = database ? (database[0] || '') : ''
+  
+    let vals = []
+    let forms = []
+    let _fields = {}
+
+    columns.forEach(col => {
+      _fields[col.field] = col.datatype
+    })
+
+    let getColumns = (cols) => {
+      cols.forEach(item => {
+        if (item.type === 'colspan') {
+          getColumns(item.subcols)
+        } else if (item.editable === 'true') {
+          forms.push({
+            field: item.field,
+            type: item.type,
+            datatype: _fields[item.field] || 'nvarchar(50)'
+          })
+        }
+      })
+    }
+
+    getColumns(cols)
+
+    forms.forEach(col => {
+      if (col.type === 'number') {
+        vals.push(`1`)
+      } else {
+        vals.push(`'mk'`)
+      }
+    })
+
+    vals.push(`'uuid'`)
+    vals.push(`'upt'`)
+    vals.push(`'${BID}'`)
+
+    vals = `Select ${vals.join(',')}`
+  
+    let sql = ''
+  
+    let _initCustomScript = '' // 鍒濆鍖栬剼鏈�
+    let _prevCustomScript = '' // 榛樿sql鍓嶆墽琛岃剼鏈�
+    let _backCustomScript = '' // 榛樿sql鍚庢墽琛岃剼鏈�
+    let isDM = sessionStorage.getItem('dataM') === 'true'
+    let regs = [
+      {reg: new RegExp('(^|\\s)@' + sheet + '(\\s|$)', 'ig'), value: ` #${sheet} `},
+      {reg: new RegExp('(^|\\s)@' + sheet + '\\(', 'ig'), value: ` #${sheet}(`},
+      {reg: new RegExp('(^|\\s)@' + sheet + '\\)', 'ig'), value: ` #${sheet})`},
+      {reg: /@BID@/ig, value: `'${BID}'`},
+      {reg: /@LoginUID@/ig, value: `'${sessionStorage.getItem('LoginUID') || ''}'`},
+      {reg: /@SessionUid@/ig, value: `'${localStorage.getItem('SessionUid') || ''}'`},
+      {reg: /@UserID@/ig, value: `'${sessionStorage.getItem('UserID') || ''}'`},
+      {reg: /@Appkey@/ig, value: `'${window.GLOB.appkey || ''}'`},
+      {reg: /@typename@/ig, value: `'admin'`},
+      {reg: /\$@/ig, value: isDM ? '/*' : ''},
+      {reg: /@\$/ig, value: isDM ? '*/' : ''},
+      {reg: /@datam@/ig, value: isDM ? `'Y'` : `''`},
+    ]
+
+    if (window.GLOB.externalDatabase !== null) {
+      regs.push({reg: /@db@/ig, value: window.GLOB.externalDatabase})
+    }
+
+    btn.scripts && btn.scripts.forEach(script => {
+      if (script.status === 'false') return
+
+      let _sql = script.sql
+
+      regs.forEach(item => {
+        _sql = _sql.replace(item.reg, item.value)
+      })
+
+      if (script.position === 'init') {
+        _initCustomScript += `
+      /* 鑷畾涔夎剼鏈� */
+      ${_sql}
+      `
+      } else if (script.position === 'front') {
+        _prevCustomScript += `
+      /* 鑷畾涔夎剼鏈� */
+      ${_sql}
+      `
+      } else {
+        _backCustomScript += `
+      /* 鑷畾涔夎剼鏈� */
+      ${_sql}
+      `
+      }
+    })
+
+    let _uniquesql = ''
+    if (btn.uniques && btn.uniques.length > 0) {
+      btn.uniques.forEach(unique => {
+        if (unique.status === 'false' || !unique.verifyType) return
+
+        let _fields = unique.field.split(',')
+        let _fields_ = _fields.map(_field => `a.${_field}=b.${_field}`)
+        let _afields = _fields.map(_field => `a.${_field}`)
+        _fields_ = _fields_.join(' and ')
+
+        if (unique.verifyType === 'logic' || unique.verifyType === 'logic_temp') {
+          _fields_ += ' and b.deleted=0'
+        }
+
+        _uniquesql += `
+      /* 閲嶅鎬ч獙璇� */
+      Set @tbid=''
+      Select top 1 @tbid=${_fields.join('+\' \'+')} from (select 1 as n,${unique.field} from #${sheet} ) a group by ${unique.field} having sum(n)>1
+      
+      If @tbid!=''
+      Begin
+        select @ErrorCode='${unique.errorCode}',@retmsg=@tbid+' 閲嶅'
+        goto aaa
+      end
+      
+      ${unique.verifyType.indexOf('temp') === -1 ? `Set @tbid=''
+      Select top 1 @tbid=${_afields.join('+\' \'+')} from  #${sheet} a Inner join ${sheet} b on ${_fields_}
+      
+      If @tbid!=''
+      Begin
+        select @ErrorCode='${unique.errorCode}',@retmsg=@tbid+' 涓庡凡鏈夋暟鎹噸澶�'
+        goto aaa
+      end` : ''}
+      `
+      })
+    }
+
+    let declarefields = []
+    let fields = []
+
+    forms.forEach(col => {
+      let key = col.field.toLowerCase()
+      if (key === 'jskey' || key === 'bid' || key === 'data_type') return
+
+      declarefields.push(`${col.field} ${col.datatype}`)
+      fields.push(col.field)
+    })
+
+    fields = fields.join(',')
+
+    let _insert = ''
+    if (btn.default !== 'false') {
+      _insert = `
+      /* 榛樿sql */
+      Insert into ${database}${sheet} (${fields},createuserid,createuser,createstaff,bid) 
+      Select ${fields},'${sessionStorage.getItem('UserID') || ''}',@username,@fullname,'${BID}' From #${sheet}
+      `
+    }
+
+    sql = `create table #${sheet} (${declarefields.join(',')},jskey nvarchar(50),data_type 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='', @UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}'
+      ${_initCustomScript}
+      Insert into #${sheet} (${fields},jskey,data_type,BID)
+
+      /* excel鏁版嵁*/
+      ${vals}
+
+      ${_uniquesql}
+      ${_prevCustomScript}
+      ${_insert}
+      ${_backCustomScript}
+
+      drop table #${sheet}
+      
+      aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
+  
+    return sql
+  }
+
+  getExcelOutSql = (btn, component) => {
+    let item = {setting: {}, columns: [], search: []}
+
+    btn.verify.columns.forEach(col => {
+      if (col.Column && col.Column !== '$Index') {
+        item.columns.push({
+          field: col.Column
+        })
+      }
+    })
+
+    if (btn.verify.useSearch !== 'false') {
+      item.search = component.$searches
+    }
+
+    item.setting.interType = 'system'
+    item.setting.execute = btn.verify.defaultSql || 'true'
+    item.setting.dataresource = btn.verify.dataresource || ''
+    item.setting.primaryKey = btn.verify.primaryKey || component.setting.primaryKey || 'ID'
+    item.setting.queryType = btn.verify.queryType
+    item.setting.laypage = btn.pagination
+    item.setting.order = btn.verify.order || ''
+
+    item.scripts = btn.verify.scripts || []
+
+    let regs = [
+      { reg: /\$@/ig, value: '' },
+      { reg: /@\$/ig, value: '' },
+      { reg: /@datam@/ig, value: `''` },
+    ]
+    
+    if (window.GLOB.externalDatabase !== null) {
+      regs.push({
+        reg: /@db@/ig,
+        value: window.GLOB.externalDatabase
+      })
+    }
+
+    let sql = this.formatDataSource(item, regs)
+
+    return sql
+  }
+
+  formatDataSource = (item, regs, mainSearch = []) => {
+    if (!item.setting || item.setting.interType !== 'system') return false
+    
+    let searches = item.search || []
+    if (item.setting.useMSearch === 'true' && mainSearch.length > 0) {
+      searches = [...searches, ...mainSearch]
+    }
+    item.$searches = fromJS(searches).toJS()
+    searches = formatSearch(searches)
+
+    let _columns = item.columns || []
+    if (item.subtype === 'dualdatacard') {
+      _columns = [...item.columns, ...item.subColumns]
+    }
+
+    let arr_field = _columns.map(col => col.field).join(',')
+
+    let _customScript = ''
+    let _tailScript = ''
+    let _dataresource = ''
+    item.scripts && item.scripts.forEach(script => {
+      if (script.status === 'false') return
+      if (script.position !== 'back') {
+        _customScript += `
+        ${script.sql}
+        `
+      } else {
+        _tailScript += `
+        ${script.sql}
+        `
+      }
+    })
+
+    if (item.setting.execute !== 'false') {
+      _dataresource = item.setting.dataresource || ''
+    }
+
+    let _search = joinMainSearchkey(searches)
+    if (item.setting.queryType === 'statistics') {
+      _search = ''
+    }
+
+    if (/\s/.test(_dataresource)) {
+      _dataresource = '(' + _dataresource + ') tb'
+    }
+
+    item.setting.dataresource = _dataresource
+    item.setting.customScript = _customScript
+
+    let custompage = /@pageSize@|@orderBy@/i.test(_dataresource + _customScript)
+
+    if (_dataresource) {
+      if (custompage) {
+        _dataresource = `/*system_query*/select ${arr_field} from ${_dataresource} ${_search} `
+      } else if (item.setting.laypage === 'true' && item.setting.order) {
+        _dataresource = `/*system_query*/select top 10 ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${item.setting.order}) as rows from ${_dataresource} ${_search}) tmptable where rows > 0 order by tmptable.rows `
+      } else if (item.setting.order) {
+        _dataresource = `/*system_query*/select ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${item.setting.order}) as rows from ${_dataresource} ${_search}) tmptable order by tmptable.rows `
+      } else {
+        _dataresource = `/*system_query*/select ${arr_field} from ${_dataresource} ${_search} `
+      }
+    }
+
+    let sql = ''
+    if (_customScript) {
+      sql = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@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) select @ErrorCode='',@retmsg =''
+        ${_customScript}
+        ${_dataresource}
+        ${_tailScript}
+        aaa:
+        if @ErrorCode!=''
+          insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select '1949-10-01 15:00:00',@ErrorCode, @retmsg,'1949-10-01 15:00:00'
+      `
+    } else if (_tailScript) {
+      sql = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@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) select @ErrorCode='',@retmsg =''
+        ${_dataresource}
+        ${_tailScript}
+        aaa:
+        if @ErrorCode!=''
+          insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select '1949-10-01 15:00:00',@ErrorCode, @retmsg,'1949-10-01 15:00:00' 
+      `
+    } else {
+      sql = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@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) select @ErrorCode='',@retmsg =''
+        ${_dataresource}`
+    }
+    
+    regs.forEach(cell => {
+      sql = sql.replace(cell.reg, cell.value)
+    })
+
+    let regoptions = getSearchRegs(searches)
+    regoptions.push(
+      { reg: /@orderBy@/ig, value: item.setting.order || '' },
+      { reg: /@pageSize@/ig, value: 9999 },
+      { reg: /@pageIndex@/ig, value: 1},
+      { reg: /@ID@/ig, value: `''`},
+      { reg: /@BID@/ig, value: `''`},
+      { reg: /@LoginUID@/ig, value: `'${sessionStorage.getItem('LoginUID') || ''}'`},
+      { reg: /@SessionUid@/ig, value: `'${localStorage.getItem('SessionUid') || ''}'`},
+      { reg: /@UserID@/ig, value: `'${sessionStorage.getItem('UserID') || ''}'`},
+      { reg: /@Appkey@/ig, value: `'${window.GLOB.appkey || ''}'`},
+      { reg: /@typename@/ig, value: `'admin'`},
+    )
+
+    if (item.type === 'calendar') {
+      regoptions.push({ reg: /@mk_year@/ig, value: '2023' })
+    }
+
+    regoptions.forEach(cell => {
+      sql = sql.replace(cell.reg, cell.value)
+    })
+    
+    return sql
+  }
+
+  continue = () => {
+    this.setState({status: 'continue'}, () => {
+      this.roopSql()
+    })
+  }
+
+  roopSql = () => {
+    if (this.verSqls.length === 0) {
+      this.setState({status: 'over'})
+      return
+    }
+
+    if (this.state.status === 'stop') return
+
+    let item = this.verSqls.shift()
+
+    this.setState({status: this.verSqls.length > 0 ? 'loading' : 'over', execId: item.uuid})
+
+    console.info(`/* 缁勪欢锛�${item.name}  妫�楠岄」锛�${item.label} */`)
+
+    Api.sDebug(item.sql).then(result => {
+      if (result.status || result.ErrCode === '-2') {
+        this.setState({successIds: [...this.state.successIds, item.uuid], execId: ''})
+        if (this.verSqls.length > 0) {
+          setTimeout(() => {
+            this.roopSql()
+          }, 100)
+        }
+      } else {
+        let errorMsg = fromJS(this.state.errorMsg).toJS()
+        errorMsg[item.uuid] = result.message
+
+        this.setState({
+          execId: '',
+          status: this.verSqls.length > 0 ? 'error' : 'over',
+          errorIds: [...this.state.errorIds, item.uuid],
+          errorMsg: errorMsg
+        })
+
+        Modal.error({
+          title: result.message
+        })
+      }
+    })
+  }
+
+  stop = () => {
+    this.setState({status: 'stop'})
+  }
+
+  over = () => {
+    this.verSqls = []
+    this.setState({status: 'over', visible: false})
+  }
 
   render() {
-    const { visible, confirming } = this.state
+    const { visible, sqlList, status, successIds, errorIds, execId, errorMsg } = this.state
 
     return (
       <>
         <Button className="mk-border-yellow" icon="bug" onClick={this.trigger}>璋冭瘯</Button>
-        <Modal
-          title="SQL楠岃瘉"
-          wrapClassName="debug-modal"
-          visible={visible}
+        <Drawer
+          className="debug-modal"
           width={600}
-          maskClosable={false}
-          onOk={this.submit}
-          onCancel={() => { this.setState({ visible: false })}}
-          confirmLoading={confirming}
+          visible={visible}
+          closable={false}
+          placement="left"
           destroyOnClose
         >
-        </Modal>
+          <div className="mk-sql-wrap">
+            {/* <div className="header">
+              <div className="sql-item">
+                <div className="sql-1">缁勪欢</div>
+                <div className="sql-2">妫�楠岄」</div>
+                <div className="sql-3">鍏朵粬</div>
+                <div className="sql-4">鐘舵��</div>
+              </div>
+            </div> */}
+            <div className="body">
+              {sqlList.map(item => {
+                let other = ''
+                if (item.supName) {
+                  other = `涓婄骇锛�${item.supName}-${item.tabName}`
+                }
+
+                let status = <ClockCircleOutlined />
+
+                if (successIds.includes(item.uuid)) {
+                  status = <CheckCircleOutlined />
+                } else if (errorIds.includes(item.uuid)) {
+                  if (errorMsg[item.uuid]) {
+                    status = <Tooltip placement="topLeft" title={errorMsg[item.uuid]}>
+                      <CloseCircleOutlined />
+                    </Tooltip>
+                  } else {
+                    status = <CloseCircleOutlined />
+                  }
+                } else if (item.uuid === execId) {
+                  status = <LoadingOutlined />
+                }
+
+                return <div className="sql-item" key={item.uuid}>
+                  <div className="sql-1" title={item.name}><div>{item.name}</div></div>
+                  <div className="sql-2" title={item.label}><div>{item.label}</div></div>
+                  <div className="sql-3" title={other}><div>{other}</div></div>
+                  <div className="sql-4">{status}</div>
+                </div>
+              })}
+            </div>
+          </div>
+          <div className="mk-footer">
+            {status === 'error' ? <Button key="skip" className="mk-border-green" onClick={this.roopSql}>
+              璺宠繃
+            </Button> : null}
+            {status === 'loading' ? <Button key="stop" className="mk-border-orange" onClick={this.stop}>
+              鏆傚仠
+            </Button> : null}
+            {status === 'stop' ? <Button key="continue" className="mk-border-orange" onClick={this.continue}>
+              缁х画
+            </Button> : null}
+            <Button key="colse" className="mk-border-danger" onClick={this.over}>
+              鍏抽棴
+            </Button>
+          </div>
+        </Drawer>
       </>
     )
   }
diff --git a/src/menu/debug/index.scss b/src/menu/debug/index.scss
index de57aff..9e9bb25 100644
--- a/src/menu/debug/index.scss
+++ b/src/menu/debug/index.scss
@@ -1,9 +1,106 @@
-.replace-field-modal {
-  .ant-modal {
-    top: 70px;
+.debug-modal {
+  .ant-drawer-body {
+    position: relative;
+    height: 100vh;
+    padding: 0 0 50px 0;
+    overflow: hidden;
+    color: rgba(0, 0, 0, 0.85);
+
+    .mk-sql-wrap {
+      padding: 10px;
+
+      .sql-item {
+        display: flex;
+        min-height: 30px;
+
+        .sql-1, .sql-2 {
+          flex: 1;
+          width: 25%;
+          max-width: 25%;
+          display: flex;
+          align-items: center;
+
+          div {
+            overflow: hidden;
+            word-break: break-word;
+            white-space: nowrap;
+            text-overflow: ellipsis;
+          }
+        }
+        .sql-3 {
+          flex: 1;
+          width: 30%;
+          max-width: 30%;
+          display: flex;
+          align-items: center;
+
+          div {
+            overflow: hidden;
+            word-break: break-word;
+            white-space: nowrap;
+            text-overflow: ellipsis;
+          }
+        }
+        .sql-4 {
+          flex: 1;
+          width: 20%;
+          max-width: 20%;
+          display: flex;
+          justify-content: center;
+          align-items: center;
+
+          .anticon {
+            font-size: 16px;
+          }
+          .anticon-clock-circle {
+            color: #c8c8c8;
+          }
+          .anticon-check-circle {
+            color: #26C281;
+          }
+          .anticon-close-circle {
+            color: red;
+          }
+          .anticon-loading {
+            color: orange;
+          }
+        }
+      }
+      .header {
+        border-bottom: 1px solid #e8e8e8;
+      }
+      .body {
+        max-height: calc(100vh - 60px);
+        overflow-y: auto;
+      }
+    }
+
+    .mk-sql-wrap .body::-webkit-scrollbar {
+      width: 7px;
+    }
+    .mk-sql-wrap .body::-webkit-scrollbar-thumb {
+      border-radius: 5px;
+      box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13);
+      background: rgba(0, 0, 0, 0.13);
+    }
+    .mk-sql-wrap .body::-webkit-scrollbar-track {
+      box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05);
+      border-radius: 3px;
+      border: 1px solid rgba(0, 0, 0, 0.07);
+      background: rgba(0, 0, 0, 0);
+    }
   }
-  .ant-modal-body {
-    min-height: 150px;
-    padding-top: 40px;
+  .mk-footer {
+    position: absolute;
+    bottom: 0px;
+    width: 100%;
+    height: 45px;
+    line-height: 50px;
+    border-top: 1px solid #e8e8e8;
+    text-align: right;
+    padding-right: 20px;
+    .ant-btn:not(:first-child) {
+      margin-left: 15px;
+    }
   }
 }
\ No newline at end of file
diff --git a/src/mob/components/search/single-search/options.jsx b/src/mob/components/search/single-search/options.jsx
index 7acafab..f5a51e3 100644
--- a/src/mob/components/search/single-search/options.jsx
+++ b/src/mob/components/search/single-search/options.jsx
@@ -42,6 +42,7 @@
       field: 'initval',
       label: '鍒濆鍊�',
       initval: wrap.initval || '',
+      tooltip: '鍙娇鐢ˊusername@銆丂fullName@',
       required: false
     },
     {
diff --git a/src/mob/searchconfig/settingform/index.jsx b/src/mob/searchconfig/settingform/index.jsx
index f753ef8..7758591 100644
--- a/src/mob/searchconfig/settingform/index.jsx
+++ b/src/mob/searchconfig/settingform/index.jsx
@@ -127,7 +127,12 @@
             </Form.Item>
           </Col> : null}
           {type === 'search' ? <Col span={12}>
-            <Form.Item label="鍒濆鍊�">
+            <Form.Item label={
+              <Tooltip placement="topLeft" title="鍙娇鐢ˊusername@銆丂fullName@銆�">
+                <QuestionCircleOutlined className="mk-form-tip" />
+                鍒濆鍊�
+              </Tooltip>
+            }>
               {getFieldDecorator('initval', {
                 initialValue: config.setting.initval,
                 rules: [
diff --git a/src/tabviews/basetable/index.jsx b/src/tabviews/basetable/index.jsx
index ce12936..2999c50 100644
--- a/src/tabviews/basetable/index.jsx
+++ b/src/tabviews/basetable/index.jsx
@@ -112,7 +112,6 @@
             config.flow_code = result.works_flow_code
             config.flow_name = result.works_flow_name
             unset = false
-            
             window.GLOB.UserCacheMap.set('flow' + MenuID, flowConfig)
           } catch (e) {
             unset = true
@@ -191,7 +190,7 @@
       }
 
       if (config.flow_code) {
-        regs.push({ reg: /@works_flow_code@/ig, value: config.flow_code })
+        regs.push({ reg: /@works_flow_code@/ig, value: `'${config.flow_code}'` })
       }
 
       config.components = this.filterComponent(config.components, roleId, window.GLOB.mkActions, skip, param, MenuID, config.MenuName, config.process === 'true')
diff --git a/src/tabviews/custom/components/card/cardcellList/index.jsx b/src/tabviews/custom/components/card/cardcellList/index.jsx
index fae11ad..c363313 100644
--- a/src/tabviews/custom/components/card/cardcellList/index.jsx
+++ b/src/tabviews/custom/components/card/cardcellList/index.jsx
@@ -76,7 +76,7 @@
   }
 
   shouldComponentUpdate (nextProps, nextState) {
-    return !is(fromJS(this.props.data), fromJS(nextProps.data)) || (nextProps.syncData && !is(fromJS(this.props.syncData), fromJS(nextProps.syncData)))
+    return !is(fromJS(this.props.data), fromJS(nextProps.data)) || (nextProps.syncData ? !is(fromJS(this.props.syncData), fromJS(nextProps.syncData)) : false)
   }
 
   /**
diff --git a/src/tabviews/custom/components/chart/antv-X6/index.jsx b/src/tabviews/custom/components/chart/antv-X6/index.jsx
index 3b654c5..97525bc 100644
--- a/src/tabviews/custom/components/chart/antv-X6/index.jsx
+++ b/src/tabviews/custom/components/chart/antv-X6/index.jsx
@@ -1003,8 +1003,16 @@
       if (!isNew) return
 
       let target = edge.getTargetCell()
-      let mkdata = target ? target.prop('mkdata') : null
 
+      if (!target) return
+
+      let mkdata = target.prop('mkdata')
+
+      if (target.prop('mknode') === 'end') {
+        edge.prop('mknode', 'endEdge')
+      } else if (target.prop('mknode') === 'start') {
+        edge.prop('mknode', 'startEdge')
+      }
       if (mkdata) {
         edge.prop('mkdata', {status: mkdata.status, statusName: mkdata.statusName})
       }
@@ -1550,10 +1558,23 @@
     let _status = status
 
     if (plot.subtype === 'xflow' && status === 10) {
-      let start_num = nodes.cells.filter(cell => cell.mknode === 'start').length
-      let end_num = nodes.cells.filter(cell => cell.mknode === 'end').length
+      let start_num = 0
+      let end_num = 0
+      let unvalid = false
       
-      if (start_num !== 1 || end_num !== 1) {
+      nodes.cells.forEach(item => {
+        if (item.mknode === 'start') {
+          start_num++
+        } else if (item.mknode === 'end') {
+          end_num++
+        } else if (item.shape === 'edge' && item.mknode !== 'endEdge' && item.mknode !== 'startEdge') {
+          if (!item.mkdata.members || item.mkdata.members.length === 0) {
+            unvalid = true
+          }
+        }
+
+      })
+      if (start_num !== 1 || end_num !== 1 || unvalid) {
         _status = 0
       }
     }
@@ -1968,8 +1989,22 @@
     
     if (plot.subtype === 'xflow' && _status === 10) {
       let nodes = this.mkGraph.toJSON()
-      let start_num = nodes.cells.filter(cell => cell.mknode === 'start').length
-      let end_num = nodes.cells.filter(cell => cell.mknode === 'end').length
+
+      let start_num = 0
+      let end_num = 0
+      let unvalidId = ''
+      
+      nodes.cells.forEach(item => {
+        if (item.mknode === 'start') {
+          start_num++
+        } else if (item.mknode === 'end') {
+          end_num++
+        } else if (item.shape === 'edge' && item.mknode !== 'endEdge' && item.mknode !== 'startEdge') {
+          if (!item.mkdata.members || item.mkdata.members.length === 0) {
+            unvalidId = item.id
+          }
+        }
+      })
 
       if (start_num === 0) {
         notification.warning({
@@ -1995,6 +2030,23 @@
           message: '缁撴潫鑺傜偣涓嶅彲娣诲姞澶氫釜锛�',
           duration: 2
         })
+      } else if (unvalidId) {
+        let edge = this.mkGraph.getCellById(unvalidId)
+
+        let node = edge.getTargetCell()
+
+        let title = ''
+        if (node.attrs && node.attrs.text) {
+          title = node.attrs.text.text + ''
+        } else if (node.mkdata) {
+          title = '鐘舵�侊細' + node.mkdata.status + ' - ' + node.mkdata.statusName
+        }
+
+        notification.warning({
+          top: 92,
+          message: '杩炴帴锛�' + title + '锛夌殑绾挎湭璁剧疆瀹℃壒浜猴紒',
+          duration: 2
+        })
       } else {
         this.setState({status: _status})
       }
diff --git a/src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.jsx b/src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.jsx
index 22c8d18..bf50398 100644
--- a/src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.jsx
+++ b/src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.jsx
@@ -474,6 +474,7 @@
             {mkdata ? <div className="mk-data">
               <div>鐘舵�侊細{mkdata.status}<span style={{float: 'right'}}>{mkdata.statusName}</span></div>
               {mknode.shape !== 'edge' && !mknode.mknode ? <div>鏍囪锛歿mkdata.sign || ''}</div> : null}
+              {mknode.shape === 'edge' && mkdata.flowType ? <div>鎿嶄綔锛歿mkdata.flowType === 'reject' ? '椹冲洖' : '瀹℃壒'}</div> : null}
               {mkdata.members && mkdata.members.length ? <div>瀹℃壒浜猴細{mkdata.members.map(item => item.workername).join('銆�')}</div> : null}
               {mkdata.copys && mkdata.copys.length ? <div>鎶勯�佷汉锛歿mkdata.copys.map(item => item.workername).join('銆�')}</div> : null}
               <div>澶囨敞锛歿mkdata.remark || ''}</div>
diff --git a/src/tabviews/custom/components/chart/antv-X6/nodeupdate/nodeform.jsx b/src/tabviews/custom/components/chart/antv-X6/nodeupdate/nodeform.jsx
index e155c71..4d6fc81 100644
--- a/src/tabviews/custom/components/chart/antv-X6/nodeupdate/nodeform.jsx
+++ b/src/tabviews/custom/components/chart/antv-X6/nodeupdate/nodeform.jsx
@@ -13,7 +13,9 @@
     orgs: PropTypes.array
   }
 
-  state = {}
+  state = {
+    flowType: this.props.data.flowType || 'approval'
+  }
 
   handleConfirm = () => {
     return new Promise((resolve, reject) => {
@@ -30,6 +32,7 @@
   render() {
     const { node, orgs } = this.props
     const { getFieldDecorator } = this.props.form
+    const { flowType } = this.state
     const formItemLayout = {
       labelCol: {
         xs: { span: 24 },
@@ -46,6 +49,10 @@
       nodetype = 'start'
     } else if (node.mknode === 'end') {
       nodetype = 'end'
+    } else if (node.mknode === 'endEdge') {
+      nodetype = 'endEdge'
+    } else if (node.mknode === 'startEdge') {
+      nodetype = 'startEdge'
     }
 
     return (
@@ -62,7 +69,7 @@
                   }
                 ]
               })(
-                <InputNumber precision={0}/>
+                <InputNumber readOnly={nodetype !== 'node' && nodetype !== 'edge'} precision={0}/>
               )}
             </Form.Item>
           </Col>
@@ -90,6 +97,18 @@
             </Form.Item>
           </Col> : null}
           {nodetype === 'edge' ? <Col span={12}>
+            <Form.Item label="鎿嶄綔绫诲瀷">
+              {getFieldDecorator('flowType', {
+                initialValue: flowType
+              })(
+                <Radio.Group onChange={(e) => this.setState({flowType: e.target.value})}>
+                  <Radio value="approval">瀹℃壒</Radio>
+                  <Radio value="reject">椹冲洖</Radio>
+                </Radio.Group>
+              )}
+            </Form.Item>
+          </Col> : null}
+          {nodetype === 'edge' ? <Col span={12}>
             <Form.Item label="璁剧疆瀹℃壒浜�">
               {getFieldDecorator('approver', {
                 initialValue: data.approver || 'member'
@@ -102,7 +121,7 @@
               )}
             </Form.Item>
           </Col> : null}
-          {nodetype === 'edge' ? <Col span={12}>
+          {nodetype === 'edge' && flowType !== 'reject' ? <Col span={12}>
             <Form.Item label="瀹℃壒鏂瑰紡">
               {getFieldDecorator('approvalMethod', {
                 initialValue: data.approvalMethod || 'orsign'
diff --git a/src/tabviews/custom/index.jsx b/src/tabviews/custom/index.jsx
index 7eb85d2..e4f0f5a 100644
--- a/src/tabviews/custom/index.jsx
+++ b/src/tabviews/custom/index.jsx
@@ -232,7 +232,7 @@
       }
 
       if (config.flow_code) {
-        regs.push({ reg: /@works_flow_code@/ig, value: config.flow_code })
+        regs.push({ reg: /@works_flow_code@/ig, value: `'${config.flow_code}'` })
       }
 
       config.$cache = config.cacheLocal === 'true'
@@ -278,7 +278,7 @@
 
       config.components = this.formatSetting(config.components, params, inherit, regs, balMap)
 
-      if ([...balMap.keys()].length > 0) {
+      if (balMap.size > 0) {
         config.components = this.filterBalcony(config.components, balMap)
       }
 
diff --git a/src/tabviews/custom/popview/index.jsx b/src/tabviews/custom/popview/index.jsx
index 2c36b13..d9fb7ac 100644
--- a/src/tabviews/custom/popview/index.jsx
+++ b/src/tabviews/custom/popview/index.jsx
@@ -125,7 +125,7 @@
 
     if (Tab.$process && window.GLOB.UserCacheMap.has(Tab.$flowId)) {
       let flow = window.GLOB.UserCacheMap.get(Tab.$flowId)
-      regs.push({ reg: /@works_flow_code@/ig, value: flow.flow_code || '' })
+      regs.push({ reg: /@works_flow_code@/ig, value: `'${flow.flow_code || ''}'` })
     }
 
     config.components = this.filterComponent(config.components, roleId, balMap, param, Tab, Tab.uuid, Tab.uuid)
@@ -158,7 +158,7 @@
 
     config.components = this.formatSetting(config.components, params, regs, balMap)
 
-    if ([...balMap.keys()].length > 0) {
+    if (balMap.size > 0) {
       config.components = this.filterBalcony(config.components, balMap)
     }
 
diff --git a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
index be84eac..30385fe 100644
--- a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
@@ -448,8 +448,6 @@
     
     let imgCol = false
     let columns = btn.verify.columns.filter(col => {
-      if (col.output === 'false') return false
-
       if (col.type === 'image') {
         imgCol = true
       }
@@ -464,6 +462,7 @@
     if (data && data[0]) {
       let errors = []
       columns.forEach(col => {
+        if (col.output === 'false') return
         if (col.Column && data[0][col.Column] === undefined) {
           errors.push(col.Text)
         }
@@ -509,7 +508,13 @@
   
           columns.forEach((col, i) => {
             let val = item[col.Column]
-            if (col.type === 'number' && typeof(val) === 'number') {
+            if (col.output === 'false') {
+              if (col.type === 'number') {
+                val = 0
+              } else {
+                val = ''
+              }
+            } else if (col.type === 'number' && typeof(val) === 'number') {
               if (col.abs === 'true') {
                 val = Math.abs(val)
               }
@@ -594,7 +599,13 @@
           columns.forEach((col, i) => {
             let val = item[col.Column]
 
-            if (col.type === 'number' && typeof(val) === 'number') {
+            if (col.output === 'false') {
+              if (col.type === 'number') {
+                val = 0
+              } else {
+                val = ''
+              }
+            } else if (col.type === 'number' && typeof(val) === 'number') {
               if (col.abs === 'true') {
                 val = Math.abs(val)
               }
@@ -766,7 +777,7 @@
       _setting.arr_field = _setting.arr_field.join(',')
       _setting.execute = btn.verify.defaultSql !== 'false'
       _setting.dataresource = btn.verify.dataresource || ''
-      _setting.primaryKey = _setting.primaryKey || setting.primaryKey || 'ID'
+      _setting.primaryKey = btn.verify.primaryKey || setting.primaryKey || 'ID'
 
       if (!_setting.execute) {
         _setting.dataresource = ''
@@ -813,8 +824,11 @@
       _orderBy = btn.verify.order || ''
     } else {
       _setting = {...setting}
+      _setting.$name = btn.logLabel
       _setting.laypage = pagination
       _setting.arr_field = _setting.all_field || _setting.arr_field
+
+      delete _setting.sub_field
     }
 
     let primaryId = ''
diff --git a/src/tabviews/zshare/actionList/normalbutton/index.jsx b/src/tabviews/zshare/actionList/normalbutton/index.jsx
index cc4a956..eeb24ce 100644
--- a/src/tabviews/zshare/actionList/normalbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -1442,7 +1442,22 @@
   getCallBackSql = (result, record) => {
     const { btn } = this.props
     let lines = []
-    let pre = btn.callbackType === 'script' ? '@' : ''
+    let pre = ''
+    let tables = []
+
+    if (btn.callbackType === 'script') { // 浣跨敤鑷畾涔夎剼鏈�
+      pre = '@'
+
+      btn.verify.cbScripts.forEach(script => {
+        if (script.status === 'false') return
+
+        if (/\s#[a-z0-9_]+(\s|\()/ig.test(script.sql)) {
+          tables.push(...script.sql.match(/\s#[a-z0-9_]+(\s|\()/ig))
+        }
+      })
+
+      tables = tables.map(tb => tb.replace(/\s|\(/g, ''))
+    }
 
     let errSql = ''
     if (result.$ErrCode === 'E') {
@@ -1459,6 +1474,11 @@
       let vals = []
       let subObjs = []
       let id = Utils.getuuid()
+      let tbName = pre + tb
+
+      if (tables.includes('#' + tb)) {
+        tbName = '#' + tb
+      }
 
       delete obj.$$key
 
@@ -1491,7 +1511,7 @@
 
       lines.push({
         table: md5(tb + keys),
-        insert: `Insert into ${pre}${tb} (${keys},[mk_level],[mk_id],[mk_bid])`,
+        insert: `Insert into ${tbName} (${keys},[mk_level],[mk_id],[mk_bid])`,
         select: `Select ${vals.join(',')},'${level}','${id}','${bid}'`
       })
 
@@ -1584,6 +1604,7 @@
       }
 
       if (window.GLOB.debugger === true) {
+        console.info('%c' + btn.logLabel + '(鍥炶皟)', 'color: blue')
         console.info(sql.replace(/\n\s{8}/ig, '\n'))
       }
 
@@ -1819,6 +1840,18 @@
         result.rduri = btn.interface
       }
 
+      if (/function:/i.test(result.rduri)) {
+        let rduri = result.rduri
+        try {
+          rduri = rduri.replace(/function:/i, '')
+          // eslint-disable-next-line
+          let func = new Function(rduri)
+          result.rduri = func()
+        } catch (e) {
+          console.warn(e)
+        }
+      }
+
       let host = window.GLOB.baseurl.replace(/http(s):\/\//, '')
       if (result.rduri.indexOf(host) === -1 && /\/dostars/.test(result.rduri)) {
         result.$login = true
diff --git a/src/tabviews/zshare/fileupload/index.jsx b/src/tabviews/zshare/fileupload/index.jsx
index cb0be7b..704ea1e 100644
--- a/src/tabviews/zshare/fileupload/index.jsx
+++ b/src/tabviews/zshare/fileupload/index.jsx
@@ -5,7 +5,9 @@
 import { Upload, Button, Progress, notification } from 'antd'
 import { UploadOutlined } from '@ant-design/icons'
 import SparkMD5 from 'spark-md5'
+
 import Api from '@/api'
+import MKEmitter from '@/utils/events.js'
 import './index.scss'
 
 class FileUpload extends Component {
@@ -129,7 +131,9 @@
     this.props.onChange(vals.join(','))
   }
 
-  onUpdate = (url) => {
+  onUpdate = (url, file_name) => {
+    const { config } = this.props
+
     let filelist = fromJS(this.state.filelist).toJS()
 
     if (filelist[filelist.length -1]) {
@@ -151,7 +155,20 @@
     })
 
     this.setState({filelist})
-    this.props.onChange(vals.join(','))
+
+    if (config.subFields && file_name) {
+      let other = {}
+      config.subFields.forEach((n, i) => {
+        other[n.field] = file_name
+        setTimeout(() => {
+          MKEmitter.emit('mkFC', 'input', n.uuid, file_name)
+        }, i * 5)
+      })
+
+      this.props.onChange(vals.join(','), other)
+    } else {
+      this.props.onChange(vals.join(','))
+    }
   }
 
   onFail = (msg) => {
@@ -171,7 +188,7 @@
     })
   }
 
-  shardupload = (param) => {
+  shardupload = (param, file_name) => {
     let form = new FormData()
 
     form.append('file', param.binary)
@@ -189,7 +206,7 @@
     Api.getLargeFileUpload(form).then(res => {
       if (res.status) {
         if (res.urlPath) {
-          this.onUpdate(res.urlPath)
+          this.onUpdate(res.urlPath, file_name)
         } else {
           this.onFail()
         }
@@ -253,6 +270,8 @@
       percent: 0
     })
 
+    let file_name = file.name.replace(/\.{1}[^.]*$/ig, '')
+
     if (compress === 'true' || compress === 'base64') {
       let reader = new FileReader()
       let fileSize = file.size / 1024 / 1024
@@ -292,7 +311,7 @@
           let param = {Base64Img: cvs.toDataURL('image/jpeg', compressRate)}
 
           if (this.props.config.compress === 'base64') {
-            this.onUpdate(param.Base64Img)
+            this.onUpdate(param.Base64Img, file_name)
   
             this.setState({
               percent: 100
@@ -317,7 +336,7 @@
                   url = rduri.replace(/webapi(.*)$/, '') + result.Images
                 }
   
-                this.onUpdate(url)
+                this.onUpdate(url, file_name)
   
                 this.setState({
                   percent: 100
@@ -358,7 +377,7 @@
         if (res.status) {
           if (res.urlPath) {
             let path = (/^\/\//.test(res.urlPath) ? 'https:' : '') + res.urlPath
-            this.onUpdate(path)
+            this.onUpdate(path, file_name)
             this.setState({
               percent: 100
             }, () => {
@@ -403,7 +422,7 @@
       
       Api.getFilePreUpload(_param).then(res => {
         if (res.status && res.urlPath) {
-          this.onUpdate(res.urlPath)
+          this.onUpdate(res.urlPath, file_name)
           this.setState({
             percent: 100
           }, () => {
@@ -415,7 +434,7 @@
             }, 200)
           })
         } else {
-          this.shardupload(param)
+          this.shardupload(param, file_name)
         }
       })
     }
diff --git a/src/tabviews/zshare/mutilform/index.jsx b/src/tabviews/zshare/mutilform/index.jsx
index 9f4ca38..e4f95d3 100644
--- a/src/tabviews/zshare/mutilform/index.jsx
+++ b/src/tabviews/zshare/mutilform/index.jsx
@@ -486,47 +486,42 @@
       let item = fieldMap.get(cell.field)
 
       // 涓嬬骇琛ㄥ崟鎺у埗-瀛楁鍐欏叆
-      if ((['select', 'radio', 'link'].includes(item.type) || (item.type === 'checkcard' && item.multiple !== 'true') || (item.type === 'cascader' && item.resourceType !== '2')) && item.linkSubField) {
-        item.subFields = []
-        item.linkSubField.forEach(m => {
-          let n = fieldMap.get(m)
-          if (n && ['text', 'number', 'textarea'].includes(n.type)) {
-            item.subFields.push({
-              uuid: n.uuid,
-              field: m
-            })
-          }
-        })
-
-        if (item.subFields.length === 0) {
-          item.subFields = null
-        } else if (item.oriOptions.length > 0) {
-          item.oriOptions = item.oriOptions.map(cell => {
-            item.subFields.forEach(m => {
-              cell[m.field] = cell[m.field] === undefined ? '' : cell[m.field]
-            })
-            return cell
+      if (item.linkSubField && item.linkSubField.length > 0) {
+        if ((['select', 'radio', 'link'].includes(item.type) || (item.type === 'checkcard' && item.multiple !== 'true') || (item.type === 'cascader' && item.resourceType !== '2'))) {
+          item.subFields = []
+          item.linkSubField.forEach(m => {
+            let n = fieldMap.get(m)
+            if (n && ['text', 'number', 'textarea'].includes(n.type)) {
+              item.subFields.push({
+                uuid: n.uuid,
+                field: m
+              })
+            }
           })
-          
-          item.options = fromJS(item.oriOptions).toJS()
-        }
-        item.linkSubField = null
-      } else if (item.type === 'switch' && item.linkSubField) {
-        item.options = []
-        item.subFields = []
-        item.linkSubField.forEach(m => {
-          let n = fieldMap.get(m)
-          if (n && ['text', 'number', 'textarea'].includes(n.type)) {
-            item.subFields.push({
-              uuid: n.uuid,
-              field: m
+  
+          if (item.oriOptions.length > 0) {
+            item.oriOptions = item.oriOptions.map(cell => {
+              item.subFields.forEach(m => {
+                cell[m.field] = cell[m.field] === undefined ? '' : cell[m.field]
+              })
+              return cell
             })
+            
+            item.options = fromJS(item.oriOptions).toJS()
           }
-        })
-
-        if (item.subFields.length === 0) {
-          item.subFields = null
-        } else {
+        } else if (item.type === 'switch') {
+          item.options = []
+          item.subFields = []
+          item.linkSubField.forEach(m => {
+            let n = fieldMap.get(m)
+            if (n && ['text', 'number', 'textarea'].includes(n.type)) {
+              item.subFields.push({
+                uuid: n.uuid,
+                field: m
+              })
+            }
+          })
+  
           reFieldsVal = reFieldsVal || {}
 
           let val = item.initval === item.openVal ? item.openText : item.closeText
@@ -534,7 +529,20 @@
           item.subFields.forEach(n => {
             reFieldsVal[n.field] = val || ''
           })
+        } else if (item.type === 'fileupload') {
+          item.options = []
+          item.subFields = []
+          item.linkSubField.forEach(m => {
+            let n = fieldMap.get(m)
+            if (n && ['text', 'number', 'textarea'].includes(n.type)) {
+              item.subFields.push({
+                uuid: n.uuid,
+                field: m
+              })
+            }
+          })
         }
+
         item.linkSubField = null
       }
 
@@ -1136,7 +1144,7 @@
         } else if (item.type === 'fileupload') {
           className = item.readonly ? 'readonly' : ''
           className += item.fileType === 'picture-card' ? ' file-upload' : ''
-          content = (<MKFileUpload config={item} onChange={(val) => this.recordChange({[item.field]: val})} />)
+          content = (<MKFileUpload config={item} onChange={(val, other = {}) => this.recordChange({[item.field]: val, ...other})} />)
         } else if (item.type === 'textarea') {
           content = (<MKTextArea config={item} onChange={(val, defer) => !defer && this.recordChange({[item.field]: val})}/>)
         } else if (item.type === 'rate') {
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx
index 582c6b5..73b091b 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx
@@ -148,6 +148,25 @@
             duration: 5
           })
           return
+        } else if (/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig.test(values.sql)) {
+          let list = values.sql.match(/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig)
+          let errors = []
+          list.forEach(str => {
+            str = str.replace(/^\s/, '')
+            let strs = str.match(/(\s|=)[a-z0-9_]+\./ig)
+            if (strs.length === 2 && (strs[0].replace(/\s|\./g, '') === strs[1].replace(/\s|\./g, ''))) {
+              errors.push(str)
+            }
+          })
+
+          if (errors.length > 0) {
+            notification.warning({
+              top: 92,
+              message: '涓嶅彲浣跨敤鍚屼竴涓〃瀛楁杩涜鍏宠仈锛�' + errors.join('銆�'),
+              duration: 5
+            })
+            return
+          }
         }
 
         let error = Utils.verifySql(values.sql, 'customscript')
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/customscript/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/customscript/index.jsx
index 2bcd93c..365fd36 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/customscript/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/customscript/index.jsx
@@ -183,6 +183,25 @@
             duration: 5
           })
           return
+        } else if (/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig.test(values.sql)) {
+          let list = values.sql.match(/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig)
+          let errors = []
+          list.forEach(str => {
+            str = str.replace(/^\s/, '')
+            let strs = str.match(/(\s|=)[a-z0-9_]+\./ig)
+            if (strs.length === 2 && (strs[0].replace(/\s|\./g, '') === strs[1].replace(/\s|\./g, ''))) {
+              errors.push(str)
+            }
+          })
+
+          if (errors.length > 0) {
+            notification.warning({
+              top: 92,
+              message: '涓嶅彲浣跨敤鍚屼竴涓〃瀛楁杩涜鍏宠仈锛�' + errors.join('銆�'),
+              duration: 5
+            })
+            return
+          }
         }
 
         let error = Utils.verifySql(values.sql, 'customscript')
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
index 85e463d..5b520c4 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
@@ -85,7 +85,9 @@
         editable: true,
         required: false,
         width: '12%',
-        render: (text) => {
+        render: (text, record) => {
+          if (record.type !== 'number') return ''
+
           if (text === 'true') {
             return '鏄�'
           } else {
@@ -105,7 +107,8 @@
         max: 18,
         editable: true,
         required: false,
-        width: '12%'
+        width: '12%',
+        render: (text, record) => record.type === 'number' ? text : ''
       },
       {
         title: '瀵煎嚭',
@@ -231,6 +234,13 @@
         } else {
           col.type = 'text'
         }
+      }
+
+      if (col.type !== 'number') {
+        col.decimal = ''
+        col.abs = 'false'
+      } else {
+        col.abs = col.abs || 'false'
       }
 
       return col
@@ -884,7 +894,7 @@
       return
     }
 
-    let sql = SettingUtils.getDebugSql(verify, scripts, (verify.useSearch === 'true' ? searches : []), Utils)
+    let sql = SettingUtils.getDebugSql(verify, scripts, (verify.useSearch === 'true' ? searches : []))
 
     let _debugId = md5(sql)
 
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/utils.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/utils.jsx
index 939f64d..04b1446 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/utils.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/utils.jsx
@@ -1,19 +1,17 @@
 
-import moment from 'moment'
+import { formatSearch, getSearchRegs, joinMainSearchkey } from '@/utils/utils-custom.js'
 
 export default class SettingUtils {
   /**
    * @description 鐢熸垚椤甸潰鏌ヨ璇彞
    */
-  static getDebugSql (verify, scripts, searches, Utils) {
+  static getDebugSql (verify, scripts, searches) {
     let sql = ''
     let _dataresource = verify.dataresource || ''
-    let regoptions = this.getRegOptions(searches)
-    let _search = this.formatSearch(searches)
-    _search = Utils.joinMainSearchkey(_search)
+    let _search = formatSearch(searches)
+    let regoptions = getSearchRegs(_search)
 
-    _search = _search.replace(/@\$@/ig, '')
-    _search = _search ? 'where ' + _search : ''
+    _search = joinMainSearchkey(_search)
 
     let arr_field = []
     verify.columns.forEach(item => {
@@ -129,127 +127,5 @@
     }
 
     return sql
-  }
-
-  /**
-   * @description 鑾峰彇鍏ㄩ儴鎼滅储鏉′欢
-   * @param {Array} searches 鎼滅储鏉′欢鏁扮粍
-   */
-  static formatSearch (searches) {
-    if (!searches || searches.length === 0) return []
-
-    let newsearches = []
-    searches.forEach(search => {
-      if (!search.field) return
-      
-      let item = {
-        key: search.field,
-        match: search.match,
-        type: search.type,
-        label: search.label,
-        value: search.initval,
-        required: search.required === 'true'
-      }
-      
-      if (item.type === 'group') {
-        item.key = search.datefield
-        item.type = 'daterange'
-        item.match = 'between'
-        item.value = [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')].join(',')
-
-        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().format('YYYY-MM-DD')
-      } else if (item.type === 'daterange') {
-        item.value = [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')].join(',')
-      } else if (item.type === 'multiselect' || (item.type === 'checkcard' && search.multiple === 'true')) {
-        item.type = 'multi'
-        item.value = '@$@'
-      } else {
-        item.value = '@$@'
-      }
-      newsearches.push(item)
-    })
-    
-    return newsearches
-  }
-  
-  /**
-   * @description 鑾峰彇鎼滅储鐢ㄤ簬姝e垯鏇挎崲
-   * @param {Array}   searches     鎼滅储鏉′欢
-   * @return {String}  searchText  鎷兼帴缁撴灉
-   */
-  static getRegOptions (searches) {
-    if (!searches || searches.length === 0) return []
-
-    let options = []
-    let fieldmap = new Map()
-    searches.forEach(search => {
-      let item = {
-        key: search.field,
-        value: '0'
-      }
-
-      if (fieldmap.has(item.key)) {
-        item.key = item.key + '1'
-      }
-
-      fieldmap.set(item.key, true)
-
-      if (search.type === 'group') {
-        options.push({
-          key: search.field,
-          value: '0'
-        })
-        options.push({
-          key: search.datefield,
-          value: '0'
-        })
-        options.push({
-          key: search.datefield + '1',
-          value: '0'
-        })
-        options.push(item)
-      } else if (['datemonth', 'dateweek'].includes(search.type)) {
-        options.push(item)
-        options.push({
-          key: item.key + '1',
-          value: '0'
-        })
-      } else if (search.type === 'daterange') {
-        let _skey = search.field
-        let _ekey = search.field + '1'
-
-        if (/,/.test(search.field)) {
-          _skey = search.field.split(',')[0]
-          _ekey = search.field.split(',')[1]
-        }
-
-        options.push({
-          key: _skey,
-          value: '0'
-        })
-        options.push({
-          key: _ekey,
-          value: '0'
-        })
-      } else if (search.type === 'text' || search.type === 'select') {
-        item.key.split(',').forEach(field => {
-          let cell = JSON.parse(JSON.stringify(item))
-          cell.key = field
-
-          options.push(cell)
-        })
-      } else {
-        options.push(item)
-      }
-    })
-
-    return options
   }
 }
\ No newline at end of file
diff --git a/src/templates/sharecomponent/fieldscomponent/editcard/index.jsx b/src/templates/sharecomponent/fieldscomponent/editcard/index.jsx
index 4387911..14338af 100644
--- a/src/templates/sharecomponent/fieldscomponent/editcard/index.jsx
+++ b/src/templates/sharecomponent/fieldscomponent/editcard/index.jsx
@@ -13,11 +13,12 @@
     let _type = props.card.type
 
     if (!props.card.origin) {
-      if (props.type === 'columns') {
-        if (_type !== 'number') {
-          _type = 'text'
-        }
-      } else if (props.type === 'search') {
+      // if (props.type === 'columns') {
+      //   if (_type !== 'number') {
+      //     _type = 'text'
+      //   }
+      // }
+      if (props.type === 'search') {
         if (_type === 'date' || _type === 'datetime') {
           _type = 'date'
         } else if (_type !== 'select') {
@@ -74,8 +75,11 @@
 
   render() {
     const { card, type } = this.state
+
+    let hasPadding = type === 'search' || type === 'form'
+
     return (
-      <div className={'ant-card ant-card-bordered ' + (card.selected ? 'selected' : '')  + (card.origin ? ' fixed' : '')} >
+      <div className={'ant-card ant-card-bordered ' + (card.selected ? 'selected' : '')  + (card.origin ? ' fixed' : '') + (hasPadding ? ' has-padding' : '')} >
         <div className="base" onClick={this.changeSelect}>
           <CheckOutlined />
           <p title={card.field}>瀛楁锛� <span>{card.field}</span></p>
@@ -88,12 +92,12 @@
             <Radio value="date">date</Radio>
           </Radio.Group> : null
         }
-        {type === 'columns' ?
+        {/* {type === 'columns' ?
           <Radio.Group onChange={this.changeType} value={card.type} disabled={!card.selected || card.origin}>
             <Radio value="text">text</Radio>
             <Radio value="number">number</Radio>
           </Radio.Group> : null
-        }
+        } */}
         {type === 'form' ?
           <Radio.Group onChange={this.changeType} value={card.type} disabled={!card.selected || card.origin}>
             <Radio value="text">text</Radio>
diff --git a/src/templates/sharecomponent/fieldscomponent/editcard/index.scss b/src/templates/sharecomponent/fieldscomponent/editcard/index.scss
index c597452..fc17055 100644
--- a/src/templates/sharecomponent/fieldscomponent/editcard/index.scss
+++ b/src/templates/sharecomponent/fieldscomponent/editcard/index.scss
@@ -4,7 +4,7 @@
   .ant-col {
     padding: 10px;
     .ant-card {
-      padding: 0px 10px 10px;
+      padding: 0px;
       p {
         margin-bottom: 5px;
         overflow: hidden;
@@ -25,10 +25,16 @@
         opacity: 0.4;
       }
       .base {
-        padding-top: 10px;
+        padding: 10px;
         cursor: pointer;
       }
     }
+    .ant-card.has-padding {
+      padding: 0px 10px 10px;
+      .base {
+        padding: 10px 0 0;
+      }
+    }
     .ant-card.selected, .ant-card.fixed {
       border-color: #1890ff;
       box-shadow: 0px 0px 4px #1890ff;
diff --git a/src/templates/sharecomponent/fieldscomponent/index.jsx b/src/templates/sharecomponent/fieldscomponent/index.jsx
index 1c09501..2886fa7 100644
--- a/src/templates/sharecomponent/fieldscomponent/index.jsx
+++ b/src/templates/sharecomponent/fieldscomponent/index.jsx
@@ -58,6 +58,7 @@
             if (res.FDName && res.FDName.length > 0) {
               tabmsg.columns = res.FDName.map(item => {
                 let _type = item.FieldType.toLowerCase()
+                let _datatype = item.FieldType.toLowerCase()
                 let _decimal = 0
                 let _length = 50
                 if (/^nvarchar/.test(_type)) {
@@ -80,6 +81,14 @@
                 } else {
                   _type = 'text'
                 }
+
+                if (/^nvarchar/.test(_datatype)) {
+                  _datatype = _datatype.replace(/^nvarchar/, 'Nvarchar')
+                } else if (/^decimal/.test(_datatype)) {
+                  _datatype = _datatype.replace(/^decimal/, 'Decimal')
+                } else if (/^int/.test(_datatype)) {
+                  _datatype = _datatype.replace(/^int/, 'Int')
+                }
     
                 return {
                   field: item.FieldName || '',
@@ -88,7 +97,7 @@
                   datatype: _type,
                   decimal: _decimal,
                   length: _length,
-                  $datatype: item.FieldType.toLowerCase()
+                  $datatype: _datatype
                 }
               })
             }
@@ -232,7 +241,7 @@
           field: item.field,
           Hide: 'false',
           IsSort: 'true',
-          type: item.type,
+          type: item.type === 'number' ? 'number' : 'text',
           Width: item.type === 'number' ? 80 : 120
         }
 
@@ -240,6 +249,12 @@
           newcard.decimal = item.decimal
         } else {
           newcard.fieldlength = item.length || 50
+        }
+
+        if (item.type === 'date') {
+          newcard.textFormat = 'YYYY-MM-DD'
+        } else if (item.type === 'datetime') {
+          newcard.textFormat = 'YYYY-MM-DD HH:mm:ss'
         }
 
         items.push(newcard)
@@ -257,6 +272,7 @@
           field: item.field,
           datatype: _t
         }
+
         items.unshift(newcard)
         keys.push(item.field.toLowerCase())
       })
diff --git a/src/templates/sharecomponent/searchcomponent/dragsearch/card.jsx b/src/templates/sharecomponent/searchcomponent/dragsearch/card.jsx
index 081c790..56ea667 100644
--- a/src/templates/sharecomponent/searchcomponent/dragsearch/card.jsx
+++ b/src/templates/sharecomponent/searchcomponent/dragsearch/card.jsx
@@ -140,7 +140,7 @@
         <CloseOutlined className="close" onClick={() => delCard(id)} />
       </div>
     } trigger="hover">
-      <div className={'page-card ' + (card.labelShow === 'false' ? 'label-hide ' : '') + type + (card.advanced === 'true' ? ' advanced' : '')} style={{ opacity: opacity}}>
+      <div className={'page-card ' + (card.labelShow === 'false' ? 'label-hide ' : '') + type + (card.advanced === 'true' ? ' advanced' : '') + (card.query === 'false' ? ' no-query' : '')} style={{ opacity: opacity}}>
         <div ref={node => drag(drop(node))} onDoubleClick={() => editCard(id)}>
           <Form.Item
             labelCol={{style: {width: labelwidth + '%'}}}
diff --git a/src/templates/sharecomponent/searchcomponent/index.scss b/src/templates/sharecomponent/searchcomponent/index.scss
index 3b00b21..52dda6d 100644
--- a/src/templates/sharecomponent/searchcomponent/index.scss
+++ b/src/templates/sharecomponent/searchcomponent/index.scss
@@ -104,6 +104,11 @@
       color: orange;
     }
   }
+  .page-card.no-query {
+    .ant-form-explain {
+      color: #13c2c2;
+    }
+  }
   .ant-calendar-picker {
     min-width: 100px!important;
     width: 100%;
diff --git a/src/templates/sharecomponent/settingcomponent/settingform/index.jsx b/src/templates/sharecomponent/settingcomponent/settingform/index.jsx
index c796d48..8c0ab17 100644
--- a/src/templates/sharecomponent/settingcomponent/settingform/index.jsx
+++ b/src/templates/sharecomponent/settingcomponent/settingform/index.jsx
@@ -3,10 +3,10 @@
 import { fromJS } from 'immutable'
 import { Form, notification, Modal, Spin, Tabs, Typography, Popconfirm, Button } from 'antd'
 import { CheckCircleOutlined, StopOutlined, SwapOutlined, DeleteOutlined, BorderOutlined } from '@ant-design/icons'
-import moment from 'moment'
 
 import Api from '@/api'
 import Utils from '@/utils/utils.js'
+import { formatSearch, joinMainSearchkey } from '@/utils/utils-custom.js'
 import SettingUtils from './utils.jsx'
 import asyncComponent from '@/utils/asyncComponent'
 import DataSource from './datasource'
@@ -30,9 +30,8 @@
     formlist: [],
     btnloading: false,
     activeKey: 'setting',
-    search: '',
+    searches: [],
     arr_field: '',
-    regoptions: [],
     setting: null,
     defaultSql: '',
     visible: false,
@@ -78,25 +77,7 @@
       })
     }
 
-    // 鎼滅储鐨剋here鏉′欢
-    let _search = this.formatSearch(search)
-    _search = Utils.joinMainSearchkey(_search)
-
-    _search = _search.replace(/@\$@/ig, '')
-    _search = _search ? 'where ' + _search : ''
-
     let status = fromJS(_setting).toJS()
-    let regoptions = this.getRegOptions(search)
-
-    if (config.urlFields && config.urlFields.length > 0) {
-      config.urlFields.forEach(field => {
-        regoptions.push({
-          key: field,
-          value: '0',
-          type: 'url'
-        })
-      })
-    }
 
     if (window.GLOB.funcs && window.GLOB.funcs.length > 0) {
       window.GLOB.funcs.forEach(m => {
@@ -112,9 +93,8 @@
 
     this.setState({
       setting: _setting,
-      search: _search,
+      searches: formatSearch(search),
       arr_field: arr_field.join(','),
-      regoptions: regoptions, // 鎼滅储鏉′欢锛屾鍒欐浛鎹�
       columns: columns,
       scripts: _scripts,
       status
@@ -123,123 +103,6 @@
 
   componentDidMount () {
     this.props.updRecord(this.state.status)
-  }
-
-  getRegOptions = (searches) => {
-    if (!searches || searches.length === 0) return []
-
-    let options = []
-    let fieldmap = new Map()
-    searches.forEach(search => {
-      let item = {
-        key: search.field,
-        value: '0'
-      }
-
-      if (fieldmap.has(item.key)) {
-        item.key = item.key + '1'
-      }
-
-      fieldmap.set(item.key, true)
-
-      if (search.type === 'group') {
-        options.push({
-          key: search.field,
-          value: '0'
-        })
-        options.push({
-          key: search.datefield,
-          value: '0'
-        })
-        options.push({
-          key: search.datefield + '1',
-          value: '0'
-        })
-        options.push(item)
-      } else if (['datemonth', 'dateweek'].includes(search.type)) {
-        options.push(item)
-        options.push({
-          key: item.key + '1',
-          value: '0'
-        })
-      } else if (search.type === 'daterange') {
-        let _skey = search.field
-        let _ekey = search.field + '1'
-
-        if (/,/.test(search.field)) {
-          _skey = search.field.split(',')[0]
-          _ekey = search.field.split(',')[1]
-        }
-
-        options.push({
-          key: _skey,
-          value: '0'
-        })
-        options.push({
-          key: _ekey,
-          value: '0'
-        })
-      } else if (search.type === 'text' || search.type === 'select') {
-        item.key.split(',').forEach(field => {
-          let cell = JSON.parse(JSON.stringify(item))
-          cell.key = field
-
-          options.push(cell)
-        })
-      } else {
-        options.push(item)
-      }
-    })
-
-    return options
-  }
-
-  /**
-   * @description 鑾峰彇鍏ㄩ儴鎼滅储鏉′欢
-   * @param {Array} searches 鎼滅储鏉′欢鏁扮粍
-   */
-  formatSearch (searches) {
-    if (!searches || searches.length === 0) return []
-
-    let newsearches = []
-    searches.forEach(search => {
-      if (!search.field) return
-      
-      let item = {
-        key: search.field,
-        match: search.match,
-        type: search.type,
-        label: search.label,
-        value: search.initval,
-        required: search.required === 'true'
-      }
-      
-      if (item.type === 'group') {
-        item.key = search.datefield
-        item.type = 'daterange'
-        item.match = 'between'
-        item.value = [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')].join(',')
-
-        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().format('YYYY-MM-DD')
-      } else if (item.type === 'daterange') {
-        item.value = [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')].join(',')
-      } else if (item.type === 'multiselect' || (item.type === 'checkcard' && search.multiple === 'true')) {
-        item.type = 'multi'
-        item.value = '@$@'
-      } else {
-        item.value = '@$@'
-      }
-      newsearches.push(item)
-    })
-    
-    return newsearches
   }
 
   handleConfirm = (trigger) => {
@@ -297,7 +160,8 @@
   }
 
   sqlverify = (_resolve, _reject, type, uscripts) => {
-    const { setting, scripts, arr_field, regoptions, search } = this.state
+    const { config } = this.props
+    const { setting, scripts, arr_field, searches } = this.state
 
     if (setting.interType !== 'system') { // 涓嶄娇鐢ㄧ郴缁熸帴鍙f椂锛屼笉闇�瑕乻ql楠岃瘉
       _resolve()
@@ -316,7 +180,7 @@
     } else if (type === 'scripts' && _scripts.length === 0) {
       _resolve()
     } else { // type 涓� submit 銆� verify 锛屼互鍙婂叾浠栭渶瑕侀獙璇佺殑鍦烘櫙
-      let r = SettingUtils.getDebugSql(setting, _scripts, arr_field, regoptions, search)
+      let r = SettingUtils.getDebugSql(setting, _scripts, arr_field, searches, config.urlFields)
 
       if (r.errors) {
         notification.warning({
@@ -341,7 +205,7 @@
 
   // 鏍囩鍒囨崲
   changeTab = (val) => {
-    const { activeKey, search, arr_field } = this.state
+    const { activeKey, searches, arr_field } = this.state
 
     if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) {
       notification.warning({
@@ -357,11 +221,13 @@
         if (res.dataresource) {
           let _dataresource = res.dataresource
 
+          let _search = joinMainSearchkey(searches)
+
           if (/\s/.test(_dataresource)) {
             _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} ${_search}) tmptable where rows > (@pageSize@ * (@pageIndex@ - 1)) order by tmptable.rows`
         }
         
         this.setState({
@@ -517,7 +383,7 @@
               scripts={scripts}
               defaultSql={defaultSql}
               urlFields={config.urlFields}
-              searches={this.props.search}
+              searches={this.state.searches}
               scriptsChange={this.scriptsChange}
               scriptsUpdate={this.scriptsUpdate}
               wrappedComponentRef={(inst) => this.scriptsForm = inst}
diff --git a/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx b/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
deleted file mode 100644
index 42ee457..0000000
--- a/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
+++ /dev/null
@@ -1,500 +0,0 @@
-import React, {Component} from 'react'
-import PropTypes from 'prop-types'
-import { fromJS } from 'immutable'
-import { Form, Row, Col, Button, notification, Select, Popconfirm, Typography, Modal, Radio, Tooltip } from 'antd'
-import { StopOutlined, CheckCircleOutlined, EditOutlined, SwapOutlined, DeleteOutlined } from '@ant-design/icons'
-import moment from 'moment'
-
-import Utils from '@/utils/utils.js'
-import Api from '@/api'
-import SettingUtils from '../utils'
-import CodeMirror from '@/templates/zshare/codemirror'
-import asyncComponent from '@/utils/asyncComponent'
-import './index.scss'
-
-const { Paragraph } = Typography
-const EditTable = asyncComponent(() => import('@/templates/zshare/editTable'))
-
-class CustomForm extends Component {
-  static propTpyes = {
-    setting: PropTypes.object,      // 璁剧疆
-    scripts: PropTypes.array,       // 鑷畾涔夎剼鏈垪琛�
-    searches: PropTypes.array,      // 鎼滅储鏉′欢
-    urlFields: PropTypes.any,       // url鍙橀噺
-    regoptions: PropTypes.any,      // 姝e垯鏇挎崲
-    scriptsChange: PropTypes.func,  // 鑷畾涔夎剼鏈垏鎹㈡椂楠岃瘉
-    scriptsUpdate: PropTypes.func   // 琛ㄥ崟
-  }
-
-  state = {
-    wrapId: Utils.getuuid(),
-    editItem: null,
-    loading: false,
-    usefulFields: '',
-    urlFields: '',
-    systemScripts: [],
-    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: '13%',
-        render: (text, record) => {
-          if (record.position === 'front') {
-            return <span style={{color: '#26C281'}}>sql鍓�</span>
-          } else {
-            return <span style={{color: '#1890ff'}}>sql鍚�</span>
-          }
-        }
-      },
-      {
-        title: '鐘舵��',
-        dataIndex: 'status',
-        width: '12%',
-        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: '15%',
-        dataIndex: 'operation',
-        render: (text, record) =>
-          (<div style={{textAlign: 'center'}}>
-            <span className="operation-btn" title="缂栬緫" onClick={() => this.handleEdit(record)} style={{color: '#1890ff'}}><EditOutlined /></span>
-            <span className="operation-btn" title="鐘舵�佸垏鎹�" onClick={() => this.handleStatus(record)} style={{color: '#8E44AD'}}><SwapOutlined /></span>
-            <Popconfirm
-              overlayClassName="popover-confirm"
-              title="纭畾鍒犻櫎鍚�?"
-              onConfirm={() => this.handleDelete(record)
-            }>
-              <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span>
-            </Popconfirm>
-          </div>)
-      }
-    ]
-  }
-
-  UNSAFE_componentWillMount() {
-    const { searches, scripts, urlFields } = this.props
-
-    let _usefulFields = []
-    let scriptsColumns = fromJS(this.state.scriptsColumns).toJS()
-    let _urlFields = ''
-
-    if (searches) {
-      searches.forEach(item => {
-        if (!item.field) return
-        if (item.type === 'group') {
-          _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.replace(/,/ig, ', '))
-        }
-      })
-
-      _urlFields = urlFields ? urlFields.join(', ') : ''
-      _usefulFields = _usefulFields.join(', ')
-      scriptsColumns = scriptsColumns.filter(item => {
-        if (item.dataIndex === 'sql') {
-          item.width = '70%'
-        }
-        return item.dataIndex !== 'position'
-      })
-    } else {
-      _usefulFields = null
-    }
-
-    this.setState({
-      urlFields: _urlFields,
-      usefulFields: _usefulFields,
-      scripts: fromJS(scripts).toJS(),
-      scriptsColumns
-    })
-  }
-
-  componentDidMount () {
-    this.getsysScript()
-  }
-
-  getsysScript = () => {
-    if (sessionStorage.getItem('mk_sys_scripts')) {
-      this.setState({
-        systemScripts: JSON.parse(sessionStorage.getItem('mk_sys_scripts'))
-      })
-      return
-    }
-    
-    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)
-
-    let _sParam = {
-      func: 'sPC_Get_SelectedList',
-      LText: _scriptSql,
-      obj_name: 'data',
-      arr_field: 'funcname,longparam'
-    }
-    
-    _sParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-    _sParam.secretkey = Utils.encrypt(_sParam.LText, _sParam.timestamp)
-    _sParam.open_key = Utils.encryptOpenKey(_sParam.secretkey, _sParam.timestamp) // 浜戠鏁版嵁楠岃瘉
-    
-    Api.getCloudConfig(_sParam).then(res => {
-      if (res.status) {
-        let _scripts = res.data.map(item => {
-          return {
-            name: item.funcname,
-            value: window.decodeURIComponent(window.atob(item.longparam))
-          }
-        })
-
-        sessionStorage.setItem('mk_sys_scripts', JSON.stringify(_scripts))
-
-        this.setState({
-          systemScripts: _scripts
-        })
-      } else {
-        notification.warning({
-          top: 92,
-          message: res.message,
-          duration: 5
-        })
-      }
-    })
-  }
-
-  handleCancel = () => {
-    this.setState({
-      editItem: null
-    })
-    this.props.form.setFieldsValue({
-      sql: ''
-    })
-  }
-
-  handleConfirm = () => {
-    const { scripts, editItem } = this.state
-    
-    let _sql = this.props.form.getFieldValue('sql')
-
-    if (!_sql) {
-      notification.warning({
-        top: 92,
-        message: '璇峰~鍐欒嚜瀹氫箟鑴氭湰锛�',
-        duration: 5
-      })
-      return
-    } else if (/^\s+$/.test(_sql)) {
-      notification.warning({
-        top: 92,
-        message: '鑷畾涔夎剼鏈笉鍙负绌猴紒',
-        duration: 5
-      })
-      return
-    }
-
-    let values = {
-      uuid: editItem && editItem.uuid ? editItem.uuid : Utils.getuuid(),
-      sql: _sql,
-    }
-
-    if (this.props.form.getFieldValue('position')) {
-      values.position = this.props.form.getFieldValue('position')
-    }
-
-    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
-    } 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 _scripts = fromJS(scripts).toJS()
-
-    if (editItem && editItem.uuid) {
-      _scripts = _scripts.map(item => {
-        if (item.uuid === values.uuid) {
-          return values
-        } else {
-          return item
-        }
-      })
-    } else {
-      _scripts.push(values)
-    }
-
-    let sql = SettingUtils.getCustomDebugSql(_scripts, this.props.regoptions)
-    sql = sql.replace(/@(BID|ID|LoginUID|SessionUid|UserID|Appkey|time_id)@/ig, `'1949-10-01 15:00:00'`)
-    
-    this.setState({loading: true})
-    Api.sDebug(sql).then(result => {
-      if (result.status || result.ErrCode === '-2') {
-        this.setState({
-          loading: false,
-          scripts: _scripts,
-          editItem: null
-        })
-  
-        this.props.scriptsUpdate(_scripts)
-        this.props.form.setFieldsValue({
-          sql: ''
-        })
-      } else {
-        this.setState({loading: false})
-        Modal.error({
-          title: result.message
-        })
-      }
-    })
-  }
-
-  selectScript = (value, option) => {
-    if (!value || !option) return
-    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
-    })
-  }
-
-  handleEdit = (record) => {
-    const { usefulFields } = this.state
-    this.setState({
-      editItem: record
-    })
-
-    if (usefulFields) {
-      this.props.form.setFieldsValue({
-        sql: record.sql
-      })
-    } else {
-      this.props.form.setFieldsValue({
-        sql: record.sql,
-        position: record.position || 'back'
-      })
-    }
-
-    this.scrolltop()
-  }
-
-  scrolltop = () => {
-    let node = document.getElementById(this.state.wrapId).parentNode
-
-    if (node && node.scrollTop) {
-      let inter = Math.ceil(node.scrollTop / 10)
-
-      let timer = setInterval(() => {
-        if (node.scrollTop - inter > 0) {
-          node.scrollTop = node.scrollTop - inter
-        } else {
-          node.scrollTop = 0
-          clearInterval(timer)
-        }
-      }, 10)
-    }
-  }
-
-  changeScripts = (scripts) => {
-    this.setState({scripts})
-    this.props.scriptsUpdate(scripts)
-  }
-
-  handleStatus = (record) => {
-    let scripts = fromJS(this.state.scripts).toJS()
-    record.status = record.status === 'false' ? 'true' : 'false'
-
-    scripts = scripts.map(item => {
-      if (item.uuid === record.uuid) {
-        return record
-      } else {
-        return item
-      }
-    })
-
-    this.setState({scripts})
-    this.props.scriptsUpdate(scripts)
-  }
-
-  handleDelete = (record) => {
-    let scripts = fromJS(this.state.scripts).toJS()
-    scripts = scripts.filter(item => item.uuid !== record.uuid)
-
-    this.setState({ scripts })
-    this.props.scriptsUpdate(scripts)
-  }
-
-  render() {
-    const { setting, scripts } = this.props
-    const { getFieldDecorator } = this.props.form
-    const { usefulFields, scriptsColumns, systemScripts, urlFields, wrapId } = this.state
-    const formItemLayout = {
-      labelCol: {
-        xs: { span: 24 },
-        sm: { span: 8 }
-      },
-      wrapperCol: {
-        xs: { span: 24 },
-        sm: { span: 16 }
-      }
-    }
-
-    return (
-      <div className="modal-menu-setting-script" id={wrapId}>
-        <Form {...formItemLayout}>
-          <Row gutter={24}>
-            <Col span={4}>
-              <Form.Item labelCol={{span: 17}} wrapperCol={{span: 7}} label={'鍥炶皟琛ㄥ悕'} style={{whiteSpace: 'nowrap', margin: 0}}>
-                {setting.cbTable}
-              </Form.Item>
-            </Col>
-            <Col span={20}>
-              <Form.Item labelCol={{span: 4}} wrapperCol={{span: 20}} label={'鎶ラ敊瀛楁'} style={{margin: 0}}>
-                ErrorCode锛堝鍔犲悗缂�NT琛ㄧず鏁版嵁涓嶅洖婊氾紝濡侲NT銆丯NT銆丗NT銆丯MNT銆丆NT銆�-2NT锛�, retmsg
-              </Form.Item>
-            </Col>
-            <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, time_id</span></Tooltip>,&nbsp;
-                <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 ? <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'鎼滅储鏉′欢鍙橀噺锛岃鎸夌収@xxx@鏍煎紡浣跨敤銆�'}>, {usefulFields}</Tooltip> : ''}
-                {urlFields ?<Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'url鍙橀噺锛岃鎸夌収@xxx@鏍煎紡浣跨敤銆�'}>, <span style={{color: '#13c2c2'}}>{urlFields}</span></Tooltip> : ''}
-              </Form.Item>
-            </Col>
-            {!usefulFields ? <Col span={8} style={{whiteSpace: 'nowrap'}}>
-              <Form.Item style={{marginBottom: 0}} label="鎵ц浣嶇疆">
-                {getFieldDecorator('position', {
-                  initialValue: 'front'
-                })(
-                  <Radio.Group>
-                    <Radio value="front">sql鍓�</Radio>
-                    <Radio value="back">sql鍚�</Radio>
-                  </Radio.Group>
-                )}
-              </Form.Item>
-            </Col> : null}
-            <Col span={10} className="quick-add">
-              <Form.Item label={'蹇嵎娣诲姞'} style={{marginBottom: 0}}>
-                <Select
-                  allowClear
-                  showSearch
-                  filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
-                  onChange={this.selectScript}
-                >
-                  {!usefulFields ? <Select.Option key="default" value={`declare @${setting.cbTable} table (mk_api_key nvarchar(100),mk_level nvarchar(10),mk_id nvarchar(50),mk_bid nvarchar(50))\n/*@${setting.cbTable}_data table (mk_level nvarchar(10),mk_id nvarchar(50),mk_bid nvarchar(50))*/`}>榛樿sql</Select.Option> : null}
-                  {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: ''
-                })(<CodeMirror />)}
-              </Form.Item>
-            </Col>
-          </Row>
-        </Form>
-        <EditTable data={scripts} actions={['move']} columns={scriptsColumns} onChange={this.changeScripts}/>
-      </div>
-    )
-  }
-}
-
-export default Form.create()(CustomForm)
\ No newline at end of file
diff --git a/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.scss b/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.scss
deleted file mode 100644
index 945809b..0000000
--- a/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.scss
+++ /dev/null
@@ -1,45 +0,0 @@
-.modal-menu-setting-script {
-  .sqlfield {
-    .ant-form-item {
-      margin-bottom: 5px;
-    }
-    .ant-form-item-control {
-      line-height: 24px;
-    }
-    .ant-form-item-label {
-      line-height: 25px;
-    }
-    .ant-form-item-children {
-      line-height: 22px;
-    }
-    .ant-col-sm-8 {
-      width: 10.5%;
-    }
-    .ant-col-sm-16 {
-      width: 89.5%;
-    }
-  }
-  .quick-add {
-    .ant-col-sm-8 {
-      width: 26%;
-    }
-    .ant-col-sm-16 {
-      width: 74%;
-    }
-  }
-  .sql {
-    .ant-col-sm-8 {
-      width: 10.5%;
-    }
-    .ant-col-sm-16 {
-      width: 89.5%;
-      padding-top: 4px;
-    }
-    .CodeMirror {
-      height: 350px;
-    }
-  }
-  div.ant-typography {
-    margin-bottom: 0;
-  }
-}
\ No newline at end of file
diff --git a/src/templates/sharecomponent/settingcomponent/settingform/utils.jsx b/src/templates/sharecomponent/settingcomponent/settingform/utils.jsx
index aca603b..c728c2b 100644
--- a/src/templates/sharecomponent/settingcomponent/settingform/utils.jsx
+++ b/src/templates/sharecomponent/settingcomponent/settingform/utils.jsx
@@ -1,13 +1,11 @@
 
+import { getSearchRegs, joinMainSearchkey } from '@/utils/utils-custom.js'
+
 export default class SettingUtils {
   /**
    * @description 鐢熸垚椤甸潰鏌ヨ璇彞
-   * @return {String}  arr_field     鏄剧ず鍒楀瓧娈�
-   * @return {String}  search        鎼滅储鏉′欢
-   * @return {Object}  setting       椤甸潰璁剧疆
-   * @return {Array}   regoptions    鎼滅储鏉′欢姝e垯鏇挎崲
    */
-  static getDebugSql (setting, scripts, arr_field, regoptions, search) {
+  static getDebugSql (setting, scripts, arr_field, searches = [], urlFields) {
     let sql = ''
     let _dataresource = setting.dataresource || ''
     let _customScript = ''
@@ -53,24 +51,29 @@
       _customScript = _customScript.replace(/@db@/ig, window.GLOB.externalDatabase)
     }
     
+    let _regoptions = getSearchRegs(searches)
+
+    let _search = joinMainSearchkey(searches)
+
     // 姝e垯鏇挎崲
-    let _regoptions = regoptions.map(item => {
-      return {
-        reg: new RegExp('@' + item.key + '@', 'ig'),
-        value: `'0'`,
-        type: item.type || ''
-      }
-    })
+    if (urlFields && urlFields.length > 0) {
+      urlFields.forEach(field => {
+        _regoptions.push({
+          reg: new RegExp('@' + field + '@', 'ig'),
+          value: `'0'`
+        })
+      })
+    }
 
     _regoptions.push({
       reg: new RegExp('@userName@', 'ig'),
-      value: `''`
+      value: `'mk'`
     }, {
       reg: new RegExp('@fullName@', 'ig'),
-      value: `''`
+      value: `'mk'`
     }, {
       reg: new RegExp('@orderBy@', 'ig'),
-      value: setting.order
+      value: setting.order || ''
     }, {
       reg: new RegExp('@pageSize@', 'ig'),
       value: 10
@@ -79,24 +82,13 @@
       value: 1
     })
 
-    let _search = search
+    _regoptions.forEach(item => {
+      _dataresource = _dataresource.replace(item.reg, item.value)
+      _customScript = _customScript.replace(item.reg, item.value)
+    })
 
     if (setting.queryType === 'statistics' && _dataresource) {
-      _regoptions.forEach(item => {
-        _dataresource = _dataresource.replace(item.reg, item.value)
-      })
       _search = ''
-    } else if (_dataresource) {
-      _regoptions.forEach(item => {
-        if (item.type !== 'url') return
-        _dataresource = _dataresource.replace(item.reg, item.value)
-      })
-    }
-
-    if (_customScript) {
-      _regoptions.forEach(item => {
-        _customScript = _customScript.replace(item.reg, item.value)
-      })
     }
 
     // 鏁版嵁婧愬鐞�, 瀛樺湪鏄剧ず鍒楁椂 
@@ -139,62 +131,5 @@
     }
 
     return { sql, errors: errors.join('锛�') }
-  }
-
-  /**
-   * @description 鐢熸垚鍓嶇疆鎴栧悗缃鍙�
-   * @return {String}  scripts       鑴氭湰
-   * @return {Array}   regoptions    鎼滅储鏉′欢姝e垯鏇挎崲
-   */
-  static getCustomDebugSql (scripts, regoptions) {
-    let sql = ''
-    let _customScript = ''
-
-    scripts.forEach(script => {
-      if (script.status === 'false') return
-
-      _customScript += `
-      ${script.sql}
-      `
-    })
-
-    if (_customScript) {
-      _customScript = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@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) select @ErrorCode='',@retmsg =''
-        ${_customScript}
-      `
-    }
-
-    if (window.GLOB.funcs && window.GLOB.funcs.length > 0) {
-      window.GLOB.funcs.forEach(item => {
-        let reg = new RegExp('\\$ex@' + item.func_code + '@ex\\$', 'ig')
-        _customScript = _customScript.replace(reg, `/*$ex@${item.func_code}-begin*/\n${item.key_sql}\n/*@ex$-end*/`)
-      })
-    }
-
-    _customScript = _customScript.replace(/@\$|\$@/ig, '')
-    _customScript = _customScript.replace(/@userName@|@fullName@/ig, `''`)
-    
-    // 姝e垯鏇挎崲
-    if (regoptions) {
-      let _regoptions = regoptions.map(item => {
-        return {
-          reg: new RegExp('@' + item.key + '@', 'ig'),
-          value: `'0'`
-        }
-      })
-      _regoptions.forEach(item => {
-        _customScript = _customScript.replace(item.reg, item.value)
-      })
-    }
-
-    if (_customScript) {
-      sql = `${_customScript}
-        aaa:
-        if @ErrorCode!=''
-          insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select '1949-10-01 15:00:00',@ErrorCode, @retmsg,'1949-10-01 15:00:00'
-      `
-    }
-
-    return sql
   }
 }
\ No newline at end of file
diff --git a/src/templates/sharecomponent/tablecomponent/index.jsx b/src/templates/sharecomponent/tablecomponent/index.jsx
index 69e7a3b..98f43d5 100644
--- a/src/templates/sharecomponent/tablecomponent/index.jsx
+++ b/src/templates/sharecomponent/tablecomponent/index.jsx
@@ -51,6 +51,8 @@
       this.onTableChange(table)
     } else if (type === 'del') {
       this.deleteTable(table)
+    } else if (type === 'init' && window.GLOB.publicTables.length === 0) {
+      this.onTableChange(table)
     }
   }
 
@@ -102,7 +104,7 @@
 
     let _table = tables.filter(item => item.TbName === value)[0]
 
-    if (selectedTables.findIndex(cell => cell.TbName === value) > -1) return
+    if (!_table || selectedTables.findIndex(cell => cell.TbName === value) > -1) return
 
     let _tables = [...selectedTables, _table]
 
diff --git a/src/templates/zshare/customscript/index.jsx b/src/templates/zshare/customscript/index.jsx
index 662e012..80db92a 100644
--- a/src/templates/zshare/customscript/index.jsx
+++ b/src/templates/zshare/customscript/index.jsx
@@ -94,18 +94,23 @@
 
     let _usefulFields = []
     searches.forEach(item => {
-      if (!item.field) return
-      if (item.type === 'group') {
-        _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')
+      if (['dateweek', 'datemonth'].includes(item.type)) {
+        _usefulFields.push(item.key)
+        _usefulFields.push(item.key + '1')
+      } else if (item.type === 'daterange') {
+        let _skey = item.key
+        let _ekey = item.key + '1'
+
+        if (/,/.test(item.key)) {
+          _skey = item.key.split(',')[0]
+          _ekey = item.key.split(',')[1]
+        }
+        _usefulFields.push(_skey)
+        _usefulFields.push(_ekey)
+      } else if (item.type === 'date' && _usefulFields.includes(item.key)) {
+        _usefulFields.push(item.key + '1')
       } else {
-        _usefulFields.push(item.field.replace(/,/ig, ', '))
+        _usefulFields.push(item.key.replace(/,/ig, ', '))
       }
     })
 
@@ -238,6 +243,25 @@
         duration: 5
       })
       return
+    } else if (/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig.test(values.sql)) {
+      let list = values.sql.match(/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig)
+      let errors = []
+      list.forEach(str => {
+        str = str.replace(/^\s/, '')
+        let strs = str.match(/(\s|=)[a-z0-9_]+\./ig)
+        if (strs.length === 2 && (strs[0].replace(/\s|\./g, '') === strs[1].replace(/\s|\./g, ''))) {
+          errors.push(str)
+        }
+      })
+
+      if (errors.length > 0) {
+        notification.warning({
+          top: 92,
+          message: '涓嶅彲浣跨敤鍚屼竴涓〃瀛楁杩涜鍏宠仈锛�' + errors.join('銆�'),
+          duration: 5
+        })
+        return
+      }
     }
 
     let error = Utils.verifySql(values.sql, 'customscript')
diff --git a/src/templates/zshare/formconfig.jsx b/src/templates/zshare/formconfig.jsx
index 15ef63d..752c7ec 100644
--- a/src/templates/zshare/formconfig.jsx
+++ b/src/templates/zshare/formconfig.jsx
@@ -448,7 +448,7 @@
       type: 'text',
       key: 'initval',
       label: '鍒濆鍊�',
-      tooltip: '绫诲瀷涓轰笅鎷夎彍鍗曟椂锛屽垵濮嬪�煎簲涓烘暟鎹殑Value鍊硷紙浣跨敤鏁版嵁婧愭椂锛屽簲涓恒�婂�悸峰瓧娈点�嬬殑鍊硷級;绫诲瀷涓烘暟鍊硷紙鍖洪棿锛夋椂锛屽垵濮嬪�间娇鐢ㄩ�楀彿鎷兼帴锛屼緥濡� 3,10',
+      tooltip: '绫诲瀷涓轰笅鎷夎彍鍗曟椂锛屽垵濮嬪�煎簲涓烘暟鎹殑Value鍊硷紙浣跨敤鏁版嵁婧愭椂锛屽簲涓恒�婂�悸峰瓧娈点�嬬殑鍊硷級;绫诲瀷涓烘暟鍊硷紙鍖洪棿锛夋椂锛屽垵濮嬪�间娇鐢ㄩ�楀彿鎷兼帴锛屼緥濡� 3,10锛涙枃鏈笌涓嬫媺鑿滃崟涓彲浣跨敤@username@銆丂fullName@',
       initVal: card.initval,
       required: false
     },
@@ -4094,9 +4094,10 @@
       type: 'multiselect',
       key: 'linkSubField',
       label: '濉厖琛ㄥ崟',
-      tooltip: '鍦ㄥ垏鎹㈤�夐」鏃朵細鎶婁俊鎭嚜鍔ㄥ~鍏ュ叧鑱旂殑琛ㄥ崟锛堟枃鏈垨鏁板瓧琛ㄥ崟锛変腑锛屽紑鍏充細灏嗘彁绀烘枃鏈~鍏ユ琛ㄥ崟銆�',
+      tooltip: '鍦ㄥ垏鎹㈤�夐」鏃朵細鎶婁俊鎭嚜鍔ㄥ~鍏ュ叧鑱旂殑琛ㄥ崟锛堟枃鏈垨鏁板瓧琛ㄥ崟锛変腑锛屽紑鍏充細灏嗘彁绀烘枃鏈~鍏ユ琛ㄥ崟锛屾枃浠朵笂浼犱細灏嗗師鏂囦欢鍚嶅~鍏ユ琛ㄥ崟銆�',
       initVal: card.linkSubField || [],
-      options: inputfields
+      options: inputfields,
+      allowClear: true
     },
     // {
     //   type: 'number',
diff --git a/src/templates/zshare/modalform/index.jsx b/src/templates/zshare/modalform/index.jsx
index 42a2cb0..be0389c 100644
--- a/src/templates/zshare/modalform/index.jsx
+++ b/src/templates/zshare/modalform/index.jsx
@@ -27,7 +27,7 @@
   checkcard: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'span', 'labelwidth', 'display', 'tooltip', 'extra', 'place', 'width', 'multiple', 'splitline', 'marginTop', 'marginBottom'],
   multiselect: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'fieldlength', 'span', 'labelwidth', 'tooltip', 'extra', 'marginTop', 'marginBottom', 'dropdown'],
   link: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'declare', 'setAll', 'linkField', 'linkSubField', 'span', 'place', 'labelwidth', 'tooltip', 'extra', 'emptyText', 'enter', 'splitline', 'dropdown', 'marginTop', 'marginBottom', 'pickerMode'],
-  fileupload: ['readonly', 'required', 'hidden', 'readin', 'fieldlength', 'maxfile', 'fileType', 'span', 'labelwidth', 'tooltip', 'extra', 'compress', 'miniSet', 'splitline', 'marginTop', 'marginBottom', 'maxSize'],
+  fileupload: ['readonly', 'required', 'hidden', 'readin', 'fieldlength', 'maxfile', 'fileType', 'span', 'labelwidth', 'linkSubField', 'tooltip', 'extra', 'compress', 'miniSet', 'splitline', 'marginTop', 'marginBottom', 'maxSize'],
   switch: ['initval', 'openVal', 'closeVal', 'openText', 'closeText', 'readonly', 'hidden', 'readin', 'span', 'labelwidth', 'linkSubField', 'tooltip', 'extra', 'splitline', 'marginTop', 'marginBottom'],
   check: ['initval', 'openVal', 'closeVal', 'readonly', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra', 'splitline', 'marginTop', 'marginBottom', 'checkTip'],
   date: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra', 'declareType', 'mode', 'splitline', 'place', 'marginTop', 'marginBottom', 'minDate', 'maxDate', 'precision'],
diff --git a/src/templates/zshare/verifycard/callbackcustomscript/index.jsx b/src/templates/zshare/verifycard/callbackcustomscript/index.jsx
index 8b6cf31..002b1da 100644
--- a/src/templates/zshare/verifycard/callbackcustomscript/index.jsx
+++ b/src/templates/zshare/verifycard/callbackcustomscript/index.jsx
@@ -78,6 +78,25 @@
             duration: 5
           })
           return
+        } else if (/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig.test(values.sql)) {
+          let list = values.sql.match(/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig)
+          let errors = []
+          list.forEach(str => {
+            str = str.replace(/^\s/, '')
+            let strs = str.match(/(\s|=)[a-z0-9_]+\./ig)
+            if (strs.length === 2 && (strs[0].replace(/\s|\./g, '') === strs[1].replace(/\s|\./g, ''))) {
+              errors.push(str)
+            }
+          })
+
+          if (errors.length > 0) {
+            notification.warning({
+              top: 92,
+              message: '涓嶅彲浣跨敤鍚屼竴涓〃瀛楁杩涜鍏宠仈锛�' + errors.join('銆�'),
+              duration: 5
+            })
+            return
+          }
         }
 
         let error = Utils.verifySql(values.sql, 'customscript')
diff --git a/src/templates/zshare/verifycard/customform/index.jsx b/src/templates/zshare/verifycard/customform/index.jsx
index f345f99..5b9ec40 100644
--- a/src/templates/zshare/verifycard/customform/index.jsx
+++ b/src/templates/zshare/verifycard/customform/index.jsx
@@ -96,6 +96,25 @@
             duration: 5
           })
           return
+        } else if (/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig.test(values.sql)) {
+          let list = values.sql.match(/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig)
+          let errors = []
+          list.forEach(str => {
+            str = str.replace(/^\s/, '')
+            let strs = str.match(/(\s|=)[a-z0-9_]+\./ig)
+            if (strs.length === 2 && (strs[0].replace(/\s|\./g, '') === strs[1].replace(/\s|\./g, ''))) {
+              errors.push(str)
+            }
+          })
+
+          if (errors.length > 0) {
+            notification.warning({
+              top: 92,
+              message: '涓嶅彲浣跨敤鍚屼竴涓〃瀛楁杩涜鍏宠仈锛�' + errors.join('銆�'),
+              duration: 5
+            })
+            return
+          }
         }
 
         let error = Utils.verifySql(values.sql)
diff --git a/src/templates/zshare/verifycard/customscript/index.jsx b/src/templates/zshare/verifycard/customscript/index.jsx
index bf078be..42c568b 100644
--- a/src/templates/zshare/verifycard/customscript/index.jsx
+++ b/src/templates/zshare/verifycard/customscript/index.jsx
@@ -44,7 +44,7 @@
   }
 
   handleConfirm = () => {
-    const { type, workFlow } = this.props
+    const { type, workFlow, flowType } = this.props
     const { editItem, skip } = this.state
     // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
     this.props.form.validateFieldsAndScroll((err, values) => {
@@ -108,6 +108,25 @@
             duration: 5
           })
           return
+        } else if (/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig.test(values.sql)) {
+          let list = values.sql.match(/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig)
+          let errors = []
+          list.forEach(str => {
+            str = str.replace(/^\s/, '')
+            let strs = str.match(/(\s|=)[a-z0-9_]+\./ig)
+            if (strs.length === 2 && (strs[0].replace(/\s|\./g, '') === strs[1].replace(/\s|\./g, ''))) {
+              errors.push(str)
+            }
+          })
+
+          if (errors.length > 0) {
+            notification.warning({
+              top: 92,
+              message: '涓嶅彲浣跨敤鍚屼竴涓〃瀛楁杩涜鍏宠仈锛�' + errors.join('銆�'),
+              duration: 5
+            })
+            return
+          }
         }
 
         let error = Utils.verifySql(values.sql, 'customscript')
@@ -185,14 +204,22 @@
         sql = sql.replace(/@(BID|ID|LoginUID|SessionUid|UserID|Appkey|time_id|datam|typename)@/ig, `'1949-10-01 15:00:00'`)
 
         if (window.GLOB.process && workFlow === 'true') {
-          sql = sql.replace(/@works_flow_code@/ig, `'1949-10-01 15:00:00'`)
-          sql = sql.replace(/@works_flow_name@/ig, `'1949-10-01 15:00:00'`)
-          sql = sql.replace(/@works_flow_param@/ig, `'1949-10-01 15:00:00'`)
-          sql = sql.replace(/@works_flow_detail_id@/ig, `'1949-10-01 15:00:00'`)
-          sql = sql.replace(/@status@/ig, `'1949-10-01 15:00:00'`)
-          sql = sql.replace(/@statusname@/ig, `'1949-10-01 15:00:00'`)
-          sql = sql.replace(/@work_group@/ig, `'1949-10-01 15:00:00'`)
-          sql = sql.replace(/@work_grade@/ig, `'1949-10-01 15:00:00'`)
+          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, `'寮�濮�'`)
+          sql = sql.replace(/@check_type@/ig, `'瀹℃牳'`)
+          sql = sql.replace(/@notice_type@/ig, `'鎶勯��'`)
+
+          if (flowType !== 'start') {
+            sql = sql.replace(/@check_userids@/ig, `'checkuserids'`)
+            sql = sql.replace(/@notice_userids@/ig, `'noticeuserids'`)
+          }
         }
         
         if (skip) {
@@ -258,15 +285,34 @@
 
     if (value === 'flowSql') {
       if (flowType === 'start') {
-        value = `insert into s_my_works_flow (works_flow_id,works_flow_code,works_flow_name,works_flow_param,work_group,works_flow_detail_id,work_grade,bid,createuserid,CreateUser,CreateStaff)
-        select @ID@,@works_flow_code@,@works_flow_name@,@works_flow_param@,@work_group@,@works_flow_detail_id@,@work_grade@,@bid@,@UserID@,@UserName,@FullName
-        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)
-        select @works_flow_id@,@works_flow_code@,@works_flow_name@ ,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@`
+        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 @ID@,@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@
+        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,upid)
+        select @ID@,@works_flow_code@,@works_flow_name@ ,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@,@time_id@
+        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 @ID@,@works_flow_code@,@works_flow_detail_id@,@userid@,@start_type@,@userid@,@UserName,@FullName,@time_id@`
       } else {
-        value = `insert into s_my_works_flow (works_flow_id,works_flow_code,works_flow_name,works_flow_param,work_group,works_flow_detail_id,work_grade,bid,createuserid,CreateUser,CreateStaff)
-        select @ID@,@works_flow_code@,@works_flow_name@,@works_flow_param@,@work_group@,@works_flow_detail_id@,@work_grade@,@bid@,@UserID@,@UserName,@FullName
-        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)
-        select @works_flow_id@,@works_flow_code@,@works_flow_name@,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@`
+        value = `update s_my_works_flow set status=@status@,statusname=@statusname@,works_flow_param=@works_flow_param@,works_flow_detail_id=@works_flow_detail_id@,modifydate=getdate(),modifyuserid=@userid@,modifyuser=@username,modifystaff=@fullname
+        where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0
+        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,upid)
+        select @ID@,@works_flow_code@,@works_flow_name@ ,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@,@time_id@
+        if @check_userids@ != ''
+        begin
+              delete s_my_works_flow_role where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0
+              insert into s_my_works_flow_role (works_flow_id,works_flow_code,userid,works_flow_detail_id,createuserid,CreateUser,CreateStaff,upid)
+              select @ID@,@works_flow_code@,ID,@works_flow_detail_id@,@userid@,@UserName,@FullName,@time_id@ from dbo.SplitComma(@check_userids@)
+              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 @ID@,@works_flow_code@,@works_flow_detail_id@,ID,@check_type@,@userid@,@UserName,@FullName,@time_id@ from dbo.SplitComma(@check_userids@)
+        end
+        if @notice_userids@ != ''
+        begin
+              delete n
+              from (select * from s_my_works_flow_notice where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0) n
+              inner join (select ID from dbo.SplitComma(@notice_userids@)) s
+              on n.userid = s.id
+              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 @ID@,@works_flow_code@,@works_flow_detail_id@,ID,@notice_type@,@userid@,@UserName,@FullName,@time_id@ from dbo.SplitComma(@notice_userids@)
+        end`
       }
 
       value = value.replace(/\n\s{8}/g, '\n')
@@ -321,6 +367,7 @@
               <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, mk_deleted</span></Tooltip>,&nbsp;
               <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'绯荤粺鍙橀噺锛岀郴缁熶細瀹氫箟鍙橀噺骞跺湪鍗曞彿鐢熸垚鎴栧垱寤哄嚟璇佹椂浣跨敤銆�'}><span style={{color: '#13c2c2'}}>BillCode, BVoucher, FIBVoucherDate, FiYear, ModularDetailCode</span></Tooltip>
               {usefulfields ? <span>, {usefulfields}</span> : ''}
+              {window.GLOB.process && workFlow === 'true' ? <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'宸ヤ綔娴佸彉閲忥紝璇锋寜鐓xxx@鏍煎紡浣跨敤銆傛敞锛歝heck_userids銆乶otice_userids 鍦ㄥ鎵规垨椹冲洖鏃舵湁鏁堛��'}>,<span style={{color: 'purple'}}> works_flow_code, works_flow_name, works_flow_param, works_flow_detail_id, status, statusname, work_group, work_grade, start_type, check_type, notice_type, check_userids, notice_userids</span></Tooltip> : null}
             </Form.Item>
           </Col> : null}
           {!_type ? <Col span={8} style={{whiteSpace: 'nowrap'}}>
diff --git a/src/utils/utils-custom.js b/src/utils/utils-custom.js
index e6dd77b..59816a5 100644
--- a/src/utils/utils-custom.js
+++ b/src/utils/utils-custom.js
@@ -932,6 +932,178 @@
 }
 
 /**
+ * @description 鏍煎紡鍖栨悳绱㈡潯浠�
+ */
+export function formatSearch (searches) {
+  if (!searches) return []
+
+  let newsearches = []
+  searches.forEach(item => {
+    if (!item.field) return
+
+    if (item.type === 'group') {
+      newsearches.push({
+        key: item.field,
+        match: '',
+        type: item.type,
+        value: 'customized',
+        forbid: true
+      }, {
+        key: item.datefield,
+        match: 'between',
+        type: 'daterange',
+        value: '1949-10-01 00:00:00.000,1949-10-02 00:00:00.000',
+        forbid: item.query === 'false'
+      })
+    } else {
+      let value = item.initval
+      let type = item.type
+
+      if (item.type === 'date') {
+        value = '1949-10-01 00:00:00.000'
+      } else if (item.type === 'datemonth') {
+        value = '1949-10-01 00:00:00.000,1949-10-02 00:00:00.000'
+      } else if (item.type === 'dateweek') {
+        value = '1949-10-01 00:00:00.000,1949-10-02 00:00:00.000'
+      } else if (item.type === 'daterange') {
+        value = '1949-10-01 00:00:00.000,1949-10-02 00:00:00.000'
+      } else if (item.type === 'range') {
+        value = `${item.minValue},${item.maxValue}`
+      } else if (item.type === 'multiselect' || (item.type === 'checkcard' && item.multiple === 'true')) {
+        type = 'multi'
+        value = '0'
+      } else {
+        value = '0'
+      }
+      newsearches.push({
+        key: item.field,
+        match: item.match,
+        type: type,
+        value: value,
+        precision: item.precision || 'day',
+        forbid: item.query === 'false'
+      })
+    }
+  })
+
+  return newsearches
+}
+
+/**
+ * @description 鎷兼帴where鏉′欢
+ */
+export function joinMainSearchkey (searches) {
+  if (!searches || searches.length === 0) return ''
+
+  let searchText = []
+  searches.forEach(item => {
+    if (item.forbid) return
+    
+    if (item.type === 'text' || item.type === 'select') { // 缁煎悎鎼滅储锛屾枃鏈垨涓嬫媺锛屾墍鏈夊瓧娈垫嫾鎺�
+      let str = item.match === 'like' || item.match === 'not like' ? '%' : ''
+      let fields = item.key.split(',').map(field => {
+        return field + ' ' + item.match + ' \'' + str + item.value + str + '\''
+      })
+
+      searchText.push('(' + fields.join(' OR ') + ')')
+    } else if (item.type === 'checkcard') {
+      let str = item.match === 'like' || item.match === 'not like' ? '%' : ''
+
+      searchText.push('(' + item.key + ' ' + item.match + ' \'' + str + item.value + str + '\')')
+    } else if (item.type === 'multi') {
+      searchText.push(`('${item.value}' ${item.match} '%'+${item.key}+'%')`)
+    } else if (item.type === 'date') {
+      searchText.push('(' + item.key + ' ' + item.match + ' \'' + item.value + '\')')
+    } else if (item.type === 'datemonth' || item.type === 'dateweek' || item.type === 'range') {
+      let val = item.value.split(',')
+      searchText.push('(' + item.key + ' >= \'' + val[0] + '\' AND ' + item.key + ' < \'' + val[1] + '\')')
+    } else if (item.type === 'daterange') {
+      let val = item.value.split(',')
+
+      let _skey = item.key
+      let _ekey = item.key
+
+      if (/,/.test(item.key)) {
+        _skey = item.key.split(',')[0]
+        _ekey = item.key.split(',')[1]
+      }
+
+      searchText.push('(' + _skey + ' >= \'' + val[0] + '\' AND ' + _ekey + ' < \'' + val[1] + '\')')
+    } else {
+      searchText.push('(' + item.key + ' ' + item.match + ' \'' + item.value + '\')')
+    }
+  })
+
+  return searchText.length > 0 ? 'where ' + searchText.join(' AND ') : ''
+}
+
+/**
+ * @description 鑾峰彇鎼滅储姝e垯鏇挎崲
+ */
+export function getSearchRegs (searches) {
+  if (!searches) return []
+
+  let options = []
+  let fieldmap = new Map()
+  searches.forEach(item => {
+    if (item.type === 'date') {
+      if (fieldmap.has(item.key)) {
+        options.push({
+          reg: new RegExp('@' + item.key + '1@', 'ig'),
+          value: `'${item.value}'`
+        })
+      } else {
+        fieldmap.set(item.key, true)
+        options.push({
+          reg: new RegExp('@' + item.key + '@', 'ig'),
+          value: `'${item.value}'`
+        })
+      }
+    } else if (['dateweek', 'datemonth', 'range'].includes(item.type)) {
+      let val = item.value.split(',')
+      options.push({
+        reg: new RegExp('@' + item.key + '@', 'ig'),
+        value: `'${val[0]}'`
+      }, {
+        reg: new RegExp('@' + item.key + '1@', 'ig'),
+        value: `'${val[1]}'`
+      })
+    } else if (item.type === 'daterange') {
+      let val = item.value.split(',')
+      let _skey = item.key
+      let _ekey = item.key + '1'
+
+      if (/,/.test(item.key)) {
+        _skey = item.key.split(',')[0]
+        _ekey = item.key.split(',')[1]
+      }
+
+      options.push({
+        reg: new RegExp('@' + _skey + '@', 'ig'),
+        value: `'${val[0]}'`
+      }, {
+        reg: new RegExp('@' + _ekey + '@', 'ig'),
+        value: `'${val[1]}'`
+      })
+    } else if (item.type === 'text' || item.type === 'select') {
+      item.key.split(',').forEach(field => {
+        options.push({
+          reg: new RegExp('@' + field + '@', 'ig'),
+          value: `'${item.value}'`
+        })
+      })
+    } else {
+      options.push({
+        reg: new RegExp('@' + item.key + '@', 'ig'),
+        value: `'${item.value}'`
+      })
+    }
+  })
+
+  return options
+}
+
+/**
  * @description 閲嶇疆绉诲姩绔痵tyle
  * @return {Object}  style
  */
diff --git a/src/utils/utils.js b/src/utils/utils.js
index 86577d3..e874151 100644
--- a/src/utils/utils.js
+++ b/src/utils/utils.js
@@ -138,7 +138,7 @@
     ]
     
     if (type === 'customscript') {
-      chars = chars.filter(char => !['insert', 'delete', 'update', 'set', 'if', 'exec'].includes(char.key))
+      chars = chars.filter(char => !['create', 'insert', 'delete', 'update', 'set', 'drop', 'if', 'exec'].includes(char.key))
     }
 
     let error = ''
@@ -407,6 +407,10 @@
       }
 
       if (item.type === 'text' || item.type === 'select') {
+        if (/@username@|@fullName@/ig.test(item.initval)) {
+          item.initval = item.initval.replace(/@username@/ig, sessionStorage.getItem('User_Name') || '').replace(/@fullName@/ig, sessionStorage.getItem('Full_Name') || '')
+          item.oriInitval = item.initval
+        }
         if (/,/.test(item.field)) {
           item.field.split(',').forEach(field => {
             keys.push(field.toLowerCase())
@@ -1166,6 +1170,7 @@
     sql = sql.replace(/\n\s{6}/ig, '\n')
 
     if (window.GLOB.debugger === true) {
+      console.info('%c' + item.logLabel, 'color: blue')
       console.info(sql)
     }
   } else {
@@ -1372,6 +1377,7 @@
     sql = sql.replace(/\n\s{6}/ig, '\n')
 
     if (window.GLOB.debugger === true) {
+      console.info('%c' + btn.logLabel, 'color: blue')
       console.info(sql)
     }
   } else {
@@ -1557,8 +1563,6 @@
     }
 
     columns.forEach(col => {
-      if (col.field === 'works_flow_param') return
-
       if (col.type === 'colspan' || col.type === 'old_colspan') {
         col.subcols.forEach(cell => {
           setField(cell)
@@ -1578,7 +1582,7 @@
       Declare @tbid nvarchar(50),@ErrorCode nvarchar(50),@retmsg nvarchar(4000),@BillCode nvarchar(50),@BVoucher nvarchar(50),@FIBVoucherDate nvarchar(50), @FiYear nvarchar(50),@ModularDetailCode nvarchar(50), @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),@mk_deleted int,@bid nvarchar(50)${_declarefields}
     `
 
-  let userName = sessionStorage.getItem('User_Name') || ''
+  let userName = sessionStorage.getItem('User_Name') || '' 
   let fullName = sessionStorage.getItem('Full_Name') || ''
   let RoleID = sessionStorage.getItem('role_id') || ''
   let departmentcode = sessionStorage.getItem('departmentcode') || ''
@@ -2114,42 +2118,116 @@
     let statusName = ''
     let detailId = ''
 
-    if (verify.flowSql === 'true') {
-      if (verify.flowType === 'start') {
-        target = flow.cells.filter(cell => cell.mknode === 'start')[0]
-
-        if (target) {
-          detailId = target.id
-          status = target.mkdata.status
-          statusName = target.mkdata.statusName
-        }
-      } else if (_data.works_flow_param) {
-        node = JSON.parse(window.decodeURIComponent(window.atob(_data.works_flow_param)))
-
-        if (node) {
-          line = flow.cells.filter(cell => cell.shape === 'edge' && cell.source.cell === node.id)[0]
-        }
-        
-        if (line) {
-          target = flow.cells.filter(cell => cell.id === line.target.cell)[0]
-        }
-      }
+    if (verify.flowType === 'start') {
+      target = flow.cells.filter(cell => cell.mknode === 'start')[0]
 
       if (target) {
-        _sql += `
-      /* 宸ヤ綔娴侀粯璁ql */
-      insert into s_my_works_flow (works_flow_id,works_flow_code,works_flow_name,works_flow_param,work_group,works_flow_detail_id,work_grade,bid,createuserid,CreateUser,CreateStaff)
-      select @ID@,@works_flow_code@,@works_flow_name@,@works_flow_param@,@work_group@,@works_flow_detail_id@,@work_grade@,@bid@,@UserID@,@UserName,@FullName
-      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)
-      select @ID@,@works_flow_code@,@works_flow_name@,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@
-      `
+        detailId = target.id
+        status = target.mkdata.status
+        statusName = target.mkdata.statusName
+      }
+    } else if (_data.works_flow_param) {
+      node = JSON.parse(window.decodeURIComponent(window.atob(_data.works_flow_param)))
+
+      if (node) {
+        let lines = flow.cells.filter(cell => cell.shape === 'edge' && cell.source.cell === node.id)
+        if (verify.flowType === 'reject') {
+          line = lines.filter(cell => cell.mkdata.flowType === 'reject' || cell.mknode === 'startEdge')[0]
+        } else {
+          line = lines.filter(cell => cell.mkdata.flowType !== 'reject' && cell.mknode !== 'startEdge')[0]
+        }
+      }
+      
+      if (line) {
+        detailId = line.id
+        status = line.mkdata.status
+        statusName = line.mkdata.statusName
+        target = flow.cells.filter(cell => cell.id === line.target.cell)[0]
       }
     }
+
+    if (verify.flowSql === 'true' && target) {
+      if (verify.flowType === 'start') {
+        _sql += `
+      /* 宸ヤ綔娴侀粯璁ql */
+      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 @ID@,@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@
+      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,upid)
+      select @ID@,@works_flow_code@,@works_flow_name@ ,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@,@time_id@
+      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 @ID@,@works_flow_code@,@works_flow_detail_id@,@userid@,@start_type@,@userid@,@UserName,@FullName,@time_id@
+      `
+      } else {
+        _sql += `
+      /* 宸ヤ綔娴侀粯璁ql */
+      update s_my_works_flow set status=@status@,statusname=@statusname@,works_flow_param=@works_flow_param@,works_flow_detail_id=@works_flow_detail_id@,modifydate=getdate(),modifyuserid=@userid@,modifyuser=@username,modifystaff=@fullname
+      where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0
+      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,upid)
+      select @ID@,@works_flow_code@,@works_flow_name@ ,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@,@time_id@
+      if @check_userids@ != ''
+      begin
+            delete s_my_works_flow_role where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0
+            insert into s_my_works_flow_role (works_flow_id,works_flow_code,userid,works_flow_detail_id,createuserid,CreateUser,CreateStaff,upid)
+            select @ID@,@works_flow_code@,ID,@works_flow_detail_id@,@userid@,@UserName,@FullName,@time_id@ from dbo.SplitComma(@check_userids@)
+            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 @ID@,@works_flow_code@,@works_flow_detail_id@,ID,@check_type@,@userid@,@UserName,@FullName,@time_id@ from dbo.SplitComma(@check_userids@)
+      end
+      if @notice_userids@ != ''
+      begin
+            delete n
+            from (select * from s_my_works_flow_notice where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0) n
+            inner join (select ID from dbo.SplitComma(@notice_userids@)) s
+            on n.userid = s.id
+            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 @ID@,@works_flow_code@,@works_flow_detail_id@,ID,@notice_type@,@userid@,@UserName,@FullName,@time_id@ from dbo.SplitComma(@notice_userids@)
+      end
+      `
+      }
+    } else if (verify.flowSql === 'true') {
+      target = flow.cells.filter(cell => cell.mknode === 'start')[0]
+
+      if (target) {
+        detailId = target.id
+      }
+
+      status = 0
+      statusName = '寮傚父'
+      _sql += `
+      /* 宸ヤ綔娴佸紓甯竤ql */
+      update s_my_works_flow set status=@status@,statusname=@statusname@,works_flow_param=@works_flow_param@,works_flow_detail_id=@works_flow_detail_id@,modifydate=getdate(),modifyuserid=@userid@,modifyuser=@username,modifystaff=@fullname
+      where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0
+      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,upid)
+      select @ID@,@works_flow_code@,@works_flow_name@ ,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@,@time_id@
+      `
+    }
+
+    if (verify.flowType !== 'start') {
+      if (line) {
+        let checkIds = []
+        let noticeIds = []
+        line.mkdata.members && line.mkdata.members.forEach(item => {
+          checkIds.push(item.worker_id)
+        })
+        line.mkdata.copys && line.mkdata.copys.forEach(item => {
+          noticeIds.push(item.worker_id)
+        })
+        _sql = _sql.replace(/@check_userids@/ig, `'${checkIds.join(',')}'`)
+        _sql = _sql.replace(/@notice_userids@/ig, `'${noticeIds.join(',')}'`)
+      } else {
+        _sql = _sql.replace(/@check_userids@/ig, `''`)
+        _sql = _sql.replace(/@notice_userids@/ig, `''`)
+      }
+    }
+
+    _sql = _sql.replace(/@start_type@/ig, `'寮�濮�'`)
+    _sql = _sql.replace(/@check_type@/ig, verify.flowType === 'reject' ? `'椹冲洖'` : `'瀹℃牳'`)
+    _sql = _sql.replace(/@notice_type@/ig, `'鎶勯��'`)
 
     _sql = _sql.replace(/@works_flow_code@/ig, `'${flow.flow_code}'`)
     _sql = _sql.replace(/@works_flow_name@/ig, `'${flow.flow_name}'`)
     if (target) {
-      let msg = {...target.mkdata, id: target.id}
+      let label = target.attrs && target.attrs.text && target.attrs.text.text ? target.attrs.text.text : ''
+      let msg = {...target.mkdata, label: label, id: target.id}
       _sql = _sql.replace(/@works_flow_param@/ig, `'${window.btoa(window.encodeURIComponent(JSON.stringify(msg)))}'`)
     } else {
       _sql = _sql.replace(/@works_flow_param@/ig, `''`)
@@ -2206,7 +2284,7 @@
   }
 
   if (window.GLOB.debugger === true) {
-    // _sql = _sql.replace(/\n\s{8}/ig, '\n')
+    console.info('%c' + btn.logLabel, 'color: blue')
     console.info(_sql)
   }
 
diff --git a/src/views/design/sidemenu/menuelement/index.scss b/src/views/design/sidemenu/menuelement/index.scss
index 2ec4117..c5eff7e 100644
--- a/src/views/design/sidemenu/menuelement/index.scss
+++ b/src/views/design/sidemenu/menuelement/index.scss
@@ -21,7 +21,6 @@
   width: 98%;
   div {
     padding: 0px 0px 0px 30px;
-    margin-right: 20px;
     height: 40px;
     line-height: 40px;
     cursor: move;
@@ -57,3 +56,16 @@
     }
   }
 }
+.side-card div:first-child::before {
+  position: absolute;
+  content: ' ';
+  display: block;
+  width: 100%;
+  height: 8px;
+  top: -8px;
+  left: 0px;
+}
+.side-card:first-child div:first-child::before {
+  height: 15px;
+  top: -15px;
+}
diff --git a/src/views/menudesign/index.jsx b/src/views/menudesign/index.jsx
index 53a7629..455baa1 100644
--- a/src/views/menudesign/index.jsx
+++ b/src/views/menudesign/index.jsx
@@ -36,7 +36,7 @@
 const PasteController = asyncComponent(() => import('@/menu/pastecontroller'))
 const StyleController = asyncComponent(() => import('@/menu/stylecontroller'))
 const ReplaceField = asyncComponent(() => import('@/menu/replaceField'))
-// const Debug = asyncComponent(() => import('@/menu/debug'))
+const Debug = asyncComponent(() => import('@/menu/debug'))
 const NormalCss = asyncComponent(() => import('@/menu/normalCss'))
 const Versions = asyncComponent(() => import('@/menu/versions'))
 const TableNodes = asyncComponent(() => import('@/menu/tablenodes'))
@@ -1162,7 +1162,7 @@
               <div className={'menu-view' + (menuloading ? ' saving' : '') + (eyeopen ? ' eye-open' : '')}>
                 <Card bordered={false} extra={
                   <div className="mk-opeartion-list">
-                    {/* <Debug config={config}/> */}
+                    {config ? <Debug config={config}/> : null}
                     <Button className="mk-border-purple" onClick={() => this.setState({eyeopen: !eyeopen})}>{!eyeopen ? <EyeOutlined /> : <EyeInvisibleOutlined />} 缁勪欢鍚�</Button>
                     <Versions MenuId={MenuId} open_edition={config ? config.open_edition : ''}/>
                     <TableNodes config={config} />
diff --git a/src/views/mobdesign/index.jsx b/src/views/mobdesign/index.jsx
index 072814b..4946716 100644
--- a/src/views/mobdesign/index.jsx
+++ b/src/views/mobdesign/index.jsx
@@ -23,6 +23,7 @@
 const { Paragraph } = Typography
 
 const Header = asyncComponent(() => import('@/mob/header'))
+const Debug = asyncComponent(() => import('@/menu/debug'))
 const MenuForm = asyncComponent(() => import('./menuform'))
 const MobShell = asyncComponent(() => import('@/mob/mobshell'))
 const CreateView = asyncComponent(() => import('@/pc/createview'))
@@ -2115,6 +2116,7 @@
                 <Button type="primary" className={needUpdate ? 'update-tip' : ''} onClick={this.submitConfig} id="save-config" loading={menuloading}>淇濆瓨</Button>
                 {config ? <Switch className="big" checkedChildren="鍚�" unCheckedChildren="鍋�" checked={config.enabled} onChange={this.onEnabledChange} /> : null}
                 <ArrowLeftOutlined title="鍚庨��" className="back-view" onClick={this.backView}/>
+                {config ? <Debug config={config}/> : null}
                 <Button className="mk-border-purple" onClick={() => this.setState({eyeopen: !eyeopen})}>{!eyeopen ? <EyeOutlined /> : <EyeInvisibleOutlined />} 缁勪欢鍚�</Button>
                 <CreateView resetmenu={this.getAppMenus} />
                 <PasteController insert={this.insert} />
diff --git a/src/views/pcdesign/index.jsx b/src/views/pcdesign/index.jsx
index e4239db..51d198e 100644
--- a/src/views/pcdesign/index.jsx
+++ b/src/views/pcdesign/index.jsx
@@ -24,6 +24,7 @@
 const { Paragraph } = Typography
 
 const MenuForm = asyncComponent(() => import('./menuform'))
+const Debug = asyncComponent(() => import('@/menu/debug'))
 const Header = asyncComponent(() => import('@/menu/header'))
 const PopView = asyncComponent(() => import('@/views/menudesign/popview'))
 const Transfer = asyncComponent(() => import('@/pc/transfer'))
@@ -1727,6 +1728,7 @@
                 <Button type="primary" className={needUpdate ? 'update-tip' : ''} id="save-config" onClick={this.submitConfig} loading={menuloading}>淇濆瓨</Button>
                 {config ? <Switch className="big" checkedChildren="鍚�" unCheckedChildren="鍋�" checked={config.enabled} onChange={this.onEnabledChange} /> : null}
                 <ArrowLeftOutlined title="鍚庨��" className="back-view" onClick={this.backView}/>
+                {config ? <Debug config={config}/> : null}
                 <Button className="mk-border-purple" onClick={() => this.setState({eyeopen: !eyeopen})}>{!eyeopen ? <EyeOutlined /> : <EyeInvisibleOutlined />} 缁勪欢鍚�</Button>
                 <CreateView resetmenu={this.getAppMenus} />
                 <PasteController insert={this.insert} />
diff --git a/src/views/tabledesign/index.jsx b/src/views/tabledesign/index.jsx
index fd5c387..cb48eb5 100644
--- a/src/views/tabledesign/index.jsx
+++ b/src/views/tabledesign/index.jsx
@@ -34,7 +34,7 @@
 const BgController = asyncComponent(() => import('@/pc/bgcontroller'))
 const StyleController = asyncComponent(() => import('@/menu/stylecontroller'))
 const ReplaceField = asyncComponent(() => import('@/menu/replaceField'))
-// const Debug = asyncComponent(() => import('@/menu/debug'))
+const Debug = asyncComponent(() => import('@/menu/debug'))
 const Versions = asyncComponent(() => import('@/menu/versions'))
 const Transfer = asyncComponent(() => import('@/menu/transfer'))
 const Unattended = asyncComponent(() => import('@/templates/zshare/unattended'))
@@ -872,7 +872,7 @@
               <div className={'menu-view' + (menuloading ? ' saving' : '')}>
                 <Card bordered={false} extra={
                   <div className="mk-opeartion-list">
-                    {/* {config ? <Debug config={config}/> : null} */}
+                    {config ? <Debug config={config}/> : null}
                     {config ? <Transfer config={config}/> : null}
                     {config ? <Unattended config={config} updateConfig={this.updateConfig}/> : null}
                     <Versions MenuId={MenuId} open_edition={config ? config.open_edition : ''}/>

--
Gitblit v1.8.0