From 704f82b06befe96e5f739b2dce419f76f5683a6f Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期一, 15 八月 2022 09:27:54 +0800
Subject: [PATCH] Merge branch 'develop'

---
 src/templates/zshare/modalform/index.jsx                                         |   57 
 src/tabviews/formtab/index.jsx                                                   |    4 
 src/menu/components/timeline/normal-timeline/index.jsx                           |   24 
 src/mob/components/tabs/antv-tabs/options.jsx                                    |   23 
 src/views/popdesign/menuform/index.scss                                          |    0 
 src/templates/zshare/verifycard/customscript/index.jsx                           |    2 
 src/tabviews/custom/components/module/voucher/assistTable/index.jsx              |  738 +++++++++
 src/locales/zh-CN/model.js                                                       |    1 
 src/menu/components/chart/antv-scatter/index.jsx                                 |    5 
 src/pc/menushell/index.scss                                                      |    2 
 src/tabviews/zshare/mutilform/mkInput/index.jsx                                  |   73 
 src/views/design/sidemenu/index.jsx                                              |    6 
 src/tabviews/commontable/index.jsx                                               |   10 
 src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx             |    4 
 src/menu/datasource/verifycard/index.jsx                                         |    2 
 src/menu/components/form/formaction/formconfig.jsx                               |   13 
 src/mob/components/navbar/normal-navbar/menus/menuform/index.jsx                 |  134 
 src/tabviews/custom/components/card/prop-card/index.jsx                          |    6 
 src/menu/components/card/cardcellcomponent/index.jsx                             |    2 
 src/menu/components/card/data-card/options.jsx                                   |    1 
 src/menu/components/form/tab-form/index.jsx                                      |   22 
 src/tabviews/custom/components/table/normal-table/index.jsx                      |    2 
 src/menu/components/carousel/prop-card/index.jsx                                 |   22 
 src/menu/components/tabs/antv-tabs/options.jsx                                   |   26 
 src/mob/components/menubar/normal-menubar/menucomponent/options.jsx              |   45 
 src/tabviews/custom/components/timeline/normal-timeline/index.jsx                |   35 
 src/menu/components/chart/antv-pie/index.jsx                                     |    5 
 src/tabviews/zshare/mutilform/index.jsx                                          |   10 
 src/menu/components/share/actioncomponent/actionform/index.jsx                   |   47 
 src/tabviews/custom/index.jsx                                                    |   80 
 src/tabviews/zshare/mutilform/mkTextArea/index.jsx                               |   25 
 src/menu/components/card/prop-card/index.jsx                                     |   49 
 src/templates/zshare/customscript/index.jsx                                      |    2 
 src/menu/components/table/normal-table/columns/index.jsx                         |   16 
 src/menu/components/table/edit-table/columns/index.jsx                           |   15 
 src/pc/components/navbar/normal-navbar/index.jsx                                 |    4 
 package-lock.json                                                                |  497 +++++
 src/assets/css/viewstyle.scss                                                    |   28 
 src/views/design/header/index.jsx                                                |    4 
 src/tabviews/verupmanage/subtabtable/index.jsx                                   |    4 
 src/menu/components/form/formaction/actionform/index.jsx                         |   58 
 src/menu/components/card/prop-card/index.scss                                    |    9 
 src/tabviews/custom/components/carousel/data-card/index.scss                     |    1 
 src/menu/components/chart/chart-custom/index.jsx                                 |    4 
 src/tabviews/zshare/actionList/exceloutbutton/index.jsx                          |    2 
 src/menu/components/form/simple-form/index.jsx                                   |   22 
 src/menu/components/chart/antv-bar/index.jsx                                     |    5 
 src/tabviews/custom/components/table/edit-table/index.jsx                        |    2 
 src/api/index.js                                                                 |   42 
 src/tabviews/subtable/index.jsx                                                  |   10 
 src/tabviews/custom/components/module/voucher/assistTable/index.scss             |  259 +++
 src/menu/components/table/edit-table/index.jsx                                   |   22 
 src/menu/components/carousel/data-card/index.jsx                                 |   22 
 src/menu/sysinterface/index.jsx                                                  |    1 
 src/mob/components/menubar/normal-menubar/menucomponent/index.jsx                |    2 
 src/views/popdesign/index.scss                                                   |   32 
 src/menu/components/form/step-form/index.jsx                                     |   22 
 src/pc/bgcontroller/index.jsx                                                    |   38 
 src/views/pcdesign/index.jsx                                                     |  175 -
 src/pc/components/navbar/normal-navbar/menusetting/menuform/index.jsx            |   74 
 src/menu/components/share/actioncomponent/index.jsx                              |    2 
 src/tabviews/scriptmanage/index.jsx                                              |    4 
 src/locales/en-US/mob.js                                                         |    1 
 src/utils/utils-datamanage.js                                                    |   23 
 src/menu/sysinterface/settingform/simplescript/index.jsx                         |    2 
 src/menu/components/table/edit-table/columns/tableIn/index.jsx                   |    4 
 src/menu/stylecombcontrolbutton/index.scss                                       |   10 
 src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx |    2 
 src/menu/components/card/table-card/index.jsx                                    |   16 
 src/mob/components/tabs/antv-tabs/index.jsx                                      |    1 
 src/tabviews/custom/components/tabs/antv-tabs/index.jsx                          |   16 
 src/menu/components/form/formaction/actionform/index.scss                        |    5 
 src/templates/sharecomponent/actioncomponent/actionform/index.scss               |    5 
 public/options.json                                                              |   14 
 src/tabviews/custom/components/carousel/prop-card/index.scss                     |    1 
 src/menu/components/form/formaction/index.jsx                                    |    2 
 src/menu/components/card/data-card/index.scss                                    |    9 
 src/menu/components/tree/antd-tree/index.jsx                                     |    4 
 src/tabviews/subtabtable/index.jsx                                               |   10 
 src/tabviews/zshare/actionList/normalbutton/index.jsx                            |  682 +++++---
 src/views/mobdesign/index.jsx                                                    |  145 
 src/views/menudesign/index.jsx                                                   |  222 +-
 src/menu/datasource/verifycard/columnform/index.jsx                              |    4 
 src/views/design/index.scss                                                      |    5 
 src/locales/zh-CN/mob.js                                                         |    1 
 src/menu/components/share/actioncomponent/formconfig.jsx                         |   53 
 src/templates/sharecomponent/actioncomponent/actionform/index.jsx                |   28 
 src/router/index.js                                                              |    2 
 src/menu/components/card/data-card/index.jsx                                     |   45 
 src/views/popdesign/index.jsx                                                    |  320 ++-
 src/menu/components/chart/antv-dashboard/index.jsx                               |    5 
 src/views/imdesign/index.jsx                                                     |    2 
 src/menu/components/table/normal-table/index.jsx                                 |   24 
 src/tabviews/verupmanage/index.jsx                                               |    4 
 src/menu/components/tabs/antv-tabs/index.jsx                                     |    1 
 src/menu/menushell/index.scss                                                    |    3 
 src/views/design/index.jsx                                                       |   25 
 src/components/header/index.jsx                                                  |    7 
 src/templates/formtabconfig/index.jsx                                            |    2 
 src/pc/components/navbar/normal-navbar/menusetting/menutable/index.jsx           |    6 
 src/tabviews/calendar/index.jsx                                                  |    4 
 src/menu/components/code/sandbox/index.jsx                                       |    4 
 src/locales/en-US/model.js                                                       |    1 
 src/utils/utils.js                                                               |    9 
 src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx            |    2 
 src/menu/components/card/balcony/index.jsx                                       |   12 
 src/components/normalform/modalform/index.jsx                                    |   33 
 src/templates/zshare/formconfig.jsx                                              |  141 +
 src/templates/zshare/verifycard/index.jsx                                        |   27 
 /dev/null                                                                        |    9 
 src/views/popdesign/menuform/index.jsx                                           |   14 
 src/templates/sharecomponent/actioncomponent/index.jsx                           |    2 
 src/menu/components/editor/braft-editor/index.jsx                                |    4 
 package.json                                                                     |    1 
 src/tabviews/zshare/fileupload/index.jsx                                         |   40 
 115 files changed, 3,576 insertions(+), 1,291 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 33515f6..c574856 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -623,6 +623,257 @@
         }
       }
     },
+    "@antv/x6": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/@antv/x6/-/x6-1.33.0.tgz",
+      "integrity": "sha512-B9KkOZJrhgjwDfwUBl58YAGcnD3lpebVaGPGxFMtLcBWmM7K6aDu+TK0CbcdoTS99OyqUQkzNI4O4RFwrw+SRA==",
+      "requires": {
+        "csstype": "^3.0.3",
+        "jquery": "^3.5.1",
+        "jquery-mousewheel": "^3.1.13",
+        "lodash-es": "^4.17.15",
+        "mousetrap": "^1.6.5",
+        "utility-types": "^3.10.0"
+      },
+      "dependencies": {
+        "csstype": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz",
+          "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
+        }
+      }
+    },
+    "@antv/x6-react-components": {
+      "version": "1.1.15",
+      "resolved": "https://registry.npmjs.org/@antv/x6-react-components/-/x6-react-components-1.1.15.tgz",
+      "integrity": "sha512-tXUak5CPuZLIA0fVBSM2vZ+TxxoEGBcokr0J69e7H0G3WIutDf6J6RkNeRGuKvcW8O1Lef1jiBGSLLjlrRXf0g==",
+      "requires": {
+        "clamp": "^1.0.1",
+        "classnames": "^2.2.6",
+        "rc-dropdown": "^3.0.0-alpha.0",
+        "rc-util": "^4.15.7",
+        "react-color": "^2.17.3",
+        "react-resize-detector": "^6.6.4",
+        "ua-parser-js": "^0.7.20"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.18.9",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz",
+          "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==",
+          "requires": {
+            "regenerator-runtime": "^0.13.4"
+          }
+        },
+        "lodash": {
+          "version": "4.17.21",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+          "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+        },
+        "rc-align": {
+          "version": "4.0.12",
+          "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.12.tgz",
+          "integrity": "sha512-3DuwSJp8iC/dgHzwreOQl52soj40LchlfUHtgACOUtwGuoFIOVh6n/sCpfqCU8kO5+iz6qR0YKvjgB8iPdE3aQ==",
+          "requires": {
+            "@babel/runtime": "^7.10.1",
+            "classnames": "2.x",
+            "dom-align": "^1.7.0",
+            "lodash": "^4.17.21",
+            "rc-util": "^5.3.0",
+            "resize-observer-polyfill": "^1.5.1"
+          },
+          "dependencies": {
+            "rc-util": {
+              "version": "5.23.0",
+              "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.23.0.tgz",
+              "integrity": "sha512-lgm6diJ/pLgyfoZY59Vz7sW4mSoQCgozqbBye9IJ7/mb5w5h4T7h+i2JpXAx/UBQxscBZe68q0sP7EW+qfkKUg==",
+              "requires": {
+                "@babel/runtime": "^7.18.3",
+                "react-is": "^16.12.0",
+                "shallowequal": "^1.1.0"
+              }
+            }
+          }
+        },
+        "rc-dropdown": {
+          "version": "3.6.2",
+          "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-3.6.2.tgz",
+          "integrity": "sha512-Wsw7GkVbUXADEs8FPL0v8gd+3mWQiydPFXBlr2imMScQaf8hh79pG9KrBc1DwK+nqHmYOpQfK2gn6jG2AQw9Pw==",
+          "requires": {
+            "@babel/runtime": "^7.10.1",
+            "classnames": "^2.2.6",
+            "rc-trigger": "^5.0.4",
+            "rc-util": "^5.17.0"
+          },
+          "dependencies": {
+            "rc-util": {
+              "version": "5.23.0",
+              "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.23.0.tgz",
+              "integrity": "sha512-lgm6diJ/pLgyfoZY59Vz7sW4mSoQCgozqbBye9IJ7/mb5w5h4T7h+i2JpXAx/UBQxscBZe68q0sP7EW+qfkKUg==",
+              "requires": {
+                "@babel/runtime": "^7.18.3",
+                "react-is": "^16.12.0",
+                "shallowequal": "^1.1.0"
+              }
+            }
+          }
+        },
+        "rc-trigger": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.1.tgz",
+          "integrity": "sha512-5gaFbDkYSefZ14j2AdzucXzlWgU2ri5uEjkHvsf1ynRhdJbKxNOnw4PBZ9+FVULNGFiDzzlVF8RJnR9P/xrnKQ==",
+          "requires": {
+            "@babel/runtime": "^7.18.3",
+            "classnames": "^2.2.6",
+            "rc-align": "^4.0.0",
+            "rc-motion": "^2.0.0",
+            "rc-util": "^5.19.2"
+          },
+          "dependencies": {
+            "rc-util": {
+              "version": "5.23.0",
+              "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.23.0.tgz",
+              "integrity": "sha512-lgm6diJ/pLgyfoZY59Vz7sW4mSoQCgozqbBye9IJ7/mb5w5h4T7h+i2JpXAx/UBQxscBZe68q0sP7EW+qfkKUg==",
+              "requires": {
+                "@babel/runtime": "^7.18.3",
+                "react-is": "^16.12.0",
+                "shallowequal": "^1.1.0"
+              }
+            }
+          }
+        },
+        "rc-util": {
+          "version": "4.21.1",
+          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz",
+          "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==",
+          "requires": {
+            "add-dom-event-listener": "^1.1.0",
+            "prop-types": "^15.5.10",
+            "react-is": "^16.12.0",
+            "react-lifecycles-compat": "^3.0.4",
+            "shallowequal": "^1.1.0"
+          }
+        },
+        "react-is": {
+          "version": "16.13.1",
+          "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+          "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+        },
+        "regenerator-runtime": {
+          "version": "0.13.9",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+          "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+        }
+      }
+    },
+    "@antv/x6-react-shape": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/@antv/x6-react-shape/-/x6-react-shape-1.6.1.tgz",
+      "integrity": "sha512-EkcDoIlfbQC69DGgwznFRsi78fW+apTO0OW5J6tnKpMW3r6zB5zr5QM06hzq5UEUgGheMUxNh3wrTd0jnCwR3A=="
+    },
+    "@antv/xflow": {
+      "version": "1.0.50",
+      "resolved": "https://registry.npmjs.org/@antv/xflow/-/xflow-1.0.50.tgz",
+      "integrity": "sha512-LZ6vSgL13TZSykuIu5zInU7bUSKcgP35tXdsmLAxh7yVDPprBsEm0pGFQSE0QqSWT3TJy/hUZ8HIF8Lo2QJ2Wg==",
+      "requires": {
+        "@antv/layout": "^0.1.22",
+        "@antv/x6": "^1.31.0",
+        "@antv/x6-react-components": "^1.1.15",
+        "@antv/x6-react-shape": "^1.5.2",
+        "@antv/xflow-core": "1.0.50",
+        "@antv/xflow-extension": "1.0.50",
+        "@antv/xflow-hook": "1.0.50"
+      },
+      "dependencies": {
+        "@antv/layout": {
+          "version": "0.1.31",
+          "resolved": "https://registry.npmjs.org/@antv/layout/-/layout-0.1.31.tgz",
+          "integrity": "sha512-iz9i19dOJGiZr5xBWI5sfG+2K3QVMNAGOBrbjWKH2RGLvGpf2TSFySidhz0siDrcQA46cDsjLmGstezQdgeGzA==",
+          "requires": {
+            "@antv/g-webgpu": "0.5.5",
+            "@dagrejs/graphlib": "2.1.4",
+            "d3-force": "^2.0.1",
+            "ml-matrix": "^6.5.0"
+          }
+        }
+      }
+    },
+    "@antv/xflow-core": {
+      "version": "1.0.50",
+      "resolved": "https://registry.npmjs.org/@antv/xflow-core/-/xflow-core-1.0.50.tgz",
+      "integrity": "sha512-KREkPxkWkfy4FjK3N23XTHjSlPGwgrmpwlp5EGkyl0gOwlQVLuSUofNoK4rRg0CW+KLJI5AIDdqFkBMHl3udmA==",
+      "requires": {
+        "@antv/xflow-hook": "1.0.50",
+        "classnames": "^2.3.1",
+        "immer": "^9.0.7",
+        "mana-common": "^0.3.1",
+        "mana-syringe": "^0.2.2",
+        "reflect-metadata": "^0.1.13",
+        "rxjs": "^6.6.7"
+      },
+      "dependencies": {
+        "classnames": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz",
+          "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA=="
+        },
+        "immer": {
+          "version": "9.0.15",
+          "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz",
+          "integrity": "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ=="
+        },
+        "rxjs": {
+          "version": "6.6.7",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+          "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        }
+      }
+    },
+    "@antv/xflow-extension": {
+      "version": "1.0.50",
+      "resolved": "https://registry.npmjs.org/@antv/xflow-extension/-/xflow-extension-1.0.50.tgz",
+      "integrity": "sha512-kJ61xa38112ObRPuui7LEpz0+ZB9qoKR4Kf/A48GoG/iC4VtwmYuSeZ4ivztqnLVZHa5lh4l482FJIM7qyzGjA==",
+      "requires": {
+        "@antv/xflow-core": "1.0.50",
+        "@antv/xflow-hook": "1.0.50",
+        "mana-syringe": "^0.2.2",
+        "moment": "^2.29.1",
+        "rc-field-form": "^1.22.0",
+        "react-color": "2.17.1",
+        "reflect-metadata": "^0.1.13"
+      },
+      "dependencies": {
+        "moment": {
+          "version": "2.29.4",
+          "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
+          "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
+        },
+        "react-color": {
+          "version": "2.17.1",
+          "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.17.1.tgz",
+          "integrity": "sha512-S+I6TkUKJaqfALLkAIfiCZ/MANQyy7dKkf7g9ZU5GTUy2rf8c2Rx62otyvADAviWR+6HRkzdf2vL1Qvz9goCLQ==",
+          "requires": {
+            "@icons/material": "^0.2.4",
+            "lodash": "^4.17.11",
+            "material-colors": "^1.2.1",
+            "prop-types": "^15.5.10",
+            "reactcss": "^1.2.0",
+            "tinycolor2": "^1.4.1"
+          }
+        }
+      }
+    },
+    "@antv/xflow-hook": {
+      "version": "1.0.50",
+      "resolved": "https://registry.npmjs.org/@antv/xflow-hook/-/xflow-hook-1.0.50.tgz",
+      "integrity": "sha512-d/Mia7LaWs1wba35PhdqQaWdM84qti7Yh73rb0gziUNQTPra04AtIaAkDgZ17gphQ85c4IgiDLJK2fXn8+F1sQ==",
+      "requires": {
+        "toposort": "^2.0.2"
+      }
+    },
     "@babel/code-frame": {
       "version": "7.5.5",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
@@ -1802,6 +2053,14 @@
       "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz",
       "integrity": "sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ=="
     },
+    "@dagrejs/graphlib": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@dagrejs/graphlib/-/graphlib-2.1.4.tgz",
+      "integrity": "sha512-QCg9sL4uhjn468FDEsb/S9hS2xUZSrv/+dApb1Ze5VKO96pTXKNJZ6MGhIpgWkc1TVhbVGH9/7rq/Mf8/jWicw==",
+      "requires": {
+        "lodash": "^4.11.1"
+      }
+    },
     "@fast-csv/format": {
       "version": "4.3.5",
       "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz",
@@ -2932,6 +3191,11 @@
         "reselect": "*"
       }
     },
+    "@types/resize-observer-browser": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz",
+      "integrity": "sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg=="
+    },
     "@types/shallowequal": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/@types/shallowequal/-/shallowequal-1.1.1.tgz",
@@ -3389,7 +3653,7 @@
     "amdefine": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
-      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
+      "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg=="
     },
     "anser": {
       "version": "1.4.10",
@@ -3724,9 +3988,9 @@
       }
     },
     "are-we-there-yet": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
-      "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
+      "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
       "requires": {
         "delegates": "^1.0.0",
         "readable-stream": "^2.0.6"
@@ -3782,7 +4046,7 @@
     "array-find-index": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
-      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E="
+      "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw=="
     },
     "array-flatten": {
       "version": "2.1.2",
@@ -3905,7 +4169,7 @@
     "async-foreach": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
-      "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI="
+      "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA=="
     },
     "async-limiter": {
       "version": "1.0.1",
@@ -4652,7 +4916,7 @@
     "block-stream": {
       "version": "0.0.9",
       "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
-      "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+      "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==",
       "requires": {
         "inherits": "~2.0.0"
       }
@@ -5115,7 +5379,7 @@
     "camelcase-keys": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
-      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==",
       "requires": {
         "camelcase": "^2.0.0",
         "map-obj": "^1.0.0"
@@ -5124,7 +5388,7 @@
         "camelcase": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
+          "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw=="
         }
       }
     },
@@ -5280,6 +5544,11 @@
         "safe-buffer": "^5.0.1"
       }
     },
+    "clamp": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz",
+      "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA=="
+    },
     "class-utils": {
       "version": "0.3.6",
       "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
@@ -5342,7 +5611,7 @@
     "cliui": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+      "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==",
       "requires": {
         "string-width": "^1.0.1",
         "strip-ansi": "^3.0.1",
@@ -5639,7 +5908,7 @@
     "console-control-strings": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
     },
     "constants-browserify": {
       "version": "1.0.0",
@@ -5822,7 +6091,7 @@
     "cross-spawn": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
-      "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+      "integrity": "sha512-eZ+m1WNhSZutOa/uRblAc9Ut5MQfukFrFMtPSm3bZCA888NmMd5AWXWdgRZ80zd+pTk1P2JrGjg9pUPTvl2PWQ==",
       "requires": {
         "lru-cache": "^4.0.1",
         "which": "^1.2.9"
@@ -6133,7 +6402,7 @@
     "currently-unhandled": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
-      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==",
       "requires": {
         "array-find-index": "^1.0.1"
       }
@@ -6515,7 +6784,7 @@
     "delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
     },
     "denodeify": {
       "version": "1.2.1",
@@ -10034,7 +10303,7 @@
     "gauge": {
       "version": "2.7.4",
       "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
-      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+      "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==",
       "requires": {
         "aproba": "^1.0.3",
         "console-control-strings": "^1.0.0",
@@ -10067,7 +10336,7 @@
     "get-stdin": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
-      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4="
+      "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw=="
     },
     "get-stream": {
       "version": "4.1.0",
@@ -10220,13 +10489,20 @@
       }
     },
     "globule": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
-      "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz",
+      "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==",
       "requires": {
         "glob": "~7.1.1",
-        "lodash": "~4.17.10",
+        "lodash": "^4.17.21",
         "minimatch": "~3.0.2"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "4.17.21",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+          "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+        }
       }
     },
     "graceful-fs": {
@@ -10344,7 +10620,7 @@
     "has-unicode": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
     },
     "has-value": {
       "version": "1.0.0",
@@ -10811,14 +11087,14 @@
       "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
     },
     "in-publish": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
-      "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E="
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz",
+      "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ=="
     },
     "indent-string": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
-      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+      "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==",
       "requires": {
         "repeating": "^2.0.0"
       }
@@ -12248,10 +12524,20 @@
       "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.6.tgz",
       "integrity": "sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ=="
     },
+    "jquery": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
+      "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
+    },
+    "jquery-mousewheel": {
+      "version": "3.1.13",
+      "resolved": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz",
+      "integrity": "sha512-GXhSjfOPyDemM005YCEHvzrEALhKDIswtxSHSR2e4K/suHVJKJxxRCGz3skPjNxjJjQa9AVSGGlYjv1M3VLIPg=="
+    },
     "js-base64": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz",
-      "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw=="
+      "version": "2.6.4",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
+      "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ=="
     },
     "js-cookie": {
       "version": "2.2.1",
@@ -12637,6 +12923,11 @@
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
       "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
     },
+    "lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+    },
     "lodash._getnative": {
       "version": "3.9.1",
       "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
@@ -12962,7 +13253,7 @@
     "loud-rejection": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
-      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+      "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==",
       "requires": {
         "currently-unhandled": "^0.4.1",
         "signal-exit": "^3.0.0"
@@ -13016,6 +13307,19 @@
       "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz",
       "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA=="
     },
+    "mana-common": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/mana-common/-/mana-common-0.3.1.tgz",
+      "integrity": "sha512-nU4h4ES0nPP0/QHCJzd7zTfr0nvJWaQR1H7N3zQc+clEAwRcMNti9i+1NIvLBUarhQZ74+bU95xfqkQpr8jPog=="
+    },
+    "mana-syringe": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/mana-syringe/-/mana-syringe-0.2.2.tgz",
+      "integrity": "sha512-Sv5r0/PrQRq4pW+9lDicGsEPzPLkd1PwjTs5zHUV1I293S3alkBNyuSjktVeBploofH8MAMLd4DS2crwct48wg==",
+      "requires": {
+        "inversify": "^5.0.1"
+      }
+    },
     "map-age-cleaner": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
@@ -13032,7 +13336,7 @@
     "map-obj": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
+      "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg=="
     },
     "map-visit": {
       "version": "1.0.0",
@@ -13123,7 +13427,7 @@
     "meow": {
       "version": "3.7.0",
       "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
-      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+      "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==",
       "requires": {
         "camelcase-keys": "^2.0.0",
         "decamelize": "^1.1.2",
@@ -14189,6 +14493,11 @@
       "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
       "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
     },
+    "mousetrap": {
+      "version": "1.6.5",
+      "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz",
+      "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA=="
+    },
     "move-concurrently": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
@@ -14330,7 +14639,7 @@
         "semver": {
           "version": "5.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
-          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8="
+          "integrity": "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw=="
         }
       }
     },
@@ -14455,12 +14764,12 @@
         "ansi-styles": {
           "version": "2.2.1",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+          "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="
         },
         "chalk": {
           "version": "1.1.3",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
           "requires": {
             "ansi-styles": "^2.2.1",
             "escape-string-regexp": "^1.0.2",
@@ -14472,7 +14781,7 @@
         "supports-color": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+          "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g=="
         }
       }
     },
@@ -14484,7 +14793,7 @@
     "nopt": {
       "version": "3.0.6",
       "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
-      "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+      "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
       "requires": {
         "abbrev": "1"
       }
@@ -14873,7 +15182,7 @@
     "os-locale": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
-      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+      "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==",
       "requires": {
         "lcid": "^1.0.0"
       }
@@ -16936,6 +17245,46 @@
         }
       }
     },
+    "rc-motion": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.6.2.tgz",
+      "integrity": "sha512-4w1FaX3dtV749P8GwfS4fYnFG4Rb9pxvCYPc/b2fw1cmlHJWNNgOFIz7ysiD+eOrzJSvnLJWlNQQncpNMXwwpg==",
+      "requires": {
+        "@babel/runtime": "^7.11.1",
+        "classnames": "^2.2.1",
+        "rc-util": "^5.21.0"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.18.9",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz",
+          "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==",
+          "requires": {
+            "regenerator-runtime": "^0.13.4"
+          }
+        },
+        "rc-util": {
+          "version": "5.23.0",
+          "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.23.0.tgz",
+          "integrity": "sha512-lgm6diJ/pLgyfoZY59Vz7sW4mSoQCgozqbBye9IJ7/mb5w5h4T7h+i2JpXAx/UBQxscBZe68q0sP7EW+qfkKUg==",
+          "requires": {
+            "@babel/runtime": "^7.18.3",
+            "react-is": "^16.12.0",
+            "shallowequal": "^1.1.0"
+          }
+        },
+        "react-is": {
+          "version": "16.13.1",
+          "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+          "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+        },
+        "regenerator-runtime": {
+          "version": "0.13.9",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+          "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+        }
+      }
+    },
     "rc-notification": {
       "version": "3.3.1",
       "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-3.3.1.tgz",
@@ -17969,6 +18318,23 @@
       "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz",
       "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA=="
     },
+    "react-resize-detector": {
+      "version": "6.7.8",
+      "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-6.7.8.tgz",
+      "integrity": "sha512-0FaEcUBAbn+pq3PT5a9hHRebUfuS1SRLGLpIw8LydU7zX429I6XJgKerKAMPsJH0qWAl6o5bVKNqFJqr6tGPYw==",
+      "requires": {
+        "@types/resize-observer-browser": "^0.1.6",
+        "lodash": "^4.17.21",
+        "resize-observer-polyfill": "^1.5.1"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "4.17.21",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+          "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+        }
+      }
+    },
     "react-router": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.0.1.tgz",
@@ -18097,7 +18463,7 @@
     "redent": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
-      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==",
       "requires": {
         "indent-string": "^2.1.0",
         "strip-indent": "^1.0.1"
@@ -18594,9 +18960,9 @@
       }
     },
     "sass-graph": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
-      "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
+      "version": "2.2.6",
+      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.6.tgz",
+      "integrity": "sha512-MKuEYXFSGuRSi8FZ3A7imN1CeVn9Gpw0/SFJKdL1ejXJneI9a5rwlEZrKejhEFAA3O6yr3eIyl/WuvASvlT36g==",
       "requires": {
         "glob": "^7.0.0",
         "lodash": "^4.0.0",
@@ -18691,7 +19057,7 @@
     "scss-tokenizer": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
-      "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
+      "integrity": "sha512-dYE8LhncfBUar6POCxMTm0Ln+erjeczqEvCJib5/7XNkdw1FkUGgwMPY360FY0FgPWQxHWCx29Jl3oejyGLM9Q==",
       "requires": {
         "js-base64": "^2.1.8",
         "source-map": "^0.4.2"
@@ -18700,7 +19066,7 @@
         "source-map": {
           "version": "0.4.4",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
-          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+          "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==",
           "requires": {
             "amdefine": ">=0.0.4"
           }
@@ -19727,7 +20093,7 @@
     "strip-indent": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
-      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+      "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==",
       "requires": {
         "get-stdin": "^4.0.1"
       }
@@ -20168,6 +20534,11 @@
         "commander": "2"
       }
     },
+    "toposort": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
+      "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
+    },
     "tough-cookie": {
       "version": "2.4.3",
       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
@@ -20200,7 +20571,7 @@
     "trim-newlines": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
-      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM="
+      "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw=="
     },
     "trim-right": {
       "version": "1.0.1",
@@ -20806,6 +21177,11 @@
       "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
       "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw="
     },
+    "utility-types": {
+      "version": "3.10.0",
+      "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz",
+      "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg=="
+    },
     "utils-merge": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -21283,14 +21659,14 @@
     "which-module": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
-      "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8="
+      "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ=="
     },
     "wide-align": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
-      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+      "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
       "requires": {
-        "string-width": "^1.0.2 || 2"
+        "string-width": "^1.0.2 || 2 || 3 || 4"
       }
     },
     "wolfy87-eventemitter": {
@@ -21612,9 +21988,9 @@
       "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
     },
     "yargs": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
-      "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz",
+      "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==",
       "requires": {
         "camelcase": "^3.0.0",
         "cliui": "^3.2.0",
@@ -21628,28 +22004,29 @@
         "string-width": "^1.0.2",
         "which-module": "^1.0.0",
         "y18n": "^3.2.1",
-        "yargs-parser": "^5.0.0"
+        "yargs-parser": "^5.0.1"
       },
       "dependencies": {
         "camelcase": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
-          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
+          "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg=="
         }
       }
     },
     "yargs-parser": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
-      "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz",
+      "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==",
       "requires": {
-        "camelcase": "^3.0.0"
+        "camelcase": "^3.0.0",
+        "object.assign": "^4.1.0"
       },
       "dependencies": {
         "camelcase": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
-          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
+          "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg=="
         }
       }
     },
diff --git a/package.json b/package.json
index 6e1cd73..c177abb 100644
--- a/package.json
+++ b/package.json
@@ -8,6 +8,7 @@
     "@antv/g2": "^4.1.34",
     "@antv/g6": "^4.6.4",
     "@antv/util": "^2.0.17",
+    "@antv/xflow": "^1.0.50",
     "@babel/core": "7.5.5",
     "@svgr/webpack": "4.3.2",
     "@typescript-eslint/eslint-plugin": "1.13.0",
diff --git a/public/options.json b/public/options.json
index 6595475..523da64 100644
--- a/public/options.json
+++ b/public/options.json
@@ -1,20 +1,20 @@
 {
-  "appId": "202108312122504607B107A83F55B40C98CCF",
-  "appkey": "20210831212235413F287EC3BF489424496C8",
-  "mainSystemApi": "https://sso.mk9h.cn/cloud/webapi/dostars",
+  "appId": "201912040924165801464FF1788654BC5AC73",
+  "appkey": "20191106103859640976D6E924E464D029CF0",
+  "mainSystemApi": "http://sso.mk9h.cn/cloud/webapi/dostars",
   "systemType": "",
   "externalDatabase": "false",
   "lineColor": "",
   "filter": "false",
-  "defaultApp": "mkindustry",
+  "defaultApp": "mk",
   "defaultLang": "zh-CN",
-  "WXAppID": "wx4d8a34c8d4494872",
+  "WXAppID": "",
   "WXminiAppID": "",
   "debugger": false,
   "licenseKey": "",
   "probation": "",
   "keepPassword": "true",
   "platforms": ["H5", "wechat", "android", "ios", "wxMiniProgram"],
-  "host": "http://demo.mk9h.cn",
-  "service": "erp_new/"
+  "host": "http://qingqiumarket.cn",
+  "service": "MKWMS/"
 }
\ No newline at end of file
diff --git a/src/api/index.js b/src/api/index.js
index 74c1c5b..39c477c 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -29,7 +29,7 @@
 axios.interceptors.request.use((config) => {
   if (config.url.includes('LoginAndRedirect') || config.url.includes('getjsonresult') || config.url.includes('wxNativePay')) {
     config.data = qs.stringify(config.data)
-  } else if (config.url.includes('doupload') || config.url.includes('dopreload')) {
+  } else if (/\/doupload|\/dopreload|\/upload/.test(config.url)) {
     config.headers = { 'Content-Type': 'multipart/form-data' }
   } else if (config.method === 'post' && config.data) {
     config.data = JSON.stringify(config.data)
@@ -810,17 +810,16 @@
       param.LoginUID = sessionStorage.getItem('CloudLoginUID') || param.LoginUID || ''
     }
 
-    // 寰呬紭鍖栵紝澧炲姞鏄惁鏀寔璺ㄥ煙璇锋眰
-    // let url = '/webapi/dostars'
-    // if (param.rduri) {
-    //   url = param.rduri
-    //   delete param.rduri
-    // }
+    let url = '/webapi/dostars'
+    if (param.rduri && /\/dostars/.test(param.rduri)) {
+      url = param.rduri
+      delete param.rduri
+    }
 
     param = this.encryptParam(param)
 
     return axios({
-      url: `/webapi/dostars${param.func ? '/' + param.func : ''}`,
+      url: `${url}${param.func ? '/' + param.func : ''}`,
       method: 'post',
       data: param
     })
@@ -929,6 +928,33 @@
   }
 
   /**
+   * @description oss鏂囦欢涓婁紶
+   */
+  fileOssUpload (param) {
+    let _url = window.GLOB.location + '/file/oss/upload'
+    if (process.env.NODE_ENV === 'production') {
+      _url = document.location.origin + '/file/oss/upload'
+    }
+    if (/^http:\/\/(qingqiumarket.cn|cloud.mk9h.cn|sso.mk9h.cn)/.test(_url)) {
+      _url = window.GLOB.location + ':8080/file/oss/upload'
+      if (process.env.NODE_ENV === 'production') {
+        _url = document.location.origin + ':8080/file/oss/upload'
+      }
+    } else if (/^https:\/\/(qingqiumarket.cn|cloud.mk9h.cn|sso.mk9h.cn)/.test(_url)) {
+      _url = window.GLOB.location + ':8443/file/oss/upload'
+      if (process.env.NODE_ENV === 'production') {
+        _url = document.location.origin + ':8443/file/oss/upload'
+      }
+    }
+    
+    return axios({
+      url: _url,
+      method: 'post',
+      data: param
+    })
+  }
+
+  /**
    * @description 鑾峰彇寰俊鏀粯浜岀淮鐮�
    */
   getWxNativePay (param) {
diff --git a/src/assets/css/viewstyle.scss b/src/assets/css/viewstyle.scss
index ef70846..33dc189 100644
--- a/src/assets/css/viewstyle.scss
+++ b/src/assets/css/viewstyle.scss
@@ -227,6 +227,34 @@
         }
       }
     }
+    .data-zoom.radio.tabs, .data-zoom.checkbox.tabs {
+      .mk-card {
+        > .card-item-box {
+          border-top: none!important;
+          border-left: none!important;
+          border-right: none!important;
+          border-radius: 0px!important;
+          border-bottom: 2px solid transparent!important;
+          transition: all 0.3s;
+          cursor: pointer;
+        }
+      }
+      .mk-card:hover {
+        > .card-item-box {
+          .ant-mk-text, .ant-mk-date {
+            color: $color6;
+          }
+        }
+      }
+      .mk-card.active, .mk-card.selected {
+        > .card-item-box {
+          border-bottom-color: $color6!important;
+          .ant-mk-text, .ant-mk-date {
+            color: $color6;
+          }
+        }
+      }
+    }
   }
   .normal-group-wrap {
     .print-button:hover, .print-button:focus, .print-button:active {
diff --git a/src/components/header/index.jsx b/src/components/header/index.jsx
index 240973e..afbac7f 100644
--- a/src/components/header/index.jsx
+++ b/src/components/header/index.jsx
@@ -14,7 +14,7 @@
   initMenuPermission,
   logout
 } from '@/store/action'
-import asyncComponent from '@/utils/asyncComponent'
+import asyncComponent from '@/utils/asyncSpinComponent'
 import Api from '@/api'
 import MKEmitter from '@/utils/events.js'
 import options from '@/store/options.js'
@@ -67,6 +67,8 @@
   }
 
   resetPwdSubmit = () => {
+    if (!this.formRef) return
+
     this.formRef.handleConfirm().then(res => {
       this.setState({
         confirmLoading: true
@@ -399,9 +401,12 @@
   }
 
   loginSubmit = () => {
+    if (!this.loginRef) return
+
     this.setState({
       loginLoading: true
     })
+
     this.loginRef.handleConfirm().then(param => {
       Api.getusermsg(param.username, param.password, true).then(res => {
         if (res.status) {
diff --git a/src/components/normalform/modalform/index.jsx b/src/components/normalform/modalform/index.jsx
index 8bc59c5..ce8b71d 100644
--- a/src/components/normalform/modalform/index.jsx
+++ b/src/components/normalform/modalform/index.jsx
@@ -275,16 +275,29 @@
 
       if (!content) return
 
-      fields.push(
-        <Col span={item.span || 12} key={index}>
-          <Form.Item label={label}>
-            {getFieldDecorator(item.field, {
-              initialValue: item.initval,
-              rules: item.rules
-            })(content)}
-          </Form.Item>
-        </Col>
-      )
+      if (item.help) {
+        fields.push(
+          <Col span={item.span || 12} key={index}>
+            <Form.Item label={label} help={<span style={{fontSize: '12px'}}>{item.help}</span>}>
+              {getFieldDecorator(item.field, {
+                initialValue: item.initval,
+                rules: item.rules
+              })(content)}
+            </Form.Item>
+          </Col>
+        )
+      } else {
+        fields.push(
+          <Col span={item.span || 12} key={index}>
+            <Form.Item label={label}>
+              {getFieldDecorator(item.field, {
+                initialValue: item.initval,
+                rules: item.rules
+              })(content)}
+            </Form.Item>
+          </Col>
+        )
+      }
     })
     
     return fields
diff --git a/src/locales/en-US/mob.js b/src/locales/en-US/mob.js
index a284d0c..c5f7804 100644
--- a/src/locales/en-US/mob.js
+++ b/src/locales/en-US/mob.js
@@ -20,7 +20,6 @@
   'mob.component': '缁勪欢',
   'mob.status.open': '鍚敤',
   'mob.status.change': '鍒囨崲',
-  'mob.basemsg': '鍩烘湰淇℃伅',
   'mob.query.delete': '纭畾鍒犻櫎鍚楋紵',
   'mob.logout.hint': '鎮ㄧ‘瀹氳閫�鍑哄悧?',
   'mob.required.input': '璇疯緭鍏�',
diff --git a/src/locales/en-US/model.js b/src/locales/en-US/model.js
index 14aaded..644baf0 100644
--- a/src/locales/en-US/model.js
+++ b/src/locales/en-US/model.js
@@ -148,7 +148,6 @@
   'model.form.color': 'Color',
   'model.query.delete': '纭畾鍒犻櫎鍚�?',
   'header.form.status.change': '鐘舵�佸垏鎹�',
-  'model.status.open': '鍚敤',
   'model.form.funcbutton': 'Function button',
   'model.form.execMode': 'Mode',
   'header.form.paste': '绮樿创',
diff --git a/src/locales/zh-CN/mob.js b/src/locales/zh-CN/mob.js
index b7f44ec..107ba2c 100644
--- a/src/locales/zh-CN/mob.js
+++ b/src/locales/zh-CN/mob.js
@@ -20,7 +20,6 @@
   'mob.component': '缁勪欢',
   'mob.status.open': '鍚敤',
   'mob.status.change': '鍒囨崲',
-  'mob.basemsg': '鍩烘湰淇℃伅',
   'mob.query.delete': '纭畾鍒犻櫎鍚楋紵',
   'mob.logout.hint': '鎮ㄧ‘瀹氳閫�鍑哄悧?',
   'mob.required.input': '璇疯緭鍏�',
diff --git a/src/locales/zh-CN/model.js b/src/locales/zh-CN/model.js
index bdb362a..518e6de 100644
--- a/src/locales/zh-CN/model.js
+++ b/src/locales/zh-CN/model.js
@@ -148,7 +148,6 @@
   'model.form.color': '棰滆壊',
   'model.query.delete': '纭畾鍒犻櫎鍚�?',
   'header.form.status.change': '鐘舵�佸垏鎹�',
-  'model.status.open': '鍚敤',
   'model.form.funcbutton': '鍔熻兘鎸夐挳',
   'model.form.execMode': '鎵ц鏂瑰紡',
   'header.form.paste': '绮樿创',
diff --git a/src/menu/bgcontroller/index.jsx b/src/menu/bgcontroller/index.jsx
deleted file mode 100644
index ba87f28..0000000
--- a/src/menu/bgcontroller/index.jsx
+++ /dev/null
@@ -1,176 +0,0 @@
-import React, {Component} from 'react'
-import PropTypes from 'prop-types'
-import { is, fromJS } from 'immutable'
-import { Form, Select, Input } from 'antd'
-
-import asyncComponent from '@/utils/asyncComponent'
-import './index.scss'
-
-const ColorSketch = asyncComponent(() => import('@/mob/colorsketch'))
-const SourceComponent = asyncComponent(() => import('@/menu/components/share/sourcecomponent'))
-const { Option } = Select
-
-class MobController extends Component {
-  static propTpyes = {
-    config: PropTypes.any,
-    updateConfig: PropTypes.func,
-  }
-
-  state = {
-    background: '',
-    backgroundColor: '',
-    backgroundImage: '',
-    backgroundSize: '',
-    backgroundRepeat: '',
-  }
-
-  UNSAFE_componentWillMount () {
-    const { config } = this.props
-
-    let bgImg = config.style.backgroundImage || ''
-
-    if (bgImg && /^url/.test(bgImg)) {
-      bgImg = bgImg.replace('url(', '')
-      bgImg = bgImg.replace(')', '')
-    }
-
-    this.setState({
-      background: config.style.background || '',
-      backgroundColor: config.style.backgroundColor,
-      backgroundImage: bgImg,
-      backgroundSize: config.style.backgroundSize || '100%',
-      backgroundRepeat: config.style.backgroundRepeat || 'repeat',
-    })
-  }
-
-  shouldComponentUpdate (nextProps, nextState) {
-    return !is(fromJS(this.state), fromJS(nextState))
-  }
-
-  /**
-   * @description 淇敼鑳屾櫙棰滆壊 锛岄鑹叉帶浠�
-   */
-  changeBackgroundColor = (val) => {
-    let config = fromJS(this.props.config).toJS()
-
-    this.setState({
-      backgroundColor: val
-    })
-
-    config.style.backgroundColor = val
-    this.props.updateConfig(config)
-  }
-
-  imgChange = (val) => {
-    this.setState({
-      backgroundImage: val
-    })
-
-    let config = fromJS(this.props.config).toJS()
-
-    if (val) {
-      config.style.backgroundImage = `url(${val})`
-    } else {
-      delete config.style.backgroundImage
-    }
-    this.props.updateConfig(config)
-  }
-
-  backgroundSizeChange = (val) => {
-    this.setState({
-      backgroundSize: val
-    })
-
-    let config = fromJS(this.props.config).toJS()
-    config.style.backgroundSize = val
-
-    this.props.updateConfig(config)
-  }
-
-  backgroundRepeatChange = (val) => {
-    this.setState({
-      backgroundRepeat: val
-    })
-
-    let config = fromJS(this.props.config).toJS()
-    config.style.backgroundRepeat = val
-
-    this.props.updateConfig(config)
-  }
-
-  changeBackground = (val) => {
-    this.setState({
-      background: val,
-    })
-
-    if (!val || /(^linear-gradient|^radial-gradient)\(.*\)$/.test(val)) {
-      let config = fromJS(this.props.config).toJS()
-      config.style.background = val
-
-      delete config.style.backgroundColor
-      delete config.style.backgroundImage
-
-      if (!val) {
-        delete config.style.background
-      }
-
-      this.setState({
-        backgroundImage: '',
-        backgroundColor: ''
-      })
-
-      this.props.updateConfig(config)
-    }
-  }
-
-  render () {
-    const { backgroundColor, backgroundImage, backgroundSize, backgroundRepeat, background } = this.state
-    const formItemLayout = {
-      labelCol: {
-        xs: { span: 24 },
-        sm: { span: 4 }
-      },
-      wrapperCol: {
-        xs: { span: 24 },
-        sm: { span: 20 }
-      }
-    }
-
-    return (
-      <div className="menu-background-controller">
-        <Form {...formItemLayout}>
-          <Form.Item className="color-control" colon={false} label="棰滆壊">
-            <ColorSketch value={backgroundColor} onChange={this.changeBackgroundColor} />
-          </Form.Item>
-          {window.develop === true ? <Form.Item colon={false} label="棰滆壊">
-            <Input value={background} onChange={(e) => this.changeBackground(e.target.value)} />
-          </Form.Item> : null}
-          <Form.Item colon={false} label="鍥剧墖">
-            <SourceComponent value={backgroundImage} type="" placement="right" onChange={this.imgChange}/>
-          </Form.Item>
-          <Form.Item colon={false} label="姣斾緥">
-            <Select defaultValue={backgroundSize} onChange={this.backgroundSizeChange}>
-              <Option value="100%">100%</Option>
-              <Option value="100% 100%">100% 100%</Option>
-              <Option value="auto 100%">auto 100%</Option>
-              <Option value="100% auto">100% auto</Option>
-              <Option value="auto">auto</Option>
-              <Option value="contain">contain</Option>
-              <Option value="cover">cover</Option>
-            </Select>
-          </Form.Item>
-          <Form.Item colon={false} label="閲嶅">
-            <Select defaultValue={backgroundRepeat} onChange={this.backgroundRepeatChange}>
-              <Option value="repeat">repeat</Option>
-              <Option value="no-repeat">no-repeat</Option>
-              <Option value="repeat-x">repeat-x</Option>
-              <Option value="repeat-y">repeat-y</Option>
-            </Select>
-          </Form.Item>
-        </Form>
-      </div>
-    )
-  }
-}
-
-export default MobController
\ No newline at end of file
diff --git a/src/menu/bgcontroller/index.scss b/src/menu/bgcontroller/index.scss
deleted file mode 100644
index 0d6ed73..0000000
--- a/src/menu/bgcontroller/index.scss
+++ /dev/null
@@ -1,43 +0,0 @@
-.menu-background-controller {
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  .color-control .ant-form-item-control {
-    padding-top: 10px;
-    line-height: 35px;
-  }
-  .mk-source-wrap {
-    height: 32px;
-    .mk-source-item-info {
-      top: 5px;
-    }
-  }
-}
-
-.margin-popover {
-  padding-top: 0px;
-  .ant-popover-inner-content {
-    width: 90px;
-    padding: 0px 5px;
-    .ant-menu-root.ant-menu-vertical {
-      border: 0;
-      .ant-menu-item {
-        height: 30px;
-        cursor: pointer;
-        line-height: 30px;
-      }
-      .ant-menu-item:not(:last-child) {
-        margin-bottom: 0px;
-      }
-      .ant-menu-item:first-child {
-        margin-top: 10px;
-      }
-      .ant-menu-item:last-child {
-        margin-bottom: 10px;
-      }
-    }
-  }
-  .ant-popover-arrow {
-    display: none;
-  }
-}
\ No newline at end of file
diff --git a/src/menu/components/card/balcony/index.jsx b/src/menu/components/card/balcony/index.jsx
index 6314c83..d5d1458 100644
--- a/src/menu/components/card/balcony/index.jsx
+++ b/src/menu/components/card/balcony/index.jsx
@@ -139,18 +139,20 @@
         }
       })
     } else {
+      let supModule = card.wrap.linkType === 'static' ? '' : 'has'
+
+      let columns = card.columns.map(c => c.field)
+      let lowcols = card.columns.map(c => c.field.toLowerCase())
+
       if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
         card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
       } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
         card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
       } else if (!card.setting.primaryKey) {
         card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+      } else if (!columns.includes(card.setting.primaryKey)) {
+        card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
       }
-
-      let supModule = card.wrap.linkType === 'static' ? '' : 'has'
-
-      let columns = card.columns.map(c => c.field)
-      let lowcols = card.columns.map(c => c.field.toLowerCase())
 
       card.elements.forEach(cell => {
         if (cell.eleType === 'button') {
diff --git a/src/menu/components/card/cardcellcomponent/index.jsx b/src/menu/components/card/cardcellcomponent/index.jsx
index 380ef62..cd73458 100644
--- a/src/menu/components/card/cardcellcomponent/index.jsx
+++ b/src/menu/components/card/cardcellcomponent/index.jsx
@@ -731,7 +731,7 @@
           <Modal
             title="鎸夐挳路缂栬緫"
             visible={actvisible}
-            width={850}
+            width={920}
             maskClosable={false}
             onCancel={this.editModalCancel}
             footer={[
diff --git a/src/menu/components/card/data-card/index.jsx b/src/menu/components/card/data-card/index.jsx
index 67eea0f..bcdde15 100644
--- a/src/menu/components/card/data-card/index.jsx
+++ b/src/menu/components/card/data-card/index.jsx
@@ -197,6 +197,8 @@
     }
 
     card.errors = []
+    let columns = card.columns.map(c => c.field)
+    let lowcols = card.columns.map(c => c.field.toLowerCase())
 
     if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
       card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
@@ -204,6 +206,8 @@
       card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
     } else if (!card.setting.primaryKey) {
       card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+    } else if (!columns.includes(card.setting.primaryKey)) {
+      card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
     } else if (card.wrap.supType !== 'multi' && !card.setting.supModule) {
       card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
     }
@@ -220,9 +224,6 @@
       }
     }
 
-    let columns = card.columns.map(c => c.field)
-    let lowcols = card.columns.map(c => c.field.toLowerCase())
-
     card.action.forEach(cell => {
       if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
         if (!cell.modal || cell.modal.fields.length === 0) {
@@ -237,6 +238,16 @@
           })
         }
       }
+      // $check@鏈夋晥鎬ф娴�
+      // if (['prompt', 'exec', 'pop'].includes(cell.OpenType) && cell.Ot === 'required' && cell.verify && cell.verify.scripts && cell.verify.scripts.length > 0) {
+      //   cell.verify.scripts.some(s => {
+      //     if (s.status !== 'false' && /\$check@|@check\$/ig.test(s.sql)) {
+      //       card.errors.push({ level: 1, detail: `鍙�夋嫨澶氳鐨勬寜閽��${cell.label}鈥濅腑 $check@ 鎴� @check$ 灏嗕笉浼氱敓鏁堬紒`})
+      //       return true
+      //     }
+      //     return false
+      //   })
+      // }
     })
 
     card.subcards.forEach((item, i) => {
@@ -573,7 +584,9 @@
   }
 
   updateWrap = (res) => {
-    let _card = {...this.state.card, wrap: res}
+    const { card } = this.state
+
+    let _card = {...card, wrap: res}
 
     if (res.supNodes) {
       _card.supNodes = res.supNodes
@@ -587,11 +600,31 @@
       delete _card.supNodes
     }
 
+    
     if (res.layout === 'flex') {
       _card.wrap.pagestyle = 'page'
     }
+    
+    if (res.selStyle === 'tabs' && card.wrap.selStyle !== 'tabs') {
+      Object.keys(_card.style).forEach(key => {
+        if (/^border/.test(key)) {
+          delete _card.style[key]
+        }
+      })
+      _card.style.borderBottomColor = '#eeeeee'
+      _card.style.borderBottomWidth = '1px'
+      _card.style.paddingBottom = '0px'
 
-    this.updateComponent(_card)
+      _card.subcards.forEach(item => {
+        delete item.style.marginBottom
+      })
+      
+      this.setState({card: {..._card, subcards: []}}, () => {
+        this.updateComponent(_card)
+      })
+    } else {
+      this.updateComponent(_card)
+    }
   }
 
   pasteComponent = (res, resolve) => {
@@ -760,7 +793,7 @@
           <ToolOutlined />
         </Popover>
         <ActionComponent config={card} type="datacard" setSubConfig={this.setSubConfig} updateaction={this.updateComponent}/>
-        <div className={'float-' + (card.wrap.cardFloat || 'left')}>
+        <div className={'float-' + (card.wrap.cardFloat || 'left') + ' select-' + card.wrap.selStyle}>
           {card.subcards.map((subcard, index) => (<CardComponent key={subcard.uuid} cards={card} card={subcard} move={this.move} updateElement={this.updateCard} deleteElement={this.deleteCard}/>))}
         </div>
         <div style={{clear: 'both'}}></div>
diff --git a/src/menu/components/card/data-card/index.scss b/src/menu/components/card/data-card/index.scss
index bf029bb..ed54cb3 100644
--- a/src/menu/components/card/data-card/index.scss
+++ b/src/menu/components/card/data-card/index.scss
@@ -109,6 +109,15 @@
       vertical-align: top;
     }
   }
+  .select-tabs {
+    .card-item {
+      border-top: none!important;
+      border-left: none!important;
+      border-right: none!important;
+      border-radius: 0px!important;
+      border-bottom: 2px solid transparent!important;
+    }
+  }
 }
 
 .menu-data-card-edit-box::-webkit-scrollbar {
diff --git a/src/menu/components/card/data-card/options.jsx b/src/menu/components/card/data-card/options.jsx
index 64bbde6..ba3b1f6 100644
--- a/src/menu/components/card/data-card/options.jsx
+++ b/src/menu/components/card/data-card/options.jsx
@@ -188,6 +188,7 @@
         {value: 'active', label: '澶栭槾褰�'},
         {value: 'backFont', label: '鑳屾櫙+鏂囧瓧'},
         {value: 'font', label: '鏂囧瓧'},
+        {value: 'tabs', label: '鏍囩椤�'},
         ...(subtype === 'datacard' && appType === 'mob' ? [{value: 'check', label: '鍕鹃��'}] : [])
       ],
       forbid: subtype === 'tablecard'
diff --git a/src/menu/components/card/prop-card/index.jsx b/src/menu/components/card/prop-card/index.jsx
index 9e382eb..3dc9f8d 100644
--- a/src/menu/components/card/prop-card/index.jsx
+++ b/src/menu/components/card/prop-card/index.jsx
@@ -238,22 +238,24 @@
         }
       })
     } else {
-      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
-        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
-      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
-        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
-      } else if (!card.setting.primaryKey) {
-        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
-      } else if (!card.setting.supModule) {
-        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
-      }
-
       let supModule = card.setting.supModule ? card.setting.supModule[card.setting.supModule.length - 1] || '' : ''
       if (supModule === 'empty') {
         supModule = ''
       }
       let columns = card.columns.map(c => c.field)
       let lowcols = card.columns.map(c => c.field.toLowerCase())
+
+      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
+        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
+      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
+        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
+      } else if (!card.setting.primaryKey) {
+        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+      } else if (!columns.includes(card.setting.primaryKey)) {
+        card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
+      } else if (!card.setting.supModule) {
+        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
+      }
 
       card.subcards.forEach((item, i) => {
         let linkbtn = item.setting.linkbtn || ''
@@ -574,7 +576,9 @@
   }
 
   updateWrap = (res) => {
-    let _card = {...this.state.card, wrap: res}
+    const { card } = this.state
+
+    let _card = {...card, wrap: res}
 
     if (res.datatype === 'static') {
       if (res.supModule && res.supModule.length > 0) {
@@ -587,7 +591,26 @@
       _card.wrap.pagestyle = 'page'
     }
 
-    this.updateComponent(_card)
+    if (res.selStyle === 'tabs' && card.wrap.selStyle !== 'tabs') {
+      Object.keys(_card.style).forEach(key => {
+        if (/^border/.test(key)) {
+          delete _card.style[key]
+        }
+      })
+      _card.style.borderBottomColor = '#eeeeee'
+      _card.style.borderBottomWidth = '1px'
+      _card.style.paddingBottom = '0px'
+
+      _card.subcards.forEach(item => {
+        delete item.style.marginBottom
+      })
+      
+      this.setState({card: {..._card, subcards: []}}, () => {
+        this.updateComponent(_card)
+      })
+    } else {
+      this.updateComponent(_card)
+    }
   }
 
   clickComponent = (e) => {
@@ -624,7 +647,7 @@
         } trigger="hover">
           <ToolOutlined />
         </Popover>
-        <div className={(card.wrap.layout || 'grid') + '-layout float-' + (card.wrap.cardFloat || 'left')}>
+        <div className={(card.wrap.layout || 'grid') + '-layout float-' + (card.wrap.cardFloat || 'left') + ' select-' + card.wrap.selStyle}>
           {card.subcards.map(subcard => (<CardComponent key={subcard.uuid} cards={card} card={subcard} move={this.move} updateElement={this.updateCard} deleteElement={this.deleteCard}/>))}
         </div>
         <div className="component-name">
diff --git a/src/menu/components/card/prop-card/index.scss b/src/menu/components/card/prop-card/index.scss
index f8633d4..92e00e6 100644
--- a/src/menu/components/card/prop-card/index.scss
+++ b/src/menu/components/card/prop-card/index.scss
@@ -97,6 +97,15 @@
       vertical-align: top;
     }
   }
+  .select-tabs {
+    .card-item {
+      border-top: none!important;
+      border-left: none!important;
+      border-right: none!important;
+      border-radius: 0px!important;
+      border-bottom: 2px solid #1890ff!important;
+    }
+  }
 }
 .menu-prop-card-edit-box::after {
   display: block;
diff --git a/src/menu/components/card/table-card/index.jsx b/src/menu/components/card/table-card/index.jsx
index 50f198d..919af41 100644
--- a/src/menu/components/card/table-card/index.jsx
+++ b/src/menu/components/card/table-card/index.jsx
@@ -186,6 +186,13 @@
 
     card.errors = []
 
+    let supModule = card.setting.supModule ? card.setting.supModule[card.setting.supModule.length - 1] || '' : ''
+    if (supModule === 'empty') {
+      supModule = ''
+    }
+    let columns = card.columns.map(c => c.field)
+    let lowcols = card.columns.map(c => c.field.toLowerCase())
+
     if (card.subcards.length === 0) {
       card.errors.push({ level: 0, detail: '鍗$墖涓嶅彲涓虹┖锛�'})
     }
@@ -196,16 +203,11 @@
       card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
     } else if (!card.setting.primaryKey) {
       card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+    } else if (!columns.includes(card.setting.primaryKey)) {
+      card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
     } else if (!card.setting.supModule) {
       card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
     }
-
-    let supModule = card.setting.supModule ? card.setting.supModule[card.setting.supModule.length - 1] || '' : ''
-    if (supModule === 'empty') {
-      supModule = ''
-    }
-    let columns = card.columns.map(c => c.field)
-    let lowcols = card.columns.map(c => c.field.toLowerCase())
 
     card.subcards.forEach((item, i) => {
       let linkbtn = item.setting.linkbtn || ''
diff --git a/src/menu/components/carousel/data-card/index.jsx b/src/menu/components/carousel/data-card/index.jsx
index b9a5cf4..50d3068 100644
--- a/src/menu/components/carousel/data-card/index.jsx
+++ b/src/menu/components/carousel/data-card/index.jsx
@@ -145,16 +145,6 @@
 
     card.errors = []
 
-    if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
-      card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
-    } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
-      card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
-    } else if (!card.setting.primaryKey) {
-      card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
-    } else if (!card.setting.supModule) {
-      card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
-    }
-
     let supModule = card.setting.supModule ? card.setting.supModule[card.setting.supModule.length - 1] || '' : ''
     if (supModule === 'empty') {
       supModule = ''
@@ -163,6 +153,18 @@
     let columns = card.columns.map(c => c.field)
     let lowcols = card.columns.map(c => c.field.toLowerCase())
 
+    if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
+      card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
+    } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
+      card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
+    } else if (!card.setting.primaryKey) {
+      card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+    } else if (!columns.includes(card.setting.primaryKey)) {
+      card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
+    } else if (!card.setting.supModule) {
+      card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
+    }
+
     card.subcards.forEach((item, i) => {
       item.elements.forEach(cell => {
         if (cell.eleType === 'button') {
diff --git a/src/menu/components/carousel/prop-card/index.jsx b/src/menu/components/carousel/prop-card/index.jsx
index 910f5e9..fa64530 100644
--- a/src/menu/components/carousel/prop-card/index.jsx
+++ b/src/menu/components/carousel/prop-card/index.jsx
@@ -188,16 +188,6 @@
         })
       })
     } else {
-      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
-        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
-      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
-        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
-      } else if (!card.setting.primaryKey) {
-        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
-      } else if (!card.setting.supModule) {
-        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
-      }
-
       let supModule = card.setting.supModule ? card.setting.supModule[card.setting.supModule.length - 1] || '' : ''
       if (supModule === 'empty') {
         supModule = ''
@@ -205,6 +195,18 @@
       let columns = card.columns.map(c => c.field)
       let lowcols = card.columns.map(c => c.field.toLowerCase())
 
+      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
+        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
+      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
+        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
+      } else if (!card.setting.primaryKey) {
+        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+      } else if (!columns.includes(card.setting.primaryKey)) {
+        card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
+      } else if (!card.setting.supModule) {
+        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
+      }
+
       card.subcards.forEach((item, i) => {
         item.elements.forEach(cell => {
           if (cell.eleType === 'button') {
diff --git a/src/menu/components/chart/antv-bar/index.jsx b/src/menu/components/chart/antv-bar/index.jsx
index ca919d0..c7f587b 100644
--- a/src/menu/components/chart/antv-bar/index.jsx
+++ b/src/menu/components/chart/antv-bar/index.jsx
@@ -1233,17 +1233,20 @@
     card.btnlog = []
     card.errors = []
 
+    let columns = card.columns.map(c => c.field)
+
     if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
       card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
     } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
       card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
     } else if (!card.setting.primaryKey) {
       card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+    } else if (!columns.includes(card.setting.primaryKey)) {
+      card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
     } else if (!card.setting.supModule) {
       card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
     }
     
-    let columns = card.columns.map(c => c.field)
     if (!card.plot.Xaxis) {
       card.errors.push({ level: 0, detail: '鍧愭爣杞村皻鏈缃紒'})
     } else if (card.plot.datatype === 'query') {
diff --git a/src/menu/components/chart/antv-dashboard/index.jsx b/src/menu/components/chart/antv-dashboard/index.jsx
index 71c92d2..a950a8f 100644
--- a/src/menu/components/chart/antv-dashboard/index.jsx
+++ b/src/menu/components/chart/antv-dashboard/index.jsx
@@ -483,17 +483,20 @@
 
     card.errors = []
 
+    let columns = card.columns.map(c => c.field)
+    
     if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
       card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
     } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
       card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
     } else if (!card.setting.primaryKey) {
       card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+    } else if (!columns.includes(card.setting.primaryKey)) {
+      card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
     } else if (!card.setting.supModule) {
       card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
     }
     
-    let columns = card.columns.map(c => c.field)
     if (!card.plot.valueField) {
       card.errors.push({ level: 0, detail: '鏄剧ず鍊煎皻鏈缃紒'})
     } else if (!columns.includes(card.plot.valueField)) {
diff --git a/src/menu/components/chart/antv-pie/index.jsx b/src/menu/components/chart/antv-pie/index.jsx
index c6fa78b..793dfd6 100644
--- a/src/menu/components/chart/antv-pie/index.jsx
+++ b/src/menu/components/chart/antv-pie/index.jsx
@@ -617,17 +617,20 @@
     card.name = card.plot.name
     card.errors = []
 
+    let columns = card.columns.map(c => c.field)
+
     if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
       card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
     } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
       card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
     } else if (!card.setting.primaryKey) {
       card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+    } else if (!columns.includes(card.setting.primaryKey)) {
+      card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
     } else if (!card.setting.supModule) {
       card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
     }
     
-    let columns = card.columns.map(c => c.field)
     if (!card.plot.Xaxis) {
       card.errors.push({ level: 0, detail: '鍚嶇О瀛楁灏氭湭璁剧疆锛�'})
     } else {
diff --git a/src/menu/components/chart/antv-scatter/index.jsx b/src/menu/components/chart/antv-scatter/index.jsx
index 7b9242f..334f7ca 100644
--- a/src/menu/components/chart/antv-scatter/index.jsx
+++ b/src/menu/components/chart/antv-scatter/index.jsx
@@ -265,17 +265,20 @@
     card.name = card.plot.name
     card.errors = []
 
+    let columns = card.columns.map(c => c.field)
+    
     if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
       card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
     } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
       card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
     } else if (!card.setting.primaryKey) {
       card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+    } else if (!columns.includes(card.setting.primaryKey)) {
+      card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
     } else if (!card.setting.supModule) {
       card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
     }
     
-    let columns = card.columns.map(c => c.field)
     if (!card.plot.Xaxis) {
       card.errors.push({ level: 0, detail: '鍧愭爣杞村皻鏈缃紒'})
     } else {
diff --git a/src/menu/components/chart/chart-custom/index.jsx b/src/menu/components/chart/chart-custom/index.jsx
index 57d124c..d82d9bf 100644
--- a/src/menu/components/chart/chart-custom/index.jsx
+++ b/src/menu/components/chart/chart-custom/index.jsx
@@ -194,12 +194,16 @@
     card.name = card.plot.name
     card.errors = []
 
+    let columns = card.columns.map(c => c.field)
+
     if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
       card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
     } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
       card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
     } else if (!card.setting.primaryKey) {
       card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+    } else if (!columns.includes(card.setting.primaryKey)) {
+      card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
     } else if (!card.setting.supModule) {
       card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
     }
diff --git a/src/menu/components/code/sandbox/index.jsx b/src/menu/components/code/sandbox/index.jsx
index 292bada..3c13f57 100644
--- a/src/menu/components/code/sandbox/index.jsx
+++ b/src/menu/components/code/sandbox/index.jsx
@@ -110,6 +110,8 @@
 
     card.errors = []
 
+    let columns = card.columns.map(c => c.field)
+
     if (card.wrap.datatype !== 'static') {
       if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
         card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
@@ -117,6 +119,8 @@
         card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
       } else if (!card.setting.primaryKey) {
         card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+      } else if (!columns.includes(card.setting.primaryKey)) {
+        card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
       } else if (!card.setting.supModule) {
         card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
       }
diff --git a/src/menu/components/editor/braft-editor/index.jsx b/src/menu/components/editor/braft-editor/index.jsx
index a9300dc..479ad2a 100644
--- a/src/menu/components/editor/braft-editor/index.jsx
+++ b/src/menu/components/editor/braft-editor/index.jsx
@@ -105,6 +105,8 @@
 
     card.errors = []
 
+    let columns = card.columns.map(c => c.field)
+
     if (card.wrap.datatype !== 'static') {
       if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
         card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
@@ -112,6 +114,8 @@
         card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
       } else if (!card.setting.primaryKey) {
         card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+      } else if (!columns.includes(card.setting.primaryKey)) {
+        card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
       } else if (!card.setting.supModule) {
         card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
       }
diff --git a/src/menu/components/form/formaction/actionform/index.jsx b/src/menu/components/form/formaction/actionform/index.jsx
index a49f945..306130a 100644
--- a/src/menu/components/form/formaction/actionform/index.jsx
+++ b/src/menu/components/form/formaction/actionform/index.jsx
@@ -21,7 +21,8 @@
     formlist: null,  // 琛ㄥ崟淇℃伅
     interType: null, // 鎺ュ彛绫诲瀷锛氬唴閮ㄣ�佸閮�
     procMode: null,  // 鍙傛暟鏂瑰紡
-    linkmenu: null
+    linkmenu: null,
+    callbackType: null
   }
 
   
@@ -30,12 +31,14 @@
 
     let _intertype = card.intertype || 'system'  // 鎺ュ彛绫诲瀷
     let _procMode = card.procMode || 'system'    // 鍙傛暟璇锋眰鏂瑰紡
+    let _callbackType = card.callbackType || 'script'
 
-    let _options = this.getOptions(_intertype, _procMode, card.linkmenu)
+    let _options = this.getOptions(_intertype, _procMode, card.linkmenu, _callbackType)
 
     this.setState({
       interType: _intertype,
       procMode: _procMode,
+      callbackType: _callbackType,
       linkmenu: card.linkmenu,
       formlist: this.props.formlist.map(item => {
         if (item.key === 'innerFunc' && _procMode === 'inner') {
@@ -48,7 +51,7 @@
     })
   }
 
-  getOptions = (_intertype, _procMode, linkmenu) => {
+  getOptions = (_intertype, _procMode, linkmenu, _callbackType) => {
     const { card } = this.props
 
     if (card.type === 'prev') {
@@ -60,14 +63,30 @@
     
     if (_intertype === 'custom') {
       _options.pop()
-      _options.push('procMode', 'interface', 'callbackType', 'cbTable', 'proInterface', 'method', 'cross')
+      _options.push('procMode', 'interface', 'callbackType', 'proInterface', 'method', 'cross')
       if (_procMode === 'system') {
         _options.push('sql', 'sqlType')
       } else {
         _options.push('innerFunc')
       }
+      if (_callbackType === 'func') {
+        _options.push('callbackFunc')
+      } else if (_callbackType !== 'none') {
+        _options.push('cbTable')
+      }
     } else if (_intertype === 'outer') {
-      _options.push('innerFunc', 'sysInterface', 'interface', 'proInterface', 'outerFunc', 'callbackFunc')
+      _options.push('procMode', 'sysInterface', 'interface', 'proInterface', 'outerFunc', 'callbackType')
+      if (_procMode === 'system') {
+        _options.push('sql', 'sqlType')
+      } else if (_procMode === 'inner') {
+        _options.push('innerFunc')
+      }
+      if (_callbackType === 'func') {
+        _options.push('callbackFunc')
+      } else if (_callbackType !== 'none') {
+        _options.push('cbTable')
+      }
+
     } else if (_intertype === 'inner') {
       _options.push('innerFunc')
     } else {
@@ -88,10 +107,10 @@
    * 3銆佸垏鎹㈡爣绛剧被鍨嬶紝閲嶇疆鍙�夋爣绛�
    */
   optionChange = (key, value) => {
-    const { procMode, linkmenu } = this.state
+    const { procMode, linkmenu, callbackType } = this.state
 
     if (key === 'intertype') {
-      let _options = this.getOptions(value, procMode, linkmenu)
+      let _options = this.getOptions(value, procMode, linkmenu, callbackType)
 
       this.setState({
         interType: value,
@@ -107,25 +126,38 @@
         })
       })
     } else if (key === 'procMode') {
-      let _options = this.getOptions(this.state.interType, value, linkmenu)
+      let _options = this.getOptions(this.state.interType, value, linkmenu, callbackType)
 
       this.setState({
         procMode: value,
         formlist: this.state.formlist.map(item => {
           item.hidden = !_options.includes(item.key)
 
-          if (item.key === 'innerFunc') {
-            item.required = true
+          if (item.key === 'procMode') {
+            item.initVal = value
           }
           return item
         })
       })
     } else if (key === 'linkmenu') {
-      let _options = this.getOptions(this.state.interType, procMode, value)
+      let _options = this.getOptions(this.state.interType, procMode, value, callbackType)
 
       this.setState({
         linkmenu: value,
         formlist: this.state.formlist.map(item => {
+          item.hidden = !_options.includes(item.key)
+          return item
+        })
+      })
+    } else if (key === 'callbackType') {
+      let _options = this.getOptions(this.state.interType, procMode, linkmenu, value)
+
+      this.setState({
+        callbackType: value,
+        formlist: this.state.formlist.map(item => {
+          if (item.key === 'callbackType') {
+            item.initVal = value
+          }
           item.hidden = !_options.includes(item.key)
           return item
         })
@@ -160,7 +192,7 @@
 
   getFields() {
     const { getFieldDecorator } = this.props.form
-    const { interType } = this.state
+    const { interType, callbackType } = this.state
     const fields = []
 
     this.state.formlist.forEach((item, index) => {
@@ -187,7 +219,7 @@
             message: formRule.func.maxMessage
           }]
         } else if (item.key === 'output') {
-          if (interType === 'system') {
+          if (interType === 'system' || ((interType === 'outer' || interType === 'custom') && callbackType === 'script')) {
             _rules = [{
               pattern: /^@[0-9a-zA-Z_]+@?$/,
               message: '鍙橀噺浠绗﹀紑澶达紝鍙娇鐢ㄥ瓧姣嶃�佹暟瀛椾互鍙奯'
diff --git a/src/menu/components/form/formaction/actionform/index.scss b/src/menu/components/form/formaction/actionform/index.scss
index ca43400..96f3526 100644
--- a/src/menu/components/form/formaction/actionform/index.scss
+++ b/src/menu/components/form/formaction/actionform/index.scss
@@ -4,6 +4,11 @@
     color: #1890ff;
     cursor: pointer;
   }
+  >.ant-row >.ant-col {
+    float: none;
+    display: inline-block;
+    vertical-align: top;
+  }
   .textarea {
     .ant-col-sm-7 {
       width: 14%;
diff --git a/src/menu/components/form/formaction/formconfig.jsx b/src/menu/components/form/formaction/formconfig.jsx
index e406576..7f54c4d 100644
--- a/src/menu/components/form/formaction/formconfig.jsx
+++ b/src/menu/components/form/formaction/formconfig.jsx
@@ -92,6 +92,9 @@
       }, {
         value: 'inner',
         text: '鍐呴儴鍑芥暟'
+      }, {
+        value: 'none',
+        text: '鏃�'
       }]
     },
     {
@@ -126,7 +129,7 @@
       tooltip: functip,
       fields: usefulFields,
       tooltipClass: 'middle',
-      required: card.intertype === 'inner',
+      required: true,
       readonly: false
     },
     {
@@ -224,6 +227,12 @@
       }, {
         value: 'default',
         text: '鍚庡彴鑴氭湰'
+      }, {
+        value: 'func',
+        text: '鍥炶皟鍑芥暟'
+      }, {
+        value: 'none',
+        text: '鏃�'
       }]
     },
     {
@@ -238,7 +247,7 @@
       key: 'callbackFunc',
       label: Formdict['header.form.callbackFunc'],
       initVal: card.callbackFunc || '',
-      required: false,
+      required: true,
       readonly: false
     },
     {
diff --git a/src/menu/components/form/formaction/index.jsx b/src/menu/components/form/formaction/index.jsx
index 5460f4f..2227f2a 100644
--- a/src/menu/components/form/formaction/index.jsx
+++ b/src/menu/components/form/formaction/index.jsx
@@ -237,7 +237,7 @@
         <Modal
           title={dict['model.edit']}
           visible={visible}
-          width={800}
+          width={920}
           maskClosable={false}
           onCancel={this.editModalCancel}
           footer={[
diff --git a/src/menu/components/form/simple-form/index.jsx b/src/menu/components/form/simple-form/index.jsx
index 866a334..00d14c6 100644
--- a/src/menu/components/form/simple-form/index.jsx
+++ b/src/menu/components/form/simple-form/index.jsx
@@ -157,16 +157,6 @@
     card.errors = []
 
     if (card.wrap.datatype !== 'static') {
-      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
-        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
-      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
-        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
-      } else if (!card.setting.primaryKey) {
-        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
-      } else if (!card.setting.supModule) {
-        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
-      }
-
       let supModule = card.setting.supModule ? card.setting.supModule[card.setting.supModule.length - 1] || '' : ''
       if (supModule === 'empty') {
         supModule = ''
@@ -174,6 +164,18 @@
       let columns = card.columns.map(c => c.field)
       let lowcols = card.columns.map(c => c.field.toLowerCase())
 
+      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
+        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
+      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
+        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
+      } else if (!card.setting.primaryKey) {
+        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+      } else if (!columns.includes(card.setting.primaryKey)) {
+        card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
+      } else if (!card.setting.supModule) {
+        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
+      }
+
       card.subcards.forEach(item => {
         item.fields.forEach(m => {
           if (m.type === 'linkMain' && !supModule) {
diff --git a/src/menu/components/form/step-form/index.jsx b/src/menu/components/form/step-form/index.jsx
index 0a05e41..fb8ea12 100644
--- a/src/menu/components/form/step-form/index.jsx
+++ b/src/menu/components/form/step-form/index.jsx
@@ -164,16 +164,6 @@
     card.errors = []
 
     if (card.wrap.datatype !== 'static') {
-      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
-        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
-      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
-        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
-      } else if (!card.setting.primaryKey) {
-        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
-      } else if (!card.setting.supModule) {
-        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
-      }
-
       let supModule = card.setting.supModule ? card.setting.supModule[card.setting.supModule.length - 1] || '' : ''
       if (supModule === 'empty') {
         supModule = ''
@@ -181,6 +171,18 @@
       let columns = card.columns.map(c => c.field)
       let lowcols = card.columns.map(c => c.field.toLowerCase())
 
+      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
+        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
+      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
+        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
+      } else if (!card.setting.primaryKey) {
+        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+      } else if (!columns.includes(card.setting.primaryKey)) {
+        card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
+      } else if (!card.setting.supModule) {
+        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
+      }
+
       card.subcards.forEach(item => {
         item.fields.forEach(m => {
           if (m.type === 'linkMain' && !supModule) {
diff --git a/src/menu/components/form/tab-form/index.jsx b/src/menu/components/form/tab-form/index.jsx
index b8d88ec..2d8f7c6 100644
--- a/src/menu/components/form/tab-form/index.jsx
+++ b/src/menu/components/form/tab-form/index.jsx
@@ -176,16 +176,6 @@
     card.errors = []
 
     if (card.wrap.datatype !== 'static') {
-      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
-        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
-      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
-        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
-      } else if (!card.setting.primaryKey) {
-        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
-      } else if (!card.setting.supModule) {
-        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
-      }
-
       let supModule = card.setting.supModule ? card.setting.supModule[card.setting.supModule.length - 1] || '' : ''
       if (supModule === 'empty') {
         supModule = ''
@@ -193,6 +183,18 @@
       let columns = card.columns.map(c => c.field)
       let lowcols = card.columns.map(c => c.field.toLowerCase())
 
+      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
+        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
+      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
+        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
+      } else if (!card.setting.primaryKey) {
+        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+      } else if (!columns.includes(card.setting.primaryKey)) {
+        card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
+      } else if (!card.setting.supModule) {
+        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
+      }
+
       card.subcards.forEach(item => {
         item.fields.forEach(m => {
           if (m.type === 'linkMain' && !supModule) {
diff --git a/src/menu/components/share/actioncomponent/actionform/index.jsx b/src/menu/components/share/actioncomponent/actionform/index.jsx
index 2cfa4c0..a92b985 100644
--- a/src/menu/components/share/actioncomponent/actionform/index.jsx
+++ b/src/menu/components/share/actioncomponent/actionform/index.jsx
@@ -61,13 +61,13 @@
     }],
     interTypeOptions: [{
       value: 'system',
-      text: this.props.dict['model.interface.system']
+      text: '绯荤粺'
     }, {
       value: 'inner',
-      text: this.props.dict['model.interface.inner']
+      text: '鍐呴儴'
     }, {
       value: 'outer',
-      text: this.props.dict['model.interface.outer']
+      text: '澶栭儴'
     }, {
       value: 'custom',
       text: '鑷畾涔�'
@@ -163,18 +163,33 @@
       reOptions.intertype = this.state.interTypeOptions
 
       if (intertype === 'custom') {
-        shows.push('procMode', 'interface', 'callbackType', 'cbTable', 'proInterface', 'method', 'cross')
+        shows.push('procMode', 'interface', 'callbackType', 'proInterface', 'method', 'cross')
         if (this.record.procMode === 'system') {
           shows.push('sql', 'sqlType')
-        } else {
+        } else if (this.record.procMode === 'inner') {
           reRequired.innerFunc = true
           shows.push('innerFunc')
+        }
+        if (this.record.callbackType === 'func') {
+          shows.push('callbackFunc')
+        } else if (this.record.callbackType !== 'none') {
+          shows.push('cbTable')
         }
         reReadonly.interface = false
         reRequired.interface = true
       } else if (intertype === 'outer') {
-        shows.push('innerFunc', 'sysInterface', 'interface', 'proInterface', 'outerFunc', 'callbackFunc', 'output')
-        reRequired.innerFunc = false
+        shows.push('procMode', 'sysInterface', 'interface', 'proInterface', 'outerFunc', 'callbackType', 'output')
+        if (this.record.procMode === 'system') {
+          shows.push('sql', 'sqlType')
+        } else if (this.record.procMode === 'inner') {
+          reRequired.innerFunc = true
+          shows.push('innerFunc')
+        }
+        if (this.record.callbackType === 'func') {
+          shows.push('callbackFunc')
+        } else if (this.record.callbackType !== 'none') {
+          shows.push('cbTable')
+        }
 
         if (this.record.sysInterface === 'false') {
           reReadonly.interface = false
@@ -226,8 +241,18 @@
       reOptions.intertype = this.state.interTypeOptions.filter(item => item.value !== 'custom')
 
       if (intertype === 'outer') {
-        shows.push('innerFunc', 'sysInterface', 'interface', 'proInterface', 'outerFunc', 'callbackFunc')
-        reRequired.innerFunc = false
+        shows.push('procMode', 'sysInterface', 'interface', 'proInterface', 'outerFunc', 'callbackType')
+        if (this.record.procMode === 'system') {
+          shows.push('sql', 'sqlType')
+        } else if (this.record.procMode === 'inner') {
+          reRequired.innerFunc = true
+          shows.push('innerFunc')
+        }
+        if (this.record.callbackType === 'func') {
+          shows.push('callbackFunc')
+        } else if (this.record.callbackType !== 'none') {
+          shows.push('cbTable')
+        }
 
         if (this.record.sysInterface === 'false') {
           reReadonly.interface = false
@@ -265,6 +290,7 @@
       if (this.record.intertype === 'outer') {
         shows.push('innerFunc', 'sysInterface', 'interface', 'proInterface', 'outerFunc', 'callbackFunc')
         reRequired.innerFunc = false
+        reRequired.callbackFunc = false
 
         if (this.record.sysInterface === 'false') {
           reReadonly.interface = false
@@ -346,6 +372,7 @@
         if (this.record.intertype === 'outer') {
           shows.push('innerFunc', 'sysInterface', 'interface', 'proInterface', 'outerFunc', 'callbackFunc')
           reRequired.innerFunc = false
+          reRequired.callbackFunc = false
 
           if (this.record.sysInterface === 'false') {
             reReadonly.interface = false
@@ -695,7 +722,7 @@
             { max: formRule.func.max, message: formRule.func.maxMessage }
           )
         } else if (item.key === 'output') {
-          if (this.record.intertype === 'system') {
+          if (this.record.intertype === 'system' || ((this.record.intertype === 'outer' || this.record.intertype === 'custom') && this.record.callbackType === 'script')) {
             rules = [{
               pattern: /^@[0-9a-zA-Z_]+@?$/,
               message: '鍙橀噺浠绗﹀紑澶达紝鍙娇鐢ㄥ瓧姣嶃�佹暟瀛椾互鍙奯'
diff --git a/src/menu/components/share/actioncomponent/formconfig.jsx b/src/menu/components/share/actioncomponent/formconfig.jsx
index 6ffb4b4..25baad2 100644
--- a/src/menu/components/share/actioncomponent/formconfig.jsx
+++ b/src/menu/components/share/actioncomponent/formconfig.jsx
@@ -52,15 +52,28 @@
   ]
 
   let getTabs = (list) => {
-    return list.filter(item => {
-      if (item.type !== 'tabs') return false
+    let _list = []
+    list.forEach(item => {
+      if (item.type !== 'tabs') return
 
-      item.children = item.children.map(cell => {
-        cell.children = getTabs(cell.children)
-        return cell
+      _list.push({
+        value: item.uuid,
+        label: item.name,
+        children: item.subtabs.map(cell => {
+          let children = getTabs(cell.components)
+  
+          if (children.length === 0) {
+            children = null
+          }
+          return {
+            value: cell.uuid,
+            label: cell.label,
+            children: children
+          }
+        })
       })
-      return item
     })
+    return _list
   }
 
   // if (type === 'editable') {
@@ -74,8 +87,7 @@
   //     }
   //   ]
   // }
-
-  let tabs = getTabs(JSON.parse(JSON.stringify(modules)))
+  let tabs = getTabs(JSON.parse(JSON.stringify(window.GLOB.customMenu.components)))
 
   let pageTemps = [
     { value: 'billprint', text: '鍗曟嵁鎵撳嵃' },
@@ -189,6 +201,13 @@
       options: opentypes
     },
     {
+      type: 'text',
+      key: 'label',
+      label: '鎸夐挳鍚嶇О',
+      initVal: card.label,
+      required: true,
+    },
+    {
       type: 'select',
       key: 'funcType',
       label: '鍔熻兘绫诲瀷',
@@ -246,13 +265,6 @@
       options: []
     },
     {
-      type: 'text',
-      key: 'label',
-      label: '鎸夐挳鍚嶇О',
-      initVal: card.label,
-      required: true,
-    },
-    {
       type: 'checkbox',
       key: 'payType',
       label: '鏀粯鏂瑰紡',
@@ -278,6 +290,9 @@
       }, {
         value: 'inner',
         text: '鍐呴儴鍑芥暟'
+      }, {
+        value: 'none',
+        text: '鏃�'
       }]
     },
     {
@@ -424,6 +439,12 @@
       }, {
         value: 'default',
         text: '鍚庡彴鑴氭湰'
+      }, {
+        value: 'func',
+        text: '鍥炶皟鍑芥暟'
+      }, {
+        value: 'none',
+        text: '鏃�'
       }]
     },
     {
@@ -438,7 +459,7 @@
       key: 'callbackFunc',
       label: Formdict['header.form.callbackFunc'],
       initVal: card.callbackFunc || '',
-      required: false,
+      required: true
     },
     {
       type: 'select',
diff --git a/src/menu/components/share/actioncomponent/index.jsx b/src/menu/components/share/actioncomponent/index.jsx
index 8d5a172..f7e1175 100644
--- a/src/menu/components/share/actioncomponent/index.jsx
+++ b/src/menu/components/share/actioncomponent/index.jsx
@@ -533,7 +533,7 @@
         <Modal
           title="鎸夐挳路缂栬緫"
           visible={visible}
-          width={850}
+          width={920}
           maskClosable={false}
           onCancel={this.editModalCancel}
           footer={[
diff --git a/src/menu/components/table/edit-table/columns/index.jsx b/src/menu/components/table/edit-table/columns/index.jsx
index 23067de..67057c7 100644
--- a/src/menu/components/table/edit-table/columns/index.jsx
+++ b/src/menu/components/table/edit-table/columns/index.jsx
@@ -18,6 +18,7 @@
 const TableVerify = asyncComponent(() => import('./tableIn'))
 const MarkColumn = asyncIconComponent(() => import('@/menu/components/share/markcomponent'))
 const CardCellComponent = asyncComponent(() => import('@/menu/components/card/cardcellcomponent'))
+const PasteComponent = asyncIconComponent(() => import('@/components/paste'))
 
 class HeaderCol extends Component {
   deleteCol = () => {
@@ -51,7 +52,7 @@
   }
 
   render() {
-    const { connectDragSource, connectDropTarget, moveCol, addElement, updateCol, editColumn, changeStyle, deleteCol, index, column, align, fields, children, ...restProps } = this.props
+    const { connectDragSource, connectDropTarget, moveCol, addElement, updateCol, editColumn, pasteCell, changeStyle, deleteCol, index, column, align, fields, children, ...restProps } = this.props
 
     if (!column) return (
       <th {...restProps} index={index}>
@@ -67,6 +68,7 @@
               <PlusOutlined className="plus" title="娣诲姞" onClick={() => this.props.addElement(column)} /> : null
             }
             <EditOutlined className="edit" title="缂栬緫" onClick={() => this.props.editColumn(column)} />
+            {column.type === 'custom' ? <PasteComponent options={['customCardElement']} updateConfig={(res, resolve) => this.props.pasteCell(column, res, resolve)} /> : null}
             {column.type === 'custom' ? <FontColorsOutlined className="style" title="璋冩暣鏍峰紡" onClick={() => this.props.changeStyle(column)}/> : null}
             <DeleteOutlined className="close" title="鍒犻櫎" onClick={this.deleteCol} />
             {['text', 'number', 'formula'].includes(column.type) ? <MarkColumn columns={fields} marks={column.marks} onSubmit={this.updateMarks} /> : null }
@@ -280,6 +282,16 @@
     this.setState({
       card: fromJS(col).toJS()
     })
+  }
+
+  pasteCell = (col, cell, resolve) => {
+    resolve({status: true})
+    
+    delete cell.copyType
+    cell.uuid = Utils.getuuid()
+    cell.focus = true
+    
+    MKEmitter.emit('cardAddElement', [this.props.config.uuid, col.uuid], cell)
   }
 
   addElement = (col) => {
@@ -554,6 +566,7 @@
           updateCol: this.updateCol,
           addElement: this.addElement,
           editColumn: this.editColumn,
+          pasteCell: this.pasteCell,
           changeStyle: this.changeStyle,
           deleteCol: this.deleteCol,
         }),
diff --git a/src/menu/components/table/edit-table/columns/tableIn/index.jsx b/src/menu/components/table/edit-table/columns/tableIn/index.jsx
index 61698fb..3f1c391 100644
--- a/src/menu/components/table/edit-table/columns/tableIn/index.jsx
+++ b/src/menu/components/table/edit-table/columns/tableIn/index.jsx
@@ -86,7 +86,7 @@
           ) :
           (
             <div>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleTwoTone style={{marginLeft: '5px'}} twoToneColor="#52c41a" />
             </div>
           )
@@ -139,7 +139,7 @@
           ) :
           (
             <div>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleTwoTone style={{marginLeft: '5px'}} twoToneColor="#52c41a" />
             </div>
           )
diff --git a/src/menu/components/table/edit-table/index.jsx b/src/menu/components/table/edit-table/index.jsx
index 8e5ee1d..6b858aa 100644
--- a/src/menu/components/table/edit-table/index.jsx
+++ b/src/menu/components/table/edit-table/index.jsx
@@ -170,16 +170,6 @@
     if (!window.GLOB.styling || !card.errors) { // 鏍峰紡淇敼鏃朵笉鍋氱瓫鏌�
       card.errors = []
   
-      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
-        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
-      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
-        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
-      } else if (!card.setting.primaryKey) {
-        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
-      } else if (!card.setting.supModule) {
-        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
-      }
-  
       let supModule = card.setting.supModule ? card.setting.supModule[card.setting.supModule.length - 1] || '' : ''
       if (supModule === 'empty') {
         supModule = ''
@@ -187,6 +177,18 @@
   
       let columns = card.columns.map(c => c.field)
       let lowcols = card.columns.map(c => c.field.toLowerCase())
+
+      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
+        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
+      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
+        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
+      } else if (!card.setting.primaryKey) {
+        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+      } else if (!columns.includes(card.setting.primaryKey)) {
+        card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
+      } else if (!card.setting.supModule) {
+        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
+      }
   
       card.action.forEach(cell => {
         if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
diff --git a/src/menu/components/table/normal-table/columns/index.jsx b/src/menu/components/table/normal-table/columns/index.jsx
index 8ae474a..d22150a 100644
--- a/src/menu/components/table/normal-table/columns/index.jsx
+++ b/src/menu/components/table/normal-table/columns/index.jsx
@@ -18,6 +18,7 @@
 const MarkColumn = asyncIconComponent(() => import('@/menu/components/share/markcomponent'))
 const CardCellComponent = asyncComponent(() => import('@/menu/components/card/cardcellcomponent'))
 const MobPagination = asyncIconComponent(() => import('@/menu/components/share/mobPagination'))
+const PasteComponent = asyncIconComponent(() => import('@/components/paste'))
 
 class HeaderCol extends Component {
   deleteCol = () => {
@@ -51,7 +52,7 @@
   }
 
   render() {
-    const { connectDragSource, connectDropTarget, moveCol, addElement, updateCol, editColumn, changeStyle, deleteCol, index, column, align, fields, children, ...restProps } = this.props
+    const { connectDragSource, connectDropTarget, moveCol, addElement, updateCol, editColumn, pasteCell, changeStyle, deleteCol, index, column, align, fields, children, ...restProps } = this.props
 
     if (index !== undefined) {
       return connectDragSource(
@@ -62,6 +63,7 @@
                 <PlusOutlined className="plus" title="娣诲姞" onClick={() => this.props.addElement(column)} /> : null
               }
               <EditOutlined className="edit" title="缂栬緫" onClick={() => this.props.editColumn(column)} />
+              {column && column.type === 'custom' ? <PasteComponent options={['customCardElement']} updateConfig={(res, resolve) => this.props.pasteCell(column, res, resolve)} /> : null}
               {column && column.type === 'custom' ? <FontColorsOutlined className="style" title="璋冩暣鏍峰紡" onClick={() => this.props.changeStyle(column)}/> : null}
               <DeleteOutlined className="close" title="鍒犻櫎" onClick={this.deleteCol} />
               {column && ['text', 'number', 'formula'].includes(column.type) ? <MarkColumn columns={fields} marks={column.marks} onSubmit={this.updateMarks} /> : null }
@@ -80,6 +82,7 @@
                 <PlusOutlined className="plus" title="娣诲姞" onClick={() => this.props.addElement(column)} /> : null
               }
               <EditOutlined className="edit" title="缂栬緫" onClick={() => this.props.editColumn(column)} />
+              {column.type === 'custom' ? <PasteComponent options={['customCardElement']} updateConfig={(res, resolve) => this.props.pasteCell(column, res, resolve)} /> : null}
               <DeleteOutlined className="close" title="鍒犻櫎" onClick={this.deleteCol} />
               {column && ['text', 'number', 'formula'].includes(column.type) ? <MarkColumn columns={fields} marks={column.marks} onSubmit={this.updateMarks} /> : null }
             </div>
@@ -303,6 +306,16 @@
     })
   }
 
+  pasteCell = (col, cell, resolve) => {
+    resolve({status: true})
+    
+    delete cell.copyType
+    cell.uuid = Utils.getuuid()
+    cell.focus = true
+    
+    MKEmitter.emit('cardAddElement', [this.props.config.uuid, col.uuid], cell)
+  }
+
   addElement = (col) => {
     const { config } = this.props
     let column = fromJS(col).toJS()
@@ -482,6 +495,7 @@
           updateCol: this.updateCol,
           addElement: this.addElement,
           editColumn: this.editColumn,
+          pasteCell: this.pasteCell,
           changeStyle: this.changeStyle,
           deleteCol: this.deleteCol,
         }),
diff --git a/src/menu/components/table/normal-table/index.jsx b/src/menu/components/table/normal-table/index.jsx
index 27556bd..0ba1305 100644
--- a/src/menu/components/table/normal-table/index.jsx
+++ b/src/menu/components/table/normal-table/index.jsx
@@ -207,17 +207,7 @@
 
     if (!window.GLOB.styling || !card.errors) { // 鏍峰紡淇敼鏃朵笉鍋氱瓫鏌�
       card.errors = []
-  
-      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
-        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
-      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
-        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
-      } else if (!card.setting.primaryKey) {
-        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
-      } else if (!card.setting.supModule) {
-        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
-      }
-  
+
       let supModule = card.setting.supModule ? card.setting.supModule[card.setting.supModule.length - 1] || '' : ''
       if (supModule === 'empty') {
         supModule = ''
@@ -227,6 +217,18 @@
       let columns = card.columns.map(c => c.field)
       let lowcols = card.columns.map(c => c.field.toLowerCase())
   
+      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
+        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
+      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
+        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
+      } else if (!card.setting.primaryKey) {
+        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+      } else if (!columns.includes(card.setting.primaryKey)) {
+        card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
+      } else if (!card.setting.supModule) {
+        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
+      }
+
       card.action.forEach(cell => {
         if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
           if (!cell.modal || cell.modal.fields.length === 0) {
diff --git a/src/menu/components/tabs/antv-tabs/index.jsx b/src/menu/components/tabs/antv-tabs/index.jsx
index a6feb86..fbcfe24 100644
--- a/src/menu/components/tabs/antv-tabs/index.jsx
+++ b/src/menu/components/tabs/antv-tabs/index.jsx
@@ -318,6 +318,7 @@
     editab.hide = res.hide || 'false'
     editab.backgroundColor = res.backgroundColor
     editab.controlVal = res.controlVal || ''
+    editab.selectVal = res.selectVal || ''
     editab.blacklist = res.blacklist
 
     if (editab.uuid) {
diff --git a/src/menu/components/tabs/antv-tabs/options.jsx b/src/menu/components/tabs/antv-tabs/options.jsx
index c0430ab..bc2db9d 100644
--- a/src/menu/components/tabs/antv-tabs/options.jsx
+++ b/src/menu/components/tabs/antv-tabs/options.jsx
@@ -52,9 +52,16 @@
       field: 'controlVal',
       label: '闅愯棌鏍囪',
       initval: tab.controlVal || '',
-      tooltip: '褰撶鐢ㄥ瓧娈靛�间笌闅愯棌鏍囪鐩哥瓑鏃讹紝鏍囩椤典細闅愯棌銆�',
+      tooltip: '褰撶鐢ㄥ瓧娈靛�间笌闅愯棌鏍囪鐩哥瓑鏃讹紝鏍囩椤典細闅愯棌銆傛敞锛氬涓�艰鐢ㄩ�楀彿鍒嗛殧銆�',
       required: false,
-      // forbid: appType === 'mob',
+    },
+    {
+      type: 'text',
+      field: 'selectVal',
+      label: '閫変腑鏍囪',
+      initval: tab.selectVal || '',
+      tooltip: '褰撻�変腑瀛楁鍊间笌閫変腑鏍囪鐩哥瓑鏃讹紝鏍囩椤甸粯璁ら�変腑銆�',
+      required: false
     },
     {
       type: 'color',
@@ -96,6 +103,10 @@
   let roleList = sessionStorage.getItem('sysRoles')
 
   let modules = MenuUtils.getSupModules(window.GLOB.customMenu.components, uuid) || []
+  modules.push({
+    value: 'preview',
+    label: '涓婁竴椤碉紙url鍙傛暟锛�'
+  })
 
   if (roleList) {
     try {
@@ -198,13 +209,13 @@
       label: '涓婄骇缁勪欢',
       initval: setting.supModule || [],
       tooltip: '鏍囩缁勫彲浠ラ�夋嫨涓婄骇缁勪欢锛屽~鍏ョ鐢ㄥ瓧娈碉紝鐢ㄤ簬鎺у埗鏍囩闅愯棌銆�',
+      help: '鐢ㄤ簬鎺у埗鏍囩椤甸殣钘忋��',
       required: false,
       allowClear: true,
       options: modules,
       controlFields: [
         {field: 'controlField', notNull: true},
       ],
-      // forbid: appType === 'mob',
     },
     {
       type: 'text',
@@ -213,7 +224,14 @@
       initval: setting.controlField || '',
       tooltip: '鐢ㄤ簬鎺у埗鏍囩闅愯棌鐨勫瓧娈碉紝鍦ㄦ爣绛句腑濉叆闅愯棌鏍囪銆�',
       required: true,
-      // forbid: appType === 'mob',
+    },
+    {
+      type: 'text',
+      field: 'selectField',
+      label: '閫変腑瀛楁',
+      initval: setting.selectField || '',
+      tooltip: '鐢ㄤ簬鎺у埗鏍囩椤靛垵濮嬪寲閫変腑锛屽湪鏍囩涓~鍏ラ�変腑鏍囪锛屾敞锛氭暟鎹簮浜巙rl鍙傛暟銆�',
+      required: false
     },
     {
       type: 'color',
diff --git a/src/menu/components/timeline/normal-timeline/index.jsx b/src/menu/components/timeline/normal-timeline/index.jsx
index 1dcb7f4..d11aa93 100644
--- a/src/menu/components/timeline/normal-timeline/index.jsx
+++ b/src/menu/components/timeline/normal-timeline/index.jsx
@@ -117,17 +117,7 @@
     card.name = card.wrap.name
     if (!window.GLOB.styling || !card.errors) { // 鏍峰紡淇敼鏃朵笉鍋氱瓫鏌�
       card.errors = []
-  
-      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
-        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
-      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
-        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
-      } else if (!card.setting.primaryKey) {
-        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
-      } else if (!card.setting.supModule) {
-        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
-      }
-  
+
       let supModule = card.setting.supModule ? card.setting.supModule[card.setting.supModule.length - 1] || '' : ''
       if (supModule === 'empty') {
         supModule = ''
@@ -135,6 +125,18 @@
       let columns = card.columns.map(c => c.field)
       let lowcols = card.columns.map(c => c.field.toLowerCase())
   
+      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
+        card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
+      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
+        card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
+      } else if (!card.setting.primaryKey) {
+        card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+      } else if (!columns.includes(card.setting.primaryKey)) {
+        card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
+      } else if (!card.setting.supModule) {
+        card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
+      }
+
       card.subcards.forEach(col => {
         col.elements.forEach(cell => {
           if (cell.eleType === 'button') {
diff --git a/src/menu/components/tree/antd-tree/index.jsx b/src/menu/components/tree/antd-tree/index.jsx
index 50d2364..0619ac9 100644
--- a/src/menu/components/tree/antd-tree/index.jsx
+++ b/src/menu/components/tree/antd-tree/index.jsx
@@ -105,12 +105,16 @@
 
     card.errors = []
 
+    let columns = card.columns.map(c => c.field)
+
     if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
       card.errors.push({ level: 0, detail: '鏈缃暟鎹簮锛�'})
     } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
       card.errors.push({ level: 0, detail: '鏁版嵁婧愪腑鏃犲彲鐢ㄨ剼鏈紒'})
     } else if (!card.setting.primaryKey) {
       card.errors.push({ level: 0, detail: '鏈缃富閿紒'})
+    } else if (!columns.includes(card.setting.primaryKey)) {
+      card.errors.push({ level: 0, detail: '涓婚敭宸插け鏁堬紒'})
     } else if (!card.setting.supModule) {
       card.errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
     }
diff --git a/src/menu/datasource/verifycard/columnform/index.jsx b/src/menu/datasource/verifycard/columnform/index.jsx
index 2606571..c378989 100644
--- a/src/menu/datasource/verifycard/columnform/index.jsx
+++ b/src/menu/datasource/verifycard/columnform/index.jsx
@@ -53,7 +53,7 @@
                     message: dict['form.required.input'] + '鍚嶇О!'
                   }
                 ]
-              })(<Input placeholder="" autoComplete="off" />)}
+              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleConfirm}/>)}
             </Form.Item>
           </Col>
           <Col span={6}>
@@ -70,7 +70,7 @@
                     message: '瀛楁鍚嶅彧鍏佽鍖呭惈鏁板瓧銆佸瓧姣嶃�佹眽瀛椾互鍙奯'
                   }
                 ]
-              })(<Input placeholder="" autoComplete="off" />)}
+              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleConfirm} />)}
             </Form.Item>
           </Col>
           <Col span={6}>
diff --git a/src/menu/datasource/verifycard/index.jsx b/src/menu/datasource/verifycard/index.jsx
index 26d4e9d..e692605 100644
--- a/src/menu/datasource/verifycard/index.jsx
+++ b/src/menu/datasource/verifycard/index.jsx
@@ -133,7 +133,7 @@
           ) :
           (
             <div style={{color: '#26C281'}}>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
diff --git a/src/menu/menushell/index.scss b/src/menu/menushell/index.scss
index 21f8a7d..ac770fb 100644
--- a/src/menu/menushell/index.scss
+++ b/src/menu/menushell/index.scss
@@ -1,6 +1,7 @@
 .menu-shell-inner {
   min-height: calc(100vh - 100px);
-  width: 100%;
+  width: auto!important;
+  overflow-x: hidden;
   background-size: 100%;
 
   .anticon {
diff --git a/src/menu/padcontroller/index.jsx b/src/menu/padcontroller/index.jsx
deleted file mode 100644
index 3ade9f2..0000000
--- a/src/menu/padcontroller/index.jsx
+++ /dev/null
@@ -1,95 +0,0 @@
-import React, {Component} from 'react'
-import PropTypes from 'prop-types'
-import { is, fromJS } from 'immutable'
-import { Form, Col } from 'antd'
-import { ArrowUpOutlined, ArrowDownOutlined, ArrowLeftOutlined, ArrowRightOutlined } from '@ant-design/icons'
-
-import StyleInput from '../stylecontroller/styleInput'
-import './index.scss'
-
-class MobController extends Component {
-  static propTpyes = {
-    config: PropTypes.any,
-    updateConfig: PropTypes.func,
-  }
-
-  state = {
-    paddingTop: '',
-    paddingBottom: '',
-    paddingLeft: '',
-    paddingRight: ''
-  }
-
-  UNSAFE_componentWillMount () {
-
-  }
-
-  shouldComponentUpdate (nextProps, nextState) {
-    return !is(fromJS(this.state), fromJS(nextState))
-  }
-
-  /**
-   * @description 淇敼鑳屾櫙棰滆壊 锛岄鑹叉帶浠�
-   */
-  changePadding = (val, type) => {
-    let config = fromJS(this.props.config).toJS()
-
-    config.style[type] = val
-    this.props.updateConfig(config)
-  }
-
-  render () {
-    const { config } = this.props
-    const formItemLayout = {
-      labelCol: {
-        xs: { span: 24 },
-        sm: { span: 4 }
-      },
-      wrapperCol: {
-        xs: { span: 24 },
-        sm: { span: 20 }
-      }
-    }
-
-    return (
-      <div className="menu-padding-controller">
-        <Form {...formItemLayout}>
-          <Col span={24}>
-            <Form.Item
-              colon={false}
-              label={<ArrowUpOutlined title="涓婅竟璺�"/>}
-            >
-              <StyleInput defaultValue={config.style.paddingTop || '0px'} options={['px', 'vh', 'vw']} onChange={(val) => this.changePadding(val, 'paddingTop')}/>
-            </Form.Item>
-          </Col>
-          <Col span={24}>
-            <Form.Item
-              colon={false}
-              label={<ArrowDownOutlined title="涓嬭竟璺�"/>}
-            >
-              <StyleInput defaultValue={config.style.paddingBottom || '0px'} options={['px', 'vh', 'vw']} onChange={(val) => this.changePadding(val, 'paddingBottom')}/>
-            </Form.Item>
-          </Col>
-          <Col span={24}>
-            <Form.Item
-              colon={false}
-              label={<ArrowLeftOutlined title="宸﹁竟璺�"/>}
-            >
-              <StyleInput defaultValue={config.style.paddingLeft || '0px'} options={['px', 'vh', 'vw']} onChange={(val) => this.changePadding(val, 'paddingLeft')}/>
-            </Form.Item>
-          </Col>
-          <Col span={24}>
-            <Form.Item
-              colon={false}
-              label={<ArrowRightOutlined title="鍙宠竟璺�"/>}
-            >
-              <StyleInput defaultValue={config.style.paddingRight || '0px'} options={['px', 'vh', 'vw']} onChange={(val) => this.changePadding(val, 'paddingRight')}/>
-            </Form.Item>
-          </Col>
-        </Form>
-      </div>
-    )
-  }
-}
-
-export default MobController
\ No newline at end of file
diff --git a/src/menu/padcontroller/index.scss b/src/menu/padcontroller/index.scss
deleted file mode 100644
index 95c0abe..0000000
--- a/src/menu/padcontroller/index.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-.menu-padding-controller {
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  .ant-form-item label > .anticon {
-    font-size: 16px;
-    vertical-align: middle;
-  }
-}
diff --git a/src/menu/stylecombcontrolbutton/index.scss b/src/menu/stylecombcontrolbutton/index.scss
index 3732704..003e577 100644
--- a/src/menu/stylecombcontrolbutton/index.scss
+++ b/src/menu/stylecombcontrolbutton/index.scss
@@ -17,6 +17,16 @@
     z-index: 12;
     background:rgba(0, 0, 0, 0.2);
   }
+  .pc-poper-view::before {
+    content: ' ';
+    position: absolute;
+    left: 0;
+    top: 0;
+    bottom: 0;
+    right: 0;
+    z-index: 12;
+    background:rgba(0, 0, 0, 0.2);
+  }
   .menu-body .menu-view >.ant-card >.ant-card-body {
     position: relative;
     z-index: 13;
diff --git a/src/menu/sysinterface/index.jsx b/src/menu/sysinterface/index.jsx
index fcd9dcb..e221366 100644
--- a/src/menu/sysinterface/index.jsx
+++ b/src/menu/sysinterface/index.jsx
@@ -199,6 +199,7 @@
           destroyOnClose
         > 
           <Button key="add-interface" className="mk-border-green" onClick={this.addInterface}> 娣诲姞 </Button>
+          {/* <div style={{fontSize: '12px', position: 'relative', top: '20px'}}>娉細鎺ュ彛鎵ц瀹屾垚鍚庯紝浼氳Е鍙戦粯璁や笉鍔犺浇鐨勭粍浠跺埛鏂版暟鎹��</div> */}
           <EditTable key="manage-interface" actions={['move', 'copy']} type="interface" data={interfaces} columns={columns} onChange={this.changeScripts}/>
         </Modal>
         <Modal
diff --git a/src/menu/sysinterface/settingform/simplescript/index.jsx b/src/menu/sysinterface/settingform/simplescript/index.jsx
index 42a4ba4..5392bbd 100644
--- a/src/menu/sysinterface/settingform/simplescript/index.jsx
+++ b/src/menu/sysinterface/settingform/simplescript/index.jsx
@@ -72,7 +72,7 @@
           ) :
           (
             <div>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleTwoTone style={{marginLeft: '5px'}} twoToneColor="#52c41a" />
             </div>
           )
diff --git a/src/mob/components/menubar/normal-menubar/menucomponent/index.jsx b/src/mob/components/menubar/normal-menubar/menucomponent/index.jsx
index 863c894..3c28d9f 100644
--- a/src/mob/components/menubar/normal-menubar/menucomponent/index.jsx
+++ b/src/mob/components/menubar/normal-menubar/menucomponent/index.jsx
@@ -110,7 +110,7 @@
         MenuID: card.setting.type === 'linkmenu' ? card.setting.linkMenuId : card.uuid,
         copyMenuId: card.setting.type === 'menu' ? card.setting.copyMenuId : '',
         clearMenu: card.setting.clearMenu || 'true',
-        MenuNo: card.setting.MenuNo || '',
+        // MenuNo: card.setting.MenuNo || '',
         MenuName: card.setting.name,
       })
     }
diff --git a/src/mob/components/menubar/normal-menubar/menucomponent/options.jsx b/src/mob/components/menubar/normal-menubar/menucomponent/options.jsx
index 3e8bc87..8e189c7 100644
--- a/src/mob/components/menubar/normal-menubar/menucomponent/options.jsx
+++ b/src/mob/components/menubar/normal-menubar/menucomponent/options.jsx
@@ -22,24 +22,13 @@
       initval: setting.name || '',
       required: true
     },
-    {
-      type: 'text',
-      field: 'MenuNo',
-      label: '鑿滃崟鍙傛暟',
-      initval: setting.MenuNo || '',
-      required: true
-    },
-    {
-      type: 'number',
-      field: 'width',
-      label: '瀹藉害',
-      initval: setting.width || 24,
-      tooltip: '鏍呮牸甯冨眬锛屾瘡琛岀瓑鍒嗕负24鍒椼��',
-      min: 1,
-      max: 24,
-      precision: 0,
-      required: true
-    },
+    // {
+    //   type: 'text',
+    //   field: 'MenuNo',
+    //   label: '鑿滃崟鍙傛暟',
+    //   initval: setting.MenuNo || '',
+    //   required: true
+    // },
     {
       type: 'radio',
       field: 'type',
@@ -55,6 +44,7 @@
         {field: 'copyMenuId', values: ['menu']},
         {field: 'linkMenuId', values: ['linkmenu']},
         {field: 'linkurl', values: ['link']},
+        {field: 'primaryId', values: ['menu', 'linkmenu']},
       ]
     },
     {
@@ -132,6 +122,17 @@
     },
     {
       type: 'number',
+      field: 'width',
+      label: '瀹藉害',
+      initval: setting.width || 24,
+      tooltip: '鏍呮牸甯冨眬锛屾瘡琛岀瓑鍒嗕负24鍒椼��',
+      min: 1,
+      max: 24,
+      precision: 0,
+      required: true
+    },
+    {
+      type: 'number',
       field: 'iconFont',
       label: '瀛椾綋澶у皬',
       initval: setting.iconFont || 20,
@@ -198,6 +199,14 @@
       required: false,
       options: columns
     },
+    {
+      type: 'text',
+      field: 'primaryId',
+      label: '闈欐�佷富閿��',
+      initval: setting.primaryId || '',
+      tooltip: '鍙綔涓築ID浼犲埌涓嬩竴椤甸潰銆�',
+      required: false
+    }
   ]
 
   return menuWrapForm
diff --git a/src/mob/components/navbar/normal-navbar/menus/menuform/index.jsx b/src/mob/components/navbar/normal-navbar/menus/menuform/index.jsx
index 2ffce2b..cacce83 100644
--- a/src/mob/components/navbar/normal-navbar/menus/menuform/index.jsx
+++ b/src/mob/components/navbar/normal-navbar/menus/menuform/index.jsx
@@ -106,44 +106,6 @@
             </Form.Item>
           </Col>
           <Col span={12}>
-            <Form.Item label="鑿滃崟鍙傛暟">
-              {getFieldDecorator('MenuNo', {
-                initialValue: menu.MenuNo || '',
-                rules: [
-                  {
-                    required: true,
-                    message: '璇疯緭鍏ヨ彍鍗曞弬鏁�!'
-                  }
-                ]
-              })(<Input placeholder={''} autoComplete="off" onPressEnter={this.handleSubmit} />)}
-            </Form.Item>
-          </Col>
-          <Col span={12}>
-            <Form.Item label="鍥炬爣">
-              {getFieldDecorator('icon', {
-                initialValue: menu.icon || ''
-              })(
-                <MkEditIcon options={['normal', 'data', 'direction', 'edit', 'hint']} allowClear />
-              )}
-            </Form.Item>
-          </Col>
-          <Col span={12}>
-            <Form.Item label={
-              <Tooltip placement="topLeft" title="缁戝畾鎻愮ず瀛楁鍚庯紝浼氬湪鑿滃崟鍙充笂瑙掓樉绀烘彁绀轰俊鎭�傛敞锛氬湪娣诲姞鍥炬爣鏃舵湁鏁堛��">
-                <QuestionCircleOutlined className="mk-form-tip" />
-                鎻愮ず
-              </Tooltip>
-            }>
-              {getFieldDecorator('tip', {
-                initialValue: menu.tip || ''
-              })(
-                <Select allowClear>
-                  {cols.map(item => <Select.Option key={item.uuid} value={item.field}>{item.label}</Select.Option>)}
-                </Select>
-              )}
-            </Form.Item>
-          </Col>
-          <Col span={12}>
             <Form.Item label="鑿滃崟灞炴��">
               {getFieldDecorator('property', {
                 initialValue: menu.property || 'menu'
@@ -156,35 +118,6 @@
               )}
             </Form.Item>
           </Col>
-          <Col span={12}>
-            <Form.Item label="闅愯棌">
-              {getFieldDecorator('hidden', {
-                initialValue: menu.hidden || 'false'
-              })(
-                <Radio.Group>
-                  <Radio value="false">鍚�</Radio>
-                  <Radio value="true">鏄�</Radio>
-                </Radio.Group>
-              )}
-            </Form.Item>
-          </Col>
-          {property === 'menu' || property === 'linkmenu' ? <Col span={12}>
-            <Form.Item label={
-              <Tooltip placement="topLeft" title="鏇挎崲褰撳墠椤甸潰鎴栨墦寮�鏂伴〉闈紝鍦℉5鎴栧皬绋嬪簭涓湁鏁堛��">
-                <QuestionCircleOutlined className="mk-form-tip" />
-                鎵撳紑鏂瑰紡
-              </Tooltip>
-            }>
-              {getFieldDecorator('open', {
-                initialValue: menu.open || 'self'
-              })(
-                <Radio.Group>
-                  <Radio value="self">鏍囩椤�</Radio>
-                  <Radio value="blank">鏂伴〉闈�</Radio>
-                </Radio.Group>
-              )}
-            </Form.Item>
-          </Col> : null}
           {property === 'link' ? <Col span={24}>
             <Form.Item label="閾炬帴鍦板潃" className="textarea">
               {getFieldDecorator('link', {
@@ -261,6 +194,73 @@
               )}
             </Form.Item>
           </Col> : null}
+          {/* <Col span={12}>
+            <Form.Item label="鑿滃崟鍙傛暟">
+              {getFieldDecorator('MenuNo', {
+                initialValue: menu.MenuNo || '',
+                rules: [
+                  {
+                    required: true,
+                    message: '璇疯緭鍏ヨ彍鍗曞弬鏁�!'
+                  }
+                ]
+              })(<Input placeholder={''} autoComplete="off" onPressEnter={this.handleSubmit} />)}
+            </Form.Item>
+          </Col> */}
+          <Col span={12}>
+            <Form.Item label="鍥炬爣">
+              {getFieldDecorator('icon', {
+                initialValue: menu.icon || ''
+              })(
+                <MkEditIcon options={['normal', 'data', 'direction', 'edit', 'hint']} allowClear />
+              )}
+            </Form.Item>
+          </Col>
+          <Col span={12}>
+            <Form.Item label={
+              <Tooltip placement="topLeft" title="缁戝畾鎻愮ず瀛楁鍚庯紝浼氬湪鑿滃崟鍙充笂瑙掓樉绀烘彁绀轰俊鎭�傛敞锛氬湪娣诲姞鍥炬爣鏃舵湁鏁堛��">
+                <QuestionCircleOutlined className="mk-form-tip" />
+                鎻愮ず
+              </Tooltip>
+            }>
+              {getFieldDecorator('tip', {
+                initialValue: menu.tip || ''
+              })(
+                <Select allowClear>
+                  {cols.map(item => <Select.Option key={item.uuid} value={item.field}>{item.label}</Select.Option>)}
+                </Select>
+              )}
+            </Form.Item>
+          </Col>
+          <Col span={12}>
+            <Form.Item label="闅愯棌">
+              {getFieldDecorator('hidden', {
+                initialValue: menu.hidden || 'false'
+              })(
+                <Radio.Group>
+                  <Radio value="false">鍚�</Radio>
+                  <Radio value="true">鏄�</Radio>
+                </Radio.Group>
+              )}
+            </Form.Item>
+          </Col>
+          {property === 'menu' || property === 'linkmenu' ? <Col span={12}>
+            <Form.Item label={
+              <Tooltip placement="topLeft" title="鏇挎崲褰撳墠椤甸潰鎴栨墦寮�鏂伴〉闈紝鍦℉5鎴栧皬绋嬪簭涓湁鏁堛��">
+                <QuestionCircleOutlined className="mk-form-tip" />
+                鎵撳紑鏂瑰紡
+              </Tooltip>
+            }>
+              {getFieldDecorator('open', {
+                initialValue: menu.open || 'self'
+              })(
+                <Radio.Group>
+                  <Radio value="self">鏍囩椤�</Radio>
+                  <Radio value="blank">鏂伴〉闈�</Radio>
+                </Radio.Group>
+              )}
+            </Form.Item>
+          </Col> : null}
           <Col span={12}>
             <Form.Item label={
               <Tooltip placement="topLeft" title="鍦℉5鎴栧皬绋嬪簭涓湁鏁堛��">
diff --git a/src/mob/components/tabs/antv-tabs/index.jsx b/src/mob/components/tabs/antv-tabs/index.jsx
index 108b32a..1ddf66c 100644
--- a/src/mob/components/tabs/antv-tabs/index.jsx
+++ b/src/mob/components/tabs/antv-tabs/index.jsx
@@ -341,6 +341,7 @@
     editab.hide = res.hide || 'false'
     editab.backgroundColor = res.backgroundColor
     editab.controlVal = res.controlVal || ''
+    editab.selectVal = res.selectVal || ''
     editab.blacklist = res.blacklist
 
     if (editab.uuid) {
diff --git a/src/mob/components/tabs/antv-tabs/options.jsx b/src/mob/components/tabs/antv-tabs/options.jsx
index 74643d9..24271c3 100644
--- a/src/mob/components/tabs/antv-tabs/options.jsx
+++ b/src/mob/components/tabs/antv-tabs/options.jsx
@@ -52,7 +52,15 @@
       field: 'controlVal',
       label: '闅愯棌鏍囪',
       initval: tab.controlVal || '',
-      tooltip: '褰撶鐢ㄥ瓧娈靛�间笌闅愯棌鏍囪鐩哥瓑鏃讹紝鏍囩椤典細闅愯棌銆�',
+      tooltip: '褰撶鐢ㄥ瓧娈靛�间笌闅愯棌鏍囪鐩哥瓑鏃讹紝鏍囩椤典細闅愯棌銆傛敞锛氬涓�艰鐢ㄩ�楀彿鍒嗛殧銆�',
+      required: false
+    },
+    {
+      type: 'text',
+      field: 'selectVal',
+      label: '閫変腑鏍囪',
+      initval: tab.selectVal || '',
+      tooltip: '褰撻�変腑瀛楁鍊间笌閫変腑鏍囪鐩哥瓑鏃讹紝鏍囩椤甸粯璁ら�変腑銆�',
       required: false
     },
     {
@@ -92,6 +100,10 @@
  */
 export function getTabsSetForm(setting, uuid) {
   let modules = MenuUtils.getSupModules(window.GLOB.customMenu.components, uuid) || []
+  modules.push({
+    value: 'preview',
+    label: '涓婁竴椤碉紙url鍙傛暟锛�'
+  })
 
   const tabForm = [
     {
@@ -146,6 +158,7 @@
       label: '涓婄骇缁勪欢',
       initval: setting.supModule || [],
       tooltip: '鏍囩缁勫彲浠ラ�夋嫨涓婄骇缁勪欢锛屽~鍏ョ鐢ㄥ瓧娈碉紝鐢ㄤ簬鎺у埗鏍囩闅愯棌銆�',
+      help: '鐢ㄤ簬鎺у埗鏍囩椤甸殣钘忋��',
       required: false,
       allowClear: true,
       options: modules,
@@ -162,6 +175,14 @@
       required: true
     },
     {
+      type: 'text',
+      field: 'selectField',
+      label: '閫変腑瀛楁',
+      initval: setting.selectField || '',
+      tooltip: '鐢ㄤ簬鎺у埗鏍囩椤靛垵濮嬪寲閫変腑锛屽湪鏍囩涓~鍏ラ�変腑鏍囪锛屾敞锛氭暟鎹簮浜巙rl鍙傛暟銆�',
+      required: false
+    },
+    {
       type: 'color',
       field: 'backgroundColor',
       label: '鑳屾櫙(鏍囬鏍�)',
diff --git a/src/pc/bgcontroller/index.jsx b/src/pc/bgcontroller/index.jsx
index 88fdafa..23ee485 100644
--- a/src/pc/bgcontroller/index.jsx
+++ b/src/pc/bgcontroller/index.jsx
@@ -1,7 +1,7 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Form, Select } from 'antd'
+import { Form, Select, Input } from 'antd'
 import { ArrowUpOutlined, ArrowDownOutlined, ArrowLeftOutlined, ArrowRightOutlined } from '@ant-design/icons'
 
 import asyncComponent from '@/utils/asyncComponent'
@@ -19,6 +19,7 @@
   }
 
   state = {
+    background: '',
     backgroundColor: '',
     backgroundImage: '',
     backgroundSize: '',
@@ -38,6 +39,7 @@
     }
 
     this.setState({
+      background: config.style.background || '',
       backgroundColor: config.style.backgroundColor,
       backgroundImage: bgImg,
       backgroundSize: config.style.backgroundSize || '100%',
@@ -123,9 +125,34 @@
     this.props.updateConfig(config)
   }
 
+  changeBackground = (val) => {
+    this.setState({
+      background: val,
+    })
+
+    if (!val || /(^linear-gradient|^radial-gradient)\(.*\)$/.test(val)) {
+      let config = fromJS(this.props.config).toJS()
+      config.style.background = val
+
+      delete config.style.backgroundColor
+      delete config.style.backgroundImage
+
+      if (!val) {
+        delete config.style.background
+      }
+
+      this.setState({
+        backgroundImage: '',
+        backgroundColor: ''
+      })
+
+      this.props.updateConfig(config)
+    }
+  }
+
   render () {
     const { config } = this.props
-    const { backgroundColor, backgroundImage, backgroundSize, backgroundRepeat, backgroundPosition } = this.state
+    const { backgroundColor, backgroundImage, backgroundSize, backgroundRepeat, backgroundPosition, background } = this.state
     const formItemLayout = {
       labelCol: {
         xs: { span: 24 },
@@ -140,16 +167,19 @@
     return (
       <div className="pc-style-controller">
         <Form {...formItemLayout}>
-          <Form.Item
+          {/* <Form.Item
             colon={false}
             label="瀹藉害"
             className="normal-view"
           >
             <StyleInput defaultValue={config.style.width || '100%'} options={['px', '%', 'vw']} onChange={(val) => this.changePadding(val, 'width')}/>
-          </Form.Item>
+          </Form.Item> */}
           <Form.Item className="color-control" colon={false} label="鑳屾櫙鑹�">
             <ColorSketch value={backgroundColor} onChange={this.changeBackgroundColor} />
           </Form.Item>
+          {window.develop === true ? <Form.Item colon={false} label="棰滆壊">
+            <Input value={background} onChange={(e) => this.changeBackground(e.target.value)} />
+          </Form.Item> : null}
           <Form.Item colon={false} label="鑳屾櫙鍥�">
             <SourceComponent value={backgroundImage} type="" placement="right" onChange={this.imgChange}/>
           </Form.Item>
diff --git a/src/pc/components/navbar/normal-navbar/index.jsx b/src/pc/components/navbar/normal-navbar/index.jsx
index 0c8d24e..7a3868e 100644
--- a/src/pc/components/navbar/normal-navbar/index.jsx
+++ b/src/pc/components/navbar/normal-navbar/index.jsx
@@ -141,7 +141,7 @@
       MenuID: menu.property === 'linkmenu' ? menu.linkMenuId : menu.MenuID,
       copyMenuId: menu.property === 'menu' ? menu.copyMenuId : '',
       clearMenu: menu.clearMenu || 'true',
-      MenuNo: menu.MenuNo,
+      // MenuNo: menu.MenuNo,
       MenuName: menu.name,
     })
   }
@@ -153,7 +153,7 @@
       MKEmitter.emit('changeEditMenu', {
         MenuID: card.wrap.linkmenu,
         copyMenuId: '',
-        MenuNo: '',
+        // MenuNo: '',
         MenuName: ''
       })
     }
diff --git a/src/pc/components/navbar/normal-navbar/menusetting/menuform/index.jsx b/src/pc/components/navbar/normal-navbar/menusetting/menuform/index.jsx
index b57fb2b..f8ea138 100644
--- a/src/pc/components/navbar/normal-navbar/menusetting/menuform/index.jsx
+++ b/src/pc/components/navbar/normal-navbar/menusetting/menuform/index.jsx
@@ -102,7 +102,7 @@
               })(<Input placeholder={''} autoComplete="off" onPressEnter={this.handleSubmit} />)}
             </Form.Item>
           </Col>
-          <Col span={22}>
+          {/* <Col span={22}>
             <Form.Item label="鑿滃崟鍙傛暟">
               {getFieldDecorator('MenuNo', {
                 initialValue: menu.MenuNo || '',
@@ -114,7 +114,7 @@
                 ]
               })(<Input placeholder={''} autoComplete="off" onPressEnter={this.handleSubmit} />)}
             </Form.Item>
-          </Col>
+          </Col> */}
           <Col span={22}>
             <Form.Item label="鑿滃崟灞炴��">
               {getFieldDecorator('property', {
@@ -129,41 +129,6 @@
               )}
             </Form.Item>
           </Col>
-          <Col span={22}>
-            <Form.Item label="闅愯棌">
-              {getFieldDecorator('hidden', {
-                initialValue: menu.hidden || 'false'
-              })(
-                <Radio.Group>
-                  <Radio value="false">鍚�</Radio>
-                  <Radio value="true">鏄�</Radio>
-                </Radio.Group>
-              )}
-            </Form.Item>
-          </Col>
-          {property !== 'classify' ? <Col span={22}>
-            <Form.Item label="鎵撳紑鏂瑰紡">
-              {getFieldDecorator('open', {
-                initialValue: menu.open || 'blank'
-              })(
-                <Radio.Group>
-                  <Radio value="blank">鏂扮獥鍙�</Radio>
-                  <Radio value="self">褰撳墠绐楀彛</Radio>
-                </Radio.Group>
-              )}
-            </Form.Item>
-          </Col> : null}
-          {property === 'link' ? <Col span={22}>
-            <Form.Item label="閾炬帴鍦板潃">
-              {getFieldDecorator('link', {
-                initialValue: menu.link || '',
-                rules: [{
-                  required: true,
-                  message: '璇疯緭鍏ラ摼鎺ュ湴鍧�!'
-                }]
-              })(<TextArea rows={2} />)}
-            </Form.Item>
-          </Col> : null}
           {property === 'linkmenu' ? <Col span={22}>
             <Form.Item label={
               <Tooltip placement="topLeft" title="鍏宠仈褰撳墠app涓凡鏈夌殑鑿滃崟銆�">
@@ -217,6 +182,41 @@
               )}
             </Form.Item>
           </Col> : null}
+          <Col span={22}>
+            <Form.Item label="闅愯棌">
+              {getFieldDecorator('hidden', {
+                initialValue: menu.hidden || 'false'
+              })(
+                <Radio.Group>
+                  <Radio value="false">鍚�</Radio>
+                  <Radio value="true">鏄�</Radio>
+                </Radio.Group>
+              )}
+            </Form.Item>
+          </Col>
+          {property !== 'classify' ? <Col span={22}>
+            <Form.Item label="鎵撳紑鏂瑰紡">
+              {getFieldDecorator('open', {
+                initialValue: menu.open || 'blank'
+              })(
+                <Radio.Group>
+                  <Radio value="blank">鏂扮獥鍙�</Radio>
+                  <Radio value="self">褰撳墠绐楀彛</Radio>
+                </Radio.Group>
+              )}
+            </Form.Item>
+          </Col> : null}
+          {property === 'link' ? <Col span={22}>
+            <Form.Item label="閾炬帴鍦板潃">
+              {getFieldDecorator('link', {
+                initialValue: menu.link || '',
+                rules: [{
+                  required: true,
+                  message: '璇疯緭鍏ラ摼鎺ュ湴鍧�!'
+                }]
+              })(<TextArea rows={2} />)}
+            </Form.Item>
+          </Col> : null}
         </Row>
       </Form>
     )
diff --git a/src/pc/components/navbar/normal-navbar/menusetting/menutable/index.jsx b/src/pc/components/navbar/normal-navbar/menusetting/menutable/index.jsx
index 8891018..3ee2c9c 100644
--- a/src/pc/components/navbar/normal-navbar/menusetting/menutable/index.jsx
+++ b/src/pc/components/navbar/normal-navbar/menusetting/menutable/index.jsx
@@ -21,7 +21,7 @@
     editMenu: null,
     columns: [
       { title: '鑿滃崟鍚嶇О', dataIndex: 'name', key: 'name' },
-      { title: '鑿滃崟鍙傛暟', dataIndex: 'MenuNo', key: 'MenuNo' },
+      // { title: '鑿滃崟鍙傛暟', dataIndex: 'MenuNo', key: 'MenuNo' },
       { title: '鑿滃崟灞炴��', dataIndex: 'property', key: 'property',  render: text => {
         const trans = {menu: '鑿滃崟', link: '閾炬帴', linkmenu: '鍏宠仈鑿滃崟', classify: '鍒嗙被'}
 
@@ -203,7 +203,7 @@
     editMenu: null,
     columns: [
       { title: '鑿滃崟鍚嶇О', dataIndex: 'name', key: 'name' },
-      { title: '鑿滃崟鍙傛暟', dataIndex: 'MenuNo', key: 'MenuNo' },
+      // { title: '鑿滃崟鍙傛暟', dataIndex: 'MenuNo', key: 'MenuNo' },
       { title: '鑿滃崟灞炴��', dataIndex: 'property', key: 'property',  render: text => {
         const trans = {menu: '鑿滃崟', link: '閾炬帴', linkmenu: '鍏宠仈鑿滃崟', classify: '鍒嗙被'}
 
@@ -402,7 +402,7 @@
     editMenu: null,
     columns: [
       { title: '鑿滃崟鍚嶇О', dataIndex: 'name', key: 'name' },
-      { title: '鑿滃崟鍙傛暟', dataIndex: 'MenuNo', key: 'MenuNo' },
+      // { title: '鑿滃崟鍙傛暟', dataIndex: 'MenuNo', key: 'MenuNo' },
       { title: '鑿滃崟灞炴��', dataIndex: 'property', key: 'property',  render: text => {
         const trans = {menu: '鑿滃崟', link: '閾炬帴', linkmenu: '鍏宠仈鑿滃崟', classify: '鍒嗙被'}
 
diff --git a/src/pc/menushell/index.scss b/src/pc/menushell/index.scss
index 21f8a7d..752a286 100644
--- a/src/pc/menushell/index.scss
+++ b/src/pc/menushell/index.scss
@@ -1,6 +1,6 @@
 .menu-shell-inner {
   min-height: calc(100vh - 100px);
-  width: 100%;
+  width: auto!important;
   background-size: 100%;
 
   .anticon {
diff --git a/src/router/index.js b/src/router/index.js
index 434fcd4..2f4d669 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -16,6 +16,7 @@
 const AppCheck = asyncLoadComponent(() => import('@/views/appcheck'))
 const PCDesign = asyncLoadComponent(() => import('@/views/pcdesign'))
 const MobDesign = asyncLoadComponent(() => import('@/views/mobdesign'))
+const PopDesign = asyncLoadComponent(() => import('@/views/popdesign'))
 const ImDesign = asyncLoadComponent(() => import('@/views/imdesign'))
 const MenuDesign = asyncLoadComponent(() => import('@/views/menudesign'))
 const BaseDesign = asyncLoadComponent(() => import('@/views/basedesign'))
@@ -39,6 +40,7 @@
   {path: '/imdesign/:param', name: 'imdesign', component: ImDesign, auth: true},
   {path: '/menudesign/:param', name: 'menudesign', component: MenuDesign, auth: true},
   {path: '/basedesign/:param', name: 'basedesign', component: BaseDesign, auth: true},
+  {path: '/popdesign/:param', name: 'popdesign', component: PopDesign, auth: true},
   {path: '/billprint/:param', name: 'billprint', component: BillPrint, auth: true},
   {path: '/docprint/:menuId', name: 'docprint', component: BillPrint, auth: false},
   {path: '/docprint/:menuId/:id', name: 'docprint', component: BillPrint, auth: false},
diff --git a/src/tabviews/calendar/index.jsx b/src/tabviews/calendar/index.jsx
index 76671e6..735d55a 100644
--- a/src/tabviews/calendar/index.jsx
+++ b/src/tabviews/calendar/index.jsx
@@ -40,7 +40,7 @@
     config: {},           // 椤甸潰閰嶇疆淇℃伅锛屽寘鎷寜閽�佹悳绱€�佹樉绀哄垪銆佹爣绛剧瓑
     userConfig: null,     // 鐢ㄦ埛鑷畾涔夎缃�
     searchlist: null,     // 鎼滅储鏉′欢
-    arr_field: '',        // 浣跨敤 sPC_Get_TableData 鏃剁殑鏌ヨ瀛楁闆�
+    arr_field: '',        // 鏌ヨ瀛楁闆�
     setting: null,        // 椤甸潰鍏ㄥ眬璁剧疆锛氭暟鎹簮銆佹寜閽強鏄剧ず鍒楀浐瀹氥�佷富閿瓑
     data: null,           // 鍒楄〃鏁版嵁闆�
     loading: false,       // 鍒楄〃鏁版嵁鍔犺浇涓�
@@ -321,7 +321,7 @@
   }
 
   /**
-   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼ sPC_Get_TableData 鐨勫弬鏁�
+   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼鐨勫弬鏁�
    */
   getDefaultParam = () => {
     const { arr_field, search, setting, config, calendarYear } = this.state
diff --git a/src/tabviews/commontable/index.jsx b/src/tabviews/commontable/index.jsx
index 255c26d..99900ea 100644
--- a/src/tabviews/commontable/index.jsx
+++ b/src/tabviews/commontable/index.jsx
@@ -51,7 +51,7 @@
     searchlist: null,     // 鎼滅储鏉′欢
     actions: null,        // 鎸夐挳闆�
     columns: null,        // 鏄剧ず鍒�
-    arr_field: '',        // 浣跨敤 sPC_Get_TableData 鏃剁殑鏌ヨ瀛楁闆�
+    arr_field: '',        // 鏌ヨ瀛楁闆�
     setting: null,        // 椤甸潰鍏ㄥ眬璁剧疆锛氭暟鎹簮銆佹寜閽強鏄剧ず鍒楀浐瀹氥�佷富閿瓑
     data: [],             // 鍒楄〃鏁版嵁闆�
     selectedData: [],     // 宸查�夎〃鏍兼暟鎹�
@@ -653,14 +653,6 @@
       sql = sql.join('')
       
       param = UtilsDM.getCallBackQueryParams(setting, sql, errSql, BID)
-
-      if (BID) {
-        param.BID = BID
-      }
-
-      if (window.GLOB.mkHS) { // 鍑芥暟 sPC_TableData_InUpDe 浜戠楠岃瘉
-        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
-      }
     } else {
       param.func = 's_ex_result_back'
       param.s_ex_result = lines.map((item, index) => ({
diff --git a/src/tabviews/custom/components/card/prop-card/index.jsx b/src/tabviews/custom/components/card/prop-card/index.jsx
index 03898a1..2c72190 100644
--- a/src/tabviews/custom/components/card/prop-card/index.jsx
+++ b/src/tabviews/custom/components/card/prop-card/index.jsx
@@ -117,7 +117,7 @@
         setTimeout(() => {
           this.loadData()
         }, _config.setting.delay || 0)
-      } else if ((!_sync || _config.wrap.priKeyType === 'static') && selected !== 'false') {
+      } else if (!_sync && selected !== 'false') {
         setTimeout(() => {
           this.checkTopLine()
         }, 200)
@@ -168,7 +168,7 @@
       _data.$$uuid = _data[config.setting.primaryKey] || ''
 
       this.setState({sync: false, data: _data}, () => {
-        if (config.wrap.priKeyType !== 'static' && selected !== 'false') {
+        if (selected !== 'false') {
           setTimeout(() => {
             this.checkTopLine()
           }, 200)
@@ -368,7 +368,7 @@
         data: _data,
         loading: false
       }, () => {
-        if (config.wrap.priKeyType !== 'static' && selected !== 'false') {
+        if (selected !== 'false') {
           this.checkTopLine()
         }
       })
diff --git a/src/tabviews/custom/components/carousel/data-card/index.scss b/src/tabviews/custom/components/carousel/data-card/index.scss
index eabde18..570aed6 100644
--- a/src/tabviews/custom/components/carousel/data-card/index.scss
+++ b/src/tabviews/custom/components/carousel/data-card/index.scss
@@ -10,6 +10,7 @@
     background-position: center center;
     background-repeat: no-repeat;
     background-size: cover;
+    overflow: hidden;
   }
 
   .ant-empty {
diff --git a/src/tabviews/custom/components/carousel/prop-card/index.scss b/src/tabviews/custom/components/carousel/prop-card/index.scss
index 68b6eb3..b397692 100644
--- a/src/tabviews/custom/components/carousel/prop-card/index.scss
+++ b/src/tabviews/custom/components/carousel/prop-card/index.scss
@@ -12,6 +12,7 @@
     background-position: center center;
     background-repeat: no-repeat;
     background-size: cover;
+    overflow: hidden;
   }
 
   .loading-mask {
diff --git a/src/tabviews/custom/components/module/voucher/assistTable/index.jsx b/src/tabviews/custom/components/module/voucher/assistTable/index.jsx
new file mode 100644
index 0000000..9c56276
--- /dev/null
+++ b/src/tabviews/custom/components/module/voucher/assistTable/index.jsx
@@ -0,0 +1,738 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { is, fromJS } from 'immutable'
+import { Table, Modal, Input, InputNumber, notification, message } from 'antd'
+// import { EditOutlined } from '@ant-design/icons'
+
+import Api from '@/api'
+import Utils from '@/utils/utils.js'
+import MKEmitter from '@/utils/events.js'
+import zhCN from '@/locales/zh-CN/main.js'
+import enUS from '@/locales/en-US/main.js'
+import '@/assets/css/table.scss'
+import './index.scss'
+
+class BodyRow extends React.Component {
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.props.data), fromJS(nextProps.data))
+  }
+
+  render() {
+    let { data, ...resProps } = this.props
+    let style = {}
+    let className = ''
+
+    return <tr {...resProps} className={className} style={style}/>
+  }
+}
+
+class BodyCell extends React.Component {
+  state = {
+    editing: false,
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.props.record), fromJS(nextProps.record)) ||
+      nextState.editing !== this.state.editing
+  }
+
+  componentDidMount () {
+    MKEmitter.addListener('tdFocus', this.tdFocus)
+  }
+
+  /**
+   * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊锛屾竻闄ゅ揩鎹烽敭璁剧疆
+   */
+  componentWillUnmount () {
+    this.setState = () => {
+      return
+    }
+    MKEmitter.removeListener('tdFocus', this.tdFocus)
+  }
+
+  tdFocus = (id) => {
+    const { col, record } = this.props
+
+    if (id !== col.uuid + record.uuid) return
+
+    this.focus()
+  }
+
+  enterPress = () => {
+    const { col, record } = this.props
+    const { value } = this.state
+
+    this.setState({editing: false})
+
+    if (value !== record[col.field]) {
+      let line = {...record, [col.field]: value}
+
+      if (col.field === 'debtor') {
+        line.creditor = ''
+      } else {
+        line.debtor = ''
+      }
+
+      MKEmitter.emit('changeRecord', col.tableId, line)
+    }
+
+    setTimeout(() => {
+      if (col.field === 'creditor') {
+        MKEmitter.emit('nextLine', col, record)
+      } else {
+        let cl = {remark: 'subject', subject: 'debtor', debtor: 'creditor'}
+        MKEmitter.emit('tdFocus', cl[col.uuid] + record.uuid)
+      }
+    }, 50)
+  }
+
+  focus = () => {
+    const { col, record } = this.props
+
+    if (record.type === 'total') return
+
+    this.setState({editing: true, value: record[col.field]}, () => {
+      let node = document.getElementById(col.uuid + record.uuid)
+      node && node.select()
+    })
+  }
+
+  onBlur = () => {
+    const { col, record } = this.props
+    const { value } = this.state
+
+    this.setState({editing: false})
+
+    if (value !== record[col.field]) {
+      let line = {...record, [col.field]: value}
+
+      if (col.field === 'debtor') {
+        line.creditor = ''
+      } else {
+        line.debtor = ''
+      }
+
+      MKEmitter.emit('changeRecord', col.tableId, line)
+    }
+  }
+  
+  onChange = (val) => {
+    this.setState({value: val})
+  }
+
+  render() {
+    let { col, record, className } = this.props
+    const { editing } = this.state
+
+    let children = null
+    let colSpan = 1
+
+    if (col.field === 'remark') {
+      let val = record.remark || ''
+
+      if (record.type === 'total') {
+        children = <div className="content-wrap" style={{lineHeight: '60px'}}>鍚堣: {val}</div>
+        colSpan = 2
+      } else {
+        if (editing) {
+          children = <Input.TextArea id={col.uuid + record.uuid} autoSize={false} defaultValue={val} onChange={(e) => this.onChange(e.target.value)} onPressEnter={this.enterPress} onBlur={this.onBlur}/>
+        } else {
+          children = <div className="content-wrap" onClick={this.focus}>{val}</div>
+        }
+      }
+    } else if (col.field === 'subject') {
+      if (record.type === 'total') {
+        colSpan = 0
+      } else {
+        let val = record.subject || ''
+  
+        if (editing) {
+          children = <Input.TextArea id={col.uuid + record.uuid} autoSize={false} defaultValue={val} onChange={(e) => this.onChange(e.target.value)} onPressEnter={this.enterPress} onBlur={this.onBlur}/>
+        } else {
+          children = <div className="content-wrap" onClick={this.focus}>{val}</div>
+        }
+      }
+    } else if (col.field === 'debtor') {
+      let val = record.debtor
+      let down = false
+      let vals = []
+      if (typeof(val) === 'number') {
+        if (val < 0) {
+          down = true
+          val = Math.abs(val)
+        }
+        vals = (val * 100).toFixed(0).split('').reverse()
+      }
+
+      if (editing) {
+        children = <InputNumber id={col.uuid + record.uuid} defaultValue={val} onChange={(val) => this.onChange(val)} onPressEnter={this.enterPress} onBlur={this.onBlur}/>
+      } else {
+        children = <div className={'money-uint' + (down ? ' down' : '')} onClick={this.focus}>
+          <span>{vals[10] || ''}</span> <span>{vals[9] || ''}</span> <span>{vals[8] || ''}</span> <span>{vals[7] || ''}</span> <span>{vals[6] || ''}</span> <span>{vals[5] || ''}</span>
+          <span>{vals[4] || ''}</span> <span>{vals[3] || ''}</span> <span>{vals[2] || ''}</span> <span>{vals[1] || ''}</span> <span className="last">{vals[0] || ''}</span>
+        </div>
+      }
+    } else if (col.field === 'creditor') {
+      let val = record.creditor
+      let down = false
+      let vals = []
+      if (typeof(val) === 'number') {
+        if (val < 0) {
+          down = true
+          val = Math.abs(val)
+        }
+        vals = (val * 100).toFixed(0).split('').reverse()
+      }
+
+      if (editing) {
+        children = <InputNumber id={col.uuid + record.uuid} defaultValue={val} onChange={(val) => this.onChange(val)} onPressEnter={this.enterPress} onBlur={this.onBlur}/>
+      } else {
+        children = <div className={'money-uint' + (down ? ' down' : '')} onClick={this.focus}>
+        <span>{vals[10] || ''}</span> <span>{vals[9] || ''}</span> <span>{vals[8] || ''}</span> <span>{vals[7] || ''}</span> <span>{vals[6] || ''}</span> <span>{vals[5] || ''}</span>
+        <span>{vals[4] || ''}</span> <span>{vals[3] || ''}</span> <span>{vals[2] || ''}</span> <span>{vals[1] || ''}</span> <span className="last">{vals[0] || ''}</span>
+      </div>
+      }
+    }
+
+    if (!colSpan) return null
+
+    return (<td colSpan={colSpan} className={className}>{children}</td>)
+  }
+}
+
+class AssistTable extends Component {
+  static propTpyes = {
+    config: PropTypes.object,        // 鑿滃崟Id
+    BID: PropTypes.any,              // 涓昏〃ID
+    data: PropTypes.any,             // 琛ㄦ牸鏁版嵁
+    total: PropTypes.any,            // 鎬绘暟
+    loading: PropTypes.bool,         // 琛ㄦ牸鍔犺浇涓�
+    refreshdata: PropTypes.func,     // 琛ㄦ牸涓帓搴忓垪銆侀〉鐮佺殑鍙樺寲鏃跺埛鏂�
+  }
+
+  state = {
+    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
+    data: [],
+    edData: [],
+    edColumns: [],
+    tableId: '',          // 琛ㄦ牸ID
+    pageSize: 10,         // 姣忛〉鏁版嵁鏉℃暟
+    columns: null,        // 鏄剧ず鍒�
+    loading: false,
+  }
+
+  UNSAFE_componentWillMount () {
+    const { config } = this.props
+
+    let data = [
+      {remark: '鎻愮幇', subject: '1001 搴撳瓨鐜伴噾', debtor: 124, creditor: ''},
+      {remark: '璐叆鍥哄畾璧勪骇', subject: '1001 搴撳瓨鐜伴噾', debtor: '', creditor: 124},
+      {remark: '杞粨閿�鍞垚鏈�', subject: '1001 搴撳瓨鐜伴噾', debtor: -524, creditor: ''},
+      {remark: '鎻愮幇', subject: '1001 搴撳瓨鐜伴噾', debtor: 34, creditor: ''},
+    ]
+
+    data = this.initData(data)
+    data.push(this.getTotalLine(data))
+
+    let columns = [
+      {
+        title: '鎽樿',
+        dataIndex: 'remark',
+        key: 'remark',
+        width: '22%',
+        onCell: record => ({
+          record,
+          col: {uuid: 'remark', field: 'remark', tableId: config.uuid},
+        })
+      },
+      {
+        title: '浼氳绉戠洰',
+        dataIndex: 'subject',
+        key: 'subject',
+        width: '34%',
+        onCell: record => ({
+          record,
+          col: {uuid: 'subject', field: 'subject', tableId: config.uuid},
+        })
+      },
+      {
+        title: () => (<>
+          <div className="money-title">鍊熸柟閲戦</div>
+          <div className="money-uint">
+            <span>浜�</span> <span>鍗�</span> <span>鐧�</span> <span>鍗�</span> <span>涓�</span> <span>鍗�</span>
+            <span>鐧�</span> <span>鍗�</span> <span>鍏�</span> <span>瑙�</span> <span className="last">鍒�</span>
+          </div>
+        </>),
+        dataIndex: 'debtor',
+        key: 'debtor',
+        width: '22%',
+        onCell: record => ({
+          record,
+          col: {uuid: 'debtor', field: 'debtor', tableId: config.uuid},
+        })
+      },
+      {
+        title: () => (<>
+          <div className="money-title">璐锋柟閲戦</div>
+          <div className="money-uint">
+            <span>浜�</span> <span>鍗�</span> <span>鐧�</span> <span>鍗�</span> <span>涓�</span> <span>鍗�</span>
+            <span>鐧�</span> <span>鍗�</span> <span>鍏�</span> <span>瑙�</span> <span className="last">鍒�</span>
+          </div>
+        </>),
+        dataIndex: 'creditor',
+        key: 'creditor',
+        width: '22%',
+        onCell: record => ({
+          record,
+          col: {uuid: 'creditor', field: 'creditor', tableId: config.uuid},
+        })
+      }
+    ]
+
+    this.setState({
+      data: data,
+      edData: fromJS(data).toJS(),
+      columns,
+      tableId: config.uuid
+    })
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  componentDidMount () {
+    MKEmitter.addListener('nextLine', this.nextLine)
+    MKEmitter.addListener('delRecord', this.delRecord)
+    MKEmitter.addListener('changeRecord', this.changeRecord)
+  }
+
+  /**
+   * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊
+   */
+  componentWillUnmount () {
+    this.setState = () => {
+      return
+    }
+    MKEmitter.removeListener('nextLine', this.nextLine)
+    MKEmitter.removeListener('delRecord', this.delRecord)
+    MKEmitter.removeListener('changeRecord', this.changeRecord)
+  }
+
+  UNSAFE_componentWillReceiveProps(nextProps) {
+    if (!is(fromJS(this.props.data), fromJS(nextProps.data))) {
+      this.setState({data: nextProps.data || []})
+    }
+  }
+
+  initData = (data) => {
+    let _data = data.map((item, i) => {
+      item.uuid = Utils.getuuid()
+      item.index = i
+      
+      return item
+    })
+
+    if (_data.length < 4) {
+      for (let i = _data.length - 1; i < 4; i++) {
+        _data.push({uuid: Utils.getuuid(), index: i + 1, remark: '', subject: '', debtor: '', creditor: ''})
+      }
+    }
+    return _data
+  }
+
+  getTotalLine = (data) => {
+    let totalLine = {uuid: Utils.getuuid(), type: 'total'}
+    let debtor = ''
+    let creditor = ''
+
+    data.forEach(item => {
+      if (typeof(item.debtor) === 'number') {
+        if (debtor === '') {
+          debtor = 0
+        }
+
+        debtor += item.debtor
+      } else if (typeof(item.creditor) === 'number') {
+        if (debtor === '') {
+          debtor = 0
+        }
+        if (creditor === '') {
+          creditor = 0
+        }
+        creditor += item.creditor
+      }
+    })
+
+    totalLine.debtor = debtor
+    totalLine.creditor = creditor
+
+    totalLine.remark = this.changeMoneyToChinese(debtor)
+    
+    return totalLine
+  }
+  
+  changeMoneyToChinese = (money) => {
+    let cnNums = ['闆�', '澹�', '璐�', '鍙�', '鑲�', '浼�', '闄�', '鏌�', '鎹�', '鐜�']
+    let cnIntRadice = ['', '鎷�', '浣�', '浠�']
+    let cnIntUnits = ['', '涓�', '浜�', '鍏�']
+    let cnDecUnits = ['瑙�', '鍒�', '姣�', '鍘�']
+    let cnInteger = '鏁�'
+    let cnIntLast = '鍏�'
+    let maxNum = 999999999999999.9999 // 鏈�澶у鐞嗙殑鏁板瓧
+    let IntegerNum = null
+    let DecimalNum = null
+    let ChineseStr = ''
+    let parts = null // 鍒嗙閲戦鍚庣敤鐨勬暟缁勶紝棰勫畾涔�
+    let Symbol = ''  // 姝h礋鍊兼爣璁�
+
+    if (money === '') return ''
+
+    if (money >= maxNum) return '瓒呭嚭鏈�澶у鐞嗘暟瀛�'
+
+    if (money === 0) {
+      ChineseStr = cnNums[0] + cnIntLast + cnInteger;
+      return ChineseStr
+    }
+    if(money < 0) {
+      money = -money
+      Symbol = '璐�'       
+    }
+    money = money.toString() // 杞崲涓哄瓧绗︿覆
+    if (money.indexOf('.') === -1) {
+      IntegerNum = money
+      DecimalNum = ''
+    } else {
+      parts = money.split('.')
+      IntegerNum = parts[0]
+      DecimalNum = parts[1].substr(0, 4)
+    }
+
+    if (parseInt(IntegerNum, 10) > 0) { // 鑾峰彇鏁村瀷閮ㄥ垎杞崲
+      let zeroCount = 0
+      let IntLen = IntegerNum.length
+      for (let i = 0; i < IntLen; i++) {
+        let n = IntegerNum.substr(i, 1)
+        let p = IntLen - i - 1
+        let q = p / 4
+        let m = p % 4
+        
+        if (n === '0') {
+          zeroCount++
+        } else {
+          if (zeroCount > 0) {
+            ChineseStr += cnNums[0]
+          }
+          zeroCount = 0 // 褰掗浂
+          ChineseStr += cnNums[parseInt(n)] + cnIntRadice[m]
+        }
+
+        if (m === 0 && zeroCount < 4) {
+          ChineseStr += cnIntUnits[q]
+        }
+      }
+      ChineseStr += cnIntLast
+    }
+
+    if (DecimalNum !== '') { // 灏忔暟閮ㄥ垎
+      let decLen = DecimalNum.length
+
+      for (let i = 0; i < decLen; i++) {
+        let n = DecimalNum.substr(i, 1)
+        if (n !== '0') {
+          ChineseStr += cnNums[Number(n)] + cnDecUnits[i]
+        }
+      }
+    }
+    if (ChineseStr === '') {
+      ChineseStr += cnNums[0] + cnIntLast + cnInteger
+    } else if (DecimalNum === '') {
+      ChineseStr += cnInteger
+    }
+
+    ChineseStr = Symbol + ChineseStr
+    
+    return ChineseStr
+  }
+
+  nextLine = (col, record) => {
+    const { edData, tableId } = this.state
+
+    if (col.tableId !== tableId) return
+
+    if (record.index < edData.length - 2) {
+      MKEmitter.emit('tdFocus', 'remark' + edData[record.index + 1].uuid)
+    } else {
+      let _data = fromJS(edData).toJS()
+      let line = {uuid: Utils.getuuid(), index: _data.length - 1, remark: record.remark || '', subject: '', debtor: '', creditor: ''}
+
+      _data.splice(_data.length - 1, 0, line)
+
+      this.setState({edData: _data}, () => {
+        MKEmitter.emit('tdFocus', 'remark' + line.uuid)
+      })
+    }
+  }
+
+  plusLine = (initEditLine) => {
+    const { edData } = this.state
+
+    let item = {...edData[edData.length - 1]}
+
+    item.key = item.key + 1
+    item.$$uuid = '$new'
+
+    this.setState({edData: [...edData, item]}, () => {
+      MKEmitter.emit('tdFocus', initEditLine.uuid + item.uuid)
+    })
+  }
+
+  delRecord = (id, record) => {
+    const { tableId, edData } = this.state
+
+    if (id !== tableId) return
+
+    let _data = edData.filter(item => item.uuid !== record.uuid)
+
+    _data.pop()
+
+    if (_data.length < 4) {
+      for (let i = _data.length - 1; i < 4; i++) {
+        _data.push({uuid: Utils.getuuid(), index: i + 1, remark: '', subject: '', debtor: '', creditor: ''})
+      }
+    }
+
+    _data.push(this.getTotalLine(_data))
+
+    this.setState({edData: _data})
+  }
+
+  changeRecord = (tableId, record) => {
+    if (tableId !== this.state.tableId) return
+
+    let _data = this.state.edData.map(item => {
+      if (item.uuid === record.uuid) {
+        return record
+      } else {
+        return item
+      }
+    })
+
+    _data.pop()
+
+    if (record.index === _data.length - 1) {
+      _data.push({uuid: Utils.getuuid(), index: record.index + 1, remark: '', subject: '', debtor: '', creditor: ''})
+    }
+
+    _data.push(this.getTotalLine(_data))
+
+    this.setState({edData: _data})
+  }
+
+  addLine = () => {
+    const { BID } = this.props
+    const { edData } = this.state
+
+    let item = {}
+    if (edData.length > 0) {
+      item = {...edData[edData.length - 1]}
+      item.key = item.key + 1
+      item.$$uuid = '$new'
+    } else {
+      item.key = 0
+      item.$$uuid = '$new'
+      item.$$BID = BID || ''
+    }
+
+    this.setState({edData: [...edData, item]})
+  }
+
+  checkData = () => {
+    const { edData } = this.state
+
+    if (edData.length === 0) {
+      notification.warning({
+        top: 92,
+        message: '鎻愪氦鏁版嵁涓嶅彲涓虹┖锛�',
+        duration: 5
+      })
+      return
+    }
+    let err = ''
+    let data = fromJS(edData).toJS().map(item => {
+      // let line = []
+      // fields.forEach(col => {
+      //   if (col.editable !== 'true' || item.$deleted) {
+      //     if (col.type === 'number') {
+      //       item[col.field] = +item[col.field]
+      //       if (isNaN(item[col.field])) {
+      //         item[col.field] = 0
+      //       }
+      //     } else {
+      //       item[col.field] = item[col.field] !== undefined ? (item[col.field] + '') : ''
+      //     }
+      //     return
+      //   }
+      //   if (col.type === 'text') {
+      //     let val = item[col.field] !== undefined ? (item[col.field] + '') : ''
+      //     if (col.required === 'true' && !val) {
+      //       line.push(`${col.label}涓嶅彲涓虹┖`)
+      //     }
+      //     item[col.field] = val
+      //   } else if (col.type === 'number') {
+      //     let val = item[col.field]
+      //     if (!val && val !== 0) {
+      //       line.push(`${col.label}涓嶅彲涓虹┖`)
+      //       return
+      //     }
+      //     val = +val
+      //     if (isNaN(val)) {
+      //       line.push(`${col.label}鏁版嵁鏍煎紡閿欒`)
+      //       return
+      //     }
+
+      //     val = +val.toFixed(col.decimal || 0)
+          
+      //     if (typeof(col.max) === 'number' && val > col.max) {
+      //       line.push(`${col.label}涓嶅彲澶т簬${col.max}`)
+      //     } else if (typeof(col.min) === 'number' && val < col.min) {
+      //       line.push(`${col.label}涓嶅彲灏忎簬${col.min}`)
+      //     }
+
+      //     item[col.field] = val
+      //   }
+      // })
+
+      return item
+    })
+
+    if (err) {
+      notification.warning({
+        top: 92,
+        message: err,
+        duration: 5
+      })
+    } else {
+      this.submit(data)
+    }
+  }
+
+  submit = (data) => {
+    const { BID } = this.props
+
+    let param = {
+      // excel_in: result.lines,
+      BID: BID || ''
+    }
+
+    this.setState({
+      loading: true
+    })
+
+    param.func = 'submit.innerFunc'
+
+    Api.genericInterface(param).then((res) => {
+      if (res.status) {
+        this.execSuccess(res)
+      } else {
+        this.execError(res)
+      }
+    }, () => {
+      this.execError({})
+    })
+  }
+
+  execSuccess = (res) => {
+    const { submit } = this.props
+
+    if (res && res.ErrCode === 'S') { // 鎵ц鎴愬姛
+      notification.success({
+        top: 92,
+        message: res.ErrMesg || this.state.dict['main.action.confirm.success'],
+        duration: submit.stime ? submit.stime : 2
+      })
+    } else if (res && res.ErrCode === 'Y') { // 鎵ц鎴愬姛
+      Modal.success({
+        title: res.ErrMesg || this.state.dict['main.action.confirm.success']
+      })
+    } else if (res && res.ErrCode === '-1') { // 瀹屾垚鍚庝笉鎻愮ず
+
+    }
+
+    this.setState({
+      loading: false
+    })
+
+    if (submit.closetab === 'true') {
+      MKEmitter.emit('popclose')
+    }
+    if (submit.execSuccess !== 'never') {
+      MKEmitter.emit('refreshByButtonResult', submit.$menuId, submit.execSuccess, submit)
+    }
+  }
+
+  execError = (res) => {
+    const { submit } = this.props
+
+    if (res.ErrCode === 'E') {
+      Modal.error({
+        title: res.message || res.ErrMesg,
+      })
+    } else if (res.ErrCode === 'N') {
+      notification.error({
+        top: 92,
+        message: res.message || res.ErrMesg,
+        duration: submit.ntime ? submit.ntime : 10
+      })
+    } else if (res.ErrCode === 'F') {
+      notification.error({
+        className: 'notification-custom-error',
+        top: 92,
+        message: res.message || res.ErrMesg,
+        duration: submit.ftime ? submit.ftime : 10
+      })
+    } else if (res.ErrCode === 'NM') {
+      message.error(res.message || res.ErrMesg)
+    }
+    
+    this.setState({
+      loading: false
+    })
+
+    if (submit.execError !== 'never') {
+      MKEmitter.emit('refreshByButtonResult', submit.$menuId, submit.execError, submit)
+    }
+  }
+
+  render() {
+    const { edData, columns} = this.state
+
+    const components = {
+      body: {
+        row: BodyRow,
+        cell: BodyCell
+      }
+    }
+
+    return (
+      <div className="voucher-table-wrap">
+        <Table
+          rowKey="uuid"
+          components={components}
+          columns={columns}
+          dataSource={edData}
+          bordered={true}
+          // loading={this.props.loading}
+          onRow={(record, index) => {
+            return {
+              data: record
+            }
+          }}
+          pagination={false}
+        />
+      </div>
+    )
+  }
+}
+
+export default AssistTable
\ No newline at end of file
diff --git a/src/tabviews/custom/components/module/voucher/assistTable/index.scss b/src/tabviews/custom/components/module/voucher/assistTable/index.scss
new file mode 100644
index 0000000..e8175c8
--- /dev/null
+++ b/src/tabviews/custom/components/module/voucher/assistTable/index.scss
@@ -0,0 +1,259 @@
+.voucher-table-wrap {
+  position: relative;
+  padding: 0px;
+
+  .normal-table-footer {
+    padding: 10px 0px;
+    color: rgba(0, 0, 0, 0.65);
+  }
+  .normal-table-footer.pagination {
+    position: absolute;
+    bottom: 10px;
+  }
+  >.ant-table-wrapper {
+    position: relative;
+    z-index: 1;
+  }
+  .ant-table {
+    color: inherit;
+    font-size: inherit;
+  }
+
+  .money-uint {
+    display: flex;
+    span {
+      display: inline-block;
+      flex: 1;
+      text-align: center;
+      font-size: 12px;
+    }
+    span:not(.last) {
+      border-right: 1px solid #e9e9e9;
+    }
+    span:nth-child(3), span:nth-child(6) {
+      border-color: #91d5ff;
+    }
+    span:nth-child(9) {
+      border-color: #ffa39e;
+    }
+  }
+
+  table {
+    max-width: 100%;
+    width: 100%;
+    .ant-table-thead {
+      tr {
+        th {
+          position: relative;
+          background-color: transparent;
+          padding: 0;
+          height: 60px;
+          line-height: 60px;
+          text-align: center;
+
+          .ant-table-header-column {
+            display: block;
+            width: 100%;
+            height: 100%;
+
+            .ant-table-column-title {
+              display: block;
+              width: 100%;
+              height: 100%;
+              font-weight: bold;
+              font-size: 13px;
+            }
+          }
+          .money-title {
+            line-height: 30px;
+            font-weight: bold;
+            font-size: 13px;
+          }
+          .money-uint {
+            line-height: 30px;
+            border-top: 1px solid #dadada;
+          }
+        }
+      }
+    }
+    .ant-table-selection-column {
+      width: 60px;
+      min-width: 60px;
+      max-width: 60px;
+    }
+    .ant-table-tbody {
+      tr td {
+        position: relative;
+        background-color: transparent;
+        padding: 0;
+        height: 60px;
+        vertical-align: top;
+
+        .content-wrap {
+          padding: 5px;
+          height: 100%;
+          font-size: 13px;
+          font-weight: bold;
+        }
+        .money-uint {
+          height: 100%;
+          line-height: 60px;
+
+          span {
+            font-size: 14px;
+            font-weight: bold;
+          }
+        }
+        .money-uint.down {
+          span {
+            color: #ff4d4f;
+          }
+        }
+      }
+    }
+  }
+  .ant-input {
+    height: 60px;
+    border-radius: 0;
+    resize: none;
+  }
+  .ant-input-number {
+    height: 60px;
+    border-radius: 0;
+    
+    .ant-input-number-handler-wrap {
+      display: none;
+    }
+    .ant-input-number-input {
+      border-radius: 0;
+      height: 60px;
+    }
+  }
+  .editing_table_cell {
+    .ant-input {
+      padding: 0px;
+      position: absolute;
+      top: 0px;
+      left: 0px;
+      right: 0px;
+      bottom: 0px;
+      border: 1px solid #1890ff;
+    }
+    .ant-input-number-input {
+      position: absolute;
+      top: 0px;
+      left: 0px;
+      right: 0px;
+      bottom: 0px;
+      border: 1px solid #1890ff;
+    }
+    .anticon {
+      color: #ff4d4f;
+      position: absolute;
+      right: 3px;
+      top: calc(50% - 8px);
+    }
+  }
+  td.pointer {
+    position: relative;
+  }
+  td.pointer {
+    .mk-mask {
+      display: none;
+      cursor: pointer;
+      position: absolute;
+      top: 0;
+      left: 0;
+      bottom: 0;
+      right: 0;
+    }
+  }
+}
+.edit-custom-table.editable {
+  td {
+    background-color: #ffffff!important;
+  }
+  td.pointer .mk-mask {
+    display: block;
+  }
+  .mk-operation {
+    display: none;
+  }
+  .ant-table-placeholder {
+    display: none;
+  }
+}
+.edit-custom-table:not(.fixed-height) {
+  .ant-table-body::-webkit-scrollbar {
+    width: 8px;
+    height: 10px;
+  }
+  ::-webkit-scrollbar-thumb {
+    border-radius: 5px;
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13);
+    background: rgba(0, 0, 0, 0.13);
+  }
+  ::-webkit-scrollbar-track {/*婊氬姩鏉¢噷闈㈣建閬�*/
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05);
+    border-radius: 3px;
+    border: 1px solid rgba(0, 0, 0, 0.07);
+    background: rgba(0, 0, 0, 0);
+  }
+}
+.edit-custom-table.fixed-height {
+  .ant-table-body {
+    border-bottom: 1px solid rgba(0, 0, 0, .05);
+    .ant-table-fixed {
+      border-bottom: 0;
+    }
+  }
+}
+.edit-custom-table.hidden {
+  thead {
+    display: none;
+  }
+}
+.edit-custom-table.ghost {
+  .ant-table-thead > tr {
+    > th {
+      color: inherit;
+      background: transparent;
+      .ant-table-column-sorter .ant-table-column-sorter-inner {
+        color: inherit;
+      }
+    }
+    > th:hover {
+      background: transparent;
+    }
+  }
+  .ant-table-body {
+    overflow-x: auto;
+    tr {
+      td {
+        background: transparent!important;
+      }
+    }
+    tr:hover td {
+      background: transparent!important;
+    }
+  }
+}
+.image-scale-modal {
+  width: 70vw;
+  min-height: 80vh;
+  top: 10vh;
+  .ant-modal-body {
+    min-height: calc(80vh - 110px);
+    line-height: calc(80vh - 160px);
+    text-align: center;
+  }
+  .ant-modal-footer {
+    text-align: center;
+    span {
+      display: inline-block;
+      color: #1890ff;
+      padding: 5px 15px;
+      cursor: pointer;
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/tabviews/custom/components/table/edit-table/index.jsx b/src/tabviews/custom/components/table/edit-table/index.jsx
index f130dc6..36170d3 100644
--- a/src/tabviews/custom/components/table/edit-table/index.jsx
+++ b/src/tabviews/custom/components/table/edit-table/index.jsx
@@ -29,7 +29,7 @@
     config: {},           // 椤甸潰閰嶇疆淇℃伅锛屽寘鎷寜閽�佹悳绱€�佹樉绀哄垪銆佹爣绛剧瓑
     actions: null,        // 鎸夐挳闆�
     columns: null,        // 鏄剧ず鍒�
-    arr_field: '',        // 浣跨敤 sPC_Get_TableData 鏃剁殑鏌ヨ瀛楁闆�
+    arr_field: '',        // 鏌ヨ瀛楁闆�
     setting: null,        // 椤甸潰鍏ㄥ眬璁剧疆锛氭暟鎹簮銆佹寜閽強鏄剧ず鍒楀浐瀹氥�佷富閿瓑
     data: [],             // 鍒楄〃鏁版嵁闆�
     selectedData: [],     // 宸查�夎〃鏍兼暟鎹�
diff --git a/src/tabviews/custom/components/table/normal-table/index.jsx b/src/tabviews/custom/components/table/normal-table/index.jsx
index 29532d5..62cefcd 100644
--- a/src/tabviews/custom/components/table/normal-table/index.jsx
+++ b/src/tabviews/custom/components/table/normal-table/index.jsx
@@ -32,7 +32,7 @@
     config: {},           // 椤甸潰閰嶇疆淇℃伅锛屽寘鎷寜閽�佹悳绱€�佹樉绀哄垪銆佹爣绛剧瓑
     actions: null,        // 鎸夐挳闆�
     columns: null,        // 鏄剧ず鍒�
-    arr_field: '',        // 浣跨敤 sPC_Get_TableData 鏃剁殑鏌ヨ瀛楁闆�
+    arr_field: '',        // 鏌ヨ瀛楁闆�
     setting: null,        // 椤甸潰鍏ㄥ眬璁剧疆锛氭暟鎹簮銆佹寜閽強鏄剧ず鍒楀浐瀹氥�佷富閿瓑
     data: [],             // 鍒楄〃鏁版嵁闆�
     selectedData: [],     // 宸查�夎〃鏍兼暟鎹�
diff --git a/src/tabviews/custom/components/tabs/antv-tabs/index.jsx b/src/tabviews/custom/components/tabs/antv-tabs/index.jsx
index 064a1d0..a5159a1 100644
--- a/src/tabviews/custom/components/tabs/antv-tabs/index.jsx
+++ b/src/tabviews/custom/components/tabs/antv-tabs/index.jsx
@@ -52,8 +52,13 @@
     if (config.setting.autoSwitch === 'true' && config.subtabs.length > 1 && config.setting.interval) {
       this.autoSwitch(config.setting.interval)
     }
-    MKEmitter.addListener('resetSelectLine', this.resetParentParam)
 
+    if (config.activeKey) {
+      let node = document.getElementById('tab' + config.activeKey)
+      node && node.click()
+    }
+
+    MKEmitter.addListener('resetSelectLine', this.resetParentParam)
   }
 
   /**
@@ -81,13 +86,18 @@
           tabs: {...tabs, subtabs: []}
         })
       } else {
-        let val = data[tabs.setting.controlField] === undefined ? '' : data[tabs.setting.controlField] + ''
+        let val = ''
+        Object.keys(data).forEach(key => {
+          if (key.toLowerCase() === tabs.setting.controlField) {
+            val = data[key]
+          }
+        })
         this.setState({
           tabs: {...tabs, subtabs: this.props.config.subtabs.filter(tab => {
             if (tab.controlVal === val) {
               return false
             } else if (/,/ig.test(tab.controlVal)) {
-              return tab.controlVal.split(',').includes(val)
+              return !tab.controlVal.split(',').includes(val)
             }
             return true
           })}
diff --git a/src/tabviews/custom/components/timeline/normal-timeline/index.jsx b/src/tabviews/custom/components/timeline/normal-timeline/index.jsx
index 13127d8..c4a13c7 100644
--- a/src/tabviews/custom/components/timeline/normal-timeline/index.jsx
+++ b/src/tabviews/custom/components/timeline/normal-timeline/index.jsx
@@ -240,6 +240,11 @@
       return
     }
 
+    // if (config.setting.interType === 'inner' && config.setting.innerFunc === 'z_mk_express') {
+    //   this.getExpress()
+    //   return
+    // }
+
     this.setState({
       loading: true
     })
@@ -272,6 +277,36 @@
     }
   }
 
+  getExpress = () => {
+    this.setState({
+      loading: true
+    })
+    Api.wxNginxRequest(`express/yuantong/YT6590674317601`, 'get').then(res => {
+      if (!res || typeof(res) !== 'string') {
+        notification.error({
+          top: 92,
+          message: '鏈幏鍙栧埌蹇�掍俊鎭�',
+          duration: 10
+        })
+      } else {
+        let data = res.split(/\n/).filter(Boolean)
+
+        data = data.map((item, i) => {
+          return {
+            $Index: i,
+            date: item.substr(0, 19),
+            content: item.substr(20)
+          }
+        })
+
+        this.setState({
+          data: data,
+          loading: false
+        })
+      }
+    })
+  }
+
   getnodes = (data) => {
     const { config, card } = this.state
 
diff --git a/src/tabviews/custom/index.jsx b/src/tabviews/custom/index.jsx
index 29a1d27..5b729ce 100644
--- a/src/tabviews/custom/index.jsx
+++ b/src/tabviews/custom/index.jsx
@@ -73,7 +73,7 @@
    * @description 鑾峰彇椤甸潰閰嶇疆淇℃伅
    */
   async loadconfig () {
-    const { permAction, param } = this.props
+    const { permAction } = this.props
 
     let _param = {
       func: 'sPC_Get_LongParam',
@@ -138,7 +138,9 @@
       let roleId = sessionStorage.getItem('role_id') || '' // 瑙掕壊ID
       let balMap = new Map()
       let skip = config.permission === 'false' || window.GLOB.mkHS
-      config.components = this.filterComponent(config.components, roleId, permAction, balMap, skip)
+      let param = this.props.param || {} // url鍙傛暟
+
+      config.components = this.filterComponent(config.components, roleId, permAction, balMap, skip, param)
       
       // 鑾峰彇涓绘悳绱㈡潯浠�
       let mainSearch = []
@@ -147,7 +149,7 @@
 
         component.search = component.search.map(item => {
           item.oriInitval = item.initval
-          if (['text', 'select', 'link'].includes(item.type) && param && param.$searchkey === item.field) {
+          if (['text', 'select', 'link'].includes(item.type) && param.$searchkey === item.field) {
             item.initval = param.$searchval
           }
 
@@ -158,7 +160,7 @@
       })
 
       let params = []
-      let BID = param && param.$BID ? param.$BID : ''
+      let BID = param.$BID || ''
       let inherit = {}
 
       if (config.cacheUseful === 'true') { // 缂撳瓨缁ф壙
@@ -188,7 +190,7 @@
       }
       if (config.urlFields) {
         config.urlFields.forEach(field => {
-          let val = `'${param ? (param[field] || '') : ''}'`
+          let val = `'${param[field] || ''}'`
           regs.push({
             reg: new RegExp('@' + field + '@', 'ig'),
             value: val
@@ -405,14 +407,6 @@
       sql = sql.join('')
       
       param = UtilsDM.getCallBackQueryParams(setting, sql, errSql, this.state.BID)
-
-      if (this.state.BID) {
-        param.BID = this.state.BID
-      }
-
-      if (window.GLOB.mkHS) { // 鍑芥暟 sPC_TableData_InUpDe 浜戠楠岃瘉
-        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
-      }
     } else {
       param.func = 's_ex_result_back'
       param.s_ex_result = lines.map((item, index) => ({
@@ -449,7 +443,7 @@
     })
   }
 
-  filterComponent = (components, roleId, permAction, balMap, skip) => {
+  filterComponent = (components, roleId, permAction, balMap, skip, urlparam) => {
     return components.filter(item => {
       
       if (item.style && item.style.boxShadow) {
@@ -481,8 +475,58 @@
           return true
         })
 
+        if (item.setting.supModule) {
+          let pid = item.setting.supModule.pop()
+          item.setting.supModule = pid || ''
+
+          if (item.setting.supModule) {
+            item.setting.controlField = item.setting.controlField.toLowerCase()
+  
+            if (item.setting.supModule === 'preview') {
+              item.setting.supModule = ''
+              let val = ''
+              Object.keys(urlparam).forEach(key => {
+                if (key.toLowerCase() === item.setting.controlField) {
+                  val = urlparam[key]
+                }
+              })
+  
+              item.subtabs = item.subtabs.filter(tab => {
+                if (tab.controlVal === val) {
+                  return false
+                } else if (/,/ig.test(tab.controlVal)) {
+                  return !tab.controlVal.split(',').includes(val)
+                }
+      
+                return true
+              })
+            }
+          }
+        }
+
+        if (item.setting.selectField) {
+          item.setting.selectField = item.setting.selectField.toLowerCase()
+
+          let val = ''
+          Object.keys(urlparam).forEach(key => {
+            if (key.toLowerCase() === item.setting.selectField) {
+              val = urlparam[key]
+            }
+          })
+
+          let activeKey = ''
+
+          item.subtabs.forEach(tab => {
+            if (!activeKey && tab.selectVal === val) {
+              activeKey = tab.uuid
+            }
+          })
+
+          item.activeKey = activeKey
+        }
+
         item.subtabs = item.subtabs.map(tab => {
-          tab.components = this.filterComponent(tab.components, roleId, permAction, balMap, skip)
+          tab.components = this.filterComponent(tab.components, roleId, permAction, balMap, skip, urlparam)
           return tab
         })
 
@@ -497,6 +541,8 @@
           })
         })
         item.parentIds = supIds
+
+        return true
       } else if (item.type === 'group') {
         if (
           item.setting.blacklist && item.setting.blacklist.length > 0 &&
@@ -505,7 +551,9 @@
           return false
         }
 
-        item.components = this.filterComponent(item.components, roleId, permAction, balMap, skip)
+        item.components = this.filterComponent(item.components, roleId, permAction, balMap, skip, urlparam)
+
+        return true
       } else if (['pie', 'bar', 'line', 'dashboard', 'scatter', 'chart'].includes(item.type)) {
         if (
           item.plot.blacklist && item.plot.blacklist.length > 0 &&
diff --git a/src/tabviews/formtab/index.jsx b/src/tabviews/formtab/index.jsx
index 9c15dfd..f4b1eea 100644
--- a/src/tabviews/formtab/index.jsx
+++ b/src/tabviews/formtab/index.jsx
@@ -37,7 +37,7 @@
     config: {},           // 椤甸潰閰嶇疆淇℃伅锛屽寘鎷寜閽�佽〃鍗曘�佹爣绛剧瓑
     groups: null,         // 琛ㄥ崟缁�
     actions: null,        // 鎸夐挳闆�
-    arr_field: '',        // 浣跨敤 sPC_Get_TableData 鏃剁殑鏌ヨ瀛楁闆�
+    arr_field: '',        // 鏌ヨ瀛楁闆�
     setting: null,        // 椤甸潰鍏ㄥ眬璁剧疆锛氭暟鎹簮銆佹寜閽強鏄剧ず鍒楀浐瀹氥�佷富閿瓑
     data: null,           // 鍒楄〃鏁版嵁闆�
     BIDs: {},             // 涓婄骇琛╥d
@@ -390,7 +390,7 @@
   }
 
   /**
-   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼ sPC_Get_TableData 鐨勫弬鏁�
+   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼鐨勫弬鏁�
    */
   getDefaultParam = () => {
     const { arr_field, setting, primaryId } = this.state
diff --git a/src/tabviews/scriptmanage/index.jsx b/src/tabviews/scriptmanage/index.jsx
index 63947a9..df5e94b 100644
--- a/src/tabviews/scriptmanage/index.jsx
+++ b/src/tabviews/scriptmanage/index.jsx
@@ -34,7 +34,7 @@
     searchlist: [],       // 鎼滅储鏉′欢
     actions: [],          // 鎸夐挳闆�
     columns: [],          // 鏄剧ず鍒�
-    arr_field: '',        // 浣跨敤 sPC_Get_TableData 鏃剁殑鏌ヨ瀛楁闆�
+    arr_field: '',        // 鏌ヨ瀛楁闆�
     setting: {},          // 椤甸潰鍏ㄥ眬璁剧疆锛氭暟鎹簮銆佹寜閽強鏄剧ず鍒楀浐瀹氥�佷富閿瓑
     data: [],             // 鍒楄〃鏁版嵁闆�
     selectedData: [],     // 宸查�夎〃鏍兼暟鎹�
@@ -155,7 +155,7 @@
   }
 
   /**
-   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼ sPC_Get_TableData 鐨勫弬鏁�
+   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼鐨勫弬鏁�
    */
   getDefaultParam = () => {
     const { arr_field, pageIndex, pageSize, orderBy, search, setting } = this.state
diff --git a/src/tabviews/subtable/index.jsx b/src/tabviews/subtable/index.jsx
index 8d8fc3f..d58628f 100644
--- a/src/tabviews/subtable/index.jsx
+++ b/src/tabviews/subtable/index.jsx
@@ -46,7 +46,7 @@
     searchlist: null,     // 鎼滅储鏉′欢
     actions: null,        // 鎸夐挳闆�
     columns: null,        // 鏄剧ず鍒�
-    arr_field: '',        // 浣跨敤 sPC_Get_TableData 鏃剁殑鏌ヨ瀛楁闆�
+    arr_field: '',        // 鏌ヨ瀛楁闆�
     setting: null,        // 椤甸潰鍏ㄥ眬璁剧疆锛氭暟鎹簮銆佹寜閽強鏄剧ず鍒楀浐瀹氥�佷富閿瓑
     data: [],             // 鍒楄〃鏁版嵁闆�
     selectedData: [],     // 宸查�夎〃鏍兼暟鎹�
@@ -545,14 +545,6 @@
       sql = sql.join('')
       
       param = UtilsDM.getCallBackQueryParams(setting, sql, errSql, BID)
-
-      if (BID) {
-        param.BID = BID
-      }
-
-      if (window.GLOB.mkHS) { // 鍑芥暟 sPC_TableData_InUpDe 浜戠楠岃瘉
-        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
-      }
     } else {
       param.func = 's_ex_result_back'
       param.s_ex_result = lines.map((item, index) => ({
diff --git a/src/tabviews/subtabtable/index.jsx b/src/tabviews/subtabtable/index.jsx
index 4c89fbe..ff72754 100644
--- a/src/tabviews/subtabtable/index.jsx
+++ b/src/tabviews/subtabtable/index.jsx
@@ -40,7 +40,7 @@
     searchlist: null,     // 鎼滅储鏉′欢
     actions: null,        // 鎸夐挳闆�
     columns: null,        // 鏄剧ず鍒�
-    arr_field: '',        // 浣跨敤 sPC_Get_TableData 鏃剁殑鏌ヨ瀛楁闆�
+    arr_field: '',        // 鏌ヨ瀛楁闆�
     setting: null,        // 椤甸潰鍏ㄥ眬璁剧疆锛氭暟鎹簮銆佹寜閽強鏄剧ず鍒楀浐瀹氥�佷富閿瓑
     data: [],             // 鍒楄〃鏁版嵁闆�
     selectedData: [],     // 宸查�夎〃鏍兼暟鎹�
@@ -484,14 +484,6 @@
       sql = sql.join('')
       
       param = UtilsDM.getCallBackQueryParams(setting, sql, errSql, this.props.BID)
-
-      if (this.props.BID) {
-        param.BID = this.props.BID
-      }
-
-      if (window.GLOB.mkHS) { // 鍑芥暟 sPC_TableData_InUpDe 浜戠楠岃瘉
-        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
-      }
     } else {
       let name = this.props.Tab ? (this.props.Tab.label || '') : ''
       param.func = 's_ex_result_back'
diff --git a/src/tabviews/verupmanage/index.jsx b/src/tabviews/verupmanage/index.jsx
index 9c1f4b3..d982822 100644
--- a/src/tabviews/verupmanage/index.jsx
+++ b/src/tabviews/verupmanage/index.jsx
@@ -37,7 +37,7 @@
     searchlist: [],       // 鎼滅储鏉′欢
     actions: [],          // 鎸夐挳闆�
     columns: [],          // 鏄剧ず鍒�
-    arr_field: '',        // 浣跨敤 sPC_Get_TableData 鏃剁殑鏌ヨ瀛楁闆�
+    arr_field: '',        // 鏌ヨ瀛楁闆�
     setting: {},          // 椤甸潰鍏ㄥ眬璁剧疆锛氭暟鎹簮銆佹寜閽強鏄剧ず鍒楀浐瀹氥�佷富閿瓑
     data: [],             // 鍒楄〃鏁版嵁闆�
     selectedData: [],     // 宸查�夎〃鏍兼暟鎹�
@@ -206,7 +206,7 @@
   }
 
   /**
-   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼ sPC_Get_TableData 鐨勫弬鏁�
+   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼鐨勫弬鏁�
    */
   getDefaultParam = () => {
     const { arr_field, pageIndex, pageSize, orderBy, search, setting } = this.state
diff --git a/src/tabviews/verupmanage/subtabtable/index.jsx b/src/tabviews/verupmanage/subtabtable/index.jsx
index 0d69d00..fd00229 100644
--- a/src/tabviews/verupmanage/subtabtable/index.jsx
+++ b/src/tabviews/verupmanage/subtabtable/index.jsx
@@ -39,7 +39,7 @@
     searchlist: null,     // 鎼滅储鏉′欢
     actions: null,        // 鎸夐挳闆�
     columns: null,        // 鏄剧ず鍒�
-    arr_field: '',        // 浣跨敤 sPC_Get_TableData 鏃剁殑鏌ヨ瀛楁闆�
+    arr_field: '',        // 鏌ヨ瀛楁闆�
     setting: null,        // 椤甸潰鍏ㄥ眬璁剧疆锛氭暟鎹簮銆佹寜閽強鏄剧ず鍒楀浐瀹氥�佷富閿瓑
     data: null,           // 鍒楄〃鏁版嵁闆�
     selectedData: [],     // 宸查�夎〃鏍兼暟鎹�
@@ -228,7 +228,7 @@
   }
 
   /**
-   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼ sPC_Get_TableData 鐨勫弬鏁�
+   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼鐨勫弬鏁�
    */
   getDefaultParam = (BID) => {
     const { arr_field, pageIndex, pageSize, orderBy, search, setting } = this.state
diff --git a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
index 437bf21..5c7df9c 100644
--- a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
@@ -670,7 +670,7 @@
     param.secretkey = Utils.encrypt('', param.timestamp)
     param.LText = Utils.formatOptions(script)
 
-    if (window.GLOB.mkHS) { // 鍑芥暟 sPC_TableData_InUpDe 浜戠楠岃瘉
+    if (window.GLOB.mkHS) { // 绯荤粺鍑芥暟浜戠楠岃瘉
       param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
     }
 
diff --git a/src/tabviews/zshare/actionList/normalbutton/index.jsx b/src/tabviews/zshare/actionList/normalbutton/index.jsx
index 473d3e1..d58c19e 100644
--- a/src/tabviews/zshare/actionList/normalbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -267,12 +267,20 @@
       return
     } else if (!['requiredSgl', 'notRequired', 'requiredOnce', 'required'].includes(btn.Ot)) {
       // 鏁版嵁閫夋嫨绫诲瀷鏍¢獙
-      this.actionSettingError()
+      notification.warning({
+        top: 92,
+        message: '鎸夐挳琛岃缃敊璇紒',
+        duration: 5
+      })
       return
     } else if (btn.intertype === 'system') {
       // 浣跨敤鍐呴儴鎺ュ彛鏃讹紝鎿嶄綔绫诲瀷鍜屾暟鎹簮涓嶅彲涓虹┖
       if (!btn.sql || !btn.sqlType) {
-        this.actionSettingError()
+        notification.warning({
+          top: 92,
+          message: '鎸夐挳鎿嶄綔绫诲瀷閿欒锛�',
+          duration: 5
+        })
         return
       } else if (data.length === 0 && btn.verify && btn.verify.voucher && btn.verify.voucher.enabled) {
         notification.warning({
@@ -285,12 +293,20 @@
     } else if (btn.intertype === 'inner') {
       // 浣跨敤鍐呴儴鎺ュ彛鏃讹紝鍐呴儴鍑芥暟涓嶅彲涓虹┖
       if (!btn.innerFunc) {
-        this.actionSettingError()
+        notification.warning({
+          top: 92,
+          message: '鎸夐挳鍐呴儴鍑芥暟涓嶅彲涓虹┖锛�',
+          duration: 5
+        })
         return
       }
-    } else if (btn.intertype === 'custom') {
+    } else if (btn.intertype === 'custom' || btn.intertype === 'outer') {
       if (btn.callbackType === 'script' && (!btn.verify || !btn.verify.cbScripts || !btn.verify.cbScripts.filter(item => item.status !== 'false').length === 0)) {
-        this.actionSettingError()
+        notification.warning({
+          top: 92,
+          message: '浣跨敤鑷畾涔夎剼鏈洖璋冩椂锛屽洖璋冭剼鏈笉鍙负绌猴紒',
+          duration: 5
+        })
         return
       } else if (btn.procMode === 'system' && data.length === 0 && btn.verify && btn.verify.voucher && btn.verify.voucher.enabled) {
         notification.warning({
@@ -299,7 +315,7 @@
           duration: 5
         })
         return
-      } else if (window.GLOB.systemType === 'production' && !btn.proInterface) {
+      } else if (btn.intertype === 'custom' && window.GLOB.systemType === 'production' && !btn.proInterface) {
         notification.warning({
           top: 92,
           message: '灏氭湭璁剧疆姝e紡绯荤粺鎺ュ彛鍦板潃锛�',
@@ -307,15 +323,13 @@
         })
         return
       }
-    } else if (btn.intertype === 'outer') {
-      // 鎺ュ彛鍦板潃涓嶅瓨鍦ㄦ椂鎶ラ敊
-      if (!btn.interface && btn.sysInterface !== 'true') {
-        this.actionSettingError()
-        return
-      }
     } else if (!['inner', 'outer', 'system', 'custom'].includes(btn.intertype)) {
       // 鎺ュ彛绫诲瀷閿欒
-      this.actionSettingError()
+      notification.warning({
+        top: 92,
+        message: '鎸夐挳鎺ュ彛绫诲瀷閿欒锛�',
+        duration: 5
+      })
       return
     }
 
@@ -659,11 +673,9 @@
           param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
         }
 
-        if (param.func === 'sPC_TableData_InUpDe') {
-          param.menuname = btn.logLabel
-          if (window.GLOB.probation) {
-            param.s_debug_type = 'Y'
-          }
+        param.menuname = btn.logLabel
+        if (window.GLOB.probation) {
+          param.s_debug_type = 'Y'
         }
 
         return param
@@ -673,13 +685,13 @@
     return _params
   }
 
-  getInnerParam = (data, formdata) => {
-    const { setting, btn } = this.props
+  getInnerParam = (data, formdata, retmsg) => {
+    const { setting, btn, columns } = this.props
     let _params = []
 
     if ( btn.Ot === 'notRequired' || btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce' ) {
       let param = {
-        func: btn.innerFunc
+        func: btn.innerFunc || ''
       }
 
       if (this.props.BID) {
@@ -708,6 +720,10 @@
         param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
         param.secretkey = Utils.encrypt(param.LTextOut, param.timestamp)
         param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
+      }
+
+      if (retmsg) {
+        param.$callbacksql = this.getSysDeclareSql(btn, formdata, data[0], columns)
       }
 
       _params.push(param)
@@ -747,11 +763,188 @@
           param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
         }
 
+        if (retmsg) {
+          param.$callbacksql = this.getSysDeclareSql(btn, formdata, cell, columns)
+        }
+
         return param
       })
     }
 
     return _params
+  }
+
+  /**
+   * @description 鑾峰彇鍥炶皟鑴氭湰鐨勫瓧娈靛畾涔�
+   */
+  getSysDeclareSql = (btn, formdata, data, columns) => {
+    let datavars = {}                 // 澹版槑鐨勫彉閲忥紝琛ㄥ崟鍙婃樉绀哄垪
+    // 闇�瑕佸0鏄庣殑鍙橀噺闆�
+    let _vars = ['tbid', 'errorcode', 'retmsg', 'billcode', 'bvoucher', 'fibvoucherdate', 'fiyear', 'username', 'fullname', 'modulardetailcode', 'roleid', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'bid']
+  
+    // sql璇彞
+    let _sql = ''
+  
+    let _initvars = [] // 宸茶祴鍊煎瓧娈甸泦
+    let _initFormfields = []
+    let _initColfields = []
+    let _declarefields = []
+  
+    // 鑾峰彇瀛楁閿�煎
+    formdata && formdata.forEach(form => {
+      let _key = form.key.toLowerCase()
+      datavars[_key] = form.value
+  
+      if (!_initvars.includes(_key)) {
+        _initvars.push(_key)
+  
+        if (form.type === 'number' || form.type === 'rate') {
+          let val = form.value
+          if (typeof(val) !== 'number') {
+            val = parseFloat(val)
+            if (isNaN(val)) {
+              val = 0
+            }
+          }
+          _initFormfields.push(`@${_key}=${val}`)
+        } else if (['date', 'datemonth', 'datetime'].includes(form.type)) {
+          _initFormfields.push(`@${_key}='${form.value || '1949-10-01'}'`)
+        } else {
+          _initFormfields.push(`@${_key}='${form.value}'`)
+        }
+      }
+      
+      if (!_vars.includes(_key)) {
+        _vars.push(_key)
+  
+        if (form.fieldlen && form.fieldlen > 2048) {
+          form.fieldlen = 'max'
+        }
+  
+        let _type = `nvarchar(${form.fieldlen})`
+  
+        if (form.type.match(/date/ig)) {
+          _type = 'datetime'
+        } else if (form.type === 'number') {
+          _type = `decimal(18,${form.fieldlen})`
+        } else if (form.type === 'rate') {
+          _type = `decimal(18,2)`
+        }
+  
+        _declarefields.push(`@${_key} ${_type}`)
+      }
+    })
+  
+    if (data) {
+      Object.keys(data).forEach(key => {
+        data[key.toLowerCase()] = data[key]
+      })
+    }
+  
+    // 娣诲姞鏁版嵁涓瓧娈碉紝琛ㄥ崟鍊间紭鍏�(鎸夐挳涓嶉�夎鎴栧琛屾嫾鎺ユ椂璺宠繃)
+    if (data && btn.Ot !== 'notRequired' && btn.Ot !== 'requiredOnce') {
+      datavars = {...data, ...datavars}
+  
+      const setField = (col) => {
+        if (!col.field) return
+        let _key = col.field.toLowerCase()
+  
+        if (!_initvars.includes(_key)) {
+          let _val = datavars.hasOwnProperty(_key) ? datavars[_key] : ''
+  
+          if (col.datatype && /^date/ig.test(col.datatype) && !_val) {
+            _val = '1949-10-01'
+          }
+  
+          _initvars.push(_key)
+          _initColfields.push(`@${_key}='${_val}'`)
+        }
+        
+        if (!_vars.includes(_key)) {
+          _vars.push(_key)
+  
+          if (col.datatype) {
+            _declarefields.push(`@${_key} ${col.datatype}`)
+          } else {
+            if (col.fieldlength && col.fieldlength > 2048) {
+              col.fieldlength = 'max'
+            }
+  
+            let _type = `nvarchar(${col.fieldlength || 50})`
+  
+            if (col.type === 'number') {
+              let _length = col.decimal ? col.decimal : 0
+              _type = `decimal(18,${_length})`
+            } else if (col.type === 'picture' || col.type === 'textarea') {
+              _type = `nvarchar(${col.fieldlength || 512})`
+            }
+  
+            _declarefields.push(`@${_key} ${_type}`)
+          }
+        }
+      }
+  
+      if (columns && columns.length > 0) {
+        columns.forEach(col => {
+          if (col.type === 'colspan' || col.type === 'old_colspan') {
+            col.subcols.forEach(cell => {
+              setField(cell)
+            })
+          } else {
+            setField(col)
+          }
+        })
+      }
+    }
+  
+    // 鍙橀噺澹版槑
+    _declarefields = _declarefields.join(',')
+    if (_declarefields) {
+      _declarefields = ',' + _declarefields
+    }
+    _sql = `/* 绯荤粺鐢熸垚 */
+        Declare @tbid nvarchar(50),@ErrorCode nvarchar(50),@retmsg nvarchar(4000),@BillCode nvarchar(50),@BVoucher nvarchar(50),@FIBVoucherDate nvarchar(50), @FiYear nvarchar(50),@ModularDetailCode nvarchar(50), @UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(50),@mk_organization nvarchar(50),@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),@bid nvarchar(50)${_declarefields}
+      `
+  
+    let userName = sessionStorage.getItem('User_Name') || ''
+    let fullName = sessionStorage.getItem('Full_Name') || ''
+    let RoleID = sessionStorage.getItem('role_id') || ''
+    let departmentcode = sessionStorage.getItem('departmentcode') || ''
+    let organization = sessionStorage.getItem('organization') || ''
+    let mk_user_type = sessionStorage.getItem('mk_user_type') || ''
+    let nation = sessionStorage.getItem('nation') || ''
+    let province = sessionStorage.getItem('province') || ''
+    let city = sessionStorage.getItem('city') || ''
+    let district = sessionStorage.getItem('district') || ''
+    let address = sessionStorage.getItem('address') || ''
+  
+    if (sessionStorage.getItem('isEditState') === 'true') {
+      userName = sessionStorage.getItem('CloudUserName') || ''
+      fullName = sessionStorage.getItem('CloudFullName') || ''
+    }
+  
+    // 鍒濆鍖栧嚟璇佸強鐢ㄦ埛淇℃伅瀛楁
+    _sql += `
+        /* 鍑瘉鍙婄敤鎴蜂俊鎭垵濮嬪寲璧嬪�� */
+        select @BVoucher='',@FIBVoucherDate='',@FiYear='',@ErrorCode='',@retmsg='',@UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}', @BillCode='', @ModularDetailCode=''
+        `
+  
+    // 琛ㄥ崟鍙橀噺璧嬪��
+    if (_initFormfields.length > 0) {
+      _sql += `
+        /* 琛ㄥ崟鍙橀噺璧嬪�� */
+        select ${_initFormfields.join(',')}
+        `
+    }
+    // 鏄剧ず鍒楀彉閲忚祴鍊�
+    if (_initColfields.length > 0) {
+      _sql += `
+        /* 鏄剧ず鍒楀彉閲忚祴鍊� */
+        select ${_initColfields.join(',')}
+        `
+    }
+
+    return _sql
   }
 
   /**
@@ -875,58 +1068,14 @@
       /** *********************璋冪敤澶栭儴鎺ュ彛************************* */
       let _params = [] // 璇锋眰鍙傛暟鏁扮粍
 
-      if (btn.Ot === 'notRequired' || btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') {
-        let param = {}
-
-        if (this.props.BID) {
-          param.BID = this.props.BID
-        }
-
-        if ((btn.OpenType === 'pop' || btn.OpenType === 'formSubmit' || btn.OpenType === 'form') && formdata) { // 琛ㄥ崟
-          formdata.forEach(_data => {
-            param[_data.key] = _data.value
-          })
-        }
-
-        // 鑾峰彇id
-        if (btn.Ot === 'notRequired') {
-          
-        } else if (btn.Ot === 'requiredSgl' && setting.primaryKey) {
-          param[setting.primaryKey] = data[0][setting.primaryKey]
-        } else if (btn.Ot === 'requiredOnce' && setting.primaryKey) {
-          let ids = data.map(d => { return d[setting.primaryKey]})
-          param[setting.primaryKey] = ids.join(',')
-        }
-
-        _params.push(param)
-      } else if (btn.Ot === 'required') {
-        // 閫夋嫨澶氳锛屽惊鐜皟鐢�
-        _params = data.map((cell, index) => {
-          let _cell = {}
-
-          if (this.props.BID) {
-            _cell.BID = this.props.BID
-          }
-
-          let _formparam = {}
-          if (btn.OpenType === 'pop' && formdata) { // 琛ㄥ崟
-            formdata.forEach(_data => {
-              if (index !== 0 && _data.readin && cell.hasOwnProperty(_data.key)) {
-                _formparam[_data.key] = cell[_data.key]
-              } else {
-                _formparam[_data.key] = _data.value
-              }
-            })
-          }
-
-          if (setting.primaryKey) {
-            _cell[setting.primaryKey] = cell[setting.primaryKey]
-          }
-
-          _cell = {..._formparam, ..._cell}
-
-          return _cell
+      if (btn.procMode === 'system') {
+        _params = this.getSystemParam(data, formdata, true)
+        _params = _params.map(item => {
+          item.script_type = 'Y'
+          return item
         })
+      } else {
+        _params = this.getInnerParam(data, formdata, btn.callbackType === 'script')
       }
 
       if (_params.length > 1 && btn.progress === 'progressbar' && btn.$toolbtn) {
@@ -936,7 +1085,7 @@
       }
 
       // 寰幆璋冪敤澶栭儴鎺ュ彛锛堝寘鎷唴閮ㄥ強鍥炶皟鍑芥暟锛�
-      this.outerLoopRequest(_params, btn, _resolve)
+      this.outerLoopRequest(_params, _resolve)
     } else if (btn.intertype === 'custom') { // 绯荤粺鎺ュ彛
       let params = []
 
@@ -947,7 +1096,7 @@
           return item
         })
       } else {
-        params = this.getInnerParam(data, formdata)
+        params = this.getInnerParam(data, formdata, btn.callbackType === 'script')
       }
 
       if (params.length > 1 && btn.progress === 'progressbar' && btn.$toolbtn) {
@@ -978,6 +1127,11 @@
 
     delete param.$callbacksql
 
+    if (!param.func) {
+      this.customOuterRequest(params, param, record, _resolve)
+      return
+    }
+
     Api.genericInterface(param).then(res => {
       if (res.status) {
         if ((res.mk_ex_invoke === 'false' || res.mk_ex_invoke === false) && params.length === 0) {
@@ -988,41 +1142,6 @@
         } else {
           this.customOuterRequest(params, res, record, _resolve)
         }
-      } else if (res.ErrCode === 'C' && this.state.checkParam) {
-        const _this = this
-        confirm({
-          title: res.message || res.ErrMesg,
-          content: '缁х画鎵ц锛�',
-          onOk() {
-            return new Promise(resolve => {
-              Api.genericInterface(_this.state.checkParam).then((result) => {
-                if (result.status) {
-                  if ((result.mk_ex_invoke === 'false' || result.mk_ex_invoke === false) && params.length === 0) {
-                    _this.execSuccess(result)
-                    _resolve()
-                  } else if ((result.mk_ex_invoke === 'false' || result.mk_ex_invoke === false) && params.length > 0) {
-                    _this.customLoopRequest(params, _resolve)
-                  } else {
-                    _this.customOuterRequest(params, result, record, _resolve)
-                  }
-                } else {
-                  _this.execError(result)
-                  _resolve()
-                }
-                resolve()
-              }, () => {
-                _this.updateStatus()
-                resolve()
-                _resolve()
-              })
-            })
-          },
-          onCancel() {
-            _this.execError({...res, ErrCode: 'P'})
-            _resolve()
-          }
-        })
-        this.setState({checkParam: null})
       } else {
         this.execError(res)
         _resolve()
@@ -1105,6 +1224,68 @@
    * @description 鍥炶皟璇锋眰寰幆鎵ц
    */
   customCallbackRequest = (params, result, record, _resolve) => {
+    const { btn } = this.props
+
+    let param = null
+
+    if (btn.callbackType === 'script' || btn.callbackType === 'default') {
+      param = this.getCallBackSql(result, record)
+    } else if (btn.callbackType === 'func') {
+      param = {
+        ...result,
+        func: btn.callbackFunc
+      }
+      if (result.$ErrCode === 'E') {
+        delete param.$ErrCode
+        delete param.$ErrMesg
+
+        param.ErrCode = 'E'
+      }
+    } else {
+      if (result.$ErrCode === 'E') {
+        result.status = false
+        result.message = result.$ErrMesg
+        result.ErrCode = 'E'
+        result.ErrMesg = result.$ErrMesg
+      } else {
+        result.status = result.status !== false
+        result.ErrCode = result.ErrCode || '-1'
+      }
+
+      if (result.status) {
+        if (params.length === 0) {
+          this.execSuccess(result)
+          _resolve()
+        } else {
+          this.customLoopRequest(params, _resolve)
+        }
+      } else {
+        this.execError(result)
+        _resolve()
+      }
+
+      return
+    }
+
+    Api.genericInterface(param).then(res => {
+      if (res.status) {
+        if (params.length === 0) {
+          this.execSuccess(res)
+          _resolve()
+        } else {
+          this.customLoopRequest(params, _resolve)
+        }
+      } else {
+        this.execError(res)
+        _resolve()
+      }
+    }, () => {
+      this.updateStatus()
+      _resolve()
+    })
+  }
+
+  getCallBackSql = (result, record) => {
     const { btn } = this.props
     let lines = []
     let pre = btn.callbackType === 'script' ? '@' : ''
@@ -1213,8 +1394,13 @@
         }
       })
 
-      _backCustomScript += `
-        aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
+      if (btn.output) {
+        _backCustomScript += `
+          aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg,${btn.output} as mk_b_id`
+      } else {
+        _backCustomScript += `
+          aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
+      }
 
       let sql = [...lineMap.values()].map(item => (`
         ${item.insert}
@@ -1273,22 +1459,7 @@
       }
     }
 
-    Api.genericInterface(param).then(res => {
-      if (res.status) {
-        if (params.length === 0) {
-          this.execSuccess(res)
-          _resolve()
-        } else {
-          this.customLoopRequest(params, _resolve)
-        }
-      } else {
-        this.execError(res)
-        _resolve()
-      }
-    }, () => {
-      this.updateStatus()
-      _resolve()
-    })
+    return param
   }
 
   /**
@@ -1352,137 +1523,153 @@
   /**
    * @description 澶栭儴璇锋眰寰幆鎵ц
    */
-  outerLoopRequest = (params, btn, _resolve) => {
+  outerLoopRequest = (params, _resolve) => {
     if (!params && params.length === 0) return
 
     let param = params.shift()
-    let _outParam = null
 
     this.setState({
       loadingNumber: params.length
     })
 
-    new Promise(resolve => {
-      // 鍐呴儴璇锋眰
-      if (btn.innerFunc) {
-        param.func = btn.innerFunc
+    let record = {
+      BID: param.BID || '',
+      ID: param.ID || '',
+      callbacksql: param.$callbacksql || ''
+    }
 
-        // 鍑芥暟 s_sDataDictb_TBBack 浜戠楠岃瘉
-        if (window.GLOB.mkHS && param.func === 's_sDataDictb_TBBack' && param.LTextOut) {
-          param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-          param.secretkey = Utils.encrypt(param.LTextOut, param.timestamp)
-          param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
-        }
+    delete param.$callbacksql
 
-        // 瀛樺湪鍐呴儴鍑芥暟鏃讹紝鏁版嵁棰勫鐞�
-        Api.genericInterface(param).then(res => {
-          if (res.status) {
-            delete res.ErrCode
-            delete res.ErrMesg
-            delete res.message
-            delete res.status
+    if (!param.func) {
+      this.outerOuterRequest(params, param, record, _resolve)
+      return
+    }
 
-            // 浣跨敤澶勭悊鍚庣殑鏁版嵁璋冪敤澶栭儴鎺ュ彛
-            let keys = Object.keys(res) // 鎻愪氦澶栭儴鎺ュ彛鍓嶏紝娣诲姞BID
-            if (this.props.BID && keys.filter(key => key.toLowerCase() === 'bid').length === 0) {
-              res.BID = this.props.BID
-            }
-            
-            resolve(res)
-          } else {
-            this.execError(res, btn)
-            resolve(false)
-            _resolve()
-          }
-        }, () => {
-          this.updateStatus()
-          _resolve()
-        })
-      } else {
-        resolve(param)
-      }
-    }).then(res => {
-      if (!res) return
-      // 澶栭儴璇锋眰
-      _outParam = JSON.parse(JSON.stringify(res))
-
-      if (btn.outerFunc) {
-        res.func = btn.outerFunc
-      }
-      if (window.GLOB.mkHS) {
-        if (btn.sysInterface === 'true' && options.cloudServiceApi) {
-          res.rduri = options.cloudServiceApi
-        } else if (btn.sysInterface !== 'true') {
-          if (window.GLOB.systemType === 'production' && btn.proInterface) {
-            res.rduri = btn.proInterface
-          } else {
-            res.rduri = btn.interface
-          }
-        }
-
-        // 鍑芥暟 s_sDataDictb_TBBack 浜戠楠岃瘉
-        if (res.func === 's_sDataDictb_TBBack' && res.LTextOut) {
-          res.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-          res.secretkey = Utils.encrypt(res.LTextOut, res.timestamp)
-          res.open_key = Utils.encryptOpenKey(res.secretkey, res.timestamp)
-        }
-      } else {
-        if (btn.sysInterface === 'true' && window.GLOB.mainSystemApi) {
-          res.rduri = window.GLOB.mainSystemApi
-        } else if (btn.sysInterface !== 'true') {
-          if (window.GLOB.systemType === 'production' && btn.proInterface) {
-            res.rduri = btn.proInterface
-          } else {
-            res.rduri = btn.interface
-          }
-        }
-      }
-
-      return Api.genericInterface(res)
-    }).then(response => {
-      if (!response) return
-      // 鍥炶皟璇锋眰
-      if (btn.callbackFunc) {
-        // 瀛樺湪鍥炶皟鍑芥暟鏃讹紝璋冪敤
-        delete response.message
-        delete response.status
-
-        response.func = btn.callbackFunc
-
-        let _callbackparam = {..._outParam, ...response}
-
-        // 鍑芥暟 s_sDataDictb_TBBack 浜戠楠岃瘉
-        if (window.GLOB.mkHS && _callbackparam.func === 's_sDataDictb_TBBack' && _callbackparam.LTextOut) {
-          _callbackparam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-          _callbackparam.secretkey = Utils.encrypt(_callbackparam.LTextOut, _callbackparam.timestamp)
-          _callbackparam.open_key = Utils.encryptOpenKey(_callbackparam.secretkey, _callbackparam.timestamp)
-        }
-
-        return Api.genericInterface(_callbackparam)
-      } else {
-        if (response.status) {
-          // 涓�娆¤姹傛垚鍔燂紝杩涜涓嬩竴椤硅姹�
-
-          if (params.length === 0) {
-            this.execSuccess(response)
-            _resolve()
-          } else {
-            this.outerLoopRequest(params, btn, _resolve)
-          }
-        } else {
-          this.execError(response)
-          _resolve()
-        }
-      }
-    }).then(res => {
-      if (!res) return
-
+    Api.genericInterface(param).then(res => {
       if (res.status) {
+        if ((res.mk_ex_invoke === 'false' || res.mk_ex_invoke === false) && params.length === 0) {
+          this.execSuccess(res)
+          _resolve()
+        } else if ((res.mk_ex_invoke === 'false' || res.mk_ex_invoke === false) && params.length > 0) {
+          this.outerLoopRequest(params, _resolve)
+        } else {
+          delete res.mk_ex_invoke
+          delete res.ErrCode
+          delete res.ErrMesg
+          delete res.message
+          delete res.status
+
+          // 浣跨敤澶勭悊鍚庣殑鏁版嵁璋冪敤澶栭儴鎺ュ彛
+          let keys = Object.keys(res) // 鎻愪氦澶栭儴鎺ュ彛鍓嶏紝娣诲姞BID
+          if (this.props.BID && keys.filter(key => key.toLowerCase() === 'bid').length === 0) {
+            res.BID = this.props.BID
+          }
+
+          this.outerOuterRequest(params, res, record, _resolve)
+        }
+      } else {
+        this.execError(res)
+        _resolve()
+      }
+    }, () => {
+      this.updateStatus()
+      _resolve()
+    })
+  }
+
+  outerOuterRequest = (params, result, record, _resolve) => {
+    const { btn } = this.props
+    let outParam = JSON.parse(JSON.stringify(result))
+
+    if (btn.outerFunc) {
+      result.func = btn.outerFunc
+    }
+    if (window.GLOB.mkHS) {
+      if (btn.sysInterface === 'true' && options.cloudServiceApi) {
+        result.rduri = options.cloudServiceApi
+      } else if (btn.sysInterface !== 'true') {
+        if (window.GLOB.systemType === 'production' && btn.proInterface) {
+          result.rduri = btn.proInterface
+        } else {
+          result.rduri = btn.interface
+        }
+      }
+
+      // 鍑芥暟 s_sDataDictb_TBBack 浜戠楠岃瘉
+      if (result.func === 's_sDataDictb_TBBack' && result.LTextOut) {
+        result.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+        result.secretkey = Utils.encrypt(result.LTextOut, result.timestamp)
+        result.open_key = Utils.encryptOpenKey(result.secretkey, result.timestamp)
+      }
+    } else {
+      if (btn.sysInterface === 'true' && window.GLOB.mainSystemApi) {
+        result.rduri = window.GLOB.mainSystemApi
+      } else if (btn.sysInterface !== 'true') {
+        if (window.GLOB.systemType === 'production' && btn.proInterface) {
+          result.rduri = btn.proInterface
+        } else {
+          result.rduri = btn.interface
+        }
+      }
+    }
+
+    Api.genericInterface(result).then(res => {
+      this.outerCallbackRequest(params, res, record, outParam, _resolve)
+    }, () => {
+      this.outerCallbackRequest(params, {status: false, message: 500, ErrCode: 'E', ErrMesg: 500}, record, outParam, _resolve)
+    })
+  }
+
+  /**
+   * @description 鍥炶皟璇锋眰寰幆鎵ц
+   */
+  outerCallbackRequest = (params, result, record, outParam, _resolve) => {
+    const { btn } = this.props
+
+    let param = null
+
+    if (btn.callbackType === 'script' || btn.callbackType === 'default') {
+      param = this.getCallBackSql(result, record)
+    } else if (btn.callbackType === 'func' || btn.callbackFunc) {
+      delete result.message
+      delete result.status
+
+      param = {
+        ...outParam,
+        ...result,
+        func: btn.callbackFunc
+      }
+
+      // 鍑芥暟 s_sDataDictb_TBBack 浜戠楠岃瘉
+      if (window.GLOB.mkHS && param.func === 's_sDataDictb_TBBack' && param.LTextOut) {
+        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+        param.secretkey = Utils.encrypt(param.LTextOut, param.timestamp)
+        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
+      }
+    } else {
+      if (result.status) {
+        if (params.length === 0) {
+          this.execSuccess(result)
+          _resolve()
+        } else {
+          this.outerLoopRequest(params, _resolve)
+        }
+      } else {
+        this.execError(result)
+        _resolve()
+      }
+
+      return
+    }
+
+    Api.genericInterface(param).then(res => {
+      if (res.status) {
+        // 涓�娆¤姹傛垚鍔燂紝杩涜涓嬩竴椤硅姹�
         if (params.length === 0) {
           this.execSuccess(res)
           _resolve()
         } else {
-          this.outerLoopRequest(params, btn, _resolve)
+          this.outerLoopRequest(params, _resolve)
         }
       } else {
         this.execError(res)
@@ -1935,17 +2122,6 @@
       let data = this.props.selectedData && this.props.selectedData[0] ? this.props.selectedData[0] : null
       this.setState({check: data && data[btn.field] === btn.openVal})
     }
-  }
-
-  /**
-   * @description 鎸夐挳閰嶇疆淇℃伅閿欒鎻愮ず
-   */
-  actionSettingError = () => {
-    notification.warning({
-      top: 92,
-      message: this.state.dict['main.action.settingerror'],
-      duration: 5
-    })
   }
 
   handleModelConfig = (config) => {
diff --git a/src/tabviews/zshare/fileupload/index.jsx b/src/tabviews/zshare/fileupload/index.jsx
index 637a480..20d0e56 100644
--- a/src/tabviews/zshare/fileupload/index.jsx
+++ b/src/tabviews/zshare/fileupload/index.jsx
@@ -28,7 +28,7 @@
     maxFile: null,
     rduri: '',
     limit: 2,
-    compress: false,
+    compress: 'false',
     fileType: 'text',
     showprogress: false,
     filelist: []
@@ -66,13 +66,12 @@
 
     let accept = ''
     let accepts = null
-    let compress = false
+    let compress = config.compress || 'false'
     let maxFile = config.maxfile && config.maxfile > 0 ? config.maxfile : null
-    if (config.compress === 'true' || config.compress === 'base64') {
-      compress = true
+    if (compress === 'true' || compress === 'base64') {
       accepts = ['.jpg', '.png', '.gif', '.jpeg']
       accept = accepts.join(',')
-      if (config.compress === 'base64') {
+      if (compress === 'base64') {
         maxFile = 1
       }
     } else if (config.suffix) {
@@ -249,7 +248,7 @@
       percent: 0
     })
 
-    if (compress) {
+    if (compress === 'true' || compress === 'base64') {
       let reader = new FileReader()
       let fileSize = file.size / 1024 / 1024
       let compressRate = 0.9
@@ -345,6 +344,35 @@
 
       reader.readAsDataURL(file)
       return false
+    } else if (compress === 'oss') {
+      let _param = new FormData()
+      _param.append('multipartFile', file)
+      _param.append('userId', sessionStorage.getItem('UserID') || '')
+
+      Api.fileOssUpload(_param).then(res => {
+        if (res.status) {
+          if (res.urlPath) {
+            let path = (/^\/\//.test(res.urlPath) ? 'https:' : '') + res.urlPath
+            this.onUpdate(path)
+            this.setState({
+              percent: 100
+            }, () => {
+              setTimeout(() => {
+                this.setState({
+                  showprogress: false,
+                  percent: 0
+                })
+              }, 200)
+            })
+          } else {
+            this.onFail('鏂囦欢涓婁紶澶辫触锛�')
+          }
+        } else {
+          this.onFail(res.message || '鏂囦欢涓婁紶澶辫触锛�')
+        }
+      })
+
+      return false
     }
 
     // 鍏煎鎬х殑澶勭悊
diff --git a/src/tabviews/zshare/mutilform/index.jsx b/src/tabviews/zshare/mutilform/index.jsx
index 1496a1f..ffb77bc 100644
--- a/src/tabviews/zshare/mutilform/index.jsx
+++ b/src/tabviews/zshare/mutilform/index.jsx
@@ -306,10 +306,8 @@
           {
             max: item.fieldlength,
             message: formRule.input.formMessage.replace('@max', item.fieldlength)
-          }
-        ]
-        if (item.encryption !== 'true') {
-          _rules.push({
+          },
+          {
             pattern: /^[^']*$/ig,
             message: '涓嶅彲浣跨敤鑻辨枃鐘舵�佺殑鍗曞紩鍙凤紒'
           }, {
@@ -320,8 +318,8 @@
                 callback()
               }
             }
-          })
-        }
+          }
+        ]
         item.rules = _rules
       } else if (item.type === 'brafteditor') {
         item.rules = [
diff --git a/src/tabviews/zshare/mutilform/mkInput/index.jsx b/src/tabviews/zshare/mutilform/mkInput/index.jsx
index fd313ea..f147110 100644
--- a/src/tabviews/zshare/mutilform/mkInput/index.jsx
+++ b/src/tabviews/zshare/mutilform/mkInput/index.jsx
@@ -1,6 +1,7 @@
 import React, { Component } from 'react'
 import { is, fromJS } from 'immutable'
 import { Input } from 'antd'
+import md5 from 'md5'
 
 import MKEmitter from '@/utils/events.js'
 
@@ -14,9 +15,25 @@
     super(props)
     
     const config = props.config
+    let _value = config.initval
+    let encryption = 'false'
+
+    if (config.encryption === 'true') {
+      encryption = 'true'
+      if (_value) {
+        try {
+          _value = window.decodeURIComponent(window.atob(_value))
+        } catch (e) {
+          _value = config.initval
+        }
+      }
+    } else if (config.encryption === 'md5') {
+      encryption = 'md5'
+    }
     
     this.state = {
-      value: config.initval
+      value: _value,
+      encryption
     }
   }
   
@@ -43,27 +60,55 @@
       this.inputRef.current.select()
     } else if (type === 'input') {
       this.setState({value})
-      this.props.onChange(value, true)
+      let _val = value
+
+      if (this.state.encryption === 'true') {
+        try {
+          _val = window.btoa(window.encodeURIComponent(_val))
+        } catch (e) {
+          _val = value
+        }
+        this.props.onChange(_val)
+      } else if (this.state.encryption === 'md5') {
+        _val = _val + ''
+        _val = md5(_val.toLowerCase())
+        _val = _val.toUpperCase()
+        
+        this.props.onChange(_val)
+      } else {
+        this.props.onChange(_val, true)
+      }
     }
   }
 
   handleChange = (e) => {
     let val = e.target.value
+    let submit = /\n/ig.test(val)
 
-    if (!/\n/ig.test(val)) {
-      this.props.onChange(val)
-      this.setState({value: val})
-      if (!val) {
+    val = val.replace(/\n/ig, '')
+
+    let _val = val
+
+    if (this.state.encryption === 'true') {
+      try {
+        _val = window.btoa(window.encodeURIComponent(_val))
+      } catch (e) {
+        _val = val
+      }
+    } else if (this.state.encryption === 'md5') {
+      _val = md5(_val.toLowerCase())
+      _val = _val.toUpperCase()
+    }
+
+    this.props.onChange(_val)
+
+    this.setState({value: val}, () => {
+      if (submit) {
+        this.handleInputSubmit()
+      } else if (!val) {
         this.inputRef.current.focus()
       }
-    } else {
-      val = val.replace(/\n/ig, '')
-
-      this.props.onChange(val)
-      this.setState({value: val}, () => {
-        this.handleInputSubmit()
-      })
-    }
+    })
   }
 
   handleInputSubmit = () => {
diff --git a/src/tabviews/zshare/mutilform/mkTextArea/index.jsx b/src/tabviews/zshare/mutilform/mkTextArea/index.jsx
index 444d185..90668e5 100644
--- a/src/tabviews/zshare/mutilform/mkTextArea/index.jsx
+++ b/src/tabviews/zshare/mutilform/mkTextArea/index.jsx
@@ -1,6 +1,7 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { Input } from 'antd'
+import md5 from 'md5'
 
 import MKEmitter from '@/utils/events.js'
 
@@ -33,6 +34,8 @@
           _value = config.initval
         }
       }
+    } else if (config.encryption === 'md5') {
+      encryption = 'md5'
     }
     
     this.setState({
@@ -58,7 +61,23 @@
       this.inputRef.current.focus()
     } else if (type === 'input') {
       this.setState({value})
-      this.props.onChange(value, true)
+      let _val = value
+
+      if (this.state.encryption === 'true') {
+        try {
+          _val = window.btoa(window.encodeURIComponent(_val))
+        } catch (e) {
+          _val = value
+        }
+        this.props.onChange(_val)
+      } else if (this.state.encryption === 'md5') {
+        _val = _val + ''
+        _val = md5(_val.toLowerCase())
+        _val = _val.toUpperCase()
+        this.props.onChange(_val)
+      } else {
+        this.props.onChange(_val, true)
+      }
     }
   }
 
@@ -75,7 +94,11 @@
       } catch (e) {
         _val = val
       }
+    } else if (encryption === 'md5') {
+      _val = md5(_val.toLowerCase())
+      _val = _val.toUpperCase()
     }
+
     this.props.onChange(_val)
   }
 
diff --git a/src/templates/formtabconfig/index.jsx b/src/templates/formtabconfig/index.jsx
index c37b457..aef7eda 100644
--- a/src/templates/formtabconfig/index.jsx
+++ b/src/templates/formtabconfig/index.jsx
@@ -1955,7 +1955,7 @@
         <Modal
           title={this.state.dict['model.action'] + '-' + this.state.dict['model.edit']}
           visible={modaltype === 'actionEdit'}
-          width={900}
+          width={920}
           maskClosable={false}
           onCancel={this.editModalCancel}
           footer={[
diff --git a/src/templates/sharecomponent/actioncomponent/actionform/index.jsx b/src/templates/sharecomponent/actioncomponent/actionform/index.jsx
index e244c74..0a94c8d 100644
--- a/src/templates/sharecomponent/actioncomponent/actionform/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/actionform/index.jsx
@@ -149,18 +149,34 @@
       reOptions.intertype = this.state.interTypeOptions
 
       if (intertype === 'custom') {
-        shows.push('procMode', 'interface', 'callbackType', 'cbTable', 'proInterface', 'method', 'cross')
+        shows.push('procMode', 'interface', 'callbackType', 'proInterface', 'method', 'cross')
         if (this.record.procMode === 'system') {
           shows.push('sql', 'sqlType')
-        } else {
+        } else if (this.record.procMode === 'inner') {
           reRequired.innerFunc = true
           shows.push('innerFunc')
+        }
+        if (this.record.callbackType === 'func') {
+          shows.push('callbackFunc')
+        } else if (this.record.callbackType !== 'none') {
+          shows.push('cbTable')
         }
         reReadonly.interface = false
         reRequired.interface = true
       } else if (intertype === 'outer') {
-        shows.push('innerFunc', 'sysInterface', 'interface', 'proInterface', 'outerFunc', 'callbackFunc', 'output')
-        reRequired.innerFunc = false
+        shows.push('procMode', 'sysInterface', 'interface', 'proInterface', 'outerFunc', 'callbackType', 'output')
+        // reRequired.innerFunc = false
+        if (this.record.procMode === 'system') {
+          shows.push('sql', 'sqlType')
+        } else if (this.record.procMode === 'inner') {
+          reRequired.innerFunc = true
+          shows.push('innerFunc')
+        }
+        if (this.record.callbackType === 'func') {
+          shows.push('callbackFunc')
+        } else if (this.record.callbackType !== 'none') {
+          shows.push('cbTable')
+        }
 
         if (this.record.sysInterface === 'false') {
           reReadonly.interface = false
@@ -198,6 +214,7 @@
       if (this.record.intertype === 'outer') {
         shows.push('innerFunc', 'sysInterface', 'interface', 'proInterface', 'outerFunc', 'callbackFunc')
         reRequired.innerFunc = false
+        reRequired.callbackFunc = false
 
         if (this.record.sysInterface === 'false') {
           reReadonly.interface = false
@@ -260,6 +277,7 @@
         if (this.record.intertype === 'outer') {
           shows.push('innerFunc', 'sysInterface', 'interface', 'proInterface', 'outerFunc', 'callbackFunc')
           reRequired.innerFunc = false
+          reRequired.callbackFunc = false
 
           if (this.record.sysInterface === 'false') {
             reReadonly.interface = false
@@ -531,7 +549,7 @@
             { max: formRule.func.max, message: formRule.func.maxMessage }
           )
         } else if (item.key === 'output') {
-          if (this.record.intertype === 'system') {
+          if (this.record.intertype === 'system' || ((this.record.intertype === 'outer' || this.record.intertype === 'custom') && this.record.callbackType === 'script')) {
             rules = [{
               pattern: /^@[0-9a-zA-Z_]+@?$/,
               message: '鍙橀噺浠绗﹀紑澶达紝鍙娇鐢ㄥ瓧姣嶃�佹暟瀛椾互鍙奯'
diff --git a/src/templates/sharecomponent/actioncomponent/actionform/index.scss b/src/templates/sharecomponent/actioncomponent/actionform/index.scss
index fab019a..5e09b99 100644
--- a/src/templates/sharecomponent/actioncomponent/actionform/index.scss
+++ b/src/templates/sharecomponent/actioncomponent/actionform/index.scss
@@ -4,6 +4,11 @@
     color: #1890ff;
     cursor: pointer;
   }
+  >.ant-row >.ant-col {
+    float: none;
+    display: inline-block;
+    vertical-align: top;
+  }
   .textarea {
     .ant-col-sm-7 {
       width: 14%;
diff --git a/src/templates/sharecomponent/actioncomponent/index.jsx b/src/templates/sharecomponent/actioncomponent/index.jsx
index 9e10a8f..2e82251 100644
--- a/src/templates/sharecomponent/actioncomponent/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/index.jsx
@@ -932,7 +932,7 @@
           title={dict['model.action'] + '-' + (card && card.copyType === 'action' ? dict['model.copy'] : dict['model.edit'])}
           wrapClassName="model-table-action-edit-modal"
           visible={visible}
-          width={850}
+          width={920}
           maskClosable={false}
           onCancel={this.editModalCancel}
           footer={[
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
index 50df4a3..5dc137d 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
@@ -161,7 +161,7 @@
           ) :
           (
             <div style={{color: '#26C281'}}>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
@@ -212,7 +212,7 @@
           ) :
           (
             <div style={{color: '#26C281'}}>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
index fa8b86d..489a1b5 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
@@ -161,7 +161,7 @@
           ) :
           (
             <div style={{color: '#26C281'}}>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
diff --git a/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx b/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
index 4dad8fb..0f40714 100644
--- a/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
+++ b/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
@@ -76,7 +76,7 @@
           ) :
           (
             <div style={{color: '#26C281'}}>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
diff --git a/src/templates/zshare/customscript/index.jsx b/src/templates/zshare/customscript/index.jsx
index f68cca2..524e97a 100644
--- a/src/templates/zshare/customscript/index.jsx
+++ b/src/templates/zshare/customscript/index.jsx
@@ -64,7 +64,7 @@
           ) :
           (
             <div style={{color: '#26C281'}}>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
diff --git a/src/templates/zshare/formconfig.jsx b/src/templates/zshare/formconfig.jsx
index 3ad7d6b..0e784c6 100644
--- a/src/templates/zshare/formconfig.jsx
+++ b/src/templates/zshare/formconfig.jsx
@@ -938,6 +938,8 @@
       value: 'equaltab',
       text: '鍒锋柊鍚岀骇鏍囩'
     })
+  } else if (card.execSuccess === 'maingrid') {
+    card.execSuccess = 'grid'
   }
 
   if (card.OpenType === 'blank') {
@@ -945,6 +947,10 @@
   }
   if (!card.control && card.controlField) {
     card.control = 'disabled'
+  }
+
+  if (card.intertype === 'outer' && !card.procMode && !card.innerFunc) { // 鍏煎澶栭儴鍑芥暟鐩翠紶绫诲瀷
+    card.procMode = 'none'
   }
 
   return [
@@ -955,6 +961,14 @@
       initVal: card.OpenType,
       required: true,
       options: opentypes
+    },
+    {
+      type: 'text',
+      key: 'label',
+      label: '鎸夐挳鍚嶇О',
+      initVal: card.label,
+      required: true,
+      readonly: false
     },
     {
       type: 'select',
@@ -1018,7 +1032,8 @@
       type: 'radio',
       key: 'procMode',
       label: '鍙傛暟澶勭悊',
-      initVal: card.procMode || 'system',
+      initVal: card.procMode || (card.innerFunc ? 'inner' : 'system'),
+      tooltip: '褰撹繑鍥炲�煎瓨鍦� mk_ex_invoke 涓斿�间负 false 鏃讹紝涓嶄細璋冪敤澶栭儴鎺ュ彛銆�',
       required: true,
       options: [{
         value: 'system',
@@ -1026,6 +1041,9 @@
       }, {
         value: 'inner',
         text: '鍐呴儴鍑芥暟'
+      }, {
+        value: 'none',
+        text: '鏃�'
       }]
     },
     {
@@ -1035,14 +1053,6 @@
       initVal: card.sqlType || '',
       required: true,
       options: []
-    },
-    {
-      type: 'text',
-      key: 'label',
-      label: '鎸夐挳鍚嶇О',
-      initVal: card.label,
-      required: true,
-      readonly: false
     },
     {
       type: 'text',
@@ -1193,7 +1203,7 @@
       type: 'radio',
       key: 'callbackType',
       label: '鍥炶皟鏂瑰紡',
-      initVal: card.callbackType || 'script',
+      initVal: card.callbackType || (card.callbackFunc ? 'func' : 'script'),
       tooltip: '浣跨敤鍚庡彴鑴氭湰鎵ц鏃讹紝闇�瑕侀厤鍚堣鍒掍换鍔°��',
       required: true,
       options: [{
@@ -1202,6 +1212,12 @@
       }, {
         value: 'default',
         text: '鍚庡彴鑴氭湰'
+      }, {
+        value: 'func',
+        text: '鍥炶皟鍑芥暟'
+      }, {
+        value: 'none',
+        text: '鏃�'
       }]
     },
     {
@@ -1216,7 +1232,7 @@
       key: 'callbackFunc',
       label: Formdict['header.form.callbackFunc'],
       initVal: card.callbackFunc || '',
-      required: false,
+      required: true,
       readonly: false
     },
     {
@@ -2931,7 +2947,7 @@
       type: 'text',
       key: 'separator',
       label: '杩炴帴绗�',
-      initVal: card.separator || card.separator === undefined ? '/' : '',
+      initVal: card.separator === undefined ? '/' : card.separator,
       tooltip: '琛ㄥ崟鎻愪氦鏃朵俊鎭箣闂寸殑杩炴帴绗︺�傛敞锛氳繛鎺ョ涓虹┖鏃讹紝鍒濆鍖栨椂濉厖鍏朵粬琛ㄥ崟鏃犳晥銆�',
       required: false,
       readonly: false
@@ -3267,12 +3283,16 @@
       key: 'encryption',
       label: '鍔犲瘑浼犺緭',
       initVal: card.type === 'brafteditor' ? (card.encryption || 'true') : (card.encryption || 'false'),
+      tooltip: '浣跨敤md5鍔犲瘑鏃讹紝鍔犲瘑鍓嶅唴瀹逛細杞负灏忓啓锛屽姞瀵嗗悗鐨刴d5鍊间负32浣嶅ぇ鍐欍��',
       options: [{
-        value: 'true',
-        text: Formdict['model.true']
-      }, {
         value: 'false',
-        text: Formdict['model.false']
+        text: '鏃�'
+      }, {
+        value: 'true',
+        text: 'base64鍔犲瘑'
+      }, {
+        value: 'md5',
+        text: 'md5鍔犲瘑'
       }]
     },
     {
@@ -3372,13 +3392,16 @@
       tooltip: '鏂囦欢鍘嬬缉鎴朾ase64蹇呴』涓哄浘鐗囷紝鍥剧墖鏍煎紡涓簀pg銆乸ng銆乬if 鎴� jpeg銆傛敞锛歜ase64鍙彲涓婁紶涓�寮犲浘鐗囥��',
       options: [{
         value: 'false',
-        text: '鏃�'
+        text: '榛樿'
       }, {
         value: 'true',
         text: '鍘嬬缉'
       }, {
         value: 'base64',
         text: 'base64'
+      }, {
+        value: 'oss',
+        text: 'oss涓婁紶'
       }]
     },
     {
@@ -3393,6 +3416,90 @@
       required: true
     },
     {
+      type: 'radio',
+      key: 'miniSet',
+      label: '灏忕▼搴忚缃�',
+      initVal: card.miniSet || 'default',
+      options: [{
+        value: 'default',
+        text: '榛樿'
+      }, {
+        value: 'custom',
+        text: '鑷畾涔�'
+      }],
+      forbid: appType !== 'mob'
+    },
+    {
+      type: 'checkbox',
+      key: 'mediaType',
+      label: '鏂囦欢绫诲瀷',
+      initVal: card.mediaType || ['image', 'video'],
+      options: [{
+        value: 'image',
+        text: '鍥剧墖'
+      }, {
+        value: 'video',
+        text: '瑙嗛'
+      }],
+      required: true,
+      forbid: appType !== 'mob'
+    },
+    {
+      type: 'checkbox',
+      key: 'sourceType',
+      label: '鏂囦欢鏉ユ簮',
+      initVal: card.sourceType || ['album', 'camera'],
+      options: [{
+        value: 'album',
+        text: '鐩稿唽閫夋嫨'
+      }, {
+        value: 'camera',
+        text: '鐩告満鎷嶆憚'
+      }],
+      required: true,
+      forbid: appType !== 'mob'
+    },
+    {
+      type: 'radio',
+      key: 'sizeType',
+      label: '鍥剧墖鍘嬬缉',
+      initVal: card.sizeType || 'compressed',
+      options: [{
+        value: 'compressed',
+        text: '鏄�'
+      }, {
+        value: 'original',
+        text: '鍚�'
+      }],
+      forbid: appType !== 'mob'
+    },
+    {
+      type: 'number',
+      key: 'maxDuration',
+      label: '鎷嶆憚鏃堕暱',
+      initVal: card.maxDuration || 10,
+      tooltip: '鎷嶆憚瑙嗛鏈�闀挎媿鎽勬椂闂达紝鍗曚綅绉掋�傛椂闂磋寖鍥翠负 3s 鑷� 60s 涔嬮棿銆備笉闄愬埗鐩稿唽銆�',
+      min: 3,
+      max: 60,
+      precision: 0,
+      required: true,
+      forbid: appType !== 'mob'
+    },
+    {
+      type: 'radio',
+      key: 'camera',
+      label: '鎽勫儚澶�',
+      initVal: card.camera || 'back',
+      options: [{
+        value: 'back',
+        text: '鍚庣疆'
+      }, {
+        value: 'front',
+        text: '鍓嶇疆'
+      }],
+      forbid: appType !== 'mob'
+    },
+    {
       type: 'number',
       key: 'span',
       min: 1,
diff --git a/src/templates/zshare/modalform/index.jsx b/src/templates/zshare/modalform/index.jsx
index da963fa..08bcdb9 100644
--- a/src/templates/zshare/modalform/index.jsx
+++ b/src/templates/zshare/modalform/index.jsx
@@ -1,7 +1,7 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { fromJS } from 'immutable'
-import { Form, Row, Col, Input, Select, Radio, notification, InputNumber, Tooltip } from 'antd'
+import { Form, Row, Col, Input, Select, Radio, notification, InputNumber, Tooltip, Checkbox } from 'antd'
 import { QuestionCircleOutlined } from '@ant-design/icons'
 
 import { formRule } from '@/utils/option.js'
@@ -19,7 +19,7 @@
 const MkEditIcon = asyncComponent(() => import('@/components/mkIcon'))
 
 const modalTypeOptions = {
-  text: ['initval', 'readonly', 'required', 'hidden', 'readin', 'fieldlength', 'regular', 'interception', 'span', 'labelwidth', 'tooltip', 'extra', 'enter', 'cursor', 'scan', 'splitline', 'placeholder', 'place', 'marginTop', 'marginBottom', 'lenControl'],
+  text: ['initval', 'readonly', 'required', 'hidden', 'readin', 'fieldlength', 'regular', 'interception', 'span', 'labelwidth', 'encryption', 'tooltip', 'extra', 'enter', 'cursor', 'scan', 'splitline', 'placeholder', 'place', 'marginTop', 'marginBottom', 'lenControl'],
   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', 'emptyText', 'enter', 'splitline', 'dropdown', 'marginTop', 'marginBottom'],
   checkbox: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'fieldlength', 'span', 'labelwidth', 'tooltip', 'extra', 'splitline', 'arrange', 'marginTop', 'marginBottom'],
@@ -27,12 +27,12 @@
   checkcard: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'span', 'labelwidth', 'display', 'tooltip', 'extra', 'width', 'multiple', 'splitline', 'marginTop', 'marginBottom'],
   multiselect: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'fieldlength', 'span', 'labelwidth', 'tooltip', 'extra', 'marginTop', 'marginBottom'],
   link: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'declare', 'setAll', 'linkField', 'linkSubField', 'span', 'labelwidth', 'tooltip', 'extra', 'emptyText', 'enter', 'splitline', 'dropdown', 'marginTop', 'marginBottom'],
-  fileupload: ['readonly', 'required', 'readin', 'fieldlength', 'maxfile', 'fileType', 'span', 'labelwidth', 'tooltip', 'extra', 'compress', 'splitline', 'marginTop', 'marginBottom'],
+  fileupload: ['readonly', 'required', 'readin', 'fieldlength', 'maxfile', 'fileType', 'span', 'labelwidth', 'tooltip', 'extra', 'compress', 'miniSet', 'splitline', 'marginTop', 'marginBottom'],
   switch: ['initval', 'openVal', 'closeVal', 'openText', 'closeText', 'readonly', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra', 'splitline', 'marginTop', 'marginBottom'],
   date: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra', 'declareType', 'mode', 'splitline', 'marginTop', 'marginBottom', 'minDate', 'maxDate', 'precision'],
   datemonth: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra', 'declareType', 'splitline', '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', 'enterReplace'],
+  textarea: ['initval', 'readonly', 'required', 'hidden', 'readin', 'fieldlength', 'span', 'labelwidth', 'maxRows', 'encryption', 'interception', 'tooltip', 'extra', 'count', 'placeholder', 'marginTop', 'marginBottom'],
   cascader: ['readonly', 'required', 'hidden', 'readin', 'resourceType', 'fieldlength', 'span', 'labelwidth', 'tooltip', 'extra', 'splitline', 'marginTop', 'marginBottom', 'separator'],
   color: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra', 'marginTop', 'marginBottom'],
   rate: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'splitline', 'tooltip', 'extra', 'marginTop', 'marginBottom', 'allowHalf', 'rateCount', 'character', 'place'],
@@ -230,8 +230,25 @@
     } else if (type === 'fileupload') {
       if (this.record.compress === 'true') {
         shows.push('limit', 'rduri', 'proRduri')
-      } else {
+      } else if (this.record.compress !== 'base64') {
         shows.push('suffix')
+      }
+      if (this.record.miniSet === 'custom') {
+        shows.push('mediaType', 'sourceType')
+
+        if (this.record.sourceType.includes('camera') && this.record.mediaType.includes('video')) {
+          shows.push('maxDuration')
+        }
+        if (this.record.mediaType.includes('image')) {
+          shows.push('sizeType')
+        }
+        if (this.record.sourceType.includes('camera')) {
+          shows.push('camera')
+        }
+      }
+    } else if (type === 'textarea') {
+      if (this.record.encryption === 'false') {
+        shows.push('enterReplace')
       }
     }
 
@@ -262,6 +279,27 @@
       }, {
         value: '1',
         text: '鏁版嵁婧�'
+      }]
+    }
+
+    if (type === 'brafteditor') {
+      reOptions.encryption = [{
+        value: 'false',
+        text: '鏃�'
+      }, {
+        value: 'true',
+        text: 'base64鍔犲瘑'
+      }]
+    } else {
+      reOptions.encryption = [{
+        value: 'false',
+        text: '鏃�'
+      }, {
+        value: 'true',
+        text: 'base64鍔犲瘑'
+      }, {
+        value: 'md5',
+        text: 'md5鍔犲瘑'
       }]
     }
 
@@ -613,6 +651,15 @@
             )
           })}
         </Radio.Group>
+      } else if (item.type === 'checkbox') {
+        rules = [
+          { required: item.required, message: dict['form.required.select'] + item.label + '!' }
+        ]
+        initVal = item.initVal
+
+        content = <Checkbox.Group onChange={(values) => {this.optionChange(item.key, values)}}>
+          {item.options.map(option => <Checkbox key={option.value} value={option.value}>{option.text}</Checkbox>)}
+        </Checkbox.Group>
       } else if (item.type === 'codemirror') {
         rules = [
           { required: item.required, message: dict['form.required.input'] + item.label + '!' }
diff --git a/src/templates/zshare/verifycard/customscript/index.jsx b/src/templates/zshare/verifycard/customscript/index.jsx
index 9deb26b..2211b58 100644
--- a/src/templates/zshare/verifycard/customscript/index.jsx
+++ b/src/templates/zshare/verifycard/customscript/index.jsx
@@ -325,7 +325,7 @@
           </Col>
           <Col span={24} className="sql">
             <Form.Item label={
-              <Tooltip placement="topLeft" title={'鏁版嵁妫�鏌ユ浛鎹㈢ $check@ -> \'\'銆� @check$ -> \'\'锛孍rrorCode绛変簬C鏃� $check@ -> /*銆� @check$ -> */'}>
+              <Tooltip placement="topLeft" title={'鏁版嵁妫�鏌ユ浛鎹㈢ $check@ -> \'\'銆� @check$ -> \'\'锛孍rrorCode绛変簬C鏃� $check@ -> /*銆� @check$ -> */銆傛敞锛�1銆侀渶浣跨敤绯荤粺鎺ュ彛 2銆佽璁剧疆涓衡�滈�夋嫨澶氳鈥濇椂鏃犳晥銆�'}>
                 <QuestionCircleOutlined className="mk-form-tip" />
                 sql
               </Tooltip>
diff --git a/src/templates/zshare/verifycard/index.jsx b/src/templates/zshare/verifycard/index.jsx
index 0ae5a3a..9b40df1 100644
--- a/src/templates/zshare/verifycard/index.jsx
+++ b/src/templates/zshare/verifycard/index.jsx
@@ -114,7 +114,7 @@
           ) :
           (
             <div style={{color: '#26C281'}}>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
@@ -150,7 +150,7 @@
           ) :
           (
             <div style={{color: '#26C281'}}>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
@@ -224,7 +224,7 @@
           ) :
           (
             <div style={{color: '#26C281'}}>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
@@ -276,7 +276,7 @@
           ) :
           (
             <div style={{color: '#26C281'}}>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
@@ -345,7 +345,7 @@
           ) :
           (
             <div style={{color: '#26C281'}}>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
@@ -412,7 +412,7 @@
           ) :
           (
             <div style={{color: '#26C281'}}>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
@@ -513,7 +513,7 @@
           ) :
           (
             <div style={{color: '#26C281'}}>
-              {this.props.dict['model.status.open']}
+              鍚敤
               <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
@@ -594,17 +594,22 @@
       item.$index = i + 1
     })
 
-    let verifyInter = card.intertype === 'system' || (card.intertype === 'custom' && card.procMode === 'system') ? 'system' : 'inner'
+    let verifyInter = card.intertype === 'system' || card.procMode === 'system' ? 'system' : 'inner'
+    let activeKey = verifyInter === 'system' || card.intertype === 'inner' ? 'base' : 'tip'
+
+    if (card.callbackType === 'script') {
+      activeKey = 'cbScripts'
+    }
 
     this.setState({
-      activeKey: verifyInter === 'system' || card.intertype === 'inner' ? 'base' : 'tip',
+      activeKey: activeKey,
       verifyInter: verifyInter,
       setting: config.setting || {},
       verify: _verify,
       oriVerify: fromJS(_verify).toJS()
     })
 
-    if (config.Template !== 'FormTab' && (card.intertype === 'inner' || card.intertype === 'outer')) { // 鍐呴儴鎴栧閮ㄦ帴鍙�
+    if (config.Template !== 'FormTab' && card.intertype === 'inner') {
       return
     }
 
@@ -1613,7 +1618,7 @@
             />
             <EditTable actions={['move']} data={verify.scripts} columns={scriptsColumns} onChange={(scripts) => {this.setState({verify: {...verify, scripts}})}}/>
           </TabPane> : null}
-          {card.callbackType === 'script' && card.intertype === 'custom' ? <TabPane tab={
+          {card.callbackType === 'script' ? <TabPane tab={
             <span>
               鍥炶皟鑴氭湰
               {verify.cbScripts.length ? <span className="count-tip">{verify.cbScripts.length}</span> : null}
diff --git a/src/utils/utils-datamanage.js b/src/utils/utils-datamanage.js
index a7411ae..0b94159 100644
--- a/src/utils/utils-datamanage.js
+++ b/src/utils/utils-datamanage.js
@@ -78,7 +78,7 @@
   }
 
   /**
-   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼ sPC_Get_TableData 鐨勫弬鏁�
+   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼鐨勫弬鏁�
    */
   static getDefaultQueryParam (setting, arrFields, search, orderBy, pageIndex, pageSize, id, BID) {
     let param = {
@@ -127,7 +127,6 @@
     _customScript = _customScript.replace(/\$sum@/ig, '/*')
     _customScript = _customScript.replace(/@sum\$/ig, '*/')
 
-    let time_id = Utils.getguid().substring(0, 32) || ''
     _dataresource = _dataresource.replace(/@ID@/ig, `''`)
     _customScript = _customScript.replace(/@ID@/ig, `''`)
     _dataresource = _dataresource.replace(/@BID@/ig, `'${BID || ''}'`)
@@ -140,8 +139,6 @@
     _customScript = _customScript.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
     _dataresource = _dataresource.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
     _customScript = _customScript.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
-    _dataresource = _dataresource.replace(/@time_id@/ig, `'${time_id}'`)
-    _customScript = _customScript.replace(/@time_id@/ig, `'${time_id}'`)
 
     let regoptions = null
     if (setting.queryType === 'statistics' || _customScript) {
@@ -270,7 +267,7 @@
   }
 
   /**
-   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼ sPC_Get_TableData 鍚堣鍊肩殑鍙傛暟
+   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼鍚堣鍊肩殑鍙傛暟
    */
   static getStatQueryDataParams (setting, statFields, search, orderBy, BID) {
     let param = {
@@ -318,7 +315,6 @@
     _customScript = _customScript.replace(/\$select@/ig, '/*')
     _customScript = _customScript.replace(/@select\$/ig, '*/')
 
-    let time_id = Utils.getguid().substring(0, 32) || ''
     _dataresource = _dataresource.replace(/@ID@/ig, `''`)
     _customScript = _customScript.replace(/@ID@/ig, `''`)
     _dataresource = _dataresource.replace(/@BID@/ig, `'${BID || ''}'`)
@@ -331,8 +327,6 @@
     _customScript = _customScript.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
     _dataresource = _dataresource.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
     _customScript = _customScript.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
-    _dataresource = _dataresource.replace(/@time_id@/ig, `'${time_id}'`)
-    _customScript = _customScript.replace(/@time_id@/ig, `'${time_id}'`)
 
     let regoptions = null
     if (setting.queryType === 'statistics' || _customScript) {
@@ -515,7 +509,6 @@
       sql = sql.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
       sql = sql.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
       sql = sql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
-      sql = sql.replace(/@time_id@/ig, `'${Utils.getguid().substring(0, 32) || ''}'`)
 
       // 娴嬭瘯绯荤粺鎵撳嵃鏌ヨ璇彞
       if (window.GLOB.debugger === true || (window.debugger === true && options.sysType !== 'cloud')) {
@@ -604,7 +597,6 @@
     sql = sql.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
     sql = sql.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
     sql = sql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
-    sql = sql.replace(/@time_id@/ig, `'${Utils.getguid().substring(0, 32) || ''}'`)
 
     if (window.GLOB.debugger === true || (window.debugger === true && options.sysType !== 'cloud')) {
       console.info(sql.replace(/\n\s{8}/ig, '\n'))
@@ -616,6 +608,14 @@
     param.secretkey = Utils.encrypt('', param.timestamp)
     param.LText = Utils.formatOptions(param.LText)
     param.menuname = setting.MenuName || ''
+
+    if (BID) {
+      param.BID = BID
+    }
+
+    if (window.GLOB.mkHS) { // 绯荤粺鍑芥暟浜戠楠岃瘉
+      param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
+    }
 
     return param
   }
@@ -783,7 +783,6 @@
   let LText_field = []
   let diffUser = false
   let transaction = false
-  let time_id = Utils.getguid().substring(0, 32) || ''
   let loginId = `'${sessionStorage.getItem('LoginUID') || ''}'`
   let sessionId = `'${localStorage.getItem('SessionUid') || ''}'`
   let userId = `'${sessionStorage.getItem('UserID') || ''}'`
@@ -811,8 +810,6 @@
     _script = _script.replace(/@UserID@/ig, userId)
     _sql = _sql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
     _script = _script.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
-    _sql = _sql.replace(/@time_id@/ig, `'${time_id}'`)
-    _script = _script.replace(/@time_id@/ig, `'${time_id}'`)
 
     // 娴嬭瘯绯荤粺鎵撳嵃鏌ヨ璇彞
     if (window.GLOB.debugger === true || (window.debugger === true && options.sysType !== 'cloud')) {
diff --git a/src/utils/utils.js b/src/utils/utils.js
index a15f80a..3ceef58 100644
--- a/src/utils/utils.js
+++ b/src/utils/utils.js
@@ -2082,21 +2082,12 @@
       aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
   }
 
-  let time_id = []
-  let options = '0123456789abcdefghigklmnopqrstuv'
-  for (let i = 0; i < 15; i++) {
-    time_id.push(options.substr(Math.floor(Math.random() * 0x20), 1))
-  }
-  time_id = moment().format('YYYYMMDDHHmmssSSS') + time_id.join('')
-  time_id = time_id.toUpperCase()
-
   _sql = _sql.replace(/@ID@/ig, `'${primaryId || ''}'`)
   _sql = _sql.replace(/@BID@/ig, `'${BID || ''}'`)
   _sql = _sql.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
   _sql = _sql.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
   _sql = _sql.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
   _sql = _sql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
-  _sql = _sql.replace(/@time_id@/ig, `'${time_id}'`)
 
   if (window.GLOB.debugger === true || (window.debugger === true && options.sysType !== 'cloud')) {
     // _sql = _sql.replace(/\n\s{8}/ig, '\n')
diff --git a/src/views/design/header/index.jsx b/src/views/design/header/index.jsx
index eac3170..cef0467 100644
--- a/src/views/design/header/index.jsx
+++ b/src/views/design/header/index.jsx
@@ -2,7 +2,7 @@
 import { withRouter } from 'react-router-dom'
 import {connect} from 'react-redux'
 import { Dropdown, Menu, Modal, notification, Switch, Button, Popover } from 'antd'
-import { MenuFoldOutlined, SettingOutlined, AppstoreOutlined, DownOutlined, HomeOutlined, ApiOutlined, PlusOutlined, SwapOutlined, MenuOutlined } from '@ant-design/icons'
+import { MenuFoldOutlined, SettingOutlined, AppstoreOutlined, DownOutlined, HomeOutlined, ApiOutlined, PlusOutlined, EditOutlined, MenuOutlined } from '@ant-design/icons'
 
 import asyncComponent from '@/utils/asyncComponent'
 import {
@@ -340,7 +340,7 @@
         {!editLevel && window.GLOB.systemType !== 'production' && menulist ? <Popover overlayClassName="mk-popover-control-wrap mk-menu-control" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
           <div className="mk-popover-control">
             <PlusOutlined onClick={() => this.setState({visible: true, loading: false})}/>
-            <SwapOutlined onClick={this.enterEdit}/>
+            <EditOutlined onClick={this.enterEdit}/>
             <div style={{display: 'inline-block', minWidth: '32px'}}><ThawMenu ParentId="0" Type="10"/></div>
           </div>
         } trigger="hover">
diff --git a/src/views/design/index.jsx b/src/views/design/index.jsx
index d596e2f..2356a2a 100644
--- a/src/views/design/index.jsx
+++ b/src/views/design/index.jsx
@@ -22,8 +22,7 @@
     if (window.GLOB.systemType !== 'production' && window.GLOB.WXAppID && !sessionStorage.getItem('wxTemplates')) {
       Api.wxAccessToken().then(res => {
         let wxtoken = res.oa_access_token || ''
-        wxtoken = '59_DH0hrAp0B8jtdJvU-7BV_-nG01qh2rUU1L8ihj-2pMWlUFLE2eEtVv4zZYAUIKcxCit4SgOTwxvUGdYHltaha3RmgnZqkQSgkxXRm9hz18kGbGhMc5r11W5Iv9Xr50Pz-Sz7FUVHCM-6GZLXJPIjAIAVBU'
-        let minitoken = res.mini_access_token || ''
+        // let minitoken = res.mini_access_token || ''
   
         if (wxtoken) {
           Api.wxNginxRequest(`cgi-bin/template/get_all_private_template?access_token=${wxtoken}`, 'get').then(res => {
@@ -37,17 +36,17 @@
         } else {
           sessionStorage.setItem('wxTemplates', JSON.stringify([]))
         }
-        if (minitoken) {
-          Api.wxNginxRequest(`wxaapi/newtmpl/gettemplate?access_token=${minitoken}`, 'get').then(res => {
-            if (res.errmsg === 'ok' && res.data) {
-              sessionStorage.setItem('wxMiniTemplates', JSON.stringify(res.data))
-            } else {
-              sessionStorage.setItem('wxMiniTemplates', JSON.stringify([]))
-            }
-          })
-        } else {
-          sessionStorage.setItem('wxMiniTemplates', JSON.stringify([]))
-        }
+        // if (minitoken) {
+        //   Api.wxNginxRequest(`wxaapi/newtmpl/gettemplate?access_token=${minitoken}`, 'get').then(res => {
+        //     if (res.errmsg === 'ok' && res.data) {
+        //       sessionStorage.setItem('wxMiniTemplates', JSON.stringify(res.data))
+        //     } else {
+        //       sessionStorage.setItem('wxMiniTemplates', JSON.stringify([]))
+        //     }
+        //   })
+        // } else {
+        //   sessionStorage.setItem('wxMiniTemplates', JSON.stringify([]))
+        // }
       })
     }
   }
diff --git a/src/views/design/index.scss b/src/views/design/index.scss
index 1c544d6..037cdcb 100644
--- a/src/views/design/index.scss
+++ b/src/views/design/index.scss
@@ -25,13 +25,10 @@
   .anticon-plus {
     color: #26C281;
   }
-  .anticon-swap {
+  .anticon-edit {
     position: relative;
     z-index: 2;
     color: #1890ff;
-  }
-  .mk-swap {
-    transform: rotate(90deg);
   }
   .mk-swap.disabled {
     cursor: not-allowed!important;
diff --git a/src/views/design/sidemenu/index.jsx b/src/views/design/sidemenu/index.jsx
index f46de51..4c68f48 100644
--- a/src/views/design/sidemenu/index.jsx
+++ b/src/views/design/sidemenu/index.jsx
@@ -2,7 +2,7 @@
 import { connect } from 'react-redux'
 import { is, fromJS } from 'immutable'
 import { Menu, Popover, Modal, notification } from 'antd'
-import { SwapOutlined, PlusOutlined, SettingOutlined } from '@ant-design/icons'
+import { EditOutlined, PlusOutlined, SettingOutlined } from '@ant-design/icons'
 import moment from 'moment'
 
 import asyncComponent from '@/utils/asyncComponent'
@@ -282,7 +282,7 @@
             <Popover overlayClassName="mk-popover-control-wrap mk-menu-control" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
               <div className="mk-popover-control">
                 <PlusOutlined onClick={this.addSecMenu}/>
-                <SwapOutlined onClick={this.enterSubEdit} className={'mk-swap' + (mainMenu.children.length === 0 ? ' disabled' : '')}/>
+                <EditOutlined onClick={this.enterSubEdit} className={'mk-swap' + (mainMenu.children.length === 0 ? ' disabled' : '')}/>
                 <div style={{display: 'inline-block', minWidth: '32px'}}><ThawMenu ParentId={mainMenu.MenuID} Type="20"/></div>
               </div>
             } trigger="hover" placement="top">
@@ -304,7 +304,7 @@
                   <Popover overlayClassName="mk-popover-control-wrap mk-menu-control" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
                     <div className="mk-popover-control">
                       <div style={{display: 'inline-block', minWidth: '32px'}}><AddThdMenu mainMenu={mainMenu} supMenu={item} menuTree={this.props.menuTree}/></div>
-                      <SwapOutlined onClick={(e) => {this.enterThrEdit(e, item)}} className="mk-swap"/>
+                      <EditOutlined onClick={(e) => {this.enterThrEdit(e, item)}} className="mk-swap"/>
                       <div style={{display: 'inline-block', minWidth: '32px'}}><ThawMenu ParentId={item.MenuID} Type="30"/></div>
                     </div>
                   } trigger="hover" placement="top">
diff --git a/src/views/imdesign/index.jsx b/src/views/imdesign/index.jsx
index d0ee0c7..15ee914 100644
--- a/src/views/imdesign/index.jsx
+++ b/src/views/imdesign/index.jsx
@@ -485,7 +485,7 @@
             <div className="pc-setting-tools">
               <Collapse accordion defaultActiveKey="basedata" bordered={false}>
                 {/* 鍩烘湰淇℃伅 */}
-                <Panel header={dict['mob.basemsg']} forceRender key="basedata">
+                <Panel header="鍩烘湰淇℃伅" forceRender key="basedata">
                   {/* 鑿滃崟淇℃伅 */}
                   {config ? <MenuForm
                     dict={dict}
diff --git a/src/views/menudesign/index.jsx b/src/views/menudesign/index.jsx
index 0f24503..4d65fa0 100644
--- a/src/views/menudesign/index.jsx
+++ b/src/views/menudesign/index.jsx
@@ -1,5 +1,6 @@
 import React, { Component } from 'react'
 import { DndProvider } from 'react-dnd'
+import { withRouter } from 'react-router'
 import { is, fromJS } from 'immutable'
 import moment from 'moment'
 import HTML5Backend from 'react-dnd-html5-backend'
@@ -12,7 +13,7 @@
 import Utils, { setGLOBFuncs } from '@/utils/utils.js'
 import zhCN from '@/locales/zh-CN/mob.js'
 import enUS from '@/locales/en-US/mob.js'
-import antdEnUS from 'antd/es/locale/en_US'
+// import antdEnUS from 'antd/es/locale/en_US'
 import antdZhCN from 'antd/es/locale/zh_CN'
 import MKEmitter from '@/utils/events.js'
 import MenuUtils from '@/utils/utils-custom.js'
@@ -23,7 +24,7 @@
 const { Panel } = Collapse
 const { confirm } = Modal
 const { Paragraph } = Typography
-const _locale = sessionStorage.getItem('lang') !== 'en-US' ? antdZhCN : antdEnUS
+const _locale = antdZhCN
 
 const MenuForm = asyncComponent(() => import('./menuform'))
 const HomeForm = asyncComponent(() => import('./homeform'))
@@ -31,10 +32,8 @@
 const MenuShell = asyncComponent(() => import('@/menu/menushell'))
 const PrintMenuForm = asyncComponent(() => import('./printmenuform'))
 const SourceWrap = asyncComponent(() => import('@/menu/modulesource'))
-const PopviewController = asyncComponent(() => import('@/menu/popview'))
-const BgController = asyncComponent(() => import('@/menu/bgcontroller'))
+const BgController = asyncComponent(() => import('@/pc/bgcontroller'))
 const PasteController = asyncComponent(() => import('@/menu/pastecontroller'))
-const PaddingController = asyncComponent(() => import('@/menu/padcontroller'))
 const StyleController = asyncComponent(() => import('@/menu/stylecontroller'))
 const ReplaceField = asyncComponent(() => import('@/menu/replaceField'))
 const Versions = asyncComponent(() => import('@/menu/versions'))
@@ -47,13 +46,8 @@
 const TableComponent = asyncComponent(() => import('@/templates/sharecomponent/tablecomponent'))
 
 sessionStorage.setItem('isEditState', 'true')
-sessionStorage.setItem('editMenuType', 'menu') // 缂栬緫鑿滃崟绫诲瀷
 sessionStorage.setItem('appType', '')          // 搴旂敤绫诲瀷
 document.body.className = ''
-window.GLOB.UserComponentMap = new Map() // 缂撳瓨鐢ㄦ埛鑷畾涔夌粍浠�
-window.GLOB.TabsMap = new Map()          // 缂撳瓨鐢ㄦ埛鎿嶄綔鐨勬爣绛鹃〉
-window.GLOB.urlFields = []               // url鍙橀噺
-window.GLOB.customMenu = null            // 淇濆瓨鑿滃崟淇℃伅
 
 class MenuDesign extends Component {
   state = {
@@ -65,13 +59,10 @@
     MenuNo: '',
     delButtons: [],
     copyButtons: [],
-    thawButtons: [],
     activeKey: 'basedata',
     menuloading: false,
     oriConfig: null,
     config: null,
-    popBtn: null,             // 寮圭獥鏍囩椤�
-    visible: false,
     customComponents: [],
     comloading: false,
     settingshow: true,
@@ -80,6 +71,13 @@
   }
 
   UNSAFE_componentWillMount() {
+    sessionStorage.setItem('editMenuType', 'menu') // 缂栬緫鑿滃崟绫诲瀷
+
+    window.GLOB.UserComponentMap = new Map() // 缂撳瓨鐢ㄦ埛鑷畾涔夌粍浠�
+    window.GLOB.TabsMap = new Map()          // 缂撳瓨鐢ㄦ埛鎿嶄綔鐨勬爣绛鹃〉
+    window.GLOB.urlFields = []               // url鍙橀噺
+    window.GLOB.customMenu = null            // 淇濆瓨鑿滃崟淇℃伅
+
     try {
       let param = JSON.parse(window.decodeURIComponent(window.atob(this.props.match.params.param)))
 
@@ -108,16 +106,24 @@
   componentDidMount () {
     MKEmitter.addListener('delButtons', this.delButtons)
     MKEmitter.addListener('modalStatus', this.modalStatus)
-    MKEmitter.addListener('thawButtons', this.thawButtons)
+    // MKEmitter.addListener('thawButtons', this.thawButtons)
     MKEmitter.addListener('copyButtons', this.copyButtons)
     MKEmitter.addListener('changePopview', this.initPopview)
     MKEmitter.addListener('triggerMenuSave', this.triggerMenuSave)
     MKEmitter.addListener('submitComponentStyle', this.updateComponentStyle)
     MKEmitter.addListener('updateCustomComponent', this.updateCustomComponent)
     setTimeout(() => {
-      this.updateCustomComponent()
+      if (sessionStorage.getItem('app_custom_components')) {
+        let list = sessionStorage.getItem('app_custom_components')
+        list = JSON.parse(list)
+
+        this.setCustomComponent(list)
+      } else {
+        this.updateCustomComponent()
+      }
       this.getAppPictures()
       this.getPrintTemp()
+      this.getRoleFields()
       setGLOBFuncs()
     }, 1000)
 
@@ -151,9 +157,6 @@
 
         let node = document.getElementById('save-modal-config')
         if (!node) {
-          node = document.getElementById('save-pop-config')
-        }
-        if (!node) {
           node = document.getElementById('save-config')
         }
 
@@ -174,7 +177,7 @@
     }
     MKEmitter.removeListener('delButtons', this.delButtons)
     MKEmitter.removeListener('modalStatus', this.modalStatus)
-    MKEmitter.removeListener('thawButtons', this.thawButtons)
+    // MKEmitter.removeListener('thawButtons', this.thawButtons)
     MKEmitter.removeListener('copyButtons', this.copyButtons)
     MKEmitter.removeListener('changePopview', this.initPopview)
     MKEmitter.removeListener('triggerMenuSave', this.triggerMenuSave)
@@ -187,8 +190,6 @@
   }
 
   triggerMenuSave = () => {
-    if (this.state.visible) return
-
     this.submitConfig()
   }
 
@@ -281,36 +282,46 @@
       typename: '',
       typecharone: ''
     }).then(res => {
-      let coms = []
-      if (res.cus_list && res.cus_list.length > 0) {
-        res.cus_list.forEach(item => {
-          let config = ''
-
-          try {
-            config = JSON.parse(window.decodeURIComponent(window.atob(item.long_param)))
-          } catch (e) {
-            console.warn('Parse Failure')
-            config = ''
-          }
-
-          if (!config || !item.c_name) return
-
-          window.GLOB.UserComponentMap.set(item.c_id, item.c_name)
-          coms.push({
-            uuid: item.c_id,
-            type: 'menu',
-            title: item.c_name,
-            url: item.images,
-            component: config.type,
-            subtype: config.subtype,
-            width: config.width || 24,
-            config
-          })
+      if (!res.status) {
+        notification.warning({
+          top: 92,
+          message: res.message,
+          duration: 5
         })
+      } else if (res.cus_list) {
+        sessionStorage.setItem('app_custom_components', JSON.stringify(res.cus_list))
+        this.setCustomComponent(res.cus_list)
       }
-      this.setState({customComponents: coms})
-      this.getRoleFields()
     })
+  }
+
+  setCustomComponent = (cus_list) => {
+    let coms = []
+
+    cus_list.forEach(item => {
+      let config = ''
+
+      try {
+        config = JSON.parse(window.decodeURIComponent(window.atob(item.long_param)))
+      } catch (e) {
+        console.warn('Parse Failure')
+        config = ''
+      }
+
+      if (!config || !item.c_name) return
+
+      window.GLOB.UserComponentMap.set(item.c_id, item.c_name)
+      coms.push({
+        uuid: item.c_id,
+        type: 'menu',
+        title: item.c_name,
+        url: item.images,
+        component: config.type,
+        subtype: config.subtype,
+        config
+      })
+    })
+    this.setState({customComponents: coms})
   }
 
   updateComponentStyle = (parentId, keys, style) => {
@@ -343,9 +354,9 @@
     this.setState({copyButtons: [...this.state.copyButtons, ...items]})
   }
   
-  thawButtons = (item) => {
-    this.setState({thawButtons: [...this.state.thawButtons, item]})
-  }
+  // thawButtons = (item) => {
+  //   this.setState({thawButtons: [...this.state.thawButtons, item]})
+  // }
 
   initPopview = (card, btn) => {
     const { oriConfig, config } = this.state
@@ -359,20 +370,11 @@
       return
     }
 
-    btn.config = fromJS(config).toJS()
-    btn.component = card
+    let _btn = fromJS(btn).toJS()
+    _btn.MenuName = config.MenuName + '-' + card.name + '-' + btn.label
+    _btn.ParentMenuID = config.uuid
 
-    sessionStorage.setItem('editMenuType', 'popview') // 缂栬緫寮圭獥鏍囩
-
-    this.setState({popBtn: btn, visible: true})
-  }
-
-  handleBack = () => {
-    this.setState({popBtn: null, delButtons: [], copyButtons: []}, () => {
-      sessionStorage.setItem('editMenuType', 'menu')
-      window.GLOB.customMenu = this.state.config
-      this.setState({visible: false})
-    })
+    this.props.history.push('/popdesign/' + window.btoa(window.encodeURIComponent((JSON.stringify(_btn)))))
   }
 
   closeView = () => {
@@ -498,7 +500,6 @@
               delButtons.push(btn.uuid)
               return
             }
-            this.checkBtn(btn)
             buttons.push(`select '${btn.uuid}' as menuid, '${item.name + '-' + btn.label}' as menuname, '${_sort * 10}' as Sort`)
             _sort++
           })
@@ -509,7 +510,6 @@
                 delButtons.push(cell.uuid)
                 return
               }
-              this.checkBtn(cell)
               buttons.push(`select '${cell.uuid}' as menuid, '${item.name + '-' + cell.label}' as menuname, '${_sort * 10}' as Sort`)
               _sort++
             })
@@ -519,7 +519,6 @@
                 delButtons.push(cell.uuid)
                 return
               }
-              this.checkBtn(cell)
               buttons.push(`select '${cell.uuid}' as menuid, '${item.name + '-' + cell.label}' as menuname, '${_sort * 10}' as Sort`)
               _sort++
             })
@@ -532,7 +531,6 @@
                 delButtons.push(cell.uuid)
                 return
               }
-              this.checkBtn(cell)
               buttons.push(`select '${cell.uuid}' as menuid, '${item.name + '-' + cell.label}' as menuname, '${_sort * 10}' as Sort`)
               _sort++
             })
@@ -544,7 +542,6 @@
               delButtons.push(cell.uuid)
               return
             }
-            this.checkBtn(cell)
             buttons.push(`select '${cell.uuid}' as menuid, '${item.name + '-' + cell.label}' as menuname, '${_sort * 10}' as Sort`)
             _sort++
           })
@@ -554,7 +551,6 @@
               delButtons.push(btn.uuid)
               return
             }
-            this.checkBtn(btn)
             buttons.push(`select '${btn.uuid}' as menuid, '${item.name + '-' + btn.label}' as menuname, '${_sort * 10}' as Sort`)
             _sort++
           })
@@ -564,7 +560,6 @@
               delButtons.push(btn.uuid)
               return
             }
-            this.checkBtn(btn)
             buttons.push(`select '${btn.uuid}' as menuid, '${item.name + '-' + btn.label}' as menuname, '${_sort * 10}' as Sort`)
             _sort++
           })
@@ -575,7 +570,6 @@
                 delButtons.push(btn.uuid)
                 return
               }
-              this.checkBtn(btn)
               buttons.push(`select '${btn.uuid}' as menuid, '${item.name + '-' + btn.label}' as menuname, '${_sort * 10}' as Sort`)
               _sort++
             })
@@ -589,28 +583,8 @@
     return buttons
   }
 
-  checkBtn = (btn) => {
-    if (['prompt', 'exec', 'pop'].includes(btn.OpenType) && btn.Ot === 'required' && btn.verify && btn.verify.scripts && btn.verify.scripts.length > 0) {
-      let hascheck = false
-      btn.verify.scripts.forEach(item => {
-        if (item.status === 'false') return
-  
-        if (/\$check@|@check\$/ig.test(item.sql)) {
-          hascheck = true
-        }
-      })
-      if (hascheck) {
-        notification.warning({
-          top: 92,
-          message: `鍙�夋嫨澶氳鐨勬寜閽��${btn.label}銆嬩腑 $check@ 鎴� @check$ 灏嗕笉浼氱敓鏁堬紒`,
-          duration: 5
-        })
-      }
-    }
-  }
-
   submitConfig = () => {
-    const { MenuType, copyButtons, thawButtons } = this.state
+    const { MenuType, copyButtons } = this.state
     let config = fromJS(this.state.config).toJS()
 
     if (MenuType === 'billPrint' && config.printPage === 'page' && !config.everyPCount) {
@@ -752,28 +726,28 @@
           }
           return Api.getSystemConfig(_param)
         }
-      }).then(res => { // 鎸夐挳瑙i櫎鍐荤粨
-        if (!res) return
-        if (!res.status) {
-          notification.warning({
-            top: 92,
-            message: res.message,
-            duration: 5
-          })
-          return false
-        }
+      // }).then(res => { // 鎸夐挳瑙i櫎鍐荤粨
+      //   if (!res) return
+      //   if (!res.status) {
+      //     notification.warning({
+      //       top: 92,
+      //       message: res.message,
+      //       duration: 5
+      //     })
+      //     return false
+      //   }
 
-        let ids = thawButtons.filter(item => btnIds.indexOf(item) !== -1)
-        if (ids.length === 0) {
-          return {
-            status: true
-          }
-        } else {
-          return Api.getSystemConfig({
-            func: 'sPC_MainMenu_ReDel',
-            MenuID: ids.join(',')
-          })
-        }
+      //   let ids = thawButtons.filter(item => btnIds.indexOf(item) !== -1)
+      //   if (ids.length === 0) {
+      //     return {
+      //       status: true
+      //     }
+      //   } else {
+      //     return Api.getSystemConfig({
+      //       func: 'sPC_MainMenu_ReDel',
+      //       MenuID: ids.join(',')
+      //     })
+      //   }
       }).then(res => { // 椤甸潰淇濆瓨
         if (!res) return
 
@@ -917,7 +891,6 @@
           this.setState({
             delButtons: [],
             copyButtons: [],
-            thawButtons: [],
             menuloading: false
           })
           notification.success({
@@ -936,6 +909,7 @@
   }
 
   getRoleFields = () => {
+    if (sessionStorage.getItem('sysRoles') || sessionStorage.getItem('permFuncField')) return
     Api.getSystemConfig({func: 'sPC_Get_Roles_sModular'}).then(res => {
       if (res.status) {
         let _permFuncField = []
@@ -1095,13 +1069,13 @@
   }
 
   render () {
-    const { activeKey, comloading, MenuType, popBtn, visible, dict, MenuId, config, settingshow, ParentId, menuloading, customComponents, eyeopen } = this.state
+    const { activeKey, comloading, MenuType, dict, MenuId, config, settingshow, ParentId, menuloading, customComponents, eyeopen } = this.state
 
     return (
       <ConfigProvider locale={_locale}>
         <div className={'pc-menu-view ' + (MenuType || '')} id="mk-menu-design-view">
           <Header />
-          {!popBtn && !visible ? <DndProvider backend={HTML5Backend}>
+          <DndProvider backend={HTML5Backend}>
             <div className="menu-body">
               <div className={'menu-setting ' + (!settingshow ? 'hidden' : '')}>
                 <div className="draw">
@@ -1109,7 +1083,7 @@
                 </div>
                 <Collapse accordion activeKey={activeKey} bordered={false} onChange={(key) => this.setState({activeKey: key})}>
                   {/* 鍩烘湰淇℃伅 */}
-                  <Panel header={dict['mob.basemsg']} key="basedata">
+                  <Panel header="鍩烘湰淇℃伅" key="basedata">
                     {/* 鑿滃崟淇℃伅 */}
                     {config && MenuType === 'custom' ? <MenuForm
                       dict={dict}
@@ -1139,17 +1113,14 @@
                     {config ? <Paragraph style={{padding: '15px 0px 0px 18px'}} copyable={{ text: MenuId }}>鑿滃崟ID</Paragraph> : null}
                   </Panel>
                   {/* 缁勪欢娣诲姞 */}
-                  <Panel header={dict['mob.component']} key="component">
+                  <Panel header="缁勪欢" key="component">
                     <SourceWrap MenuType={MenuType} />
                   </Panel>
                   {customComponents && customComponents.length ? <Panel header="鑷畾涔夌粍浠�" key="cuscomponent">
                     <SourceWrap components={customComponents} MenuType={MenuType} />
                   </Panel> : null}
-                  <Panel header={'椤甸潰鑳屾櫙'} key="background">
+                  <Panel header="椤甸潰鏍峰紡" key="background">
                     {config ? <BgController config={config} updateConfig={this.updateConfig} /> : null}
-                  </Panel>
-                  <Panel header={'椤甸潰鍐呰竟璺�'} key="padding">
-                    {config ? <PaddingController config={config} updateConfig={this.updateConfig} /> : null}
                   </Panel>
                 </Collapse>
               </div>
@@ -1174,8 +1145,7 @@
                 </Card>
               </div>
             </div>
-          </DndProvider> : null}
-          {popBtn && visible ? <PopviewController btn={popBtn} handleBack={this.handleBack}/> : null}
+          </DndProvider>
           <StyleController />
           <StyleCombController />
           <ModalController />
@@ -1185,4 +1155,4 @@
   }
 }
 
-export default MenuDesign
\ No newline at end of file
+export default withRouter(MenuDesign)
\ No newline at end of file
diff --git a/src/views/mobdesign/index.jsx b/src/views/mobdesign/index.jsx
index f22b547..5b6484a 100644
--- a/src/views/mobdesign/index.jsx
+++ b/src/views/mobdesign/index.jsx
@@ -161,9 +161,17 @@
     MKEmitter.addListener('submitComponentStyle', this.updateComponentStyle)
     MKEmitter.addListener('updateCustomComponent', this.updateCustomComponent)
     setTimeout(() => {
-      this.updateCustomComponent()
+      if (sessionStorage.getItem('app_custom_components')) {
+        let list = sessionStorage.getItem('app_custom_components')
+        list = JSON.parse(list)
+
+        this.setCustomComponent(list)
+      } else {
+        this.updateCustomComponent()
+      }
       this.getAppPictures()
       this.getSmStemp()
+      this.getRoleFields()
       setGLOBFuncs()
     }, 1000)
 
@@ -413,36 +421,46 @@
       typename: sessionStorage.getItem('typename'),
       typecharone: ''
     }).then(res => {
-      let coms = []
-      if (res.cus_list && res.cus_list.length > 0) {
-        res.cus_list.forEach(item => {
-          let config = ''
-
-          try {
-            config = JSON.parse(window.decodeURIComponent(window.atob(item.long_param)))
-          } catch (e) {
-            console.warn('Parse Failure')
-            config = ''
-          }
-
-          if (!config || !item.c_name) return
-
-          window.GLOB.UserComponentMap.set(item.c_id, item.c_name)
-          coms.push({
-            uuid: item.c_id,
-            type: 'menu',
-            title: item.c_name,
-            url: item.images,
-            component: config.type,
-            subtype: config.subtype,
-            width: config.width || 24,
-            config
-          })
+      if (!res.status) {
+        notification.warning({
+          top: 92,
+          message: res.message,
+          duration: 5
         })
+      } else if (res.cus_list) {
+        sessionStorage.setItem('app_custom_components', JSON.stringify(res.cus_list))
+        this.setCustomComponent(res.cus_list)
       }
-      this.setState({customComponents: coms})
-      this.getRoleFields()
     })
+  }
+
+  setCustomComponent = (cus_list) => {
+    let coms = []
+
+    cus_list.forEach(item => {
+      let config = ''
+
+      try {
+        config = JSON.parse(window.decodeURIComponent(window.atob(item.long_param)))
+      } catch (e) {
+        console.warn('Parse Failure')
+        config = ''
+      }
+
+      if (!config || !item.c_name) return
+
+      window.GLOB.UserComponentMap.set(item.c_id, item.c_name)
+      coms.push({
+        uuid: item.c_id,
+        type: 'menu',
+        title: item.c_name,
+        url: item.images,
+        component: config.type,
+        subtype: config.subtype,
+        config
+      })
+    })
+    this.setState({customComponents: coms})
   }
 
   updateComponentStyle = (parentId, keys, style) => {
@@ -551,7 +569,8 @@
             Template: 'webPage',
             enabled: false,
             MenuName: urlParam.MenuName || '',
-            MenuNo: urlParam.MenuNo || '',
+            // MenuNo: urlParam.MenuNo || '',
+            MenuNo: '',
             tables: [],
             components: [],
             viewType: 'menu',
@@ -801,7 +820,8 @@
       config.MenuID = MenuId
       config.open_edition = ''
       config.MenuName = urlParam.MenuName || ''
-      config.MenuNo = urlParam.MenuNo || ''
+      // config.MenuNo = urlParam.MenuNo || ''
+      config.MenuNo = ''
 
       let indeComs = []
       config.components.forEach(item => {
@@ -957,7 +977,6 @@
           item.action && item.action.forEach(btn => {
             if (btn.hidden === 'true') return
 
-            this.checkBtn(btn)
             m.children.push({
               key: btn.uuid,
               title: btn.label,
@@ -968,7 +987,6 @@
               if (cell.eleType !== 'button') return
               if (cell.hidden === 'true') return
 
-              this.checkBtn(cell)
               m.children.push({
                 key: cell.uuid,
                 title: cell.label,
@@ -981,7 +999,6 @@
               if (cell.eleType !== 'button') return
               if (cell.hidden === 'true') return
 
-              this.checkBtn(cell)
               m.children.push({
                 key: cell.uuid,
                 title: cell.label,
@@ -993,7 +1010,6 @@
             if (cell.eleType !== 'button') return
             if (cell.hidden === 'true') return
 
-            this.checkBtn(cell)
             m.children.push({
               key: cell.uuid,
               title: cell.label,
@@ -1023,7 +1039,6 @@
           item.action && item.action.forEach(btn => {
             if (btn.hidden === 'true') return
 
-            this.checkBtn(btn)
             m.children.push({
               key: btn.uuid,
               title: btn.label,
@@ -1034,7 +1049,6 @@
             col.elements.forEach(btn => {
               if (btn.hidden === 'true') return
 
-              this.checkBtn(btn)
               m.children.push({
                 key: btn.uuid,
                 title: btn.label,
@@ -1090,7 +1104,8 @@
                 menus.push({
                   MenuID: m.uuid,
                   MenuName: m.setting.name,
-                  MenuNo: m.setting.MenuNo
+                  // MenuNo: m.setting.MenuNo
+                  MenuNo: ''
                 })
               }
             } else if (m.setting.type === 'linkmenu' && menuObj[m.setting.linkMenuId]) {
@@ -1194,26 +1209,6 @@
     })
 
     return menus
-  }
-
-  checkBtn = (btn) => {
-    if (['prompt', 'exec', 'pop'].includes(btn.OpenType) && btn.Ot === 'required' && btn.verify && btn.verify.scripts && btn.verify.scripts.length > 0) {
-      let hascheck = false
-      btn.verify.scripts.forEach(item => {
-        if (item.status === 'false') return
-  
-        if (/\$check@|@check\$/ig.test(item.sql)) {
-          hascheck = true
-        }
-      })
-      if (hascheck) {
-        notification.warning({
-          top: 92,
-          message: `鍙�夋嫨澶氳鐨勬寜閽��${btn.label}銆嬩腑 $check@ 鎴� @check$ 灏嗕笉浼氱敓鏁堬紒`,
-          duration: 5
-        })
-      }
-    }
   }
 
   getMiniStyle = (config) => {
@@ -1625,16 +1620,16 @@
     let searchSum = 0
     let swipes = []
 
-    let check = (components) => {
+    let check = (components, level, sign) => {
       components.forEach(item => {
         if (error) return
         if (item.type === 'tabs') {
           item.subtabs.forEach(tab => {
-            check(tab.components)
+            check(tab.components, level + 1, tab.uuid)
           })
           return
         } else if (item.type === 'group') {
-          check(item.components)
+          check(item.components, level, sign)
           return
         } else if (item.type === 'navbar' && !item.wrap.MenuNo) {
           error = `瀵艰埅鏍忋��${item.name}銆嬫湭璁剧疆鑿滃崟鍙傛暟锛乣
@@ -1649,7 +1644,8 @@
           }
         }
         if (item.wrap && item.wrap.pagestyle === 'slide' && item.pageable && item.setting.laypage !== 'false') {
-          swipes.push(item.name)
+          // swipes.push(item.name)
+          swipes.push({level, name: item.name, sign})
         }
 
         item.errors && item.errors.forEach(err => {
@@ -1659,7 +1655,7 @@
       })
     }
 
-    check(config.components)
+    check(config.components, 1, 'view')
 
     // if (!error && viewType === 'userbind' && config.components.filter(item => item.type === 'login').length === 0) {
     //   error = '鐢ㄦ埛缁戝畾椤甸潰蹇呴』娣诲姞鐧诲綍銆�'
@@ -1667,8 +1663,27 @@
 
     if (!error && searchSum > 1) {
       error = '鎼滅储缁勪欢涓庡鑸爮鐨勬悳绱㈠姛鑳戒笉鍙悓鏃朵娇鐢ㄣ��'
-    } else if (!error && swipes.length > 1) {
-      error = `椤甸潰涓笉鍙悓鏃朵娇鐢ㄥ涓粦鍔ㄥ姞杞界粍浠躲�傦紙${swipes.join('銆�')}锛塦
+    } else if (!error && swipes.length > 0) {
+      swipes.forEach(cell => {
+        if (!error && cell.level > 2) {
+          error = `涓嶅彲鍦ㄥ灞傛爣绛鹃〉涓娇鐢ㄦ粦鍔ㄥ姞杞界粍浠躲�傦紙${cell.name}锛塦
+        }
+      })
+      if (!error) {
+        let levels = swipes.map(s => s.level)
+        levels = Array.from(new Set(levels))
+        if (levels.length > 1) {
+          error = `涓嶅彲鍦ㄩ〉闈笌鏍囩椤典腑鍚屾椂浣跨敤婊戝姩鍔犺浇缁勪欢銆傦紙${swipes.map(s => s.name).join('銆�')}锛塦
+        }
+      }
+
+      if (!error) {
+        let signs = swipes.map(s => s.sign)
+        signs = Array.from(new Set(signs))
+        if (signs.length !== swipes.length) {
+          error = `椤甸潰涓紙鎴栧悓涓�鏍囩椤典腑锛変笉鍙悓鏃朵娇鐢ㄥ涓粦鍔ㄥ姞杞界粍浠躲�傦紙${swipes.map(s => s.name).join('銆�')}锛塦
+        }
+      }
     }
 
     if (show && error) {
@@ -1921,7 +1936,7 @@
               <div className="pc-setting-tools">
                 <Collapse accordion activeKey={activeKey} bordered={false} onChange={(key) => this.setState({activeKey: key})}>
                   {/* 鍩烘湰淇℃伅 */}
-                  <Panel header={dict['mob.basemsg']} forceRender className="basedata" key="basedata">
+                  <Panel header="鍩烘湰淇℃伅" forceRender className="basedata" key="basedata">
                     {/* 鑿滃崟淇℃伅 */}
                     {config ? <MenuForm
                       dict={dict}
diff --git a/src/views/pcdesign/index.jsx b/src/views/pcdesign/index.jsx
index b26500d..c0f43de 100644
--- a/src/views/pcdesign/index.jsx
+++ b/src/views/pcdesign/index.jsx
@@ -25,7 +25,6 @@
 
 const MenuForm = asyncComponent(() => import('./menuform'))
 const Transfer = asyncComponent(() => import('@/pc/transfer'))
-const PopviewController = asyncComponent(() => import('@/menu/popview'))
 const Versions = asyncComponent(() => import('@/menu/versions'))
 const MenuShell = asyncComponent(() => import('@/pc/menushell'))
 const ViewNodes = asyncComponent(() => import('@/menu/viewnodes'))
@@ -45,15 +44,10 @@
 const TableComponent = asyncComponent(() => import('@/templates/sharecomponent/tablecomponent'))
 
 sessionStorage.setItem('isEditState', 'true')
-sessionStorage.setItem('editMenuType', 'menu') // 缂栬緫鑿滃崟绫诲瀷
+
 sessionStorage.setItem('appType', 'pc')        // 搴旂敤绫诲瀷
 sessionStorage.setItem('typename', 'pc')
 document.body.className = ''
-window.GLOB.UserComponentMap = new Map() // 缂撳瓨鐢ㄦ埛鑷畾涔夌粍浠�
-window.GLOB.TabsMap = new Map()          // 缂撳瓨鐢ㄦ埛鎿嶄綔鐨勬爣绛鹃〉
-window.GLOB.CacheIndependent = new Map()
-window.GLOB.urlFields = []               // url鍙橀噺
-window.GLOB.customMenu = null            // 淇濆瓨鑿滃崟淇℃伅
 
 const memberLevel = Utils.getMemberLevel()
 
@@ -67,13 +61,10 @@
     MenuNo: '',
     delButtons: [],
     copyButtons: [],
-    thawButtons: [],
     activeKey: 'basedata',
     menuloading: false,
     oriConfig: null,
     config: null,
-    popBtn: null,             // 寮圭獥鏍囩椤�
-    visible: false,
     customComponents: [],
     settingshow: sessionStorage.getItem('settingshow') !== 'false',
     controlshow: sessionStorage.getItem('controlshow') !== 'false',
@@ -84,6 +75,15 @@
 
   UNSAFE_componentWillMount() {
     if (memberLevel < 30) return
+
+    sessionStorage.setItem('editMenuType', 'menu') // 缂栬緫鑿滃崟绫诲瀷
+
+    window.GLOB.UserComponentMap = new Map() // 缂撳瓨鐢ㄦ埛鑷畾涔夌粍浠�
+    window.GLOB.TabsMap = new Map()          // 缂撳瓨鐢ㄦ埛鎿嶄綔鐨勬爣绛鹃〉
+    window.GLOB.CacheIndependent = new Map()
+    window.GLOB.urlFields = []               // url鍙橀噺
+    window.GLOB.customMenu = null            // 淇濆瓨鑿滃崟淇℃伅
+
     try {
       let param = JSON.parse(window.decodeURIComponent(window.atob(this.props.match.params.param)))
 
@@ -133,7 +133,6 @@
     }
     MKEmitter.addListener('delButtons', this.delButtons)
     MKEmitter.addListener('modalStatus', this.modalStatus)
-    MKEmitter.addListener('thawButtons', this.thawButtons)
     MKEmitter.addListener('copyButtons', this.copyButtons)
     MKEmitter.addListener('changePopview', this.initPopview)
     MKEmitter.addListener('changeEditMenu', this.changeEditMenu)
@@ -141,9 +140,17 @@
     MKEmitter.addListener('submitComponentStyle', this.updateComponentStyle)
     MKEmitter.addListener('updateCustomComponent', this.updateCustomComponent)
     setTimeout(() => {
-      this.updateCustomComponent()
+      if (sessionStorage.getItem('app_custom_components')) {
+        let list = sessionStorage.getItem('app_custom_components')
+        list = JSON.parse(list)
+
+        this.setCustomComponent(list)
+      } else {
+        this.updateCustomComponent()
+      }
       this.getAppPictures()
       this.getSmStemp()
+      this.getRoleFields()
       setGLOBFuncs()
     }, 1000)
 
@@ -200,7 +207,6 @@
     }
     MKEmitter.removeListener('delButtons', this.delButtons)
     MKEmitter.removeListener('modalStatus', this.modalStatus)
-    MKEmitter.removeListener('thawButtons', this.thawButtons)
     MKEmitter.removeListener('copyButtons', this.copyButtons)
     MKEmitter.removeListener('changePopview', this.initPopview)
     MKEmitter.removeListener('changeEditMenu', this.changeEditMenu)
@@ -214,8 +220,6 @@
   }
 
   triggerMenuSave = () => {
-    if (this.state.visible) return
-
     this.submitConfig()
   }
 
@@ -238,7 +242,7 @@
       type: 'view'
     }
 
-    param.MenuNo = menu.MenuNo || ''
+    // param.MenuNo = menu.MenuNo || ''
     param.MenuName = menu.MenuName || ''
 
     param = window.btoa(window.encodeURIComponent(JSON.stringify(param)))
@@ -461,50 +465,46 @@
       typename: 'pc',
       typecharone: ''
     }).then(res => {
-      let coms = []
       if (!res.status) {
         notification.warning({
           top: 92,
           message: res.message,
           duration: 5
         })
-      } else if (res.cus_list && res.cus_list.length > 0) {
-        res.cus_list.forEach(item => {
-          let config = ''
-
-          try {
-            config = JSON.parse(window.decodeURIComponent(window.atob(item.long_param)))
-          } catch (e) {
-            console.warn('Parse Failure')
-            config = ''
-          }
-
-          if (!config || !item.c_name) return
-
-          window.GLOB.UserComponentMap.set(item.c_id, item.c_name)
-          coms.push({
-            uuid: item.c_id,
-            type: 'menu',
-            title: item.c_name,
-            url: item.images,
-            component: config.type,
-            subtype: config.subtype,
-            width: config.width || 24,
-            config
-          })
-        })
+      } else if (res.cus_list) {
+        sessionStorage.setItem('app_custom_components', JSON.stringify(res.cus_list))
+        this.setCustomComponent(res.cus_list)
       }
-      this.setState({customComponents: coms})
-      this.getRoleFields()
     })
   }
 
-  handleBack = () => {
-    this.setState({popBtn: null, delButtons: [], copyButtons: [], thawButtons: []}, () => {
-      sessionStorage.setItem('editMenuType', 'menu')
-      window.GLOB.customMenu = this.state.config
-      this.setState({visible: false})
+  setCustomComponent = (cus_list) => {
+    let coms = []
+
+    cus_list.forEach(item => {
+      let config = ''
+
+      try {
+        config = JSON.parse(window.decodeURIComponent(window.atob(item.long_param)))
+      } catch (e) {
+        console.warn('Parse Failure')
+        config = ''
+      }
+
+      if (!config || !item.c_name) return
+
+      window.GLOB.UserComponentMap.set(item.c_id, item.c_name)
+      coms.push({
+        uuid: item.c_id,
+        type: 'menu',
+        title: item.c_name,
+        url: item.images,
+        component: config.type,
+        subtype: config.subtype,
+        config
+      })
     })
+    this.setState({customComponents: coms})
   }
 
   updateComponentStyle = (parentId, keys, style) => {
@@ -536,10 +536,6 @@
   copyButtons = (items) => {
     this.setState({copyButtons: [...this.state.copyButtons, ...items]})
   }
-  
-  thawButtons = (item) => {
-    this.setState({thawButtons: [...this.state.thawButtons, item]})
-  }
 
   initPopview = (card, btn) => {
     const { oriConfig, config } = this.state
@@ -553,12 +549,11 @@
       return
     }
 
-    btn.config = fromJS(config).toJS()
-    btn.component = card
+    let _btn = fromJS(btn).toJS()
+    _btn.MenuName = config.MenuName + '-' + card.name + '-' + btn.label
+    _btn.ParentMenuID = config.uuid
 
-    sessionStorage.setItem('editMenuType', 'popview') // 缂栬緫寮圭獥鏍囩
-
-    this.setState({popBtn: btn, visible: true})
+    this.props.history.push('/popdesign/' + window.btoa(window.encodeURIComponent((JSON.stringify(_btn)))))
   }
 
   closeView = () => {
@@ -640,7 +635,7 @@
             Template: 'webPage',
             enabled: false,
             MenuName: urlParam.MenuName || '',
-            MenuNo: urlParam.MenuNo || '',
+            MenuNo: '',
             tables: [],
             components: [],
             viewType: 'menu',
@@ -777,7 +772,7 @@
       config.MenuID = MenuId
       config.open_edition = ''
       config.MenuName = urlParam.MenuName || ''
-      config.MenuNo = urlParam.MenuNo || ''
+      config.MenuNo = ''
 
       let indeComs = []
       config.components.forEach(item => {
@@ -933,7 +928,6 @@
           item.action && item.action.forEach(btn => {
             if (btn.hidden === 'true') return
 
-            this.checkBtn(btn)
             m.children.push({
               key: btn.uuid,
               title: btn.label,
@@ -947,7 +941,6 @@
               if (cell.eleType !== 'button') return
               if (cell.hidden === 'true') return
 
-              this.checkBtn(cell)
               m.children.push({
                 key: cell.uuid,
                 title: cell.label,
@@ -960,7 +953,6 @@
               if (cell.eleType !== 'button') return
               if (cell.hidden === 'true') return
 
-              this.checkBtn(cell)
               m.children.push({
                 key: cell.uuid,
                 title: cell.label,
@@ -976,7 +968,6 @@
               if (cell.eleType !== 'button') return
               if (cell.hidden === 'true') return
 
-              this.checkBtn(cell)
               m.children.push({
                 key: cell.uuid,
                 title: cell.label,
@@ -991,7 +982,6 @@
             if (cell.eleType !== 'button') return
             if (cell.hidden === 'true') return
 
-            this.checkBtn(cell)
             m.children.push({
               key: cell.uuid,
               title: cell.label,
@@ -1024,7 +1014,6 @@
           item.action && item.action.forEach(btn => {
             if (btn.hidden === 'true') return
 
-            this.checkBtn(btn)
             m.children.push({
               key: btn.uuid,
               title: btn.label,
@@ -1038,7 +1027,6 @@
             col.elements.forEach(btn => {
               if (btn.hidden === 'true') return
               
-              this.checkBtn(btn)
               m.children.push({
                 key: btn.uuid,
                 title: btn.label,
@@ -1071,26 +1059,6 @@
     }
 
     return nodes
-  }
-
-  checkBtn = (btn) => {
-    if (['prompt', 'exec', 'pop'].includes(btn.OpenType) && btn.Ot === 'required' && btn.verify && btn.verify.scripts && btn.verify.scripts.length > 0) {
-      let hascheck = false
-      btn.verify.scripts.forEach(item => {
-        if (item.status === 'false') return
-  
-        if (/\$check@|@check\$/ig.test(item.sql)) {
-          hascheck = true
-        }
-      })
-      if (hascheck) {
-        notification.warning({
-          top: 92,
-          message: `鍙�夋嫨澶氳鐨勬寜閽��${btn.label}銆嬩腑 $check@ 鎴� @check$ 灏嗕笉浼氱敓鏁堬紒`,
-          duration: 5
-        })
-      }
-    }
   }
 
   getSubMenus = () => {
@@ -1209,7 +1177,7 @@
   }
 
   submitConfig = () => {
-    const { delButtons, copyButtons, thawButtons } = this.state
+    const { delButtons, copyButtons } = this.state
     let config = fromJS(this.state.config).toJS()
 
     if (!config.MenuName || !config.MenuNo || (config.cacheUseful === 'true' && !config.cacheTime)) {
@@ -1445,27 +1413,6 @@
           }
           return Api.getSystemConfig(_param)
         }
-      }).then(res => { // 鎸夐挳瑙i櫎鍐荤粨
-        if (!res) return
-        if (!res.status) {
-          notification.warning({
-            top: 92,
-            message: res.message,
-            duration: 5
-          })
-          return false
-        } else if (!res.nonexec) { // 鎵ц鍒犻櫎鍚庡埛鏂拌彍鍗曞垪琛�
-          this.getAppMenus()
-        }
-
-        if (thawButtons.length === 0) {
-          return { status: true }
-        } else {
-          return Api.getSystemConfig({
-            func: 'sPC_MainMenu_ReDel',
-            MenuID: thawButtons.join(',')
-          })
-        }
       }).then(res => { // 椤甸潰淇濆瓨
         if (!res) return
 
@@ -1604,7 +1551,6 @@
           this.setState({
             delButtons: [],
             copyButtons: [],
-            thawButtons: [],
             menuloading: false
           })
           notification.success({
@@ -1883,13 +1829,13 @@
   }
 
   render () {
-    const { localedict, loading, visible, popBtn, comloading, activeKey, settingshow, controlshow, dict, MenuId, config, menuloading, customComponents, eyeopen } = this.state
+    const { localedict, loading, comloading, activeKey, settingshow, controlshow, dict, MenuId, config, menuloading, customComponents, eyeopen } = this.state
 
     return (
       <ConfigProvider locale={localedict}>
         <div className={'mk-pc-view '} id="mk-pc-design-view">
           {loading ? <Spin className="view-spin" size="large" /> : null}
-          {!popBtn && !visible ? <DndProvider backend={HTML5Backend}>
+          <DndProvider backend={HTML5Backend}>
             <div className={'menu-setting ' + (!settingshow ? 'hidden' : '')}>
               <div className="draw">
                 {settingshow ? <DoubleLeftOutlined onClick={() => {sessionStorage.setItem('settingshow', 'false'); this.setState({settingshow: false})}}/> : null}
@@ -1898,7 +1844,7 @@
               <div className="pc-setting-tools">
                 <Collapse accordion activeKey={activeKey} bordered={false} onChange={(key) => this.setState({activeKey: key})}>
                   {/* 鍩烘湰淇℃伅 */}
-                  <Panel header={dict['mob.basemsg']} key="basedata">
+                  <Panel header="鍩烘湰淇℃伅" key="basedata">
                     {/* 鑿滃崟淇℃伅 */}
                     {config ? <MenuForm
                       dict={dict}
@@ -1953,8 +1899,7 @@
             <div className={'menu-body menu-view' + (menuloading ? ' saving' : '') + (eyeopen ? ' eye-open' : '')}>
               {config && !comloading ? <MenuShell menu={config} handleList={this.updateConfig} /> : null}
             </div>
-          </DndProvider> : null}
-          {popBtn && visible ? <PopviewController btn={popBtn} handleBack={this.handleBack}/> : null}
+          </DndProvider>
           <StyleController />
           <StyleCombController />
           <ModalController />
diff --git a/src/menu/popview/index.jsx b/src/views/popdesign/index.jsx
similarity index 69%
rename from src/menu/popview/index.jsx
rename to src/views/popdesign/index.jsx
index 8b4293f..e95fc0f 100644
--- a/src/menu/popview/index.jsx
+++ b/src/views/popdesign/index.jsx
@@ -1,21 +1,21 @@
 import React, { Component } from 'react'
-import PropTypes from 'prop-types'
 import { DndProvider } from 'react-dnd'
 import { is, fromJS } from 'immutable'
 import moment from 'moment'
 import HTML5Backend from 'react-dnd-html5-backend'
-import { notification, Modal, Collapse, Card, Switch, Button } from 'antd'
+import { ConfigProvider, notification, Modal, Collapse, Card, Switch, Button } from 'antd'
 import { EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'
 
 import Api from '@/api'
-import Utils from '@/utils/utils.js'
-import zhCN from '@/locales/zh-CN/mob.js'
-import enUS from '@/locales/en-US/mob.js'
+import Utils, { setGLOBFuncs } from '@/utils/utils.js'
 import MKEmitter from '@/utils/events.js'
 import asyncComponent from '@/utils/asyncComponent'
+// import antdEnUS from 'antd/es/locale/en_US'
+import antdZhCN from 'antd/es/locale/zh_CN'
 
 import './index.scss'
 
+const _locale = antdZhCN
 const { Panel } = Collapse
 const { confirm } = Modal
 
@@ -25,22 +25,22 @@
 const SourceWrap = asyncComponent(() => import('@/menu/modulesource'))
 const MenuShell = asyncComponent(() => import('@/menu/menushell'))
 const ReplaceField = asyncComponent(() => import('@/menu/replaceField'))
-const BgController = asyncComponent(() => import('@/menu/bgcontroller'))
+const BgController = asyncComponent(() => import('@/pc/bgcontroller'))
 const PasteController = asyncComponent(() => import('@/menu/pastecontroller'))
-const PaddingController = asyncComponent(() => import('@/menu/padcontroller'))
 const StyleCombControlButton = asyncComponent(() => import('@/menu/stylecombcontrolbutton'))
 const TableComponent = asyncComponent(() => import('@/templates/sharecomponent/tablecomponent'))
 
+const StyleController = asyncComponent(() => import('@/menu/stylecontroller'))
+const ModalController = asyncComponent(() => import('@/menu/modalconfig/controller'))
+const StyleCombController = asyncComponent(() => import('@/menu/stylecombcontroller'))
+
 sessionStorage.setItem('isEditState', 'true')
 
-class MenuDesign extends Component {
-  static propTpyes = {
-    btn: PropTypes.object,
-    handleBack: PropTypes.func
-  }
+document.body.className = ''
 
+class PopViewDesign extends Component {
   state = {
-    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
+    btn: null,
     MenuId: '',
     delButtons: [],
     activeKey: 'basedata',
@@ -53,13 +53,29 @@
   }
 
   UNSAFE_componentWillMount() {
-    const { btn } = this.props
+    sessionStorage.setItem('editMenuType', 'popview')
 
-    this.setState({
-      MenuId: btn.uuid,
-    }, () => {
-      this.getMenuParam()
-    })
+    window.GLOB.UserComponentMap = new Map() // 缂撳瓨鐢ㄦ埛鑷畾涔夌粍浠�
+    window.GLOB.TabsMap = new Map()          // 缂撳瓨鐢ㄦ埛鎿嶄綔鐨勬爣绛鹃〉
+    window.GLOB.urlFields = []               // url鍙橀噺
+    window.GLOB.customMenu = null            // 淇濆瓨鑿滃崟淇℃伅
+
+    try {
+      let param = JSON.parse(window.decodeURIComponent(window.atob(this.props.match.params.param)))
+
+      this.setState({
+        btn: param,
+        MenuId: param.uuid,
+      }, () => {
+        this.getMenuParam()
+      })
+    } catch (e) {
+      notification.warning({
+        top: 92,
+        message: '鑿滃崟淇℃伅瑙f瀽閿欒锛�',
+        duration: 5
+      })
+    }
   }
 
   componentDidMount () {
@@ -67,7 +83,57 @@
     MKEmitter.addListener('triggerMenuSave', this.submitConfig)
     MKEmitter.addListener('submitComponentStyle', this.updateComponentStyle)
     MKEmitter.addListener('updateCustomComponent', this.updateCustomComponent)
-    this.updateCustomComponent()
+    setTimeout(() => {
+      if (sessionStorage.getItem('app_custom_components')) {
+        let list = sessionStorage.getItem('app_custom_components')
+        list = JSON.parse(list)
+
+        this.setCustomComponent(list)
+      } else {
+        this.updateCustomComponent()
+      }
+      setGLOBFuncs()
+    }, 1000)
+
+    document.onkeydown = (event) => {
+      let e = event || window.event
+      let keyCode = e.keyCode || e.which || e.charCode
+      let preKey = ''
+
+      if (e.ctrlKey) {
+        preKey = 'ctrl'
+      }
+      if (e.shiftKey) {
+        preKey = 'shift'
+      } else if (e.altKey) {
+        preKey = 'alt'
+      }
+      
+      if (!preKey || !keyCode) return
+      
+      let _shortcut = `${preKey}+${keyCode}`
+
+      if (_shortcut === 'ctrl+83') {
+        if (this.state.modalStatus) {
+          notification.warning({
+            top: 92,
+            message: '璇蜂繚瀛�' + this.state.modalStatus,
+            duration: 5
+          })
+          return false
+        }
+
+        let node = document.getElementById('save-modal-config')
+        if (!node) {
+          node = document.getElementById('save-pop-config')
+        }
+
+        if (node) {
+          node.click()
+        }
+        return false
+      }
+    }
   }
 
   shouldComponentUpdate (nextProps, nextState) {
@@ -93,34 +159,46 @@
       typename: sessionStorage.getItem('appType'),
       typecharone: ''
     }).then(res => {
-      let coms = []
-      if (res.cus_list && res.cus_list.length > 0) {
-        res.cus_list.forEach(item => {
-          let config = ''
-
-          try {
-            config = JSON.parse(window.decodeURIComponent(window.atob(item.long_param)))
-          } catch (e) {
-            console.warn('Parse Failure')
-            config = ''
-          }
-
-          if (!config || !item.c_name) return
-
-          window.GLOB.UserComponentMap.set(item.c_id, item.c_name)
-          coms.push({
-            uuid: item.c_id,
-            type: 'menu',
-            title: item.c_name,
-            url: item.images,
-            component: config.type,
-            subtype: config.subtype,
-            config
-          })
+      if (!res.status) {
+        notification.warning({
+          top: 92,
+          message: res.message,
+          duration: 5
         })
+      } else if (res.cus_list) {
+        sessionStorage.setItem('app_custom_components', JSON.stringify(res.cus_list))
+        this.setCustomComponent(res.cus_list)
       }
-      this.setState({customComponents: coms})
     })
+  }
+
+  setCustomComponent = (cus_list) => {
+    let coms = []
+
+    cus_list.forEach(item => {
+      let config = ''
+
+      try {
+        config = JSON.parse(window.decodeURIComponent(window.atob(item.long_param)))
+      } catch (e) {
+        console.warn('Parse Failure')
+        config = ''
+      }
+
+      if (!config || !item.c_name) return
+
+      window.GLOB.UserComponentMap.set(item.c_id, item.c_name)
+      coms.push({
+        uuid: item.c_id,
+        type: 'menu',
+        title: item.c_name,
+        url: item.images,
+        component: config.type,
+        subtype: config.subtype,
+        config
+      })
+    })
+    this.setState({customComponents: coms})
   }
 
   updateComponentStyle = (parentId, keys, style) => {
@@ -153,29 +231,26 @@
     const { oriConfig, config } = this.state
 
     if (!config) {
-      this.props.handleBack()
+      window.history.back()
       return
     }
-
-    const _this = this
 
     if (!is(fromJS(oriConfig), fromJS(config))) {
       confirm({
         title: '閰嶇疆宸蹭慨鏀癸紝鏀惧純淇濆瓨鍚楋紵',
         content: '',
         onOk() {
-          _this.props.handleBack()
+          window.history.back()
         },
         onCancel() {}
       })
     } else {
-      this.props.handleBack()
+      window.history.back()
     }
   }
 
   getMenuParam = () => {
-    const { btn } = this.props
-    const { MenuId } = this.state
+    const { MenuId, btn } = this.state
 
     let param = {
       func: 'sPC_Get_LongParam',
@@ -205,7 +280,7 @@
             MenuID: MenuId,
             Template: 'CustomPage',
             enabled: false,
-            MenuName: btn.config.MenuName + '-' + btn.label,
+            MenuName: btn.MenuName,
             MenuNo: '',
             tables: [],
             components: [],
@@ -258,7 +333,6 @@
               delButtons.push(btn.uuid)
               return
             }
-            this.checkBtn(btn)
             buttons.push(`select '${btn.uuid}' as menuid, '${item.name + '-' + btn.label}' as menuname, '${_sort * 10}' as Sort`)
             _sort++
           })
@@ -269,7 +343,6 @@
                 delButtons.push(cell.uuid)
                 return
               }
-              this.checkBtn(cell)
               buttons.push(`select '${cell.uuid}' as menuid, '${item.name + '-' + cell.label}' as menuname, '${_sort * 10}' as Sort`)
               _sort++
             })
@@ -279,7 +352,6 @@
                 delButtons.push(cell.uuid)
                 return
               }
-              this.checkBtn(cell)
               buttons.push(`select '${cell.uuid}' as menuid, '${item.name + '-' + cell.label}' as menuname, '${_sort * 10}' as Sort`)
               _sort++
             })
@@ -292,7 +364,6 @@
                 delButtons.push(cell.uuid)
                 return
               }
-              this.checkBtn(cell)
               buttons.push(`select '${cell.uuid}' as menuid, '${item.name + '-' + cell.label}' as menuname, '${_sort * 10}' as Sort`)
               _sort++
             })
@@ -304,7 +375,6 @@
               delButtons.push(cell.uuid)
               return
             }
-            this.checkBtn(cell)
             buttons.push(`select '${cell.uuid}' as menuid, '${item.name + '-' + cell.label}' as menuname, '${_sort * 10}' as Sort`)
             _sort++
           })
@@ -314,7 +384,6 @@
               delButtons.push(btn.uuid)
               return
             }
-            this.checkBtn(btn)
             buttons.push(`select '${btn.uuid}' as menuid, '${item.name + '-' + btn.label}' as menuname, '${_sort * 10}' as Sort`)
             _sort++
           })
@@ -324,7 +393,6 @@
               delButtons.push(btn.uuid)
               return
             }
-            this.checkBtn(btn)
             buttons.push(`select '${btn.uuid}' as menuid, '${item.name + '-' + btn.label}' as menuname, '${_sort * 10}' as Sort`)
             _sort++
           })
@@ -335,7 +403,6 @@
                 delButtons.push(btn.uuid)
                 return
               }
-              this.checkBtn(btn)
               buttons.push(`select '${btn.uuid}' as menuid, '${item.name + '-' + btn.label}' as menuname, '${_sort * 10}' as Sort`)
               _sort++
             })
@@ -347,26 +414,6 @@
     traversal(config.components)
 
     return buttons
-  }
-
-  checkBtn = (btn) => {
-    if (['prompt', 'exec', 'pop'].includes(btn.OpenType) && btn.Ot === 'required' && btn.verify && btn.verify.scripts && btn.verify.scripts.length > 0) {
-      let hascheck = false
-      btn.verify.scripts.forEach(item => {
-        if (item.status === 'false') return
-  
-        if (/\$check@|@check\$/ig.test(item.sql)) {
-          hascheck = true
-        }
-      })
-      if (hascheck) {
-        notification.warning({
-          top: 92,
-          message: `鍙�夋嫨澶氳鐨勬寜閽��${btn.label}銆嬩腑 $check@ 鎴� @check$ 灏嗕笉浼氱敓鏁堬紒`,
-          duration: 5
-        })
-      }
-    }
   }
 
   filterConfig = (components) => {
@@ -387,7 +434,7 @@
   }
 
   submitConfig = () => {
-    const { btn } = this.props
+    const { btn } = this.state
     let config = fromJS(this.state.config).toJS()
 
     if ((config.cacheUseful === 'true' && !config.cacheTime) || !config.MenuNo || !config.MenuName) {
@@ -410,15 +457,13 @@
         config.enabled = false
       }
 
-      let _name = (btn.component.name ? btn.component.name + '-' : '') + btn.label
-
       let param = {
         func: 'sPC_ButtonParam_AddUpt',
-        ParentID: btn.config.uuid,
+        ParentID: btn.ParentMenuID,
         MenuID: config.uuid,
         MenuNo: config.MenuNo || '',
         Template: 'CustomPage',
-        MenuName: _name,
+        MenuName: config.MenuName,
         PageParam: JSON.stringify({Template: 'CustomPage'}),
         LongParam: window.btoa(window.encodeURIComponent(JSON.stringify(config))),
         open_edition: config.open_edition
@@ -643,61 +688,62 @@
   }
 
   render () {
-    const { btn } = this.props
-    const { activeKey, comloading, dict, config, menuloading, customComponents, MenuId, eyeopen } = this.state
+    const { activeKey, comloading, config, menuloading, customComponents, MenuId, eyeopen } = this.state
 
     return (
-      <div className="pc-poper-view">
-        <Header />
-        <DndProvider backend={HTML5Backend}>
-          <div className="menu-body">
-            <div className="menu-setting">
-              <Collapse accordion activeKey={activeKey} bordered={false} onChange={(key) => this.setState({activeKey: key})}>
-                {/* 鍩烘湰淇℃伅 */}
-                <Panel header={dict['mob.basemsg']} key="basedata">
-                  {/* 鑿滃崟淇℃伅 */}
-                  {config ? <MenuForm dict={dict} config={config} btn={btn} updateConfig={this.updateConfig}/> : null}
-                  {/* 琛ㄥ悕娣诲姞 */}
-                  {config ? <TableComponent config={config} updatetable={this.updatetable}/> : null}
-                </Panel>
-                {/* 缁勪欢娣诲姞 */}
-                <Panel header={dict['mob.component']} key="component">
-                  <SourceWrap MenuType="" />
-                </Panel>
-                {customComponents && customComponents.length ? <Panel header="鑷畾涔夌粍浠�" key="cuscomponent">
-                  <SourceWrap components={customComponents} MenuType="" />
-                </Panel> : null}
-                <Panel header={'椤甸潰鑳屾櫙'} key="background">
-                  {config ? <BgController config={config} updateConfig={this.updateConfig} /> : null}
-                </Panel>
-                <Panel header={'椤甸潰鍐呰竟璺�'} key="padding">
-                  {config ? <PaddingController config={config} updateConfig={this.updateConfig} /> : null}
-                </Panel>
-              </Collapse>
+      <ConfigProvider locale={_locale}>
+        <div className="pc-poper-view">
+          <Header />
+          <DndProvider backend={HTML5Backend}>
+            <div className="menu-body">
+              <div className="menu-setting">
+                <Collapse accordion activeKey={activeKey} bordered={false} onChange={(key) => this.setState({activeKey: key})}>
+                  {/* 鍩烘湰淇℃伅 */}
+                  <Panel header="鍩烘湰淇℃伅" key="basedata">
+                    {/* 鑿滃崟淇℃伅 */}
+                    {config ? <MenuForm config={config} updateConfig={this.updateConfig}/> : null}
+                    {/* 琛ㄥ悕娣诲姞 */}
+                    {config ? <TableComponent config={config} updatetable={this.updatetable}/> : null}
+                  </Panel>
+                  {/* 缁勪欢娣诲姞 */}
+                  <Panel header="缁勪欢" key="component">
+                    <SourceWrap MenuType="" />
+                  </Panel>
+                  {customComponents && customComponents.length ? <Panel header="鑷畾涔夌粍浠�" key="cuscomponent">
+                    <SourceWrap components={customComponents} MenuType="" />
+                  </Panel> : null}
+                  <Panel header="椤甸潰鏍峰紡" key="background">
+                    {config ? <BgController config={config} updateConfig={this.updateConfig} /> : null}
+                  </Panel>
+                </Collapse>
+              </div>
+              <div className={'menu-view' + (menuloading ? ' saving' : '') + (eyeopen ? ' eye-open' : '')}>
+                <Card title={
+                  <div> {config && config.MenuName} </div>
+                } bordered={false} extra={
+                  <div>
+                    <Button className="mk-border-purple" onClick={() => this.setState({eyeopen: !eyeopen})}>{!eyeopen ? <EyeOutlined /> : <EyeInvisibleOutlined />} 缁勪欢鍚�</Button>
+                    <Versions MenuId={MenuId} open_edition={config ? config.open_edition : ''} updateConfig={this.refreshConfig}/>
+                    <ReplaceField type="custom" config={config} updateConfig={this.resetConfig}/>
+                    <StyleCombControlButton menu={config} />
+                    <PasteController insert={this.insert} />
+                    {config ? <Switch className="big" checkedChildren="鍚�" unCheckedChildren="鍋�" checked={config.enabled} onChange={this.onEnabledChange} /> : null}
+                    <Button type="primary" id="save-pop-config" onClick={this.submitConfig} loading={menuloading}>淇濆瓨</Button>
+                    <Button type="default" onClick={this.closeView}>杩斿洖</Button>
+                  </div>
+                } style={{ width: '100%' }}>
+                  {config && !comloading ? <MenuShell menu={config} handleList={this.updateConfig} /> : null}
+                </Card>
+              </div>
             </div>
-            <div className={'menu-view' + (menuloading ? ' saving' : '') + (eyeopen ? ' eye-open' : '')}>
-              <Card title={
-                <div> {config && config.MenuName} </div>
-              } bordered={false} extra={
-                <div>
-                  <Button className="mk-border-purple" onClick={() => this.setState({eyeopen: !eyeopen})}>{!eyeopen ? <EyeOutlined /> : <EyeInvisibleOutlined />} 缁勪欢鍚�</Button>
-                  <Versions MenuId={MenuId} open_edition={config ? config.open_edition : ''} updateConfig={this.refreshConfig}/>
-                  <ReplaceField type="custom" config={config} updateConfig={this.resetConfig}/>
-                  <StyleCombControlButton menu={config} />
-                  <PasteController insert={this.insert} />
-                  {config ? <Switch className="big" checkedChildren={dict['mob.enable']} unCheckedChildren={dict['mob.disable']} checked={config.enabled} onChange={this.onEnabledChange} /> : null}
-                  <Button type="primary" id="save-pop-config" onClick={this.submitConfig} loading={menuloading}>{dict['mob.save']}</Button>
-                  <Button type="default" onClick={this.closeView}>{dict['mob.return']}</Button>
-                </div>
-              } style={{ width: '100%' }}>
-                {config && !comloading ? <MenuShell menu={config} handleList={this.updateConfig} /> : null}
-              </Card>
-            </div>
-          </div>
-        </DndProvider>
-      </div>
+          </DndProvider>
+          <StyleController />
+          <StyleCombController />
+          <ModalController />
+        </div>
+      </ConfigProvider>
     )
   }
 }
 
-export default MenuDesign
\ No newline at end of file
+export default PopViewDesign
\ No newline at end of file
diff --git a/src/menu/popview/index.scss b/src/views/popdesign/index.scss
similarity index 87%
rename from src/menu/popview/index.scss
rename to src/views/popdesign/index.scss
index 7194ad4..416bbb5 100644
--- a/src/menu/popview/index.scss
+++ b/src/views/popdesign/index.scss
@@ -10,6 +10,38 @@
       display: none;
     }
   }
+
+  .component-name {
+    position: absolute;
+    z-index: 9;
+    display: none;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+    background: rgba(255, 255, 255, 0.9);
+    border: 1px solid #1890ff;
+    .center {
+      position: absolute;
+      font-size: 16px;
+      left: 50%;
+      top: 50%;
+      color: #1890ff;
+      transform: translate(-50%, -50%);
+      max-width: 70%;
+      .title {
+        text-align: center;
+      }
+    }
+    .error {
+      text-align: center;
+      color: red;
+      display: block;
+    }
+    .waring {
+      color: orange;
+    }
+  }
   
   >.menu-body {
     width: 100vw;
diff --git a/src/menu/popview/menuform/index.jsx b/src/views/popdesign/menuform/index.jsx
similarity index 88%
rename from src/menu/popview/menuform/index.jsx
rename to src/views/popdesign/menuform/index.jsx
index 4de1e6f..6906e4d 100644
--- a/src/menu/popview/menuform/index.jsx
+++ b/src/views/popdesign/menuform/index.jsx
@@ -7,8 +7,6 @@
 
 class CustomMenuForm extends Component {
   static propTpyes = {
-    dict: PropTypes.object, // 瀛楀吀椤�
-    btn: PropTypes.object,
     config: PropTypes.object,
     updateConfig: PropTypes.func
   }
@@ -41,7 +39,7 @@
   }
 
   render() {
-    const { dict, config } = this.props
+    const { config } = this.props
     const { getFieldDecorator } = this.props.form
     const formItemLayout = {
       labelCol: {
@@ -58,26 +56,26 @@
       <Form {...formItemLayout}>
         <Row>
         <Col span={24}>
-            <Form.Item label={dict['mob.menu'] + dict['mob.name']}>
+            <Form.Item label="鑿滃崟鍚嶇О">
               {getFieldDecorator('MenuName', {
                 initialValue: config.MenuName,
                 rules: [
                   {
                     required: true,
-                    message: dict['mob.required.input'] + dict['mob.menu'] + dict['mob.name'] + '!'
+                    message: '璇疯緭鍏ヨ彍鍗曞悕绉�!'
                   }
                 ]
               })(<Input placeholder="" autoComplete="off" onChange={this.changeName}/>)}
             </Form.Item>
           </Col>
           <Col span={24}>
-            <Form.Item label={dict['mob.menu'] + dict['mob.param']}>
+            <Form.Item label="鑿滃崟鍙傛暟">
               {getFieldDecorator('MenuNo', {
                 initialValue: config.MenuNo,
                 rules: [
                   {
                     required: true,
-                    message: dict['mob.required.input'] + dict['mob.menu'] + dict['mob.param'] + '!'
+                    message: '璇疯緭鍏ヨ彍鍗曞弬鏁�!'
                   }
                 ]
               })(<Input placeholder="" autoComplete="off" onChange={this.changeNo}/>)}
@@ -119,7 +117,7 @@
                 rules: [
                   {
                     required: true,
-                    message: dict['mob.required.input'] + '鏃堕暱!'
+                    message: '璇疯緭鍏ユ椂闀�!'
                   }
                 ]
               })(
diff --git a/src/menu/popview/menuform/index.scss b/src/views/popdesign/menuform/index.scss
similarity index 100%
rename from src/menu/popview/menuform/index.scss
rename to src/views/popdesign/menuform/index.scss

--
Gitblit v1.8.0