From 324a7b654f3ab96ad0274e96050fde4957749de3 Mon Sep 17 00:00:00 2001
From: xxyy <cathay_xy@163.com>
Date: 星期四, 06 三月 2025 09:12:51 +0800
Subject: [PATCH] 更新项目配置与功能扩展

---
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json                 |    4 
 .gitignore                                                                               |    6 
 Code Management/WMS/WIDESEA_WMSClient/public/index.html                                  |  135 ++
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs |   22 
 Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_DictionaryList.js         |   22 
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Program.cs                       |   11 
 Code Management/WMS/WIDESEA_WMSClient/config/buttons.js                                  |  143 +++
 Code Management/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js                     |   82 +
 Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/deviceProtocol.js          |   58 +
 Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role1.js                  |   61 +
 Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/deviceProtocolDetail.js    |   58 +
 Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role.js                   |   49 +
 Code Management/WMS/WIDESEA_WMSClient/src/extension/basicinfo/router.js                  |   72 +
 Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Dictionary.js             |   65 +
 Code Management/WMS/WIDESEA_WMSClient/vue.config.js                                      |   53 +
 Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/deviceInfo.js              |   87 +
 Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User.js                   |   86 +
 Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/dispatchInfo.js            |   58 +
 Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/methods.js           | 1684 +++++++++++++++++++++++++++++++++++
 Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Log.js                    |   26 
 Code Management/WMS/WIDESEA_WMSClient/tests/unit/example.spec.js                         |   13 
 21 files changed, 2,777 insertions(+), 18 deletions(-)

diff --git a/.gitignore b/.gitignore
index 156aa67..8fb46bf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1681,3 +1681,9 @@
 /Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/copilot-chat/bef6627e/sessions/e6132757-6fba-4638-b3d2-dfa6125d4331
 /Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/copilot-chat/bef6627e/sessions/5f82e1ad-d4db-43ed-9379-9ed44357aea4
 /Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/copilot-chat/bef6627e/sessions/20691605-d649-4ddc-93d5-94d62cef517b
+/Code Management/.vs/Code Management/CopilotIndices/17.13.433.20974/CodeChunks.db
+/Code Management/.vs/Code Management/CopilotIndices/17.13.433.20974/CodeChunks.db-shm
+/Code Management/.vs/Code Management/CopilotIndices/17.13.433.20974/CodeChunks.db-wal
+/Code Management/.vs/Code Management/CopilotIndices/17.13.433.20974/SemanticSymbols.db
+/Code Management/.vs/Code Management/CopilotIndices/17.13.433.20974/SemanticSymbols.db-shm
+/Code Management/.vs/Code Management/CopilotIndices/17.13.433.20974/SemanticSymbols.db-wal
diff --git a/Code Management/WMS/WIDESEA_WMSClient/config/buttons.js b/Code Management/WMS/WIDESEA_WMSClient/config/buttons.js
new file mode 100644
index 0000000..50c4dfd
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/config/buttons.js
@@ -0,0 +1,143 @@
+
+let buttons = [{
+    name: "鏌� 璇�",
+    value: 'Search',
+    icon: 'el-icon-search',
+    class: '',
+    type: 'primary',
+    onClick: function () {
+        this.search();
+    }
+},
+{
+    name: "鏂� 寤�",
+    icon: 'el-icon-plus',
+    value: 'Add',
+    class: '',
+    //  plain:true,
+    type: 'success',
+    // plain:true,
+    onClick: function () {
+        this.add();
+    }
+},
+{
+    name: "缂� 杈�",
+    icon: 'el-icon-edit',
+    value: 'Update',
+    // plain:true,
+    class: '',
+    type: 'primary',
+    onClick: function () {
+        this.edit();
+    }
+},
+{
+    name: "浠诲姟瀹屾垚",
+    icon: '',
+    class: '',
+    value: 'TaskCompleted',
+    type: 'primary',
+    onClick: function () {
+    }
+},
+{
+    name: "浠诲姟鍙栨秷",
+    icon: '',
+    class: '',
+    value: 'TaskCancel',
+    type: 'danger',
+    onClick: function () {
+    }
+},
+{
+    name: "浠诲姟鎭㈠",
+    icon: '',
+    class: '',
+    value: 'TaskRecovery',
+    type: 'danger',
+    onClick: function () {
+    }
+},
+{
+    name: "鏌ョ湅瀹屾暣璺敱",
+    icon: '',
+    class: '',
+    value: 'ViewAllRouter',
+    type: 'info',
+    onClick: function () {
+    }
+},
+{
+    name: "璺敱閰嶇疆",
+    icon: '',
+    class: '',
+    value: 'AddRouters',
+    type: 'success',
+    onClick: function () {
+    }
+},
+{
+    name: "鍥炴粴鍒颁笂涓�姝�",
+    icon: '',
+    class: '',
+    value: 'Previous',
+    type: 'danger',
+    onClick: function () {
+    }
+},
+{
+    name: "璺宠浆鍒颁笅涓�姝�",
+    icon: '',
+    class: '',
+    value: 'Next',
+    type: 'warning',
+    onClick: function () {
+    }
+},
+{
+    name: "鍒� 闄�",
+    icon: 'el-icon-delete',
+    class: '',
+    value: 'Delete',
+    type: 'danger',
+    onClick: function () {
+        this.del();
+    }
+},
+{
+    name: "瀹� 鏍�",
+    icon: 'el-icon-check',
+    class: '',
+    value: 'Audit',
+    plain: true,
+    type: 'primary',
+    onClick: function () {
+        this.audit();
+    }
+},
+{
+    name: "瀵� 鍏�",
+    icon: 'el-icon-top',
+    class: '',
+    type: 'success',
+    plain: true,
+    value: 'Import',
+    onClick: function () {
+        this.import();
+    }
+},
+{
+    name: "瀵� 鍑�",
+    icon: 'el-icon-bottom',
+    type: 'success',
+    plain: true,
+    value: 'Export',
+    onClick: function () {
+        this.export();
+    }
+}
+
+]
+
+export default buttons
\ No newline at end of file
diff --git a/Code Management/WMS/WIDESEA_WMSClient/public/index.html b/Code Management/WMS/WIDESEA_WMSClient/public/index.html
new file mode 100644
index 0000000..548664e
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/public/index.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<html lang="">
+
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width,initial-scale=1.0">
+  <meta name="keywords" content=".netccore,dotnet core,vue,element,element plus,vue3" />
+  <meta name="description" content="" />
+  <link rel="icon" href="<%= BASE_URL %>wcslogo.png">
+  <title><%= htmlWebpackPlugin.options.title %></title>
+</head>
+
+<body>
+  <noscript>
+    <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
+      Please enable it to continue.</strong>
+  </noscript>
+  <div id="app"></div>
+  <!-- built files will be auto injected -->
+</body>
+
+</html>
+<style>
+  html,
+  body {
+    margin: 0;
+    padding: 0;
+    height: 100%;
+    width: 100%;
+  }
+
+  * {
+    box-sizing: border-box;
+  }
+
+  .el-loading {
+    z-index: 999999;
+  }
+
+  .el-table th {
+    display: table-cell !important;
+  }
+
+  .el-loading .el-loading-spinner {
+    padding: 7px;
+    background: #ececec;
+    width: 200px;
+    color: red;
+    left: 0;
+    right: 0;
+    margin: 0 auto;
+    border-radius: 5px;
+    border: 1px solid #a0a0a0;
+
+  }
+
+  h1,
+  h2,
+  h3,
+  h4 {
+    margin: 0;
+  }
+
+  .v-dialog {
+    border-radius: 5px;
+    top: 50%;
+    /* margin-top: -220px !important; */
+  }
+
+  .v-dialog .el-dialog__header {
+    border-top-left-radius: 4px;
+    border-top-right-radius: 4px;
+    padding: 0px 13px;
+    line-height: 53px;
+    border-bottom: 1px solid #e2e2e2;
+    height: 50px;
+    color: white;
+    font-weight: bold;
+    font-size: 14px;
+    background-image: linear-gradient(135deg, #0cd7bd 10%, #50c3f7);
+  }
+
+  .v-dialog .el-dialog__header .el-dialog__headerbtn {
+    top: 3px;
+    right: 0px;
+  }
+
+  .v-dialog .el-dialog__header .el-dialog__headerbtn .el-dialog__close {
+    font-size: 19px;
+    color: white;
+  }
+
+  .v-dialog .el-dialog__body {
+    padding: 0;
+  }
+
+  .el-message {
+    z-index: 3500 !important;
+  }
+
+  .v-date-range .el-input__inner {
+    padding: 0 15px 0 8px
+  }
+
+  .v-date-range .el-input__suffix .el-input__icon {
+    display: table-caption;
+    background: white;
+    margin: 1px;
+    height: auto;
+    margin-right: -4px;
+    height: 33px;
+    width: 19px;
+    font-size: 13px;
+    border-top-right-radius: 3px;
+    border-bottom-right-radius: 3px;
+  }
+
+  .v-date-range .el-icon-circle-check {
+    display: none !important;
+  }
+
+  .v-dialog .el-dialog__header {
+    margin-right: 0;
+  }
+
+  .el-button {
+    font-size: 12px !important;
+  }
+
+  .el-button--small {
+    padding: 0px 15px !important;
+    height: 32px;
+  }
+</style>
\ No newline at end of file
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/methods.js b/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/methods.js
new file mode 100644
index 0000000..fa02eca
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/methods.js
@@ -0,0 +1,1684 @@
+import detailMethods from './detailMethods.js';
+//涓氬姟澶勭悊鏂规硶,鍏ㄩ儴鍙互鐢卞紑鍙戣鐩�
+import serviceFilter from './serviceFilter.js';
+let methods = {
+  //褰撴坊鍔犳墿灞曠粍浠秅ridHeader/gridBody/gridFooter鍙婃槑缁唌odelHeader/modelBody/modelFooter鏃讹紝
+  //濡傛灉瑕佽幏鍙栫埗绾ue瀵硅薄,璇蜂娇鐢ㄦ鏂规硶杩涜鍥炶皟
+  parentCall(fun) {
+    if (typeof fun != 'function') {
+      return console.log('鎵╁睍缁勪欢闇�瑕佷紶鍏ヤ竴涓洖璋冩柟娉曟墠鑳借幏鍙栫埗绾ue瀵硅薄');
+    }
+    fun(this);
+  },
+  getCurrentAction() {
+    if (this.currentReadonly) {
+      return '';
+    }
+    return '--' + (this.currentAction == this.const.ADD ? '鏂板' : '缂栬緫');
+  },
+  quickSearchKeyPress($event) {
+    //鏌ヨ瀛楁涓篿nput鏃讹紝鎸夊洖杞︽煡璇�
+    if ($event.keyCode == 13) {
+      if (this.searchFormFields[this.singleSearch.field] != '') {
+        this.search();
+      }
+    }
+  },
+  getButtons() {
+    //鐢熸垚ViewGrid鐣岄潰鐨勬搷浣滄寜閽強鏇村閫夐」
+    let searchIndex = this.buttons.findIndex((x) => {
+      return x.value == 'Search';
+    });
+    //娣诲姞楂樼骇鏌ヨ
+    let hasOneFormItem =
+      this.searchFormOptions.length == 1 &&
+      this.searchFormOptions[0].length == 1;
+    if (searchIndex != -1 && !hasOneFormItem) {
+      this.buttons.splice(searchIndex + 1, 0, {
+        icon: this.fiexdSearchForm ? 'el-icon-refresh-left' : 'el-icon-search',
+        name: this.fiexdSearchForm ? '閲嶇疆' : '楂樼骇鏌ヨ',
+        plain: true,
+        type: this.buttons[searchIndex].type,
+        onClick: () => {
+          if (this.fiexdSearchForm) {
+            return this.resetSearch();
+          }
+          this.searchBoxShow = !this.searchBoxShow;
+        }
+      });
+    }
+    if (hasOneFormItem) {
+      this.fiexdSearchForm = false;
+    }
+    this.maxBtnLength += searchIndex == -1 ? 0 : 1;
+    // if (this.buttons.length <= this.maxBtnLength) {
+    //   return this.buttons;
+    // }
+    // let btns = this.buttons.slice(0, this.maxBtnLength);
+    // btns[this.maxBtnLength - 1].last = true;
+    // return btns;
+  },
+  extendBtn(btns, source) {
+    //btns鏉冮檺鎸夐挳锛宻ource涓烘墿灞曟寜閽�
+    if (!btns || !(source && source instanceof Array)) {
+      return;
+    }
+    //source閫氳繃鍦ㄨ〃鐨勬墿灞昷s鏂囦欢涓璪uttons瀵瑰簲鎸夐挳鐨勫睘鎬ndex鍐冲畾鎸夐挳鎵�鏀句綅缃�
+    source.forEach((x) => {
+      //閫氳繃鎸夐挳鐨処ndex灞炴�э紝鏀惧埌鎸囧畾鐨勪綅缃�
+      btns.splice(x.index == undefined ? btns.length : x.index, 0, x);
+    });
+    // if (this.extend.buttons.view) {
+    //     this.extend.buttons.view.forEach((x) => {
+    //         //閫氳繃鎸夐挳鐨処ndex灞炴�э紝鏀惧埌鎸囧畾鐨勪綅缃�
+    //         this.buttons.splice(x.index == undefined ? this.buttons.length : x.index, 0, x);
+    //     })
+    // }
+  },
+  initBoxButtons() {
+    //鍒濆鍖朧iewGird涓庡脊鍑烘/鏄庣粏琛ㄦ寜閽�
+    let path = this.$route.path;
+    //閫氳繃鑿滃崟鑾峰彇鐢ㄦ埛鎵�瀵瑰簲鑿滃崟闇�瑕佹樉绀虹殑鎸夐挳
+    let permissionButtons = this.permission.getButtons(
+      path,
+      null,
+      this.extend.tableAction,
+      this.table.name
+    );
+    if (permissionButtons) {
+      //2020.03.31娣诲姞娣辨嫹璐濇寜閽粍
+      permissionButtons.forEach((p) => {
+        let _obj = {};
+        for (const key in p) {
+          _obj[key] = p[key];
+        }
+        this.buttons.push(_obj);
+      });
+      // this.buttons.push(...permissionButtons);
+    }
+    if (!this.extend) {
+      this.extend = {};
+    }
+    if (!this.extend.buttons) {
+      this.extend.buttons = {};
+    }
+    //鏌ヨ鐣岄潰鎵╁睍鎸夐挳(鎵╁睍鎸夐挳鍙嚜琛岄�氳繃璁剧疆鎸夐挳鐨処ndex灞炴�ф樉绀哄埌鍏蜂綋浣嶇疆)
+    if (this.extend.buttons.view) {
+      this.extendBtn(this.buttons, this.extend.buttons.view);
+    }
+
+    //寮瑰嚭妗嗘寜閽�
+    let boxButtons = [];
+
+    let saveBtn = this.buttons.some((x) => {
+      if (
+        x.value &&
+        (x.value.toLowerCase() == this.const.ADD.toLowerCase() ||
+          x.value.toLowerCase() == this.const.EDIT.toLowerCase())
+      )
+        return true;
+    });
+    this.currentReadonly = !saveBtn;
+    //浠庤〃琛ㄦ牸鎿嶄綔鎸夐挳
+    let detailGridButtons = {
+      name: '鍒锋柊',
+      type: 'info',
+      icon: 'el-icon-refresh',
+      onClick() {
+        //濡傛灉鏄庣粏琛ㄥ綋鍓嶇殑鐘舵�佷负鏂板缓鏃讹紝绂佹鍒锋柊
+        if (this.currentAction == this.const.ADD) {
+          return;
+        }
+        this.refreshRow();
+      }
+    };
+
+    let importExcel = this.buttons.some((x) => {
+      if (x.value == this.const.IMPORT) return true;
+    });
+    //濡傛灉鏈夊鍏ユ潈闄�,鍒欓渶瑕佸垵濮嬪寲瀵煎叆缁勪欢
+    if (importExcel) {
+      this.upload.url = this.getUrl(this.const.IMPORT);
+      //瀹氫箟涓嬭浇妯℃澘鐨勬枃浠跺悕
+      this.upload.template.fileName = this.table.cnName;
+      //瀹氫箟涓嬭浇妯℃澘鐨刄rl璺緞
+      this.upload.template.url =
+        this.http.ipAddress + this.getUrl(this.const.DOWNLOADTEMPLATE, true);
+    }
+
+    // disabled
+    //濡傛灉褰撳墠瑙掕壊娌℃湁缂栬緫鎴栨柊寤哄姛鑳斤紝鏌ョ湅鏄庣粏鏃跺瓧娈佃缃叏閮ㄥ彧璇�
+    //鍙湁鏄庣粏琛紝灏嗘槑缁嗚〃涔熻缃负涓嶅彲鑳界紪杈戯紝骞朵笖涓嶆樉绀烘坊鍔犺銆佸垹闄よ
+    if (!saveBtn) {
+      this.editFormOptions.forEach((row) => {
+        row.forEach((x) => {
+          x.disabled = true;
+        });
+      });
+      //娌℃湁鏂板缂栬緫鏉冮檺鐨勶紝寮瑰嚭妗嗛兘璁剧疆涓哄彧璇�
+      this.detail.columns.forEach((column) => {
+        if (column.hasOwnProperty('edit')) {
+          column.readonly = true;
+          // row['edit'] = false;
+        }
+      });
+      //寮瑰嚭妗嗘墿灞曟寜閽�
+      this.extendBtn(boxButtons, this.extend.buttons.box);
+      //寮瑰嚭寮规鎸夐挳(2020.04.21),娌℃湁缂栬緫鎴栨柊寤烘潈闄愭椂锛屼篃鍙互閫氳繃buttons灞炴�ф坊鍔犺嚜瀹氫箟寮瑰嚭妗嗘寜閽�
+      this.boxButtons.push(...boxButtons);
+      this.detailOptions.buttons.push(detailGridButtons);
+      this.detailOptions.buttons.forEach((button) => {
+        if (!button.hasOwnProperty('hidden')) {
+          button.hidden = false;
+        }
+      });
+      //寮瑰嚭妗嗘墿灞曟槑缁嗚〃鎸夐挳
+      this.extendBtn(this.detailOptions.buttons, this.extend.buttons.detail);
+
+      return boxButtons;
+    }
+
+    this.detailOptions.edit = true;
+    boxButtons.push(
+      ...[
+        {
+          name: '淇� 瀛�',
+          icon: 'el-icon-check',
+          type: 'danger',
+          disabled: false,
+          value: 'save',
+          onClick() {
+            this.save();
+          }
+        }
+        // {
+        //   name: '閲� 缃�',
+        //   icon: 'el-icon-refresh-right',
+        //   type: 'primary',
+        //   disabled: false,
+        //   onClick() {
+        //     this.resetEdit();
+        //   }
+        // }
+      ]
+    );
+    //浠庤〃琛ㄦ牸鎿嶄綔鎸夐挳
+    this.detailOptions.buttons.push(
+      ...[
+        {
+          name: '娣诲姞琛�',
+          icon: 'el-icon-plus',
+          type: 'primary',
+          hidden: false,
+          plain: true,
+          onClick() {
+            this.addRow();
+          }
+        },
+        {
+          type: 'danger',
+          plain: true,
+          name: '鍒犻櫎琛�',
+          hidden: false,
+          icon: 'el-icon-delete',
+          onClick() {
+            this.delRow();
+          }
+        },
+        //2022.01.08澧炲姞鏄庣粏琛ㄥ鍏ュ鍑哄姛鑳�
+        //娉ㄦ剰闇�瑕侀噸鍐欏悗鍙版槑缁嗚〃鎺ュ彛鐨勫鍏ヤ笌涓嬭浇妯℃澘銆佸鍑虹殑鏉冮檺,Sys_DictionaryListController.cs/SellOrderListController.cs
+        {
+          type: 'danger',
+          plain: true,
+          name: '瀵煎叆',
+          value: 'import',
+          hidden: false,
+          icon: 'el-icon-upload2',
+          onClick() {
+            this.upload.url = `${this.http.ipAddress}api/${this.detail.table}/${this.const.IMPORT}?table=1`;
+            this.upload.template.url = `${this.http.ipAddress}api/${this.detail.table}/${this.const.DOWNLOADTEMPLATE}`;
+            //瀹氫箟涓嬭浇妯℃澘鐨勬枃浠跺悕
+            this.upload.template.fileName = this.detail.cnName;
+            this.upload.excel = true;
+          }
+        },
+        {
+          type: 'danger',
+          plain: true,
+          name: '瀵煎嚭',
+          value: 'export',
+          icon: 'el-icon-download',
+          hidden: false,
+          onClick() {
+            this.export(true);
+          }
+        }
+      ]
+    );
+    this.detailOptions.buttons.forEach((button) => {
+      if (button.hasOwnProperty('hidden')) {
+        button.hidden = false;
+      }
+    });
+    //寮瑰嚭妗嗘墿灞曟寜閽�
+    this.extendBtn(boxButtons, this.extend.buttons.box);
+
+    //寮瑰嚭妗嗘墿灞曟槑缁嗚〃鎸夐挳
+    this.detailOptions.buttons.push(detailGridButtons);
+    this.extendBtn(this.detailOptions.buttons, this.extend.buttons.detail);
+
+    //寮瑰嚭寮规鎸夐挳
+    this.boxButtons.push(...boxButtons);
+  },
+  onClick(click) {
+    click.apply(this);
+  },
+  changeDropdown(btnName, v1) {
+    let button = this.buttons.filter((x) => {
+      return x.name == btnName;
+    });
+    if (button && button.length > 0) {
+      button[0].onClick.apply(this);
+    }
+  },
+  emptyValue(value) {
+    if (typeof value == 'string' && value.trim() === '') {
+      return true;
+    }
+    if (value instanceof Array && !value.length) {
+      return true;
+    }
+    return value === null || value === undefined || value === '';
+  },
+  getSearchParameters() {
+    //鑾峰彇鏌ヨ鍙傛暟
+    // 2020.09.11澧炲姞鍥哄畾鏌ヨ琛ㄥ崟,濡傛灉璁剧疆鍥哄畾浜嗘煡璇㈣〃鍗曪紝鐐瑰嚮鏌ヨ鏃讹紝涓嶅啀鍏抽棴
+    if (!this.fiexdSearchForm) {
+      this.searchBoxShow = false;
+    }
+
+    let query = { wheres: [] };
+    for (const key in this.searchFormFields) {
+      let value = this.searchFormFields[key];
+      if (this.emptyValue(value)) continue;
+
+      if (typeof value == 'number') {
+        value = value + '';
+      }
+      let displayType = this.getSearchItem(key);
+
+      //鑱旂骇鍙繚鐣欓�変腑鑺傜偣鐨勬渶鍚庝竴涓��
+      if (displayType == 'cascader') {
+        //鏌ヨ涓嬮潰鎵�鏈夌殑瀛愯妭鐐癸紝濡傦細閫変腑鐨勬槸鐖惰妭鐐癸紝搴旇鏌ヨ涓嬮潰鎵�鏈夌殑鑺傜偣鏁版嵁--寰呭畬
+        value = value.length ? value[value.length - 1] + '' : '';
+      }
+      //2021.05.02澧炲姞鍖洪棿鏌ヨ
+      if (
+        typeof value == 'string' ||
+        ['date', 'datetime', 'range'].indexOf(displayType) == -1
+      ) {
+        query.wheres.push({
+          name: key,
+          value:
+            typeof value == 'string' ? (value + '').trim() : value.join(','),
+          displayType: displayType
+        });
+        continue;
+      }
+      for (let index = 0; index < value.length; index++) {
+        if (!this.emptyValue(value[index])) {
+          query.wheres.push({
+            name: key,
+            value: (value[index] + '').trim(),
+            displayType: (() => {
+              if (['date', 'datetime', 'range'].indexOf(displayType) != -1) {
+                return index ? 'lessorequal' : 'thanorequal';
+              }
+              return displayType;
+            })()
+          });
+        }
+      }
+    }
+    return query;
+  },
+  search() {
+    //鏌ヨ
+    // let query = this.getSearchParameters();
+    // this.$refs.table.load(query, true);
+    this.$refs.table.load(null, true);
+  },
+  loadTableBefore(param, callBack) {
+    //鏌ヨ鍓嶈缃煡璇㈡潯浠跺強鍒嗛〉淇℃伅
+    let query = this.getSearchParameters();
+    if (query) {
+      param = Object.assign(param, query);
+    }
+
+    if (this.$route.query.viewflow && this.$route.query.id) {
+      param.wheres.push({
+        name: this.table.key,
+        value: this.$route.query.id
+      });
+    }
+    // if (this.isViewFlow() && data && data.length) {
+    //   let query = JSON.parse(JSON.stringify(this.$route.query));
+    //   query.viewflow = 0;
+    //   this.$router.replace({ path: this.$route.path, query: query });
+    //   this.$nextTick(() => {
+    //     this.getWorkFlowSteps(data[0]);
+    //   });
+    // }
+    let status = this.searchBefore(param);
+    callBack(status);
+  },
+
+  loadTableAfter(data, callBack, result) {
+    //鏌ヨ鍚�
+    //2020.10.30澧炲姞鏌ヨ鍚庤繑鍥炴墍鏈夌殑鏌ヨ淇℃伅
+    let status = this.searchAfter(data, result);
+    callBack(status);
+    //鑷姩寮瑰嚭妗嗗鎵硅鎯�
+  },
+  loadDetailTableBefore(param, callBack) {
+    //鏄庣粏鏌ヨ鍓�
+    //鏂板缓鏃剁姝㈠姞杞芥槑缁�
+    if (this.currentAction == this.const.ADD) {
+      callBack(false);
+      return false;
+    }
+    let status = this.searchDetailBefore(param);
+    callBack(status);
+  },
+  loadDetailTableAfter(data, callBack) {
+    //鏄庣粏鏌ヨ鍚�
+    let status = this.searchDetailAfter(data);
+    callBack(status);
+  },
+  getSearchItem(field) {
+    //鑾峰彇鏌ヨ鐨勫弬鏁�
+    let data;
+    for (let index = 0; index < this.searchFormOptions.length; index++) {
+      if (data) return data.type;
+      const item = this.searchFormOptions[index];
+      data = item.find((x) => {
+        return x.field == field;
+      });
+    }
+
+    return (data || {}).type;
+  },
+  resetSearch() {
+    //閲嶇疆鏌ヨ瀵硅薄
+    this.resetSearchForm();
+    //2020.10.17澧炲姞閲嶇疆鍚庢柟娉�
+    this.resetSearchFormAfter && this.resetSearchFormAfter();
+  },
+  resetEdit() {
+    //閲嶇疆缂栬緫鐨勬暟鎹�
+    let isEdit = this.currentAction != this.const.ADD;
+    //閲嶇疆涔嬪墠
+    if (!this[isEdit ? 'resetUpdateFormBefore' : 'resetAddFormBefore']()) {
+      return;
+    }
+    let objKey = {};
+    //缂栬緫鐘舵�佷笅,涓嶉渶瑕侀噸缃富閿�,鍒涘缓鏃堕棿鍒涘缓浜�
+    if (isEdit) {
+      objKey[this.table.key] = this.editFormFields[this.table.key];
+    }
+    this.resetEditForm(objKey);
+    //閲嶇疆涔嬪悗
+
+    if (!this[isEdit ? 'resetUpdateFormAfter' : 'resetAddFormAfter']()) {
+      return;
+    }
+  },
+  resetSearchForm(sourceObj) {
+    //閲嶇疆鏌ヨ琛�
+    this.resetForm('searchForm', sourceObj);
+  },
+  resetEditForm(sourceObj) {
+    if (this.hasDetail && this.$refs.detail) {
+      // this.$refs.detail.rowData.splice(0);
+      this.$refs.detail.reset();
+    }
+    this.resetForm('form', sourceObj);
+    if (this.$refs.form && this.$refs.form.$refs.volform) {
+      setTimeout(() => {
+        this.$refs.form.$refs.volform.clearValidate();
+      }, 100);
+    }
+  },
+  getKeyValueType(formData, isEditForm) {
+    try {
+      let keyLeft = (isEditForm ? 'e' : 's') + '_b_';
+      formData.forEach((item) => {
+        item.forEach((x) => {
+          if (this.keyValueType.hasOwnProperty(keyLeft + x.field)) {
+            return true;
+          }
+          let data;
+          if (x.type == 'switch') {
+            this.keyValueType[x.field] = 1;
+          } else if (x.bind && x.bind.data) {
+            data = x.bind.data;
+          } else if (x.data) {
+            if (x.data instanceof Array) {
+              data = x.data;
+            } else if (x.data.data && x.data.data instanceof Array) {
+              data = x.data.data;
+            }
+          }
+          if (
+            data &&
+            data.length > 0 &&
+            !this.keyValueType.hasOwnProperty(x.field)
+          ) {
+            this.keyValueType[x.field] = data[0].key;
+            this.keyValueType[keyLeft + x.field] = x.type;
+          }
+        });
+      });
+    } catch (error) {
+      console.log(error.message);
+    }
+  },
+  resetForm(formName, sourceObj) {
+    //   return;
+    //閲嶇疆琛ㄥ崟鏁版嵁
+    if (this.$refs[formName]) {
+      this.$refs[formName].reset();
+    }
+
+    if (!sourceObj) return;
+    let form, keyLeft;
+    if (formName == 'searchForm') {
+      form = this.searchFormFields;
+      keyLeft = 's' + '_b_';
+    } else {
+      form = this.editFormFields;
+      keyLeft = 'e' + '_b_';
+    }
+    //鑾峰彇鏁版嵁婧愮殑data绫诲瀷锛屽惁鍒欏鏋滄暟鎹簮data鐨刱ey鏄暟瀛楋紝閲嶇疆鐨勫�兼槸瀛楃涓插氨鏃犳硶缁戝畾鍊�
+    if (!this.keyValueType._dinit) {
+      this.getKeyValueType(this.editFormOptions, true);
+      this.getKeyValueType(this.searchFormOptions, false);
+      this.keyValueType._dinit = true;
+    }
+    var _cascaderParentTree;
+    for (const key in form) {
+      if (sourceObj.hasOwnProperty(key)) {
+        let newVal = sourceObj[key];
+        let kv_type = this.keyValueType[keyLeft + key];
+
+        if (
+          kv_type == 'selectList' ||
+          kv_type == 'checkbox' ||
+          kv_type == 'cascader' ||
+          kv_type == 'treeSelect'
+        ) {
+          // 2020.05.31澧炲姞iview缁勪欢Cascader
+          // 2020.11.01澧炲姞iview缁勪欢Cascader琛ㄥ崟閲嶇疆鏃舵煡璇㈡墍鏈夌殑鐖惰妭鐐�
+          if (kv_type == 'cascader' || kv_type == 'treeSelect') {
+            var treeDic = this.dicKeys.find((dic) => {
+              return dic.fileds && dic.fileds.indexOf(key) != -1;
+            });
+
+            if (treeDic && treeDic.orginData && treeDic.orginData.length) {
+              let keyIsNum = typeof treeDic.orginData[0].id == 'number';
+
+              if (kv_type == 'cascader') {
+                newVal = keyIsNum ? newVal * 1 || 0 : newVal + '';
+                if (kv_type == 'cascader') {
+                  _cascaderParentTree = this.base.getTreeAllParent(
+                    newVal,
+                    treeDic.orginData
+                  );
+                  if (_cascaderParentTree) {
+                    newVal = _cascaderParentTree.map((x) => {
+                      return x.id;
+                    });
+                  }
+                }
+              } else {
+                if (newVal === null || newVal === undefined) {
+                  newVal = [];
+                } else if (typeof newVal == 'string') {
+                  newVal = newVal.split(',');
+                }
+                if (keyIsNum) {
+                  if (Array.isArray(newVal)) {
+                    newVal = newVal.map((x) => {
+                      return x * 1 || 0;
+                    });
+                  }
+                } else if (typeof newVal == 'number') {
+                  newVal = [newVal + ''];
+                }
+              }
+            } else {
+              newVal = [newVal];
+            }
+          } else if (
+            newVal != '' &&
+            newVal != undefined &&
+            typeof newVal == 'string'
+          ) {
+            newVal = newVal.split(',');
+          } else if (kv_type == 'checkbox') {
+            newVal = [];
+          }
+        } else if (
+          this.keyValueType.hasOwnProperty(key) &&
+          typeof this.keyValueType[key] == 'number' &&
+          newVal * 1 == newVal
+        ) {
+          newVal = newVal * 1;
+        } else {
+          if (newVal == null || newVal == undefined) {
+            newVal = '';
+          } else if (this.numberFields.indexOf(key) != -1) {
+            newVal = newVal * 1 || 0;
+          } else {
+            newVal += '';
+          }
+        }
+        if (newVal instanceof Array) {
+          if (form[key]) {
+            form[key] = [];
+          }
+          form[key] = newVal;
+        } else {
+          form[key] = newVal;
+        }
+      } else {
+        form[key] = form[key] instanceof Array ? [] : '';
+      }
+    }
+  },
+  onBtnClick(param) {
+    this[param.method](param.data);
+  },
+  refresh() {
+    //鍒锋柊
+    this.search();
+    // this.$refs.table.load();
+  },
+  saveBefore(formData) {
+    return true;
+  },
+  saveAfter(formData, result) {
+    return true;
+  },
+  save() {
+    //鏂板鎴栫紪杈戞椂淇濆瓨
+    // if (!this.$refs.form.validate()) return;
+    this.$refs.form.validate((result) => {
+      if (result) {
+        this.saveExecute();
+      }
+    });
+  },
+  async saveExecute() {
+    let editFormFields = {};
+    //涓婁紶鏂囦欢浠ラ�楀彿闅斿紑
+    for (const key in this.editFormFields) {
+      if (
+        this.uploadfiled &&
+        this.uploadfiled.length > 0 &&
+        this.uploadfiled.indexOf(key) != -1 &&
+        this.editFormFields[key] instanceof Array
+      ) {
+        let allPath = this.editFormFields[key].map((x) => {
+          return x.path;
+        });
+        editFormFields[key] = allPath.join(',');
+      } else if (typeof this.editFormFields[key] == 'function') {
+        try {
+          editFormFields[key] = this.editFormFields[key]();
+        } catch (error) { }
+      } else {
+        //2021.05.30淇涓嬫媺妗嗘竻闄ゆ暟鎹悗鍚庡彴涓嶈兘淇濆瓨鐨勯棶棰�
+        if (
+          this.editFormFields[key] === undefined &&
+          this.dicKeys.some((x) => {
+            return x.fileds && x.fileds.indexOf(key) != -1;
+          })
+        ) {
+          editFormFields[key] = null;
+        } else {
+          editFormFields[key] = this.editFormFields[key];
+        }
+      }
+    }
+    //灏嗘暟缁勮浆鎹㈡垚string
+    //2020.11.01澧炲姞绾ц仈澶勭悊
+    for (const key in editFormFields) {
+      if (editFormFields[key] instanceof Array) {
+        var iscascader = this.dicKeys.some((x) => {
+          return (
+            x.type == 'cascader' && x.fileds && x.fileds.indexOf(key) != -1
+          );
+        });
+        if (iscascader && editFormFields[key].length) {
+          editFormFields[key] =
+            editFormFields[key][editFormFields[key].length - 1];
+        } else {
+          editFormFields[key] = editFormFields[key].join(',');
+        }
+      }
+    }
+
+    let formData = {
+      mainData: editFormFields,
+      detailData: null,
+      delKeys: null
+    };
+
+    //鑾峰彇鏄庣粏鏁版嵁(鍓嶅彴鏁版嵁鏄庣粏鏈仛鏍¢獙锛屽緟瀹�.鍚庡彴宸茬粡鏍¢獙)
+    if (this.hasDetail) {
+      formData.detailData = this.$refs.detail.rowData;
+      let _fields = this.detail.columns
+        .filter((c) => {
+          return (
+            c.type == 'selectList' || (c.edit && c.edit.type == 'selectList')
+          );
+        })
+        .map((c) => {
+          return c.field;
+        });
+      //2022.06.20澧炲姞淇濆瓨鏃跺鏄庣粏琛ㄤ笅鎷夋澶氶�夌殑鍒ゆ柇
+      if (_fields.length) {
+        formData.detailData = JSON.parse(JSON.stringify(formData.detailData));
+        formData.detailData.forEach((row) => {
+          for (let index = 0; index < _fields.length; index++) {
+            const _field = _fields[index];
+            if (Array.isArray(row[_field])) {
+              row[_field] = row[_field].join(',');
+            }
+          }
+        });
+      }
+    }
+    if (this.detailOptions.delKeys.length > 0) {
+      formData.delKeys = this.detailOptions.delKeys;
+    }
+    //淇濆瓨鍓嶆嫤鎴�
+    let _currentIsAdd = this.currentAction == this.const.ADD;
+    if (_currentIsAdd) {
+      //2020.12.06澧炲姞鏂板缓鍓嶅紓姝ュ鐞嗘柟娉�
+      //2021.08.16淇寮傛璇硶鍐欓敊鐨勯棶棰�
+      if (!this.addBefore(formData) || !(await this.addBeforeAsync(formData)))
+        return;
+    } else {
+      //2020.12.06澧炲姞淇敼鍓嶅紓姝ュ鐞嗘柟娉�
+      if (
+        !this.updateBefore(formData) ||
+        !(await this.updateBeforeAsync(formData))
+      )
+        return;
+    }
+    let url = this.getUrl(this.currentAction);
+    this.http.post(url, formData, true).then((x) => {
+      //淇濆瓨鍚�
+      if (_currentIsAdd) {
+        if (!this.addAfter(x)) return;
+        //杩炵画娣诲姞
+        if (this.continueAdd && x.status) {
+          this.$success(x.message);
+          //鏂板缓
+          this.currentAction = this.const.ADD;
+          this.currentRow = {};
+          this.resetAdd();
+          this.refresh();
+          return;
+        }
+      } else {
+        if (!this.updateAfter(x)) return;
+      }
+      if (!x.status) return this.$error(x.message);
+      this.$success(x.message || '鎿嶄綔鎴愬姛');
+      //濡傛灉淇濆瓨鎴愬姛鍚庨渶瑕佸叧闂紪杈戞锛岀洿鎺ヨ繑鍥炰笉澶勭悊鍚庨潰
+      if (this.boxOptions.saveClose) {
+        this.boxModel = false;
+        //2020.12.27濡傛灉鏄紪杈戜繚瀛樺悗涓嶉噸缃垎椤甸〉鏁帮紝鍒锋柊椤甸潰鏃惰繕鏄樉绀哄綋鍓嶉〉鐨勬暟鎹�
+        this.$refs.table.load(null, _currentIsAdd);
+        //this.refresh();
+        return;
+      }
+      let resultRow;
+      if (typeof x.data == 'string' && x.data != '') {
+        resultRow = JSON.parse(x.data);
+      } else {
+        resultRow = x.data;
+      }
+
+      if (this.currentAction == this.const.ADD) {
+        //  this.currentRow=x.data;
+        this.editFormFields[this.table.key] = '';
+        this.currentAction = this.const.EDIT;
+        this.currentRow = resultRow.data;
+      }
+      this.resetEditForm(resultRow.data);
+      // console.log(resultRow);
+      if (this.hasDetail) {
+        this.detailOptions.delKeys = [];
+        if (resultRow.list) {
+          this.$refs.detail.rowData.push(...resultRow.list);
+        }
+      }
+      this.$refs.table.load(null, _currentIsAdd);
+      // this.refresh();
+    });
+  },
+  del(rows) {
+    if (rows) {
+      if (!(rows instanceof Array)) {
+        rows = [rows];
+      }
+    } else {
+      rows = this.$refs.table.getSelected();
+    }
+    //鍒犻櫎鏁版嵁
+
+    if (!rows || rows.length == 0) return this.$error('璇烽�夋嫨瑕佸垹闄ょ殑琛�!');
+    let delKeys = rows.map((x) => {
+      return x[this.table.key];
+    });
+    if (!delKeys || delKeys.length == 0)
+      return this.$error('娌℃湁鑾峰彇瑕佸垹闄ょ殑琛屾暟鎹�!');
+    //鍒犻櫎鍓�
+    if (!this.delBefore(delKeys, rows)) {
+      return;
+    }
+    let tigger = false;
+    this.$confirm('纭瑕佸垹闄ら�夋嫨鐨勬暟鎹悧?', '璀﹀憡', {
+      confirmButtonText: '纭畾',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning',
+      center: true
+    }).then(() => {
+      if (tigger) return;
+      tigger = true;
+      let url = this.getUrl(this.const.DEL);
+      this.http.post(url, delKeys, '姝e湪鍒犻櫎鏁版嵁....').then((x) => {
+        if (!x.status) return this.$error(x.message);
+        this.$success("鍒犻櫎鎴愬姛");
+        //鍒犻櫎鍚�
+        if (!this.delAfter(x)) {
+          return;
+        }
+        this.refresh();
+      });
+    });
+  },
+  async modelOpenBeforeAsync(row) {
+    return true;
+  },
+  async initBox() {
+    //2022.01.08澧炲姞鏂板缓鏃堕殣钘忔槑缁嗚〃瀵煎嚭鍔熻兘
+    this.detailOptions.buttons.forEach((x) => {
+      if (x.value == 'export') {
+        x.hidden = this.currentAction == 'Add';
+      }
+    });
+    //鍒濆鍖栨柊寤恒�佺紪杈戠殑寮瑰嚭妗�
+    if (!(await this.modelOpenBeforeAsync(this.currentRow))) return false;
+    this.modelOpenBefore(this.currentRow);
+    if (!this.boxInit) {
+      this.boxInit = true;
+      this.boxModel = true;
+      // this.detailUrl = this.url;
+    }
+    return true;
+  },
+  setEditForm(row) {
+    // if (this.remoteColumns.length == 0 || !rows || rows.length == 0) return;
+    let remoteColumns = this.$refs.table.remoteColumns;
+    remoteColumns.forEach((column) => {
+      this.editFormOptions.forEach((option) => {
+        option.forEach((x) => {
+          if (x.field == column.field) {
+            x.data.data = Object.assign([], x.data, column.bind.data);
+          }
+        });
+      });
+    });
+    this.editFormFields;
+    //閲嶇疆缂栬緫琛ㄥ崟鏁版嵁
+    this.editFormFields[this.table.key] = row[this.table.key];
+
+    this.resetEditForm(row);
+    this.currentAction = this.const.EDIT;
+    this.boxModel = true;
+  },
+  async linkData(row, column) {
+    this.boxOptions.title = this.table.cnName + '(缂栬緫)';
+    //鐐瑰嚮table鍗曞厓鏍煎揩鎹烽摼鎺ユ樉绀虹紪杈戞暟鎹�
+    this.currentAction = this.const.EDIT;
+    this.currentRow = row;
+    if (!(await this.initBox())) return;
+    this.resetDetailTable(row);
+    this.setEditForm(row);
+    this.setContinueAdd(false);
+    //璁剧疆杩滅▼鏌ヨ琛ㄥ崟鐨勯粯璁ey/value
+    this.getRemoteFormDefaultKeyValue();
+    //鐐瑰嚮缂栬緫鎸夐挳寮瑰嚭妗嗗悗锛屽彲浠ュ湪姝ゅ鍐欓�昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+    this.modelOpenProcess(row);
+  },
+  setContinueAdd(isAdd) {
+    if (!this.continueAdd) return;
+    var _button = this.boxButtons.find((x) => {
+      return x.value == 'save';
+    });
+    if (_button) {
+      _button.name = isAdd ? this.continueAddName : '淇� 瀛�';
+    }
+  },
+  resetAdd() {
+    if (this.hasDetail) {
+      this.$refs.detail &&
+        //  this.$refs.detail.rowData &&
+        this.$refs.detail.reset();
+    }
+    let obj = {};
+    //濡傛灉鏈塻witch鏍囩锛岄粯璁ら兘璁剧疆涓哄惁
+    this.editFormOptions.forEach((x) => {
+      x.forEach((item) => {
+        if (item.type == 'switch') {
+          obj[item.field] = 0;
+        }
+      });
+    });
+    this.resetEditForm(obj);
+  },
+  async add() {
+    this.boxOptions.title = this.table.cnName + '(鏂板缓)';
+    //鏂板缓
+    this.currentAction = this.const.ADD;
+    this.currentRow = {};
+    if (!(await this.initBox())) return;
+
+    this.resetAdd();
+    this.setContinueAdd(true);
+    //  this.resetEditForm();
+    this.boxModel = true;
+    //鐐瑰嚮鏂板缓鎸夐挳寮瑰嚭妗嗗悗锛屽彲浠ュ湪姝ゅ鍐欓�昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+    this.modelOpenProcess();
+    // this.modelOpenAfter();
+  },
+  async edit(rows) {
+    this.boxOptions.title = '缂栬緫';
+    //缂栬緫
+    this.currentAction = this.const.EDIT;
+    if (rows) {
+      if (!(rows instanceof Array)) {
+        rows = [rows];
+      }
+    } else {
+      rows = this.$refs.table.getSelected();
+    }
+    if (rows.length == 0) {
+      return this.$error('璇烽�夋嫨瑕佺紪杈戠殑琛�!');
+    }
+    if (rows.length != 1) {
+      return this.$error('鍙兘閫夋嫨涓�琛屾暟鎹繘琛岀紪杈�!');
+    }
+    //璁板綍褰撳墠缂栬緫鐨勮
+    this.currentRow = rows[0];
+    //鍒濆鍖栧脊鍑烘
+    if (!(await this.initBox())) return;
+    this.setContinueAdd(false);
+    //閲嶇疆琛ㄥ崟
+    this.resetDetailTable();
+
+    //璁剧疆褰撳墠鐨勬暟鎹埌琛ㄥ崟涓�
+    this.setEditForm(rows[0]);
+    //璁剧疆杩滅▼鏌ヨ琛ㄥ崟鐨勯粯璁ey/value
+    this.getRemoteFormDefaultKeyValue();
+    //鐐瑰嚮缂栬緫鎸夐挳寮瑰嚭妗嗗悗锛屽彲浠ュ湪姝ゅ鍐欓�昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+    this.modelOpenProcess(rows[0]);
+    // this.modelOpenAfter(rows[0]);
+  },
+  getRemoteFormDefaultKeyValue() {
+    //璁剧疆琛ㄥ崟杩滅▼鏁版嵁婧愮殑榛樿key.value
+    if (this.currentAction != this.const.EDIT || this.remoteKeys.length == 0)
+      return;
+    this.editFormOptions.forEach((x, xIndex) => {
+      x.forEach((item, yIndex) => {
+        if (item.remote) {
+          let column = this.columns.find((x) => {
+            return x.bind && x.bind.key == item.dataKey;
+          });
+          if (!column) return;
+          let key = this.currentRow[item.field];
+          let obj = column.bind.data.find((x) => {
+            return x.key == key;
+          });
+          // obj ? obj.value : key濡傛灉娌℃湁鏌ュ埌鏁版嵁婧愶紝鐩存帴浣跨敤鍘熸暟鎹�
+          item.data = [{ key: key, value: obj ? obj.value : key }];
+          this.editFormOptions[xIndex].splice(yIndex, 1, item);
+          // this.$set(item, 'data', [{ key: key + '', value: obj.value }])
+          //  item.data = [{ key: key + '', value: obj.value }];
+        }
+      });
+    });
+  },
+  modelOpenProcess(row) {
+    this.$nextTick(() => {
+      this.modelOpenAfter(row);
+    });
+    return;
+    // if (!this.$refs.form) {
+    //     let timeOut = setTimeout(x => {
+    //         this.modelOpenAfter(row);
+    //     }, 500)
+    //     return;
+    // }
+    // this.modelOpenAfter(row);
+  },
+  import() {
+    //瀵煎叆(涓婁紶excel),寮瑰嚭瀵煎叆缁勪欢UploadExcel.vue
+    this.upload.excel = true;
+    this.$refs.upload_excel && this.$refs.upload_excel.reset();
+  },
+  download(url, fileName) {
+    //涓嬭浇瀵煎嚭鐨勬枃浠�
+    let xmlResquest = new XMLHttpRequest();
+    xmlResquest.open('GET', url, true);
+    xmlResquest.setRequestHeader('Content-type', 'application/json');
+    xmlResquest.setRequestHeader(
+      'Authorization',
+      this.$store.getters.getToken()
+    );
+    let elink = this.$refs.export;
+    xmlResquest.responseType = 'blob';
+    xmlResquest.onload = function (oEvent) {
+      if (xmlResquest.status != 200) {
+        this.$error('涓嬭浇鏂囦欢鍑洪敊浜�..');
+        return;
+      }
+      let content = xmlResquest.response;
+      //  let elink = this.$refs.export;//document.createElement("a");
+      elink.download = fileName; //+".xlsx";
+      // elink.style.display = "none";
+      let blob = new Blob([content]);
+      elink.href = URL.createObjectURL(blob);
+      //  document.body.appendChild(elink);
+      elink.click();
+      //  document.body.removeChild(elink);
+    };
+    xmlResquest.send();
+  },
+  getFileName(isDetail) {
+    //2021.01.08澧炲姞瀵煎嚭excel鏃惰嚜瀹氫箟鏂囦欢鍚�
+    if (isDetail) {
+      return this.detail.cnName + '.xlsx';
+    }
+    return this.table.cnName + '.xlsx';
+  },
+  export(isDetail) {
+    //瀵煎嚭
+    let url, query, param;
+    if (isDetail) {
+      //鏄庣粏琛ㄥ鍑烘椂濡傛灉鏄柊寤虹姸鎬侊紝绂佹瀵煎嚭
+      if (this.currentAction == 'Add') {
+        return;
+      }
+      url = `api/${this.detail.table}/${this.const.EXPORT}`;
+      param = {
+        wheres: [
+          { name: this.table.key, value: this.editFormFields[this.table.key] }
+        ]
+      };
+    } else {
+      //涓昏〃瀵煎嚭
+      url = this.getUrl(this.const.EXPORT);
+      query = this.getSearchParameters();
+      param = { order: this.pagination.order, wheres: query.wheres || [] };
+    }
+    //2020.06.25澧炲姞瀵煎嚭鍓嶅鐞�
+    if (!isDetail && !this.exportBefore(param)) {
+      return;
+    }
+
+    if (param.wheres && typeof param.wheres == 'object') {
+      param.wheres = JSON.stringify(param.wheres);
+    }
+    let $http = this.http;
+    //2022.09.26澧炲姞鑷畾涔夊鍑烘枃浠跺悕
+    let fileName = this.downloadFileName || this.getFileName(isDetail);
+    //2021.01.08浼樺寲瀵煎嚭鍔熻兘
+    $http
+      .post(url, param, '姝e湪瀵煎嚭鏁版嵁....', { responseType: 'blob' })
+      .then((content) => {
+        const blob = new Blob([content]);
+        if ('download' in document.createElement('a')) {
+          // 闈濱E涓嬭浇
+          const elink = document.createElement('a');
+          elink.download = fileName;
+          elink.style.display = 'none';
+          elink.href = URL.createObjectURL(blob);
+          document.body.appendChild(elink);
+          elink.click();
+          URL.revokeObjectURL(elink.href);
+          document.body.removeChild(elink);
+        } else {
+          // IE10+涓嬭浇
+          navigator.msSaveBlob(blob, fileName);
+        }
+      });
+    //.then(result => {
+    // if (!result.status) {
+    //   return this.$error(result.message);
+    // }
+    // let path = this.getUrl(this.const.DOWNLOAD);
+    // path = path[0] == "/" ? path.substring(1) : path;
+    // this.download(
+    //   $http.ipAddress + path + "?path=" + result.data,
+    //   this.table.cnName + ".xlsx" // filePath
+    // );
+    ///  window.open($http.ipAddress + path + "?fileName=" + filePath, "_self");
+    // });
+  },
+  getSelectRows() {
+    //鑾峰彇閫変腑鐨勮
+    return this.$refs.table.getSelected();
+  },
+  getDetailSelectRows() {
+    //鎴栬幏鍙栨槑缁嗛�変腑鐨勮
+    if (!this.$refs.detail) {
+      return [];
+    }
+    return this.$refs.detail.getSelected();
+  },
+  audit() {
+    //瀹℃牳寮瑰嚭妗�
+    let rows = this.$refs.table.getSelected();
+    if (rows.length == 0) return this.$error('璇烽�夋嫨瑕佸鏍哥殑琛�!');
+    let auditStatus = Object.keys(rows[0]).find(x => { return x.toLowerCase() === 'auditstatus' });
+    if (!auditStatus) {
+      return this.$message.error(`琛ㄥ繀椤诲寘鎷鏍稿瓧娈点�怉uditStatus銆�,骞朵笖鏄痠nt绫诲瀷`)
+    }
+    // let checkStatus = rows.every((x) => {
+    //   return this.$global.audit.status.some(c => { return c === x[auditStatus] || !x[auditStatus] })
+    // });
+    // if (!checkStatus) return this.$error('鍙兘閫夋嫨寰呭鎵规垨瀹℃牳涓殑鏁版嵁!');
+    this.$refs.audit.open(rows);
+  },
+  saveAudit(params, rows, callback) {
+
+    //淇濆瓨瀹℃牳
+    let keys = rows.map(x => { return x[this.table.key] });
+    if (!this.auditBefore(keys, rows)) {
+      return;
+    }
+    let url = `${this.getUrl(this.const.AUDIT)}?auditReason=${params.reason}&auditStatus=${params.value}`
+    this.http.post(url, keys, '瀹℃牳涓�....').then((x) => {
+      if (!this.auditAfter(x, keys)) {
+        return;
+      }
+      if (!x.status) return this.$error(x.message);
+
+      callback && callback(x);
+      this.$success(x.message);
+      this.refresh();
+    });
+  },
+  viewModelCancel() {
+    //鏌ョ湅琛ㄧ粨鏋�
+    this.viewModel = false;
+  },
+  initFormOptions(formOptions, keys, formFields, isEdit) {
+    //鍒濆鍖栨煡璇€�佺紪杈戝璞$殑涓嬫媺妗嗘暟鎹簮銆佸浘鐗囦笂浼犻摼鎺ュ湴鍧�
+    //let defaultOption = { key: "", value: "璇烽�夋嫨" };
+    //鏈変笂浼犵殑瀛楁
+    //2020.05.03鏂板
+    //缂栬緫鏁版嵁婧愮殑绫诲瀷
+    formOptions.forEach((item) => {
+      item.forEach((d) => {
+        if (d.type == 'number') {
+          //2022.08.22浼樺寲琛ㄥ崟绫诲瀷涓簄umber鏃剁殑榛樿鍊�
+          if (formFields[d.field] === '') {
+            formFields[d.field] = undefined;
+          }
+          this.numberFields.push(d.field);
+        }
+        if (
+          d.type == 'img' ||
+          d.type == 'excel' ||
+          d.type == 'file' ||
+          d.columnType == 'img'
+        ) {
+          d.url = this.http.ipAddress + 'api' + this.table.url + 'Upload';
+          this.uploadfiled.push(d.field);
+        }
+        if (!d.dataKey) return true;
+        //2022.02.20寮哄埗寮�鍚仈绾у彲浠ラ�夋嫨鏌愪釜鑺傜偣
+        if (d.type == 'cascader' && !d.hasOwnProperty('changeOnSelect')) {
+          //寮哄埗寮�鍚仈绾у彲浠ラ�夋嫨鏌愪釜鑺傜偣
+          d.changeOnSelect = true;
+        }
+        //寮�鍚繙绋嬫悳绱�
+        if (d.remote) {
+          this.remoteKeys.push(d.dataKey);
+          d.data = []; //{ dicNo: d.dataKey, data: [] };
+          return true;
+        }
+        //2020.05.03澧炲姞缂栬緫琛ㄥ崟瀵筩heckbox鐨勬敮鎸�
+        if (d.type == 'checkbox' && !(formFields[d.field] instanceof Array)) {
+          formFields[d.field] = [];
+        }
+        if (keys.indexOf(d.dataKey) == -1) {
+          //2020.05.03澧炲姞璁板綍缂栬緫瀛楁鐨勬暟鎹簮绫诲瀷
+
+          keys.push(d.dataKey);
+          //2020.05.03淇鏌ヨ琛ㄥ崟涓庣紪杈戣〃鍗晅ype绫诲瀷鍙樻垚寮轰竴鑷存�х殑闂
+          //this.dicKeys.push({ dicNo: d.dataKey, data: [], type: d.type });
+          //  2020.11.01澧炲姞iview缁勪欢Cascader鏁版嵁婧愬瓨鍌�
+          let _dic = {
+            dicNo: d.dataKey,
+            data: [],
+            fileds: [d.field],
+            orginData: []
+          };
+          if (d.type == 'cascader') {
+            _dic.type = 'cascader';
+          }
+          if (isEdit) {
+            _dic['e_type'] = d.type;
+          }
+          this.dicKeys.push(_dic);
+        } else if (d.type == 'cascader') {
+          this.dicKeys.forEach((x) => {
+            if (x.dicNo == d.dataKey) {
+              x.type = 'cascader';
+              x.fileds.push(d.field);
+            }
+          });
+        }
+        if (d.type != 'cascader') {
+          //2020.01.30绉婚櫎鍐呴儴琛ㄥ崟formOptions鏁版嵁婧愰厤缃牸寮廳ata.data锛屾墍鏈夊弬鏁版敼涓轰笌缁勪欢api鏍煎紡鐩稿悓
+          Object.assign(
+            d,
+            this.dicKeys.filter((f) => {
+              return f.dicNo == d.dataKey;
+            })[0],
+            { type: d.type }
+          );
+        }
+      });
+    });
+  },
+  //鍒濆table涓庢槑缁嗚〃鐨勬暟鎹簮鎸囧悜dicKeys瀵硅薄锛屽啀鍘诲悗鍙板姞杞芥暟鎹簮
+  initColumns(scoure, dicKeys, keys) {
+    if (!scoure || !(scoure instanceof Array)) return;
+    scoure.forEach((item) => {
+      if (!item.bind || (item.bind.data && item.bind.data.length > 0))
+        return true;
+      let key = item.bind.key || item.bind.dicNo;
+      if (this.remoteKeys.indexOf(key) != -1) {
+        item.bind.remote = true;
+        return true;
+      }
+      if (this.hasKeyField.indexOf(item.field) == -1) {
+        this.hasKeyField.push(item.field);
+      }
+      var dic = dicKeys.filter((x) => {
+        return x.dicNo == key;
+      });
+      if (!dic || dic.length == 0) {
+        dicKeys.push({ dicNo: key, data: [] });
+        dic = [dicKeys[dicKeys.length - 1]];
+        keys.push(key);
+      }
+      //2020.11.01澧炲姞绾ц仈澶勭悊
+      if (dic[0].type == 'cascader' || dic[0].type == 'treeSelect') {
+        item.bind = { data: dic[0].orginData, type: 'select', key: key };
+      } else {
+        item.bind = dic[0];
+      }
+      //2020.05.03浼樺寲table鏁版嵁婧恈heckbox涓巗elect绫诲瀷浠庣紪杈戝垪涓�夊彇
+      item.bind.type = item.bind.e_type || 'string';
+    });
+  },
+  bindOptions(dic) {
+    //缁戝畾涓嬫媺妗嗙殑鏁版嵁婧�
+    //缁戝畾鍚庡彴鐨勫瓧鍏告暟鎹�
+    dic.forEach((d) => {
+      if (d.data.length >= (this.select2Count || 500)) {
+        if (
+          !this.dicKeys.some((x) => {
+            return (
+              x.dicNo == d.dicNo &&
+              (x.type == 'cascader' || x.type == 'treeSelect')
+            );
+          })
+        ) {
+          d.data.forEach((item) => {
+            item.label = item.value;
+            item.value = item.key;
+          });
+        }
+      }
+      this.dicKeys.forEach((x) => {
+        if (x.dicNo != d.dicNo) return true;
+        //2020.10.26澧炲姞绾ц仈鏁版嵁婧愮粦瀹氬鐞�
+        if (x.type == 'cascader' || x.type == 'treeSelect') {
+          // x.data=d.data;
+          //鐢熸垚tree缁撴瀯
+          let _data = JSON.parse(JSON.stringify(d.data));
+          //2022.04.04澧炲姞绾ц仈瀛楀吀鏁版嵁婧愬埛鏂板悗table娌℃湁鍙樺寲鐨勯棶棰�
+          this.columns.forEach((column) => {
+            if (column.bind && column.bind.key == d.dicNo) {
+              column.bind.data = d.data;
+            }
+          });
+          let arr = this.base.convertTree(_data, (node, data, isRoot) => {
+            if (!node.inited) {
+              node.inited = true;
+              node.label = node.value;
+              node.value = node.key;
+            }
+          });
+          x.data.push(...arr);
+          x.orginData.push(...d.data);
+          //2021.10.17淇鏌ヨ绾ц仈涓嶈兘缁戝畾鏁版嵁婧愮殑闂
+          this.searchFormOptions.forEach((searhcOption) => {
+            searhcOption.forEach((_option) => {
+              if (_option.type == 'cascader' && _option.dataKey == x.dicNo) {
+                _option.data = arr;
+                _option.orginData = d.data;
+              }
+            });
+          });
+          //2021.10.17淇绾ц仈涓嶈兘浜岀骇鍒锋柊鐨勯棶棰�
+          this.editFormOptions.forEach((editOption) => {
+            editOption.forEach((_option) => {
+              if (
+                (_option.type == 'cascader' || _option.type == 'treeSelect') &&
+                _option.dataKey == x.dicNo
+              ) {
+                _option.data = arr;
+                _option.orginData = d.data;
+              }
+            });
+          });
+        } else if (d.data.length > 0 && !d.data[0].hasOwnProperty('key')) {
+          let source = d.data,
+            newSource = new Array(source.length);
+          for (let index = 0; index < source.length; index++) {
+            newSource[index] = {
+              //榛樿浠庡瓧鍏告暟鎹鍑烘潵鐨刱ey閮芥槸string绫诲瀷,浣嗗鏋滄暟鎹粠sql涓煡璇㈢殑鍙兘涓洪潪string,鍚︽槸async-validator闇�瑕侀噸缃缃牸寮�
+              key: source['key'] + '', //source[index][x.config.valueField] + "",
+              value: source['value'] //source[index][x.config.textField]
+            };
+          }
+
+          x.data.push(...newSource);
+        } else {
+          //2020.06.06锛屽鏋滄槸selectList鏁版嵁婧愪娇鐢ㄧ殑鑷畾涔塻ql骞朵笖key鏄暟瀛楋紝寮哄埗杞崲鎴愬瓧绗︿覆
+          if (
+            x.e_type == 'selectList' &&
+            d.data.length > 0 &&
+            typeof d.data[0].key == 'number'
+          ) {
+            d.data.forEach((c) => {
+              c.key = c.key + '';
+            });
+          }
+          x.data.push(...d.data);
+        }
+        if (
+          this.singleSearch &&
+          this.singleSearch.dataKey &&
+          this.singleSearch.dataKey == x.dicNo
+        ) {
+          this.singleSearch.data.splice(0, 1, ...x.data);
+        }
+      });
+    });
+  },
+  getUrl(action, ingorPrefix) {
+    //鏄惁蹇界暐鍓嶇紑/  鑾峰彇鎿嶄綔鐨剈rl
+    return (!ingorPrefix ? '/' : '') + 'api' + this.table.url + action;
+  },
+
+  initDicKeys() {
+    //鍒濆鍖栧瓧鍏告暟鎹�
+    let keys = [];
+    //2022.04.17浼樺寲閲嶆柊鍔犺浇鏁版嵁婧�
+    this.dicKeys.forEach((item) => {
+      item.data.splice(0);
+      item.orginData && item.orginData.splice(0);
+    });
+    //this.dicKeys.splice(0);
+    //鍒濆鍖栫紪杈戞暟鎹簮,榛樿涓轰竴涓┖鏁扮粍锛屽鏋滆姹傚繀濉缃畉ype=number/decimal鐨勬渶灏忓��
+    this.initFormOptions(this.editFormOptions, keys, this.editFormFields, true);
+    //鍒濆鍖栨煡璇㈡暟鎹簮,榛樿涓轰竴涓┖鏁扮粍
+    this.initFormOptions(
+      this.searchFormOptions,
+      keys,
+      this.searchFormFields,
+      false
+    );
+    //鏌ヨ鏃ユ湡璁剧疆涓哄彲閫夊紑濮嬩笌缁撴灉鏃ユ湡
+    this.searchFormOptions.forEach((item) => {
+      item.forEach((x) => {
+        if (x.type == 'date' || x.type == 'datetime') x.range = true;
+      });
+    });
+    //鍒濆鍖杁atatable琛ㄦ暟鎹簮,榛樿涓轰竴涓┖鏁扮粍,dicKeys涓虹晫闈㈡墍鏈夌殑鏁版嵁瀛楀吀缂栧彿
+    this.initColumns(this.columns, this.dicKeys, keys);
+    //2021.05.23榛樿寮�鍚煡璇㈤〉闈㈡墍鏈夊瓧娈垫帓搴�,濡傛灉涓嶉渶瑕佹帓搴忥紝鍦╫nInited閬嶅巻columns璁剧疆sort=false
+    //2021.09.25绉婚櫎寮哄埗鎺掑簭鍔熻兘
+    // this.columns.forEach(x => {
+    //   x.sort = x.render ? false : true;
+    // })
+    if (this.detailOptions && this.detailOptions.columns) {
+      this.initColumns(this.detailOptions.columns, this.dicKeys, keys);
+    }
+    //鍒濆鍖栧揩閫熸煡璇㈠瓧娈�,榛樿浣跨敤浠g爜鐢熸垚鍣ㄩ厤缃殑绗竴涓煡璇㈠瓧娈�
+    if (this.searchFormOptions.length > 0) {
+      this.singleSearch = {
+        dataKey: this.searchFormOptions[0][0].dataKey,
+        dicNo: this.searchFormOptions[0][0].dicNo,
+        field: this.searchFormOptions[0][0].field,
+        title: this.searchFormOptions[0][0].title,
+        type: this.searchFormOptions[0][0].type,
+        data: []
+      };
+      // this.singleSearch = this.searchFormOptions[0][0];
+    }
+    if (keys.length == 0) return;
+    let $this = this;
+    this.http.post('/api/Sys_Dictionary/GetVueDictionary', keys).then((dic) => {
+
+      $this.bindOptions(dic);
+      //2022.04.04澧炲姞瀛楀吀鍔犺浇瀹屾垚鏂规硶
+      $this.dicInited && $this.dicInited(dic);
+    });
+  },
+  setFiexdColumn(columns, containerWidth) {
+    //璁$畻鏁翠釜table鐨勫搴︼紝鏍规嵁瀹藉害鍐冲畾鏄惁鍚敤绗竴琛屾樉绀虹殑鍒椾负鍥哄畾鍒�
+    //2021.09.21绉婚櫎寮哄埗鍥哄畾绗竴鍒�
+    // let columnsWidth = 0;
+    // columns.forEach(x => {
+    //   if (!x.hidden && x.width) {
+    //     columnsWidth += x.width;
+    //   }
+    // });
+    // //鍚敤绗竴鍒椾负鍥哄畾鍒�
+    // if (columnsWidth > containerWidth) {
+    //   let firstColumn = columns.find(x => !x.hidden);
+    //   if (firstColumn) {
+    //     firstColumn.fixed = true;
+    //   }
+    // }
+  },
+  initBoxHeightWidth() {
+    //鍒濆鍖栧脊鍑烘鐨勯珮搴︿笌瀹藉害
+    let clientHeight = document.documentElement.clientHeight;
+    //寮瑰嚭妗嗛珮搴﹁嚦灏�250px
+    clientHeight = clientHeight < 250 ? 250 : clientHeight;
+    let clientWidth = document.documentElement.clientWidth;
+    if (
+      this.editFormOptions.some((x) => {
+        return x.some((item) => {
+          return item.type == 'editor';
+        });
+      })
+    ) {
+      this.editor.uploadImgUrl = this.getUrl('upload');
+      this.boxOptions.height = clientHeight * 0.8;
+      this.boxOptions.width = clientWidth * 0.8;
+    } else {
+      if (this.boxOptions.height) {
+        //濡傛灉楂樺害涓庡搴﹁秴杩囦簡鑾峰彇鍒扮殑鍙楂樺搴︼紝鍒欒涓洪粯璁ょ殑90%楂樺
+        if (this.boxOptions.height > clientHeight * 0.8) {
+          this.boxOptions.height = clientHeight * 0.8;
+        }
+      }
+      if (this.boxOptions.width) {
+        //濡傛灉楂樺害涓庡搴﹁秴杩囦簡鑾峰彇鍒扮殑鍙楂樺搴︼紝鍒欒涓洪粯璁ょ殑90%楂樺
+        if (this.boxOptions.width > clientWidth * 0.8) {
+          this.boxOptions.width = clientWidth * 0.8;
+        }
+      }
+    }
+    //璁$畻鏁翠釜table鐨勫搴︼紝鏍规嵁瀹藉害鍐冲畾鏄惁鍚敤绗竴琛屾樉绀虹殑鍒椾负鍥哄畾鍒�
+    let maxTableWidth = clientWidth - 270;
+    this.setFiexdColumn(this.columns, maxTableWidth);
+
+    this.height = this.tableHeight || clientHeight - 206;
+    this.url = this.getUrl(this.const.PAGE);
+    //璁$畻寮瑰嚭妗嗙殑楂樹笌瀹藉害
+    //濡傛灉鏈夋槑缁嗚〃锛岄珮搴︿笌瀹藉甫璁剧疆涓�0.9/0.82
+    if (this.detail.columns && this.detail.columns.length > 0) {
+      this.hasDetail = true;
+      clientWidth = clientWidth * 0.8;
+      clientHeight = clientHeight * 0.85;
+      if (!this.detailOptions.height) {
+        this.detailOptions.height =
+          clientHeight - this.editFormOptions.length * 36 - 234;
+        this.detailOptions.height =
+          this.detailOptions.height < 240 ? 240 : this.detailOptions.height;
+      }
+
+      this.detailOptions.columns = this.detail.columns;
+      this.detailOptions.pagination.sortName = this.detail.sortName;
+      this.detailOptions.cnName = this.detail.cnName;
+      this.detailOptions.key = this.detail.key;
+      this.detailOptions.url = this.getUrl('getDetailPage');
+      //璁$畻寮瑰嚭妗嗘暣涓猼able鐨勫搴︼紝鏍规嵁瀹藉害鍐冲畾鏄惁鍚敤绗竴琛屾樉绀虹殑鍒椾负鍥哄畾鍒�
+      this.setFiexdColumn(this.detail.columns, clientWidth);
+    } else {
+      let maxColumns = 1; //鏈�澶у垪鏁帮紝鏍规嵁鍒楄绠楀脊妗嗙殑瀹藉害
+      this.editFormOptions.forEach((x) => {
+        if (x.length > maxColumns) maxColumns = x.length;
+      });
+      let maxHeightRate = 0.7,
+        maxWidthRate = 0.5;
+      maxWidthRate = maxColumns / 10 + 0.3;
+      maxHeightRate = (this.editFormOptions.length || 1) * 0.1 + 0.03;
+      maxHeightRate = maxHeightRate > 0.9 ? 0.9 : maxHeightRate;
+      clientWidth = clientWidth * maxWidthRate;
+      clientHeight = clientHeight * maxHeightRate;
+      // this.boxOptions.width = clientWidth * maxWidthRate;
+      // this.boxOptions.height = clientHeight * maxHeightRate;
+    }
+    if (!this.boxOptions.height) {
+      this.boxOptions.height = clientHeight + 10;
+    }
+    if (!this.boxOptions.width) {
+      this.boxOptions.width = clientWidth + 30;
+    }
+  },
+  rowOnChange(row) {
+    this.rowChange(row);
+  },
+  rowChange(row) {
+    //閫変腑琛宑heckbox琛屼簨浠�
+  },
+  rowOnClick({ row, column, event }) {
+    this.rowClick({ row, column, event });
+  },
+  rowClick({ row, column, event }) {
+    // 鐐瑰嚮琛屼簨浠�(2020.11.07)
+  },
+  rowOnDbClick({ row, column, event }) {
+    this.rowDbClick({ row, column, event });
+  },
+  rowDbClick({ row, column, event }) {
+    // 鍙屽嚮鍑昏浜嬩欢(2021.05.23)
+  },
+  $error(message) {
+    this.$message.error(message);
+    // this.$message({
+    //   type: 'error',
+    //   content: message,
+    //   duration: 5
+    // });
+  },
+  $success(message) {
+    this.$message.success(message);
+  },
+  setFiexdSearchForm(visiable) {
+    //2020.09.011澧炲姞鍥哄畾鏌ヨ琛ㄥ崟鍔熻兘,visiable=true榛樿灏嗘煡璇㈣〃鍗曞睍寮�
+    this.fiexdSearchForm = true;
+    let refreshBtn = this.buttons.find((x) => x.name == '鍒� 鏂�');
+    if (visiable) {
+      this.searchBoxShow = true;
+    }
+    if (refreshBtn) {
+      refreshBtn.name = '閲� 缃�';
+      refreshBtn.onClick = function () {
+        this.resetSearch();
+      };
+    }
+  },
+  tableBeginEdit(row, column, index) {
+    //2021.03.19鏄惁寮�鍚煡璇㈢晫闈㈣〃鏍煎弻鍑荤紪杈戠粨鏉熸柟娉�,杩斿洖false涓嶄細缁撴潫缂栬緫
+    return this.beginEdit(row, column, index);
+  },
+  beginEdit(row, column, index) {
+    //2021.03.19鏄惁寮�鍚煡璇㈢晫闈㈣〃鏍煎弻鍑荤紪杈戠粨鏉熸柟娉�,杩斿洖false涓嶄細缁撴潫缂栬緫
+    return true;
+  },
+  tableEndEditBefore(row, column, index) {
+    return this.endEditBefore(row, column, index);
+  },
+  endEditBefore(row, column, index) {
+    //2021.03.19鏄惁寮�鍚煡璇㈢晫闈㈣〃鏍煎弻鍑荤紪杈戠粨鏉熸柟娉�,杩斿洖false涓嶄細缁撴潫缂栬緫
+    return true;
+  },
+  filterPermission(tableName, permission) {
+    //2021.03.19鍒ゆ柇鏄惁鏈夋煇涓〃鐨勬寜閽潈闄�
+    //:["Search","Add","Delete","Update","Import","Export","Upload","Audit"]
+    const _result = (this.$store.state.permission || []).find((x) => {
+      return x.url == '/' + tableName;
+    });
+    return _result && _result.permission.some((x) => x == permission);
+  },
+  destroyed() {
+    //2021.04.11澧炲姞vue椤甸潰閿�姣佹柟娉�,璺敱蹇呴』璁剧疆keepLive:false锛岃缃柟娉曡锛氬墠绔紑鍙戞枃妗�-銆媅绂佺敤椤甸潰缂撳瓨keepAlive]
+  },
+  loadTreeTableChildren(tree, treeNode, resolve) {
+    this.loadTreeChildren.call(this, tree, treeNode, resolve);
+  },
+  loadTreeChildren(tree, treeNode, resolve) {
+    //鏍戝舰缁撴瀯鍔犺浇瀛愯妭鐐�(2021.05.02),鍦╫nInit涓缃簡rowKey涓婚敭瀛楁鍚庢墠浼氱敓鏁�
+    return resolve([]);
+  },
+  importDetailAfter(data) {
+    //2022.01.08澧炲姞鏄庣粏琛ㄥ鍏ュ悗澶勭悊
+  },
+  importExcelAfter(data) {
+    //2022.01.08澧炲姞鏄庣粏琛ㄥ鍏ュ悗鏂规硶鍒ゆ柇
+
+    if (!data.status) {
+      return; // this.$message.error(data.message);
+    }
+    //鏄庣粏琛ㄥ鍏�
+    if (this.boxModel) {
+      if (data.data) {
+        data.data = JSON.parse(data.data);
+      } else {
+        data.data = [];
+      }
+      data.data.forEach((x) => {
+        x[this.detail.key] = undefined;
+        x[this.table.key] = undefined;
+      });
+      this.importDetailAfter(data); //澧炲姞鏄庣粏琛ㄥ鍏ュ悗澶勭悊
+      this.$refs.detail.rowData.unshift(...data.data);
+      this.upload.excel = false;
+      return;
+    }
+    this.importAfter(data);
+  },
+  onGridModelClose(iconClick) {
+    if (this.isBoxAudit) {
+      this.initFormOptionType(false);
+    }
+    this.isBoxAudit = false;
+    this.onModelClose(iconClick);
+  },
+  initAuditColumn() {
+
+  },
+  getWorkFlowSteps(row) {
+    let table = this.table.url.replaceAll('/', '');
+    let url = `api/Sys_WorkFlow/getSteps?tableName=${table}&id=${row[this.table.key]
+      }`;
+    this.http.get(url, {}, true).then((result) => {
+      this.workFlowSteps.splice(0);
+      //鏈夊彲鑳芥病鏈夐厤缃鎵规祦绋�
+      if (!result.list || !result.list.length) {
+        result.list = [];
+        this.auditParam.showAction = true;
+        this.auditParam.height = 240;
+        this.auditParam.showViewButton = row.AuditStatus == 0;
+      } else {
+        this.auditParam.showAction = result.list.some((c) => {
+          return c.isCurrentUser;
+        });
+        this.auditParam.height = 511;
+        this.auditParam.showViewButton = true;
+      }
+      this.auditParam.reason = '';
+      this.auditParam.status = -1;
+      this.auditParam.value = -1;
+      if (result.his) {
+        result.his.forEach((item) => {
+          item.auditStatus = this.getAuditStatus(item.auditStatus);
+        });
+      }
+
+      this.auditParam.auditHis = result.his;
+      this.workFlowSteps.push(...result.list);
+      this.isBoxAudit = true;
+      this.initFormOptionType(true);
+      this.edit(row);
+      this.boxOptions.title = '瀹℃牳';
+    });
+  },
+  initFormOptionType(isReadonly) {
+    this.editFormOptions.forEach((options) => {
+      options.forEach((option) => {
+        if (isReadonly) {
+          if (!option.readonly) {
+            this.formFieldsType.push(option.field);
+            option.readonly = true;
+          }
+        } else {
+          if (this.formFieldsType.indexOf(option.field) != -1) {
+            option.readonly = false;
+          }
+        }
+      });
+    });
+  },
+  getAuditStatus(status) {
+    let data = this.auditParam.data.find((x) => {
+      return x.value == status;
+    });
+    if (!data) {
+      return '-';
+      //   return `瀹℃牳鍊间笉姝g‘:${status}`
+    }
+    return data.text;
+  },
+  initFlowQuery() {
+    if (this.$route.query.viewflow) {
+      this.$refs.table && this.search();
+    }
+  },
+  fullscreen(full) { //寮瑰嚭妗嗗叏灞忔柟娉�
+
+  }
+};
+import customColumns from './ViewGridCustomColumn.js';
+//鍚堝苟鎵╁睍鏂规硶
+methods = Object.assign(methods, detailMethods, serviceFilter, customColumns);
+export default methods;
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/extension/basicinfo/router.js b/Code Management/WMS/WIDESEA_WMSClient/src/extension/basicinfo/router.js
new file mode 100644
index 0000000..d907544
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/extension/basicinfo/router.js
@@ -0,0 +1,72 @@
+
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+import gridBody from './extend/routerview.vue';
+import gridHeader from './extend/addrouters.vue';
+let extension = {
+    components: {
+      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+      gridHeader: gridHeader,
+      gridBody: gridBody,
+      gridFooter: '',
+      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+      modelHeader: '',
+      modelBody: '',
+      modelFooter: ''
+    },
+    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+    methods: {
+       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+      onInit() {  
+        var viewButton = this.buttons.find((x) => x.value == "ViewAllRouter");
+        if (viewButton) {
+            viewButton.onClick = ()=>{
+                this.$refs.gridBody.open();
+            }
+        }
+
+        var addRoutersButton = this.buttons.find((x) => x.value == "AddRouters");
+        if (addRoutersButton) {
+          addRoutersButton.onClick = ()=>{
+                this.$refs.gridHeader.open();
+            }
+        }
+      },
+      onInited() {
+        //妗嗘灦鍒濆鍖栭厤缃悗
+        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+        //this.detailOptions.columns.forEach(column=>{ });
+      },
+      searchBefore(param) {
+        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+        return true;
+      },
+      searchAfter(result) {
+        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+        return true;
+      },
+      addBefore(formData) {
+        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+        return true;
+      },
+      updateBefore(formData) {
+        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+        return true;
+      },
+      rowClick({ row, column, event }) {
+        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+        // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+      },
+      modelOpenAfter(row) {
+        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+        //(3)this.editFormFields.瀛楁='xxx';
+        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+      }
+    }
+  };
+  export default extension;
+  
\ No newline at end of file
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/deviceInfo.js b/Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/deviceInfo.js
new file mode 100644
index 0000000..d882861
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/deviceInfo.js
@@ -0,0 +1,87 @@
+import gridBody from "./extend/importDevicePro.vue";
+let extension = {
+  components: {
+    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+    gridHeader: "",
+    gridBody: gridBody,
+    gridFooter: "",
+    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+    modelHeader: "",
+    modelBody: "",
+    modelFooter: "",
+  },
+  tableAction: "", //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+  methods: {
+    //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+    onInit() {
+      // console.log(this.detailOptions.buttons);
+      // console.log(this.$refs.detail)
+      var detailImport = this.detailOptions.buttons.find(
+        (item) => item.value == "import"
+      );
+      if (detailImport) {
+        detailImport.onClick = function () {
+          this.$refs.gridBody.open();
+        };
+      }
+      this.buttons.unshift({
+        //涔熷彲浠ョ敤push鎴栬�卻plice鏂规硶鏉ヤ慨鏀筨uttons鏁扮粍
+        name: "寮�鍚湇鍔�", //鎸夐挳鍚嶇О
+        icon: "el-icon-document", //鎸夐挳鍥炬爣vue2鐗堟湰瑙乮view鏂囨。icon锛寁ue3鐗堟湰瑙乪lement ui鏂囨。icon(娉ㄦ剰涓嶆槸element puls鏂囨。)
+        type: "primary", //鎸夐挳鏍峰紡vue2鐗堟湰瑙乮view鏂囨。button锛寁ue3鐗堟湰瑙乪lement ui鏂囨。button
+        onClick: function () {
+          this.$Message.success("寮�鍚湇鍔�");
+        },
+      });
+    },
+    onInited() {
+      //妗嗘灦鍒濆鍖栭厤缃悗
+      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+      // this.detailOptions.columns.forEach(column=>{ });
+      // console.log(this)
+    },
+    searchBefore(param) {
+      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+      return true;
+    },
+    searchAfter(result) {
+      //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+      return true;
+    },
+    addBefore(formData) {
+      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+      return true;
+    },
+    updateBefore(formData) {
+      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+      return true;
+    },
+    rowClick({ row, column, event }) {
+      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+      // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+    },
+    modelOpenAfter(row) {
+      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+      //(3)this.editFormFields.瀛楁='xxx';
+      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+    },
+    updated() {
+      //console.log(this.$refs)
+      this.$nextTick(() => {
+        if (this.$refs.upload_excel) {
+          alert("鐐瑰嚮浜嗕笂浼犳寜閽�");
+          this.$refs.upload_excel.upload = function () {
+            console.log("鐐瑰嚮浜嗕笂浼犳寜閽�");
+          };
+        }
+        // alert(1)
+      });
+    },
+  },
+};
+export default extension;
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/deviceProtocol.js b/Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/deviceProtocol.js
new file mode 100644
index 0000000..a39e193
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/deviceProtocol.js
@@ -0,0 +1,58 @@
+
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+
+let extension = {
+    components: {
+      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+      gridHeader: '',
+      gridBody: '',
+      gridFooter: '',
+      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+      modelHeader: '',
+      modelBody: '',
+      modelFooter: ''
+    },
+    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+    methods: {
+       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+      onInit() {  
+      },
+      onInited() {
+        //妗嗘灦鍒濆鍖栭厤缃悗
+        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+        //this.detailOptions.columns.forEach(column=>{ });
+      },
+      searchBefore(param) {
+        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+        return true;
+      },
+      searchAfter(result) {
+        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+        return true;
+      },
+      addBefore(formData) {
+        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+        return true;
+      },
+      updateBefore(formData) {
+        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+        return true;
+      },
+      rowClick({ row, column, event }) {
+        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+        // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+      },
+      modelOpenAfter(row) {
+        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+        //(3)this.editFormFields.瀛楁='xxx';
+        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+      }
+    }
+  };
+  export default extension;
+  
\ No newline at end of file
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/deviceProtocolDetail.js b/Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/deviceProtocolDetail.js
new file mode 100644
index 0000000..a39e193
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/deviceProtocolDetail.js
@@ -0,0 +1,58 @@
+
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+
+let extension = {
+    components: {
+      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+      gridHeader: '',
+      gridBody: '',
+      gridFooter: '',
+      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+      modelHeader: '',
+      modelBody: '',
+      modelFooter: ''
+    },
+    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+    methods: {
+       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+      onInit() {  
+      },
+      onInited() {
+        //妗嗘灦鍒濆鍖栭厤缃悗
+        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+        //this.detailOptions.columns.forEach(column=>{ });
+      },
+      searchBefore(param) {
+        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+        return true;
+      },
+      searchAfter(result) {
+        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+        return true;
+      },
+      addBefore(formData) {
+        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+        return true;
+      },
+      updateBefore(formData) {
+        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+        return true;
+      },
+      rowClick({ row, column, event }) {
+        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+        // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+      },
+      modelOpenAfter(row) {
+        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+        //(3)this.editFormFields.瀛楁='xxx';
+        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+      }
+    }
+  };
+  export default extension;
+  
\ No newline at end of file
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/dispatchInfo.js b/Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/dispatchInfo.js
new file mode 100644
index 0000000..a39e193
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/extension/quartzJob/dispatchInfo.js
@@ -0,0 +1,58 @@
+
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+
+let extension = {
+    components: {
+      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+      gridHeader: '',
+      gridBody: '',
+      gridFooter: '',
+      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+      modelHeader: '',
+      modelBody: '',
+      modelFooter: ''
+    },
+    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+    methods: {
+       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+      onInit() {  
+      },
+      onInited() {
+        //妗嗘灦鍒濆鍖栭厤缃悗
+        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+        //this.detailOptions.columns.forEach(column=>{ });
+      },
+      searchBefore(param) {
+        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+        return true;
+      },
+      searchAfter(result) {
+        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+        return true;
+      },
+      addBefore(formData) {
+        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+        return true;
+      },
+      updateBefore(formData) {
+        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+        return true;
+      },
+      rowClick({ row, column, event }) {
+        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+        // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+      },
+      modelOpenAfter(row) {
+        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+        //(3)this.editFormFields.瀛楁='xxx';
+        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+      }
+    }
+  };
+  export default extension;
+  
\ No newline at end of file
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Dictionary.js b/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Dictionary.js
new file mode 100644
index 0000000..e37ecf6
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Dictionary.js
@@ -0,0 +1,65 @@
+import { h, resolveComponent } from 'vue';
+let extension = {
+    components: { //鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
+        //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        //鎵╁睍缁勪欢寮曞叆鏂瑰紡
+        gridHeader: '',
+        gridBody: '',
+        gridFooter: '',
+        //寮瑰嚭妗�(淇敼銆佺紪杈戙�佹煡鐪�)header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        modelHeader: '',
+        modelBody: '',
+        modelFooter: ''
+    },
+    buttons: [], //鎵╁睍鐨勬寜閽�
+    methods: { //浜嬩欢鎵╁睍
+        onInit() {
+            //鐐瑰嚮鍗曞厓鏍肩紪杈戜笌缁撴潫缂栬緫(榛樿鏄偣鍑诲崟鍏冩牸缂栬緫锛岄紶鏍囩寮�缁撴潫缂栬緫)
+            this.detailOptions.clickEdit = true;
+            this.editFormOptions.forEach(x => {
+                x.forEach(item => {
+                    if (item.field == 'ParentId') {
+                        item.min = 0;
+                    }
+                    if (item.field == "DbSql") {
+                        item.placeholder = "濡傛灉浠庢暟鎹簱鍔犺浇鏁版嵁婧愶紝璇锋寜姝ゆ牸寮忛厤缃畇ql璇彞锛歴elect orderType as key,orderName as value from order  濡傛灉闇�瑕佹牴鎹敤鎴蜂俊鎭姞杞芥暟鎹簮锛岃閰嶇疆濂芥sql,鍐嶄慨鏀瑰悗鍙癉ictionaryHandler.GetCustomDBSql鏂规硶";
+                    }
+                })
+            })
+            this.detailOptions.columns.forEach(x => {
+                if (x.field == 'OrderNo') {
+                    x.summary = true;
+                }
+            })
+            //淇濆瓨鍚庝笉鍏抽棴缂栬緫妗�
+            this.boxOptions.saveClose = false;
+        },
+        onInited() {
+            this.boxOptions.height = document.body.clientHeight * 0.87
+            this.height = this.height - 45;
+        },
+        addBefore(formData) {
+            return this.saveBefore(formData);
+        },
+        updateBefore(formData) {
+            return this.saveBefore(formData);
+        },
+        saveBefore(formData) {
+            if (this.editFormFields.DbSql &&
+                (this.editFormFields.DbSql.indexOf('value') == -1 ||
+                    this.editFormFields.DbSql.indexOf('key') == -1)
+            ) {
+                this.$message.error("sql璇彞蹇呴』鍖呮嫭key/value瀛楁,濡�:select orderType as key,orderName as value from order");
+                return false;
+            }
+            return true;
+        },
+        searchBefore(param) {
+            return true;
+        },
+        searchAfter(result) {
+            return true;
+        }
+    }
+};
+export default extension;
\ No newline at end of file
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_DictionaryList.js b/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_DictionaryList.js
new file mode 100644
index 0000000..da94487
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_DictionaryList.js
@@ -0,0 +1,22 @@
+
+
+let extension = {
+    components: {//鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
+        //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        gridHeader:'',
+        gridbody:'',
+        gridFooter: '',
+        //寮瑰嚭妗�(淇敼銆佺紪杈戙�佹煡鐪�)header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        modelHeader: '',
+        modelBody: '',
+        modelFooter: ''
+    },
+    buttons: [],//鎵╁睍鐨勬寜閽�
+    methods: {//浜嬩欢鎵╁睍
+        onInit() {
+        },
+        onInited() {
+        }
+    }
+};
+export default extension;
\ No newline at end of file
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Log.js b/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Log.js
new file mode 100644
index 0000000..5b05c40
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Log.js
@@ -0,0 +1,26 @@
+import { h, resolveComponent } from 'vue';
+let extension = {
+  components: {
+    //鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
+    //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+    gridHeader: "", //{ template: "<div>鎵╁睍缁剎x浠�</div>" },
+    gridBody: '',
+    gridFooter: "",
+    //寮瑰嚭妗�(淇敼銆佺紪杈戙�佹煡鐪�)header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+    modelHeader: "",
+    modelBody: "",
+    modelFooter: ""
+  },
+  buttons: [], //鎵╁睍鐨勬寜閽�
+  methods: {
+    //浜嬩欢鎵╁睍
+    onInit() {
+      console.log("sys_log")
+      this.setFiexdSearchForm(true);
+    },
+    onInited() {
+      this.height = this.height - 170;
+    }
+  }
+};
+export default extension;
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role.js b/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role.js
new file mode 100644
index 0000000..5ba4845
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role.js
@@ -0,0 +1,49 @@
+
+let extension = {
+  components: {//鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
+    //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+    gridHeader: '',
+    gridBody: '',
+    gridFooter: '',
+    //寮瑰嚭妗�(淇敼銆佺紪杈戙�佹煡鐪�)header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+    modelHeader: '',
+    modelBody: '',
+    modelFooter: ''
+  },
+  buttons: [],//鎵╁睍鐨勬寜閽�
+  tableAction:"Sys_Role",
+  methods: {//浜嬩欢鎵╁睍
+    onInited () {
+      this.height = this.height - 80;
+       this.editFormOptions.forEach(x => {
+        x.forEach(item => {
+          if (item.field == 'ParentId') {
+            item.title = "涓婄骇瑙掕壊";
+            //璁剧疆浠绘剰鑺傜偣閮借兘閫変腑(榛樿鍙兘閫変腑鏈�鍚庝竴涓妭鐐�)
+            item.changeOnSelect = true;
+          }
+        })
+      })
+    },
+    onInit() {
+      //璁剧疆treetable鐨勫敮涓�鍊煎瓧娈�(杩欎釜瀛楁鐨勫�煎湪琛ㄩ噷闈㈠繀椤绘槸鍞竴鐨�)
+      this.rowKey="Role_Id";
+    },
+    /***鍔犺浇鍚庡彴鏁版嵁瑙丼ys_RoleController.cs鏂囦欢***/
+    loadTreeChildren(tree, treeNode, resolve) { //鍔犺浇瀛愯妭鐐�
+      let url=`api/role/getTreeTableChildrenData?roleId=${tree.Role_Id}`;
+      this.http.post(url,{}).then(result=>{
+        resolve(result.rows)
+      })
+    },
+      /***鍔犺浇鍚庡彴鏁版嵁瑙丼ys_RoleController.cs鏂囦欢***/
+    searchBefore(params){//鍒ゆ柇鍔犺浇鏍硅妭鐐规垨瀛愯妭鐐�
+      //娌℃湁鏌ヨ鏉′欢锛岄粯璁ゆ煡璇㈣繑鍥炴墍鏈夋牴鑺傜偣鏁版嵁
+      if (!params.wheres.length) {
+        params.value=1;
+      }
+      return true;
+    }
+  }
+};
+export default extension;
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role1.js b/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role1.js
new file mode 100644
index 0000000..d6715be
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role1.js
@@ -0,0 +1,61 @@
+
+import { h, resolveComponent } from 'vue';
+let extension = {
+  components: {//鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
+    //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+    gridHeader: '',
+    gridBody: {
+      render () {
+          return [
+              h(resolveComponent('el-alert'), {
+                  style: { 'margin-bottom': '12px' },
+                  'show-icon': true, type: 'error',
+                  closable: false, title: '鍏充簬TreeTable浣跨敤'
+              }, ' treetable鍚屾牱鍏ㄩ儴浠g爜鑷姩鐢熸垚锛岄〉闈㈢敓鎴愬悗璁剧疆this.rowKe="xxx" tree涓婚敭瀛楁,鍗冲彲瀹屾垚鏍戝舰table閰嶇疆,鍏蜂綋璇存槑瑙丼ys_Role1.js'),
+          ]
+      }
+  },
+
+    gridFooter: '',
+    //寮瑰嚭妗�(淇敼銆佺紪杈戙�佹煡鐪�)header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+    modelHeader: '',
+    modelBody: '',
+    modelFooter: ''
+  },
+  buttons: [],//鎵╁睍鐨勬寜閽�
+  tableAction:"Sys_Role",
+  methods: {//浜嬩欢鎵╁睍
+    onInited () {
+      this.height = this.height - 80;
+       this.editFormOptions.forEach(x => {
+        x.forEach(item => {
+          if (item.field == 'ParentId') {
+            item.title = "涓婄骇瑙掕壊";
+            //璁剧疆浠绘剰鑺傜偣閮借兘閫変腑(榛樿鍙兘閫変腑鏈�鍚庝竴涓妭鐐�)
+            item.changeOnSelect = true;
+          }
+        })
+      })
+    },
+    onInit() {
+      //璁剧疆treetable鐨勫敮涓�鍊煎瓧娈�(杩欎釜瀛楁鐨勫�煎湪琛ㄩ噷闈㈠繀椤绘槸鍞竴鐨�)
+      this.rowKey="Role_Id";
+    },
+    /***鍔犺浇鍚庡彴鏁版嵁瑙丼ys_RoleController.cs鏂囦欢***/
+    loadTreeChildren(tree, treeNode, resolve) { //鍔犺浇瀛愯妭鐐�
+      let url=`api/role/getTreeTableChildrenData?roleId=${tree.Role_Id}`;
+      this.http.post(url,{}).then(result=>{
+        resolve(result.rows)
+      })
+    },
+      /***鍔犺浇鍚庡彴鏁版嵁瑙丼ys_RoleController.cs鏂囦欢***/
+    searchBefore(params){//鍒ゆ柇鍔犺浇鏍硅妭鐐规垨瀛愯妭鐐�
+      //娌℃湁鏌ヨ鏉′欢锛岄粯璁ゆ煡璇㈣繑鍥炴墍鏈夋牴鑺傜偣鏁版嵁
+      if (!params.wheres.length) {
+        params.value=1;
+      }
+      return true;
+    }
+  }
+};
+export default extension;
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User.js b/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User.js
new file mode 100644
index 0000000..4be7155
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User.js
@@ -0,0 +1,86 @@
+import {  defineAsyncComponent } from "vue";
+let extension = {
+    components: { //鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
+        //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        gridHeader: defineAsyncComponent(() =>
+            import("./Sys_User/Sys_UserGridHeader.vue")),
+        gridBody: '',
+        gridFooter: '',
+        //寮瑰嚭妗�(淇敼銆佺紪杈戙�佹煡鐪�)header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        modelHeader: '',
+        modelBody: '',
+        modelFooter: ''
+    },
+    text: "鍙兘鐪嬪埌褰撳墠瑙掕壊涓嬬殑鎵�鏈夊笎鍙�",
+    buttons: [], //鎵╁睍鐨勬寜閽�
+    methods: { //浜嬩欢鎵╁睍
+        onInit() {
+            this.boxOptions.height = 530;
+            this.columns.push({
+                title: '鎿嶄綔',
+                hidden: false,
+                align: "center",
+                fixed: 'right',
+                width: 120,
+                render: (h, { row, column, index }) => {
+                    return h(
+                        "div", { style: { 'font-size': '13px', 'cursor': 'pointer', 'color': '#409eff' } }, [
+                        h(
+                            "a", {
+                            style: { 'margin-right': '15px' },
+                            onClick: (e) => {
+                                e.stopPropagation()
+                                this.$refs.gridHeader.open(row);
+                            }
+                        }, "淇敼瀵嗙爜"
+                        ),
+                        h(
+                            "a", {
+                            style: {},
+                            onClick: (e) => {
+                                e.stopPropagation()
+                                this.edit(row);
+                            }
+                        },
+                            "缂栬緫"
+                        ),
+                    ])
+                }
+            })
+        },
+        onInited() { },
+        addAfter(result) { //鐢ㄦ埛鏂板缓鍚庯紝鏄剧ず闅忔満鐢熸垚鐨勫瘑鐮�
+            if (!result.status) {
+                return true;
+            }
+            //鏄剧ず鏂板缓鐢ㄦ埛鐨勫瘑鐮�
+            //2020.08.28浼樺寲鏂板缓鎴愬悗鎻愮ず鏂瑰紡
+            this.$confirm(result.message, '鏂板缓鐢ㄦ埛鎴愬姛', {
+                confirmButtonText: '纭畾',
+                type: 'success',
+                center: true
+            }).then(() => { })
+
+            this.boxModel = false;
+            this.refresh();
+            return false;
+        },
+        modelOpenAfter() {
+            //鐐瑰嚮寮瑰嚭妗嗗悗锛屽鏋滄槸缂栬緫鐘舵�侊紝绂佹缂栬緫鐢ㄦ埛鍚嶏紝濡傛灉鏂板缓鐘舵�侊紝灏嗙敤鎴峰悕瀛楁璁剧疆涓哄彲缂栬緫
+            let isEDIT = this.currentAction == this.const.EDIT;
+            this.editFormOptions.forEach(item => {
+                item.forEach(x => {
+                    if (x.field == "UserName") {
+                        x.disabled=isEDIT;
+                    }
+                })
+                //涓嶆槸鏂板缓锛屾�у埆榛樿鍊艰缃负鐢�
+                if (!isEDIT) {
+                    this.editFormFields.Gender = "0";
+                }
+            })
+        }
+
+    }
+};
+export default extension;
\ No newline at end of file
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js b/Code Management/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js
new file mode 100644
index 0000000..8a02afb
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js
@@ -0,0 +1,82 @@
+
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+import gridBody from './extend/taskExecuteDetail.vue'
+let extension = {
+    components: {
+        //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+        gridHeader: '',
+        gridBody: gridBody,
+        gridFooter: '',
+        //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+        modelHeader: '',
+        modelBody: '',
+        modelFooter: ''
+    },
+    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+    methods: {
+        //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+        onInit() {
+            // this.$Notice.success({ title: this.detailOptions.cnName + ',鏌ヨ缁撴灉', desc: '杩斿洖鐨勫璞★細' + JSON.stringify(data) });
+
+            var previousButton = this.buttons.find((x) => x.value == "Previous");
+            if (previousButton) previousButton.hidden = true;
+            var nextButton = this.buttons.find((x) => x.value == "Next");
+            if (nextButton) nextButton.hidden = true;
+            var recoveryButton = this.buttons.find((x) => x.value == "TaskRecovery");
+            if (recoveryButton) recoveryButton.hidden = true;
+
+            //鎵╁睍椤甸潰鍒濆鍖栨搷浣�
+            this.columns.push({
+                field: '鎿嶄綔',
+                title: '鎿嶄綔',
+                width: 70,
+                fixed: 'right',
+                align: 'center',
+                formatter: (row) => {
+                    return (
+                        '<i style="cursor: pointer;color: #2d8cf0;"class="el-icon-view">鏌ョ湅</i>'
+                    );
+                },
+                click: (row) => {
+                    this.$refs.gridBody.open(row);
+                }
+            });
+        },
+        onInited() {
+            //妗嗘灦鍒濆鍖栭厤缃悗
+            //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+            //this.detailOptions.columns.forEach(column=>{ });
+        },
+        searchBefore(param) {
+            //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+            //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+            return true;
+        },
+        searchAfter(result) {
+            //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+            return true;
+        },
+        addBefore(formData) {
+            //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+            return true;
+        },
+        updateBefore(formData) {
+            //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+            return true;
+        },
+        rowClick({ row, column, event }) {
+            //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+            // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+        },
+        modelOpenAfter(row) {
+            //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+            //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+            //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+            //(3)this.editFormFields.瀛楁='xxx';
+            //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+            //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+        }
+    }
+};
+export default extension;
diff --git a/Code Management/WMS/WIDESEA_WMSClient/tests/unit/example.spec.js b/Code Management/WMS/WIDESEA_WMSClient/tests/unit/example.spec.js
new file mode 100644
index 0000000..bc9939b
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/tests/unit/example.spec.js
@@ -0,0 +1,13 @@
+import { expect } from 'chai'
+import { shallowMount } from '@vue/test-utils'
+import HelloWorld from '@/components/HelloWorld.vue'
+
+describe('HelloWorld.vue', () => {
+  it('renders props.msg when passed', () => {
+    const msg = 'new message'
+    const wrapper = shallowMount(HelloWorld, {
+      props: { msg }
+    })
+    expect(wrapper.text()).to.include(msg)
+  })
+})
diff --git a/Code Management/WMS/WIDESEA_WMSClient/vue.config.js b/Code Management/WMS/WIDESEA_WMSClient/vue.config.js
new file mode 100644
index 0000000..2428b79
--- /dev/null
+++ b/Code Management/WMS/WIDESEA_WMSClient/vue.config.js
@@ -0,0 +1,53 @@
+// const webpack = require("webpack");
+
+module.exports = {
+  productionSourceMap: false,
+  lintOnSave: false,
+  devServer: {
+    port: 8080,
+    overlay: {
+      warning: false,
+      errors: false
+    }
+  },
+  css: {
+    //鏌ョ湅CSS灞炰簬鍝釜css鏂囦欢
+    sourceMap: true
+  },
+  configureWebpack: {
+    module: {
+      rules: [
+        {
+          test: /\.mjs$/,
+          include: /node_modules/,
+          type: "javascript/auto"
+        },
+      ]
+    }
+  },
+  //https://cli.vuejs.org/zh/guide/html-and-static-assets.html#html
+  chainWebpack: (config) => {
+    // 绉婚櫎 prefetch 鎻掍欢
+    config.plugins.delete('prefetch');
+    //鑷笅瀹氫箟title
+    config.plugin('html').tap((args) => {
+      args[0].title = 'WCS';
+      return args;
+    });
+
+    // 鎴栬��
+    // 淇敼瀹冪殑閫夐」锛�
+    // config.plugin('prefetch').tap(options => {
+    //   options[0].fileBlacklist = options[0].fileBlacklist || []
+    //   options[0].fileBlacklist.push(/myasyncRoute(.)+?\.js$/)
+    //   return options
+    // })
+  }
+  // configureWebpack: {
+  //     plugins: [
+  //         new webpack.optimize.MinChunkSizePlugin({
+  //             minChunkSize: 100000 // 閫氳繃鍚堝苟灏忎簬 minChunkSize 澶у皬鐨� chunk锛屽皢 chunk 浣撶Н淇濇寔鍦ㄦ寚瀹氬ぇ灏忛檺鍒朵互涓�
+  //         })
+  //     ]
+  // }
+};
diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
index 7f139ed..eeb4d90 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
@@ -1269,11 +1269,11 @@
         List<DtStockInfo> stockInfoList = stockInfos.Values.ToList();
         var result = new DtStockInfo();
 
-        if (stockInfoList.IsNullOrEmpty())
-        {
-            stockInfoList = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
-                .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock).IncludesAllFirstLayer().ToListAsync();
-        }
+        //if (stockInfoList.IsNullOrEmpty())
+        //{
+        //    stockInfoList = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
+        //        .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock).IncludesAllFirstLayer().ToListAsync();
+        //}
 
         result = stockInfoList.Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull)
                           .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine)
@@ -1286,17 +1286,7 @@
         if (result != null)
         {
             stockInfoList = stockInfoList.Where(x => x != result).ToList();
-            if (stockInfos.IsNullOrEmpty())
-            {
-                foreach (var item in stockInfoList)
-                {
-                    _simpleCacheService.HashAdd(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, item.PalletCode, item);
-                }
-            }
-            else
-            {
-                _simpleCacheService.HashDel<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, new string[] { result.PalletCode });
-            }
+            _simpleCacheService.HashDel<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, new string[] { result.PalletCode });
         }
 
         return result;
diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Program.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Program.cs
index 1e38ec0..29a2d05 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Program.cs
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Program.cs
@@ -26,6 +26,7 @@
 using WIDESEA_DTO.WMS;
 using static NewLife.Remoting.ApiHttpClient;
 using NewLife.Windows;
+using WIDESEA_Core.Enums;
 
 var builder = WebApplication.CreateBuilder(args);
 
@@ -198,6 +199,16 @@
     var redis = app.Services.CreateScope().ServiceProvider.GetService<ISimpleCacheService>(); //获取redis服务
     // 删除redis的key
     redis.DelByPattern(CacheConst.Cache_Prefix);
+
+    WIDESEA_Core.Helper.ConsoleHelper.WriteInfoLine("正在缓存库存信息");
+    var stockInfoList = await SqlSugarHelper.DbWMS.Queryable<DtStockInfo>()
+                .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock).IncludesAllFirstLayer().ToListAsync();
+    // 缓存库存信息
+    foreach (var item in stockInfoList)
+    {
+        redis.HashAdd(CacheConst.Cache_DtStockInfo, item.PalletCode, item);
+    }
+    WIDESEA_Core.Helper.ConsoleHelper.WriteInfoLine("缓存库存信息完成");
 }
 
 app.Run();
diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
index 8460061..2ec3278 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -11,9 +11,9 @@
   //杩炴帴瀛楃涓�
   //"ConnectionString": "HTI6FB1H05Krd07mNm9yBCNhofW6edA5zLs9TY~MNthRYW3kn0qKbMIsGp~3yyPDF1YZUCPBQx8U0Jfk4PH~ajNFXVIwlH85M3F~v_qKYQ3CeAz3q1mLVDn8O5uWt1~3Ut2V3KRkEwYHvW2oMDN~QIDXPxDgXN0R2oTIhc9dNu7QNaLEknblqmHhjaNSSpERdDVZIgHnMKejU_SL49tralBkZmDNi0hmkbL~837j1NWe37u9fJKmv91QPb~16JsuI9uu0EvNZ06g6PuZfOSAeFH9GMMIZiketdcJG3tHelo=",
   //"ConnectionString": "Data Source=192.168.5.251;Initial Catalog=WIDESEA_WMSDB_BBMain;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
-  "ConnectionString": "Data Source=127.0.0.1;Initial Catalog=WIDESEA_WMS2F08;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
+  //"ConnectionString": "Data Source=127.0.0.1;Initial Catalog=WIDESEA_WMS2F08;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
   //"ConnectionString": "Data Source=.\\LIULEI;Initial Catalog=WIDESEA_WMSDB_BBMain;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
-  //"ConnectionString": "Data Source=192.168.20.251;Initial Catalog=WIDESEA_WMSDB;User ID=sa;Password=123456@gy;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
+  "ConnectionString": "Data Source=192.168.20.251;Initial Catalog=WIDESEA_WMSDB;User ID=sa;Password=123456@gy;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
   //"ConnectionStringWCS": "Data Source=192.168.5.251;Initial Catalog=WIDESEAWCS_TEST;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
   "ConnectionStringWCS": "Data Source=127.0.0.1;Initial Catalog=WIDESEA_WCSDB;User ID=sa;Password=sa123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
   //璺ㄥ煙

--
Gitblit v1.9.3