From 1bec8d69cf14bd88591eee5b0320c5c8f6c25a08 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 08 三月 2024 21:19:31 +0800
Subject: [PATCH] Merge branch 'master' into positec

---
 src/utils/utils-datamanage.js                                                    |    6 
 src/menu/picturecontroller/index.jsx                                             |    2 
 src/utils/utils-custom.js                                                        |   10 
 src/menu/components/card/cardcellcomponent/elementform/index.jsx                 |    2 
 src/tabviews/custom/components/share/normalTable/index.scss                      |   77 +---
 src/templates/zshare/verifycard/customscript/index.jsx                           |   18 
 src/tabviews/custom/popview/index.jsx                                            |    3 
 src/menu/components/table/normal-table/columns/editColumn/index.jsx              |   10 
 src/tabviews/zshare/actionList/newpagebutton/index.jsx                           |    2 
 src/tabviews/zshare/actionList/normalbutton/index.jsx                            |   18 
 src/menu/components/table/edit-table/columns/editColumn/index.jsx                |   11 
 src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx             |   32 +
 src/menu/datasource/verifycard/index.jsx                                         |   38 +-
 src/tabviews/custom/components/card/data-card/index.jsx                          |    7 
 src/components/normalform/modalform/mkSelect/index.jsx                           |   11 
 src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx           |    2 
 src/tabviews/custom/components/card/cardcellList/index.jsx                       |    2 
 src/mob/colorsketch/index.jsx                                                    |    5 
 src/tabviews/custom/components/table/normal-table/index.jsx                      |    8 
 src/templates/sharecomponent/actioncomponent/verifyexcelout/columnform/index.jsx |   11 
 src/components/normalform/modalform/mkRadio/index.jsx                            |   11 
 src/tabviews/custom/components/chart/antv-pie/index.jsx                          |    4 
 src/tabviews/custom/components/table/edit-table/normalTable/index.jsx            |    8 
 src/tabviews/zshare/mutilform/index.jsx                                          |   14 
 src/tabviews/custom/index.jsx                                                    |    2 
 src/tabviews/zshare/topSearch/advanceform/index.scss                             |    3 
 src/templates/sharecomponent/searchcomponent/index.scss                          |    3 
 src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx         |   15 
 src/tabviews/custom/components/chart/antv-bar-line/index.jsx                     |   47 ++
 src/tabviews/custom/components/table/base-table/index.jsx                        |    9 
 package-lock.json                                                                |   38 +
 src/tabviews/custom/components/chart/antv-dashboard/index.jsx                    |    4 
 src/views/printTemplate/index.jsx                                                |   53 +++
 src/views/printTemplate/index.scss                                               |    7 
 src/templates/sharecomponent/actioncomponent/verifyexcelin/columnform/index.jsx  |    9 
 src/tabviews/custom/components/card/double-data-card/index.jsx                   |    7 
 src/templates/zshare/verifycard/callbackcustomscript/index.jsx                   |   30 +
 src/menu/datasource/verifycard/customscript/index.jsx                            |    2 
 src/menu/components/table/base-table/columns/editColumn/formconfig.jsx           |   15 
 src/tabviews/zshare/actionList/exceloutbutton/index.jsx                          |    6 
 src/views/rolemanage/index.jsx                                                   |    3 
 src/menu/components/card/cardcellcomponent/dragaction/card.jsx                   |    2 
 src/menu/components/chart/antv-bar/index.jsx                                     |   46 ++
 src/tabviews/custom/components/table/edit-table/index.jsx                        |    9 
 src/templates/zshare/verifycard/customform/index.jsx                             |   10 
 src/api/index.js                                                                 |    8 
 src/tabviews/custom/components/share/normalTable/index.jsx                       |   53 +-
 src/tabviews/zshare/topSearch/index.scss                                         |    3 
 src/menu/components/search/main-search/index.scss                                |    3 
 src/utils/utils.js                                                               |   16 
 src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx            |   73 +++-
 src/menu/components/chart/antv-bar/chartcompile/formconfig.jsx                   |    9 
 src/menu/components/table/base-table/columns/editColumn/index.jsx                |   10 
 public/manifest.json                                                             |    2 
 src/templates/zshare/formconfig.jsx                                              |   15 
 src/templates/zshare/verifycard/index.jsx                                        |   40 +-
 src/menu/components/share/actioncomponent/index.jsx                              |    5 
 src/menu/urlfieldcomponent/index.jsx                                             |    2 
 src/tabviews/zshare/actionList/printbutton/index.jsx                             |   14 
 src/menu/components/search/main-search/index.jsx                                 |   28 
 src/tabviews/custom/components/table/edit-table/normalTable/index.scss           |   77 +---
 src/views/login/index.scss                                                       |    9 
 package.json                                                                     |    2 
 src/templates/zshare/verifycard/baseform/index.jsx                               |   14 
 src/views/login/index.jsx                                                        |    1 
 65 files changed, 677 insertions(+), 339 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index c9ea0db..c560381 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4304,12 +4304,30 @@
       "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
     },
     "axios": {
-      "version": "0.19.0",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
-      "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
+      "version": "1.6.7",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz",
+      "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==",
       "requires": {
-        "follow-redirects": "1.5.10",
-        "is-buffer": "^2.0.2"
+        "follow-redirects": "^1.15.4",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      },
+      "dependencies": {
+        "follow-redirects": {
+          "version": "1.15.5",
+          "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz",
+          "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw=="
+        },
+        "form-data": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+          "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+          "requires": {
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.8",
+            "mime-types": "^2.1.12"
+          }
+        }
       }
     },
     "axobject-query": {
@@ -11438,11 +11456,6 @@
         "binary-extensions": "^1.0.0"
       }
     },
-    "is-buffer": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz",
-      "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw=="
-    },
     "is-callable": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
@@ -16929,6 +16942,11 @@
         "ipaddr.js": "1.9.0"
       }
     },
+    "proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+    },
     "prr": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
diff --git a/package.json b/package.json
index bad35c0..8bcac9a 100644
--- a/package.json
+++ b/package.json
@@ -27,7 +27,7 @@
     "@uiw/react-codemirror": "^2.2.1",
     "antd": "^3.26.20",
     "antd-mobile": "^5.14.2",
-    "axios": "^0.19.0",
+    "axios": "^1.6.7",
     "babel-eslint": "10.0.2",
     "babel-jest": "^24.8.0",
     "babel-loader": "8.0.6",
diff --git a/public/manifest.json b/public/manifest.json
index aa4803e..f3adf88 100644
--- a/public/manifest.json
+++ b/public/manifest.json
@@ -6,5 +6,5 @@
   "display": "standalone",
   "theme_color": "#000000",
   "background_color": "#ffffff",
-  "mk_version": "20240203"
+  "mk_version": "20240302"
 }
diff --git a/src/api/index.js b/src/api/index.js
index fa456b0..b340607 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -57,6 +57,9 @@
 
     return Promise.reject(response.data)
   } else {
+    if (response.config.requestId) {
+      response.data.$requestId = response.config.requestId
+    }
     return Promise.resolve(response.data)
   }
 }, (error) => {
@@ -869,7 +872,7 @@
    * @description 鑾峰彇涓氬姟閫氱敤鎺ュ彛
    * 璁块棶 'https://sso.mk9h.cn/webapi/dostars'鎴栦簯绔椂锛屼紶鍏serid銆丩oginUID
    */
-  genericInterface (param, script = '', position) {
+  genericInterface (param, script = '', position, requestId = '') {
     param.userid = param.userid || sessionStorage.getItem('UserID') || ''
     param.lang = param.lang || sessionStorage.getItem('lang') || ''
     param.SessionUid = localStorage.getItem('SessionUid') || ''
@@ -982,7 +985,8 @@
       return axios({
         url: `${url}${param.func ? '/' + param.func : ''}`,
         method: 'post',
-        data: JSON.stringify(param)
+        data: JSON.stringify(param),
+        requestId
       })
     }
   }
diff --git a/src/components/normalform/modalform/mkRadio/index.jsx b/src/components/normalform/modalform/mkRadio/index.jsx
index 587fef6..ddebf3e 100644
--- a/src/components/normalform/modalform/mkRadio/index.jsx
+++ b/src/components/normalform/modalform/mkRadio/index.jsx
@@ -26,17 +26,6 @@
     return !is(fromJS(this.state), fromJS(nextState))
   }
 
-  UNSAFE_componentWillReceiveProps (nextProps) {
-    const { config } = this.state
-
-    if (!is(fromJS(config.oriOptions), fromJS(nextProps.config.oriOptions))) {
-      this.setState({
-        config: fromJS(nextProps.config).toJS(),
-        options: fromJS(nextProps.config.options).toJS()
-      })
-    }
-  }
-
   componentWillUnmount () {
     this.setState = () => {
       return
diff --git a/src/components/normalform/modalform/mkSelect/index.jsx b/src/components/normalform/modalform/mkSelect/index.jsx
index a1b4479..39b5546 100644
--- a/src/components/normalform/modalform/mkSelect/index.jsx
+++ b/src/components/normalform/modalform/mkSelect/index.jsx
@@ -31,17 +31,6 @@
     MKEmitter.addListener('mkFC', this.mkFormControl)
   }
 
-  UNSAFE_componentWillReceiveProps (nextProps) {
-    const { config } = this.state
-
-    if (!is(fromJS(config.oriOptions), fromJS(nextProps.config.oriOptions))) {
-      this.setState({
-        config: fromJS(nextProps.config).toJS(),
-        options: fromJS(nextProps.config.options).toJS()
-      })
-    }
-  }
-
   shouldComponentUpdate (nextProps, nextState) {
     return !is(fromJS(this.state), fromJS(nextState))
   }
diff --git a/src/menu/components/card/cardcellcomponent/dragaction/card.jsx b/src/menu/components/card/cardcellcomponent/dragaction/card.jsx
index 7e4b3aa..7395d2a 100644
--- a/src/menu/components/card/cardcellcomponent/dragaction/card.jsx
+++ b/src/menu/components/card/cardcellcomponent/dragaction/card.jsx
@@ -83,7 +83,7 @@
   const getContent = () => {
     if (card.eleType === 'sequence') {
       return (
-        <div style={{height: card.innerHeight || 'auto'}} className="ant-mk-text">1</div>
+        <div style={{height: card.innerHeight || 'auto'}} className="ant-mk-text">{card.prefix || ''}1{card.postfix || ''}</div>
       )
     } else if (card.eleType === 'text' || card.eleType === 'number') {
       let val = `${card.prefix || ''}${card.datatype === 'static' ? (card.value || '') : (card.field || '')}${card.postfix || ''}`
diff --git a/src/menu/components/card/cardcellcomponent/elementform/index.jsx b/src/menu/components/card/cardcellcomponent/elementform/index.jsx
index 1a96928..8488fd1 100644
--- a/src/menu/components/card/cardcellcomponent/elementform/index.jsx
+++ b/src/menu/components/card/cardcellcomponent/elementform/index.jsx
@@ -14,7 +14,7 @@
 const MkEditIcon = asyncComponent(() => import('@/components/mkIcon'))
 
 const cardTypeOptions = {
-  sequence: ['eleType', 'width'],
+  sequence: ['eleType', 'width', 'prefix', 'postfix'],
   text: ['eleType', 'datatype', 'format', 'width', 'height', 'prefix', 'postfix', 'link', 'anchors', 'noValue', 'bgImage', 'fixStyle', 'copyable', 'alignItems', 'sortField'],
   number: ['eleType', 'datatype', 'width', 'height', 'prefix', 'postfix', 'noValue', 'fixStyle', 'alignItems'],
   picture: ['eleType', 'datatype', 'width', 'lenWidRadio', 'maxWidth', 'link', 'noValue'],
diff --git a/src/menu/components/chart/antv-bar/chartcompile/formconfig.jsx b/src/menu/components/chart/antv-bar/chartcompile/formconfig.jsx
index f0b3e10..7946f54 100644
--- a/src/menu/components/chart/antv-bar/chartcompile/formconfig.jsx
+++ b/src/menu/components/chart/antv-bar/chartcompile/formconfig.jsx
@@ -432,7 +432,7 @@
       required: false,
       options: labelOptions,
       controlFields: [
-        {field: 'labelColor', values: ['true']}
+        {field: 'labelUnit', values: ['true', 'top', 'middle', 'bottom']}
       ]
     }, {
       type: 'radio',
@@ -583,6 +583,13 @@
       forbid: appType === 'mob',
       required: false
     }, {
+      type: 'text',
+      field: 'labelUnit',
+      label: '鏍囨敞鍗曚綅',
+      initval: card.labelUnit ||'',
+      forbid: appType === 'mob',
+      required: false
+    }, {
       type: 'color',
       field: 'lineColor',
       label: '鍧愭爣杞撮鑹�',
diff --git a/src/menu/components/chart/antv-bar/index.jsx b/src/menu/components/chart/antv-bar/index.jsx
index 8074b88..0ad4db4 100644
--- a/src/menu/components/chart/antv-bar/index.jsx
+++ b/src/menu/components/chart/antv-bar/index.jsx
@@ -337,6 +337,9 @@
           if (plot.show === 'percent') {
             value = value + '%'
           }
+          if (plot.labelUnit) {
+            value = value + plot.labelUnit
+          }
           let _color = color
 
           if (plot.labelColor === 'custom' && colors.has(key)) {
@@ -720,6 +723,9 @@
             if (plot.show === 'percent') {
               value = value + '%'
             }
+            if (plot.labelUnit) {
+              value = value + plot.labelUnit
+            }
 
             if (label === 'true' && plot.labelColor === 'custom' && colors.has(key)) {
               lablecfg.style.fill = colors.get(key)
@@ -770,6 +776,9 @@
           _chart.label('value*key', (value, key) => {
             if (plot.show === 'percent') {
               value = value + '%'
+            }
+            if (plot.labelUnit) {
+              value = value + plot.labelUnit
             }
 
             if (label === 'true' && plot.labelColor === 'custom' && colors.has(key)) {
@@ -842,6 +851,9 @@
             if (item.show === 'percent') {
               value = value + '%'
             }
+            if (plot.labelUnit) {
+              value = value + plot.labelUnit
+            }
 
             if (plot.label === 'true' && plot.labelColor === 'custom') {
               lablecfg.style.fill = item.color
@@ -884,6 +896,9 @@
           _chart.label(item.name, (value) => {
             if (item.show === 'percent') {
               value = value + '%'
+            }
+            if (plot.labelUnit) {
+              value = value + plot.labelUnit
             }
             let _color = color
 
@@ -977,12 +992,31 @@
       if (plot.grid === 'hidden') {
         yc.grid = null
       }
-      if (plot.y_line === 'show') {
+      if (plot.tick === 'hidden') {
+        xc.tickLine = null
+      }
+      if (plot.x_line === 'hidden') {
+        xc.line = null
+      }
+      if (plot.y_line === 'hidden') {
+        yc.line = null
+      } else {
         yc.line = {style: { stroke: '#D1D2CE' }}
       }
+      if (plot.x_label === 'hidden') {
+        xc.label = null
+      }
+      if (plot.y_label === 'hidden') {
+        yc.label = null
+      }
+
       if (plot.lineColor) {
-        xc.tickLine = {style: { stroke: plot.lineColor }}
-        xc.line = { style: { stroke: plot.lineColor } }
+        if (xc.tickLine !== null) {
+          xc.tickLine = {style: { stroke: plot.lineColor }}
+        }
+        if (xc.line !== null) {
+          xc.line = { style: { stroke: plot.lineColor } }
+        }
         if (yc.grid !== null) {
           yc.grid = { line: { style: { stroke: plot.lineColor } }}
         }
@@ -1119,6 +1153,9 @@
             if (plot.show === 'percent') {
               value = value + '%'
             }
+            if (plot.labelUnit) {
+              value = value + plot.labelUnit
+            }
 
             if (plot.label === 'true' && plot.labelColor === 'custom' && colors.has(key)) {
               lablecfg.style.fill = colors.get(key)
@@ -1180,6 +1217,9 @@
             if (plot.show === 'percent') {
               value = value + '%'
             }
+            if (plot.labelUnit) {
+              value = value + plot.labelUnit
+            }
 
             if (plot.label === 'true' && plot.labelColor === 'custom' && colors.has(key)) {
               lablecfg.style.fill = colors.get(key)
diff --git a/src/menu/components/search/main-search/index.jsx b/src/menu/components/search/main-search/index.jsx
index cd9612d..1f3669c 100644
--- a/src/menu/components/search/main-search/index.jsx
+++ b/src/menu/components/search/main-search/index.jsx
@@ -120,19 +120,19 @@
     this.props.updateConfig(component)
   }
 
-  checkComponent = (component) => {
-    this.updateComponent(component)
+  // checkComponent = (component) => {
+  //   this.updateComponent(component)
 
-    let _item = null
-    component.search.forEach(item => {
-      if (!_item && item.focus) {
-        _item = item
-      }
-    })
-    if (_item) {
-      this.handleSearch(_item)
-    }
-  }
+  //   let _item = null
+  //   component.search.forEach(item => {
+  //     if (!_item && item.focus) {
+  //       _item = item
+  //     }
+  //   })
+  //   if (_item) {
+  //     this.handleSearch(_item)
+  //   }
+  // }
 
   /**
    * @description 鎼滅储鏉′欢椤哄簭璋冩暣锛屾垨鎷栨嫿娣诲姞
@@ -345,6 +345,7 @@
       _card.search.push(item)
 
       this.updateComponent(_card)
+      this.handleSearch(item)
     } else if (type === 'multil') {
       _card.search.push(...item)
 
@@ -396,7 +397,8 @@
               <EditOutlined style={{color: '#1890ff'}} title="缂栬緫"/>
             </NormalForm>
             <CopyComponent type="mainsearch" card={card}/>
-            <PasteComponent config={card} options={['search', 'form']} updateConfig={this.checkComponent} />
+            {/* <PasteComponent config={card} options={['search', 'form']} updateConfig={this.checkComponent} /> */}
+            <PasteComponent config={card} options={['search', 'form']} />
             <FontColorsOutlined className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle}/>
             <DeleteOutlined className="close" onClick={() => this.props.deletecomponent(card.uuid)} />
           </div>
diff --git a/src/menu/components/search/main-search/index.scss b/src/menu/components/search/main-search/index.scss
index 0ad138c..656580b 100644
--- a/src/menu/components/search/main-search/index.scss
+++ b/src/menu/components/search/main-search/index.scss
@@ -84,6 +84,9 @@
       width: 100%;
     }
   }
+  label[title=" "]::after, label[title="  "]::after {
+    display: none;
+  }
   .page-card.advanced {
     .ant-form-item-label label {
       color: orange;
diff --git a/src/menu/components/share/actioncomponent/index.jsx b/src/menu/components/share/actioncomponent/index.jsx
index f0c909a..4029b06 100644
--- a/src/menu/components/share/actioncomponent/index.jsx
+++ b/src/menu/components/share/actioncomponent/index.jsx
@@ -285,12 +285,17 @@
               output: 'true',
               required: 'false',
               type: 'text',
+              noValue: 'true',
               uuid: Utils.getuuid()
             }
   
             if (item.type === 'number') {
               cell.type = 'number'
               cell.decimal = item.decimal
+
+              if (item.noValue === 'hide') {
+                cell.noValue = 'false'
+              }
             }
   
             columns.push(cell)
diff --git a/src/menu/components/table/base-table/columns/editColumn/formconfig.jsx b/src/menu/components/table/base-table/columns/editColumn/formconfig.jsx
index 44db9f8..5636097 100644
--- a/src/menu/components/table/base-table/columns/editColumn/formconfig.jsx
+++ b/src/menu/components/table/base-table/columns/editColumn/formconfig.jsx
@@ -460,6 +460,21 @@
       required: true
     },
     {
+      type: 'radio',
+      key: 'noValue',
+      label: '绌哄��',
+      initVal: card.noValue || 'show',
+      tooltip: '鏁板�间负 0 鎴栨椂闂村皬浜� 1949-10-02 鏃讹紝鏄惁鏄剧ず',
+      required: false,
+      options: [{
+        value: 'show',
+        text: '鏄剧ず'
+      }, {
+        value: 'hide',
+        text: '闅愯棌'
+      }]
+    },
+    {
       type: 'multiselect',
       key: 'blacklist',
       label: '榛戝悕鍗�',
diff --git a/src/menu/components/table/base-table/columns/editColumn/index.jsx b/src/menu/components/table/base-table/columns/editColumn/index.jsx
index e4494c0..8af9c30 100644
--- a/src/menu/components/table/base-table/columns/editColumn/index.jsx
+++ b/src/menu/components/table/base-table/columns/editColumn/index.jsx
@@ -101,6 +101,14 @@
       _options.push('sortField')
     }
 
+    if (this.record.Hide !== 'true') {
+      if (['number', 'formula'].includes(this.record.type)) {
+        _options.push('noValue')
+      } else if (this.record.type === 'text' && ['YYYY-MM-DD', 'YYYY-MM-DD HH:mm:ss'].includes(this.record.textFormat)) {
+        _options.push('noValue')
+      }
+    }
+
     return _options
   }
 
@@ -177,7 +185,7 @@
       }
     } else if (key === 'format' && value === 'percent') {
       this.props.form.setFieldsValue({postfix: '%'})
-    } else if (['perspective', 'eval', 'IsSort'].includes(key)) {
+    } else if (['perspective', 'eval', 'IsSort', 'textFormat'].includes(key)) {
       let _options = this.getOptions()
 
       this.setState({
diff --git a/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx b/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx
index 5a1a212..c34c943 100644
--- a/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx
+++ b/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx
@@ -743,7 +743,7 @@
       key: 'noValue',
       label: '绌哄��',
       initVal: card.noValue || 'show',
-      tooltip: '褰撳�间负0鏃舵槸鍚︽樉绀�',
+      tooltip: '鏁板�间负 0 鎴栨椂闂村皬浜� 1949-10-02 鏃讹紝鏄惁鏄剧ず',
       required: false,
       options: [{
         value: 'show',
diff --git a/src/menu/components/table/edit-table/columns/editColumn/index.jsx b/src/menu/components/table/edit-table/columns/editColumn/index.jsx
index 038dee7..fd16488 100644
--- a/src/menu/components/table/edit-table/columns/editColumn/index.jsx
+++ b/src/menu/components/table/edit-table/columns/editColumn/index.jsx
@@ -99,8 +99,13 @@
     } else if (this.record.type === 'custom' && this.record.IsSort === 'true') {
       _options.push('sortField')
     }
-    if (['number', 'formula'].includes(this.record.type) && this.record.Hide !== 'true') {
-      _options.push('noValue')
+    
+    if (this.record.Hide !== 'true') {
+      if (['number', 'formula'].includes(this.record.type)) {
+        _options.push('noValue')
+      } else if (this.record.type === 'text' && ['YYYY-MM-DD', 'YYYY-MM-DD HH:mm:ss'].includes(this.record.textFormat)) {
+        _options.push('noValue')
+      }
     }
 
     return _options
@@ -232,7 +237,7 @@
           return item
         })
       })
-    } else if (['editable', 'editType', 'resourceType', 'ctrlField', 'eval', 'Hide', 'IsSort'].includes(key)) {
+    } else if (['editable', 'editType', 'resourceType', 'ctrlField', 'eval', 'Hide', 'IsSort', 'textFormat'].includes(key)) {
       let _options = this.getOptions()
 
       this.setState({
diff --git a/src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx b/src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx
index b535832..b50848d 100644
--- a/src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx
+++ b/src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx
@@ -436,6 +436,21 @@
       required: true
     },
     {
+      type: 'radio',
+      key: 'noValue',
+      label: '绌哄��',
+      initVal: card.noValue || 'show',
+      tooltip: '鏁板�间负 0 鎴栨椂闂村皬浜� 1949-10-02 鏃讹紝鏄惁鏄剧ず',
+      required: false,
+      options: [{
+        value: 'show',
+        text: '鏄剧ず'
+      }, {
+        value: 'hide',
+        text: '闅愯棌'
+      }]
+    },
+    {
       type: 'multiselect',
       key: 'blacklist',
       label: '榛戝悕鍗�',
diff --git a/src/menu/components/table/normal-table/columns/editColumn/index.jsx b/src/menu/components/table/normal-table/columns/editColumn/index.jsx
index e2900f5..bb4f805 100644
--- a/src/menu/components/table/normal-table/columns/editColumn/index.jsx
+++ b/src/menu/components/table/normal-table/columns/editColumn/index.jsx
@@ -99,6 +99,14 @@
       _options.push('sortField')
     }
 
+    if (this.record.Hide !== 'true') {
+      if (['number', 'formula'].includes(this.record.type)) {
+        _options.push('noValue')
+      } else if (this.record.type === 'text' && ['YYYY-MM-DD', 'YYYY-MM-DD HH:mm:ss'].includes(this.record.textFormat)) {
+        _options.push('noValue')
+      }
+    }
+
     return _options
   }
 
@@ -178,7 +186,7 @@
       }
     } else if (key === 'format' && value === 'percent') {
       this.props.form.setFieldsValue({postfix: '%'})
-    } else if (['perspective', 'eval', 'IsSort'].includes(key)) {
+    } else if (['perspective', 'eval', 'IsSort', 'textFormat'].includes(key)) {
       let _options = this.getOptions()
 
       this.setState({
diff --git a/src/menu/datasource/verifycard/customscript/index.jsx b/src/menu/datasource/verifycard/customscript/index.jsx
index 7c60348..489c1f6 100644
--- a/src/menu/datasource/verifycard/customscript/index.jsx
+++ b/src/menu/datasource/verifycard/customscript/index.jsx
@@ -243,7 +243,7 @@
           </Col>
           <Col span={24}>
             <Form.Item label="鍙敤瀛楁" className="field-able">
-              <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'鍏叡鍊硷紝璇锋寜鐓xxx@鏍煎紡浣跨敤銆�'}><span style={{color: '#1890ff'}}>BID, LoginUID, SessionUid, UserID, Appkey, time_id, typename</span></Tooltip>,&nbsp;
+              <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'鍏叡鍊硷紝璇锋寜鐓xxx@鏍煎紡浣跨敤銆�'}><span style={{color: '#1890ff'}}>BID, LoginUID, SessionUid, UserID, Appkey, time_id, typename, datam</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>,&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>
diff --git a/src/menu/datasource/verifycard/index.jsx b/src/menu/datasource/verifycard/index.jsx
index e103038..ceabb28 100644
--- a/src/menu/datasource/verifycard/index.jsx
+++ b/src/menu/datasource/verifycard/index.jsx
@@ -545,7 +545,7 @@
 
   submitDataSource = () => {
     const { config, mainSearch } = this.props
-    const { activeKey, setting, columns, subColumns, scripts, cols } = this.state
+    const { activeKey, setting, columns, subColumns, scripts, cols, median } = this.state
 
     if (config.subtype === 'dualdatacard') {
       let arr = columns.map(col => col.field.toLowerCase())
@@ -579,6 +579,25 @@
           message: '瀛楁闆嗕腑涓嶅彲浣跨敤' + _arr.join('銆�') + '锛佹敞锛氭瀛楁涓烘彁浜ゆ椂鐨勭郴缁熷瓧娈点��',
           duration: 5
         })
+        return Promise.reject()
+      }
+    }
+
+    if (median.interType === 'system') {
+      let _loading = false
+      if (this.scriptsForm && this.scriptsForm.state.editItem) {
+        _loading = true
+      } else if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) {
+        _loading = true
+      }
+  
+      if (_loading) {
+        notification.warning({
+          top: 92,
+          message: '瀛樺湪鏈繚瀛樿剼鏈紝璇风偣鍑荤‘瀹氫繚瀛橈紝鎴栫偣鍑诲彇娑堟斁寮冧慨鏀癸紒',
+          duration: 5
+        })
+        this.setState({activeKey: 'scripts'})
         return Promise.reject()
       }
     }
@@ -624,23 +643,6 @@
         }
         this.sqlverify(() => { resolve({setting, columns, subColumns, scripts, cols }) }, reject, 'submit')
       } else if (activeKey === 'scripts') {
-        let _loading = false
-        if (this.scriptsForm && this.scriptsForm.state.editItem) {
-          _loading = true
-        } else if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) {
-          _loading = true
-        }
-
-        if (_loading) {
-          notification.warning({
-            top: 92,
-            message: '瀛樺湪鏈繚瀛樿剼鏈紝璇风偣鍑荤‘瀹氫繚瀛橈紝鎴栫偣鍑诲彇娑堟斁寮冧慨鏀癸紒',
-            duration: 5
-          })
-          reject()
-          return
-        }
-
         this.sqlverify(() => { resolve({setting, columns, subColumns, scripts, cols }) }, reject, 'submit')
       }
     })
diff --git a/src/menu/picturecontroller/index.jsx b/src/menu/picturecontroller/index.jsx
index 1dac26d..34ffe8a 100644
--- a/src/menu/picturecontroller/index.jsx
+++ b/src/menu/picturecontroller/index.jsx
@@ -132,6 +132,7 @@
             this.resetVideo(result.data || [])
           } else if (card.typecharone === 'color') {
             window.GLOB.app_colors = result.data || []
+            sessionStorage.setItem('app_colors', JSON.stringify(result.data || []))
             this.resetColor(result.data || [])
           }
           this.setState({editvisible: false})
@@ -186,6 +187,7 @@
                 _this.resetVideo(res.data || [])
               } else if (item.typecharone === 'color') {
                 window.GLOB.app_colors = res.data || []
+                sessionStorage.setItem('app_colors', JSON.stringify(res.data || []))
                 _this.resetColor(res.data || [])
               }
             } else {
diff --git a/src/menu/urlfieldcomponent/index.jsx b/src/menu/urlfieldcomponent/index.jsx
index 69625a0..a25488e 100644
--- a/src/menu/urlfieldcomponent/index.jsx
+++ b/src/menu/urlfieldcomponent/index.jsx
@@ -63,7 +63,7 @@
     let config = JSON.stringify(this.props.config)
     const _this = this
 
-    if (new RegExp(field, 'ig').test(config)) {
+    if (new RegExp('@' + field + '@', 'ig').test(config)) {
       confirm({
         title: `閰嶇疆涓瓨鍦ˊ${field}@锛岀‘瀹氬垹闄ゅ悧锛焋,
         content: '',
diff --git a/src/mob/colorsketch/index.jsx b/src/mob/colorsketch/index.jsx
index 35822cb..ac0a99e 100644
--- a/src/mob/colorsketch/index.jsx
+++ b/src/mob/colorsketch/index.jsx
@@ -50,6 +50,10 @@
 
     if (app_colors) {
       this.getColors(app_colors)
+    } else if (sessionStorage.getItem('app_colors')) {
+      let app_colors = JSON.parse(sessionStorage.getItem('app_colors'))
+      window.GLOB.app_colors = app_colors
+      this.getColors(app_colors)
     } else {
       if (loading) {
         this.getColors([])
@@ -66,6 +70,7 @@
         Api.getCloudConfig(param).then(res => {
           loading = false
           window.GLOB.app_colors = res.data || []
+          sessionStorage.setItem('app_colors', JSON.stringify(res.data || []))
           this.getColors(res.data || [])
         })
       }
diff --git a/src/tabviews/custom/components/card/cardcellList/index.jsx b/src/tabviews/custom/components/card/cardcellList/index.jsx
index d985b05..7e16f86 100644
--- a/src/tabviews/custom/components/card/cardcellList/index.jsx
+++ b/src/tabviews/custom/components/card/cardcellList/index.jsx
@@ -296,7 +296,7 @@
         contents.push(
           <div className={'ant-col ant-col-' + card.width} key={card.uuid} style={_style_} span={card.width}>
             <div style={card.style}>
-              <div className={'ant-mk-text line1' + className} style={{height: card.innerHeight || 'auto'}}><span className="sequence-wrap" style={_style}>{data.$Index || ''}</span></div>
+              <div className={'ant-mk-text line1' + className} style={{height: card.innerHeight || 'auto'}}><span className="sequence-wrap" style={_style}>{card.prefix || ''}{data.$Index || ''}{card.postfix || ''}</span></div>
             </div>
           </div>
         )
diff --git a/src/tabviews/custom/components/card/data-card/index.jsx b/src/tabviews/custom/components/card/data-card/index.jsx
index 1955b65..de3f1a8 100644
--- a/src/tabviews/custom/components/card/data-card/index.jsx
+++ b/src/tabviews/custom/components/card/data-card/index.jsx
@@ -743,6 +743,7 @@
 
     if (config.setting.supModule && !BID && config.wrap.supKey !== 'false') { // BID 涓嶅瓨鍦ㄦ椂锛屼笉鍋氭煡璇�
       this.loaded = true
+      this.requestId = ''
 
       this.setState({
         activeKey: '',
@@ -789,8 +790,12 @@
     let _orderBy = orderBy || config.setting.order || ''
     let param = UtilsDM.getQueryDataParams(config.setting, searches, _orderBy, pageIndex, pageSize, BID)
 
-    let result = await Api.genericInterface(param)
+    this.requestId = config.uuid + new Date().getTime()
+
+    let result = await Api.genericInterface(param, '', '', this.requestId)
     if (result.status) {
+      if (result.$requestId && this.requestId !== result.$requestId) return
+
       let start = 1
       if (config.setting.laypage) {
         start = pageSize * (pageIndex - 1) + 1
diff --git a/src/tabviews/custom/components/card/double-data-card/index.jsx b/src/tabviews/custom/components/card/double-data-card/index.jsx
index 6ae8f77..4903092 100644
--- a/src/tabviews/custom/components/card/double-data-card/index.jsx
+++ b/src/tabviews/custom/components/card/double-data-card/index.jsx
@@ -583,6 +583,7 @@
 
     if (config.setting.supModule && !BID && config.wrap.supKey !== 'false') { // BID 涓嶅瓨鍦ㄦ椂锛屼笉鍋氭煡璇�
       this.loaded = true
+      this.requestId = ''
 
       this.setState({
         activeKey: '',
@@ -632,8 +633,12 @@
     let _orderBy = orderBy || config.setting.order || ''
     let param = UtilsDM.getQueryDataParams(config.setting, searches, _orderBy, pageIndex, pageSize, BID)
 
-    let result = await Api.genericInterface(param)
+    this.requestId = config.uuid + new Date().getTime()
+
+    let result = await Api.genericInterface(param, '', '', this.requestId)
     if (result.status) {
+      if (result.$requestId && this.requestId !== result.$requestId) return
+
       let start = 1
       if (config.setting.laypage) {
         start = pageSize * (pageIndex - 1) + 1
diff --git a/src/tabviews/custom/components/chart/antv-bar-line/index.jsx b/src/tabviews/custom/components/chart/antv-bar-line/index.jsx
index f86a91e..75a01b7 100644
--- a/src/tabviews/custom/components/chart/antv-bar-line/index.jsx
+++ b/src/tabviews/custom/components/chart/antv-bar-line/index.jsx
@@ -256,15 +256,35 @@
       style: { fill: _config.plot.color }
     }}
     let yc = {label: { style: { fill: _config.plot.color } }}
+
     if (_config.plot.grid === 'hidden') {
       yc.grid = null
     }
-    if (_config.plot.y_line === 'show') {
+    if (_config.plot.tick === 'hidden') {
+      xc.tickLine = null
+    }
+    if (_config.plot.x_line === 'hidden') {
+      xc.line = null
+    }
+    if (_config.plot.y_line === 'hidden') {
+      yc.line = null
+    } else {
       yc.line = {style: { stroke: '#D1D2CE' }}
     }
+    if (_config.plot.x_label === 'hidden') {
+      xc.label = null
+    }
+    if (_config.plot.y_label === 'hidden') {
+      yc.label = null
+    }
+
     if (_config.plot.lineColor) {
-      xc.tickLine = {style: { stroke: _config.plot.lineColor }}
-      xc.line = { style: { stroke: _config.plot.lineColor } }
+      if (xc.tickLine !== null) {
+        xc.tickLine = {style: { stroke: _config.plot.lineColor }}
+      }
+      if (xc.line !== null) {
+        xc.line = { style: { stroke: _config.plot.lineColor } }
+      }
       if (yc.grid !== null) {
         yc.grid = { line: { style: { stroke: _config.plot.lineColor } }}
       }
@@ -929,6 +949,9 @@
           val = val + ''
           val = val.replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,')
         }
+        if (plot.labelUnit) {
+          val = val + plot.labelUnit
+        }
         return {
           content: val,
           style: {
@@ -1221,6 +1244,9 @@
               val = val + ''
               val = val.replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,')
             }
+            if (plot.labelUnit) {
+              val = val + plot.labelUnit
+            }
 
             if (plot.$label === 'true' && plot.labelColor === 'custom' && plot.$colors && plot.$colors.has(key)) {
               lablecfg.style.fill = plot.$colors.get(key)
@@ -1283,6 +1309,9 @@
             } else if (plot.show === 'thdSeparator') {
               val = val + ''
               val = val.replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,')
+            }
+            if (plot.labelUnit) {
+              val = val + plot.labelUnit
             }
             if (plot.$label === 'true' && plot.labelColor === 'custom' && plot.$colors && plot.$colors.has(key)) {
               lablecfg.style.fill = plot.$colors.get(key)
@@ -1380,6 +1409,9 @@
               val = val + ''
               val = val.replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,')
             }
+            if (plot.labelUnit) {
+              val = val + plot.labelUnit
+            }
             if (plot.label === 'true' && plot.labelColor === 'custom' && item.color) {
               lablecfg.style.fill = item.color
             }
@@ -1446,6 +1478,9 @@
             } else if (item.show === 'thdSeparator') {
               val = val + ''
               val = val.replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,')
+            }
+            if (plot.labelUnit) {
+              val = val + plot.labelUnit
             }
 
             return {
@@ -1694,6 +1729,9 @@
             val = val + ''
             val = val.replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,')
           }
+          if (plot.labelUnit) {
+            val = val + plot.labelUnit
+          }
 
           if (plot.label === 'true' && plot.labelColor === 'custom' && plot.$colors && plot.$colors.has(key)) {
             lablecfg.style.fill = plot.$colors.get(key)
@@ -1780,6 +1818,9 @@
             val = val + ''
             val = val.replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,')
           }
+          if (plot.labelUnit) {
+            val = val + plot.labelUnit
+          }
 
           if (plot.label === 'true' && plot.labelColor === 'custom' && plot.$colors && plot.$colors.has(key)) {
             lablecfg.style.fill = plot.$colors.get(key)
diff --git a/src/tabviews/custom/components/chart/antv-dashboard/index.jsx b/src/tabviews/custom/components/chart/antv-dashboard/index.jsx
index 605b841..15cf833 100644
--- a/src/tabviews/custom/components/chart/antv-dashboard/index.jsx
+++ b/src/tabviews/custom/components/chart/antv-dashboard/index.jsx
@@ -3,7 +3,7 @@
 import { is, fromJS } from 'immutable'
 import { Chart, registerShape } from '@antv/g2'
 import { Spin, notification, Modal } from 'antd'
-import { DownloadOutlined } from '@ant-design/icons'
+// import { DownloadOutlined } from '@ant-design/icons'
 import moment from 'moment'
 
 import Api from '@/api'
@@ -731,7 +731,7 @@
         }
         <NormalHeader config={config} />
         <div className="canvas-wrap">
-          {config.plot.download === 'enable' && this.state.chart ? <DownloadOutlined onClick={this.downloadImage} className="system-color download"/> : null}
+          {/* {config.plot.download === 'enable' && this.state.chart ? <DownloadOutlined onClick={this.downloadImage} className="system-color download"/> : null} */}
           <div className="canvas" id={this.state.chartId}></div>
         </div>
       </div>
diff --git a/src/tabviews/custom/components/chart/antv-pie/index.jsx b/src/tabviews/custom/components/chart/antv-pie/index.jsx
index 4b9a3d2..44ed1cc 100644
--- a/src/tabviews/custom/components/chart/antv-pie/index.jsx
+++ b/src/tabviews/custom/components/chart/antv-pie/index.jsx
@@ -4,7 +4,7 @@
 import { Chart } from '@antv/g2'
 import DataSet, { DataView } from '@antv/data-set'
 import { Spin, Empty, notification, Modal } from 'antd'
-import { DownloadOutlined } from '@ant-design/icons'
+// import { DownloadOutlined } from '@ant-design/icons'
 import moment from 'moment'
 
 import Api from '@/api'
@@ -916,7 +916,7 @@
         }
         <NormalHeader config={config} BID={BID} refresh={this.refreshSearch} />
         <div className="canvas-wrap">
-          {config.plot.download === 'enable' && this.state.chart && !empty ? <DownloadOutlined onClick={this.downloadImage} className="system-color download"/> : null}
+          {/* {config.plot.download === 'enable' && this.state.chart && !empty ? <DownloadOutlined onClick={this.downloadImage} className="system-color download"/> : null} */}
           <div className={'canvas' + (empty ? ' empty' : '')} id={this.state.chartId}></div>
         </div>
         {empty ? <Empty description={false}/> : null}
diff --git a/src/tabviews/custom/components/share/normalTable/index.jsx b/src/tabviews/custom/components/share/normalTable/index.jsx
index 2b00baa..66f8c96 100644
--- a/src/tabviews/custom/components/share/normalTable/index.jsx
+++ b/src/tabviews/custom/components/share/normalTable/index.jsx
@@ -110,7 +110,7 @@
     let { col, config, record, className, style, triggerLink, ...resProps } = this.props
 
     if (!col) return (<td {...resProps} className={className} style={style}/>)
-    
+
     if (col.type === 'text') {
       let content = ''
       if (record[col.field] !== undefined) {
@@ -124,6 +124,10 @@
           content = `${content.substr(0, 4)}-${content.substr(5, 2)}-${content.substr(8, 2)} ${content.substr(11, 2)}:${content.substr(14, 2)}:${content.substr(17, 2)}`
         } else if (col.textFormat === 'encryption') {
           content = <span>{col.prefix || ''}<Encrypts value={content} />{col.postfix || ''}</span>
+        }
+
+        if (col.noValue === 'hide' && content < '1949-10-02') {
+          content = ''
         }
 
         if (col.textFormat !== 'encryption') {
@@ -162,21 +166,22 @@
         resProps.rowSpan = record['$$' + col.field]
       }
       
-      if (!record.$disabled && (col.linkThdMenu || col.linkurl)) {
-        content = (
-          <div>
-            <div className="link-menu" onDoubleClick={(e) => triggerLink(e, col, record)}></div>
-            {content}
-          </div>
-        )
-      }
-
       resProps.children = content
+
+      if (!record.$disabled && (col.linkThdMenu || col.linkurl)) {
+        style = style || {}
+        style.cursor = 'pointer'
+
+        return (<td {...resProps} className={className} onDoubleClick={() => triggerLink(col, record)} style={style}/>)
+      }
     } else if (col.type === 'number') {
       let content = ''
       try {
         content = parseFloat(record[col.field])
         if (isNaN(content)) {
+          content = ''
+        }
+        if (col.noValue === 'hide' && content === 0) {
           content = ''
         }
       } catch (e) {
@@ -235,16 +240,14 @@
         resProps.rowSpan = record['$$' + col.field]
       }
 
-      if (!record.$disabled && (col.linkThdMenu || col.linkurl)) {
-        content = (
-          <div>
-            <div className="link-menu" onDoubleClick={(e) => triggerLink(e, col, record)}></div>
-            {content}
-          </div>
-        )
-      }
-
       resProps.children = content
+
+      if (!record.$disabled && (col.linkThdMenu || col.linkurl)) {
+        style = style || {}
+        style.cursor = 'pointer'
+
+        return (<td {...resProps} className={className} onDoubleClick={() => triggerLink(col, record)} style={style}/>)
+      }
     } else if (col.type === 'picture') {
       let photos = ''
       if (record[col.field]) {
@@ -352,6 +355,10 @@
           // eslint-disable-next-line
           let func = new Function('data', col.formula)
           content = func([record])
+
+          if (col.noValue === 'hide' && content === 0) {
+            content = ''
+          }
         } catch (e) {
           console.warn(e)
           content = ''
@@ -365,6 +372,10 @@
           try {
             // eslint-disable-next-line
             content = eval(content)
+
+            if (col.noValue === 'hide' && content === 0) {
+              content = ''
+            }
           } catch (e) {
             console.info(content)
             console.warn(e)
@@ -795,9 +806,7 @@
   }
 
   // 瀛楁閫忚
-  triggerLink = (e, item, record) => {
-    e.stopPropagation()
-
+  triggerLink = (item, record) => {
     let __param = {
       $searchkey: item.field,
       $searchval: record[item.field] || '',
diff --git a/src/tabviews/custom/components/share/normalTable/index.scss b/src/tabviews/custom/components/share/normalTable/index.scss
index 41dce81..6dbd534 100644
--- a/src/tabviews/custom/components/share/normalTable/index.scss
+++ b/src/tabviews/custom/components/share/normalTable/index.scss
@@ -116,68 +116,35 @@
             display: none;
           }
         }
-        .action-col {
-          .ant-btn > .anticon + span {
-            margin-left: 3px;
-          }
-          button {
-            border: 0;
-            background-color: transparent;
-            color: #1890ff;
-            box-shadow: none;
-            padding: 0 5px;
-            .anticon-loading {
-              display: none;
-            }
-          }
-          > div {
-            margin: 0 3px;
-          }
-          > button {
-            margin: 0 3px;
-          }
-          .ant-btn.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) {
-            padding-left: 0px;
-          }
-        }
       }
       .ant-table-tbody > tr > td[rowspan] {
         vertical-align: middle;
       }
-      .ant-table-tbody > tr > td.ant-table-column-has-actions {
-        .content {
-          position: relative;
-          z-index: 1;
-          word-wrap: break-word;
-          word-break: break-word;
-        }
-      }
+      // .ant-table-tbody > tr > td.ant-table-column-has-actions {
+      //   .content {
+      //     position: relative;
+      //     z-index: 1;
+      //     word-wrap: break-word;
+      //     word-break: break-word;
+      //   }
+      // }
       .ant-table-tbody > tr > td {
         position: relative;
-        .link-menu {
-          position: absolute;
-          top: 0px;
-          left: 0px;
-          right: 0px;
-          bottom: 0px;
-          opacity: 0;
-          cursor: pointer;
-        }
       }
-      .ant-table-tbody > tr > td .content {
-        p {
-          margin-bottom: 2px;
-        }
-        span {
-          display: inline-block;
-          margin-right: 5px;
-        }
-      }
-      .ant-table-tbody > tr > td .button {
-        .ant-btn {
-          margin-bottom: 10px;
-        }
-      }
+      // .ant-table-tbody > tr > td .content {
+      //   p {
+      //     margin-bottom: 2px;
+      //   }
+      //   span {
+      //     display: inline-block;
+      //     margin-right: 5px;
+      //   }
+      // }
+      // .ant-table-tbody > tr > td .button {
+      //   .ant-btn {
+      //     margin-bottom: 10px;
+      //   }
+      // }
     }
   }
   // .ant-table-body::-webkit-scrollbar {
diff --git a/src/tabviews/custom/components/table/base-table/index.jsx b/src/tabviews/custom/components/table/base-table/index.jsx
index 7c86fca..ec29c8f 100644
--- a/src/tabviews/custom/components/table/base-table/index.jsx
+++ b/src/tabviews/custom/components/table/base-table/index.jsx
@@ -104,6 +104,7 @@
       this.setState({
         data: [],
         selectedData: [],
+        loading: false,
         total: 0
       })
       
@@ -112,6 +113,8 @@
       if (setting.$hasSyncModule) {
         MKEmitter.emit('syncBalconyData', config.uuid, [], false)
       }
+
+      this.requestId = ''
       return
     }
 
@@ -137,8 +140,12 @@
     let _orderBy = orderBy || setting.order
     let param = UtilsDM.getQueryDataParams(setting, searches, _orderBy, pageIndex, pageSize, BID)
 
-    let result = await Api.genericInterface(param, setting.js_script)
+    this.requestId = config.uuid + new Date().getTime()
+
+    let result = await Api.genericInterface(param, setting.js_script, '', this.requestId)
     if (result.status) {
+      if (result.$requestId && this.requestId !== result.$requestId) return
+
       if (repage === 'false' && result.data && result.data.length === 0 && result.total > 0 && pageIndex > 1) {
         let _pageIndex = Math.ceil(result.total / pageSize)
 
diff --git a/src/tabviews/custom/components/table/edit-table/index.jsx b/src/tabviews/custom/components/table/edit-table/index.jsx
index 77c9061..14776ec 100644
--- a/src/tabviews/custom/components/table/edit-table/index.jsx
+++ b/src/tabviews/custom/components/table/edit-table/index.jsx
@@ -271,9 +271,12 @@
       this.setState({
         data: [],
         selectedData: [],
+        loading: false,
         total: 0
       })
       reset && MKEmitter.emit('resetTable', config.uuid, 'true') // 鍒楄〃閲嶇疆
+
+      this.requestId = ''
       return
     }
 
@@ -299,8 +302,12 @@
     let _orderBy = orderBy || setting.order
     let param = UtilsDM.getQueryDataParams(setting, searches, _orderBy, pageIndex, pageSize, BID)
 
-    let result = await Api.genericInterface(param)
+    this.requestId = config.uuid + new Date().getTime()
+
+    let result = await Api.genericInterface(param, '', '', this.requestId)
     if (result.status) {
+      if (result.$requestId && this.requestId !== result.$requestId) return
+      
       reset && MKEmitter.emit('resetTable', config.uuid, repage) // 鍒楄〃閲嶇疆
 
       let start = 1
diff --git a/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx b/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx
index ee270d7..4bcdb13 100644
--- a/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx
+++ b/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx
@@ -767,6 +767,10 @@
           content = <span>{col.prefix || ''}<Encrypts value={content} />{col.postfix || ''}</span>
         }
 
+        if (col.noValue === 'hide' && content < '1949-10-02') {
+          content = ''
+        }
+
         if (col.textFormat !== 'encryption') {
           content = (col.prefix || '') + content + (col.postfix || '')
         }
@@ -1107,6 +1111,10 @@
             content = <span>{col.prefix || ''}<Encrypts value={content} />{col.postfix || ''}</span>
           }
 
+          if (col.noValue === 'hide' && content < '1949-10-02') {
+            content = ''
+          }
+
           if (col.textFormat !== 'encryption') {
             content = (col.prefix || '') + content + (col.postfix || '')
           }
diff --git a/src/tabviews/custom/components/table/edit-table/normalTable/index.scss b/src/tabviews/custom/components/table/edit-table/normalTable/index.scss
index 1f2fb54..a3362b3 100644
--- a/src/tabviews/custom/components/table/edit-table/normalTable/index.scss
+++ b/src/tabviews/custom/components/table/edit-table/normalTable/index.scss
@@ -70,68 +70,35 @@
           color: inherit;
           overflow: hidden;
         }
-        .action-col {
-          .ant-btn > .anticon + span {
-            margin-left: 3px;
-          }
-          button {
-            border: 0;
-            background-color: transparent;
-            color: #1890ff;
-            box-shadow: none;
-            padding: 0 5px;
-            .anticon-loading {
-              display: none;
-            }
-          }
-          > div {
-            margin: 0 3px;
-          }
-          > button {
-            margin: 0 3px;
-          }
-          .ant-btn.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) {
-            padding-left: 0px;
-          }
-        }
       }
       .ant-table-tbody > tr > td[rowspan] {
         vertical-align: middle;
       }
-      .ant-table-tbody > tr > td.ant-table-column-has-actions {
-        .content {
-          position: relative;
-          z-index: 1;
-          word-wrap: break-word;
-          word-break: break-word;
-        }
-      }
+      // .ant-table-tbody > tr > td.ant-table-column-has-actions {
+      //   .content {
+      //     position: relative;
+      //     z-index: 1;
+      //     word-wrap: break-word;
+      //     word-break: break-word;
+      //   }
+      // }
       .ant-table-tbody > tr > td {
         position: relative;
-        .link-menu {
-          position: absolute;
-          top: 0px;
-          left: 0px;
-          right: 0px;
-          bottom: 0px;
-          opacity: 0;
-          cursor: pointer;
-        }
       }
-      .ant-table-tbody > tr > td .content {
-        p {
-          margin-bottom: 2px;
-        }
-        span {
-          display: inline-block;
-          margin-right: 5px;
-        }
-      }
-      .ant-table-tbody > tr > td .button {
-        .ant-btn {
-          margin-bottom: 10px;
-        }
-      }
+      // .ant-table-tbody > tr > td .content {
+      //   p {
+      //     margin-bottom: 2px;
+      //   }
+      //   span {
+      //     display: inline-block;
+      //     margin-right: 5px;
+      //   }
+      // }
+      // .ant-table-tbody > tr > td .button {
+      //   .ant-btn {
+      //     margin-bottom: 10px;
+      //   }
+      // }
     }
   }
 
diff --git a/src/tabviews/custom/components/table/normal-table/index.jsx b/src/tabviews/custom/components/table/normal-table/index.jsx
index 676488a..92c7018 100644
--- a/src/tabviews/custom/components/table/normal-table/index.jsx
+++ b/src/tabviews/custom/components/table/normal-table/index.jsx
@@ -390,6 +390,7 @@
       this.setState({
         data: [],
         selectedData: [],
+        loading: false,
         total: 0
       })
       
@@ -400,6 +401,7 @@
       }
 
       this.loaded = true
+      this.requestId = ''
       return
     }
 
@@ -427,8 +429,12 @@
     let _orderBy = orderBy || setting.order
     let param = UtilsDM.getQueryDataParams(setting, searches, _orderBy, pageIndex, pageSize, BID)
 
-    let result = await Api.genericInterface(param)
+    this.requestId = config.uuid + new Date().getTime()
+
+    let result = await Api.genericInterface(param, '', '', this.requestId)
     if (result.status) {
+      if (result.$requestId && this.requestId !== result.$requestId) return
+      
       this.loaded = true
       if (config.$cache && type === 'init') {
         Api.writeCacheConfig(config.uuid, result.data || [], BID)
diff --git a/src/tabviews/custom/index.jsx b/src/tabviews/custom/index.jsx
index d41d649..983d3c3 100644
--- a/src/tabviews/custom/index.jsx
+++ b/src/tabviews/custom/index.jsx
@@ -451,6 +451,8 @@
             }
           }
 
+          tab.$menuname = (MenuName || '') + '-' + (tab.label || '')
+
           return true
         })
 
diff --git a/src/tabviews/custom/popview/index.jsx b/src/tabviews/custom/popview/index.jsx
index 2e3bdff..ca70341 100644
--- a/src/tabviews/custom/popview/index.jsx
+++ b/src/tabviews/custom/popview/index.jsx
@@ -70,6 +70,7 @@
         config = JSON.stringify(config)
         config = config.replace(/@mywebsite@\//ig, window.GLOB.baseurl)
         config = JSON.parse(config)
+        config.MenuName = Tab.logLabel || Tab.label || ''
       } catch (e) {
         console.warn('Parse Failure')
         config = ''
@@ -227,6 +228,8 @@
             }
           }
 
+          tab.$menuname = (Tab.logLabel || Tab.label || '') + '-' + (tab.label || '')
+
           return true
         })
 
diff --git a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
index 59c62e1..5db6635 100644
--- a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
@@ -529,6 +529,9 @@
                 val = Math.round(val * col.round) / col.round
                 // val = val.toFixed(col.decimal)
               }
+              if (col.noValue === 'false' && val === 0) {
+                val = ''
+              }
             }
 
             _row[col.Column] = val
@@ -620,6 +623,9 @@
                 val = Math.round(val * col.round) / col.round
                 // val = val.toFixed(col.decimal)
               }
+              if (col.noValue === 'false' && val === 0) {
+                val = ''
+              }
             }
 
             _row[col.Column] = val
diff --git a/src/tabviews/zshare/actionList/newpagebutton/index.jsx b/src/tabviews/zshare/actionList/newpagebutton/index.jsx
index a3fafce..01d678e 100644
--- a/src/tabviews/zshare/actionList/newpagebutton/index.jsx
+++ b/src/tabviews/zshare/actionList/newpagebutton/index.jsx
@@ -193,7 +193,7 @@
         cancelText: '鏀粯閬囧埌闂',
         onOk() {
           // 鏀粯鍚庡埛鏂扮晫闈�
-          MKEmitter.emit('refreshByButtonResult', btn.$menuId, 'grid', btn)
+          MKEmitter.emit('reloadMenuView', btn.$MenuID)
         },
         onCancel() {
           MKEmitter.emit('refreshByButtonResult', btn.$menuId, 'grid', btn)
diff --git a/src/tabviews/zshare/actionList/normalbutton/index.jsx b/src/tabviews/zshare/actionList/normalbutton/index.jsx
index 30a56a1..f58f2fe 100644
--- a/src/tabviews/zshare/actionList/normalbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -1721,9 +1721,9 @@
       sql = sql.replace(/@typename@/ig, `'admin'`)
 
       if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
-        sql = sql.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
+        sql = sql.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, `'Y'`)
       } else {
-        sql = sql.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
+        sql = sql.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, `''`)
       }
 
       if (window.GLOB.debugger === true) {
@@ -3254,6 +3254,20 @@
               console.warn(e)
               _item.value = ''
             }
+          } else if (item.interception === 'charTure') {
+            let str = _item.value.replace(/(^\s*|\s*$)/g, '')
+            let result = ''
+            for (let i = 0 ; i < str.length; i++) {
+              let code = str.charCodeAt(i)
+              if (code >= 65281 && code <= 65373) {
+                result += String.fromCharCode(str.charCodeAt(i) - 65248)
+              } else if (code === 12288) {
+                result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32)
+              } else {
+                result += str.charAt(i)
+              }
+            }
+            _item.value = result
           } else {
             _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
           }
diff --git a/src/tabviews/zshare/actionList/printbutton/index.jsx b/src/tabviews/zshare/actionList/printbutton/index.jsx
index da72ac9..6627f32 100644
--- a/src/tabviews/zshare/actionList/printbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/printbutton/index.jsx
@@ -2186,6 +2186,20 @@
               console.warn(e)
               _item.value = ''
             }
+          } else if (item.interception === 'charTure') {
+            let str = _item.value.replace(/(^\s*|\s*$)/g, '')
+            let result = ''
+            for (let i = 0 ; i < str.length; i++) {
+              let code = str.charCodeAt(i)
+              if (code >= 65281 && code <= 65373) {
+                result += String.fromCharCode(str.charCodeAt(i) - 65248)
+              } else if (code === 12288) {
+                result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32)
+              } else {
+                result += str.charAt(i)
+              }
+            }
+            _item.value = result
           } else {
             _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
           }
diff --git a/src/tabviews/zshare/mutilform/index.jsx b/src/tabviews/zshare/mutilform/index.jsx
index 5bf91e8..c987f75 100644
--- a/src/tabviews/zshare/mutilform/index.jsx
+++ b/src/tabviews/zshare/mutilform/index.jsx
@@ -1379,6 +1379,20 @@
                   console.warn(e)
                   _item.value = ''
                 }
+              } else if (item.interception === 'charTure') {
+                let str = _item.value.replace(/(^\s*|\s*$)/g, '')
+                let result = ''
+                for (let i = 0 ; i < str.length; i++) {
+                  let code = str.charCodeAt(i)
+                  if (code >= 65281 && code <= 65373) {
+                    result += String.fromCharCode(str.charCodeAt(i) - 65248)
+                  } else if (code === 12288) {
+                    result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32)
+                  } else {
+                    result += str.charAt(i)
+                  }
+                }
+                _item.value = result
               } else {
                 _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
               }
diff --git a/src/tabviews/zshare/topSearch/advanceform/index.scss b/src/tabviews/zshare/topSearch/advanceform/index.scss
index b3cdf80..fa9af70 100644
--- a/src/tabviews/zshare/topSearch/advanceform/index.scss
+++ b/src/tabviews/zshare/topSearch/advanceform/index.scss
@@ -22,6 +22,9 @@
   .ant-form-item-label {
     text-overflow: ellipsis;
   }
+  label[title=" "]::after, label[title="  "]::after {
+    display: none;
+  }
   .daterange .ant-calendar-picker-input {
     padding: 4px 20px 4px 5px;
     font-size: 13px;
diff --git a/src/tabviews/zshare/topSearch/index.scss b/src/tabviews/zshare/topSearch/index.scss
index 3444190..9d96cca 100644
--- a/src/tabviews/zshare/topSearch/index.scss
+++ b/src/tabviews/zshare/topSearch/index.scss
@@ -24,6 +24,9 @@
   .ant-form-item-label {
     text-overflow: ellipsis;
   }
+  label[title=" "]::after, label[title="  "]::after {
+    display: none;
+  }
   .daterange .ant-calendar-picker-input {
     padding: 4px 20px 4px 5px;
     font-size: 13px;
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelin/columnform/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelin/columnform/index.jsx
index 7450d0d..28f2df9 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelin/columnform/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelin/columnform/index.jsx
@@ -45,10 +45,11 @@
           values.limit = ''
         }
 
-        this.props.columnChange(values)
-        this.props.form.setFieldsValue({
-          Column: '',
-          Text: ''
+        this.props.columnChange(values, () => {
+          this.props.form.setFieldsValue({
+            Column: '',
+            Text: ''
+          })
         })
       }
     })
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
index a8733e8..3bba3de 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
@@ -521,7 +521,7 @@
     })
   }
 
-  columnChange = (values) => {
+  columnChange = (values, callback) => {
     let verify = JSON.parse(JSON.stringify(this.state.verify))
 
     let fields = verify.columns.map(item => item.Column)
@@ -532,6 +532,8 @@
         duration: 5
       })
       return
+    } else {
+      callback()
     }
 
     values.uuid = Utils.getuuid()
@@ -902,19 +904,6 @@
                     </Radio.Group>)}
                   </Form.Item>
                 </Col>
-                {verify.excelHandle === 'true' ? <Col span={24} style={{paddingLeft: '30px'}}>
-                  <Form.Item wrapperCol={ {xs: { span: 24 }, sm: { span: 24 }} } label="">
-                    {getFieldDecorator('excel_func', {
-                      initialValue: verify.excel_func || '',
-                      rules: [
-                        {
-                          required: true,
-                          message: '璇峰~鍐欒嚜瀹氫箟閫昏緫!'
-                        }
-                      ]
-                    })(<CodeMirror mode="text/javascript" theme="cobalt" />)}
-                  </Form.Item>
-                </Col> : null}
                 {verify.excelHandle !== 'true' ? <Col span={8}>
                   <Form.Item label={
                     <Tooltip placement="bottomLeft" title="瀵煎叆鏃跺伐浣滆〃鍚嶄笌excel涓繀椤讳竴鑷达紝娉細宸ヤ綔琛ㄥ悕涓篠heet1涓攅xcel涓粎鏈変竴涓伐浣滆〃鏃朵笉杩涜琛ㄥ悕楠岃瘉銆�">
@@ -933,7 +922,7 @@
                     })(<Input placeholder="" autoComplete="off" />)}
                   </Form.Item>
                 </Col> : null}
-                {verify.excelHandle !== 'true' ? <Col span={8}>
+                <Col span={8}>
                   <Form.Item label={
                     <Tooltip placement="bottomLeft" title="蹇界暐棣栬鏃讹紝浼氭牎楠宔xcel涓〃澶村悕绉颁笌excel鍒楄缃槸鍚︿竴鑷淬��">
                       <QuestionCircleOutlined className="mk-form-tip" />
@@ -944,6 +933,19 @@
                       initialValue: verify.range || 0
                     })(<InputNumber min={0} max={100} precision={0} />)}
                   </Form.Item>
+                </Col>
+                {verify.excelHandle === 'true' ? <Col span={24} style={{paddingLeft: '30px'}}>
+                  <Form.Item wrapperCol={ {xs: { span: 24 }, sm: { span: 24 }} } label="">
+                    {getFieldDecorator('excel_func', {
+                      initialValue: verify.excel_func || '',
+                      rules: [
+                        {
+                          required: true,
+                          message: '璇峰~鍐欒嚜瀹氫箟閫昏緫!'
+                        }
+                      ]
+                    })(<CodeMirror mode="text/javascript" theme="cobalt" />)}
+                  </Form.Item>
                 </Col> : null}
               </Row>
             </Form>
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/columnform/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/columnform/index.jsx
index 3e535cb..24e658c 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/columnform/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/columnform/index.jsx
@@ -12,11 +12,12 @@
     // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
     this.props.form.validateFieldsAndScroll((err, values) => {
       if (!err) {
-        this.props.columnChange(values)
-        this.props.form.setFieldsValue({
-          Column: '',
-          Text: '',
-          Width: 20
+        this.props.columnChange(values, () => {
+          this.props.form.setFieldsValue({
+            Column: '',
+            Text: '',
+            Width: 20
+          })
         })
       }
     })
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
index 5acaeb6..21d53fe 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
@@ -68,7 +68,7 @@
         editable: true,
         required: false,
         keyCol: true,
-        width: '12%',
+        width: '8%',
         render: (text) => {
           if (text === 'image') {
             return '鍥剧墖'
@@ -90,7 +90,7 @@
         inputType: 'radio',
         editable: true,
         required: false,
-        width: '12%',
+        width: '10%',
         render: (text) => {
           if (text !== 'false') {
             return '鏄�'
@@ -122,11 +122,33 @@
         editable: true,
         required: false,
         keyVals: ['number'],
-        width: '12%',
+        width: '10%',
         render: (text, record) => {
           if (record.type !== 'number') return ''
 
           if (text === 'true') {
+            return '鏄�'
+          } else {
+            return '鍚�'
+          }
+        },
+        options: [
+          {value: 'true', text: '鏄�'},
+          {value: 'false', text: '鍚�'}
+        ]
+      },
+      {
+        title: '0鍊煎鍑�',
+        dataIndex: 'noValue',
+        inputType: 'radio',
+        editable: true,
+        required: false,
+        keyVals: ['number'],
+        width: '10%',
+        render: (text, record) => {
+          if (record.type !== 'number') return ''
+
+          if (text !== 'false') {
             return '鏄�'
           } else {
             return '鍚�'
@@ -235,6 +257,7 @@
       col.type = col.type || 'text'
       col.output = col.output || 'true'
       col.required = col.required || 'false'
+      col.noValue = col.noValue || 'true'
 
       if (!['text', 'image', 'number'].includes(col.type)) {
         if (/^Decimal/ig.test(col.type)) {
@@ -411,7 +434,7 @@
     })
   }
 
-  columnChange = (values) => {
+  columnChange = (values, callback) => {
     let verify = JSON.parse(JSON.stringify(this.state.verify))
 
     let fields = verify.columns.map(item => item.Column)
@@ -422,6 +445,8 @@
         duration: 5
       })
       return
+    } else {
+      callback()
     }
     values.uuid = Utils.getuuid()
     values.abs = 'false'
@@ -528,6 +553,26 @@
         return
       }
 
+      if (verify.dataType === 'custom') {
+        if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) {
+          notification.warning({
+            top: 92,
+            message: '瀛樺湪鏈繚瀛樿剼鏈紝璇风偣鍑荤‘瀹氫繚瀛橈紝鎴栫偣鍑诲彇娑堟斁寮冧慨鏀癸紒',
+            duration: 5
+          })
+          this.setState({activeKey: 'scripts'})
+          return
+        }
+      }
+      if (this.columnRef && this.columnRef.state.editingKey) {
+        notification.warning({
+          top: 92,
+          message: '瀛楁鏈繚瀛橈紒',
+          duration: 5
+        })
+        return
+      }
+
       if (card.intertype === 'system' && verify.dataType !== 'custom' && verify.columns.length > 0 && config.$c_ds && config.setting.interType === 'system' && config.columns && config.columns.length > 0) {
         let cols = []
         let columns = config.columns.map(c => c.field)
@@ -585,15 +630,6 @@
           })
         })
       } else if (activeKey === 'columns') {
-        if (this.columnRef && this.columnRef.state.editingKey) {
-          notification.warning({
-            top: 92,
-            message: '瀛楁鏈繚瀛橈紒',
-            duration: 5
-          })
-          return
-        }
-
         if (this.props.card.intertype !== 'system' || verify.dataType !== 'custom') {
           resolve(verify)
         } else {
@@ -612,15 +648,6 @@
           }, verify.scripts)
         }
       } else if (activeKey === 'scripts') {
-        if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) {
-          notification.warning({
-            top: 92,
-            message: '瀛樺湪鏈繚瀛樿剼鏈紝璇风偣鍑荤‘瀹氫繚瀛橈紝鎴栫偣鍑诲彇娑堟斁寮冧慨鏀癸紒',
-            duration: 5
-          })
-          return
-        }
-  
         this.setState({loading: true})
         this.sqlverify(() => { // 楠岃瘉鎴愬姛
           this.setState({
@@ -775,6 +802,8 @@
       col.type = col.type || 'text'
       col.output = col.output || 'true'
       col.required = col.required || 'false'
+      col.noValue = col.noValue || 'true'
+      col.Width = col.Width || 20
 
       if (!['text', 'image', 'number'].includes(col.type)) {
         if (/^Decimal/ig.test(col.type)) {
diff --git a/src/templates/sharecomponent/searchcomponent/index.scss b/src/templates/sharecomponent/searchcomponent/index.scss
index f568c19..b82e0a3 100644
--- a/src/templates/sharecomponent/searchcomponent/index.scss
+++ b/src/templates/sharecomponent/searchcomponent/index.scss
@@ -50,6 +50,9 @@
       .ant-form-item-label {
         float: left;
       }
+      label[title=" "]::after, label[title="  "]::after {
+        display: none;
+      }
       .ant-form-item-control-wrapper {
         float: left;
         .ant-select {
diff --git a/src/templates/zshare/formconfig.jsx b/src/templates/zshare/formconfig.jsx
index 6b339c9..c2a388a 100644
--- a/src/templates/zshare/formconfig.jsx
+++ b/src/templates/zshare/formconfig.jsx
@@ -2064,6 +2064,7 @@
       key: 'inputType',
       label: '鍔犲瘑鏄剧ず',
       initVal: card.inputType || 'text',
+      tooltip: '杈撳叆妗嗗唴瀹逛互 ****** 鏄剧ず銆�',
       required: false,
       options: [{
         value: 'text',
@@ -2074,17 +2075,23 @@
       }]
     },
     {
-      type: 'radio',
+      type: 'select',
       key: 'interception',
-      label: '鎴彇鏂瑰紡',
+      label: '鏂囨湰棰勫鐞�',
       initVal: card.interception || 'true',
-      tooltip: '鎻愪氦鏃剁殑鏂囨湰澶勭悊鏂瑰紡锛岀┖鐧藉瓧绗︽寚寮�澶存垨缁撳熬鐨勭┖鐧藉瓧绗︺��',
+      tooltip: '鎻愪氦鏃剁殑鏂囨湰澶勭悊鏂瑰紡銆傛敞锛氬叏瑙掕浆鍗婅鏃朵細鍘婚櫎棣栧熬绌烘牸',
       options: [{
         value: 'false',
         text: '鏃�'
       }, {
         value: 'true',
-        text: '绌虹櫧瀛楃'
+        text: '鍘绘帀棣栧熬绌烘牸'
+      // }, {
+      //   value: 'char',
+      //   text: '鍏ㄨ杞崐瑙�'
+      }, {
+        value: 'charTure',
+        text: '鍏ㄨ杞崐瑙�'
       }, {
         value: 'func',
         text: '鑷畾涔夊嚱鏁�'
diff --git a/src/templates/zshare/verifycard/baseform/index.jsx b/src/templates/zshare/verifycard/baseform/index.jsx
index c408e74..44e887b 100644
--- a/src/templates/zshare/verifycard/baseform/index.jsx
+++ b/src/templates/zshare/verifycard/baseform/index.jsx
@@ -507,7 +507,19 @@
             </Form.Item>
           </Col> : null}
           {verify.printEnable === 'true' ? <Col span={8}>
-            <Form.Item label="鎵撳嵃妯℃澘" required>
+            <Form.Item label="鎵撳嵃妯℃澘" required help={(() => {
+              if (verify.printTempId) {
+                return <span onClick={() => {
+                  sessionStorage.setItem('mk-print-temp', verify.printTempId)
+                  window.open('#/hs')
+
+                  setTimeout(() => {
+                    sessionStorage.removeItem('mk-print-temp')
+                  }, 50)
+                }} style={{color: '#1890ff', cursor: 'pointer', fontSize: '13px'}}>#鏌ョ湅妯℃澘</span>
+              }
+              return null
+            })()}>
               <MkPrintTemps value={verify.printTempId} onChange={this.onPrintIdChange}/>
             </Form.Item>
           </Col> : null}
diff --git a/src/templates/zshare/verifycard/callbackcustomscript/index.jsx b/src/templates/zshare/verifycard/callbackcustomscript/index.jsx
index bad06ba..c0c0a6c 100644
--- a/src/templates/zshare/verifycard/callbackcustomscript/index.jsx
+++ b/src/templates/zshare/verifycard/callbackcustomscript/index.jsx
@@ -12,7 +12,8 @@
   static propTpyes = {
     btn: PropTypes.object,          // 鎸夐挳淇℃伅
     initsql: PropTypes.string,      // 鍒濆鍖栬剼鏈�
-    usefulfields: PropTypes.string, // 鍙敤瀛楁
+    formfields: PropTypes.string,
+    colfields: PropTypes.string,
     systemScripts: PropTypes.array, // 绯荤粺鑴氭湰
     customScripts: PropTypes.array, // 鑷畾涔夎剼鏈�
     scriptsChange: PropTypes.func   // 琛ㄥ崟
@@ -56,6 +57,15 @@
       }
 
       if (!err) {
+        if (/^[\s\n]+$/.test(values.sql)) {
+          notification.warning({
+            top: 92,
+            message: '璇疯緭鍏ql!',
+            duration: 5
+          })
+          return
+        }
+
         values.uuid = editItem ? editItem.uuid : ''
         values.position = values.position || (editItem ? editItem.position : 'front')
 
@@ -115,6 +125,7 @@
 
         // 鏁版嵁鏉冮檺
         sql = sql.replace(/@\$|\$@/ig, '').replace(/\$check@|@check\$/ig, '')
+        sql = sql.replace(/@datam@/ig, `''`)
         sql = sql.replace(/@typename@/ig, `'debug'`)
         
         if (skip) {
@@ -187,7 +198,7 @@
   }
 
   render() {
-    const { usefulfields, systemScripts, btn, type } = this.props
+    const { formfields, colfields, systemScripts, btn, type } = this.props
     const { getFieldDecorator } = this.props.form
     const { editItem, skip } = this.state
     const formItemLayout = {
@@ -201,27 +212,26 @@
       }
     }
 
-    // let _usefulfields = usefulfields ? usefulfields.replace(/(BID|ID|LoginUID|SessionUid|UserID|Appkey|UserName|FullName|RoleID|mk_departmentcode|mk_organization|mk_nation|mk_province|mk_city|mk_district|mk_address|mk_user_type|BillCode|BVoucher|FIBVoucherDate|FiYear|ModularDetailCode),\s/ig, '') : null
-
     return (
       <Form {...formItemLayout} className="verify-form verify-custom-callback-scripts" id="verify-custom-callback-scripts">
         <Row gutter={24}>
           {!type ? <Col span={8}>
-            <Form.Item label={'琛ㄥ悕'} style={{whiteSpace: 'nowrap', margin: 0}}>
+            <Form.Item label="琛ㄥ悕" style={{whiteSpace: 'nowrap', margin: 0}}>
               {btn.cbTable}
             </Form.Item>
           </Col> : null}
           {!type ? <Col span={10}>
-            <Form.Item label={'鎶ラ敊瀛楁'} style={{margin: 0, whiteSpace: 'nowrap'}}>
+            <Form.Item label="鎶ラ敊瀛楁" style={{margin: 0, whiteSpace: 'nowrap'}}>
               ErrorCode锛堝鍔犲悗缂�NT琛ㄧず鏁版嵁涓嶅洖婊氾紝濡侲NT銆丯NT銆丗NT銆丯MNT銆丆NT銆�-2NT锛�, retmsg
             </Form.Item>
           </Col> : null}
           {!type ? <Col span={24} className="sqlfield">
-            <Form.Item label={'鍙敤瀛楁'}>
-              <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'鍏叡鍊硷紝璇锋寜鐓xxx@鏍煎紡浣跨敤銆�'}><span style={{color: '#1890ff'}}>BID, ID, LoginUID, SessionUid, UserID, Appkey, time_id, typename</span></Tooltip>,&nbsp;
+            <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, typename, datam</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, 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> : ''}
+              {formfields ? <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title="琛ㄥ崟鍙橀噺锛岀郴缁熶細瀹氫箟鍙橀噺骞惰祴鍊笺��">, <span style={{color: '#8E44AD'}}>{formfields}</span></Tooltip> : ''}
+              {colfields ? <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title="瀛楁闆嗗彉閲忥紝绯荤粺浼氬畾涔夊彉閲忓苟璧嬪�笺��">, {colfields}</Tooltip> : ''}
             </Form.Item>
           </Col> : null}
           {!type ? <Col span={8} style={{whiteSpace: 'nowrap'}}>
@@ -242,7 +252,7 @@
             </Form.Item>
           </Col> : null}
           {!type ? <Col span={8}>
-            <Form.Item label={'蹇嵎娣诲姞'} style={{marginBottom: 0}}>
+            <Form.Item label="蹇嵎娣诲姞" style={{marginBottom: 0}}>
               <Select
                 allowClear
                 showSearch
diff --git a/src/templates/zshare/verifycard/customform/index.jsx b/src/templates/zshare/verifycard/customform/index.jsx
index ee29cbe..a111016 100644
--- a/src/templates/zshare/verifycard/customform/index.jsx
+++ b/src/templates/zshare/verifycard/customform/index.jsx
@@ -10,7 +10,8 @@
 class CustomForm extends Component {
   static propTpyes = {
     btn: PropTypes.object,          // 鎸夐挳
-    usefulfields: PropTypes.string, // 鍙敤瀛楁
+    formfields: PropTypes.string,
+    colfields: PropTypes.string,
     initsql: PropTypes.string,      // 鍙敤瀛楁
     customChange: PropTypes.func    // 琛ㄥ崟
   }
@@ -111,7 +112,7 @@
   }
 
   render() {
-    const { usefulfields, btn } = this.props
+    const { formfields, colfields, btn } = this.props
     const { getFieldDecorator } = this.props.form
     const formItemLayout = {
       labelCol: {
@@ -124,8 +125,6 @@
       }
     }
 
-    // let _usefulfields = usefulfields ? usefulfields.replace(/(BID|ID|LoginUID|SessionUid|UserID|Appkey|UserName|FullName|RoleID|mk_departmentcode|mk_organization|mk_nation|mk_province|mk_city|mk_district|mk_address|mk_user_type|BillCode|BVoucher|FIBVoucherDate|FiYear|ModularDetailCode),\s/ig, '') : null
-
     return (
       <Form {...formItemLayout} className="verify-form" id="verifycard2">
         <Row gutter={24}>
@@ -134,7 +133,8 @@
               <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, 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> : ''}
+              {formfields ? <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title="琛ㄥ崟鍙橀噺锛岀郴缁熶細瀹氫箟鍙橀噺骞惰祴鍊笺��">, <span style={{color: '#8E44AD'}}>{formfields}</span></Tooltip> : ''}
+              {colfields ? <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title="瀛楁闆嗗彉閲忥紝绯荤粺浼氬畾涔夊彉閲忓苟璧嬪�笺��">, {colfields}</Tooltip> : ''}
             </Form.Item>
           </Col>
           <Col span={21} className="sql">
diff --git a/src/templates/zshare/verifycard/customscript/index.jsx b/src/templates/zshare/verifycard/customscript/index.jsx
index b0e413a..0a068a3 100644
--- a/src/templates/zshare/verifycard/customscript/index.jsx
+++ b/src/templates/zshare/verifycard/customscript/index.jsx
@@ -12,7 +12,8 @@
   static propTpyes = {
     type: PropTypes.any,
     btn: PropTypes.object,
-    usefulfields: PropTypes.string,
+    formfields: PropTypes.string,
+    colfields: PropTypes.string,
     initsql: PropTypes.string,
     defaultsql: PropTypes.string,
     useDefaultSql: PropTypes.any,
@@ -276,7 +277,7 @@
   }
 
   render() {
-    const { usefulfields, systemScripts, btn, type, workFlow } = this.props
+    const { formfields, colfields, systemScripts, btn, type, workFlow } = this.props
     const { getFieldDecorator } = this.props.form
     const { editItem, skip } = this.state
     const formItemLayout = {
@@ -291,8 +292,6 @@
     }
 
     let _type = type || ''
-
-    // let _usefulfields = usefulfields ? usefulfields.replace(/(BID|ID|LoginUID|SessionUid|UserID|Appkey|UserName|FullName|RoleID|mk_departmentcode|mk_organization|mk_nation|mk_province|mk_city|mk_district|mk_address|mk_user_type|BillCode|BVoucher|FIBVoucherDate|FiYear|ModularDetailCode),\s/ig, '') : null
 
     return (
       <Form {...formItemLayout} className="verify-form verify-custom-scripts" id={'verify-custom-scripts' + _type}>
@@ -309,11 +308,12 @@
           </Col> : null}
           {!_type ? <Col span={24} className="sqlfield">
             <Form.Item label={'鍙敤瀛楁'}>
-              <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title={'鍏叡鍊硷紝璇锋寜鐓xxx@鏍煎紡浣跨敤銆�'}><span style={{color: '#1890ff'}}>BID, ID, LoginUID, SessionUid, UserID, Appkey, time_id, typename</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, 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}
+              <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title="鍏叡鍊硷紝璇锋寜鐓xxx@鏍煎紡浣跨敤銆�"><span style={{color: '#1890ff'}}>BID, ID, LoginUID, SessionUid, UserID, Appkey, time_id, typename, datam</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, 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>
+              {formfields ? <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title="琛ㄥ崟鍙橀噺锛岀郴缁熶細瀹氫箟鍙橀噺骞惰祴鍊笺��">, <span style={{color: '#8E44AD'}}>{formfields}</span></Tooltip> : ''}
+              {colfields ? <Tooltip mouseLeaveDelay={0.3} mouseEnterDelay={0.3} placement="top" title="瀛楁闆嗗彉閲忥紝绯荤粺浼氬畾涔夊彉閲忓苟璧嬪�笺��">, {colfields}</Tooltip> : ''}
+              {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/templates/zshare/verifycard/index.jsx b/src/templates/zshare/verifycard/index.jsx
index 1b7d9be..4617c6c 100644
--- a/src/templates/zshare/verifycard/index.jsx
+++ b/src/templates/zshare/verifycard/index.jsx
@@ -44,7 +44,8 @@
     emailCodes: [],         // 閭妯℃澘
     verify: {},
     fields: [],
-    usefulfields: '',
+    formfields: '',
+    colfields: '',
     defaultsql: '',         // 榛樿Sql
     orderModular: [],
     orderModularDetail: [],
@@ -715,15 +716,12 @@
       _fields = card.modal.fields || []
     }
 
-    let _usefulfields = ['UserName', 'FullName', 'RoleID', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'ModularDetailCode', 'tbid', 'mk_deleted']
+    let sysfields = ['UserName', 'FullName', 'RoleID', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'ModularDetailCode', 'tbid', 'mk_deleted', 'bid']
     let _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)', '@BillCode nvarchar(50)', '@BVoucher nvarchar(50)', '@FIBVoucherDate nvarchar(50)', '@FiYear nvarchar(50)', '@ModularDetailCode nvarchar(50)', '@bid nvarchar(50)', '@tbid nvarchar(50)', '@mk_deleted int']
     let _select = ['@UserName=\'\'', '@FullName=\'\'', '@RoleID=\'\'', '@mk_departmentcode=\'\'', '@mk_organization=\'\'', '@mk_user_type=\'\'', '@mk_nation=\'\'', '@mk_province=\'\'', '@mk_city=\'\'', '@mk_district=\'\'', '@mk_address=\'\'', '@ErrorCode=\'\'', '@retmsg=\'\'', '@BillCode=\'\'', '@BVoucher=\'\'', '@FIBVoucherDate=\'\'', '@FiYear=\'\'', '@ModularDetailCode=\'\'', '@bid=\'\'', '@mk_deleted=1']
-    let fieldArr = _usefulfields.map(_f => _f.toLowerCase())
-    let hasBid = false
-
-    _usefulfields = []
     
-    fieldArr.push('bid')
+    let fieldArr = sysfields.map(_f => _f.toLowerCase())
+    let hasBid = false
 
     let verIndex = _fields.findIndex(item => item.type === 'vercode')
     if (verIndex > -1) {
@@ -746,6 +744,7 @@
       })
     }
 
+    let formfields = []
     _fields = _fields.filter(_f => _f.field)
     _fields.forEach(_f => {
       if (_f.field.toLowerCase() === 'bid') {
@@ -756,7 +755,7 @@
 
       fieldArr.push(_f.field.toLowerCase())
 
-      _usefulfields.push(_f.field)
+      formfields.push(_f.field)
 
       let _fieldlen = _f.fieldlength || 50
 
@@ -799,6 +798,7 @@
     let unionFields = fromJS(_fields).toJS()
     let formArr = _fields.map(_f => _f.field.toLowerCase())
 
+    let colfields = []
     if (card.Ot !== 'notRequired' && columns) {
       columns.forEach(_f => {
         if (!_f.field) return
@@ -813,7 +813,7 @@
         if (fieldArr.includes(key)) return
 
         fieldArr.push(key)
-        _usefulfields.push(_f.field)
+        colfields.push(_f.field)
 
         if (_f.datatype) { // 鑷畾涔夊瓧娈�
           if (/decimal/ig.test(_f.datatype)) {
@@ -1033,7 +1033,8 @@
       columnsFields: _columns,
       initsql: _sql,
       defaultsql: _defaultsql,
-      usefulfields: _usefulfields.join(', '),
+      formfields: formfields.join(', '),
+      colfields: colfields.join(', '),
       uniqueColumns: this.state.uniqueColumns.map(col => {
         if (col.dataIndex === 'field') {
           col.options = uniqueFields
@@ -1261,7 +1262,7 @@
       verify.scripts.push(values)
     }
 
-    if (/@bvoucher(\s|\))/ig.test(values.sql)) {
+    if (/@bvoucher(\s|\))/ig.test(values.sql) && !/s_BVoucher_Create/ig.test(values.sql)) {
       if (verify.voucher && verify.voucher.enabled) {
 
       } else if (card.Ot !== 'notRequired' && columns) {
@@ -1664,7 +1665,7 @@
 
   render() {
     const { card, columns } = this.props
-    const { activeKey, verifyInter, verify, fields, uniqueFields, uniqueColumns, unionFields, onceUniqueColumns, columnsFields, contrastColumns, customColumns, orderColumns, scriptsColumns, cbScriptsColumns, orderModular, orderModularDetail, voucher, voucherDetail, notes, emailCodes, appType } = this.state
+    const { activeKey, verifyInter, verify, fields, uniqueFields, uniqueColumns, unionFields, onceUniqueColumns, columnsFields, contrastColumns, customColumns, orderColumns, scriptsColumns, cbScriptsColumns, orderModular, orderModularDetail, voucher, voucherDetail, notes, emailCodes, appType, formfields, colfields } = this.state
     const formItemLayout = {
       labelCol: {
         xs: { span: 24 },
@@ -1706,7 +1707,8 @@
             <CustomForm
               btn={this.props.card}
               initsql={this.state.initsql}
-              usefulfields={this.state.usefulfields}
+              formfields={formfields}
+              colfields={colfields}
               customChange={this.customChange}
               wrappedComponentRef={(inst) => this.customForm = inst}
             />
@@ -1778,7 +1780,8 @@
                 customScripts={verify.scripts}
                 useDefaultSql={verify.default !== 'false'}
                 defaultsql={this.state.defaultsql}
-                usefulfields={this.state.usefulfields}
+                formfields={formfields}
+                colfields={colfields}
                 systemScripts={this.state.systemScripts}
                 scriptsChange={this.scriptsChange}
                 wrappedComponentRef={(inst) => this.scriptsFullForm = inst}
@@ -1792,7 +1795,8 @@
               customScripts={verify.scripts}
               useDefaultSql={verify.default !== 'false'}
               defaultsql={this.state.defaultsql}
-              usefulfields={this.state.usefulfields}
+              formfields={formfields}
+              colfields={colfields}
               systemScripts={this.state.systemScripts}
               scriptsChange={this.scriptsChange}
               wrappedComponentRef={(inst) => this.scriptsForm = inst}
@@ -1817,7 +1821,8 @@
                 btn={this.props.card}
                 initsql={this.state.initsql}
                 customScripts={verify.cbScripts}
-                usefulfields={this.state.usefulfields}
+                formfields={formfields}
+                colfields={colfields}
                 systemScripts={this.state.systemScripts}
                 scriptsChange={this.cbScriptsChange}
                 wrappedComponentRef={(inst) => this.cbscriptsFullForm = inst}
@@ -1827,7 +1832,8 @@
               btn={this.props.card}
               initsql={this.state.initsql}
               customScripts={verify.cbScripts}
-              usefulfields={this.state.usefulfields}
+              formfields={formfields}
+              colfields={colfields}
               systemScripts={this.state.systemScripts}
               scriptsChange={this.cbScriptsChange}
               wrappedComponentRef={(inst) => this.cbscriptsForm = inst}
diff --git a/src/utils/utils-custom.js b/src/utils/utils-custom.js
index 8926d01..9390ede 100644
--- a/src/utils/utils-custom.js
+++ b/src/utils/utils-custom.js
@@ -1649,6 +1649,16 @@
 
   if (card.$c_ds) {
     columns = card.columns.map(c => c.field)
+
+    if (card.setting.primaryKey && !columns.includes(card.setting.primaryKey)) {
+      let key = card.setting.primaryKey.toLowerCase()
+      columns.forEach(f => {
+        if (f.toLowerCase() === key) {
+          card.setting.primaryKey = f
+        }
+      })
+    }
+
     if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
       errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
     } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
diff --git a/src/utils/utils-datamanage.js b/src/utils/utils-datamanage.js
index 91e58db..91dfd4a 100644
--- a/src/utils/utils-datamanage.js
+++ b/src/utils/utils-datamanage.js
@@ -297,7 +297,7 @@
 
     // exec_type 瑙g爜瀛楁锛歀Text銆丩Text1銆丩Text2銆乧ustom_script銆丏ateCount
 
-    param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss.SSS')
     param.secretkey = Utils.encrypt('', param.timestamp)
 
     param.username = userName
@@ -572,9 +572,7 @@
     fullName: sessionStorage.getItem('Full_Name') || ''
   }
 
-  if (config.MenuName) {
-    param.menuname = config.MenuName
-  }
+  param.menuname = config.MenuName || config.$menuname || ''
 
   param.exec_type = window.GLOB.execType || 'y'
   param.LText = Utils.formatOptions(_LText.join(' union all '), param.exec_type)
diff --git a/src/utils/utils.js b/src/utils/utils.js
index cc96970..a904374 100644
--- a/src/utils/utils.js
+++ b/src/utils/utils.js
@@ -726,9 +726,9 @@
       if (item.type === 'date') {
         if (!item.value) {
           if (['>=', '>'].includes(item.match)) {
-            item.value = '1970-01-01 00:00:00.000'
+            item.value = '1900-01-01 00:00:00.000'
           } else if (['<=', '<'].includes(item.match)) {
-            item.value = '2050-01-01 00:00:00.000'
+            item.value = '3000-01-01 00:00:00.000'
           }
         } else if (search.precision === 'day') {
           if (['>=', '>'].includes(item.match)) {
@@ -749,8 +749,8 @@
         if (item.match === '=') {
           options.push(item)
         } else {
-          let _startval = item.value ? moment(item.value, 'YYYY-MM').startOf('month').format('YYYY-MM-DD') + ' 00:00:00.000' : '1970-01-01 00:00:00.000'
-          let _endval = item.value ? moment(item.value, 'YYYY-MM').endOf('month').add(1, 'days').format('YYYY-MM-DD') + ' 00:00:00.000' : '2050-01-01 00:00:00.000'
+          let _startval = item.value ? moment(item.value, 'YYYY-MM').startOf('month').format('YYYY-MM-DD') + ' 00:00:00.000' : '1900-01-01 00:00:00.000'
+          let _endval = item.value ? moment(item.value, 'YYYY-MM').endOf('month').add(1, 'days').format('YYYY-MM-DD') + ' 00:00:00.000' : '3000-01-01 00:00:00.000'
   
           let copy = JSON.parse(JSON.stringify(item))
           copy.key = copy.key + '1'
@@ -773,8 +773,8 @@
         options.push(item)
         options.push(copy)
       } else if (item.type === 'dateweek') {
-        let _startval = item.value ? moment(item.value, 'YYYY-MM-DD').startOf('week').format('YYYY-MM-DD') + ' 00:00:00.000' : '1970-01-01 00:00:00.000'
-        let _endval = item.value ? moment(item.value, 'YYYY-MM-DD').endOf('week').add(1, 'days').format('YYYY-MM-DD') + ' 00:00:00.000' : '2050-01-01 00:00:00.000'
+        let _startval = item.value ? moment(item.value, 'YYYY-MM-DD').startOf('week').format('YYYY-MM-DD') + ' 00:00:00.000' : '1900-01-01 00:00:00.000'
+        let _endval = item.value ? moment(item.value, 'YYYY-MM-DD').endOf('week').add(1, 'days').format('YYYY-MM-DD') + ' 00:00:00.000' : '3000-01-01 00:00:00.000'
 
         let copy = JSON.parse(JSON.stringify(item))
         copy.key = copy.key + '1'
@@ -785,8 +785,8 @@
         options.push(item)
         options.push(copy)
       } else if (item.type === 'daterange') {
-        let _startval = '1970-01-01 00:00:00.000'
-        let _endval = '2050-01-01 00:00:00.000'
+        let _startval = '1900-01-01 00:00:00.000'
+        let _endval = '3000-01-01 00:00:00.000'
 
         if (item.value) {
           let val = item.value.split(',')
diff --git a/src/views/login/index.jsx b/src/views/login/index.jsx
index 4e1cb3a..2d3f44e 100644
--- a/src/views/login/index.jsx
+++ b/src/views/login/index.jsx
@@ -956,6 +956,7 @@
             <a target="_blank" rel="noopener noreferrer" href={webSite} dangerouslySetInnerHTML={{ __html: copyRight.replace(/\s/ig, '&nbsp;') }}></a> :
             <p dangerouslySetInnerHTML={{ __html: copyRight ? copyRight.replace(/\s/ig, '&nbsp;') : '' }}></p>
           }
+          <br/>
           {ICP ? <a target="_blank" rel="noopener noreferrer" href="https://beian.miit.gov.cn/#/Integrated/index" dangerouslySetInnerHTML={{ __html: ICP.replace(/\s/ig, '&nbsp;') }}></a> : null}
         </div>
         {/* 缂栬緫鐘舵�佺櫥褰� */}
diff --git a/src/views/login/index.scss b/src/views/login/index.scss
index 6d63473..58f4397 100644
--- a/src/views/login/index.scss
+++ b/src/views/login/index.scss
@@ -236,12 +236,13 @@
     text-align: center;
     color: var(--mk-sys-font-color);
     padding-top: 20px;
-    p span.split {
-      margin-right: 15px;
+    p {
+      margin-bottom: 5px;
+    }
+    p + br {
+      display: none;
     }
     a {
-      display: block;
-      margin-bottom: 5px;
       color: var(--mk-sys-font-color);
     }
   }
diff --git a/src/views/printTemplate/index.jsx b/src/views/printTemplate/index.jsx
index 39c625f..dcb5d22 100644
--- a/src/views/printTemplate/index.jsx
+++ b/src/views/printTemplate/index.jsx
@@ -320,6 +320,9 @@
       if (keyCode === 46 && editItemId && editItemType !== 'Template') {
         this.deleteItem()
       }
+      if (e.ctrlKey && keyCode === 81 && editItemId && editItemType !== 'Template') {
+        this.copyItem()
+      }
     }
   }
 
@@ -706,6 +709,51 @@
     })
   }
 
+  copyItem = () => {
+    const { editItemId, config, fields } = this.state
+
+    let cell = config.elements.filter(item => item.uuid === editItemId)[0]
+
+    if (!cell) return
+
+    let item = {...cell}
+
+    item.left = item.left + parseInt(item.width / 4)
+    item.top = item.top + parseInt(item.height / 4)
+    item.uuid = Utils.getuuid()
+
+    if (item.left + item.width > config.width) {
+      item.left = config.width - item.width
+    }
+    if (item.top + item.height > config.height) {
+      item.top = config.height - item.height
+    }
+
+    let _config = fromJS(config).toJS()
+    
+    _config.elements.push(item)
+
+    let _formlist = []
+    if (item.type === 'text') {
+      _formlist = getTextForm(item, fields)
+    } else if (item.type === 'barcode') {
+      _formlist = getBarcodeForm(item, fields)
+    } else if (item.type === 'qrcode') {
+      _formlist = getQrcodeForm(item, fields)
+    } else if (item.type === 'image') {
+      _formlist = getImageForm(item, fields)
+    }
+
+    this.setState({
+      config: _config,
+      editItemId: item.uuid,
+      editItemType: item.type,
+      formlist: _formlist
+    }, () => {
+      this.resetview()
+    })
+  }
+
   deleteItem = () => {
     const _this = this
     const { editItemId, config } = this.state
@@ -896,7 +944,10 @@
     return (
       <div className="print-template">
         <DndProvider backend={HTML5Backend}>
-          <header className="print-header-container ant-menu-dark">妯℃澘鍒朵綔</header>
+          <header className="print-header-container ant-menu-dark">
+            妯℃澘鍒朵綔
+            <div>蹇嵎閿細Delete锛堝垹闄ゅ厓绱狅級銆乧trl + q锛堝鍒跺厓绱狅級</div>
+          </header>
           <aside className="tools">
             <Card className="tool-bar" title="宸ュ叿鏍�">
               {printItems.map((item, index) => {
diff --git a/src/views/printTemplate/index.scss b/src/views/printTemplate/index.scss
index cd65a0b..0ca8cae 100644
--- a/src/views/printTemplate/index.scss
+++ b/src/views/printTemplate/index.scss
@@ -20,6 +20,13 @@
     text-align: center;
     color: #fff;
     background: #001529;
+
+    div {
+      position: absolute;
+      top: 0px;
+      right: 30px;
+      font-size: 14px;
+    }
   }
   .tools {
     width: 240px;
diff --git a/src/views/rolemanage/index.jsx b/src/views/rolemanage/index.jsx
index 171b2c2..cd23aaa 100644
--- a/src/views/rolemanage/index.jsx
+++ b/src/views/rolemanage/index.jsx
@@ -379,7 +379,8 @@
       ParentID: 'mk_app',
       TypeCharOne: app.kei_no,
       typename: app.typename,
-      lang: app.lang
+      lang: app.lang,
+      TYPE: 30
     }).then(res => {
       if (res.status) {
         this.setState({

--
Gitblit v1.8.0