From 6afdec0062dacbded57e166230eb22cc55ced0c1 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期六, 08 五月 2021 14:30:21 +0800
Subject: [PATCH] 2021-05-08

---
 src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx         |    3 
 src/templates/zshare/modalform/index.jsx                                         |    6 
 src/utils/utils-datamanage.js                                                    |    3 
 package-lock.json                                                                |  465 +++++++++++++++++++++
 src/templates/subtableconfig/source.jsx                                          |    6 
 src/components/header/index.jsx                                                  |    4 
 src/tabviews/zshare/normalTable/index.jsx                                        |   13 
 src/templates/sharecomponent/searchcomponent/dragsearch/card.jsx                 |    3 
 src/views/menudesign/homeform/index.jsx                                          |   69 +++
 src/templates/sharecomponent/searchcomponent/index.jsx                           |   16 
 src/views/menudesign/printmenuform/index.jsx                                     |  100 ++++
 src/tabviews/zshare/actionList/exceloutbutton/index.jsx                          |   34 
 src/templates/sharecomponent/fieldscomponent/index.jsx                           |    4 
 src/menu/components/table/normal-table/columns/editColumn/index.jsx              |    3 
 src/tabviews/home/index.jsx                                                      |   28 +
 src/api/index.js                                                                 |   18 
 src/tabviews/custom/components/share/normalTable/index.jsx                       |    7 
 src/views/billprint/index.jsx                                                    |    5 
 src/tabviews/subtable/index.jsx                                                  |    7 
 src/tabviews/subtabtable/index.jsx                                               |    6 
 src/tabviews/commontable/index.jsx                                               |    9 
 src/tabviews/zshare/actionList/normalbutton/index.jsx                            |    3 
 src/menu/components/search/main-search/index.scss                                |   13 
 src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx            |   35 +
 src/tabviews/custom/components/card/table-card/index.jsx                         |   20 
 src/menu/components/search/main-search/dragsearch/index.jsx                      |    3 
 src/tabviews/custom/components/card/cardcellList/index.jsx                       |    5 
 src/views/menudesign/printmenuform/index.scss                                    |    5 
 src/templates/zshare/formconfig.jsx                                              |   17 
 src/templates/comtableconfig/source.jsx                                          |    6 
 src/tabviews/custom/components/table/normal-table/index.jsx                      |    9 
 src/templates/sharecomponent/actioncomponent/verifyexcelout/columnform/index.jsx |   22 
 src/menu/components/search/main-search/dragsearch/card.jsx                       |    3 
 src/templates/sharecomponent/searchcomponent/dragsearch/index.jsx                |    3 
 src/menu/components/search/main-search/index.jsx                                 |   15 
 src/tabviews/zshare/mutilform/index.jsx                                          |  282 ++++-------
 src/tabviews/custom/index.jsx                                                    |    2 
 package.json                                                                     |    2 
 src/templates/sharecomponent/searchcomponent/index.scss                          |    7 
 src/templates/sharecomponent/columncomponent/columnform/index.jsx                |    3 
 src/views/login/index.jsx                                                        |    2 
 41 files changed, 1,009 insertions(+), 257 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 80d8c73..2a72c49 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1541,6 +1541,33 @@
       "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-9.0.1.tgz",
       "integrity": "sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA=="
     },
+    "@fast-csv/format": {
+      "version": "4.3.5",
+      "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz",
+      "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==",
+      "requires": {
+        "@types/node": "^14.0.1",
+        "lodash.escaperegexp": "^4.1.2",
+        "lodash.isboolean": "^3.0.3",
+        "lodash.isequal": "^4.5.0",
+        "lodash.isfunction": "^3.0.9",
+        "lodash.isnil": "^4.0.0"
+      }
+    },
+    "@fast-csv/parse": {
+      "version": "4.3.6",
+      "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz",
+      "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==",
+      "requires": {
+        "@types/node": "^14.0.1",
+        "lodash.escaperegexp": "^4.1.2",
+        "lodash.groupby": "^4.6.0",
+        "lodash.isfunction": "^3.0.9",
+        "lodash.isnil": "^4.0.0",
+        "lodash.isundefined": "^3.0.1",
+        "lodash.uniq": "^4.5.0"
+      }
+    },
     "@hapi/address": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.1.tgz",
@@ -2503,6 +2530,11 @@
       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz",
       "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A=="
     },
+    "@types/node": {
+      "version": "14.14.44",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.44.tgz",
+      "integrity": "sha512-+gaugz6Oce6ZInfI/tK4Pq5wIIkJMEJUu92RB3Eu93mtj4wjjjz9EB5mLp5s1pSsLXdC/CPut/xF20ZzAQJbTA=="
+    },
     "@types/prop-types": {
       "version": "15.7.2",
       "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.2.tgz",
@@ -3228,6 +3260,61 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
       "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+    },
+    "archiver": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz",
+      "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==",
+      "requires": {
+        "archiver-utils": "^2.1.0",
+        "async": "^3.2.0",
+        "buffer-crc32": "^0.2.1",
+        "readable-stream": "^3.6.0",
+        "readdir-glob": "^1.0.0",
+        "tar-stream": "^2.2.0",
+        "zip-stream": "^4.1.0"
+      },
+      "dependencies": {
+        "async": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
+          "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw=="
+        },
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "archiver-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
+      "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
+      "requires": {
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.2.0",
+        "lazystream": "^1.0.0",
+        "lodash.defaults": "^4.2.0",
+        "lodash.difference": "^4.5.0",
+        "lodash.flatten": "^4.4.0",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.union": "^4.6.0",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^2.0.0"
+      },
+      "dependencies": {
+        "normalize-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+        }
+      }
     },
     "are-we-there-yet": {
       "version": "1.1.5",
@@ -4110,10 +4197,50 @@
       "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
       "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
     },
+    "binary": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
+      "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=",
+      "requires": {
+        "buffers": "~0.1.1",
+        "chainsaw": "~0.1.0"
+      }
+    },
     "binary-extensions": {
       "version": "1.13.1",
       "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
       "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
+    },
+    "bl": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+      "requires": {
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
+      },
+      "dependencies": {
+        "buffer": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+          "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+          "requires": {
+            "base64-js": "^1.3.1",
+            "ieee754": "^1.1.13"
+          }
+        },
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
     },
     "block-stream": {
       "version": "0.0.9",
@@ -4450,10 +4577,20 @@
       "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
       "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g=="
     },
+    "buffer-indexof-polyfill": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz",
+      "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A=="
+    },
     "buffer-xor": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
       "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
+    },
+    "buffers": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
+      "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s="
     },
     "builtin-status-codes": {
       "version": "3.0.0",
@@ -4627,6 +4764,21 @@
         "commander": "^2.16.0",
         "crc-32": "~1.2.0",
         "printj": "~1.1.2"
+      }
+    },
+    "chainsaw": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
+      "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=",
+      "requires": {
+        "traverse": ">=0.3.0 <0.4"
+      },
+      "dependencies": {
+        "traverse": {
+          "version": "0.3.9",
+          "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
+          "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk="
+        }
       }
     },
     "chalk": {
@@ -4952,6 +5104,34 @@
         "arity-n": "^1.0.4"
       }
     },
+    "compress-commons": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.0.tgz",
+      "integrity": "sha512-ofaaLqfraD1YRTkrRKPCrGJ1pFeDG/MVCkVVV2FNGeWquSlqw5wOrwOfPQ1xF2u+blpeWASie5EubHz+vsNIgA==",
+      "requires": {
+        "buffer-crc32": "^0.2.13",
+        "crc32-stream": "^4.0.1",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^3.6.0"
+      },
+      "dependencies": {
+        "normalize-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+        },
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
     "compressible": {
       "version": "2.0.17",
       "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz",
@@ -5165,6 +5345,27 @@
       "requires": {
         "exit-on-epipe": "~1.0.1",
         "printj": "~1.1.0"
+      }
+    },
+    "crc32-stream": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz",
+      "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==",
+      "requires": {
+        "crc-32": "^1.2.0",
+        "readable-stream": "^3.4.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
       }
     },
     "create-ecdh": {
@@ -7243,6 +7444,14 @@
       "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
       "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E="
     },
+    "duplexer2": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+      "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+      "requires": {
+        "readable-stream": "^2.0.2"
+      }
+    },
     "duplexify": {
       "version": "3.7.1",
       "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
@@ -8043,6 +8252,63 @@
         "safe-buffer": "^5.1.1"
       }
     },
+    "exceljs": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.2.1.tgz",
+      "integrity": "sha512-EogoTdXH1X1PxqD9sV8caYd1RIfXN3PVlCV+mA/87CgdO2h4X5xAEbr7CaiP8tffz7L4aBFwsdMbjfMXi29NjA==",
+      "requires": {
+        "archiver": "^5.0.0",
+        "dayjs": "^1.8.34",
+        "fast-csv": "^4.3.1",
+        "jszip": "^3.5.0",
+        "readable-stream": "^3.6.0",
+        "saxes": "^5.0.1",
+        "tmp": "^0.2.0",
+        "unzipper": "^0.10.11",
+        "uuid": "^8.3.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "saxes": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+          "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+          "requires": {
+            "xmlchars": "^2.2.0"
+          }
+        },
+        "tmp": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+          "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+          "requires": {
+            "rimraf": "^3.0.0"
+          }
+        },
+        "uuid": {
+          "version": "8.3.2",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+          "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
+        }
+      }
+    },
     "exec-sh": {
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz",
@@ -8376,6 +8642,15 @@
         "color-support": "^1.1.3",
         "parse-node-version": "^1.0.0",
         "time-stamp": "^1.0.0"
+      }
+    },
+    "fast-csv": {
+      "version": "4.3.6",
+      "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz",
+      "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==",
+      "requires": {
+        "@fast-csv/format": "4.3.5",
+        "@fast-csv/parse": "4.3.6"
       }
     },
     "fast-deep-equal": {
@@ -8777,6 +9052,11 @@
         "inherits": "^2.0.1",
         "readable-stream": "^2.0.0"
       }
+    },
+    "fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
     },
     "fs-extra": {
       "version": "7.0.1",
@@ -10017,6 +10297,11 @@
       "version": "0.6.3",
       "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz",
       "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA=="
+    },
+    "immediate": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+      "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
     },
     "immer": {
       "version": "1.10.0",
@@ -11498,6 +11783,11 @@
       "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
       "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g=="
     },
+    "js-table2excel": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/js-table2excel/-/js-table2excel-1.0.3.tgz",
+      "integrity": "sha512-ivzOdgYqOD3zqzJZfW0Nm35P9BWffxD0Unwr+2QBeEawV7hhRY9RHBVNcvO6A9PhGkMyqPVL/u4/NeufaTTTXw=="
+    },
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -11664,6 +11954,17 @@
         "object.assign": "^4.1.0"
       }
     },
+    "jszip": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz",
+      "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==",
+      "requires": {
+        "lie": "~3.3.0",
+        "pako": "~1.0.2",
+        "readable-stream": "~2.3.6",
+        "set-immediate-shim": "~1.0.1"
+      }
+    },
     "killable": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
@@ -11711,6 +12012,14 @@
       "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
       "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
     },
+    "lazystream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+      "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+      "requires": {
+        "readable-stream": "^2.0.5"
+      }
+    },
     "lcid": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
@@ -11737,6 +12046,19 @@
         "prelude-ls": "~1.1.2",
         "type-check": "~0.3.2"
       }
+    },
+    "lie": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+      "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+      "requires": {
+        "immediate": "~3.0.5"
+      }
+    },
+    "listenercount": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz",
+      "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc="
     },
     "load-json-file": {
       "version": "1.1.0",
@@ -11850,6 +12172,31 @@
       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
       "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
     },
+    "lodash.defaults": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+      "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
+    },
+    "lodash.difference": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
+      "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw="
+    },
+    "lodash.escaperegexp": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+      "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c="
+    },
+    "lodash.flatten": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+      "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
+    },
+    "lodash.groupby": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz",
+      "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E="
+    },
     "lodash.isarguments": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
@@ -11859,6 +12206,36 @@
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
       "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U="
+    },
+    "lodash.isboolean": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+      "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
+    },
+    "lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+    },
+    "lodash.isfunction": {
+      "version": "3.0.9",
+      "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
+      "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw=="
+    },
+    "lodash.isnil": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz",
+      "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw="
+    },
+    "lodash.isplainobject": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+    },
+    "lodash.isundefined": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz",
+      "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g="
     },
     "lodash.keys": {
       "version": "3.1.2",
@@ -11906,6 +12283,11 @@
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz",
       "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw="
+    },
+    "lodash.union": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
+      "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg="
     },
     "lodash.uniq": {
       "version": "4.5.0",
@@ -17134,6 +17516,14 @@
         }
       }
     },
+    "readdir-glob": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz",
+      "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==",
+      "requires": {
+        "minimatch": "^3.0.4"
+      }
+    },
     "readdirp": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
@@ -18068,6 +18458,11 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
       "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+    },
+    "set-immediate-shim": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
     },
     "set-value": {
       "version": "2.0.1",
@@ -19099,6 +19494,30 @@
         "inherits": "2"
       }
     },
+    "tar-stream": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+      "requires": {
+        "bl": "^4.0.3",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
     "temp": {
       "version": "0.8.3",
       "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",
@@ -19855,6 +20274,30 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
           "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+        }
+      }
+    },
+    "unzipper": {
+      "version": "0.10.11",
+      "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz",
+      "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==",
+      "requires": {
+        "big-integer": "^1.6.17",
+        "binary": "~0.3.0",
+        "bluebird": "~3.4.1",
+        "buffer-indexof-polyfill": "~1.0.0",
+        "duplexer2": "~0.1.4",
+        "fstream": "^1.0.12",
+        "graceful-fs": "^4.2.2",
+        "listenercount": "~1.0.1",
+        "readable-stream": "~2.3.6",
+        "setimmediate": "~1.0.4"
+      },
+      "dependencies": {
+        "bluebird": {
+          "version": "3.4.7",
+          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz",
+          "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM="
         }
       }
     },
@@ -20813,6 +21256,28 @@
         }
       }
     },
+    "zip-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz",
+      "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==",
+      "requires": {
+        "archiver-utils": "^2.1.0",
+        "compress-commons": "^4.1.0",
+        "readable-stream": "^3.6.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
     "zrender": {
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/zrender/-/zrender-4.1.2.tgz",
diff --git a/package.json b/package.json
index 14489ff..e9d796b 100644
--- a/package.json
+++ b/package.json
@@ -40,6 +40,7 @@
     "eslint-plugin-jsx-a11y": "6.2.3",
     "eslint-plugin-react": "7.14.3",
     "eslint-plugin-react-hooks": "^1.6.1",
+    "exceljs": "^4.2.1",
     "file-loader": "3.0.1",
     "fs-extra": "7.0.1",
     "html-webpack-plugin": "4.0.0-beta.5",
@@ -53,6 +54,7 @@
     "jest-environment-jsdom-fourteen": "0.1.0",
     "jest-resolve": "24.8.0",
     "jest-watch-typeahead": "0.3.1",
+    "js-table2excel": "^1.0.3",
     "jsbarcode": "^3.11.3",
     "jssha": "^3.2.0",
     "md5": "^2.2.1",
diff --git a/src/api/index.js b/src/api/index.js
index 0beff01..950a545 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -230,6 +230,14 @@
     // Type: 'S' 鏃�
     let shaObj = new jsSHA('SHA-1', 'TEXT')
     param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+
+    let sys_datetime = sessionStorage.getItem('sys_datetime')
+    let app_datetime = sessionStorage.getItem('app_datetime')
+    if (sys_datetime && app_datetime) {
+      let seconds = Math.floor((new Date().getTime() - app_datetime) / 1000)
+      param.timestamp = moment(sys_datetime, 'YYYY-MM-DD HH:mm:ss').add(seconds, 'seconds').format('YYYY-MM-DD HH:mm:ss')
+    }
+    
     shaObj.update(password)
     param.Password = shaObj.getHash('HEX').toUpperCase()
     param.Password = md5(username + param.Password + param.timestamp)
@@ -269,11 +277,18 @@
       return Promise.reject()
     }
 
+    let curTime = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
+    let sys_datetime = sessionStorage.getItem('sys_datetime')
+    let app_datetime = sessionStorage.getItem('app_datetime')
+    if (sys_datetime && app_datetime) {
+      let seconds = Math.floor((new Date().getTime() - app_datetime) / 1000)
+      curTime = moment(sys_datetime, 'YYYY-MM-DD HH:mm:ss').add(seconds, 'seconds').format('YYYY-MM-DD HH:mm:ss') + '.000'
+    }
+
     if (window.GLOB.WebSql) {
       return new Promise((resolve, reject) => {
         CacheUtils.getWebSqlVersion().then(msg => {
           appVersion.oldVersion = msg.version || ''
-          let curTime = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
           let param = {
             func: 's_get_app_version',
             modifydate: msg.createDate || curTime,
@@ -320,7 +335,6 @@
       return new Promise((resolve, reject) => {
         CacheUtils.getIndexDBVersion().then(msg => {
           appVersion.oldVersion = msg.version || ''
-          let curTime = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
           let param = {
             func: 's_get_app_version',
             modifydate: msg.createDate || curTime,
diff --git a/src/components/header/index.jsx b/src/components/header/index.jsx
index 0444ef1..075ba1e 100644
--- a/src/components/header/index.jsx
+++ b/src/components/header/index.jsx
@@ -143,7 +143,7 @@
         edition_type: 'A',
         pro_sys: window.GLOB.systemType === 'production' ? 'Y' : ''
       }).then(result => {
-        let _permAction = {} // 鎸夐挳鏉冮檺
+        let _permAction = {loaded: true} // 鎸夐挳鏉冮檺
 
         if (result && result.status) {
           if (result.UserRoles_Menu) {
@@ -214,7 +214,7 @@
 
         this.props.modifyMenuTree(menulist)
         this.props.modifyMainMenu(mainMenu)
-        this.props.initMenuPermission(thdMenuList)
+        this.props.initMenuPermission([...thdMenuList, {MenuID: 'home_page_id', EasyCode: '', MenuName: 'home', type: 'CustomPage'}])
 
         resolve(_menu)
       })
diff --git a/src/menu/components/search/main-search/dragsearch/card.jsx b/src/menu/components/search/main-search/dragsearch/card.jsx
index 47a7283..c5694d6 100644
--- a/src/menu/components/search/main-search/dragsearch/card.jsx
+++ b/src/menu/components/search/main-search/dragsearch/card.jsx
@@ -8,7 +8,7 @@
 
 const { MonthPicker, WeekPicker, RangePicker } = DatePicker
 
-const Card = ({ id, card, moveCard, copyCard, findCard, editCard, delCard }) => {
+const Card = ({ id, card, showField, moveCard, copyCard, findCard, editCard, delCard }) => {
   const originalIndex = findCard(id).index
   const [{ isDragging }, drag] = useDrag({
     item: { type: 'search', id, originalIndex },
@@ -70,6 +70,7 @@
             wrapperCol = {{xs: { span: 24 }, sm: { span: 16 }}}
             label={card.labelShow !== 'false' ? card.label : ''}
             required={card.required === 'true'}
+            help={showField ? card.field + (card.datefield ? ', ' + card.datefield : '') : ''}
           >
             {card.type === 'text' ?
               <Input style={{marginTop: '4px'}} placeholder={card.labelShow === 'false' ? card.label : ''} value={card.initval} /> : null
diff --git a/src/menu/components/search/main-search/dragsearch/index.jsx b/src/menu/components/search/main-search/dragsearch/index.jsx
index 4193afa..ce5e141 100644
--- a/src/menu/components/search/main-search/dragsearch/index.jsx
+++ b/src/menu/components/search/main-search/dragsearch/index.jsx
@@ -7,7 +7,7 @@
 import Card from './card'
 import './index.scss'
 
-const Container = ({list, placeholder, handleList, handleMenu, deleteMenu }) => {
+const Container = ({list, showField, placeholder, handleList, handleMenu, deleteMenu }) => {
   const [cards, setCards] = useState(list)
   const moveCard = (id, atIndex) => {
     const { card, index } = findCard(id)
@@ -84,6 +84,7 @@
           <Card
             id={`${card.uuid}`}
             card={card}
+            showField={showField}
             moveCard={moveCard}
             copyCard={copyCard}
             editCard={editCard}
diff --git a/src/menu/components/search/main-search/index.jsx b/src/menu/components/search/main-search/index.jsx
index ae2e5b9..4eacfae 100644
--- a/src/menu/components/search/main-search/index.jsx
+++ b/src/menu/components/search/main-search/index.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Modal, notification, Popover, Icon } from 'antd'
+import { Modal, notification, Popover, Icon, Switch } from 'antd'
 import moment from 'moment'
 
 import Api from '@/api'
@@ -34,6 +34,7 @@
     searchlist: null,    // 鎼滅储鏉′欢闆�
     sqlVerifing: false,  // sql楠岃瘉涓�
     visible: false,      // 妯℃�佹鎺у埗
+    showField: false,
     editcard: null       // 缂栬緫涓厓绱�
   }
 
@@ -339,6 +340,14 @@
     })
   }
 
+  onFieldChange = () => {
+    const { showField } = this.state
+
+    this.setState({
+      showField: !showField
+    })
+  }
+
   clickComponent = (e) => {
     if (sessionStorage.getItem('style-control') === 'true' || sessionStorage.getItem('style-control') === 'component') {
       e.stopPropagation()
@@ -347,13 +356,15 @@
   }
 
   render() {
-    const { dict, card, visible, sqlVerifing } = this.state
+    const { dict, card, visible, sqlVerifing, showField } = this.state
     let _style = resetStyle(card.style)
 
     return (
       <div className={`main-search-edit-list ${card.wrap.float} ${card.wrap.show || ''}`} onClick={this.clickComponent} id={card.uuid} style={_style}>
+        <Switch checkedChildren={dict['model.switch.open']} size="small" unCheckedChildren={dict['model.switch.close']} defaultChecked={showField} onChange={this.onFieldChange} />
         <DragElement
           list={card.search}
+          showField={showField}
           handleList={this.handleList}
           handleMenu={this.handleSearch}
           deleteMenu={this.deleteElement}
diff --git a/src/menu/components/search/main-search/index.scss b/src/menu/components/search/main-search/index.scss
index 6d9928c..be3d2e8 100644
--- a/src/menu/components/search/main-search/index.scss
+++ b/src/menu/components/search/main-search/index.scss
@@ -2,7 +2,14 @@
   min-height: 50px;
   position: relative;
   background: #ffffff;
+  padding-bottom: 15px;
 
+  >.ant-switch {
+    position: absolute;
+    z-index: 3;
+    right: 10px;
+    bottom: 5px;
+  }
   >.anticon-tool {
     position: absolute;
     z-index: 3;
@@ -15,9 +22,9 @@
   }
   > .ant-row {
     min-height: 65px;
-  }
-  .ant-row .ant-col-6 {
-    padding: 0 12px!important;
+    > .ant-col {
+      padding: 0 12px!important;
+    }
   }
   .ant-row.ant-form-item .ant-col {
     padding: 0;
diff --git a/src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx b/src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx
index 09abffc..0b1f3a0 100644
--- a/src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx
+++ b/src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx
@@ -41,6 +41,9 @@
   }, {
     value: 'colspan',
     text: '鍚堝苟鍒�'
+  }, {
+    value: 'index',
+    text: '搴忓彿'
   }]
 
   if (!card.isSub) {
diff --git a/src/menu/components/table/normal-table/columns/editColumn/index.jsx b/src/menu/components/table/normal-table/columns/editColumn/index.jsx
index ed9a99f..3a18837 100644
--- a/src/menu/components/table/normal-table/columns/editColumn/index.jsx
+++ b/src/menu/components/table/normal-table/columns/editColumn/index.jsx
@@ -16,7 +16,8 @@
   picture: ['label', 'field', 'type', 'Align', 'Hide', 'IsSort', 'Width', 'blacklist', 'scale', 'lenWidRadio', 'picSort'],
   colspan: ['label', 'type', 'Align', 'Hide', 'blacklist'],
   custom: ['label', 'type', 'Align', 'Hide', 'Width', 'blacklist'],
-  action: ['label', 'type', 'Align', 'Width']
+  action: ['label', 'type', 'Align', 'Width'],
+  index: ['label', 'type', 'Align', 'Width']
 }
 
 class MainSearch extends Component {
diff --git a/src/tabviews/commontable/index.jsx b/src/tabviews/commontable/index.jsx
index 234cbcc..9a243a0 100644
--- a/src/tabviews/commontable/index.jsx
+++ b/src/tabviews/commontable/index.jsx
@@ -662,8 +662,13 @@
     let result = await Api.genericInterface(param)
 
     this.getStatFieldsValue()
-    
+
     if (result.status) {
+      let start = 1
+      if (setting.laypage) {
+        start = pageSize * (pageIndex - 1) + 1
+      }
+
       this.setState({
         data: result.data.map((item, index) => {
           if (absFields.length) {
@@ -678,6 +683,7 @@
           item.key = index
           item.$$uuid = item[setting.primaryKey] || ''
           item.$$BID = BID || ''
+          item.$Index = start + index
 
           return item
         }),
@@ -736,6 +742,7 @@
           data = data.map(item => {
             if (item.$$uuid === _data.$$uuid) {
               _data.key = item.key
+              _data.$Index = item.$Index
               return _data
             } else {
               return item
diff --git a/src/tabviews/custom/components/card/cardcellList/index.jsx b/src/tabviews/custom/components/card/cardcellList/index.jsx
index cdb560c..01b98b4 100644
--- a/src/tabviews/custom/components/card/cardcellList/index.jsx
+++ b/src/tabviews/custom/components/card/cardcellList/index.jsx
@@ -29,7 +29,6 @@
 
 class CardCellComponent extends Component {
   static propTpyes = {
-    seq: PropTypes.any,              // 搴忓彿
     cards: PropTypes.object,         // 鑿滃崟閰嶇疆淇℃伅
     cardCell: PropTypes.object,
     data: PropTypes.object,
@@ -265,13 +264,13 @@
   }
 
   getContent = (card) => {
-    const { data, cards, seq } = this.props
+    const { data, cards } = this.props
 
     if (card.eleType === 'sequence') {
       return (
         <Col key={card.uuid} span={card.width}>
           <div style={card.style}>
-            <div className={'ant-mk-text'}>{seq}</div>
+            <div className={'ant-mk-text'}>{data.$Index || ''}</div>
           </div>
         </Col>
       )
diff --git a/src/tabviews/custom/components/card/table-card/index.jsx b/src/tabviews/custom/components/card/table-card/index.jsx
index 1ce92a1..4babfe6 100644
--- a/src/tabviews/custom/components/card/table-card/index.jsx
+++ b/src/tabviews/custom/components/card/table-card/index.jsx
@@ -27,7 +27,6 @@
     config: null,              // 鍥捐〃閰嶇疆淇℃伅
     loading: false,            // 鏁版嵁鍔犺浇鐘舵��
     search: null,              // 鎼滅储鏉′欢
-    preIndex: 0,               // 寮�濮嬬储寮�
     pageIndex: 1,              // 椤电爜
     total: 0,                  // 鎬绘暟
     sync: false,               // 鏄惁缁熶竴璇锋眰鏁版嵁
@@ -59,6 +58,7 @@
         item.key = index
         item.$$uuid = item[_config.setting.primaryKey] || ''
         item.$$BID = BID || ''
+        item.$Index = index + 1
         return item
       })
     }
@@ -138,6 +138,7 @@
         item.key = index
         item.$$uuid = item[config.setting.primaryKey] || ''
         item.$$BID = BID || ''
+        item.$Index = index + 1
         return item
       })
 
@@ -229,8 +230,7 @@
     if (config.setting.supModule && !BID) { // BID 涓嶅瓨鍦ㄦ椂锛屼笉鍋氭煡璇�
       this.setState({
         data: [],
-        total: 0,
-        preIndex: 0
+        total: 0
       })
       return
     }
@@ -254,9 +254,9 @@
 
     let result = await Api.genericInterface(param)
     if (result.status) {
-      let _preIndex = 0
+      let start = 1
       if (config.setting.laypage) {
-        _preIndex = config.setting.pageSize * (pageIndex - 1)
+        start = config.setting.pageSize * (pageIndex - 1) + 1
       }
 
       this.setState({
@@ -264,10 +264,10 @@
           item.key = index
           item.$$uuid = item[config.setting.primaryKey] || ''
           item.$$BID = BID || ''
+          item.$Index = index + start
           return item
         }),
         total: result.total,
-        preIndex: _preIndex,
         loading: false
       })
     } else {
@@ -290,7 +290,7 @@
     })
   }
 
-  getLines = (data, seq) => {
+  getLines = (data) => {
     const { config } = this.state
 
     let line = []
@@ -321,7 +321,7 @@
       line.push(
         <Col key={index} span={24}>
           <div className="card-item-box" style={item.style}>
-            <CardCellComponent seq={seq} data={data} cards={config} cardCell={item} elements={item.elements}/>
+            <CardCellComponent data={data} cards={config} cardCell={item} elements={item.elements}/>
           </div>
         </Col>
       )
@@ -340,7 +340,7 @@
   }
 
   render() {
-    const { config, loading, data, BID, pageIndex, preIndex, total } = this.state
+    const { config, loading, data, BID, pageIndex, total } = this.state
 
     return (
       <div className="custom-table-card-box" style={{...config.style}}>
@@ -352,7 +352,7 @@
         }
         <NormalHeader config={config} BID={BID} menuType={this.props.menuType} refresh={this.refreshSearch} />
         {data && data.length > 0 ? <Row className="card-row-list" style={{height: config.wrap.contentHeight}}>
-          {data.map((item, index) => this.getLines(item, preIndex + index + 1))}
+          {data.map(item => this.getLines(item))}
         </Row> : null}
         {data && data.length === 0 ? <div className="card-row-list" style={{height: config.wrap.contentHeight}}>
           <Empty description={false}/>
diff --git a/src/tabviews/custom/components/share/normalTable/index.jsx b/src/tabviews/custom/components/share/normalTable/index.jsx
index e32c343..2d53eb5 100644
--- a/src/tabviews/custom/components/share/normalTable/index.jsx
+++ b/src/tabviews/custom/components/share/normalTable/index.jsx
@@ -191,7 +191,7 @@
           content = `${content.substr(0, 4)}-${content.substr(5, 2)}-${content.substr(8, 2)} ${content.substr(11, 2)}:${content.substr(14, 2)}:${content.substr(17, 2)}`
         }
   
-        content = col.prefix + content + col.postfix
+        content = (col.prefix || '') + content + (col.postfix || '')
       }
 
       if (col.marks) {
@@ -423,7 +423,10 @@
           if (item.rowspan === 'true') {
             rowspans.push(item.field)
           }
-          if (_format && !Math.floor(Math.random() * radio)) {
+          if (item.type === 'index') {
+            item.field = '$Index'
+            item.type = 'text'
+          } else if (_format && !Math.floor(Math.random() * radio)) {
             item.blur = true
           }
   
diff --git a/src/tabviews/custom/components/table/normal-table/index.jsx b/src/tabviews/custom/components/table/normal-table/index.jsx
index cc261ab..c489646 100644
--- a/src/tabviews/custom/components/table/normal-table/index.jsx
+++ b/src/tabviews/custom/components/table/normal-table/index.jsx
@@ -73,6 +73,7 @@
         item.key = index
         item.$$uuid = item[_config.setting.primaryKey] || ''
         item.$$BID = BID || ''
+        item.$Index = index + 1
         return item
       })
     }
@@ -182,11 +183,17 @@
       MKEmitter.emit('resetSelectLine', config.uuid, '', '') // 骞挎挱鏁版嵁鍒囨崲
       reset && MKEmitter.emit('resetTable', config.uuid, repage) // 鍒楄〃閲嶇疆
 
+      let start = 1
+      if (setting.laypage) {
+        start = pageSize * (pageIndex - 1) + 1
+      }
+
       this.setState({
         data: result.data.map((item, index) => {
           item.key = index
           item.$$uuid = item[setting.primaryKey] || ''
           item.$$BID = BID || ''
+          item.$Index = start + index
           return item
         }),
         selectedData: [],
@@ -245,6 +252,7 @@
           data = data.map(item => {
             if (item.$$uuid === _data.$$uuid) {
               _data.key = item.key
+              _data.$Index = item.$Index
               return _data
             } else {
               return item
@@ -507,6 +515,7 @@
         item.key = index
         item.$$uuid = item[config.setting.primaryKey] || ''
         item.$$BID = BID || ''
+        item.$Index = index + 1
         return item
       })
 
diff --git a/src/tabviews/custom/index.jsx b/src/tabviews/custom/index.jsx
index 0fe4f3d..40f0818 100644
--- a/src/tabviews/custom/index.jsx
+++ b/src/tabviews/custom/index.jsx
@@ -184,7 +184,7 @@
         config.urlFields.forEach(field => {
           let val = `'${param ? (param[field] || '') : ''}'`
           regs.push({
-            reg: new RegExp(field, 'ig'),
+            reg: new RegExp('@' + field + '@', 'ig'),
             value: val
           })
         })
diff --git a/src/tabviews/home/index.jsx b/src/tabviews/home/index.jsx
index 26fbcd0..9505906 100644
--- a/src/tabviews/home/index.jsx
+++ b/src/tabviews/home/index.jsx
@@ -1,5 +1,6 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
+import { connect } from 'react-redux'
 import { notification, Spin } from 'antd'
 
 import Api from '@/api'
@@ -17,11 +18,20 @@
   state = {
     loading: true,
     background: sessionStorage.getItem('home_background'),
+    waiting: true,
     view: ''
   }
 
   componentDidMount () {
     this.loadHomeConfig()
+  }
+
+  UNSAFE_componentWillReceiveProps (nextProps) {
+    if (nextProps.permMenus.length > 0 && JSON.stringify(nextProps.permAction) !== '{}') {
+      this.setState({
+        waiting: false
+      })
+    }
   }
 
   loadHomeConfig = () => {
@@ -39,6 +49,7 @@
         } else {
           this.setState({
             loading: false,
+            waiting: false,
             view: 'default'
           })
         }
@@ -57,9 +68,9 @@
   }
 
   render() {
-    const { loading, view, background } = this.state
+    const { loading, waiting, view, background } = this.state
 
-    if (loading) {
+    if (loading || waiting) {
       return (<div className="home-loading-view" style={{background: background}}><Spin className="home-box-spin" size="large" /></div>)
     } else if (view === 'custom') {
       return (<CustomPage MenuID={this.props.MenuID}/>)
@@ -69,4 +80,15 @@
   }
 }
 
-export default Home
\ No newline at end of file
+const mapStateToProps = (state) => {
+  return {
+    permAction: state.permAction,
+    permMenus: state.permMenus
+  }
+}
+
+const mapDispatchToProps = () => {
+  return {}
+}
+
+export default connect(mapStateToProps, mapDispatchToProps)(Home)
\ No newline at end of file
diff --git a/src/tabviews/subtable/index.jsx b/src/tabviews/subtable/index.jsx
index 67a1b5c..ade1f1d 100644
--- a/src/tabviews/subtable/index.jsx
+++ b/src/tabviews/subtable/index.jsx
@@ -596,6 +596,11 @@
     this.getStatFieldsValue(searches)
 
     if (result.status) {
+      let start = 1
+      if (setting.laypage) {
+        start = pageSize * (pageIndex - 1) + 1
+      }
+
       this.setState({
         data: result.data.map((item, index) => {
           if (absFields.length) {
@@ -609,6 +614,7 @@
           item.key = index
           item.$$uuid = item[setting.primaryKey] || ''
           item.$$BID = BID || ''
+          item.$Index = start + index
 
           return item
         }),
@@ -676,6 +682,7 @@
           data = data.map(item => {
             if (item.$$uuid === _data.$$uuid) {
               _data.key = item.key
+              _data.$Index = item.$Index
               return _data
             } else {
               return item
diff --git a/src/tabviews/subtabtable/index.jsx b/src/tabviews/subtabtable/index.jsx
index 7cda524..fc1d490 100644
--- a/src/tabviews/subtabtable/index.jsx
+++ b/src/tabviews/subtabtable/index.jsx
@@ -559,6 +559,11 @@
     this.getStatFieldsValue(searches)
 
     if (result.status) {
+      let start = 1
+      if (setting.laypage) {
+        start = pageSize * (pageIndex - 1) + 1
+      }
+
       this.setState({
         data: result.data.map((item, index) => {
           if (absFields.length) {
@@ -572,6 +577,7 @@
           item.key = index
           item.$$uuid = item[setting.primaryKey] || ''
           item.$$BID = BID || ''
+          item.$Index = start + index
 
           return item
         }),
diff --git a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
index 23ac98f..ea6c15d 100644
--- a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
@@ -452,29 +452,21 @@
 
       table.push(_topRow)
 
-      if (data && abses.length > 0) {
-        data.forEach(item => {
-          let _row = {}
-          _header.forEach(field => {
-            if (item[field] && abses.includes(field)) {
-              _row[field] = Math.abs(item[field])
-            } else {
-              _row[field] = item[field]
-            }
-          })
-  
-          table.push(_row)
-        })
-      } else if (data) {
-        data.forEach(item => {
-          let _row = {}
-          _header.forEach(field => {
+      data && data.forEach((item, index) => {
+        let _row = {}
+
+        item.$Index = index + 1
+
+        _header.forEach(field => {
+          if (item[field] && abses.includes(field)) {
+            _row[field] = Math.abs(item[field])
+          } else {
             _row[field] = item[field]
-          })
-  
-          table.push(_row)
+          }
         })
-      }
+
+        table.push(_row)
+      })
 
       const ws = XLSX.utils.json_to_sheet(table, {header: _header, skipHeader: true})
 
diff --git a/src/tabviews/zshare/actionList/normalbutton/index.jsx b/src/tabviews/zshare/actionList/normalbutton/index.jsx
index 3d98f95..de07156 100644
--- a/src/tabviews/zshare/actionList/normalbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -868,6 +868,9 @@
             subObjs.push(val)
           }
         } else {
+          if (typeof(val) === 'string') {
+            val = val.replace(/'/ig, '"')
+          }
           keys.push(key)
           vals.push(`'${val}'`)
         }
diff --git a/src/tabviews/zshare/mutilform/index.jsx b/src/tabviews/zshare/mutilform/index.jsx
index 68ea6a1..9698394 100644
--- a/src/tabviews/zshare/mutilform/index.jsx
+++ b/src/tabviews/zshare/mutilform/index.jsx
@@ -33,25 +33,13 @@
   }
 
   state = {
-    datatype: null,  // 鏁版嵁绫诲瀷
-    readtype: null,  // 鏄惁鍙
-    readin: null,    // 琛屾暟鎹槸鍚﹀啓鍏�
-    writein: null,   // 鎵ц鏃舵槸鍚﹀~鍏ラ粯璁ql
-    fieldlen: null,  // 瀛楁闀垮害
     formlist: [],    // 琛ㄥ崟椤�
-    intercepts: [],  // 鎴彇瀛楁
     record: {}       // 璁板綍涓嬫媺琛ㄥ崟鍏宠仈瀛楁锛岀敤浜庢暟鎹啓鍏�
   }
 
   componentDidMount () {
     const { data, BData, action } = this.props
 
-    let datatype = {}
-    let readtype = {}
-    let readin = {}
-    let writein = {}
-    let fieldlen = {}
-    let intercepts = []
     let _inputfields = []
     let linkFields = {} // 鍏宠仈鑿滃崟
     let supItemVal = {} // 涓婄骇鑿滃崟鍒濆鍊�
@@ -68,9 +56,6 @@
         linkFields[item.linkField] = linkFields[item.linkField] || []
         linkFields[item.linkField].push(item.field)
       }
-      if (item.interception === 'true') {                                // 瀛楃鎴彇瀛楁
-        intercepts.push(item.field)
-      }
     })
 
     formlist = formlist.map(item => {
@@ -81,24 +66,18 @@
       if (item.type === 'split' || item.type === 'hint') return item
 
       // 鏁版嵁鑷姩濉厖
-      let _readin = item.readin !== 'false'
+      item.readin = item.readin !== 'false'
       if (item.type === 'linkMain' || item.type === 'funcvar') {
-        _readin = false
+        item.readin = false
       }
+      item.readonly = item.readonly === 'true'
+      item.writein = item.writein !== 'false'
 
-      let _fieldlen = item.fieldlength || 50
-      if (item.type === 'textarea' || item.type === 'fileupload' || item.type === 'multiselect' || item.type === 'brafteditor') {
-        _fieldlen = item.fieldlength || 512
-      } else if (item.type === 'number') {
-        _fieldlen = item.decimal ? item.decimal : 0
+      item.fieldlength = item.fieldlength || 50
+      if (item.type === 'number') {
+        item.fieldlength = item.decimal ? item.decimal : 0
         item.initval = item.initval || 0
       }
-
-      datatype[item.field] = item.type
-      readtype[item.field] = item.readonly === 'true'
-      readin[item.field] = _readin
-      writein[item.field] = item.writein !== 'false'
-      fieldlen[item.field] = _fieldlen
 
       if (item.setAll === 'true' && (item.type === 'select' || item.type === 'link' || item.type === 'radio')) { // 娣诲姞绌哄��
         item.options.unshift({
@@ -123,10 +102,10 @@
 
       if (item.type === 'linkMain') {
         newval = BData && BData[item.field] ? BData[item.field] : ''
-      } else if (_readin && !/^date/.test(item.type) && data && data.hasOwnProperty(item.field)) {
+      } else if (item.readin && !/^date/.test(item.type) && data && data.hasOwnProperty(item.field)) {
         newval = data[item.field]
       } else if (item.type === 'date') { // 鏃堕棿鎼滅储
-        if (_readin && data && data.hasOwnProperty(item.field)) {
+        if (item.readin && data && data.hasOwnProperty(item.field)) {
           newval = data[item.field]
         }
         if (newval) {
@@ -139,7 +118,7 @@
           newval = null
         }
       } else if (item.type === 'datemonth') {
-        if (_readin && data && data.hasOwnProperty(item.field)) {
+        if (item.readin && data && data.hasOwnProperty(item.field)) {
           newval = data[item.field]
         }
         if (newval) {
@@ -152,7 +131,7 @@
           newval = null
         }
       } else if (item.type === 'datetime') {
-        if (_readin && data && data.hasOwnProperty(item.field)) {
+        if (item.readin && data && data.hasOwnProperty(item.field)) {
           newval = data[item.field]
         }
         if (newval) {
@@ -223,12 +202,6 @@
     })
 
     this.setState({
-      readin,
-      writein,
-      readtype,
-      datatype,
-      fieldlen,
-      intercepts,
       formlist
     }, () => {
       if (action.setting && action.setting.focus) {
@@ -731,7 +704,7 @@
           </Col>
         )
       } else if (item.type === 'text') {
-        let _max = item.fieldlength || 50
+        let _max = item.fieldlength
         let _rules = [{
           pattern: /^[^']*$/ig,
           message: formRule.input.quotemsg
@@ -787,7 +760,7 @@
                   },
                   ..._rules
                 ]
-              })(<Input placeholder="" autoComplete="off" disabled={item.readonly === 'true'} onChange={(e) => this.handleChange(e, item)} onPressEnter={(e) => this.handleInputSubmit(e, item)} />)}
+              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} onChange={(e) => this.handleChange(e, item)} onPressEnter={(e) => this.handleInputSubmit(e, item)} />)}
             </Form.Item>
           </Col>
         )
@@ -820,8 +793,8 @@
                 ]
               })(
                 precision === null ?
-                <InputNumber disabled={item.readonly === 'true'} onPressEnter={(e) => this.handleInputSubmit(e, item)} /> :
-                <InputNumber precision={precision} disabled={item.readonly === 'true'} onPressEnter={(e) => this.handleInputSubmit(e, item)} />
+                <InputNumber disabled={item.readonly} onPressEnter={(e) => this.handleInputSubmit(e, item)} /> :
+                <InputNumber precision={precision} disabled={item.readonly} onPressEnter={(e) => this.handleInputSubmit(e, item)} />
                 )}
             </Form.Item>
           </Col>
@@ -932,7 +905,7 @@
                   }
                 ]
               })(
-                <Checkbox.Group disabled={item.readonly === 'true'}>
+                <Checkbox.Group disabled={item.readonly}>
                   {item.options.map(option => <Checkbox key={option.key} title={option.Text} value={option.Value}>{option.Text}</Checkbox>)}
                 </Checkbox.Group>
               )}
@@ -962,7 +935,7 @@
                   }
                 ]
               })(
-                <Radio.Group disabled={item.readonly === 'true'} onChange={(e) => {this.selectChange(item, e.target.value)}}>
+                <Radio.Group disabled={item.readonly} onChange={(e) => {this.selectChange(item, e.target.value)}}>
                   {item.options.map(option => <Radio key={option.key} value={option.Value}>{option.Text}</Radio>)}
                 </Radio.Group>
               )}
@@ -997,7 +970,7 @@
                   allowClear={true}
                   filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 || option.props.value.toLowerCase().indexOf(input.toLowerCase()) >= 0}
                   onSelect={(value) => {this.selectChange(item, value)}}
-                  disabled={item.readonly === 'true'}
+                  disabled={item.readonly}
                 >
                   {item.options.map(option =>
                     <Select.Option id={option.key} title={option.Text} key={option.key} value={option.Value}>{option.Text}</Select.Option>
@@ -1035,7 +1008,7 @@
                   showSearch
                   mode="multiple"
                   filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 || option.props.value.toLowerCase().indexOf(input.toLowerCase()) >= 0}
-                  disabled={item.readonly === 'true'}
+                  disabled={item.readonly}
                 >
                   {item.options.map(option =>
                     <Select.Option id={option.key} title={option.Text} key={option.key} value={option.Value}>{option.Text}</Select.Option>
@@ -1068,7 +1041,7 @@
                   }
                 ]
               })(
-                <DatePicker disabled={item.readonly === 'true'} />
+                <DatePicker disabled={item.readonly} />
               )}
             </Form.Item>
           </Col>
@@ -1096,7 +1069,7 @@
                   }
                 ]
               })(
-                <MonthPicker disabled={item.readonly === 'true'} />
+                <MonthPicker disabled={item.readonly} />
               )}
             </Form.Item>
           </Col>
@@ -1124,14 +1097,14 @@
                   }
                 ]
               })(
-                <DatePicker showTime disabled={item.readonly === 'true'} />
+                <DatePicker showTime disabled={item.readonly} />
               )}
             </Form.Item>
           </Col>
         )
       } else if (item.type === 'fileupload') {
         let filelist = this.props.data ? this.props.data[item.field] : item.initval
-        if (filelist && this.state.readin[item.field]) {
+        if (filelist && item.readin) {
           try {
             filelist = filelist.split(',').map((url, index) => {
               return {
@@ -1198,14 +1171,14 @@
                     message: this.props.dict['form.required.input'] + item.label + '!'
                   }
                 ]
-              })(<Input placeholder="" autoComplete="off" disabled={item.readonly === 'true'} />)}
+              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} />)}
             </Form.Item>
           </Col>
         )
       } else if (item.type === 'funcvar') {
         // 鍑芥暟鍙橀噺瀛楁锛岄粯璁や笉鏄剧ず
       } else if (item.type === 'textarea') {
-        let _max = item.fieldlength || 512
+        let _max = item.fieldlength
         let _rules = []
         if (item.encryption !== 'true') {
           _rules = [{
@@ -1244,7 +1217,7 @@
           </Col>
         )
       } else if (item.type === 'brafteditor') {
-        let _max = item.fieldlength || 512
+        let _max = item.fieldlength
 
         fields.push(
           <Col span={item.span || 24} key={index}>
@@ -1282,7 +1255,7 @@
   }
 
   handleConfirm = () => {
-    const { record, intercepts, writein } = this.state
+    const { record, formlist } = this.state
     let _format = {
       date: 'YYYY-MM-DD',
       datemonth: 'YYYY-MM',
@@ -1294,139 +1267,100 @@
       this.props.form.validateFieldsAndScroll((err, values) => {
         if (!err) {
           let search = []
-          // 闅愯棌琛ㄥ崟
-          this.state.formlist.forEach(item => {
+          formlist.forEach(item => {
             if (!item.field) return
-
-            let _item = null
+      
+            let _item = {
+              type: item.type,
+              readonly: item.readonly,
+              readin: item.readin,
+              writein: item.writein,
+              fieldlen: item.fieldlength,
+              key: item.field
+            }
+      
             if (item.type === 'funcvar') {
-              _item = {
-                type: 'funcvar',
-                readonly: 'true',
-                readin: false,
-                writein: writein[item.field],
-                fieldlen: this.state.fieldlen[item.field],
-                key: item.field,
-                value: ''
-              }
-            } else if (item.hidden === 'true') {
+              _item.value = ''
+            } else if (item.hidden === 'true' || (item.supField && !item.supvalue.includes(this.props.form.getFieldValue(item.supField)))) {
               let _val = item.initval
               if (record.hasOwnProperty(item.field)) {
                 _val = record[item.field]
               }
-              
-              _item = {
-                type: this.state.datatype[item.field],
-                readonly: this.state.readtype[item.field],
-                readin: this.state.readin[item.field],
-                writein: writein[item.field],
-                fieldlen: this.state.fieldlen[item.field],
-                key: item.field,
-                value: _val
+              _item.value = _val
+      
+              if (['date', 'datemonth', 'datetime'].includes(item.type)) {
+                if (!_item.value) {
+                  _item.value = ''
+                } else if (_item.value.format) {
+                  _item.value = _item.value.format(_format[item.type])
+                }
+
+                if (item.declareType === 'nvarchar(50)') {
+                  _item.type = 'text'
+                }
+              } else if (item.type === 'text' && _item.value && typeof(_item.value) === 'string') { // 鐗规畩瀛楁鏇挎崲
+                _item.value = _item.value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey)
+                _item.value = _item.value.replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || ''))
+                _item.value = _item.value.replace(/^(\s*)@bid@(\s*)$/ig, (this.props.BID || ''))
               }
-            } else if (item.supField && !item.supvalue.includes(this.props.form.getFieldValue(item.supField))) {
-              _item = {
-                type: this.state.datatype[item.field],
-                readonly: this.state.readtype[item.field],
-                readin: this.state.readin[item.field],
-                writein: writein[item.field],
-                fieldlen: this.state.fieldlen[item.field],
-                key: item.field,
-                value: item.initval
+            } else if (typeof(values[item.field]) !== 'undefined') {
+              let _value = values[item.field]
+      
+              if (item.type === 'datetime') {
+                _value = _value ? moment(_value).format('YYYY-MM-DD HH:mm:ss') : ''
+                if (item.declareType === 'nvarchar(50)') {
+                  _item.type = 'text'
+                }
+              } else if (item.type === 'datemonth') {
+                _value = _value ? moment(_value).format('YYYY-MM') : ''
+                if (item.declareType === 'nvarchar(50)') {
+                  _item.type = 'text'
+                }
+              } else if (item.type === 'date') {
+                _value = _value ? moment(_value).format('YYYY-MM-DD') : ''
+                if (item.declareType === 'nvarchar(50)') {
+                  _item.type = 'text'
+                }
+              } else if (item.type === 'multiselect' || item.type === 'checkbox') {
+                _value = _value ? _value.join(',') : ''
+      
+              } else if (item.type === 'fileupload') {
+                let vals = []
+      
+                if (_value && _value.length > 0) {
+                  _value.forEach(_val => {
+                    if (_val.origin && _val.url) {
+                      vals.push(_val.url)
+                    } else if (!_val.origin && _val.status === 'done' && _val.response) {
+                      vals.push(_val.response)
+                    }
+                  })
+                }
+      
+                _value = vals.join(',')
+              } else if (item.type === 'text' || item.type === 'textarea') {
+                _value = _value.replace(/\t*|\v*/g, '')       // 鍘婚櫎鍒惰〃绗�
+      
+                if (item.interception === 'true') {           // 鍘婚櫎棣栧熬绌烘牸
+                  _value = _value.replace(/(^\s*|\s*$)/g, '')
+                }
+      
+                if (item.type === 'text' && _value) { // 鐗规畩瀛楁鏇挎崲
+                  _value = _value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey)
+                  _value = _value.replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || ''))
+                  _value = _value.replace(/^(\s*)@bid@(\s*)$/ig, (this.props.BID || ''))
+                }
               }
+              _item.value = _value
+            } else {
+              _item.value = ''
             }
-
-            if (!_item) return
-
+      
             if (_item.value === undefined) {
               _item.value = ''
-            } else if (item.type === 'date' || item.type === 'datemonth' || item.type === 'datetime') {
-              if (!_item.value) {
-                _item.value = ''
-              } else if (_item.value.format) {
-                _item.value = _item.value.format(_format[item.type])
-              }
-            } else if (item.type === 'text' && _item.value && typeof(_item.value) === 'string') { // 鐗规畩瀛楁鏇挎崲
-              _item.value = _item.value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey)
-              _item.value = _item.value.replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || ''))
-              _item.value = _item.value.replace(/^(\s*)@bid@(\s*)$/ig, (this.props.BID || ''))
             }
-
+      
             search.push(_item)
-          })
-
-          Object.keys(values).forEach(key => {
-            if (values[key] === undefined) { // 琛ㄥ崟寮傚父锛燂紵锛�
-              if (search.filter(s => s.key === key).length === 0) {
-                search.push({
-                  type: this.state.datatype[key],
-                  readonly: this.state.readtype[key],
-                  readin: this.state.readin[key],
-                  writein: writein[key],
-                  fieldlen: this.state.fieldlen[key],
-                  key: key,
-                  value: ''
-                })
-              }
-              return
-            }
-
-            let _value = ''
-            let _type = this.state.datatype[key]
-            if (_type === 'datetime') {
-              _value = values[key] ? moment(values[key]).format('YYYY-MM-DD HH:mm:ss') : ''
-            } else if (_type === 'datemonth') {
-              _value = values[key] ? moment(values[key]).format('YYYY-MM') : ''
-            } else if (_type === 'date') {
-              _value = values[key] ? moment(values[key]).format('YYYY-MM-DD') : ''
-            } else if (_type === 'number') {
-              _value = values[key]
-
-            } else if (_type === 'multiselect' || _type === 'checkbox') {
-              _value = values[key] ? values[key].join(',') : ''
-
-            } else if (_type === 'fileupload') {
-              let vals = []
-
-              if (values[key] && values[key].length > 0) {
-                values[key].forEach(_val => {
-                  if (_val.origin && _val.url) {
-                    vals.push(_val.url)
-                  } else if (!_val.origin && _val.status === 'done' && _val.response) {
-                    vals.push(Utils.getrealurl(_val.response))
-                  }
-                })
-              }
-
-              _value = vals.join(',')
-            } else if (_type === 'text' || _type === 'textarea') {
-              _value = values[key].replace(/\t*|\v*/g, '') // 鍘婚櫎鍒惰〃绗�
-
-              if (intercepts.includes(key)) {              // 鍘婚櫎棣栧熬绌烘牸
-                _value = _value.replace(/(^\s*|\s*$)/g, '')
-              }
-              if (_type === 'text' && _value) { // 鐗规畩瀛楁鏇挎崲
-                _value = _value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey)
-                _value = _value.replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || ''))
-                _value = _value.replace(/^(\s*)@bid@(\s*)$/ig, (this.props.BID || ''))
-              }
-            } else {
-              _value = values[key]
-            }
-
-            if (_value === undefined) {
-              _value = ''
-            }
-
-            search.push({
-              type: this.state.datatype[key],
-              readonly: this.state.readtype[key],
-              readin: this.state.readin[key],
-              writein: writein[key],
-              fieldlen: this.state.fieldlen[key],
-              key: key,
-              value: _value
-            })
           })
 
           resolve(search)
diff --git a/src/tabviews/zshare/normalTable/index.jsx b/src/tabviews/zshare/normalTable/index.jsx
index 3746355..ac7f9c5 100644
--- a/src/tabviews/zshare/normalTable/index.jsx
+++ b/src/tabviews/zshare/normalTable/index.jsx
@@ -139,7 +139,10 @@
         if (item.rowspan === 'true') {
           rowspans.push(item.field)
         }
-        if (_format && !Math.floor(Math.random() * radio)) {
+        if (item.type === 'index') {
+          item.field = '$Index'
+          item.type = 'text'
+        } else if (_format && !Math.floor(Math.random() * radio)) {
           item.blur = true
         }
 
@@ -165,14 +168,6 @@
           render: (text, record) => {
             return this.getContent(item, record)
           }
-        }
-      }
-      
-      if (item.fixed === true || item.fixed === 'true') {
-        if (index < columns.length / 2) {
-          cell.fixed = 'left'
-        } else {
-          cell.fixed = 'right'
         }
       }
       
diff --git a/src/templates/comtableconfig/source.jsx b/src/templates/comtableconfig/source.jsx
index 6a33c64..47c8a55 100644
--- a/src/templates/comtableconfig/source.jsx
+++ b/src/templates/comtableconfig/source.jsx
@@ -351,6 +351,12 @@
       label: CommonDict['model.form.colspan'],
       subType: 'colspan',
       url: ''
+    },
+    {
+      type: 'columns',
+      label: '搴忓彿',
+      subType: 'index',
+      url: ''
     }
   ]
 
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/columnform/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/columnform/index.jsx
index 01ec3e6..d050d57 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/columnform/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/columnform/index.jsx
@@ -1,6 +1,6 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
-import { Form, Row, Col, Button, Input, InputNumber } from 'antd'
+import { Form, Row, Col, Button, Input, InputNumber, Radio } from 'antd'
 import './index.scss'
 
 class ExcelOutColumn extends Component {
@@ -40,7 +40,7 @@
     return (
       <Form {...formItemLayout} className="verify-form">
         <Row gutter={24}>
-          <Col span={7}>
+          <Col span={5}>
             <Form.Item label={dict['model.form.field']}>
               {getFieldDecorator('Column', {
                 initialValue: '',
@@ -53,7 +53,7 @@
               })(<Input placeholder="" autoComplete="off" />)}
             </Form.Item>
           </Col>
-          <Col span={7}>
+          <Col span={5}>
             <Form.Item label={dict['model.name']}>
               {getFieldDecorator('Text', {
                 initialValue: '',
@@ -66,7 +66,7 @@
               })(<Input placeholder="" autoComplete="off" />)}
             </Form.Item>
           </Col>
-          <Col span={7}>
+          <Col span={5}>
             <Form.Item label={dict['model.form.columnWidth']}>
               {getFieldDecorator('Width', {
                 initialValue: 20,
@@ -79,7 +79,19 @@
               })(<InputNumber min={5} max={200} precision={0} />)}
             </Form.Item>
           </Col>
-          <Col span={3} className="add">
+          <Col span={5}>
+            <Form.Item label="绫诲瀷">
+              {getFieldDecorator('type', {
+                initialValue: 'text'
+              })(
+                <Radio.Group>
+                  <Radio value="text">鏂囨湰</Radio>
+                  <Radio value="image">鍥剧墖</Radio>
+                </Radio.Group>
+              )}
+            </Form.Item>
+          </Col>
+          <Col span={4} className="add">
             <Button onClick={this.handleConfirm} type="primary" className="mk-green">
               娣诲姞
             </Button>
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
index 8fb4902..6a0f7b9 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
@@ -33,14 +33,14 @@
         inputType: 'input',
         editable: true,
         unique: true,
-        width: '25%'
+        width: '20%'
       },
       {
         title: this.props.dict['model.name'],
         dataIndex: 'Text',
         inputType: 'input',
         editable: true,
-        width: '25%'
+        width: '20%'
       },
       {
         title: this.props.dict['model.form.columnWidth'],
@@ -49,7 +49,26 @@
         min: 5,
         max: 200,
         editable: true,
-        width: '25%'
+        width: '20%'
+      },
+      {
+        title: '绫诲瀷',
+        dataIndex: 'type',
+        inputType: 'select',
+        editable: true,
+        required: false,
+        width: '20%',
+        render: (text) => {
+          if (text === 'image') {
+            return '鍥剧墖'
+          } else {
+            return '鏂囨湰'
+          }
+        },
+        options: [
+          {value: 'text', text: '鏂囨湰'},
+          {value: 'image', text: '鍥剧墖'}
+        ]
       },
       {
         title: '鍙栫粷瀵瑰��',
@@ -57,7 +76,7 @@
         inputType: 'select',
         editable: true,
         required: false,
-        width: '25%',
+        width: '20%',
         render: (text) => {
           if (text === 'true') {
             return '鏄�'
@@ -86,6 +105,12 @@
 
     if (card.intertype !== 'system') {
       _verify.enable = 'false'
+    }
+    if (_verify.columns[0] && !_verify.columns[0].type) {
+      _verify.columns = _verify.columns.map(col => {
+        col.type = col.type || 'text'
+        return col
+      })
     }
 
     let defaultscript = ''
@@ -370,6 +395,7 @@
         Text: item.label,
         Width: 20,
         abs: 'false',
+        type: 'text',
         uuid: Utils.getuuid()
       })
     })
@@ -428,6 +454,7 @@
             <Button className="excel-col-add mk-red" title="娓呯┖Excel鍒�" onClick={this.clearField}>
               娓呯┖Excel鍒�
             </Button>
+            <div style={{color: '#959595', fontSize: '13px', paddingLeft: '10px'}}>濡傞渶瀵煎嚭搴忓彿锛岃浣跨敤瀛楁 $Index銆�</div>
             <EditTable actions={['edit', 'move', 'copy', 'del']} type="exceloutcolumn" data={verify.columns} columns={excelColumns} onChange={(columns) => this.setState({verify: {...verify, columns}})}/>
           </TabPane>
           {card.intertype === 'system' ? <TabPane tab={
diff --git a/src/templates/sharecomponent/columncomponent/columnform/index.jsx b/src/templates/sharecomponent/columncomponent/columnform/index.jsx
index 8bfffcb..5932983 100644
--- a/src/templates/sharecomponent/columncomponent/columnform/index.jsx
+++ b/src/templates/sharecomponent/columncomponent/columnform/index.jsx
@@ -11,7 +11,8 @@
   number: ['label', 'field', 'type', 'Align', 'Hide', 'IsSort', 'Width', 'decimal', 'format', 'prefix', 'postfix', 'blacklist', 'perspective', 'sum', 'rowspan'],
   link: ['label', 'field', 'type', 'nameField', 'Align', 'Hide', 'IsSort', 'joint', 'Width', 'fieldlength', 'blacklist'],
   textarea: ['label', 'field', 'type', 'Align', 'Hide', 'IsSort', 'Width', 'prefix', 'postfix', 'fieldlength', 'blacklist'],
-  picture: ['label', 'field', 'type', 'Align', 'Hide', 'IsSort', 'Width', 'fieldlength', 'blacklist', 'scale', 'maxHeight']
+  picture: ['label', 'field', 'type', 'Align', 'Hide', 'IsSort', 'Width', 'fieldlength', 'blacklist', 'scale', 'maxHeight'],
+  index: ['label', 'type', 'Align', 'Width']
 }
 
 class MainSearch extends Component {
diff --git a/src/templates/sharecomponent/fieldscomponent/index.jsx b/src/templates/sharecomponent/fieldscomponent/index.jsx
index 8447dd0..f6a6609 100644
--- a/src/templates/sharecomponent/fieldscomponent/index.jsx
+++ b/src/templates/sharecomponent/fieldscomponent/index.jsx
@@ -54,7 +54,7 @@
     } else if (type === 'columns') {
       // 娣诲姞鏄剧ず鍒楋紝瀛楁闆嗕腑瀛樺湪鏄剧ず鍒楀瓧娈碉紝浣跨敤鏄剧ず鍒楀璞℃浛鎹㈠瓧娈甸泦锛岃缃暟鎹被鍨�
       config.columns.forEach(item => {
-        if (columns.has(item.field.toLowerCase())) {
+        if (item.field && columns.has(item.field.toLowerCase())) {
           let _datatype = columns.get(item.field.toLowerCase()).datatype
           columns.set(item.field.toLowerCase(), {...item, selected: true, datatype: _datatype})
         }
@@ -162,7 +162,7 @@
       config.search = items
     } else if (type === 'columns') {
       config.columns.forEach(item => {
-        if (columnsMap.has(item.field.toLowerCase())) {
+        if (item.field && columnsMap.has(item.field.toLowerCase())) {
           let cell = columnsMap.get(item.field.toLowerCase())
 
           if (cell.selected) {
diff --git a/src/templates/sharecomponent/searchcomponent/dragsearch/card.jsx b/src/templates/sharecomponent/searchcomponent/dragsearch/card.jsx
index 812ed31..0c1cd30 100644
--- a/src/templates/sharecomponent/searchcomponent/dragsearch/card.jsx
+++ b/src/templates/sharecomponent/searchcomponent/dragsearch/card.jsx
@@ -8,7 +8,7 @@
 
 const { MonthPicker, WeekPicker, RangePicker } = DatePicker
 
-const Card = ({ id, card, moveCard, copyCard, findCard, editCard, delCard }) => {
+const Card = ({ id, card, showField, moveCard, copyCard, findCard, editCard, delCard }) => {
   const originalIndex = findCard(id).index
   const [{ isDragging }, drag] = useDrag({
     item: { type: 'search', id, originalIndex },
@@ -72,6 +72,7 @@
             wrapperCol = {{xs: { span: 24 }, sm: { span: 16 }}}
             label={card.labelShow !== 'false' ? card.label : ''}
             required={card.required === 'true'}
+            help={showField ? card.field + (card.datefield ? ', ' + card.datefield : '') : ''}
           >
             {card.type === 'text' ?
               <Input style={{marginTop: '4px'}} value={card.initval} /> : null
diff --git a/src/templates/sharecomponent/searchcomponent/dragsearch/index.jsx b/src/templates/sharecomponent/searchcomponent/dragsearch/index.jsx
index 4af02e9..c152207 100644
--- a/src/templates/sharecomponent/searchcomponent/dragsearch/index.jsx
+++ b/src/templates/sharecomponent/searchcomponent/dragsearch/index.jsx
@@ -7,7 +7,7 @@
 import Card from './card'
 import './index.scss'
 
-const Container = ({list, placeholder, handleList, handleMenu, deleteMenu }) => {
+const Container = ({list, placeholder, showField, handleList, handleMenu, deleteMenu }) => {
   const [cards, setCards] = useState(list)
   const moveCard = (id, atIndex) => {
     const { card, index } = findCard(id)
@@ -130,6 +130,7 @@
           <Card
             id={`${card.uuid}`}
             card={card}
+            showField={showField}
             moveCard={moveCard}
             copyCard={copyCard}
             editCard={editCard}
diff --git a/src/templates/sharecomponent/searchcomponent/index.jsx b/src/templates/sharecomponent/searchcomponent/index.jsx
index c17f639..5a65794 100644
--- a/src/templates/sharecomponent/searchcomponent/index.jsx
+++ b/src/templates/sharecomponent/searchcomponent/index.jsx
@@ -1,7 +1,7 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Icon, Tooltip, Modal, notification } from 'antd'
+import { Icon, Tooltip, Modal, notification, Switch } from 'antd'
 import moment from 'moment'
 
 import Api from '@/api'
@@ -27,6 +27,7 @@
     searchlist: null,    // 鎼滅储鏉′欢闆�
     sqlVerifing: false,  // sql楠岃瘉涓�
     visible: false,      // 妯℃�佹鎺у埗
+    showField: false,
     card: null           // 缂栬緫涓厓绱�
   }
 
@@ -261,6 +262,15 @@
     })
   }
 
+  onFieldChange = () => {
+    const { showField } = this.state
+
+    this.setState({
+      showField: !showField
+    })
+  }
+
+
   /**
    * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊
    */
@@ -275,15 +285,17 @@
   }
 
   render() {
-    const { dict, searchlist, visible, sqlVerifing, card } = this.state
+    const { dict, searchlist, visible, sqlVerifing, card, showField } = this.state
 
     return (
       <div className={'model-table-search-list length' + searchlist.length}>
         <Tooltip placement="bottomLeft" overlayClassName="middle" title={dict['model.tooltip.search.guide']}>
           <Icon type="question-circle" />
         </Tooltip>
+        <Switch checkedChildren={dict['model.switch.open']} unCheckedChildren={dict['model.switch.close']} defaultChecked={showField} onChange={this.onFieldChange} />
         <DragElement
           list={searchlist}
+          showField={showField}
           handleList={this.handleList}
           handleMenu={this.handleSearch}
           deleteMenu={this.deleteElement}
diff --git a/src/templates/sharecomponent/searchcomponent/index.scss b/src/templates/sharecomponent/searchcomponent/index.scss
index cf4253b..4e1549a 100644
--- a/src/templates/sharecomponent/searchcomponent/index.scss
+++ b/src/templates/sharecomponent/searchcomponent/index.scss
@@ -1,6 +1,7 @@
 .model-table-search-list {
   padding: 1px 24px 20px;
   min-height: 87px;
+  position: relative;
   border-bottom: 1px solid #d9d9d9;
 
   .anticon-question-circle {
@@ -9,6 +10,12 @@
     left: -15px;
     top: 5px;
   }
+  >.ant-switch {
+    position: absolute;
+    z-index: 1;
+    right: 20px;
+    bottom: 10px;
+  }
   > .ant-row {
     min-height: 65px;
   }
diff --git a/src/templates/subtableconfig/source.jsx b/src/templates/subtableconfig/source.jsx
index 4c69050..963efc1 100644
--- a/src/templates/subtableconfig/source.jsx
+++ b/src/templates/subtableconfig/source.jsx
@@ -329,6 +329,12 @@
       label: CommonDict['model.form.colspan'],
       subType: 'colspan',
       url: ''
+    },
+    {
+      type: 'columns',
+      label: '搴忓彿',
+      subType: 'index',
+      url: ''
     }
   ]
 }
diff --git a/src/templates/zshare/formconfig.jsx b/src/templates/zshare/formconfig.jsx
index 759648c..a9fa640 100644
--- a/src/templates/zshare/formconfig.jsx
+++ b/src/templates/zshare/formconfig.jsx
@@ -1188,6 +1188,9 @@
       }, {
         value: 'textarea',
         text: Formdict['model.form.textarea']
+      }, {
+        value: 'index',
+        text: '搴忓彿'
       }]
     },
     {
@@ -2423,6 +2426,20 @@
       }]
     },
     {
+      type: 'radio',
+      key: 'declareType',
+      label: '鏁版嵁绫诲瀷',
+      tooltip: '澹版槑鍙橀噺鏃剁殑绫诲瀷锛屾椂闂存牸寮廳atetime鎴栨枃鏈牸寮弉varchar(50)銆�',
+      initVal: card.declareType || 'datetime',
+      options: [{
+        value: 'datetime',
+        text: 'datetime'
+      }, {
+        value: 'nvarchar(50)',
+        text: 'nvarchar(50)'
+      }]
+    },
+    {
       type: 'number',
       key: 'span',
       min: 1,
diff --git a/src/templates/zshare/modalform/index.jsx b/src/templates/zshare/modalform/index.jsx
index dd53a73..1b0addd 100644
--- a/src/templates/zshare/modalform/index.jsx
+++ b/src/templates/zshare/modalform/index.jsx
@@ -24,9 +24,9 @@
   link: ['initval', 'readonly', 'required', 'hidden', 'readin', 'resourceType', 'setAll', 'linkField', 'span', 'labelwidth', 'tooltip', 'extra', 'emptyText', 'enter'],
   fileupload: ['readonly', 'required', 'readin', 'fieldlength', 'maxfile', 'fileType', 'span', 'labelwidth', 'tooltip', 'extra', 'suffix'],
   switch: ['initval', 'openVal', 'closeVal', 'openText', 'closeText', 'readonly', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra'],
-  date: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra'],
-  datemonth: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra'],
-  datetime: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra'],
+  date: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra', 'declareType'],
+  datemonth: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra', 'declareType'],
+  datetime: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra', 'declareType'],
   textarea: ['initval', 'readonly', 'required', 'hidden', 'readin', 'fieldlength', 'span', 'labelwidth', 'maxRows', 'encryption', 'interception', 'tooltip', 'extra'],
   color: ['initval', 'readonly', 'required', 'hidden', 'readin', 'span', 'labelwidth', 'tooltip', 'extra'],
   hint: ['label', 'type', 'blacklist', 'message', 'span', 'labelwidth'],
diff --git a/src/utils/utils-datamanage.js b/src/utils/utils-datamanage.js
index adc9724..8e9bc53 100644
--- a/src/utils/utils-datamanage.js
+++ b/src/utils/utils-datamanage.js
@@ -541,6 +541,9 @@
             subObjs.push(val)
           }
         } else {
+          if (typeof(val) === 'string') {
+            val = val.replace(/'/ig, '"')
+          }
           keys.push(key)
           vals.push(`'${val}'`)
         }
diff --git a/src/views/billprint/index.jsx b/src/views/billprint/index.jsx
index eaa9f8b..6adefcc 100644
--- a/src/views/billprint/index.jsx
+++ b/src/views/billprint/index.jsx
@@ -147,6 +147,11 @@
         config.width = pageParam[config.pageSize][config.pageLayout]
         config.style.height = Math.floor(config.width * pageParam[config.pageSize][config.pageLayout + config.pagePadding])
 
+        if (config.printCustom === 'true' && config.printWidth && config.printHeight) {
+          config.width = config.printWidth
+          config.style.height = config.printHeight
+        }
+
         let params = []
         let _pars = []
 
diff --git a/src/views/login/index.jsx b/src/views/login/index.jsx
index 814683e..d58564c 100644
--- a/src/views/login/index.jsx
+++ b/src/views/login/index.jsx
@@ -326,6 +326,8 @@
             }
 
             sessionStorage.setItem('home_background', res.index_background_color)
+            sessionStorage.setItem('sys_datetime', res.sys_datetime)
+            sessionStorage.setItem('app_datetime', new Date().getTime())
 
             // url鏍囬
             document.title = systemMsg.platTitle
diff --git a/src/views/menudesign/homeform/index.jsx b/src/views/menudesign/homeform/index.jsx
index 6ca64be..ba1e5d7 100644
--- a/src/views/menudesign/homeform/index.jsx
+++ b/src/views/menudesign/homeform/index.jsx
@@ -1,7 +1,9 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
-import { Form, Row, Col, Radio, Icon, Tooltip, InputNumber } from 'antd'
+import { Form, Row, Col, Radio, Icon, Tooltip, InputNumber, notification } from 'antd'
 
+import Api from '@/api'
+import options from '@/store/options.js'
 import './index.scss'
 
 class CustomMenuForm extends Component {
@@ -11,6 +13,71 @@
     updateConfig: PropTypes.func
   }
 
+  state = {
+    menulist: []
+  }
+
+  UNSAFE_componentWillMount () {
+    let _param = {func: 's_get_pc_menus', systemType: options.sysType, debug: 'Y'}
+    _param.pro_sys = window.GLOB.systemType === 'production' ? 'Y' : ''
+
+    Api.getSystemConfig(_param).then(result => {
+      if (result.status) {
+        let menulist = result.fst_menu.map(fst => {
+          let fstItem = {
+            MenuID: fst.MenuID,
+            MenuName: fst.MenuName,
+            value: fst.MenuID,
+            label: fst.MenuName,
+            isLeaf: false,
+            children: []
+          }
+    
+          if (fst.snd_menu) {
+            fstItem.children = fst.snd_menu.map(snd => {
+              let sndItem = {
+                ParentId: fst.MenuID,
+                MenuID: snd.MenuID,
+                MenuName: snd.MenuName,
+                value: snd.MenuID,
+                label: snd.MenuName,
+                children: []
+              }
+    
+              if (snd.trd_menu) {
+                sndItem.children = snd.trd_menu.map(trd => {
+                  let trdItem = {
+                    FstId: fst.MenuID,
+                    ParentId: snd.MenuID,
+                    MenuID: trd.MenuID,
+                    MenuName: trd.MenuName,
+                    MenuNo: trd.MenuNo,
+                    EasyCode: trd.EasyCode,
+                    value: trd.MenuID,
+                    label: trd.MenuName,
+                    disabled: false
+                  }
+
+                  return trdItem
+                })
+              }
+              return sndItem
+            })
+          }
+          return fstItem
+        })
+
+        sessionStorage.setItem('fstMenuList', JSON.stringify(menulist))
+      } else {
+        notification.warning({
+          top: 92,
+          message: result.message,
+          duration: 5
+        })
+      }
+    })
+  }
+
   // 涓�浜岀骇鑿滃崟鍒囨崲
   selectChange = (key, value) => {
     const { config } = this.props
diff --git a/src/views/menudesign/printmenuform/index.jsx b/src/views/menudesign/printmenuform/index.jsx
index a6de29a..b9204e6 100644
--- a/src/views/menudesign/printmenuform/index.jsx
+++ b/src/views/menudesign/printmenuform/index.jsx
@@ -1,6 +1,6 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
-import { Form, Row, Col, InputNumber, Select, Radio } from 'antd'
+import { Form, Row, Col, InputNumber, Select, Radio, Tooltip, Icon } from 'antd'
 
 import './index.scss'
 
@@ -25,6 +25,20 @@
     this.props.updateConfig({...this.props.config, everyPCount: val})
   }
 
+  changePrintWidth = (val) => {
+    if (typeof(val) !== 'number') {
+      val = ''
+    }
+    this.props.updateConfig({...this.props.config, printWidth: val})
+  }
+
+  changePrintHeight = (val) => {
+    if (typeof(val) !== 'number') {
+      val = ''
+    }
+    this.props.updateConfig({...this.props.config, printHeight: val})
+  }
+
   changeLastCount = (val) => {
     if (typeof(val) !== 'number') {
       val = ''
@@ -34,14 +48,67 @@
 
   pageSizeChange = (val) => {
     this.props.updateConfig({...this.props.config, pageSize: val})
+    this.resetPage()
   }
 
   onLayoutChange = (val) => {
     this.props.updateConfig({...this.props.config, pageLayout: val})
+    this.resetPage()
   }
   
   onPaddingChange = (val) => {
     this.props.updateConfig({...this.props.config, pagePadding: val})
+    this.resetPage()
+  }
+
+  onPrintCustomChange = (val) => {
+    this.props.updateConfig({...this.props.config, printCustom: val})
+    this.resetPage()
+  }
+
+  resetPage = () => {
+    this.setState({}, () => {
+      const { config } = this.props
+  
+      if (config.printCustom !== 'true') return
+  
+      let pageSize = config.pageSize || 'A4'
+      let pageLayout = config.pageLayout !== 'horizontal' ? 'vertical' : 'horizontal'
+      let pagePadding = config.pagePadding !== 'without' ? 'default' : 'without'
+  
+      let pageParam = {
+        A4: {
+          vertical: 980,
+          horizontal: 1200,
+          verticaldefault: 1.455,
+          verticalwithout: 1.411,
+          horizontaldefault: 0.679,
+          horizontalwithout: 0.701,
+        },
+        A3: {
+          vertical: 1200,
+          horizontal: 1600,
+          verticaldefault: 1.441,
+          verticalwithout: 1.410,
+          horizontaldefault: 0.688,
+          horizontalwithout: 0.703,
+        },
+        A5: {
+          vertical: 700,
+          horizontal: 1000,
+          verticaldefault: 1.478,
+          verticalwithout: 1.413,
+          horizontaldefault: 0.669,
+          horizontalwithout: 0.700,
+        }
+      }
+  
+      let width = pageParam[pageSize][pageLayout]
+      let height = Math.floor(width * pageParam[pageSize][pageLayout + pagePadding])
+  
+      this.props.updateConfig({...config, printHeight: height, printWidth: width})
+      this.props.form.setFieldsValue({printHeight: height, printWidth: width})
+    })
   }
 
   render() {
@@ -149,6 +216,37 @@
               })(<InputNumber min={1} max={1000} precision={0} onChange={this.changeLastCount}/>)}
             </Form.Item>
           </Col>
+          <Col span={24}>
+            <Form.Item label={
+              <Tooltip placement="topLeft" title="閽堝涓嶈鍒欑焊寮狅紝鍙嚜瀹氫箟璁剧疆鎵撳嵃楂樺害鍜屽搴︼紝娉細鍚屾椂璁剧疆鎵撳嵃瀹藉害鍜岄珮搴﹀悗鏂瑰彲鐢熸晥銆�">
+                <Icon type="question-circle" />
+                鑷畾涔�
+              </Tooltip>
+            }>
+              {getFieldDecorator('printCustom', {
+                initialValue: config.printCustom || 'false'
+              })(
+                <Radio.Group onChange={(e) => {this.onPrintCustomChange(e.target.value)}}>
+                  <Radio value="false">涓嶅惎鐢�</Radio>
+                  <Radio value="true">鍚敤</Radio>
+                </Radio.Group>
+              )}
+            </Form.Item>
+          </Col>
+          {config.printCustom === 'true' ? <Col span={24}>
+            <Form.Item label="鎵撳嵃瀹藉害">
+              {getFieldDecorator('printWidth', {
+                initialValue: config.printWidth || ''
+              })(<InputNumber min={10} max={9999} precision={0} onChange={this.changePrintWidth}/>)}
+            </Form.Item>
+          </Col> : null}
+          {config.printCustom === 'true' ? <Col span={24}>
+            <Form.Item label="鎵撳嵃楂樺害">
+              {getFieldDecorator('printHeight', {
+                initialValue: config.printHeight || ''
+              })(<InputNumber min={10} max={9999} precision={0} onChange={this.changePrintHeight}/>)}
+            </Form.Item>
+          </Col> : null}
         </Row>
       </Form>
     )
diff --git a/src/views/menudesign/printmenuform/index.scss b/src/views/menudesign/printmenuform/index.scss
index 0c9f8a8..0295f37 100644
--- a/src/views/menudesign/printmenuform/index.scss
+++ b/src/views/menudesign/printmenuform/index.scss
@@ -2,4 +2,9 @@
   .ant-input-number {
     width: 100%;
   }
+  .anticon-question-circle {
+    color: #c49f47;
+    position: relative;
+    left: -3px;
+  }
 }
\ No newline at end of file

--
Gitblit v1.8.0