From a8756c3526832332db4ef5685348d9b188c2bf2b Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期六, 13 九月 2025 08:36:44 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/MeiRuiAn/HuaiAn

---
 代码管理/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/AddErpProScrapSheet.vue               |    6 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockViewService.cs                            |  243 ++-
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/QuartzJob/DeviceProtocolController.cs |    2 
 代码管理/WCS/WIDESEAWCS_Client/public/webconfig.js                                                 |    6 
 代码管理/WMS/WIDESEA_WMSClient/src/views/stock/ProStockView.vue                                    |    8 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs                |   21 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_SystemService/Sys_DictionaryService.cs                      |   26 
 代码管理/WCS/WIDESEAWCS_Client/src/img/1.png                                                       |    0 
 代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/BoardWarehouse.vue                       |   45 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs                            |   76 +
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP仓/ConveyorLineJob_PP.cs                          |   21 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/辅料仓/ConveyorLineJob_FL.cs                          |   26 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP仓/TSJConveyorLineJob_PP.cs                       |   44 
 代码管理/WCS/WIDESEAWCS_Client/src/store/index.js                                                  |   13 
 代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/AuxiliaryWarehouse.vue                   |  257 +++
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs                                        |    5 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockViewService.cs                         |   95 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/EntityProperties.cs                          |   21 
 代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/DryFilmWarehouse.vue                     |  464 ++++++
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Completed.cs                    |    7 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP仓/PPReadData.cs                                  |  234 +++
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/ExpirationlabelEnum.cs                     |   21 
 代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/SolderMaskWarehouse.vue                  |  430 +++++
 代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/PpWarehouse.vue                          |  503 ++++++
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs            |    2 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/干膜仓/StackerCraneJob_GM.cs                          |   15 
 代码管理/WMS/WIDESEA_WMSClient/src/extension/stock/ProStockView.js                                 |   23 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/阻焊仓/StackerCraneJob_ZH.cs                          |   15 
 代码管理/WCS/WIDESEAWCS_Client/public/index.html                                                   |    1 
 代码管理/WCS/WIDESEAWCS_Client/src/views/Home.vue                                                  |  143 +
 代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/InkWarehouse.vue                         |  343 ++++
 代码管理/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue                             |   21 
 代码管理/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/TestFrameWarehouse.vue                   |   45 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/油墨仓/StackerCraneJob_YM.cs                          |   18 
 代码管理/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js                                      |    8 
 代码管理/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue                                 |    1 
 代码管理/WMS/WIDESEA_WMSClient/src/views/stock/stockView.vue                                       |   21 
 代码管理/WMS/WIDESEA_WMSClient/src/extension/stock/stockView.js                                    |  110 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs                          |    2 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfo.cs                          |    6 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Core/Helper/UtilConvert.cs                                  |    4 
 代码管理/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue                                  |    2 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/油墨仓/CommonHoisterJob.cs                            |   21 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/TaskInfo/Dt_Task.cs                            |    1 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP仓/StackerCraneJob_PP.cs                          |   16 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/干膜仓/ConveyorLineJob_GM.cs                          |   45 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/阻焊仓/ZHReadData.cs                                  |  174 ++
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/阻焊仓/GroundStationJob_ZH.cs                         |   44 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs                              |   48 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/StockViewDTO.cs                                   |    6 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/油墨仓/YMReadData.cs                                  |  106 +
 代码管理/WCS/WIDESEAWCS_Client/src/views/Index.vue                                                 |  297 ++-
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/UpdateExpirationlabelJob.cs                        |   40 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/辅料仓/FLReadData.cs                                  |   53 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/干膜仓/GMReadData.cs                                  |  185 ++
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs          |   10 
 56 files changed, 4,112 insertions(+), 288 deletions(-)

diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/public/index.html" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/public/index.html"
index 548664e..797746d 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/public/index.html"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/public/index.html"
@@ -9,6 +9,7 @@
   <meta name="description" content="" />
   <link rel="icon" href="<%= BASE_URL %>wcslogo.png">
   <title><%= htmlWebpackPlugin.options.title %></title>
+  <script src="webconfig.js"></script>
 </head>
 
 <body>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/public/webconfig.js" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/public/webconfig.js"
new file mode 100644
index 0000000..bc43820
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/public/webconfig.js"
@@ -0,0 +1,6 @@
+window.webConfig = {
+    "webApiDevelopment": "http://localhost:9291/",
+    "webApiProduction": "http://localhost:9291/",
+    "webApiDebug": "http://localhost:9291/",
+    "webSocketUrl": "ws://localhost:9260/",
+}
\ No newline at end of file
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/img/1.png" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/img/1.png"
new file mode 100644
index 0000000..4070c71
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/img/1.png"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/store/index.js" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/store/index.js"
index e72d129..12a00c1 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/store/index.js"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/store/index.js"
@@ -38,7 +38,16 @@
     },
     updateLoadingState(state, flag) {
       state.isLoading = flag
+    },
+
+
+    uphomedata(state, data) {
+      // console.log('123',data);
+
+      state.homedata = data;
+      // console.log('12state.homedata3',state.homedata);
     }
+    
   }, getters: {
     getPermission: (state) => (path) => {  //璋冪敤鏂瑰紡 store.getters.getPermission('sys_User')
       if (!path) return state.permission;
@@ -85,6 +94,10 @@
     },
     onLoading(context, flag) {
       context.commit("updateLoadingState", flag);
+    },
+
+    sethomedata(context, data) {
+      context.commit("uphomedata", data);
     }
   }
 })
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/Home.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/Home.vue"
index 820437a..41ecf97 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/Home.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/Home.vue"
@@ -1,24 +1,145 @@
 <template>
-  <div class="title"></div>
+  <div class="warehouse-dashboard">
+    <!-- 瀵艰埅鏍� -->
+    <nav class="navbar">
+      <div class="nav-container">
+        <h1 class="logo">浠撳簱璋冨害绯荤粺</h1>
+        <ul class="nav-links">
+          <li 
+            v-for="(warehouse, index) in warehouses" 
+            :key="index"
+            :class="{ active: activeWarehouse === index }"
+            @click="switchWarehouse(index)"
+          >
+            {{ warehouse.name }}
+          </li>
+        </ul>
+      </div>
+    </nav>
+
+    <!-- 涓诲唴瀹瑰尯 - 鍔ㄦ�佹覆鏌撻�変腑鐨勪粨搴撻〉闈� -->
+    <main class="content-area">
+      <component :is="currentComponent" class="warehouse-content"></component>
+    </main>
+  </div>
 </template>
 
 <script>
-import { ref, reactive } from 'vue'
+import { ref, computed } from 'vue';
+// 瀵煎叆鍚勪釜浠撳簱鐨勭粍浠�
+import BoardWarehouse from './deviceMonitoring/BoardWarehouse.vue';
+import TestFrameWarehouse from './deviceMonitoring/TestFrameWarehouse.vue';
+import SolderMaskWarehouse from './deviceMonitoring/SolderMaskWarehouse.vue';
+import PpWarehouse from './deviceMonitoring/PpWarehouse.vue';
+import InkWarehouse from './deviceMonitoring/InkWarehouse.vue';
+import AuxiliaryWarehouse from './deviceMonitoring/AuxiliaryWarehouse.vue';
+import DryFilmWarehouse from './deviceMonitoring/DryFilmWarehouse.vue';
 
 export default {
   setup() {
-    return {
+    // 瀹氫箟浠撳簱鍒楄〃
+    const warehouses = [
+      { name: '鏉挎潗浠�', component: BoardWarehouse },
+      { name: '娴嬭瘯鏋朵粨', component: TestFrameWarehouse },
+      { name: '闃荤剨浠�', component: SolderMaskWarehouse },
+      { name: 'PP浠�', component: PpWarehouse },
+      { name: '娌瑰ⅷ浠�', component: InkWarehouse },
+      { name: '杈呮枡浠�', component: AuxiliaryWarehouse },
+      { name: '鎴愬搧浠�', component: BoardWarehouse },
+      { name: '骞茶啘浠�', component: DryFilmWarehouse},
+    ];
 
-    }
+    // 褰撳墠閫変腑鐨勪粨搴撶储寮�
+    const activeWarehouse = ref(0);
+
+    // 鍒囨崲浠撳簱
+    const switchWarehouse = (index) => {
+      activeWarehouse.value = index;
+    };
+
+    // 鏍规嵁閫変腑鐨勪粨搴撹幏鍙栧綋鍓嶈娓叉煋鐨勭粍浠�
+    const currentComponent = computed(() => {
+      return warehouses[activeWarehouse.value].component;
+    });
+
+    return {
+      warehouses,
+      activeWarehouse,
+      switchWarehouse,
+      currentComponent
+    };
   }
-}
+};
 </script>
 
 <style scoped>
-.title {
-  line-height: 70vh;
-  text-align: center;
-  font-size: 28px;
-  color: orange;
+.warehouse-dashboard {
+  display: flex;
+  flex-direction: column;
+  min-height: 100vh;
 }
-</style>
\ No newline at end of file
+
+.navbar {
+  background-color: #2c3e50;
+  color: white;
+  padding: 0 20px;
+  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+}
+
+.nav-container {
+  max-width: 1200px;
+  margin: 0 auto;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  height: 60px;
+}
+
+.logo {
+  margin: 0;
+  font-size: 1.5rem;
+  font-weight: 600;
+}
+
+.nav-links {
+  display: flex;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  gap: 1px;
+}
+
+.nav-links li {
+  padding: 0 15px;
+  height: 60px;
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  background-color: #34495e;
+}
+
+.nav-links li:hover {
+  background-color: #3d5a7c;
+}
+
+.nav-links li.active {
+  background-color: #3498db;
+  font-weight: 500;
+  box-shadow: inset 0 -3px 0 #2980b9;
+}
+
+.content-area {
+  flex: 1;
+  padding: 20px;
+  background-color: #f5f7fa;
+}
+
+.warehouse-content {
+  background-color: white;
+  border-radius: 8px;
+  padding: 20px;
+  min-height: calc(100vh - 100px);
+  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
+}
+</style>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/Index.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/Index.vue"
index e59ef4f..3fd3bd8 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/Index.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/Index.vue"
@@ -3,20 +3,30 @@
     <div class="vol-aside" :style="{ width: menuWidth + 'px' }">
       <div class="header" :style="{ width: menuWidth - 1 + 'px' }">
         <img v-show="!isCollapse" v-bind:src="logo" />
-        <i @click="toggleLeft" class="el-icon-s-fold collapse-menu" />
+        <i
+          @click="toggleLeft"
+          class="collapse-menu"
+          :class="isCollapse ? 'el-icon-s-unfold' : 'el-icon-s-fold'"
+        />
       </div>
       <div class="vol-menu">
         <el-scrollbar style="height: 100%">
-          <VolMenu :currentMenuId="currentMenuId" :on-select="onSelect" :enable="true" :open-select="false"
-            :isCollapse="isCollapse" :list="menuOptions"></VolMenu>
+          <VolMenu
+            :currentMenuId="currentMenuId"
+            :on-select="onSelect"
+            :enable="true"
+            :open-select="false"
+            :isCollapse="isCollapse"
+            :list="menuOptions"
+          ></VolMenu>
         </el-scrollbar>
       </div>
     </div>
     <div class="vol-container" :style="{ left: menuWidth - 1 + 'px' }">
       <div class="vol-header">
-        <div class="project-name">WCS</div>
+        <div class="project-name">WMS</div>
         <div class="header-text">
-          <!-- <div class="h-link">
+          <div class="h-link">
             <a
               href="javascript:void(0)"
               @click="to(item)"
@@ -25,19 +35,38 @@
               })"
               :key="index"
             >
-              <span v-if="!item.icon"> {{ item.text }}</span>
+              <span v-if="!item.icon">{{ item.text }}</span>
               <i v-else :class="item.icon"></i>
             </a>
-          </div> -->
+          </div>
         </div>
         <div class="header-info">
           <div class="h-link">
-            <a href="javascript:void(0)" @click="to(item)" v-for="(item, index) in links.filter((c) => {
-              return c.icon;
-            })" :key="index">
-              <span> {{ item.text }}</span>
+            <a
+              href="javascript:void(0)"
+              @click="to(item)"
+              v-for="(item, index) in links.filter((c) => {
+                return c.icon;
+              })"
+              :key="index"
+            >
+              <span v-if="!item.icon">{{ item.text }}</span>
+              <i v-else :class="item.icon"></i>
             </a>
+          </div>
+          <!--娑堟伅绠$悊-->
 
+          <div class="h-link" @click="messageModel = true">
+            <a>
+              <i class="el-icon-message-solid">
+                <el-badge
+                  :value="messageList.length"
+                  :type="messageList.length > 0 ? 'danger' : 'success'"
+                  class="item"
+                  style="width: 10px"
+                ></el-badge>
+              </i>
+            </a>
           </div>
           <div>
             <img class="user-header" :src="userImg" :onerror="errorImg" />
@@ -52,10 +81,23 @@
         </div>
       </div>
       <div class="vol-path">
-        <el-tabs @tab-click="selectNav" @tab-remove="removeNav" @contextmenu.prevent="bindRightClickMenu(false)"
-          type="border-card" class="header-navigation" v-model="selectId" :strtch="false">
-          <el-tab-pane v-for="(item, navIndex) in navigation" type="card" :name="navIndex + ''" :closable="navIndex > 0"
-            :key="navIndex" :label="item.name">
+        <el-tabs
+          @tab-click="selectNav"
+          @tab-remove="removeNav"
+          @contextmenu.prevent="bindRightClickMenu(false)"
+          type="border-card"
+          class="header-navigation"
+          v-model="selectId"
+          :strtch="false"
+        >
+          <el-tab-pane
+            v-for="(item, navIndex) in navigation"
+            type="card"
+            :name="navIndex + ''"
+            :closable="navIndex > 0"
+            :key="navIndex"
+            :label="item.name"
+          >
             <span style="display: none">{{ navIndex }}</span>
           </el-tab-pane>
         </el-tabs>
@@ -66,18 +108,23 @@
               <el-button link @click="closeTabs()">
                 <i class="el-icon-close"></i>
                 {{
-                  navigation.length == 2 ? "鍏抽棴鑿滃崟" : "鍏抽棴鎵�鏈�"
-                }}</el-button>
+                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>
@@ -88,26 +135,45 @@
           <loading v-show="$store.getters.isLoading()"></loading>
           <router-view v-slot="{ Component }">
             <keep-alive>
-              <component :is="Component" :key="$route.name"
-                v-if="!$route.meta || ($route.meta && !$route.meta.hasOwnProperty('keepAlive'))" />
+              <component
+                :is="Component"
+                :key="$route.name"
+                v-if="
+                  !$route.meta ||
+                  ($route.meta && !$route.meta.hasOwnProperty('keepAlive'))
+                "
+              />
             </keep-alive>
-            <component :is="Component" :key="$route.name" v-if="$route.meta && $route.meta.hasOwnProperty('keepAlive')" />
+            <component
+              :is="Component"
+              :key="$route.name"
+              v-if="$route.meta && $route.meta.hasOwnProperty('keepAlive')"
+            />
           </router-view>
         </el-scrollbar>
       </div>
     </div>
     <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 }">
-          <div v-show="item.leftColor" :style="{ background: item.leftColor }" style="height: 100%; width: 20px"
-            class="t-left"></div>
+        <div
+          @click="changeTheme(item.name)"
+          class="item"
+          v-for="(item, index) in theme_color"
+          :key="index"
+          :style="{ background: item.color }"
+        >
+          <div
+            v-show="item.leftColor"
+            :style="{ background: item.leftColor }"
+            style="height: 100%; width: 20px"
+            class="t-left"
+          ></div>
           <div class="t-right"></div>
         </div>
       </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 size="40%">
       <Message :list="messageList"></Message>
     </el-drawer>
   </div>
@@ -131,15 +197,19 @@
   watch,
   onMounted,
   getCurrentInstance,
+  h
 } from "vue";
 import { useRouter, useRoute } from "vue-router";
 import store from "../store/index";
 import http from "@/../src/api/http.js";
+import { ElNotification } from "element-plus";
+import { useStore } from "vuex";
+
 export default defineComponent({
   components: {
     VolMenu,
     loading,
-    Message,
+    Message
   },
 
   data() {
@@ -149,11 +219,14 @@
       rightTabs: true,
       otherTabs: true,
       menuLeft: 0,
-      menuTop: 0,
+      menuTop: 0
+
       //  contextMenuVisible: false, // 鍙抽敭鍏抽棴鏄�/闅�
     };
   },
   setup(props, context) {
+    let client = ref(null);
+
     // 鑾峰彇鍏ㄥ眬灞炴�у拰鏂规硶
     const { proxy } = getCurrentInstance();
 
@@ -173,31 +246,16 @@
       { name: "orange2", color: "#ff9900", leftColor: "rgb(232 141 5)" },
       { name: "green", color: "rgb(25, 190, 107)" },
       { name: "green2", color: "rgb(25, 190, 107)", leftColor: "#019e4f" },
-      { name: "white", color: "#fff" },
+      { name: "white", color: "#fff" }
     ]);
     const links = ref([
-      // {
-      //   text: "妗嗘灦瑙嗛",
-      //   path: "https://www.cctalk.com/m/group/90268531",
-      //   id: -3,
-      // },
-      // { text: "澶у睆鏁版嵁", path: "/bigdata", id: -3 },
-      // {
-      //   text: "妗嗘灦鏂囨。",
-      //   path: "http://v2.volcore.xyz/document/guide",
-      //   id: -2,
-      // },   {
-      //   text: "妗嗘灦浼佷笟鐗�",
-      //   path: "http://pro.volcore.xyz/",
-      //   id: 10,
-      // },
       { text: "涓汉涓績", path: "/UserInfo", id: -1, icon: "el-icon-s-custom" },
       {
         text: "瀹夊叏閫�鍑�",
         path: "/login",
         id: -4,
-        icon: "el-icon-switch-button",
-      },
+        icon: "el-icon-switch-button"
+      }
     ]);
     const errorImg = ref(
       'this.src="' + require("@/assets/imgs/error-img.png") + '"'
@@ -208,16 +266,17 @@
     //2022.05.29澧炲姞tab閫夐」涓庤彍鍗曡仈鍔ㄥ姛鑳�
     const currentMenuId = ref(0);
     const userName = ref("--");
+    const userTrueName = ref("--");
     const userInfo = ref({});
     const visibleItem = reactive({
       left: false,
       right: false,
       all: false,
-      other: false,
+      other: false
     });
     const userImg = ref("");
     const navigation = reactive([
-      { orderNo: "0", id: "1", name: "棣栭〉", path: "/home" },
+      { orderNo: "0", id: "1", name: "棣栭〉", path: "/home" }
     ]);
     const logo = ref(imgUrl);
     const theme = ref("blue2");
@@ -237,23 +296,77 @@
       },
       hide() {
         toggleLeft();
-      },
+      }
     };
-    const changeTheme = (name) => {
+    const Store = useStore();
+    const s = ref(null);
+
+    const handleMessage = e => {
+      if (e) {
+        s.value = e.data;
+        console.log("WebSocket 鏀跺埌娑堟伅: ", e.data);
+        store.dispatch("sethomedata", s.value);
+        let data = JSON.parse(e.data);
+        messageList.push(data);
+        ElNotification({
+          title: data.title,
+          message: h("i", { style: "color: teal" }, data.message),
+          position: "bottom-right"
+        });
+      }
+    };
+
+    const createSocket = url => {
+      //console.log(url);
+
+      //鍒涘缓WebSocket杩炴帴
+      //"ws://127.0.0.1:9295/admin"
+      //client = new WebSocket("ws://192.168.0.250:9260/");
+      client = new WebSocket("ws:localhost:9260/");
+      client.onopen = function() {
+        //client.onmessage = handleMessage;
+        // store.commit("setWebsocket", client);
+        console.log("WebSocket 杩炴帴鎴愬姛");
+      };
+
+      client.onmessage = function(event) {
+        // console.log("WebSocket 鏀跺埌娑堟伅: ", event);
+
+        if (event != undefined) {
+          store.dispatch("sethomedata", JSON.parse(event.data));
+        }
+        // handleMessage(event);
+      };
+
+      client.onclose = function() {
+        console.log("WebSocket 杩炴帴鍏抽棴");
+        setTimeout(createSocket, 10000);
+      };
+
+      client.onerror = function(err) {
+        console.log("WebSocket 杩炴帴閿欒: ", err);
+      };
+      client.onmessage();
+    };
+
+    const changeTheme = name => {
       if (theme.value != name) {
         theme.value = name;
       }
       localStorage.setItem("vol3_theme", name);
     };
-    const to = (item) => {
+    const to = item => {
       /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      if (item.path == "#") {
+        window.open("https://github.com/cq-panda/Vue.NetCore");
+        return;
+      }
       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,7 +379,7 @@
     };
     const open = (item, useRoute) => {
       /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
-      let _index = navigation.findIndex((x) => {
+      let _index = navigation.findIndex(x => {
         return x.path == item.path;
       });
       if (_index == -1) {
@@ -275,7 +388,7 @@
           id: item.id + "",
           name: item.name || item.text || "鏃犳爣棰�",
           path: item.path,
-          query: item.query, //2021.03.20淇鑷畾涔変簩娆℃墦寮�$tabs鏃跺弬鏁颁涪澶辩殑闂
+          query: item.query //2021.03.20淇鑷畾涔変簩娆℃墦寮�$tabs鏃跺弬鏁颁涪澶辩殑闂
         });
         //鏂版墦寮�鐨則ab绉昏嚦鏈�鍚庝竴涓�夐」
         selectId.value = navigation.length - 1 + "";
@@ -290,13 +403,13 @@
       }
       currentMenuId.value = item.id * 1;
       // tab鑿滃崟缁戝畾鍙抽敭浜嬩欢
-      proxy.$nextTick(function (e) {
+      proxy.$nextTick(function(e) {
         proxy.bindRightClickMenu(true);
       });
     };
-    const close = (path) => {
+    const close = path => {
       /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
-      let index = navigation.findIndex((x) => {
+      let index = navigation.findIndex(x => {
         return x.path == path;
       });
       if (index == -1) {
@@ -304,7 +417,7 @@
       }
       removeNav(index);
     };
-    const setItem = (item) => {
+    const setItem = item => {
       /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
       localStorage.setItem(
         window.location.origin + "_tabs",
@@ -316,23 +429,23 @@
       let nav = localStorage.getItem(window.location.origin + "_tabs");
       return nav ? JSON.parse(nav) : null;
     };
-    const selectNav = (item) => {
+    const selectNav = item => {
       //鍗囩骇element姝e紡鐗堜慨鏀�
       selectId.value = item.props.name;
       let _path = navigation[item.index].path;
       currentMenuId.value = (
-        menuOptions.value.find((c) => {
+        menuOptions.value.find(c => {
           return c.path == _path;
         }) || { id: 0 }
       ).id;
 
       router.push({
         path: navigation[item.index].path,
-        query: navigation[item.index].query,
+        query: navigation[item.index].query
       });
     };
 
-    const removeNav = (_index) => {
+    const removeNav = _index => {
       return new Promise(() => {
         //鍏抽棴鐨勫綋鍓嶉」,璺宠浆鍒板墠涓�涓〉闈�
         if (selectId.value == _index + "") {
@@ -341,7 +454,7 @@
           router.push({
             path: navigation[_index - 1].path,
             //2022.06.27淇tabs浜屾鍒囨崲鍚庡弬鏁颁涪澶辩殑闂
-            query: navigation[_index - 1].query,
+            query: navigation[_index - 1].query
           });
           navigation.splice(_index, 1);
           selectId.value = selectId.value - 1 + "";
@@ -352,19 +465,19 @@
         }
         navigation.splice(_index, 1);
         currentMenuId.value = (
-          menuOptions.value.find((c) => {
+          menuOptions.value.find(c => {
             return c.path == navigation[selectId.value * 1].path;
           }) || { id: 0 }
         ).id;
       });
     };
 
-    const getSelectMenuName = (id) => {
-      return menuOptions.value.find(function (x) {
+    const getSelectMenuName = id => {
+      return menuOptions.value.find(function(x) {
         return x.id == id;
       });
     };
-    const onSelect = (treeId) => {
+    const onSelect = treeId => {
       /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
       var item = getSelectMenuName(treeId);
       open(item, false);
@@ -374,7 +487,7 @@
      * 鏄剧ず鍙抽敭鑿滃崟
      * @param {*} e 浜嬩欢瀵硅薄
      */
-    const openTabsMenu = function (e) {
+    const openTabsMenu = function(e) {
       e.preventDefault(); // 闃叉榛樿鑿滃崟寮瑰嚭
       let tabId = e.target.id.split("-")[1] * 1;
 
@@ -417,14 +530,14 @@
     const toHome = () => {
       open({
         text: navigation[0].name,
-        path: navigation[0].path,
+        path: navigation[0].path
       });
     };
     /**
      * 鍏抽棴鍏跺畠鏍囩椤�
      * @param {*} par 鍏抽棴绫诲瀷(left,right,other)
      */
-    const closeTabs = (value) => {
+    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) {
@@ -463,7 +576,7 @@
         }
       }
       selectId.value =
-        navigation.findIndex((c) => {
+        navigation.findIndex(c => {
           return c.id == _menuId;
         }) + "";
       closeTabsMenu();
@@ -493,28 +606,33 @@
       let _userInfo = store.getters.getUserInfo();
       if (_userInfo) {
         userName.value = _userInfo.userName;
+        userTrueName.value = _userInfo.userTrueName;
         if (_userInfo.img) {
           userImg.value = _config.base.getImgSrc(_userInfo.img, http.ipAddress);
         }
       }
+
+      createSocket(window.webConfig.webSocketUrl);
+
       Object.assign(_config.$tabs, { open: open, close: close });
 
-      http.get("api/Sys_Menu/getTreeMenu", {}, true).then((data) => {
+      http.get("api/Sys_Menu/getTreeMenu", {}, true).then(data => {
         data.push({ id: "1", name: "棣栭〉", url: "/home" }); // 涓轰簡鑾峰彇閫変腑id浣跨敤
-        data.forEach((d) => {
+        data.forEach(d => {
           d.path = (d.url || "").replace("/Manager", "");
           d.to = (d.url || "").replace("/Manager", "");
           if (!d.icon || d.icon.substring(0, 3) != "el-") {
             d.icon = "el-icon-menu";
           }
         });
+
         store.dispatch("setPermission", data);
         menuOptions.value = data;
         permissionInited.value = true;
 
         //寮�鍚秷鎭帹閫侊紙main.js涓缃槸鍚﹀紑鍚痵ignalR锛�2022.05.05
         if (_config.$global.signalR) {
-          MessageConfig(http, (result) => {
+          MessageConfig(http, result => {
             messageList.unshift(result);
             //    console.log(result)
           });
@@ -523,12 +641,12 @@
         //褰撳墠鍒锋柊鏄笉鏄椤�
         if (router.currentRoute.value.path != navigation[0].path) {
           //鏌ユ壘绯荤粺鑿滃崟
-          let item = menuOptions.value.find((x) => {
+          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) => {
+          item = links.value.find(x => {
             return x.path == router.currentRoute.value.path; //this.$route.path;
           });
           //鏌ユ壘鏈�鍚庝竴娆¤烦杞殑椤甸潰
@@ -551,6 +669,7 @@
       errorImg,
       userInfo,
       userName,
+      userTrueName,
       userImg,
       selectId,
       selectMenuIndex,
@@ -574,7 +693,7 @@
       visibleItem,
       closeTabsMenu,
       closeTabs,
-      currentMenuId,
+      currentMenuId
     };
   },
   /**
@@ -584,7 +703,7 @@
     let _date = showTime();
     $indexDate = document.getElementById("index-date");
     $indexDate.innerText = _date;
-    $interval = setInterval(function () {
+    $interval = setInterval(function() {
       $indexDate.innerText = showTime();
     }, 1000);
 
@@ -610,7 +729,7 @@
           item.oncontextmenu = that.openTabsMenu;
         });
       });
-    },
+    }
   },
 
   /**
@@ -619,7 +738,7 @@
   destroyed() {
     $this = null;
     clearInterval($interval);
-  },
+  }
 });
 const week = new Array(
   "鏄熸湡涓�",
@@ -663,6 +782,11 @@
   padding: 0;
 }
 
+.item {
+  margin-top: -20px;
+  margin-right: 40px;
+}
+
 .contextMenu {
   width: 120px;
   margin: 0;
@@ -676,7 +800,6 @@
   font-size: 14px;
   color: #333;
   box-shadow: 2px 2px 3px 0 rgb(182 182 182 / 20%);
-
   i,
   button {
     font-size: 14px !important;
@@ -699,8 +822,12 @@
   letter-spacing: 1px;
 }
 
-.el-tabs.el-tabs--top.el-tabs--border-card.header-navigation>.el-tabs__header .el-tabs__item:last-child,
-.el-tabs--top.el-tabs--border-card.header-navigation>.el-tabs__header .el-tabs__item:nth-child(2) {
+.el-tabs.el-tabs--top.el-tabs--border-card.header-navigation
+  > .el-tabs__header
+  .el-tabs__item:last-child,
+.el-tabs--top.el-tabs--border-card.header-navigation
+  > .el-tabs__header
+  .el-tabs__item:nth-child(2) {
   padding: 0;
 }
 
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/AuxiliaryWarehouse.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/AuxiliaryWarehouse.vue"
new file mode 100644
index 0000000..52eb37e
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/AuxiliaryWarehouse.vue"
@@ -0,0 +1,257 @@
+<template>
+  <div id="title">
+    <div id="bkuang" style="border-top: none">
+ 
+      <div class="skuang">
+        <div class="zhuname">鍏ュ簱8005绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣瀹屾垚(鍐�):</div>
+          <div class="xzhi" :title="data.W_PutFinish5">{{ data.W_PutFinish5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍏ュ簱鍒颁綅鎸囦护(璇�):</div>
+          <div class="xzhi" :title="data.R_ConveyArrivaled5">{{ data.R_ConveyArrivaled5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍒颁綅鎵樼洏鍙�(璇�):</div>
+          <div class="xzhi" :title="data.R_Barcode5">{{ data.R_Barcode5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍒颁綅浠诲姟鍙�(璇�):</div>
+          <div class="xzhi" :title="data.R_TaskNum5">{{ data.R_TaskNum5 }}</div>
+        </div> 
+      </div>
+      
+      <div class="skuang">
+        <div class="zhuname">鍑哄簱8001绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣瀹屾垚(鍐�):</div>
+          <div class="xzhi" :title="data.W_PutFinish1">{{ data.W_PutFinish1 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鍏佽鏀捐揣(璇�):</div>
+          <div class="xzhi" :title="data.R_IsCanPut">{{ data.R_IsCanPut }}</div>
+        </div>
+      </div>
+    </div>
+    
+  </div>
+</template>
+
+<script>
+import { ref, nextTick } from "vue";
+import { useStore } from "vuex";
+import { onMounted } from "vue";
+
+export default {
+  data() {
+    return {
+      xuan: 0
+    };
+  },
+  methods: {
+  },
+  setup() {
+    const store = useStore();
+    const data = ref({});
+
+    // 1. 瀹氫箟鏅�氬瓧娈电殑鏄犲皠瑙勫垯
+    const statusMap = {
+      
+    };
+
+    // 2. 瀹氫箟闇�瑕佸叡鐢ㄦ槧灏勮鍒欑殑瀛楁鍒楄〃鍜屽搴旂殑鏄犲皠瑙勫垯
+    const booleanFields = [
+      "W_PutFinish5", "W_PutFinish1",
+      "R_IsCanPut", "R_ConveyArrivaled5",
+    ];
+    const booleanMap = {
+      true: "鏄�",
+      false: "鍚�"
+    };
+
+    // 澶勭悊鏁版嵁锛屽厛澶勭悊鏅�氭槧灏勶紝鍐嶆壒閲忓鐞嗗叡鐢ㄦ槧灏勭殑瀛楁
+    const processData = (rawData) => {
+      if (!rawData) return {};
+      const processed = { ...rawData };
+
+      // 澶勭悊鏅�氬瓧娈垫槧灏�
+      Object.keys(statusMap).forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          const map = statusMap[key];
+          processed[key] = map[processed[key]] || processed[key];
+        }
+      });
+
+      // 鎵归噺澶勭悊鍏辩敤鏄犲皠瑙勫垯鐨勫瓧娈�
+      booleanFields.forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          processed[key] = booleanMap[processed[key]] || processed[key];
+        }
+      });
+
+      return processed;
+    };
+
+    onMounted(() => {
+      nextTick(() => {
+        setInterval(() => {
+          const rawData = store.state.homedata;
+          data.value = processData(rawData);
+          const xian = document.getElementsByClassName("xzhi");
+          for (let i = 0; i < xian.length; i++) {
+            if (xian[i].innerHTML === "鏄�") {
+              xian[i].style.color = "yellow";
+            } else if (xian[i].innerHTML === "鍚�") {
+              xian[i].style.color = "red";
+            }
+          }
+        });
+      });
+    });
+
+    return {
+      data,
+    };
+  }
+};
+</script>
+
+<style scoped>
+.ding {
+  float: left;
+  width: 20px;
+  height: 20px;
+  margin-top: 7px;
+}
+.yan {
+  color: white;
+  float: left;
+  font-size: 25px;
+}
+.dakuang {
+  width: 250px;
+  height: 50px;
+  position: absolute;
+  top: 150px;
+  left: 200px;
+}
+#xiugai {
+  width: 100px;
+  height: 30px;
+  float: left;
+  border-radius: 5px;
+  text-align: center;
+  line-height: 30px;
+  cursor: pointer;
+  border: 1px solid white;
+  color: white;
+  background: rgba(255, 255, 255, 0.5);
+  font-size: 25px;
+  position: absolute;
+  top: 150px;
+  left: 450px;
+}
+#xiugai:hover {
+  background: #f60;
+}
+#shu1,
+#shu2 {
+  width: 200px;
+  height: 30px;
+  float: left;
+  margin-top: 0px;
+  margin-right: 0px;
+  border-radius: 5px;
+  border: 1px solid white;
+}
+#guan {
+  width: 40px;
+  height: 40px;
+  float: left;
+  font-size: 1.1cqw;
+  text-align: center;
+  line-height: 40px;
+  cursor: pointer;
+  margin-left: 560px;
+  color: white;
+  position: absolute;
+}
+#ti {
+  width: 600px;
+  height: 300px;
+  position: relative;
+  background: rgba(255, 255, 255, 1);
+  border-radius: 10px;
+  top: 230px;
+  left: 35%;
+  display: none;
+  background-image: url("../../img/1.png");
+  background-repeat: no-repeat;
+  background-size: 170%;
+  background-position: -220px 0px;
+}
+.zhuname {
+  width: 100%;
+  height: 5vh;
+  float: left;
+  text-align: center;
+  line-height: 50px;
+  font-weight: 700;
+  font-size: 1.1cqw;
+  color: white;
+}
+.xname {
+  width: 70%;
+  height: 80px;
+  float: left;
+  line-height: 7vh;
+  font-size: 1.1cqw;
+  color: white;
+}
+.xzhi {
+  width: 30%;
+  height: 7vh;
+  float: left;
+  line-height: 50px;
+  font-size: 1.1cqw;
+  color: rgb(242, 242, 50);
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.zhankuang {
+  width: 45%;
+  height: 3vh;
+  margin-top: 10px;
+  margin-left: 5%;
+  float: left;
+}
+#title {
+  float: left;
+  width: 95%;
+  height: 88vh;
+  margin-top: 40px;
+  margin-left: 3%;
+  background-image: url("../../img/1.png");
+  background-repeat: no-repeat;
+  background-size: 100%;
+  container-type: inline-size;
+}
+#bkuang {
+  width: 100%;
+  height: 55vh;
+  float: left;
+}
+.skuang {
+  width: 31%;
+  height: 55vh;
+  float: left;
+  border-top: none;
+  border-left: none;
+  border-bottom: none;
+  background: rgba(255, 255, 255, 0.2);
+  margin-left: 1.7%;
+  border-radius: 10px;
+}
+</style>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/BoardWarehouse.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/BoardWarehouse.vue"
new file mode 100644
index 0000000..8b42e03
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/BoardWarehouse.vue"
@@ -0,0 +1,45 @@
+<template>
+  <div class="message-container">
+    <div class="item" v-for="(item, index) in list" :key="index">
+      <div class="title">{{ item.title }}({{ item.date }})</div>
+      <div class="content">{{ item.message }}</div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    list: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  created() {
+    if (!this.list.length) {
+      this.list.push({
+        title: '娑堟伅娴嬭瘯鏍噏weqweqweqw棰�',
+        message: '娑堟伅娴嬭瘯鍐呭娑堟伅娴嬭瘯鍐呭娑堟伅娴嬭瘯鍐呭娑堟伅娴嬭瘯鍐呭',
+        date: '2022-05-02 03:10'
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="less">
+.message-container {
+  .title {
+    padding-bottom: 10px;
+  }
+  .item {
+    border-bottom: 1px solid #eee;
+    padding: 10px 20px;
+  }
+  .content {
+    color: #7e7e7e;
+    font-size: 13px;
+  }
+}
+</style>
\ No newline at end of file
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/DryFilmWarehouse.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/DryFilmWarehouse.vue"
new file mode 100644
index 0000000..94a238c
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/DryFilmWarehouse.vue"
@@ -0,0 +1,464 @@
+<template>
+  <div id="title">
+    <div id="bkuang" style="border-top: none">
+      <div class="skuang">
+        <div class="zhuname">骞茶啘浠撳爢鍨涙満</div>
+        <div class="zhankuang">
+          <div class="xname">鍫嗗灈鏈虹姸鎬�:</div>
+          <div class="xzhi" :title="data.R_GM_Status">{{ data.R_GM_Status }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍫嗗灈鏈烘墜鑷姩鐘舵��:</div>
+          <div class="xzhi" :title="data.R_GM_AutoStatus">{{ data.R_GM_AutoStatus }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">姝e湪鎵ц鐨勪换鍔″彿:</div>
+          <div class="xzhi" :title="data.R_GM_TaskNum">{{ data.R_GM_TaskNum }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍫嗗灈鏈哄伐浣滅姸鎬�:</div>
+          <div class="xzhi" :title="data.R_GM_WorkStatus">{{ data.R_GM_WorkStatus }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">浣滀笟绫诲瀷:</div>
+          <div class="xzhi" :title="data.R_GM_WorkType">{{ data.R_GM_WorkType }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鎵樼洏绫诲瀷:</div>
+          <div class="xzhi" :title="data.R_GM_TrayType">{{ data.R_GM_TrayType }}</div>
+        </div>
+      </div>
+      <div class="skuang">
+        <div class="zhuname">鍏ュ簱7003绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">璇诲彇绠变綋鐮�(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_Boxcode">{{ data.R_GM_Boxcode }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鎻℃墜淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_HandShake3">{{ data.R_GM_HandShake3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鑱旀満(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_Online3">{{ data.R_GM_Online3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁绌洪棽(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_Free3">{{ data.R_GM_Free3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏈夎揣(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_Goods3">{{ data.R_GM_Goods3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏁呴殰(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_Alarm3">{{ data.R_GM_Alarm3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_STB3">{{ data.R_GM_STB3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_ACK3">{{ data.R_GM_ACK3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_GM_STB3">{{ data.W_GM_STB3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_GM_ACK3">{{ data.W_GM_ACK3 }}</div>
+        </div>
+      </div>
+      
+      <div class="skuang">
+        <div class="zhuname">鍑哄簱缁堢偣7004绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">鎻℃墜淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_HandShake4">{{ data.R_GM_HandShake4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鑱旀満(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_Online4">{{ data.R_GM_Online4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁绌洪棽(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_Free4">{{ data.R_GM_Free4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏈夎揣(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_Goods4">{{ data.R_GM_Goods4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏁呴殰(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_Alarm4">{{ data.R_GM_Alarm4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_STB4">{{ data.R_GM_STB4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_ACK4">{{ data.R_GM_ACK4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_GM_STB4">{{ data.W_GM_STB4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_GM_ACK4">{{ data.W_GM_ACK4 }}</div>
+        </div>
+        <div class="zhuname">鍑哄簱7005绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">鎻℃墜淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_HandShake5">{{ data.R_GM_HandShake5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鑱旀満(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_Online5">{{ data.R_GM_Online5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁绌洪棽(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_Free5">{{ data.R_GM_Free5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏈夎揣(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_Goods5">{{ data.R_GM_Goods5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏁呴殰(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_Alarm5">{{ data.R_GM_Alarm5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_STB5">{{ data.R_GM_STB5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_GM_ACK5">{{ data.R_GM_ACK5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_GM_STB5">{{ data.W_GM_STB5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_GM_ACK5">{{ data.W_GM_ACK5 }}</div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { ref, nextTick } from "vue";
+import { useStore } from "vuex";
+import { onMounted } from "vue";
+
+export default {
+  data() {
+    return {
+      xuan: 0
+    };
+  },
+  methods: {
+  },
+  setup() {
+    const store = useStore();
+    const data = ref({});
+
+    // 1. 瀹氫箟鏅�氬瓧娈电殑鏄犲皠瑙勫垯
+    const statusMap = {
+      R_GM_Status: {
+        1: "姝e父",
+        2: "鏁呴殰",
+        3: "鎬ュ仠",
+      },
+      R_GM_AutoStatus: {
+        0: "缁翠慨",
+        1: "鎵嬪姩",
+        2: "鍗婅嚜鍔�",
+        3: "鑷姩",
+      },
+      R_GM_WorkStatus: {
+        0: "寰呮満",
+        1: "鍙栬揣涓�",
+        2: "鍙栬揣瀹屾垚",
+        4: "鏀捐揣涓�",
+        5: "鏀捐揣瀹屾垚",
+        6: "浠诲姟瀹屾垚",
+      },
+      R_GM_WorkType: {
+        0: "鏃犱綔涓氫换鍔�(0)",
+        1: "鍙栨斁璐т綔涓�(1)",
+        2: "鍙彇璐т綔涓�(2)",
+        3: "鍙斁璐т綔涓�(3)",
+        4: "绉诲姩鍒版寚瀹氫綅缃�"
+      },
+      R_GM_TrayType: {
+        "-1": "绌虹(-1)",
+        1: "灏忔墭鐩�(1)",
+        2: "涓墭鐩�(2)",
+        3: "澶ф墭鐩�(3)",
+        4: "鐗瑰ぇ鎵樼洏(4)",
+      }
+    };
+    const onlines = [
+        "R_GM_Online3","R_GM_Online4",
+        "R_GM_Online5",
+    ]
+    const online = {
+      1: "鑱旀満",
+      0: "鑴辨満"
+    };
+    const alarms = [
+        "R_GM_Alarm3","R_GM_Alarm4",
+        "R_GM_Alarm5",
+    ]
+    const alarm = {
+      1: "鏁呴殰",
+      0: "姝e父"
+    };
+    const frees = [
+        "R_GM_Free3","R_GM_Free4",
+        "R_GM_Free5",
+    ]
+    const free = {
+      1: "绌洪棽",
+      0: "绻佸繖"
+    };
+    const goods = [
+        "R_GM_Goods3", "R_GM_Goods4",
+        "R_GM_Goods5",
+    ]
+    const good = {
+      1: "鏈夎揣",
+      0: "鏃犺揣"
+    };
+    // 2. 瀹氫箟闇�瑕佸叡鐢ㄦ槧灏勮鍒欑殑瀛楁鍒楄〃鍜屽搴旂殑鏄犲皠瑙勫垯
+    const booleanFields = [
+      "R_GM_HandShake3", 
+       "R_GM_STB3",
+      "R_GM_ACK3", "W_GM_STB3",
+      "W_GM_ACK3", 
+      "R_GM_HandShake4",
+       "R_GM_STB4",
+      "R_GM_ACK4", "W_GM_STB4",
+      "W_GM_ACK4",
+      "R_GM_HandShake5", 
+       "R_GM_STB5",
+      "R_GM_ACK5", "W_GM_STB5",
+      "W_GM_ACK5",
+    ];
+    const booleanMap = {
+      true: "鏄�",
+      false: "鍚�"
+    };
+
+    // 澶勭悊鏁版嵁锛屽厛澶勭悊鏅�氭槧灏勶紝鍐嶆壒閲忓鐞嗗叡鐢ㄦ槧灏勭殑瀛楁
+    const processData = (rawData) => {
+      if (!rawData) return {};
+      const processed = { ...rawData };
+
+      // 澶勭悊鏅�氬瓧娈垫槧灏�
+      Object.keys(statusMap).forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          const map = statusMap[key];
+          processed[key] = map[processed[key]] || processed[key];
+        }
+      });
+
+      // 鎵归噺澶勭悊鍏辩敤鏄犲皠瑙勫垯鐨勫瓧娈�
+      booleanFields.forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          processed[key] = booleanMap[processed[key]] || processed[key];
+        }
+      });
+      onlines.forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          processed[key] = online[processed[key]] || processed[key];
+        }
+      });
+      alarms.forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          processed[key] = alarm[processed[key]] || processed[key];
+        }
+      });
+      frees.forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          processed[key] = free[processed[key]] || processed[key];
+        }
+      });
+      goods.forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          processed[key] = good[processed[key]] || processed[key];
+        }
+      });
+
+      return processed;
+    };
+
+    onMounted(() => {
+      nextTick(() => {
+        setInterval(() => {
+          const rawData = store.state.homedata;
+          data.value = processData(rawData);
+          const xian = document.getElementsByClassName("xzhi");
+          for (let i = 0; i < xian.length; i++) {
+            if (xian[i].innerHTML === "鏄�" || xian[i].innerHTML === "鑱旀満") {
+              xian[i].style.color = "yellow";
+            } else if (xian[i].innerHTML === "鍚�") {
+              xian[i].style.color = "red";
+            }
+          }
+        });
+      });
+    });
+
+    return {
+      data,
+    };
+  }
+};
+</script>
+
+<style scoped>
+.ding {
+  float: left;
+  width: 20px;
+  height: 20px;
+  margin-top: 7px;
+}
+.yan {
+  color: white;
+  float: left;
+  font-size: 25px;
+}
+.dakuang {
+  width: 250px;
+  height: 50px;
+  position: absolute;
+  top: 150px;
+  left: 200px;
+}
+#xiugai {
+  width: 100px;
+  height: 30px;
+  float: left;
+  border-radius: 5px;
+  text-align: center;
+  line-height: 30px;
+  cursor: pointer;
+  border: 1px solid white;
+  color: white;
+  background: rgba(255, 255, 255, 0.5);
+  font-size: 25px;
+  position: absolute;
+  top: 150px;
+  left: 450px;
+}
+#xiugai:hover {
+  background: #f60;
+}
+#shu1,
+#shu2 {
+  width: 200px;
+  height: 30px;
+  float: left;
+  margin-top: 0px;
+  margin-right: 0px;
+  border-radius: 5px;
+  border: 1px solid white;
+}
+#guan {
+  width: 40px;
+  height: 40px;
+  float: left;
+  font-size: 1.1cqw;
+  text-align: center;
+  line-height: 40px;
+  cursor: pointer;
+  margin-left: 560px;
+  color: white;
+  position: absolute;
+}
+#ti {
+  width: 600px;
+  height: 300px;
+  position: relative;
+  background: rgba(255, 255, 255, 1);
+  border-radius: 10px;
+  top: 230px;
+  left: 35%;
+  display: none;
+  background-image: url("../../img/1.png");
+  background-repeat: no-repeat;
+  background-size: 170%;
+  background-position: -220px 0px;
+}
+.zhuname {
+  width: 100%;
+  height: 5vh;
+  float: left;
+  text-align: center;
+  line-height: 50px;
+  font-weight: 700;
+  font-size: 1.1cqw;
+  color: white;
+}
+.xname {
+  width: 70%;
+  height: 80px;
+  float: left;
+  line-height: 7vh;
+  font-size: 1.1cqw;
+  color: white;
+}
+.xzhi {
+  width: 30%;
+  height: 7vh;
+  float: left;
+  line-height: 50px;
+  font-size: 1.1cqw;
+  color: rgb(242, 242, 50);
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.zhankuang {
+  width: 45%;
+  height: 3vh;
+  margin-top: 10px;
+  margin-left: 5%;
+  float: left;
+}
+#title {
+  float: left;
+  width: 95%;
+  height: 88vh;
+  margin-top: 40px;
+  margin-left: 3%;
+  background-image: url("../../img/1.png");
+  background-repeat: no-repeat;
+  background-size: 100%;
+  container-type: inline-size;
+}
+#bkuang {
+  width: 100%;
+  height: 55vh;
+  float: left;
+}
+.skuang {
+  width: 31%;
+  height: 55vh;
+  float: left;
+  border-top: none;
+  border-left: none;
+  border-bottom: none;
+  background: rgba(255, 255, 255, 0.2);
+  margin-left: 1.7%;
+  border-radius: 10px;
+}
+</style>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/InkWarehouse.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/InkWarehouse.vue"
new file mode 100644
index 0000000..dbc0396
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/InkWarehouse.vue"
@@ -0,0 +1,343 @@
+<template>
+  <div id="title">
+    <div id="bkuang" style="border-top: none">
+      <div class="skuang">
+        <div class="zhuname">娌瑰ⅷ浠撳爢鍨涙満</div>
+        <div class="zhankuang">
+          <div class="xname">鍫嗗灈鏈虹姸鎬�:</div>
+          <div class="xzhi" :title="data.R_YM_Status">{{ data.R_YM_Status }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍫嗗灈鏈烘墜鑷姩鐘舵��:</div>
+          <div class="xzhi" :title="data.R_YM_AutoStatus">{{ data.R_YM_AutoStatus }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">姝e湪鎵ц鐨勪换鍔″彿:</div>
+          <div class="xzhi" :title="data.R_YM_TaskNum">{{ data.R_YM_TaskNum }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍫嗗灈鏈哄伐浣滅姸鎬�:</div>
+          <div class="xzhi" :title="data.R_YM_WorkStatus">{{ data.R_YM_WorkStatus }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">浣滀笟绫诲瀷:</div>
+          <div class="xzhi" :title="data.R_YM_WorkType">{{ data.R_YM_WorkType }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鎵樼洏绫诲瀷:</div>
+          <div class="xzhi" :title="data.R_YM_TrayType">{{ data.R_YM_TrayType }}</div>
+        </div>
+      </div>
+      <div class="skuang">
+        <div class="zhuname">鍑哄叆搴�9001绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">鏈夎揣(璇�):</div>
+          <div class="xzhi" :title="data.R_YM_Tray1">{{ data.R_YM_Tray1 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍏ュ簱鎵ц涓�(璇�):</div>
+          <div class="xzhi" :title="data.R_YM_Inbounding1">{{ data.R_YM_Inbounding1 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鎻愬崌鏈虹┖闂�(璇�):</div>
+          <div class="xzhi" :title="data.R_YM_Leisure1">{{ data.R_YM_Leisure1 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍑哄簱鎵ц涓�(璇�):</div>
+          <div class="xzhi" :title="data.R_YM_Outbounding1">{{ data.R_YM_Outbounding1 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鐢宠鍏ュ簱(鍐�):</div>
+          <div class="xzhi" :title="data.W_YM_RequestIn1">{{ data.W_YM_RequestIn1 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鐢宠鍑哄簱(鍐�):</div>
+          <div class="xzhi" :title="data.W_YM_RequestOut1">{{ data.W_YM_RequestOut1 }}</div>
+        </div> 
+      </div>
+      
+      <div class="skuang">
+        <div class="zhuname">鍑哄叆搴�9002绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">鏈夎揣(璇�):</div>
+          <div class="xzhi" :title="data.R_YM_Tray2">{{ data.R_YM_Tray2 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍏ュ簱鎵ц涓�(璇�):</div>
+          <div class="xzhi" :title="data.R_YM_Inbounding2">{{ data.R_YM_Inbounding2 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鎻愬崌鏈虹┖闂�(璇�):</div>
+          <div class="xzhi" :title="data.R_YM_Leisure2">{{ data.R_YM_Leisure2 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍑哄簱鎵ц涓�(璇�):</div>
+          <div class="xzhi" :title="data.R_YM_Outbounding2">{{ data.R_YM_Outbounding2 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鐢宠鍏ュ簱(鍐�):</div>
+          <div class="xzhi" :title="data.W_YM_RequestIn2">{{ data.W_YM_RequestIn2 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鐢宠鍑哄簱(鍐�):</div>
+          <div class="xzhi" :title="data.W_YM_RequestOut2">{{ data.W_YM_RequestOut2 }}</div>
+        </div>
+      </div>
+    </div>
+    
+  </div>
+</template>
+
+<script>
+import { ref, nextTick } from "vue";
+import { useStore } from "vuex";
+import { onMounted } from "vue";
+
+export default {
+  data() {
+    return {
+      xuan: 0
+    };
+  },
+  methods: {
+  },
+  setup() {
+    const store = useStore();
+    const data = ref({});
+
+    // 1. 瀹氫箟鏅�氬瓧娈电殑鏄犲皠瑙勫垯
+    const statusMap = {
+      R_YM_Status: {
+        1: "姝e父",
+        2: "鏁呴殰",
+        3: "鎬ュ仠",
+      },
+      R_YM_AutoStatus: {
+        0: "缁翠慨",
+        1: "鎵嬪姩",
+        2: "鍗婅嚜鍔�",
+        3: "鑷姩",
+      },
+      R_YM_WorkStatus: {
+        0: "寰呮満",
+        1: "鍙栬揣涓�",
+        2: "鍙栬揣瀹屾垚",
+        4: "鏀捐揣涓�",
+        5: "鏀捐揣瀹屾垚",
+        6: "浠诲姟瀹屾垚",
+      },
+      R_YM_WorkType: {
+        0: "鏃犱綔涓氫换鍔�(0)",
+        1: "鍙栨斁璐т綔涓�(1)",
+        2: "鍙彇璐т綔涓�(2)",
+        3: "鍙斁璐т綔涓�(3)",
+        4: "绉诲姩鍒版寚瀹氫綅缃�"
+      },
+      R_YM_TrayType: {
+        "-1": "绌虹(-1)",
+        1: "灏忔墭鐩�(1)",
+        2: "涓墭鐩�(2)",
+        3: "澶ф墭鐩�(3)",
+        4: "鐗瑰ぇ鎵樼洏(4)",
+      }
+    };
+
+    // 2. 瀹氫箟闇�瑕佸叡鐢ㄦ槧灏勮鍒欑殑瀛楁鍒楄〃鍜屽搴旂殑鏄犲皠瑙勫垯
+    const booleanFields = [
+      "R_YM_Tray1", "R_YM_Inbounding1",
+      "R_YM_Leisure1", "R_YM_Outbounding1",
+      "W_YM_RequestIn1", "W_YM_RequestOut1",
+      "R_YM_Tray2", "R_YM_Inbounding2",
+      "R_YM_Leisure2", "R_YM_Outbounding2",
+      "W_YM_RequestIn2", "W_YM_RequestOut2",
+    ];
+    const booleanMap = {
+      true: "鏄�",
+      false: "鍚�"
+    };
+
+    // 澶勭悊鏁版嵁锛屽厛澶勭悊鏅�氭槧灏勶紝鍐嶆壒閲忓鐞嗗叡鐢ㄦ槧灏勭殑瀛楁
+    const processData = (rawData) => {
+      if (!rawData) return {};
+      const processed = { ...rawData };
+
+      // 澶勭悊鏅�氬瓧娈垫槧灏�
+      Object.keys(statusMap).forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          const map = statusMap[key];
+          processed[key] = map[processed[key]] || processed[key];
+        }
+      });
+
+      // 鎵归噺澶勭悊鍏辩敤鏄犲皠瑙勫垯鐨勫瓧娈�
+      booleanFields.forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          processed[key] = booleanMap[processed[key]] || processed[key];
+        }
+      });
+
+      return processed;
+    };
+
+    onMounted(() => {
+      nextTick(() => {
+        setInterval(() => {
+          const rawData = store.state.homedata;
+          data.value = processData(rawData);
+          const xian = document.getElementsByClassName("xzhi");
+          for (let i = 0; i < xian.length; i++) {
+            if (xian[i].innerHTML === "鏄�") {
+              xian[i].style.color = "yellow";
+            } else if (xian[i].innerHTML === "鍚�") {
+              xian[i].style.color = "red";
+            }
+          }
+        });
+      });
+    });
+
+    return {
+      data,
+    };
+  }
+};
+</script>
+
+<style scoped>
+.ding {
+  float: left;
+  width: 20px;
+  height: 20px;
+  margin-top: 7px;
+}
+.yan {
+  color: white;
+  float: left;
+  font-size: 25px;
+}
+.dakuang {
+  width: 250px;
+  height: 50px;
+  position: absolute;
+  top: 150px;
+  left: 200px;
+}
+#xiugai {
+  width: 100px;
+  height: 30px;
+  float: left;
+  border-radius: 5px;
+  text-align: center;
+  line-height: 30px;
+  cursor: pointer;
+  border: 1px solid white;
+  color: white;
+  background: rgba(255, 255, 255, 0.5);
+  font-size: 25px;
+  position: absolute;
+  top: 150px;
+  left: 450px;
+}
+#xiugai:hover {
+  background: #f60;
+}
+#shu1,
+#shu2 {
+  width: 200px;
+  height: 30px;
+  float: left;
+  margin-top: 0px;
+  margin-right: 0px;
+  border-radius: 5px;
+  border: 1px solid white;
+}
+#guan {
+  width: 40px;
+  height: 40px;
+  float: left;
+  font-size: 1.1cqw;
+  text-align: center;
+  line-height: 40px;
+  cursor: pointer;
+  margin-left: 560px;
+  color: white;
+  position: absolute;
+}
+#ti {
+  width: 600px;
+  height: 300px;
+  position: relative;
+  background: rgba(255, 255, 255, 1);
+  border-radius: 10px;
+  top: 230px;
+  left: 35%;
+  display: none;
+  background-image: url("../../img/1.png");
+  background-repeat: no-repeat;
+  background-size: 170%;
+  background-position: -220px 0px;
+}
+.zhuname {
+  width: 100%;
+  height: 5vh;
+  float: left;
+  text-align: center;
+  line-height: 50px;
+  font-weight: 700;
+  font-size: 1.1cqw;
+  color: white;
+}
+.xname {
+  width: 70%;
+  height: 80px;
+  float: left;
+  line-height: 7vh;
+  font-size: 1.1cqw;
+  color: white;
+}
+.xzhi {
+  width: 30%;
+  height: 7vh;
+  float: left;
+  line-height: 50px;
+  font-size: 1.1cqw;
+  color: rgb(242, 242, 50);
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.zhankuang {
+  width: 45%;
+  height: 3vh;
+  margin-top: 10px;
+  margin-left: 5%;
+  float: left;
+}
+#title {
+  float: left;
+  width: 95%;
+  height: 88vh;
+  margin-top: 40px;
+  margin-left: 3%;
+  background-image: url("../../img/1.png");
+  background-repeat: no-repeat;
+  background-size: 100%;
+  container-type: inline-size;
+}
+#bkuang {
+  width: 100%;
+  height: 55vh;
+  float: left;
+}
+.skuang {
+  width: 31%;
+  height: 55vh;
+  float: left;
+  border-top: none;
+  border-left: none;
+  border-bottom: none;
+  background: rgba(255, 255, 255, 0.2);
+  margin-left: 1.7%;
+  border-radius: 10px;
+}
+</style>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/PpWarehouse.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/PpWarehouse.vue"
new file mode 100644
index 0000000..706d1b3
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/PpWarehouse.vue"
@@ -0,0 +1,503 @@
+<template>
+  <div id="title">
+    <div id="bkuang" style="border-top: none">
+      <div class="skuang">
+        <div class="zhuname">PP浠撳爢鍨涙満</div>
+        <div class="zhankuang">
+          <div class="xname">鍫嗗灈鏈虹姸鎬�:</div>
+          <div class="xzhi" :title="data.R_PP_Status">{{ data.R_PP_Status }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍫嗗灈鏈烘墜鑷姩鐘舵��:</div>
+          <div class="xzhi" :title="data.R_PP_AutoStatus">{{ data.R_PP_AutoStatus }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">姝e湪鎵ц鐨勪换鍔″彿:</div>
+          <div class="xzhi" :title="data.R_PP_TaskNum">{{ data.R_PP_TaskNum }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍫嗗灈鏈哄伐浣滅姸鎬�:</div>
+          <div class="xzhi" :title="data.R_PP_WorkStatus">{{ data.R_PP_WorkStatus }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">浣滀笟绫诲瀷:</div>
+          <div class="xzhi" :title="data.R_PP_WorkType">{{ data.R_PP_WorkType }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鎵樼洏绫诲瀷:</div>
+          <div class="xzhi" :title="data.R_PP_TrayType">{{ data.R_PP_TrayType }}</div>
+        </div>
+      </div>
+      <div class="skuang">
+        <div class="zhuname">鍏ュ簱2004绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">璇诲彇绠变綋鐮�(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Boxcode">{{ data.R_PP_Boxcode }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鎻℃墜淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_HandShake4">{{ data.R_PP_HandShake4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鑱旀満(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Online4">{{ data.R_PP_Online4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁绌洪棽(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Free4">{{ data.R_PP_Free4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏈夎揣(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Goods4">{{ data.R_PP_Goods4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏁呴殰(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Alarm4">{{ data.R_PP_Alarm4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_STB4">{{ data.R_PP_STB4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_ACK4">{{ data.R_PP_ACK4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_PP_STB4">{{ data.W_PP_STB4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_PP_ACK4">{{ data.W_PP_ACK4 }}</div>
+        </div>
+
+        <div class="zhuname">鍑哄簱2005绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">鎻℃墜淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_HandShake5">{{ data.R_PP_HandShake5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鑱旀満(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Online5">{{ data.R_PP_Online5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁绌洪棽(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Free5">{{ data.R_PP_Free5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏈夎揣(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Goods5">{{ data.R_PP_Goods5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏁呴殰(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Alarm5">{{ data.R_PP_Alarm5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_STB5">{{ data.R_PP_STB5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_ACK5">{{ data.R_PP_ACK5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_PP_STB5">{{ data.W_PP_STB5 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_PP_ACK5">{{ data.W_PP_ACK5 }}</div>
+        </div>
+      </div>
+      
+      <div class="skuang">
+        <div class="zhuname">鍑哄簱2016绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">鎻℃墜淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_HandShake6">{{ data.R_PP_HandShake6 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鑱旀満(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Online6">{{ data.R_PP_Online6 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁绌洪棽(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Free6">{{ data.R_PP_Free6 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏈夎揣(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Goods6">{{ data.R_PP_Goods6 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏁呴殰(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Alarm6">{{ data.R_PP_Alarm6 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_STB6">{{ data.R_PP_STB6 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_ACK6">{{ data.R_PP_ACK6 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_PP_STB6">{{ data.W_PP_STB6 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_PP_ACK6">{{ data.W_PP_ACK6 }}</div>
+        </div>
+        <div class="zhuname">鍑哄簱2017绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">鎻℃墜淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_HandShake7">{{ data.R_PP_HandShake7 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鑱旀満(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Online7">{{ data.R_PP_Online7 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁绌洪棽(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Free7">{{ data.R_PP_Free7 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏈夎揣(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Goods7">{{ data.R_PP_Goods7 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鏁呴殰(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_Alarm7">{{ data.R_PP_Alarm7 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_STB7">{{ data.R_PP_STB7 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(璇�):</div>
+          <div class="xzhi" :title="data.R_PP_ACK7">{{ data.R_PP_ACK7 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">璇锋眰淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_PP_STB7">{{ data.W_PP_STB7 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍝嶅簲淇″彿(鍐�):</div>
+          <div class="xzhi" :title="data.W_PP_ACK7">{{ data.W_PP_ACK7 }}</div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { ref, nextTick } from "vue";
+import { useStore } from "vuex";
+import { onMounted } from "vue";
+
+export default {
+  data() {
+    return {
+      xuan: 0
+    };
+  },
+  methods: {
+  },
+  setup() {
+    const store = useStore();
+    const data = ref({});
+
+    // 1. 瀹氫箟鏅�氬瓧娈电殑鏄犲皠瑙勫垯
+    const statusMap = {
+      R_PP_Status: {
+        1: "姝e父",
+        2: "鏁呴殰",
+        3: "鎬ュ仠",
+      },
+      R_PP_AutoStatus: {
+        0: "缁翠慨",
+        1: "鎵嬪姩",
+        2: "鍗婅嚜鍔�",
+        3: "鑷姩",
+      },
+      R_PP_WorkStatus: {
+        0: "寰呮満",
+        1: "鍙栬揣涓�",
+        2: "鍙栬揣瀹屾垚",
+        4: "鏀捐揣涓�",
+        5: "鏀捐揣瀹屾垚",
+        6: "浠诲姟瀹屾垚",
+      },
+      R_PP_WorkType: {
+        0: "鏃犱綔涓氫换鍔�(0)",
+        1: "鍙栨斁璐т綔涓�(1)",
+        2: "鍙彇璐т綔涓�(2)",
+        3: "鍙斁璐т綔涓�(3)",
+        4: "绉诲姩鍒版寚瀹氫綅缃�"
+      },
+      R_PP_TrayType: {
+        "-1": "绌虹(-1)",
+        1: "灏忔墭鐩�(1)",
+        2: "涓墭鐩�(2)",
+        3: "澶ф墭鐩�(3)",
+        4: "鐗瑰ぇ鎵樼洏(4)",
+      }
+    };
+    const onlines = [
+        "R_PP_Online6","R_PP_Online4",
+        "R_PP_Online5","R_PP_Online7"
+    ]
+    const online = {
+      true: "鑱旀満",
+      false: "鑴辨満"
+    };
+    const alarms = [
+        "R_PP_Alarm6","R_PP_Alarm4",
+        "R_PP_Alarm5","R_PP_Alarm7"
+    ]
+    const alarm = {
+      true: "鏁呴殰",
+      false: "姝e父"
+    };
+    const frees = [
+        "R_PP_Free6","R_PP_Free4",
+        "R_PP_Free5","R_PP_Free7"
+    ]
+    const free = {
+      true: "绌洪棽",
+      false: "绻佸繖"
+    };
+    const goods = [
+        "R_PP_Goods6", "R_PP_Goods4",
+        "R_PP_Goods5","R_PP_Goods7"
+    ]
+    const good = {
+      true: "鏈夎揣",
+      false: "鏃犺揣"
+    };
+
+    // 2. 瀹氫箟闇�瑕佸叡鐢ㄦ槧灏勮鍒欑殑瀛楁鍒楄〃鍜屽搴旂殑鏄犲皠瑙勫垯
+    const booleanFields = [
+      "R_PP_HandShake4", "R_PP_STB4",
+      "R_PP_ACK4", "W_PP_STB4",
+      "W_PP_ACK4", 
+      "R_PP_HandShake5", "R_PP_STB5",
+      "R_PP_ACK5", "W_PP_STB5",
+      "W_PP_ACK5",
+      "R_PP_HandShake6", "R_PP_STB6",
+      "R_PP_ACK6", "W_PP_STB6",
+      "W_PP_ACK6",
+      "R_PP_HandShake7", "R_PP_STB7",
+      "R_PP_ACK7", "W_PP_STB7",
+      "W_PP_ACK7",
+    ];
+    const booleanMap = {
+      true: "鏄�",
+      false: "鍚�"
+    };
+
+    // 澶勭悊鏁版嵁锛屽厛澶勭悊鏅�氭槧灏勶紝鍐嶆壒閲忓鐞嗗叡鐢ㄦ槧灏勭殑瀛楁
+    const processData = (rawData) => {
+      if (!rawData) return {};
+      const processed = { ...rawData };
+
+      // 澶勭悊鏅�氬瓧娈垫槧灏�
+      Object.keys(statusMap).forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          const map = statusMap[key];
+          processed[key] = map[processed[key]] || processed[key];
+        }
+      });
+
+      // 鎵归噺澶勭悊鍏辩敤鏄犲皠瑙勫垯鐨勫瓧娈�
+      booleanFields.forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          processed[key] = booleanMap[processed[key]] || processed[key];
+        }
+      });
+      onlines.forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          processed[key] = online[processed[key]] || processed[key];
+        }
+      });
+      alarms.forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          processed[key] = alarm[processed[key]] || processed[key];
+        }
+      });
+      frees.forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          processed[key] = free[processed[key]] || processed[key];
+        }
+      });
+      goods.forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          processed[key] = good[processed[key]] || processed[key];
+        }
+      });
+
+      return processed;
+    };
+
+    onMounted(() => {
+      nextTick(() => {
+        setInterval(() => {
+          const rawData = store.state.homedata;
+          data.value = processData(rawData);
+          const xian = document.getElementsByClassName("xzhi");
+          for (let i = 0; i < xian.length; i++) {
+            if (xian[i].innerHTML === "鏄�") {
+              xian[i].style.color = "yellow";
+            } else if (xian[i].innerHTML === "鍚�") {
+              xian[i].style.color = "red";
+            }
+          }
+        });
+      });
+    });
+
+    return {
+      data,
+    };
+  }
+};
+</script>
+
+<style scoped>
+.ding {
+  float: left;
+  width: 20px;
+  height: 20px;
+  margin-top: 7px;
+}
+.yan {
+  color: white;
+  float: left;
+  font-size: 25px;
+}
+.dakuang {
+  width: 250px;
+  height: 50px;
+  position: absolute;
+  top: 150px;
+  left: 200px;
+}
+#xiugai {
+  width: 100px;
+  height: 30px;
+  float: left;
+  border-radius: 5px;
+  text-align: center;
+  line-height: 30px;
+  cursor: pointer;
+  border: 1px solid white;
+  color: white;
+  background: rgba(255, 255, 255, 0.5);
+  font-size: 25px;
+  position: absolute;
+  top: 150px;
+  left: 450px;
+}
+#xiugai:hover {
+  background: #f60;
+}
+#shu1,
+#shu2 {
+  width: 200px;
+  height: 30px;
+  float: left;
+  margin-top: 0px;
+  margin-right: 0px;
+  border-radius: 5px;
+  border: 1px solid white;
+}
+#guan {
+  width: 40px;
+  height: 40px;
+  float: left;
+  font-size: 1.1cqw;
+  text-align: center;
+  line-height: 40px;
+  cursor: pointer;
+  margin-left: 560px;
+  color: white;
+  position: absolute;
+}
+#ti {
+  width: 600px;
+  height: 300px;
+  position: relative;
+  background: rgba(255, 255, 255, 1);
+  border-radius: 10px;
+  top: 230px;
+  left: 35%;
+  display: none;
+  background-image: url("../../img/1.png");
+  background-repeat: no-repeat;
+  background-size: 170%;
+  background-position: -220px 0px;
+}
+.zhuname {
+  width: 100%;
+  height: 5vh;
+  float: left;
+  text-align: center;
+  line-height: 50px;
+  font-weight: 700;
+  font-size: 1.1cqw;
+  color: white;
+}
+.xname {
+  width: 70%;
+  height: 80px;
+  float: left;
+  line-height: 7vh;
+  font-size: 1.1cqw;
+  color: white;
+}
+.xzhi {
+  width: 30%;
+  height: 7vh;
+  float: left;
+  line-height: 50px;
+  font-size: 1.1cqw;
+  color: rgb(242, 242, 50);
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.zhankuang {
+  width: 45%;
+  height: 3vh;
+  margin-top: 10px;
+  margin-left: 5%;
+  float: left;
+}
+#title {
+  float: left;
+  width: 95%;
+  height: 88vh;
+  margin-top: 40px;
+  margin-left: 3%;
+  background-image: url("../../img/1.png");
+  background-repeat: no-repeat;
+  background-size: 100%;
+  container-type: inline-size;
+}
+#bkuang {
+  width: 100%;
+  height: 55vh;
+  float: left;
+}
+.skuang {
+  width: 31%;
+  height: 55vh;
+  float: left;
+  border-top: none;
+  border-left: none;
+  border-bottom: none;
+  background: rgba(255, 255, 255, 0.2);
+  margin-left: 1.7%;
+  border-radius: 10px;
+}
+</style>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/SolderMaskWarehouse.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/SolderMaskWarehouse.vue"
new file mode 100644
index 0000000..f84be25
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/SolderMaskWarehouse.vue"
@@ -0,0 +1,430 @@
+<template>
+  <div id="title">
+    <div id="bkuang" style="border-top: none">
+      <div class="skuang">
+        <div class="zhuname">闃荤剨浠撳爢鍨涙満</div>
+        <div class="zhankuang">
+          <div class="xname">鍫嗗灈鏈虹姸鎬�:</div>
+          <div class="xzhi" :title="data.R_ZH_Status">{{ data.R_ZH_Status }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍫嗗灈鏈烘墜鑷姩鐘舵��:</div>
+          <div class="xzhi" :title="data.R_ZH_AutoStatus">{{ data.R_ZH_AutoStatus }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">姝e湪鎵ц鐨勪换鍔″彿:</div>
+          <div class="xzhi" :title="data.R_ZH_TaskNum">{{ data.R_ZH_TaskNum }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍫嗗灈鏈哄伐浣滅姸鎬�:</div>
+          <div class="xzhi" :title="data.R_ZH_WorkStatus">{{ data.R_ZH_WorkStatus }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">浣滀笟绫诲瀷:</div>
+          <div class="xzhi" :title="data.R_ZH_WorkType">{{ data.R_ZH_WorkType }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鎵樼洏绫诲瀷:</div>
+          <div class="xzhi" :title="data.R_ZH_TrayType">{{ data.R_ZH_TrayType }}</div>
+        </div>
+      </div>
+      <div class="skuang">
+        <div class="zhuname">鍏ュ簱301绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鍏佽鏀捐揣(璇�):</div>
+          <div class="xzhi" :title="data.R_ZH_IsCanPut1">{{ data.R_ZH_IsCanPut1 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鍏佽鍙栬揣(璇�):</div>
+          <div class="xzhi" :title="data.R_ZH_IsCanTake1">{{ data.R_ZH_IsCanTake1 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍙栬揣鎵樼洏绫诲瀷(璇�):</div>
+          <div class="xzhi" :title="data.R_ZH_TakePalletType1">{{ data.R_ZH_TakePalletType1 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣鎵樼洏绫诲瀷(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_PutPalletType1">{{ data.W_ZH_PutPalletType1 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣璇锋眰(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_PutRequest1">{{ data.W_ZH_PutRequest1 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣瀹屾垚(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_PutFinish1">{{ data.W_ZH_PutFinish1 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍙栬揣璇锋眰(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_TakeRequest1">{{ data.W_ZH_TakeRequest1 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍙栬揣瀹屾垚(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_TakeFinish1">{{ data.W_ZH_TakeFinish1 }}</div>
+        </div>
+        <div class="zhuname">鍏ュ簱302绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鍏佽鏀捐揣(璇�):</div>
+          <div class="xzhi" :title="data.R_ZH_IsCanPut2">{{ data.R_ZH_IsCanPut2 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鍏佽鍙栬揣(璇�):</div>
+          <div class="xzhi" :title="data.R_ZH_IsCanTake2">{{ data.R_ZH_IsCanTake2 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍙栬揣鎵樼洏绫诲瀷(璇�):</div>
+          <div class="xzhi" :title="data.R_ZH_TakePalletType2">{{ data.R_ZH_TakePalletType2 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣鎵樼洏绫诲瀷(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_PutPalletType2">{{ data.W_ZH_PutPalletType2 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣璇锋眰(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_PutRequest2">{{ data.W_ZH_PutRequest2 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣瀹屾垚(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_PutFinish2">{{ data.W_ZH_PutFinish2 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍙栬揣璇锋眰(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_TakeRequest2">{{ data.W_ZH_TakeRequest2 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍙栬揣瀹屾垚(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_TakeFinish2">{{ data.W_ZH_TakeFinish2 }}</div>
+        </div>
+      </div>
+      
+      <div class="skuang">
+        <div class="zhuname">鍑哄簱303绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鍏佽鏀捐揣(璇�):</div>
+          <div class="xzhi" :title="data.R_ZH_IsCanPut3">{{ data.R_ZH_IsCanPut3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鍏佽鍙栬揣(璇�):</div>
+          <div class="xzhi" :title="data.R_ZH_IsCanTake3">{{ data.R_ZH_IsCanTake3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍙栬揣鎵樼洏绫诲瀷(璇�):</div>
+          <div class="xzhi" :title="data.R_ZH_TakePalletType3">{{ data.R_ZH_TakePalletType3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣鎵樼洏绫诲瀷(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_PutPalletType3">{{ data.W_ZH_PutPalletType3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣璇锋眰(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_PutRequest3">{{ data.W_ZH_PutRequest3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣瀹屾垚(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_PutFinish3">{{ data.W_ZH_PutFinish3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍙栬揣璇锋眰(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_TakeRequest3">{{ data.W_ZH_TakeRequest3 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍙栬揣瀹屾垚(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_TakeFinish3">{{ data.W_ZH_TakeFinish3 }}</div>
+        </div>
+        <div class="zhuname">鍑哄簱304绔欏彴</div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鍏佽鏀捐揣(璇�):</div>
+          <div class="xzhi" :title="data.R_ZH_IsCanPut4">{{ data.R_ZH_IsCanPut4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏄惁鍏佽鍙栬揣(璇�):</div>
+          <div class="xzhi" :title="data.R_ZH_IsCanTake4">{{ data.R_ZH_IsCanTake4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍙栬揣鎵樼洏绫诲瀷(璇�):</div>
+          <div class="xzhi" :title="data.R_ZH_TakePalletType4">{{ data.R_ZH_TakePalletType4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣鎵樼洏绫诲瀷(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_PutPalletType4">{{ data.W_ZH_PutPalletType4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣璇锋眰(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_PutRequest4">{{ data.W_ZH_PutRequest4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鏀捐揣瀹屾垚(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_PutFinish4">{{ data.W_ZH_PutFinish4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍙栬揣璇锋眰(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_TakeRequest4">{{ data.W_ZH_TakeRequest4 }}</div>
+        </div>
+        <div class="zhankuang">
+          <div class="xname">鍙栬揣瀹屾垚(鍐�):</div>
+          <div class="xzhi" :title="data.W_ZH_TakeFinish4">{{ data.W_ZH_TakeFinish4 }}</div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { ref, nextTick } from "vue";
+import { useStore } from "vuex";
+import { onMounted } from "vue";
+
+export default {
+  data() {
+    return {
+      xuan: 0
+    };
+  },
+  methods: {
+  },
+  setup() {
+    const store = useStore();
+    const data = ref({});
+
+    // 1. 瀹氫箟鏅�氬瓧娈电殑鏄犲皠瑙勫垯
+    const statusMap = {
+      R_ZH_Status: {
+        1: "姝e父",
+        2: "鏁呴殰",
+        3: "鎬ュ仠",
+      },
+      R_ZH_AutoStatus: {
+        0: "缁翠慨",
+        1: "鎵嬪姩",
+        2: "鍗婅嚜鍔�",
+        3: "鑷姩",
+      },
+      R_ZH_WorkStatus: {
+        0: "寰呮満",
+        1: "鍙栬揣涓�",
+        2: "鍙栬揣瀹屾垚",
+        4: "鏀捐揣涓�",
+        5: "鏀捐揣瀹屾垚",
+        6: "浠诲姟瀹屾垚",
+      },
+      R_ZH_WorkType: {
+        0: "鏃犱綔涓氫换鍔�(0)",
+        1: "鍙栨斁璐т綔涓�(1)",
+        2: "鍙彇璐т綔涓�(2)",
+        3: "鍙斁璐т綔涓�(3)",
+        4: "绉诲姩鍒版寚瀹氫綅缃�"
+      },
+      R_ZH_TrayType: {
+        "-1": "绌虹(-1)",
+        1: "灏忔墭鐩�(1)",
+        2: "涓墭鐩�(2)",
+        3: "澶ф墭鐩�(3)",
+        4: "鐗瑰ぇ鎵樼洏(4)",
+      }
+    };
+
+    // 2. 瀹氫箟闇�瑕佸叡鐢ㄦ槧灏勮鍒欑殑瀛楁鍒楄〃鍜屽搴旂殑鏄犲皠瑙勫垯
+    const booleanFields = [
+      "R_ZH_IsCanPut1", "R_ZH_IsCanTake1",
+      "W_ZH_PutRequest1", "W_ZH_PutFinish1",
+      "W_ZH_TakeRequest1", "W_ZH_TakeFinish1",
+      "R_ZH_IsCanPut2", "R_ZH_IsCanTake2",
+      "W_ZH_PutRequest2", "W_ZH_PutFinish2",
+      "W_ZH_TakeRequest2", "W_ZH_TakeFinish2",
+      "R_ZH_IsCanPut3", "R_ZH_IsCanTake3",
+      "W_ZH_PutRequest3", "W_ZH_PutFinish3",
+      "W_ZH_TakeRequest3", "W_ZH_TakeFinish3",
+      "R_ZH_IsCanPut4", "R_ZH_IsCanTake4",
+      "W_ZH_PutRequest4", "W_ZH_PutFinish4",
+      "W_ZH_TakeRequest4", "W_ZH_TakeFinish4",
+    ];
+    const booleanMap = {
+      true: "鏄�",
+      false: "鍚�"
+    };
+
+    // 澶勭悊鏁版嵁锛屽厛澶勭悊鏅�氭槧灏勶紝鍐嶆壒閲忓鐞嗗叡鐢ㄦ槧灏勭殑瀛楁
+    const processData = (rawData) => {
+      if (!rawData) return {};
+      const processed = { ...rawData };
+
+      // 澶勭悊鏅�氬瓧娈垫槧灏�
+      Object.keys(statusMap).forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          const map = statusMap[key];
+          processed[key] = map[processed[key]] || processed[key];
+        }
+      });
+
+      // 鎵归噺澶勭悊鍏辩敤鏄犲皠瑙勫垯鐨勫瓧娈�
+      booleanFields.forEach(key => {
+        if (processed.hasOwnProperty(key)) {
+          processed[key] = booleanMap[processed[key]] || processed[key];
+        }
+      });
+
+      return processed;
+    };
+
+    onMounted(() => {
+      nextTick(() => {
+        setInterval(() => {
+          const rawData = store.state.homedata;
+          data.value = processData(rawData);
+          const xian = document.getElementsByClassName("xzhi");
+          for (let i = 0; i < xian.length; i++) {
+            if (xian[i].innerHTML === "鏄�") {
+              xian[i].style.color = "yellow";
+            } else if (xian[i].innerHTML === "鍚�") {
+              xian[i].style.color = "red";
+            }
+          }
+        });
+      });
+    });
+
+    return {
+      data,
+    };
+  }
+};
+</script>
+
+<style scoped>
+.ding {
+  float: left;
+  width: 20px;
+  height: 20px;
+  margin-top: 7px;
+}
+.yan {
+  color: white;
+  float: left;
+  font-size: 25px;
+}
+.dakuang {
+  width: 250px;
+  height: 50px;
+  position: absolute;
+  top: 150px;
+  left: 200px;
+}
+#xiugai {
+  width: 100px;
+  height: 30px;
+  float: left;
+  border-radius: 5px;
+  text-align: center;
+  line-height: 30px;
+  cursor: pointer;
+  border: 1px solid white;
+  color: white;
+  background: rgba(255, 255, 255, 0.5);
+  font-size: 25px;
+  position: absolute;
+  top: 150px;
+  left: 450px;
+}
+#xiugai:hover {
+  background: #f60;
+}
+#shu1,
+#shu2 {
+  width: 200px;
+  height: 30px;
+  float: left;
+  margin-top: 0px;
+  margin-right: 0px;
+  border-radius: 5px;
+  border: 1px solid white;
+}
+#guan {
+  width: 40px;
+  height: 40px;
+  float: left;
+  font-size: 1.1cqw;
+  text-align: center;
+  line-height: 40px;
+  cursor: pointer;
+  margin-left: 560px;
+  color: white;
+  position: absolute;
+}
+#ti {
+  width: 600px;
+  height: 300px;
+  position: relative;
+  background: rgba(255, 255, 255, 1);
+  border-radius: 10px;
+  top: 230px;
+  left: 35%;
+  display: none;
+  background-image: url("../../img/1.png");
+  background-repeat: no-repeat;
+  background-size: 170%;
+  background-position: -220px 0px;
+}
+.zhuname {
+  width: 100%;
+  height: 5vh;
+  float: left;
+  text-align: center;
+  line-height: 50px;
+  font-weight: 700;
+  font-size: 1.1cqw;
+  color: white;
+}
+.xname {
+  width: 70%;
+  height: 80px;
+  float: left;
+  line-height: 7vh;
+  font-size: 1.1cqw;
+  color: white;
+}
+.xzhi {
+  width: 30%;
+  height: 7vh;
+  float: left;
+  line-height: 50px;
+  font-size: 1.1cqw;
+  color: rgb(242, 242, 50);
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.zhankuang {
+  width: 45%;
+  height: 3vh;
+  margin-top: 10px;
+  margin-left: 5%;
+  float: left;
+}
+#title {
+  float: left;
+  width: 95%;
+  height: 88vh;
+  margin-top: 40px;
+  margin-left: 3%;
+  background-image: url("../../img/1.png");
+  background-repeat: no-repeat;
+  background-size: 100%;
+  container-type: inline-size;
+}
+#bkuang {
+  width: 100%;
+  height: 55vh;
+  float: left;
+}
+.skuang {
+  width: 31%;
+  height: 55vh;
+  float: left;
+  border-top: none;
+  border-left: none;
+  border-bottom: none;
+  background: rgba(255, 255, 255, 0.2);
+  margin-left: 1.7%;
+  border-radius: 10px;
+}
+</style>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/TestFrameWarehouse.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/TestFrameWarehouse.vue"
new file mode 100644
index 0000000..e6514a3
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/TestFrameWarehouse.vue"
@@ -0,0 +1,45 @@
+<template>
+  <div class="message-container">
+    <div class="item" v-for="(item, index) in list" :key="index">
+      <div class="title">{{ item.title }}({{ item.date }})</div>
+      <div class="content">{{ item.message }}</div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    list: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  created() {
+    if (!this.list.length) {
+      this.list.push({
+        title: '娑堟伅werwer娴嬭瘯鏍囬',
+        message: '娑堟伅娴嬭瘯鍐呭娑堟伅娴嬭瘯鍐呭娑堟伅娴嬭瘯鍐呭娑堟伅娴嬭瘯鍐呭',
+        date: '2022-05-02 03:10'
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="less">
+.message-container {
+  .title {
+    padding-bottom: 10px;
+  }
+  .item {
+    border-bottom: 1px solid #eee;
+    padding: 10px 20px;
+  }
+  .content {
+    color: #7e7e7e;
+    font-size: 13px;
+  }
+}
+</style>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/QuartzJob/DeviceProtocolController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/QuartzJob/DeviceProtocolController.cs"
index 68078c5..0f1ddca 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/QuartzJob/DeviceProtocolController.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/QuartzJob/DeviceProtocolController.cs"
@@ -5,6 +5,7 @@
 using WIDESEAWCS_Core.BaseController;
 using WIDESEAWCS_QuartzJob.Models;
 using WIDESEAWCS_QuartzJob.Service;
+using WIDESEAWCS_Tasks;
 
 namespace WIDESEAWCS_Server.Controllers.QuartzJob
 {
@@ -18,6 +19,7 @@
         [HttpPost, Route("GetImportData"), AllowAnonymous]
         public WebResponseContent GetImportData(List<IFormFile> fileInput)
         {
+            
             return Service.GetImportData(fileInput);
         }
     }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs"
index 5d8bc5a..958012c 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs"
@@ -33,6 +33,7 @@
     builder.RegisterModule<AutofacPropertityModuleReg>();//
 }).ConfigureAppConfiguration((hostingContext, config) =>
 {
+
     hostingContext.Configuration.ConfigureApplication();
     config.Sources.Clear();
     config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false);
@@ -54,6 +55,9 @@
 builder.Services.AddHostedService<QuartzJobDataTableHostedService>();
 
 //builder.Services.AddWebSocketSetup();
+builder.Services.AddWebSocketSetup();
+
+builder.Services.AddHostedService<WarehouseHostedService>();
 
 builder.Services.AddAutoMapperSetup();
 
@@ -67,6 +71,7 @@
 
 builder.Services.AddHttpContextSetup();
 
+
 builder.Services.AddHostedService<QuartzJobHostedService>();
 
 builder.Services.AddMvc(options =>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/ConveyorLineJob_PP.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/ConveyorLineJob_PP.cs"
index 1ab72e2..348a55c 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/ConveyorLineJob_PP.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/ConveyorLineJob_PP.cs"
@@ -225,6 +225,27 @@
                     {
                         WriteInfo(device.DeviceName, $"鏈壘鍒拌澶囧瓙缂栧彿{item.StationCode}鐨勫崗璁俊鎭�");
                     }
+                    R_ConveyorLineInfo conveyorLineInfoRead1 = device.Communicator.ReadCustomer<R_ConveyorLineInfo>(deviceProRead.DeviceProAddress);
+                    W_ConveyorLineInfo conveyorLineInfoWrite1 = device.Communicator.ReadCustomer<W_ConveyorLineInfo>(deviceProWrite.DeviceProAddress);
+                    R_ConveyorLineStatus conveyorLineStatus1 = conveyorLineInfoRead1.Status.ByteToBoolObject<R_ConveyorLineStatus>();
+                    ConveyorLineSignal conveyorLineSignalRead1 = conveyorLineInfoRead1.Signal.ByteToBoolObject<ConveyorLineSignal>();
+                    ConveyorLineSignal conveyorLineSignalWrite1 = conveyorLineInfoWrite1.Signal.ByteToBoolObject<ConveyorLineSignal>();
+                    if (item.StationCode == "2004")
+                    {
+                        if (conveyorLineSignalRead1.STB && conveyorLineStatus1.Online && conveyorLineStatus1.Goods && !conveyorLineStatus1.Alarm && !conveyorLineSignalWrite1.ACK)
+                        {
+                            StackerCraneJob_PP.pPReadData.R_PP_Boxcode = device.Communicator.Read<string>("DB900.578.0");
+                        }
+                        StackerCraneJob_PP.pPReadData.R_PP_HandShake4 = conveyorLineStatus1.HandShake;
+                        StackerCraneJob_PP.pPReadData.R_PP_Online4 = conveyorLineStatus1.Online;
+                        StackerCraneJob_PP.pPReadData.R_PP_Free4 = conveyorLineStatus1.Free;
+                        StackerCraneJob_PP.pPReadData.R_PP_Goods4 = conveyorLineStatus1.Goods;
+                        StackerCraneJob_PP.pPReadData.R_PP_Alarm4 = conveyorLineStatus1.Alarm;
+                        StackerCraneJob_PP.pPReadData.R_PP_STB4 = conveyorLineSignalRead1.STB;
+                        StackerCraneJob_PP.pPReadData.R_PP_ACK4 = conveyorLineSignalRead1.ACK;
+                        StackerCraneJob_PP.pPReadData.W_PP_STB4 = conveyorLineSignalWrite1.STB;
+                        StackerCraneJob_PP.pPReadData.W_PP_ACK4 = conveyorLineSignalWrite1.ACK;
+                    }
                 }
             }
 
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/PPReadData.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/PPReadData.cs"
new file mode 100644
index 0000000..def38fa
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/PPReadData.cs"
@@ -0,0 +1,234 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEAWCS_Tasks.PP浠�
+{
+    public class PPReadData
+    {
+        /// <summary>
+        /// 鍫嗗灈鏈虹姸鎬�
+        /// </summary>
+        public short R_PP_Status;
+
+        /// <summary>
+        /// 鍫嗗灈鏈烘墜鑷姩鐘舵��
+        /// </summary>
+        public short R_PP_AutoStatus;
+
+        /// <summary>
+        /// 褰撳墠姝e湪鎵ц鐨勪换鍔″彿
+        /// </summary>
+        public int R_PP_TaskNum;
+
+        /// <summary>
+        /// 鍫嗗灈鏈哄伐浣滅姸鎬�
+        /// </summary>
+        public short R_PP_WorkStatus;
+
+        /// <summary>
+        /// 浣滀笟绫诲瀷
+        /// </summary>
+        public short R_PP_WorkType;
+
+        /// <summary>
+        /// 鎵樼洏绫诲瀷
+        /// </summary>
+        public short R_PP_TrayType;
+
+
+        ///绔欏彴
+
+        ///<summary>
+        /// 璇诲彇鏉$爜
+        /// </summary>
+        public string R_PP_Boxcode;
+        /// <summary>
+        /// 鎻℃墜淇″彿
+        /// </summary>
+        public bool R_PP_HandShake4;
+
+        /// <summary>
+        /// 1鑱旀満 0鑴辨満
+        /// </summary>
+        public bool R_PP_Online4;
+
+        /// <summary>
+        /// 1绌洪棽 0绻佸繖
+        /// </summary>
+        public bool R_PP_Free4;
+
+        /// <summary>
+        /// 1鏈夎揣 0鏃犺揣
+        /// </summary>
+        public bool R_PP_Goods4;
+
+        /// <summary>
+        /// 1鏁呴殰 0姝e父
+        /// </summary>
+        public bool R_PP_Alarm4;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(璇�)
+        /// </summary>
+        public bool R_PP_STB4;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(璇�)
+        /// </summary>
+        public bool R_PP_ACK4;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(鍐�)
+        /// </summary>
+        public bool W_PP_STB4;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(鍐�)
+        /// </summary>
+        public bool W_PP_ACK4;
+
+
+        
+
+
+        /// <summary>
+        /// 鎻℃墜淇″彿
+        /// </summary>
+        public bool R_PP_HandShake5;
+
+        /// <summary>
+        /// 1鑱旀満 0鑴辨満
+        /// </summary>
+        public bool R_PP_Online5;
+
+        /// <summary>
+        /// 1绌洪棽 0绻佸繖
+        /// </summary>
+        public bool R_PP_Free5;
+
+        /// <summary>
+        /// 1鏈夎揣 0鏃犺揣
+        /// </summary>
+        public bool R_PP_Goods5;
+
+        /// <summary>
+        /// 1鏁呴殰 0姝e父
+        /// </summary>
+        public bool R_PP_Alarm5;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(璇�)
+        /// </summary>
+        public bool R_PP_STB5;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(璇�)
+        /// </summary>
+        public bool R_PP_ACK5;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(鍐�)
+        /// </summary>
+        public bool W_PP_STB5;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(鍐�)
+        /// </summary>
+        public bool W_PP_ACK5;
+
+
+        /// <summary>
+        /// 鎻℃墜淇″彿
+        /// </summary>
+        public bool R_PP_HandShake6;
+
+        /// <summary>
+        /// 1鑱旀満 0鑴辨満
+        /// </summary>
+        public bool R_PP_Online6;
+
+        /// <summary>
+        /// 1绌洪棽 0绻佸繖
+        /// </summary>
+        public bool R_PP_Free6;
+
+        /// <summary>
+        /// 1鏈夎揣 0鏃犺揣
+        /// </summary>
+        public bool R_PP_Goods6;
+
+        /// <summary>
+        /// 1鏁呴殰 0姝e父
+        /// </summary>
+        public bool R_PP_Alarm6;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(璇�)
+        /// </summary>
+        public bool R_PP_STB6;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(璇�)
+        /// </summary>
+        public bool R_PP_ACK6;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(鍐�)
+        /// </summary>
+        public bool W_PP_STB6;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(鍐�)
+        /// </summary>
+        public bool W_PP_ACK6;
+
+
+        /// <summary>
+        /// 鎻℃墜淇″彿
+        /// </summary>
+        public bool R_PP_HandShake7;
+
+        /// <summary>
+        /// 1鑱旀満 0鑴辨満
+        /// </summary>
+        public bool R_PP_Online7;
+
+        /// <summary>
+        /// 1绌洪棽 0绻佸繖
+        /// </summary>
+        public bool R_PP_Free7;
+
+        /// <summary>
+        /// 1鏈夎揣 0鏃犺揣
+        /// </summary>
+        public bool R_PP_Goods7;
+
+        /// <summary>
+        /// 1鏁呴殰 0姝e父
+        /// </summary>
+        public bool R_PP_Alarm7;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(璇�)
+        /// </summary>
+        public bool R_PP_STB7;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(璇�)
+        /// </summary>
+        public bool R_PP_ACK7;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(鍐�)
+        /// </summary>
+        public bool W_PP_STB7;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(鍐�)
+        /// </summary>
+        public bool W_PP_ACK7;
+    }
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/StackerCraneJob_PP.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/StackerCraneJob_PP.cs"
index 3defe0a..061d640 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/StackerCraneJob_PP.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/StackerCraneJob_PP.cs"
@@ -28,6 +28,9 @@
 using WIDESEAWCS_DTO.TaskInfo;
 using WIDESEAWCS_Core.Caches;
 using AutoMapper;
+using WIDESEAWCS_Tasks.PP浠�;
+using HslCommunication.WebSocket;
+using WIDESEAWCS_Tasks.骞茶啘浠�;
 
 namespace WIDESEAWCS_Tasks
 {
@@ -39,11 +42,13 @@
         private readonly ITaskService _taskService;
         private readonly ITaskExecuteDetailService _taskExecuteDetailService;
         private readonly ITaskRepository _taskRepository;
+        public static PPReadData pPReadData = new PPReadData();
         private readonly IRouterService _routerService;
         private readonly IStationMangerRepository _stationMangerRepository;
         private List<Dt_ApiInfo> apiInfos;
+        private WebSocketServer _webSocketServer;
 
-        public StackerCraneJob_PP(IMapper mapper, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository, ICacheService cacheService)
+        public StackerCraneJob_PP(IMapper mapper, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository, ICacheService cacheService,WebSocketServer webSocketServer)
         {
             _taskService = taskService;
             _taskExecuteDetailService = taskExecuteDetailService;
@@ -52,6 +57,7 @@
             _stationMangerRepository = stationMangerRepository;
             _cacheService = cacheService;
             _mapper=mapper;
+            _webSocketServer = webSocketServer;
 
             string? apiInfoStr = _cacheService.Get("apiInfos");
             if (!string.IsNullOrEmpty(apiInfoStr))
@@ -103,6 +109,14 @@
                             }
                         }
                     }
+                    pPReadData.R_PP_Status = ((short)commonStackerCrane.StackerCraneStatusValue);
+                    pPReadData.R_PP_AutoStatus = ((short)commonStackerCrane.StackerCraneAutoStatusValue);
+                    pPReadData.R_PP_WorkStatus = ((short)commonStackerCrane.StackerCraneWorkStatusValue);
+                    pPReadData.R_PP_TaskNum = commonStackerCrane.CurrentTaskNum.ObjToInt();
+                    pPReadData.R_PP_WorkType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType);
+                    pPReadData.R_PP_TrayType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.TrayType);
+                    string pPData = JsonConvert.SerializeObject(pPReadData);
+                    _webSocketServer.PublishAllClientPayload(pPData);
                 }
             }
             catch (Exception ex)
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/TSJConveyorLineJob_PP.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/TSJConveyorLineJob_PP.cs"
index 1742b4d..81096e3 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/TSJConveyorLineJob_PP.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/TSJConveyorLineJob_PP.cs"
@@ -219,6 +219,50 @@
                     {
                         WriteInfo(device.DeviceName, $"鏈壘鍒拌澶囧瓙缂栧彿{item.StationCode}鐨勫崗璁俊鎭�");
                     }
+                    R_ConveyorLineInfo conveyorLineInfoRead1 = device.Communicator.ReadCustomer<R_ConveyorLineInfo>(deviceProRead.DeviceProAddress);
+                    W_ConveyorLineInfo conveyorLineInfoWrite1 = device.Communicator.ReadCustomer<W_ConveyorLineInfo>(deviceProWrite.DeviceProAddress);
+                    R_ConveyorLineStatus conveyorLineStatus1 = conveyorLineInfoRead1.Status.ByteToBoolObject<R_ConveyorLineStatus>();
+                    ConveyorLineSignal conveyorLineSignalRead1 = conveyorLineInfoRead1.Signal.ByteToBoolObject<ConveyorLineSignal>();
+                    ConveyorLineSignal conveyorLineSignalWrite1 = conveyorLineInfoWrite1.Signal.ByteToBoolObject<ConveyorLineSignal>();
+                    if (item.StationCode == "2005")
+                    {
+                        if (conveyorLineSignalRead1.STB && conveyorLineStatus1.Online && conveyorLineStatus1.Goods && !conveyorLineStatus1.Alarm && !conveyorLineSignalWrite1.ACK)
+                        {
+                            StackerCraneJob_PP.pPReadData.R_PP_Boxcode = device.Communicator.Read<string>("DB900.578.0");
+                        }
+                        StackerCraneJob_PP.pPReadData.R_PP_HandShake5 = conveyorLineStatus1.HandShake;
+                        StackerCraneJob_PP.pPReadData.R_PP_Online5 = conveyorLineStatus1.Online;
+                        StackerCraneJob_PP.pPReadData.R_PP_Free5 = conveyorLineStatus1.Free;
+                        StackerCraneJob_PP.pPReadData.R_PP_Goods5 = conveyorLineStatus1.Goods;
+                        StackerCraneJob_PP.pPReadData.R_PP_Alarm5 = conveyorLineStatus1.Alarm;
+                        StackerCraneJob_PP.pPReadData.R_PP_STB5 = conveyorLineSignalRead1.STB;
+                        StackerCraneJob_PP.pPReadData.R_PP_ACK5 = conveyorLineSignalRead1.ACK;
+                        StackerCraneJob_PP.pPReadData.W_PP_STB5 = conveyorLineSignalWrite1.STB;
+                        StackerCraneJob_PP.pPReadData.W_PP_ACK5 = conveyorLineSignalWrite1.ACK;
+                    }else if(item.StationCode == "2016")
+                    {
+                        StackerCraneJob_PP.pPReadData.R_PP_HandShake6 = conveyorLineStatus1.HandShake;
+                        StackerCraneJob_PP.pPReadData.R_PP_Online6 = conveyorLineStatus1.Online;
+                        StackerCraneJob_PP.pPReadData.R_PP_Free6 = conveyorLineStatus1.Free;
+                        StackerCraneJob_PP.pPReadData.R_PP_Goods6 = conveyorLineStatus1.Goods;
+                        StackerCraneJob_PP.pPReadData.R_PP_Alarm6 = conveyorLineStatus1.Alarm;
+                        StackerCraneJob_PP.pPReadData.R_PP_STB6 = conveyorLineSignalRead1.STB;
+                        StackerCraneJob_PP.pPReadData.R_PP_ACK6 = conveyorLineSignalRead1.ACK;
+                        StackerCraneJob_PP.pPReadData.W_PP_STB6 = conveyorLineSignalWrite1.STB;
+                        StackerCraneJob_PP.pPReadData.W_PP_ACK6 = conveyorLineSignalWrite1.ACK;
+                    }
+                    else if (item.StationCode == "2016")
+                    {
+                        StackerCraneJob_PP.pPReadData.R_PP_HandShake7 = conveyorLineStatus1.HandShake;
+                        StackerCraneJob_PP.pPReadData.R_PP_Online7 = conveyorLineStatus1.Online;
+                        StackerCraneJob_PP.pPReadData.R_PP_Free7 = conveyorLineStatus1.Free;
+                        StackerCraneJob_PP.pPReadData.R_PP_Goods7 = conveyorLineStatus1.Goods;
+                        StackerCraneJob_PP.pPReadData.R_PP_Alarm7 = conveyorLineStatus1.Alarm;
+                        StackerCraneJob_PP.pPReadData.R_PP_STB7 = conveyorLineSignalRead1.STB;
+                        StackerCraneJob_PP.pPReadData.R_PP_ACK7 = conveyorLineSignalRead1.ACK;
+                        StackerCraneJob_PP.pPReadData.W_PP_STB7 = conveyorLineSignalWrite1.STB;
+                        StackerCraneJob_PP.pPReadData.W_PP_ACK7 = conveyorLineSignalWrite1.ACK;
+                    }
                 }
             }
 
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/UpdateExpirationlabelJob.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/UpdateExpirationlabelJob.cs"
new file mode 100644
index 0000000..05791af
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/UpdateExpirationlabelJob.cs"
@@ -0,0 +1,40 @@
+锘縰sing Newtonsoft.Json;
+using Quartz;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_QuartzJob;
+
+namespace WIDESEAWCS_Tasks
+{
+    [DisallowConcurrentExecution]
+    public partial class UpdateExpirationlabelJob : JobBase, IJob
+    {
+        
+        public Task Execute(IJobExecutionContext context)
+        {
+            Thread.Sleep(4320000);
+            try
+            {
+                string address = AppSettings.Get("WMSApiAddress");
+                if (string.IsNullOrEmpty(address)) throw new Exception("鏈壘鍒癢MSApi鍦板潃");
+                string responseStr = HttpHelper.Get($"{address}/api/StockInfo/UpdateExpirationlabel");
+
+                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
+                if (responseContent.Status)
+                {
+                    return Task.CompletedTask;
+                }
+            }
+            catch (Exception ex)
+            {
+                Console.Out.WriteLine(nameof(UpdateExpirationlabelJob) + ":" + ex.Message);
+            }
+            return Task.CompletedTask;
+        }
+    }
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\345\271\262\350\206\234\344\273\223/ConveyorLineJob_GM.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\345\271\262\350\206\234\344\273\223/ConveyorLineJob_GM.cs"
index 3e84239..ec69ca0 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\345\271\262\350\206\234\344\273\223/ConveyorLineJob_GM.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\345\271\262\350\206\234\344\273\223/ConveyorLineJob_GM.cs"
@@ -17,6 +17,7 @@
 using WIDESEAWCS_ITaskInfoService;
 using WIDESEAWCS_Model.Models;
 using WIDESEAWCS_QuartzJob;
+using WIDESEAWCS_QuartzJob.ConveyorLine.Enum;
 using WIDESEAWCS_QuartzJob.DTO;
 using WIDESEAWCS_QuartzJob.Models;
 using WIDESEAWCS_QuartzJob.Repository;
@@ -239,6 +240,50 @@
                     {
                         WriteInfo(device.DeviceName, $"鏈壘鍒拌澶囧瓙缂栧彿{item.StationCode}鐨勫崗璁俊鎭�");
                     }
+                    R_ConveyorLineInfo conveyorLineInfoRead1 = device.Communicator.ReadCustomer<R_ConveyorLineInfo>(deviceProRead.DeviceProAddress);
+                    W_ConveyorLineInfo conveyorLineInfoWrite1 = device.Communicator.ReadCustomer<W_ConveyorLineInfo>(deviceProWrite.DeviceProAddress);
+                    R_ConveyorLineStatus conveyorLineStatus1 = conveyorLineInfoRead1.Status.ByteToBoolObject<R_ConveyorLineStatus>();
+                    ConveyorLineSignal conveyorLineSignalRead1 = conveyorLineInfoRead1.Signal.ByteToBoolObject<ConveyorLineSignal>();
+                    ConveyorLineSignal conveyorLineSignalWrite1 = conveyorLineInfoWrite1.Signal.ByteToBoolObject<ConveyorLineSignal>();
+                    if (item.StationCode == "7003") {
+                        if (conveyorLineSignalRead1.STB && conveyorLineStatus1.Online && conveyorLineStatus1.Goods && !conveyorLineStatus1.Alarm && !conveyorLineSignalWrite1.ACK)
+                        {
+                            StackerCraneJob_GM.gMReadData.R_GM_Boxcode = device.Communicator.Read<string>("DB900.478.0");
+                        }
+                        StackerCraneJob_GM.gMReadData.R_GM_HandShake3 = conveyorLineStatus1.HandShake;
+                        StackerCraneJob_GM.gMReadData.R_GM_Online3 = conveyorLineStatus1.Online;
+                        StackerCraneJob_GM.gMReadData.R_GM_Free3 = conveyorLineStatus1.Free;
+                        StackerCraneJob_GM.gMReadData.R_GM_Goods3 = conveyorLineStatus1.Goods;
+                        StackerCraneJob_GM.gMReadData.R_GM_Alarm3 = conveyorLineStatus1.Alarm;
+                        StackerCraneJob_GM.gMReadData.R_GM_STB3 = conveyorLineSignalRead1.STB;
+                        StackerCraneJob_GM.gMReadData.R_GM_ACK3 = conveyorLineSignalRead1.ACK;
+                        StackerCraneJob_GM.gMReadData.W_GM_STB3 = conveyorLineSignalWrite1.STB;
+                        StackerCraneJob_GM.gMReadData.W_GM_ACK3 = conveyorLineSignalWrite1.ACK;
+                    }
+                    else if(item.StationCode == "7004")
+                    {
+                        StackerCraneJob_GM.gMReadData.R_GM_HandShake4 = conveyorLineStatus1.HandShake;
+                        StackerCraneJob_GM.gMReadData.R_GM_Online4 = conveyorLineStatus1.Online;
+                        StackerCraneJob_GM.gMReadData.R_GM_Free4 = conveyorLineStatus1.Free;
+                        StackerCraneJob_GM.gMReadData.R_GM_Goods4 = conveyorLineStatus1.Goods;
+                        StackerCraneJob_GM.gMReadData.R_GM_Alarm4 = conveyorLineStatus1.Alarm;
+                        StackerCraneJob_GM.gMReadData.R_GM_STB4 = conveyorLineSignalRead1.STB;
+                        StackerCraneJob_GM.gMReadData.R_GM_ACK4 = conveyorLineSignalRead1.ACK;
+                        StackerCraneJob_GM.gMReadData.W_GM_STB4 = conveyorLineSignalWrite1.STB;
+                        StackerCraneJob_GM.gMReadData.W_GM_ACK4 = conveyorLineSignalWrite1.ACK;
+                    }
+                    else if (item.StationCode == "7005")
+                    {
+                        StackerCraneJob_GM.gMReadData.R_GM_HandShake5 = conveyorLineStatus1.HandShake;
+                        StackerCraneJob_GM.gMReadData.R_GM_Online5 = conveyorLineStatus1.Online;
+                        StackerCraneJob_GM.gMReadData.R_GM_Free5 = conveyorLineStatus1.Free;
+                        StackerCraneJob_GM.gMReadData.R_GM_Goods5 = conveyorLineStatus1.Goods;
+                        StackerCraneJob_GM.gMReadData.R_GM_Alarm5 = conveyorLineStatus1.Alarm;
+                        StackerCraneJob_GM.gMReadData.R_GM_STB5 = conveyorLineSignalRead1.STB;
+                        StackerCraneJob_GM.gMReadData.R_GM_ACK5 = conveyorLineSignalRead1.ACK;
+                        StackerCraneJob_GM.gMReadData.W_GM_STB5 = conveyorLineSignalWrite1.STB;
+                        StackerCraneJob_GM.gMReadData.W_GM_ACK5 = conveyorLineSignalWrite1.ACK;
+                    }
                 }
             }
 
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\345\271\262\350\206\234\344\273\223/GMReadData.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\345\271\262\350\206\234\344\273\223/GMReadData.cs"
new file mode 100644
index 0000000..a873676
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\345\271\262\350\206\234\344\273\223/GMReadData.cs"
@@ -0,0 +1,185 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEAWCS_Tasks.骞茶啘浠�
+{
+    public class GMReadData
+    {
+        /// <summary>
+        /// 鍫嗗灈鏈虹姸鎬�
+        /// </summary>
+        public short R_GM_Status;
+
+        /// <summary>
+        /// 鍫嗗灈鏈烘墜鑷姩鐘舵��
+        /// </summary>
+        public short R_GM_AutoStatus;
+
+        /// <summary>
+        /// 褰撳墠姝e湪鎵ц鐨勪换鍔″彿
+        /// </summary>
+        public int R_GM_TaskNum;
+
+        /// <summary>
+        /// 鍫嗗灈鏈哄伐浣滅姸鎬�
+        /// </summary>
+        public short R_GM_WorkStatus;
+
+        /// <summary>
+        /// 浣滀笟绫诲瀷
+        /// </summary>
+        public short R_GM_WorkType;
+
+        /// <summary>
+        /// 鎵樼洏绫诲瀷
+        /// </summary>
+        public short R_GM_TrayType;
+
+
+        ///绔欏彴
+        
+        ///<summary>
+        /// 璇诲彇鏉$爜
+        /// </summary>
+        public string R_GM_Boxcode;
+        /// <summary>
+        /// 鎻℃墜淇″彿
+        /// </summary>
+        public bool R_GM_HandShake3;
+
+        /// <summary>
+        /// 1鑱旀満 0鑴辨満
+        /// </summary>
+        public bool R_GM_Online3;
+
+        /// <summary>
+        /// 1绌洪棽 0绻佸繖
+        /// </summary>
+        public bool R_GM_Free3;
+
+        /// <summary>
+        /// 1鏈夎揣 0鏃犺揣
+        /// </summary>
+        public bool R_GM_Goods3;
+
+        /// <summary>
+        /// 1鏁呴殰 0姝e父
+        /// </summary>
+        public bool R_GM_Alarm3;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(璇�)
+        /// </summary>
+        public bool R_GM_STB3;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(璇�)
+        /// </summary>
+        public bool R_GM_ACK3;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(鍐�)
+        /// </summary>
+        public bool W_GM_STB3;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(鍐�)
+        /// </summary>
+        public bool W_GM_ACK3;
+
+
+        /// <summary>
+        /// 鎻℃墜淇″彿
+        /// </summary>
+        public bool R_GM_HandShake4;
+
+        /// <summary>
+        /// 1鑱旀満 0鑴辨満
+        /// </summary>
+        public bool R_GM_Online4;
+
+        /// <summary>
+        /// 1绌洪棽 0绻佸繖
+        /// </summary>
+        public bool R_GM_Free4;
+
+        /// <summary>
+        /// 1鏈夎揣 0鏃犺揣
+        /// </summary>
+        public bool R_GM_Goods4;
+
+        /// <summary>
+        /// 1鏁呴殰 0姝e父
+        /// </summary>
+        public bool R_GM_Alarm4;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(璇�)
+        /// </summary>
+        public bool R_GM_STB4;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(璇�)
+        /// </summary>
+        public bool R_GM_ACK4;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(鍐�)
+        /// </summary>
+        public bool W_GM_STB4;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(鍐�)
+        /// </summary>
+        public bool W_GM_ACK4;
+
+
+        /// <summary>
+        /// 鎻℃墜淇″彿
+        /// </summary>
+        public bool R_GM_HandShake5;
+
+        /// <summary>
+        /// 1鑱旀満 0鑴辨満
+        /// </summary>
+        public bool R_GM_Online5;
+
+        /// <summary>
+        /// 1绌洪棽 0绻佸繖
+        /// </summary>
+        public bool R_GM_Free5;
+
+        /// <summary>
+        /// 1鏈夎揣 0鏃犺揣
+        /// </summary>
+        public bool R_GM_Goods5;
+
+        /// <summary>
+        /// 1鏁呴殰 0姝e父
+        /// </summary>
+        public bool R_GM_Alarm5;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(璇�)
+        /// </summary>
+        public bool R_GM_STB5;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(璇�)
+        /// </summary>
+        public bool R_GM_ACK5;
+
+        /// <summary>
+        /// 璇锋眰淇″彿(鍐�)
+        /// </summary>
+        public bool W_GM_STB5;
+
+        /// <summary>
+        /// 鍝嶅簲淇″彿(鍐�)
+        /// </summary>
+        public bool W_GM_ACK5;
+    }
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\345\271\262\350\206\234\344\273\223/StackerCraneJob_GM.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\345\271\262\350\206\234\344\273\223/StackerCraneJob_GM.cs"
index 50ce7ca..bdc3052 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\345\271\262\350\206\234\344\273\223/StackerCraneJob_GM.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\345\271\262\350\206\234\344\273\223/StackerCraneJob_GM.cs"
@@ -28,6 +28,8 @@
 using WIDESEAWCS_QuartzJob.Repository;
 using WIDESEAWCS_DTO.TaskInfo;
 using AutoMapper;
+using HslCommunication.WebSocket;
+using WIDESEAWCS_Tasks.骞茶啘浠�;
 
 namespace WIDESEAWCS_Tasks
 {
@@ -38,13 +40,15 @@
         private readonly ITaskService _taskService;
         private readonly ITaskExecuteDetailService _taskExecuteDetailService;
         private readonly ITaskRepository _taskRepository;
+        public static GMReadData gMReadData = new GMReadData();
         private readonly IRouterService _routerService;
         private readonly IStationMangerRepository _stationMangerRepository;
         private readonly IRouterRepository _routerRepository;
         private readonly IMapper _mapper;
         private List<Dt_ApiInfo> apiInfos;
+        private WebSocketServer _webSocketServer;
 
-        public StackerCraneJob_GM(ITaskService taskService, ICacheService cacheService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IMapper mapper)
+        public StackerCraneJob_GM(ITaskService taskService, ICacheService cacheService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IMapper mapper,WebSocketServer webSocketServer)
         {
             _taskService = taskService;
             _taskExecuteDetailService = taskExecuteDetailService;
@@ -54,6 +58,7 @@
             _cacheService = cacheService;
             _routerRepository = routerRepository;
             _mapper = mapper;
+            _webSocketServer = webSocketServer;
 
             string? apiInfoStr = _cacheService.Get("apiInfos");
             if (!string.IsNullOrEmpty(apiInfoStr))
@@ -111,6 +116,14 @@
                             }
                         }
                     }
+                    gMReadData.R_GM_Status = ((short)commonStackerCrane.StackerCraneStatusValue);
+                    gMReadData.R_GM_AutoStatus = ((short)commonStackerCrane.StackerCraneAutoStatusValue);
+                    gMReadData.R_GM_WorkStatus = ((short)commonStackerCrane.StackerCraneWorkStatusValue);
+                    gMReadData.R_GM_TaskNum = commonStackerCrane.CurrentTaskNum.ObjToInt();
+                    gMReadData.R_GM_WorkType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType);
+                    gMReadData.R_GM_TrayType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.TrayType);
+                    string gMData = JsonConvert.SerializeObject(gMReadData);
+                    _webSocketServer.PublishAllClientPayload(gMData);
                 }
             }
             catch (Exception ex)
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\346\262\271\345\242\250\344\273\223/CommonHoisterJob.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\346\262\271\345\242\250\344\273\223/CommonHoisterJob.cs"
index b9049d6..854d077 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\346\262\271\345\242\250\344\273\223/CommonHoisterJob.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\346\262\271\345\242\250\344\273\223/CommonHoisterJob.cs"
@@ -1,4 +1,5 @@
-锘縰sing Quartz;
+锘縰sing Autofac.Core;
+using Quartz;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -156,6 +157,24 @@
                                 WriteError(hoister.DeviceName, $"鏈壘鍒板搴旂珯鍙颁俊鎭�,{deviceChildCode}");
                             }
                         }
+                        if (deviceChildCode == "9001")
+                        {
+                            StackerCraneJob_YM.yMReadData.R_YM_Tray1 = hoister.GetValue<HoisterDBName, bool>(HoisterDBName.Tray, deviceChildCode);
+                            StackerCraneJob_YM.yMReadData.R_YM_Leisure1 = hoister.GetValue<HoisterDBName, bool>(HoisterDBName.Leisure, deviceChildCode);
+                            StackerCraneJob_YM.yMReadData.W_YM_RequestIn1 = hoister.GetValue<HoisterDBName, bool>(HoisterDBName.RequestIn, deviceChildCode);
+                            StackerCraneJob_YM.yMReadData.W_YM_RequestOut1 = hoister.GetValue<HoisterDBName, bool>(HoisterDBName.RequestOut, deviceChildCode);
+                            StackerCraneJob_YM.yMReadData.R_YM_Inbounding1 = hoister.GetValue<HoisterDBName, bool>(HoisterDBName.Inbounding, deviceChildCode);
+                            StackerCraneJob_YM.yMReadData.R_YM_Outbounding1 = hoister.GetValue<HoisterDBName, bool>(HoisterDBName.Outbounding, deviceChildCode);
+                        }
+                        else if (deviceChildCode == "9002")
+                        {
+                            StackerCraneJob_YM.yMReadData.R_YM_Tray2 = hoister.GetValue<HoisterDBName, bool>(HoisterDBName.Tray, deviceChildCode);
+                            StackerCraneJob_YM.yMReadData.R_YM_Leisure2 = hoister.GetValue<HoisterDBName, bool>(HoisterDBName.Leisure, deviceChildCode);
+                            StackerCraneJob_YM.yMReadData.W_YM_RequestIn2 = hoister.GetValue<HoisterDBName, bool>(HoisterDBName.RequestIn, deviceChildCode);
+                            StackerCraneJob_YM.yMReadData.W_YM_RequestOut2 = hoister.GetValue<HoisterDBName, bool>(HoisterDBName.RequestOut, deviceChildCode);
+                            StackerCraneJob_YM.yMReadData.R_YM_Inbounding2 = hoister.GetValue<HoisterDBName, bool>(HoisterDBName.Inbounding, deviceChildCode);
+                            StackerCraneJob_YM.yMReadData.R_YM_Outbounding2 = hoister.GetValue<HoisterDBName, bool>(HoisterDBName.Outbounding, deviceChildCode);
+                        }
                     }
                 }
             }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\346\262\271\345\242\250\344\273\223/StackerCraneJob_YM.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\346\262\271\345\242\250\344\273\223/StackerCraneJob_YM.cs"
index 8497251..345e549 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\346\262\271\345\242\250\344\273\223/StackerCraneJob_YM.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\346\262\271\345\242\250\344\273\223/StackerCraneJob_YM.cs"
@@ -1,4 +1,5 @@
-锘縰sing Microsoft.AspNetCore.Components.Routing;
+锘縰sing HslCommunication.WebSocket;
+using Microsoft.AspNetCore.Components.Routing;
 using Newtonsoft.Json;
 using Quartz;
 using System;
@@ -24,6 +25,8 @@
 using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
 using WIDESEAWCS_Tasks.HoisterJob;
 using WIDESEAWCS_Tasks.StackerCraneJob;
+using WIDESEAWCS_Tasks.娌瑰ⅷ浠�;
+using WIDESEAWCS_Tasks.闃荤剨浠�;
 
 namespace WIDESEAWCS_Tasks
 {
@@ -35,12 +38,14 @@
     {
         private readonly ICacheService _cacheService;
         private readonly ITaskService _taskService;
+        public static YMReadData yMReadData = new YMReadData();
         private readonly ITaskExecuteDetailService _taskExecuteDetailService;
         private readonly ITaskRepository _taskRepository;
         private readonly IRouterService _routerService;
         private readonly IStationMangerRepository _stationMangerRepository;
+        private WebSocketServer _webSocketServer;
 
-        public StackerCraneJob_YM(ITaskService taskService, ICacheService cacheService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository)
+        public StackerCraneJob_YM(ITaskService taskService, ICacheService cacheService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository,WebSocketServer webSocketServer)
         {
             _cacheService = cacheService;
             _taskService = taskService;
@@ -48,6 +53,7 @@
             _taskRepository = taskRepository;
             _routerService = routerService;
             _stationMangerRepository = stationMangerRepository;
+            _webSocketServer = webSocketServer;
         }
 
         public Task Execute(IJobExecutionContext context)
@@ -87,6 +93,14 @@
                                 }
                             }
                         }
+                        yMReadData.R_YM_Status = ((short)commonStackerCrane.StackerCraneStatusValue);
+                        yMReadData.R_YM_AutoStatus = ((short)commonStackerCrane.StackerCraneAutoStatusValue);
+                        yMReadData.R_YM_WorkStatus = ((short)commonStackerCrane.StackerCraneWorkStatusValue);
+                        yMReadData.R_YM_TaskNum = commonStackerCrane.CurrentTaskNum.ObjToInt();
+                        yMReadData.R_YM_WorkType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType);
+                        yMReadData.R_YM_TrayType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.TrayType);
+                        string yMData = JsonConvert.SerializeObject(yMReadData);
+                        _webSocketServer.PublishAllClientPayload(yMData);
                     }
                 }
                 catch (Exception ex)
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\346\262\271\345\242\250\344\273\223/YMReadData.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\346\262\271\345\242\250\344\273\223/YMReadData.cs"
new file mode 100644
index 0000000..43c68fd
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\346\262\271\345\242\250\344\273\223/YMReadData.cs"
@@ -0,0 +1,106 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEAWCS_Tasks.娌瑰ⅷ浠�
+{
+    public class YMReadData
+    {
+        /// <summary>
+        /// 鍫嗗灈鏈虹姸鎬�
+        /// </summary>
+        public short R_YM_Status;
+
+        /// <summary>
+        /// 鍫嗗灈鏈烘墜鑷姩鐘舵��
+        /// </summary>
+        public short R_YM_AutoStatus;
+
+        /// <summary>
+        /// 褰撳墠姝e湪鎵ц鐨勪换鍔″彿
+        /// </summary>
+        public int R_YM_TaskNum;
+
+        /// <summary>
+        /// 鍫嗗灈鏈哄伐浣滅姸鎬�
+        /// </summary>
+        public short R_YM_WorkStatus;
+
+        /// <summary>
+        /// 浣滀笟绫诲瀷
+        /// </summary>
+        public short R_YM_WorkType;
+
+        /// <summary>
+        /// 鎵樼洏绫诲瀷
+        /// </summary>
+        public short R_YM_TrayType;
+
+
+        ///鎻愬崌鏈�
+        /// <summary>
+        /// 鏈夎揣(璇�)
+        /// </summary>
+        public bool R_YM_Tray1;
+
+        /// <summary>
+        /// 鍏ュ簱鎵ц涓�(璇�)
+        /// </summary>
+        public bool R_YM_Inbounding1;
+
+        /// <summary>
+        /// 鎻愬崌鏈虹┖闂�(璇�)
+        /// </summary>
+        public bool R_YM_Leisure1;
+
+        /// <summary>
+        /// 鍑哄簱鎵ц涓�(璇�)
+        /// </summary>
+        public bool R_YM_Outbounding1;
+
+        /// <summary>
+        /// 鐢宠鍏ュ簱(鍐�)
+        /// </summary>
+        public bool W_YM_RequestIn1;
+
+        /// <summary>
+        /// 鐢宠鍑哄簱(鍐�)
+        /// </summary>
+        public bool W_YM_RequestOut1;
+
+
+        /// <summary>
+        /// 鏈夎揣(璇�)
+        /// </summary>
+        public bool R_YM_Tray2;
+
+        /// <summary>
+        /// 鍏ュ簱鎵ц涓�(璇�)
+        /// </summary>
+        public bool R_YM_Inbounding2;
+
+        /// <summary>
+        /// 鎻愬崌鏈虹┖闂�(璇�)
+        /// </summary>
+        public bool R_YM_Leisure2;
+
+        /// <summary>
+        /// 鍑哄簱鎵ц涓�(璇�)
+        /// </summary>
+        public bool R_YM_Outbounding2;
+
+        /// <summary>
+        /// 鐢宠鍏ュ簱(鍐�)
+        /// </summary>
+        public bool W_YM_RequestIn2;
+
+        /// <summary>
+        /// 鐢宠鍑哄簱(鍐�)
+        /// </summary>
+        public bool W_YM_RequestOut2;
+
+    }
+}
+
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\350\276\205\346\226\231\344\273\223/ConveyorLineJob_FL.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\350\276\205\346\226\231\344\273\223/ConveyorLineJob_FL.cs"
index d67fe80..fd1917e 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\350\276\205\346\226\231\344\273\223/ConveyorLineJob_FL.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\350\276\205\346\226\231\344\273\223/ConveyorLineJob_FL.cs"
@@ -1,10 +1,12 @@
-锘縰sing Microsoft.AspNetCore.Components.Routing;
+锘縰sing HslCommunication.WebSocket;
+using Microsoft.AspNetCore.Components.Routing;
 using Newtonsoft.Json;
 using Quartz;
 using SqlSugar.Extensions;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Reflection;
 using System.Text;
 using System.Threading.Tasks;
 using WIDESEAWCS_Common;
@@ -19,6 +21,7 @@
 using WIDESEAWCS_QuartzJob.Repository;
 using WIDESEAWCS_QuartzJob.Service;
 using WIDESEAWCS_Tasks.ConveyorLineJob;
+using WIDESEAWCS_Tasks.杈呮枡浠�;
 using ICacheService = WIDESEAWCS_Core.Caches.ICacheService;
 
 namespace WIDESEAWCS_Tasks
@@ -30,13 +33,15 @@
         private readonly ITaskService _taskService;
         private readonly ITaskExecuteDetailService _taskExecuteDetailService;
         private readonly ITaskRepository _taskRepository;
+        public static FLReadData fLReadData = new FLReadData();
         private readonly IStationMangerRepository _stationMangerRepository;
         private readonly IRouterRepository _routerRepository;
         private readonly IRouterService _routerService;
         private readonly IRouterExtension _routerExtension;
         private readonly List<Dt_WarehouseDevice> warehouseDevices;
+        private WebSocketServer _webSocketServer;
 
-        public ConveyorLineJob_FL(ICacheService cacheService, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IRouterService routerService, IRouterExtension routerExtension)
+        public ConveyorLineJob_FL(ICacheService cacheService, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IRouterService routerService, IRouterExtension routerExtension,WebSocketServer webSocketServer)
         {
             _cacheService = cacheService;
             _taskService = taskService;
@@ -46,6 +51,7 @@
             _routerRepository = routerRepository;
             _routerService = routerService;
             _routerExtension = routerExtension;
+            _webSocketServer = webSocketServer;
 
             string? warehouseDevicesStr = _cacheService.Get<string>(nameof(Dt_WarehouseDevice));
             if (!string.IsNullOrEmpty(warehouseDevicesStr))
@@ -98,6 +104,22 @@
                                 _taskService.UpdateTask(newTask, TaskStatusEnum.Line_Executing);
                             }
                         }
+                        if (item.StationCode == "8005")
+                        {
+                            R_ConveyorLineFLInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineFLInfo>(deviceProRead.DeviceProAddress);
+                            bool conveyArrivaled = device.GetValue<R_ConveyorLineFLDB, bool>(R_ConveyorLineFLDB.ConveyArrivaled, item.StationCode);
+                            fLReadData.W_PutFinish5 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_PutFinish, item.StationCode);
+                            fLReadData.R_ConveyArrivaled5 = device.GetValue<R_ConveyorLineFLDB, bool>(R_ConveyorLineFLDB.ConveyArrivaled, item.StationCode);
+                            fLReadData.R_Barcode5 = conveyorLineInfoRead.Barcode;
+                            fLReadData.R_TaskNum5 = conveyorLineInfoRead.TaskNum;
+                        }
+                        else if (item.StationCode == "8001")
+                        {
+                            fLReadData.W_PutFinish1 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_PutFinish, item.StationCode);
+                            fLReadData.R_IsCanPut = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanPut, item.StationCode);
+                        }
+                        string yMData = JsonConvert.SerializeObject(fLReadData);
+                        _webSocketServer.PublishAllClientPayload(yMData);
                     }
 
                 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\350\276\205\346\226\231\344\273\223/FLReadData.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\350\276\205\346\226\231\344\273\223/FLReadData.cs"
new file mode 100644
index 0000000..b8ed2fa
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\350\276\205\346\226\231\344\273\223/FLReadData.cs"
@@ -0,0 +1,53 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEAWCS_Tasks.杈呮枡浠�
+{
+    public class FLReadData
+    {
+        ///杈撻�佺嚎
+        /// <summary>
+        /// 鏀捐揣瀹屾垚(鍐�)
+        /// </summary>
+        public bool W_PutFinish5;
+
+        /// <summary>
+        /// 鎵樼洏鍙�
+        /// </summary>
+        public string W_Barcode5;
+
+        /// <summary>
+        /// 鍐欏叆浠诲姟鍙�
+        /// </summary>
+        public string W_TaskNum5;
+
+        /// <summary>
+        /// 鍏ュ簱鍒颁綅鎸囦护
+        /// </summary>
+        public bool R_ConveyArrivaled5;
+
+        /// <summary>
+        /// 鍏ュ簱鍒颁綅鎵樼洏鍙�
+        /// </summary>
+        public string R_Barcode5;
+
+        /// <summary>
+        /// 鍏ュ簱鍒颁綅浠诲姟鍙�
+        /// </summary>
+        public string R_TaskNum5;
+
+
+        /// <summary>
+        /// 鏀捐揣瀹屾垚(鍐�)
+        /// </summary>
+        public bool W_PutFinish1;
+
+        /// <summary>
+        /// 鏄惁鍏佽鏀捐揣(璇�)
+        /// </summary>
+        public bool R_IsCanPut;
+    }
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/GroundStationJob_ZH.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/GroundStationJob_ZH.cs"
index fb868b5..d70a8aa 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/GroundStationJob_ZH.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/GroundStationJob_ZH.cs"
@@ -15,6 +15,7 @@
 using WIDESEAWCS_Model.Models;
 using WIDESEAWCS_QuartzJob;
 using WIDESEAWCS_Tasks.HoisterJob;
+using WIDESEAWCS_Tasks.闃荤剨浠�;
 
 namespace WIDESEAWCS_Tasks
 {
@@ -100,6 +101,49 @@
                                 _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute, currentAddress: stationManger.StackerCraneStationCode, targetAddress: locationCode, nextAddress: locationCode, deviceCode: stationManger.StackerCraneCode);
                             }
                         }
+                        if (item.StationCode == "301")
+                        {
+                            StackerCraneJob_ZH.zHReadData.R_ZH_TakePalletType1= device.GetValue<GroundStationDBName, short>(GroundStationDBName.R_TakePalletType, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.R_ZH_IsCanPut1 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanPut, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.R_ZH_IsCanTake1 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanTake, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_PutPalletType1 = device.GetValue<GroundStationDBName, short>(GroundStationDBName.W_PutPalletType, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_PutRequest1 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_PutRequest, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_PutFinish1 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_PutFinish, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_TakeRequest1 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_TakeRequest, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_TakeFinish1 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_TakeFinish, item.StationCode);
+                        }else if(item.StationCode == "302")
+                        {
+                            StackerCraneJob_ZH.zHReadData.R_ZH_TakePalletType2 = device.GetValue<GroundStationDBName, short>(GroundStationDBName.R_TakePalletType, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.R_ZH_IsCanPut2 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanPut, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.R_ZH_IsCanTake2 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanTake, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_PutPalletType2 = device.GetValue<GroundStationDBName, short>(GroundStationDBName.W_PutPalletType, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_PutRequest2 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_PutRequest, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_PutFinish2 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_PutFinish, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_TakeRequest2 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_TakeRequest, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_TakeFinish2 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_TakeFinish, item.StationCode);
+                        }
+                        else if (item.StationCode == "303")
+                        {
+                            StackerCraneJob_ZH.zHReadData.R_ZH_TakePalletType3 = device.GetValue<GroundStationDBName, short>(GroundStationDBName.R_TakePalletType, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.R_ZH_IsCanPut3 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanPut, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.R_ZH_IsCanTake3 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanTake, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_PutPalletType3 = device.GetValue<GroundStationDBName, short>(GroundStationDBName.W_PutPalletType, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_PutRequest3 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_PutRequest, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_PutFinish3 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_PutFinish, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_TakeRequest3 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_TakeRequest, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_TakeFinish3 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_TakeFinish, item.StationCode);
+                        }
+                        else if (item.StationCode == "304")
+                        {
+                            StackerCraneJob_ZH.zHReadData.R_ZH_TakePalletType4 = device.GetValue<GroundStationDBName, short>(GroundStationDBName.R_TakePalletType, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.R_ZH_IsCanPut4 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanPut, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.R_ZH_IsCanTake4 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanTake, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_PutPalletType4 = device.GetValue<GroundStationDBName, short>(GroundStationDBName.W_PutPalletType, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_PutRequest4 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_PutRequest, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_PutFinish4 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_PutFinish, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_TakeRequest4 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_TakeRequest, item.StationCode);
+                            StackerCraneJob_ZH.zHReadData.W_ZH_TakeFinish4 = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_TakeFinish, item.StationCode);
+                        }
                     }
                     catch (Exception ex)
                     {
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/StackerCraneJob_ZH.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/StackerCraneJob_ZH.cs"
index 7f7aa5b..d5785a0 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/StackerCraneJob_ZH.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/StackerCraneJob_ZH.cs"
@@ -27,6 +27,8 @@
 using WIDESEAWCS_DTO.TaskInfo;
 using WIDESEAWCS_Core.Caches;
 using AutoMapper;
+using WIDESEAWCS_Tasks.闃荤剨浠�;
+using HslCommunication.WebSocket;
 
 namespace WIDESEAWCS_Tasks
 {
@@ -35,14 +37,16 @@
     {
         private readonly ITaskService _taskService;
         private readonly ITaskExecuteDetailService _taskExecuteDetailService;
+        public static ZHReadData zHReadData = new ZHReadData();
         private readonly ITaskRepository _taskRepository;
         private readonly IRouterService _routerService;
         private readonly IStationMangerRepository _stationMangerRepository;
         private readonly ICacheService _cacheService;
         private readonly IMapper _mapper;
+        private WebSocketServer _webSocketServer;
         private List<Dt_ApiInfo> apiInfos;
 
-        public StackerCraneJob_ZH(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository,ICacheService cacheService, IMapper mapper)
+        public StackerCraneJob_ZH(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository,ICacheService cacheService, IMapper mapper, WebSocketServer webSocketServer)
         {
             _taskService = taskService;
             _taskExecuteDetailService = taskExecuteDetailService;
@@ -51,6 +55,7 @@
             _stationMangerRepository = stationMangerRepository;
             _cacheService = cacheService;
             _mapper = mapper;
+            _webSocketServer = webSocketServer;
             string? apiInfoStr = _cacheService.Get("apiInfos");
             if (!string.IsNullOrEmpty(apiInfoStr))
             {
@@ -100,6 +105,14 @@
                             }
                         }
                     }
+                    zHReadData.R_ZH_Status = ((short)commonStackerCrane.StackerCraneStatusValue);
+                    zHReadData.R_ZH_AutoStatus = ((short)commonStackerCrane.StackerCraneAutoStatusValue);
+                    zHReadData.R_ZH_WorkStatus = ((short)commonStackerCrane.StackerCraneWorkStatusValue);
+                    zHReadData.R_ZH_TaskNum = commonStackerCrane.CurrentTaskNum.ObjToInt();
+                    zHReadData.R_ZH_WorkType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType);
+                    zHReadData.R_ZH_TrayType = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.TrayType);
+                    string zHData = JsonConvert.SerializeObject(zHReadData);
+                    _webSocketServer.PublishAllClientPayload(zHData);
                 }
             }
             catch (Exception ex)
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/ZHReadData.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/ZHReadData.cs"
new file mode 100644
index 0000000..583f3cd
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/ZHReadData.cs"
@@ -0,0 +1,174 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEAWCS_Tasks.闃荤剨浠�
+{
+    public class ZHReadData
+    {
+        /// <summary>
+        /// 鍫嗗灈鏈虹姸鎬�
+        /// </summary>
+        public short R_ZH_Status;
+
+        /// <summary>
+        /// 鍫嗗灈鏈烘墜鑷姩鐘舵��
+        /// </summary>
+        public short R_ZH_AutoStatus;
+
+        /// <summary>
+        /// 褰撳墠姝e湪鎵ц鐨勪换鍔″彿
+        /// </summary>
+        public int R_ZH_TaskNum;
+
+        /// <summary>
+        /// 鍫嗗灈鏈哄伐浣滅姸鎬�
+        /// </summary>
+        public short R_ZH_WorkStatus;
+
+        /// <summary>
+        /// 浣滀笟绫诲瀷
+        /// </summary>
+        public short R_ZH_WorkType;
+
+        /// <summary>
+        /// 鎵樼洏绫诲瀷
+        /// </summary>
+        public short R_ZH_TrayType;
+
+        ///鍚勭珯鍙拌鍙�301
+        
+        ///鍙栬揣鎵樼洏绫诲瀷(璇�)
+        public short R_ZH_TakePalletType1;
+        /// <summary>
+        /// 鏀捐揣鎵樼洏绫诲瀷(鍐�)
+        /// </summary>
+        public short W_ZH_PutPalletType1;
+        /// <summary>
+        /// 鏄惁鍏佽鏀捐揣(璇�)
+        /// </summary>
+        public bool R_ZH_IsCanPut1;
+        /// <summary>
+        /// 鏄惁鍏佽鍙栬揣(璇�)
+        /// </summary>
+        public bool R_ZH_IsCanTake1;
+        /// <summary>
+        /// 鏀捐揣璇锋眰(鍐�)
+        /// </summary>
+        public bool W_ZH_PutRequest1;
+        /// <summary>
+        /// 鏀捐揣瀹屾垚(鍐�)
+        /// </summary>
+        public bool W_ZH_PutFinish1;
+        /// <summary>
+        /// 鍙栬揣璇锋眰(鍐�)
+        /// </summary>
+        public bool W_ZH_TakeRequest1;
+        /// <summary>
+        /// 鍙栬揣瀹屾垚(鍐�)
+        /// </summary>
+        public bool W_ZH_TakeFinish1;
+
+       
+        ///鍚勭珯鍙拌鍙�302
+
+        ///鍙栬揣鎵樼洏绫诲瀷(璇�)
+        public short R_ZH_TakePalletType2;
+        /// <summary>
+        /// 鏀捐揣鎵樼洏绫诲瀷(鍐�)
+        /// </summary>
+        public short W_ZH_PutPalletType2;
+        /// <summary>
+        /// 鏄惁鍏佽鏀捐揣(璇�)
+        /// </summary>
+        public bool R_ZH_IsCanPut2;
+        /// <summary>
+        /// 鏄惁鍏佽鍙栬揣(璇�)
+        /// </summary>
+        public bool R_ZH_IsCanTake2;
+        /// <summary>
+        /// 鏀捐揣璇锋眰(鍐�)
+        /// </summary>
+        public bool W_ZH_PutRequest2;
+        /// <summary>
+        /// 鏀捐揣瀹屾垚(鍐�)
+        /// </summary>
+        public bool W_ZH_PutFinish2;
+        /// <summary>
+        /// 鍙栬揣璇锋眰(鍐�)
+        /// </summary>
+        public bool W_ZH_TakeRequest2;
+        /// <summary>
+        /// 鍙栬揣瀹屾垚(鍐�)
+        /// </summary>
+        public bool W_ZH_TakeFinish2;
+
+        ///鍚勭珯鍙拌鍙�303
+
+        ///鍙栬揣鎵樼洏绫诲瀷(璇�)
+        public short R_ZH_TakePalletType3;
+        /// <summary>
+        /// 鏀捐揣鎵樼洏绫诲瀷(鍐�)
+        /// </summary>
+        public short W_ZH_PutPalletType3;
+        /// <summary>
+        /// 鏄惁鍏佽鏀捐揣(璇�)
+        /// </summary>
+        public bool R_ZH_IsCanPut3;
+        /// <summary>
+        /// 鏄惁鍏佽鍙栬揣(璇�)
+        /// </summary>
+        public bool R_ZH_IsCanTake3;
+        /// <summary>
+        /// 鏀捐揣璇锋眰(鍐�)
+        /// </summary>
+        public bool W_ZH_PutRequest3;
+        /// <summary>
+        /// 鏀捐揣瀹屾垚(鍐�)
+        /// </summary>
+        public bool W_ZH_PutFinish3;
+        /// <summary>
+        /// 鍙栬揣璇锋眰(鍐�)
+        /// </summary>
+        public bool W_ZH_TakeRequest3;
+        /// <summary>
+        /// 鍙栬揣瀹屾垚(鍐�)
+        /// </summary>
+        public bool W_ZH_TakeFinish3;
+
+        ///鍚勭珯鍙拌鍙�304
+
+        ///鍙栬揣鎵樼洏绫诲瀷(璇�)
+        public short R_ZH_TakePalletType4;
+        /// <summary>
+        /// 鏀捐揣鎵樼洏绫诲瀷(鍐�)
+        /// </summary>
+        public short W_ZH_PutPalletType4;
+        /// <summary>
+        /// 鏄惁鍏佽鏀捐揣(璇�)
+        /// </summary>
+        public bool R_ZH_IsCanPut4;
+        /// <summary>
+        /// 鏄惁鍏佽鍙栬揣(璇�)
+        /// </summary>
+        public bool R_ZH_IsCanTake4;
+        /// <summary>
+        /// 鏀捐揣璇锋眰(鍐�)
+        /// </summary>
+        public bool W_ZH_PutRequest4;
+        /// <summary>
+        /// 鏀捐揣瀹屾垚(鍐�)
+        /// </summary>
+        public bool W_ZH_PutFinish4;
+        /// <summary>
+        /// 鍙栬揣璇锋眰(鍐�)
+        /// </summary>
+        public bool W_ZH_TakeRequest4;
+        /// <summary>
+        /// 鍙栬揣瀹屾垚(鍐�)
+        /// </summary>
+        public bool W_ZH_TakeFinish4;
+    }
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/AddErpProScrapSheet.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/AddErpProScrapSheet.vue"
index 99be825..530b7f4 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/AddErpProScrapSheet.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/AddErpProScrapSheet.vue"
@@ -401,12 +401,6 @@
       this.proCodeOptions = [];
     }
   },
-  created() {
-    // 鍒濆鍖栨椂棰勫姞杞戒粨搴撴暟鎹�
-    if (this.warehouses.length === 0) {
-      this.getWarehouseList();
-    }
-  }
 };
 </script>
 
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/stock/ProStockView.js" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/stock/ProStockView.js"
index 92ad623..e81ae04 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/stock/ProStockView.js"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/stock/ProStockView.js"
@@ -78,6 +78,29 @@
 
           }
         }
+        if (column.field == 'proinventoryage') {
+          const today = new Date()
+          column.formatter = (row) => {
+              if (row.details.length > 0) {
+                  const closestDate = row.details
+                      .map(x => {
+                          const date = new Date(x.createDate);
+                          const ageInDays = Math.ceil((today - date) / (1000 * 60 * 60 * 24));
+                          return { date, ageInDays };
+                      })
+                      .reduce((closest, current) => (current.ageInDays < closest.ageInDays ? current : closest))
+                      .date;
+
+                  const inventoryAge = Math.ceil((today - closestDate) / (1000 * 60 * 60 * 24));
+                  
+                  row.inventoryAge = inventoryAge; 
+                  
+                  return `${inventoryAge} 澶ー;
+              } 
+              // 濡傛灉娌℃湁鏄庣粏锛岃繑鍥炵┖鎴栨彁绀轰俊鎭�
+              return '-';
+          }       
+        }
         if (column.field == 'sumStock') {
           column.formatter = (row) => {
             if (row.details.length > 0) {
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/stock/stockView.js" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/stock/stockView.js"
index b8c502e..5a7c805 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/stock/stockView.js"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/stock/stockView.js"
@@ -1,4 +1,3 @@
-
 //姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
 
 import { el } from "element-plus/es/locales.mjs";
@@ -54,36 +53,58 @@
             return str = list[0] == "" ? "鏃�" : str;
           }
         }
-    if (column.field == 'materielInfo') {
-    const today = new Date()
-    column.formatter = (row) => {
-        if (row.details.length > 0) {
-            const today = new Date();
-            const closestDate = row.details
-                .map(x => {
-                    const date = new Date(x.effectiveDate);
-                    const diffInDays = Math.ceil((date - today) / (1000 * 60 * 60 * 24)); // 鏀逛负璁$畻鍓╀綑澶╂暟
-                    return { date, diffInDays };
-                })
-                .reduce((closest, current) => (current.diffInDays < closest.diffInDays ? current : closest))
-                .date;
+        if (column.field == 'materielInfo') {
+        const today = new Date()
+        column.formatter = (row) => {
+            if (row.details.length > 0) {
+                const today = new Date();
+                const closestDate = row.details
+                    .map(x => {
+                        const date = new Date(x.effectiveDate);
+                        const diffInDays = Math.ceil((date - today) / (1000 * 60 * 60 * 24)); // 鏀逛负璁$畻鍓╀綑澶╂暟
+                        return { date, diffInDays };
+                    })
+                    .reduce((closest, current) => (current.diffInDays < closest.diffInDays ? current : closest))
+                    .date;
 
-            const daysRemaining = Math.ceil((closestDate - today) / (1000 * 60 * 60 * 24));
-            
-            row.expiryDays = daysRemaining; 
-            
-            if (daysRemaining <= 0) {
-                return '<span style="color:rgb(30, 27, 27)">鏃犱繚璐ㄦ湡</span>';
+                const daysRemaining = Math.ceil((closestDate - today) / (1000 * 60 * 60 * 24));
+                
+                row.expiryDays = daysRemaining; 
+                
+                if (daysRemaining <= 0) {
+                    return '<span style="color:rgb(30, 27, 27)">鏃犱繚璐ㄦ湡</span>';
+                } else {
+                    return '<span style="color: #F56C6C">' + daysRemaining + "澶�" + '</span>';
+                }
             } else {
-                return '<span style="color: #F56C6C">' + daysRemaining + "澶�" + '</span>';
+                row.expiryDays = null;
+                return '<span style="color:rgb(24, 18, 18)">鏃犱繚璐ㄦ湡</span>';
             }
-        } else {
-            row.expiryDays = null;
-            return '<span style="color:rgb(24, 18, 18)">鏃犱繚璐ㄦ湡</span>';
-        }
-    }
+        }       
+      }
 
-          
+      if (column.field == 'inventoryage') {
+          const today = new Date()
+          column.formatter = (row) => {
+              if (row.details.length > 0) {
+                  const closestDate = row.details
+                      .map(x => {
+                          const date = new Date(x.createDate);
+                          const ageInDays = Math.ceil((today - date) / (1000 * 60 * 60 * 24));
+                          return { date, ageInDays };
+                      })
+                      .reduce((closest, current) => (current.ageInDays < closest.ageInDays ? current : closest))
+                      .date;
+
+                  const inventoryAge = Math.ceil((today - closestDate) / (1000 * 60 * 60 * 24));
+                  
+                  row.inventoryAge = inventoryAge; 
+                  
+                  return `${inventoryAge} 澶ー;
+              } 
+              // 濡傛灉娌℃湁鏄庣粏锛岃繑鍥炵┖鎴栨彁绀轰俊鎭�
+              return '-';
+          }       
         }
         if (column.field == 'sumStock') {
           column.formatter = (row) => {
@@ -93,9 +114,9 @@
                 .map(x => {
                   sum += (x.stockQuantity)
                 })
-              return '<span style="color: #F56C6C">' + sum.toFixed(3) + row.details[0].unit + '</span>';
+              return '<span style="color: rgb(24, 18, 18)">' + sum.toFixed(3) + row.details[0].unit + '</span>';
             } else {
-              return '<span style="color: #F56C6C">' + "1涓�" + '</span>';
+              return '<span style="color: rgb(24, 18, 18)">' + "1涓�" + '</span>';
             }
 
           }
@@ -103,28 +124,17 @@
       })
       this.columns.forEach((column) => {
         column.cellStyle = (row) => {
-        // 鍙鐞嗘湁淇濊川鏈熸暟鎹殑鎯呭喌
-        if (row.expiryDays !== null && row.expiryDays !== undefined) {
-            if (row.expiryDays <= 0) {
-                return { background: 'red' }; // 绾㈣壊鑳屾櫙锛堝凡杩囨湡锛�
-            } else if (row.expiryDays <= 30) {
-                return { background: 'yellow' }; // 榛勮壊鑳屾櫙锛堜复鏈燂級
+          if (row.expirationlabel !== undefined && row.expirationlabel !== null) {
+            if (row.expirationlabel === 2) {
+              return { background: 'yellow' }; 
+            } else if (row.expirationlabel === 3) {
+              return { background: '#ffc0cb' };
             }
-        }
-        return {}; // 榛樿鏃犺儗鏅壊
-    };
+          }
+          return {};
+        };
+      });
 
-
-    
-    
-        //濡傛灉鏍规嵁琛岀殑鏌愪釜鍊艰缃暣琛岄鑹�
-        //璁剧疆鏁磋鑳屾櫙棰滆壊
-        // x.cellStyle = (row, rowIndex, columnIndex) => {
-        //   if (row.ProductCode == '10044464880643') {
-        //     return { background: '#ddecfd' };
-        //   } 
-        // };
-        });
     },
     onInited() {
       //妗嗘灦鍒濆鍖栭厤缃悗
@@ -172,4 +182,4 @@
     }
   }
 };
-export default extension;
+export default extension;
\ No newline at end of file
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js"
index 58d053c..451917f 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js"
@@ -20,6 +20,12 @@
         let TaskHandCancelBtn = this.buttons.find(x => x.value == 'TaskHandCancel');
       if (TaskHandCancelBtn) {
         TaskHandCancelBtn.onClick = function () {
+          this.$confirm("鏄惁纭鍙栨秷浠诲姟","鎵嬪姩浠诲姟鍙栨秷璀﹀憡",{
+              confirmButtonText: "纭畾",
+              cancelButtonText: "鍙栨秷",
+              type: "warning",
+              center: true,
+              }).then(() => {
           let rows = this.$refs.table.getSelected();
           if (rows.length == 0) return this.$error("璇烽�夋嫨鏁版嵁!");
           if (rows.length > 1) return this.$error("璇烽�夋嫨涓�鏉℃暟鎹�!");
@@ -35,6 +41,8 @@
                 return this.$error(x.message);
               }
             });
+            });
+        
         }
       }
       let TaskHandCompletedBtn = this.buttons.find(x => x.value == 'TaskHandCompleted');
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue"
index 19546ff..87db604 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue"
@@ -136,7 +136,7 @@
           type: "string",
           width: 90,
           align: "left",
-          bind:{key: "warehouses", data: []}
+          bind:{ key: "warehouses", data: []}
       },
       {
         field: "orderType",
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue"
index 1bcf0d6..f2d294f 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue"
@@ -113,6 +113,9 @@
         { title: "浠诲姟鍙�", field: "taskNum", type: "like" },
         { title: "鐘舵��", field: "status", type: "select",dataKey:"outLockStockStatusEnum", data:[]},
       ],
+      [
+        { title: "鍑哄簱鏃堕棿",field: "createDate",type: "datetime"},
+      ],
     ]);
     const columns = ref([
       {
@@ -129,7 +132,7 @@
         field: "orderNo",
         title: "鍗曟嵁缂栧彿",
         type: "string",
-        width: 150,
+        width: 180,
         align: "left",
         
       },
@@ -189,7 +192,7 @@
         field: "locationCode",
         title: "璐т綅缂栧彿",
         type: "datetime",
-        width: 160,
+        width: 220,
         align: "left",
       },
       {
@@ -235,6 +238,20 @@
         align: "left",
         bind:{key:"outLockStockStatusEnum", data: []}
       },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
     ]);
     const detail = ref({
       cnName: "#detailCnName",
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/stock/ProStockView.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/stock/ProStockView.vue"
index 5a2de27..c1da3d8 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/stock/ProStockView.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/stock/ProStockView.vue"
@@ -56,6 +56,7 @@
         ],
         [
           { title: "浜у搧鐗堟湰", field: "productVersion",type: "like"},
+          { title: "搴撳瓨鍒涘缓鏃堕棿",field: "createDate",type: "datetime"},
         ]
       ]);
       const columns = ref([
@@ -144,6 +145,13 @@
           align: "left",
         },
         {
+          field: "proinventoryage",
+          title: "鎴愬搧搴撻緞",
+          type: "string",
+          width: 80,
+          align: "left",
+        },
+        {
           field: "lotNumber",
           title: "浜у搧鎵瑰彿",
           type: "string",
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue"
index b3e5495..e601c24 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue"
@@ -124,6 +124,7 @@
       [
         { title: "鎵规鍙�", field: "batchNo",type :"like"},
         {title: "搴撳瓨鏄庣粏鐘舵��",field: "status",type: "select",dataKey:"stockStatusEmun", data: []},
+        { title: "鏈夋晥鏈熸煡璇�",field: "effectiveDate",type: "datetime"},
       ],
     ]);
     const columns = ref([
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/stock/stockView.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/stock/stockView.vue"
index 82c6174..7303955 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/stock/stockView.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/stock/stockView.vue"
@@ -51,6 +51,11 @@
         { title: "鐗╂枡缂栧彿", field: "materielCode",type: "like"},
         { title: "鎵规鍙�", field: "batchNo",type: "like"},
         { title: "鎵�灞炰粨搴�", field: "warehouseId",type: "selectList",dataKey: "warehouses",data: [],},
+        { title: "搴撳瓨鍒涘缓鏃堕棿",field: "createDate",type: "datetime"},
+      ],
+      [
+        { title: "鏈夋晥鏈熸煡璇�",field: "effectiveDate",type: "date"},
+        {title: "鐗╂枡鏈夋晥鏈�",field: "expirationlabel",type: "selectList",dataKey:"expirationlabelEnum",data:[]},
       ],
     ]);
     const columns = ref([
@@ -117,8 +122,23 @@
         align: "left"
       },
       {
+        field: "expirationlabel",
+        title: "鐗╂枡鏈夋晥鏈�",
+        type: "string",
+        width: 140,
+        align: "left",
+        bind: { key: "expirationlabelEnum", data: [] },
+      },
+      {
         field: "materielInfo",
         title: "鎵�鍚墿鏂欐渶鏃╀复鏈�",
+        type: "string",
+        width: 140,
+        align: "left",
+      },
+      {
+        field: "inventoryage",
+        title: "搴撻緞",
         type: "string",
         width: 140,
         align: "left",
@@ -170,6 +190,7 @@
         align: "left",
         bind: { key: "stockStatusEmun", data: [] },
       },
+
       {
         field: "locationType",
         title: "璐т綅绫诲瀷",
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/ExpirationlabelEnum.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/ExpirationlabelEnum.cs"
new file mode 100644
index 0000000..c83c805
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/ExpirationlabelEnum.cs"
@@ -0,0 +1,21 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEA_Common.StockEnum
+{
+    public enum ExpirationlabelEnum
+    {
+        [Description("鏈复鏈�")]
+        鏈复鏈� = 1,
+
+        [Description("涓存湡棰勮")]
+        涓存湡棰勮 = 2,
+
+        [Description("杩囨湡")]
+        杩囨湡 = 3,
+    }
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Core/Helper/UtilConvert.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Core/Helper/UtilConvert.cs"
index d9c8538..6acca7c 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Core/Helper/UtilConvert.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Core/Helper/UtilConvert.cs"
@@ -958,10 +958,10 @@
                 case HtmlElementType.Contains:
                     linqExpression = LinqExpressionType.In;
                     break;
-                case HtmlElementType.ThanOrEqual:
+                case HtmlElementType.thanorequal:
                     linqExpression = LinqExpressionType.ThanOrEqual;
                     break;
-                case HtmlElementType.LessOrequal:
+                case HtmlElementType.lessorequal:
                     linqExpression = LinqExpressionType.LessThanOrEqual;
                     break;
                 case HtmlElementType.GT:
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/EntityProperties.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/EntityProperties.cs"
index a57e31b..bf691b9 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/EntityProperties.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/EntityProperties.cs"
@@ -88,16 +88,19 @@
                 else
                 {
 
-                    int length = sugarColumn.Length;
-                    if (length == 0) { return (true, null, value); }
-                    //鍒ゆ柇鍙屽瓧鑺備笌鍗曞瓧娈�
-                    else if (length < 8000 &&
-                        ((dbType.Substring(0, 1) != "n"
-                        && Encoding.UTF8.GetBytes(val.ToCharArray()).Length > length)
-                         || val.Length > length)
-                         )
+                    if (sugarColumn != null)
                     {
-                        reslutMsg = $"鏈�澶氬彧鑳姐�恵length}銆戜釜瀛楃銆�";
+                        int length = sugarColumn.Length;
+                        if (length == 0) { return (true, null, null); }
+                        //鍒ゆ柇鍙屽瓧鑺備笌鍗曞瓧娈�
+                        else if (length < 8000 &&
+                            ((dbType.Substring(0, 1) != "n"
+                            && Encoding.UTF8.GetBytes(val.ToCharArray()).Length > length)
+                             || val.Length > length)
+                             )
+                        {
+                            reslutMsg = $"鏈�澶氬彧鑳姐�恵length}銆戜釜瀛楃銆�";
+                        }
                     }
                 }
             }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/StockViewDTO.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/StockViewDTO.cs"
index c7ea203..ce73ad8 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/StockViewDTO.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/StockViewDTO.cs"
@@ -134,6 +134,12 @@
         public int StockStatus { get; set; }
 
         /// <summary>
+        /// 搴撳瓨瓒呮湡鏍囪瘑
+        /// </summary>
+        [ExporterHeader(IsIgnore = true)]
+        public int Expirationlabel { get; set; }
+
+        /// <summary>
         /// 搴撳瓨澶囨敞
         /// </summary>
         [ExporterHeader(IsIgnore = true)]
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs"
index 2533a8d..7450c39 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs"
@@ -29,5 +29,7 @@
 
         List<PPStockSelectViewDTO> PPGetStockSelectViews(int orderId, string materielCode);
         List<PPStockSelectViewDTO> PPGetPKStockSelectViews(int orderId, string materielCode);
+
+        WebResponseContent UpdateExpirationlabel();
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs"
index 4ee5363..028afe4 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs"
@@ -1,4 +1,5 @@
-锘縰sing SqlSugar;
+锘縰sing Magicodes.ExporterAndImporter.Core;
+using SqlSugar;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -18,106 +19,124 @@
         /// <summary>
         /// 涓婚敭
         /// </summary>
+        [ExporterHeader(DisplayName = "涓婚敭")]
         [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "涓婚敭")]
         public int Id { get; set; }
 
         /// <summary>
         /// 鍗曟嵁缂栧彿
         /// </summary>
+        [ExporterHeader(DisplayName = "鍗曟嵁缂栧彿")]
         [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "鍗曟嵁缂栧彿")]
         public string OrderNo { get; set; }
 
         /// <summary>
         /// 鍗曟嵁鏄庣粏涓婚敭
         /// </summary>
+        [ExporterHeader(DisplayName = "鍗曟嵁鏄庣粏涓婚敭")]
         [SugarColumn(IsNullable = false, ColumnDescription = "鍗曟嵁鏄庣粏涓婚敭")]
         public int OrderDetailId { get; set; }
 
         /// <summary>
         /// 鍗曟嵁绫诲瀷
         /// </summary>
+        [ExporterHeader(DisplayName = "鍗曟嵁绫诲瀷")]
         [SugarColumn(IsNullable = false, ColumnDescription = "鍗曟嵁绫诲瀷")]
         public int OrderType { get; set; }
 
         /// <summary>
         /// 鎵规鍙�
         /// </summary>
+        [ExporterHeader(DisplayName = "鎵规鍙�")]
         [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "鎵规鍙�")]
         public string BatchNo { get; set; }
 
         /// <summary>
         /// 鐗╂枡缂栧彿
         /// </summary>
+        [ExporterHeader(DisplayName = "鐗╂枡缂栧彿")]
         [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "鐗╂枡缂栧彿")]
         public string MaterielCode { get; set; }
 
         /// <summary>
         /// 鐗╂枡鍚嶇О
         /// </summary>
+        [ExporterHeader(DisplayName = "鐗╂枡鍚嶇О")]
         [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "鐗╂枡鍚嶇О")]
         public string MaterielName { get; set; }
 
         /// <summary>
         /// 搴撳瓨涓婚敭
         /// </summary>
+        [ExporterHeader(DisplayName = "搴撳瓨涓婚敭")]
         [SugarColumn(IsNullable = false, ColumnDescription = "搴撳瓨涓婚敭")]
         public int StockId { get; set; }
 
         /// <summary>
         /// 鍗曟嵁鏁伴噺
         /// </summary>
+        [ExporterHeader(DisplayName = "鍗曟嵁鏁伴噺")]
         [SugarColumn(IsNullable = false, ColumnDescription = "鍗曟嵁鏁伴噺")]
         public float OrderQuantity { get; set; }
 
         /// <summary>
         /// 鍘熷搴撳瓨閲�
         /// </summary>
+        [ExporterHeader(DisplayName = "鍘熷搴撳瓨閲�")]
         [SugarColumn(IsNullable = false, ColumnDescription = "鍘熷搴撳瓨閲�")]
         public float OriginalQuantity {  get; set; }
 
         /// <summary>
         /// 鍒嗛厤鍑哄簱閲�
         /// </summary>
+        [ExporterHeader(DisplayName = "鍒嗛厤鍑哄簱閲�")]
         [SugarColumn(IsNullable = false, ColumnDescription = "鍒嗛厤鍑哄簱閲�")]
         public float AssignQuantity {  get; set; }
 
         /// <summary>
         /// 璐т綅缂栧彿
         /// </summary>
+        [ExporterHeader(DisplayName = "璐т綅缂栧彿")]
         [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "璐т綅缂栧彿")]
         public string LocationCode { get; set; }
 
         /// <summary>
         /// 鎵樼洏缂栧彿
         /// </summary>
+        [ExporterHeader(DisplayName = "鎵樼洏缂栧彿")]
         [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "鎵樼洏缂栧彿")]
         public string PalletCode { get; set; }
         /// <summary>
         /// 鍗曚綅
         /// </summary>
+        [ExporterHeader(DisplayName = "鍗曚綅")]
         [SugarColumn(IsNullable = true, ColumnDescription = "鍗曚綅")]
         public string Unit { get; set; }
         /// <summary>
         /// 浠诲姟鍙�
         /// </summary>
+        [ExporterHeader(DisplayName = "浠诲姟鍙�")]
         [SugarColumn(IsNullable = true, ColumnDescription = "浠诲姟鍙�")]
         public int? TaskNum { get; set; }
 
         /// <summary>
         /// 鐘舵��
         /// </summary>
+        [ExporterHeader(DisplayName = "鐘舵��")]
         [SugarColumn(IsNullable = false, ColumnDescription = "鐘舵��")]
         public int Status { get; set; }
 
         /// <summary>
         /// 鐢熶骇鏃ユ湡
         /// </summary>
+        [ExporterHeader(DisplayName = "鐢熶骇鏃ユ湡")]
         [SugarColumn(IsNullable = false, ColumnDescription = "鐢熶骇鏃ユ湡")]
         public string ProductionDate { get; set; }
 
         /// <summary>
         /// 鏈夋晥鏈�
         /// </summary>
+        [ExporterHeader(DisplayName = "鏈夋晥鏈�")]
         [SugarColumn(IsNullable = false, ColumnDescription = "鏈夋晥鏈�")]
         public string EffectiveDate { get; set; }
     }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfo.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfo.cs"
index 73cc45c..5a49016 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfo.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfo.cs"
@@ -62,6 +62,12 @@
         public int StockLength { get; set; }
 
         /// <summary>
+        /// 搴撳瓨杩囨湡鏍囪瘑
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDescription = "搴撳瓨杩囨湡鏍囪瘑")]
+        public int Expirationlabel { get; set; }
+
+        /// <summary>
         /// 搴撳瓨鏄庣粏
         /// </summary>
         [Navigate(NavigateType.OneToMany, nameof(Dt_StockInfoDetail.StockId), nameof(Id))]
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/TaskInfo/Dt_Task.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/TaskInfo/Dt_Task.cs"
index e5c270d..1e683f8 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/TaskInfo/Dt_Task.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/TaskInfo/Dt_Task.cs"
@@ -44,6 +44,7 @@
         /// <summary>
         /// 鎵樼洏绫诲瀷
         /// </summary>
+        [ImporterHeader(Name = "鎵樼洏绫诲瀷")]
         [SugarColumn(IsNullable = false, ColumnDescription = "鎵樼洏绫诲瀷")]
         public int PalletType { get; set; }
 
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockViewService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockViewService.cs"
index 1813cde..f8c78c5 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockViewService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockViewService.cs"
@@ -22,6 +22,7 @@
 using WIDESEA_Common.StockEnum;
 using WIDESEA_IBasicRepository;
 using WIDESEA_Common.WareHouseEnum;
+using WIDESEA_Core.Enums;
 
 namespace WIDESEA_StockService
 {
@@ -55,50 +56,70 @@
                     try
                     {
                         List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
-                        if (searchParametersList.Count > 0)
+                        if (searchParametersList?.Any() == true)
                         {
+                            foreach (var param in searchParametersList)
                             {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.ProductCode).FirstLetterToLower());
-                                if (searchParameters != null)
+                                switch (param.Name)
                                 {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.ProductCode.Contains(searchParameters.Value)));
-                                }
-                            }
+                                    case var name when name == nameof(Dt_ProStockInfoDetail.ProductCode).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.proStockInfoDetails.Any(v => v.ProductCode.Contains(param.Value.ToString())));
+                                        }
+                                        break;
+                                    case var name when name == nameof(Dt_ProStockInfoDetail.LotNumber).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.proStockInfoDetails.Any(v => v.LotNumber.Contains(param.Value.ToString())));
+                                        }
+                                        break;
 
-                            {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.ProductVersion).FirstLetterToLower());
-                                if (searchParameters != null)
-                                {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.ProductVersion.Contains(searchParameters.Value)));
-                                }
-                            }
-                            {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.SpecifyVer).FirstLetterToLower());
-                                if (searchParameters != null)
-                                {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.SpecifyVer.Contains(searchParameters.Value)));
-                                }
-                            }
-                            {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.LotNumber).FirstLetterToLower());
-                                if (searchParameters != null)
-                                {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.LotNumber.Contains(searchParameters.Value)));
-                                }
-                            }
-                            {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfo.LocationCode).FirstLetterToLower());
-                                if (searchParameters != null)
-                                {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.LocationCode == searchParameters.Value);
-                                }
-                            }
+                                    case var name when name == nameof(Dt_ProStockInfo.LocationCode).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.LocationCode == param.Value.ToString());
+                                        }
+                                        break;
+                                    case var name when name == nameof(Dt_ProStockInfoDetail.ProductVersion).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.proStockInfoDetails.Any(v => v.ProductVersion.Contains(param.Value.ToString())));
+                                        }
+                                        break;
+                                    case var name when name == nameof(Dt_ProStockInfoDetail.SpecifyVer).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.proStockInfoDetails.Any(v => v.SpecifyVer.Contains(param.Value.ToString())));
+                                        }
+                                        break;
 
-
+                                    case var name when name == nameof(Dt_ProStockInfo.CreateDate).FirstLetterToLower():
+                                        if (DateTime.TryParse(param.Value?.ToString(), out DateTime minDate))
+                                        {
+                                            LinqExpressionType expressionType = param.DisplayType.GetLinqCondition();
+                                            if (expressionType == LinqExpressionType.ThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.CreateDate >= minDate);
+                                            }
+                                            else if (expressionType == LinqExpressionType.LessThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.CreateDate <= minDate);
+                                            }
+                                        }
+                                        break;
+                                }
+                            }
                         }
-
                     }
-                    catch { }
+                    catch (Exception ex)
+                    {
+                    }
                 }
                 string whereSto = GetDataRole(typeof(Dt_ProStockInfo));
                 sugarQueryable1 = sugarQueryable1.Where(whereSto);
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
index 1d75b62..0130abe 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
@@ -289,5 +289,81 @@
             return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes);
         }
 
+        public WebResponseContent UpdateExpirationlabel()
+        {
+            try
+            {
+                var today = DateTime.Today;
+                int batchSize = 1000; // 鎵规澶勭悊澶у皬
+
+                var query = BaseDal.Db.Queryable<Dt_StockInfoDetail>()
+                    .InnerJoin<Dt_StockInfo>((detail, master) => detail.StockId == master.Id)
+                    .Select((detail, master) => new
+                    {
+                        MasterId = master.Id,
+                        master.WarehouseId,
+                        detail.EffectiveDate,
+                        CurrentExpirationlabel = master.Expirationlabel // 鐢ㄤ簬鍒ゆ柇鏄惁闇�瑕佹洿鏂�
+                    });
+
+                // 鍒嗘壒澶勭悊锛屼娇鐢═ake鍜孲kip瀹炵幇鍒嗛〉
+                var totalUpdated = 0;
+                int skipCount = 0;
+
+                while (true)
+                {
+                    // 浣跨敤Skip鍜孴ake瀹炵幇鍒嗛〉鑾峰彇鏁版嵁
+                    var batchData = query.Skip(skipCount).Take(batchSize).ToList();
+                    if (!batchData.Any()) break; // 娌℃湁鏇村鏁版嵁鏃堕��鍑哄惊鐜�
+
+                    var updateDic = new Dictionary<long, int>();
+
+                    foreach (var item in batchData)
+                    {
+                        if (!DateTime.TryParse(item.EffectiveDate, out DateTime effectiveDate))
+                            continue; 
+                        int newLabel;
+                        if (effectiveDate < today)
+                        {
+                            newLabel = ExpirationlabelEnum.杩囨湡.ObjToInt();
+                        }
+                        else if (item.WarehouseId == 3)
+                        {
+                            int daysDiff = (effectiveDate - today).Days;
+                            newLabel = daysDiff <= 60 ? ExpirationlabelEnum.涓存湡棰勮.ObjToInt() : ExpirationlabelEnum.鏈复鏈�.ObjToInt();
+                        }
+                        else
+                        {
+                            int daysDiff = (effectiveDate - today).Days;
+                            newLabel = daysDiff <= 30 ? ExpirationlabelEnum.涓存湡棰勮.ObjToInt() : ExpirationlabelEnum.鏈复鏈�.ObjToInt();
+                        }
+
+                        // 鍙洿鏂版湁鍙樺寲鐨勫�硷紝骞朵笖鍘婚噸
+                        if (newLabel != item.CurrentExpirationlabel && !updateDic.ContainsKey(item.MasterId))
+                        {
+                            updateDic[item.MasterId] = newLabel;
+                        }
+                    }
+
+                    if (updateDic.Any())
+                    {
+                        // 鏋勫缓鎵归噺鏇存柊璇彞
+                        var updateBuilder = BaseDal.Db.Updateable<Dt_StockInfo>();
+                        foreach (var kvp in updateDic)
+                        {
+                            updateBuilder.SetColumns(m => m.Expirationlabel == kvp.Value)
+                                         .Where(m => m.Id == kvp.Key);
+                        }
+                        totalUpdated += updateBuilder.ExecuteCommand();
+                    }
+                    skipCount += batchSize; // 鍑嗗鑾峰彇涓嬩竴鎵规暟鎹�
+                }
+                return WebResponseContent.Instance.OK($"鏇存柊鎴愬姛锛屽叡鏇存柊 {totalUpdated} 鏉¤褰�");
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error("鏇存柊澶辫触锛岃鑱旂郴绠$悊鍛�");
+            }
+        }
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockViewService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockViewService.cs"
index 843d8f7..0bcc37b 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockViewService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockViewService.cs"
@@ -46,58 +46,100 @@
         {
             try
             {
-                List<StockViewDTO> stockViewDTOs = new List<StockViewDTO>();
-
-                string where = string.Empty;
                 ISugarQueryable<Dt_StockInfo> sugarQueryable1 = _dbBase.Queryable<Dt_StockInfo>().Includes(x => x.Details);
                 if (!string.IsNullOrEmpty(options.Wheres))
                 {
                     try
                     {
                         List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
-                        if (searchParametersList.Count > 0)
+                        if (searchParametersList?.Any() == true)
                         {
+                            foreach (var param in searchParametersList)
                             {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.MaterielCode).FirstLetterToLower());
-                                if (searchParameters != null)
+                                switch (param.Name)
                                 {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.Details.Any(v => v.MaterielCode.Contains(searchParameters.Value)));
-                                }
-                            }
+                                    case var name when name == nameof(Dt_StockInfoDetail.MaterielCode).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.Details.Any(v => v.MaterielCode.Contains(param.Value.ToString())));
+                                        }
+                                        break;
+                                    case var name when name == nameof(Dt_StockInfoDetail.BatchNo).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.Details.Any(v => v.BatchNo.Contains(param.Value.ToString())));
+                                        }
+                                        break;
 
-                            {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.BatchNo).FirstLetterToLower());
-                                if (searchParameters != null)
-                                {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.Details.Any(v => v.BatchNo.Contains(searchParameters.Value)));
-                                }
-                            }
-                            {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfo.LocationCode).FirstLetterToLower());
-                                if (searchParameters != null)
-                                {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.LocationCode == searchParameters.Value);
-                                }
-                            }
+                                    case var name when name == nameof(Dt_StockInfo.LocationCode).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.LocationCode == param.Value.ToString());
+                                        }
+                                        break;
 
+                                    case var name when name == nameof(Dt_StockInfo.CreateDate).FirstLetterToLower():
+                                        if (DateTime.TryParse(param.Value?.ToString(), out DateTime minDate))
+                                        {
+                                            LinqExpressionType expressionType = param.DisplayType.GetLinqCondition();
+                                            if(expressionType == LinqExpressionType.ThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.CreateDate >= minDate);
+                                            }
+                                            else if(expressionType == LinqExpressionType.LessThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.CreateDate <= minDate);
+                                            }              
+                                        }
+                                        break;
+                                    case var name when name == nameof(Dt_StockInfoDetail.EffectiveDate).FirstLetterToLower():
+                                        // 鍓嶇浼犻�掔殑鍙傛暟闇�鏄� yyyy-MM-dd 鏍煎紡锛堝 "2025-05-08"锛夛紝鐩存帴浣滀负瀛楃涓插鐞�
+                                        string effectiveDateStr = param.Value?.ToString().Trim();
+                                        if (!string.IsNullOrEmpty(effectiveDateStr) && effectiveDateStr.Length == 10)
+                                        {
+                                            LinqExpressionType expressionType = param.DisplayType.GetLinqCondition();
+                                            if (expressionType == LinqExpressionType.ThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.Details
+                                                    .Any(d =>!string.IsNullOrEmpty(d.EffectiveDate) && d.EffectiveDate.CompareTo(effectiveDateStr) >= 0));      
+                                            }
+                                            else if (expressionType == LinqExpressionType.LessThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.Details
+                                                    .Any(d =>!string.IsNullOrEmpty(d.EffectiveDate) && d.EffectiveDate.CompareTo(effectiveDateStr) <= 0));
+                                                        
+                                                        
+                                            }
+                                        }
+                                        break;
+                                }
+                            }
                         }
-
                     }
-                    catch { }
+                    catch (Exception ex)
+                    {
+                    }
                 }
+
                 string whereSto = GetDataRole(typeof(Dt_StockInfo));
                 sugarQueryable1 = sugarQueryable1.Where(whereSto);
+
                 EntityProperties.ValidatePageOptions(options, ref sugarQueryable1);
 
                 string whereLo = GetDataRole(typeof(Dt_LocationInfo));
-                ISugarQueryable<Dt_LocationInfo> sugarQueryable = _dbBase.Queryable<Dt_LocationInfo>().Where(whereLo);
-
+                ISugarQueryable<Dt_LocationInfo> sugarQueryable = _dbBase.Queryable<Dt_LocationInfo>()
+                    .Where(whereLo);
                 EntityProperties.ValidatePageOptions(options, ref sugarQueryable);
 
-                ISugarQueryable<StockViewDTO> list = sugarQueryable1.InnerJoin(sugarQueryable, (b, a) => a.LocationCode == b.LocationCode).Select((b, a)
-                    => new StockViewDTO
+                ISugarQueryable<StockViewDTO> list = sugarQueryable1
+                    .InnerJoin(sugarQueryable, (b, a) => a.LocationCode == b.LocationCode)
+                    .Select((b, a) => new StockViewDTO
                     {
                         LocationCode = b.LocationCode,
+                        Expirationlabel = b.Expirationlabel,
                         Column = a.Column,
                         WarehouseId = b.WarehouseId,
                         CreateDate = b.CreateDate,
@@ -119,52 +161,55 @@
                         Details = b.Details,
                     });
 
-                var pklist = sugarQueryable1.Where(b => b.LocationCode == "骞冲簱浣�").Select(b => new StockViewDTO
-                {
-                    LocationCode = b.LocationCode,
-                    Column = 0,
-                    WarehouseId = b.WarehouseId,
-                    CreateDate = b.CreateDate,
-                    Creater = b.Creater,
-                    Depth = 0,
-                    EnalbeStatus = EnableStatusEnum.Normal.ObjToInt(),
-                    Layer = 0,
-                    LocationName = "骞冲簱浣�",
-                    LocationStatus = LocationStatusEnum.InStock.ObjToInt(),
-                    LocationType = LocationTypeEnum.Undefined.ObjToInt(),
-                    Modifier = b.Modifier,
-                    ModifyDate = b.ModifyDate,
-                    PalletCode = b.PalletCode,
-                    StockRemark = b.Remark,
-                    RoadwayNo = "骞冲簱",
-                    Row = 0,
-                    StockId = b.Id,
-                    StockStatus = b.StockStatus,
-                    Details = b.Details,
-                });
+                // 骞冲簱浣嶆暟鎹煡璇�
+                var pklist = sugarQueryable1
+                    .Where(b => b.LocationCode == "骞冲簱浣�")
+                    .Select(b => new StockViewDTO
+                    {
+                        LocationCode = b.LocationCode,
+                        Column = 0,
+                        WarehouseId = b.WarehouseId,
+                        CreateDate = b.CreateDate,
+                        Expirationlabel = b.Expirationlabel,
+                        Creater = b.Creater,
+                        Depth = 0,
+                        EnalbeStatus = EnableStatusEnum.Normal.ObjToInt(),
+                        Layer = 0,
+                        LocationName = "骞冲簱浣�",
+                        LocationStatus = LocationStatusEnum.InStock.ObjToInt(),
+                        LocationType = LocationTypeEnum.Undefined.ObjToInt(),
+                        Modifier = b.Modifier,
+                        ModifyDate = b.ModifyDate,
+                        PalletCode = b.PalletCode,
+                        StockRemark = b.Remark,
+                        RoadwayNo = "骞冲簱",
+                        Row = 0,
+                        StockId = b.Id,
+                        StockStatus = b.StockStatus,
+                        Details = b.Details,
+                    });
 
                 int totalCount = 0;
                 int pktotalCount = 0;
-
-                stockViewDTOs = list.ToPageList(options.Page, options.Rows, ref totalCount);
+                var stockViewDTOs = list.ToPageList(options.Page, options.Rows, ref totalCount);
                 stockViewDTOs.AddRange(pklist.ToPageList(options.Page, options.Rows, ref pktotalCount));
 
                 stockViewDTOs.ForEach(x =>
                 {
-                    x.MaterielCode = string.Join(",", x.Details.Select(x => x.MaterielCode).Distinct());
-                    x.BatchNo = string.Join(",", x.Details.Select(x => x.BatchNo).Distinct());
+                    x.MaterielCode = string.Join(",", x.Details.Select(d => d.MaterielCode).Distinct());
+                    x.BatchNo = string.Join(",", x.Details.Select(d => d.BatchNo).Distinct());
                     x.MaterielSpec = x.Details.FirstOrDefault()?.MaterielSpec ?? "";
                     x.MaterielName = x.Details.FirstOrDefault()?.MaterielName ?? "";
-                }
-                );
+                });
+
                 return new PageGridData<StockViewDTO>(totalCount + pktotalCount, stockViewDTOs);
             }
             catch (Exception ex)
             {
-
             }
             return new PageGridData<StockViewDTO>();
         }
+
 
         public virtual object GetDetailPage(PageDataOptions pageData)
         {
@@ -224,28 +269,76 @@
                     try
                     {
                         List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
-                        if (searchParametersList.Count > 0)
+                        if (searchParametersList?.Any() == true)
                         {
+                            foreach (var param in searchParametersList)
                             {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.MaterielCode).FirstLetterToLower());
-                                if (searchParameters != null)
+                                switch (param.Name)
                                 {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.Details.Any(v => v.MaterielCode.Contains(searchParameters.Value)));
+                                    case var name when name == nameof(Dt_StockInfoDetail.MaterielCode).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.Details.Any(v => v.MaterielCode.Contains(param.Value.ToString())));
+                                        }
+                                        break;
+                                    case var name when name == nameof(Dt_StockInfoDetail.BatchNo).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.Details.Any(v => v.BatchNo.Contains(param.Value.ToString())));
+                                        }
+                                        break;
+
+                                    case var name when name == nameof(Dt_StockInfo.LocationCode).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.LocationCode == param.Value.ToString());
+                                        }
+                                        break;
+
+                                    case var name when name == nameof(Dt_StockInfo.CreateDate).FirstLetterToLower():
+                                        if (DateTime.TryParse(param.Value?.ToString(), out DateTime minDate))
+                                        {
+                                            LinqExpressionType expressionType = param.DisplayType.GetLinqCondition();
+                                            if (expressionType == LinqExpressionType.ThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.CreateDate >= minDate);
+                                            }
+                                            else if (expressionType == LinqExpressionType.LessThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.CreateDate <= minDate);
+                                            }
+                                        }
+                                        break;
+                                    case var name when name == nameof(Dt_StockInfoDetail.EffectiveDate).FirstLetterToLower():
+                                        // 鍓嶇浼犻�掔殑鍙傛暟闇�鏄� yyyy-MM-dd 鏍煎紡锛堝 "2025-05-08"锛夛紝鐩存帴浣滀负瀛楃涓插鐞�
+                                        string effectiveDateStr = param.Value?.ToString().Trim();
+                                        if (!string.IsNullOrEmpty(effectiveDateStr) && effectiveDateStr.Length == 10)
+                                        {
+                                            LinqExpressionType expressionType = param.DisplayType.GetLinqCondition();
+                                            if (expressionType == LinqExpressionType.ThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.Details
+                                                    .Any(d => !string.IsNullOrEmpty(d.EffectiveDate) && d.EffectiveDate.CompareTo(effectiveDateStr) >= 0));
+                                            }
+                                            else if (expressionType == LinqExpressionType.LessThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.Details
+                                                    .Any(d => !string.IsNullOrEmpty(d.EffectiveDate) && d.EffectiveDate.CompareTo(effectiveDateStr) <= 0));
+
+
+                                            }
+                                        }
+                                        break;
                                 }
                             }
-
-                            {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.BatchNo).FirstLetterToLower());
-                                if (searchParameters != null)
-                                {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.Details.Any(v => v.BatchNo.Contains(searchParameters.Value)));
-                                }
-                            }
-
                         }
-
                     }
-                    catch { }
+                    catch (Exception ex)
+                    {
+                    }
                 }
                 string whereSto = GetDataRole(typeof(Dt_StockInfo));
                 sugarQueryable1 = sugarQueryable1.Where(whereSto);
@@ -261,6 +354,7 @@
                     {
                         LocationCode = b.LocationCode,
                         Column = a.Column,
+                        Expirationlabel = b.Expirationlabel,
                         WarehouseId = b.WarehouseId,
                         CreateDate = b.CreateDate,
                         Creater = b.Creater,
@@ -286,6 +380,7 @@
                     LocationCode = b.LocationCode,
                     Column = 0,
                     WarehouseId = b.WarehouseId,
+                    Expirationlabel = b.Expirationlabel,
                     CreateDate = b.CreateDate,
                     Creater = b.Creater,
                     Depth = 0,
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_SystemService/Sys_DictionaryService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_SystemService/Sys_DictionaryService.cs"
index 5b13901..29027de 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_SystemService/Sys_DictionaryService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_SystemService/Sys_DictionaryService.cs"
@@ -1315,6 +1315,32 @@
                             result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data };
                         }
                         break;
+                    case "expirationlabelEnum":
+                        {
+                            List<object> data = new List<object>();
+                            {
+                                Type type = typeof(ExpirationlabelEnum);
+                                List<int> enums = Enum.GetValues(typeof(ExpirationlabelEnum)).Cast<int>().ToList();
+                                int index = 0;
+                                foreach (var item in enums)
+                                {
+                                    FieldInfo? fieldInfo = typeof(ExpirationlabelEnum).GetField(((ExpirationlabelEnum)item).ToString());
+                                    DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
+                                    if (description != null)
+                                    {
+                                        data.Add(new { key = item.ToString(), value = description.Description });
+                                    }
+                                    else
+                                    {
+                                        data.Add(new { key = item.ToString(), value = item.ToString() });
+                                    }
+                                    index++;
+                                }
+                            }
+
+                            result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data };
+                        }
+                        break;
                 }
                 return result;
             }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
index 96a7506..8b82537 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
@@ -1155,5 +1155,53 @@
             }
             return content;
         }
+
+        public WebResponseContent InboundTaskHandCancel(int taskNum, int warehouseId)
+        {
+            try
+            {
+                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
+                if (task == null)
+                {
+                    return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅");
+                }
+                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).Includes(x => x.Details).First();
+                if (stockInfo == null)
+                {
+                    return WebResponseContent.Instance.Error($"鏈壘鍒版墭鐩樺搴旂殑缁勭洏淇℃伅");
+                }
+                if (stockInfo.Details.Count == 0 && stockInfo.PalletType != PalletTypeEnum.Empty.ObjToInt())
+                {
+                    return WebResponseContent.Instance.Error($"鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅");
+                }
+                if (task.TaskType == TaskTypeEnum.MesPalletLargeReturn.ObjToInt() || task.TaskType == TaskTypeEnum.MesPalletSmallReturn.ObjToInt())
+                {
+                    task.TaskStatus = TaskStatusEnum.Cancel.ObjToInt();
+                    _unitOfWorkManage.BeginTran();
+                    BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.浜哄伐鍒犻櫎 : OperateTypeEnum.鑷姩鍒犻櫎);
+                    _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.鑷姩鍒犻櫎 : OperateTypeEnum.浜哄伐鍒犻櫎);
+                    _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfo.Details, App.User.UserId == 0 ? OperateTypeEnum.鑷姩鍒犻櫎 : OperateTypeEnum.浜哄伐鍒犻櫎);
+                    _unitOfWorkManage.CommitTran();
+                    return WebResponseContent.Instance.OK();
+                }
+                Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
+                if (locationInfo != null)
+                {
+                    if (locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
+                    {
+                        return WebResponseContent.Instance.Error($"璐т綅鐘舵�佷笉姝g‘");
+                    }
+
+                    LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
+                    locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
+                }
+                return WebResponseContent.Instance.OK();
+                
+            }
+            catch(Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Completed.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Completed.cs"
index 0f17ddf..88eaa6f 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Completed.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Completed.cs"
@@ -136,7 +136,12 @@
                 return WebResponseContent.Instance.Error(ex.Message);
             }
         }
-
+        /// <summary>
+        /// 浠诲姟鍙栨秷
+        /// </summary>
+        /// <param name="taskNum"></param>
+        /// <param name="warehouseId"></param>
+        /// <returns></returns>
         public async Task<WebResponseContent> TaskHandCancel(int taskNum,int warehouseId)
         {
             try
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs"
index d4db578..199d783 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs"
@@ -79,5 +79,15 @@
         {
             return Service.StockQueryData(saveModel);
         }
+        /// <summary>
+        /// 杩囨湡鏍囪瘑鏇存柊
+        /// </summary>
+        /// <param name="saveModel"></param>
+        /// <returns></returns>
+        [HttpPost, HttpGet, Route("UpdateExpirationlabel"),AllowAnonymous]
+        public WebResponseContent UpdateExpirationlabel()
+        {
+            return Service.UpdateExpirationlabel();
+        }
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs"
index 53a5032..7b10097 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs"
@@ -413,7 +413,7 @@
         /// </summary>
         /// <param name="taskNum">浠诲姟鍙�</param>
         /// <returns></returns>
-        [HttpPost, HttpGet, Route("TaskHandCancel"), AllowAnonymous]
+        [HttpPost, HttpGet, Route("TaskHandCa"), AllowAnonymous]
         public async Task<WebResponseContent> TaskHandCancel(int taskNum ,int warehouseId)
         {
             return await Service.TaskHandCancel(taskNum,warehouseId);

--
Gitblit v1.9.3