From bfcacf54ad793bc33560f8bb15833508cf73aa5b Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 31 三月 2023 01:18:44 +0800
Subject: [PATCH] 2023-03-31

---
 src/templates/zshare/modalform/index.jsx                         |    8 
 src/menu/components/card/cardsimplecomponent/node-wrap/index.jsx |    4 
 src/menu/components/timeline/normal-timeline/index.jsx           |    7 
 src/menu/components/card/table-card/index.jsx                    |    7 
 src/menu/components/share/pasteforms/index.jsx                   |  174 ++++++++++
 src/menu/components/form/simple-form/index.jsx                   |  102 +----
 src/menu/components/share/pasteforms/index.scss                  |    0 
 src/mob/components/formdragelement/index.scss                    |   49 +++
 src/mob/modalconfig/index.jsx                                    |   49 --
 src/menu/components/table/edit-table/index.jsx                   |   14 
 src/menu/components/carousel/data-card/index.jsx                 |    7 
 src/menu/components/card/balcony/index.jsx                       |   14 
 src/api/cacheutils.js                                            |    4 
 src/menu/components/share/pastecomponent/index.jsx               |    2 
 src/menu/components/form/step-form/index.jsx                     |  119 +------
 src/templates/zshare/formconfig.jsx                              |    6 
 src/menu/components/form/tab-form/index.jsx                      |  113 +-----
 src/menu/components/carousel/prop-card/index.jsx                 |   14 
 src/menu/components/card/double-data-card/index.jsx              |   21 +
 src/templates/modalconfig/dragelement/index.scss                 |   16 
 src/menu/components/card/data-card/index.jsx                     |   21 +
 src/menu/components/share/actioncomponent/index.jsx              |   65 ++++
 src/mob/components/formdragelement/card.jsx                      |   16 
 src/menu/modalconfig/index.jsx                                   |   51 --
 src/menu/components/card/prop-card/index.jsx                     |   28 +
 src/menu/components/table/base-table/index.jsx                   |   16 
 src/menu/components/table/normal-table/index.jsx                 |   14 
 src/menu/components/form/dragtitle/card.jsx                      |    4 
 28 files changed, 549 insertions(+), 396 deletions(-)

diff --git a/src/api/cacheutils.js b/src/api/cacheutils.js
index 9556233..265071c 100644
--- a/src/api/cacheutils.js
+++ b/src/api/cacheutils.js
@@ -7,7 +7,7 @@
    */
   static openIndexDB (db) {
     try {
-      let request = window.indexedDB.open(db, 2)
+      let request = window.indexedDB.open(db, 3)
       request.onerror = () => {
         console.warn('IndexedDB 鍒濆鍖栧け璐ワ紒')
       }
@@ -27,7 +27,7 @@
         if (!window.GLOB.IndexDB.objectStoreNames.contains('caches')) {
           window.GLOB.IndexDB.createObjectStore('caches', { keyPath: 'menuid' })
         }
-        if (window.GLOB.systemType === '' && !window.GLOB.IndexDB.objectStoreNames.contains('funcs')) {
+        if (!window.GLOB.IndexDB.objectStoreNames.contains('funcs')) {
           window.GLOB.IndexDB.createObjectStore('funcs', { keyPath: 'id' })
         }
       }
diff --git a/src/menu/components/card/balcony/index.jsx b/src/menu/components/card/balcony/index.jsx
index 7bd4ac0..9edccef 100644
--- a/src/menu/components/card/balcony/index.jsx
+++ b/src/menu/components/card/balcony/index.jsx
@@ -131,10 +131,15 @@
     if (card.wrap.datatype === 'static') {
       card.elements.forEach(cell => {
         if (cell.eleType === 'button') {
+          if (cell.hidden === 'true') return
           if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
             if (!cell.modal || cell.modal.fields.length === 0) {
-              card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
             }
+          } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+          } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
           }
         } else if (cell.datatype === 'dynamic' && cell.field) {
           card.errors.push({ level: 1, detail: `鍗$墖涓姩鎬佸瓧娈碘��${cell.field}鈥濇棤鏁坄})
@@ -162,10 +167,15 @@
 
       card.elements.forEach(cell => {
         if (cell.eleType === 'button') {
+          if (cell.hidden === 'true') return
           if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
             if (!cell.modal || cell.modal.fields.length === 0) {
-              card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
             }
+          } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+          } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
           }
         } else if (cell.datatype === 'dynamic' && cell.field && !columns.includes(cell.field)) {
           card.errors.push({ level: 1, detail: `鍗$墖涓姩鎬佸瓧娈碘��${cell.field}鈥濇棤鏁坄})
diff --git a/src/menu/components/card/cardsimplecomponent/node-wrap/index.jsx b/src/menu/components/card/cardsimplecomponent/node-wrap/index.jsx
index 9f393ea..52d1867 100644
--- a/src/menu/components/card/cardsimplecomponent/node-wrap/index.jsx
+++ b/src/menu/components/card/cardsimplecomponent/node-wrap/index.jsx
@@ -2,7 +2,7 @@
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
 import { Modal } from 'antd'
-import { MoreOutlined } from '@ant-design/icons'
+import { EditOutlined } from '@ant-design/icons'
 
 
 import MenusForm from './menus'
@@ -48,7 +48,7 @@
 
     return (
       <>
-        <MoreOutlined style={{color: '#1890ff'}} title="鑺傜偣缁�" onClick={this.trigger}/>
+        <EditOutlined style={{color: '#1890ff'}} title="鑺傜偣缁�" onClick={this.trigger}/>
         <Modal
           title="鑺傜偣缁�"
           wrapClassName="nodes-field-modal"
diff --git a/src/menu/components/card/data-card/index.jsx b/src/menu/components/card/data-card/index.jsx
index bc06811..03d50c4 100644
--- a/src/menu/components/card/data-card/index.jsx
+++ b/src/menu/components/card/data-card/index.jsx
@@ -196,10 +196,15 @@
     }
 
     card.action.forEach(cell => {
+      if (cell.hidden === 'true') return
       if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
         if (!cell.modal || cell.modal.fields.length === 0) {
-          card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+          card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
         }
+      } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+        card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+      } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+        card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
       }
     })
 
@@ -207,10 +212,15 @@
       let linkbtn = item.setting.linkbtn || ''
       item.elements.forEach(cell => {
         if (cell.eleType === 'button') {
+          if (cell.hidden === 'true') return
           if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
             if (!cell.modal || cell.modal.fields.length === 0) {
-              card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
             }
+          } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+          } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
           }
           if (linkbtn && linkbtn === cell.uuid) {
             linkbtn = ''
@@ -223,10 +233,15 @@
       if (item.setting.type === 'multi' && appType !== 'mob') {
         item.backElements.forEach(cell => {
           if (cell.eleType === 'button') {
+            if (cell.hidden === 'true') return
             if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
               if (!cell.modal || cell.modal.fields.length === 0) {
-                card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+                card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
               }
+            } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+            } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
             }
             if (linkbtn && linkbtn === cell.uuid) {
               linkbtn = ''
diff --git a/src/menu/components/card/double-data-card/index.jsx b/src/menu/components/card/double-data-card/index.jsx
index 10e0a47..25728f6 100644
--- a/src/menu/components/card/double-data-card/index.jsx
+++ b/src/menu/components/card/double-data-card/index.jsx
@@ -191,10 +191,15 @@
     }
 
     card.action.forEach(cell => {
+      if (cell.hidden === 'true') return
       if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
         if (!cell.modal || cell.modal.fields.length === 0) {
-          card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+          card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
         }
+      } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+        card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+      } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+        card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
       }
     })
 
@@ -202,10 +207,15 @@
       let linkbtn = item.setting.linkbtn || ''
       item.elements.forEach(cell => {
         if (cell.eleType === 'button') {
+          if (cell.hidden === 'true') return
           if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
             if (!cell.modal || cell.modal.fields.length === 0) {
-              card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
             }
+          } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+          } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
           }
           if (linkbtn && linkbtn === cell.uuid) {
             linkbtn = ''
@@ -217,10 +227,15 @@
 
       item.backElements.forEach(cell => {
         if (cell.eleType === 'button') {
+          if (cell.hidden === 'true') return
           if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
             if (!cell.modal || cell.modal.fields.length === 0) {
-              card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
             }
+          } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+          } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
           }
           if (linkbtn && linkbtn === cell.uuid) {
             linkbtn = ''
diff --git a/src/menu/components/card/prop-card/index.jsx b/src/menu/components/card/prop-card/index.jsx
index 36e5239..e5931fd 100644
--- a/src/menu/components/card/prop-card/index.jsx
+++ b/src/menu/components/card/prop-card/index.jsx
@@ -167,10 +167,15 @@
 
         item.elements.forEach(cell => {
           if (cell.eleType === 'button') {
+            if (cell.hidden === 'true') return
             if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
               if (!cell.modal || cell.modal.fields.length === 0) {
-                card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+                card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
               }
+            } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+            } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
             }
             if (linkbtn && linkbtn === cell.uuid) {
               linkbtn = ''
@@ -183,10 +188,15 @@
         if (item.setting.type === 'multi' && appType !== 'mob') {
           item.backElements.forEach(cell => {
             if (cell.eleType === 'button') {
+              if (cell.hidden === 'true') return
               if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
                 if (!cell.modal || cell.modal.fields.length === 0) {
-                  card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+                  card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
                 }
+              } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+                card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+              } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+                card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
               }
               if (linkbtn && linkbtn === cell.uuid) {
                 linkbtn = ''
@@ -226,10 +236,15 @@
         let linkbtn = item.setting.linkbtn || ''
         item.elements.forEach(cell => {
           if (cell.eleType === 'button') {
+            if (cell.hidden === 'true') return
             if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
               if (!cell.modal || cell.modal.fields.length === 0) {
-                card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+                card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
               }
+            } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+            } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
             }
             if (linkbtn && linkbtn === cell.uuid) {
               linkbtn = ''
@@ -242,10 +257,15 @@
         if (item.setting.type === 'multi' && appType !== 'mob') {
           item.backElements.forEach(cell => {
             if (cell.eleType === 'button') {
+              if (cell.hidden === 'true') return
               if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
                 if (!cell.modal || cell.modal.fields.length === 0) {
-                  card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+                  card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
                 }
+              } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+                card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+              } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+                card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
               }
               if (linkbtn && linkbtn === cell.uuid) {
                 linkbtn = ''
diff --git a/src/menu/components/card/table-card/index.jsx b/src/menu/components/card/table-card/index.jsx
index 92f485e..f856cb6 100644
--- a/src/menu/components/card/table-card/index.jsx
+++ b/src/menu/components/card/table-card/index.jsx
@@ -194,10 +194,15 @@
       let linkbtn = item.setting.linkbtn || ''
       item.elements.forEach(cell => {
         if (cell.eleType === 'button') {
+          if (cell.hidden === 'true') return
           if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
             if (!cell.modal || cell.modal.fields.length === 0) {
-              card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
             }
+          } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+          } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
           }
           if (linkbtn && linkbtn === cell.uuid) {
             linkbtn = ''
diff --git a/src/menu/components/carousel/data-card/index.jsx b/src/menu/components/carousel/data-card/index.jsx
index 5a1eee0..cc1938a 100644
--- a/src/menu/components/carousel/data-card/index.jsx
+++ b/src/menu/components/carousel/data-card/index.jsx
@@ -150,10 +150,15 @@
     card.subcards.forEach((item, i) => {
       item.elements.forEach(cell => {
         if (cell.eleType === 'button') {
+          if (cell.hidden === 'true') return
           if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
             if (!cell.modal || cell.modal.fields.length === 0) {
-              card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
             }
+          } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+          } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
           }
         } else if (cell.datatype === 'dynamic' && cell.field && !columns.includes(cell.field)) {
           card.errors.push({ level: 1, detail: `鍗$墖涓姩鎬佸瓧娈碘��${cell.field}鈥濇棤鏁坄})
diff --git a/src/menu/components/carousel/prop-card/index.jsx b/src/menu/components/carousel/prop-card/index.jsx
index 9b25463..67e23af 100644
--- a/src/menu/components/carousel/prop-card/index.jsx
+++ b/src/menu/components/carousel/prop-card/index.jsx
@@ -137,10 +137,15 @@
       card.subcards.forEach(item => {
         item.elements.forEach(cell => {
           if (cell.eleType === 'button') {
+            if (cell.hidden === 'true') return
             if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
               if (!cell.modal || cell.modal.fields.length === 0) {
-                card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+                card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
               }
+            } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+            } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
             }
           } else if (cell.datatype === 'dynamic' && cell.field) {
             card.errors.push({ level: 1, detail: `鍗$墖涓姩鎬佸瓧娈碘��${cell.field}鈥濇棤鏁坄})
@@ -169,10 +174,15 @@
       card.subcards.forEach((item, i) => {
         item.elements.forEach(cell => {
           if (cell.eleType === 'button') {
+            if (cell.hidden === 'true') return
             if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
               if (!cell.modal || cell.modal.fields.length === 0) {
-                card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+                card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
               }
+            } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+            } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
             }
           } else if (cell.datatype === 'dynamic' && cell.field && !columns.includes(cell.field)) {
             card.errors.push({ level: 1, detail: `鍗$墖涓姩鎬佸瓧娈碘��${cell.field}鈥濇棤鏁坄})
diff --git a/src/menu/components/form/dragtitle/card.jsx b/src/menu/components/form/dragtitle/card.jsx
index b8b8092..a2eb77d 100644
--- a/src/menu/components/form/dragtitle/card.jsx
+++ b/src/menu/components/form/dragtitle/card.jsx
@@ -9,7 +9,7 @@
 import './index.scss'
 
 const NormalForm = asyncIconComponent(() => import('@/components/normalform'))
-const PasteComponent = asyncIconComponent(() => import('@/menu/components/share/pastecomponent'))
+const PasteForms = asyncIconComponent(() => import('@/menu/components/share/pasteforms'))
 const CopyComponent = asyncIconComponent(() => import('@/menu/components/share/copycomponent'))
 
 const Card = ({ id, card, sort, labelSize, active, moveCard, findCard, closeCard, selectCard, updateGroup, pasteForm }) => {
@@ -90,7 +90,7 @@
           <EditOutlined style={{color: '#1890ff'}} title="缂栬緫"/>
         </NormalForm>
         <CopyComponent type="formgroup" card={card}/>
-        <PasteComponent options={['form', 'forms']} updateConfig={(res) => pasteForm(res, id)} />
+        <PasteForms config={card} updateConfig={(res) => pasteForm(res, id)} />
         <CloseOutlined className="close" type="close" onClick={close} />
       </div>
     } trigger="hover">
diff --git a/src/menu/components/form/simple-form/index.jsx b/src/menu/components/form/simple-form/index.jsx
index 6d372ff..049c02d 100644
--- a/src/menu/components/form/simple-form/index.jsx
+++ b/src/menu/components/form/simple-form/index.jsx
@@ -23,7 +23,7 @@
 const FormAction = asyncComponent(() => import('../formaction'))
 const NormalHeader = asyncComponent(() => import('@/menu/components/share/normalheader'))
 const CopyComponent = asyncIconComponent(() => import('@/menu/components/share/copycomponent'))
-const PasteComponent = asyncIconComponent(() => import('@/menu/components/share/pastecomponent'))
+const PasteForms = asyncIconComponent(() => import('@/menu/components/share/pasteforms'))
 const UserComponent = asyncIconComponent(() => import('@/menu/components/share/usercomponent'))
 const FieldsComponent = asyncComponent(() => import('@/templates/sharecomponent/fieldscomponent'))
 
@@ -513,93 +513,43 @@
     })
   }
 
-  pasteForm = (res) => {
+  pasteForm = (forms, res) => {
     let _config = fromJS(this.state.card).toJS()
+
+    _config.subcards[0].fields = forms
 
     if (res.subButton) {
       let that = this
 
-      _config.subcards[0].setting.focus = res.focus
-      _config.subcards[0].setting.cache = res.cache
-      _config.subcards[0].setting.align = res.align
-      _config.subcards[0].setting.enable = res.enable
-      _config.subcards[0].setting.verticalSpace = res.verticalSpace || ''
-      _config.wrap.focus = res.focus
-      _config.wrap.cache = res.cache
-      _config.wrap.align = res.align
-      _config.wrap.enable = res.enable
-      _config.wrap.verticalSpace = res.verticalSpace || ''
-
-      _config.subcards[0].subButton = res.subButton
+      // _config.subcards[0].setting.focus = res.focus
+      // _config.subcards[0].setting.cache = res.cache
+      // _config.subcards[0].setting.align = res.align
+      // _config.subcards[0].setting.enable = res.enable
+      // _config.subcards[0].setting.verticalSpace = res.verticalSpace || ''
+      // _config.wrap.focus = res.focus
+      // _config.wrap.cache = res.cache
+      // _config.wrap.align = res.align
+      // _config.wrap.enable = res.enable
+      // _config.wrap.verticalSpace = res.verticalSpace || ''
       
-      _config.subcards[0].fields = res.fields.map(item => {
-        item.uuid = Utils.getuuid()
-        return item
-      })
-
       confirm({
-        content: '鏇挎崲琛ㄥ崟鍙婃寜閽厤缃紵',
+        content: '鏄惁鏇挎崲鎸夐挳閰嶇疆锛�',
+        okText: '鏄�',
+        cancelText: '鍚�',
         onOk() {
+          _config.subcards[0].subButton = res.subButton
+          
           that.updateComponent(_config)
         },
-        onCancel() {}
+        onCancel() {
+          that.updateComponent(_config)
+        }
       })
-      return
-    } else if (res.fields) {
-      if (_config.subcards[0].fields.length > 0) {
-        let that = this
-        _config.subcards[0].fields = res.fields.map(item => {
-          item.uuid = Utils.getuuid()
-          return item
-        })
+    } else {
+      _config.subcards[0].fields = forms
 
-        confirm({
-          title: '纭畾鏇挎崲琛ㄥ崟鍚楋紵',
-          content: '鍘熻〃鍗曞皢鍒犻櫎銆�',
-          onOk() {
-            that.updateComponent(_config)
-          },
-          onCancel() {}
-        })
-      } else {
-        _config.subcards[0].fields = res.fields.map(item => {
-          item.uuid = Utils.getuuid()
-          return item
-        })
-
-        this.updateComponent(_config)
-      }
-
-      return
+      this.updateComponent(_config)
     }
-
-    let fieldrepet = false // 瀛楁閲嶅
-
-    _config.subcards[0].fields.forEach(item => {
-      if (res.field && item.field && item.field.toLowerCase() === res.field.toLowerCase()) {
-        fieldrepet = true
-      }
-    })
-
-    if (fieldrepet) {
-      notification.warning({
-        top: 92,
-        message: '瀛楁宸插瓨鍦紒',
-        duration: 10
-      })
-      return
-    }
-    _config.subcards[0].fields.push(res)
-
-    this.updateComponent(_config)
-
-    this.handleForm(res)
-
-    notification.success({
-      top: 92,
-      message: '绮樿创鎴愬姛锛�',
-      duration: 2
-    })
   }
 
   getWrapForms = () => {
@@ -682,7 +632,7 @@
               <EditOutlined style={{color: '#1890ff'}} title="缂栬緫"/>
             </NormalForm>
             <CopyComponent type="simpleform" card={card}/>
-            <PasteComponent config={card} options={['form', 'forms', 'formgroup']} updateConfig={this.pasteForm} />
+            <PasteForms config={card.subcards[0]} update={this.pasteForm} />
             <FontColorsOutlined className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle}/>
             <UserComponent config={card}/>
             <DeleteOutlined className="close" title="鍒犻櫎缁勪欢" onClick={() => this.props.deletecomponent(card.uuid)} />
diff --git a/src/menu/components/form/step-form/index.jsx b/src/menu/components/form/step-form/index.jsx
index 186c17c..71a2b3a 100644
--- a/src/menu/components/form/step-form/index.jsx
+++ b/src/menu/components/form/step-form/index.jsx
@@ -619,60 +619,29 @@
     if (res.subtype === 'simpleform') {
       res = res.subcards[0]
     }
-    if (res.subButton) {
-      let card = fromJS(this.state.card).toJS()
 
-      res.uuid = Utils.getuuid()
-      res.sort = card.subcards.length + 1
+    let card = fromJS(this.state.card).toJS()
 
-      res.fields.forEach(item => {
-        item.uuid = Utils.getuuid()
-      })
+    res.uuid = Utils.getuuid()
+    res.sort = card.subcards.length + 1
 
-      if (!res.prevButton) {
-        res.prevButton = {label: '涓婁竴姝�', type: 'prev', enable: 'false', style: {marginRight: '15px', paddingTop: '5px', paddingBottom: '5px'}}
-      }
-      if (!res.nextButton) {
-        res.nextButton = {label: '璺宠繃', type: 'next', enable: 'false', style: {paddingTop: '5px', paddingBottom: '5px'}}
-      }
-
-      card.subcards.push(res)
-      
-      this.setState({
-        group: res
-      })
-      this.updateComponent(card)
-
-      notification.success({
-        top: 92,
-        message: '绮樿创鎴愬姛锛�',
-        duration: 2
-      })
-      return
-    }
-
-    let _config = fromJS(this.state.group).toJS()
-    let fieldrepet = false // 瀛楁閲嶅
-
-    _config.fields.forEach(item => {
-      if (res.field && item.field && item.field.toLowerCase() === res.field.toLowerCase()) {
-        fieldrepet = true
-      }
+    res.fields.forEach(item => {
+      item.uuid = Utils.getuuid()
     })
 
-    if (fieldrepet) {
-      notification.warning({
-        top: 92,
-        message: '瀛楁宸插瓨鍦紒',
-        duration: 10
-      })
-      return
+    if (!res.prevButton) {
+      res.prevButton = {label: '涓婁竴姝�', type: 'prev', enable: 'false', style: {marginRight: '15px', paddingTop: '5px', paddingBottom: '5px'}}
     }
-    _config.fields.push(res)
+    if (!res.nextButton) {
+      res.nextButton = {label: '璺宠繃', type: 'next', enable: 'false', style: {paddingTop: '5px', paddingBottom: '5px'}}
+    }
 
-    this.updateGroup(_config)
-
-    this.handleForm(res)
+    card.subcards.push(res)
+    
+    this.setState({
+      group: res
+    })
+    this.updateComponent(card)
 
     notification.success({
       top: 92,
@@ -723,58 +692,12 @@
     })
   }
 
-  parseForm = (g, res) => {
-    let _group = fromJS(g).toJS()
-    let _confirm = false
-
-    if (res.copyType === 'form') {
-      let fieldrepet = false // 瀛楁閲嶅
-      res.uuid = Utils.getuuid()
-  
-      _group.fields.forEach(item => {
-        if (res.field && item.field && item.field.toLowerCase() === res.field.toLowerCase()) {
-          fieldrepet = true
-        }
-      })
-  
-      if (fieldrepet) {
-        notification.warning({
-          top: 92,
-          message: '瀛楁宸插瓨鍦紒',
-          duration: 10
-        })
-        return
-      }
-      _group.fields.push(res)
-    } else {
-      if (_group.fields.length > 0) {
-        _confirm = true
-      }
-
-      _group.fields = res.fields.map(item => {
-        item.uuid = Utils.getuuid()
-        return item
-      })
-    }
-
-    if (_confirm) {
-      let that = this
-      confirm({
-        title: '纭畾鏇挎崲琛ㄥ崟鍚楋紵',
-        content: '鍘熻〃鍗曞皢鍒犻櫎銆�',
-        onOk() {
-          that.updateForms(_group)
-        },
-        onCancel() {}
-      })
-    } else {
-      this.updateForms(_group)
-    }
-  }
-
-  updateForms = (_group) => {
+  parseForm = (g, forms) => {
     const { group } = this.state
     let card = fromJS(this.state.card).toJS()
+    let _group = fromJS(g).toJS()
+
+    _group.fields = forms
 
     card.subcards = card.subcards.map(item => {
       if (item.uuid === _group.uuid) {
@@ -821,7 +744,7 @@
               <EditOutlined style={{color: '#1890ff'}} title="缂栬緫"/>
             </NormalForm>
             <CopyComponent type="stepform" card={card}/>
-            <PasteComponent config={card} options={['form', 'formgroup', 'simpleform']} updateConfig={this.pasteForm} />
+            <PasteComponent config={card} options={['formgroup', 'simpleform']} updateConfig={this.pasteForm} />
             <FontColorsOutlined className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle}/>
             <UserComponent config={card}/>
             <DeleteOutlined className="close" title="鍒犻櫎缁勪欢" onClick={() => this.props.deletecomponent(card.uuid)} />
diff --git a/src/menu/components/form/tab-form/index.jsx b/src/menu/components/form/tab-form/index.jsx
index 0f280e2..0d1e4f1 100644
--- a/src/menu/components/form/tab-form/index.jsx
+++ b/src/menu/components/form/tab-form/index.jsx
@@ -624,56 +624,25 @@
     if (res.subtype === 'simpleform') {
       res = res.subcards[0]
     }
-    if (res.subButton) {
-      let card = fromJS(this.state.card).toJS()
 
-      res.uuid = Utils.getuuid()
-      res.sort = card.subcards.length + 1
+    let card = fromJS(this.state.card).toJS()
 
-      res.fields.forEach(item => {
-        item.uuid = Utils.getuuid()
-      })
+    res.uuid = Utils.getuuid()
+    res.sort = card.subcards.length + 1
 
-      delete res.prevButton
-      delete res.nextButton
-
-      card.subcards.push(res)
-      
-      this.setState({
-        group: res
-      })
-      this.updateComponent(card)
-
-      notification.success({
-        top: 92,
-        message: '绮樿创鎴愬姛锛�',
-        duration: 2
-      })
-      return
-    }
-
-    let _config = fromJS(this.state.group).toJS()
-    let fieldrepet = false // 瀛楁閲嶅
-
-    _config.fields.forEach(item => {
-      if (res.field && item.field && item.field.toLowerCase() === res.field.toLowerCase()) {
-        fieldrepet = true
-      }
+    res.fields.forEach(item => {
+      item.uuid = Utils.getuuid()
     })
 
-    if (fieldrepet) {
-      notification.warning({
-        top: 92,
-        message: '瀛楁宸插瓨鍦紒',
-        duration: 10
-      })
-      return
-    }
-    _config.fields.push(res)
+    delete res.prevButton
+    delete res.nextButton
 
-    this.updateGroup(_config)
-
-    this.handleForm(res)
+    card.subcards.push(res)
+    
+    this.setState({
+      group: res
+    })
+    this.updateComponent(card)
 
     notification.success({
       top: 92,
@@ -724,58 +693,12 @@
     })
   }
 
-  parseForm = (g, res) => {
-    let _group = fromJS(g).toJS()
-    let _confirm = false
-
-    if (res.copyType === 'form') {
-      let fieldrepet = false // 瀛楁閲嶅
-      res.uuid = Utils.getuuid()
-  
-      _group.fields.forEach(item => {
-        if (res.field && item.field && item.field.toLowerCase() === res.field.toLowerCase()) {
-          fieldrepet = true
-        }
-      })
-  
-      if (fieldrepet) {
-        notification.warning({
-          top: 92,
-          message: '瀛楁宸插瓨鍦紒',
-          duration: 10
-        })
-        return
-      }
-      _group.fields.push(res)
-    } else {
-      if (_group.fields.length > 0) {
-        _confirm = true
-      }
-
-      _group.fields = res.fields.map(item => {
-        item.uuid = Utils.getuuid()
-        return item
-      })
-    }
-
-    if (_confirm) {
-      let that = this
-      confirm({
-        title: '纭畾鏇挎崲琛ㄥ崟鍚楋紵',
-        content: '鍘熻〃鍗曞皢鍒犻櫎銆�',
-        onOk() {
-          that.updateForms(_group)
-        },
-        onCancel() {}
-      })
-    } else {
-      this.updateForms(_group)
-    }
-  }
-
-  updateForms = (_group) => {
+  parseForm = (g, forms) => {
     const { group } = this.state
     let card = fromJS(this.state.card).toJS()
+    let _group = fromJS(g).toJS()
+
+    _group.fields = forms
 
     card.subcards = card.subcards.map(item => {
       if (item.uuid === _group.uuid) {
@@ -822,7 +745,7 @@
               <EditOutlined style={{color: '#1890ff'}} title="缂栬緫"/>
             </NormalForm>
             <CopyComponent type="tabform" card={card}/>
-            <PasteComponent config={card} options={['form', 'formgroup', 'simpleform']} updateConfig={this.pasteForm} />
+            <PasteComponent config={card} options={['formgroup', 'simpleform']} updateConfig={this.pasteForm} />
             <FontColorsOutlined className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle}/>
             <UserComponent config={card}/>
             <DeleteOutlined className="close" title="鍒犻櫎缁勪欢" onClick={() => this.props.deletecomponent(card.uuid)} />
diff --git a/src/menu/components/share/actioncomponent/index.jsx b/src/menu/components/share/actioncomponent/index.jsx
index 82fe3f2..4d26f43 100644
--- a/src/menu/components/share/actioncomponent/index.jsx
+++ b/src/menu/components/share/actioncomponent/index.jsx
@@ -263,6 +263,71 @@
     this.actionFormRef.handleConfirm().then(btn => {
       _actionlist = _actionlist.filter(item => !item.origin || item.uuid === btn.uuid)
 
+      if ((btn.OpenType === 'excelIn' || btn.OpenType === 'excelOut') && (!btn.verify || !btn.verify.columns) && config.subtype === 'basetable') {
+        let columns = []
+
+        if (btn.OpenType === 'excelOut') {
+          config.cols.forEach(item => {
+            if (!item.field || item.Hide === 'true') return
+  
+            let cell = {
+              Column: item.field,
+              Text: item.label,
+              Width: 20,
+              abs: 'false',
+              output: 'true',
+              required: 'false',
+              type: 'text',
+              uuid: Utils.getuuid()
+            }
+  
+            if (item.type === 'number') {
+              cell.type = 'number'
+              cell.decimal = item.decimal
+            }
+  
+            columns.push(cell)
+          })
+
+          btn.verify = btn.verify || {enable: 'false', dataType: 'default', scripts: []}
+          btn.verify.columns = columns
+        } else {
+          config.cols.forEach(item => {
+            if (!item.field || item.Hide === 'true') return
+  
+            let _type = 'Nvarchar(50)'
+            let _limit = '50'
+            if (item.type === 'number' && !item.decimal) {
+              _type = 'Int'
+              _limit = ''
+            } else if (item.type === 'number') {
+              _type = 'Decimal(18,' + item.decimal + ')'
+              _limit = item.decimal
+            }
+
+            let _cell = {
+              uuid: Utils.getuuid(),
+              Column: item.field,
+              Text: item.label,
+              type: _type,
+              limit: _limit,
+              import: 'true',
+              required: 'true'
+            }
+
+            if (_type !== 'Nvarchar(50)') {
+              _cell.min = 0
+              _cell.max = 999999
+            }
+  
+            columns.push(_cell)
+          })
+
+          btn.verify = btn.verify || {sheet: 'Sheet1', default: 'true', range: 1, scripts: [], uniques: []}
+          btn.verify.columns = columns
+        }
+      }
+
       let labelrepet = false
       _actionlist = _actionlist.map(item => {
         if (item.uuid !== btn.uuid && item.label === btn.label) {
diff --git a/src/menu/components/share/pastecomponent/index.jsx b/src/menu/components/share/pastecomponent/index.jsx
index 477e3e0..aa7abd3 100644
--- a/src/menu/components/share/pastecomponent/index.jsx
+++ b/src/menu/components/share/pastecomponent/index.jsx
@@ -7,7 +7,7 @@
 import Utils from '@/utils/utils.js'
 import MKEmitter from '@/utils/events.js'
 import asyncComponent from '@/utils/asyncComponent'
-import './index.scss'
+// import './index.scss'
 
 const PasteForm = asyncComponent(() => import('@/templates/zshare/pasteform'))
 
diff --git a/src/menu/components/share/pasteforms/index.jsx b/src/menu/components/share/pasteforms/index.jsx
new file mode 100644
index 0000000..ff09638
--- /dev/null
+++ b/src/menu/components/share/pasteforms/index.jsx
@@ -0,0 +1,174 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { fromJS } from 'immutable'
+import { Modal, notification, Button } from 'antd'
+import { SnippetsOutlined, QuestionCircleOutlined } from '@ant-design/icons'
+
+import Utils from '@/utils/utils.js'
+import asyncComponent from '@/utils/asyncComponent'
+import './index.scss'
+
+const PasteForm = asyncComponent(() => import('@/templates/zshare/pasteform'))
+
+class PasteController extends Component {
+  static propTpyes = {
+    config: PropTypes.object,        // 缁勪欢閰嶇疆
+    update: PropTypes.func
+  }
+
+  state = {
+    visible: false,
+    choVisible: false,
+    result: null
+  }
+
+  pasteSubmit = () => {
+    const { config } = this.props
+
+    this.pasteFormRef.handleConfirm().then(res => {
+      if (!['form', 'forms', 'formgroup', 'simpleform'].includes(res.copyType)) {
+        notification.warning({ top: 92, message: '閰嶇疆淇℃伅鏍煎紡閿欒锛�', duration: 5 })
+        return
+      }
+
+      if (res.copyType === 'form') {
+        delete res.copyType
+        res = {fields: [res]}
+      }
+
+      res.fields = res.fields || []
+      res.fields = res.fields.map(item => {
+        item.uuid = Utils.getuuid()
+        return item
+      })
+
+      let fields = res.fields.map(item => item.field ? item.field.toLowerCase() : '')
+
+      let repeat = false
+      let forms = []
+      if (config.fields) {
+        forms = fromJS(config.fields).toJS()
+        forms.forEach(item => {
+          if (item.field && fields.includes(item.field.toLowerCase())) {
+            repeat = true
+          }
+        })
+      }
+
+      if (repeat) {
+        this.setState({result: res, choVisible: true, visible: false})
+        return
+      } else {
+        forms.push(...res.fields)
+      }
+
+      this.props.update(forms, res)
+
+      this.setState({visible: false})
+
+      notification.success({
+        top: 92,
+        message: '绮樿创鎴愬姛锛�',
+        duration: 2
+      })
+    })
+  }
+
+  replaceForms = () => {
+    const { config } = this.props
+    const { result } = this.state
+
+    let forms = fromJS(config.fields).toJS()
+    let fields = fromJS(result.fields).toJS()
+    let repeats = []
+
+    forms = forms.map(item => {
+      if (!item.field) return item
+
+      let cell = fields.filter(m => m.field && m.field.toLowerCase() === item.field.toLowerCase())[0]
+      if (cell) {
+        repeats.push(cell.field)
+        return cell
+      }
+
+      return item
+    })
+    
+    fields = fields.filter(m => !m.field || !repeats.includes(m.field))
+
+    forms.push(...fields)
+
+    this.props.update(forms, result)
+
+    this.setState({choVisible: false})
+  }
+  
+  jumpForms = () => {
+    const { config } = this.props
+    const { result } = this.state
+
+    let forms = fromJS(config.fields).toJS()
+    let fields = fromJS(result.fields).toJS()
+    let repeats = []
+
+    forms = forms.map(item => {
+      if (!item.field) return item
+
+      let cell = fields.filter(m => m.field && m.field.toLowerCase() === item.field.toLowerCase())[0]
+      if (cell) {
+        repeats.push(cell.field)
+      }
+
+      return item
+    })
+    
+    fields = fields.filter(m => !m.field || !repeats.includes(m.field))
+
+    forms.push(...fields)
+
+    this.props.update(forms, result)
+
+    this.setState({choVisible: false})
+  }
+
+  render() {
+    const { type } = this.props
+    const { visible, choVisible } = this.state
+
+    return (
+      <div style={{display: 'inline-block'}}>
+        {type === 'toolbar' ? <Button icon="snippets" style={{color: 'purple'}} onClick={() => {this.setState({visible: true})}} >绮樿创</Button> :
+        <SnippetsOutlined style={{color: 'purple'}} onClick={() => {this.setState({visible: true})}} />}
+        <Modal
+          title="绮樿创"
+          visible={visible}
+          width={600}
+          maskClosable={false}
+          onOk={this.pasteSubmit}
+          onCancel={() => {this.setState({visible: false})}}
+          destroyOnClose
+        >
+          <PasteForm wrappedComponentRef={(inst) => this.pasteFormRef = inst} inputSubmit={this.pasteSubmit}/>
+        </Modal>
+        <Modal
+          title=""
+          visible={choVisible}
+          width={450}
+          closable={false}
+          maskClosable={false}
+          onCancel={() => {this.setState({choVisible: false, result: null})}}
+          footer={[
+            <Button key="cancel" onClick={() => this.setState({choVisible: false, result: null})}>鍙栨秷</Button>,
+            <Button key="replace" className="mk-border-purple" style={{color: 'purple'}} onClick={this.replaceForms}>鏇挎崲</Button>,
+            <Button key="confirm" type="primary" onClick={this.jumpForms}>璺宠繃</Button>
+          ]}
+          destroyOnClose
+        >
+          <QuestionCircleOutlined style={{color: 'orange', fontSize: '24px', margin: '15px 10px', position: 'relative', top: '2px'}}/>瀛樺湪閲嶅琛ㄥ崟锛岃閫夋嫨澶勭悊鏂瑰紡銆�
+        </Modal>
+      </div>
+    )
+  }
+}
+
+export default PasteController
\ No newline at end of file
diff --git a/src/menu/components/share/pasteforms/index.scss b/src/menu/components/share/pasteforms/index.scss
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/menu/components/share/pasteforms/index.scss
diff --git a/src/menu/components/table/base-table/index.jsx b/src/menu/components/table/base-table/index.jsx
index 86ba414..c1f4e85 100644
--- a/src/menu/components/table/base-table/index.jsx
+++ b/src/menu/components/table/base-table/index.jsx
@@ -191,11 +191,17 @@
       }
 
       card.action.forEach(cell => {
+        if (cell.hidden === 'true') return
         if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
           if (!cell.modal || cell.modal.fields.length === 0) {
-            card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
           }
+        } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+          card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+        } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+          card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
         }
+        
         if (doubleClick === cell.uuid) {
           doubleClick = ''
         }
@@ -204,11 +210,17 @@
       card.cols.forEach(col => {
         if (col.type === 'action') {
           col.elements.forEach(cell => {
+            if (cell.hidden === 'true') return
             if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
               if (!cell.modal || cell.modal.fields.length === 0) {
-                card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+                card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
               }
+            } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+            } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
             }
+
             if (doubleClick === cell.uuid) {
               doubleClick = ''
             }
diff --git a/src/menu/components/table/edit-table/index.jsx b/src/menu/components/table/edit-table/index.jsx
index ac0caff..dd661ef 100644
--- a/src/menu/components/table/edit-table/index.jsx
+++ b/src/menu/components/table/edit-table/index.jsx
@@ -178,20 +178,30 @@
       }
   
       card.action.forEach(cell => {
+        if (cell.hidden === 'true') return
         if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
           if (!cell.modal || cell.modal.fields.length === 0) {
-            card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
           }
+        } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+          card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+        } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+          card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
         }
       })
   
       card.cols.forEach(col => {
         if (col.type === 'action') {
           col.elements.forEach(cell => {
+            if (cell.hidden === 'true') return
             if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
               if (!cell.modal || cell.modal.fields.length === 0) {
-                card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+                card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
               }
+            } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+            } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
             }
           })
         } else if (col.type === 'custom') {
diff --git a/src/menu/components/table/normal-table/index.jsx b/src/menu/components/table/normal-table/index.jsx
index 873c345..898bda5 100644
--- a/src/menu/components/table/normal-table/index.jsx
+++ b/src/menu/components/table/normal-table/index.jsx
@@ -218,10 +218,15 @@
       }
 
       card.action.forEach(cell => {
+        if (cell.hidden === 'true') return
         if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
           if (!cell.modal || cell.modal.fields.length === 0) {
-            card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+            card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
           }
+        } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+          card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+        } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+          card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
         }
         if (doubleClick === cell.uuid) {
           doubleClick = ''
@@ -231,10 +236,15 @@
       card.cols.forEach(col => {
         if (col.type === 'action') {
           col.elements.forEach(cell => {
+            if (cell.hidden === 'true') return
             if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
               if (!cell.modal || cell.modal.fields.length === 0) {
-                card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+                card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
               }
+            } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+            } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
             }
             if (doubleClick === cell.uuid) {
               doubleClick = ''
diff --git a/src/menu/components/timeline/normal-timeline/index.jsx b/src/menu/components/timeline/normal-timeline/index.jsx
index 79df605..826bfae 100644
--- a/src/menu/components/timeline/normal-timeline/index.jsx
+++ b/src/menu/components/timeline/normal-timeline/index.jsx
@@ -132,10 +132,15 @@
       card.subcards.forEach(col => {
         col.elements.forEach(cell => {
           if (cell.eleType === 'button') {
+            if (cell.hidden === 'true') return
             if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
               if (!cell.modal || cell.modal.fields.length === 0) {
-                card.errors.push({ level: 1, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+                card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
               }
+            } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+            } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
+              card.errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
             }
           } else if (cell.datatype === 'dynamic' && cell.field && !columns.includes(cell.field)) {
             card.errors.push({ level: 1, detail: `鍗$墖涓姩鎬佸瓧娈碘��${cell.field}鈥濇棤鏁坄})
diff --git a/src/menu/modalconfig/index.jsx b/src/menu/modalconfig/index.jsx
index 4aab297..0448d06 100644
--- a/src/menu/modalconfig/index.jsx
+++ b/src/menu/modalconfig/index.jsx
@@ -21,7 +21,7 @@
 const { Panel } = Collapse
 const { confirm } = Modal
 const ModalForm = asyncComponent(() => import('@/templates/zshare/modalform'))
-const EditComponent = asyncComponent(() => import('@/templates/zshare/editcomponent'))
+const PasteForms = asyncComponent(() => import('@/menu/components/share/pasteforms'))
 const DragElement = asyncComponent(() => import('@/templates/modalconfig/dragelement'))
 const FieldsComponent = asyncComponent(() => import('@/templates/sharecomponent/fieldscomponent'))
 
@@ -458,44 +458,8 @@
     })
   }
 
-  plusFields = (items, type) => {
+  plusFields = (items) => {
     let _config = fromJS(this.state.config).toJS()
-
-    if (type === 'forms') {
-      if (_config.fields.length > 0) {
-        let that = this
-        _config.fields = items.fields.map(item => {
-          item.uuid = Utils.getuuid()
-          return item
-        })
-
-        confirm({
-          title: '纭畾鏇挎崲琛ㄥ崟鍚楋紵',
-          content: '鍘熻〃鍗曞皢鍒犻櫎銆�',
-          onOk() {
-            that.setState({
-              config: _config
-            })
-          },
-          onCancel() {}
-        })
-      } else {
-        _config.fields = items.fields.map(item => {
-          item.uuid = Utils.getuuid()
-          return item
-        })
-
-        this.setState({
-          config: _config
-        })
-        notification.success({
-          top: 92,
-          message: '绮樿创鎴愬姛锛�',
-          duration: 2
-        })
-      }
-      return
-    }
 
     _config.fields.push(...items)
 
@@ -505,6 +469,15 @@
       if (items.length === 1 && items[0].focus) {
         this.handleForm(items[0])
       }
+    })
+  }
+
+  pasteFields = (items) => {
+    let _config = fromJS(this.state.config).toJS()
+    _config.fields = items
+
+    this.setState({
+      config: _config
     })
   }
 
@@ -564,7 +537,7 @@
             <Card title="琛ㄥ崟閰嶇疆" bordered={false} extra={
               <div>
                 <Button type="danger" onClick={this.clearConfig}>娓呯┖</Button>
-                <EditComponent options={['form', 'forms']} type="formboard" config={this.state.config} plusFields={this.plusFields}/>
+                <PasteForms type="toolbar" config={config} update={this.pasteFields}/>
                 <Button type="primary" id="save-modal-config" loading={saving} onClick={this.submitConfig}>淇濆瓨</Button>
                 <Button onClick={this.cancelConfig}>杩斿洖</Button>
               </div>
diff --git a/src/mob/components/formdragelement/card.jsx b/src/mob/components/formdragelement/card.jsx
index db21a71..e019a9f 100644
--- a/src/mob/components/formdragelement/card.jsx
+++ b/src/mob/components/formdragelement/card.jsx
@@ -79,10 +79,8 @@
     formItem = (<div className={'am-list-item input ' + (card.place || '')}><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className={'am-input-control ' + card.cursor}>{card.initval ? card.initval : <span style={{color: '#bcbcbc'}}>{card.placeholder || <span style={{color: 'transparent'}}>input</span>}</span> }</div>{card.scan && card.scan !== 'false' ? <div className="am-list-extra"><ScanOutlined /></div> : null}</div></div>)
   } else if (card.type === 'number') {
     formItem = (<div className={'am-list-item input ' + (card.place || '')}><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className={'am-input-control ' + card.cursor}>{card.initval || 0}</div>{card.placeholder ? <div className="am-list-extra" style={{color: '#999999', width: 'auto', lineHeight: 1.5, height: '22px'}}>{card.placeholder}</div> : null}</div></div>)
-  } else if (card.type === 'number') {
-    formItem = (<div className="am-list-item input"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className={'am-input-control ' + card.cursor}>{card.initval || <span style={{color: 'transparent'}}>input</span>}</div></div></div>)
   } else if (card.type === 'select' || card.type === 'link' || card.type === 'cascader') {
-    formItem = (<div className="am-list-item"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{selectval || '璇烽�夋嫨'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
+    formItem = (<div className={'am-list-item picker ' + (card.place || '')}><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{selectval || '璇烽�夋嫨'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
   } else if (card.type === 'date') {
     let format = 'YYYY-MM-DD'
     if (card.precision === 'hour') {
@@ -92,14 +90,14 @@
     } else if (card.precision === 'second') {
       format = 'YYYY-MM-DD HH:mm:ss'
     }
-    formItem = (<div className="am-list-item"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{card.initval ? moment().subtract(card.initval, 'days').format(format) : '璇烽�夋嫨'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
+    formItem = (<div className={'am-list-item picker ' + (card.place || '')}><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{card.initval ? moment().subtract(card.initval, 'days').format(format) : '璇烽�夋嫨'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
   } else if (card.type === 'datemonth') {
-    formItem = (<div className="am-list-item"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{card.initval ? moment().subtract(card.initval, 'month').format('YYYY-MM') : '璇烽�夋嫨'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
+    formItem = (<div className={'am-list-item picker ' + (card.place || '')}><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{card.initval ? moment().subtract(card.initval, 'month').format('YYYY-MM') : '璇烽�夋嫨'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
   } else if (card.type === 'datetime') {
     formItem = (<div className="am-list-item"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{card.initval ? moment().subtract(card.initval, 'days').format('YYYY-MM-DD HH:mm') : '璇烽�夋嫨'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
   } else if (card.type === 'textarea') {
     let height = (card.maxRows || 2) * 25
-    formItem = (<div className="am-list-item check-card">
+    formItem = (<div className={'am-list-item check-card ' + (card.place || '')}>
       <div className="am-list-line">
         <div className="am-input-label">{card.label}</div>
         <div className="am-input-control">
@@ -142,7 +140,7 @@
     }
 
     formItem = (
-    <div className={'am-list-item checkbox mk-radio ' + (card.arrange || '')}>
+    <div className={'am-list-item checkbox mk-radio ' + (card.arrange || '') + ' ' + (card.place || '')}>
       <div className="am-list-line">
         <div className="am-input-label">{card.label}</div>
         <div className="am-input-control">
@@ -171,7 +169,7 @@
     }
 
     formItem = (
-      <div className={'am-list-item checkbox ' + (card.arrange || '')}>
+      <div className={'am-list-item checkbox ' + (card.arrange || '') + ' ' + (card.place || '')}>
         <div className="am-list-line">
           <div className="am-input-label">{card.label}</div>
           <div className="am-input-control">
@@ -204,7 +202,7 @@
   } else if (card.type === 'split') {
     formItem = <div className="split-line">{card.label}</div>
   } else if (card.type === 'checkcard') {
-    formItem = (<div className="am-list-item check-card">
+    formItem = (<div className={'am-list-item check-card ' + (card.place || '')}>
       <div className="am-list-line">
         {card.hidelabel !== 'true' ? <div className="am-input-label">{card.label}</div> : null}
         <div className="am-input-control">
diff --git a/src/mob/components/formdragelement/index.scss b/src/mob/components/formdragelement/index.scss
index 3772a7b..5aeda26 100644
--- a/src/mob/components/formdragelement/index.scss
+++ b/src/mob/components/formdragelement/index.scss
@@ -88,6 +88,14 @@
       }
     }
   }
+  .am-list-item:not(.up_down) {
+    .am-list-line {
+      .am-input-label {
+        width: 28%;
+        max-width: 120px;
+      }
+    }
+  }
   .am-list-item.up_down {
     height: auto;
     .am-list-line {
@@ -107,6 +115,26 @@
       }
     }
   }
+  .am-list-item.picker:not(.up_down) {
+    .am-list-line {
+      .am-input-control {
+        padding-right: 0px;
+      }
+    }
+  }
+  .am-list-item.up_down.picker {
+    .am-list-line {
+      .am-input-control {
+        line-height: 40px;
+        padding-right: 20px;
+      }
+      .am-list-extra {
+        top: auto;
+        right: 10px;
+        bottom: 13px;
+      }
+    }
+  }
   .ant-form-item.actived {
     .am-input-label {
       color: #1890ff;
@@ -122,6 +150,16 @@
       }
       .am-input-label {
         width: auto;
+      }
+    }
+  }
+  .am-list-item.check-card.left_right {
+    .am-list-line {
+      display: flex;
+      .am-input-label {
+        width: 28%;
+        max-width: 120px;
+        line-height: 1;
       }
     }
   }
@@ -230,6 +268,17 @@
       }
     }
   }
+  .am-list-item.checkbox.left_right {
+    .am-list-line {
+      display: flex;
+      .ant-checkbox-group {
+        float: right;
+      }
+      .am-input-control {
+        padding-right: 0px;
+      }
+    }
+  }
   .am-list-item.checkbox.mk-radio {
     .ant-checkbox-inner {
       border-radius: 50%;
diff --git a/src/mob/modalconfig/index.jsx b/src/mob/modalconfig/index.jsx
index 062c54e..b355b14 100644
--- a/src/mob/modalconfig/index.jsx
+++ b/src/mob/modalconfig/index.jsx
@@ -20,8 +20,8 @@
 
 const { Panel } = Collapse
 const { confirm } = Modal
-const PasteComponent = asyncComponent(() => import('./pastecomponent'))
 const ModalForm = asyncComponent(() => import('@/templates/zshare/modalform'))
+const PasteForms = asyncComponent(() => import('@/menu/components/share/pasteforms'))
 const DragElement = asyncComponent(() => import('@/mob/components/formdragelement'))
 const FieldsComponent = asyncComponent(() => import('@/templates/sharecomponent/fieldscomponent'))
 
@@ -412,49 +412,12 @@
     })
   }
 
-  insert = (config, type) => {
-    if (type === 'forms') {
-      let _config = fromJS(this.state.config).toJS()
-
-      if (_config.fields.length > 0) {
-        let that = this
-        _config.fields = config.fields.map(item => {
-          item.uuid = Utils.getuuid()
-          return item
-        })
-
-        confirm({
-          title: '纭畾鏇挎崲琛ㄥ崟鍚楋紵',
-          content: '鍘熻〃鍗曞皢鍒犻櫎銆�',
-          onOk() {
-            that.setState({
-              config: _config
-            })
-          },
-          onCancel() {}
-        })
-      } else {
-        _config.fields = config.fields.map(item => {
-          item.uuid = Utils.getuuid()
-          return item
-        })
-
-        this.setState({
-          config: _config
-        })
-        notification.success({
-          top: 92,
-          message: '绮樿创鎴愬姛锛�',
-          duration: 2
-        })
-      }
-      return
-    }
+  pasteFields = (items) => {
+    let _config = fromJS(this.state.config).toJS()
+    _config.fields = items
 
     this.setState({
-      config
-    }, () => {
-      this.handleForm(config.fields[config.fields.length - 1])
+      config: _config
     })
   }
 
@@ -528,7 +491,7 @@
             <Button type="primary" id="save-modal-config" loading={saving} onClick={this.submitConfig}>淇濆瓨</Button>
             <Button onClick={this.cancelConfig}>杩斿洖</Button>
             <Button type="primary" style={{background: '#26C281', border: 'none'}} onClick={this.triggerCopy}>澶嶅埗</Button>
-            <PasteComponent config={config} updateConfig={this.insert} />
+            <PasteForms type="toolbar" config={config} update={this.pasteFields}/>
             <Button type="danger" onClick={this.clearConfig}>娓呯┖</Button>
             <Switch checkedChildren="寮�" unCheckedChildren="鍏�" defaultChecked={this.state.showField} onChange={(val) => this.setState({showField: val})} />
           </div>
diff --git a/src/templates/modalconfig/dragelement/index.scss b/src/templates/modalconfig/dragelement/index.scss
index 3d99524..1c12c6c 100644
--- a/src/templates/modalconfig/dragelement/index.scss
+++ b/src/templates/modalconfig/dragelement/index.scss
@@ -166,4 +166,18 @@
   .page-card {
     margin-bottom: 5px;
   }
-}
\ No newline at end of file
+}
+// .modal-fields-row.copy {
+//   z-index: 3;
+// }
+// .modal-fields-row.copy::before {
+//   content: ' ';
+//   display: block;
+//   position: fixed;
+//   left: 0;
+//   right: 0;
+//   top: 0;
+//   bottom: 0;
+//   background: rgba(0,0,0,0.2);
+//   z-index: 2;
+// }
\ No newline at end of file
diff --git a/src/templates/zshare/formconfig.jsx b/src/templates/zshare/formconfig.jsx
index df317c7..786a6be 100644
--- a/src/templates/zshare/formconfig.jsx
+++ b/src/templates/zshare/formconfig.jsx
@@ -2595,6 +2595,10 @@
     card.precision = 'second'
   }
 
+  if (!card.place && appType === 'mob') {
+    card.place = ['checkbox', 'radio', 'checkcard', 'textarea'].includes(card.type) ? 'up_down' : 'left_right'
+  }
+
   let options = card.options || []
   if (['select', 'radio', 'link'].includes(card.type) && card.setAll === 'true') { // 鍏煎
     options.unshift({
@@ -3508,7 +3512,7 @@
       key: 'place',
       label: '鎺掑垪',
       initVal: card.place || 'left_right',
-      tooltip: '鎻愮ず鏂囧瓧涓庤緭鍏ユ鐨勪綅缃叧绯汇�傛敞锛氶�夋嫨鍣ㄣ�佹棩鏈熻〃鍗曞湪琛ㄥ崟鏍峰紡涓洪槾褰辨椂鏈夋晥',
+      tooltip: '鎻愮ず鏂囧瓧涓庤緭鍏ユ鐨勪綅缃叧绯汇��',
       forbid: appType !== 'mob',
       options: [{
         value: 'left_right',
diff --git a/src/templates/zshare/modalform/index.jsx b/src/templates/zshare/modalform/index.jsx
index 26f37bd..3d08c71 100644
--- a/src/templates/zshare/modalform/index.jsx
+++ b/src/templates/zshare/modalform/index.jsx
@@ -22,9 +22,9 @@
   text: ['initval', 'readonly', 'required', 'hidden', 'readin', 'fieldlength', 'regular', 'interception', 'span', 'labelwidth', 'encryption', 'tooltip', 'extra', 'enter', 'cursor', 'scan', 'splitline', 'placeholder', 'place', 'marginTop', 'marginBottom', 'lenControl', 'inputType'],
   number: ['initval', 'readonly', 'hidden', 'decimal', 'min', 'max', 'readin', 'span', 'labelwidth', 'tooltip', 'extra', 'enter', 'cursor', 'splitline', 'place', 'marginTop', 'marginBottom'],
   select: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'declare', 'setAll', 'linkSubField', 'span', 'labelwidth', 'tooltip', 'extra', 'place', 'emptyText', 'enter', 'splitline', 'dropdown', 'marginTop', 'marginBottom'],
-  checkbox: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'fieldlength', 'span', 'labelwidth', 'tooltip', 'extra', 'splitline', 'arrange', 'marginTop', 'marginBottom'],
-  radio: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'declare', 'linkSubField', 'span', 'labelwidth', 'tooltip', 'extra', 'setAll', 'emptyText', 'splitline', 'arrange', 'marginTop', 'marginBottom'],
-  checkcard: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'span', 'labelwidth', 'display', 'tooltip', 'extra', 'width', 'multiple', 'splitline', 'marginTop', 'marginBottom'],
+  checkbox: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'fieldlength', 'span', 'labelwidth', 'tooltip', 'extra', 'place', 'splitline', 'arrange', 'marginTop', 'marginBottom'],
+  radio: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'declare', 'linkSubField', 'span', 'labelwidth', 'tooltip', 'extra', 'place', 'setAll', 'emptyText', 'splitline', 'arrange', 'marginTop', 'marginBottom'],
+  checkcard: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'span', 'labelwidth', 'display', 'tooltip', 'extra', 'place', 'width', 'multiple', 'splitline', 'marginTop', 'marginBottom'],
   multiselect: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'fieldlength', 'span', 'labelwidth', 'tooltip', 'extra', 'marginTop', 'marginBottom', 'dropdown'],
   link: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'declare', 'setAll', 'linkField', 'linkSubField', 'span', 'place', 'labelwidth', 'tooltip', 'extra', 'emptyText', 'enter', 'splitline', 'dropdown', 'marginTop', 'marginBottom'],
   fileupload: ['readonly', 'required', 'readin', 'fieldlength', 'maxfile', 'fileType', 'span', 'labelwidth', 'tooltip', 'extra', 'compress', 'miniSet', 'splitline', 'marginTop', 'marginBottom', 'maxSize'],
@@ -32,7 +32,7 @@
   date: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra', 'declareType', 'mode', 'splitline', 'place', 'marginTop', 'marginBottom', 'minDate', 'maxDate', 'precision'],
   datemonth: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra', 'declareType', 'splitline', 'place', 'marginTop', 'marginBottom'],
   datetime: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra', 'declareType', 'mode', 'splitline', 'marginTop', 'marginBottom', 'minDate', 'maxDate'],
-  textarea: ['initval', 'readonly', 'required', 'hidden', 'readin', 'fieldlength', 'span', 'labelwidth', 'maxRows', 'encryption', 'interception', 'tooltip', 'extra', 'count', 'placeholder', 'marginTop', 'marginBottom'],
+  textarea: ['initval', 'readonly', 'required', 'hidden', 'readin', 'fieldlength', 'span', 'labelwidth', 'maxRows', 'encryption', 'interception', 'tooltip', 'extra', 'place', 'count', 'placeholder', 'marginTop', 'marginBottom'],
   cascader: ['readonly', 'required', 'hidden', 'readin', 'resourceType', 'fieldlength', 'span', 'labelwidth', 'tooltip', 'extra', 'place', 'splitline', 'marginTop', 'marginBottom', 'separator'],
   color: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'colorType', 'extra', 'marginTop', 'marginBottom'],
   rate: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'splitline', 'tooltip', 'extra', 'marginTop', 'marginBottom', 'allowHalf', 'color', 'rateCount', 'character', 'place'],

--
Gitblit v1.8.0