From 5953113240802cd0545fb94e6c4e6d413ece74cc Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期二, 24 三月 2026 11:50:07 +0800
Subject: [PATCH] WMS新增缺失前端页面并接入路由

---
 Code/WMS/WIDESEA_WMSClient/src/extension/stock/stock.js               |   41 ++
 Code/WMS/WIDESEA_WMSClient/src/router/viewGird.js                     |   22 +
 Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Tenant.js         |   41 ++
 Code/WMS/WIDESEA_WMSClient/.yarn/install-state.gz                     |    0 
 .omc/sessions/e6b9225b-2892-4ba9-8585-7ee1b6e2ef6f.json               |    8 
 Code/WMS/WIDESEA_WMSClient/src/views/system/PDA.vue                   |  128 +++++++
 /dev/null                                                             |    1 
 Code/WMS/AGENTS.md                                                    |   10 
 Code/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue    |  134 +++++++
 Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outStockLockInfo.js |   41 ++
 Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Tenant.vue            |  102 +++++
 Code/WCS/WIDESEAWCS_Client/src/views/Index.vue                        |  220 +++++++----
 Code/WCS/WIDESEAWCS_Client/.omc/project-memory.json                   |  182 ++++++++++
 Code/WMS/WIDESEA_WMSClient/src/views/stock/stock.vue                  |  111 ++++++
 14 files changed, 951 insertions(+), 90 deletions(-)

diff --git a/.omc/sessions/e6b9225b-2892-4ba9-8585-7ee1b6e2ef6f.json b/.omc/sessions/e6b9225b-2892-4ba9-8585-7ee1b6e2ef6f.json
new file mode 100644
index 0000000..3611296
--- /dev/null
+++ b/.omc/sessions/e6b9225b-2892-4ba9-8585-7ee1b6e2ef6f.json
@@ -0,0 +1,8 @@
+{
+  "session_id": "e6b9225b-2892-4ba9-8585-7ee1b6e2ef6f",
+  "ended_at": "2026-03-24T03:25:50.783Z",
+  "reason": "other",
+  "agents_spawned": 0,
+  "agents_completed": 0,
+  "modes_used": []
+}
\ No newline at end of file
diff --git a/.omc/state/hud-state.json b/.omc/state/hud-state.json
deleted file mode 100644
index c1a86d9..0000000
--- a/.omc/state/hud-state.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "timestamp": "2026-03-24T02:39:49.050Z",
-  "backgroundTasks": [],
-  "sessionStartTimestamp": "2026-03-24T02:33:23.593Z",
-  "sessionId": "4cd1f4b9-ad6a-4b8f-8a01-8260579d1f66"
-}
\ No newline at end of file
diff --git a/.omc/state/hud-stdin-cache.json b/.omc/state/hud-stdin-cache.json
deleted file mode 100644
index e02c35e..0000000
--- a/.omc/state/hud-stdin-cache.json
+++ /dev/null
@@ -1 +0,0 @@
-{"session_id":"4cd1f4b9-ad6a-4b8f-8a01-8260579d1f66","transcript_path":"C:\\Users\\29028\\.claude\\projects\\D--Git-ShanMeiXinNengYuan-Code-WMS\\4cd1f4b9-ad6a-4b8f-8a01-8260579d1f66.jsonl","cwd":"D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS","model":{"id":"glm-4.7","display_name":"glm-4.7"},"workspace":{"current_dir":"D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS","project_dir":"D:\\Git\\ShanMeiXinNengYuan\\Code\\WMS","added_dirs":[]},"version":"2.1.72","output_style":{"name":"default"},"cost":{"total_cost_usd":1.441715,"total_duration_ms":453632,"total_api_duration_ms":376045,"total_lines_added":298,"total_lines_removed":110},"context_window":{"total_input_tokens":153210,"total_output_tokens":8441,"context_window_size":200000,"current_usage":{"input_tokens":3040,"output_tokens":292,"cache_creation_input_tokens":0,"cache_read_input_tokens":96384},"used_percentage":50,"remaining_percentage":50},"exceeds_200k_tokens":false}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Client/.omc/project-memory.json b/Code/WCS/WIDESEAWCS_Client/.omc/project-memory.json
new file mode 100644
index 0000000..729851a
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_Client/.omc/project-memory.json
@@ -0,0 +1,182 @@
+{
+  "version": "1.0.0",
+  "lastScanned": 1774322743799,
+  "projectRoot": "d:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Client",
+  "techStack": {
+    "languages": [
+      {
+        "name": "JavaScript/TypeScript",
+        "version": null,
+        "confidence": "high",
+        "markers": [
+          "package.json"
+        ]
+      }
+    ],
+    "frameworks": [
+      {
+        "name": "vue",
+        "version": "3.2.37",
+        "category": "frontend"
+      },
+      {
+        "name": "vite",
+        "version": "5.0.0",
+        "category": "build"
+      }
+    ],
+    "packageManager": "pnpm",
+    "runtime": null
+  },
+  "build": {
+    "buildCommand": "pnpm build",
+    "testCommand": null,
+    "lintCommand": "pnpm lint",
+    "devCommand": null,
+    "scripts": {
+      "serve": "vite",
+      "build": "vite build",
+      "preview": "vite preview",
+      "lint": "eslint --ext .js,.vue src"
+    }
+  },
+  "conventions": {
+    "namingStyle": null,
+    "importStyle": null,
+    "testPattern": null,
+    "fileOrganization": "type-based"
+  },
+  "structure": {
+    "isMonorepo": false,
+    "workspaces": [],
+    "mainDirectories": [
+      "public",
+      "src",
+      "tests"
+    ],
+    "gitBranches": {
+      "defaultBranch": "master",
+      "branchingStrategy": null
+    }
+  },
+  "customNotes": [],
+  "directoryMap": {
+    "config": {
+      "path": "config",
+      "purpose": "Configuration files",
+      "fileCount": 1,
+      "lastAccessed": 1774322743642,
+      "keyFiles": [
+        "buttons.js"
+      ]
+    },
+    "dist": {
+      "path": "dist",
+      "purpose": "Distribution/build output",
+      "fileCount": 3,
+      "lastAccessed": 1774322743642,
+      "keyFiles": [
+        "index.html",
+        "wcslogo.png",
+        "wms_d.png"
+      ]
+    },
+    "public": {
+      "path": "public",
+      "purpose": "Public files",
+      "fileCount": 3,
+      "lastAccessed": 1774322743680,
+      "keyFiles": [
+        "index.html",
+        "wcslogo.png",
+        "wms_d.png"
+      ]
+    },
+    "src": {
+      "path": "src",
+      "purpose": "Source code",
+      "fileCount": 2,
+      "lastAccessed": 1774322743680,
+      "keyFiles": [
+        "App.vue",
+        "main.js"
+      ]
+    },
+    "tests": {
+      "path": "tests",
+      "purpose": "Test files",
+      "fileCount": 0,
+      "lastAccessed": 1774322743682,
+      "keyFiles": []
+    },
+    "dist\\assets": {
+      "path": "dist\\assets",
+      "purpose": "Static assets",
+      "fileCount": 80,
+      "lastAccessed": 1774322743684,
+      "keyFiles": [
+        "401-D9QhAVFF.js",
+        "404-DCIcd6re.js",
+        "Audit-C52MvHzW.css"
+      ]
+    },
+    "dist\\static": {
+      "path": "dist\\static",
+      "purpose": "Static files",
+      "fileCount": 1,
+      "lastAccessed": 1774322743684,
+      "keyFiles": [
+        "login_bg.png"
+      ]
+    },
+    "public\\static": {
+      "path": "public\\static",
+      "purpose": "Static files",
+      "fileCount": 1,
+      "lastAccessed": 1774322743685,
+      "keyFiles": [
+        "login_bg.png"
+      ]
+    },
+    "src\\api": {
+      "path": "src\\api",
+      "purpose": "API routes",
+      "fileCount": 3,
+      "lastAccessed": 1774322743686,
+      "keyFiles": [
+        "http.js",
+        "permission.js",
+        "useTest.js"
+      ]
+    },
+    "src\\assets": {
+      "path": "src\\assets",
+      "purpose": "Static assets",
+      "fileCount": 1,
+      "lastAccessed": 1774322743687,
+      "keyFiles": [
+        "logo.png"
+      ]
+    },
+    "src\\components": {
+      "path": "src\\components",
+      "purpose": "UI components",
+      "fileCount": 0,
+      "lastAccessed": 1774322743688,
+      "keyFiles": []
+    },
+    "src\\views": {
+      "path": "src\\views",
+      "purpose": "View templates",
+      "fileCount": 3,
+      "lastAccessed": 1774322743689,
+      "keyFiles": [
+        "Home.vue",
+        "Index.vue",
+        "Login.vue"
+      ]
+    }
+  },
+  "hotPaths": [],
+  "userDirectives": []
+}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/Index.vue b/Code/WCS/WIDESEAWCS_Client/src/views/Index.vue
index 553d045..68fe0a1 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/Index.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/Index.vue
@@ -59,25 +59,25 @@
             <span style="display: none">{{ navIndex }}</span>
           </el-tab-pane>
         </el-tabs>
-        <!-- 鍙抽敭鑿滃崟 -->
+        <!-- 閸欐娊鏁懣婊冨礋 -->
         <div v-show="contextMenuVisible">
           <ul :style="{ left: menuLeft + 'px', top: menuTop + 'px' }" class="contextMenu">
             <li v-show="visibleItem.all">
               <el-button link @click="closeTabs()">
                 <i class="el-icon-close"></i>
                 {{
-                  navigation.length == 2 ? "鍏抽棴鑿滃崟" : "鍏抽棴鎵�鏈�"
+                  navigation.length == 2 ? "閸忔娊妫撮懣婊冨礋" : "閸忔娊妫撮幍鈧張?
                 }}</el-button>
             </li>
             <li v-show="visibleItem.left">
-              <el-button link @click="closeTabs('left')"><i class="el-icon-back"></i>鍏抽棴宸﹁竟</el-button>
+              <el-button link @click="closeTabs('left')"><i class="el-icon-back"></i>閸忔娊妫村锕佺珶</el-button>
             </li>
             <li v-show="visibleItem.right">
               <el-button link @click="closeTabs('right')">
-                <i class="el-icon-right"></i>鍏抽棴鍙宠竟</el-button>
+                <i class="el-icon-right"></i>閸忔娊妫撮崣瀹犵珶</el-button>
             </li>
             <li v-show="visibleItem.other">
-              <el-button link @click="closeTabs('other')"><i class="el-icon-right"></i>鍏抽棴鍏朵粬
+              <el-button link @click="closeTabs('other')"><i class="el-icon-right"></i>閸忔娊妫撮崗鏈电铂
               </el-button>
             </li>
           </ul>
@@ -96,7 +96,7 @@
         </el-scrollbar>
       </div>
     </div>
-    <el-drawer title="閫夋嫨涓婚" v-model="drawer_model" direction="rtl" destroy-on-close>
+    <el-drawer title="闁瀚ㄦ稉濠氼暯" v-model="drawer_model" direction="rtl" destroy-on-close>
       <div class="theme-selector">
         <div @click="changeTheme(item.name)" class="item" v-for="(item, index) in theme_color" :key="index"
           :style="{ background: item.color }">
@@ -107,7 +107,7 @@
       </div>
     </el-drawer>
 
-    <el-drawer title="娑堟伅鍒楄〃" v-model="messageModel" direction="rtl" destroy-on-close>
+    <el-drawer title="濞戝牊浼呴崚妤勩��" v-model="messageModel" direction="rtl" destroy-on-close>
       <Message :list="messageList"></Message>
     </el-drawer>
   </div>
@@ -151,14 +151,14 @@
       otherTabs: true,
       menuLeft: 0,
       menuTop: 0,
-      //  contextMenuVisible: false, // 鍙抽敭鍏抽棴鏄�/闅�
+      //  contextMenuVisible: false, // 閸欐娊鏁崗鎶芥4閺�?闂�?
     };
   },
   setup(props, context) {
-    // 鑾峰彇鍏ㄥ眬灞炴�у拰鏂规硶
+    // 閼惧嘲褰囬崗銊ョ湰鐏炵偞鈧冩嫲閺傝纭�
     const { proxy } = getCurrentInstance();
 
-    // 鑿滃崟瀵艰埅榛樿瀹藉害
+    // 閼挎粌宕熺�佃壈鍩呮妯款吇鐎硅棄瀹�
     const menuWidth = ref(200);
     const contextMenuVisible = ref(false);
     const isCollapse = ref(false);
@@ -178,23 +178,23 @@
     ]);
     const links = ref([
       // {
-      //   text: "妗嗘灦瑙嗛",
+      //   text: "濡楀棙鐏︾憴鍡涱暥",
       //   path: "https://www.cctalk.com/m/group/90268531",
       //   id: -3,
       // },
-      // { text: "澶у睆鏁版嵁", path: "/bigdata", id: -3 },
+      // { text: "婢堆冪潌閺佺増宓�", path: "/bigdata", id: -3 },
       // {
-      //   text: "妗嗘灦鏂囨。",
+      //   text: "濡楀棙鐏﹂弬鍥ㄣ��",
       //   path: "http://v2.volcore.xyz/document/guide",
       //   id: -2,
       // },   {
-      //   text: "妗嗘灦浼佷笟鐗�",
+      //   text: "濡楀棙鐏︽导浣风瑹閻�?,
       //   path: "http://pro.volcore.xyz/",
       //   id: 10,
       // },
-      { text: "涓汉涓績", path: "/UserInfo", id: -1, icon: "el-icon-s-custom" },
+      { text: "娑擃亙姹夋稉顓炵妇", path: "/UserInfo", id: -1, icon: "el-icon-s-custom" },
       {
-        text: "瀹夊叏閫�鍑�",
+        text: "鐎瑰鍙忛柅鈧崙?,
         path: "/login",
         id: -4,
         icon: "el-icon-switch-button",
@@ -204,9 +204,9 @@
       'this.src="' + errorImgSrc + '"'
     );
     const selectId = ref("1");
-    // 銆愰椤点�戞爣绛惧簭鍙�(褰撳墠鍙抽敭閫変腑鐨勮彍鍗�)
+    // 閵嗘劙顩绘い鐐光偓鎴炵垼缁涙儳绨崣?瑜版挸澧犻崣鎶芥暛闁鑵戦惃鍕綅閸�?
     const selectMenuIndex = ref("0");
-    //2022.05.29澧炲姞tab閫夐」涓庤彍鍗曡仈鍔ㄥ姛鑳�
+    //2022.05.29婢х偛濮瀟ab闁銆嶆稉搴ゅ綅閸楁洝浠堥崝銊ュ閼�?
     const currentMenuId = ref(0);
     const userName = ref("--");
     const userInfo = ref({});
@@ -218,7 +218,7 @@
     });
     const userImg = ref("");
     const navigation = reactive([
-      { orderNo: "0", id: "1", name: "棣栭〉", path: "/home" },
+      { orderNo: "0", id: "1", name: "妫f牠銆�", path: "/home" },
     ]);
     const logo = ref(imgUrl);
     const theme = ref("blue2");
@@ -231,7 +231,7 @@
       isCollapse.value = !isCollapse.value;
       menuWidth.value = isCollapse.value ? 63 : 200;
     };
-    //2021.08.28寮�鏀炬墜鍔ㄦ姌鍙犺彍鍗曟柟娉�
+    //2021.08.28瀵偓閺�鐐閸斻劍濮岄崣鐘哄綅閸楁洘鏌熷▔?
     _config.menu = {
       show() {
         toggleLeft();
@@ -247,14 +247,14 @@
       localStorage.setItem("vol3_theme", name);
     };
     const to = (item) => {
-      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      /* 2020.07.31婢х偛濮為幍瀣З閹垫挸绱憈abs*/
       if (item.path.indexOf("http") != -1) {
         window.open(item.path);
         return;
       }
       if (typeof item == "string" || item.path == "/login") {
         if (item == "/login" || item.path == "/login") {
-          //纭鏄惁閫�鍑�
+          //绾喛顓婚弰顖氭儊闁偓閸�?
           store.commit("clearUserInfo", "");
           window.location.href = "/";
           return;
@@ -266,59 +266,59 @@
       open(item);
     };
     const open = (item, useRoute) => {
-      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      /* 2020.07.31婢х偛濮為幍瀣З閹垫挸绱憈abs*/
       let _index = navigation.findIndex((x) => {
         return x.path == item.path;
       });
       if (_index == -1) {
         navigation.push({
-          //  orderNo: String(navigation.length),// 搴忓彿
+          //  orderNo: String(navigation.length),// 鎼村繐褰�
           id: item.id + "",
-          name: item.name || item.text || "鏃犳爣棰�",
+          name: item.name || item.text || "閺冪姵鐖f0?,
           path: item.path,
-          query: item.query, //2021.03.20淇鑷畾涔変簩娆℃墦寮�$tabs鏃跺弬鏁颁涪澶辩殑闂
+          query: item.query, //2021.03.20娣囶喖顦查懛顏勭暰娑斿绨╁▎鈩冨ⅵ瀵偓$tabs閺冭泛寮弫棰佹丢婢惰京娈戦梻顕�顣�
         });
-        //鏂版墦寮�鐨則ab绉昏嚦鏈�鍚庝竴涓�夐」
+        //閺傜増澧﹀鈧惃鍓嘺b缁夋槒鍤﹂張鈧崥搴濈娑擃亪鈧銆�
         selectId.value = navigation.length - 1 + "";
       } else {
         selectId.value = _index + "";
       }
       if (useRoute === undefined) {
-        //闈炴爣鍑嗚彍鍗曪紝璁板綍鏈�鍚庝竴娆¤烦杞殑椤甸潰锛岀敤浜庡埛鏂�
+        //闂堢偞鐖i崙鍡氬綅閸楁洩绱濈拋鏉跨秿閺堚偓閸氬簼绔村▎陇鐑︽潪顒傛畱妞ょ敻娼伴敍宀�鏁ゆ禍搴″煕閺�?
         setItem(item);
         router.push(item);
         // this.$router.push(item);
       }
       currentMenuId.value = item.id * 1;
-      // tab鑿滃崟缁戝畾鍙抽敭浜嬩欢
+      // tab閼挎粌宕熺紒鎴濈暰閸欐娊鏁禍瀣╂
       proxy.$nextTick(function (e) {
         proxy.bindRightClickMenu(true);
       });
     };
     const close = (path) => {
-      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      /* 2020.07.31婢х偛濮為幍瀣З閹垫挸绱憈abs*/
       let index = navigation.findIndex((x) => {
         return x.path == path;
       });
       if (index == -1) {
-        return _config.$Message.error("鏈壘鍒拌彍鍗�");
+        return _config.$Message.error("閺堫亝澹橀崚鎷屽綅閸�?);
       }
       removeNav(index);
     };
     const setItem = (item) => {
-      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      /* 2020.07.31婢х偛濮為幍瀣З閹垫挸绱憈abs*/
       localStorage.setItem(
         window.location.origin + "_tabs",
         JSON.stringify(item)
       );
     };
     const getItem = () => {
-      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      /* 2020.07.31婢х偛濮為幍瀣З閹垫挸绱憈abs*/
       let nav = localStorage.getItem(window.location.origin + "_tabs");
       return nav ? JSON.parse(nav) : null;
     };
     const selectNav = (item) => {
-      //鍗囩骇element姝e紡鐗堜慨鏀�
+      //閸楀洨楠噀lement濮濓絽绱¢悧鍫滄叏閺�?
       selectId.value = item.props.name;
       let _path = navigation[item.index].path;
       currentMenuId.value = (
@@ -335,13 +335,13 @@
 
     const removeNav = (_index) => {
       return new Promise(() => {
-        //鍏抽棴鐨勫綋鍓嶉」,璺宠浆鍒板墠涓�涓〉闈�
+        //閸忔娊妫撮惃鍕秼閸撳秹銆�,鐠哄疇娴嗛崚鏉垮娑撯偓娑擃亪銆夐棃?
         if (selectId.value == _index + "") {
           console.log(navigation[_index - 1]);
           setItem(navigation[_index - 1]);
           router.push({
             path: navigation[_index - 1].path,
-            //2022.06.27淇tabs浜屾鍒囨崲鍚庡弬鏁颁涪澶辩殑闂
+            //2022.06.27娣囶喖顦瞭abs娴滃本顐奸崚鍥ㄥ床閸氬骸寮弫棰佹丢婢惰京娈戦梻顕�顣�
             query: navigation[_index - 1].query,
           });
           navigation.splice(_index, 1);
@@ -366,28 +366,28 @@
       });
     };
     const onSelect = (treeId) => {
-      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      /* 2020.07.31婢х偛濮為幍瀣З閹垫挸绱憈abs*/
       var item = getSelectMenuName(treeId);
       open(item, false);
     };
 
     /**
-     * 鏄剧ず鍙抽敭鑿滃崟
-     * @param {*} e 浜嬩欢瀵硅薄
+     * 閺勫墽銇氶崣鎶芥暛閼挎粌宕�
+     * @param {*} e 娴滃娆㈢�电钖�
      */
     const openTabsMenu = function (e) {
-      e.preventDefault(); // 闃叉榛樿鑿滃崟寮瑰嚭
+      e.preventDefault(); // 闂冨弶顒涙妯款吇閼挎粌宕熷鐟板毉
       let tabId = e.target.id.split("-")[1] * 1;
 
-      //璁板綍褰撳墠閫変腑鐨勮彍鍗昳ndex
+      //鐠佹澘缍嶈ぐ鎾冲闁鑵戦惃鍕綅閸楁槼ndex
       selectMenuIndex.value =
         document.getElementById("pane-" + tabId).children[0].textContent * 1;
-      //鍙湁棣栭〉鏃朵笉鏄剧ず
+      //閸欘亝婀佹#鏍�夐弮鏈电瑝閺勫墽銇�
       if (navigation.length == 1) {
         return;
       }
 
-      //棣栭〉璁剧疆鏄剧ず鍏抽棴鍙宠竟鑿滃崟
+      //妫f牠銆夌拋鍓х枂閺勫墽銇氶崗鎶芥4閸欏疇绔熼懣婊冨礋
       if (!selectMenuIndex.value) {
         visibleItem.all = false;
         visibleItem.right = true;
@@ -395,22 +395,22 @@
         visibleItem.other = false;
       } else {
         visibleItem.all = true;
-        //涓嶆槸鏈�鍚庝竴涓樉绀哄叧闂彸杈硅彍鍗�
+        //娑撳秵妲搁張鈧崥搴濈娑擃亝妯夌粈鍝勫彠闂傤厼褰告潏纭呭綅閸�?
         visibleItem.right = selectMenuIndex.value != navigation.length - 1;
-        //鍙湁涓や釜鑿滃崟鏃朵笉鏄剧ず鍏抽棴宸﹁竟
+        //閸欘亝婀佹稉銈勯嚋閼挎粌宕熼弮鏈电瑝閺勫墽銇氶崗鎶芥4瀹革箒绔�
         visibleItem.left = navigation.length != 2;
-        //鍙湁涓や釜鑿滃崟鏃朵笉鏄剧ず鍏抽棴鍏朵粬
+        //閸欘亝婀佹稉銈勯嚋閼挎粌宕熼弮鏈电瑝閺勫墽銇氶崗鎶芥4閸忔湹绮�
         visibleItem.other = navigation.length != 2;
       }
       contextMenuVisible.value = true;
-      // 璁剧疆鍙抽敭鑿滃崟鏄剧ず鐨勪綅缃�
+      // 鐠佸墽鐤嗛崣鎶芥暛閼挎粌宕熼弰鍓с仛閻ㄥ嫪缍呯純?
       proxy.menuLeft =
         e.target.getBoundingClientRect().left - (isCollapse.value ? 63 : 198); //-e.target.clientWidth
       proxy.menuTop = 36;
     };
 
     /**
-     * 鍏抽棴鍙抽敭鑿滃崟
+     * 閸忔娊妫撮崣鎶芥暛閼挎粌宕�
      */
     const closeTabsMenu = () => {
       contextMenuVisible.value = false;
@@ -422,25 +422,25 @@
       });
     };
     /**
-     * 鍏抽棴鍏跺畠鏍囩椤�
-     * @param {*} par 鍏抽棴绫诲瀷(left,right,other)
+     * 閸忔娊妫撮崗璺虹暊閺嶅洨顒锋い?
+     * @param {*} par 閸忔娊妫寸猾璇茬��(left,right,other)
      */
     const closeTabs = (value) => {
       let _menuId = navigation[selectId.value * 1].id;
       let currnetIndex = selectId.value * 1; // navigation.findIndex(c => { return c.id == selectId.value });
       switch (value) {
         case "left": {
-          // 鍒犻櫎宸︿晶tab鏍囩
-          navigation.splice(1, currnetIndex - 1); // 鍒犻櫎宸︿晶tab鏍囩
+          // 閸掔娀娅庡锔挎櫠tab閺嶅洨顒�
+          navigation.splice(1, currnetIndex - 1); // 閸掔娀娅庡锔挎櫠tab閺嶅洨顒�
           break;
         }
         case "right": {
-          // 鍒犻櫎鍙充晶tab鏍囩
+          // 閸掔娀娅庨崣鍏呮櫠tab閺嶅洨顒�
           if (selectMenuIndex.value == 0) {
-            navigation.splice(currnetIndex); // 鍒犻櫎鍙充晶tab鏍囩
+            navigation.splice(currnetIndex); // 閸掔娀娅庨崣鍏呮櫠tab閺嶅洨顒�
             toHome();
           } else {
-            navigation.splice(currnetIndex + 1); // 鍒犻櫎鍙充晶tab鏍囩
+            navigation.splice(currnetIndex + 1); // 閸掔娀娅庨崣鍏呮櫠tab閺嶅洨顒�
             if (selectMenuIndex.value < currnetIndex) {
               navigation.splice(
                 selectMenuIndex.value,
@@ -451,13 +451,13 @@
           break;
         }
         case "other": {
-          // 鍒犻櫎鍏朵粬鎵�鏈塼ab鏍囩
-          navigation.splice(currnetIndex + 1); // 鍒犻櫎鍙充晶tab鏍囩(杩欓噷蹇呴』鎸夌収鍙斥啋宸﹂『搴忓垹闄�)
-          navigation.splice(1, currnetIndex - 1); // 鍒犻櫎宸︿晶tab鏍囩
+          // 閸掔娀娅庨崗鏈电铂閹碘偓閺堝〖ab閺嶅洨顒�
+          navigation.splice(currnetIndex + 1); // 閸掔娀娅庨崣鍏呮櫠tab閺嶅洨顒�(鏉╂瑩鍣疯箛鍛淬�忛幐澶屽弾閸欐枼鍟嬪锕傘�庢惔蹇撳灩闂�?
+          navigation.splice(1, currnetIndex - 1); // 閸掔娀娅庡锔挎櫠tab閺嶅洨顒�
           break;
         }
         default: {
-          //鍏抽棴鎵�鏈�
+          //閸忔娊妫撮幍鈧張?
           navigation.splice(1, navigation.length);
           toHome();
           break;
@@ -473,7 +473,7 @@
     watch(
       () => contextMenuVisible.value,
       (newVal, oldVal) => {
-        // 鐩戣
+        // 閻╂垼顫�
         if (newVal) {
           document.body.addEventListener("click", closeTabsMenu);
         } else {
@@ -483,8 +483,63 @@
     );
 
     /**
-     * 绯荤粺鍒涘缓寮�濮�
+     * 缁崵绮洪崚娑樼紦瀵偓婵�?
      */
+    /**
+     * 鏂规硶鐩殑锛氳ˉ榻愬悗绔彍鍗曟湭閰嶇疆鏃剁殑鏂伴〉闈㈠叆鍙o紝閬垮厤鏂板椤甸潰鏃犲叆鍙c��
+     * 鍙傛暟鍚箟锛歞ata 涓哄悗绔繑鍥炵殑鑿滃崟鏁扮粍銆�
+     * 杩斿洖鍊硷細杩斿洖琛ラ綈鍚庣殑鑿滃崟鏁扮粍銆�
+     * 鍏抽敭閫昏緫锛氫粎鍦ㄨ彍鍗曚腑涓嶅瓨鍦ㄧ浉鍚� url 鏃惰拷鍔犻粯璁よ彍鍗曪紝閬垮厤瑕嗙洊宸叉湁閰嶇疆銆�
+     * 寮傚父澶勭悊锛氳鏂规硶浠呮搷浣滃唴瀛樻暟鎹紝涓嶆秹鍙婂閮ㄨ皟鐢紝寮傚父鐢变笂灞傛祦绋嬬粺涓�鎹曡幏銆�
+     */
+    const ensureBuiltinMenus = (data) => {
+      const menus = Array.isArray(data) ? data : [];
+      const exists = (url) => menus.some((m) => (m.url || "") === url);
+      const maxId = menus.reduce((max, item) => {
+        const current = Number(item.id);
+        return Number.isFinite(current) ? Math.max(max, current) : max;
+      }, 0);
+
+      const defaultMenus = [
+        {
+          id: maxId + 1001,
+          name: "绉熸埛绠$悊",
+          url: "/Sys_Tenant",
+          parentId: 0,
+          icon: "el-icon-office-building",
+          enable: 1,
+          tableName: "Sys_Tenant",
+          permission: ["Search", "Add", "Update", "Delete"],
+        },
+        {
+          id: maxId + 1002,
+          name: "浠诲姟鍘嗗彶",
+          url: "/taskHty",
+          parentId: 0,
+          icon: "el-icon-time",
+          enable: 1,
+          tableName: "taskHty",
+          permission: ["Search", "Export"],
+        },
+        {
+          id: maxId + 1003,
+          name: "璋冨害鎺у埗",
+          url: "/scheduler",
+          parentId: 0,
+          icon: "el-icon-video-play",
+          enable: 1,
+          tableName: "scheduler",
+          permission: ["Search", "Update"],
+        },
+      ];
+
+      defaultMenus.forEach((menu) => {
+        if (!exists(menu.url)) {
+          menus.push(menu);
+        }
+      });
+      return menus;
+    };
     const created = () => {
       let _theme = localStorage.getItem("vol3_theme");
       if (_theme) {
@@ -501,7 +556,8 @@
       Object.assign(_config.$tabs, { open: open, close: close });
 
       http.get("api/Sys_Menu/getTreeMenu", {}, true).then((data) => {
-        data.push({ id: "1", name: "棣栭〉", url: "/home" }); // 涓轰簡鑾峰彇閫変腑id浣跨敤
+        data = ensureBuiltinMenus(data);
+        data.push({ id: "1", name: "妫f牠銆�", url: "/home" }); // 娑撹桨绨¢懢宄板絿闁鑵慽d娴h法鏁�
         data.forEach((d) => {
           d.path = (d.url || "").replace("/Manager", "");
           d.to = (d.url || "").replace("/Manager", "");
@@ -513,7 +569,7 @@
         menuOptions.value = data;
         permissionInited.value = true;
 
-        //寮�鍚秷鎭帹閫侊紙main.js涓缃槸鍚﹀紑鍚痵ignalR锛�2022.05.05
+        //瀵偓閸氼垱绉烽幁顖涘腹闁緤绱檓ain.js娑擃叀顔曠純顔芥Ц閸氾箑绱戦崥鐥礽gnalR閿�?022.05.05
         if (_config.$global.signalR) {
           MessageConfig(http, (result) => {
             messageList.unshift(result);
@@ -521,18 +577,18 @@
           });
         }
 
-        //褰撳墠鍒锋柊鏄笉鏄椤�
+        //瑜版挸澧犻崚閿嬫煀閺勵垯绗夐弰顖烆浕妞�?
         if (router.currentRoute.value.path != navigation[0].path) {
-          //鏌ユ壘绯荤粺鑿滃崟
+          //閺屻儲澹樼化鑽ょ埠閼挎粌宕�
           let item = menuOptions.value.find((x) => {
             return x.path == router.currentRoute.value.path; //this.$route.path;
           });
           if (item) return onSelect(item.id);
-          //鏌ユ壘椤堕儴蹇嵎杩炴帴
+          //閺屻儲澹樻い鍫曞劥韫囶偅宓庢潻鐐村复
           item = links.value.find((x) => {
             return x.path == router.currentRoute.value.path; //this.$route.path;
           });
-          //鏌ユ壘鏈�鍚庝竴娆¤烦杞殑椤甸潰
+          //閺屻儲澹橀張鈧崥搴濈濞喡ょ儲鏉烆剛娈戞い鐢告桨
           if (!item) {
             item = getItem();
           }
@@ -579,7 +635,7 @@
     };
   },
   /**
-   * 鎸傝浇閽╁瓙鍑芥暟
+   * 閹稿倽娴囬柦鈺佺摍閸戣姤鏆�
    */
   mounted() {
     let _date = showTime();
@@ -594,14 +650,14 @@
 
   methods: {
     /**
-     * 缁戝畾鍙抽敭浜嬩欢
-     * @param {*} enable 鏄惁鍚敤鍙抽敭浜嬩欢[true:鍚敤;false:绂佺敤;]
-     * @param {*} $event 浜嬩欢
+     * 缂佹垵鐣鹃崣鎶芥暛娴滃娆�
+     * @param {*} enable 閺勵垰鎯侀崥顖滄暏閸欐娊鏁禍瀣╂[true:閸氼垳鏁�;false:缁備胶鏁�;]
+     * @param {*} $event 娴滃娆�
      */
     bindRightClickMenu(enable) {
       if (!enable) return;
       let that = this;
-      // 浣跨敤鍘熺敓js 涓哄崟涓猟om缁戝畾榧犳爣鍙冲嚮浜嬩欢
+      // 娴h法鏁ら崢鐔烘晸js 娑撳搫宕熸稉鐚無m缂佹垵鐣炬Η鐘崇垼閸欏啿鍤禍瀣╂
       that.$nextTick(() => {
         let tab_top_dom = Object.assign(
           [],
@@ -615,7 +671,7 @@
   },
 
   /**
-   * 閿�姣侀挬瀛愬嚱鏁�
+   * 闁库偓濮d線鎸�涙劕鍤遍弫?
    */
   destroyed() {
     $this = null;
@@ -623,13 +679,13 @@
   },
 });
 const week = new Array(
-  "鏄熸湡涓�",
-  "鏄熸湡浜�",
-  "鏄熸湡涓�",
-  "鏄熸湡鍥�",
-  "鏄熸湡浜�",
-  "鏄熸湡鍏�",
-  "鏄熸湡鏃�"
+  "閺勭喐婀℃稉鈧�",
+  "閺勭喐婀℃禍?,
+  "閺勭喐婀℃稉?,
+  "閺勭喐婀¢崶?,
+  "閺勭喐婀℃禍?,
+  "閺勭喐婀¢崗?,
+  "閺勭喐婀¢弮?
 );
 function showTime() {
   let date = new Date();
@@ -645,7 +701,7 @@
     "." +
     (month < 10 ? "0" + month : month) +
     "." +
-    (day < 10 ? "0" + day : day) + //202.08.08淇鏃ユ湡澶╂暟灏忎簬10鏃舵坊鍔�0
+    (day < 10 ? "0" + day : day) + //202.08.08娣囶喖顦查弮銉︽埂婢垛晜鏆熺亸蹇庣艾10閺冭埖鍧婇崝?
     "" +
     " " +
     (hour < 10 ? "0" + hour : hour) +
@@ -653,7 +709,7 @@
     (minutes < 10 ? "0" + minutes : minutes) +
     ":" +
     (second < 10 ? "0" + second : second) +
-    " " + //2020.08.30淇棣栭〉鏃ユ湡鏄熸湡澶╀笉鏄剧ず鐨勯棶棰�
+    " " + //2020.08.30娣囶喖顦叉#鏍�夐弮銉︽埂閺勭喐婀℃径鈺�绗夐弰鍓с仛閻ㄥ嫰妫舵0?
     (week[date.getDay() - 1] || week[6])
   );
 }
diff --git a/Code/WMS/AGENTS.md b/Code/WMS/AGENTS.md
index bce6547..5497ed3 100644
--- a/Code/WMS/AGENTS.md
+++ b/Code/WMS/AGENTS.md
@@ -14,12 +14,10 @@
 - `dotnet run --project WIDESEA_WMSServer/WIDESEA_WMSServer.csproj`:本地启动 API。
 
 前端(在 `WIDESEA_WMSClient` 目录执行):
-- `yarn install`:安装依赖。
-- `yarn dev`:启动 Vite 开发服务。
-- `yarn build`:构建生产包。
-- `yarn preview`:预览生产构建结果。
-- `yarn test:unit`:运行单元测试。
-- `yarn lint`:执行代码检查。
+- `npm install`:安装依赖。
+- `npm run serve`:启动本地开发服务(Vite)。
+- `npm run build`:构建生产资源。
+- `npm run lint`:执行 ESLint 检查。
 
 ## 开发流程强制规范
 
diff --git a/Code/WMS/WIDESEA_WMSClient/.yarn/install-state.gz b/Code/WMS/WIDESEA_WMSClient/.yarn/install-state.gz
index d31774c..9bf8470 100644
--- a/Code/WMS/WIDESEA_WMSClient/.yarn/install-state.gz
+++ b/Code/WMS/WIDESEA_WMSClient/.yarn/install-state.gz
Binary files differ
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outStockLockInfo.js b/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outStockLockInfo.js
new file mode 100644
index 0000000..e954850
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outStockLockInfo.js
@@ -0,0 +1,41 @@
+锘�// 椤甸潰鎵╁睍閰嶇疆锛氶鐣欑粰涓氬姟浜屾鎵╁睍閫昏緫銆�
+let extension = {
+  components: {
+    gridHeader: "",
+    gridBody: "",
+    gridFooter: "",
+    modelHeader: "",
+    modelBody: "",
+    modelFooter: "",
+  },
+  tableAction: "",
+  buttons: { view: [], box: [], detail: [] },
+  methods: {
+    onInit() {
+      return true;
+    },
+    onInited() {
+      return true;
+    },
+    searchBefore(param) {
+      return true;
+    },
+    searchAfter(result) {
+      return true;
+    },
+    addBefore(formData) {
+      return true;
+    },
+    updateBefore(formData) {
+      return true;
+    },
+    rowClick({ row, column, event }) {
+      return true;
+    },
+    modelOpenAfter(row) {
+      return true;
+    },
+  },
+};
+
+export default extension;
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stock.js b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stock.js
new file mode 100644
index 0000000..4f4e439
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stock.js
@@ -0,0 +1,41 @@
+锘�// 椤甸潰鎵╁睍閰嶇疆锛氶鐣欑粰搴撳瓨椤甸潰浜屾寮�鍙戙��
+let extension = {
+  components: {
+    gridHeader: "",
+    gridBody: "",
+    gridFooter: "",
+    modelHeader: "",
+    modelBody: "",
+    modelFooter: "",
+  },
+  tableAction: "",
+  buttons: { view: [], box: [], detail: [] },
+  methods: {
+    onInit() {
+      return true;
+    },
+    onInited() {
+      return true;
+    },
+    searchBefore(param) {
+      return true;
+    },
+    searchAfter(result) {
+      return true;
+    },
+    addBefore(formData) {
+      return true;
+    },
+    updateBefore(formData) {
+      return true;
+    },
+    rowClick({ row, column, event }) {
+      return true;
+    },
+    modelOpenAfter(row) {
+      return true;
+    },
+  },
+};
+
+export default extension;
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Tenant.js b/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Tenant.js
new file mode 100644
index 0000000..4f832e7
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Tenant.js
@@ -0,0 +1,41 @@
+锘�// 椤甸潰鎵╁睍閰嶇疆锛氶鐣欑粰绉熸埛涓氬姟閫昏緫鎵╁睍銆�
+let extension = {
+  components: {
+    gridHeader: "",
+    gridBody: "",
+    gridFooter: "",
+    modelHeader: "",
+    modelBody: "",
+    modelFooter: "",
+  },
+  tableAction: "",
+  buttons: { view: [], box: [], detail: [] },
+  methods: {
+    onInit() {
+      return true;
+    },
+    onInited() {
+      return true;
+    },
+    searchBefore(param) {
+      return true;
+    },
+    searchAfter(result) {
+      return true;
+    },
+    addBefore(formData) {
+      return true;
+    },
+    updateBefore(formData) {
+      return true;
+    },
+    rowClick({ row, column, event }) {
+      return true;
+    },
+    modelOpenAfter(row) {
+      return true;
+    },
+  },
+};
+
+export default extension;
diff --git a/Code/WMS/WIDESEA_WMSClient/src/router/viewGird.js b/Code/WMS/WIDESEA_WMSClient/src/router/viewGird.js
index ccb09c9..b4a1714 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/router/viewGird.js
+++ b/Code/WMS/WIDESEA_WMSClient/src/router/viewGird.js
@@ -1,4 +1,4 @@
-
+锘�
 let viewgird = [
   {
     path: '/Sys_Log',
@@ -181,6 +181,26 @@
     name: 'mesOutboundOrder',
     component: () => import('@/views/outbound/mesOutboundOrder.vue')
   }
+  , {
+    path: '/OutStockLockInfo',
+    name: 'OutStockLockInfo',
+    component: () => import('@/views/outbound/outStockLockInfo.vue')
+  }
+  , {
+    path: '/Sys_Tenant',
+    name: 'Sys_Tenant',
+    component: () => import('@/views/system/Sys_Tenant.vue')
+  }
+  , {
+    path: '/Stock',
+    name: 'Stock',
+    component: () => import('@/views/stock/stock.vue')
+  }
+  , {
+    path: '/PDA',
+    name: 'PDA',
+    component: () => import('@/views/system/PDA.vue')
+  }
 ]
 
 export default viewgird
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue
new file mode 100644
index 0000000..4467fac
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue
@@ -0,0 +1,134 @@
+锘�<template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+<script>
+import extend from "@/extension/outbound/outStockLockInfo.js";
+import { ref, defineComponent } from "vue";
+
+export default defineComponent({
+  setup() {
+    // 椤甸潰鏍稿績閰嶇疆锛氱粦瀹氬悗绔� OutStockLockInfo 鎺у埗鍣ㄣ��
+    const table = ref({
+      key: "id",
+      footer: "Foots",
+      cnName: "鍑哄簱閿佸畾鏄庣粏",
+      name: "outStockLockInfo",
+      url: "/OutStockLockInfo/",
+      sortName: "id",
+    });
+
+    // 鏂板/缂栬緫琛ㄥ崟瀛楁锛氫笌鍚庣瀹炰綋瀛楁淇濇寔涓�鑷达紝閬垮厤瀛楁涓㈠け銆�
+    const editFormFields = ref({
+      orderNo: "",
+      orderDetailId: "",
+      orderType: "",
+      batchNo: "",
+      materielCode: "",
+      materielName: "",
+      stockId: "",
+      orderQuantity: "",
+      originalQuantity: "",
+      assignQuantity: "",
+      locationCode: "",
+      palletCode: "",
+      unit: "",
+      taskNum: "",
+      status: "",
+      remark: "",
+    });
+
+    const editFormOptions = ref([
+      [
+        { field: "orderNo", title: "鍗曟嵁缂栧彿", type: "string", required: true },
+        { field: "orderType", title: "鍗曟嵁绫诲瀷", type: "select", dataKey: "outOrderType", data: [] },
+        { field: "batchNo", title: "鎵规鍙�", type: "string" },
+        { field: "materielCode", title: "鐗╂枡缂栧彿", type: "string" },
+        { field: "materielName", title: "鐗╂枡鍚嶇О", type: "string" },
+      ],
+      [
+        { field: "palletCode", title: "鎵樼洏缂栧彿", type: "string" },
+        { field: "locationCode", title: "璐т綅缂栧彿", type: "string" },
+        { field: "assignQuantity", title: "鍒嗛厤鍑哄簱閲�", type: "decimal" },
+        { field: "status", title: "鐘舵��", type: "select", dataKey: "outStockStatus", data: [] },
+        { field: "remark", title: "澶囨敞", type: "textarea" },
+      ],
+    ]);
+
+    // 鏌ヨ瀛楁锛氭彁渚涗笟鍔″畾浣嶅父鐢ㄦ潯浠躲��
+    const searchFormFields = ref({
+      orderNo: "",
+      batchNo: "",
+      materielCode: "",
+      palletCode: "",
+      locationCode: "",
+      status: "",
+    });
+
+    const searchFormOptions = ref([
+      [
+        { title: "鍗曟嵁缂栧彿", field: "orderNo", type: "like" },
+        { title: "鎵规鍙�", field: "batchNo", type: "like" },
+        { title: "鐗╂枡缂栧彿", field: "materielCode", type: "like" },
+      ],
+      [
+        { title: "鎵樼洏缂栧彿", field: "palletCode", type: "like" },
+        { title: "璐т綅缂栧彿", field: "locationCode", type: "like" },
+        { title: "鐘舵��", field: "status", type: "select", dataKey: "outStockStatus", data: [] },
+      ],
+    ]);
+
+    const columns = ref([
+      { field: "id", title: "Id", type: "int", width: 90, hidden: true, readonly: true, require: true, align: "left" },
+      { field: "orderNo", title: "鍗曟嵁缂栧彿", type: "string", width: 160, align: "left" },
+      { field: "orderType", title: "鍗曟嵁绫诲瀷", type: "int", width: 110, align: "left", bind: { key: "outOrderType", data: [] } },
+      { field: "orderDetailId", title: "鍗曟嵁鏄庣粏涓婚敭", type: "int", width: 120, align: "left", hidden: true },
+      { field: "batchNo", title: "鎵规鍙�", type: "string", width: 120, align: "left" },
+      { field: "materielCode", title: "鐗╂枡缂栧彿", type: "string", width: 130, align: "left" },
+      { field: "materielName", title: "鐗╂枡鍚嶇О", type: "string", width: 180, align: "left" },
+      { field: "stockId", title: "搴撳瓨涓婚敭", type: "int", width: 110, align: "left", hidden: true },
+      { field: "orderQuantity", title: "鍗曟嵁鏁伴噺", type: "decimal", width: 110, align: "left" },
+      { field: "originalQuantity", title: "鍘熷搴撳瓨閲�", type: "decimal", width: 110, align: "left" },
+      { field: "assignQuantity", title: "鍒嗛厤鍑哄簱閲�", type: "decimal", width: 120, align: "left" },
+      { field: "locationCode", title: "璐т綅缂栧彿", type: "string", width: 120, align: "left" },
+      { field: "palletCode", title: "鎵樼洏缂栧彿", type: "string", width: 120, align: "left" },
+      { field: "unit", title: "鍗曚綅", type: "string", width: 90, align: "left" },
+      { field: "taskNum", title: "浠诲姟鍙�", type: "int", width: 100, align: "left" },
+      { field: "status", title: "鐘舵��", type: "int", width: 100, align: "left", bind: { key: "outStockStatus", data: [] } },
+      { field: "creater", title: "鍒涘缓浜�", type: "string", width: 100, align: "left" },
+      { field: "createDate", title: "鍒涘缓鏃堕棿", type: "datetime", width: 160, align: "left" },
+      { field: "modifier", title: "淇敼浜�", type: "string", width: 100, align: "left", hidden: true },
+      { field: "modifyDate", title: "淇敼鏃堕棿", type: "datetime", width: 160, align: "left", hidden: true },
+      { field: "remark", title: "澶囨敞", type: "string", width: 120, align: "left", hidden: true },
+    ]);
+
+    const detail = ref({
+      cnName: "#detailCnName",
+      table: "",
+      columns: [],
+      sortName: "",
+    });
+
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/stock/stock.vue b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stock.vue
new file mode 100644
index 0000000..d1973a1
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stock.vue
@@ -0,0 +1,111 @@
+锘�<template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+<script>
+import extend from "@/extension/stock/stock.js";
+import { ref, defineComponent } from "vue";
+
+export default defineComponent({
+  setup() {
+    // 搴撳瓨鍩虹椤碉細瀵规帴 Stock 鎺у埗鍣紝鏀寔搴撳瓨涓昏褰曟煡璇㈢淮鎶ゃ��
+    const table = ref({
+      key: "id",
+      footer: "Foots",
+      cnName: "搴撳瓨",
+      name: "stock",
+      url: "/Stock/",
+      sortName: "id",
+    });
+
+    const editFormFields = ref({
+      palletCode: "",
+      palletType: "",
+      locationId: "",
+      locationCode: "",
+      warehouseId: "",
+      stockStatus: "",
+      outboundDate: "",
+      remark: "",
+    });
+
+    const editFormOptions = ref([
+      [
+        { field: "palletCode", title: "鎵樼洏缂栧彿", type: "string", required: true },
+        { field: "palletType", title: "鎵樼洏绫诲瀷", type: "number" },
+        { field: "locationCode", title: "璐т綅缂栧彿", type: "string" },
+      ],
+      [
+        { field: "warehouseId", title: "浠撳簱", type: "select", dataKey: "warehouses", data: [] },
+        { field: "stockStatus", title: "搴撳瓨鐘舵��", type: "select", dataKey: "stockStatusEmun", data: [] },
+        { field: "outboundDate", title: "鍑哄簱鏃ユ湡", type: "datetime" },
+      ],
+      [{ field: "remark", title: "澶囨敞", type: "textarea" }],
+    ]);
+
+    const searchFormFields = ref({
+      palletCode: "",
+      locationCode: "",
+      warehouseId: "",
+      stockStatus: "",
+      outboundDate: "",
+    });
+
+    const searchFormOptions = ref([
+      [
+        { title: "鎵樼洏缂栧彿", field: "palletCode", type: "like" },
+        { title: "璐т綅缂栧彿", field: "locationCode", type: "like" },
+        { title: "浠撳簱", field: "warehouseId", type: "select", dataKey: "warehouses", data: [] },
+      ],
+      [
+        { title: "搴撳瓨鐘舵��", field: "stockStatus", type: "select", dataKey: "stockStatusEmun", data: [] },
+        { title: "鍑哄簱鏃ユ湡", field: "outboundDate", type: "datetime" },
+      ],
+    ]);
+
+    const columns = ref([
+      { field: "id", title: "Id", type: "int", width: 90, hidden: true, readonly: true, require: true, align: "left" },
+      { field: "palletCode", title: "鎵樼洏缂栧彿", type: "string", width: 130, align: "left" },
+      { field: "palletType", title: "鎵樼洏绫诲瀷", type: "int", width: 110, align: "left" },
+      { field: "locationId", title: "璐т綅ID", type: "int", width: 110, align: "left", hidden: true },
+      { field: "locationCode", title: "璐т綅缂栧彿", type: "string", width: 130, align: "left" },
+      { field: "warehouseId", title: "浠撳簱", type: "select", width: 110, align: "left", bind: { key: "warehouses", data: [] } },
+      { field: "stockStatus", title: "搴撳瓨鐘舵��", type: "int", width: 120, align: "left", bind: { key: "stockStatusEmun", data: [] } },
+      { field: "outboundDate", title: "鍑哄簱鏃ユ湡", type: "datetime", width: 160, align: "left" },
+      { field: "creater", title: "鍒涘缓浜�", type: "string", width: 100, align: "left" },
+      { field: "createDate", title: "鍒涘缓鏃堕棿", type: "datetime", width: 160, align: "left" },
+      { field: "modifier", title: "淇敼浜�", type: "string", width: 100, align: "left", hidden: true },
+      { field: "modifyDate", title: "淇敼鏃堕棿", type: "datetime", width: 160, align: "left", hidden: true },
+      { field: "remark", title: "澶囨敞", type: "string", width: 140, align: "left" },
+    ]);
+
+    const detail = ref({
+      cnName: "#detailCnName",
+      table: "",
+      columns: [],
+      sortName: "",
+    });
+
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/system/PDA.vue b/Code/WMS/WIDESEA_WMSClient/src/views/system/PDA.vue
new file mode 100644
index 0000000..91feef9
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/system/PDA.vue
@@ -0,0 +1,128 @@
+锘�<template>
+  <div class="pda-container">
+    <el-card class="pda-card" shadow="hover">
+      <template #header>
+        <div class="card-header">PDA 搴旂敤绠$悊</div>
+      </template>
+
+      <el-form label-width="120px">
+        <el-form-item label="褰撳墠鐗堟湰鍙�">
+          <el-input v-model="clientVersion" placeholder="璇疯緭鍏ュ綋鍓峆DA鐗堟湰鍙�" style="max-width: 280px" />
+          <el-button type="primary" style="margin-left: 10px" @click="checkVersion">妫�鏌ユ洿鏂�</el-button>
+        </el-form-item>
+
+        <el-form-item label="鏈嶅姟绔増鏈粨鏋�">
+          <span>{{ checkResult }}</span>
+        </el-form-item>
+
+        <el-form-item label="涓嬭浇瀹夎鍖�">
+          <el-button type="success" @click="downloadApp">涓嬭浇鏈�鏂� APK</el-button>
+        </el-form-item>
+
+        <el-form-item label="涓婁紶瀹夎鍖�">
+          <el-upload
+            :action="uploadUrl"
+            :headers="uploadHeaders"
+            name="fileInput"
+            :show-file-list="true"
+            :before-upload="beforeUpload"
+            :on-success="onUploadSuccess"
+            :on-error="onUploadError"
+          >
+            <el-button type="warning">涓婁紶鏂� APK</el-button>
+          </el-upload>
+        </el-form-item>
+      </el-form>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import { defineComponent, ref, computed, getCurrentInstance } from "vue";
+import store from "@/store/index";
+import http from "@/api/http";
+
+export default defineComponent({
+  setup() {
+    const clientVersion = ref("");
+    const checkResult = ref("鏈鏌�");
+    const { proxy } = getCurrentInstance();
+
+    // 涓婁紶鍦板潃锛氬鐢ㄥ叏灞� http 鍩虹鍦板潃锛屼繚璇佷笌褰撳墠鐜涓�鑷淬��
+    const uploadUrl = computed(() => `${http.ipAddress}api/PDA/UploadApp`);
+
+    // 涓婁紶閴存潈锛氭部鐢ㄧ幇鏈� token 鏈哄埗锛岄伩鍏嶆帴鍙� 401銆�
+    const uploadHeaders = computed(() => ({
+      Authorization: store.getters.getToken(),
+    }));
+
+    const checkVersion = () => {
+      if (!clientVersion.value) {
+        proxy.$message.warning("璇疯緭鍏ョ増鏈彿");
+        return;
+      }
+
+      http
+        .get(`api/PDA/GetPDAVersion?version=${encodeURIComponent(clientVersion.value)}`, {}, true)
+        .then((res) => {
+          if (!res.status) {
+            checkResult.value = res.message || "妫�鏌ュけ璐�";
+            return;
+          }
+          checkResult.value = res.data ? "闇�瑕佹洿鏂�" : "宸叉槸鏈�鏂扮増鏈�";
+        });
+    };
+
+    const downloadApp = () => {
+      window.open(`${http.ipAddress}api/PDA/DownLoadApp`, "_blank");
+    };
+
+    // 涓婁紶鍓嶆牎楠岋細闄愬埗涓婁紶 apk锛屽噺灏戞棤鏁堣姹傘��
+    const beforeUpload = (file) => {
+      if (!file || !file.name || !file.name.toLowerCase().endsWith(".apk")) {
+        proxy.$message.error("鍙厑璁镐笂浼� .apk 鏂囦欢");
+        return false;
+      }
+      return true;
+    };
+
+    const onUploadSuccess = (response) => {
+      proxy.$message[response && response.status ? "success" : "error"](
+        (response && response.message) || "涓婁紶瀹屾垚"
+      );
+    };
+
+    const onUploadError = () => {
+      proxy.$message.error("涓婁紶澶辫触");
+    };
+
+    return {
+      clientVersion,
+      checkResult,
+      uploadUrl,
+      uploadHeaders,
+      checkVersion,
+      downloadApp,
+      beforeUpload,
+      onUploadSuccess,
+      onUploadError,
+    };
+  },
+});
+</script>
+
+<style lang="less" scoped>
+.pda-container {
+  height: 100%;
+  padding: 12px;
+}
+
+.pda-card {
+  max-width: 920px;
+}
+
+.card-header {
+  font-size: 16px;
+  font-weight: 600;
+}
+</style>
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Tenant.vue b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Tenant.vue
new file mode 100644
index 0000000..d0bd301
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Tenant.vue
@@ -0,0 +1,102 @@
+锘�<template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+<script>
+import extend from "@/extension/system/Sys_Tenant.js";
+import { ref, defineComponent } from "vue";
+
+export default defineComponent({
+  setup() {
+    // 绉熸埛绠$悊涓婚厤缃細瀵规帴 api/tenant銆�
+    const table = ref({
+      key: "tenantId",
+      footer: "Foots",
+      cnName: "绉熸埛绠$悊",
+      name: "sys_Tenant",
+      url: "/tenant/",
+      sortName: "tenantId",
+    });
+
+    const editFormFields = ref({
+      tenantName: "",
+      tenantType: "",
+      dbType: "",
+      connectionString: "",
+      status: "",
+      remark: "",
+    });
+
+    const editFormOptions = ref([
+      [
+        { field: "tenantName", title: "绉熸埛鍚嶇О", type: "string", required: true },
+        { field: "tenantType", title: "绉熸埛绫诲瀷", type: "number", required: true },
+        { field: "dbType", title: "鏁版嵁搴撶被鍨�", type: "number", required: true },
+      ],
+      [
+        { field: "status", title: "鐘舵��", type: "select", dataKey: "enableStatusEnum", data: [] },
+        { field: "connectionString", title: "杩炴帴瀛楃涓�", type: "textarea" },
+        { field: "remark", title: "澶囨敞", type: "textarea" },
+      ],
+    ]);
+
+    const searchFormFields = ref({
+      tenantName: "",
+      tenantType: "",
+      dbType: "",
+      status: "",
+    });
+
+    const searchFormOptions = ref([
+      [
+        { title: "绉熸埛鍚嶇О", field: "tenantName", type: "like" },
+        { title: "绉熸埛绫诲瀷", field: "tenantType", type: "number" },
+        { title: "鏁版嵁搴撶被鍨�", field: "dbType", type: "number" },
+        { title: "鐘舵��", field: "status", type: "select", dataKey: "enableStatusEnum", data: [] },
+      ],
+    ]);
+
+    const columns = ref([
+      { field: "tenantId", title: "绉熸埛ID", type: "int", width: 90, align: "left" },
+      { field: "tenantName", title: "绉熸埛鍚嶇О", type: "string", width: 180, align: "left" },
+      { field: "tenantType", title: "绉熸埛绫诲瀷", type: "int", width: 110, align: "left" },
+      { field: "dbType", title: "鏁版嵁搴撶被鍨�", type: "int", width: 110, align: "left" },
+      { field: "status", title: "鐘舵��", type: "int", width: 100, align: "left", bind: { key: "enableStatusEnum", data: [] } },
+      { field: "connectionString", title: "杩炴帴瀛楃涓�", type: "string", width: 280, align: "left" },
+      { field: "creater", title: "鍒涘缓浜�", type: "string", width: 100, align: "left" },
+      { field: "createDate", title: "鍒涘缓鏃堕棿", type: "datetime", width: 160, align: "left" },
+      { field: "modifier", title: "淇敼浜�", type: "string", width: 100, align: "left", hidden: true },
+      { field: "modifyDate", title: "淇敼鏃堕棿", type: "datetime", width: 160, align: "left", hidden: true },
+      { field: "remark", title: "澶囨敞", type: "string", width: 180, align: "left" },
+    ]);
+
+    const detail = ref({
+      cnName: "#detailCnName",
+      table: "",
+      columns: [],
+      sortName: "",
+    });
+
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>

--
Gitblit v1.9.3